[jboss-svn-commits] JBL Code SVN: r19714 - in labs/jbossrules/contrib/machinelearning/decisiontree/src/dt: builder and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Apr 24 16:20:49 EDT 2008


Author: gizil
Date: 2008-04-24 16:20:49 -0400 (Thu, 24 Apr 2008)
New Revision: 19714

Modified:
   labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/DecisionTree.java
   labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/LeafNode.java
   labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/TreeNode.java
   labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/builder/C45TreeBuilder.java
   labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/builder/DecisionTreeBuilder.java
   labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/BooleanDomain.java
   labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/Domain.java
   labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/Fact.java
   labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/LiteralDomain.java
   labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/NumericDomain.java
   labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/WorkingMemory.java
   labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/tools/DecisionTreeSerializer.java
   labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/tools/FactProcessor.java
Log:
a better re-training (with the matching facts saved at each treenode) tested with a small data set


Modified: labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/DecisionTree.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/DecisionTree.java	2008-04-24 19:38:54 UTC (rev 19713)
+++ labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/DecisionTree.java	2008-04-24 20:20:49 UTC (rev 19714)
@@ -2,11 +2,13 @@
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
 
 import dt.memory.Domain;
 import dt.memory.Fact;
+import dt.tools.Util;
 
 public class DecisionTree implements Serializable{
 
@@ -98,6 +100,17 @@
 	public Integer test(Fact f) {
 		return this.getRoot().evaluate(f);
 	}
+	
+	public String toString(HashMap <TreeNode, ArrayList<Fact>> _facts) {
+		String out = "Facts scanned " + FACTS_READ + "\n";
+		
+		System.out.println("!!Printing tree: \n"+ Util.ntimes("\n", 3));
+		for (TreeNode obj_node : _facts.keySet())
+			System.out.println("* o.id:"+obj_node.getID()+ " o.d:"+obj_node.getDomain()+ " o.h:"+ obj_node.hashCode()+ " => "+_facts.get(obj_node) );
+		
+		System.out.println("!!Had print tree"+ Util.ntimes("\n", 3));
+		return out + root.toString(_facts);
+	}
 
 	@Override
 	public String toString() {

Modified: labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/LeafNode.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/LeafNode.java	2008-04-24 19:38:54 UTC (rev 19713)
+++ labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/LeafNode.java	2008-04-24 20:20:49 UTC (rev 19714)
@@ -40,6 +40,11 @@
 
 		}
 	}
+	
+//	public int hashCode() {
+//		return super.hashCode() ^ targetValue.hashCode() ;//should i add the children
+//	}
+	
 	public void addNode(Object attributeValue, TreeNode node) {
 		throw new RuntimeException("cannot add Node to a leaf node");
 	}

Modified: labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/TreeNode.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/TreeNode.java	2008-04-24 19:38:54 UTC (rev 19713)
+++ labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/TreeNode.java	2008-04-24 20:20:49 UTC (rev 19714)
@@ -1,6 +1,8 @@
 package dt;
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Hashtable;
 
 import dt.memory.Domain;
@@ -10,8 +12,13 @@
 
 public class TreeNode implements Serializable{
 	
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
 	private Domain<?> domain;
 	private Hashtable<Object, TreeNode> children;
+	private int id;
 	
 	
 	public TreeNode(Domain<?> domain)
@@ -19,8 +26,28 @@
 		this.domain = domain;
 		this.children = new Hashtable<Object, TreeNode>();
 	}
+	public void setID(int bocuk_id) {
+		this.id = bocuk_id;
+	}
 	
+	public int getID() {
+		return this.id;
+	}
 	
+	@Override
+	public boolean equals(Object obj) {
+		// TODO Auto-generated method stub
+		if (obj instanceof TreeNode)
+			return this.hashCode() == ((TreeNode) obj).hashCode();
+		else 
+			return false;
+	}
+	
+	public int hashCode() {
+		return id ; //domain.hashCode() ^ children.hashCode() ^ id;//should i add the children
+	}
+	
+	
 	public void addNode(Object attributeValue, TreeNode node) {
 		children.put(attributeValue, node);
 	}
@@ -100,25 +127,65 @@
 			return (Integer.valueOf(2));
 		}
 	}
-	
+	public String toString(int depth) {
+		return toString(1, 1, new StringBuffer());
+	}
 	public String toString() {
-		return toString(1, new StringBuffer());
+		return toString(1, 5, new StringBuffer());
 	}
 
-	public String toString(int depth, StringBuffer buf) {
-		if (domain != null) {
-			buf.append(Util.ntimes("\t", depth));
+	public String toString(int tab, int depth, StringBuffer buf) {
+		if (depth > 0 && domain != null) {
+			buf.append(Util.ntimes("\t", tab));
 			buf.append(Util.ntimes("***",1));
 			buf.append( domain.getName() + " \n");
 			for (Object attributeValue : children.keySet()) {
-				buf.append(Util.ntimes("\t", depth + 1));
+				buf.append(Util.ntimes("\t", tab + 1));
 				buf.append("+" + attributeValue );
 				buf.append("\n");
 				TreeNode child = children.get(attributeValue);
-				buf.append(child.toString(depth + 1, new StringBuffer()));
+				buf.append(child.toString(tab + 1, --depth, new StringBuffer()));
 			}
 		}
 		return buf.toString();
 	}
 	
+	
+	public String toString(HashMap <TreeNode, ArrayList<Fact>> matched_facts) {
+		return toString(1, 1, new StringBuffer(), matched_facts);
+	}
+
+	public String toString(int tab, int depth, StringBuffer buf, HashMap <TreeNode, ArrayList<Fact>> matched_facts) {
+	//	System.out.println("fact keys" + _facts.keySet());
+		if (domain != null) {
+			
+//			for (TreeNode obj_node : matched_facts.keySet())
+//				System.out.println("* o.id:"+obj_node.getID()+ " o.d:"+obj_node.getDomain()+ " o.h: "+ obj_node.hashCode()+ " => "+matched_facts.get(obj_node) );
+//			System.out.println();
+			buf.append(Util.ntimes("\t", tab));
+			buf.append(Util.ntimes("***",1));
+			buf.append( domain.getName() + " n.h:"+this.hashCode()+ " \t");
+			//buf.append( domain.getName() + " \t");
+			if (matched_facts != null) {
+				if (matched_facts.containsKey(this)) {
+					ArrayList<Fact> currentFacts = matched_facts.get(this);
+					for (Fact f: currentFacts) {
+						//buf.append( f.hashCode() + ", ");
+						buf.append( f+ ", ");
+					}
+				}
+				else 
+					buf.append("n.id: "+ this.getID() + " no facts");
+			}
+			buf.append(" \n");
+			for (Object attributeValue : children.keySet()) {
+				buf.append(Util.ntimes("\t", tab + 1));
+				buf.append("+" + attributeValue );
+				buf.append("\n");
+				TreeNode child = children.get(attributeValue);
+				buf.append(child.toString(tab + 1, --depth, new StringBuffer(), matched_facts));
+			}
+		}
+		return buf.toString();
+	}
 }

Modified: labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/builder/C45TreeBuilder.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/builder/C45TreeBuilder.java	2008-04-24 19:38:54 UTC (rev 19713)
+++ labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/builder/C45TreeBuilder.java	2008-04-24 20:20:49 UTC (rev 19714)
@@ -2,7 +2,6 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
@@ -38,11 +37,11 @@
 	}
 
 	MyThread helper;
-	private int FUNC_CALL = 0;
+	protected int FUNC_CALL = 0;
 	protected int num_fact_trained = 0;
 	private ArrayList<Fact> facts;
 	private ArrayList<Fact> training_facts;
-	private ArrayList<Fact> unclassified_facts;
+	protected ArrayList<Fact> unclassified_facts;
 	
 	private WorkingMemory global_wm;
 	private List<Domain<?>> domains;
@@ -138,6 +137,10 @@
 		
 	}
 	
+	public String getTarget() {
+		return this.target;
+	}
+	
 	public void setTarget(String targetField) {
 		this.target = targetField;
 		//attrsToClassify.remove(target);
@@ -152,7 +155,7 @@
 		//if (!attribute.equals(this.target))
 			attributes.add(attribute);
 	}
-	private void init_dt(DecisionTree dt, String targetField) {
+	public void init_dt(DecisionTree dt, String targetField) {
 		dt.setTarget(targetField);
 		for (Domain<?> d : domains) {
 			dt.addDomain(d);	
@@ -185,8 +188,6 @@
 		
 		training_facts.addAll(facts);
 		dt.FACTS_READ += training_facts.size();
-		/* you must set this when the training called the first time */
-		setNum_fact_trained(training_facts.size());
 
 		//while ()
 		TreeNode root = train(dt, training_facts, attrs);
@@ -242,9 +243,8 @@
 			}
 		}
 		dt.FACTS_READ += facts.size();
+		this.add_to_training(facts);
 
-		setNum_fact_trained(facts.size());
-
 		if (workingAttributes != null)
 			for (String attr : workingAttributes) {
 				dt.addDomain(klass_fs.getDomain(attr));
@@ -275,10 +275,8 @@
 		ArrayList<String> attrs = new ArrayList<String>(dt.getAttributes());
 		Collections.sort(attrs);
 		
-		training_facts.addAll(first_facts);
+		this.add_to_training(first_facts);	/* you must set this when the training called the first time */
 		dt.FACTS_READ += first_facts.size();
-		/* you must set this when the training called the first time */
-		setNum_fact_trained(training_facts.size());
 
 		//while ()
 		TreeNode root = train(dt, training_facts, attrs);
@@ -349,8 +347,7 @@
 		for (Object value : filtered_facts.keySet()) {
 			/* split the last two class at the same time */
 
-			ArrayList<String> attributeNames_copy = new ArrayList<String>(
-					attributeNames);
+			ArrayList<String> attributeNames_copy = new ArrayList<String>(attributeNames);
 			attributeNames_copy.remove(choosenDomain.getName());
 
 			if (filtered_facts.get(value).isEmpty()) {
@@ -374,10 +371,10 @@
 		ArrayList<String> attrs = new ArrayList<String>(dt.getAttributes());
 		Collections.sort(attrs);
 		
-		training_facts.addAll(new_facts);
+		
+		this.add_to_training(new_facts);	/* you must set this when the training called the first time */
 		dt.FACTS_READ += new_facts.size();
-		/* you must set this when the training called the first time */
-		setNum_fact_trained(training_facts.size());
+
 		System.out.println(Util.ntimes("\n", 10)+"How facts are u training? "+ training_facts.size());
 		//while ()
 		TreeNode root = re_train(dt, dt.getRoot(), training_facts, attrs);
@@ -479,17 +476,17 @@
 							((LeafNode)childNode).setTargetValue(value);
 							//currentNode.
 						}
-					} 
-					
-						
-					
+					} 	
 				} else {
-					if (childNode == null) {
-						TreeNode newNode = train(dt, filtered_facts.get(value), attributeNames_copy);
-						currentNode.addNode(value, newNode);
+					 
+					if (childNode == null) { // there was no node assigned for that object value
+						childNode = train(dt, filtered_facts.get(value), attributeNames_copy);
+						currentNode.addNode(value, childNode);
 					}
-					TreeNode newNode = re_train(dt, childNode, filtered_facts.get(value), attributeNames_copy);
+					else {
+						TreeNode newNode = re_train(dt, childNode, filtered_facts.get(value), attributeNames_copy);
 					//currentNode.addNode(value, newNode);
+					}
 				}
 			}
 			
@@ -573,12 +570,18 @@
 	public int getNumCall() {
 		return FUNC_CALL;
 	}
-
 	public int getNum_fact_trained() {
-		return num_fact_trained;
+		return training_facts.size();
 	}
+//	public int getNum_fact_trained() {
+//		return num_fact_trained;
+//	}
+//
+//	public void setNum_fact_trained(int num_fact_processed) {
+//		this.num_fact_trained = num_fact_processed;
+//	}
 
-	public void setNum_fact_trained(int num_fact_processed) {
-		this.num_fact_trained = num_fact_processed;
+	public void add_to_training(List<Fact> new_facts) {
+		this.training_facts.addAll(new_facts);
 	}
 }

Modified: labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/builder/DecisionTreeBuilder.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/builder/DecisionTreeBuilder.java	2008-04-24 19:38:54 UTC (rev 19713)
+++ labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/builder/DecisionTreeBuilder.java	2008-04-24 20:20:49 UTC (rev 19714)
@@ -17,5 +17,4 @@
 	public List<Integer> test(DecisionTree dt, List<Fact> facts);
 	//DecisionTree build(WorkingMemory simple, String klass_name, String target_attr,List<String> workingAttributes);
 	int getNum_fact_trained();
-	void setNum_fact_trained(int num);
 }

Modified: labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/BooleanDomain.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/BooleanDomain.java	2008-04-24 19:38:54 UTC (rev 19713)
+++ labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/BooleanDomain.java	2008-04-24 20:20:49 UTC (rev 19714)
@@ -56,7 +56,7 @@
 	}
 	
 	public int hashCode() {
-		return fName.hashCode();
+		return fName.hashCode(); // ^ fValues.hashCode();
 	}
 
 	public boolean isConstant() {
@@ -154,4 +154,9 @@
 		return b1.equals(b2) ? 0 : 1;
 	}
 
+	public int hashcode() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
 }

Modified: labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/Domain.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/Domain.java	2008-04-24 19:38:54 UTC (rev 19713)
+++ labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/Domain.java	2008-04-24 20:20:49 UTC (rev 19714)
@@ -41,7 +41,7 @@
 	
 	
 	int compare(Object o1, Object o2);
-	
+	public int hashCode();
 }
 
 

Modified: labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/Fact.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/Fact.java	2008-04-24 19:38:54 UTC (rev 19713)
+++ labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/Fact.java	2008-04-24 20:20:49 UTC (rev 19714)
@@ -8,6 +8,10 @@
 
 public class Fact implements Serializable{
 
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
 	private Hashtable<String, Domain<?>> fields;
 	private HashMap<String, Object> values;
 
@@ -66,17 +70,23 @@
 		Fact other = (Fact) o;
 		return fields.equals(other.fields); //TODO work on the equals() fnc
 	}
-
+	
 	public int hashCode() {
-		return fields.hashCode();
+		return values.hashCode();
 	}
 
 	public String toString() {
-		String out = "";
-		for (String key: fields.keySet())
-		{
-			out += fields.get(key) +"="+values.get(key)+",";
-		}
+		String out = this.hashCode() + "";
+		
+//		String out = "";
+//		for (String key: fields.keySet())
+//		{
+//			out += "-"+values.get(key);
+//		}
+//		for (String key: fields.keySet())
+//		{
+//			out += fields.get(key) +"="+values.get(key)+",";
+//		}
 		return out;
 	}
 	

Modified: labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/LiteralDomain.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/LiteralDomain.java	2008-04-24 19:38:54 UTC (rev 19713)
+++ labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/LiteralDomain.java	2008-04-24 20:20:49 UTC (rev 19714)
@@ -2,7 +2,6 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 
@@ -113,10 +112,6 @@
 	public List<String> getValues() {
 		return fValues;
 	}
-	
-	public int hashCode() {
-		return fName.hashCode();
-	}
 
 	public boolean isConstant() {
 		return this.constant;
@@ -198,4 +193,7 @@
 		return s1.equals(s2) ? 0 : 1;
 	}
 
+	public int hashCode() {
+		return fName.hashCode() ^ fValues.hashCode();
+	}
 }

Modified: labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/NumericDomain.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/NumericDomain.java	2008-04-24 19:38:54 UTC (rev 19713)
+++ labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/NumericDomain.java	2008-04-24 20:20:49 UTC (rev 19714)
@@ -132,7 +132,7 @@
 	
 	
 	public int hashCode() {
-		return fName.hashCode();
+		return fName.hashCode() ^ fValues.hashCode(); //TODO
 	}
 
 	public boolean isConstant() {

Modified: labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/WorkingMemory.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/WorkingMemory.java	2008-04-24 19:38:54 UTC (rev 19713)
+++ labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/memory/WorkingMemory.java	2008-04-24 20:20:49 UTC (rev 19714)
@@ -22,9 +22,9 @@
 		domainset = new Hashtable<String, Domain<?>>();
 	}
 	
-	public List<Fact> getFacts(Class<?> klass) {
+	public ArrayList<Fact> getFacts(Class<?> klass) {
 		Iterator<FactSet> it_fs = this.getFactsets();
-		List<Fact> facts = new ArrayList<Fact>();
+		ArrayList<Fact> facts = new ArrayList<Fact>();
 		FactSet klass_fs = null;
 		while (it_fs.hasNext()) {
 			FactSet fs = it_fs.next();

Modified: labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/tools/DecisionTreeSerializer.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/tools/DecisionTreeSerializer.java	2008-04-24 19:38:54 UTC (rev 19713)
+++ labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/tools/DecisionTreeSerializer.java	2008-04-24 20:20:49 UTC (rev 19714)
@@ -9,6 +9,7 @@
 import java.io.ObjectOutputStream;
 
 import dt.DecisionTree;
+import dt.builder.C45TreeIterator;
 import dt.builder.DecisionTreeBuilder;
 
 public class DecisionTreeSerializer {
@@ -45,36 +46,25 @@
 	public static Object read(String file_name) throws Exception {	
 		File file =new File(file_name);//"temp.tree"
 		if(!file.exists() || (file.length()<=0)) {
-			System.out.println("File doesnot exit, creating...");
 			throw new Exception("File is not found or empty");
 		}
-		try {
-			// Read from disk using FileInputStream
-			FileInputStream f_in = new FileInputStream(file);
-			
-			// Read object using ObjectInputStream
-			ObjectInputStream obj_in = new ObjectInputStream (f_in);
+		
+		// Read from disk using FileInputStream
+		FileInputStream f_in = new FileInputStream(file);
+		
+		// Read object using ObjectInputStream
+		ObjectInputStream obj_in = new ObjectInputStream (f_in);
 
-			// Read an object
-			Object obj = obj_in.readObject();
+		// Read an object
+		Object obj = obj_in.readObject();
 
-			if (obj instanceof DecisionTree || obj instanceof DecisionTreeBuilder) {
-				System.out.println("The object class found");
-				return obj;
-			} else {
-				throw new Exception("There is something else in the decision tree");
-			}
-		} catch (FileNotFoundException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		} catch (IOException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		} catch (ClassNotFoundException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
+		if (obj instanceof DecisionTree || obj instanceof DecisionTreeBuilder || obj instanceof C45TreeIterator ) {
+			System.out.println("The object class found");
+			return obj;
+		} else {
+			throw new Exception("There is something else in the decision tree");
 		}
-		return null;
+		//return null;
 		
 		
 		

Modified: labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/tools/FactProcessor.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/tools/FactProcessor.java	2008-04-24 19:38:54 UTC (rev 19713)
+++ labs/jbossrules/contrib/machinelearning/decisiontree/src/dt/tools/FactProcessor.java	2008-04-24 20:20:49 UTC (rev 19714)
@@ -12,8 +12,7 @@
 
 public class FactProcessor {
 
-	public static Hashtable<Object, List<Fact>> splitFacts(
-			List<Fact> facts, Domain<?> choosenDomain) {
+	public static Hashtable<Object, ArrayList<Fact>> splitFacts(ArrayList<Fact> facts, Domain<?> choosenDomain) {
 		if (choosenDomain.isDiscrete()) {	
 			return FactProcessor.splitFacts_disc(facts, choosenDomain);
 		} else {
@@ -22,7 +21,103 @@
 		}
 	}
 	
+	public static Hashtable<Object, ArrayList<Fact>> splitFacts_disc(ArrayList<Fact> facts, Domain<?> choosenDomain) {
+		String attributeName = choosenDomain.getName();
+		List<?> attributeValues = choosenDomain.getValues();
+		Hashtable<Object, ArrayList<Fact>> factLists = new Hashtable<Object, ArrayList<Fact>>(attributeValues.size());
+		for (Object v : attributeValues) {
+			factLists.put(v, new ArrayList<Fact>());
+		}
+		for (Fact f : facts) {
+			factLists.get(f.getFieldValue(attributeName)).add(f);
+		}
+		return factLists;
+	}
 	
+	
+	/* it must work */
+	private static Hashtable<Object, ArrayList<Fact>> splitFacts_cont_opt(ArrayList<Fact> facts, Domain<?> attributeDomain) {
+		
+		String attributeName = attributeDomain.getName();
+		
+		if (Util.DEBUG) System.out.println("FactProcessor.splitFacts_cont() attr_split "+ attributeName);
+		
+		List<?> splitValues = attributeDomain.getValues();
+		List<Integer> splitIndices = attributeDomain.getIndices();
+		if (Util.DEBUG) {
+			System.out.println("FactProcessor.splitFacts_cont() haniymis benim repsentativelerim: "+ splitValues.size() + " and the split points "+ splitIndices.size());
+			
+			System.out.println("FactProcessor.splitFacts_cont() before splitting "+ facts.size());
+			
+			int index = 0;
+			int split_index = 0;
+			Object attr_key = splitValues.get(split_index);
+			for (Fact f : facts) {
+				
+				if (index == splitIndices.get(split_index).intValue()+1 ) {
+					System.out.print("PRINT* (");
+					attr_key = splitValues.get(split_index+1);
+					split_index++;	
+				} else {
+					System.out.print("PRINT (");
+				}
+				System.out.println(split_index+"): fact "+f);
+				index++;
+			}
+		
+		}
+		
+		Hashtable<Object, ArrayList<Fact>> factLists = new Hashtable<Object, ArrayList<Fact>>(splitValues.size());
+		for (Object v: attributeDomain.getValues()) {
+			factLists.put(v, new ArrayList<Fact>());
+		}
+		
+		//Comparator<Fact> cont_comp = attributeDomain.factComparator();
+		Iterator<Integer> splits_it = splitIndices.iterator();
+		int start_point = 0;
+		int index = 0;
+		while (splits_it.hasNext()) {// || index < attributeDomain.getValues().size()
+			int integer_index = splits_it.next().intValue();
+//			if (splits_it.hasNext())
+//				integer_index = splits_it.next().intValue();
+//			else
+//				integer_index = facts.size();
+			
+			Object category = splitValues.get(index);
+			//System.out.println("FactProcessor.splitFacts_cont() new category: "+ category);
+			Fact pseudo = new Fact();
+			try {
+				pseudo.add(attributeDomain, category);
+				if (Util.DEBUG) {
+					System.out.println("FactProcessor.splitFacts_cont() new category: "+ category );
+					System.out.println(" ("+start_point+","+integer_index+")");
+				}
+				ArrayList<Fact> temp = new ArrayList<Fact>(integer_index+1-start_point+1);
+				temp.addAll(facts.subList(start_point, integer_index+1));
+				factLists.put(category, temp);
+				start_point = integer_index+1;
+
+			} catch (Exception e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+			index++;
+			
+		}
+		
+		
+		return factLists;
+	}
+	public static Hashtable<Object, List<Fact>> splitFacts(List<Fact> facts, Domain<?> choosenDomain) {
+		if (choosenDomain.isDiscrete()) {	
+			return FactProcessor.splitFacts_disc(facts, choosenDomain);
+		} else {
+			Collections.sort(facts, choosenDomain.factComparator()); /* hack*/
+			return FactProcessor.splitFacts_cont_opt(facts, choosenDomain);
+		}
+	}
+	
+	
 	public static Hashtable<Object, List<Fact>> splitFacts_disc(List<Fact> facts, Domain<?> choosenDomain) {
 		String attributeName = choosenDomain.getName();
 		List<?> attributeValues = choosenDomain.getValues();
@@ -141,8 +236,7 @@
 		return factLists;
 	}
 
-	public static void splitUnclassifiedFacts(
-			List<Fact> unclassified_facts, FactDistribution stats) {
+	public static void splitUnclassifiedFacts(List<Fact> unclassified_facts, FactDistribution stats) {
 		
 		Object winner = stats.getThe_winner_target_class();
 		//System.out.println(Util.ntimes("DANIEL", 2)+ " lets get unclassified daniel winner "+winner +" num of sup "  +stats.getVoteFor(winner));




More information about the jboss-svn-commits mailing list