/*--------------------------------------------------------- * * Data Mining (Uniprocessor) * */ #include #include "mine.h" /* rule is a bit vector where "1" is don't care */ int sum[rules], elements[rules]; int rawVariables[dataPoints], rawData[dataPoints]; /* insert data elements without visiting unecessary sub-trees */ void treeInsert(const int level, const int rule, const int variables, const int data) { int levelBit = 2 << level; if (level < independentVariables) { if (variables & levelBit) treeInsert(level + 1, rule, variables, data); treeInsert(level + 1, rule + levelBit, variables, data); } else { sum[rule] += data; elements[rule]++; } } /* insert data elements in an un-sophisticted way */ void loopInsert(const int variables, const int data) { int rule; for (rule = 0; rule < rules; rule++) if ((rule | variables) == variableMask) { sum[rule] += data; elements[rule]++; } } void inline insert(const int variables, const int data) { #ifdef FASTINSERT treeInsert(0, 0, variables, data); #else /* FASTINSERT */ loopInsert(variables, data); #endif /* FASTINSERT */ } int score(int rule) { return ((elements[rule] < 1000 && elements[rule] > 100) ? sum[rule] / elements[rule] : 0); } int mine() { int dataElement, rule; int thisScore, bestRule, bestScore = 0; for (dataElement = 0; dataElement < dataPoints; dataElement++) insert(rawVariables[dataElement], rawData[dataElement]); for (rule = 0; rule < rules; rule++) if ((thisScore = score(rule)) > bestScore) { bestScore = thisScore; bestRule = rule; } return (bestRule); }