| 33 | | // 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 | // 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."); |
| 50 | | Cfg.addList(input[0],"Sources"); |
| 51 | | Cfg.addGroup(input[1],"Support"); |
| 52 | | Cfg.addGroup(input[2],"Merger"); |
| | 50 | Cfg.addList (input[0], "Sources"); |
| | 51 | Cfg.addGroup (input[1], "Support"); |
| | 52 | Cfg.addGroup (input[2], "Merger"); |
| 64 | | Setting& _Sources=Cfg.lookup("Sources"); |
| 65 | | int Slen=_Sources.getLength(); |
| 66 | | Sources.set_size(Slen); |
| 67 | | for (int i=0; i<Slen; i++){ |
| 68 | | try{ |
| 69 | | mpdf* mtmp = UI::build<mpdf>(_Sources,i); |
| 70 | | Sources(i)=mtmp; |
| 71 | | } |
| 72 | | catch (UIException){ |
| | 63 | Setting& _Sources = Cfg.lookup ("Sources"); |
| | 64 | int Slen = _Sources.getLength(); |
| | 65 | Sources.set_size (Slen); |
| | 66 | for (int i = 0; i < Slen; i++) { |
| | 67 | try { |
| | 68 | mpdf* mtmp = UI::build<mpdf> (_Sources, i); |
| | 69 | Sources (i) = mtmp; |
| | 70 | } catch (UIException) { |
| 75 | | epdf* etmp = UI::build<epdf>(_Sources,i); |
| 76 | | if (etmp){ |
| 77 | | Sources(i) = new mepdf(etmp, true); |
| 78 | | } |
| | 73 | shared_ptr<epdf> etmp = UI::build<epdf> (_Sources, i); |
| | 74 | if (etmp) { |
| | 75 | Sources (i) = new mepdf (etmp); |
| | 76 | } |
| | 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()); |
| 96 | | Setting & _Supp=Cfg.lookup("Support"); |
| 97 | | |
| 98 | | if (_Supp.exists("grid") && _Supp.exists("nbins")) { |
| 99 | | Array<vec> bounds (0); |
| 100 | | UI::get (bounds, _Supp, "grid"); |
| 101 | | ivec nbins(0); |
| 102 | | UI::get (nbins, _Supp, "nbins"); |
| 103 | | Merger->set_support (bounds,nbins); |
| 104 | | |
| 105 | | }else { |
| 106 | | if (_Supp.exists("pdf") && _Supp.exists("nsamples")){ |
| 107 | | epdf *g0=UI::build<epdf> (_Supp, "pdf"); |
| 108 | | int npoints=100; |
| 109 | | _Supp.lookupValue("nsamples",npoints); |
| 110 | | Merger->set_support (*g0,npoints); |
| 111 | | delete g0; |
| 112 | | } |
| 113 | | else it_error("Use either [grid,nbins] or [pdf,nsamples]."); |
| | 90 | Setting & _Supp = Cfg.lookup ("Support"); |
| | 91 | |
| | 92 | if (_Supp.exists ("grid") && _Supp.exists ("nbins")) { |
| | 93 | Array<vec> bounds (0); |
| | 94 | UI::get (bounds, _Supp, "grid"); |
| | 95 | ivec nbins (0); |
| | 96 | UI::get (nbins, _Supp, "nbins"); |
| | 97 | Merger->set_support (bounds, nbins); |
| | 98 | |
| | 99 | } else { |
| | 100 | if (_Supp.exists ("pdf") && _Supp.exists ("nsamples")) { |
| | 101 | epdf *g0 = UI::build<epdf> (_Supp, "pdf"); |
| | 102 | int npoints = 100; |
| | 103 | _Supp.lookupValue ("nsamples", npoints); |
| | 104 | Merger->set_support (*g0, npoints); |
| | 105 | delete g0; |
| | 106 | } else it_error ("Use either [grid,nbins] or [pdf,nsamples]."); |
| 120 | | Array<vec> source_vals(Sources.length()); |
| 121 | | for (int i=0;i<Sources.length();i++){ |
| 122 | | datalink_m2e dl; |
| 123 | | dl.set_connection(Sources(i)->_rv(), Sources(i)->_rvc(), Merger->_rv()); |
| 124 | | |
| 125 | | vec ll(Merger->_Smp()._samples().length()); |
| 126 | | for(int j=0; j<Merger->_Smp()._samples().length(); j++){ |
| 127 | | vec dt=dl.pushdown(Merger->_Smp()._samples()(j)); |
| 128 | | vec dtc=dl.get_cond(Merger->_Smp()._samples()(j)); |
| 129 | | ll(j)=Sources(i)->evallogcond(dt,dtc); |
| 130 | | } |
| | 113 | Array<vec> source_vals (Sources.length()); |
| | 114 | for (int i = 0;i < Sources.length();i++) { |
| | 115 | datalink_m2e dl; |
| | 116 | dl.set_connection (Sources (i)->_rv(), Sources (i)->_rvc(), Merger->_rv()); |
| 153 | | Array<vec> &samples=Merger->_Smp()._samples(); |
| 154 | | if (samples.size()>0){ |
| 155 | | mxArray* fld=mxCreateDoubleMatrix(samples(0).length(), samples.size(), mxREAL); |
| 156 | | Arrayvec2mxArray(samples,fld); |
| 157 | | mxReplaceFieldNM(tmp, "support", fld); |
| | 146 | Array<vec> &samples = Merger->_Smp()._samples(); |
| | 147 | if (samples.size() > 0) { |
| | 148 | mxArray* fld = mxCreateDoubleMatrix (samples (0).length(), samples.size(), mxREAL); |
| | 149 | Arrayvec2mxArray (samples, fld); |
| | 150 | mxReplaceFieldNM (tmp, "support", fld); |
| 167 | | mxArray* fldm=mxCreateDoubleMatrix(1, w.length(), mxREAL); |
| 168 | | vec2mxArray(mix_val,fldm); |
| 169 | | mxReplaceFieldNM(tmp, "mix", fldm); |
| | 160 | mxArray* fldm = mxCreateDoubleMatrix (1, w.length(), mxREAL); |
| | 161 | vec2mxArray (mix_val, fldm); |
| | 162 | mxReplaceFieldNM (tmp, "mix", fldm); |
| 173 | | for (int i=0;i<Sources.length();i++){ |
| 174 | | sprintf(srcstr,"source%d",i+1); |
| 175 | | mxArray* fldw=mxCreateDoubleMatrix(1, source_vals(i).length(), mxREAL); |
| 176 | | vec2mxArray(source_vals(i),fldw); |
| 177 | | mxReplaceFieldNM(tmp, srcstr, fldw); |
| 178 | | } |
| | 166 | for (int i = 0;i < Sources.length();i++) { |
| | 167 | sprintf (srcstr, "source%d", i + 1); |
| | 168 | mxArray* fldw = mxCreateDoubleMatrix (1, source_vals (i).length(), mxREAL); |
| | 169 | vec2mxArray (source_vals (i), fldw); |
| | 170 | mxReplaceFieldNM (tmp, srcstr, fldw); |
| | 171 | } |