[jboss-svn-commits] JBL Code SVN: r20481 - in labs/jbossrules/contrib/machinelearning/4.0.x: drools-core/src/main/java/org/drools/learner/builder and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sat Jun 14 12:17:04 EDT 2008
Author: gizil
Date: 2008-06-14 12:17:03 -0400 (Sat, 14 Jun 2008)
New Revision: 20481
Modified:
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/InstanceList.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Memory.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Schema.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/C45Learner.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/ID3Learner.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/Learner.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Categorizer.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ObjectFactory.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/Util.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/AllocatedCashflow.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/Cashflow.java
labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/TypedCashflow.java
Log:
ClassVisitor implemented, not tested yet
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/InstanceList.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/InstanceList.java 2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/InstanceList.java 2008-06-14 16:17:03 UTC (rev 20481)
@@ -5,27 +5,44 @@
import java.util.List;
import org.drools.WorkingMemory;
-import org.drools.base.ClassFieldExtractor;
import org.drools.common.InternalWorkingMemory;
import org.drools.spi.Extractor;
-
-
public class InstanceList {
private Schema schema;
private ArrayList<Instance> instances;
- private ArrayList<Double> weights;
+ private InstanceFactory factory;
+ // old constructer
public InstanceList(Schema _schema) {
this.schema = _schema;
- this.instances = new ArrayList<Instance>();
+ this.instances = new ArrayList<Instance>();
}
+ public InstanceList(Schema _schema, WorkingMemory _session) {
+ this.schema = _schema;
+ this.instances = new ArrayList<Instance>();
+ this.factory = new InstanceFactory(_session, _schema);
+ }
+ // will be used as copy constructer
public InstanceList(Schema _schema, int size) {
this.schema = _schema;
- this.instances = new ArrayList<Instance>(size);
+ this.instances = new ArrayList<Instance>(size);
}
+
+ public void addStructuredInstance(Object _obj) {
+ // create instance and all attributes according to the schema
+ Instance inst = factory.createInstance(_obj);
+ System.out.println(inst);
+ if (inst != null )
+ instances.add(inst);
+ else {
+ System.out.println("Couldnot create the instance");
+ System.exit(0);
+ }
+ }
+ // old method
public void addFromWorkingMemory(WorkingMemory _session, Object _obj) {
// create instance and all attributes according to the schema
Instance inst = new Instance();
@@ -55,6 +72,8 @@
}
}
+
+ System.out.println("inst:"+ inst);
instances.add(inst);
}
@@ -96,7 +115,8 @@
public Collection<String> getAttributes() {
return schema.getAttrNames();
}
-
+
+
/* String getClassName();
void assignTo(Collection<Instance> c);
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Memory.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Memory.java 2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Memory.java 2008-06-14 16:17:03 UTC (rev 20481)
@@ -4,14 +4,51 @@
import java.util.Iterator;
import org.drools.WorkingMemory;
+import org.drools.learner.builder.Learner.DataType;
import org.drools.learner.builder.Learner.DomainAlgo;
import org.drools.learner.tools.FeatureNotSupported;
public class Memory {
+ // TODO pass a list of classes, and get all the object from that class
+ public static Memory createStructuredFromWorkingMemory(WorkingMemory _session, Class<?> clazz, DomainAlgo domain, DataType data) throws FeatureNotSupported {
+ // if mem == null
+ Memory mem = new Memory();
+
+ mem.session = _session;
+
+ mem.setClassToClassify(clazz);
+ // create schema from clazz
+ Schema inst_schema = null;
+ try {
+ inst_schema = Schema.createStructuredSchema(clazz, domain, data);
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ System.exit(0);
+ }
+
+ // create a instance list that can hold objects from our schema
+ mem.instances.put(clazz, new InstanceList(inst_schema, _session));
+
+ /*
+ * do they create an ObjectTypeNode for each new inserted object type?
+ * even if there is no rule exists.
+ * No probably they do not
+ */
+ Iterator<Object> it_object = _session.iterateObjects(); // how can i get the object type nodes
+ while (it_object.hasNext()) {
+ Object obj = it_object.next();
+ if (clazz.isAssignableFrom(obj.getClass()))
+ mem.instances.get(clazz).addStructuredInstance(obj);
+ }
+ //dt.FACTS_READ += facts.size();
+
+ return mem;
+ }
// TODO pass a list of classes, and get all the object from that class
- public static Memory createFromWorkingMemory(WorkingMemory _session, Class<?> clazz, DomainAlgo domain_type) throws FeatureNotSupported {
+ public static Memory createFromWorkingMemory(WorkingMemory _session, Class<?> clazz, DomainAlgo domain, DataType data) throws FeatureNotSupported {
// if mem == null
Memory mem = new Memory();
@@ -19,7 +56,7 @@
mem.setClassToClassify(clazz);
// create schema from clazz
- Schema inst_schema = Schema.createFromClass(clazz, domain_type);
+ Schema inst_schema = Schema.createFromClass(clazz, domain, data);
// create a instance list that can hold objects from our schema
mem.instances.put(clazz, new InstanceList(inst_schema));
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Schema.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Schema.java 2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/Schema.java 2008-06-14 16:17:03 UTC (rev 20481)
@@ -1,18 +1,22 @@
package org.drools.learner;
-import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
+import java.util.Iterator;
import java.util.Set;
import org.drools.base.ClassFieldExtractor;
import org.drools.base.ClassFieldExtractorCache;
+import org.drools.learner.builder.Learner.DataType;
import org.drools.learner.builder.Learner.DomainAlgo;
import org.drools.learner.tools.ClassAnnotation;
+import org.drools.learner.tools.ClassStructure;
+import org.drools.learner.tools.ClassVisitor;
import org.drools.learner.tools.FeatureNotSupported;
import org.drools.learner.tools.FieldAnnotation;
import org.drools.learner.tools.PseudoFieldExtractor;
@@ -24,7 +28,7 @@
*/
public class Schema {
- public static Schema createFromClass(Class<?> clazz, DomainAlgo domain_type) throws FeatureNotSupported {
+ public static Schema createFromClass(Class<?> clazz, DomainAlgo domain_type, DataType data_type) throws FeatureNotSupported {
Schema schema = new Schema(clazz);
ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
/*
@@ -38,20 +42,12 @@
ArrayList<Class<?>> element_classes = new ArrayList<Class<?>>();
Util.getAllFields(clazz, element_fields, element_classes);
*/
- Util.getAllFields(clazz, element_fields); //clazz.getDeclaredFields(); //clazz.getFields();
+ Util.getSuperFields(clazz, element_fields); //clazz.getDeclaredFields(); //clazz.getFields();
+ ArrayList<Field> decomposed_fields = new ArrayList<Field>(element_fields.size()+10);
+ Util.decomposeStructuredFields(element_fields, decomposed_fields);
for (Field f: element_fields) {
String f_name = f.getName();
- ClassFieldExtractor f_extractor = cache.getExtractor( clazz, f_name, clazz.getClassLoader() );
- schema.extractorMap.put(f_name, f_extractor);
-
- Annotation[] annotations = f.getAnnotations();
- FieldAnnotation spec = null;
- for (Annotation a : annotations) {
- if (a instanceof FieldAnnotation) {
- spec = (FieldAnnotation)a; // here it is !!!
- break;
- }
- }
+ FieldAnnotation spec = Util.getFieldAnnotations(f);
if (spec != null) {
if (!spec.ignore() && f.getType() == String.class && !spec.discrete()) {
@@ -60,11 +56,11 @@
}
boolean skip = false;
switch (domain_type) {
- case ID3: //ID3
+ case CATEGORICAL: //ID3 can work only with categorical types
if (spec.ignore() || !spec.discrete())
skip = true;
break;
- case C45:
+ case QUANTITATIVE: // C45 can work with categorical || quantitative domain
if (spec.ignore())
skip = true;
break;
@@ -88,13 +84,23 @@
fieldDomain.addCategory(Boolean.FALSE);
fieldDomain.setFixed(true);
}
- else if (f.getType() == String.class) { /* BY DEFAULT it is categorical*/}
+ else if (f.getType() == String.class) {
+ /* BY DEFAULT it is categorical*/
+ } else {
+ // structured data
+ if (data_type == DataType.STRUCTURED) {
+ // u need to process then
+
+ }
+ }
/* TODO insanity checks:
* 1- the annotations are not given
* 2- there is no target specified
* 3- more than one target is specified
*/
+ ClassFieldExtractor f_extractor = cache.getExtractor( clazz, f_name, clazz.getClassLoader() );
+ schema.extractorMap.put(f_name, f_extractor);
schema.domainMap.put(f_name, fieldDomain);
}
/* Apperantly the getMethod function recurse on the superclasses
@@ -102,59 +108,166 @@
for (Class<?> c: element_classes) {
Annotation[] annotations = c.getAnnotations();
*/
- Annotation[] annotations = clazz.getAnnotations(); // it should get the inherited annotations
- ClassAnnotation lab = null;
- for (Annotation a : annotations) {
- if (a instanceof ClassAnnotation) {
- lab= (ClassAnnotation)a; // here it is !!!
- break;
+
+ ClassAnnotation class_label = Util.getClassAnnotations(clazz);
+ if (class_label != null && class_label.label_element() != "") {
+ // the targetting label is set, put the function that gets that value somewhere
+
+ try {
+ /* Apperantly the getMethod function recurse on the superclasses
+ * i dont need to recurse myself
+ Method m =c.getDeclaredMethod(lab.label_element(), null);
+ */
+ Method m = clazz.getMethod(class_label.label_element(), null);
+
+ Domain fieldDomain = new Domain(class_label.label_element(), m.getReturnType());
+ fieldDomain.setArtificial(true);
+ if (m.getReturnType() == Boolean.TYPE || m.getReturnType() == Boolean.class) { /* set discrete*/
+// fieldDomain.setCategorical(true); // BY DEFAULT it is categorical
+ fieldDomain.addCategory(Boolean.TRUE);
+ fieldDomain.addCategory(Boolean.FALSE);
+ fieldDomain.setFixed(true);
}
+ //else if (m.getReturnType() == String.class) { /* BY DEFAULT it is categorical*/}
+ schema.domainMap.put(class_label.label_element(), fieldDomain);
+
+ Extractor m_extractor = new PseudoFieldExtractor(clazz, m);
+ //cache.getExtractor( clazz, lab.label_element(), clazz.getClassLoader() );
+ schema.extractorMap.put(class_label.label_element(), m_extractor);
+ schema.clearTargets();
+ schema.addTarget(class_label.label_element());
+ //break; // if the ClassAnnotation is found then stop
+
+ } catch (SecurityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (NoSuchMethodException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
}
-
- if (lab != null && lab.label_element() != "") {
- // the targetting label is set, put the function that gets that value somewhere
+ }
+ //}
+
+ return schema;
+ }
+
+
+ public static Schema createStructuredSchema(Class<?> clazz, DomainAlgo domain_type, DataType data_type) throws Exception {
+ Schema schema = new Schema(clazz);
+ ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
+
+ ClassVisitor visitor = new ClassVisitor(domain_type, data_type);
+ visitor.visit(clazz);
+ schema.klass_structure = visitor.getStructure();
+
+ for (Class<?> _klass : schema.klass_structure.keySet()) {
+ ClassStructure struct = schema.klass_structure.get(_klass);
+ //Iterator<Field> f_ite = struct.getFieldIterator();
+ //while (f_ite.hasNext()) {
+ //Field f= f_ite.next();
+ for (Field f : struct.getFields()) {
+ String f_name = f.getName();
- try {
- /* Apperantly the getMethod function recurse on the superclasses
- * i dont need to recurse myself
- Method m =c.getDeclaredMethod(lab.label_element(), null);
- */
- Method m = clazz.getMethod(lab.label_element(), null);
-
- Domain fieldDomain = new Domain(lab.label_element(), m.getReturnType());
- fieldDomain.setArtificial(true);
- if (m.getReturnType() == Boolean.TYPE || m.getReturnType() == Boolean.class) { /* set discrete*/
+ DataType f_type = struct.getFieldType(f);
+ switch (f_type) {
+ case PRIMITIVE: // domain will be created only for primitive types
+ Domain fieldDomain = new Domain(f_name, f.getType());
+ if (f.getType() == Boolean.TYPE || f.getType() == Boolean.class) { /* set discrete*/
// fieldDomain.setCategorical(true); // BY DEFAULT it is categorical
fieldDomain.addCategory(Boolean.TRUE);
fieldDomain.addCategory(Boolean.FALSE);
- fieldDomain.setFixed(true);
- }
- //else if (m.getReturnType() == String.class) { /* BY DEFAULT it is categorical*/}
- schema.domainMap.put(lab.label_element(), fieldDomain);
-
- Extractor m_extractor = new PseudoFieldExtractor(clazz, m);
- //cache.getExtractor( clazz, lab.label_element(), clazz.getClassLoader() );
- schema.extractorMap.put(lab.label_element(), m_extractor);
- schema.clearTargets();
- schema.addTarget(lab.label_element());
- //break; // if the ClassAnnotation is found then stop
-
- } catch (SecurityException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (NoSuchMethodException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
+ fieldDomain.setFixed(true);
+ } else if (f.isEnumConstant()) {
+ Class<?> enum_f = f.getType();
+ //for (E e:enum_f.getEnumConstants())
+ //fieldDomain.setFixed(true);
+ } else if (f.getType() == String.class) {
+ /* BY DEFAULT it is categorical*/
+ }
+ schema.domainMap.put(f_name, fieldDomain);
+ case STRUCTURED: // the extractor is necessary for both types of data.
+ ClassFieldExtractor f_extractor = cache.getExtractor( _klass, f_name, _klass.getClassLoader() );
+ schema.extractorMap.put(f_name, f_extractor);
+ break;
+ default:
+ throw new Exception("What type of data is this");
+
}
+
+ /* TODO insanity checks:
+ * 1- the annotations are not given
+ * 2- there is no target specified
+ * 3- more than one target is specified
+ */
}
- //}
+ }
+ return schema;
+ }
+
+
+ public static Schema createSchemaStructure(Class<?> clazz, DomainAlgo domain_type, DataType data_type) throws Exception {
+ Schema schema = new Schema(clazz);
+ //ClassFieldExtractorCache cache = ClassFieldExtractorCache.getInstance();
+
+ // schema is modified
+ ClassVisitor visitor = new ClassVisitor(schema, domain_type, data_type);
+ visitor.visit();
+// schema.klass_structure = visitor.getStructure();
+// schema.domainMap= visitor.getDomains();
+// schema.extractorMap = visitor.getExtractors();
+// schema.targets = visitor.getTargets();
+// for (Class<?> _klass : schema.klass_structure.keySet()) {
+// ClassStructure struct = schema.klass_structure.get(_klass);
+// //Iterator<Field> f_ite = struct.getFieldIterator();
+// //while (f_ite.hasNext()) {
+// //Field f= f_ite.next();
+// for (Field f : struct.getFields()) {
+// String f_name = f.getName();
+//
+// DataType f_type = struct.getFieldType(f);
+// switch (f_type) {
+// case PRIMITIVE: // domain will be created only for primitive types
+// Domain fieldDomain = new Domain(f_name, f.getType());
+// if (f.getType() == Boolean.TYPE || f.getType() == Boolean.class) { /* set discrete*/
+//// fieldDomain.setCategorical(true); // BY DEFAULT it is categorical
+// fieldDomain.addCategory(Boolean.TRUE);
+// fieldDomain.addCategory(Boolean.FALSE);
+// fieldDomain.setFixed(true);
+// } else if (f.isEnumConstant()) {
+// Class<?> enum_f = f.getType();
+// //for (E e:enum_f.getEnumConstants())
+// //fieldDomain.setFixed(true);
+// } else if (f.getType() == String.class) {
+// /* BY DEFAULT it is categorical*/
+// }
+// schema.domainMap.put(f_name, fieldDomain);
+// case STRUCTURED: // the extractor is necessary for both types of data.
+// ClassFieldExtractor f_extractor = cache.getExtractor( _klass, f_name, _klass.getClassLoader() );
+// schema.extractorMap.put(f_name, f_extractor);
+// break;
+// default:
+// throw new Exception("What type of data is this");
+//
+// }
+//
+//
+// }
+// }
+
+ /* TODO insanity checks:
+ * 1- the annotations are not given
+ * 2- there is no target specified
+ * 3- more than one target is specified
+ */
return schema;
}
-
// the owner class of the schema
private Class<?> klass;
+ // the structure of the owner class
+ private HashMap<Class<?>,ClassStructure> klass_structure;
+
// key: field name
private Hashtable<String, Extractor> extractorMap;
@@ -165,6 +278,8 @@
public Schema(Class<?> _klass) {
this.klass = _klass;
+
+ this.klass_structure = new HashMap<Class<?>,ClassStructure>();
this.extractorMap = new Hashtable<String, Extractor>();
this.domainMap = new Hashtable<String, Domain>();
this.targets = new HashSet<String>();
@@ -173,7 +288,15 @@
public Class<?> getObjectClass() {
return klass;
}
-
+
+ public HashMap<Class<?>,ClassStructure> getClassStructure() {
+ return klass_structure;
+ }
+ public void putStructure(Class<?> clazz, ClassStructure structure) {
+ klass_structure.put(clazz, structure);;
+ }
+
+
public boolean addTarget(String _target) {
return targets.add(_target);
}
@@ -186,10 +309,17 @@
return this.domainMap.keySet();
}
+ public void putDomain(String attr_name, Domain d) {
+ domainMap.put(attr_name, d);
+ }
+
public Domain getAttrDomain(String attr_name) {
return this.domainMap.get(attr_name);
}
+ public void putExtractor(String attr_name, Extractor extract) {
+ extractorMap.put(attr_name, extract);
+ }
public Extractor getAttrExtractor(String attr_name) {
return this.extractorMap.get(attr_name);
}
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/C45Learner.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/C45Learner.java 2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/C45Learner.java 2008-06-14 16:17:03 UTC (rev 20481)
@@ -16,7 +16,7 @@
public C45Learner() {
super();
- super.setDomainAlgo(DomainAlgo.C45);
+ super.setDomainAlgo(DomainAlgo.QUANTITATIVE);
}
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/ID3Learner.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/ID3Learner.java 2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/ID3Learner.java 2008-06-14 16:17:03 UTC (rev 20481)
@@ -15,7 +15,7 @@
public ID3Learner() {
super();
- super.setDomainAlgo(DomainAlgo.ID3);
+ super.setDomainAlgo(DomainAlgo.CATEGORICAL);
}
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/Learner.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/Learner.java 2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/builder/Learner.java 2008-06-14 16:17:03 UTC (rev 20481)
@@ -16,7 +16,11 @@
protected static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(Learner.class, SimpleLogger.DEFAULT_LEVEL);
- public static enum DomainAlgo { ID3, C45, WEIGHT }
+ public static enum DomainAlgo { CATEGORICAL, QUANTITATIVE }
+ public static DomainAlgo DEFAULT_DOMAIN = DomainAlgo.QUANTITATIVE;
+
+ public static enum DataType {PRIMITIVE, STRUCTURED, COLLECTION}
+ public static DataType DEFAULT_DATA = DataType.PRIMITIVE;
private int data_size;
private DecisionTree best_tree;
private InstanceList input_data;
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Categorizer.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Categorizer.java 2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/eval/Categorizer.java 2008-06-14 16:17:03 UTC (rev 20481)
@@ -79,6 +79,10 @@
return data;
}
+ public QuantitativeDomain getSplitDomain() {
+ return this.splitDomain;
+ }
+
private double find_a_split(int begin_index, int size, int depth,
ClassDistribution facts_in_class) {
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ObjectFactory.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ObjectFactory.java 2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/ObjectFactory.java 2008-06-14 16:17:03 UTC (rev 20481)
@@ -40,7 +40,7 @@
private ObjectFactory (Class<?> clazz) {
this.obj_clazz = clazz;
this.clazz_fields = new ArrayList<Field>();
- Util.getAllFields(clazz, clazz_fields);
+ Util.getSuperFields(clazz, clazz_fields);
this.field_sequences = getFieldReadingSeqs(clazz, clazz_fields);
}
@@ -104,8 +104,8 @@
for (Method m : element_methods) {
String m_name = m.getName();
Class<?>[] param_type_name = m.getParameterTypes();
- if (ObjectFactory.isSetter(m_name) & ObjectFactory.isSimpleType(param_type_name)) {
- String basicFieldName = ObjectFactory.getFieldName(m_name);
+ if (Util.isSetter(m_name) & Util.isSimpleMethod(param_type_name)) {
+ String basicFieldName = Util.getFieldName(m_name);
/* TODO dont use the basic field name as the real field name, there can be a capital/miniscul
* letter problem
@@ -115,17 +115,14 @@
if (_f.getName().equalsIgnoreCase(basicFieldName)) {
f = _f;
break;
- }
-
+ }
}
-
if (f == null) {
throw new Exception("Field("+basicFieldName+") could not be found for the class("+this.obj_clazz+")");
}
else {
String fieldString = fieldValues.get(this.field_sequences.get(f.getName()));
- Object fieldValue = readString(f, fieldString.trim());
-
+ Object fieldValue = readString(f, fieldString.trim());
try {
m.invoke(element, fieldValue);
} catch (IllegalArgumentException e) {
@@ -256,41 +253,6 @@
return Double.parseDouble(data);
}
- private static boolean isSetter(String m_name) {
- if (m_name.startsWith("set") || m_name.startsWith("is") )
- return true;
- else
- return false;
- }
-
- private static String getFieldName(String method_name) {
- if (method_name.startsWith("get") || method_name.startsWith("set"))
- return method_name.substring(3, method_name.length()).toLowerCase();
- else if (method_name.startsWith("is"))
- return method_name.substring(2, method_name.length()).toLowerCase();
- else
- return null;
- }
- private static boolean isSimpleType(Class<?>[] type_name) {
- if (type_name.length==1) {
- if (type_name[0].isPrimitive() || type_name[0] == String.class)
- return true;
- if (type_name[0] == Boolean.class || type_name[0] == Boolean.TYPE ||
- type_name[0] == Integer.class || type_name[0] == Integer.TYPE ||
- type_name[0] == Long.class || type_name[0] == Long.TYPE ||
- type_name[0] == Double.class || type_name[0] == Double.TYPE ||
- type_name[0] == Float.class || type_name[0] == Float.TYPE ||
- type_name[0] == String.class)
- return true;
- else
- return false;
- }
- else
- return false;
- }
-
-
-
}
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/Util.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/Util.java 2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-core/src/main/java/org/drools/learner/tools/Util.java 2008-06-14 16:17:03 UTC (rev 20481)
@@ -1,10 +1,16 @@
package org.drools.learner.tools;
+import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
+import org.drools.learner.Domain;
+import org.drools.learner.builder.Learner;
+import org.drools.learner.builder.Learner.DataType;
+import org.drools.learner.builder.Learner.DomainAlgo;
+
public class Util {
public static final boolean PRINT_STATS = true;
@@ -54,7 +60,7 @@
}
/* TODO make this all_fields arraylist as hashmap */
- public static void getAllFields(Class<?> clazz, ArrayList<Field> all_fields) {
+ public static void getSuperFields(Class<?> clazz, ArrayList<Field> all_fields) {
if (clazz == Object.class)
return;
@@ -63,13 +69,136 @@
for (Field f: element_fields) {
all_fields.add(f);
}
- getAllFields(clazz.getSuperclass(), all_fields);
+ getSuperFields(clazz.getSuperclass(), all_fields);
return;
}
+ public static void decomposeStructuredFields(ArrayList<Field> element_fields, ArrayList<Field> decomposed_fields) {
+
+ for (Field f: element_fields) {
+ if (isSimpleType(f.getType()))
+ decomposed_fields.add(f);
+ else {
+ // it is an structured attribute
+ // u need to get its attributes
+ //if the field is a collection of sth => BOK
+ ArrayList<Field> field_structure = new ArrayList<Field>();
+ Util.getSuperFields(f.getType(), field_structure);
+ decomposeStructuredFields(field_structure, decomposed_fields);
+ }
+ }
+ return;
+ }
+
+ public static boolean isSetter(String m_name) {
+ if (m_name.startsWith("set") || m_name.startsWith("is") )
+ return true;
+ else
+ return false;
+ }
+
+ public static String getFieldName(String method_name) {
+ if (method_name.startsWith("get") || method_name.startsWith("set"))
+ return method_name.substring(3, method_name.length()).toLowerCase();
+ else if (method_name.startsWith("is"))
+ return method_name.substring(2, method_name.length()).toLowerCase();
+ else
+ return null;
+ }
+
+ public static boolean isSimpleMethod(Class<?>[] type_name) {
+ if (type_name.length==1) {
+ return isSimpleType(type_name[0]);
+ }
+ else
+ return false;
+ }
+
+ public static DataType getDataType(Class<?> type_name) {
+ if (isSimpleType(type_name))
+ return DataType.PRIMITIVE;
+ else {
+ if (isCollectionType(type_name)) {
+ return DataType.COLLECTION;
+ }
+ else
+ return DataType.STRUCTURED;
+ }
+ }
+
+ public static boolean isSimpleType(Class<?> type_name) {
+ if (type_name.isPrimitive() || type_name == String.class)
+ return true;
+ else if (type_name == Boolean.class || type_name == Boolean.TYPE ||
+ type_name == Integer.class || type_name == Integer.TYPE ||
+ type_name == Long.class || type_name == Long.TYPE ||
+ type_name == Double.class || type_name == Double.TYPE ||
+ type_name == Float.class || type_name == Float.TYPE ||
+ type_name == String.class)
+ return true;
+ else if (type_name.isEnum()) {
+ return true;
+ } else
+ return false;
+ }
+
+ public static boolean isCollectionType(Class<?> type_name) {
+ if (type_name.isArray())
+ return true;
+ else if (type_name.isAssignableFrom(Iterable.class))
+ return true;
+ else
+ return false;
+ }
+
+ public static FieldAnnotation getFieldAnnotations(Field f) {
+ Annotation[] annotations = f.getAnnotations();
+ for (Annotation a : annotations) {
+ if (a instanceof FieldAnnotation) {
+ return (FieldAnnotation)a; // here it is !!!
+ }
+ }
+ return null;
+ }
+
+ public static ClassAnnotation getDecClassAnnotations(Class<?> clazz) {
+ Annotation[] annotations = clazz.getDeclaredAnnotations(); // it should get the inherited annotations
+ for (Annotation a : annotations) {
+ if (a instanceof ClassAnnotation) {
+ return (ClassAnnotation)a; // here it is !!!
+ }
+ }
+ return null;
+ }
+ public static ClassAnnotation getClassAnnotations(Class<?> clazz) {
+ Annotation[] annotations = clazz.getAnnotations(); // it should get the inherited annotations
+ for (Annotation a : annotations) {
+ if (a instanceof ClassAnnotation) {
+ return (ClassAnnotation)a; // here it is !!!
+ }
+ }
+ return null;
+ }
+ // to process the type => it must be simple
+ public static void processDomain(Domain fieldDomain, Class<?> clazz_type) {
+ if (clazz_type == Boolean.TYPE || clazz_type == Boolean.class) { /* set discrete*/
+// fieldDomain.setCategorical(true); // BY DEFAULT it is categorical
+ fieldDomain.addCategory(Boolean.TRUE);
+ fieldDomain.addCategory(Boolean.FALSE);
+ fieldDomain.setFixed(true);
+ } else if (clazz_type.isEnum()) {//f.isEnumConstant()) {
+ Class<?> enum_f = clazz_type;
+ //for (E e:enum_f.getEnumConstants())
+ //fieldDomain.setFixed(true);
+ } else if (clazz_type == String.class) {
+ /* BY DEFAULT it is categorical*/
+ }
+
+ }
+
/* TODO make this all_fields arraylist as hashmap */
- public static void getAllFields(Class<?> clazz, ArrayList<Field> all_fields, ArrayList<Class<?>> all_classes) {
+ private static void getAllFields(Class<?> clazz, ArrayList<Field> all_fields, ArrayList<Class<?>> all_classes) {
if (clazz == Object.class)
return;
all_classes.add(clazz);
@@ -101,7 +230,7 @@
return 0.0;
}
- public static int getType(Class<?>[] type_name) {
+ private static int getType(Class<?>[] type_name) {
/*
* simpletype.contains(type_name)
* how do you get the simple type
@@ -151,7 +280,7 @@
return bag;
}
- public static Object convertPrimitiveType (Object primitiveValue) {
+ private static Object convertPrimitiveType (Object primitiveValue) {
Class klass = primitiveValue.getClass();
if (klass.equals(Boolean.TYPE)) {
return (Boolean)primitiveValue;
@@ -203,8 +332,5 @@
}
-
-
-
}
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/AllocatedCashflow.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/AllocatedCashflow.java 2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/AllocatedCashflow.java 2008-06-14 16:17:03 UTC (rev 20481)
@@ -1,7 +1,9 @@
package org.drools.tutorials.banking;
import java.util.Date;
+import org.drools.learner.tools.ClassAnnotation;
+ at ClassAnnotation(label_element = "getLabel")
public class AllocatedCashflow extends TypedCashflow {
private Account account;
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/Cashflow.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/Cashflow.java 2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/Cashflow.java 2008-06-14 16:17:03 UTC (rev 20481)
@@ -2,6 +2,9 @@
import java.util.Date;
+import org.drools.learner.tools.ClassAnnotation;
+
+ at ClassAnnotation(label_element = "getLabel")
public class Cashflow {
private Date date;
@@ -33,6 +36,10 @@
this.amount = amount;
}
+ public boolean getLabel() {
+ Date deadline = new Date(System.currentTimeMillis());
+ return date.before(deadline) && amount<500.00;
+ }
public String toString() {
return "Cashflow[date=" + date + ",amount=" + amount + "]";
}
Modified: labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/TypedCashflow.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/TypedCashflow.java 2008-06-14 13:15:44 UTC (rev 20480)
+++ labs/jbossrules/contrib/machinelearning/4.0.x/drools-examples/drools-examples-drl/src/main/java/org/drools/tutorials/banking/TypedCashflow.java 2008-06-14 16:17:03 UTC (rev 20481)
@@ -2,6 +2,9 @@
import java.util.Date;
+import org.drools.learner.tools.ClassAnnotation;
+
+ at ClassAnnotation(label_element = "getLabel")
public class TypedCashflow extends Cashflow {
public static final int CREDIT = 0;
public static final int DEBIT = 1;
More information about the jboss-svn-commits
mailing list