// file: $isip/class/stat/GaussianModel/gaus_02.cc // version: $Id: gaus_02.cc 6258 2001-01-30 16:32:07Z hamaker $ // // isip include files // #include "GaussianModel.h" #include // method: diagnose // // arguments: // Integral::DEBUG level: (input) debug level for diagnostics // // return: a bool8 value indicating status // // this is the diagnose method // bool8 GaussianModel::diagnose(Integral::DEBUG level_a) { //--------------------------------------------------------------------------- // // 0. preliminaries // //--------------------------------------------------------------------------- // output the class name // if (level_a > Integral::NONE) { SysString output(L"diagnosing class "); output.concat(CLASS_NAME); output.concat(L": "); Console::put(output); Console::increaseIndention(); } //-------------------------------------------------------------------------- // // 1. required public methods // //-------------------------------------------------------------------------- // set indentation // if (level_a > Integral::NONE) { Console::put(L"testing required public methods...\n"); Console::increaseIndention(); } // create data to test with // MatrixFloat cov_test_0(3, 3, L"4, 5, 6", Integral::DIAGONAL); VectorFloat mean_test_0(L"7, 8, 9"); // do a quick test of constructors, destructors and memory management // methods // GaussianModel::setGrowSize(5); GaussianModel* gaus0 = new GaussianModel(NONE); GaussianModel* gaus1 = new GaussianModel(*gaus0); GaussianModel* gaus2 = new GaussianModel[10]; // clear the pointers // delete gaus0; delete gaus1; delete [] gaus2; // set the internal data of gaus0 // gaus0 = new GaussianModel(NONE); gaus0->setCovariance(cov_test_0); gaus0->setMean(mean_test_0); // test the assign and eq methods // gaus1 = new GaussianModel; gaus1->assign(*gaus0); if (!gaus1->eq(*gaus0)) { gaus0->debug(L"expected Gaussian"); gaus1->debug(L"actual Gaussian"); return Error::handle(name(), L"assign/eq", Error::TEST, __FILE__, __LINE__); } delete gaus1; // test copy constructor // gaus1 = new GaussianModel(*gaus0); gaus1->setMode(PRECOMPUTE); if (!gaus1->eq(*gaus0)) { gaus0->debug(L"expected Gaussian"); gaus1->debug(L"actual Gaussian"); return Error::handle(name(), L"copy constructor", Error::TEST, __FILE__, __LINE__); } // test the clear method // gaus0->clear(); if (gaus1->eq(*gaus0)) { gaus0->debug(L"gaus0 not clear"); return Error::handle(name(), L"clear", Error::TEST, __FILE__, __LINE__); } // test the operator= method // *gaus0 = *gaus1; if (!gaus1->eq(*gaus0)) { gaus1->debug(L"expected Gaussian"); gaus0->debug(L"actual Gaussian"); return Error::handle(name(), L"operator=", Error::TEST, __FILE__, __LINE__); } // clear the pointers // delete gaus0; delete gaus1; // test the i/o methods // GaussianModel gaus3; GaussianModel gaus4; GaussianModel gaus5; GaussianModel gaus6; gaus3.setMode(NONE); gaus6.setMode(NONE); gaus3.setMean(mean_test_0); gaus3.setCovariance(cov_test_0); gaus4.setMean(mean_test_0); gaus4.setCovariance(cov_test_0); // we need binary and text sof files // String tmp_filename0; Integral::makeTemp(tmp_filename0); String tmp_filename1; Integral::makeTemp(tmp_filename1); // open files in write mode // Sof tmp_file0; tmp_file0.open(tmp_filename0, File::WRITE_ONLY, File::TEXT); Sof tmp_file1; tmp_file1.open(tmp_filename1, File::WRITE_ONLY, File::BINARY); gaus3.write(tmp_file0, (int32)0); gaus4.write(tmp_file0, (int32)1); gaus3.write(tmp_file1, (int32)0); gaus4.write(tmp_file1, (int32)1); // close the files // tmp_file0.close(); tmp_file1.close(); // open the files in read mode // tmp_file0.open(tmp_filename0); tmp_file1.open(tmp_filename1); // read the model written in PRE_COMPUTE mode back in // gaus5.read(tmp_file0, (int32)0); gaus6.read(tmp_file0, (int32)0); if (!gaus5.eq(gaus3) || !gaus6.eq(gaus3)) { gaus3.debug(L"expected Gaussian"); gaus5.debug(L"gaus5 actual"); gaus6.debug(L"gaus6 actual"); return Error::handle(name(), L"read", Error::TEST, __FILE__, __LINE__); } // read the model written in NONE mode back in // gaus5.clear(); gaus6.clear(); gaus5.read(tmp_file0, (int32)1); gaus6.read(tmp_file0, (int32)1); if (!gaus5.eq(gaus4) || !gaus6.eq(gaus4)) { gaus4.debug(L"expected Gaussian"); gaus5.debug(L"gaus5 actual"); gaus6.debug(L"gaus6 actual"); return Error::handle(name(), L"read", Error::TEST, __FILE__, __LINE__); } // now read the binary files for NONE mode // gaus5.clear(); gaus6.clear(); gaus5.read(tmp_file1, (int32)0); gaus6.read(tmp_file1, (int32)0); if (!gaus5.eq(gaus3) || !gaus6.eq(gaus3)) { gaus3.debug(L"expected Gaussian"); gaus5.debug(L"gaus5 actual"); gaus6.debug(L"gaus6 actual"); return Error::handle(name(), L"read", Error::TEST, __FILE__, __LINE__); } // and read the PRE_COMPUTE model from the binary file // gaus5.clear(); gaus6.clear(); gaus5.read(tmp_file1, (int32)1); gaus6.read(tmp_file1, (int32)1); if (!gaus5.eq(gaus4) || !gaus6.eq(gaus4)) { gaus4.debug(L"expected Gaussian"); gaus5.debug(L"gaus5 actual"); gaus6.debug(L"gaus6 actual"); return Error::handle(name(), L"read", Error::TEST, __FILE__, __LINE__); } // close and delete the temporary files // tmp_file0.close(); tmp_file1.close(); // reset indentation // if (level_a > Integral::NONE) { Console::decreaseIndention(); } //--------------------------------------------------------------------------- // // 2. class-specific public methods: // extensions to required methods // //--------------------------------------------------------------------------- // set indentation // if (level_a > Integral::NONE) { Console::put(L"testing class-specific public methods: extensions to required methods...\n"); Console::increaseIndention(); } // test the virtual eq and assign methods // GaussianModel gaus7; gaus7.assign((StatisticalModelBase&)gaus3); if (!gaus7.eq((StatisticalModelBase&)gaus3)) { gaus3.debug(L"expected Gaussian"); gaus7.debug(L"actual Gaussian"); return Error::handle(name(), L"assign/eq", Error::TEST, __FILE__, __LINE__); } // test the setMode method // gaus7.setMode(NONE); gaus3.setMode(PRECOMPUTE); if ((gaus7.getMode() != NONE) || (gaus3.getMode() != PRECOMPUTE)) { return Error::handle(name(), L"setMode", Error::TEST, __FILE__, __LINE__); } // test setMean and getMean methods // VectorFloat tmp_vec; gaus7.setMean(mean_test_0); gaus7.getMean(tmp_vec); if (!tmp_vec.eq(mean_test_0)) { mean_test_0.debug(L"expected mean"); tmp_vec.debug(L"actual mean"); return Error::handle(name(), L"setMean/getMean", Error::TEST, __FILE__, __LINE__); } float32 mean_test_1 = 1.2; gaus7.setMean(mean_test_1); gaus7.getMean(tmp_vec); if ((tmp_vec.length() != 1) || (tmp_vec(0) != mean_test_1)) { ((Float)mean_test_1).debug(L"expected mean"); tmp_vec.debug(L"actual mean"); return Error::handle(name(), L"setMean/getMean", Error::TEST, __FILE__, __LINE__); } // test setCovariance and getCovariance methods // MatrixFloat tmp_mat; gaus7.setCovariance(cov_test_0); gaus7.getCovariance(tmp_mat); if (!tmp_mat.eq(cov_test_0)) { cov_test_0.debug(L"expected covariance"); tmp_mat.debug(L"actual covariance"); return Error::handle(name(), L"setCovariance/getCovariance", Error::TEST, __FILE__, __LINE__); } float32 cov_test_1 = 3.4; gaus7.setCovariance(cov_test_1); gaus7.getCovariance(tmp_mat); if ((!tmp_mat.isSquare()) || (tmp_mat.getNumRows() != 1) || (tmp_mat(0, 0) != cov_test_1)) { ((Float)cov_test_1).debug(L"expected covariance"); tmp_mat.debug(L"actual covariance"); return Error::handle(name(), L"setCovariance/getCovariance", Error::TEST, __FILE__, __LINE__); } // test additional constructors // GaussianModel gaus8(mean_test_0, cov_test_0, NONE); gaus7.setMean(mean_test_0); gaus7.setCovariance(cov_test_0); gaus7.setMode(NONE); if (!gaus8.eq(gaus7)) { gaus7.debug(L"expected Gaussian"); gaus8.debug(L"actual Gaussian"); return Error::handle(name(), L"constructor", Error::TEST, __FILE__, __LINE__); } GaussianModel gaus9(mean_test_1, cov_test_1, PRECOMPUTE); gaus7.setMean(mean_test_1); gaus7.setCovariance(cov_test_1); gaus7.setMode(PRECOMPUTE); if (!gaus9.eq(gaus7)) { gaus7.debug(L"expected Gaussian"); gaus9.debug(L"actual Gaussian"); return Error::handle(name(), L"constructor", Error::TEST, __FILE__, __LINE__); } // reset indentation // if (level_a > Integral::NONE) { Console::decreaseIndention(); } //--------------------------------------------------------------------------- // // 3. class-specific public methods: // computation methods // //--------------------------------------------------------------------------- // set indentation // if (level_a > Integral::NONE) { Console::put(L"testing class-specific public methods: computation methods...\n"); Console::increaseIndention(); } // create test data - 5 total test cases, all with diagonal covariances // int32 num_cases = 5; VectorFloat means[num_cases]; MatrixFloat covars[num_cases]; VectorFloat inputs[num_cases]; Float results[num_cases]; // case 0 // means[0].assign(L"-3.639462, 1.653617, 1.787559, 4.262538, 1.369591, 2.418731, 0.2277095, 1.344989, 0.7442688, 0.8819447, 0.5029327, 0.6623194, -7.385917, -0.01989461, 0.03300723, 3.038317e-04, 7.731465e-02, 2.036626e-02, 1.392890e-02, 1.471747e-02, 2.386167e-02, -1.337681e-02, 1.569910e-02, -7.796203e-05, 9.159852e-03, -3.887357e-02, 1.891592e-02, 3.389170e-03, 6.476890e-03, -9.673509e-03, -3.964308e-03, -1.162331e-02, -5.141579e-03, -8.838848e-03, -3.854857e-03, -2.433208e-05, -3.092395e-03, -5.406926e-04, 1.159509e-02 "); covars[0].assign(39, 39, L"1.433564e+01, 1.975537e+01, 1.671448e+01, 2.977089e+01, 2.330977e+01, 2.712510e+01, 2.764725e+01, 3.032939e+01, 3.006948e+01, 2.652304e+01, 2.420893e+01, 2.028848e+01, 5.845720e+00, 2.440532e-01, 4.785362e-01, 7.022072e-01, 1.055732e+00, 1.272656e+00, 1.545274e+00, 1.733616e+00, 1.836289e+00, 1.909358e+00, 1.861139e+00, 1.752789e+00, 1.551828e+00, 2.726359e-02, 4.366880e-02, 8.581409e-02, 1.317306e-01, 1.942055e-01, 2.418336e-01, 2.950188e-01, 3.333847e-01, 3.536546e-01, 3.684548e-01, 3.604752e-01, 3.396829e-01, 3.016612e-01, 4.171541e-03", Integral::DIAGONAL); inputs[0].assign(L"-1.05023813258004e+00,-7.77674896710878e+00,1.43041098327926e+01,-6.21318461516028e+00,-8.64903872637757e+00,1.02604097385083e+01,-5.57177352692909e+00,5.09477660171566e+00,-4.09609275292737e+00,5.96100219381628e+00,3.76151348252777e-01,-2.97277346115335e+00,-2.30355781300591e+00,7.66914363607964e-01,1.27304216160438e-01,-3.20960700374856e-01,-1.93367994699623e+00,-4.25686341458929e-01,4.12861672859121e-01,-3.16990107434180e-01,1.81895735084098e+00,1.97179456310064e+00,-5.23509954876174e-01,-2.63924777075424e-01,3.76853360820597e-03,6.07853048112972e-04,9.75499698349679e-02,5.80349863491104e-01,-4.96041065023962e-01,-5.45823432246360e-02,-1.61513044481162e-01,2.12215102626400e-01,2.76088189007932e-01,4.25378696913581e-01,-3.04615852820205e-02,-2.56536949288540e-02,2.44496596888947e-01,6.41653297530483e-01,-6.79771984752767e-02"); results[0] = -69.848372; // case 1 // means[1].assign(L"-2.691117e+00, 2.486314e+00, 2.106091e+00, 4.808796e+00, 1.319594e+00, 1.820309e+00, 1.228640e-01, 1.200214e+00, 1.328607e-01, 1.145550e+00, 3.327812e-01, 5.402461e-01, -7.318828e+00, -1.876147e-01, -7.021168e-02, -6.872714e-03, 8.391821e-02, 1.635767e-01, 1.493566e-01, 1.792514e-01, 1.865297e-01, 1.033214e-01, 1.283733e-01, 1.572478e-01, 9.515204e-02, -8.605082e-02, 1.330878e-01, -8.599965e-02, -1.122718e-01, -2.187542e-01, -8.833785e-02, -1.184677e-01, -4.615977e-02, -6.605259e-02, -7.958784e-03, -3.628511e-02, 5.043694e-03, 6.125029e-04, 1.307189e-01"); covars[1].assign(39, 39, L"1.787397e+01, 2.613428e+01, 2.235704e+01, 3.698225e+01, 3.203534e+01, 3.525744e+01, 3.642101e+01, 3.813624e+01, 3.485294e+01, 3.214138e+01, 2.869510e+01, 2.382348e+01, 5.052766e+00, 1.712674e+00, 2.200779e+00, 2.040588e+00, 3.332299e+00, 2.873066e+00, 3.244609e+00, 3.307346e+00, 3.412285e+00, 3.310806e+00, 3.037658e+00, 2.739392e+00, 2.272812e+00, 4.907802e-01, 2.948230e-01, 4.200088e-01, 4.025598e-01, 6.358166e-01, 5.643935e-01, 6.310834e-01, 6.545513e-01, 6.722391e-01, 6.502435e-01, 6.078408e-01, 5.481889e-01, 4.573894e-01, 7.527630e-02", Integral::DIAGONAL); inputs[1].assign(L"3.36028859845774e+00, -1.51460099370180e+00, 6.71235509658093e+00, -1.39557501190679e+01, -1.21066578739031e+01, 1.12339732237324e+01, -5.92880462151951e+00, 1.52411899073766e+01, 3.05288943565708e+00, 3.19454967536684e+00, -1.01136507990653e+00, 1.37235799080451e+00, -2.94929066617434e+00, 5.60981849383469e-01, 2.45214486746122e+00, -2.40163767980861e+00, -9.84083122317061e-01, -2.55754245246373e-01, 8.05055113425209e-01, 3.31346026570112e+00, 9.79238738426960e-01, 1.37430809082601e+00, -5.62704100621083e-01, 2.17490727795314e+00, 2.08153109450878e+00, -5.19180632602848e-01, -9.40953379591834e-01, -5.89744090051782e-02, -3.60353725923743e-03, 1.25864431530475e+00, 7.54496700587490e-01, -9.95468864165535e-01, 8.06544322386596e-01, -1.90603900210769e+00, 4.15940207836262e-02, -4.48172494025387e-01, 2.45759345090707e-01, -1.29729385558981e+00, -2.08448712610978e-01"); results[1] = -91.1799354; // case 2 // means[2].assign(L"-3.63946199, 1.65361702, 1.787559, 4.262538, 1.369591, 2.418731, 0.2277095, 1.344989, 0.7442688, 0.8819447, 0.5029327, 0.6623194, -7.385917, -0.01989461, 0.03300723, 3.038317e-04, 7.731465e-02, 2.036626e-02, 1.392890e-02, 1.471747e-02, 2.386167e-02, -1.337681e-02, 1.569910e-02, -7.796203e-05, 9.159852e-03, -3.887357e-02, 1.891592e-02, 3.389170e-03, 6.476890e-03, -9.673509e-03, -3.964308e-03, -1.162331e-02, -5.141579e-03, -8.838848e-03, -3.854857e-03, -2.433208e-05, -3.092395e-03, -5.406926e-04, 1.159509e-02 "); covars[2].assign(39, 39, L"1.433564e+01, 1.975537e+01, 1.671448e+01, 2.977089e+01, 2.330977e+01, 2.712510e+01, 2.764725e+01, 3.032939e+01, 3.006948e+01, 2.652304e+01, 2.420893e+01, 2.028848e+01, 5.845720e+00, 2.440532e-01, 4.785362e-01, 7.022072e-01, 1.055732e+00, 1.272656e+00, 1.545274e+00, 1.733616e+00, 1.836289e+00, 1.909358e+00, 1.861139e+00, 1.752789e+00, 1.551828e+00, 2.726359e-02, 4.366880e-02, 8.581409e-02, 1.317306e-01, 1.942055e-01, 2.418336e-01, 2.950188e-01, 3.333847e-01, 3.536546e-01, 3.684548e-01, 3.604752e-01, 3.396829e-01, 3.016612e-01, 4.171541e-03", Integral::DIAGONAL); inputs[2].assign(L"-1.05023813258004e+00,-7.77674896710878e+00,1.43041098327926e+01,-6.21318461516028e+00,-8.64903872637757e+00,1.02604097385083e+01,-5.57177352692909e+00,5.09477660171566e+00,-4.09609275292737e+00,5.96100219381628e+00,3.76151348252777e-01,-2.97277346115335e+00,-2.30355781300591e+00,7.66914363607964e-01,1.27304216160438e-01,-3.20960700374856e-01,-1.93367994699623e+00,-4.25686341458929e-01,4.12861672859121e-01,-3.16990107434180e-01,1.81895735084098e+00,1.97179456310064e+00,-5.23509954876174e-01,-2.63924777075424e-01,3.76853360820597e-03,6.07853048112972e-04,9.75499698349679e-02,5.80349863491104e-01,-4.96041065023962e-01,-5.45823432246360e-02,-1.61513044481162e-01,2.12215102626400e-01,2.76088189007932e-01,4.25378696913581e-01,-3.04615852820205e-02,-2.56536949288540e-02,2.44496596888947e-01,6.41653297530483e-01,-6.79771984752767e-02"); results[2] = -69.848372; // case 3 // means[3].assign(L"-2.691117e+00, 2.486314e+00, 2.106091e+00, 4.808796e+00, 1.319594e+00, 1.820309e+00, 1.228640e-01, 1.200214e+00, 1.328607e-01, 1.145550e+00, 3.327812e-01, 5.402461e-01, -7.318828e+00, -1.876147e-01, -7.021168e-02, -6.872714e-03, 8.391821e-02, 1.635767e-01, 1.493566e-01, 1.792514e-01, 1.865297e-01, 1.033214e-01, 1.283733e-01, 1.572478e-01, 9.515204e-02, -8.605082e-02, 1.330878e-01, -8.599965e-02, -1.122718e-01, -2.187542e-01, -8.833785e-02, -1.184677e-01, -4.615977e-02, -6.605259e-02, -7.958784e-03, -3.628511e-02, 5.043694e-03, 6.125029e-04, 1.307189e-01"); covars[3].assign(39, 39, L"1.787397e+01, 2.613428e+01, 2.235704e+01, 3.698225e+01, 3.203534e+01, 3.525744e+01, 3.642101e+01, 3.813624e+01, 3.485294e+01, 3.214138e+01, 2.869510e+01, 2.382348e+01, 5.052766e+00, 1.712674e+00, 2.200779e+00, 2.040588e+00, 3.332299e+00, 2.873066e+00, 3.244609e+00, 3.307346e+00, 3.412285e+00, 3.310806e+00, 3.037658e+00, 2.739392e+00, 2.272812e+00, 4.907802e-01, 2.948230e-01, 4.200088e-01, 4.025598e-01, 6.358166e-01, 5.643935e-01, 6.310834e-01, 6.545513e-01, 6.722391e-01, 6.502435e-01, 6.078408e-01, 5.481889e-01, 4.573894e-01, 7.527630e-02", Integral::DIAGONAL); inputs[3].assign(L"-8.28045559953361e-01, -8.83346413846983e+00, 1.33464558454834e+01, -1.17718322139709e+01, -1.04959671555787e+01, 1.05241223525937e+01, -9.05446731122130e+00, 8.58258771399733e+00, -1.95222987913758e+00, 6.61994035507018e+00, -9.76285443497309e-01, -4.51352740849146e+00, -2.18031891427024e+00, 1.25445289938020e+00, 1.36891746132967e+00, -1.63094859806430e+00, -2.23742069433911e+00, -8.12020578774520e-01, 3.87957902770110e-01, -5.57665834205636e-02, 2.76437078093859e+00, 2.30850057557772e+00, -8.47992389190669e-01, -3.41843834582069e-01, 9.47948254562582e-01, -1.35004589046413e-01, -1.67884447160271e-02, 6.93062399747247e-01, -5.98656533514261e-01, 1.77815230690660e-01, -2.74533911322902e-02, 1.85791427930868e-01, 8.51072992930346e-01, -2.52504553089359e-03, -1.51563387719790e-01, -4.44155489768401e-03, 6.13910662325519e-01, 6.89170174897638e-01, -1.31165674263104e-01"); results[3] = -83.460909; // case 4 // means[4].assign(L"-1.227896e+00, 1.382693e+00, 7.641181e-01, 1.655061e+00, 4.905663e-01, 5.924396e-01, -2.200167e-01, 5.966362e-01, 3.046082e-01, 8.787698e-01, 7.552667e-01, 8.944333e-01, -5.379114e+00, 6.141505e-01, -2.169166e-01, -2.905206e-01, -8.233116e-01, -3.749894e-01, -5.311031e-01, -3.311090e-01, -4.411730e-01, -1.872099e-01, -2.647290e-01, -1.175446e-01, -7.939609e-02, 5.024694e-01, 2.939468e-04, -1.450380e-02, -1.404446e-02, 2.083577e-02, -2.420717e-04, 3.029993e-04, 6.011514e-03, -2.044554e-02, -3.952960e-02, -6.416704e-02, -6.345640e-02, -6.609228e-02, 2.660808e-02"); covars[4].assign(39, 39, L"1.960422e+01, 3.124584e+01, 2.299311e+01, 4.782652e+01, 3.327580e+01, 3.527910e+01, 3.451599e+01, 3.491016e+01, 3.243290e+01, 3.034863e+01, 2.773845e+01, 2.369382e+01, 8.725245e+00, 1.768713e+00, 2.641445e+00, 2.082905e+00, 4.076096e+00, 2.856453e+00, 3.229918e+00, 3.212083e+00, 3.287135e+00, 3.063926e+00, 2.918980e+00, 2.668358e+00, 2.313027e+00, 6.493803e-01, 1.996588e-01, 2.830828e-01, 2.685838e-01, 4.930790e-01, 3.938673e-01, 4.297217e-01, 4.345308e-01, 4.379638e-01, 4.300928e-01, 4.185803e-01, 3.909470e-01, 3.484476e-01, 5.198425e-02", Integral::DIAGONAL); inputs[4].assign(L"2.67323739914644e+00, -6.61187030062607e+00, 1.31781333245729e+01, -1.31022605507361e+01, -9.85400621907164e+00, 1.21928617957612e+01, -5.41537717195389e+00, 1.24456577997797e+01, 4.69094862568095e+00, 3.01398333880846e+00, -2.67254141249299e-01, -2.18355381944327e+00, -2.36213799713318e+00, 1.01089494489668e+00, 2.40824691103134e+00, -2.14617207664995e+00, -2.05472128944797e+00, -1.04008444520694e+00, 1.48638907103563e+00, 9.32839075598674e-01, 3.47314412036008e+00, 1.65113363045200e+00, -4.89537212363196e-01, 9.97517736122635e-01, 2.73994516078343e+00, -2.71471918281008e-01, -3.39384780185101e-01, 5.59358844834503e-01, -7.39791843552268e-01, 5.95606975804037e-01, -4.36668019894019e-02, -2.99968540003160e-01, 8.55559596707420e-01, -9.91273583717537e-01, 9.83036343945484e-02, -4.53742011501863e-01, 2.55916561829488e-01, -2.44893478013526e-01, -1.66957630388432e-01"); results[4] = -83.453692; // loop over compute modes // for (int32 mode = (int32)NONE; mode <= (int32)PRECOMPUTE; mode++) { GaussianModel model0((MODE)mode); // loop over covariance matrix types // for (int32 mat_type = (int32)Integral::FULL; mat_type <= (int32)Integral::SPARSE; mat_type = (mat_type == (int32)Integral::SYMMETRIC) ? (int32)Integral::SPARSE : (mat_type + 1)) { // loop over test cases // for (int32 case_num = 0; case_num < num_cases; case_num++) { // create a covariance matrix of the appropriate type // MatrixFloat this_covar(covars[case_num]); this_covar.changeType((Integral::MTYPE)mat_type); // set the covariance and mean for this model // model0.setMean(means[case_num]); model0.setCovariance(this_covar); // verify the mean and covariance // MatrixFloat assigned_covar; model0.getCovariance(assigned_covar); if (!model0.mean_d.eq(means[case_num]) || !assigned_covar.almostEqual(covars[case_num]) || (model0.covariance_d.getType() != mat_type)) { model0.debug(L"incorrect model"); return Error::handle(name(), L"setMean/setCovariance", Error::TEST, __FILE__, __LINE__); } // evaluate the log likelihood of the model // Float score = model0.getLogLikelihood(inputs[case_num]); if (!score.almostEqual(results[case_num])) { results[case_num].debug(L"expected result"); score.debug(L"actual result"); model0.debug(L"model"); return Error::handle(name(), L"getLogLikelihood", Error::TEST, __FILE__, __LINE__); } // evaluate the likelihood of the model // score = model0.getLikelihood(inputs[case_num]); if (!score.almostEqual(Integral::exp(results[case_num]))) { Float exp_results = Integral::exp(results[case_num]); exp_results.debug(L"expected result"); score.debug(L"actual result"); model0.debug(L"model"); return Error::handle(name(), L"getLikelihood", Error::TEST, __FILE__, __LINE__); } } } } // reset indentation // if (level_a > Integral::NONE) { Console::decreaseIndention(); } //--------------------------------------------------------------------------- // // 4. print completion message // //--------------------------------------------------------------------------- // reset indentation // if (level_a > Integral::NONE) { Console::decreaseIndention(); } if (level_a > Integral::NONE) { SysString output(L"diagnostics passed for class "); output.concat(name()); output.concat(L"\n"); Console::put(output); } // exit gracefully // return true; }