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
