[jboss-svn-commits] JBL Code SVN: r20662 - in labs/jbossrules/contrib/machinelearning/4.0.x: drools-core/src/main/java/org/drools/learner/builder and 5 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Jun 20 11:35:24 EDT 2008


Author: gizil
Date: 2008-06-20 11:35:24 -0400 (Fri, 20 Jun 2008)
New Revision: 20662

Modified:
   labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/DecisionTree.java
   labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Domain.java
   labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Instance.java
   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/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/QuantitativeDomain.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/TreeNode.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/DecisionTreeFactory.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/builder/Tester.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/ClassDistribution.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-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/InstDistribution.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/FieldAnnotation.java
   labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/RulePrinter.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/examples/ShoppingExample.java
   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/rules/org/drools/examples/Shopping.drl
Log:
ClassVisitor: Except the collection attributes and the self referencing attributes it is over. tested :)
Structured rules: rule is printing except imports. the objects classes must be imported.


Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/DecisionTree.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/DecisionTree.java	2008-06-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/DecisionTree.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -1,15 +1,20 @@
 package org.drools.learner;
 
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
 
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
 
+
 public class DecisionTree {
 	
-	//private static final Logger log = LoggerFactory.getSysOutLogger(LogLevel.ERROR);
-	//private static final Logger flog = LoggerFactory.getFileLogger(DecisionTree.class, LogLevel.ERROR, Util.log_file);
+	protected static SimpleLogger slog = LoggerFactory.getSysOutLogger(DecisionTree.class, SimpleLogger.DEFAULT_LEVEL);
 	
-	private Class<?> obj_clazz;
+	//private Class<?> obj_clazz;
+	private Schema obj_schema;
 	
 	/* the target attribute */
 	private Domain target;
@@ -26,16 +31,21 @@
 	public long FACTS_READ = 0;
 
 	public DecisionTree(Schema inst_schema, String _target) {
-		this.obj_clazz = inst_schema.getObjectClass();
+		this.obj_schema = inst_schema; //inst_schema.getObjectClass();
+
+		if (slog.debug() != null)
+			slog.debug().log("The target attribute: "+ _target+ "\n");
 		
-		//flog.debug("The target attribute: "+ _target);
+		this.target = inst_schema.getAttrDomain(_target);
 		
-		this.target = inst_schema.getAttrDomain(_target);
+		if (slog.debug() != null)
+			slog.debug().log("The target domain: "+ target+ "\n");
 		this.attrsToClassify = new ArrayList<Domain>(inst_schema.getAttrNames().size()-1);
 		for (String attr_name : inst_schema.getAttrNames()) {
 			if (!attr_name.equals(_target)) {
 				//flog.debug("Adding the attribute: "+ attr_name);
-				
+				if (slog.debug() != null)
+					slog.debug().log("Adding the attribute: "+ attr_name+ "\n");
 				this.attrsToClassify.add(inst_schema.getAttrDomain(attr_name));
 			}
 		}
@@ -45,7 +55,7 @@
 	
 	public DecisionTree(DecisionTree parentTree, Domain exceptDomain) {
 		//this.domainSet = new Hashtable<String, Domain<?>>();
-
+		this.obj_schema = parentTree.getSchema();
 		this.target = parentTree.getTargetDomain();
 		this.attrsToClassify = new ArrayList<Domain>(parentTree.getAttrDomains().size()-1);
 		for (Domain attr_domain : parentTree.getAttrDomains()) {
@@ -56,9 +66,17 @@
 		
 	}
 	
+	private Schema getSchema() {
+		return obj_schema;
+	}
+
 	public Class<?> getObjClass() {
-		return obj_clazz;
+		return obj_schema.getObjectClass();
 	}
+	
+	public HashMap<String, ArrayList<Field>> getAttrRelationMap() {
+		return obj_schema.getAttrRelationMap();
+	}
 
 	public void setID(int i) {
 		this.id = i;

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Domain.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Domain.java	2008-06-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Domain.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -3,24 +3,28 @@
 import java.util.ArrayList;
 import java.util.Collections;
 
+import org.drools.learner.tools.Util;
+
 public class Domain {
 	private boolean categorical, fixed, artificial;
+	//private DataType dataType;
 	private String fName;
-	private Class<?> fType;// not sure if necessary
+	private Class<?> fType, objKlass /*the class that attribute belongs to*/; // , ownerKlass;		// not sure if necessary
 	protected ArrayList<Object> fCategories;
 	
-	public Domain(String _name, Class<?> _type) {
+	public Domain(Class<?> klass, String _name, Class<?> _type) {
 		this.fName = _name;
 		this.fType = _type;
+		this.objKlass = klass;
 		
 		this.categorical = true;	// BY DEFAULT, it is categorical
 		this.artificial = false;	// BY DEFAULT, it is a real field, if it is artificial it means there is no field exist but there is method which computes the value
-		
+		//this.dataType = DataType.PRIMITIVE; // BY DEFAULT it is primitive
 		this.fCategories = new ArrayList<Object>(2);
 		
 	}
 	public Domain cheapClone() {
-		Domain dom = new Domain(this.fName, this.fType);
+		Domain dom = new Domain(this.objKlass, this.fName, this.fType);
 		//dom.fixed = this.fixed;
 		dom.categorical = this.categorical;
 		//dom.readingSeq = readingSeq;
@@ -28,12 +32,14 @@
 		
 		return dom;
 	}
-	
-	
+
 	public Class<?> getFType() {
 		return this.fType;
 	}
 	
+	public String getFReferenceName() {
+		return Util.getFReference(objKlass, fName);
+	}
 	public String getFName() {
 		return this.fName;
 	}
@@ -59,6 +65,21 @@
 		return this.categorical;
 	}
 	
+	// if the field is a artificial field
+	public void setArtificial(boolean b) {
+		this.artificial = b;
+	}
+	public boolean isArtificial() {
+		return this.artificial;
+	}
+//	public void setOwnerKlass(Class<?> owner_clazz) {
+//		 = owner_clazz;
+//	}
+	
+	public Class<?> getObjKlass() {
+		return objKlass;
+	}
+	
 	public void addCategory(Object value) {
 		if (fixed)	return;
 		if (categorical) {
@@ -147,12 +168,11 @@
 
 	}
 	
-	// if the field is a artificial field
-	public void setArtificial(boolean b) {
-		this.artificial = b;
-	}
-	public boolean isArtificial() {
-		return this.artificial;
-	}
+//	public DataType getDataType() {
+//		return this.dataType;
+//	}
+//	public void setDataType(DataType data_type) {
+//		this.dataType = data_type;
+//	}
 
 }

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Instance.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Instance.java	2008-06-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Instance.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -19,6 +19,8 @@
 		return weight;
 	}
 	
+	// name : _obj_klass+"@"+attr_name
+	// value : its value
 	public void setAttr(String _name, Object _value) {
 		Attribute f_attr = new Attribute();
 		f_attr.setName(_name);

Modified: 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	2008-06-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/InstanceFactory.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -7,10 +7,16 @@
 import org.drools.common.InternalWorkingMemory;
 import org.drools.learner.builder.Learner.DataType;
 import org.drools.learner.tools.ClassStructure;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+import org.drools.learner.tools.Util;
 import org.drools.spi.Extractor;
 
 public class InstanceFactory {
 
+	private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(InstanceFactory.class, SimpleLogger.WARN);
+	private static SimpleLogger slog = LoggerFactory.getSysOutLogger(InstanceFactory.class, SimpleLogger.WARN);
+	
 	private WorkingMemory session;
 	private Schema schema;
 	public InstanceFactory(WorkingMemory _session, Schema _schema) {
@@ -20,9 +26,23 @@
 	
 	public Instance createInstance(Object _obj) {
 		try {
-			Instance i= new Instance();
-			instantiateAttributes(i, _obj, _obj.getClass());
-			return i;
+			//if (schema.getClassStructure().containsKey(_obj.getClass())) {
+			if (schema.getObjectClass().isAssignableFrom(_obj.getClass())) {
+				Instance i= new Instance();
+				boolean bok = instantiateAttributes(i, _obj, _obj.getClass());
+				if (!bok) {
+					if (slog.error() != null)
+						slog.error().log("What is going on, how come it is wrong : ");
+					System.exit(0);
+				}
+				return i; // perfectly instantiated
+			} else 
+				return null;// could not instantiate
+			
+//			if (instantiateAttributes(i, _obj, _obj.getClass()))
+//				return i;	// perfectly instantiated
+//			else
+//				return null;// could not instantiate
 		} catch (Exception e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
@@ -30,11 +50,16 @@
 		return null;
 	}
 
-	public void instantiateAttributes(Instance inst, Object _obj, Class<?> klass) throws Exception {
-		if (klass.equals(Object.class))
-			return;
+	public boolean instantiateAttributes(Instance inst, Object _obj, Class<?> klass) throws Exception {
+
+		if (slog.debug() != null)
+			slog.debug().log("Klass : "+ klass);
+		ClassStructure struct = schema.getClassStructure().get(klass);
+		if (slog.debug() != null)
+			slog.debug().log("\t ClassStructure : "+ struct + "\n");
+		if (struct == null)
+			return false;
 		
-		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();
@@ -48,30 +73,36 @@
 			DataType f_type = struct.getFieldType(f);
 			getAttributeValue(inst, _obj, f_name, f_type);
 		}
-
-		instantiateAttributes(inst, _obj, struct.getParent());
+		if (!struct.getParent().equals(Object.class))
+			return instantiateAttributes(inst, _obj, struct.getParent());
 		
-		return;
+		return true;
 	}
 	
 	public void getAttributeValue(Instance inst, Object _obj, String name, DataType type) throws Exception {
+		Class<?> _obj_klass = _obj.getClass();
+		String fReference = Util.getFReference(_obj_klass, name);
 		switch (type) {
 		case PRIMITIVE:		// domain exist only for primitive types
-			Domain fieldDomain = schema.getAttrDomain(name);
-			Extractor f_extractor = schema.getAttrExtractor(name);
+			Domain fieldDomain = schema.getAttrDomain(fReference);		
+			Extractor f_extractor = schema.getAttrExtractor(fReference);
+			if (slog.debug() != null)
+				slog.debug().log("Field name : "+ name+ " of the object "+ _obj + " the extract:"+f_extractor+"\n");
+			
 			Object f_value = f_extractor.getValue( (InternalWorkingMemory) session, _obj);
 			try {
 				if (fieldDomain.isPossible(f_value)) {
 					fieldDomain.addCategory(f_value);
-					inst.setAttr(name, f_value);
+					inst.setAttr(fReference, f_value);
 				}
 			} catch (Exception e) {
-				System.out.println("Domain: "+fieldDomain+ " could not add the value "+ f_value);
+				if (slog.debug() != null)
+					slog.debug().log("Domain: "+fieldDomain+ " could not add the value "+ f_value+ "\n");
 				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
+			Extractor complex_f_extractor = schema.getAttrExtractor(fReference);	// this returns an object to me
 			Object obj_value = complex_f_extractor.getValue( (InternalWorkingMemory) session, _obj);
 			instantiateAttributes(inst, obj_value, obj_value.getClass());
 			

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-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/InstanceList.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -5,19 +5,17 @@
 import java.util.List;
 
 import org.drools.WorkingMemory;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.spi.Extractor;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
 public class InstanceList {
 
+	private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(InstanceList.class, SimpleLogger.WARN);
+	private static SimpleLogger slog = LoggerFactory.getSysOutLogger(InstanceList.class, SimpleLogger.WARN);
+	
 	private Schema schema;
 	private ArrayList<Instance> instances;
 	private InstanceFactory factory;
 	
-	// old constructer
-	public InstanceList(Schema _schema) {
-		this.schema = _schema;
-		this.instances = new ArrayList<Instance>(); 
-	}
 	public InstanceList(Schema _schema, WorkingMemory _session) {
 		this.schema = _schema;
 		this.instances = new ArrayList<Instance>(); 
@@ -31,52 +29,21 @@
 	}
 
 	public void addStructuredInstance(Object _obj) {
+		//the factory will validate the object class during the execution
 		// create instance and all attributes according to the schema		
 		Instance inst = factory.createInstance(_obj);		
-		System.out.println(inst);
-		if (inst != null )
+		
+		if (inst != null ) {
+			// the object is validated and the instance is created
+			//System.out.println(inst);
 			instances.add(inst);
-		else {
-			System.out.println("Couldnot create the instance");
-			System.exit(0);
+		} else {
+			if (slog.warn() != null)
+				slog.warn().log("The object "+_obj.getClass()+" is not related to the structure, couldnot create the instance\n");
+			//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();
-		
-		for (String f_name : schema.getAttrNames()) {
-			Domain f_domain = schema.getAttrDomain(f_name);
-			//ClassFieldExtractor f_extractor = schema.getAttrExtractor(f_name);
-			Extractor f_extractor = schema.getAttrExtractor(f_name);//Label
-			/* from WorkingMemoryLogger, private String extractDeclarations(final Activation activation,  final WorkingMemory workingMemory) {
-			 * you can cast the WorkingMemory
-			 * final Object value = declaration.getValue( (InternalWorkingMemory) workingMemory, handleImpl.getObject() );
-			 */
-			Object f_value = f_extractor.getValue( (InternalWorkingMemory) _session, _obj);
-			/* TODO instanity checks 
-			 * 1- is this value possible by type?
-			 * 2- does this value exist in the possible set of values (if the domain type is categorical)?
-			 * 
-			 */
-			try {
-				if (f_domain.isPossible(f_value)) {
-					f_domain.addCategory(f_value);
-					inst.setAttr(f_name, f_value);
-				}
-			} catch (Exception e) {
-				System.out.println("Domain: "+f_domain+ " could not add the value "+ f_value);
-				e.printStackTrace();
-			}
-			
-		}
-		
-		System.out.println("inst:"+ inst);
-		instances.add(inst);
-	}
-	
 	public void addAsInstance(Instance inst) {
 		instances.add(inst);
 	}

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-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Memory.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -9,9 +9,10 @@
 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 {
+	// by default structured
+	public static Memory createFromWorkingMemory(WorkingMemory _session, Class<?> clazz, DomainAlgo domain, DataType data) throws FeatureNotSupported {
 		// if mem == null
 		Memory mem = new Memory();
 
@@ -21,7 +22,7 @@
 		// create schema from clazz
 		Schema inst_schema = null;
 		try {
-			inst_schema = Schema.createStructuredSchema(clazz, domain, data);
+			inst_schema = Schema.createSchemaStructure(clazz, domain, data);
 		} catch (Exception e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
@@ -39,45 +40,16 @@
 		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);
+			// validating in the the factory during instantiation
+			//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, DataType data) throws FeatureNotSupported {
-		// if mem == null
-		Memory mem = new Memory();
 
-		mem.session = _session;
 
-		mem.setClassToClassify(clazz);
-		// create schema from clazz
-		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));
-
-		/* 
-		 * 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).addFromWorkingMemory(_session, obj);
-		}
-		//dt.FACTS_READ += facts.size();
-
-		return mem;
-	}
-
-
 	// Drools memory
 	private WorkingMemory session;
 	//// class specification
@@ -101,5 +73,4 @@
 	}
 
 	
-	
 }

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/QuantitativeDomain.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/QuantitativeDomain.java	2008-06-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/QuantitativeDomain.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -9,14 +9,14 @@
 public class QuantitativeDomain extends Domain{
 	
 	public static QuantitativeDomain createFromDomain(Domain father) {
-		QuantitativeDomain quantitative = new QuantitativeDomain(father.getFName(), father.getFType());
+		QuantitativeDomain quantitative = new QuantitativeDomain(father.getObjKlass(), father.getFName(), father.getFType());
 		//quantitative.setCategories(father.getCategories());
 		
 		return quantitative;
 	}
 	
 	public QuantitativeDomain cheapClone() {
-		QuantitativeDomain qdom = new QuantitativeDomain(super.getFName(), super.getFType());
+		QuantitativeDomain qdom = new QuantitativeDomain(super.getObjKlass(), super.getFName(), super.getFType());
 		if (super.isCategorical()) {
 			System.out.println("QuantitativeDomain.cheapClone() fuck categorical how come QuantitativeDomain cloned " );
 			System.exit(0);
@@ -33,8 +33,8 @@
 
 	private ArrayList<SplitPoint> splits;
 	
-	private QuantitativeDomain(String _fname, Class<?> _ftype) {
-		super(_fname, _ftype);
+	private QuantitativeDomain(Class<?> _obj_klass, String _fname, Class<?> _ftype) {
+		super(_obj_klass, _fname, _ftype);
 		super.setCategorical(false);	 // by deafault it is true, must set it to false
 		this.splits = new ArrayList<SplitPoint>();
 		

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-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Schema.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -1,210 +1,22 @@
 package org.drools.learner;
 
 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;
-import org.drools.learner.tools.Util;
 import org.drools.spi.Extractor;
 
-/*
- * A description of a data set's attributes and their properties.
- */
 public class Schema {
-
-	public static Schema createFromClass(Class<?> clazz, DomainAlgo domain_type, DataType data_type) throws FeatureNotSupported {
-		Schema schema = new Schema(clazz);
-		ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
-		/*
-		ArrayList<Field> element_fields = new ArrayList<Field>();
-		Util.getAllFields(clazz, element_fields); 
-		*/
-		
-		ArrayList<Field> element_fields = new ArrayList<Field>();
-		/* Apperantly the getMethod function recurse on the superclasses
-		 * i dont need to recurse myself
-		ArrayList<Class<?>> element_classes = new ArrayList<Class<?>>();
-		Util.getAllFields(clazz, element_fields, element_classes); 
-		 */
-		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();
-			FieldAnnotation spec = Util.getFieldAnnotations(f);
-			
-			if (spec != null) {
-				if (!spec.ignore() && f.getType() == String.class && !spec.discrete()) {
-					
-					throw new FeatureNotSupported("String categorization not supported");
-				}
-				boolean skip = false;
-				switch (domain_type) {
-				case CATEGORICAL:	//ID3 can work only with categorical types
-					if (spec.ignore() || !spec.discrete())
-						skip = true;
-					break;
-				case QUANTITATIVE: // C45 can work with categorical || quantitative domain
-					if (spec.ignore())
-						skip = true;
-					break;
-				default:
-					if (spec.ignore())
-						skip = true;
-				}
-				// only if the annotations are given and the flag to ignore is set true 
-				// then continue to next field	
-				if (skip)	continue;	
-			}
-			Domain fieldDomain = new Domain(f_name, f.getType());
-			if (spec != null) {	// if the annotations are given Read them to update domain's properties
-				fieldDomain.setCategorical(spec.discrete());	
-				if (spec.target())	{	schema.addTarget(f_name);	}
-			}// else just set every thing categorical
-			
-			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.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
-		 * i dont need to recurse myself
-		for (Class<?> c: element_classes) {
-			Annotation[] annotations = c.getAnnotations();
-		*/
-		
-		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();
-			}
-		}
-		//}
-		
-		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();
-				
-				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;
-	}
-	
-	
 	public static Schema createSchemaStructure(Class<?> clazz, DomainAlgo domain_type, DataType data_type) throws Exception {
 		Schema schema = new Schema(clazz);
 		//ŒClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
@@ -212,76 +24,46 @@
 		// 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
 		 */	
+		if (!visitor.isTargetFound()) {
+			throw new Exception("Target Not Found, please annotate the target field");
+		} else if (schema.getTargets().size()>1) {
+			//System.out.println("More ");
+			throw new FeatureNotSupported("More than one target specified, feature not supported yet ");
+		}
 		return schema;
 	}
 	// the owner class of the schema
 	private Class<?> klass;
 	
 	// the structure of the owner class
-	private HashMap<Class<?>,ClassStructure> klass_structure;
+	private HashMap<Class<?>,ClassStructure> klassStructure;
 	
-	// key: field name
-	private Hashtable<String, Extractor> extractorMap;
+	// key: Object_class_name at field_name
+	private HashMap<String, Extractor> extractorMap;
 
-	// key: field name
-	private Hashtable<String, Domain> domainMap;
+	// key: Object_class_name at field_name
+	private HashMap<String, Domain> domainMap;
+	
+	// key: Object_class_name at field_name
+	private HashMap<String, ArrayList<Field>> attrRelationMap;
+	
 
 	private HashSet<String> targets;
 	
 	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.klassStructure = new HashMap<Class<?>,ClassStructure>();
+		this.extractorMap = new HashMap<String, Extractor>();
+		this.domainMap = new HashMap<String, Domain>();
+		this.attrRelationMap = new HashMap<String, ArrayList<Field>>();
 		this.targets = new HashSet<String>();
 	}
 	
@@ -290,13 +72,24 @@
 	}
 	
 	public HashMap<Class<?>,ClassStructure> getClassStructure() {
-		return klass_structure;
+		return klassStructure;
 	}
 	public void putStructure(Class<?> clazz, ClassStructure structure) {
-		klass_structure.put(clazz, structure);;
+		klassStructure.put(clazz, structure);;
 	}
 	
+	public void addParentField(String attr_name, Field klass) {
+		if (!this.attrRelationMap.containsKey(attr_name)) {
+			this.attrRelationMap.put(attr_name, new ArrayList<Field>());
+		}
+		this.attrRelationMap.get(attr_name).add(klass);
+	}
 	
+	public HashMap<String, ArrayList<Field>> getAttrRelationMap() {
+		return attrRelationMap;
+	}
+	
+	
 	public boolean addTarget(String _target) {
 		return targets.add(_target);
 	}
@@ -328,6 +121,6 @@
 		return targets;
 	}
 
-	
-	
+
+
 }

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/TreeNode.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/TreeNode.java	2008-06-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/TreeNode.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -9,8 +9,7 @@
 	
 	//private static final Logger log = LoggerFactory.getSysOutLogger(TreeNode.class, LogLevel.ERROR);
 	//private static final Logger flog = LoggerFactory.getFileLogger(TreeNode.class);	
-	
-	
+
 	private Domain domain;
 	private Hashtable<Object, TreeNode> children;
 	/* TODO explain
@@ -62,7 +61,7 @@
 	}
 	
 	public Object voteFor(Instance i) {
-		final Object attr_value = i.getAttrValue(this.domain.getFName());
+		final Object attr_value = i.getAttrValue(this.domain.getFReferenceName());
 		final Object category = domain.getCategoryOf(attr_value);
 		
 		final TreeNode my_node = this.getChild(category);

Modified: 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	2008-06-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/AdaBoostKBuilder.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -62,7 +62,7 @@
 				Instance inst_i = class_instances.getInstance(index_i);
 				
 				
-				Object instance_target = inst_i.getAttrValue(_trainer.getTargetDomain().getFName());
+				Object instance_target = inst_i.getAttrValue(_trainer.getTargetDomain().getFReferenceName());
 				Object instance_target_category = _trainer.getTargetDomain().getCategoryOf(instance_target);
 				Object target_category= _trainer.getTargetDomain().getCategory(index_j);
 				

Modified: 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	2008-06-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeFactory.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -64,7 +64,7 @@
 		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);
+		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());
@@ -91,7 +91,7 @@
 		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);
+		Memory mem = Memory.createFromWorkingMemory(wm, obj_class, learner.getDomainAlgo(), data);
 		forest.build(mem, learner);
 		//forest.clearForest(10);
 
@@ -121,7 +121,7 @@
 		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);
+		Memory mem = Memory.createFromWorkingMemory(wm, obj_class, learner.getDomainAlgo(), data);
 		forest.build(mem, learner);
 		//forest.clearForest(10);
 

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-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/Learner.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -38,8 +38,9 @@
 
 	
 	public DecisionTree train_tree(InstanceList working_instances) {
-		String target = this.getTargetDomain().getFName();
-		DecisionTree dt = new DecisionTree(input_data.getSchema(), target);
+		String target_reference = this.getTargetDomain().getFReferenceName();
+		//System.out.println("(Learner) target   "+ target_reference);
+		DecisionTree dt = new DecisionTree(input_data.getSchema(), target_reference);
 
 		//flog.debug("Num of attributes: "+ dt.getAttrDomains().size());
 		
@@ -57,6 +58,7 @@
 		Iterator<String> it_target= input_data.getTargets().iterator();
 		// TODO check if there is a target candidate
 		String target = it_target.next();
+		//System.out.println("(Learner) What is target?? "+ target +" and the domain "+ input_data.getSchema().getAttrDomain(target));
 		return input_data.getSchema().getAttrDomain(target);
 		
 	}

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/Tester.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/Tester.java	2008-06-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/Tester.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -15,7 +15,7 @@
 	public abstract Stats test(InstanceList data);// String executionSignature
 	
 	public static Integer evaluate (Domain targetDomain, Instance i, Object tree_decision) {	
-		String targetFName = targetDomain.getFName();
+		String targetFName = targetDomain.getFReferenceName();
 		
 		Object tattr_value = i.getAttrValue(targetFName);
 		Object i_category = targetDomain.getCategoryOf(tattr_value);

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-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Categorizer.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -47,12 +47,12 @@
 			data.addAll(_data_in_class.getSupportersFor(targetCategory));
 		}
 		
-		this.targetComp = new InstanceComparator(targetDomain.getFName());
+		this.targetComp = new InstanceComparator(targetDomain.getFReferenceName());
 	}
 	
 	public void findSplits(QuantitativeDomain attrDomain) {
 		this.splitDomain = attrDomain;
-		this.attrComp = new InstanceComparator(attrDomain.getFName());
+		this.attrComp = new InstanceComparator(attrDomain.getFReferenceName());
 		
 		init_binary_domain();
 		
@@ -60,7 +60,7 @@
 		Collections.sort(this.data, this.attrComp);
 		
 		int last_index = this.data.size()-1;
-		Object last_value = data.get(last_index).getAttrValue(this.splitDomain.getFName());
+		Object last_value = data.get(last_index).getAttrValue(this.splitDomain.getFReferenceName());
 		this.splitDomain.addSplitPoint(new SplitPoint(last_index, last_value));	
 		
 		find_a_split(0, this.data.size(), this.maxDepth, this.distribution);
@@ -69,7 +69,7 @@
 	
 	public static Domain init_binary_domain() {
 		//if (binaryDomain == null) {
-			Domain bD = new Domain("binary", Integer.class); //splitDomain.cheapClone();
+			Domain bD = new Domain(Object.class, "binary", Integer.class); //splitDomain.cheapClone();
 			bD.addCategory(key0);	//addSplitPoint(new SplitPoint(0, key0));
 			bD.addCategory(key1); //addSplitPoint(new SplitPoint(1, key1)); 
 		//}
@@ -119,7 +119,7 @@
 
 		int num_split_points = 0, split_index = begin_index+1;	
 		int last_index = size-1;
-		Object last_value = data.get(last_index).getAttrValue(this.splitDomain.getFName());
+		Object last_value = data.get(last_index).getAttrValue(this.splitDomain.getFReferenceName());
 		SplitPoint bestPoint = new SplitPoint(last_index, last_value);	
 		CondClassDistribution best_distribution = null;//instances_by_attr;
 		Instance i1 = data.get(begin_index), i2; 
@@ -130,8 +130,8 @@
 			i2= data.get(index);
 			
 			/* every time i read a new instance and change the place in the distribution */
-			instances_by_attr.change(key0, i1.getAttrValue(this.targetDomain.getFName()), +1.0d * i1.getWeight());	//+1
-			instances_by_attr.change(key1, i1.getAttrValue(this.targetDomain.getFName()), -1.0d * i1.getWeight());	//-1
+			instances_by_attr.change(key0, i1.getAttrValue(this.targetDomain.getFReferenceName()), +1.0d * i1.getWeight());	//+1
+			instances_by_attr.change(key1, i1.getAttrValue(this.targetDomain.getFReferenceName()), -1.0d * i1.getWeight());	//-1
 		
 			if (flog.debug() !=null)
 				flog.debug().log("Instances " +i1+" vs "+i2);
@@ -148,8 +148,8 @@
 				if (flog.debug() !=null)
 					flog.debug().log("entropy.info_cont() SEARCHING: "+(index)+" attr "+this.splitDomain.getFName()+ " "+ i2);
 				// the cut point
-				Object cp_i = i1.getAttrValue(this.splitDomain.getFName());
-				Object cp_i_next = i2.getAttrValue(this.splitDomain.getFName());
+				Object cp_i = i1.getAttrValue(this.splitDomain.getFReferenceName());
+				Object cp_i_next = i2.getAttrValue(this.splitDomain.getFReferenceName());
 
 				Class<?> fClass = this.splitDomain.getFType();
 				

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/ClassDistribution.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/ClassDistribution.java	2008-06-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/ClassDistribution.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -23,7 +23,7 @@
 	
 	public ClassDistribution(Domain targetDomain) {
 		this.target_attr = targetDomain;
-		
+		//System.out.println("(ClassDistribution)target_attr "+ target_attr);
 		this.quantity_by_class =  new Hashtable<Object, Double>(this.target_attr.getCategoryCount() + 1);		
 		for (int c=0; c<this.target_attr.getCategoryCount(); c++) {
 			Object category = this.target_attr.getCategory(c);

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-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Entropy.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -95,9 +95,9 @@
 			Object targetCategory = target_domain.getCategory(category); 
 			
 			for (Instance inst: insts_by_target.getSupportersFor(targetCategory)) {
-				Object inst_attr_category = inst.getAttrValue(attr_domain.getFName());
+				Object inst_attr_category = inst.getAttrValue(attr_domain.getFReferenceName());
 				
-				Object inst_class = inst.getAttrValue(target_domain.getFName());
+				Object inst_class = inst.getAttrValue(target_domain.getFReferenceName());
 				
 				if (!targetCategory.equals(inst_class)) {
 					if (flog.error() != null)
@@ -122,7 +122,7 @@
 		List<Instance> data = visitor.getSortedInstances();
 		QuantitativeDomain splitDomain = visitor.getSplitDomain();
 		Domain targetDomain = insts_by_target.getClassDomain();
-		String targetAttr = targetDomain.getFName();
+		String targetAttr = targetDomain.getFReferenceName();
 		
 		CondClassDistribution instances_by_attr = new CondClassDistribution(splitDomain, targetDomain);
 		instances_by_attr.setTotal(data.size());

Modified: 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	2008-06-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/GlobalCategorizer.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -86,7 +86,7 @@
 					/* 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.setFName(attr_domain.getFReferenceName()+"_fake");	// TODO how do we know whose fake copy is that domain
 					trialDomain.setCategorical(true);
 					
 					for (Object category: filtered_stats.keySet()) {
@@ -95,7 +95,7 @@
 						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);
+								i.setAttr(attr_domain.getFReferenceName()+"_fake", category);
 							}
 						}
 						

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/InstDistribution.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/InstDistribution.java	2008-06-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/InstDistribution.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -9,12 +9,17 @@
 import org.drools.learner.Instance;
 import org.drools.learner.QuantitativeDomain;
 import org.drools.learner.tools.FeatureNotSupported;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
 import org.drools.learner.tools.Util;
 
 /* addition to the ClassDistribution 
  * it keeps the instances themselves by their target value in an hashmap */
 public class InstDistribution extends ClassDistribution{
 	
+	private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(InstDistribution.class, SimpleLogger.DEFAULT_LEVEL);
+	private static SimpleLogger slog = LoggerFactory.getSysOutLogger(InstDistribution.class, SimpleLogger.DEFAULT_LEVEL);
+
 	private String attr_sum = Util.sum();
 	private Hashtable<Object, List<Instance>> instance_by_class;
 	
@@ -32,9 +37,14 @@
 	
 	public void calculateDistribution(List<Instance> instances){
 		double data_size = 0.0;
-		String tName = super.getClassDomain().getFName();
+		String tName = super.getClassDomain().getFReferenceName();
+		if (flog.debug() != null)
+			flog.debug().log("tName : " +tName + "\n");
 		for (Instance inst : instances) {
+			if (flog.debug() != null)
+				flog.debug().log("inst : " +inst + "\n");
 			data_size += inst.getWeight();
+			
 			Object target_key = inst.getAttrValue(tName);
 			super.change(target_key, inst.getWeight());		// add one for vote for the target value : target_key
 			//super.change(attr_sum, inst.getWeight());		// ?????
@@ -95,7 +105,7 @@
 			instLists = this.instantiateLists(splitDomain);
 		
 		Domain target_domain = super.getClassDomain();
-		String attrName = splitDomain.getFName();
+		String attrName = splitDomain.getFReferenceName();
 		for (int category = 0; category<target_domain.getCategoryCount() ; category++) {
 			Object targetCategory = target_domain.getCategory(category); 
 			//this.calculateDistribution(this.getSupportersFor(targetCategory));
@@ -116,7 +126,7 @@
 				QuantitativeDomain attributeDomain, Hashtable<Object, InstDistribution> instLists) {
 		
 		String attributeName = attributeDomain.getFName();
-		String targetName = super.getClassDomain().getFName();
+		String targetName = super.getClassDomain().getFReferenceName();
 		
 		//flog.debug("FactProcessor.splitFacts_cont() attr_split "+ attributeName);
 

Modified: 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	2008-06-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ClassVisitor.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -3,7 +3,9 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.util.HashMap;
+import java.util.Stack;
 
+import org.drools.RuntimeDroolsException;
 import org.drools.base.ClassFieldExtractorCache;
 import org.drools.learner.Domain;
 import org.drools.learner.Schema;
@@ -13,21 +15,18 @@
 import org.drools.spi.Extractor;
 
 public class ClassVisitor {
+	
+	private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(ClassVisitor.class, SimpleLogger.WARN);
+	private static SimpleLogger slog = LoggerFactory.getSysOutLogger(ClassVisitor.class, SimpleLogger.WARN);
+	
+	
 	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 Stack<Field> class_relation;
 
 	private boolean TARGET_FOUND;
 	private boolean MULTIPLE_TARGETS = false;
@@ -46,53 +45,52 @@
 		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());		
+		class_relation =  new Stack<Field>();
+		getStructuredSuperFields(class_schema.getObjectClass()/*, null*/);		 
+			
 		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()))
+	public void getStructuredSuperFields(Class<?> clazz/*, Class<?> owner_clazz*/){
+		if (slog.debug() != null)
+			slog.debug().log("On the class "+ clazz+  " the structure exists "+ class_schema.getClassStructure().containsKey(clazz));
+		if (class_schema.getClassStructure().containsKey(clazz) && class_schema.getClassStructure().get(clazz).isDone())
 			return;
-
+		// process if the parent_klass.equals(Object.class) ?????
 		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);
-		}
-		
+			try {
+				decomposeField(structure, f /*, owner_clazz*/);
+			} catch (FeatureNotSupported e) {
+				if (slog.error() != null)
+					slog.error().log("FeatureNotSupported "+e+")\n");
+				
+			}
+		}	
 		structure.setDone();
-		
 		Class<?> parent_klass = clazz.getSuperclass();
 		structure.setParent(parent_klass);
+		if (parent_klass.equals(Object.class))
+			return;
 		getStructuredSuperFields(parent_klass);
 		
 		return;
 	}
 	
-	public void decomposeField(ClassStructure structure, Field f) throws FeatureNotSupported {
+	public void decomposeField(ClassStructure structure, Field f/*, Class<?> owner_clazz*/) throws FeatureNotSupported {
 		// can get the field annotation
 		// if it is ignored do not do anything
 		FieldAnnotation f_spec = Util.getFieldAnnotations(f);
@@ -119,47 +117,57 @@
 			// then continue to next field	
 			
 		}
+		// if there is a getter?
+		//if (Util.isGetter(m_name) & Util.isSimpleType(returns)) {
+		
 		if (!skip_by_annotation) {
-			String f_name= f.getName();
+			String f_name= f.getName();		
 			Class<?> _obj_klass = structure.getOwnerClass();
+			String f_refName = Util.getFReference(_obj_klass, f_name);
 			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;
+				if (slog.warn() != null)
+					slog.warn().log("The field "+f_name+" of the obj klass:"+_obj_klass + " and the loader:" + _obj_klass.getClassLoader()+ "\n");
+				try {
+					Extractor f_extractor = cache.getExtractor( _obj_klass, f_name , _obj_klass.getClassLoader() );
+					class_schema.putExtractor(f_refName, f_extractor);
+					structure.addField(f, d_type);	
+					switch (d_type) {    
+					case PRIMITIVE:		// domain will be created only for primitive types
+						Domain fieldDomain = new Domain(_obj_klass, f_name, f.getType());
+						//fieldDomain.setOwner(owner_clazz);
+						if (f_spec != null) {
+							fieldDomain.setCategorical(f_spec.discrete());	
+							if ((MULTIPLE_TARGETS || !TARGET_FOUND) && f_spec.target()) {	
+								class_schema.addTarget(f_refName);	
+								TARGET_FOUND = true;
+							}
+						}
+						Util.processDomain(fieldDomain, f.getType());
+						class_schema.putDomain(f_refName, fieldDomain);
+						for (Field parent_klass: class_relation)
+							class_schema.addParentField(f_refName, parent_klass);
+						break;
+					case STRUCTURED:	// the extractor is necessary for both types of data.	
+						class_relation.push(f);
+						getStructuredSuperFields(f.getType());//recurse on the structured 
+						class_relation.pop();
+						break;
+					default:
+						//throw new Exception("What type of data is this");	
 					}
+				} catch (RuntimeDroolsException  e) {
+					if (slog.warn() != null)
+						slog.warn().log("Exception e:"+ e +" skip\n");
+					if (flog.warn() != null)
+						flog.warn().log("Exception e:"+ e +" skip");
 				}
-				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:
+			} else {	//case COLLECTION:
+				if (slog.warn() != null)
+					slog.warn().log("Case Collection(f_name "+f_name+" What is the obj klass:"+_obj_klass + ")\n");
 				throw new FeatureNotSupported("Can not deal with collections as an attribute");
-			default:
-				//throw new Exception("What type of data is this");	
 			}
 		}
 		return;
@@ -180,22 +188,24 @@
 				 * i dont need to recurse myself
 					Method m =c.getDeclaredMethod(lab.label_element(), null);
 				 */
-				Method m = clazz.getMethod(class_label.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());
+					
+					String f_refName = Util.getFReference(clazz, class_label.label_element()); // class.name + "@" + label
+					Domain fieldDomain = new Domain(clazz, class_label.label_element(), m.getReturnType());
 					fieldDomain.setArtificial(true);
-					Class<?> method_class = m.getReturnType();
+					Class<?> method_class = m.getReturnType();	
+					
 					Util.processDomain(fieldDomain, method_class);
 					clazz_structure.addMethod(m);
-					class_schema.putDomain(class_label.label_element(), fieldDomain);
+					class_schema.putDomain(f_refName, 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);
+					class_schema.putExtractor(f_refName, m_extractor);
 					if (!MULTIPLE_TARGETS)
 						class_schema.clearTargets();
-					class_schema.addTarget(class_label.label_element());
+					class_schema.addTarget(f_refName);
 					TARGET_FOUND = true;
 					//break; // if the ClassAnnotation is found then stop
 				}
@@ -208,6 +218,11 @@
 				e.printStackTrace();
 			}
 		}
+	}
+
+	public boolean isTargetFound() {
+		// TODO Auto-generated method stub
+		return TARGET_FOUND;
 	}	
 
 }

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/FieldAnnotation.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/FieldAnnotation.java	2008-06-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/FieldAnnotation.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -5,7 +5,7 @@
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ElementType.METHOD, ElementType.FIELD})
 public @interface FieldAnnotation {
-	    int readingSeq();
+	    int readingSeq() default 0;
 	    boolean ignore() default false;
 	    boolean target() default false;
 	    boolean discrete() default true;

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/RulePrinter.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/RulePrinter.java	2008-06-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/RulePrinter.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -6,9 +6,11 @@
 import java.io.IOException;
 import java.io.Reader;
 import java.io.StringReader;
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Stack;
 
@@ -19,15 +21,15 @@
 
 public class RulePrinter {
 	
-//	private static final Logger log = LoggerFactory.getSysOutLogger(RulePrinter.class, LogLevel.ERROR);
-//	private static final Logger flog = LoggerFactory.getFileLogger(RulePrinter.class, LogLevel.ERROR, Util.log_file); 
-//	
+	private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(RulePrinter.class, SimpleLogger.WARN);
+	private static SimpleLogger slog = LoggerFactory.getSysOutLogger(RulePrinter.class, SimpleLogger.WARN);
 	
+	
 	public static Reader readRules(DecisionTree learned_dt) {
 		
 		RulePrinter my_printer = new RulePrinter();	//bocuk.getNum_fact_trained()
 		my_printer.setBoundOnNumRules(Util.MAX_NUM_RULES);
-		my_printer.printer(learned_dt, Util.SORT_RULES_BY_RANK);
+		my_printer.print(learned_dt, Util.SORT_RULES_BY_RANK);
 		
 		String all_rules = my_printer.write2string();
 		if (Util.PRINT_RULES) {
@@ -48,6 +50,8 @@
 	
 	private int bound_on_num_rules;
 	private double num_instances;
+
+	private HashMap<String, ArrayList<Field>> attrRelations;
 	
 	//private NumberComparator nComparator;
 	
@@ -84,8 +88,9 @@
 		this.num_instances = num;
 	}
 	
-	public void printer(DecisionTree dt, boolean sort) {//, PrintStream object
+	public void print(DecisionTree dt, boolean sort) {//, PrintStream object
 		this.rule_clazz = dt.getObjClass();
+		this.attrRelations = dt.getAttrRelationMap();
 		this.num_instances = dt.getRoot().getNumMatch();
 		dfs(dt.getRoot());
 		
@@ -123,16 +128,44 @@
 	
 	private Rule spitRule(Stack<NodeValue> nodes) {
 		//, Stack<NodeValue> leaves // if more than one leaf
-		Rule newRule = new Rule(nodes.size());// (nodes, leaves) //if more than one leaf
-		newRule.setObjectClass(this.getRuleClass());
+		Rule newRule = new Rule(this.getRuleClass(), nodes.size());// (nodes, leaves) //if more than one leaf
 		Iterator<NodeValue> it = nodes.iterator();
 		while (it.hasNext()) {
 
 			NodeValue current = it.next();
+			if (slog.error() != null)
+				slog.error().log("NodeValue " +current + "\n");
+			
+			if (slog.error() != null)
+				slog.error().log("attrRelations [" +attrRelations.size() + "]\n");
 			if (it.hasNext()) { 
-				newRule.addCondition(current);
+				ArrayList<Field> nodeRelations = attrRelations.get(current.getFReference());
+				
+				if (nodeRelations == null || nodeRelations.isEmpty()) { 
+					// this a direct child add 
+					newRule.addConditionToMain(current);
+					
+				} else {
+					
+					for (Field f:nodeRelations) {	
+						// i need the class that the field belongs to boooook
+						String referenceOfCondition = Util.getDecReference(f);
+						if (slog.error() != null)
+							slog.error().log("[" +referenceOfCondition + "],");
+					}
+					if (slog.error() != null)
+						slog.error().log("\n");
+					newRule.processNodeValue(current, nodeRelations, 0, 1);	//int condition_or_action = condition = 1
+				}
 			} else {
-				newRule.addAction(current);
+
+				ArrayList<Field> nodeRelations = attrRelations.get(current.getFReference());
+				if (nodeRelations == null || nodeRelations.isEmpty()) { 
+					// this a direct child add to reference to the main guy 
+					newRule.addActionToMain(current);
+				} else {
+					newRule.processNodeValue(current, nodeRelations, 0, 2);	//int condition_or_action = action = 2	
+				}
 			}
 		}
 		return newRule;	
@@ -236,38 +269,155 @@
 
 class Rule {
 	
-	private Class<?> attr_obj;	// object class name
-	private ArrayList<NodeValue> conditions;
-	private ArrayList<NodeValue>  actions;
+	private Class<?> main_obj;	// object class name
+	private ArrayList<Declaration> rule_decs;
+	private ArrayList<AttrReference>  actions;
 	
+	// key: the reference of the declaration, => id of the declaration
+	private HashMap <String, Integer> declarationMap;
+	
+	private int num_declarations; 
+	
 	private double rank;				 // matching ratio
 	private double num_classified_instances;// number of instances matching that rule
 	
 	private int id;						 // unique id, need a unique name in the drl file
+//	private String referenceToMain = main_obj.getName()+"0";
+	private int main_obj_id = 0;
 	
+	Rule(Class<?> obj, int numCond) {
+		num_declarations = 0;
+		rule_decs = new ArrayList<Declaration>(1); //new ArrayList<Declaration>(1);
+		declarationMap = new HashMap<String, Integer>(1);
+		main_obj= obj;
+		String obj_ref = getObjectClassName().toLowerCase();
+		declarationMap.put(obj_ref, num_declarations);
+		
+		rule_decs.add(new Declaration(main_obj, obj_ref, num_declarations));
+		actions = new ArrayList<AttrReference>(1);
+	}
 	
-	Rule(int numCond) {
-		conditions = new ArrayList<NodeValue>(numCond);
-		actions = new ArrayList<NodeValue>(1);
+	public void addConditionToMain(NodeValue current) {
+		rule_decs.get(main_obj_id).addCondition(current);
 	}
 	
-	public void addCondition(NodeValue current) {
-		NodeValue nv = new NodeValue(current.getNode());
-		nv.setNodeValue(current.getNodeValue());
-		conditions.add(nv);
+	public void addActionToMain(NodeValue current) {
+		AttrReference aRef = new AttrReference(current);	//D
+		rule_decs.get(main_obj_id).addActionReference(aRef);						//D
+		addAction(aRef);									//D
+		setRuleStats(current);								//D
 	}
-	public void addAction(NodeValue current) {
-		NodeValue nv = new NodeValue(current.getNode());
-		nv.setNodeValue(current.getNodeValue());
-		actions.add(nv);
+	
+	public void addCondition(NodeValue current, ArrayList<Field> nodeRelations, int rel_id) {
+		if (rel_id == nodeRelations.size()) {	// it must be primitive
+			Field referenceField = nodeRelations.get(nodeRelations.size()-1);			
+			String referenceOfCondition = Util.getDecReference(referenceField);
+			
+			System.out.println("It is primitive, should add a condition to its father "+referenceOfCondition+ " rel_id "+ rel_id + " size "+ (nodeRelations.size()-1)+ " \n");	
+			Declaration dec = rule_decs.get(declarationMap.get(referenceOfCondition));
+			dec.addCondition(current);					//D
+		} else {
+			Field referenceField = nodeRelations.get(rel_id);			
+			String referenceOfCondition = Util.getDecReference(referenceField);
+			System.out.println("referenceOfCondition " +referenceOfCondition + " rel_id "+ rel_id + " size "+ (nodeRelations.size()-1));
+			Declaration the_place_declared = null;
+			
+			if (rel_id ==0 ) {
+				
+				the_place_declared = rule_decs.get(0);
+				System.out.println("The first guy "+referenceField.getName()+" to main declaration (ref?)"+ " rel_id "+ rel_id + " size "+ (nodeRelations.size()-1)+ " \n");	
+				
+			} else {
+				the_place_declared = rule_decs.get(rel_id-1);//declarationMap.get(referenceOfCondition));
+				System.out.println("Continue"+referenceField.getName()+" in "+the_place_declared+ "??? rel_id "+ rel_id + " size "+ (nodeRelations.size()-1)+ " \n");	
+			}
+			
+			if (!the_place_declared.hasReference(referenceField.getName())) {
+				num_declarations++;
+				Declaration new_dec = new Declaration(referenceField.getType(), referenceField.getName(), num_declarations);
+				System.out.println("Create new dec "+referenceOfCondition+" (Main declaration doesnot have a ref"+ referenceField.getName() + ") rel_id "+ rel_id + " size "+ (nodeRelations.size()-1)+ " \n");	
+				
+				the_place_declared.addReference(new_dec);					//D
+				declarationMap.put(referenceOfCondition, num_declarations);
+				rule_decs.add(new_dec);
+			}
+			
+			addCondition(current, nodeRelations, rel_id+1);
+			
+		}
+	}
+	
+	public void processNodeValue(NodeValue current, ArrayList<Field> nodeRelations, int rel_id, int condition_or_action) {
+		if (rel_id == nodeRelations.size()) {	// it must be primitive
+			Field referenceField = nodeRelations.get(nodeRelations.size()-1);			
+			String referenceOfCondition = Util.getDecReference(referenceField);
+			
+			System.out.println("It is primitive, should add a condition to its father "+referenceOfCondition+ " rel_id "+ rel_id + " size "+ (nodeRelations.size()-1)+ " \n");	
+			Declaration dec = rule_decs.get(declarationMap.get(referenceOfCondition));
+			
+			switch (condition_or_action) {
+			case 1: // condition
+				dec.addCondition(current);					//D
+				break;
+			case 2: // action
+				AttrReference aRef = new AttrReference(current);	//D
+				dec.addActionReference(aRef);						//D
+				addAction(aRef);									//D
+				setRuleStats (current);								//D
+				break;
+			}
+			return;
+
+		} else {
+			Field referenceField = nodeRelations.get(rel_id);			
+			String referenceOfCondition = Util.getDecReference(referenceField);
+			System.out.println("referenceOfCondition " +referenceOfCondition + " rel_id "+ rel_id + " size "+ (nodeRelations.size()-1));
+			Declaration the_place_declared = null;
+			
+			if (rel_id ==0 ) {	
+				the_place_declared = rule_decs.get(0);
+				System.out.println("The first guy "+referenceField.getName()+" to main declaration (ref?)"+ " rel_id "+ rel_id + " size "+ (nodeRelations.size()-1)+ " \n");	
+				
+			} else {
+				the_place_declared = rule_decs.get(rel_id-1);//declarationMap.get(referenceOfCondition));
+				System.out.println("Continue"+referenceField.getName()+" in "+the_place_declared+ "??? rel_id "+ rel_id + " size "+ (nodeRelations.size()-1)+ " \n");	
+			}
+			
+			if (!the_place_declared.hasReference(referenceField.getName())) {
+				num_declarations++;
+				Declaration new_dec = new Declaration(referenceField.getType(), referenceField.getName(), num_declarations);
+				System.out.println("Create new dec "+referenceOfCondition+" (Main declaration doesnot have a ref"+ referenceField.getName() + ") rel_id "+ rel_id + " size "+ (nodeRelations.size()-1)+ " \n");	
+				switch (condition_or_action) {
+				case 1: // condition
+					the_place_declared.addReference(new_dec);			//D
+					break;
+				case 2: // action
+					AttrReference aRef = new AttrReference(current);	//D
+					the_place_declared.addActionReference(aRef);		//D
+					break;
+				}
+				declarationMap.put(referenceOfCondition, num_declarations);
+				rule_decs.add(new_dec);
+			}
+			
+			processNodeValue(current, nodeRelations, rel_id+1, condition_or_action);	
+			
+		}
+	}
+	
+	public void addAction(AttrReference aRef) {
+		actions.add(aRef);	
+	}
+	
+	public void setRuleStats (NodeValue current) {
 		this.setRank(((LeafNode)current.getNode()).getRank());
 		this.setNumClassifiedInstances(((LeafNode)current.getNode()).getNumClassification());
 	}
-	public void setObjectClass(Class<?> obj) {
-		attr_obj= obj;
-	}
+	
+
+
 	public String getObjectClassName() {
-		return attr_obj.getSimpleName();
+		return main_obj.getSimpleName();
 	}
 	
 	private int getId() {
@@ -301,41 +451,52 @@
 			then
 				System.out.println( "[getLabel()] Expected value (" + $c.getLabel() + "), Classified as (False)"); 
 		end
+		
+		// complex rule
+		rule "Purchase notification"
+    		salience 10
+
+			when
+				$c : Customer( name == "Bla")
+				$p : Purchase( amount == 1, customer == $c)	    
+			then
+	    		System.out.println( "Customer " + $c.name + " just purchased " + $p.product.name );
+		end
 		 */
 		//"rule \"#"+getId()+" "+decision+" rank:"+rank+"\" \n";
 		StringBuffer sb_out = new StringBuffer("");
-		String obj_ref = "$"+this.getObjectClassName().substring(0, 1).toLowerCase();
-
+		
 		sb_out.append("\t when");
-		sb_out.append("\n\t\t "+obj_ref+":"+this.getObjectClassName() +"("+ "");
-		for (NodeValue cond: conditions) {
-			sb_out.append(cond.toString() + ", ");
+		for (int dec_i =rule_decs.size()-1; dec_i>=0; dec_i--) {
+			Declaration d = rule_decs.get(dec_i);
+			String obj_ref = d.getSymbol(); //"$"+this.getObjectClassName().substring(0, 1).toLowerCase();
+			sb_out.append("\n\t\t "+obj_ref+" : "+d.getDeclaringFTypeCanonicalName()+"("+ "");
+			Iterator<NodeValue> dec_it = d.getConditionIt();
+			while (dec_it.hasNext()) {
+				NodeValue cond = dec_it.next();
+				sb_out.append(cond.toString() + ", ");
+			}
+			
+			Iterator<Reference> ref_it = d.getReferenceIt();
+			while (ref_it.hasNext()) {
+				Reference ref = ref_it.next();
+				sb_out.append(ref.toString() + ", ");
+			}			
+			sb_out.delete(sb_out.length()-2, sb_out.length()-1);
+			sb_out.append(")\n");
 		}
 		
 		StringBuffer sb_action = new StringBuffer("");
 		StringBuffer sb_field = new StringBuffer("");
 		StringBuffer sb_expected_value = new StringBuffer("");
-		for (NodeValue act: actions) {
-			// if the query is on a field then i have to get its value during in the rule 'cause it might be private
-			if (!act.getNode().getDomain().isArtificial())
-				sb_out.append(obj_ref+ "_"+act.getFName() + " : "+act.getFName()+", ");
+		for (AttrReference act: actions) {
+			sb_action.append(act.getValue() + " , ");
+			sb_expected_value.append(act.getVariableName()); 
+			sb_field.append(act.getFName() + "");
 			
-			sb_action.append(act.getNodeValue() + " , ");
-			if (!act.getNode().getDomain().isArtificial())
-				sb_field.append(act.getFName() + "");
-			else
-				sb_field.append(act.getFName() + "()");
-			
-			
-			if (!act.getNode().getDomain().isArtificial())
-				sb_expected_value.append(obj_ref+ "_"+act.getFName());//reading the value by the reference of $o_fieldname
-			else
-				sb_expected_value.append(obj_ref+ "."+act.getFName() + "()");// reading the value from the object $o.function()
-			
 		}
 		sb_action.delete(sb_action.length()-3, sb_action.length()-1);
-		sb_out.delete(sb_out.length()-2, sb_out.length()-1);
-		sb_out.append(")\n");
+		
 		sb_out.append("\t then ");
 		sb_out.append("\n\t\t System.out.println(\"["+sb_field.toString()+ "] Expected value (\" + "+  sb_expected_value.toString()+ " + \"), Classified as ("+sb_action.toString()+")\");\n"); 
 		if (getRank() <0)
@@ -347,6 +508,62 @@
 		return sb_out.toString();
 	}
 	
+	
+//	public String toString_() {
+//		/*		 
+//		rule "Good Bye"
+//    		dialect "java"
+//			when
+//				$m:Message( status == Message.GOODBYE)
+//			then
+//				System.out.println( "[getLabel()] Expected value (" + $c.getLabel() + "), Classified as (False)"); 
+//		end
+//		 */
+//		//"rule \"#"+getId()+" "+decision+" rank:"+rank+"\" \n";
+//		StringBuffer sb_out = new StringBuffer("");
+//		String obj_ref = "$"+this.getObjectClassName().substring(0, 1).toLowerCase();
+//
+//		sb_out.append("\t when");
+//		sb_out.append("\n\t\t "+obj_ref+":"+this.getObjectClassName() +"("+ "");
+////		for (NodeValue cond: conditions) {
+////			sb_out.append(cond.toString() + ", ");
+////		}
+//		
+//		StringBuffer sb_action = new StringBuffer("");
+//		StringBuffer sb_field = new StringBuffer("");
+//		StringBuffer sb_expected_value = new StringBuffer("");
+//		for (NodeValue act: actions) {
+//			// if the query is on a field then i have to get its value during in the rule 'cause it might be private
+//			if (!act.getNode().getDomain().isArtificial())
+//				sb_out.append(obj_ref+ "_"+act.getFName() + " : "+act.getFName()+", ");
+//			
+//			sb_action.append(act.getNodeValue() + " , ");
+//			if (!act.getNode().getDomain().isArtificial())
+//				sb_field.append(act.getFName() + "");
+//			else
+//				sb_field.append(act.getFName() + "()");
+//			
+//			
+//			if (!act.getNode().getDomain().isArtificial())
+//				sb_expected_value.append(obj_ref+ "_"+act.getFName());//reading the value by the reference of $o_fieldname
+//			else
+//				sb_expected_value.append(obj_ref+ "."+act.getFName() + "()");// reading the value from the object $o.function()
+//			
+//		}
+//		sb_action.delete(sb_action.length()-3, sb_action.length()-1);
+//		sb_out.delete(sb_out.length()-2, sb_out.length()-1);
+//		sb_out.append(")\n");
+//		sb_out.append("\t then ");
+//		sb_out.append("\n\t\t System.out.println(\"["+sb_field.toString()+ "] Expected value (\" + "+  sb_expected_value.toString()+ " + \"), Classified as ("+sb_action.toString()+")\");\n"); 
+//		if (getRank() <0)
+//			sb_out.append("\n\t\t System.out.println(\"But no matching fact found = DOES not fire on\");\n");
+//		
+//		sb_out.insert(0, "rule \"#"+getId()+" "+sb_field.toString()+ "= "+sb_action.toString()+" classifying "+this.getNumClassifiedInstances()+" num of facts with rank:"+getRank() +"\" \n");
+//		sb_out.append("end\n");
+//
+//		return sb_out.toString();
+//	}
+	
 	public static Comparator<Rule> getRankComparator() {
 		return new RuleComparator();
 	}
@@ -365,9 +582,126 @@
 
 }
 
+class Declaration{
+	private int id; 
+	private String dec_ref; 		
+	private Class<?> declared_obj;	// object class name
+//	private ArrayList<RuleNode> conditions;
+	private ArrayList<NodeValue> conditions;
+	private ArrayList<Reference> references;
+	
+	public Declaration(Class<?> obj_class, String name, int dec_id) {
+		id = dec_id;
+		declared_obj = obj_class;
+		dec_ref = name;
+		references = new ArrayList<Reference>();
+		conditions = new ArrayList<NodeValue>();
+	}
+	
+	public String getDeclaringFName() {
+		return dec_ref;
+	}
+	
+	public String getDeclaringFTypeCanonicalName() {
+		return declared_obj.getSimpleName();
+	}
 
-class NodeValue {
+	public void addCondition(NodeValue current) {
+		NodeValue nv = new NodeValue(current.getNode());
+		nv.setNodeValue(current.getNodeValue());
+		conditions.add(nv);
+	}
 	
+	public void addActionReference(AttrReference aRef) {//NodeValue current) {
+		references.add(aRef);
+
+	}
+	
+	public void addReference(Declaration d) {
+		DecReference df = new DecReference(d);
+		references.add(df);
+	}
+	
+	public boolean hasReference(String fName) {
+		for (Reference df : references) {
+			if (df.getFName().equalsIgnoreCase(fName))
+				return true;
+		}
+		return false;
+		
+	}
+	
+	public Iterator<NodeValue> getConditionIt() {
+		return conditions.iterator();
+	}
+	public Iterator<Reference> getReferenceIt() {
+		return references.iterator();
+	}
+	
+	public String getSymbol() {
+		return "$"+dec_ref + "_" + id;
+	}
+	
+}
+
+interface Reference {
+	public String getFName();
+}
+class DecReference implements Reference {
+	
+	private String fName;
+	Declaration toReference;
+	
+	public DecReference (Declaration d) {
+		toReference = d;
+		fName = d.getDeclaringFName();
+	}
+	
+	public String getFName() {
+		return fName;
+	}
+	public void setReference(Declaration _toReference) {
+		toReference = _toReference;
+	}
+	
+	
+	public String toString() {
+		return fName + " == "+ toReference.getSymbol();
+	}
+}
+
+class AttrReference implements Reference {
+	
+	private String fName;
+	private NodeValue real_value;
+	
+	public AttrReference (NodeValue v) {
+		String _fName = v.getFName();
+		if (v.getNode().getDomain().isArtificial()) {
+			_fName = Util.getFieldName(_fName);
+		}
+		fName = _fName;
+		real_value = new NodeValue(v.getNode());
+		real_value.setNodeValue(v.getNodeValue());
+	}
+	public Object getVariableName() {
+		return "$target_label";
+	}
+	public Object getValue() {
+		return real_value.getNodeValue();
+	}
+	public String getFName() {
+		return fName;
+	}
+	
+	public String toString() {
+		return getVariableName()+" : "+ fName ;
+	}
+}
+
+
+class NodeValue { //implements RuleNode {
+	
 	//private static final Logger flog = LoggerFactory.getFileLogger(NodeValue.class, LogLevel.ERROR, Util.log_file); 
 	
 	private TreeNode node;
@@ -376,9 +710,14 @@
 	public NodeValue(TreeNode n) {
 		this.node = n;
 	}
+	public String getFReference() {
+		return node.getDomain().getFReferenceName();
+	}
 	
 	public String getFName() {
-		return node.getDomain().getFName();
+//		String full_name = node.getDomain().getFName();
+//		String fname = full_name.substring(full_name.lastIndexOf('@')+1, full_name.length());
+		return node.getDomain().getFName() ;
 	}
 	
 	public Object getNodeValue() {
@@ -393,9 +732,11 @@
 		return node;
 	}
 	
-	@SuppressWarnings("unchecked")
 	public String toString() {
-		String fName = node.getDomain().getFName();
+		
+		String fName = this.getFName();//object class name
+		Class<?> node_obj = node.getDomain().getObjKlass();
+		
 		String value;
 		if (node.getDomain().getFType() == String.class)
 			value = "\""+nodeValue+ "\""; 
@@ -449,4 +790,60 @@
 		}
 	}
 	
+	public String toString_() {
+		
+		String fName = this.getFName();//node.getDomain().getFName();
+		String value;
+		if (node.getDomain().getFType() == String.class)
+			value = "\""+nodeValue+ "\""; 
+		else
+			value = nodeValue + "";
+		
+		if (node.getDomain().isCategorical())
+			return fName + " == "+ value; 
+		else {
+			
+			int size = node.getDomain().getCategoryCount()-1;
+			//System.out.println("How many guys there of "+node.getDomain().getName() +" and the value "+nodeValue+" : "+size);
+			
+			int idx = size;
+			if (nodeValue instanceof Number) {
+				for (; idx>=0; idx--) {
+					Object categoryValue = node.getDomain().getCategory(idx);
+					if (nodeValue instanceof Comparable && categoryValue instanceof Comparable) {
+						// TODO ask this to daniel???
+//						if (Util.DEBUG_RULE_PRINTER) {
+//							System.out.println("NodeValue:"+ nodeValue+ " c-"+nodeValue.getClass() +" & category:"+ categoryValue+ " c-"+categoryValue.getClass());
+//						}
+						if ( AttributeValueComparator.instance.compare(nodeValue, categoryValue) == 0 ) {
+							break;
+						}
+					} else {
+						System.out.println("Fuck not comparable NodeValue:"+ nodeValue+ " c-"+nodeValue.getClass() +" & category:"+ categoryValue+ " c-"+categoryValue.getClass());
+						System.exit(0);
+					}
+
+				}
+			} else {
+				/* TODO implement the String setting */
+				System.out.println("Fuck not number:"+ nodeValue+ " c-"+nodeValue.getClass());
+				System.exit(0);
+
+			}
+			
+			if (idx == 0)
+				return fName + " <= "+ value;
+			else if (idx == size)
+				// if the category is the last one that the rule is domain.name > category(last-1)
+				return fName+ " > "+ node.getDomain().getCategory(size-1);
+			else {
+				//return node.getDomain().getCategory(idx) + " < " + fName+ " <= "+ node.getDomain().getCategory(idx+1);
+				// Why drools does not support category(idx) < domain.name <= category(idx+1)
+				//flog.debug("value "+ value + "=====?????"+   node.getDomain().getCategory(idx+1));
+				
+				return fName+ " <= "+ value; // node.getDomain().getCategory(idx+1);
+			}
+		}
+	}
+	
 }

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-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/Util.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -91,12 +91,28 @@
 		return;
 	}
 	
+	public static boolean getterExits(String m_name) {
+		if (m_name.startsWith("set"))
+			return true;
+		else 
+			return false;
+	}
+	
 	public static boolean isSetter(String m_name) {
-		if (m_name.startsWith("set") || m_name.startsWith("is") )
+		if (m_name.startsWith("set"))
 			return true;
 		else 
 			return false;
 	}
+	
+	public static String getFReference(Class<?> _obj_klass, String fName) {
+		return _obj_klass.getName()+"@"+fName;
+	}
+	
+	public static String getDecReference(Field f) {
+		Class<?> owner_class = f.getDeclaringClass(); // i need the class that the field belongs to boooook
+		return owner_class.getName() + "_"+f.getType().getName() +"_"+f.getName();
+	}
 
 	public static String getFieldName(String method_name) {
 		if (method_name.startsWith("get") || method_name.startsWith("set"))

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/ShoppingExample.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/ShoppingExample.java	2008-06-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/ShoppingExample.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -1,15 +1,13 @@
 package org.drools.examples;
 
 import java.io.InputStreamReader;
-import java.io.Reader;
 
 import org.drools.FactHandle;
 import org.drools.RuleBase;
 import org.drools.RuleBaseFactory;
 import org.drools.StatefulSession;
-import org.drools.WorkingMemory;
 import org.drools.compiler.PackageBuilder;
-import org.drools.rule.Package;
+import org.drools.learner.tools.FieldAnnotation;
 
 public class ShoppingExample {
 
@@ -24,18 +22,22 @@
 
         Customer mark = new Customer( "mark",
                                       0 );
-        session.insert( mark );
+//        session.insert( mark );
 
         Product shoes = new Product( "shoes",
                                      60 );
-        session.insert( shoes );
+//        session.insert( shoes );
 
         Product hat = new Product( "hat",
                                    60 );
-        session.insert( hat );
+//        session.insert( hat );
 
         session.insert( new Purchase( mark,
                                       shoes ) );
+        
+//        session.insert( new Purchase( new Customer("gizil", 30),
+//                		new Product("skirt", 30) ) );
+        
         FactHandle hatPurchaseHandle = session.insert( new Purchase( mark,
                                                                      hat ) );
 
@@ -50,6 +52,9 @@
         private String name;
         
         private int discount;
+        
+        @FieldAnnotation(target = true)
+        private boolean eligible;
             
         public Customer(String name,
                         int discount) {
@@ -65,12 +70,35 @@
             return discount;
         }
 
-        public void setDiscount(int discount) {
+        public boolean isEligible() {
+			return eligible;
+		}
+
+		public void setEligible(boolean eligible) {
+			this.eligible = eligible;
+		}
+
+		public void setDiscount(int discount) {
             this.discount = discount;
         }
                        
     }
     
+    
+    public static class Person{
+    	private Dress skirt;
+    	// attribute 1
+    	private double salary;
+    	
+    }
+   
+    // target object
+    public static class Dress{
+    	double color;
+    	// target attribute
+    	String value;//classification valuable, normal, cheap
+    }
+    
     public static class Discount {
         private Customer customer;
         private int amount;

Modified: 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	2008-06-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/TriangleExample.java	2008-06-20 15:35:24 UTC (rev 20662)
@@ -36,7 +36,7 @@
 		}
 
 		// instantiate a learner for a specific object class and pass session to train
-		DecisionTree decision_tree; int ALGO = 111;
+		DecisionTree decision_tree; int ALGO = 321;
 		/* 
 		 * Single	1xx, Bag 	2xx, Boost 3xx
 		 * ID3 		x1x, C45 	x2x

Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/Shopping.drl
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/Shopping.drl	2008-06-20 15:16:16 UTC (rev 20661)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/Shopping.drl	2008-06-20 15:35:24 UTC (rev 20662)
@@ -2,10 +2,7 @@
 
 dialect "mvel"
 
-import org.drools.examples.ShoppingExample.Customer
-import org.drools.examples.ShoppingExample.Product
-import org.drools.examples.ShoppingExample.Purchase
-import org.drools.examples.ShoppingExample.Discount
+import org.drools.examples.ShoppingExample.*
  
 rule "Purchase notification"
     salience 10




More information about the jboss-svn-commits mailing list