Index: library/bdm/design/ctrlbase.cpp
===================================================================
--- library/bdm/design/ctrlbase.cpp (revision 706)
+++ library/bdm/design/ctrlbase.cpp (revision 723)
@@ -3,11 +3,6 @@
 namespace bdm{
 
-void LQG::set_system(shared_ptr<StateSpace<fsqmat> > S0){
+void LQG::set_system(shared_ptr<StateSpace<chmat> > S0){
 	S = S0;
-	dimx= S->_A().rows();
-	dimy= S->_C().rows();
-	dimu= S->_B().cols();
-	pr=zeros(dimx+dimu+dimy,  dimu+dimx+dimu+dimy);
-	pr.set_submatrix(dimx, dimu+dimx, eye(dimu+dimy));
 }
 
@@ -17,37 +12,30 @@
 	y_req=y_req0;
 	horizon = horizon0;
-	validate();
-	initialize();
 }
 
 void LQG::validate() {
+	// set properties from S
+	dimx= S->_A().rows();
+	dimy= S->_C().rows();
+	dimu= S->_B().cols();
+	pr=zeros(dimx+dimu+dimy,  dimu+dimx+dimu+dimy);
+	pr.set_submatrix(dimx, dimu+dimx, eye(dimu+dimy));
+	
+	//penalization
 	bdm_assert ( Qy.cols() == dimy, "LQG: wrong dimensions of Qy " );
 	bdm_assert ( Qu.cols() == dimu, "LQG: wrong dimensions of Qu " );
 	bdm_assert ( y_req.length() == dimy, "LQG: wrong dimensions of y_req " );
+	
+	qux=zeros(dimu,dimx+2*dimu+dimy);     
+	qyx=zeros(dimy, dimx+dimy+dimu);
+	
+	//
+	initial_belmann();
+	// parts of QR
+	post_qr = zeros(pre_qr.rows(), pre_qr.cols());
+	
+	update_system();
 }
 
-void LQG::initialize(){
-	// set parameter matrix
-	pr.set_submatrix(0,0,S->_B());
-	pr.set_submatrix(0,dimu, S->_A());
-	
-	//penalization
-	qux=zeros(dimu,dimx+2*dimu+dimy);     
-	qux.set_submatrix(0,0,Qu);
-	qux.set_submatrix(0,dimx+dimu+dimy,Qu);
-
-	qyx=zeros(dimy, dimx+dimy+dimu);
-	qyx.set_submatrix(0,0,S->_C());
-	qyx.set_submatrix(0,dimx,-eye(dimy));
-	
-	//
-	s=1e-5*eye(dimx+dimu+dimy);
-	// parts of QR
-	hqy=Qy*qyx*pr;
-	
-	// pre_qr
-	pre_qr = concat_vertical(s*pr, concat_vertical(hqy, qux));
-	post_qr = zeros(pre_qr.rows(), pre_qr.cols());
-}
 
 }
Index: library/bdm/design/arx_ctrl.h
===================================================================
--- library/bdm/design/arx_ctrl.h (revision 723)
+++ library/bdm/design/arx_ctrl.h (revision 723)
@@ -0,0 +1,140 @@
+/*!
+  \file
+  \brief Controllers for linear Gaussian systems
+  \author Vaclav Smidl.
+
+  -----------------------------------
+  BDM++ - C++ library for Bayesian Decision Making under Uncertainty
+
+  Using IT++ for numerical operations
+  -----------------------------------
+*/
+
+#include "../base/bdmbase.h"
+#include "ctrlbase.h"
+#include "../estim/arx.h"
+#include "../estim/kalman.h"
+//#include <../applications/pmsm/simulator_zdenek/ekf_example/pmsm_mod.h>
+
+namespace bdm{
+
+	//! Controller using ARX model for estimation and LQG designer for control
+	class LQG_ARX : public Controller{
+		protected:
+		//! Internal ARX estimator
+			shared_ptr<ARX> ar;
+		//! Internal LQG designer
+			LQG lq;
+			//! Intermediate StateSpace model
+			shared_ptr<StateFromARX> Stsp;
+			//! AR predictor
+			shared_ptr<mlnorm<chmat> > pred;
+			//! datalink from rvc to ar.bayes
+			datalink rvc2ar_y;
+			//! datalink from rvc to ar.bayes
+			datalink_buffered rvc2ar_cond;
+			
+			//! flag to use iterations spread in time (ist)
+			bool ist;
+			//! flag to use windsurfer approach
+			bool windsurfer;
+		public:
+			//! Default constructor
+			LQG_ARX(): ar(), lq() { }
+
+			//! adaptation is to store arx estimates in stsp
+			void adapt(const vec &data){
+				ar->bayes(rvc2ar_y.pushdown(data), rvc2ar_cond.pushdown(data));
+				rvc2ar_cond.store_data(data);
+			}
+			void redesign(){
+				ar->ml_predictor_update(*pred);
+				Stsp->update_from(*pred);
+				if (windsurfer) {
+					mat Ry=pred->_R();
+					lq.set_control_Qy(inv(Ry));
+				}
+				if (!ist) {
+					lq.initial_belmann();
+				}
+				lq.redesign();
+			}
+			vec ctrlaction(const vec &cond) const{
+				//cond is xt + ut
+				vec state=cond.left(Stsp->_A().rows());
+				if (Stsp->_have_constant()){
+					state(state.length()-1) = 1;
+				}
+				return lq.ctrlaction(state,cond.right(Stsp->_B().cols()));
+			}
+			//! 
+	//! LQG is defined by quadratic loss function
+	/*! \f[ L(y,u) = (y-y_{req})'Q_y (y-y_{req}) + (u-u_{req})' Q_u (u-u_{req}) \f]
+			expected input
+			\code
+		{ class="LQG";
+			arx = {class="ARX", ...} // internal arx model, see 
+			Qy = ("matrix", ...); 
+			Qu = ("matrix", ...); 
+			yreq = [];               // requested output
+			ureq = [];               // requested input value
+		}
+			\endcode
+	 */
+			void from_setting(const Setting &set){
+				ar=UI::build<ARX> (set, "ARX",UI::compulsory);
+
+				mat Qu;
+				mat Qy;
+				
+				UI::get(Qu, set, "Qu", UI::compulsory);
+				UI::get(Qy, set, "Qy", UI::compulsory);
+		
+				vec y_req;
+				if (!UI::get(y_req, set, "yreq", UI::optional))
+					y_req = zeros(ar->_yrv()._dsize());
+				
+				int horizon;
+				UI::get(horizon, set, "horizon", UI::compulsory);
+				lq.set_control_parameters(Qy,Qu,y_req,horizon);
+				
+				int wind;
+				if (UI::get(wind, set, "windsurfer", UI::optional)){
+					windsurfer=wind>0;
+				} else {
+					windsurfer=false;
+				};
+				int ist_;
+				if (UI::get(ist_, set, "ist", UI::optional)){
+					ist=ist_>0;
+				} else {
+					ist=false;
+				};
+				validate();
+			}
+
+		void validate() {
+			// ar is valid
+			pred = ar->ml_predictor<chmat>();
+			Stsp = new StateFromARX;
+			RV xrv;
+			RV urvm; //old ut
+			Stsp->connect_mlnorm(*pred, xrv, urvm);
+			lq.set_system(Stsp);
+			lq.validate();
+			
+			rvc =concat(xrv, urvm);
+			rvc2ar_y.set_connection(ar->_yrv(), rvc);
+			rvc2ar_cond.set_connection(ar->_rvc(), rvc);
+			//datalink from ARX to rvc
+		}
+		void log_register (logger &L, const string &prefix ) {
+			ar->log_register(L,prefix);
+		}
+		void log_write ( ) const { 
+			ar->log_write();
+		}
+		
+	};
+	UIREGISTER(LQG_ARX);
+} // namespace
Index: library/bdm/design/ctrlbase.h
===================================================================
--- library/bdm/design/ctrlbase.h (revision 706)
+++ library/bdm/design/ctrlbase.h (revision 723)
@@ -14,122 +14,142 @@
 #include "../estim/kalman.h"
 
-namespace bdm{
+namespace bdm {
 
-	//! Base class for adaptive controllers 
-	//! The base class is, however, non-adaptive, method \c adapt() is empty.
-	//! \note advanced Controllers will probably include estimator as their internal attribute (e.g. dual controllers)
-	class Controller : public root {
-		protected:
-			//! identifier of the designed action;
-			RV rv;
-			//! identifier of the conditioning variables;
-			RV rvc;
-		public:
-			//! function processing new observations and adapting control strategy accordingly
-			virtual void adapt(const vec &data){};
-			//! function redesigning the control strategy 
-			virtual void redesign(){};
-			//! returns designed control action
-			virtual vec ctrlaction(const vec &cond){return vec(0);}
-			
-			void from_setting(const Setting &set){
-				UI::get(rv,set,"rv",UI::optional);
-				UI::get(rvc,set,"rvc",UI::optional);
-			}
-			//! access function
-			const RV& _rv() {return rv;}
-			//! access function
-			const RV& _rvc() {return rvc;}
-			//! register this controller with given datasource under name "name"
-			virtual void log_register (logger &L, const string &prefix ) { }
-			//! write requested values into the logger
-			virtual void log_write ( ) const { }
-			
-	};
-	
+//! Base class for adaptive controllers
+//! The base class is, however, non-adaptive, method \c adapt() is empty.
+//! \note advanced Controllers will probably include estimator as their internal attribute (e.g. dual controllers)
+class Controller : public root {
+protected:
+	//! identifier of the designed action;
+	RV rv;
+	//! identifier of the conditioning variables - data needed ;
+	RV rvc;
+public:
+	//! function processing new observations and adapting control strategy accordingly
+	virtual void adapt ( const vec &data ) {};
+	//! function redesigning the control strategy
+	virtual void redesign() {};
+	//! returns designed control action
+	virtual vec ctrlaction ( const vec &cond ) const {return vec ( 0 );}
+
+	void from_setting ( const Setting &set ) {
+		UI::get ( rv,set,"rv",UI::optional );
+		UI::get ( rvc,set,"rvc",UI::optional );
+	}
+	//! access function
+	const RV& _rv() {return rv;}
+	//! access function
+	const RV& _rvc() {return rvc;}
+	//! register this controller with given datasource under name "name"
+	virtual void log_register ( logger &L, const string &prefix ) { }
+	//! write requested values into the logger
+	virtual void log_write ( ) const { }
+
+};
+
 //! Linear Quadratic Gaussian designer for constant penalizations and constant target
 //! Its internals are very close to Kalman estimator
 class LQG : public Controller {
-	protected:
-		//! StateSpace model from which we read data
-		shared_ptr<StateSpace<fsqmat> > S;
-		//! required value of the output y at time t (assumed constant)
-		vec y_req;
-		//! required value of the output y at time t (assumed constant)
-		vec u_req;
-		
-		//! Control horizon, set to maxint for infinite horizons
-		int horizon;
-		//! penalization matrix Qy
-		mat Qy;
-		//! penalization matrix Qu
-		mat Qu;
-		//! time of the design step - from horizon->0
-		int td;
-		//! controller parameters
-		mat L;
-		
-		//!@{ \name temporary storage for ricatti - use initialize
-		//! convenience parameters
-		int dimx;
-		//! convenience parameters
-		int dimy;
-		//! convenience parameters
-		int dimu;
-		
-		//!  parameters
-		mat pr;
-		//! penalization 
-		mat qux;
-		//! penalization
-		mat qyx;
-		//! internal quadratic form 
-		mat s;
-		//! penalization
-		mat qy;
-		//! pre_qr part
-		mat hqy;
-		//! pre qr matrix
-		mat pre_qr;
-		//! post qr matrix
-		mat post_qr;
-		//!@}
-		
-	public:
-		//! set system parameters from given matrices
-		void set_system(shared_ptr<StateSpace<fsqmat> > S0);
-		//! set penalization matrices and control horizon
-		void set_control_parameters(const mat &Qy0, const mat &Qu0, const vec &y_req0, int horizon0);
-		//! set system parameters from Kalman filter
-//		void set_system_parameters(const Kalman &K);
-		//! refresh temporary storage - inefficient can be improved
-		void initialize();
-		//! validation procedure
-		void validate();
-		//! function for future use which is called at each time td; Should call initialize()!
-		virtual void update_state(){};
-		//! redesign one step of the 
-		void ricatti_step(){
-			pre_qr.set_submatrix(0,0,s*pr);
-			pre_qr.set_submatrix(dimx+dimu+dimy, dimu+dimx, -Qy*y_req);
-			if (!qr(pre_qr,post_qr)){ bdm_warning("QR in LQG unstable");}
-			triu(post_qr);
-	// hn(m+1:2*m+n+r,m+1:2*m+n+r);
-			s=post_qr.get(dimu, 2*dimu+dimx+dimy-1, dimu, 2*dimu+dimx+dimy-1);
-		};
-		void redesign(){
-			for(td=horizon; td>0; td--){
-				update_state();
-				ricatti_step();
-			}
-/*			ws=hn(1:m,m+1:2*m+n+r);
-			wsd=hn(1:m,1:m);
-			Lklq=-inv(wsd)*ws;*/
-			L = -inv(post_qr.get(0,dimu-1, 0,dimu-1)) * post_qr.get(0,dimu-1, dimu, 2*dimu+dimx+dimy-1);
+protected:
+	//! StateSpace model from which we read data
+	shared_ptr<StateSpace<chmat> > S;
+	//! required value of the output y at time t (assumed constant)
+	vec y_req;
+	//! required value of the output y at time t (assumed constant)
+	vec u_req;
+
+	//! Control horizon, set to maxint for infinite horizons
+	int horizon;
+	//! penalization matrix Qy
+	chmat Qy;
+	//! penalization matrix Qu
+	chmat Qu;
+	//! time of the design step - from horizon->0
+	int td;
+	//! controller parameters
+	mat L;
+
+	//!@{ \name temporary storage for ricatti - use initialize
+	//! convenience parameters
+	int dimx;
+	//! convenience parameters
+	int dimy;
+	//! convenience parameters
+	int dimu;
+
+	//!  parameters
+	mat pr;
+	//! penalization
+	mat qux;
+	//! penalization
+	mat qyx;
+	//! internal quadratic form
+	mat s;
+	//! penalization
+	mat qy;
+	//! pre_qr part
+	mat hqy;
+	//! pre qr matrix
+	mat pre_qr;
+	//! post qr matrix
+	mat post_qr;
+	//!@}
+
+public:
+	//! set system parameters from given matrices
+	void set_system ( shared_ptr<StateSpace<chmat> > S0 );
+	//! update internal whan system has changed
+	void update_system() {
+		pr.set_submatrix ( 0,0,S->_B() );
+		pr.set_submatrix ( 0,dimu, S->_A() );
+
+		//penalization
+		qux.set_submatrix ( 0,0, Qu._Ch() );
+		qux.set_submatrix ( 0,dimx+dimu+dimy,Qu._Ch() );
+
+		qyx.set_submatrix ( 0,0,S->_C() );
+		qyx.set_submatrix ( 0,dimx,-eye ( dimy ) );
+
+		// parts of QR
+		hqy=Qy.to_mat()*qyx*pr;
+
+		// pre_qr
+		pre_qr = concat_vertical ( s*pr, concat_vertical ( hqy, qux ) );
+	}
+	//! set penalization matrices and control horizon
+	void set_control_parameters ( const mat &Qy0, const mat &Qu0, const vec &y_req0, int horizon0 );
+	//! set penalization matrices and control horizon
+	void set_control_Qy ( const mat &Qy0 ) {Qy=Qy0;}
+	//! refresh temporary storage - inefficient can be improved
+	void initial_belmann() {s=1e-5*eye ( dimx+dimu+dimy );};
+	//! validation procedure
+	void validate();
+	//! function for future use which is called at each time td; Should call initialize()!
+	//! redesign one step of the
+	void ricatti_step() {
+		pre_qr.set_submatrix ( 0,0,s*pr );
+		pre_qr.set_submatrix ( dimx+dimu+dimy, dimu+dimx, -Qy.to_mat()*y_req );
+		if ( !qr ( pre_qr,post_qr ) ) { bdm_warning ( "QR in LQG unstable" );}
+		triu ( post_qr );
+		// hn(m+1:2*m+n+r,m+1:2*m+n+r);
+		s=post_qr.get ( dimu, 2*dimu+dimx+dimy-1, dimu, 2*dimu+dimx+dimy-1 );
+	};
+	void redesign() {
+		for ( td=horizon; td>0; td-- ) {
+			update_system();
+			ricatti_step();
 		}
-		//! compute control action
-		vec ctrlaction(const vec &state, const vec &ukm){vec pom=concat(state, ones(dimy), ukm); return L*pom;}
-	} ;
+		/*			ws=hn(1:m,m+1:2*m+n+r);
+					wsd=hn(1:m,1:m);
+					Lklq=-inv(wsd)*ws;*/
+		L = -inv ( post_qr.get ( 0,dimu-1, 0,dimu-1 ) ) * post_qr.get ( 0,dimu-1, dimu, 2*dimu+dimx+dimy-1 );
+	}
+	//! compute control action
+	vec ctrlaction ( const vec &state, const vec &ukm ) const {
+		vec pom=concat ( state, ones ( dimy ), ukm );
+		return L*pom;
+	}
+} ;
 
-			
+
 } // namespace
Index: library/bdm/design/arx2statespace_notes.lyx
===================================================================
--- library/bdm/design/arx2statespace_notes.lyx (revision 723)
+++ library/bdm/design/arx2statespace_notes.lyx (revision 723)
@@ -0,0 +1,151 @@
+#LyX 1.6.4 created this file. For more info see http://www.lyx.org/
+\lyxformat 345
+\begin_document
+\begin_header
+\textclass article
+\use_default_options true
+\language english
+\inputencoding auto
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+
+\graphics default
+\paperfontsize default
+\use_hyperref false
+\papersize default
+\use_geometry false
+\use_amsmath 1
+\use_esint 1
+\cite_engine basic
+\use_bibtopic false
+\paperorientation portrait
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\defskip medskip
+\quotes_language english
+\papercolumns 1
+\papersides 1
+\paperpagestyle default
+\tracking_changes false
+\output_changes false
+\author "" 
+\end_header
+
+\begin_body
+
+\begin_layout Standard
+System
+\begin_inset Formula \[
+y_{t}=y_{t-1}+bu_{t}+e_{t}\]
+
+\end_inset
+
+ is assumed to fullfill causality, i.e.
+ 
+\begin_inset Formula $y_{t-1}\rightarrow u_{t}\rightarrow y_{t}$
+\end_inset
+
+ 
+\end_layout
+
+\begin_layout Standard
+with change in notation, i.e.
+ 
+\begin_inset Formula $y_{t-1}\rightarrow u_{t-1}\rightarrow y_{t}$
+\end_inset
+
+ the same system is: 
+\begin_inset Formula \[
+y_{t}=y_{t-1}+bu_{t-1}+e_{t}\]
+
+\end_inset
+
+and can be transformed as
+\begin_inset Formula \begin{eqnarray*}
+x_{t+1} & = & x_{t}+bu_{t}+e_{t}\\
+y_{t} & = & x_{t}\end{eqnarray*}
+
+\end_inset
+
+Morale:
+\end_layout
+
+\begin_layout Itemize
+for transcription from ARX to State-Space, the state is one time-step shorter
+ than the regressor in ARX!
+\end_layout
+
+\begin_layout Subsection*
+Delays in 
+\begin_inset Formula $u$
+\end_inset
+
+:
+\end_layout
+
+\begin_layout Standard
+System
+\begin_inset Formula \[
+y_{t}=y_{t-1}+bu_{t}+cu_{t-1}+e_{t}\]
+
+\end_inset
+
+is
+\begin_inset Formula \begin{eqnarray*}
+\left[\begin{array}{c}
+x_{t+1}\\
+u_{t}\end{array}\right] & =\left[\begin{array}{cc}
+1 & c\\
+0 & 0\end{array}\right] & \left[\begin{array}{c}
+x_{t}\\
+u_{t-1}\end{array}\right]+\left[\begin{array}{c}
+b\\
+1\end{array}\right]u_{t}+e_{t}\\
+y_{t} & = & x_{t}\end{eqnarray*}
+
+\end_inset
+
+Notation in BDM:
+\end_layout
+
+\begin_layout Standard
+xrv = [y{0}, u{-1}]
+\end_layout
+
+\begin_layout Subsection*
+Constant term
+\end_layout
+
+\begin_layout Standard
+System
+\begin_inset Formula \[
+y_{t}=y_{t-1}+bu_{t-1}+g+e_{t}\]
+
+\end_inset
+
+must be modelled as 
+\begin_inset Formula \[
+\left[\begin{array}{c}
+x_{t+1}\\
+one\end{array}\right]=\left[\begin{array}{cc}
+1 & c\\
+0 & 0\end{array}\right]\left[\begin{array}{c}
+x_{t}\\
+one\end{array}\right]+\left[\begin{array}{c}
+b\\
+1\end{array}\right]u_{t}+e_{t}\]
+
+\end_inset
+
+where one is an extra state variable.
+\end_layout
+
+\end_body
+\end_document
