mixpp: arx_agent.h Source File

arx_agent.h

Go to the documentation of this file.
00001
00007 #ifndef ARXAG_H
00008 #define ARXAG_H
00009 
00010
00011 #include <design/arx_ctrl.h>
00012 #include <stat/merger.h>
00013 #include <base/participants.h>
00014
00015
00016 namespace bdm {
00017
00022 class ARXAgent : public Participant {
00023 protected:
00025     Array<string > neighbours;
00026
00028     shared_ptr<LQG_ARX> lqg_arx;
00030     shared_ptr<merger_mix > merger;
00032     Array<shared_ptr<pdf> > preds;
00034     mlnorm_chmat_ptr my_pred;
00035
00037     datalink_part dlU;
00039     datalink_buffered dlDt;
00040
00042     vec dt;
00044     vec ut;
00045 public:
00046     void validate() {
00047         lqg_arx->validate();
00048         my_pred=lqg_arx->_ar().ml_predictor<chmat>();
00049     }
00050     void receive(const Setting &msg) {
00051         string what;
00052         UI::get(what, msg, "what", UI::compulsory);
00053
00054         if (what=="predictor") { // add predictor
00055             preds.set_length(preds.length()+1, true);
00056             preds(preds.length()-1) = UI::build<pdf>(msg["data"]);
00057         } else {
00058             bdm_warning("Unknown message of type "+what);
00059         }
00060     }
00061     void broadcast(Setting& set) {
00062         // broadcast predictor (created in adapt) to all neighbours
00063         for (int i=0; i<neighbours.length(); i++) {
00064             Setting &msg =set.add(Setting::TypeGroup);
00065             create_message(msg, neighbours(i), "predictor", *preds(0).get());
00066         }
00067     }
00068     void adapt(const vec &glob_dt) {
00069         dlDt.filldown(glob_dt, dt);
00070         dlDt.store_data(glob_dt); // do not ever use dlDt again!
00071
00072         lqg_arx->adapt(dt);
00073         // remove old predictors
00074         preds.set_length(1, false);
00075         lqg_arx->_ar().ml_predictor_update<chmat>(*my_pred) ;
00076         preds(0)=my_pred;
00077
00078         // we arer finished with datasource
00079     }
00080     void act(vec &glob_ut) {
00081         if (preds.length()>1) {
00082             merger->set_sources(preds);
00083             if (preds.length()>1) {
00084                 cout<<preds(1)->to_string()<<endl;
00085             }
00086             merger->merge();
00087             enorm<chmat> joint_pred;
00088             mat Cov=merger->merger().covariance();
00089             if (sumsum(Cov)==0.0) {
00090                 bdm_error("merging failed");
00091             }
00092             joint_pred.set_parameters(merger->merger().mean(), Cov);
00093             joint_pred.set_rv(merger->merger()._rv());
00094
00095             enorm<chmat> marg_pred; // remove rvs taht should not be there
00096             joint_pred.marginal(concat(preds(0)->_rv(), preds(0)->_rvc()), marg_pred);
00097
00098             // assign
00099             mlnorm<chmat> *merg_pred = lqg_arx->_pred();
00100             marg_pred.condition(preds(0)->_rv(),*merg_pred);
00101         } else {
00102             lqg_arx->_ar().ml_predictor_update<chmat>(*lqg_arx->_pred()) ;
00103         }
00104         //
00105         lqg_arx->redesign();
00106         ut=lqg_arx->ctrlaction(dt);
00107         dlU.filldown(ut,glob_ut);
00108     }
00109     virtual void ds_register(const DS &ds) {
00110         dlDt.set_connection(lqg_arx->_rvc(), ds._drv() );
00111         dlU.set_connection(ds._urv() , lqg_arx->_rv() );
00112         dt=zeros(lqg_arx->_rvc()._dsize());
00113         ut=zeros(lqg_arx->_rv()._dsize());
00114     }
00115     void from_setting(const Setting &set) {
00116         Participant::from_setting(set);
00117         lqg_arx = UI::build<LQG_ARX>(set, "lqg_arx",UI::compulsory);
00118         merger = UI::build<merger_mix>(set, "merger", UI::compulsory);
00119         UI::get(neighbours, set, "neighbours",UI::compulsory);
00120         validate();
00121     }
00122 };
00123 //UIREGISTER(LQG_ARX);
00124 UIREGISTER(ARXAgent);
00125
00126 }//namespace
00127 #endif //ARXAG_H

Generated on 2 Dec 2013 for mixpp by  doxygen 1.4.7