openModeller  Version 1.4.0
test_rules_evaluate.cpp
Go to the documentation of this file.
00001 
00031 #include <TestHarness.h>
00032 #include <openmodeller/Occurrences.hh>
00033 #include <openmodeller/Sample.hh>
00034 
00035 #include <rules_range.hh>
00036 #include <rules_negrange.hh>
00037 #include <rules_logit.hh>
00038 #include <test_rules_defs.hh>
00039 #include <test_rules_evaluate_data.cpp>
00040 
00041 typedef ExtendedDummyRule<RangeRule> ExtRangeRule;
00042 typedef ExtendedDummyRule<NegatedRangeRule> ExtNegatedRangeRule;
00043 typedef ExtendedDummyRule<LogitRule> ExtLogitRule;
00044 
00045 
00046 #define eps 10e-6
00047 
00048 OccurrencesPtr getSampleSet(int hardcodedSamplesIndex, int *dim)
00049 {
00050   HardcodedSample * data = SamplesSet + hardcodedSamplesIndex;
00051   OccurrencesPtr occs ( new OccurrencesImpl("") );
00052 
00053   *dim = data->dimension;
00054 
00055   int valDim = data->dimension + 1;
00056  
00057   for (int i = 0; i < data->resamples; ++i)
00058     {
00059       Scalar pred = *(data->values + (valDim * i));
00060       Sample s(data->dimension, data->values + (valDim * i) + 1);
00061       OccurrencePtr oc( new OccurrenceImpl(0.0, 0.0, -1.0, pred) );
00062       oc->setUnnormalizedEnvironment(s);
00063       occs->insert(oc);
00064     }
00065 
00066   return occs;
00067 }
00068 
00069 
00070 
00071 // helper function
00072 bool checkEqualArray(Scalar * array1, Scalar * array2, int size, double veps)
00073 {
00074   int i;
00075   bool result = true;
00076 
00077   if (!array1 || !array2)
00078     return false;
00079 
00080   for (i = 0; i < size; i++)
00081     {
00082       //printf("Comparing (%2d): %+12.8f == %+12.8f => ", i, array1[i], array2[i]);
00083       if ((array1[i] != -1000) && (array2[i] != -1000))
00084   { result = result && (fabs(array1[i] - array2[i]) <= veps); }
00085      
00086       //printf("%d\n", result);
00087     }
00088 
00089   //printf("\n");
00090 
00091   return result;
00092 }
00093 
00094 template <class T>
00095 bool testEvaluate(int sampleIndex, Scalar * ruleGenes,
00096       Scalar rulePred, Scalar * rulePerfs)
00097 {
00098   int i, dim;
00099   double * perf;
00100   bool result;
00101 
00102   T * rule = new T();
00103   OccurrencesPtr occs = getSampleSet(sampleIndex, &dim);
00104   rule->setPrediction(rulePred);
00105   rule->setGenes(ruleGenes, dim);
00106   rule->evaluate(occs);
00107   perf = rule->getPerformanceArray();
00108 
00109   /*
00110   OccurrencesImpl::const_iterator it = occs->begin();
00111   OccurrencesImpl::const_iterator end = occs->end();
00112 
00113   int k = 0;
00114   while (it != end)
00115     {
00116       Scalar y = (*it)->abundance();
00117       Sample s = (*it)->environment();
00118       
00119       printf("occs[%2d]: (occ=%-7.3f) ", k, y);
00120       for (int i = 0; i < dim; ++i)
00121     printf("%-7.3f | ", s[i]); 
00122       printf("\n");
00123 
00124       ++it; ++k;
00125     }
00126     
00127   printf("Rule (pred=%7.3f): ", rule->getPrediction());
00128   for (int i = 0; i < dim; ++i)
00129     printf("%-7.3f %-7.3f | ", rule->getChrom1()[i], rule->getChrom2()[i]); 
00130   printf("\n");
00131   */
00132 
00133   result = checkEqualArray(perf, rulePerfs, 10, eps);
00134   delete rule;
00135   return result;
00136 }
00137 
00138 
00139 // SampleSet 1
00140 // ===========
00141 TEST( evaluate1_1, RangeRule )
00142 { CHECK(testEvaluate<ExtRangeRule>(1, RuleGenes1_1, RulePred1_1, RulePerfs1_1)); }
00143 
00144 TEST( evaluate1_2, RangeRule )
00145 { CHECK(testEvaluate<ExtRangeRule>(1, RuleGenes1_2, RulePred1_2, RulePerfs1_2)); }
00146 
00147 TEST( evaluate1_3, NegatedRangeRule )
00148 { CHECK(testEvaluate<ExtNegatedRangeRule>(1, RuleGenes1_3, RulePred1_3, RulePerfs1_3)); }
00149 
00150 TEST( evaluate1_4, NegatedRangeRule )
00151 { CHECK(testEvaluate<ExtNegatedRangeRule>(1, RuleGenes1_4, RulePred1_4, RulePerfs1_4)); }
00152 
00153 
00154 // SampleSet 2
00155 // ===========
00156 TEST( evaluate2_1, RangeRule )
00157 { CHECK(testEvaluate<ExtRangeRule>(2, RuleGenes2_1, RulePred2_1, RulePerfs2_1)); }
00158 
00159 TEST( evaluate2_2, RangeRule )
00160 { CHECK(testEvaluate<ExtRangeRule>(2, RuleGenes2_2, RulePred2_2, RulePerfs2_2)); }
00161  
00162 TEST( evaluate2_3, RangeRule )
00163 { CHECK(testEvaluate<ExtRangeRule>(2, RuleGenes2_3, RulePred2_3, RulePerfs2_3)); }
00164 
00165 TEST( evaluate2_4, RangeRule )
00166 { CHECK(testEvaluate<ExtRangeRule>(2, RuleGenes2_4, RulePred2_4, RulePerfs2_4)); }
00167 
00168 
00169 // SampleSet 3
00170 // ===========
00171 TEST( evaluate3_1, RangeRule )
00172 { CHECK(testEvaluate<ExtRangeRule>(3, RuleGenes3_1, RulePred3_1, RulePerfs3_1)); }
00173 
00174 TEST( evaluate3_2, RangeRule )
00175 { CHECK(testEvaluate<ExtRangeRule>(3, RuleGenes3_2, RulePred3_2, RulePerfs3_2)); }
00176 
00177 
00178 // SampleSet 4
00179 // ===========
00180 TEST( evaluate4_1, RangeRule )
00181 { CHECK(testEvaluate<ExtRangeRule>(4, RuleGenes4_1, RulePred4_1, RulePerfs4_1)); }
00182 
00183 TEST( evaluate4_2, RangeRule )
00184 { CHECK(testEvaluate<ExtRangeRule>(4, RuleGenes4_2, RulePred4_2, RulePerfs4_2)); }
00185 
00186 TEST( evaluate4_3, RangeRule )
00187 { CHECK(testEvaluate<ExtRangeRule>(4, RuleGenes4_3, RulePred4_3, RulePerfs4_3)); }
00188 
00189 TEST( evaluate4_4, NegatedRangeRule )
00190 { CHECK(testEvaluate<ExtNegatedRangeRule>(4, RuleGenes4_4, RulePred4_4, RulePerfs4_4)); }
00191 
00192 TEST( evaluate4_5, NegatedRangeRule )
00193 { CHECK(testEvaluate<ExtNegatedRangeRule>(4, RuleGenes4_5, RulePred4_5, RulePerfs4_5)); }
00194 
00195 TEST( evaluate4_6, NegatedRangeRule )
00196 { CHECK(testEvaluate<ExtNegatedRangeRule>(4, RuleGenes4_6, RulePred4_6, RulePerfs4_6)); }
00197 
00198 
00199 
00200 // Logit regression tests
00201 TEST( regression4_1, LogitRule )
00202 {
00203   int dim;
00204   Regression reg;
00205 
00206   OccurrencesPtr occs = getSampleSet(4, &dim);
00207   reg.calculateParameters(occs);
00208 
00209   DOUBLES_EQUAL(reg.getA()[0], +0.336735, eps);
00210   DOUBLES_EQUAL(reg.getB()[0], -0.459183, eps);
00211   DOUBLES_EQUAL(reg.getC()[0], -0.445368, eps);
00212 
00213   DOUBLES_EQUAL(reg.getA()[1], +0.378012, eps);
00214   DOUBLES_EQUAL(reg.getB()[1], -0.353916, eps);
00215   DOUBLES_EQUAL(reg.getC()[1], -0.596326, eps);
00216 }