| 427 | int logger::add_vector ( const RV &rv, string prefix ) { |
| 428 | int id; |
| 429 | if ( rv._dsize() > 0 ) { |
| 430 | id = entries.length(); |
| 431 | names = concat ( names, prefix ); // diff |
| 432 | entries.set_length ( id + 1, true ); |
| 433 | entries ( id ) = rv; |
| 434 | } else { |
| 435 | id = -1; |
| 436 | } |
| 437 | return id; // identifier of the last entry |
| 438 | } |
| 439 | |
| 440 | int logger::add_setting ( const string &prefix ) { |
| 441 | Setting &root = setting_conf.getRoot(); |
| 442 | int id = root.getLength(); //root must be group!! |
| 443 | if ( prefix.length() > 0 ) { |
| 444 | settings.set_length ( id + 1, true ); |
| 445 | settings ( id ) = &root.add ( prefix, Setting::TypeList ); |
| 446 | } else { |
| 447 | id = -1; |
| 448 | } |
| 449 | return id; |
| 450 | } |
| 451 | |
| 452 | void epdf::log_register ( logger &L, const string &prefix ) { |
| 453 | RV r; |
| 454 | if ( isnamed() ) { |
| 455 | r = _rv(); |
| 456 | } else { |
| 457 | r = RV ( "", dimension() ); |
| 458 | }; |
| 459 | root::log_register ( L, prefix ); |
| 460 | |
| 461 | // log full data |
| 462 | if ( log_level == 10 ) { |
| 463 | logrec->ids.set_size ( 1 ); |
| 464 | logrec->ids ( 0 ) = logrec->L.add_setting ( prefix ); |
| 465 | } else { |
| 466 | // log only |
| 467 | logrec->ids.set_size ( 3 ); |
| 468 | if ( log_level > 0 ) { |
| 469 | logrec->ids ( 0 ) = logrec->L.add_vector ( r, prefix + logrec->L.prefix_sep() + "mean" ); |
| 470 | } |
| 471 | if ( log_level > 1 ) { |
| 472 | logrec->ids ( 1 ) = logrec->L.add_vector ( r, prefix + logrec->L.prefix_sep() + "lb" ); |
| 473 | logrec->ids ( 2 ) = logrec->L.add_vector ( r, prefix + logrec->L.prefix_sep() + "ub" ); |
| 474 | } |
| 475 | } |
| 476 | } |
| 477 | |
| 478 | void epdf::log_write() const { |
| 479 | if ( log_level == 10 ) { |
| 480 | to_setting ( logrec->L.log_to_setting ( logrec->ids ( 0 ) ) ); |
| 481 | } else { |
| 482 | if ( log_level > 0 ) { |
| 483 | logrec->L.log_vector ( logrec->ids ( 0 ), mean() ); |
| 484 | } |
| 485 | if ( log_level > 1 ) { |
| 486 | vec lb; |
| 487 | vec ub; |
| 488 | qbounds ( lb, ub ); |
| 489 | logrec->L.log_vector ( logrec->ids ( 1 ), lb ); |
| 490 | logrec->L.log_vector ( logrec->ids ( 2 ), ub ); |
| 491 | } |
| 492 | } |
| 493 | } |
| 494 | |
| 495 | void datalink_buffered::set_connection ( const RV &rv, const RV &rv_up ) { |
| 496 | // create link between up and down |
| 497 | datalink_part::set_connection ( rv, rv_up.remove_time() ); // only non-delayed version |
| 498 | |
| 499 | // create rvs of history |
| 500 | // we can store only what we get in rv_up - everything else is removed |
| 501 | ivec valid_ids = rv.findself_ids ( rv_up ); |
| 502 | RV rv_hist = rv.subselect ( find ( valid_ids >= 0 ) ); // select only rvs that are in rv_up |
| 503 | RV rv_hist0 = rv_hist.remove_time(); // these RVs will form history at time =0 |
| 504 | // now we need to know what is needed from Up |
| 505 | rv_hist = rv_hist.expand_delayes(); // full regressor - including time 0 |
| 506 | Hrv = rv_hist.subt ( rv_hist0 ); // remove time 0 |
| 507 | history = zeros ( Hrv._dsize() ); |
| 508 | |
| 509 | // decide if we need to copy val to history |
| 510 | if ( Hrv._dsize() > 0 ) { |
| 511 | v2h_up = rv_hist0.dataind ( rv_up ); // indeces of elements of rv_up to be copied |
| 512 | } // else v2h_up is empty |
| 513 | |
| 514 | Hrv.dataind ( rv, h2v_hist, h2v_down ); |
| 515 | |
| 516 | downsize = v2v_down.length() + h2v_down.length(); |
| 517 | upsize = v2v_up.length(); |
| 518 | } |
| 519 | |
| 520 | void datalink_buffered::set_history ( const RV& rv1, const vec &hist0 ) { |
| 521 | bdm_assert ( rv1._dsize() == hist0.length(), "hist is not compatible with given rv1" ); |
| 522 | ivec ind_H; |
| 523 | ivec ind_h0; |
| 524 | Hrv.dataind ( rv1, ind_H, ind_h0 ); // find indeces of rv in |
| 525 | set_subvector ( history, ind_H, hist0 ( ind_h0 ) ); // copy given hist to appropriate places |
| 526 | } |
| 527 | |
| 528 | void DS::log_register ( logger &L, const string &prefix ) { |
| 529 | bdm_assert ( ytsize == Yrv._dsize(), "invalid DS: ytsize (" + num2str ( ytsize ) + ") different from Drv " + num2str ( Yrv._dsize() ) ); |
| 530 | bdm_assert ( utsize == Urv._dsize(), "invalid DS: utsize (" + num2str ( utsize ) + ") different from Urv " + num2str ( Urv._dsize() ) ); |
| 531 | |
| 532 | root::log_register ( L, prefix ); |
| 533 | //we know that |
| 534 | if ( log_level > 0 ) { |
| 535 | logrec->ids.set_size ( 2 ); |
| 536 | logrec->ids ( 0 ) = logrec->L.add_vector ( Yrv, prefix ); |
| 537 | logrec->ids ( 1 ) = logrec->L.add_vector ( Urv, prefix ); |
| 538 | } |
| 539 | } |
| 540 | |
| 541 | void DS::log_write ( ) const { |
| 542 | if ( log_level > 0 ) { |
| 543 | vec tmp ( Yrv._dsize() + Urv._dsize() ); |
| 544 | getdata ( tmp ); |
| 545 | // d is first in getdata |
| 546 | logrec->L.log_vector ( logrec->ids ( 0 ), tmp.left ( Yrv._dsize() ) ); |
| 547 | // u follows after d in getdata |
| 548 | logrec->L.log_vector ( logrec->ids ( 1 ), tmp.mid ( Yrv._dsize(), Urv._dsize() ) ); |
| 549 | } |
| 550 | } |
| 551 | |
| 552 | void BM::set_options ( const string &opt ) { |
| 553 | if ( opt.find ( "logfull" ) != string::npos ) { |
| 554 | const_cast<epdf&> ( posterior() ).set_log_level ( 10 ) ; |
| 555 | } else { |
| 556 | if ( opt.find ( "logbounds" ) != string::npos ) { |
| 557 | const_cast<epdf&> ( posterior() ).set_log_level ( 2 ) ; |
| 558 | } else { |
| 559 | const_cast<epdf&> ( posterior() ).set_log_level ( 1 ) ; |
| 560 | } |
| 561 | if ( opt.find ( "logll" ) != string::npos ) { |
| 562 | log_level = 1; |
| 563 | } |
| 564 | } |
| 565 | } |
| 566 | |
| 567 | void BM::log_register ( logger &L, const string &prefix ) { |
| 568 | root::log_register ( L, prefix ); |
| 569 | |
| 570 | const_cast<epdf&> ( posterior() ).log_register ( L, prefix + L.prefix_sep() + "apost" ); |
| 571 | |
| 572 | if ( ( log_level ) > 0 ) { |
| 573 | logrec->ids.set_size ( 1 ); |
| 574 | logrec->ids ( 0 ) = L.add_vector ( RV ( "", 1 ), prefix + L.prefix_sep() + "ll" ); |
| 575 | } |
| 576 | } |
| 577 | |
| 578 | void BM::log_write ( ) const { |
| 579 | posterior().log_write(); |
| 580 | if ( log_level > 0 ) { |
| 581 | logrec->L.logit ( logrec->ids ( 0 ), ll ); |
| 582 | } |
| 583 | } |
| 584 | |