Changeset 622 for applications/bdmtoolbox/mex/merger.cpp
- Timestamp:
- 09/16/09 22:52:57 (15 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
applications/bdmtoolbox/mex/merger.cpp
r569 r622 29 29 30 30 #ifdef MEX 31 void mexFunction (int n_output, mxArray *output[], int n_input, const mxArray *input[]) 32 { 31 void mexFunction ( int n_output, mxArray *output[], int n_input, const mxArray *input[] ) { 33 32 // Check the number of inputs and output arguments 34 if ( n_input != 3) mexErrMsgTxt ("Usage:\n"35 "result=merger(sources, support, merger)\n"36 " sources= { struct('class','epdf'),... }; % cell of pdfs (epdfs or mpdfs) to be merged,\n"37 " support= struct(\n"38 " grid = {[dim1_start,dim1_end], [dim2_start, dim2_end]...} %support boundary \n"39 " nbins = [bins_in_dim1, bins_in_dim2,...] %fixed \n"40 " === OR ==\n"41 " pdf = struct('class','epdf'); % pdf to draw samples from\n"42 " nsamples= 100; % number of samples\n"43 " );\n"44 " If all elements are present, (grid,nbins) is used;\n"45 " merger = struct('class','merger_*'); % object to be used for merging,\n\n"46 "see documentation of classes epdf, mpdf, merger_base and their offsprings in BDM.");33 if ( n_input != 3 ) mexErrMsgTxt ( "Usage:\n" 34 "result=merger(sources, support, merger)\n" 35 " sources= { struct('class','epdf'),... }; % cell of pdfs (epdfs or mpdfs) to be merged,\n" 36 " support= struct(\n" 37 " grid = {[dim1_start,dim1_end], [dim2_start, dim2_end]...} %support boundary \n" 38 " nbins = [bins_in_dim1, bins_in_dim2,...] %fixed \n" 39 " === OR ==\n" 40 " pdf = struct('class','epdf'); % pdf to draw samples from\n" 41 " nsamples= 100; % number of samples\n" 42 " );\n" 43 " If all elements are present, (grid,nbins) is used;\n" 44 " merger = struct('class','merger_*'); % object to be used for merging,\n\n" 45 "see documentation of classes epdf, mpdf, merger_base and their offsprings in BDM." ); 47 46 RV::clear_all(); 48 47 // LOAD CONFIG 49 48 UImxArray Cfg; 50 Cfg.addList ( input[0], "Sources");51 Cfg.addGroup ( input[1], "Support");52 Cfg.addGroup ( input[2], "Merger");49 Cfg.addList ( input[0], "Sources" ); 50 Cfg.addGroup ( input[1], "Support" ); 51 Cfg.addGroup ( input[2], "Merger" ); 53 52 54 53 //DBG 55 Cfg.writeFile ( "merger.cfg");54 Cfg.writeFile ( "merger.cfg" ); 56 55 #else 57 56 int main() { 58 UIFile Cfg ( "merger.cfg");57 UIFile Cfg ( "merger.cfg" ); 59 58 #endif 60 59 // Sources 61 60 Array<shared_ptr<mpdf> > Sources; 62 61 //abuse Mer to store sources 63 Setting& _Sources = Cfg.lookup ( "Sources");62 Setting& _Sources = Cfg.lookup ( "Sources" ); 64 63 int Slen = _Sources.getLength(); 65 Sources.set_size ( Slen);66 for ( int i = 0; i < Slen; i++) {64 Sources.set_size ( Slen ); 65 for ( int i = 0; i < Slen; i++ ) { 67 66 try { 68 shared_ptr<mpdf> mtmp = UI::build<mpdf> ( _Sources, i);69 Sources ( i) = mtmp;70 } catch ( UIException) {67 shared_ptr<mpdf> mtmp = UI::build<mpdf> ( _Sources, i ); 68 Sources ( i ) = mtmp; 69 } catch ( UIException ) { 71 70 // it is not mpdf - see if it is epdf 72 71 try { 73 shared_ptr<epdf> etmp = UI::build<epdf> ( _Sources, i);74 if ( etmp) {75 Sources ( i) = new mepdf (etmp); // hopefully OK72 shared_ptr<epdf> etmp = UI::build<epdf> ( _Sources, i ); 73 if ( etmp ) { 74 Sources ( i ) = new mepdf ( etmp ); // hopefully OK 76 75 } 77 } catch ( UIException &e) {78 it_error ( "No mpdfs or epdfs found! " + string (e.what()));79 } catch ( std::exception e) {80 it_error ( "Error in UI at " + _Sources[i].getPath());76 } catch ( UIException &e ) { 77 it_error ( "No mpdfs or epdfs found! " + string ( e.what() ) ); 78 } catch ( std::exception e ) { 79 it_error ( "Error in UI at " + _Sources[i].getPath() ); 81 80 } 82 } catch ( std::exception &e) {83 it_error ( "Error in UI at " + _Sources[i].getPath());81 } catch ( std::exception &e ) { 82 it_error ( "Error in UI at " + _Sources[i].getPath() ); 84 83 } 85 84 } 86 85 87 shared_ptr<merger_base> Merger = UI::build<merger_base> ( Cfg, "Merger");86 shared_ptr<merger_base> Merger = UI::build<merger_base> ( Cfg, "Merger" ); 88 87 89 88 // Support 90 89 try { 91 shared_ptr<rectangular_support> RecSup = UI::build<rectangular_support> (Cfg, "Support"); 92 Merger->set_support(*RecSup); 93 } 94 catch (UIException &e) { 95 shared_ptr<discrete_support> DisSup = UI::build<discrete_support> (Cfg, "Support"); 96 Merger->set_support (*DisSup); 90 shared_ptr<rectangular_support> RecSup = UI::build<rectangular_support> ( Cfg, "Support" ); 91 Merger->set_support ( *RecSup ); 92 } catch ( UIException &e ) { 93 shared_ptr<discrete_support> DisSup = UI::build<discrete_support> ( Cfg, "Support" ); 94 Merger->set_support ( *DisSup ); 97 95 } 98 96 // COMPUTE RESULTS 99 Merger->set_sources ( Sources);97 Merger->set_sources ( Sources ); 100 98 Merger->merge(); 101 99 102 100 // save results 103 Array<vec> source_vals ( Sources.length());104 for ( int i = 0;i < Sources.length();i++) {101 Array<vec> source_vals ( Sources.length() ); 102 for ( int i = 0;i < Sources.length();i++ ) { 105 103 datalink_m2e dl; 106 dl.set_connection ( Sources (i)->_rv(), Sources (i)->_rvc(), Merger->_rv());104 dl.set_connection ( Sources ( i )->_rv(), Sources ( i )->_rvc(), Merger->_rv() ); 107 105 108 vec ll ( Merger->_Smp()._samples().length());109 for ( int j = 0; j < Merger->_Smp()._samples().length(); j++) {110 vec dt = dl.pushdown ( Merger->_Smp()._samples() (j));111 vec dtc = dl.get_cond ( Merger->_Smp()._samples() (j));112 ll ( j) = Sources (i)->evallogcond (dt, dtc);106 vec ll ( Merger->_Smp()._samples().length() ); 107 for ( int j = 0; j < Merger->_Smp()._samples().length(); j++ ) { 108 vec dt = dl.pushdown ( Merger->_Smp()._samples() ( j ) ); 109 vec dtc = dl.get_cond ( Merger->_Smp()._samples() ( j ) ); 110 ll ( j ) = Sources ( i )->evallogcond ( dt, dtc ); 113 111 } 114 112 115 vec sll = exp ( ll);113 vec sll = exp ( ll ); 116 114 117 source_vals ( i) = sll / sum (sll);115 source_vals ( i ) = sll / sum ( sll ); 118 116 } 119 117 120 merger_mix* MerMix=dynamic_cast<merger_mix*> (Merger.get());118 merger_mix* MerMix=dynamic_cast<merger_mix*> ( Merger.get() ); 121 119 vec mix_val; 122 123 if ( MerMix){124 vec ll ( Merger->_Smp()._samples().length());125 for ( int j = 0; j < Merger->_Smp()._samples().length(); j++) {126 ll ( j) = Merger->evallog (Merger->_Smp()._samples() (j));120 121 if ( MerMix ) { 122 vec ll ( Merger->_Smp()._samples().length() ); 123 for ( int j = 0; j < Merger->_Smp()._samples().length(); j++ ) { 124 ll ( j ) = Merger->evallog ( Merger->_Smp()._samples() ( j ) ); 127 125 } 128 129 vec sll = exp ( ll);130 131 mix_val = sll / sum ( sll);126 127 vec sll = exp ( ll ); 128 129 mix_val = sll / sum ( sll ); 132 130 } 133 131 … … 135 133 mxArray* tmp ; 136 134 // Save results 137 if ( n_output > 0) {138 tmp = mxCreateStructMatrix ( 1, 1, 0, NULL);135 if ( n_output > 0 ) { 136 tmp = mxCreateStructMatrix ( 1, 1, 0, NULL ); 139 137 //support 140 138 Array<vec> &samples = Merger->_Smp()._samples(); 141 if ( samples.size() > 0) {142 mxArray* fld = mxCreateDoubleMatrix ( samples (0).length(), samples.size(), mxREAL);143 Arrayvec2mxArray ( samples, fld);144 mxReplaceFieldNM ( tmp, "support", fld);139 if ( samples.size() > 0 ) { 140 mxArray* fld = mxCreateDoubleMatrix ( samples ( 0 ).length(), samples.size(), mxREAL ); 141 Arrayvec2mxArray ( samples, fld ); 142 mxReplaceFieldNM ( tmp, "support", fld ); 145 143 } 146 144 147 145 //weights 148 146 vec &w = Merger->_Smp()._w(); 149 mxArray* fldw = mxCreateDoubleMatrix ( 1, w.length(), mxREAL);150 vec2mxArray ( w, fldw);151 mxReplaceFieldNM ( tmp, "weights", fldw);147 mxArray* fldw = mxCreateDoubleMatrix ( 1, w.length(), mxREAL ); 148 vec2mxArray ( w, fldw ); 149 mxReplaceFieldNM ( tmp, "weights", fldw ); 152 150 153 151 //mixture values 154 if ( mix_val.length()>0){155 mxArray* fldm = mxCreateDoubleMatrix ( 1, w.length(), mxREAL);156 vec2mxArray ( mix_val, fldm);157 mxReplaceFieldNM ( tmp, "mix", fldm);152 if ( mix_val.length() >0 ) { 153 mxArray* fldm = mxCreateDoubleMatrix ( 1, w.length(), mxREAL ); 154 vec2mxArray ( mix_val, fldm ); 155 mxReplaceFieldNM ( tmp, "mix", fldm ); 158 156 } 159 157 // sources 160 158 char srcstr[20]; 161 for ( int i = 0;i < Sources.length();i++) {162 sprintf ( srcstr, "source%d", i + 1);163 mxArray* fldw = mxCreateDoubleMatrix ( 1, source_vals (i).length(), mxREAL);164 vec2mxArray ( source_vals (i), fldw);165 mxReplaceFieldNM ( tmp, srcstr, fldw);159 for ( int i = 0;i < Sources.length();i++ ) { 160 sprintf ( srcstr, "source%d", i + 1 ); 161 mxArray* fldw = mxCreateDoubleMatrix ( 1, source_vals ( i ).length(), mxREAL ); 162 vec2mxArray ( source_vals ( i ), fldw ); 163 mxReplaceFieldNM ( tmp, srcstr, fldw ); 166 164 } 167 165