openModeller  Version 1.5.0
test_ruleset.cpp
Go to the documentation of this file.
1 
31 #include <TestHarness.h>
32 #include <ruleset.hh>
33 #include <rules_base.hh>
34 
35 class DummyRule : public GarpRule
36 {
37 public:
38  DummyRule(int id = -1);
39  GarpRule * objFactory() const { return new DummyRule(); }
40  int getStrength(const Sample&) const {}
41  double getValue(const Sample&) const {}
42  bool applies(const Sample&) const {}
43 
44  int getId() { return _id; }
45  void setPerformance(PerfIndex index, double newPerf) { _performance[index] = newPerf; }
46 
47 private:
48  int _id;
49 };
50 
52 {
53  _id = id;
54 }
55 
56 // dummy implementation of GarpRule methods
58  _numGenes(0),
59  _prediction(0),
60  _needsEvaluation(true),
61  _chrom1(),
62  _chrom2()
63 {
64  _origin = type();
65  for (int i = 0; i < 10; i++)
66  _performance[i] = 0.0;
67 }
68 
69 double GarpRule::getPerformance(PerfIndex perfIndex) const
70 {
71  return _performance[perfIndex];
72 }
73 
75 GarpRule * GarpRule::clone() const { g_log("Cl"); };
76 int GarpRule::copy(const GarpRule * fromRule) { g_log("Cp"); };
77 int GarpRule::getCertainty(Scalar pred) const { g_log("Ct"); };
78 double GarpRule::getError(Scalar predefinedValue, Scalar pred) const { g_log("Er"); };
79 void GarpRule::adjustRange(Scalar& v1, Scalar& v2) const { g_log("Ad"); };
80 void GarpRule::crossover(GarpRule * rule, int xpt1, int xpt2) { g_log("Co"); };
81 void GarpRule::mutate(double temperature) { g_log("Mu"); };
82 bool GarpRule::similar(const GarpRule * objOtherRule) const { g_log("Si"); };
83 double GarpRule::evaluate(const OccurrencesPtr& occs) { g_log("Ev"); };
84 void GarpRule::log() {};
85 
86 void testHelperAddRules(GarpRuleSet * ruleset, int from, int to)
87 {
88  int i;
89  DummyRule * r;
90 
91  for (i = from; i <= to; i++)
92  {
93  r = new DummyRule(i);
94  ruleset->add(r);
95  }
96 }
97 
98 // check function testHelperAddRules
100 {
101  DummyRule * rule;
102  GarpRuleSet ruleset(100);
103  testHelperAddRules(&ruleset, 0, 99);
104 
105  // check number of rules and if there is a rule in there
106  LONGS_EQUAL(100, ruleset.numRules());
107  rule = (DummyRule *) ruleset.get(49);
108  LONGS_EQUAL(49, rule->getId());
109 }
110 
111 // tests default constructor
112 TEST( GarpRuleSet_Constructor , GarpRuleSet )
113 {
114  GarpRuleSet ruleset(10);
115  LONGS_EQUAL(10, ruleset.size());
116  LONGS_EQUAL(0, ruleset.numRules());
117 }
118 
119 // test addition and deletion of rules from ruleset
120 TEST( GarpRuleSet_add , Garp)
121 {
122  DummyRule * r0, * r1, * r2, * r3;
123 
124  r0 = new DummyRule(0);
125  r1 = new DummyRule(1);
126  r2 = new DummyRule(2);
127  r3 = new DummyRule(3);
128 
129  GarpRuleSet ruleset(3);
130 
131  // doesn't fail until r4 is added, then it runs out of space
132  LONGS_EQUAL(1, ruleset.add(r0));
133  LONGS_EQUAL(2, ruleset.add(r1));
134  LONGS_EQUAL(3, ruleset.add(r2));
135  LONGS_EQUAL(0, ruleset.add(r3));
136 
137  // test if rules inserted remain in the same order
138  // rules in ruleset is 0-based
139  LONGS_EQUAL(0, ((DummyRule *) (ruleset.get(0)))->getId());
140  LONGS_EQUAL(1, ((DummyRule *) (ruleset.get(1)))->getId());
141  LONGS_EQUAL(2, ((DummyRule *) (ruleset.get(2)))->getId());
142 }
143 
144 // test method trim
145 TEST( GarpRuleSet_trim , GarpRuleSet )
146 {
147  DummyRule * rule;
148  GarpRuleSet ruleset(100);
149 
150  testHelperAddRules(&ruleset, 0, 99);
151 
152  // keep first 50 rules (0-49) and delete the rest
153  ruleset.trim(50);
154 
155  // check if num of rules is correct
156  LONGS_EQUAL(50, ruleset.numRules());
157 
158  // now check if last rule is id 49
159  LONGS_EQUAL(49, ((DummyRule *) (ruleset.get(49)))->getId());
160 
161  // check if rule 50 has been deleted
162  rule = (DummyRule *) ruleset.get(50); CHECK(rule == NULL);
163  rule = (DummyRule *) ruleset.get(75); CHECK(rule == NULL);
164  rule = (DummyRule *) ruleset.get(99); CHECK(rule == NULL);
165 }
166 
167 // test method clear
168 TEST( GarpRuleSet_clear , GarpRuleSet )
169 {
170  DummyRule * rule;
171  GarpRuleSet ruleset(100);
172 
173  testHelperAddRules(&ruleset, 0, 99);
174 
175  // test method clear()
176  ruleset.clear();
177 
178  // check if num of rules is correct
179  LONGS_EQUAL(0, ruleset.numRules());
180 
181  // check if rules have been deleted
182  rule = (DummyRule *) ruleset.get(0); CHECK(rule == NULL);
183  rule = (DummyRule *) ruleset.get(49); CHECK(rule == NULL);
184  rule = (DummyRule *) ruleset.get(50); CHECK(rule == NULL);
185  rule = (DummyRule *) ruleset.get(75); CHECK(rule == NULL);
186  rule = (DummyRule *) ruleset.get(99); CHECK(rule == NULL);
187 }
188 
189 // test method filter
190 TEST( GarpRuleSet_filter , GarpRuleSet )
191 {
192  DummyRule * rule;
193  GarpRuleSet ruleset(100);
194 
195  testHelperAddRules(&ruleset, 0, 99);
196 
197  // change some performance values. other (uninitialized) values should be 0.0
198  rule = (DummyRule *) (ruleset.get(10)); rule->setPerformance(PerfSig, 100.0);
199  rule = (DummyRule *) (ruleset.get(20)); rule->setPerformance(PerfSig, 100.0);
200  rule = (DummyRule *) (ruleset.get(25)); rule->setPerformance(PerfSig, 100.0);
201  rule = (DummyRule *) (ruleset.get(37)); rule->setPerformance(PerfSig, 100.0);
202  rule = (DummyRule *) (ruleset.get(77)); rule->setPerformance(PerfSig, 100.0);
203 
204  // this one will be filtered out too
205  rule = (DummyRule *) (ruleset.get(30)); rule->setPerformance(PerfSig, 35.0);
206 
207  // filters out rules with significance lower than 50.0
208  ruleset.filter(PerfSig, 50.0);
209 
210  // check how many rules were left in ruleset
211  LONGS_EQUAL(5, ruleset.numRules());
212 
213  // check what rules remained
214  // note that order of rules is important
215  rule = (DummyRule *) (ruleset.get(0)); LONGS_EQUAL(10, rule->getId());
216  rule = (DummyRule *) (ruleset.get(1)); LONGS_EQUAL(20, rule->getId());
217  rule = (DummyRule *) (ruleset.get(2)); LONGS_EQUAL(25, rule->getId());
218  rule = (DummyRule *) (ruleset.get(3)); LONGS_EQUAL(37, rule->getId());
219  rule = (DummyRule *) (ruleset.get(4)); LONGS_EQUAL(77, rule->getId());
220  rule = (DummyRule *) (ruleset.get(5)); CHECK(rule == NULL);
221 }
222 
223 // test method replace
224 TEST( GarpRuleSet_replace , GarpRuleSet )
225 {
226  DummyRule * rule;
227  GarpRuleSet ruleset(100);
228 
229  testHelperAddRules(&ruleset, 0, 49);
230 
231  // create brand new rule
232  rule = new DummyRule(1250);
233 
234  // try to replace something that is out of bounds
235  LONGS_EQUAL(0, ruleset.replace(-1, rule)); // rule is outside of range
236 
237  LONGS_EQUAL(0, ruleset.replace(75, rule)); // there is no rule at index 75
238  //
239  LONGS_EQUAL(0, ruleset.replace(25, NULL)); // rule is NULL
240 
241  // finally replace rule correctly
242  LONGS_EQUAL(1, ruleset.replace(25, rule));
243 
244  // check if it is really there
245  rule = (DummyRule *) (ruleset.get(25));
246  LONGS_EQUAL(1250, rule->getId());
247 }
248 
249 // test performanceSummary method
250 TEST ( GarpRuleSet_performanceSummary , GarpRuleSet )
251 {
252  double best, worst, avg;
253  DummyRule * rule;
254  GarpRuleSet ruleset(100);
255 
256  testHelperAddRules(&ruleset, 0, 99);
257 
258  // change some performance values. other (uninitialized) values should be 0.0
259  rule = (DummyRule *) (ruleset.get(10)); rule->setPerformance(PerfSig, -100.0);
260  rule = (DummyRule *) (ruleset.get(20)); rule->setPerformance(PerfSig, 50.0);
261  rule = (DummyRule *) (ruleset.get(25)); rule->setPerformance(PerfSig, 100.0);
262  rule = (DummyRule *) (ruleset.get(37)); rule->setPerformance(PerfSig, 50.0);
263  rule = (DummyRule *) (ruleset.get(77)); rule->setPerformance(PerfSig, 180.0);
264 
265  ruleset.performanceSummary(PerfSig, &best, &worst, &avg);
266  DOUBLES_EQUAL(2.80, avg, 0.0);
267  DOUBLES_EQUAL(-100.0, worst, 0.0);
268  DOUBLES_EQUAL(180.0, best, 0.0);
269 }
270 
271 /*
272 // TODO: add test for method findSimilar()
273 TEST ( GarpRuleSet_findSimilar , GarpRuleSet )
274 {
275  FAIL("Test for method findSimilar() not implemented yet");
276 }
277 
278 TEST ( DummyTest3 , dummy )
279 {
280  FAIL("At least not while you are playing around with the test framework!!");
281 }
282 
283 TEST ( DummyTest2 , dummy )
284 {
285  FAIL("Running a set of tests and not having a failure is not cool.");
286 }
287 
288 TEST ( DummyTest1 , dummy )
289 {
290  FAIL("This is just a test for the testing harness.");
291 }
292 */
293 
294 // ==============================================================
295 // ====================== GarpRule hierarchy tests ==============
296 
297 // TODO: implement tests for all GarpRule classes
virtual void crossover(GarpRule *rule, int xpt1, int xpt2)
Definition: rules_base.cpp:212
PerfIndex
Definition: rules_base.hh:42
DummyRule(int id=-1)
void testHelperAddRules(GarpRuleSet *ruleset, int from, int to)
double _performance[10]
Vector for storing the performance values for the rule.
Definition: rules_base.hh:188
virtual void log()
Definition: rules_base.cpp:469
double Scalar
Type of map values.
Definition: om_defs.hh:39
int replace(int index, GarpRule *rule)
Definition: ruleset.cpp:212
void clear()
Definition: ruleset.cpp:91
TEST(testHelperAddRules, Global)
void filter(PerfIndex perfIndex, double threshold)
Definition: ruleset.cpp:122
void performanceSummary(PerfIndex perfIndex, double *best, double *worst, double *average)
Definition: ruleset.cpp:304
char _origin
Definition: rules_base.hh:190
double evaluate(const OccurrencesPtr &occs)
Definition: rules_base.cpp:297
void adjustRange(Scalar &v1, Scalar &v2) const
Definition: rules_base.cpp:195
int add(GarpRule *rule)
Definition: ruleset.cpp:244
double getValue(const Sample &) const
GarpRule()
Definition: Rule.cpp:492
GarpRule * get(int index)
Definition: ruleset.cpp:201
Definition: garp.hh:57
virtual GarpRule * clone() const
Definition: rules_base.cpp:134
bool applies(const Sample &) const
virtual int copy(const GarpRule *fromRule)
Definition: rules_base.cpp:157
virtual ~GarpRule()
Definition: Rule.cpp:495
virtual void mutate(double temperature)
Definition: rules_base.cpp:250
void setPerformance(PerfIndex index, double newPerf)
virtual char type() const
Definition: Rule.h:122
int size()
Definition: ruleset.cpp:75
Definition: Rule.h:116
virtual int getCertainty(const Scalar pred) const
Definition: rules_base.cpp:183
double getPerformance(PerfIndex perfIndex) const
Definition: rules_base.cpp:177
int getStrength(const Sample &) const
int numRules()
Definition: ruleset.cpp:83
virtual double getError(const Scalar predefinedValue, const Scalar prediction) const
Definition: rules_base.cpp:189
GarpRule * objFactory() const
virtual bool similar(const GarpRule *compareToRule) const
Definition: rules_base.cpp:271
void trim(int rules)
Definition: ruleset.cpp:99
Definition: Sample.hh:25