openModeller  Version 1.5.0
ruleset.cpp
Go to the documentation of this file.
1 
36 #include <openmodeller/Random.hh>
37 #include <math.h>
38 #include <string.h>
39 
40 #include <openmodeller/Log.hh>
41 
42 #include "ruleset.hh"
43 #include "rules_base.hh"
44 
45 
46 /****************************************************************/
47 /****************** GarpRuleSet class ***************************/
48 /****************************************************************/
49 
50 
51 /****************************************************************/
52 /****************** Constructor *********************************/
53 
55 {
56  _size = size;
57  _rules = new GarpRule*[size];
58  _numRules = 0;
59  memset(_rules, 0, size * sizeof(GarpRule*));
60 }
61 
62 
63 /****************************************************************/
64 /****************** Destructor **********************************/
65 
67 {
68  clear();
69  delete [] _rules;
70 }
71 
72 /****************************************************************/
73 /****************** size ****************************************/
74 
76 {
77  return _size;
78 }
79 
80 /****************************************************************/
81 /****************** numRules ************************************/
82 
84 {
85  return _numRules;
86 }
87 
88 /****************************************************************/
89 /****************** clear ***************************************/
90 
92 {
93  trim(0);
94 }
95 
96 /****************************************************************/
97 /****************** trim ****************************************/
98 
99 void GarpRuleSet::trim(int rules)
100 {
101  int i;
102 
103  if (rules >= _numRules)
104  // there are less rules than specified: nothing to do
105  return;
106 
107  for (i = rules; i < _size; i++)
108  {
109  if (_rules[i])
110  {
111  delete _rules[i];
112  _rules[i] = NULL;
113  }
114  }
115 
116  _numRules = rules;
117 }
118 
119 /****************************************************************/
120 /****************** filter **************************************/
121 
122 void GarpRuleSet::filter(PerfIndex index, double threshold)
123 {
124  int i, j;
125 
126  i = 0;
127  while (i < _numRules)
128  {
129  //printf("%3d] Performance: %+8.4f (threshold=%+8.4f) - ",
130  // i, _rules[i]->getPerformance(index), threshold);
131 
132  if (_rules[i]->getPerformance(index) < threshold)
133  {
134  //printf("deleting\n");
135 
136  // this rule has not enough performance
137  // delete rule
138  delete _rules[i];
139 
140  // and shift rules up
141  for (j = i; j < _numRules - 1; j++)
142  _rules[j] = _rules[j + 1];
143 
144  // remove the duplicated reference to the last rule
145  _rules[_numRules - 1] = NULL;
146 
147  // update the number of rules in this set
148  // no need to increment <i> because the rules were shifted up one position
149  _numRules--;
150  }
151  else
152  {
153  //printf("keeping\n");
154 
155  // this rule passed the test
156  // go to the next one
157  i++;
158  }
159  }
160 }
161 
162 /****************************************************************/
163 /****************** insert **************************************/
164 
165 int GarpRuleSet::insert(PerfIndex perfIndex, GarpRule * rule)
166 {
167  double newRulePerformance;
168  int i, j;
169 
170  // insert rule and keep set sorted by performance index specified (_performance[perfIndex])
171  // find place where rule should be inserted
172  newRulePerformance = rule->getPerformance(perfIndex);
173  for (i = 0; i < _numRules; i++)
174  {
175  /*
176  printf("Perfs[%3d/%3d]: (%+8.4f > %+8.4f)? %2d\n", i, _numRules,
177  newRulePerformance, _rules[i]->getPerformance(perfIndex),
178  (newRulePerformance > _rules[i]->getPerformance(perfIndex)));
179  */
180 
181  if (newRulePerformance > _rules[i]->getPerformance(perfIndex))
182  break;
183  }
184 
185  // <i> has the index where new rule should be inserted
186  // move remaining rules one position down
187  // and insert new rule at index <i>
188  for (j = _numRules - 1; j >= i; j--)
189  { _rules[j + 1] = _rules[j]; }
190 
191  _rules[i] = rule;
192 
193  _numRules++;
194 
195  return i;
196 }
197 
198 /****************************************************************/
199 /****************** get *****************************************/
200 
202 {
203  if (index >= 0 || index < _numRules)
204  return _rules[index];
205  else
206  return NULL;
207 }
208 
209 /****************************************************************/
210 /****************** replace *************************************/
211 
212 int GarpRuleSet::replace(int index, GarpRule * rule)
213 {
214  if (!rule || index < 0 || index >= _numRules)
215  return 0;
216 
217  delete _rules[index];
218  _rules[index] = rule;
219  return 1;
220 }
221 
222 /****************************************************************/
223 /****************** remove **************************************/
224 
225 int GarpRuleSet::remove(int index)
226 {
227  if (index < 0 || index >= _numRules)
228  return 0;
229 
230  delete _rules[index];
231 
232  int i;
233  for (i = index; i < _numRules - 1; i++)
234  _rules[i] = _rules[i + 1];
235 
236  _rules[--_numRules] = NULL;
237 
238  return 1;
239 }
240 
241 /****************************************************************/
242 /****************** add *****************************************/
243 
245 {
246  if ( rule ) {
247 
248  if ( _numRules < _size ) {
249 
250  _rules[_numRules++] = rule;
251  return _numRules;
252  }
253  else {
254  // "Cannot add rule. Ruleset is full"
255  return 0;
256  }
257  }
258  else {
259  // Cannot add null rule
260  return 0;
261  }
262 }
263 
264 /****************************************************************/
265 /****************** findSimilar *********************************/
266 
268 {
269  int i;
270  for ( i = 0; i < _numRules; i++ ) {
271 
272  if ( _rules[i]->similar(rule) ) {
273 
274  return i;
275  }
276  }
277 
278  return -1;
279 }
280 
281 /****************************************************************/
282 /****************** getValue ************************************/
283 
284 
286 {
287  int i;
288 
289  for ( i = 0; i < _numRules; i++ ) {
290 
291  if (_rules[i]->applies(x)) {
292 
293  //return i / (double) _numRules;
294  return _rules[i]->getPrediction();
295  }
296  }
297 
298  return 0.0;
299 }
300 
301 /****************************************************************/
302 /*************** performanceSummary *****************************/
303 
305  double * best,
306  double * worst,
307  double * average)
308 {
309  int i;
310  double performance;
311 
312  *worst = *best = *average = 0.0;
313 
314  if (!_numRules)
315  return;
316 
317  for (i = 0; i < _numRules; i++)
318  {
319  performance = _rules[i]->getPerformance(perfIndex);
320 
321  if (performance < *worst || !i) *worst = performance;
322  if (performance > *best || !i) *best = performance;
323  *average += performance;
324  }
325 
326  *average /= _numRules;
327 }
328 
329 /****************************************************************/
330 /****************** log *****************************************/
331 
332 void GarpRuleSet::log() const
333 {
334  for ( int i = 0; i < _numRules; i++ )
335  {
336  Log::instance()->info( "%2d] ", i );
337  _rules[i]->log();
338  }
339 }
340 
341 // ==============================================================
342 
343 // gather rule set statistics
345 {
346  char type='0'; //initialise to some invalid value
347 
348  printf("%4d]", gen);
349 
350  for (int i = 0; i < 3; i++)
351  {
352  switch (i)
353  {
354  case 0: type ='d'; break;
355  case 1: type ='!'; break;
356  case 2: type ='r'; break;
357  //case 3: type ='a'; break;
358  }
359 
360  double max = -10000;
361  double sum = 0;
362  int ct = 0;
363  int pres = 0;
364  for (int j = 0; j < _numRules; j++)
365  {
366  GarpRule * rule = _rules[j];
367  if (rule->type() == type)
368  {
369  ct++;
370  sum += rule->getPerformance(PerfUtil);
371  pres += (int) rule->getPrediction();
372  if (max < rule->getPerformance(PerfUtil))
373  max = rule->getPerformance(PerfUtil);
374  }
375  }
376 
377  if (max == -10000)
378  max = 0;
379 
380  printf("%c %2d %+7.2f %+7.2f %2d|", type, ct, max, sum / ct, pres);
381  }
382 
383  printf("\n");
384 }
PerfIndex
Definition: rules_base.hh:42
void log() const
Definition: ruleset.cpp:332
int findSimilar(GarpRule *rule)
Definition: ruleset.cpp:267
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
static Log * instance()
Returns the instance pointer, creating the object on the first call.
Definition: Log.cpp:45
Scalar getValue(const Sample &x) const
Definition: ruleset.cpp:285
void clear()
Definition: ruleset.cpp:91
void filter(PerfIndex perfIndex, double threshold)
Definition: ruleset.cpp:122
~GarpRuleSet()
Definition: ruleset.cpp:66
void performanceSummary(PerfIndex perfIndex, double *best, double *worst, double *average)
Definition: ruleset.cpp:304
GarpRule ** _rules
Definition: ruleset.hh:183
int add(GarpRule *rule)
Definition: ruleset.cpp:244
GarpRule * get(int index)
Definition: ruleset.cpp:201
int _numRules
Definition: ruleset.hh:185
GarpRuleSet(int size)
Definition: ruleset.cpp:54
void gatherRuleSetStats(int gen)
Definition: ruleset.cpp:344
int insert(PerfIndex perfIndex, GarpRule *rule)
Definition: ruleset.cpp:165
Scalar getPrediction() const
Definition: rules_base.hh:158
virtual char type() const
Definition: Rule.h:122
int remove(int index)
Definition: ruleset.cpp:225
int size()
Definition: ruleset.cpp:75
Definition: Rule.h:116
void info(const char *format,...)
'Info' level.
Definition: Log.cpp:256
double getPerformance(PerfIndex perfIndex) const
Definition: rules_base.cpp:177
int numRules()
Definition: ruleset.cpp:83
void trim(int rules)
Definition: ruleset.cpp:99
Definition: Sample.hh:25