[jboss-svn-commits] JBL Code SVN: r20481 - 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
Sat Jun 14 12:17:04 EDT 2008


Author: gizil
Date: 2008-06-14 12:17:03 -0400 (Sat, 14 Jun 2008)
New Revision: 20481

Modified:
   labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/InstanceList.java
   labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Memory.java
   labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Schema.java
   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/builder/Learner.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/tools/ObjectFactory.java
   labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/Util.java
   labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/AllocatedCashflow.java
   labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/Cashflow.java
   labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/TypedCashflow.java
Log:
ClassVisitor implemented, not tested yet



Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/InstanceList.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/InstanceList.java	2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/InstanceList.java	2008-06-14 16:17:03 UTC (rev 20481)
@@ -5,27 +5,44 @@
 import java.util.List;
 
 import org.drools.WorkingMemory;
-import org.drools.base.ClassFieldExtractor;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.spi.Extractor;
-
-
 public class InstanceList {
 
 	private Schema schema;
 	private ArrayList<Instance> instances;
-	private ArrayList<Double> weights;
+	private InstanceFactory factory;
 	
+	// old constructer
 	public InstanceList(Schema _schema) {
 		this.schema = _schema;
-		this.instances = new ArrayList<Instance>();
+		this.instances = new ArrayList<Instance>(); 
 	}
+	public InstanceList(Schema _schema, WorkingMemory _session) {
+		this.schema = _schema;
+		this.instances = new ArrayList<Instance>(); 
+		this.factory = new InstanceFactory(_session, _schema);
+	}
 	
+	// will be used as copy constructer
 	public InstanceList(Schema _schema, int size) {
 		this.schema = _schema;
-		this.instances = new ArrayList<Instance>(size); 
+		this.instances = new ArrayList<Instance>(size);
 	}
+
+	public void addStructuredInstance(Object _obj) {
+		// create instance and all attributes according to the schema		
+		Instance inst = factory.createInstance(_obj);		
+		System.out.println(inst);
+		if (inst != null )
+			instances.add(inst);
+		else {
+			System.out.println("Couldnot create the instance");
+			System.exit(0);
+		}
+	}
 	
+	// old method
 	public void addFromWorkingMemory(WorkingMemory _session, Object _obj) {
 		// create instance and all attributes according to the schema
 		Instance inst = new Instance();
@@ -55,6 +72,8 @@
 			}
 			
 		}
+		
+		System.out.println("inst:"+ inst);
 		instances.add(inst);
 	}
 	
@@ -96,7 +115,8 @@
 	public Collection<String> getAttributes() {
 		return schema.getAttrNames();
 	}
-
+	
+	
 /*	String getClassName();
 
 	void assignTo(Collection<Instance> c);

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Memory.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Memory.java	2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Memory.java	2008-06-14 16:17:03 UTC (rev 20481)
@@ -4,14 +4,51 @@
 import java.util.Iterator;
 
 import org.drools.WorkingMemory;
+import org.drools.learner.builder.Learner.DataType;
 import org.drools.learner.builder.Learner.DomainAlgo;
 import org.drools.learner.tools.FeatureNotSupported;
 
 public class Memory {
 	
+	// TODO pass a list of classes, and get all the object from that class
+	public static Memory createStructuredFromWorkingMemory(WorkingMemory _session, Class<?> clazz, DomainAlgo domain, DataType data) throws FeatureNotSupported {
+		// if mem == null
+		Memory mem = new Memory();
+
+		mem.session = _session;
+
+		mem.setClassToClassify(clazz);
+		// create schema from clazz
+		Schema inst_schema = null;
+		try {
+			inst_schema = Schema.createStructuredSchema(clazz, domain, data);
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			System.exit(0);
+		}
+
+		// create a instance list that can hold objects from our schema
+		mem.instances.put(clazz, new InstanceList(inst_schema, _session));
+
+		/* 
+		 * do they create an ObjectTypeNode for each new inserted object type?
+		 * even if there is no rule exists.
+		 * No probably they do not 
+		 */
+		Iterator<Object> it_object = _session.iterateObjects();	// how can i get the object type nodes
+		while (it_object.hasNext()) {
+			Object obj = it_object.next();
+			if (clazz.isAssignableFrom(obj.getClass()))
+				mem.instances.get(clazz).addStructuredInstance(obj);
+		}
+		//dt.FACTS_READ += facts.size();
+
+		return mem;
+	}
 	
 	// TODO pass a list of classes, and get all the object from that class
-	public static Memory createFromWorkingMemory(WorkingMemory _session, Class<?> clazz, DomainAlgo domain_type) throws FeatureNotSupported {
+	public static Memory createFromWorkingMemory(WorkingMemory _session, Class<?> clazz, DomainAlgo domain, DataType data) throws FeatureNotSupported {
 		// if mem == null
 		Memory mem = new Memory();
 
@@ -19,7 +56,7 @@
 
 		mem.setClassToClassify(clazz);
 		// create schema from clazz
-		Schema inst_schema = Schema.createFromClass(clazz, domain_type);
+		Schema inst_schema = Schema.createFromClass(clazz, domain, data);
 
 		// create a instance list that can hold objects from our schema
 		mem.instances.put(clazz, new InstanceList(inst_schema));

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Schema.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Schema.java	2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Schema.java	2008-06-14 16:17:03 UTC (rev 20481)
@@ -1,18 +1,22 @@
 package org.drools.learner;
 
-import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Hashtable;
+import java.util.Iterator;
 import java.util.Set;
 
 import org.drools.base.ClassFieldExtractor;
 import org.drools.base.ClassFieldExtractorCache;
+import org.drools.learner.builder.Learner.DataType;
 import org.drools.learner.builder.Learner.DomainAlgo;
 import org.drools.learner.tools.ClassAnnotation;
+import org.drools.learner.tools.ClassStructure;
+import org.drools.learner.tools.ClassVisitor;
 import org.drools.learner.tools.FeatureNotSupported;
 import org.drools.learner.tools.FieldAnnotation;
 import org.drools.learner.tools.PseudoFieldExtractor;
@@ -24,7 +28,7 @@
  */
 public class Schema {
 
-	public static Schema createFromClass(Class<?> clazz, DomainAlgo domain_type) throws FeatureNotSupported {
+	public static Schema createFromClass(Class<?> clazz, DomainAlgo domain_type, DataType data_type) throws FeatureNotSupported {
 		Schema schema = new Schema(clazz);
 		ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
 		/*
@@ -38,20 +42,12 @@
 		ArrayList<Class<?>> element_classes = new ArrayList<Class<?>>();
 		Util.getAllFields(clazz, element_fields, element_classes); 
 		 */
-		Util.getAllFields(clazz, element_fields); 	//clazz.getDeclaredFields(); //clazz.getFields();
+		Util.getSuperFields(clazz, element_fields); 	//clazz.getDeclaredFields(); //clazz.getFields();
+		ArrayList<Field> decomposed_fields = new ArrayList<Field>(element_fields.size()+10);
+		Util.decomposeStructuredFields(element_fields, decomposed_fields);
 		for (Field f: element_fields) {
 			String f_name = f.getName();
-			ClassFieldExtractor f_extractor = cache.getExtractor( clazz, f_name, clazz.getClassLoader() );
-			schema.extractorMap.put(f_name, f_extractor);
-
-			Annotation[] annotations = f.getAnnotations();
-			FieldAnnotation spec = null;
-			for (Annotation a : annotations) {
-				if (a instanceof FieldAnnotation) {
-					spec = (FieldAnnotation)a; // here it is !!!
-					break;
-				}
-			}
+			FieldAnnotation spec = Util.getFieldAnnotations(f);
 			
 			if (spec != null) {
 				if (!spec.ignore() && f.getType() == String.class && !spec.discrete()) {
@@ -60,11 +56,11 @@
 				}
 				boolean skip = false;
 				switch (domain_type) {
-				case ID3:	//ID3
+				case CATEGORICAL:	//ID3 can work only with categorical types
 					if (spec.ignore() || !spec.discrete())
 						skip = true;
 					break;
-				case C45:
+				case QUANTITATIVE: // C45 can work with categorical || quantitative domain
 					if (spec.ignore())
 						skip = true;
 					break;
@@ -88,13 +84,23 @@
 				fieldDomain.addCategory(Boolean.FALSE);
 				fieldDomain.setFixed(true);
 			}
-			else if (f.getType() == String.class)	{	/* BY DEFAULT it is categorical*/}
+			else if (f.getType() == String.class) {	
+				/* BY DEFAULT it is categorical*/
+			} else {
+				// structured data
+				if (data_type == DataType.STRUCTURED) {
+					// u need to process then
+					
+				}
+			}
 			
 			/* TODO insanity checks:
 			 * 1- the annotations are not given
 			 * 2- there is no target specified
 			 * 3- more than one target is specified
 			 */
+			ClassFieldExtractor f_extractor = cache.getExtractor( clazz, f_name, clazz.getClassLoader() );
+			schema.extractorMap.put(f_name, f_extractor);
 			schema.domainMap.put(f_name, fieldDomain);			
 		}
 		/* Apperantly the getMethod function recurse on the superclasses
@@ -102,59 +108,166 @@
 		for (Class<?> c: element_classes) {
 			Annotation[] annotations = c.getAnnotations();
 		*/
-			Annotation[] annotations = clazz.getAnnotations();	// it should get the inherited annotations 
-			ClassAnnotation lab = null;
-			for (Annotation a : annotations) {
-				if (a instanceof ClassAnnotation) {
-					lab= (ClassAnnotation)a; // here it is !!!
-					break;
+		
+		ClassAnnotation class_label = Util.getClassAnnotations(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);
+
+				Domain fieldDomain = new Domain(class_label.label_element(), m.getReturnType());
+				fieldDomain.setArtificial(true);
+				if (m.getReturnType() == Boolean.TYPE || m.getReturnType() == Boolean.class)	{	/* set discrete*/
+//					fieldDomain.setCategorical(true);	// BY DEFAULT it is categorical
+					fieldDomain.addCategory(Boolean.TRUE);
+					fieldDomain.addCategory(Boolean.FALSE);
+					fieldDomain.setFixed(true);					
 				}
+				//else if (m.getReturnType() == String.class)	{	/* BY DEFAULT it is categorical*/}
+				schema.domainMap.put(class_label.label_element(), fieldDomain);
+
+				Extractor m_extractor = new PseudoFieldExtractor(clazz, m);
+				//cache.getExtractor( clazz, lab.label_element(), clazz.getClassLoader() );
+				schema.extractorMap.put(class_label.label_element(), m_extractor);
+				schema.clearTargets();
+				schema.addTarget(class_label.label_element());
+				//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();
 			}
-			
-			if (lab != null && lab.label_element() != "") {
-				// the targetting label is set, put the function that gets that value somewhere
+		}
+		//}
+		
+		return schema;
+	}
+	
+	
+	public static Schema createStructuredSchema(Class<?> clazz, DomainAlgo domain_type, DataType data_type) throws Exception {
+		Schema schema = new Schema(clazz);
+		ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
+
+		ClassVisitor visitor = new ClassVisitor(domain_type, data_type);
+		visitor.visit(clazz);
+		schema.klass_structure = visitor.getStructure();
+		
+		for (Class<?> _klass : schema.klass_structure.keySet()) {
+			ClassStructure struct = schema.klass_structure.get(_klass);
+			//Iterator<Field> f_ite = struct.getFieldIterator();
+			//while (f_ite.hasNext()) {
+			//Field f= f_ite.next();
+			for (Field f : struct.getFields()) {
+				String f_name = f.getName();
 				
-				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(lab.label_element(), null);
-					
-					Domain fieldDomain = new Domain(lab.label_element(), m.getReturnType());
-					fieldDomain.setArtificial(true);
-					if (m.getReturnType() == Boolean.TYPE || m.getReturnType() == Boolean.class)	{	/* set discrete*/
+				DataType f_type = struct.getFieldType(f);
+				switch (f_type) {
+				case PRIMITIVE:		// domain will be created only for primitive types
+					Domain fieldDomain = new Domain(f_name, f.getType());
+					if (f.getType() == Boolean.TYPE || f.getType() == Boolean.class)	{	/* set discrete*/
 //						fieldDomain.setCategorical(true);	// BY DEFAULT it is categorical
 						fieldDomain.addCategory(Boolean.TRUE);
 						fieldDomain.addCategory(Boolean.FALSE);
-						fieldDomain.setFixed(true);					
-					}
-					//else if (m.getReturnType() == String.class)	{	/* BY DEFAULT it is categorical*/}
-					schema.domainMap.put(lab.label_element(), fieldDomain);
-					
-					Extractor m_extractor = new PseudoFieldExtractor(clazz, m);
-						//cache.getExtractor( clazz, lab.label_element(), clazz.getClassLoader() );
-					schema.extractorMap.put(lab.label_element(), m_extractor);
-					schema.clearTargets();
-					schema.addTarget(lab.label_element());
-					//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();
+						fieldDomain.setFixed(true);
+					} else if (f.isEnumConstant()) {
+						Class<?> enum_f = f.getType();
+						//for (E e:enum_f.getEnumConstants())
+						//fieldDomain.setFixed(true);
+					} else if (f.getType() == String.class) {	
+						/* BY DEFAULT it is categorical*/
+					} 
+					schema.domainMap.put(f_name, fieldDomain);	
+				case STRUCTURED:	// the extractor is necessary for both types of data.
+					ClassFieldExtractor f_extractor = cache.getExtractor( _klass, f_name, _klass.getClassLoader() );
+					schema.extractorMap.put(f_name, f_extractor);
+					break;
+				default:
+					throw new Exception("What type of data is this");
+				
 				}
+				
+				/* TODO insanity checks:
+				 * 1- the annotations are not given
+				 * 2- there is no target specified
+				 * 3- more than one target is specified
+				 */	
 			}
-		//}
+		}
+		return schema;
+	}
+	
+	
+	public static Schema createSchemaStructure(Class<?> clazz, DomainAlgo domain_type, DataType data_type) throws Exception {
+		Schema schema = new Schema(clazz);
+		//ŒClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
+
+		// schema is modified
+		ClassVisitor visitor = new ClassVisitor(schema, domain_type, data_type);
+		visitor.visit();
+//		schema.klass_structure = visitor.getStructure();
+//		schema.domainMap= visitor.getDomains();
+//		schema.extractorMap = visitor.getExtractors();
+//		schema.targets = visitor.getTargets();
 		
+//		for (Class<?> _klass : schema.klass_structure.keySet()) {
+//			ClassStructure struct = schema.klass_structure.get(_klass);
+//			//Iterator<Field> f_ite = struct.getFieldIterator();
+//			//while (f_ite.hasNext()) {
+//			//Field f= f_ite.next();
+//			for (Field f : struct.getFields()) {
+//				String f_name = f.getName();
+//				
+//				DataType f_type = struct.getFieldType(f);
+//				switch (f_type) {
+//				case PRIMITIVE:		// domain will be created only for primitive types
+//					Domain fieldDomain = new Domain(f_name, f.getType());
+//					if (f.getType() == Boolean.TYPE || f.getType() == Boolean.class)	{	/* set discrete*/
+////						fieldDomain.setCategorical(true);	// BY DEFAULT it is categorical
+//						fieldDomain.addCategory(Boolean.TRUE);
+//						fieldDomain.addCategory(Boolean.FALSE);
+//						fieldDomain.setFixed(true);
+//					} else if (f.isEnumConstant()) {
+//						Class<?> enum_f = f.getType();
+//						//for (E e:enum_f.getEnumConstants())
+//						//fieldDomain.setFixed(true);
+//					} else if (f.getType() == String.class) {	
+//						/* BY DEFAULT it is categorical*/
+//					} 
+//					schema.domainMap.put(f_name, fieldDomain);	
+//				case STRUCTURED:	// the extractor is necessary for both types of data.
+//					ClassFieldExtractor f_extractor = cache.getExtractor( _klass, f_name, _klass.getClassLoader() );
+//					schema.extractorMap.put(f_name, f_extractor);
+//					break;
+//				default:
+//					throw new Exception("What type of data is this");
+//				
+//				}
+//				
+//
+//			}
+//		}
+		
+		/* TODO insanity checks:
+		 * 1- the annotations are not given
+		 * 2- there is no target specified
+		 * 3- more than one target is specified
+		 */	
 		return schema;
 	}
-	
 	// the owner class of the schema
 	private Class<?> klass;
 	
+	// the structure of the owner class
+	private HashMap<Class<?>,ClassStructure> klass_structure;
+	
 	// key: field name
 	private Hashtable<String, Extractor> extractorMap;
 
@@ -165,6 +278,8 @@
 	
 	public Schema(Class<?> _klass) {
 		this.klass = _klass;
+		
+		this.klass_structure = new HashMap<Class<?>,ClassStructure>();
 		this.extractorMap = new Hashtable<String, Extractor>();
 		this.domainMap = new Hashtable<String, Domain>();
 		this.targets = new HashSet<String>();
@@ -173,7 +288,15 @@
 	public Class<?> getObjectClass() {
 		return klass;
 	}
-
+	
+	public HashMap<Class<?>,ClassStructure> getClassStructure() {
+		return klass_structure;
+	}
+	public void putStructure(Class<?> clazz, ClassStructure structure) {
+		klass_structure.put(clazz, structure);;
+	}
+	
+	
 	public boolean addTarget(String _target) {
 		return targets.add(_target);
 	}
@@ -186,10 +309,17 @@
 		return this.domainMap.keySet();
 	}
 	
+	public void putDomain(String attr_name, Domain d) {
+		domainMap.put(attr_name, d);
+	}
+	
 	public Domain getAttrDomain(String attr_name) {
 		return this.domainMap.get(attr_name);
 	}
 	
+	public void putExtractor(String attr_name, Extractor extract) {
+		extractorMap.put(attr_name, extract);
+	}
 	public Extractor getAttrExtractor(String attr_name) {
 		return this.extractorMap.get(attr_name);
 	}

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-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/C45Learner.java	2008-06-14 16:17:03 UTC (rev 20481)
@@ -16,7 +16,7 @@
 	
 	public C45Learner() {
 		super();
-		super.setDomainAlgo(DomainAlgo.C45);
+		super.setDomainAlgo(DomainAlgo.QUANTITATIVE);
 	}
 	
 	

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-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/ID3Learner.java	2008-06-14 16:17:03 UTC (rev 20481)
@@ -15,7 +15,7 @@
 	
 	public ID3Learner() {
 		super();
-		super.setDomainAlgo(DomainAlgo.ID3);
+		super.setDomainAlgo(DomainAlgo.CATEGORICAL);
 		
 	}
 	

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/Learner.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/Learner.java	2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/Learner.java	2008-06-14 16:17:03 UTC (rev 20481)
@@ -16,7 +16,11 @@
 	
 	protected static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(Learner.class, SimpleLogger.DEFAULT_LEVEL);
 	
-	public static enum DomainAlgo { ID3, C45, WEIGHT }
+	public static enum DomainAlgo { CATEGORICAL, QUANTITATIVE }
+	public static DomainAlgo DEFAULT_DOMAIN = DomainAlgo.QUANTITATIVE;
+	
+	public static enum DataType {PRIMITIVE, STRUCTURED, COLLECTION}
+	public static DataType DEFAULT_DATA = DataType.PRIMITIVE;
 	private int data_size;
 	private DecisionTree best_tree;
 	private InstanceList input_data;

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-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Categorizer.java	2008-06-14 16:17:03 UTC (rev 20481)
@@ -79,6 +79,10 @@
 		return data;
 	}
 	
+	public QuantitativeDomain getSplitDomain() {
+		return this.splitDomain;
+	}
+	
 	private double find_a_split(int begin_index, int size, int depth, 
 								ClassDistribution facts_in_class) {
 

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ObjectFactory.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ObjectFactory.java	2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ObjectFactory.java	2008-06-14 16:17:03 UTC (rev 20481)
@@ -40,7 +40,7 @@
 	private ObjectFactory (Class<?> clazz) {
 		this.obj_clazz = clazz;
 		this.clazz_fields = new ArrayList<Field>();
-		Util.getAllFields(clazz, clazz_fields); 
+		Util.getSuperFields(clazz, clazz_fields); 
 		
 		this.field_sequences = getFieldReadingSeqs(clazz, clazz_fields);
 	}
@@ -104,8 +104,8 @@
 			for (Method m : element_methods) {
 				String m_name = m.getName();
 				Class<?>[] param_type_name = m.getParameterTypes();
-				if (ObjectFactory.isSetter(m_name) & ObjectFactory.isSimpleType(param_type_name)) {
-					String basicFieldName = ObjectFactory.getFieldName(m_name);
+				if (Util.isSetter(m_name) & Util.isSimpleMethod(param_type_name)) {
+					String basicFieldName = Util.getFieldName(m_name);
 					
 					/* TODO dont use the basic field name as the real field name, there can be a capital/miniscul 
 					 * letter problem
@@ -115,17 +115,14 @@
 						if (_f.getName().equalsIgnoreCase(basicFieldName)) {
 							f = _f;
 							break;
-						}
-							
+						}			
 					}
-					
 					if (f == null) {
 						throw new Exception("Field("+basicFieldName+") could not be found for the class("+this.obj_clazz+")");
 					}
 					else {
 						String fieldString = fieldValues.get(this.field_sequences.get(f.getName()));
-						Object fieldValue = readString(f, fieldString.trim());
-						
+						Object fieldValue = readString(f, fieldString.trim());						
 						try {
 							m.invoke(element, fieldValue);
 						} catch (IllegalArgumentException e) {
@@ -256,41 +253,6 @@
 		return Double.parseDouble(data);
 	}
 	
-	private static boolean isSetter(String m_name) {
-		if (m_name.startsWith("set") || m_name.startsWith("is") )
-			return true;
-		else 
-			return false;
-	}
-
-	private static String getFieldName(String method_name) {
-		if (method_name.startsWith("get") || method_name.startsWith("set"))
-			return method_name.substring(3, method_name.length()).toLowerCase();
-		else if (method_name.startsWith("is"))
-			return method_name.substring(2, method_name.length()).toLowerCase();
-		else 
-			return null;
-	}
 	
-	private static boolean isSimpleType(Class<?>[] type_name) {
-		if (type_name.length==1) {
-			if (type_name[0].isPrimitive() || type_name[0] == String.class)
-				return true;
-			if (type_name[0] == Boolean.class || type_name[0] == Boolean.TYPE ||
-				type_name[0] == Integer.class || type_name[0] == Integer.TYPE ||
-				type_name[0] == Long.class || type_name[0] == Long.TYPE ||
-				type_name[0] == Double.class || type_name[0] == Double.TYPE ||
-				type_name[0] == Float.class || type_name[0] == Float.TYPE ||
-				type_name[0] == String.class)
-				return true;
-			else 
-				return false;
-		}
-		else
-			return false;
-	}
-	
-	
-	
 
 }

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/Util.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/Util.java	2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/Util.java	2008-06-14 16:17:03 UTC (rev 20481)
@@ -1,10 +1,16 @@
 package org.drools.learner.tools;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Random;
 
+import org.drools.learner.Domain;
+import org.drools.learner.builder.Learner;
+import org.drools.learner.builder.Learner.DataType;
+import org.drools.learner.builder.Learner.DomainAlgo;
+
 public class Util {
 	
 	public static final boolean PRINT_STATS = true;
@@ -54,7 +60,7 @@
 	}
 	
 	/* TODO make this all_fields arraylist as hashmap */
-	public static void getAllFields(Class<?> clazz, ArrayList<Field> all_fields) {
+	public static void getSuperFields(Class<?> clazz, ArrayList<Field> all_fields) {
 		if (clazz == Object.class)
 			return;
 		
@@ -63,13 +69,136 @@
 		for (Field f: element_fields) {
 			all_fields.add(f);
 		}
-		getAllFields(clazz.getSuperclass(), all_fields);
+		getSuperFields(clazz.getSuperclass(), all_fields);
 		
 		return;
 	}
 	
+	public static void decomposeStructuredFields(ArrayList<Field> element_fields, ArrayList<Field> decomposed_fields) {
+		
+		for (Field f: element_fields) {
+			if (isSimpleType(f.getType()))
+				decomposed_fields.add(f);
+			else {
+				// it is an structured attribute
+				// u need to get its attributes
+				//if the field is a collection of sth => BOK
+				ArrayList<Field> field_structure = new ArrayList<Field>();
+				Util.getSuperFields(f.getType(), field_structure);
+				decomposeStructuredFields(field_structure, decomposed_fields);
+			}
+		}
+		return;
+	}
+	
+	public static boolean isSetter(String m_name) {
+		if (m_name.startsWith("set") || m_name.startsWith("is") )
+			return true;
+		else 
+			return false;
+	}
+
+	public static String getFieldName(String method_name) {
+		if (method_name.startsWith("get") || method_name.startsWith("set"))
+			return method_name.substring(3, method_name.length()).toLowerCase();
+		else if (method_name.startsWith("is"))
+			return method_name.substring(2, method_name.length()).toLowerCase();
+		else 
+			return null;
+	}
+	
+	public static boolean isSimpleMethod(Class<?>[] type_name) {
+		if (type_name.length==1) {
+			return isSimpleType(type_name[0]);
+		}
+		else
+			return false;
+	}
+	
+	public static DataType getDataType(Class<?> type_name) {
+		if (isSimpleType(type_name))
+			return DataType.PRIMITIVE;
+		else {
+			if (isCollectionType(type_name)) {
+				return DataType.COLLECTION;
+			}
+			else 
+				return DataType.STRUCTURED;
+		}
+	}
+	
+	public static boolean isSimpleType(Class<?> type_name) {
+		if (type_name.isPrimitive() || type_name == String.class)
+			return true;
+		else if (type_name == Boolean.class || type_name == Boolean.TYPE ||
+			type_name == Integer.class || type_name == Integer.TYPE ||
+			type_name == Long.class || type_name == Long.TYPE ||
+			type_name == Double.class || type_name == Double.TYPE ||
+			type_name == Float.class || type_name == Float.TYPE ||
+			type_name == String.class)
+			return true;
+		else if (type_name.isEnum()) {
+			return true;
+		} else 
+			return false;
+	}
+	
+	public static boolean isCollectionType(Class<?> type_name) {
+		if (type_name.isArray())
+			return true;
+		else if (type_name.isAssignableFrom(Iterable.class))
+			return true;
+		else 
+			return false;
+	}
+	
+	public static FieldAnnotation getFieldAnnotations(Field f) {
+		Annotation[] annotations = f.getAnnotations();
+		for (Annotation a : annotations) {
+			if (a instanceof FieldAnnotation) {
+				return (FieldAnnotation)a; // here it is !!!
+			}
+		}
+		return null;
+	}
+	
+	public static ClassAnnotation getDecClassAnnotations(Class<?> clazz) {
+		Annotation[] annotations = clazz.getDeclaredAnnotations();	// it should get the inherited annotations 
+		for (Annotation a : annotations) {
+			if (a instanceof ClassAnnotation) {
+				return (ClassAnnotation)a; // here it is !!!
+			}
+		}
+		return null;
+	}
+	public static ClassAnnotation getClassAnnotations(Class<?> clazz) {
+		Annotation[] annotations = clazz.getAnnotations();	// it should get the inherited annotations 
+		for (Annotation a : annotations) {
+			if (a instanceof ClassAnnotation) {
+				return (ClassAnnotation)a; // here it is !!!
+			}
+		}
+		return null;
+	}
+	// to process the type => it must be simple
+	public static void processDomain(Domain fieldDomain, Class<?> clazz_type) {
+		if (clazz_type == Boolean.TYPE || clazz_type == Boolean.class)	{	/* set discrete*/
+//			fieldDomain.setCategorical(true);	// BY DEFAULT it is categorical
+			fieldDomain.addCategory(Boolean.TRUE);
+			fieldDomain.addCategory(Boolean.FALSE);
+			fieldDomain.setFixed(true);
+		} else if (clazz_type.isEnum()) {//f.isEnumConstant()) {
+			Class<?> enum_f = clazz_type;
+			//for (E e:enum_f.getEnumConstants())
+			//fieldDomain.setFixed(true);
+		} else if (clazz_type == String.class) {	
+			/* BY DEFAULT it is categorical*/
+		} 
+		
+	}
+	
 	/* TODO make this all_fields arraylist as hashmap */
-	public static void getAllFields(Class<?> clazz, ArrayList<Field> all_fields, ArrayList<Class<?>> all_classes) {
+	private static void getAllFields(Class<?> clazz, ArrayList<Field> all_fields, ArrayList<Class<?>> all_classes) {
 		if (clazz == Object.class)
 			return;
 		all_classes.add(clazz);
@@ -101,7 +230,7 @@
 		return 0.0;
 	}
 	
-	public static int getType(Class<?>[] type_name) {
+	private static int getType(Class<?>[] type_name) {
 		/*	
 		 * simpletype.contains(type_name)
 		 * how do you get the simple type
@@ -151,7 +280,7 @@
 		return bag;
 	}
 	
-	public static Object convertPrimitiveType (Object primitiveValue) {
+	private static Object convertPrimitiveType (Object primitiveValue) {
 		Class klass = primitiveValue.getClass();
 		if  (klass.equals(Boolean.TYPE)) {
 			return (Boolean)primitiveValue;
@@ -203,8 +332,5 @@
 		
 		
 	}
-
-
-
 }
 

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/AllocatedCashflow.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/AllocatedCashflow.java	2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/AllocatedCashflow.java	2008-06-14 16:17:03 UTC (rev 20481)
@@ -1,7 +1,9 @@
 package org.drools.tutorials.banking;
 
 import java.util.Date;
+import org.drools.learner.tools.ClassAnnotation;
 
+ at ClassAnnotation(label_element = "getLabel")
 public class AllocatedCashflow extends TypedCashflow {
     private Account account;
 

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/Cashflow.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/Cashflow.java	2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/Cashflow.java	2008-06-14 16:17:03 UTC (rev 20481)
@@ -2,6 +2,9 @@
 
 import java.util.Date;
 
+import org.drools.learner.tools.ClassAnnotation;
+
+ at ClassAnnotation(label_element = "getLabel")
 public class Cashflow {
 
     private Date   date;
@@ -33,6 +36,10 @@
         this.amount = amount;
     }
 
+    public boolean getLabel() {
+    	Date deadline = new Date(System.currentTimeMillis());
+    	return date.before(deadline) && amount<500.00;
+    }
     public String toString() {
         return "Cashflow[date=" + date + ",amount=" + amount + "]";
     }

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/TypedCashflow.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/TypedCashflow.java	2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/TypedCashflow.java	2008-06-14 16:17:03 UTC (rev 20481)
@@ -2,6 +2,9 @@
 
 import java.util.Date;
 
+import org.drools.learner.tools.ClassAnnotation;
+
+ at ClassAnnotation(label_element = "getLabel")
 public class TypedCashflow extends Cashflow {
     public static final int CREDIT = 0;
     public static final int DEBIT  = 1;




More information about the jboss-svn-commits mailing list