root/library/tests/pdf_harness.cpp @ 722

Revision 722, 2.9 kB (checked in by mido, 15 years ago)

astyler run over all test sources
general_suite added
cleanup of \test directory finished

  • Property svn:eol-style set to native
RevLine 
[693]1#include "pdf_harness.h"
[456]2#include "base/bdmbase.h"
3#include "base/user_info.h"
[447]4#include "stat/exp_family.h"
5#include "mat_checks.h"
6#include "test_util.h"
7#include "UnitTest++.h"
8
9namespace bdm {
10
[693]11void pdf_harness::test_config ( const char *config_file_name ) {
[477]12        RV::clear_all();
[456]13
[477]14        UIFile in ( config_file_name );
[693]15        Array<shared_ptr<pdf_harness> > input;
[480]16        UI::get ( input, in, "data", UI::compulsory );
[477]17        int sz = input.size();
18        CHECK ( sz > 0 );
19        for ( int i = 0; i < sz; ++i ) {
20                input ( i )->test ( config_file_name, i );
21        }
[456]22}
23
[693]24void pdf_harness::from_setting ( const Setting &set ) {
25        hpdf = UI::build<pdf> ( set, "pdf", UI::compulsory );
[477]26        UI::get ( mean, set, "mean", UI::compulsory );
[484]27        UI::get ( variance, set, "variance", UI::compulsory );
[447]28
[484]29        if ( !UI::get ( cond, set, "cond", UI::optional ) ) {
[693]30                cond = zeros ( hpdf->dimensionc() );
[484]31        }
32
[480]33        UI::get ( nsamples, set, "nsamples", UI::optional );
34        UI::get ( R, set, "R", UI::optional );
35        UI::get ( tolerance, set, "tolerance", UI::optional );
[447]36}
37
[693]38void pdf_harness::test ( const char *config_name, int idx ) {
[477]39        CurrentContext cc ( config_name, idx );
[484]40        check_mean();
[480]41        if ( R.rows() > 0 ) {
[484]42                check_covariance();
[480]43        }
[447]44}
45
[693]46void pdf_harness::check_mean() {
[484]47        vec delta = make_close_tolerance ( variance, nsamples );
48
49        int tc = 0;
[722]50        Array<vec> actual ( CurrentContext::max_trial_count );
[484]51        do {
[713]52                mat smp = hpdf->samplecond_mat ( cond, nsamples );
[484]53                vec emu = smp * ones ( nsamples ) / nsamples;
[722]54                actual ( tc ) = emu;
[484]55                ++tc;
56        } while ( ( tc < CurrentContext::max_trial_count ) &&
[722]57                  !UnitTest::AreClose ( mean, actual ( tc - 1 ), delta ) );
[484]58        if ( ( tc == CurrentContext::max_trial_count ) &&
[722]59                ( !UnitTest::AreClose ( mean, actual ( CurrentContext::max_trial_count - 1 ), delta ) ) ) {
[484]60                UnitTest::MemoryOutStream stream;
[722]61                stream << CurrentContext::format_context ( __LINE__ ) << "expected " << mean << " +/- " << delta << " but was " << actual;
[484]62
[722]63                UnitTest::TestDetails details ( *UnitTest::CurrentTest::Details(), 0, false );
[484]64
65                UnitTest::CurrentTest::Results()->OnTestFailure ( details, stream.GetText() );
[722]66        }
[447]67}
[484]68
[693]69void pdf_harness::check_covariance() {
[484]70        int tc = 0;
[722]71        Array<mat> actual ( CurrentContext::max_trial_count );
[484]72        do {
[713]73                mat smp = hpdf->samplecond_mat ( cond, nsamples );
[484]74                vec emu = smp * ones ( nsamples ) / nsamples;
75                mat er = ( smp * smp.T() ) / nsamples - outer_product ( emu, emu );
[722]76                actual ( tc ) = er;
[484]77                ++tc;
78        } while ( ( tc < CurrentContext::max_trial_count ) &&
[722]79                  !UnitTest::AreClose ( R, actual ( tc - 1 ), tolerance ) );
[484]80        if ( ( tc == CurrentContext::max_trial_count ) &&
[722]81                ( !UnitTest::AreClose ( R, actual ( CurrentContext::max_trial_count - 1 ), tolerance ) ) ) {
[484]82                UnitTest::MemoryOutStream stream;
[722]83                stream << CurrentContext::format_context ( __LINE__ ) << "expected " << R << " +/- " << tolerance << " but was " << actual;
[484]84
[722]85                UnitTest::TestDetails details ( *UnitTest::CurrentTest::Details(), 0, false );
[484]86
87                UnitTest::CurrentTest::Results()->OnTestFailure ( details, stream.GetText() );
[722]88        }
[484]89}
90
91}
Note: See TracBrowser for help on using the browser.