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 | } |