[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