41 | | //! internal data vector for controller |
42 | | vec dt; |
43 | | //! internal data vector for controller output |
44 | | vec ut; |
45 | | public: |
46 | | void validate(){ |
47 | | lqg_arx->validate(); |
48 | | my_pred=lqg_arx->_ar().ml_predictor<chmat>(); |
49 | | } |
50 | | void receive(const Setting &msg){ |
51 | | string what; |
52 | | UI::get(what, msg, "what", UI::compulsory); |
53 | | |
54 | | if (what=="predictor"){ // add predictor |
55 | | preds.set_length(preds.length()+1, true); |
56 | | preds(preds.length()-1) = UI::build<pdf>(msg["data"]); |
57 | | } else { |
58 | | bdm_warning("Unknown message of type "+what); |
59 | | } |
60 | | } |
61 | | void broadcast(Setting& set){ |
62 | | // broadcast predictor (created in adapt) to all neighbours |
63 | | for (int i=0; i<neighbours.length(); i++){ |
64 | | Setting &msg =set.add(Setting::TypeGroup); |
65 | | create_message(msg, neighbours(i), "predictor", *preds(0).get()); |
66 | | } |
67 | | } |
68 | | void adapt(const vec &glob_dt){ |
69 | | dlDt.filldown(glob_dt, dt); |
70 | | dlDt.store_data(glob_dt); // do not ever use dlDt again! |
71 | | |
72 | | lqg_arx->adapt(dt); |
73 | | // remove old predictors |
74 | | preds.set_length(1, false); |
75 | | lqg_arx->_ar().ml_predictor_update<chmat>(*my_pred) ; |
76 | | preds(0)=my_pred; |
77 | | |
78 | | // we arer finished with datasource |
79 | | } |
80 | | void act(vec &glob_ut){ |
81 | | if (preds.length()>1){ |
82 | | merger->set_sources(preds); |
83 | | if (preds.length()>1){cout<<preds(1)->to_string()<<endl;} |
84 | | merger->merge(); |
85 | | enorm<chmat> joint_pred; |
86 | | mat Cov=merger->covariance(); |
87 | | if (sumsum(Cov)==0.0){ |
88 | | bdm_error("merging failed"); |
89 | | } |
90 | | joint_pred.set_parameters(merger->mean(), Cov); |
91 | | joint_pred.set_rv(merger->_rv()); |
92 | | |
93 | | enorm<chmat> marg_pred; // remove rvs taht should not be there |
94 | | joint_pred.marginal(concat(preds(0)->_rv(), preds(0)->_rvc()), marg_pred); |
95 | | |
96 | | // assign |
97 | | mlnorm<chmat> *merg_pred = lqg_arx->_pred(); |
98 | | marg_pred.condition(preds(0)->_rv(),*merg_pred); |
99 | | } else { |
100 | | lqg_arx->_ar().ml_predictor_update<chmat>(*lqg_arx->_pred()) ; |
101 | | } |
102 | | // |
103 | | lqg_arx->redesign(); |
104 | | ut=lqg_arx->ctrlaction(dt); |
105 | | dlU.filldown(ut,glob_ut); |
106 | | } |
107 | | virtual void ds_register(const DS &ds){ |
108 | | dlDt.set_connection(lqg_arx->_rvc(), ds._drv() ); |
109 | | dlU.set_connection(ds._urv() , lqg_arx->_rv() ); |
110 | | dt=zeros(lqg_arx->_rvc()._dsize()); |
111 | | ut=zeros(lqg_arx->_rv()._dsize()); |
112 | | } |
113 | | void from_setting(const Setting &set){ |
114 | | Participant::from_setting(set); |
115 | | lqg_arx = UI::build<LQG_ARX>(set, "lqg_arx",UI::compulsory); |
116 | | merger = UI::build<merger_mix>(set, "merger", UI::compulsory); |
117 | | UI::get(neighbours, set, "neighbours",UI::compulsory); |
118 | | validate(); |
119 | | } |
| 27 | //! Internal ARX Controller |
| 28 | shared_ptr<LQG_ARX> lqg_arx; |
| 29 | //! Merger for predictors from neighbours |
| 30 | shared_ptr<merger_mix > merger; |
| 31 | //! All available predictors |
| 32 | Array<shared_ptr<pdf> > preds; |
| 33 | //! My own predictor |
| 34 | mlnorm_chmat_ptr my_pred; |
| 35 | |
| 36 | //! data link of data |
| 37 | datalink_part dlU; |
| 38 | //! data link of |
| 39 | datalink_buffered dlDt; |
| 40 | |
| 41 | //! internal data vector for controller |
| 42 | vec dt; |
| 43 | //! internal data vector for controller output |
| 44 | vec ut; |
| 45 | public: |
| 46 | void validate() { |
| 47 | lqg_arx->validate(); |
| 48 | my_pred=lqg_arx->_ar().ml_predictor<chmat>(); |
| 49 | } |
| 50 | void receive(const Setting &msg) { |
| 51 | string what; |
| 52 | UI::get(what, msg, "what", UI::compulsory); |
| 53 | |
| 54 | if (what=="predictor") { // add predictor |
| 55 | preds.set_length(preds.length()+1, true); |
| 56 | preds(preds.length()-1) = UI::build<pdf>(msg["data"]); |
| 57 | } else { |
| 58 | bdm_warning("Unknown message of type "+what); |
| 59 | } |
| 60 | } |
| 61 | void broadcast(Setting& set) { |
| 62 | // broadcast predictor (created in adapt) to all neighbours |
| 63 | for (int i=0; i<neighbours.length(); i++) { |
| 64 | Setting &msg =set.add(Setting::TypeGroup); |
| 65 | create_message(msg, neighbours(i), "predictor", *preds(0).get()); |
| 66 | } |
| 67 | } |
| 68 | void adapt(const vec &glob_dt) { |
| 69 | dlDt.filldown(glob_dt, dt); |
| 70 | dlDt.store_data(glob_dt); // do not ever use dlDt again! |
| 71 | |
| 72 | lqg_arx->adapt(dt); |
| 73 | // remove old predictors |
| 74 | preds.set_length(1, false); |
| 75 | lqg_arx->_ar().ml_predictor_update<chmat>(*my_pred) ; |
| 76 | preds(0)=my_pred; |
| 77 | |
| 78 | // we arer finished with datasource |
| 79 | } |
| 80 | void act(vec &glob_ut) { |
| 81 | if (preds.length()>1) { |
| 82 | merger->set_sources(preds); |
| 83 | if (preds.length()>1) { |
| 84 | cout<<preds(1)->to_string()<<endl; |
| 85 | } |
| 86 | merger->merge(); |
| 87 | enorm<chmat> joint_pred; |
| 88 | mat Cov=merger->covariance(); |
| 89 | if (sumsum(Cov)==0.0) { |
| 90 | bdm_error("merging failed"); |
| 91 | } |
| 92 | joint_pred.set_parameters(merger->mean(), Cov); |
| 93 | joint_pred.set_rv(merger->_rv()); |
| 94 | |
| 95 | enorm<chmat> marg_pred; // remove rvs taht should not be there |
| 96 | joint_pred.marginal(concat(preds(0)->_rv(), preds(0)->_rvc()), marg_pred); |
| 97 | |
| 98 | // assign |
| 99 | mlnorm<chmat> *merg_pred = lqg_arx->_pred(); |
| 100 | marg_pred.condition(preds(0)->_rv(),*merg_pred); |
| 101 | } else { |
| 102 | lqg_arx->_ar().ml_predictor_update<chmat>(*lqg_arx->_pred()) ; |
| 103 | } |
| 104 | // |
| 105 | lqg_arx->redesign(); |
| 106 | ut=lqg_arx->ctrlaction(dt); |
| 107 | dlU.filldown(ut,glob_ut); |
| 108 | } |
| 109 | virtual void ds_register(const DS &ds) { |
| 110 | dlDt.set_connection(lqg_arx->_rvc(), ds._drv() ); |
| 111 | dlU.set_connection(ds._urv() , lqg_arx->_rv() ); |
| 112 | dt=zeros(lqg_arx->_rvc()._dsize()); |
| 113 | ut=zeros(lqg_arx->_rv()._dsize()); |
| 114 | } |
| 115 | void from_setting(const Setting &set) { |
| 116 | Participant::from_setting(set); |
| 117 | lqg_arx = UI::build<LQG_ARX>(set, "lqg_arx",UI::compulsory); |
| 118 | merger = UI::build<merger_mix>(set, "merger", UI::compulsory); |
| 119 | UI::get(neighbours, set, "neighbours",UI::compulsory); |
| 120 | validate(); |
| 121 | } |