300 | | /*! |
301 | | \brief Generator of ARX data |
302 | | |
303 | | */ |
304 | | class ArxDS : public DS { |
305 | | protected: |
306 | | //! Rv of the regressor |
307 | | RV Rrv; |
308 | | //! History, ordered as \f$[y_t, u_t, y_{t-1 }, u_{t-1}, \ldots]\f$ |
309 | | vec H; |
310 | | //! (future) input |
311 | | vec U; |
312 | | //! temporary variable for regressor |
313 | | vec rgr; |
314 | | //! data link: H -> rgr |
315 | | datalink rgrlnk; |
316 | | //! model of Y - linear Gaussian |
317 | | mlnorm<chmat> model; |
318 | | //! options |
319 | | bool opt_L_theta; |
320 | | //! loggers |
321 | | int L_theta; |
322 | | int L_R; |
323 | | int dt_size; |
324 | | public: |
325 | | void getdata ( vec &dt ) { |
326 | | dt = H; |
327 | | } |
328 | | |
329 | | void getdata ( vec &dt, const ivec &indices ) { |
330 | | dt = H ( indices ); |
331 | | } |
332 | | |
333 | | void write ( vec &ut ) { |
334 | | U = ut; |
335 | | } |
336 | | |
337 | | void write ( vec &ut, const ivec &indices ) { |
338 | | bdm_assert_debug ( ut.length() == indices.length(), "ArxDS" ); |
339 | | set_subvector ( U, indices, ut ); |
340 | | } |
341 | | |
342 | | void step(); |
343 | | |
344 | | //!Default constructor |
345 | | ArxDS ( ) {}; |
346 | | //! Set parameters of the internal model, H is maximum time delay |
347 | | void set_parameters ( const mat &Th0, const vec mu0, const chmat &sqR0 ) { |
348 | | model.set_parameters ( Th0, mu0, sqR0 ); |
349 | | }; |
350 | | //! Set |
351 | | void set_drv ( const RV &yrv, const RV &urv, const RV &rrv ) { |
352 | | Rrv = rrv; |
353 | | Urv = urv; |
354 | | dt_size = yrv._dsize() + urv._dsize(); |
355 | | |
356 | | RV drv = concat ( yrv, urv ); |
357 | | Drv = drv; |
358 | | int td = rrv.mint(); |
359 | | H.set_size ( drv._dsize() * ( -td + 1 ) ); |
360 | | U.set_size ( Urv._dsize() ); |
361 | | for ( int i = -1; i >= td; i-- ) { |
362 | | drv.t_plus ( -1 ); |
363 | | Drv.add ( drv ); //shift u1 |
364 | | } |
365 | | rgrlnk.set_connection ( rrv, Drv ); |
366 | | |
367 | | dtsize = Drv._dsize(); |
368 | | utsize = Urv._dsize(); |
369 | | } |
370 | | //! set options from a string |
371 | | void set_options ( const string &s ) { |
372 | | opt_L_theta = ( s.find ( "L_theta" ) != string::npos ); |
373 | | }; |
374 | | virtual void log_add ( logger &L ) { |
375 | | //DS::log_add ( L ); too long!! |
376 | | L_dt = L.add ( Drv ( 0, dt_size ), "" ); |
377 | | L_ut = L.add ( Urv, "" ); |
378 | | |
379 | | const mat &A = model._A(); |
380 | | const mat R = model._R(); |
381 | | if ( opt_L_theta ) { |
382 | | L_theta = L.add ( RV ( "{th }", vec_1 ( A.rows() * A.cols() ) ), "t" ); |
383 | | } |
384 | | if ( opt_L_theta ) { |
385 | | L_R = L.add ( RV ( "{R }", vec_1 ( R.rows() * R.cols() ) ), "r" ); |
386 | | } |
387 | | } |
388 | | virtual void logit ( logger &L ) { |
389 | | //DS::logit ( L ); |
390 | | L.logit ( L_dt, H.left ( dt_size ) ); |
391 | | L.logit ( L_ut, U ); |
392 | | |
393 | | const mat &A = model._A(); |
394 | | const mat R = model._R(); |
395 | | if ( opt_L_theta ) { |
396 | | L.logit ( L_theta, vec ( A._data(), A.rows() *A.cols() ) ); |
397 | | }; |
398 | | if ( opt_L_theta ) { |
399 | | L.logit ( L_R, vec ( R._data(), R.rows() *R.rows() ) ); |
400 | | }; |
401 | | } |
402 | | |
403 | | // TODO dokumentace - aktualizovat |
404 | | /*! UI for ArxDS using factorized description! |
405 | | |
406 | | The ArxDS is constructed from a structure with fields: |
407 | | \code |
408 | | system = { |
409 | | type = "ArxDS"; |
410 | | // description of y variables |
411 | | y = {type="rv"; names=["y", "u"];}; |
412 | | // description of u variable |
413 | | u = {type="rv"; names=[];} |
414 | | // description of regressor |
415 | | rgr = {type="rv"; |
416 | | names = ["y","y","y","u"]; |
417 | | times = [-1, -2, -3, -1]; |
418 | | } |
419 | | |
420 | | // theta |
421 | | theta = [0.8, -0.3, 0.4, 1.0, |
422 | | 0.0, 0.0, 0.0, 0.0]; |
423 | | // offset (optional) |
424 | | offset = [0.0, 0.0]; |
425 | | //variance |
426 | | r = [0.1, 0.0, |
427 | | 0.0, 1.0]; |
428 | | //options: L_theta = log value of theta, |
429 | | opt = "L_theta"; |
430 | | }; |
431 | | \endcode |
432 | | |
433 | | Result is ARX data source offering with full history as Drv. |
434 | | */ |
435 | | void from_setting ( const Setting &set ); |
436 | | |
437 | | // TODO dodelat void to_setting( Setting &set ) const; |
438 | | }; |
439 | | |
440 | | UIREGISTER ( ArxDS ); |
441 | | SHAREDPTR ( ArxDS ); |
442 | | |
| 302 | // ARXDs - DELETED |
| 303 | |
| 304 | //! State-space data source simulating two densities |