[jboss-svn-commits] JBL Code SVN: r20503 - in labs/jbossrules/contrib/machinelearning/4.0.x: drools-core/src/main/java/org/drools/learner/builder and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Jun 15 11:06:28 EDT 2008
Author: gizil
Date: 2008-06-15 11:06:27 -0400 (Sun, 15 Jun 2008)
New Revision: 20503
Added:
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/InstanceFactory.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/AdaBoostBuilder.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/AdaBoostKBuilder.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/BoostedTester.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeFactory.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/ForestTester.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/SingleTreeTester.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/AttributeChooser.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/GainRatio.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/GlobalCategorizer.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Heuristic.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassAnnotation.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassLogger.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassStructure.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassVisitor.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/LogMethod.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/Logger.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/LoggerFactory.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/LoggerInterface.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/PseudoFieldExtractor.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/SimpleLogger.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExampleFromDrl.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/PokerExampleFromDrl.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/Triangle.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/TriangleExample.java
Modified:
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/C45Learner.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/ID3Learner.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Categorizer.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Entropy.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExample.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/GolfExample.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/NurseryExample.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/PokerExample.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/RestaurantExample.java
Log:
Second refactoring + ClassVisitor (not tested yet)
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/InstanceFactory.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/InstanceFactory.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/InstanceFactory.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,90 @@
+package org.drools.learner;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+import org.drools.WorkingMemory;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.learner.builder.Learner.DataType;
+import org.drools.learner.tools.ClassStructure;
+import org.drools.spi.Extractor;
+
+public class InstanceFactory {
+
+ private WorkingMemory session;
+ private Schema schema;
+ public InstanceFactory(WorkingMemory _session, Schema _schema) {
+ session = _session;
+ schema = _schema;
+ }
+
+ public Instance createInstance(Object _obj) {
+ try {
+ Instance i= new Instance();
+ instantiateAttributes(i, _obj, _obj.getClass());
+ return i;
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public void instantiateAttributes(Instance inst, Object _obj, Class<?> klass) throws Exception {
+ if (klass.equals(Object.class))
+ return;
+
+ ClassStructure struct = schema.getClassStructure().get(klass);
+ if (struct.hasLabel()) {// it has a method or label
+ for (Method m : struct.getMethods()) {
+ String m_name = m.getName();
+ DataType m_type = DataType.PRIMITIVE;// must be primitive
+ getAttributeValue(inst, _obj, m_name, m_type);
+ }
+ }
+ // get the fields declared in the class
+ for (Field f : struct.getFields()) {
+ String f_name = f.getName();
+ DataType f_type = struct.getFieldType(f);
+ getAttributeValue(inst, _obj, f_name, f_type);
+ }
+
+ instantiateAttributes(inst, _obj, struct.getParent());
+
+ return;
+ }
+
+ public void getAttributeValue(Instance inst, Object _obj, String name, DataType type) throws Exception {
+ switch (type) {
+ case PRIMITIVE: // domain exist only for primitive types
+ Domain fieldDomain = schema.getAttrDomain(name);
+ Extractor f_extractor = schema.getAttrExtractor(name);
+ Object f_value = f_extractor.getValue( (InternalWorkingMemory) session, _obj);
+ try {
+ if (fieldDomain.isPossible(f_value)) {
+ fieldDomain.addCategory(f_value);
+ inst.setAttr(name, f_value);
+ }
+ } catch (Exception e) {
+ System.out.println("Domain: "+fieldDomain+ " could not add the value "+ f_value);
+ e.printStackTrace();
+ }
+ break;
+ case STRUCTURED: // the extractor exists for both types of data.
+ Extractor complex_f_extractor = schema.getAttrExtractor(name); // this returns an object to me
+ Object obj_value = complex_f_extractor.getValue( (InternalWorkingMemory) session, _obj);
+ instantiateAttributes(inst, obj_value, obj_value.getClass());
+
+ break;
+ // case Collection
+ default:
+ throw new Exception("What type of data is this");
+
+ }
+
+ return;
+ }
+
+
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/InstanceFactory.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/AdaBoostBuilder.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/AdaBoostBuilder.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/AdaBoostBuilder.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,171 @@
+package org.drools.learner.builder;
+
+import java.util.ArrayList;
+
+import org.drools.learner.DecisionTree;
+import org.drools.learner.InstanceList;
+import org.drools.learner.Memory;
+import org.drools.learner.Stats;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+import org.drools.learner.tools.Util;
+
+/*
+ *
+ */
+public class AdaBoostBuilder implements DecisionTreeBuilder{
+
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(AdaBoostBuilder.class, SimpleLogger.DEFAULT_LEVEL);
+ private static SimpleLogger slog = LoggerFactory.getSysOutLogger(AdaBoostBuilder.class, SimpleLogger.DEFAULT_LEVEL);
+
+ private TreeAlgo algorithm = TreeAlgo.BOOST; // default bagging, TODO boosting
+
+ private static int FOREST_SIZE = 50;
+ private static final double TREE_SIZE_RATIO = 1.0d;
+ private static final boolean WITH_REP = false;
+
+ private ArrayList<DecisionTree> forest;
+ private ArrayList<Double> classifier_accuracy;
+ //private Learner trainer;
+
+ public AdaBoostBuilder() {
+ //this.trainer = _trainer;
+ }
+ public void build(Memory mem, Learner _trainer) {
+
+ final InstanceList class_instances = mem.getClassInstances();
+ _trainer.setInputData(class_instances);
+
+
+ if (class_instances.getTargets().size()>1 ) {
+ //throw new FeatureNotSupported("There is more than 1 target candidates");
+ if (flog.error() !=null)
+ flog.error().log("There is more than 1 target candidates\n");
+ System.exit(0);
+ // TODO put the feature not supported exception || implement it
+ } else if (_trainer.getTargetDomain().getCategoryCount() >2) {
+ if (flog.error() !=null)
+ flog.error().log("The target domain is not binary!!!\n");
+ System.exit(0);
+ }
+
+ int N = class_instances.getSize();
+ int NUM_DATA = (int)(TREE_SIZE_RATIO * N);
+ _trainer.setDataSizePerTree(NUM_DATA);
+
+
+ forest = new ArrayList<DecisionTree> (FOREST_SIZE);
+ classifier_accuracy = new ArrayList<Double>(FOREST_SIZE);
+ // weight for each instance - the higher the weight, the more the instance influences the classifier learned.
+ double [] weights = new double [NUM_DATA];
+ for (int index_i=0; index_i<NUM_DATA; index_i++) {
+ weights[index_i] = 1.0d/(double)NUM_DATA;
+ class_instances.getInstance(index_i).setWeight(weights[index_i] * (double)NUM_DATA);
+ if (slog.debug() != null)
+ slog.debug().log(index_i+" new weight:"+class_instances.getInstance(index_i).getWeight()+ "\n");
+ }
+
+ int i = 0;
+// int[] bag;
+ while (i++ < FOREST_SIZE ) {
+// if (WITH_REP)
+// bag = Util.bag_w_rep(NUM_DATA, N);
+// else
+// bag = Util.bag_wo_rep(NUM_DATA, N);
+
+ InstanceList working_instances = class_instances; //.getInstances(bag);
+ DecisionTree dt = _trainer.train_tree(working_instances);
+ dt.setID(i);
+
+ double error = 0.0;
+ SingleTreeTester t= new SingleTreeTester(dt);
+ for (int index_i = 0; index_i < NUM_DATA; index_i++) {
+ Integer result = t.test(class_instances.getInstance(index_i));
+ if (result == Stats.INCORRECT) {
+
+ error += weights[index_i];
+ if (slog.debug() != null)
+ slog.debug().log("[e:"+error+" w:"+weights[index_i]+ "] ");
+ }
+ }
+
+ if (error > 0.0f) {
+ double alpha = Util.ln( (1.0d-error)/error ) / 2.0d;
+
+ if (error < 0.5d) {
+ // The classification accuracy of the weak classifier
+ classifier_accuracy.add(alpha);
+
+ double norm_fact= 0.0d;
+ // Boosting the missclassified instances
+ for (int index_i = 0; index_i < NUM_DATA; index_i++) {
+ Integer result = t.test(class_instances.getInstance(index_i));//TODO dont need to test two times
+ switch (result) {
+ case Stats.INCORRECT:
+ weights[index_i] = weights[index_i] * Util.exp(alpha);
+ break;
+ case Stats.CORRECT:
+ weights[index_i] = weights[index_i] * Util.exp(-1.0d * alpha);
+ break;
+ case Stats.UNKNOWN:
+ if (slog.error() !=null)
+ slog.error().log("Unknown situation bok\n");
+ System.exit(0);
+ break;
+ }
+ norm_fact += weights[index_i];
+ }
+ // Normalization of the weights
+ for (int index_i = 0; index_i < NUM_DATA; index_i++) {
+ weights[index_i] = weights[index_i] / norm_fact;
+ class_instances.getInstance(index_i).setWeight(weights[index_i] * (double)NUM_DATA);
+ }
+ } else {
+ if (slog.debug() != null)
+ slog.debug().log("The error="+error+" alpha:"+alpha+ "\n");
+ if (slog.error() != null)
+ slog.error().log("error:"+error + " alpha will be negative and the weights of the training samples will be updated in the wrong direction"+"\n");
+ FOREST_SIZE = i-1;//ignore the current tree
+ break;
+ }
+ }
+
+
+ else {
+ if (slog.stat() != null)
+ slog.stat().log("All instances classified correctly TERMINATE, forest size:"+i+ "\n");
+ // What to do here??
+ FOREST_SIZE = i;
+ classifier_accuracy.add(10.0); // TODO add a very big number
+
+
+ }
+
+
+ forest.add(dt);
+
+ if (slog.stat() !=null)
+ slog.stat().stat(".");
+
+ }
+ // TODO how to compute a best tree from the forest
+ _trainer.setBestTree(forest.get(0));
+ //this.c45 = dt;
+ }
+
+ public ArrayList<DecisionTree> getTrees() {
+ return forest;
+ }
+ public ArrayList<Double> getAccuracies() {
+ return classifier_accuracy;
+ }
+ public TreeAlgo getTreeAlgo() {
+ return algorithm; //TreeAlgo.BAG; // default
+ }
+ public void clearForest(int j) {
+ //forest = null;
+ for (int i = forest.size()-1; i >j; i--)
+ forest.remove(i);
+
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/AdaBoostBuilder.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/AdaBoostKBuilder.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/AdaBoostKBuilder.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/AdaBoostKBuilder.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,185 @@
+package org.drools.learner.builder;
+
+import java.util.ArrayList;
+
+import org.drools.learner.AttributeValueComparator;
+import org.drools.learner.DecisionTree;
+import org.drools.learner.Instance;
+import org.drools.learner.InstanceList;
+import org.drools.learner.Memory;
+import org.drools.learner.Stats;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+import org.drools.learner.tools.Util;
+
+public class AdaBoostKBuilder implements DecisionTreeBuilder{
+
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(AdaBoostKBuilder.class, SimpleLogger.DEFAULT_LEVEL);
+ private static SimpleLogger slog = LoggerFactory.getSysOutLogger(AdaBoostKBuilder.class, SimpleLogger.DEBUG);
+
+ private TreeAlgo algorithm = TreeAlgo.BOOST_K; // default bagging, TODO boosting
+
+ private static int FOREST_SIZE = 10;
+ private static final double TREE_SIZE_RATIO = 0.9;
+ private static final boolean WITH_REP = false;
+
+ private ArrayList<DecisionTree> forest;
+ private ArrayList<Double> classifier_accuracy;
+ //private Learner trainer;
+
+ public AdaBoostKBuilder() {
+ //this.trainer = _trainer;
+ }
+ public void build(Memory mem, Learner _trainer) {
+
+ final InstanceList class_instances = mem.getClassInstances();
+ _trainer.setInputData(class_instances);
+
+
+ if (class_instances.getTargets().size()>1 ) {
+ //throw new FeatureNotSupported("There is more than 1 target candidates");
+ if (flog.error() !=null)
+ flog.error().log("There is more than 1 target candidates");
+ System.exit(0);
+ // TODO put the feature not supported exception || implement it
+ } else if (_trainer.getTargetDomain().getCategoryCount() <=2) {
+ if (flog.warn() !=null)
+ flog.warn().log("The target domain is binary!!! Do u really need that one");
+ }
+
+ int N = class_instances.getSize();
+ int K = _trainer.getTargetDomain().getCategoryCount();
+ int M = (int)(TREE_SIZE_RATIO * N);
+ _trainer.setDataSizePerTree(M);
+
+
+ forest = new ArrayList<DecisionTree> (FOREST_SIZE);
+ classifier_accuracy = new ArrayList<Double>(FOREST_SIZE);
+ //Initialize the weight wij (i = 1,...,m (number of instances) and j = 1,...,K (number of classes))
+ double[][] weight = new double[M][K];
+ for (int index_i=0; index_i<M; index_i++) {
+ for (int index_j=0; index_j<K; index_j++) {
+ Instance inst_i = class_instances.getInstance(index_i);
+
+
+ Object instance_target = inst_i.getAttrValue(_trainer.getTargetDomain().getFName());
+ Object instance_target_category = _trainer.getTargetDomain().getCategoryOf(instance_target);
+ Object target_category= _trainer.getTargetDomain().getCategory(index_j);
+
+ if (AttributeValueComparator.instance.compare(instance_target_category, target_category) == 0) {
+ //if y_i == u_j => the instance i is in class n.
+ weight[index_i][index_j]= 0;
+ } else {
+ // mistake
+ weight[index_i][index_j]= 1;
+ }
+
+ }
+ }
+
+ int i = 0;
+ int[] bag;
+ while (i++ < FOREST_SIZE ) {
+ // a. Normalize wij
+ if (WITH_REP)
+ bag = Util.bag_w_rep(M, N);
+ else
+ bag = Util.bag_wo_rep(M, N);
+
+
+ // b. Train h_t(x) by minimizing loss function
+
+ InstanceList working_instances = class_instances.getInstances(bag);
+ DecisionTree dt = _trainer.train_tree(working_instances);
+ dt.setID(i);
+
+ double error = 0.0;
+ SingleTreeTester t= new SingleTreeTester(dt);
+ for (int index_i = 0; index_i < M; index_i++) {
+ Integer result = t.test(class_instances.getInstance(index_i));
+ if (result == Stats.INCORRECT) {
+
+ //error += distribution.get(index_i);
+ }
+ }
+
+ if (error > 0.0f) {
+ double alpha = Util.ln( (1.0d-error)/error ) / 2.0d;
+
+ if (error < 0.5d) {
+ // The classification accuracy of the weak classifier
+ classifier_accuracy.add(alpha);
+
+ double norm_fact= 0.0d;
+ // Update the weight matrix wij:
+ for (int index_i = 0; index_i < M; index_i++) {
+ Integer result = t.test(class_instances.getInstance(index_i));//TODO dont need to test two times
+ switch (result) {
+ case Stats.INCORRECT:
+ //distribution.set(index_i, distribution.get(index_i) * Util.exp(alpha));
+ break;
+ case Stats.CORRECT:
+ //distribution.set(index_i, distribution.get(index_i) * Util.exp(-1.0d * alpha));
+ break;
+ case Stats.UNKNOWN:
+ if (slog.error() !=null)
+ slog.error().log("Unknown situation bok");
+ System.exit(0);
+ break;
+ }
+ //norm_fact += distribution.get(index_i);
+ }
+ // Normalization of the weights
+ for (int index_i = 0; index_i < M; index_i++) {
+ //distribution.set(index_i, distribution.get(index_i) / norm_fact);
+ }
+ } else {
+ if (slog.debug() != null)
+ slog.debug().log("The error="+error+" alpha:"+alpha+ "\n");
+ if (slog.error() != null)
+ slog.error().log("error:"+error + " alpha will be negative and the weights of the training samples will be updated in the wrong direction"+"\n");
+ FOREST_SIZE = i-1;//ignore the current tree
+ break;
+ }
+ }
+
+
+ else {
+ if (slog.stat() != null)
+ slog.stat().log("All instances classified correctly TERMINATE, forest size:"+i+ "\n");
+ // What to do here??
+ FOREST_SIZE = i;
+ classifier_accuracy.add(10.0); // TODO add a very big number
+
+
+ }
+
+
+ forest.add(dt);
+
+ if (slog.stat() !=null)
+ slog.stat().stat(".");
+
+ }
+ // TODO how to compute a best tree from the forest
+ _trainer.setBestTree(forest.get(0));
+
+ //this.c45 = dt;
+ }
+
+ public ArrayList<DecisionTree> getTrees() {
+ return forest;
+ }
+ public ArrayList<Double> getAccuracies() {
+ return classifier_accuracy;
+ }
+ public TreeAlgo getTreeAlgo() {
+ return algorithm; //TreeAlgo.BAG; // default
+ }
+ public void clearForest(int j) {
+ //forest = null;
+ for (int i = forest.size()-1; i >j; i--)
+ forest.remove(i);
+
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/AdaBoostKBuilder.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/BoostedTester.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/BoostedTester.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/BoostedTester.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,92 @@
+package org.drools.learner.builder;
+
+import java.util.ArrayList;
+
+import org.drools.learner.DecisionTree;
+import org.drools.learner.Domain;
+import org.drools.learner.Instance;
+import org.drools.learner.InstanceList;
+import org.drools.learner.Stats;
+import org.drools.learner.eval.ClassDistribution;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+import org.drools.learner.tools.Util;
+
+public class BoostedTester extends Tester{
+
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(BoostedTester.class, SimpleLogger.DEFAULT_LEVEL);
+ private static SimpleLogger slog = LoggerFactory.getSysOutLogger(BoostedTester.class, SimpleLogger.DEFAULT_LEVEL);
+
+ private ArrayList<DecisionTree> trees;
+ private ArrayList<Double> accuracy;
+ private Domain targetDomain;
+
+ public BoostedTester(ArrayList<DecisionTree> forest, ArrayList<Double> _accuracy) {
+ trees = forest;
+ accuracy = _accuracy;
+ targetDomain = forest.get(0).getTargetDomain();
+ }
+
+ public Stats test(InstanceList data) {
+
+ Stats evaluation = new Stats(data.getSchema().getObjectClass()) ; //represent.getObjClass());
+
+ int i = 0;
+ for (Instance instance : data.getInstances()) {
+ Object forest_decision = this.voteOn(instance);
+ Integer result = evaluate(targetDomain, instance, forest_decision);
+
+ //flog.debug(Util.ntimes("#\n", 1)+i+ " <START> TEST: instant="+ instance + " = target "+ result);
+ if (i%1000 ==0 && slog.stat() != null)
+ slog.stat().stat(".");
+
+ evaluation.change(result, 1);
+ i ++;
+ }
+ return evaluation;
+
+ //printStats(evaluation, executionSignature);
+ }
+
+ public Object voteOn(Instance i) {
+ ClassDistribution classification = new ClassDistribution(targetDomain);
+
+ for (int j = 0; j< trees.size() ; j ++) {
+ Object vote = trees.get(j).vote(i);
+ if (vote != null) {
+ classification.change(vote, accuracy.get(j));
+ //classification.change(Util.sum(), accuracy.get(j));
+ } else {
+ // TODO add an unknown value
+ //classification.change(-1, 1);
+ if (flog.error() !=null)
+ flog.error().log(Util.ntimes("\n", 10)+"Unknown situation at tree: " + j + " for fact "+ i);
+ System.exit(0);
+ }
+ if (slog.debug() != null)
+ slog.debug().log("Vote "+accuracy.get(j)+" for "+vote + "\n");
+ }
+ classification.evaluateMajority();
+ Object winner = classification.get_winner_class();
+ if (slog.debug() != null)
+ slog.debug().log("Winner = "+winner + "\n");
+
+ double ratio = 0.0;
+ if (classification.get_num_ideas() == 1) {
+ //100 %
+ ratio = 1.0d;
+ return winner;
+ } else {
+ double num_votes = classification.getVoteFor(winner);
+ ratio = (num_votes/(double) trees.size());
+ // TODO if the ratio is smaller than some number => reject
+ }
+ return winner;
+
+ }
+
+ public void printStats(final Stats evaluation, String executionSignature) {
+ super.printStats(evaluation, executionSignature);
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/BoostedTester.java
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/C45Learner.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/C45Learner.java 2008-06-15 14:55:50 UTC (rev 20502)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/C45Learner.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -7,16 +7,20 @@
import org.drools.learner.Domain;
import org.drools.learner.LeafNode;
import org.drools.learner.TreeNode;
-import org.drools.learner.eval.Entropy;
+import org.drools.learner.eval.AttributeChooser;
+import org.drools.learner.eval.Heuristic;
import org.drools.learner.eval.InformationContainer;
import org.drools.learner.eval.InstDistribution;
import org.drools.learner.tools.FeatureNotSupported;
public class C45Learner extends Learner{
- public C45Learner() {
+ private AttributeChooser chooser;
+
+ public C45Learner(Heuristic hf) {
super();
super.setDomainAlgo(DomainAlgo.QUANTITATIVE);
+ chooser = new AttributeChooser(hf);
}
@@ -63,8 +67,9 @@
InformationContainer best_attr_eval = new InformationContainer();
+
/* choosing the best attribute in order to branch at the current node*/
- Entropy.chooseAttribute(best_attr_eval, data_stats, attribute_domains);
+ chooser.chooseAttribute(best_attr_eval, data_stats, attribute_domains);
Domain node_domain = best_attr_eval.domain;
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeFactory.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeFactory.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeFactory.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,136 @@
+package org.drools.learner.builder;
+
+import org.drools.WorkingMemory;
+import org.drools.learner.DecisionTree;
+import org.drools.learner.Memory;
+import org.drools.learner.builder.Learner.DataType;
+import org.drools.learner.eval.Entropy;
+import org.drools.learner.eval.GainRatio;
+import org.drools.learner.eval.Heuristic;
+import org.drools.learner.tools.FeatureNotSupported;
+import org.drools.learner.tools.Util;
+
+// uses the static functions from the deprecated class DecisionTreeFactory
+public class DecisionTreeFactory {
+
+ public static DecisionTree createSingleID3E(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+ return createSingleID3(wm, obj_class, new Entropy());
+ }
+
+ public static DecisionTree createSingleID3G(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+ return createSingleID3(wm, obj_class, new GainRatio());
+ }
+
+ protected static DecisionTree createSingleID3(WorkingMemory wm, Class<? extends Object> obj_class, Heuristic h) throws FeatureNotSupported {
+ /*
+ * Quesitons:
+ * 1- which class to work with? : obj_class
+ * 2- what is its target attribute?
+ * 3- what are the objects
+ */
+ DataType data = Learner.DEFAULT_DATA;
+ ID3Learner learner = new ID3Learner(h);
+ SingleTreeBuilder single_builder = new SingleTreeBuilder();
+
+ String algo_suffices = org.drools.learner.deprecated.DecisionTreeFactory.getAlgoSuffices(learner.getDomainAlgo(), single_builder.getTreeAlgo());
+ String executionSignature = org.drools.learner.deprecated.DecisionTreeFactory.getSignature(obj_class, "", algo_suffices);
+
+ /* create the memory */
+ Memory mem = Memory.createFromWorkingMemory(wm, obj_class, learner.getDomainAlgo(), data);
+ single_builder.build(mem, learner);//obj_class, target_attr, working_attr
+
+ SingleTreeTester tester = new SingleTreeTester(learner.getTree());
+ tester.printStats(tester.test(mem.getClassInstances()), Util.DRL_DIRECTORY + executionSignature);
+ //Tester.test(c45, mem.getClassInstances());
+
+ learner.getTree().setSignature(executionSignature);
+ return learner.getTree();
+ }
+ public static DecisionTree createSingleC45E(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+ return createSingleC45(wm, obj_class, new Entropy());
+ }
+
+ public static DecisionTree createSingleC45G(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+ return createSingleC45(wm, obj_class, new GainRatio());
+ }
+
+ protected static DecisionTree createSingleC45(WorkingMemory wm, Class<? extends Object> obj_class, Heuristic h) throws FeatureNotSupported {
+ DataType data = Learner.DEFAULT_DATA;
+ C45Learner learner = new C45Learner(h);
+
+ SingleTreeBuilder single_builder = new SingleTreeBuilder();
+
+ String algo_suffices = org.drools.learner.deprecated.DecisionTreeFactory.getAlgoSuffices(learner.getDomainAlgo(), single_builder.getTreeAlgo());
+ String executionSignature = org.drools.learner.deprecated.DecisionTreeFactory.getSignature(obj_class, "", algo_suffices);
+
+ /* create the memory */
+ Memory mem = Memory.createStructuredFromWorkingMemory(wm, obj_class, learner.getDomainAlgo(), data);
+ single_builder.build(mem, learner);//obj_class, target_attr, working_attr
+
+ SingleTreeTester tester = new SingleTreeTester(learner.getTree());
+ tester.printStats(tester.test(mem.getClassInstances()), Util.DRL_DIRECTORY + executionSignature);
+ //Tester.test(c45, mem.getClassInstances());
+
+ learner.getTree().setSignature(executionSignature);
+ return learner.getTree();
+ }
+
+ public static DecisionTree createBagC45E(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+ return createBagC45( wm,obj_class, new Entropy());
+ }
+ public static DecisionTree createBagC45G(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+ return createBagC45( wm,obj_class, new GainRatio());
+ }
+
+ protected static DecisionTree createBagC45(WorkingMemory wm, Class<? extends Object> obj_class, Heuristic h) throws FeatureNotSupported {
+ DataType data = Learner.DEFAULT_DATA;
+ C45Learner learner = new C45Learner(h);
+ ForestBuilder forest = new ForestBuilder();
+
+ String algo_suffices = org.drools.learner.deprecated.DecisionTreeFactory.getAlgoSuffices(learner.getDomainAlgo(), forest.getTreeAlgo());
+ String executionSignature = org.drools.learner.deprecated.DecisionTreeFactory.getSignature(obj_class, "", algo_suffices);
+
+ /* create the memory */
+ Memory mem = Memory.createStructuredFromWorkingMemory(wm, obj_class, learner.getDomainAlgo(), data);
+ forest.build(mem, learner);
+ //forest.clearForest(10);
+
+ ForestTester tester = new ForestTester(forest.getTrees());
+ tester.printStats(tester.test(mem.getClassInstances()), Util.DRL_DIRECTORY + executionSignature);
+ //forest.test(mem.getClassInstances(), Util.DRL_DIRECTORY+executionSignature);
+
+ //Tester bla => test(c45, mem.getClassInstances());
+ learner.getTree().setSignature(executionSignature);
+ return learner.getTree();
+ }
+
+ public static DecisionTree createBoostedC45E(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+ return createBoostedC45(wm, obj_class, new Entropy());
+ }
+ public static DecisionTree createBoostedC45G(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+ return createBoostedC45(wm, obj_class, new GainRatio());
+ }
+
+ public static DecisionTree createBoostedC45(WorkingMemory wm, Class<? extends Object> obj_class, Heuristic h) throws FeatureNotSupported {
+ DataType data = Learner.DEFAULT_DATA;
+
+ C45Learner learner = new C45Learner(h);
+ AdaBoostBuilder forest = new AdaBoostBuilder();
+
+ String algo_suffices = org.drools.learner.deprecated.DecisionTreeFactory.getAlgoSuffices(learner.getDomainAlgo(), forest.getTreeAlgo());
+ String executionSignature = org.drools.learner.deprecated.DecisionTreeFactory.getSignature(obj_class, "", algo_suffices);
+
+ /* create the memory */
+ Memory mem = Memory.createStructuredFromWorkingMemory(wm, obj_class, learner.getDomainAlgo(), data);
+ forest.build(mem, learner);
+ //forest.clearForest(10);
+
+ BoostedTester tester = new BoostedTester(forest.getTrees(), forest.getAccuracies());
+ tester.printStats(tester.test(mem.getClassInstances()), Util.DRL_DIRECTORY + executionSignature);
+ //forest.test(mem.getClassInstances(), Util.DRL_DIRECTORY+executionSignature);
+
+ //Tester bla => test(c45, mem.getClassInstances());
+ learner.getTree().setSignature(executionSignature);
+ return learner.getTree();
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeFactory.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/ForestTester.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/ForestTester.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/ForestTester.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,85 @@
+package org.drools.learner.builder;
+
+import java.util.ArrayList;
+
+import org.drools.learner.DecisionTree;
+import org.drools.learner.Domain;
+import org.drools.learner.Instance;
+import org.drools.learner.InstanceList;
+import org.drools.learner.Stats;
+import org.drools.learner.eval.ClassDistribution;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+import org.drools.learner.tools.Util;
+
+public class ForestTester extends Tester{
+
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(ForestTester.class, SimpleLogger.DEFAULT_LEVEL);
+ private static SimpleLogger slog = LoggerFactory.getSysOutLogger(ForestTester.class, SimpleLogger.DEFAULT_LEVEL);
+
+ private ArrayList<DecisionTree> trees;
+ private Domain targetDomain;
+
+ public ForestTester(ArrayList<DecisionTree> forest) {
+ trees = forest;
+ targetDomain = forest.get(0).getTargetDomain();
+ }
+
+ public Stats test(InstanceList data) {
+
+ Stats evaluation = new Stats(data.getSchema().getObjectClass()) ; //represent.getObjClass());
+
+ int i = 0;
+ for (Instance instance : data.getInstances()) {
+ Object forest_decision = this.voteOn(instance);
+ Integer result = evaluate(targetDomain, instance, forest_decision);
+
+ //flog.debug(Util.ntimes("#\n", 1)+i+ " <START> TEST: instant="+ instance + " = target "+ result);
+ if (i%1000 ==0 && slog.stat() != null)
+ slog.stat().stat(".");
+
+ evaluation.change(result, 1);
+ i ++;
+ }
+
+ return evaluation;
+ }
+
+ public Object voteOn(Instance i) {
+ ClassDistribution classification = new ClassDistribution(targetDomain);
+
+ for (int j = 0; j< trees.size() ; j ++) {
+ Object vote = trees.get(j).vote(i);
+ if (vote != null) {
+ classification.change(vote, 1);
+ //classification.change(Util.sum(), 1);
+ } else {
+ // TODO add an unknown value
+ //classification.change(-1, 1);
+ if (flog.error() !=null)
+ flog.error().log(Util.ntimes("\n", 10)+"Unknown situation at tree: " + j + " for fact "+ i);
+ System.exit(0);
+ }
+ }
+ classification.evaluateMajority();
+ Object winner = classification.get_winner_class();
+
+
+ double ratio = 0.0;
+ if (classification.get_num_ideas() == 1) {
+ //100 %
+ ratio = 1;
+ return winner;
+ } else {
+ double num_votes = classification.getVoteFor(winner);
+ ratio = (num_votes/(double) trees.size());
+ // TODO if the ratio is smaller than some number => reject
+ }
+ return winner;
+
+ }
+ public void printStats(final Stats evaluation, String executionSignature) {
+ super.printStats(evaluation, executionSignature);
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/ForestTester.java
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/ID3Learner.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/ID3Learner.java 2008-06-15 14:55:50 UTC (rev 20502)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/ID3Learner.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -7,16 +7,19 @@
import org.drools.learner.Domain;
import org.drools.learner.LeafNode;
import org.drools.learner.TreeNode;
-import org.drools.learner.eval.Entropy;
+import org.drools.learner.eval.AttributeChooser;
+import org.drools.learner.eval.Heuristic;
import org.drools.learner.eval.InstDistribution;
import org.drools.learner.tools.Util;
public class ID3Learner extends Learner {
- public ID3Learner() {
+ private AttributeChooser chooser;
+
+ public ID3Learner(Heuristic hf) {
super();
super.setDomainAlgo(DomainAlgo.CATEGORICAL);
-
+ chooser = new AttributeChooser(hf);
}
protected TreeNode train(DecisionTree dt, InstDistribution data_stats) {//List<Instance> data) {
@@ -60,8 +63,9 @@
/* id3 starts: choose the attribute according to the entropy function
* entrophy function: data, info of the data wrt target domain, info for each attribute
* */
- Domain node_domain = Entropy.chooseAttributeAsCategorical(data_stats, attribute_domains);
+ Domain node_domain = chooser.chooseAttributeAsCategorical(data_stats, attribute_domains);
+
if (flog.stat() !=null)
flog.stat().log(Util.ntimes("*", 20)+" 1st best attr: "+ node_domain);
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/SingleTreeTester.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/SingleTreeTester.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/SingleTreeTester.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,47 @@
+package org.drools.learner.builder;
+
+import org.drools.learner.DecisionTree;
+import org.drools.learner.Instance;
+import org.drools.learner.InstanceList;
+import org.drools.learner.Stats;
+
+public class SingleTreeTester extends Tester{
+
+ private DecisionTree single_tree;
+
+ public SingleTreeTester(DecisionTree one_tree) {
+ single_tree = one_tree;
+ }
+
+ /* test the entire set*/
+ public Stats test(InstanceList data) {
+
+ //flog.debug(Util.ntimes("\n", 2)+Util.ntimes("$", 5)+" TESTING "+Util.ntimes("\n", 2));
+
+ Stats evaluation = new Stats(single_tree.getObjClass());
+ int i = 0;
+ for (Instance instance : data.getInstances()) {
+ Object tree_decision = single_tree.vote(instance);
+ Integer result = evaluate(single_tree.getTargetDomain(), instance, tree_decision);
+
+ //flog.debug(Util.ntimes("#\n", 1)+i+ " <START> TEST: instant="+ instance + " = target "+ result);
+// if (i%1000 ==0 && slog.stat() !=null)
+// slog.stat().stat(".");
+
+ evaluation.change(result, 1);
+ i ++;
+ }
+ return evaluation;
+ }
+
+ /* test the entire set*/
+ public Integer test(Instance i) {
+
+ Object tree_decision = single_tree.vote(i);
+ return evaluate(single_tree.getTargetDomain(), i, tree_decision);
+ }
+
+ public void printStats(final Stats evaluation, String executionSignature) {
+ super.printStats(evaluation, executionSignature);
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/SingleTreeTester.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/AttributeChooser.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/AttributeChooser.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/AttributeChooser.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,101 @@
+package org.drools.learner.eval;
+
+import java.util.List;
+
+import org.drools.learner.Domain;
+
+public class AttributeChooser {
+
+ private Heuristic function;
+
+ public AttributeChooser(Heuristic _function) {
+ function = _function;
+ }
+
+ public Domain chooseAttribute(InformationContainer eval, InstDistribution insts_by_target, List<Domain> attr_domains) {
+ // List<Instance> instances
+
+// double data_eval = function.calc_info(insts_by_target);
+ function.init(insts_by_target);
+
+ double greatestEval = function.getWorstEval();//-1000;
+// ArrayList<Instance> sorted_instances = null, best_sorted_instances = null;
+// Domain best_attr = attr_domains.get(0);
+
+ InformationContainer container = new InformationContainer();
+ InformationContainer best = new InformationContainer();
+ for (Domain attr_domain : attr_domains) {
+ /* No need to clone the domain as soon as no need to change the domain
+ * All domains are categorical so i will use them the way they are
+ */
+ double attribute_eval = 0.0;
+ if (attr_domain.isCategorical()) {
+ attribute_eval = function.getEval(attr_domain);//data_eval - function.info_attr(insts_by_target, attr_domain);
+ container.attribute_eval = attribute_eval;
+ container.domain = attr_domain;
+ } else {
+// the continuous domain
+ attribute_eval = function.getEval_cont(attr_domain);
+
+// attr_domain = function.getDomain();
+// sorted_instances = visitor.getSortedInstances();
+
+ container.attribute_eval = attribute_eval;
+ container.domain = function.getDomain();
+ container.sorted_data = function.getSortedInstances();
+
+ }
+// flog.debug("Attribute: " + attr_domain + " the gain: " + gain);
+ if (attribute_eval > greatestEval) {// TODO implement a comparator
+ greatestEval = attribute_eval;
+ best.domain = container.domain;
+ best.sorted_data = container.sorted_data;
+ }
+ }
+
+// Clone the best attribute domain cause it is going to be the domain of the treenode
+ eval.domain = best.domain.cheapClone();
+ eval.sorted_data = best.sorted_data;
+ eval.attribute_eval = greatestEval;
+ return eval.domain;
+ }
+
+// /*
+// * to choose the best attribute
+// * can process categorical, and quantitative attribute domains
+// * used by c45Learner, c45Iterator
+// */
+// public static Domain chooseAttribute(InstDistribution insts_by_target, List<Domain> attr_domains) {
+// InformationContainer evals = new InformationContainer();
+// chooseAttribute(evals, insts_by_target, attr_domains);
+// return evals.domain;
+// }
+
+ /*
+ * to choose the best attribute
+ * can process only the categorical attribute domains
+ * used by id3Learner
+ */
+ public Domain chooseAttributeAsCategorical(InstDistribution insts_by_target, List<Domain> attr_domains) {
+
+ //double dt_info = function.calc_info(insts_by_target);
+ function.init(insts_by_target);
+ double greatestEval = function.getWorstEval(); //-1000;
+ Domain best_attr = attr_domains.get(0);
+ for (Domain attr_domain : attr_domains) {
+ /* No need to clone the domain as soon as no need to change the domain
+ * All domains are categorical so i will use them the way they are
+ */
+ //double attribute_eval = dt_info - function.info_attr(insts_by_target, attr_domain);
+ double attribute_eval = function.getEval(attr_domain);
+// flog.debug("Attribute: " + attr_domain.getFName() + " the gain: " + gain);
+ if (attribute_eval > greatestEval) {
+ greatestEval = attribute_eval;
+ best_attr = attr_domain;
+ }
+ }
+// Clone the best attribute domain cause it is going to be the domain of the treenode
+ return best_attr.cheapClone();
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/AttributeChooser.java
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Categorizer.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Categorizer.java 2008-06-15 14:55:50 UTC (rev 20502)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Categorizer.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -7,6 +7,7 @@
import org.drools.learner.Instance;
import org.drools.learner.InstanceComparator;
import org.drools.learner.QuantitativeDomain;
+import org.drools.learner.eval.Entropy;
import org.drools.learner.tools.LoggerFactory;
import org.drools.learner.tools.SimpleLogger;
import org.drools.learner.tools.Util;
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Entropy.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Entropy.java 2008-06-15 14:55:50 UTC (rev 20502)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Entropy.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -11,7 +11,7 @@
import org.drools.learner.tools.SimpleLogger;
import org.drools.learner.tools.Util;
-public class Entropy {
+public class Entropy implements Heuristic{
private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(Entropy.class, SimpleLogger.DEFAULT_LEVEL);
//public Entropy
@@ -22,105 +22,64 @@
*
* used by:
* c45Alternator, c45Learner, c45Iterator
- */
- public static Domain chooseAttribute(InformationContainer eval, InstDistribution insts_by_target, List<Domain> attr_domains) {
- // List<Instance> instances
+ */
+ protected double data_eval;
+ protected InstDistribution insts_by_target;
+ protected ArrayList<Instance> sorted_instances;
+ protected Domain domain;
- double dt_info = calc_info(insts_by_target);
-
- double greatestGain = -1000;
- ArrayList<Instance> sorted_instances = null, best_sorted_instances = null;
- Domain best_attr = attr_domains.get(0);
- for (Domain attr_domain : attr_domains) {
- /* No need to clone the domain as soon as no need to change the domain
- * All domains are categorical so i will use them the way they are
- */
- double gain = 0.0;
- if (attr_domain.isCategorical()) {
- gain = dt_info - info_attr(insts_by_target, attr_domain);
- } else {
- // the continuous domain
-
- QuantitativeDomain trialDomain = QuantitativeDomain.createFromDomain(attr_domain);
-
- Categorizer visitor = new Categorizer(insts_by_target);
- visitor.findSplits(trialDomain);
-
- // trial domain is modified
- if (trialDomain.getNumIndices()==1) {
- gain = 0.0;
- } else {
- gain = dt_info - info_contattr(visitor.getSortedInstances(), insts_by_target.getClassDomain(), trialDomain);
- }
- attr_domain = trialDomain;
- sorted_instances = visitor.getSortedInstances();
-
- /*
- if (Util.DEBUG) {
- int index = 0;
- for (Integer i: split_indices) {
- System.out.print("Split indices:"+ i);
- System.out.print(" domain "+attrDomain.getValues().get(index));
- System.out.print(","+attrDomain.getIndices().get(index));
- System.out.println(" fact "+visitor.getSortedFact(i));
- index++;
- }
- }
- /* */
- }
- //flog.debug("Attribute: " + attr_domain + " the gain: " + gain);
- if (gain > greatestGain) {
- greatestGain = gain;
- best_attr = attr_domain;
- best_sorted_instances = sorted_instances;
- }
- }
-
- // Clone the best attribute domain cause it is going to be the domain of the treenode
- eval.domain = best_attr.cheapClone();
- eval.sorted_data = best_sorted_instances;
- eval.attribute_eval = greatestGain;
- return eval.domain;
+ public Entropy() {
+ //
}
-// /*
-// * to choose the best attribute
-// * can process categorical, and quantitative attribute domains
-// * used by c45Learner, c45Iterator
-// */
-// public static Domain chooseAttribute(InstDistribution insts_by_target, List<Domain> attr_domains) {
-// InformationContainer evals = new InformationContainer();
-// chooseAttribute(evals, insts_by_target, attr_domains);
-// return evals.domain;
-// }
+ public void init(InstDistribution _insts_by_target) {
+ insts_by_target = _insts_by_target;
+ data_eval = calc_info(insts_by_target);
+ sorted_instances = null;
+ domain = null;
+ }
+
+
+ public double getEval(Domain attr_domain) {
+ CondClassDistribution insts_by_attr = info_attr(attr_domain);
+ return data_eval - Entropy.calc_info_attr(insts_by_attr);
+ }
+
+ public double getEval_cont(Domain attr_domain) {
+
+ double attribute_eval= 0.0d;
+ QuantitativeDomain trialDomain = QuantitativeDomain.createFromDomain(attr_domain);
- /*
- * to choose the best attribute
- * can process only the categorical attribute domains
- * used by id3Learner
- */
- public static Domain chooseAttributeAsCategorical(InstDistribution insts_by_target, List<Domain> attr_domains) {
+ Categorizer visitor = new Categorizer(insts_by_target);
+ visitor.findSplits(trialDomain);
- double dt_info = calc_info(insts_by_target);
- double greatestGain = -1000;
- Domain best_attr = attr_domains.get(0);
- for (Domain attr_domain : attr_domains) {
- /* No need to clone the domain as soon as no need to change the domain
- * All domains are categorical so i will use them the way they are
- */
- double gain = dt_info - info_attr(insts_by_target, attr_domain);
- //flog.debug("Attribute: " + attr_domain.getFName() + " the gain: " + gain);
- if (gain > greatestGain) {
- greatestGain = gain;
- best_attr = attr_domain;
- }
+ // trial domain is modified
+ if (trialDomain.getNumIndices() > 1) {
+ CondClassDistribution insts_by_attr = info_contattr(visitor); //.getSortedInstances(), trialDomain);
+ attribute_eval = data_eval - Entropy.calc_info_attr(insts_by_attr);
}
- // Clone the best attribute domain cause it is going to be the domain of the treenode
- return best_attr.cheapClone();
+ domain = trialDomain;
+ sorted_instances = visitor.getSortedInstances();
+ return attribute_eval;
}
+ public double getDataEval() {
+ return data_eval;
+ }
- public static double info_attr(InstDistribution insts_by_target, Domain attr_domain) {
+ public Domain getDomain() {
+ return domain;
+ }
+
+ public ArrayList<Instance> getSortedInstances() {
+ return sorted_instances;
+ }
+
+ public double getWorstEval() {
+ return -1000;
+ }
+
+ public CondClassDistribution info_attr(Domain attr_domain) {
Domain target_domain = insts_by_target.getClassDomain();
@@ -149,8 +108,8 @@
}
}
- double sum = calc_info_attr(insts_by_attr);
- return sum;
+
+ return insts_by_attr;
}
@@ -158,8 +117,11 @@
* a wrapper for the quantitative domain to be able to calculate the stats
* */
//public static double info_contattr(InstanceList data, Domain targetDomain, QuantitativeDomain splitDomain) {
- public static double info_contattr(List<Instance> data, Domain targetDomain, QuantitativeDomain splitDomain) {
-
+ public CondClassDistribution info_contattr(Categorizer visitor) {
+
+ List<Instance> data = visitor.getSortedInstances();
+ QuantitativeDomain splitDomain = visitor.getSplitDomain();
+ Domain targetDomain = insts_by_target.getClassDomain();
String targetAttr = targetDomain.getFName();
CondClassDistribution instances_by_attr = new CondClassDistribution(splitDomain, targetDomain);
@@ -179,9 +141,11 @@
index++;
}
- double sum = calc_info_attr(instances_by_attr);
- return sum;
+ return instances_by_attr;
+// double sum = calc_info_attr(instances_by_attr);
+// return sum;
+
}
/*
@@ -222,6 +186,7 @@
double prob, sum = 0;
Domain target_domain = quantity_by_class.getClassDomain();
+ if (data_size > 0)
for (int category = 0; category<target_domain.getCategoryCount(); category++) {
Object targetCategory = target_domain.getCategory(category);
@@ -237,6 +202,4 @@
//flog.debug("= " +sum);
return sum;
}
-
-
}
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/GainRatio.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/GainRatio.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/GainRatio.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,64 @@
+package org.drools.learner.eval;
+
+import org.drools.learner.Domain;
+import org.drools.learner.QuantitativeDomain;
+import org.drools.learner.tools.Util;
+
+public class GainRatio extends Entropy implements Heuristic{
+
+ public GainRatio() {
+ super();
+ }
+
+
+ public double getEval(Domain attr_domain) {
+ CondClassDistribution insts_by_attr = super.info_attr(attr_domain);
+ double info_gain = super.data_eval - Entropy.calc_info_attr(insts_by_attr);
+
+ double split_info = GainRatio.split_info(insts_by_attr);
+ return info_gain /split_info;
+ }
+
+ public double getEval_cont(Domain attr_domain) {
+
+ double attribute_eval= 0.0d, split_info = 1.0d;
+ QuantitativeDomain trialDomain = QuantitativeDomain.createFromDomain(attr_domain);
+
+ Categorizer visitor = new Categorizer(insts_by_target);
+ visitor.findSplits(trialDomain);
+
+ // trial domain is modified
+ if (trialDomain.getNumIndices() > 1) {
+ CondClassDistribution insts_by_attr = super.info_contattr(visitor);
+ attribute_eval = super.data_eval - Entropy.calc_info_attr(insts_by_attr);
+
+ split_info = GainRatio.split_info(insts_by_attr);
+ }
+ domain = trialDomain;
+ sorted_instances = visitor.getSortedInstances();
+ return attribute_eval / split_info;
+ }
+
+ private static double split_info( CondClassDistribution instances_by_attr) {
+ //Collection<Object> attributeValues = instances_by_attr.getAttributes();
+ double data_size = instances_by_attr.getTotal();
+ double sum = 0.0;
+ if (data_size>0)
+ for (int attr_idx = 0; attr_idx < instances_by_attr.getNumCondClasses(); attr_idx++) {
+ Object attr_category = instances_by_attr.getCondClass(attr_idx);
+ double num_in_attr = instances_by_attr.getTotal_AttrCategory(attr_category);
+
+ if (num_in_attr > 0) {
+ double prob = num_in_attr / data_size;
+ sum -= prob * Util.log2(prob);
+ }
+ }
+ //flog.debug("\n == "+sum);
+ return sum;
+ }
+
+
+
+
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/GainRatio.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/GlobalCategorizer.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/GlobalCategorizer.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/GlobalCategorizer.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,116 @@
+package org.drools.learner.eval;
+
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.drools.learner.DecisionTree;
+import org.drools.learner.Domain;
+import org.drools.learner.Instance;
+import org.drools.learner.InstanceList;
+import org.drools.learner.Memory;
+import org.drools.learner.QuantitativeDomain;
+import org.drools.learner.tools.FeatureNotSupported;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+
+public class GlobalCategorizer {
+
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(GlobalCategorizer.class, SimpleLogger.DEFAULT_LEVEL);
+ private static SimpleLogger slog = LoggerFactory.getSysOutLogger(GlobalCategorizer.class, SimpleLogger.DEFAULT_LEVEL);
+
+ public GlobalCategorizer(Memory mem) {
+ InstanceList class_instances = mem.getClassInstances();
+
+ if (class_instances.getTargets().size()>1) {
+ //throw new FeatureNotSupported("There is more than 1 target candidates");
+ if (flog.error() !=null)
+ flog.error().log("There is more than 1 target candidates");
+
+ System.exit(0);
+ // TODO put the feature not supported exception || implement it
+ }
+ build(class_instances);
+
+
+ }
+
+ public void build(InstanceList working_instances) {
+
+ Iterator<String> it_target= working_instances.getTargets().iterator();
+ String target = it_target.next();
+
+ DecisionTree dt = new DecisionTree(working_instances.getSchema(), target);
+
+ //flog.debug("Num of attributes: "+ dt.getAttrDomains().size());
+
+ InstDistribution stats_by_class = new InstDistribution(dt.getTargetDomain());
+ stats_by_class.calculateDistribution(working_instances.getInstances());
+ dt.FACTS_READ += working_instances.getSize();//
+
+ categorize(stats_by_class, dt.getAttrDomains());
+ //flog.debug("Result tree\n" + dt);
+ return;// dt;
+ }
+
+ public void categorize(InstDistribution insts_by_target, List<Domain> attr_domains) {
+
+ for (int attr_idx = 0 ; attr_idx< attr_domains.size(); attr_idx++) {
+ Domain attr_domain = attr_domains.get(attr_idx);
+ /* No need to clone the domain as soon as no need to change the domain
+ * All domains are categorical so i will use them the way they are
+ */
+ if (attr_domain.isCategorical()) {
+ // do nothing
+ } else {
+// the continuous domain
+
+ QuantitativeDomain trialDomain = QuantitativeDomain.createFromDomain(attr_domain);
+ Categorizer visitor = new Categorizer(insts_by_target);
+ visitor.findSplits(trialDomain);
+
+// trial domain is modified
+ if (trialDomain.getNumIndices()==1) {
+ } else {
+ }
+
+ InformationContainer categorized_eval = new InformationContainer();
+ categorized_eval.domain = trialDomain;
+ categorized_eval.sorted_data = visitor.getSortedInstances();
+
+
+ Hashtable<Object, InstDistribution> filtered_stats = null;
+ try {
+ filtered_stats = insts_by_target.split(categorized_eval);
+
+ /* need to create a fake domain from trial domain
+ * with possible number of values = trialDomain.trialDomain.getNumIndices();
+ */
+ trialDomain.setFName(attr_domain.getFName()+"_fake"); // TODO how do we know whose fake copy is that domain
+ trialDomain.setCategorical(true);
+
+ for (Object category: filtered_stats.keySet()) {
+ InstDistribution category_dist = filtered_stats.get(category);
+
+ for (int target_cat = 0; target_cat<insts_by_target.getClassDomain().getCategoryCount(); target_cat++) {
+ Object targetCategory = insts_by_target.getClassDomain().getCategory(target_cat);
+ for (Instance i : category_dist.getSupportersFor(targetCategory)) {
+ i.setAttr(attr_domain.getFName()+"_fake", category);
+ }
+ }
+
+
+ }
+ attr_domains.add(trialDomain);
+
+ } catch (FeatureNotSupported e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+ }
+ return;
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/GlobalCategorizer.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Heuristic.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Heuristic.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Heuristic.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,31 @@
+package org.drools.learner.eval;
+
+import java.util.ArrayList;
+
+import org.drools.learner.Domain;
+import org.drools.learner.Instance;
+
+
+public interface Heuristic {
+
+ public void init(InstDistribution _insts_by_target);
+
+ public double getEval(Domain attr_domain);
+ public double getEval_cont(Domain attr_domain);
+
+ public Domain getDomain();
+ public ArrayList<Instance> getSortedInstances();
+
+ public double getWorstEval();
+
+// public abstract double info_attr(InstDistribution insts_by_target, Domain attr_domain);
+// public abstract double info_contattr(List<Instance> data, Domain targetDomain, QuantitativeDomain splitDomain);
+//
+// public abstract double calc_info_attr( CondClassDistribution instances_by_attr);
+// public abstract double calc_info(ClassDistribution quantity_by_class);
+
+
+
+
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Heuristic.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassAnnotation.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassAnnotation.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassAnnotation.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,8 @@
+package org.drools.learner.tools;
+import java.lang.annotation.*;
+
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target({ElementType.TYPE})
+public @interface ClassAnnotation {
+ String label_element() default "";
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassAnnotation.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassLogger.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassLogger.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassLogger.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,92 @@
+package org.drools.learner.tools;
+
+import java.io.Writer;
+
+public class ClassLogger {
+
+ public static enum LogLevel { NO , STAT, ERROR, WARN, DEBUG, INF0}
+ private static final LogLevel DEFAULT_LEVEL = LogLevel.ERROR;
+
+ /*
+ 4 - info
+ 3 - debug
+ 2 - warning
+ 1 - error
+ 0 - nothing
+ */
+ public LogLevel level = DEFAULT_LEVEL;
+
+ private Class<?> klass;
+ private Writer w;
+
+ public ClassLogger(Class<?> _class, Writer _w) {
+ klass =_class;
+ w= _w;
+ }
+
+ public ClassLogger(Class<?> _class, Writer _w, LogLevel _level) {
+ klass = _class;
+ level = _level;
+ w = _w;
+ }
+
+
+ public void stat(String s) {
+ //if (level.compareTo(LogLevel.STAT) >= 0) {
+ if (level.ordinal() >= LogLevel.STAT.ordinal()) {
+ try {
+ w.write(s);
+ //w.flush();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ public void info(String s) {
+ //if (level.compareTo(LogLevel.INF0) >= 0) {
+ if (level.ordinal() >= LogLevel.INF0.ordinal()) {
+ try {
+ w.write(("[info](" + klass.getSimpleName() + ") " +s));
+ //w.flush();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public void debug(String s) {
+ //if (level.compareTo(LogLevel.DEBUG) >= 0) {
+ if (level.ordinal() >= LogLevel.DEBUG.ordinal()) {
+ try {
+ w.write(("[debug](" + klass.getSimpleName() + ") " +s));
+ //w.flush();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public void warn(String s) {
+ //if (level.compareTo(LogLevel.WARN) >= 0) {
+ if (level.ordinal() >= LogLevel.WARN.ordinal()) {
+ try {
+ w.write(("[warn](" + klass.getSimpleName() + ") " +s));
+ //w.flush();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public void error(String s) {
+ //if (level.compareTo(LogLevel.ERROR) >= 0) {
+ if (level.ordinal() >= LogLevel.ERROR.ordinal()) {
+ try {
+ w.write(("[error](" + klass.getSimpleName() + ") " +s));
+ //w.flush();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassLogger.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassStructure.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassStructure.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassStructure.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,76 @@
+package org.drools.learner.tools;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+
+import org.drools.learner.builder.Learner.DataType;
+
+public class ClassStructure {
+ private Class<?> klass, parent_klass;
+
+ private ArrayList<Method> methods;
+
+// private ArrayList<Field> fields;
+// private ArrayList<DataType> field_types;
+ private HashMap<Field, DataType> field_structure;
+
+ private boolean done;
+
+ public ClassStructure(Class<?> _klass) {
+ klass = _klass;
+ done = false;
+ field_structure = new HashMap<Field, DataType>();
+ methods = new ArrayList<Method>();
+ }
+
+
+ public void setDone() {
+ done = true;
+ }
+ public boolean isDone() {
+ return done;
+ }
+
+
+ public void addField(Field f, DataType type) {
+// fields.add(f);
+// field_types.add(type);
+ field_structure.put(f, type);
+ }
+
+ public Collection<Field> getFields() {
+ //return fields.iterator();
+ return field_structure.keySet();
+ }
+
+ public DataType getFieldType(Field f) {
+ return field_structure.get(f);
+ }
+ public boolean hasLabel() {
+ return methods.size()>0;
+ }
+ public Collection<Method> getMethods() {
+ return methods;
+ }
+ public void addMethod(Method m) {
+ methods.add(m);
+ }
+ public Class<?> getOwnerClass() {
+ return klass;
+ }
+
+ public Class<?> getParent() {
+ return parent_klass;
+ }
+
+ public void setParent(Class<?> parent) {
+ parent_klass = parent;
+ }
+
+
+
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassStructure.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassVisitor.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassVisitor.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassVisitor.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,213 @@
+package org.drools.learner.tools;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+
+import org.drools.base.ClassFieldExtractorCache;
+import org.drools.learner.Domain;
+import org.drools.learner.Schema;
+import org.drools.learner.builder.Learner;
+import org.drools.learner.builder.Learner.DataType;
+import org.drools.learner.builder.Learner.DomainAlgo;
+import org.drools.spi.Extractor;
+
+public class ClassVisitor {
+ private static ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
+
+ private DomainAlgo domain_type = Learner.DEFAULT_DOMAIN;
+ private DataType data_type = Learner.DEFAULT_DATA;
+
+// private HashMap<Class<?>, ClassStructure> all_klasses;
+
+// // key: field name
+// private Hashtable<String, Extractor> extractorMap;
+//
+// // key: field name
+// private Hashtable<String, Domain> domainMap;
+//
+// private HashSet<String> targets;
+ private Schema class_schema;
+
+ private boolean TARGET_FOUND;
+ private boolean MULTIPLE_TARGETS = false;
+
+
+ public ClassVisitor (DomainAlgo _domain_type, DataType _data_type) {
+ domain_type = _domain_type;
+ data_type = _data_type;
+
+ }
+
+ public ClassVisitor (Schema _class_schema, DomainAlgo _domain_type, DataType _data_type) {
+ domain_type = _domain_type;
+ data_type = _data_type;
+
+ this.class_schema = _class_schema;
+ }
+
+ // new one
+ public void visit() throws FeatureNotSupported {
+// this.all_klasses = new HashMap<Class<?>,ClassStructure>();
+ TARGET_FOUND = false;
+ getStructuredSuperFields(class_schema.getObjectClass());
+ return;
+ }
+
+ public void visit(Class<?> clazz) throws FeatureNotSupported {
+ class_schema = new Schema(clazz);
+// this.all_klasses = new HashMap<Class<?>,ClassStructure>();
+ getStructuredSuperFields(clazz);
+ return;
+ }
+
+ public HashMap<Class<?>,ClassStructure> getStructure() {
+ return class_schema.getClassStructure();
+ }
+
+
+ public void getStructuredSuperFields(Class<?> clazz) throws FeatureNotSupported {
+ System.out.println("On the class "+ clazz);
+ System.out.println(" the structure exists "+ class_schema.getClassStructure().containsKey(clazz));
+ if (clazz.equals(Object.class) ||
+ (class_schema.getClassStructure().containsKey(clazz) && class_schema.getClassStructure().get(clazz).isDone()))
+ return;
+
+ ClassStructure structure = new ClassStructure(clazz);
+ if (MULTIPLE_TARGETS || !TARGET_FOUND)
+ processClassLabel(structure);
+ class_schema.putStructure(clazz, structure);
+ // get the fields declared in the class
+ Field [] element_fields = clazz.getDeclaredFields(); //clazz.getFields();
+ for (Field f: element_fields) {
+ decomposeField(structure, f);
+ }
+
+ structure.setDone();
+
+ Class<?> parent_klass = clazz.getSuperclass();
+ structure.setParent(parent_klass);
+ getStructuredSuperFields(parent_klass);
+
+ return;
+ }
+
+ public void decomposeField(ClassStructure structure, Field f) throws FeatureNotSupported {
+ // can get the field annotation
+ // if it is ignored do not do anything
+ FieldAnnotation f_spec = Util.getFieldAnnotations(f);
+ boolean skip_by_annotation = false;
+ if (f_spec != null) {
+ // the type of the fields that cannot be processed
+ if (!f_spec.ignore() && f.getType() == String.class && !f_spec.discrete()) {
+ throw new FeatureNotSupported("String categorization not supported");
+ }
+ switch (domain_type) {
+ case CATEGORICAL: //ID3 can work only with categorical types
+ if (f_spec.ignore() || !f_spec.discrete())
+ skip_by_annotation = true;
+ break;
+ case QUANTITATIVE: // C45 can work with categorical || quantitative domain
+ if (f_spec.ignore())
+ skip_by_annotation = true;
+ break;
+ default:
+ if (f_spec.ignore())
+ skip_by_annotation = true;
+ }
+ // only if the annotations are given and the flag to ignore is set true
+ // then continue to next field
+
+ }
+ if (!skip_by_annotation) {
+ String f_name= f.getName();
+ Class<?> _obj_klass = structure.getOwnerClass();
+ DataType d_type = Util.getDataType(f.getType());
+
+ ///////////
+ if (d_type != DataType.COLLECTION) { // TODO
+ Extractor f_extractor = cache.getExtractor( _obj_klass, f_name , _obj_klass.getClassLoader() );
+ class_schema.putExtractor(f_name, f_extractor);
+ structure.addField(f, d_type);
+ }
+
+ ///////////
+
+ switch (d_type) {
+ case PRIMITIVE: // domain will be created only for primitive types
+ Domain fieldDomain = new Domain(f_name, f.getType());
+ if (f_spec != null) {
+ fieldDomain.setCategorical(f_spec.discrete());
+ if ((MULTIPLE_TARGETS || !TARGET_FOUND) && f_spec.target()) {
+ class_schema.addTarget(f.getName());
+ TARGET_FOUND = true;
+ }
+ }
+ Util.processDomain(fieldDomain, f.getType());
+
+ class_schema.putDomain(f_name, fieldDomain);
+// Extractor f_extractor = cache.getExtractor( _obj_klass, f_name , _obj_klass.getClassLoader() );
+// class_schema.putExtractor(f_name, f_extractor);
+// structure.addField(f, d_type);
+ break;
+ case STRUCTURED: // the extractor is necessary for both types of data.
+// ClassFieldExtractor complex_f_extractor = cache.getExtractor( _obj_klass, f_name , _obj_klass.getClassLoader() );
+// class_schema.putExtractor(f_name, complex_f_extractor);
+// structure.addField(f, d_type);
+ getStructuredSuperFields(f.getType());//recurse on the structured
+ break;
+ case COLLECTION:
+ throw new FeatureNotSupported("Can not deal with collections as an attribute");
+ default:
+ //throw new Exception("What type of data is this");
+ }
+ }
+ return;
+ }
+
+ public void processClassLabel(ClassStructure clazz_structure) {
+
+ Class<?> clazz = clazz_structure.getOwnerClass();
+ /* Apperantly the getAnnotation function recurse on the superclasses
+ * so use the getDeclaredAnnotations() not to recurse
+ */
+ ClassAnnotation class_label = Util.getDecClassAnnotations(clazz);
+ if (class_label != null && class_label.label_element() != "") {
+ // the targetting label is set, put the function that gets that value somewhere
+
+ try {
+ /* Apperantly the getMethod function recurse on the superclasses
+ * i dont need to recurse myself
+ Method m =c.getDeclaredMethod(lab.label_element(), null);
+ */
+ Method m = clazz.getMethod(class_label.label_element(), null);
+
+ if (Util.isSimpleType(m.getReturnType())) {
+ Domain fieldDomain = new Domain(class_label.label_element(), m.getReturnType());
+ fieldDomain.setArtificial(true);
+ Class<?> method_class = m.getReturnType();
+ Util.processDomain(fieldDomain, method_class);
+ clazz_structure.addMethod(m);
+ class_schema.putDomain(class_label.label_element(), fieldDomain);
+
+ Extractor m_extractor = new PseudoFieldExtractor(clazz, m);
+ //cache.getExtractor( clazz, lab.label_element(), clazz.getClassLoader() );
+ class_schema.putExtractor(class_label.label_element(), m_extractor);
+ if (!MULTIPLE_TARGETS)
+ class_schema.clearTargets();
+ class_schema.addTarget(class_label.label_element());
+ TARGET_FOUND = true;
+ //break; // if the ClassAnnotation is found then stop
+ }
+
+ } catch (SecurityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (NoSuchMethodException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassVisitor.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/LogMethod.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/LogMethod.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/LogMethod.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,7 @@
+package org.drools.learner.tools;
+
+import java.io.Writer;
+
+public interface LogMethod {
+ void log(Object o, Writer w);
+}
\ No newline at end of file
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/LogMethod.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/Logger.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/Logger.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/Logger.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,71 @@
+package org.drools.learner.tools;
+
+import java.io.Writer;
+
+
+public class Logger {
+ public static enum LogLevel_ { NULL, STAT, ERROR, WARN, DEBUG, INFO; }
+
+ private static NullLogMethod null_log = new NullLogMethod();
+
+ private Writer writer;
+ private Class<?> klass;
+ private LogMethod stat_m = null_log, error_m = null_log, warn_m = null_log,
+ debug_m = null_log, info_m = null_log ;
+
+ public Logger(Class<?> _class, Writer w) {
+ klass = _class;
+ writer = w;
+ }
+ public void setVerbosity(LogLevel_ lvl) {
+// switch (lvl) {
+// case INFO:
+// info_m = new SimpleLogMethod();;
+// case DEBUG:
+// debug_m = new SimpleLogMethod();
+// case WARN:
+// warn_m = new SimpleLogMethod();
+// case ERROR:
+// error_m = new SimpleLogMethod();
+// case STAT:
+// stat_m = new SimpleLogMethod();
+// case NULL:
+// }
+ }
+
+ public void stat(Object o) {
+ stat_m.log(o, writer);//"[stat](" + klass.getSimpleName() + ") " +
+ }
+
+ public void error(Object o) {
+ error_m.log("[error](" + klass.getSimpleName() + ") " + o, writer);
+ }
+
+ public void warn(Object o) {
+ warn_m.log("[warn](" + klass.getSimpleName() + ") " + o, writer);
+ }
+
+ public void debug(Object o) {
+ debug_m.log("[debug](" + klass.getSimpleName() + ") " + o, writer);
+ }
+
+ public void info(Object o) {
+ info_m.log("[info](" + klass.getSimpleName() + ") " + o, writer);
+ }
+}
+
+
+class NullLogMethod implements LogMethod {
+ public void log(Object o, Writer w) {}
+}
+
+//class SimpleLogMethod implements LogMethod {
+// public void log(Object o, Writer w) {
+// try {
+// w.write(o.toString());
+// w.flush();
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+// }
+//}
\ No newline at end of file
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/Logger.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/LoggerFactory.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/LoggerFactory.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/LoggerFactory.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,117 @@
+package org.drools.learner.tools;
+
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.HashMap;
+
+public class LoggerFactory {
+
+ private static BufferedWriter buffer = new BufferedWriter(new StringWriter());
+ private static HashMap<Class<?>, SimpleLogger> fileLoggers = new HashMap<Class<?>, SimpleLogger>();
+
+ public static SimpleLogger getUniqueFileLogger(Class<?> klass, int level) {
+ SimpleLogger sl = fileLoggers.get(klass);
+ if (sl == null) {
+ sl = new SimpleLogger(level, new WriterLogger(klass, buffer));
+ fileLoggers.put(klass, sl);
+ }
+ return sl;
+ }
+
+ public static SimpleLogger getSysOutLogger(Class<?> klass, int level) {
+ return new SimpleLogger(level, new SysOutLogger(klass));
+ }
+
+ public static SimpleLogger getFileLogger(Class<?> klass, int level, String fname) {
+ FileWriter file;
+ try {
+ file = new FileWriter("log/"+fname);
+ return new SimpleLogger(level, new WriterLogger(klass, file));
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static void dump_buffer(String file_sign, String directory) {
+ // TODO Auto-generated method stub
+
+ int last_slash = file_sign.lastIndexOf('/');
+ String file_name = file_sign.substring(0, last_slash+1) + directory+file_sign.substring(last_slash)+"."+directory;
+ System.out.println(file_name);
+
+ PrintWriter writer;
+ try {
+ writer = new PrintWriter (new BufferedWriter (new FileWriter (file_name)));
+ writer.write(buffer.toString());
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+
+}
+
+class SysOutLogger implements LoggerInterface {
+ private Class<?> klass;
+ private String msg;
+ public SysOutLogger(Class<?> _klass) {
+ klass = _klass;
+ }
+
+ public void setMsg(String _msg) {
+ msg = _msg;
+ }
+ public void stat(String s) {
+ System.out.print(s);
+ }
+ public void log(String s) {
+ System.out.print("["+msg + "] ("+klass.getSimpleName()+ ") "+ s);
+ }
+ public SysOutLogger clone() {
+ // TODO Auto-generated method stub
+ return new SysOutLogger(klass);
+ }
+}
+
+class WriterLogger implements LoggerInterface {
+ private Writer writer;
+ private Class<?> klass;
+ private String msg;
+ public WriterLogger(Class<?> _klass, Writer w) {
+ writer = w;
+ klass = _klass;
+ }
+ public void stat(String s) {
+ try {
+ writer.write(s);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void log(String s) {
+ try {
+ writer.write("["+msg + "] ("+klass.getSimpleName()+ ") "+ s);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setMsg(String s) {
+ msg = s;
+
+ }
+ @Override
+ public WriterLogger clone() {
+ // TODO Auto-generated method stub
+ return new WriterLogger(klass, writer);
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/LoggerFactory.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/LoggerInterface.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/LoggerInterface.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/LoggerInterface.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,10 @@
+package org.drools.learner.tools;
+
+public interface LoggerInterface {
+ void log(String s);
+ void stat(String s);
+
+ void setMsg(String s) ;
+
+ LoggerInterface clone();
+}
\ No newline at end of file
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/LoggerInterface.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/PseudoFieldExtractor.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/PseudoFieldExtractor.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/PseudoFieldExtractor.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,117 @@
+package org.drools.learner.tools;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import org.drools.base.ValueType;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.spi.Extractor;
+
+public class PseudoFieldExtractor implements Extractor{
+
+ //private String methodName;
+ private Method method;
+ //private Class clazz;
+
+ public PseudoFieldExtractor(Class<?> _clazz, Method m) {
+ method = m;
+ //clazz = _clazz;
+ }
+
+ public boolean getBooleanValue(InternalWorkingMemory workingMemory,
+ Object object) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public byte getByteValue(InternalWorkingMemory workingMemory, Object object) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public char getCharValue(InternalWorkingMemory workingMemory, Object object) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public double getDoubleValue(InternalWorkingMemory workingMemory,
+ Object object) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public Class getExtractToClass() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String getExtractToClassName() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public float getFloatValue(InternalWorkingMemory workingMemory,
+ Object object) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public int getHashCode(InternalWorkingMemory workingMemory, Object object) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public int getIntValue(InternalWorkingMemory workingMemory, Object object) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public long getLongValue(InternalWorkingMemory workingMemory, Object object) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public Method getNativeReadMethod() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public short getShortValue(InternalWorkingMemory workingMemory,
+ Object object) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public Object getValue(InternalWorkingMemory workingMemory, Object object) {
+ try {
+ return method.invoke(object, null);
+ } catch (IllegalArgumentException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public ValueType getValueType() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public boolean isGlobal() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public boolean isNullValue(InternalWorkingMemory workingMemory,
+ Object object) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/PseudoFieldExtractor.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/SimpleLogger.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/SimpleLogger.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/SimpleLogger.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,62 @@
+package org.drools.learner.tools;
+
+
+public class SimpleLogger {
+
+ public static final int STAT = 0;
+ public static final int ERROR = 1;
+ public static final int WARN = 2;
+ public static final int DEBUG = 3;
+ public static final int INFO = 4;
+
+ public static final int DEFAULT_LEVEL = ERROR;
+
+ public static String[] msgs = {"stat","error", "warn", "debug", "info"};
+
+ public static final int LAST = INFO;
+
+ public LoggerInterface[] loggers = new LoggerInterface[LAST+1];
+
+ public SimpleLogger() {
+
+ for (int i = 0; i <= LAST; ++i) {
+ loggers[i] = null;
+ }
+ }
+
+ public SimpleLogger(int _lvl, LoggerInterface _logint) {
+ for (int i = 0; i <= LAST; ++i) {
+ if (i > _lvl)
+ loggers[i] = null;
+ else {
+ loggers[i] = _logint.clone();
+ loggers[i].setMsg(msgs[i]);
+ }
+ }
+ }
+
+ public final LoggerInterface get(int _index) {
+ return loggers[_index];
+ }
+
+ public final LoggerInterface stat() {
+ return loggers[STAT];
+ }
+
+ public final LoggerInterface error() {
+ return loggers[ERROR];
+ }
+
+ public final LoggerInterface warn() {
+ return loggers[WARN];
+ }
+
+ public final LoggerInterface debug() {
+ return loggers[DEBUG];
+ }
+
+ public final LoggerInterface info() {
+ return loggers[INFO];
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/SimpleLogger.java
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExample.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExample.java 2008-06-15 14:55:50 UTC (rev 20502)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExample.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -37,19 +37,42 @@
}
// instantiate a learner for a specific object class and pass session to train
- DecisionTree decision_tree; int ALGO = 2;
+ DecisionTree decision_tree; int ALGO = 111;
+ /*
+ * Single 1xx, Bag 2xx, Boost 3xx
+ * ID3 x1x, C45 x2x
+ * Entropy xx1, Gain xx2
+ */
switch (ALGO) {
- case 1:
- decision_tree = DecisionTreeFactory.createBaggedC45(session, obj_class);
+ case 111:
+ decision_tree = DecisionTreeFactory.createSingleID3E(session, obj_class);
break;
- case 2:
- decision_tree = DecisionTreeFactory.createBoostedC45(session, obj_class);
+ case 112:
+ decision_tree = DecisionTreeFactory.createSingleID3G(session, obj_class);
break;
- case 3:
- decision_tree = DecisionTreeFactory.createSingleID3(session, obj_class);
+ case 121:
+ decision_tree = DecisionTreeFactory.createSingleC45E(session, obj_class);
break;
+ case 122:
+ decision_tree = DecisionTreeFactory.createSingleC45G(session, obj_class);
+ break;
+ case 221:
+ decision_tree = DecisionTreeFactory.createBagC45E(session, obj_class);
+ break;
+ case 222:
+ decision_tree = DecisionTreeFactory.createBagC45G(session, obj_class);
+ break;
+ case 321:
+ decision_tree = DecisionTreeFactory.createBoostedC45E(session, obj_class);
+ break;
+ case 322:
+ decision_tree = DecisionTreeFactory.createBoostedC45G(session, obj_class);
+ break;
+// case 3:
+// decision_tree = DecisionTreeFactory.createGlobal2(session, obj_class);
+// break;
default:
- decision_tree = DecisionTreeFactory.createSingleC45(session, obj_class);
+ decision_tree = DecisionTreeFactory.createSingleID3E(session, obj_class);
}
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExampleFromDrl.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExampleFromDrl.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExampleFromDrl.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,64 @@
+package org.drools.examples.learner;
+
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.List;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
+import org.drools.audit.WorkingMemoryFileLogger;
+import org.drools.compiler.PackageBuilder;
+import org.drools.event.DebugAgendaEventListener;
+import org.drools.event.DebugWorkingMemoryEventListener;
+import org.drools.learner.tools.ObjectFactory;
+import org.drools.rule.Package;
+
+public class CarExampleFromDrl {
+
+ public static final void main(final String[] args) throws Exception {
+ //read in the source
+ //final Reader source = new InputStreamReader( HelloWorldExample.class.getResourceAsStream( "HelloWorld.drl" ) );
+ final Reader source = new InputStreamReader( Car.class.getResourceAsStream( "car_c45_boost2.drl" ) );
+
+ final PackageBuilder builder = new PackageBuilder();
+
+ //this wil parse and compile in one step
+ builder.addPackageFromDrl( source );
+
+ // Check the builder for errors
+ if ( builder.hasErrors() ) {
+ System.out.println( builder.getErrors().toString() );
+ throw new RuntimeException( "Unable to compile \"car_c45_boost2.drl\".");
+ }
+
+ //get the compiled package (which is serializable)
+ final Package pkg = builder.getPackage();
+
+ //add the package to a rulebase (deploy the rule package).
+ final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ruleBase.addPackage( pkg );
+
+ final StatefulSession session = ruleBase.newStatefulSession();
+
+ session.addEventListener( new DebugAgendaEventListener() );
+ session.addEventListener( new DebugWorkingMemoryEventListener() );
+
+ final WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger( session );
+ logger.setFileName( "log/car_c45_boost2" );
+
+ String inputFile = new String("data/car/car.data.txt");
+ Class<?> obj_class = Car.class;
+ List<Object> facts = ObjectFactory.getObjects(obj_class, inputFile);
+ for (Object r : facts) {
+ session.insert(r);
+ }
+
+ session.fireAllRules();
+
+ logger.writeToDisk();
+
+ session.dispose();
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExampleFromDrl.java
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/GolfExample.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/GolfExample.java 2008-06-15 14:55:50 UTC (rev 20502)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/GolfExample.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -40,35 +40,42 @@
session.insert(r);
}
- // instantiate a learner for a specific object class and pass session to train
- DecisionTree decision_tree; int ALGO = 7;
+ DecisionTree decision_tree; int ALGO = 111;
+ /*
+ * Single 1xx, Bag 2xx, Boost 3xx
+ * ID3 x1x, C45 x2x
+ * Entropy xx1, Gain xx2
+ */
switch (ALGO) {
- case 1:
- decision_tree = DecisionTreeFactory.createBaggedC45(session, obj_class);
+ case 111:
+ decision_tree = DecisionTreeFactory.createSingleID3E(session, obj_class);
break;
- case 2:
- decision_tree = DecisionTreeFactory.createBoostedC45(session, obj_class);
+ case 112:
+ decision_tree = DecisionTreeFactory.createSingleID3G(session, obj_class);
break;
- case 3:
- decision_tree = DecisionTreeFactory.createGlobal2(session, obj_class);
- break;
- case 4:
- decision_tree = DecisionTreeFactory.createBagC45Entropy(session, obj_class);
- break;
- case 5:
- decision_tree = DecisionTreeFactory.createBagC45GainRatio(session, obj_class);
- break;
- case 6:
- decision_tree = DecisionTreeFactory.createSingleID3(session, obj_class);
- break;
- case 7:
- decision_tree = DecisionTreeFactory.createSingleC45Entropy(session, obj_class);
+ case 121:
+ decision_tree = DecisionTreeFactory.createSingleC45E(session, obj_class);
break;
- case 8:
- decision_tree = DecisionTreeFactory.createSingleC45GainRatio(session, obj_class);
+ case 122:
+ decision_tree = DecisionTreeFactory.createSingleC45G(session, obj_class);
break;
+ case 221:
+ decision_tree = DecisionTreeFactory.createBagC45E(session, obj_class);
+ break;
+ case 222:
+ decision_tree = DecisionTreeFactory.createBagC45G(session, obj_class);
+ break;
+ case 321:
+ decision_tree = DecisionTreeFactory.createBoostedC45E(session, obj_class);
+ break;
+ case 322:
+ decision_tree = DecisionTreeFactory.createBoostedC45G(session, obj_class);
+ break;
+// case 3:
+// decision_tree = DecisionTreeFactory.createGlobal2(session, obj_class);
+// break;
default:
- decision_tree = DecisionTreeFactory.createSingleC45(session, obj_class);
+ decision_tree = DecisionTreeFactory.createSingleID3E(session, obj_class);
}
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/NurseryExample.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/NurseryExample.java 2008-06-15 14:55:50 UTC (rev 20502)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/NurseryExample.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -38,7 +38,7 @@
// instantiate a learner for a specific object class and pass session to train
//Learner learner = LearnerFactory.createID3(session, obj_class);
- DecisionTree dt_builder = DecisionTreeFactory.createBaggedC45(session, obj_class);
+ DecisionTree dt_builder = DecisionTreeFactory.createBagC45E(session, obj_class);
final PackageBuilder builder = new PackageBuilder();
//this wil generate the rules, then parse and compile in one step
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/PokerExample.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/PokerExample.java 2008-06-15 14:55:50 UTC (rev 20502)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/PokerExample.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -36,20 +36,42 @@
}
// instantiate a learner for a specific object class and pass session to train
- // instantiate a learner for a specific object class and pass session to train
- DecisionTree decision_tree; int ALGO = 2;
+ DecisionTree decision_tree; int ALGO = 111;
+ /*
+ * Single 1xx, Bag 2xx, Boost 3xx
+ * ID3 x1x, C45 x2x
+ * Entropy xx1, Gain xx2
+ */
switch (ALGO) {
- case 1:
- decision_tree = DecisionTreeFactory.createBaggedC45(session, obj_class);
+ case 111:
+ decision_tree = DecisionTreeFactory.createSingleID3E(session, obj_class);
break;
- case 2:
- decision_tree = DecisionTreeFactory.createBoostedC45(session, obj_class);
+ case 112:
+ decision_tree = DecisionTreeFactory.createSingleID3G(session, obj_class);
break;
- case 3:
- decision_tree = DecisionTreeFactory.createSingleID3(session, obj_class);
+ case 121:
+ decision_tree = DecisionTreeFactory.createSingleC45E(session, obj_class);
break;
+ case 122:
+ decision_tree = DecisionTreeFactory.createSingleC45G(session, obj_class);
+ break;
+ case 221:
+ decision_tree = DecisionTreeFactory.createBagC45E(session, obj_class);
+ break;
+ case 222:
+ decision_tree = DecisionTreeFactory.createBagC45G(session, obj_class);
+ break;
+ case 321:
+ decision_tree = DecisionTreeFactory.createBoostedC45E(session, obj_class);
+ break;
+ case 322:
+ decision_tree = DecisionTreeFactory.createBoostedC45G(session, obj_class);
+ break;
+// case 3:
+// decision_tree = DecisionTreeFactory.createGlobal2(session, obj_class);
+// break;
default:
- decision_tree = DecisionTreeFactory.createSingleC45(session, obj_class);
+ decision_tree = DecisionTreeFactory.createSingleID3E(session, obj_class);
}
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/PokerExampleFromDrl.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/PokerExampleFromDrl.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/PokerExampleFromDrl.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,64 @@
+package org.drools.examples.learner;
+
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.List;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
+import org.drools.audit.WorkingMemoryFileLogger;
+import org.drools.compiler.PackageBuilder;
+import org.drools.event.DebugAgendaEventListener;
+import org.drools.event.DebugWorkingMemoryEventListener;
+import org.drools.learner.tools.ObjectFactory;
+import org.drools.rule.Package;
+
+public class PokerExampleFromDrl {
+
+ public static final void main(final String[] args) throws Exception {
+ //read in the source
+ //final Reader source = new InputStreamReader( HelloWorldExample.class.getResourceAsStream( "HelloWorld.drl" ) );
+ final Reader source = new InputStreamReader( Restaurant.class.getResourceAsStream( "poker_c45_bag.drl" ) );
+
+ final PackageBuilder builder = new PackageBuilder();
+
+ //this wil parse and compile in one step
+ builder.addPackageFromDrl( source );
+
+ // Check the builder for errors
+ if ( builder.hasErrors() ) {
+ System.out.println( builder.getErrors().toString() );
+ throw new RuntimeException( "Unable to compile \"poker2.drl\".");
+ }
+
+ //get the compiled package (which is serializable)
+ final Package pkg = builder.getPackage();
+
+ //add the package to a rulebase (deploy the rule package).
+ final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ruleBase.addPackage( pkg );
+
+ final StatefulSession session = ruleBase.newStatefulSession();
+
+ session.addEventListener( new DebugAgendaEventListener() );
+ session.addEventListener( new DebugWorkingMemoryEventListener() );
+
+ final WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger( session );
+ logger.setFileName( "log/poker_c45_bag_fromdrl" );
+
+ String inputFile = new String("data/poker/poker-hand-training-true.data.txt");
+ Class<?> obj_class = Poker.class;
+ List<Object> facts = ObjectFactory.getObjects(obj_class, inputFile);
+ for (Object r : facts) {
+ session.insert(r);
+ }
+
+ session.fireAllRules();
+
+ logger.writeToDisk();
+
+ session.dispose();
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/PokerExampleFromDrl.java
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/RestaurantExample.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/RestaurantExample.java 2008-06-15 14:55:50 UTC (rev 20502)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/RestaurantExample.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -31,17 +31,55 @@
final WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger( session );
logger.setFileName( "log/restaurants" );
+ Class<?> obj_class = Restaurant.class;
List<Object> facts = getRestaurants();
for (Object r : facts) {
session.insert(r);
}
// instantiate a learner for a specific object class and pass session to train
- DecisionTree dt_builder = DecisionTreeFactory.createSingleID3(session, Restaurant.class);
+ DecisionTree decision_tree; int ALGO = 111;
+ /*
+ * Single 1xx, Bag 2xx, Boost 3xx
+ * ID3 x1x, C45 x2x
+ * Entropy xx1, Gain xx2
+ */
+ switch (ALGO) {
+ case 111:
+ decision_tree = DecisionTreeFactory.createSingleID3E(session, obj_class);
+ break;
+ case 112:
+ decision_tree = DecisionTreeFactory.createSingleID3G(session, obj_class);
+ break;
+ case 121:
+ decision_tree = DecisionTreeFactory.createSingleC45E(session, obj_class);
+ break;
+ case 122:
+ decision_tree = DecisionTreeFactory.createSingleC45G(session, obj_class);
+ break;
+ case 221:
+ decision_tree = DecisionTreeFactory.createBagC45E(session, obj_class);
+ break;
+ case 222:
+ decision_tree = DecisionTreeFactory.createBagC45G(session, obj_class);
+ break;
+ case 321:
+ decision_tree = DecisionTreeFactory.createBoostedC45E(session, obj_class);
+ break;
+ case 322:
+ decision_tree = DecisionTreeFactory.createBoostedC45G(session, obj_class);
+ break;
+// case 3:
+// decision_tree = DecisionTreeFactory.createGlobal2(session, obj_class);
+// break;
+ default:
+ decision_tree = DecisionTreeFactory.createSingleID3E(session, obj_class);
+
+ }
final PackageBuilder builder = new PackageBuilder();
//this wil generate the rules, then parse and compile in one step
- builder.addPackageFromTree( dt_builder );
+ builder.addPackageFromTree( decision_tree );
ruleBase.addPackage( builder.getPackage() );
/*
final Reader source = new InputStreamReader( HelloWorldExample.class.getResourceAsStream( "HelloWorld.drl" ) );
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/Triangle.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/Triangle.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/Triangle.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,54 @@
+package org.drools.examples.learner;
+
+import org.drools.learner.tools.ClassAnnotation;
+import org.drools.learner.tools.FieldAnnotation;
+
+
+ at ClassAnnotation(label_element = "getLabel")
+public class Triangle {
+
+ @FieldAnnotation(readingSeq = 0, discrete = false)
+ private double x;
+
+ @FieldAnnotation(readingSeq = 1, discrete = false)
+ private double y;
+
+ @FieldAnnotation(readingSeq = 2, discrete = false)
+ private double z;
+
+ /* Triangle rules
+ * - The sum of every two sides of a triangle must be greater than the third side.
+ * or
+ * - The length of any side of a triangle is greater than the absolute difference
+ * of the lengths of the other two sides
+ */
+ public boolean getLabel() {
+ return (z < x + y) && (x < z + y) && (y < x + z);
+ }
+ public Triangle() {
+
+ }
+ public Triangle(double[] ds) {
+ this.x= ds[0];
+ this.y= ds[1];
+ this.z= ds[2];
+ }
+ public double getX() {
+ return x;
+ }
+ public void setX(double x) {
+ this.x = x;
+ }
+ public double getY() {
+ return y;
+ }
+ public void setY(double y) {
+ this.y = y;
+ }
+ public double getZ() {
+ return z;
+ }
+ public void setZ(double z) {
+ this.z = z;
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/Triangle.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/TriangleExample.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/TriangleExample.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/TriangleExample.java 2008-06-15 15:06:27 UTC (rev 20503)
@@ -0,0 +1,98 @@
+package org.drools.examples.learner;
+
+import java.util.List;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
+import org.drools.compiler.PackageBuilder;
+import org.drools.learner.DecisionTree;
+import org.drools.learner.builder.DecisionTreeFactory;
+import org.drools.learner.tools.ObjectFactory;
+
+public class TriangleExample {
+
+ public static final void main(final String[] args) throws Exception {
+ long start_time = System.currentTimeMillis();
+ // my rule base
+ final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ //ruleBase.addPackage( pkg );
+
+ final StatefulSession session = ruleBase.newStatefulSession();
+ // LearningSession
+
+// // what are these listeners???
+// session.addEventListener( new DebugAgendaEventListener() );
+// session.addEventListener( new DebugWorkingMemoryEventListener() );
+//
+// final WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger( session );
+// logger.setFileName( "log/poker" );
+
+ String inputFile = new String("data/triangle/triangle.data.txt");
+ Class<?> obj_class = Triangle.class;
+ List<Object> facts = ObjectFactory.getObjects(obj_class, inputFile);
+ for (Object r : facts) {
+ session.insert(r);
+ }
+
+ // instantiate a learner for a specific object class and pass session to train
+ DecisionTree decision_tree; int ALGO = 111;
+ /*
+ * Single 1xx, Bag 2xx, Boost 3xx
+ * ID3 x1x, C45 x2x
+ * Entropy xx1, Gain xx2
+ */
+ switch (ALGO) {
+ case 111:
+ decision_tree = DecisionTreeFactory.createSingleID3E(session, obj_class);
+ break;
+ case 112:
+ decision_tree = DecisionTreeFactory.createSingleID3G(session, obj_class);
+ break;
+ case 121:
+ decision_tree = DecisionTreeFactory.createSingleC45E(session, obj_class);
+ break;
+ case 122:
+ decision_tree = DecisionTreeFactory.createSingleC45G(session, obj_class);
+ break;
+ case 221:
+ decision_tree = DecisionTreeFactory.createBagC45E(session, obj_class);
+ break;
+ case 222:
+ decision_tree = DecisionTreeFactory.createBagC45G(session, obj_class);
+ break;
+ case 321:
+ decision_tree = DecisionTreeFactory.createBoostedC45E(session, obj_class);
+ break;
+ case 322:
+ decision_tree = DecisionTreeFactory.createBoostedC45G(session, obj_class);
+ break;
+// case 3:
+// decision_tree = DecisionTreeFactory.createGlobal2(session, obj_class);
+// break;
+ default:
+ decision_tree = DecisionTreeFactory.createSingleID3E(session, obj_class);
+
+ }
+
+ final PackageBuilder builder = new PackageBuilder();
+ //this wil generate the rules, then parse and compile in one step
+ builder.addPackageFromTree( decision_tree );
+ /*
+ * get the compiled package (which is serializable) from the builder
+ * add the package to a rulebase (deploy the rule package).
+ */
+ ruleBase.addPackage( builder.getPackage() );
+
+ session.fireAllRules();
+ long end_time = System.currentTimeMillis();
+ System.out.println("Total time="+ (end_time-start_time));
+
+// logger.writeToDisk();
+
+ session.dispose();
+ }
+
+
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/TriangleExample.java
___________________________________________________________________
Name: svn:eol-style
+ native
More information about the jboss-svn-commits
mailing list