root/library/tests/epdf_harness.cpp @ 481

Revision 481, 7.7 kB (checked in by vbarta, 15 years ago)

doubled tolerance computed from variance, repeating failing tests (at most) 3 times; epdf tests pass

Line 
1#include "epdf_harness.h"
2#include "base/bdmbase.h"
3#include "base/user_info.h"
4#include "stat/exp_family.h"
5#include "mat_checks.h"
6#include "test_util.h"
7#include "UnitTest++.h"
8#include <memory>
9
10namespace bdm {
11
12template<>
13const ParticularUI<epdf_harness> &ParticularUI<epdf_harness>::factory (
14    ParticularUI<epdf_harness> ( "epdf_harness" ) );
15
16void epdf_harness::test_config ( const char *config_file_name ) {
17        RV::clear_all();
18
19        UIFile in ( config_file_name );
20        Array<epdf_harness *> input;
21        UI::get ( input, in, "data", UI::compulsory );
22        int sz = input.size();
23        CHECK ( sz > 0 );
24        for ( int i = 0; i < sz; ++i ) {
25                input ( i )->test ( config_file_name, i );
26        }
27}
28
29void epdf_harness::from_setting ( const Setting &set ) {
30        hepdf = UI::build<epdf> ( set, "epdf", UI::compulsory );
31        UI::get ( mean, set, "mean", UI::compulsory );
32        UI::get ( variance, set, "variance", UI::compulsory );
33
34        UI::get (support, set, "support", UI::optional );
35        UI::get (nbins, set, "nbins", UI::optional );
36        UI::get (nsamples, set, "nsamples", UI::optional );
37        UI::get (R, set, "R", UI::optional );
38
39        mrv = UI::build<RV> (set, "marginal_rv", UI::optional );
40
41        UI::get ( tolerance, set, "tolerance", UI::optional );
42}
43
44void epdf_harness::test ( const char *config_name, int idx ) {
45        CurrentContext cc ( config_name, idx );
46
47        CHECK_CLOSE_EX ( mean, hepdf->mean(), tolerance );
48        CHECK_CLOSE_EX ( variance, hepdf->variance(), tolerance );
49
50        if ( support.rows() == 2 ) {
51                int old_size = nbins.size();
52                if ( old_size < 2 ) {
53                        vec new_nbins ( "100 100" );
54                        for ( int i = 0; i < old_size; ++i ) {
55                                new_nbins ( i ) = nbins ( i );
56                        }
57
58                        nbins = new_nbins;
59                }
60
61                check_support_mean();
62                check_support_integral();
63        }
64
65        if ( R.rows() > 0 ) {
66                check_sample_mean();
67                check_covariance();
68        }
69
70        if ( mrv.get() ) {
71                RV crv = hepdf->_rv().subt ( *mrv );
72                shared_ptr<epdf> m = hepdf->marginal ( *mrv );
73                shared_ptr<mpdf> c = hepdf->condition ( crv );
74                mepdf mm ( m );
75
76                Array<mpdf *> aa ( 2 );
77                aa ( 0 ) = c.get();
78                aa ( 1 ) = &mm;
79                mprod mEp ( aa );
80
81                check_cond_mean(mEp);
82                if ( R.rows() > 0 ) {
83                        check_cond_covariance( mEp );
84                }
85
86                // test of pdflog at zero
87                vec zero ( 0 );
88                vec zeron ( hepdf->dimension() );
89                for ( int i = 0; i < zeron.size(); ++i ) {
90                        zeron ( i ) = 0;
91                }
92
93                CHECK_CLOSE_EX ( hepdf->evallog ( zeron ), mEp.evallogcond ( zeron, zero ), tolerance );
94        }
95}
96
97void epdf_harness::check_support_mean() {
98        vec xb = support.get_row ( 0 );
99        vec yb = support.get_row ( 1 );
100
101        int tc = 0;
102        Array<vec> actual(CurrentContext::max_trial_count);
103        do {
104                vec emu = num_mean2 ( hepdf.get(), xb, yb, nbins ( 0 ), nbins ( 1 ) );
105                actual( tc ) = emu;
106                ++tc;
107        } while ( ( tc < CurrentContext::max_trial_count ) &&
108                  !UnitTest::AreClose ( mean, actual( tc - 1 ), tolerance ) );
109        if ( ( tc == CurrentContext::max_trial_count ) &&
110             ( !UnitTest::AreClose ( mean, actual( CurrentContext::max_trial_count - 1 ), tolerance ) ) ) {
111                UnitTest::MemoryOutStream stream;
112                stream << CurrentContext::format_context(__LINE__) << "expected " << mean << " +/- " << tolerance << " but was " << actual;
113
114                UnitTest::TestDetails details(*UnitTest::CurrentTest::Details(), 0, false);
115
116                UnitTest::CurrentTest::Results()->OnTestFailure ( details, stream.GetText() );
117       }
118}
119
120void epdf_harness::check_support_integral() {
121        vec xb = support.get_row ( 0 );
122        vec yb = support.get_row ( 1 );
123
124        int tc = 0;
125        Array<double> actual(CurrentContext::max_trial_count);
126        do {
127                double nc = normcoef ( hepdf.get(), xb, yb, nbins ( 0 ), nbins ( 1 ) );
128                actual( tc ) = nc;
129                ++tc;
130        } while ( ( tc < CurrentContext::max_trial_count ) &&
131                  !UnitTest::AreClose ( 1.0, actual( tc - 1 ), tolerance ) );
132        if ( ( tc == CurrentContext::max_trial_count ) &&
133             ( !UnitTest::AreClose ( 1.0, actual( CurrentContext::max_trial_count - 1 ), tolerance ) ) ) {
134                UnitTest::MemoryOutStream stream;
135                stream << CurrentContext::format_context(__LINE__) << "expected " << mean << " +/- " << tolerance << " but was " << actual;
136
137                UnitTest::TestDetails details(*UnitTest::CurrentTest::Details(), 0, false);
138
139                UnitTest::CurrentTest::Results()->OnTestFailure ( details, stream.GetText() );
140       }
141}
142
143void epdf_harness::check_sample_mean() {
144        // simplify overloading for Visual Studio
145        vec delta = 2 * ( sqrt ( variance ) / sqrt ( static_cast<double> ( nsamples ) ) );
146
147        int tc = 0;
148        Array<vec> actual(CurrentContext::max_trial_count);
149        do {
150                mat smp = hepdf->sample_m ( nsamples );
151                vec emu = smp * ones ( nsamples ) / nsamples;
152                actual( tc ) = emu;
153                ++tc;
154        } while ( ( tc < CurrentContext::max_trial_count ) &&
155                  !UnitTest::AreClose ( mean, actual( tc - 1 ), delta ) );
156        if ( ( tc == CurrentContext::max_trial_count ) &&
157             ( !UnitTest::AreClose ( mean, actual( CurrentContext::max_trial_count - 1 ), delta ) ) ) {
158                UnitTest::MemoryOutStream stream;
159                stream << CurrentContext::format_context(__LINE__) << "expected " << mean << " +/- " << delta << " but was " << actual;
160
161                UnitTest::TestDetails details(*UnitTest::CurrentTest::Details(), 0, false);
162
163                UnitTest::CurrentTest::Results()->OnTestFailure ( details, stream.GetText() );
164       }
165}
166
167
168void epdf_harness::check_covariance() {
169        int tc = 0;
170        Array<mat> actual(CurrentContext::max_trial_count);
171        do {
172                mat smp = hepdf->sample_m ( nsamples );
173                vec emu = smp * ones ( nsamples ) / nsamples;
174                mat er = ( smp * smp.T() ) / nsamples - outer_product ( emu, emu );
175                actual( tc ) = er;
176                ++tc;
177        } while ( ( tc < CurrentContext::max_trial_count ) &&
178                  !UnitTest::AreClose ( R, actual( tc - 1 ), tolerance ) );
179        if ( ( tc == CurrentContext::max_trial_count ) &&
180             ( !UnitTest::AreClose ( R, actual( CurrentContext::max_trial_count - 1 ), tolerance ) ) ) {
181                UnitTest::MemoryOutStream stream;
182                stream << CurrentContext::format_context(__LINE__) << "expected " << R << " +/- " << tolerance << " but was " << actual;
183
184                UnitTest::TestDetails details(*UnitTest::CurrentTest::Details(), 0, false);
185
186                UnitTest::CurrentTest::Results()->OnTestFailure ( details, stream.GetText() );
187       }
188}
189
190void epdf_harness::check_cond_mean( mprod &mep ) {
191        // simplify overloading for Visual Studio
192        vec delta = 2 * ( sqrt ( variance ) / sqrt ( static_cast<double> ( nsamples ) ) );
193
194        int tc = 0;
195        Array<vec> actual(CurrentContext::max_trial_count);
196        do {
197                mat smp = mep.samplecond ( vec ( 0 ), nsamples );
198                vec emu = sum ( smp, 2 ) / nsamples;
199                actual( tc ) = emu;
200                ++tc;
201        } while ( ( tc < CurrentContext::max_trial_count ) &&
202                  !UnitTest::AreClose ( mean, actual( tc - 1 ), delta ) );
203        if ( ( tc == CurrentContext::max_trial_count ) &&
204             ( !UnitTest::AreClose ( mean, actual( CurrentContext::max_trial_count - 1 ), delta ) ) ) {
205                UnitTest::MemoryOutStream stream;
206                stream << CurrentContext::format_context(__LINE__) << "expected " << mean << " +/- " << delta << " but was " << actual;
207
208                UnitTest::TestDetails details(*UnitTest::CurrentTest::Details(), 0, false);
209
210                UnitTest::CurrentTest::Results()->OnTestFailure ( details, stream.GetText() );
211       }
212}
213
214void epdf_harness::check_cond_covariance( mprod &mep ) {
215        int tc = 0;
216        Array<mat> actual(CurrentContext::max_trial_count);
217        do {
218                mat smp = mep.samplecond ( vec ( 0 ), nsamples );
219                vec emu = sum ( smp, 2 ) / nsamples;
220                mat er = ( smp * smp.T() ) / nsamples - outer_product ( emu, emu );
221                actual( tc ) = er;
222                ++tc;
223        } while ( ( tc < CurrentContext::max_trial_count ) &&
224                  !UnitTest::AreClose ( R, actual( tc - 1 ), tolerance ) );
225        if ( ( tc == CurrentContext::max_trial_count ) &&
226             ( !UnitTest::AreClose ( R, actual( CurrentContext::max_trial_count - 1 ), tolerance ) ) ) {
227                UnitTest::MemoryOutStream stream;
228                stream << CurrentContext::format_context(__LINE__) << "expected " << mean << " +/- " << tolerance << " but was " << actual;
229
230                UnitTest::TestDetails details(*UnitTest::CurrentTest::Details(), 0, false);
231
232                UnitTest::CurrentTest::Results()->OnTestFailure ( details, stream.GetText() );
233       }
234}
235
236}
Note: See TracBrowser for help on using the browser.