[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