#include "epdf_harness.h" #include "base/bdmbase.h" #include "base/user_info.h" #include "stat/exp_family.h" #include "stat/emix.h" #include "mat_checks.h" #include "test_util.h" #include "UnitTest++.h" #include namespace bdm { template<> const ParticularUI &ParticularUI::factory( ParticularUI("epdf_harness")); void epdf_harness::test_config(const char *config_file_name) { RV::clear_all(); UIFile in(config_file_name); Array input; UI::get(input, in, "data"); int sz = input.size(); CHECK(sz > 0); for (int i = 0; i < sz; ++i) { input(i)->test(config_file_name, i); } } void epdf_harness::from_setting(const Setting &set) { hepdf = UI::build(set, "epdf", UI::compulsory); UI::get(mean, set, "mean", UI::compulsory); UI::get(variance, set, "variance", UI::compulsory); UI::get(support, set, "support"); UI::get(nbins, set, "nbins"); UI::get(nsamples, set, "nsamples"); UI::get(R, set, "R"); RV* rv = UI::build(set, "marginal_rv"); if (rv) mrv = shared_ptr(rv); UI::get(tolerance, set, "tolerance"); } void epdf_harness::test(const char *config_name, int idx) { CurrentContext cc(config_name, idx); CHECK_CLOSE_EX(mean, hepdf->mean(), tolerance); CHECK_CLOSE_EX(variance, hepdf->variance(), tolerance); if (support.rows() == 2) { vec xb = support.get_row(0); vec yb = support.get_row(1); int old_size = nbins.size(); if (old_size < 2) { vec new_nbins("100 100"); for (int i = 0; i < old_size; ++i) { new_nbins(i) = nbins(i); } nbins = new_nbins; } CHECK_CLOSE_EX(mean, num_mean2(hepdf.get(), xb, yb, nbins(0), nbins(1)), tolerance); CHECK_CLOSE_EX(1.0, normcoef(hepdf.get(), xb, yb, nbins(0), nbins(1)), tolerance); } if (R.rows() > 0) { mat smp = hepdf->sample_m(nsamples); vec emu = smp * ones(nsamples) / nsamples; mat er = (smp * smp.T()) / nsamples - outer_product(emu, emu); // simplify overloading for Visual Studio vec delta = sqrt(variance) / sqrt(static_cast(nsamples)); CHECK_CLOSE_EX(mean, emu, delta); CHECK_CLOSE_EX(R, er, tolerance); } if (mrv.get()) { RV crv = hepdf->_rv().subt(*mrv); shared_ptr m = hepdf->marginal(*mrv); shared_ptr c = hepdf->condition(crv); mepdf mm(m); Array aa(2); aa(0) = c.get(); aa(1) = &mm; mprod mEp(aa); mat smp = mEp.samplecond(vec(0), nsamples); vec emu = sum(smp, 2) / nsamples; // simplify overloading for Visual Studio vec delta = sqrt(variance) / sqrt(static_cast(nsamples)); CHECK_CLOSE_EX(mean, emu, delta); if (R.rows() > 0) { mat er = (smp * smp.T()) / nsamples - outer_product(emu, emu); CHECK_CLOSE_EX(R, er, tolerance); } // test of pdflog at zero vec zero(0); vec zeron(hepdf->dimension()); for (int i = 0; i < zeron.size(); ++i) { zeron(i) = 0; } CHECK_CLOSE_EX(hepdf->evallog(zeron), mEp.evallogcond(zeron, zero), tolerance); } } }