[jboss-svn-commits] JBL Code SVN: r21071 - in labs/jbossrules/contrib/machinelearning/5.0: drools-clips and 25 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Jul 16 13:39:53 EDT 2008
Author: gizil
Date: 2008-07-16 13:39:52 -0400 (Wed, 16 Jul 2008)
New Revision: 21071
Added:
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Attribute.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/AttributeValueComparator.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DecisionTree.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DecisionTreePruner.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DecisionTreeVisitor.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Domain.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DomainComparator.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Instance.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/InstanceComparator.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/InstanceFactory.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/InstanceList.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/LeafNode.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Memory.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/NodeValue.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Path.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/QuantitativeDomain.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Schema.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Stats.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/TreeNode.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/AdaBoostBuilder.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/AdaBoostKBuilder.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/BoostedTester.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/C45Learner.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeBuilder.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeFactory.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeMerger.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/ForestBuilder.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/ForestTester.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/ID3Learner.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/Learner.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/SingleTreeBuilder.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/SingleTreeTester.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/Tester.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/AttributeChooser.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Categorizer.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/ClassDistribution.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/CondClassDistribution.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/CrossValidation.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Entropy.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Estimator.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/GainRatio.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/GlobalCategorizer.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Heuristic.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/InformationContainer.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/InstDistribution.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/SplitPoint.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassAnnotation.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassLogger.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassStructure.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassVisitor.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/FeatureNotSupported.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/FieldAnnotation.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/LogMethod.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/Logger.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/LoggerFactory.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/LoggerInterface.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/NumberComparator.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ObjectFactory.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/PseudoFieldExtractor.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/RulePrinter.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/SimpleLogger.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/Util.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/test/java/org/drools/learner/
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/test/java/org/drools/learner/LoggerTest.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/test/java/org/drools/learner/StructuredTestFactory.java
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/Car.java
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExample.java
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExampleFromDrl.java
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/car_c45_one.drl
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/car_c45_one.stats
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/golf_c45_one.drl
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/golf_c45_one.stats
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/log/
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/log/car_c45_one.log
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/log/golf_c45_one.log
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/log/restaurant_id3_one.log
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/restaurant_id3_one.drl
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/restaurant_id3_one.stats
Modified:
labs/jbossrules/contrib/machinelearning/5.0/drools-ant/.classpath
labs/jbossrules/contrib/machinelearning/5.0/drools-ant/.project
labs/jbossrules/contrib/machinelearning/5.0/drools-clips/.classpath
labs/jbossrules/contrib/machinelearning/5.0/drools-clips/.project
labs/jbossrules/contrib/machinelearning/5.0/drools-compiler/.classpath
labs/jbossrules/contrib/machinelearning/5.0/drools-compiler/.project
labs/jbossrules/contrib/machinelearning/5.0/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
labs/jbossrules/contrib/machinelearning/5.0/drools-core/.classpath
labs/jbossrules/contrib/machinelearning/5.0/drools-core/.project
labs/jbossrules/contrib/machinelearning/5.0/drools-dataloaders/drools-dataloaders-smooks/.classpath
labs/jbossrules/contrib/machinelearning/5.0/drools-dataloaders/drools-dataloaders-smooks/.project
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/.classpath
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/benchmark/manners/MannersBenchmark.java
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/FibonacciExample.java
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/troubleticket/TroubleTicketWithDT.java
labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/HelloWorld.drl
labs/jbossrules/contrib/machinelearning/5.0/drools-guvnor/.classpath
labs/jbossrules/contrib/machinelearning/5.0/drools-jsr94/.classpath
labs/jbossrules/contrib/machinelearning/5.0/drools-jsr94/.project
labs/jbossrules/contrib/machinelearning/5.0/drools-repository/.classpath
labs/jbossrules/contrib/machinelearning/5.0/drools-repository/.project
labs/jbossrules/contrib/machinelearning/5.0/drools-solver/drools-solver-core/.classpath
labs/jbossrules/contrib/machinelearning/5.0/drools-solver/drools-solver-core/.project
labs/jbossrules/contrib/machinelearning/5.0/drools-solver/drools-solver-examples/.classpath
labs/jbossrules/contrib/machinelearning/5.0/drools-solver/drools-solver-examples/.project
labs/jbossrules/contrib/machinelearning/5.0/drools-templates/.classpath
labs/jbossrules/contrib/machinelearning/5.0/drools-templates/.project
Log:
5.0 integration complete + the pruner
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-ant/.classpath
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-ant/.classpath 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-ant/.classpath 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,22 +1,22 @@
-<classpath>
- <classpathentry kind="src" path="src/main/java"/>
- <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
- <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
- <classpathentry kind="output" path="target/classes"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="var" path="M2_REPO/ant/ant/1.6.5/ant-1.6.5.jar"/>
- <classpathentry kind="var" path="M2_REPO/ant/ant-nodeps/1.6.5/ant-nodeps-1.6.5.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar"/>
- <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
- <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
- <classpathentry kind="src" path="/drools-compiler"/>
- <classpathentry kind="src" path="/drools-core"/>
- <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
- <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
- <classpathentry kind="src" path="/drools-decisiontables"/>
- <classpathentry kind="src" path="/drools-templates"/>
- <classpathentry kind="var" path="M2_REPO/jexcelapi/jxl/2.4.2/jxl-2.4.2.jar"/>
- <classpathentry kind="src" path="/drools-verifier"/>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+ <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
+ <classpathentry kind="output" path="target/classes"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="var" path="M2_REPO/ant/ant/1.6.5/ant-1.6.5.jar"/>
+ <classpathentry kind="var" path="M2_REPO/ant/ant-nodeps/1.6.5/ant-nodeps-1.6.5.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar"/>
+ <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
+ <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+ <classpathentry kind="src" path="/drools-compiler"/>
+ <classpathentry kind="src" path="/drools-core"/>
+ <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
+ <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
+ <classpathentry kind="src" path="/drools-decisiontables"/>
+ <classpathentry kind="src" path="/drools-templates"/>
+ <classpathentry kind="var" path="M2_REPO/jexcelapi/jxl/2.4.2/jxl-2.4.2.jar"/>
+ <classpathentry kind="src" path="/drools-verifier"/>
</classpath>
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-ant/.project
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-ant/.project 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-ant/.project 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,23 +1,23 @@
-<projectDescription>
- <name>drools-ant</name>
- <comment>A rule production system</comment>
- <projects>
- <project>drools-compiler</project>
- <project>drools-core</project>
- <project>drools-decisiontables</project>
- <project>drools-templates</project>
- <project>drools-verifier</project>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- </buildCommand>
- <buildCommand>
- <name>org.maven.ide.eclipse.maven2Builder</name>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- <nature>org.maven.ide.eclipse.maven2Nature</nature>
- </natures>
+<projectDescription>
+ <name>drools-ant</name>
+ <comment>A rule production system</comment>
+ <projects>
+ <project>drools-compiler</project>
+ <project>drools-core</project>
+ <project>drools-decisiontables</project>
+ <project>drools-templates</project>
+ <project>drools-verifier</project>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ </buildCommand>
+ <buildCommand>
+ <name>org.maven.ide.eclipse.maven2Builder</name>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.maven.ide.eclipse.maven2Nature</nature>
+ </natures>
</projectDescription>
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-clips/.classpath
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-clips/.classpath 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-clips/.classpath 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,15 +1,15 @@
-<classpath>
- <classpathentry kind="src" path="src/main/java"/>
- <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
- <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
- <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
- <classpathentry kind="output" path="target/classes"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
- <classpathentry kind="src" path="/drools-compiler"/>
- <classpathentry kind="src" path="/drools-core"/>
- <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
- <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+ <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+ <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
+ <classpathentry kind="output" path="target/classes"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+ <classpathentry kind="src" path="/drools-compiler"/>
+ <classpathentry kind="src" path="/drools-core"/>
+ <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
+ <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
</classpath>
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-clips/.project
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-clips/.project 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-clips/.project 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,16 +1,16 @@
-<projectDescription>
- <name>drools-clips</name>
- <comment>A rule production system</comment>
- <projects>
- <project>drools-compiler</project>
- <project>drools-core</project>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
+<projectDescription>
+ <name>drools-clips</name>
+ <comment>A rule production system</comment>
+ <projects>
+ <project>drools-compiler</project>
+ <project>drools-core</project>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
</projectDescription>
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-compiler/.classpath
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-compiler/.classpath 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-compiler/.classpath 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,16 +1,16 @@
-<classpath>
- <classpathentry kind="src" path="src/main/java"/>
- <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
- <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
- <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
- <classpathentry kind="output" path="target/classes"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar"/>
- <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
- <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
- <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
- <classpathentry kind="src" path="/drools-core"/>
- <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+ <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+ <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
+ <classpathentry kind="output" path="target/classes"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar"/>
+ <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
+ <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
+ <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
+ <classpathentry kind="src" path="/drools-core"/>
+ <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
</classpath>
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-compiler/.project
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-compiler/.project 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-compiler/.project 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,15 +1,15 @@
-<projectDescription>
- <name>drools-compiler</name>
- <comment>A rule production system</comment>
- <projects>
- <project>drools-core</project>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
+<projectDescription>
+ <name>drools-compiler</name>
+ <comment>A rule production system</comment>
+ <projects>
+ <project>drools-core</project>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
</projectDescription>
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-compiler/src/main/java/org/drools/compiler/PackageBuilder.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -56,6 +56,12 @@
import org.drools.lang.descr.RuleDescr;
import org.drools.lang.descr.TypeDeclarationDescr;
import org.drools.lang.descr.TypeFieldDescr;
+// learner packages
+import org.drools.learner.DecisionTree;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.RulePrinter;
+import org.drools.learner.tools.Util;
+
import org.drools.process.core.Process;
import org.drools.reteoo.ReteooRuleBase;
import org.drools.rule.ImportDeclaration;
@@ -241,6 +247,25 @@
this.results.addAll( parser.getErrors() );
addPackage( pkg );
}
+
+ /**
+ * Load the decision tree and its rules.
+ *
+ * @param learner
+ * @throws DroolsParserException
+ * @throws IOException
+ */
+ public void addPackageFromTree(final DecisionTree dt) throws DroolsParserException, IOException {
+ Reader reader = RulePrinter.readRules(dt);
+ /* final DrlParser parser = new DrlParser();
+ final PackageDescr pkg = parser.parse( reader );
+ this.results.addAll( parser.getErrors() );
+ addPackage( pkg );
+ */
+ // save the logger
+ LoggerFactory.dump_buffer(Util.DRL_DIRECTORY+dt.getSignature(), "log");
+ this.addPackageFromDrl(reader);
+ }
/**
* Load a rule package from XML source.
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-core/.classpath
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/.classpath 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/.classpath 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,8 +1,12 @@
-<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry including="**/*.java" kind="src" output="target/test-classes" path="src/test/java"/>
- <classpathentry including="**/*.java" kind="src" path="src/main/java"/>
- <classpathentry kind="con" path="org.devzuz.q.maven.jdt.core.mavenClasspathContainer"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="output" path="target/classes"/>
-</classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+ <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+ <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
+ <classpathentry kind="output" path="target/classes"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar"/>
+ <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
+ <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
+</classpath>
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-core/.project
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/.project 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/.project 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,28 +1,20 @@
-<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
- <name>drools-core</name>
- <comment>A rule production system</comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.drools.eclipse.droolsbuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.devzuz.q.maven.jdt.core.mavenIncrementalBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- <nature>org.devzuz.q.maven.jdt.core.mavenNature</nature>
- </natures>
-</projectDescription>
+ <name>drools-core</name>
+ <comment>A rule production system</comment>
+ <projects/>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ </buildCommand>
+ <buildCommand>
+ <name>org.drools.eclipse.droolsbuilder</name>
+ </buildCommand>
+ <buildCommand>
+ <name>org.devzuz.q.maven.jdt.core.mavenIncrementalBuilder</name>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.devzuz.q.maven.jdt.core.mavenNature</nature>
+ </natures>
+</projectDescription>
\ No newline at end of file
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Attribute.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Attribute.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Attribute.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,41 @@
+package org.drools.learner;
+
+public class Attribute {
+
+ private String name;
+ private Object value;
+
+ //final ClassFieldExtractor extractor = cache.getExtractor( class_obj, f_name, getClass().getClassLoader() );
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String _name) {
+ this.name = _name;
+ }
+
+ public Object getValue() {
+ return value;
+ }
+
+ public void setValue(Object _value) {
+ this.value = _value;
+ }
+
+ /* we assume that "another" points to the same attribute type as this */
+ public int compareValue(Attribute another) {
+ /* Boolean, Double, Integer, String...*/
+ return AttributeValueComparator.instance.compare(getValue(), another.getValue());
+ }
+
+ public int hashCode() {
+ return this.value.hashCode();
+ }
+
+ public String toString() {
+ return value.toString();
+ }
+
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Attribute.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/AttributeValueComparator.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/AttributeValueComparator.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/AttributeValueComparator.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,16 @@
+package org.drools.learner;
+
+import java.util.Comparator;
+
+public class AttributeValueComparator implements Comparator<Object> {
+
+ /* we assume that "another" points to the same attribute type as this */
+ public int compare(Object value1, Object value2) {
+ if (value1 instanceof Comparable)
+ return ((Comparable)value1).compareTo(value2); /* Boolean, Double, Integer, String...*/
+ return value1.hashCode() - value2.hashCode();
+ }
+
+ // singleton wannabe
+ public static AttributeValueComparator instance = new AttributeValueComparator();
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/AttributeValueComparator.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DecisionTree.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DecisionTree.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DecisionTree.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,170 @@
+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 {
+
+ protected static SimpleLogger slog = LoggerFactory.getSysOutLogger(DecisionTree.class, SimpleLogger.DEFAULT_LEVEL);
+
+ //private Class<?> obj_clazz;
+ private Schema obj_schema;
+
+ /* the target attribute */
+ private Domain target;
+
+ ///* all attributes that will be used during classification */
+ private ArrayList<Domain> attrsToClassify;
+
+ private TreeNode root;
+
+ // The id of the tree in the forest
+ private int id;
+
+ private String execution_signature;
+ public long FACTS_READ = 0;
+
+ private int validation_error, training_error;
+
+ private int num_nonterminal_nodes;
+
+ public DecisionTree(Schema inst_schema, String _target) {
+ this.obj_schema = inst_schema; //inst_schema.getObjectClass();
+ this.num_nonterminal_nodes = 0;
+
+ if (slog.debug() != null)
+ slog.debug().log("The target attribute: "+ _target+ "\n");
+
+ 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));
+ }
+ }
+ Collections.sort(this.attrsToClassify, new DomainComparator()); // compare the domains by the name
+
+ }
+
+ 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()) {
+ if (attr_domain.isNotJustSelected(exceptDomain))
+ this.attrsToClassify.add(attr_domain);
+ }
+// System.out.print("New tree ");
+// for (Domain d:attrsToClassify)
+// System.out.print("d: "+d);
+// System.out.println("");
+ //Collections.sort(this.attrsToClassify, new Comparator<Domain>()); // compare the domains by the name
+
+ }
+
+ private Schema getSchema() {
+ return obj_schema;
+ }
+
+ public Class<?> getObjClass() {
+ return obj_schema.getObjectClass();
+ }
+
+ public HashMap<String, ArrayList<Field>> getAttrRelationMap() {
+ return obj_schema.getAttrRelationMap();
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setID(int i) {
+ this.id = i;
+ }
+
+ public Domain getTargetDomain() {
+ return target;
+ }
+
+ public ArrayList<Domain> getAttrDomains() {
+ return attrsToClassify;
+ }
+
+ public TreeNode getRoot() {
+ return (root);
+ }
+
+ public void setRoot(TreeNode root) {
+ this.root = root;
+ }
+
+ public Object vote(Instance i) {
+ return this.getRoot().voteFor(i);
+ }
+
+
+ public void setValidationError(int error) {
+ validation_error = error;
+ }
+ public int getValidationError() {
+ return validation_error;
+ }
+
+ public void setTrainingError(int error) {
+ training_error = error;
+ }
+ public int getTrainingError() {
+ return training_error;
+ }
+
+ public int calc_num_node_leaves(TreeNode my_node) {
+ if (my_node instanceof LeafNode) {
+
+ return 1;
+ } else {
+ num_nonterminal_nodes ++;
+ }
+
+ int leaves = 0;
+ for (Object child_key: my_node.getChildrenKeys()) {
+ /* split the last two class at the same time */
+
+ TreeNode child = my_node.getChild(child_key);
+ leaves += calc_num_node_leaves(child);
+
+ }
+ my_node.setNumLeaves(leaves);
+ return leaves;
+ }
+
+ public int getNumNonTerminalNodes() {
+ return num_nonterminal_nodes;
+ }
+ public void setSignature(String executionSignature) {
+ execution_signature = executionSignature;
+ }
+
+ public String getSignature() {
+ return execution_signature;
+ }
+
+ @Override
+ public String toString() {
+ String out = "Facts scanned " + FACTS_READ + "\n";
+ return out + root.toString();
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DecisionTree.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DecisionTreePruner.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DecisionTreePruner.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DecisionTreePruner.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,374 @@
+package org.drools.learner;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+import org.drools.learner.builder.SingleTreeTester;
+import org.drools.learner.eval.Estimator;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+
+
+
+public class DecisionTreePruner {
+
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(DecisionTreePruner.class, SimpleLogger.DEFAULT_LEVEL);
+ private static SimpleLogger slog = LoggerFactory.getSysOutLogger(DecisionTreePruner.class, SimpleLogger.DEBUG);
+
+ private Estimator procedure;
+
+ private ArrayList<ArrayList<NodeUpdate>> updates;
+ private int num_trees_to_grow;
+
+ private NodeUpdate best_update;
+ public DecisionTreePruner(Estimator proc) {
+ procedure = proc;
+ num_trees_to_grow = procedure.getEstimatorSize();
+ updates = new ArrayList<ArrayList<NodeUpdate>>(num_trees_to_grow);
+
+ best_update = new NodeUpdate(10000000.0d);
+ }
+
+ public void prun_tree(DecisionTree tree) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void prun_to_estimate() {
+ for (DecisionTree dt: procedure.getEstimators()) {
+ // dt.getId()
+ //dt.calc_num_node_leaves(dt.getRoot()); // this is done in the estimator
+ ArrayList<NodeUpdate> tree_sequence = new ArrayList<NodeUpdate>();
+ updates.add(tree_sequence);
+ NodeUpdate init_tree = new NodeUpdate(dt.getValidationError());
+ init_tree.setResubstitution_cost(dt.getTrainingError());
+ init_tree.setAlpha(-1); // dont know
+ init_tree.setCost_complexity(-1); // dont known
+ init_tree.setDecisionTree(dt);
+ init_tree.setNum_terminal_nodes(dt.getRoot().getNumLeaves());
+ tree_sequence.add(init_tree);
+
+ sequence_trees(dt);
+
+ // sort the found candidates
+ //Collections.sort(updates.get(dt.getId()), arg1)
+
+ int id =0;
+ System.out.println("Tree id\t Num_leaves\t Cross-validated\t Resubstitution\t Alpha\t");
+ for (NodeUpdate nu: updates.get(dt.getId()) ){
+ //System.out.println("Tree id\t Num_leaves\t Cross-validated\t Resubstitution\t Alpha\t");
+ System.out.println(id +"\t"+ nu.getNum_terminal_nodes()+"\t"+nu.getCross_validated_cost()+"\t"+nu.getResubstitution_cost()+"\t"+nu.getAlpha()+"\n");
+ id++;
+ }
+ }
+
+ }
+
+ private void sequence_trees(DecisionTree dt_0) {
+ if (slog.debug() !=null)
+ slog.debug().log(dt_0.toString() +"\n");
+ // if number of non-terminal nodes in the tree is more than 1
+ // = if there exists at least one non-terminal node different than root
+ if (dt_0.getNumNonTerminalNodes() < 1) {
+ if (slog.debug() !=null)
+ slog.debug().log(":sequence_trees:TERMINATE-There is no non-terminal nodes? " + dt_0.getNumNonTerminalNodes() +"\n");
+ return;
+ } else if (dt_0.getNumNonTerminalNodes() == 1 && dt_0.getRoot().getNumLeaves()<=1) {
+ if (slog.debug() !=null)
+ slog.debug().log(":sequence_trees:TERMINATE-There is only one node left which is root node " + dt_0.getNumNonTerminalNodes()+ " and it has only one leaf (pruned)" +dt_0.getRoot().getNumLeaves()+"\n");
+ return;
+ }
+ // for each non-leaf subtree
+ ArrayList<TreeNode> candidate_nodes = new ArrayList<TreeNode>();
+ // to find all candidates with min_alpha value
+ TreeSequenceProc search = new TreeSequenceProc(100000.0d, new MinAlphaProc());
+
+
+ search.find_candidate_nodes(dt_0, dt_0.getRoot(), candidate_nodes);
+ double min_alpha = search.getTheAlpha();
+ System.out.println("!!!!!!!!!!!alpha: "+min_alpha + " num_nodes_found "+candidate_nodes.size());
+
+ if (candidate_nodes.size() >0) {
+ // The one or more subtrees with that value of will be replaced by leaves
+ // instead of getting the first node, have to process all nodes and prune all
+ // write a method to prune all
+ TreeNode best_node = candidate_nodes.get(0);
+ LeafNode best_clone = new LeafNode(dt_0.getTargetDomain(), best_node.getLabel());
+ best_clone.setRank( best_node.getRank());
+ best_clone.setNumMatch(best_node.getNumMatch()); //num of matching instances to the leaf node
+ best_clone.setNumClassification(best_node.getNumLabeled()); //num of (correctly) classified instances at the leaf node
+
+ NodeUpdate update = new NodeUpdate(best_node, best_clone);
+ //update.set
+ update.setAlpha(min_alpha);
+ update.setDecisionTree(dt_0);
+ int k = numExtraMisClassIfPrun(best_node); // extra misclassified guys
+ int num_leaves = best_node.getNumLeaves();
+ int new_num_leaves = dt_0.getRoot().getNumLeaves() - num_leaves +1;
+
+ TreeNode father_node = best_node.getFather();
+ if (father_node != null) {
+ for(Object key: father_node.getChildrenKeys()) {
+ if (father_node.getChild(key).equals(best_node)) {
+ father_node.putNode(key, best_clone);
+ break;
+ }
+ }
+ updateLeaves(father_node, -num_leaves+1);
+ } else {
+ // this node does not have any father node it is the root node of the tree
+ dt_0.setRoot(best_clone);
+ }
+
+
+ ArrayList<InstanceList> sets = procedure.getFold(dt_0.getId());
+ //InstanceList learning_set = sets.get(0);
+ InstanceList validation_set = sets.get(1);
+
+ int error = 0;
+ SingleTreeTester t= new SingleTreeTester(dt_0);
+ for (int index_i = 0; index_i < validation_set.getSize(); index_i++) {
+ Integer result = t.test(validation_set.getInstance(index_i));
+ if (result == Stats.INCORRECT) {
+ error ++;
+ }
+ }
+
+
+ update.setCross_validated_cost(error);
+ int new_resubstitution_cost = dt_0.getTrainingError() + k;
+ double cost_complexity = new_resubstitution_cost + min_alpha * (new_num_leaves);
+
+
+ if (slog.debug() !=null)
+ slog.debug().log(":sequence_trees:cost_complexity of selected tree "+ cost_complexity +"\n");
+ update.setResubstitution_cost(new_resubstitution_cost);
+ // Cost Complexity = Resubstitution Misclassification Cost + \alpha . Number of terminal nodes
+ update.setCost_complexity(cost_complexity);
+ update.setNum_terminal_nodes(new_num_leaves);
+
+ updates.get(dt_0.getId()).add(update);
+
+ if (slog.debug() !=null)
+ slog.debug().log(":sequence_trees:error "+ error +"<?"+ procedure.getValidationErrorEstimate() * 1.6 +"\n");
+
+ if (error < procedure.getValidationErrorEstimate() * 1.6) {
+ // if the error of the tree is not that bad
+
+ if (error < best_update.getCross_validated_cost()) {
+ best_update = update;
+ if (slog.debug() !=null)
+ slog.debug().log(":sequence_trees:best node updated \n");
+
+ }
+
+ sequence_trees(dt_0);
+ } else {
+ update.setStopTree();
+ return;
+ }
+ }
+
+ }
+
+ private void updateLeaves(TreeNode my_node, int i) {
+ my_node.setNumLeaves(my_node.getNumLeaves() + i);
+ TreeNode father_node = my_node.getFather();
+ if (father_node !=null)
+ updateLeaves(father_node, i);
+
+ }
+
+
+ private int numExtraMisClassIfPrun(TreeNode my_node) {
+ int num_misclassified = (int) my_node.getNumMatch() - my_node.getNumLabeled(); // needs to be cast because of
+ if (slog.debug() !=null)
+ slog.debug().log(":numExtraMisClassIfPrun:num_misclassified "+ num_misclassified);
+
+
+
+ int kids_misclassified = 0;
+ for(Object key: my_node.getChildrenKeys()) {
+ TreeNode child = my_node.getChild(key);
+ kids_misclassified += child.getMissClassified();//(int) child.getNumMatch() - child.getNumLabeled();
+ if (slog.debug() !=null)
+ slog.debug().log(" kid="+ kids_misclassified );
+ }
+ if (slog.debug() !=null)
+ slog.debug().log("\n");
+ return num_misclassified - kids_misclassified;
+ }
+
+
+ public class TreeSequenceProc {
+ private double the_alpha;
+ private AlphaSelectionProc alpha_proc;
+
+ public TreeSequenceProc(double value, AlphaSelectionProc cond) {
+ the_alpha = value;
+ alpha_proc = cond;
+ }
+
+ // memory optimized
+ public void find_candidate_nodes(DecisionTree dt, TreeNode my_node, ArrayList<TreeNode> nodes) {
+
+ if (my_node instanceof LeafNode) {
+
+ //leaves.add((LeafNode) my_node);
+ return;
+ } else {
+ // if you prune that one k more instances are misclassified
+
+ int k = numExtraMisClassIfPrun(my_node);
+ int num_leaves = my_node.getNumLeaves();
+
+ double alpha = ((double)k)/((double)dt.FACTS_READ * (num_leaves-1));
+ if (slog.debug() !=null)
+ slog.debug().log(":search_alphas:alpha "+ alpha+ "/"+the_alpha+ " k "+k+" num_leaves "+num_leaves+" all "+ dt.FACTS_READ + "\n");
+
+ the_alpha = alpha_proc.update_nodes(alpha, the_alpha, my_node, nodes);
+
+ for (Object attributeValue : my_node.getChildrenKeys()) {
+ TreeNode child = my_node.getChild(attributeValue);
+ find_candidate_nodes(dt, child, nodes);
+ //nodes.pop();
+ }
+ }
+ return;
+ }
+
+ public double getTheAlpha() {
+ return the_alpha;
+ }
+ }
+
+ public interface AlphaSelectionProc {
+ public double update_nodes(double cur_alpha, double the_alpha, TreeNode cur_node, ArrayList<TreeNode> nodes);
+ }
+ public class MinAlphaProc implements AlphaSelectionProc{
+// private double best_alpha;
+// public MinAlphaProc(double value) {
+// best_alpha = value;
+// }
+
+ public double update_nodes(double cur_alpha, double the_alpha, TreeNode cur_node, ArrayList<TreeNode> nodes) {
+ if (cur_alpha == the_alpha) {
+ // add this one to the set
+ nodes.add(cur_node);
+ return cur_alpha;
+ } else if (cur_alpha < the_alpha) {
+
+ nodes.clear(); // can not put a new 'cause then it does not update the global one = new ArrayList<TreeNode>();
+ // remove the ones you found and replace with that one
+ //tree_sequence.get(dt_id).put(my_node), alpha
+
+ nodes.add(cur_node);
+ return cur_alpha;
+
+ } else {
+
+ }
+ return the_alpha;
+ }
+
+// public double getAlpha() {
+// return best_alpha;
+// }
+ }
+
+ public class AnAlphaProc implements AlphaSelectionProc{
+// private double an_alpha;
+// public AnAlphaProc(double value) {
+// an_alpha = value;
+// }
+
+ public double update_nodes(double cur_alpha, double the_alpha, TreeNode cur_node, ArrayList<TreeNode> nodes) {
+
+ if (cur_alpha == the_alpha) {
+ // add this one to the set
+ nodes.add(cur_node);
+ }
+ return cur_alpha;
+ }
+
+// public double getAlpha() {
+// return an_alpha;
+// }
+ }
+
+ public class NodeUpdate{
+
+ private boolean stopTree;
+
+ private DecisionTree tree;
+
+ private TreeNode old_node, node_update;
+ private int num_terminal_nodes;
+ private double cross_validated_cost;
+ private double resubstitution_cost;
+ private double cost_complexity;
+ private double alpha;
+
+ // to set an node update with the worst cross validated error
+ public NodeUpdate(double error) {
+ cross_validated_cost = error;
+ stopTree = false;
+ old_node = null;
+ node_update = null;
+ }
+ public NodeUpdate(TreeNode old_n, LeafNode new_n) {
+ stopTree = false;
+ old_node = old_n;
+ node_update = new_n;
+ }
+
+ public void setDecisionTree(DecisionTree dt_0) {
+ tree = dt_0;
+ }
+
+ public void setStopTree() {
+ stopTree = true;
+ }
+
+ public int getNum_terminal_nodes() {
+ return num_terminal_nodes;
+ }
+
+ public void setNum_terminal_nodes(int num_terminal_nodes) {
+ this.num_terminal_nodes = num_terminal_nodes;
+ }
+
+ public double getCross_validated_cost() {
+ return cross_validated_cost;
+ }
+
+ public void setCross_validated_cost(double cross_validated_cost) {
+ this.cross_validated_cost = cross_validated_cost;
+ }
+
+ public double getResubstitution_cost() {
+ return resubstitution_cost;
+ }
+
+ public void setResubstitution_cost(double resubstitution_cost) {
+ this.resubstitution_cost = resubstitution_cost;
+ }
+
+ public double getCost_complexity() {
+ return cost_complexity;
+ }
+
+ public void setCost_complexity(double cost_complexity) {
+ this.cost_complexity = cost_complexity;
+ }
+
+ public double getAlpha() {
+ return alpha;
+ }
+
+ public void setAlpha(double alpha) {
+ this.alpha = alpha;
+ }
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DecisionTreePruner.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DecisionTreeVisitor.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DecisionTreeVisitor.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DecisionTreeVisitor.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,142 @@
+package org.drools.learner;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Stack;
+
+
+public class DecisionTreeVisitor {
+
+ private Stack<NodeValue> nodes;
+
+ private HashMap<Integer, Path> paths;
+
+ private int num_paths_found;
+
+ public DecisionTreeVisitor() {
+ /* most important */
+ this.nodes = new Stack<NodeValue>();
+ this.paths = new HashMap<Integer, Path>();
+ num_paths_found = 0;
+ }
+
+ public void visit(DecisionTree dt) {
+ dfs(dt.getRoot(), dt.getId());
+// if (!nodes.empty())
+// nodes.pop(); // POP the root
+
+ }
+ // memory optimized
+ public void visit2(DecisionTree dt) {
+ dfs2(dt.getRoot(), dt.getId());
+ //if (!nodes.empty())
+ nodes.pop(); // POP the root
+
+ }
+
+ private void dfs(TreeNode my_node, int tree_id) {
+ //System.out.println("How many guys there of "+my_node.getDomain().getName() +" : "+my_node.getDomain().getValues().size());
+
+ if (my_node instanceof LeafNode) {
+ NodeValue leaf_value = new NodeValue(my_node);
+ leaf_value.setValue(((LeafNode) my_node).getCategory()); //getValue(null));
+ nodes.push(leaf_value);
+ Path p = spitPath(nodes);
+ p.setTreeId(tree_id);
+ num_paths_found ++;
+ if (!paths.containsKey(p.hashCode())) {
+ paths.put(p.hashCode(), p);
+ }
+ nodes.pop();
+ return;
+ }
+
+ for (Object attributeValue : my_node.getChildrenKeys()) {
+ //System.out.println("Domain: "+ my_node.getDomain().getName() + " the value:"+ attributeValue);
+ NodeValue node_value = new NodeValue(my_node);
+ node_value.setValue(attributeValue);
+ nodes.push(node_value);
+ TreeNode child = my_node.getChild(attributeValue);
+ dfs(child, tree_id);
+ nodes.pop();
+ }
+ return;
+ }
+ // memory optimized
+ private void dfs2(TreeNode my_node, int tree_id) {
+ //System.out.println("How many guys there of "+my_node.getDomain().getName() +" : "+my_node.getDomain().getValues().size());
+ NodeValue node_value = new NodeValue(my_node);
+ nodes.push(node_value);
+ if (my_node instanceof LeafNode) {
+ //NodeValue leaf_value = new NodeValue(my_node);
+ node_value.setValue(((LeafNode) my_node).getCategory()); //getValue(null));
+ //nodes.push(leaf_value);
+ //paths.add(getPath(nodes)); // if i can spit the rule here it would work
+ Path p = spitPath(nodes);
+ p.setTreeId(tree_id);
+
+ if (!paths.containsKey(p.hashCode())) {
+ paths.put(p.hashCode(), p);
+ }
+ return;
+ }
+
+ for (Object attributeValue : my_node.getChildrenKeys()) {
+ //System.out.println("Domain: "+ my_node.getDomain().getName() + " the value:"+ attributeValue);
+ node_value.setValue(attributeValue);
+ TreeNode child = my_node.getChild(attributeValue);
+ dfs2(child, tree_id);
+ nodes.pop();
+ }
+ return;
+ }
+
+
+ public int getNumPaths() {
+ return paths.size();
+ }
+
+ public int getNumPathsFound() {
+ return num_paths_found;
+ }
+
+ public Collection<Path> getPathList() {
+ return paths.values();
+ }
+
+ private Path spitPath(Stack<NodeValue> nodes) {
+ //, Stack<NodeValue> leaves // if more than one leaf
+ Path newPath = new Path(nodes.size());// (nodes, leaves) //if more than one leaf
+ //newRule.setObjectClass(this.getRuleClass());
+ Iterator<NodeValue> it = nodes.iterator();
+ while (it.hasNext()) {
+
+ NodeValue current = it.next();
+ if (it.hasNext()) {
+ newPath.addStep(current);
+ } else {
+ newPath.setStats(current);
+ }
+ }
+
+// if (slog.debug() != null) {
+// slog.debug().log("\n"+newPath.hashCode()+ " : "+ newPath + "\n");
+// }
+ return newPath;
+ }
+
+
+
+// private ArrayList<NodeValue> getPath(Stack<NodeValue> nodes) {
+// //, Stack<NodeValue> leaves // if more than one leaf
+// ArrayList<NodeValue> path = new ArrayList<NodeValue> (nodes.size());
+// Iterator<NodeValue> it = nodes.iterator();
+// while (it.hasNext()) {
+// NodeValue current = it.next();
+// path.add(current);
+// }
+// return path;
+// }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DecisionTreeVisitor.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Domain.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Domain.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Domain.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,177 @@
+package org.drools.learner;
+
+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, objKlass /*the class that attribute belongs to*/; // , ownerKlass; // not sure if necessary
+ protected ArrayList<Object> fCategories;
+
+ 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.objKlass, this.fName, this.fType);
+ //dom.fixed = this.fixed;
+ dom.categorical = this.categorical;
+ //dom.readingSeq = readingSeq;
+ dom.fCategories = this.fCategories;
+
+ return dom;
+ }
+
+ public Class<?> getFType() {
+ return this.fType;
+ }
+
+ public String getFReferenceName() {
+ return Util.getFReference(objKlass, fName);
+ }
+ public String getFName() {
+ return this.fName;
+ }
+
+ protected void setFName(String name) {
+ this.fName = name;
+ }
+ public void setFixed(boolean _fixed) {
+ this.fixed = _fixed;
+ }
+
+ /** Indicates that this domain cannot be changed after creation */
+ boolean isFixed() {
+ return this.fixed;
+ }
+
+ public void setCategorical(boolean _cate) {
+ this.categorical = _cate;
+ }
+
+ /** Indicates that this domain has discrete set of values */
+ public boolean isCategorical() {
+ 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) {
+ if (!fCategories.contains(value)) fCategories.add(value);
+ } else {
+ return;
+ }
+
+ }
+
+ public Object getCategory(int idx) {
+ return fCategories.get(idx);
+ }
+ public int getCategoryCount() {
+ return fCategories.size();
+ }
+
+ public boolean isPossible(Object _value) throws Exception {
+ //System.out.println("Domain.isPossible() start "+ value+ " ?");
+// since the value is coming from the extractor i dont check the type
+// if (_value.getClass()!= this.fType)
+// return false;
+ //System.exit(0);
+ if (fixed) {// if it is boolean type actually you do not need to check for the contains function {TRUE, FALSE}
+ return this.containsValue(_value);
+ } else {
+ return true;
+ }
+
+ }
+
+ public boolean containsValue(Object value) throws Exception {
+ if (categorical) {
+ return this.fCategories.contains(value);
+ } else {
+ if (fCategories.isEmpty() || fCategories.size()==1)
+ throw new Exception(" Domain "+fName+" is constant and not discrete but bounds are not set: possible values size: "+ fCategories.size());
+
+ // they must be sorted
+ return (AttributeValueComparator.instance.compare(value, fCategories.get(0)) >= 0 && AttributeValueComparator.instance.compare(value, fCategories.get(getCategoryCount()-1)) <= 0);
+ //return (nComparator.compare((Number)value, fValues.get(0)) >= 0 && nComparator.compare((Number)value, fValues.get(fValues.size()-1)) <= 0);
+
+ /* should i check if the value is in one of the intervals
+ * this is necessary only if the intervals are unbroken
+ */
+ }
+ }
+
+ public Object getCategoryOf(Object value) {
+ if (categorical) {
+ return value;
+ } else {
+
+ int insertion_point = Collections.binarySearch(this.fCategories, value , AttributeValueComparator.instance);
+ /*
+ * index of the search key, if it is contained in the list; otherwise, (-(insertion point) - 1).
+ * The insertion point is defined as the point at which the key would be inserted into the list:
+ * the index of the first element greater than the key, or list.size(), if all elements in the
+ * list are less than the specified key. Note that this guarantees that the return value will be >= 0
+ * if and only if the key is found.
+ */
+ if (insertion_point >= 0) {
+ return this.fCategories.get(insertion_point);
+ } else {
+ int unfound_insertion_point = -(insertion_point) -1;
+ if (unfound_insertion_point >= this.fCategories.size()) {
+ //System.out.println("insestion point is the size domain "+this);
+ unfound_insertion_point = this.fCategories.size() -1;
+ }
+ return this.fCategories.get(unfound_insertion_point);
+ }
+ }
+
+ }
+
+ public boolean isNotJustSelected(Domain exceptDomain) {
+ if (this.objKlass.equals(exceptDomain.getObjKlass()))
+ return !this.getFName().equals(exceptDomain.getFName());
+ return true;
+ }
+
+ public int hashCode() {
+ return objKlass.hashCode() ^ fName.hashCode() ^ fCategories.hashCode(); // TODO
+ }
+
+ public String toString() {
+ StringBuffer sb = new StringBuffer(fName + "");
+// for (Object v: fValues) {
+// sb.append("-" + v);
+// }
+ return sb.toString();
+
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Domain.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DomainComparator.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DomainComparator.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DomainComparator.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,19 @@
+package org.drools.learner;
+
+import java.util.Comparator;
+
+
+public class DomainComparator implements Comparator<Domain> {
+
+ public int compare(Domain d0, Domain d1) {
+
+ return d0.getFName().compareTo(d1.getFName());
+// int fNameComp = d0.getFName().compareTo(d1.getFName());
+// if (fNameComp!=0)
+// return fNameComp;
+// else if () // do other stuff
+// return 1;
+// else
+// return 0;
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/DomainComparator.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Instance.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Instance.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Instance.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,51 @@
+package org.drools.learner;
+
+import java.util.HashMap;
+
+
+public class Instance {
+ private HashMap<String, Attribute> attributes;
+ private double weight = 1.0;
+
+ public Instance() {
+ this.attributes = new HashMap<String, Attribute>(); // TODO should i set a size, HOW?
+ }
+
+ public void setWeight(double w) {
+ weight = w;
+ }
+
+ public double getWeight() {
+ 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);
+ f_attr.setValue(_value);
+ this.attributes.put(_name, f_attr);
+ }
+
+ public Attribute getAttr(String field_name) {
+ return attributes.get(field_name);
+ }
+ public Object getAttrValue(String field_name) {
+ return attributes.get(field_name).getValue();
+ }
+
+ public int hashCode() {
+ return attributes.hashCode();
+ }
+
+ public String toString() {
+ StringBuffer sb = new StringBuffer(this.hashCode() + " ");
+ for (String key: attributes.keySet()) {
+ sb.append(key +"="+attributes.get(key)+", ");
+ }
+ return sb.toString();
+ }
+
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Instance.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/InstanceComparator.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/InstanceComparator.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/InstanceComparator.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,17 @@
+package org.drools.learner;
+
+import java.util.Comparator;
+
+
+public class InstanceComparator implements Comparator<Instance> {
+
+ private String attr_name;
+
+ public InstanceComparator(String _attr_name) {
+ this.attr_name = _attr_name;
+ }
+ public int compare(Instance i0, Instance i1) {
+ return i0.getAttr(this.attr_name).compareValue(i1.getAttr(this.attr_name));
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/InstanceComparator.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/InstanceFactory.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/InstanceFactory.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/InstanceFactory.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,139 @@
+package org.drools.learner;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+import org.drools.WorkingMemory;
+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.ReadAccessor;
+
+public class InstanceFactory {
+
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(InstanceFactory.class, SimpleLogger.DEFAULT_LEVEL);
+ private static SimpleLogger slog = LoggerFactory.getSysOutLogger(InstanceFactory.class, SimpleLogger.DEFAULT_LEVEL);
+
+ private WorkingMemory session;
+ private Schema schema;
+ public InstanceFactory(WorkingMemory _session, Schema _schema) {
+ session = _session;
+ schema = _schema;
+ }
+
+ public Instance createInstance(Object _obj) {
+ try {
+ //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();
+ }
+ return null;
+ }
+
+ public boolean instantiateAttributes(Instance inst, Object _obj, Class<?> klass) throws Exception {
+
+ if (slog.info() != null)
+ slog.info().log("Klass : "+ klass);
+ ClassStructure struct = schema.getClassStructure().get(klass);
+ if (slog.info() != null)
+ slog.info().log("\t ClassStructure : "+ struct + "\n");
+ if (struct == null)
+ return false;
+
+ if (struct.hasLabel()) {// it has a method or label
+ if (slog.debug() != null)
+ slog.debug().log(":instantiateAttributes:structure has a label ");
+ for (Method m : struct.getMethods()) {
+ String m_name = m.getName();
+// if (m_name.startsWith("get")) {//TODO check
+// m_name = m_name.substring(3).toLowerCase();
+// }
+
+ DataType m_type = DataType.PRIMITIVE;// must be primitive
+ if (slog.debug() != null)
+ slog.debug().log("method= "+m_name + " m_type="+m_type+ "\n");
+ getAttributeValue(inst, _obj, m_name, m_type);
+ }
+ }
+ // get the fields declared in the class
+ for (Field f : struct.getFields()) {
+ String f_name = f.getName();
+ DataType f_type = struct.getFieldType(f);
+ getAttributeValue(inst, _obj, f_name, f_type);
+ }
+ if (!struct.getParent().equals(Object.class))
+ return instantiateAttributes(inst, _obj, struct.getParent());
+
+ 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(fReference);
+ ReadAccessor f_extractor = schema.getAttrExtractor(fReference);
+ if (slog.info() != null)
+ slog.info().log("Field name : "+ name+ " of the object "+ _obj + " the extract:"+f_extractor+"\n");
+
+ //Object f_value = f_extractor.getValue( (InternalWorkingMemory) session, _obj);
+ Object f_value = f_extractor.getValue( _obj);
+ if (f_value != null) {
+ try {
+ if (fieldDomain.isPossible(f_value)) {
+ fieldDomain.addCategory(f_value);
+ inst.setAttr(fReference, f_value);
+ }
+ } catch (Exception e) {
+ if (slog.debug() != null)
+ slog.debug().log("Domain: "+fieldDomain+ " could not add the value "+ f_value+ "\n");
+ e.printStackTrace();
+ }
+ } else {
+ if (slog.debug() != null)
+ slog.debug().log("Field name : "+ name+ " of the object "+ _obj + " the extract:"+f_extractor+"\n");
+ if (slog.debug() != null)
+ slog.debug().log("The attribute value cannot be read, check the attribute\n");
+ System.exit(0);
+ }
+ break;
+ case STRUCTURED: // the extractor exists for both types of data.
+ ReadAccessor complex_f_extractor = schema.getAttrExtractor(fReference); // this returns an object to me
+ //Object obj_value = complex_f_extractor.getValue( (InternalWorkingMemory) session, _obj);
+ Object obj_value = complex_f_extractor.getValue(_obj);
+ instantiateAttributes(inst, obj_value, obj_value.getClass());
+
+ break;
+ // case Collection
+ default:
+ throw new Exception("What type of data is this");
+
+ }
+
+ return;
+ }
+
+
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/InstanceFactory.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/InstanceList.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/InstanceList.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/InstanceList.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,138 @@
+package org.drools.learner;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.drools.WorkingMemory;
+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.DEBUG);
+
+ private Schema schema;
+ private ArrayList<Instance> instances;
+ private InstanceFactory factory;
+
+ 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);
+ }
+
+ 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);
+
+ if (inst != null ) {
+ // the object is validated and the instance is created
+ //System.out.println(inst);
+ instances.add(inst);
+ } 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);
+ }
+ }
+
+ public void addAsInstance(Instance inst) {
+ instances.add(inst);
+ }
+
+ public int getSize() {
+ return instances.size();
+ }
+
+ public Instance getInstance(int index) {
+ return instances.get(index);
+ }
+
+ public List<Instance> getInstances() {
+ return instances;
+ }
+
+ public InstanceList getInstances(int[] bag) {
+ if (bag.length > this.getSize()) {
+ System.out.println("Exception: TOO BIG to get Memory.getClassInstancesOf");
+ return null;
+ }
+ InstanceList toReturn = new InstanceList(this.getSchema(), bag.length);
+ for (int j = 0; j< bag.length ; j ++) {
+ toReturn.addAsInstance(this.getInstance(bag[j]));
+ }
+ return toReturn;
+ }
+
+ public Schema getSchema() {
+ return schema;
+ }
+ public Collection<String> getTargets() {
+ return schema.getTargets();
+ }
+
+ public Collection<String> getAttributes() {
+ return schema.getAttrNames();
+ }
+
+
+/* String getClassName();
+
+ void assignTo(Collection<Instance> c);
+
+ Domain getDomain(String attr);
+
+ public Collection<Domain> getDomains();
+
+ public int getSize();
+
+ public String toString();*/
+}
+
+/*
+ Data set: A schema and a set of instances matching the schema.
+ Generally, no ordering on instances is assumed.
+ Most machine learning work uses a single fixed-format table.
+
+
+
+ Instance: A single object of the world from which a model will be learned,
+ or on which a model will be used (e.g., for prediction).
+ In most machine learning work, instances are described by feature vectors;
+ some work uses more complex representations (e.g., containing relations between instances or between parts of instances).
+ = (example, case, record)
+
+ Schema: A description of a data set's attributes and their properties.
+
+ Attribute: A quantity describing an instance.
+ An attribute has a domain defined by the attribute type, which denotes the values that can be taken by an attribute.
+ = (field, variable, feature)
+
+ The following domain types are common:
+ - Categorical: A finite number of discrete values.
+ The type nominal denotes that there is no ordering between the values, such as last names and colors.
+ The type ordinal denotes that there is an ordering,
+ such as in an attribute taking on the values low, medium, or high.
+
+ - Continuous (quantitative): Commonly, subset of real numbers,
+ where there is a measurable difference between the possible values.
+ Integers are usually treated as continuous in practical problems.
+
+ Feature: A feature is the specification of an attribute and its value.
+ For example, color is an attribute. ``Color is blue'' is a feature of an example.
+ Many transformations to the attribute set leave the feature set unchanged
+ (for example, regrouping attribute values or transforming multi-valued attributes to binary attributes).
+ Some authors use feature as a synonym for attribute (e.g., in feature-subset selection).
+
+ Feature vector: A list of features describing an instance.
+ = (record, tuple)
+
+*/
\ No newline at end of file
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/InstanceList.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/LeafNode.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/LeafNode.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/LeafNode.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,72 @@
+package org.drools.learner;
+
+import org.drools.learner.tools.Util;
+
+public class LeafNode extends TreeNode {
+
+ private Object targetCategory;
+ private double num_intances_classified;
+
+ public LeafNode(Domain targetDomain, Object value) {
+ super(targetDomain);
+ this.targetCategory = value;
+ num_intances_classified = 0;
+ }
+
+ public void putNode(Object attributeCategory, TreeNode node) {
+ throw new RuntimeException("cannot add Node to a leaf node");
+ }
+
+ public Object getCategory() {
+ return targetCategory;
+ }
+
+ public void setNumClassification(double size) {
+ this.num_intances_classified= size;
+ }
+
+ public double getNumClassification() {
+ return this.num_intances_classified;
+ }
+
+ public int getMissClassified() {
+ return (int) (getNumMatch() - num_intances_classified);
+ }
+
+ public int getNumLeaves() {
+ return 1;
+ }
+// public Integer evaluate(Instance i) {
+// String targetFName = super.getDomain().getFName();
+//
+// Object attr_value = i.getAttrValue(targetFName);
+// Object i_category = super.getDomain().getCategoryOf(attr_value);
+// if (AttributeValueComparator.instance.compare(i_category, this.targetCategory) == 0) {
+// return Integer.valueOf(1); //correct
+// } else {
+// return Integer.valueOf(0); // mistake
+// }
+// }
+
+ public Object voteFor(Instance i) {
+
+ return this.targetCategory;
+ }
+
+ public int hashCode() {
+ return super.hashCode() ^ targetCategory.hashCode(); // ^ id;//should i add the children
+ }
+
+ public String toString(){
+ return "DECISION -> " + targetCategory.toString();
+ }
+
+ public String toString(int tab, int depth, StringBuffer buf) {
+ buf.append(Util.ntimes("\t", tab + 1));
+
+ buf.append( super.getDomain().getFName() + ":DECISION->" +targetCategory.toString() + " match: "+getNumMatch()+" correct:"+num_intances_classified+"\n");
+ return buf.toString();
+ }
+
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/LeafNode.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Memory.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Memory.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Memory.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,76 @@
+package org.drools.learner;
+
+import java.util.HashMap;
+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
+ // by default structured
+ 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 = null;
+ try {
+ inst_schema = Schema.createSchemaStructure(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();
+ // 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;
+ }
+
+
+ // Drools memory
+ private WorkingMemory session;
+ //// class specification
+ //private Schema schema;
+ Class<?> clazzToClassify;
+
+ // instance list
+ private HashMap<Class<?>,InstanceList> instances;
+
+
+ private Memory() {
+ this.instances = new HashMap<Class<?>, InstanceList>();
+ }
+
+ private void setClassToClassify(Class<?> clazz) {
+ this.clazzToClassify = clazz;
+ }
+
+ public InstanceList getClassInstances() {
+ return instances.get(this.clazzToClassify);
+ }
+
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Memory.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/NodeValue.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/NodeValue.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/NodeValue.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,104 @@
+package org.drools.learner;
+
+public class NodeValue { //implements RuleNode {
+
+ //private static final Logger flog = LoggerFactory.getFileLogger(NodeValue.class, LogLevel.ERROR, Util.log_file);
+
+ private TreeNode node;
+ private Object nodeValue; // should it be Attribute???
+
+ public NodeValue(TreeNode n) {
+ this.node = n;
+ }
+ public String getFReference() {
+ return node.getDomain().getFReferenceName();
+ }
+
+ public String 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 getValue() {
+ return nodeValue;
+ }
+ public void setValue(Object category) {
+ this.nodeValue = category;
+
+ }
+
+ public TreeNode getNode() {
+ return node;
+ }
+
+ @Override
+ public int hashCode() {
+ String hash = stringCode();
+ return hash.hashCode();
+
+ }
+
+ public String stringCode() {
+ return node.getDomain().getObjKlass().getName()+"." + node.getDomain().getFName()+"."+nodeValue;
+ }
+
+ public String toString() {
+
+ String fName = this.getFName();//object class name
+ Class<?> node_obj = node.getDomain().getObjKlass();
+
+ 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);
+ }
+ }
+ }
+
+}
\ No newline at end of file
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/NodeValue.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Path.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Path.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Path.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,160 @@
+package org.drools.learner;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Iterator;
+
+public class Path {
+
+ private int code;
+ private Class<?> attr_obj; // object class name
+ private ArrayList<NodeValue> conditions;
+
+ private NodeValue action;
+/* action nodeValue has the information of
+ private double rank; // matching ratio
+ private double num_classified_instances;// number of instances matching that rule
+ private double info_mea;
+ */
+ private int treeId; // id of the tree that the path belongs
+
+// private int id; // unique id, need a unique name in the drl file
+//
+
+ public Path(int numCond) {
+ conditions = new ArrayList<NodeValue>(numCond);
+ code = 0;
+ }
+
+
+ public void addStep(NodeValue current) {
+ NodeValue nv = new NodeValue(current.getNode());
+ nv.setValue(current.getValue());
+ updateHashCode(nv);
+ conditions.add(nv);
+ }
+
+ public void setStats(NodeValue current) {
+ action = new NodeValue(current.getNode());
+ action.setValue(current.getValue());
+
+ updateHashCode(action);
+ //this.setNumClassifiedInstances(((LeafNode)current.getNode()).getNumClassification()); // only the leaf node case
+ }
+
+ public Iterator<NodeValue> getConditionIterator() {
+ return conditions.iterator();
+ }
+
+ public NodeValue getAction() {
+ return action;
+ }
+
+ public void updateHashCode(NodeValue nv) {
+ code = code + nv.hashCode() << 6;
+ }
+ public void setObjectClass(Class<?> obj) {
+ attr_obj= obj;
+ }
+ public String getObjectClassName() {
+ return attr_obj.getSimpleName();
+ }
+
+ public int getTreeId() {
+ return treeId;
+ }
+
+ public void setTreeId(int id) {
+ treeId = id;
+ }
+// private int getId() {
+// return id;
+// }
+//
+// public void setId(int id) {
+// this.id= id;
+// }
+
+// private void setNumClassifiedInstances(double dataSize) {
+// this.num_classified_instances = dataSize;
+// }
+ public double getNumClassified() {
+ return ((LeafNode)this.action.getNode()).getNumMatch();
+ }
+
+// public void setRank(double r) {
+// this.rank = r;
+// }
+ public double getRank() {
+ return ((LeafNode)this.action.getNode()).getRank(); //this.rank;
+ }
+
+ public double getInfoMea() {
+ return ((LeafNode)this.action.getNode()).getInfoMea();
+ }
+
+ public static Comparator<Path> getPathRankComparator() {
+ return new PathComparator();
+ }
+
+ private static class PathComparator implements Comparator<Path>{
+ // this will sort from best rank to least rank
+ public int compare(Path r1, Path r2) {
+ if (r1.getRank() < r2.getRank())
+ return 1; // normally -1
+ else if (r1.getRank() > r2.getRank())
+ return -1; // normally 1
+ else
+ return 0;
+ }
+ }
+/* WHAT TODO ???
+ public static Comparator<Path> getInfoComparator() {
+ return new PathInfoComparator();
+ }
+
+ private static class PathInfoComparator implements Comparator<Path>{
+ // this will sort from best rank to least rank
+ public int compare(Path p1, Path p2) {
+// COMPLEXITY++;
+// if (n1.hashCode() == n2.hashCode())
+// return 0;
+ double p1_mea = p1.getInfoMea();
+ double p2_mea = p2.getInfoMea();
+// switch (INFO_MEA) {
+// case 4: /* 4 - ranked gain ration/
+// p1_mea = p1.getRank()*p1_mea;
+// p2_mea = p2.getRank()*p2_mea;
+// break;
+// }
+
+ //if a node with the same domain exist at the same depth
+ //COMPLEXITY++;
+ if (p1_mea < p2_mea)
+ return 1; // inverted=>must be -1
+ //COMPLEXITY++;
+ if (p1_mea > p2_mea)
+ return -1; // inverted=>must be 1
+ //COMPLEXITY++; //else {
+ return 0;
+ }
+ }
+*/
+ @Override
+ public int hashCode() {
+ return code;
+ }
+
+ public String toString() {
+ StringBuffer out_bf = new StringBuffer();
+
+ for (NodeValue c:conditions) {
+ //out_bf.append(c.stringCode() +" - ");
+ out_bf.append(c +", ");
+ }
+ //out_bf.append(" => "+action.stringCode());
+ out_bf.append(" => "+action);
+ return out_bf.toString();
+
+ }
+}
\ No newline at end of file
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Path.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/QuantitativeDomain.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/QuantitativeDomain.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/QuantitativeDomain.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,106 @@
+package org.drools.learner;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+
+import org.drools.learner.eval.SplitPoint;
+
+public class QuantitativeDomain extends Domain{
+
+ public static QuantitativeDomain createFromDomain(Domain father) {
+ QuantitativeDomain quantitative = new QuantitativeDomain(father.getObjKlass(), father.getFName(), father.getFType());
+ //quantitative.setCategories(father.getCategories());
+
+ return quantitative;
+ }
+
+ public QuantitativeDomain cheapClone() {
+ 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);
+ }
+ qdom.setCategorical(super.isCategorical());
+
+ //for (int i = 0; i<super.getCategoryCount(); i++)
+ qdom.fCategories = this.fCategories;
+ qdom.splits = this.splits;
+
+ return qdom;
+ }
+
+
+ private ArrayList<SplitPoint> splits;
+
+ 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>();
+
+
+ }
+ public void setFName(String fname) {
+ super.setFName(fname);
+ }
+
+
+ public boolean isCategorical() {
+ return false;
+ }
+
+// public int getIndex(int index) {
+// return splits.get(index).getIndex();
+// }
+ public SplitPoint getSplit(int index) {
+ return splits.get(index);
+ }
+
+ public int getNumIndices() {
+ return splits.size();
+ }
+
+ public boolean addSplitPoint(SplitPoint pair) { //int index, Number value) {
+
+ int insertion_point = Collections.binarySearch(this.splits, pair, getSplitComparator());
+ if (insertion_point >= 0) {
+ return false; /* the pair exists in the list and the return is index of the search key*/
+ } else { /* (-(insertion point) - 1)
+ * the point at which the key would be inserted into the list
+ * the index of the first element greater than the key, or list.size()
+ */
+ int unfound_insertion_point = -(insertion_point) -1;
+ this.splits.add(unfound_insertion_point, pair);
+ super.fCategories.add(unfound_insertion_point, pair.getValue());
+ return true;
+ }
+ /* otherwise *
+ if (!this.containsIndex(index)) {
+ super.splits.add(pair);
+ }
+ Collections.sort(super.fCategories, nComparator); */
+ }
+
+ public boolean containsIndex(int value) {
+ for (Object op: super.fCategories) {
+ SplitPoint sp = (SplitPoint) op;
+ if (sp.getIndex() == value)
+ return true;
+
+ }
+ return false;
+
+ }
+
+ public static Comparator<SplitPoint> getSplitComparator() {
+ return new SplitComparator();
+ }
+
+ private static class SplitComparator implements Comparator<SplitPoint>{
+ public int compare(SplitPoint sp1, SplitPoint sp2) {
+ return sp1.getIndex() - sp2.getIndex();
+
+ }
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/QuantitativeDomain.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Schema.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Schema.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Schema.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,126 @@
+package org.drools.learner;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Set;
+
+import org.drools.learner.builder.Learner.DataType;
+import org.drools.learner.builder.Learner.DomainAlgo;
+import org.drools.learner.tools.ClassStructure;
+import org.drools.learner.tools.ClassVisitor;
+import org.drools.learner.tools.FeatureNotSupported;
+import org.drools.spi.ReadAccessor;
+
+public class 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();
+
+
+ /* 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> klassStructure;
+
+ // key: Object_class_name at field_name
+ private HashMap<String, ReadAccessor> extractorMap;
+
+ // 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.klassStructure = new HashMap<Class<?>,ClassStructure>();
+ this.extractorMap = new HashMap<String, ReadAccessor>();
+ this.domainMap = new HashMap<String, Domain>();
+ this.attrRelationMap = new HashMap<String, ArrayList<Field>>();
+ this.targets = new HashSet<String>();
+ }
+
+ public Class<?> getObjectClass() {
+ return klass;
+ }
+
+ public HashMap<Class<?>,ClassStructure> getClassStructure() {
+ return klassStructure;
+ }
+ public void putStructure(Class<?> clazz, ClassStructure 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);
+ }
+
+ public void clearTargets() {
+ targets.clear();
+ }
+
+ public Set<String> getAttrNames() {
+ 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, ReadAccessor extract) {
+ extractorMap.put(attr_name, extract);
+ }
+ public ReadAccessor getAttrExtractor(String attr_name) {
+ return this.extractorMap.get(attr_name);
+ }
+
+ public Collection<String> getTargets() {
+ return targets;
+ }
+
+
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Schema.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Stats.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Stats.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Stats.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,103 @@
+package org.drools.learner;
+
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.ArrayList;
+
+public class Stats {
+
+ public static final int INCORRECT = 0, CORRECT = 1, UNKNOWN = 2;
+
+ private Class<?> stat_class;
+ private ArrayList<Integer> histogram;
+
+ private int total_data;
+
+ public Stats( Class<?> _stat_class) {
+ stat_class = _stat_class;
+
+ /*
+ * INCORRECT | CORRECT | UNKNOWN
+ * | | |
+ * 0 1 2
+ */
+ histogram = new ArrayList<Integer>(3);
+ for (int i=0; i < 3; i ++) {
+ histogram.add(new Integer(0));
+ }
+ total_data = 0;
+ }
+ public int getResult(int classification) {
+ return histogram.get(classification);
+ }
+
+ public void change(Integer result, int i) {
+ histogram.set(result, Integer.valueOf(histogram.get(result) + i));
+ total_data += i;
+ }
+
+ public int getTotal() {
+ return total_data;
+ }
+ /*
+ * fileSignature must contain the folder location
+ * by default the folder = "src/main/rules/"
+ */
+ public void print2file(String fileSignature) {
+
+ //String dataFileName = "src/main/rules/"+_packageNames+"/"+ fileName;
+
+ if (!fileSignature.endsWith(".stats"))
+ fileSignature += ".stats";
+ System.out.println("printing stats:"+ fileSignature);
+
+ try {
+ StatsPrinter.print(this, new FileWriter(fileSignature));
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ public void print2out() {
+ try {
+ StatsPrinter.print(this, new PrintWriter(System.out));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ public String print2string() {
+ StringWriter swr = new StringWriter();
+ try {
+ StatsPrinter.print(this, swr);
+ return swr.toString();
+ } catch (IOException e) {
+ e.printStackTrace();
+ return "";
+ }
+ }
+}
+
+class StatsPrinter {
+ //public static void print(Stats mystats, OutputStream os) {
+ public static void print(Stats mystats, Writer wr) throws IOException {
+ //PrintWriter pwr = new PrintWriter(os);
+
+ // print the statistics of the results to a file
+ wr.write("TESTING results: incorrect "+ mystats.getResult(Stats.INCORRECT)+"\n");
+ wr.write("TESTING results: correct "+ mystats.getResult(Stats.CORRECT)+"\n");
+ wr.write("TESTING results: unknown "+ mystats.getResult(Stats.UNKNOWN)+"\n");
+ wr.write("TESTING results: Total Number "+ mystats.getTotal());
+
+ wr.flush();
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/Stats.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/TreeNode.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/TreeNode.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/TreeNode.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,165 @@
+package org.drools.learner;
+
+import java.util.Collection;
+import java.util.Hashtable;
+import java.util.List;
+
+import org.drools.learner.tools.Util;
+
+public class TreeNode {
+
+ //private static final Logger log = LoggerFactory.getSysOutLogger(TreeNode.class, LogLevel.ERROR);
+ //private static final Logger flog = LoggerFactory.getFileLogger(TreeNode.class);
+
+ private Domain domain;
+ private TreeNode father;
+ private Hashtable<Object, TreeNode> children;
+ /* TODO explain
+ * rank:
+ * gain:
+ * gainRatio
+ */
+ private double rank, infoMea;
+
+ // Number of all instances matching at that node
+ private double num_matching_instances;
+ private Object label;
+ private int label_size;
+ private int leaves;
+
+ public TreeNode(Domain domain) {
+ this.father = null;
+ this.domain = domain;
+ this.children = new Hashtable<Object, TreeNode>();
+
+ }
+
+ public double getRank() {
+ return rank;
+ }
+
+ public void setRank(double _rank) {
+ this.rank = _rank;
+ }
+
+ public void setNumMatch(double size) {
+ this.num_matching_instances= size;
+ }
+
+ public double getNumMatch() {
+ return this.num_matching_instances;
+ }
+
+ public Domain getDomain() {
+ return domain;
+ }
+
+ public void putNode(Object attributeCategory, TreeNode node) {
+ children.put(attributeCategory, node);
+ }
+
+ public Collection<Object> getChildrenKeys() {
+ return children.keySet();
+ }
+
+ public TreeNode getChild(Object attr_key) {
+ return children.get(attr_key);
+ }
+
+ public double getInfoMea() {
+ return infoMea;
+ }
+
+ public void setInfoMea(double mea) {
+ this.infoMea = mea;
+ }
+ public Object getLabel() {
+ return label;
+ }
+
+ public void setLabel(Object get_winner_class) {
+ label = get_winner_class;
+ }
+
+ public void setNumLabeled(int supportersFor) {
+ label_size = supportersFor;
+ }
+
+ public int getNumLabeled() {
+ return label_size;
+ }
+
+ public int getNumLeaves() {
+ return leaves;
+ }
+
+ public void setNumLeaves(int leaves2) {
+ leaves = leaves2;
+ }
+
+ public void setFather(TreeNode currentNode) {
+ father = currentNode;
+ }
+ public TreeNode getFather() {
+ return father;
+ }
+ public Object voteFor(Instance i) {
+ final Object attr_value = i.getAttrValue(this.domain.getFReferenceName());
+ final Object category = domain.getCategoryOf(attr_value);
+
+ final TreeNode my_node = this.getChild(category);
+
+
+// flog.debug(new Object() {
+// public String toString() {
+//
+// StringBuffer sb = new StringBuffer(Util.ntimes("$", 5)+"\nDomain:"+domain.getFName()+"->");
+// for (int idx = 0; idx < domain.getCategoryCount(); idx++) {
+// sb.append(domain.getCategory(idx)+"-");
+// }
+// sb.append(" SEARCHING for = "+ attr_value + " in "+ domain.getFName());
+// sb.append("\n KEYS:");
+// for (Object key: getChildrenKeys()) {
+// sb.append(" "+key +"% "+ getChild(key).getDomain() + " :");
+// }
+// return sb.toString();
+// }
+// });
+ return my_node.voteFor(i);
+ }
+
+ public int getMissClassified() {
+ int num_missclassified = 0;
+ for(Object key: this.getChildrenKeys()) {
+ TreeNode child = this.getChild(key);
+ num_missclassified += child.getMissClassified();
+ }
+ return num_missclassified;
+ }
+
+ public int hashCode() {
+ return domain.hashCode(); // ^ id;//should i add the children
+ }
+
+ public String toString() {
+ return toString(1, 5, new StringBuffer());
+ }
+
+ public String toString(int tab, int depth, StringBuffer buf) {
+ //if (depth > 0 && domain != null) {
+ if (domain != null) {
+ buf.append(Util.ntimes("\t", tab));
+ buf.append(Util.ntimes("***",1));
+ buf.append( domain.getFName() + " n.hash:"+this.hashCode()+" match:" +num_matching_instances+" correct:"+label_size+ " \n");
+ for (Object attributeValue : children.keySet()) {
+ buf.append(Util.ntimes("\t", tab + 1));
+ buf.append("+" + attributeValue );
+ buf.append("\n");
+ TreeNode child = children.get(attributeValue);
+ buf.append(child.toString(tab + 1, --depth, new StringBuffer()));
+ }
+ }
+ return buf.toString();
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/TreeNode.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/AdaBoostBuilder.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/AdaBoostBuilder.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/AdaBoostBuilder.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,182 @@
+package org.drools.learner.builder;
+
+import java.util.ArrayList;
+
+import org.drools.learner.DecisionTree;
+import org.drools.learner.InstanceList;
+import org.drools.learner.Memory;
+import org.drools.learner.Stats;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+import org.drools.learner.tools.Util;
+
+/*
+ *
+ */
+public class AdaBoostBuilder implements DecisionTreeBuilder{
+
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(AdaBoostBuilder.class, SimpleLogger.DEFAULT_LEVEL);
+ private static SimpleLogger slog = LoggerFactory.getSysOutLogger(AdaBoostBuilder.class, SimpleLogger.DEFAULT_LEVEL);
+
+ private TreeAlgo algorithm = TreeAlgo.BOOST; // default bagging, TODO boosting
+
+ private static int FOREST_SIZE = 50;
+ private static final double TREE_SIZE_RATIO = 1.0d;
+ private static final boolean WITH_REP = false;
+
+ private ArrayList<DecisionTree> forest;
+ private ArrayList<Double> classifier_accuracy;
+
+ private DecisionTreeMerger merger;
+
+ public AdaBoostBuilder() {
+ //this.trainer = _trainer;
+ merger = new DecisionTreeMerger();
+ }
+ public void build(Memory mem, Learner _trainer) {
+
+ final InstanceList class_instances = mem.getClassInstances();
+ _trainer.setInputData(class_instances);
+
+
+ if (class_instances.getTargets().size()>1 ) {
+ //throw new FeatureNotSupported("There is more than 1 target candidates");
+ if (flog.error() !=null)
+ flog.error().log("There is more than 1 target candidates\n");
+ System.exit(0);
+ // TODO put the feature not supported exception || implement it
+ } else if (_trainer.getTargetDomain().getCategoryCount() >2) {
+ if (flog.error() !=null)
+ flog.error().log("The target domain is not binary!!!\n");
+ System.exit(0);
+ }
+
+ int N = class_instances.getSize();
+ int NUM_DATA = (int)(TREE_SIZE_RATIO * N);
+ _trainer.setDataSizePerTree(NUM_DATA);
+
+
+ forest = new ArrayList<DecisionTree> (FOREST_SIZE);
+ classifier_accuracy = new ArrayList<Double>(FOREST_SIZE);
+ // weight for each instance - the higher the weight, the more the instance influences the classifier learned.
+ double [] weights = new double [NUM_DATA];
+ for (int index_i=0; index_i<NUM_DATA; index_i++) {
+ weights[index_i] = 1.0d/(double)NUM_DATA;
+ class_instances.getInstance(index_i).setWeight(weights[index_i] * (double)NUM_DATA);
+ if (slog.debug() != null)
+ slog.debug().log(index_i+" new weight:"+class_instances.getInstance(index_i).getWeight()+ "\n");
+ }
+
+ int i = 0;
+// int[] bag;
+ while (i++ < FOREST_SIZE ) {
+// if (WITH_REP)
+// bag = Util.bag_w_rep(NUM_DATA, N);
+// else
+// bag = Util.bag_wo_rep(NUM_DATA, N);
+
+ InstanceList working_instances = class_instances; //.getInstances(bag);
+ DecisionTree dt = _trainer.train_tree(working_instances);
+ dt.setID(i);
+
+ double error = 0.0, sum_weight = 0.0;
+ SingleTreeTester t= new SingleTreeTester(dt);
+ for (int index_i = 0; index_i < NUM_DATA; index_i++) {
+ Integer result = t.test(class_instances.getInstance(index_i));
+ sum_weight += weights[index_i];
+ if (result == Stats.INCORRECT) {
+ error += weights[index_i];
+ if (slog.debug() != null)
+ slog.debug().log("[e:"+error+" w:"+weights[index_i]+ "] ");
+ }
+ }
+
+ error = error / sum_weight; // forgotton
+ if (error > 0.0f) {
+ double alpha = Util.ln( (1.0d-error)/error ) / 2.0d;
+
+ if (error < 0.5d) {
+ // The classification accuracy of the weak classifier
+ classifier_accuracy.add(alpha);
+
+ double norm_fact= 0.0d;
+ // Boosting the missclassified instances
+ for (int index_i = 0; index_i < NUM_DATA; index_i++) {
+ Integer result = t.test(class_instances.getInstance(index_i));//TODO dont need to test two times
+ switch (result) {
+ case Stats.INCORRECT:
+ weights[index_i] = weights[index_i] * Util.exp(alpha);
+ break;
+ case Stats.CORRECT: // if it is correct do not update
+ //weights[index_i] = weights[index_i] * Util.exp(-1.0d * alpha);
+ break;
+ case Stats.UNKNOWN:
+ if (slog.error() !=null)
+ slog.error().log("Unknown situation bok\n");
+ System.exit(0);
+ break;
+ }
+ norm_fact += weights[index_i];
+ }
+ // Normalization of the weights
+ for (int index_i = 0; index_i < NUM_DATA; index_i++) {
+ weights[index_i] = weights[index_i] / norm_fact;
+ class_instances.getInstance(index_i).setWeight(weights[index_i] * (double)NUM_DATA);
+ }
+ } else {
+ if (slog.debug() != null)
+ slog.debug().log("The error="+error+" alpha:"+alpha+ "\n");
+ if (slog.error() != null)
+ slog.error().log("error:"+error + " alpha will be negative and the weights of the training samples will be updated in the wrong direction"+"\n");
+ FOREST_SIZE = i-1;//ignore the current tree
+ break;
+ }
+ }
+
+
+ else {
+ if (slog.stat() != null) {
+ slog.stat().log("\n Boosting ends: ");
+ slog.stat().log("All instances classified correctly TERMINATE, forest size:"+i+ "\n");
+ }
+ // What to do here??
+ FOREST_SIZE = i;
+ classifier_accuracy.add(10.0); // TODO add a very big number
+
+
+ }
+
+
+ forest.add(dt);
+ // the DecisionTreeMerger will visit the decision tree and add the paths that have not been seen yet to the list
+ merger.add(dt);
+
+ if (slog.stat() !=null)
+ slog.stat().stat(".");
+
+ }
+ // TODO how to compute a best tree from the forest
+ DecisionTree best = merger.getBest();
+ if (best == null)
+ best = forest.get(0);
+
+ _trainer.setBestTree(forest.get(0));
+ //this.c45 = dt;
+ }
+
+ public ArrayList<DecisionTree> getTrees() {
+ return forest;
+ }
+ public ArrayList<Double> getAccuracies() {
+ return classifier_accuracy;
+ }
+ public TreeAlgo getTreeAlgo() {
+ return algorithm; //TreeAlgo.BAG; // default
+ }
+ public void clearForest(int j) {
+ //forest = null;
+ for (int i = forest.size()-1; i >j; i--)
+ forest.remove(i);
+
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/AdaBoostBuilder.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/AdaBoostKBuilder.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/AdaBoostKBuilder.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/AdaBoostKBuilder.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,185 @@
+package org.drools.learner.builder;
+
+import java.util.ArrayList;
+
+import org.drools.learner.AttributeValueComparator;
+import org.drools.learner.DecisionTree;
+import org.drools.learner.Instance;
+import org.drools.learner.InstanceList;
+import org.drools.learner.Memory;
+import org.drools.learner.Stats;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+import org.drools.learner.tools.Util;
+
+public class AdaBoostKBuilder implements DecisionTreeBuilder{
+
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(AdaBoostKBuilder.class, SimpleLogger.DEFAULT_LEVEL);
+ private static SimpleLogger slog = LoggerFactory.getSysOutLogger(AdaBoostKBuilder.class, SimpleLogger.DEBUG);
+
+ private TreeAlgo algorithm = TreeAlgo.BOOST_K; // default bagging, TODO boosting
+
+ private static int FOREST_SIZE = 10;
+ private static final double TREE_SIZE_RATIO = 0.9;
+ private static final boolean WITH_REP = false;
+
+ private ArrayList<DecisionTree> forest;
+ private ArrayList<Double> classifier_accuracy;
+ //private Learner trainer;
+
+ public AdaBoostKBuilder() {
+ //this.trainer = _trainer;
+ }
+ public void build(Memory mem, Learner _trainer) {
+
+ final InstanceList class_instances = mem.getClassInstances();
+ _trainer.setInputData(class_instances);
+
+
+ if (class_instances.getTargets().size()>1 ) {
+ //throw new FeatureNotSupported("There is more than 1 target candidates");
+ if (flog.error() !=null)
+ flog.error().log("There is more than 1 target candidates");
+ System.exit(0);
+ // TODO put the feature not supported exception || implement it
+ } else if (_trainer.getTargetDomain().getCategoryCount() <=2) {
+ if (flog.warn() !=null)
+ flog.warn().log("The target domain is binary!!! Do u really need that one");
+ }
+
+ int N = class_instances.getSize();
+ int K = _trainer.getTargetDomain().getCategoryCount();
+ int M = (int)(TREE_SIZE_RATIO * N);
+ _trainer.setDataSizePerTree(M);
+
+
+ forest = new ArrayList<DecisionTree> (FOREST_SIZE);
+ classifier_accuracy = new ArrayList<Double>(FOREST_SIZE);
+ //Initialize the weight wij (i = 1,...,m (number of instances) and j = 1,...,K (number of classes))
+ double[][] weight = new double[M][K];
+ for (int index_i=0; index_i<M; index_i++) {
+ for (int index_j=0; index_j<K; index_j++) {
+ Instance inst_i = class_instances.getInstance(index_i);
+
+
+ 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);
+
+ if (AttributeValueComparator.instance.compare(instance_target_category, target_category) == 0) {
+ //if y_i == u_j => the instance i is in class n.
+ weight[index_i][index_j]= 0;
+ } else {
+ // mistake
+ weight[index_i][index_j]= 1;
+ }
+
+ }
+ }
+
+ int i = 0;
+ int[] bag;
+ while (i++ < FOREST_SIZE ) {
+ // a. Normalize wij
+ if (WITH_REP)
+ bag = Util.bag_w_rep(M, N);
+ else
+ bag = Util.bag_wo_rep(M, N);
+
+
+ // b. Train h_t(x) by minimizing loss function
+
+ InstanceList working_instances = class_instances.getInstances(bag);
+ DecisionTree dt = _trainer.train_tree(working_instances);
+ dt.setID(i);
+
+ double error = 0.0;
+ SingleTreeTester t= new SingleTreeTester(dt);
+ for (int index_i = 0; index_i < M; index_i++) {
+ Integer result = t.test(class_instances.getInstance(index_i));
+ if (result == Stats.INCORRECT) {
+
+ //error += distribution.get(index_i);
+ }
+ }
+
+ if (error > 0.0f) {
+ double alpha = Util.ln( (1.0d-error)/error ) / 2.0d;
+
+ if (error < 0.5d) {
+ // The classification accuracy of the weak classifier
+ classifier_accuracy.add(alpha);
+
+ double norm_fact= 0.0d;
+ // Update the weight matrix wij:
+ for (int index_i = 0; index_i < M; index_i++) {
+ Integer result = t.test(class_instances.getInstance(index_i));//TODO dont need to test two times
+ switch (result) {
+ case Stats.INCORRECT:
+ //distribution.set(index_i, distribution.get(index_i) * Util.exp(alpha));
+ break;
+ case Stats.CORRECT:
+ //distribution.set(index_i, distribution.get(index_i) * Util.exp(-1.0d * alpha));
+ break;
+ case Stats.UNKNOWN:
+ if (slog.error() !=null)
+ slog.error().log("Unknown situation bok");
+ System.exit(0);
+ break;
+ }
+ //norm_fact += distribution.get(index_i);
+ }
+ // Normalization of the weights
+ for (int index_i = 0; index_i < M; index_i++) {
+ //distribution.set(index_i, distribution.get(index_i) / norm_fact);
+ }
+ } else {
+ if (slog.debug() != null)
+ slog.debug().log("The error="+error+" alpha:"+alpha+ "\n");
+ if (slog.error() != null)
+ slog.error().log("error:"+error + " alpha will be negative and the weights of the training samples will be updated in the wrong direction"+"\n");
+ FOREST_SIZE = i-1;//ignore the current tree
+ break;
+ }
+ }
+
+
+ else {
+ if (slog.stat() != null)
+ slog.stat().log("All instances classified correctly TERMINATE, forest size:"+i+ "\n");
+ // What to do here??
+ FOREST_SIZE = i;
+ classifier_accuracy.add(10.0); // TODO add a very big number
+
+
+ }
+
+
+ forest.add(dt);
+
+ if (slog.stat() !=null)
+ slog.stat().stat(".");
+
+ }
+ // TODO how to compute a best tree from the forest
+ _trainer.setBestTree(forest.get(0));
+
+ //this.c45 = dt;
+ }
+
+ public ArrayList<DecisionTree> getTrees() {
+ return forest;
+ }
+ public ArrayList<Double> getAccuracies() {
+ return classifier_accuracy;
+ }
+ public TreeAlgo getTreeAlgo() {
+ return algorithm; //TreeAlgo.BAG; // default
+ }
+ public void clearForest(int j) {
+ //forest = null;
+ for (int i = forest.size()-1; i >j; i--)
+ forest.remove(i);
+
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/AdaBoostKBuilder.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/BoostedTester.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/BoostedTester.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/BoostedTester.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,92 @@
+package org.drools.learner.builder;
+
+import java.util.ArrayList;
+
+import org.drools.learner.DecisionTree;
+import org.drools.learner.Domain;
+import org.drools.learner.Instance;
+import org.drools.learner.InstanceList;
+import org.drools.learner.Stats;
+import org.drools.learner.eval.ClassDistribution;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+import org.drools.learner.tools.Util;
+
+public class BoostedTester extends Tester{
+
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(BoostedTester.class, SimpleLogger.DEFAULT_LEVEL);
+ private static SimpleLogger slog = LoggerFactory.getSysOutLogger(BoostedTester.class, SimpleLogger.DEFAULT_LEVEL);
+
+ private ArrayList<DecisionTree> trees;
+ private ArrayList<Double> accuracy;
+ private Domain targetDomain;
+
+ public BoostedTester(ArrayList<DecisionTree> forest, ArrayList<Double> _accuracy) {
+ trees = forest;
+ accuracy = _accuracy;
+ targetDomain = forest.get(0).getTargetDomain();
+ }
+
+ public Stats test(InstanceList data) {
+
+ Stats evaluation = new Stats(data.getSchema().getObjectClass()) ; //represent.getObjClass());
+
+ int i = 0;
+ for (Instance instance : data.getInstances()) {
+ Object forest_decision = this.voteOn(instance);
+ Integer result = evaluate(targetDomain, instance, forest_decision);
+
+ //flog.debug(Util.ntimes("#\n", 1)+i+ " <START> TEST: instant="+ instance + " = target "+ result);
+ if (i%1000 ==0 && slog.stat() != null)
+ slog.stat().stat(".");
+
+ evaluation.change(result, 1);
+ i ++;
+ }
+ return evaluation;
+
+ //printStats(evaluation, executionSignature);
+ }
+
+ public Object voteOn(Instance i) {
+ ClassDistribution classification = new ClassDistribution(targetDomain);
+
+ for (int j = 0; j< trees.size() ; j ++) {
+ Object vote = trees.get(j).vote(i);
+ if (vote != null) {
+ classification.change(vote, accuracy.get(j));
+ //classification.change(Util.sum(), accuracy.get(j));
+ } else {
+ // TODO add an unknown value
+ //classification.change(-1, 1);
+ if (flog.error() !=null)
+ flog.error().log(Util.ntimes("\n", 10)+"Unknown situation at tree: " + j + " for fact "+ i);
+ System.exit(0);
+ }
+ if (slog.debug() != null)
+ slog.debug().log("Vote "+accuracy.get(j)+" for "+vote + "\n");
+ }
+ classification.evaluateMajority();
+ Object winner = classification.get_winner_class();
+ if (slog.debug() != null)
+ slog.debug().log("Winner = "+winner + "\n");
+
+ double ratio = 0.0;
+ if (classification.get_num_ideas() == 1) {
+ //100 %
+ ratio = 1.0d;
+ return winner;
+ } else {
+ double num_votes = classification.getVoteFor(winner);
+ ratio = (num_votes/(double) trees.size());
+ // TODO if the ratio is smaller than some number => reject
+ }
+ return winner;
+
+ }
+
+ public void printStats(final Stats evaluation, String executionSignature) {
+ super.printStats(evaluation, executionSignature);
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/BoostedTester.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/C45Learner.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/C45Learner.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/C45Learner.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,134 @@
+package org.drools.learner.builder;
+
+import java.util.Hashtable;
+import java.util.List;
+
+import org.drools.learner.DecisionTree;
+import org.drools.learner.Domain;
+import org.drools.learner.LeafNode;
+import org.drools.learner.TreeNode;
+import org.drools.learner.eval.AttributeChooser;
+import org.drools.learner.eval.Heuristic;
+import org.drools.learner.eval.InformationContainer;
+import org.drools.learner.eval.InstDistribution;
+import org.drools.learner.tools.FeatureNotSupported;
+import org.drools.learner.tools.Util;
+
+public class C45Learner extends Learner{
+
+ private AttributeChooser chooser;
+
+ public C45Learner(Heuristic hf) {
+ super();
+ super.setDomainAlgo(DomainAlgo.QUANTITATIVE);
+ chooser = new AttributeChooser(hf);
+ }
+
+
+ protected TreeNode train(DecisionTree dt, InstDistribution data_stats) {//List<Instance> data) {
+
+ if (data_stats.getSum() == 0) {
+ throw new RuntimeException("Nothing to classify, factlist is empty");
+ }
+
+ /* let's get the statistics of the results */
+ //InstDistribution stats_by_class = new InstDistribution(dt.getTargetDomain());///* the target domain*/);
+ data_stats.evaluateMajority();
+
+
+ /* if all elements are classified to the same value */
+ if (data_stats.get_num_ideas(/* number of supported target categories*/) == 1) {
+
+ LeafNode classifiedNode = new LeafNode(dt.getTargetDomain() /* target domain*/,
+ data_stats.get_winner_class() /*winner target category*/);
+ classifiedNode.setRank( (double)data_stats.getSum()/
+ (double)this.getDataSize()/* total size of data fed to dt*/);
+ classifiedNode.setNumMatch(data_stats.getSum()); //num of matching instances to the leaf node
+ classifiedNode.setNumClassification(data_stats.getSum()); //num of classified instances at the leaf node
+
+ //classifiedNode.setInfoMea(mea)
+ return classifiedNode;
+ }
+
+ List<Domain> attribute_domains = dt.getAttrDomains();
+ /* if there is no attribute left in order to continue */
+ if (attribute_domains.size() == 0) {
+ /* an heuristic of the leaf classification*/
+ Object winner = data_stats.get_winner_class(); /*winner target category*/
+ LeafNode noAttributeLeftNode = new LeafNode(dt.getTargetDomain() /* target domain*/,
+ winner);
+ noAttributeLeftNode.setRank((double)data_stats.getVoteFor(winner)/
+ (double)this.getDataSize() /* total size of data fed to dt*/);
+ noAttributeLeftNode.setNumMatch(data_stats.getSum()); //num of matching instances to the leaf node
+ noAttributeLeftNode.setNumClassification(data_stats.getVoteFor(winner)); //num of classified instances at the leaf node
+ //noAttributeLeftNode.setInfoMea(best_attr_eval.attribute_eval);
+
+
+ /* we need to know how many guys cannot be classified and who these guys are */
+ data_stats.missClassifiedInstances(missclassified_data);
+ dt.setTrainingError((int) (dt.getTrainingError() + data_stats.getSum()));
+ return noAttributeLeftNode;
+ }
+
+
+ InformationContainer best_attr_eval = new InformationContainer();
+
+ /* choosing the best attribute in order to branch at the current node*/
+ chooser.chooseAttribute(best_attr_eval, data_stats, attribute_domains);
+ Domain node_domain = best_attr_eval.domain;
+
+ if (slog.debug() != null)
+ slog.debug().log("\n"+Util.ntimes("*", 20)+" 1st best attr: "+ node_domain);
+
+ TreeNode currentNode = new TreeNode(node_domain);
+ currentNode.setNumMatch(data_stats.getSum()); //num of matching instances to the leaf node
+ currentNode.setRank((double)data_stats.getSum()/
+ (double)this.getDataSize() /* total size of data fed to dt*/);
+ currentNode.setInfoMea(best_attr_eval.attribute_eval);
+ //what the highest represented class is and what proportion of items at that node actually are that class
+ currentNode.setLabel(data_stats.get_winner_class());
+ currentNode.setNumLabeled(data_stats.getSupportersFor(data_stats.get_winner_class()).size());
+
+ Hashtable<Object, InstDistribution> filtered_stats = null;
+ try {
+ filtered_stats = data_stats.split(best_attr_eval);
+ } catch (FeatureNotSupported e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }// node_domain);
+
+ dt.FACTS_READ += data_stats.getSum();
+
+ for (int c = 0; c<node_domain.getCategoryCount(); c++) {
+ /* split the last two class at the same time */
+ Object category = node_domain.getCategory(c);
+ if (slog.debug() != null)
+ slog.debug().log("{"+ node_domain +":"+category+ "}"+(c==node_domain.getCategoryCount()-1?"\n":""));
+
+ /* list of domains except the choosen one (&target domain)*/
+ DecisionTree child_dt = new DecisionTree(dt, node_domain);
+
+ if (filtered_stats == null || filtered_stats.get(category) == null || filtered_stats.get(category).getSum() ==0) {
+ /* majority !!!! */
+ LeafNode majorityNode = new LeafNode(dt.getTargetDomain(), data_stats.get_winner_class());
+ majorityNode.setRank(-1.0); //it does not classify any instance
+ majorityNode.setNumMatch(0);
+ majorityNode.setNumClassification(0);
+ //currentNode.setInfoMea(best_attr_eval.attribute_eval);
+ //dt.setTrainingError((int) (dt.getTrainingError() + data_stats.getSum()));
+
+ majorityNode.setFather(currentNode);
+ currentNode.putNode(category, majorityNode);
+ } else {
+ TreeNode newNode = train(child_dt, filtered_stats.get(category));//, attributeNames_copy
+ newNode.setFather(currentNode);
+ currentNode.putNode(category, newNode);
+ }
+ }
+
+ return currentNode;
+
+ }
+
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/C45Learner.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeBuilder.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeBuilder.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeBuilder.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,17 @@
+package org.drools.learner.builder;
+
+
+import org.drools.learner.Memory;
+
+public interface DecisionTreeBuilder {
+
+ //public static final int SINGLE = 1, BAG = 2, BOOST = 3;
+ public static enum TreeAlgo { SINGLE, BAG, BOOST, BOOST_K }
+
+ void build(Memory wm, Learner trainer);
+
+// public Learner getLearner();
+
+ public TreeAlgo getTreeAlgo();
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeBuilder.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeFactory.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeFactory.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeFactory.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,252 @@
+package org.drools.learner.builder;
+
+import org.drools.WorkingMemory;
+import org.drools.learner.DecisionTree;
+import org.drools.learner.DecisionTreePruner;
+import org.drools.learner.Memory;
+import org.drools.learner.builder.Learner.DataType;
+import org.drools.learner.builder.Learner.DomainAlgo;
+import org.drools.learner.builder.DecisionTreeBuilder.TreeAlgo;
+import org.drools.learner.eval.CrossValidation;
+import org.drools.learner.eval.Entropy;
+import org.drools.learner.eval.GainRatio;
+import org.drools.learner.eval.Heuristic;
+import org.drools.learner.tools.FeatureNotSupported;
+import org.drools.learner.tools.Util;
+
+
+// uses the static functions from the deprecated class DecisionTreeFactory
+public class DecisionTreeFactory {
+
+ public static DecisionTree createSingleID3E(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+ return createSingleID3(wm, obj_class, new Entropy());
+ }
+
+ public static DecisionTree createSingleID3G(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+ return createSingleID3(wm, obj_class, new GainRatio());
+ }
+
+ protected static DecisionTree createSingleID3(WorkingMemory wm, Class<? extends Object> obj_class, Heuristic h) throws FeatureNotSupported {
+ /*
+ * Quesitons:
+ * 1- which class to work with? : obj_class
+ * 2- what is its target attribute?
+ * 3- what are the objects
+ */
+ DataType data = Learner.DEFAULT_DATA;
+ ID3Learner learner = new ID3Learner(h);
+ SingleTreeBuilder single_builder = new SingleTreeBuilder();
+
+// String algo_suffices = org.drools.learner.deprecated.DecisionTreeFactory.getAlgoSuffices(learner.getDomainAlgo(), single_builder.getTreeAlgo());
+// String executionSignature = org.drools.learner.deprecated.DecisionTreeFactory.getSignature(obj_class, "", algo_suffices);
+ String algo_suffices = DecisionTreeFactory.getAlgoSuffices(learner.getDomainAlgo(), single_builder.getTreeAlgo());
+ String executionSignature = DecisionTreeFactory.getSignature(obj_class, "", algo_suffices);
+
+ /* create the memory */
+ 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());
+ tester.printStats(tester.test(mem.getClassInstances()), Util.DRL_DIRECTORY + executionSignature);
+ //Tester.test(c45, mem.getClassInstances());
+
+ learner.getTree().setSignature(executionSignature);
+ return learner.getTree();
+ }
+ public static DecisionTree createSingleC45E(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+ return createSingleC45(wm, obj_class, new Entropy());
+ }
+
+ public static DecisionTree createSingleC45G(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+ return createSingleC45(wm, obj_class, new GainRatio());
+ }
+
+ protected static DecisionTree createSingleC45(WorkingMemory wm, Class<? extends Object> obj_class, Heuristic h) throws FeatureNotSupported {
+ DataType data = Learner.DEFAULT_DATA;
+ C45Learner learner = new C45Learner(h);
+
+ SingleTreeBuilder single_builder = new SingleTreeBuilder();
+
+// String algo_suffices = org.drools.learner.deprecated.DecisionTreeFactory.getAlgoSuffices(learner.getDomainAlgo(), single_builder.getTreeAlgo());
+// String executionSignature = org.drools.learner.deprecated.DecisionTreeFactory.getSignature(obj_class, "", algo_suffices);
+ String algo_suffices = DecisionTreeFactory.getAlgoSuffices(learner.getDomainAlgo(), single_builder.getTreeAlgo());
+ String executionSignature = DecisionTreeFactory.getSignature(obj_class, "", algo_suffices);
+
+ /* create the memory */
+ 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());
+ tester.printStats(tester.test(mem.getClassInstances()), Util.DRL_DIRECTORY + executionSignature);
+ //Tester.test(c45, mem.getClassInstances());
+
+ learner.getTree().setSignature(executionSignature);
+ return learner.getTree();
+ }
+
+ public static DecisionTree createBagC45E(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+ return createBagC45( wm,obj_class, new Entropy());
+ }
+ public static DecisionTree createBagC45G(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+ return createBagC45( wm,obj_class, new GainRatio());
+ }
+
+ protected static DecisionTree createBagC45(WorkingMemory wm, Class<? extends Object> obj_class, Heuristic h) throws FeatureNotSupported {
+ DataType data = Learner.DEFAULT_DATA;
+ C45Learner learner = new C45Learner(h);
+ ForestBuilder forest = new ForestBuilder();
+
+// String algo_suffices = org.drools.learner.deprecated.DecisionTreeFactory.getAlgoSuffices(learner.getDomainAlgo(), forest.getTreeAlgo());
+// String executionSignature = org.drools.learner.deprecated.DecisionTreeFactory.getSignature(obj_class, "", algo_suffices);
+ String algo_suffices = DecisionTreeFactory.getAlgoSuffices(learner.getDomainAlgo(), forest.getTreeAlgo());
+ String executionSignature = DecisionTreeFactory.getSignature(obj_class, "", algo_suffices);
+
+ /* create the memory */
+ Memory mem = Memory.createFromWorkingMemory(wm, obj_class, learner.getDomainAlgo(), data);
+ forest.build(mem, learner);
+ //forest.clearForest(10);
+
+ ForestTester tester = new ForestTester(forest.getTrees());
+ tester.printStats(tester.test(mem.getClassInstances()), Util.DRL_DIRECTORY + executionSignature);
+ //forest.test(mem.getClassInstances(), Util.DRL_DIRECTORY+executionSignature);
+
+ //Tester bla => test(c45, mem.getClassInstances());
+ learner.getTree().setSignature(executionSignature);
+ return learner.getTree();
+ }
+
+ public static DecisionTree createBoostedC45E(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+ return createBoostedC45(wm, obj_class, new Entropy());
+ }
+ public static DecisionTree createBoostedC45G(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+ return createBoostedC45(wm, obj_class, new GainRatio());
+ }
+
+ public static DecisionTree createBoostedC45(WorkingMemory wm, Class<? extends Object> obj_class, Heuristic h) throws FeatureNotSupported {
+ DataType data = Learner.DEFAULT_DATA;
+
+ C45Learner learner = new C45Learner(h);
+ AdaBoostBuilder forest = new AdaBoostBuilder();
+
+// String algo_suffices = org.drools.learner.deprecated.DecisionTreeFactory.getAlgoSuffices(learner.getDomainAlgo(), forest.getTreeAlgo());
+// String executionSignature = org.drools.learner.deprecated.DecisionTreeFactory.getSignature(obj_class, "", algo_suffices);
+ String algo_suffices = DecisionTreeFactory.getAlgoSuffices(learner.getDomainAlgo(), forest.getTreeAlgo());
+ String executionSignature = DecisionTreeFactory.getSignature(obj_class, "", algo_suffices);
+
+
+ /* create the memory */
+ Memory mem = Memory.createFromWorkingMemory(wm, obj_class, learner.getDomainAlgo(), data);
+ forest.build(mem, learner);
+ //forest.clearForest(10);
+
+ BoostedTester tester = new BoostedTester(forest.getTrees(), forest.getAccuracies());
+ tester.printStats(tester.test(mem.getClassInstances()), Util.DRL_DIRECTORY + executionSignature);
+ //forest.test(mem.getClassInstances(), Util.DRL_DIRECTORY+executionSignature);
+
+ //Tester bla => test(c45, mem.getClassInstances());
+ learner.getTree().setSignature(executionSignature);
+ return learner.getTree();
+ }
+
+ public static DecisionTree createSinglePrunnedC45E(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+ return createSinglePrunnedC45(wm, obj_class, new Entropy());
+ }
+ public static DecisionTree createSinglePrunnedC45G(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+ return createSinglePrunnedC45(wm, obj_class, new GainRatio());
+ }
+
+ protected static DecisionTree createSinglePrunnedC45(WorkingMemory wm, Class<? extends Object> obj_class, Heuristic h) throws FeatureNotSupported {
+ DataType data = Learner.DEFAULT_DATA;
+ C45Learner learner = new C45Learner(h);
+
+ SingleTreeBuilder single_builder = new SingleTreeBuilder();
+
+// String algo_suffices = org.drools.learner.deprecated.DecisionTreeFactory.getAlgoSuffices(learner.getDomainAlgo(), single_builder.getTreeAlgo());
+// String executionSignature = org.drools.learner.deprecated.DecisionTreeFactory.getSignature(obj_class, "", algo_suffices);
+ String algo_suffices = DecisionTreeFactory.getAlgoSuffices(learner.getDomainAlgo(), single_builder.getTreeAlgo());
+ String executionSignature = DecisionTreeFactory.getSignature(obj_class, "", algo_suffices);
+
+
+
+ /* create the memory */
+ Memory mem = Memory.createFromWorkingMemory(wm, obj_class, learner.getDomainAlgo(), data);
+ single_builder.build(mem, learner);//obj_class, target_attr, working_attr
+
+ CrossValidation validater = new CrossValidation(10, mem.getClassInstances());
+ validater.validate(learner);
+
+ DecisionTreePruner pruner = new DecisionTreePruner(validater);
+ pruner.prun_to_estimate();
+
+ // you should be able to get the pruned tree
+ // prun.getMinimumCostTree()
+ // prun.getOptimumCostTree()
+
+ // test the tree
+ SingleTreeTester tester = new SingleTreeTester(learner.getTree());
+ tester.printStats(tester.test(mem.getClassInstances()), Util.DRL_DIRECTORY + executionSignature);
+
+ /* Once Talpha is found the tree that is finally suggested for use is that
+ * which minimises the cost-complexity using and all the data use the pruner to prun the tree
+ */
+ pruner.prun_tree(learner.getTree());
+
+
+ // test the tree again
+
+
+ //Tester.test(c45, mem.getClassInstances());
+
+ learner.getTree().setSignature(executionSignature);
+ return learner.getTree();
+ }
+
+ public static String getSignature(Class<? extends Object> obj_class, String fileName, String suffices) {
+
+ //String fileName = (dataFile == null || dataFile == "") ? this.getRuleClass().getSimpleName().toLowerCase(): dataFile;
+ String objectSignature = fileName;
+ if (objectSignature == null || objectSignature =="") {
+ objectSignature = obj_class.getSimpleName().toLowerCase();
+ if (suffices != null && suffices != "")
+ objectSignature += "_"+ suffices;
+ }
+
+ String packageFolders = obj_class.getPackage().getName();
+ String _packageNames = packageFolders.replace('.', '/');
+ String executionSignature = _packageNames+"/"+ objectSignature; //"src/main/rules/"+
+
+ return executionSignature;
+
+ }
+
+ public static String getAlgoSuffices(DomainAlgo domain_a, TreeAlgo tree_a) {
+ String suffix = "";
+ switch (domain_a) {
+ case CATEGORICAL:
+ suffix += "id3" ;
+ break;
+ case QUANTITATIVE:
+ suffix += "c45";
+ break;
+ default:
+ suffix += "?" ;
+
+ }
+
+ switch (tree_a) {
+ case SINGLE:
+ suffix += "_one";
+ break;
+ case BAG:
+ suffix += "_bag";
+ break;
+ case BOOST:
+ suffix += "_boost";
+ break;
+ default:
+ suffix += "_?" ;
+
+ }
+ return suffix;
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeFactory.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeMerger.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeMerger.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeMerger.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,80 @@
+package org.drools.learner.builder;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+import org.drools.learner.DecisionTree;
+import org.drools.learner.DecisionTreeVisitor;
+import org.drools.learner.Path;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+
+public class DecisionTreeMerger {
+
+ //private static SimpleLogger flog = LoggerFactory.getFileLogger(DecisionTreeMerger.class, SimpleLogger.WARN, "rules_gizil2");
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(DecisionTreeMerger.class, SimpleLogger.WARN);
+ private static SimpleLogger slog = LoggerFactory.getSysOutLogger(DecisionTreeMerger.class, SimpleLogger.WARN);
+
+
+ private DecisionTreeVisitor visitor;
+
+ private ArrayList<Path> sorted_paths;
+
+ public DecisionTreeMerger() {
+ visitor = new DecisionTreeVisitor();
+
+ }
+ public void add(DecisionTree dt) {
+ visitor.visit(dt);
+ }
+
+ public void add2(DecisionTree dt) {
+ visitor.visit2(dt);
+ }
+
+ public DecisionTree getBest() {
+ sortPaths();
+ printSortedPaths();
+ //System.exit(0);
+ return null;
+ }
+
+ public void sortPaths() {
+ sorted_paths = new ArrayList<Path>(visitor.getPathList());
+ Collections.sort(sorted_paths, Path.getPathRankComparator());
+ }
+
+ public int getNumPaths() {
+ return visitor.getNumPaths();
+ }
+
+ public int getNumPathsfound() {
+ return visitor.getNumPathsFound();
+ }
+ public void printPaths() {
+ if (flog.warn() != null) {
+ for (Path p : visitor.getPathList()) {
+ flog.warn().log(p.hashCode()+ "-"+p.getRank()+" : "+ p + "\n");
+ }
+
+ }
+
+ }
+
+
+ public void printSortedPaths() {
+
+ if (flog.warn() != null) {
+ flog.warn().log("Sorted paths: Total num of paths "+getNumPathsfound()+" num paths different"+getNumPaths()+ "\n");
+ slog.warn().log("Total num of paths "+getNumPathsfound()+" num paths different"+getNumPaths()+ "\n");
+ for (Path p: sorted_paths) {
+ flog.warn().log(p.hashCode()+ "-"+p.getTreeId()+"-"+p.getRank()+" : "+ p + "\n");
+ slog.warn().log(p.hashCode()+ "-"+p.getTreeId()+"-"+p.getRank()+" : "+ p + "\n");
+ }
+
+ }
+
+
+
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/DecisionTreeMerger.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/ForestBuilder.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/ForestBuilder.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/ForestBuilder.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,95 @@
+package org.drools.learner.builder;
+
+import java.util.ArrayList;
+
+import org.drools.learner.DecisionTree;
+import org.drools.learner.InstanceList;
+import org.drools.learner.Memory;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+import org.drools.learner.tools.Util;
+
+public class ForestBuilder implements DecisionTreeBuilder{
+
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(ForestBuilder.class, SimpleLogger.DEFAULT_LEVEL);
+ private static SimpleLogger slog = LoggerFactory.getSysOutLogger(ForestBuilder.class, SimpleLogger.DEBUG);
+
+ private TreeAlgo algorithm = TreeAlgo.BAG; // default bagging, TODO boosting
+
+ private static final int FOREST_SIZE = 50;
+ private static final double TREE_SIZE_RATIO = 0.9;
+ private static final boolean WITH_REP = true;
+
+ private ArrayList<DecisionTree> forest;
+ //private Learner trainer;
+
+ private DecisionTreeMerger merger;
+
+ public ForestBuilder() {
+ //this.trainer = _trainer;
+ merger = new DecisionTreeMerger();
+ }
+ public void build(Memory mem, Learner _trainer) {
+
+ final InstanceList class_instances = mem.getClassInstances();
+ _trainer.setInputData(class_instances);
+
+ if (class_instances.getTargets().size()>1) {
+ //throw new FeatureNotSupported("There is more than 1 target candidates");
+ if (flog.error() !=null)
+ flog.error().log("There is more than 1 target candidates");
+ System.exit(0);
+ // TODO put the feature not supported exception || implement it
+ }
+
+ int N = class_instances.getSize();
+ int tree_capacity = (int)(TREE_SIZE_RATIO * N);
+ _trainer.setDataSizePerTree(tree_capacity);
+
+
+ forest = new ArrayList<DecisionTree> (FOREST_SIZE);
+ int i = 0;
+ int[] bag;
+ while (i++ < FOREST_SIZE) {
+ if (WITH_REP)
+ bag = Util.bag_w_rep(tree_capacity, N);
+ else
+ bag = Util.bag_wo_rep(tree_capacity, N);
+
+ InstanceList working_instances = class_instances.getInstances(bag);
+
+ if (slog.debug() != null)
+ slog.debug().log("\n"+"Training a tree"+"\n");
+ DecisionTree dt = _trainer.train_tree(working_instances);
+ if (slog.debug() != null)
+ slog.debug().log("\n"+"the end"+ "\n");
+ dt.setID(i);
+ forest.add(dt);
+ // the DecisionTreeMerger will visit the decision tree and add the paths that have not been seen yet to the list
+ merger.add(dt);
+
+ if (slog.stat() !=null)
+ slog.stat().stat(".");
+
+ }
+
+ //System.exit(0);
+ // TODO how to compute a best tree from the forest
+ DecisionTree best = merger.getBest();
+ if (best == null)
+ best = forest.get(0);
+ _trainer.setBestTree(best);// forest.get(0));
+
+ //this.c45 = dt;
+ }
+
+ public TreeAlgo getTreeAlgo() {
+ return algorithm; //TreeAlgo.BAG; // default
+ }
+
+ public ArrayList<DecisionTree> getTrees() {
+ return forest;
+ }
+}
+
+
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/ForestBuilder.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/ForestTester.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/ForestTester.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/ForestTester.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,85 @@
+package org.drools.learner.builder;
+
+import java.util.ArrayList;
+
+import org.drools.learner.DecisionTree;
+import org.drools.learner.Domain;
+import org.drools.learner.Instance;
+import org.drools.learner.InstanceList;
+import org.drools.learner.Stats;
+import org.drools.learner.eval.ClassDistribution;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+import org.drools.learner.tools.Util;
+
+public class ForestTester extends Tester{
+
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(ForestTester.class, SimpleLogger.DEFAULT_LEVEL);
+ private static SimpleLogger slog = LoggerFactory.getSysOutLogger(ForestTester.class, SimpleLogger.DEFAULT_LEVEL);
+
+ private ArrayList<DecisionTree> trees;
+ private Domain targetDomain;
+
+ public ForestTester(ArrayList<DecisionTree> forest) {
+ trees = forest;
+ targetDomain = forest.get(0).getTargetDomain();
+ }
+
+ public Stats test(InstanceList data) {
+
+ Stats evaluation = new Stats(data.getSchema().getObjectClass()) ; //represent.getObjClass());
+
+ int i = 0;
+ for (Instance instance : data.getInstances()) {
+ Object forest_decision = this.voteOn(instance);
+ Integer result = evaluate(targetDomain, instance, forest_decision);
+
+ //flog.debug(Util.ntimes("#\n", 1)+i+ " <START> TEST: instant="+ instance + " = target "+ result);
+ if (i%1000 ==0 && slog.stat() != null)
+ slog.stat().stat(".");
+
+ evaluation.change(result, 1);
+ i ++;
+ }
+
+ return evaluation;
+ }
+
+ public Object voteOn(Instance i) {
+ ClassDistribution classification = new ClassDistribution(targetDomain);
+
+ for (int j = 0; j< trees.size() ; j ++) {
+ Object vote = trees.get(j).vote(i);
+ if (vote != null) {
+ classification.change(vote, 1);
+ //classification.change(Util.sum(), 1);
+ } else {
+ // TODO add an unknown value
+ //classification.change(-1, 1);
+ if (flog.error() !=null)
+ flog.error().log(Util.ntimes("\n", 10)+"Unknown situation at tree: " + j + " for fact "+ i);
+ System.exit(0);
+ }
+ }
+ classification.evaluateMajority();
+ Object winner = classification.get_winner_class();
+
+
+ double ratio = 0.0;
+ if (classification.get_num_ideas() == 1) {
+ //100 %
+ ratio = 1;
+ return winner;
+ } else {
+ double num_votes = classification.getVoteFor(winner);
+ ratio = (num_votes/(double) trees.size());
+ // TODO if the ratio is smaller than some number => reject
+ }
+ return winner;
+
+ }
+ public void printStats(final Stats evaluation, String executionSignature) {
+ super.printStats(evaluation, executionSignature);
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/ForestTester.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/ID3Learner.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/ID3Learner.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/ID3Learner.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,99 @@
+package org.drools.learner.builder;
+
+import java.util.Hashtable;
+import java.util.List;
+
+import org.drools.learner.DecisionTree;
+import org.drools.learner.Domain;
+import org.drools.learner.LeafNode;
+import org.drools.learner.TreeNode;
+import org.drools.learner.eval.AttributeChooser;
+import org.drools.learner.eval.Heuristic;
+import org.drools.learner.eval.InstDistribution;
+import org.drools.learner.tools.Util;
+
+public class ID3Learner extends Learner {
+
+ private AttributeChooser chooser;
+
+ public ID3Learner(Heuristic hf) {
+ super();
+ super.setDomainAlgo(DomainAlgo.CATEGORICAL);
+ chooser = new AttributeChooser(hf);
+ }
+
+ protected TreeNode train(DecisionTree dt, InstDistribution data_stats) {//List<Instance> data) {
+
+ if (data_stats.getSum() == 0) {
+ throw new RuntimeException("Nothing to classify, factlist is empty");
+ }
+
+ /* let's get the statistics of the results */
+ //InstDistribution stats_by_class = new InstDistribution(dt.getTargetDomain());///* the target domain*/);
+ data_stats.evaluateMajority();
+
+
+ /* if all elements are classified to the same value */
+ if (data_stats.get_num_ideas(/* number of supported target categories*/) == 1) {
+
+ LeafNode classifiedNode = new LeafNode(dt.getTargetDomain() /* target domain*/,
+ data_stats.get_winner_class() /*winner target category*/);
+ classifiedNode.setRank( (double)data_stats.getSum()/
+ (double)this.getDataSize()/* total size of data fed to dt*/);
+ classifiedNode.setNumMatch(data_stats.getSum()); //num of matching instances to the leaf node
+ classifiedNode.setNumClassification(data_stats.getSum()); //num of classified instances at the leaf node
+ return classifiedNode;
+ }
+ List<Domain> attribute_domains = dt.getAttrDomains();
+
+ /* if there is no attribute left in order to continue */
+ if (attribute_domains.size() == 0) {
+ /* an heuristic of the leaf classification*/
+ Object winner = data_stats.get_winner_class(); /*winner target category*/
+ LeafNode noAttributeLeftNode = new LeafNode(dt.getTargetDomain() /* target domain*/,
+ winner);
+ noAttributeLeftNode.setRank((double)data_stats.getVoteFor(winner)/
+ (double)this.getDataSize() /* total size of data fed to dt*/);
+ noAttributeLeftNode.setNumMatch(data_stats.getSum()); //num of matching instances to the leaf node
+ noAttributeLeftNode.setNumClassification(data_stats.getVoteFor(winner)); //num of classified instances at the leaf node
+ return noAttributeLeftNode;
+ }
+
+
+ /* id3 starts: choose the attribute according to the entropy function
+ * entrophy function: data, info of the data wrt target domain, info for each attribute
+ * */
+ Domain node_domain = chooser.chooseAttributeAsCategorical(data_stats, attribute_domains);
+
+
+ if (flog.stat() !=null)
+ flog.stat().log(Util.ntimes("*", 20)+" 1st best attr: "+ node_domain);
+
+ TreeNode currentNode = new TreeNode(node_domain);
+ currentNode.setNumMatch(data_stats.getSum()); //num of matching instances to the leaf node
+ Hashtable<Object, InstDistribution> filtered_stats = data_stats.splitFromCategorical(node_domain, null);
+ dt.FACTS_READ += data_stats.getSum();
+
+ for (int c=0; c<node_domain.getCategoryCount(); c++) {
+ /* split the last two class at the same time */
+ Object category = node_domain.getCategory(c);
+
+ /* list of domains except the choosen one (&target domain)*/
+ DecisionTree child_dt = new DecisionTree(dt, node_domain);
+
+ if (filtered_stats.get(category) == null || filtered_stats.get(category).getSum() ==0) {
+ /* majority !!!! */
+ LeafNode majorityNode = new LeafNode(dt.getTargetDomain(), data_stats.get_winner_class());
+ majorityNode.setRank(-1.0); //it does not classify any instance
+ majorityNode.setNumMatch(0);
+ majorityNode.setNumClassification(0);
+ currentNode.putNode(category, majorityNode);
+ } else {
+ TreeNode newNode = train(child_dt, filtered_stats.get(category));//, attributeNames_copy
+ currentNode.putNode(category, newNode);
+ }
+ }
+ return currentNode;
+
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/ID3Learner.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/Learner.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/Learner.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/Learner.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,121 @@
+package org.drools.learner.builder;
+
+import java.util.HashSet;
+import java.util.Iterator;
+
+import org.drools.learner.DecisionTree;
+import org.drools.learner.Domain;
+import org.drools.learner.Instance;
+import org.drools.learner.InstanceList;
+import org.drools.learner.TreeNode;
+import org.drools.learner.eval.InstDistribution;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+
+public abstract class Learner {
+
+ protected static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(Learner.class, SimpleLogger.DEFAULT_LEVEL);
+ protected static SimpleLogger slog = LoggerFactory.getSysOutLogger(Learner.class, SimpleLogger.DEBUG);
+
+ 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;
+ protected HashSet<Instance> missclassified_data;
+
+
+ private DomainAlgo algorithm;
+
+
+ protected abstract TreeNode train(DecisionTree dt, InstDistribution data_stats);
+
+ public Learner() {
+ this.data_size = 0;
+ }
+
+
+ public DecisionTree train_tree(InstanceList working_instances) {
+ 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());
+
+ InstDistribution stats_by_class = new InstDistribution(dt.getTargetDomain());
+ stats_by_class.calculateDistribution(working_instances.getInstances());
+ dt.FACTS_READ += working_instances.getSize();
+
+ TreeNode root = train(dt, stats_by_class);
+ dt.setRoot(root);
+ //flog.debug("Result tree\n" + dt);
+ return dt;
+ }
+
+ public Domain getTargetDomain() {
+ 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);
+
+ }
+
+ // TODO how are we going to select the target domain if there is more than one candidate
+ private DecisionTree select_target(InstanceList working_instances) {
+ DecisionTree dt = null;
+ for (String target: input_data.getTargets()) {
+ dt = new DecisionTree(input_data.getSchema(), target);
+
+ //flog.debug("Num of attributes: "+ dt.getAttrDomains().size());
+
+ InstDistribution stats_by_class = new InstDistribution(dt.getTargetDomain());
+ stats_by_class.calculateDistribution(working_instances.getInstances());
+ dt.FACTS_READ += working_instances.getSize();
+
+ TreeNode root = train(dt, stats_by_class);
+ dt.setRoot(root);
+ //flog.debug("Result tree\n" + dt);
+ }
+ return dt;
+ }
+
+
+ public void setDataSizePerTree(int num) {
+ this.data_size = num;
+
+ missclassified_data = new HashSet<Instance>();
+ }
+
+ public int getDataSize() {
+ return this.data_size;
+ }
+
+ public DecisionTree getTree() {
+ return best_tree;
+ }
+
+ public DomainAlgo getDomainAlgo() {
+ return this.algorithm;
+ }
+
+ public void setDomainAlgo(DomainAlgo type) {
+ this.algorithm = type;
+ }
+
+ public void setInputData(InstanceList class_instances) {
+ this.input_data = class_instances;
+ }
+
+ public InstanceList getInputData() {
+ return input_data;
+ }
+
+ public void setBestTree(DecisionTree dt) {
+ this.best_tree = dt;
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/Learner.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/SingleTreeBuilder.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/SingleTreeBuilder.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/SingleTreeBuilder.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,52 @@
+package org.drools.learner.builder;
+
+
+import org.drools.learner.DecisionTree;
+import org.drools.learner.InstanceList;
+import org.drools.learner.Memory;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+
+public class SingleTreeBuilder implements DecisionTreeBuilder{
+
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(SingleTreeBuilder.class, SimpleLogger.DEFAULT_LEVEL);
+ private static SimpleLogger slog = LoggerFactory.getSysOutLogger(SingleTreeBuilder.class, SimpleLogger.DEFAULT_LEVEL);
+
+ private TreeAlgo algorithm = TreeAlgo.SINGLE; // default bagging, TODO boosting
+
+ private DecisionTree one_tree;
+ //private Learner trainer;
+
+ public SingleTreeBuilder() {//Learner _trainer) {
+ //this.trainer = _trainer;
+ //dom_type = trainer.getDomainType();
+ }
+
+ /*
+ * the memory has the information
+ * the instances: the objects which the decision tree will work on
+ * the schema: the definition of the object instance
+ * (Class<?>) klass, String targetField, List<String> workingAttributes
+ */
+ public void build(Memory mem, Learner _trainer) {
+ final InstanceList class_instances = mem.getClassInstances();
+ _trainer.setInputData(class_instances);
+ if (class_instances.getTargets().size()>1) {
+ //throw new FeatureNotSupported("There is more than 1 target candidates");
+ if (flog.error() !=null)
+ flog.error().log("There is more than 1 target candidates");
+
+ System.exit(0);
+ // TODO put the feature not supported exception || implement it
+ }
+
+ _trainer.setDataSizePerTree(class_instances.getSize());
+ one_tree = _trainer.train_tree(class_instances);
+ _trainer.setBestTree(one_tree);
+ }
+
+ public TreeAlgo getTreeAlgo() {
+ return this.algorithm; // default
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/SingleTreeBuilder.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/SingleTreeTester.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/SingleTreeTester.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/SingleTreeTester.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,47 @@
+package org.drools.learner.builder;
+
+import org.drools.learner.DecisionTree;
+import org.drools.learner.Instance;
+import org.drools.learner.InstanceList;
+import org.drools.learner.Stats;
+
+public class SingleTreeTester extends Tester{
+
+ private DecisionTree single_tree;
+
+ public SingleTreeTester(DecisionTree one_tree) {
+ single_tree = one_tree;
+ }
+
+ /* test the entire set*/
+ public Stats test(InstanceList data) {
+
+ //flog.debug(Util.ntimes("\n", 2)+Util.ntimes("$", 5)+" TESTING "+Util.ntimes("\n", 2));
+
+ Stats evaluation = new Stats(single_tree.getObjClass());
+ int i = 0;
+ for (Instance instance : data.getInstances()) {
+ Object tree_decision = single_tree.vote(instance);
+ Integer result = evaluate(single_tree.getTargetDomain(), instance, tree_decision);
+
+ //flog.debug(Util.ntimes("#\n", 1)+i+ " <START> TEST: instant="+ instance + " = target "+ result);
+// if (i%1000 ==0 && slog.stat() !=null)
+// slog.stat().stat(".");
+
+ evaluation.change(result, 1);
+ i ++;
+ }
+ return evaluation;
+ }
+
+ /* test the entire set*/
+ public Integer test(Instance i) {
+
+ Object tree_decision = single_tree.vote(i);
+ return evaluate(single_tree.getTargetDomain(), i, tree_decision);
+ }
+
+ public void printStats(final Stats evaluation, String executionSignature) {
+ super.printStats(evaluation, executionSignature);
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/SingleTreeTester.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/Tester.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/Tester.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/Tester.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,39 @@
+package org.drools.learner.builder;
+
+import org.drools.learner.AttributeValueComparator;
+import org.drools.learner.Domain;
+import org.drools.learner.Instance;
+import org.drools.learner.InstanceList;
+import org.drools.learner.Stats;
+import org.drools.learner.tools.Util;
+
+public abstract class Tester{
+
+ //private static final Logger log = LoggerFactory.getSysOutLogger(LogLevel.ERROR);
+ //private static final Logger flog = LoggerFactory.getFileLogger(Tester.class, LogLevel.ERROR, Util.log_file);
+
+ public abstract Stats test(InstanceList data);// String executionSignature
+
+ public static Integer evaluate (Domain targetDomain, Instance i, Object tree_decision) {
+ String targetFName = targetDomain.getFReferenceName();
+
+ Object tattr_value = i.getAttrValue(targetFName);
+ Object i_category = targetDomain.getCategoryOf(tattr_value);
+
+ if (AttributeValueComparator.instance.compare(i_category, tree_decision) == 0) {
+ return Integer.valueOf(1); //correct
+ } else {
+ return Integer.valueOf(0); // mistake
+ }
+ }
+
+ protected void printStats(final Stats evaluation, String executionSignature) {
+ if (Util.PRINT_STATS) {
+// if (flog.debug() !=null)
+// flog.debug().log(evaluation.print2string());
+
+ evaluation.print2file(executionSignature);
+ }
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/builder/Tester.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/AttributeChooser.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/AttributeChooser.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/AttributeChooser.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,115 @@
+package org.drools.learner.eval;
+
+import java.util.List;
+
+import org.drools.learner.Domain;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+
+public class AttributeChooser {
+
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(AttributeChooser.class, SimpleLogger.DEFAULT_LEVEL);
+ private static SimpleLogger slog = LoggerFactory.getSysOutLogger(AttributeChooser.class, SimpleLogger.DEFAULT_LEVEL);
+
+
+ private Heuristic function;
+
+ public AttributeChooser(Heuristic _function) {
+ function = _function;
+ }
+
+ public Domain chooseAttribute(InformationContainer eval, InstDistribution insts_by_target, List<Domain> attr_domains) {
+ // List<Instance> instances
+
+// double data_eval = function.calc_info(insts_by_target);
+ function.init(insts_by_target);
+
+ double greatestEval = function.getWorstEval();//-1000;
+// ArrayList<Instance> sorted_instances = null, best_sorted_instances = null;
+// Domain best_attr = attr_domains.get(0);
+
+ InformationContainer container = new InformationContainer();
+ InformationContainer best = new InformationContainer();
+ for (Domain attr_domain : attr_domains) {
+ /* No need to clone the domain as soon as no need to change the domain
+ * All domains are categorical so i will use them the way they are
+ */
+ double attribute_eval = 0.0;
+ if (attr_domain.isCategorical()) {
+ attribute_eval = function.getEval(attr_domain);//data_eval - function.info_attr(insts_by_target, attr_domain);
+ container.attribute_eval = attribute_eval;
+ container.domain = attr_domain;
+ if (slog.debug() != null)
+ slog.debug().log("CatAttribute: " + container.domain + " the gain: " + attribute_eval + " greatest "+ greatestEval+ "\n");
+
+
+ } else {
+// the continuous domain
+ attribute_eval = function.getEval_cont(attr_domain);
+ container.attribute_eval = attribute_eval;
+ container.domain = function.getDomain();
+ container.sorted_data = function.getSortedInstances();
+ if (slog.debug() != null)
+ slog.debug().log("ContAttribute: " + container.domain + " the gain: " + attribute_eval + " greatest "+ greatestEval+ "\n");
+
+// attr_domain = function.getDomain();
+// sorted_instances = visitor.getSortedInstances();
+
+
+
+ }
+ if (slog.warn() != null)
+ slog.warn().log("Attribute: " + container.domain + " the gain: " + attribute_eval + " greatest "+ greatestEval+ "\n");
+ if (attribute_eval > greatestEval) {// TODO implement a comparator
+ greatestEval = attribute_eval;
+ best.domain = container.domain;
+ best.sorted_data = container.sorted_data;
+ }
+ }
+
+// Clone the best attribute domain cause it is going to be the domain of the treenode
+ eval.domain = best.domain.cheapClone();
+ eval.sorted_data = best.sorted_data;
+ eval.attribute_eval = greatestEval;
+ return eval.domain;
+ }
+
+// /*
+// * to choose the best attribute
+// * can process categorical, and quantitative attribute domains
+// * used by c45Learner, c45Iterator
+// */
+// public static Domain chooseAttribute(InstDistribution insts_by_target, List<Domain> attr_domains) {
+// InformationContainer evals = new InformationContainer();
+// chooseAttribute(evals, insts_by_target, attr_domains);
+// return evals.domain;
+// }
+
+ /*
+ * to choose the best attribute
+ * can process only the categorical attribute domains
+ * used by id3Learner
+ */
+ public Domain chooseAttributeAsCategorical(InstDistribution insts_by_target, List<Domain> attr_domains) {
+
+ //double dt_info = function.calc_info(insts_by_target);
+ function.init(insts_by_target);
+ double greatestEval = function.getWorstEval(); //-1000;
+ Domain best_attr = attr_domains.get(0);
+ for (Domain attr_domain : attr_domains) {
+ /* No need to clone the domain as soon as no need to change the domain
+ * All domains are categorical so i will use them the way they are
+ */
+ //double attribute_eval = dt_info - function.info_attr(insts_by_target, attr_domain);
+ double attribute_eval = function.getEval(attr_domain);
+// flog.debug("Attribute: " + attr_domain.getFName() + " the gain: " + gain);
+ if (attribute_eval > greatestEval) {
+ greatestEval = attribute_eval;
+ best_attr = attr_domain;
+ }
+ }
+// Clone the best attribute domain cause it is going to be the domain of the treenode
+ return best_attr.cheapClone();
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/AttributeChooser.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Categorizer.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Categorizer.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Categorizer.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,211 @@
+package org.drools.learner.eval;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+import org.drools.learner.Domain;
+import org.drools.learner.Instance;
+import org.drools.learner.InstanceComparator;
+import org.drools.learner.QuantitativeDomain;
+import org.drools.learner.eval.Entropy;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+import org.drools.learner.tools.Util;
+
+
+public class Categorizer {
+
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(Categorizer.class, SimpleLogger.DEFAULT_LEVEL);
+
+ private ArrayList<Instance> data;
+ private QuantitativeDomain splitDomain;
+ private Domain targetDomain;
+
+ private InstanceComparator targetComp, attrComp;
+
+ private ClassDistribution distribution;
+
+
+ /* TODO make it singleton */
+ private static final Object key0 = Integer.valueOf(0);
+ private static final Object key1 = Integer.valueOf(1);
+ private static final Domain binaryDomain = init_binary_domain();
+
+
+
+ /* TODO put this into globals file */
+ private int maxDepth = 1;
+
+ public Categorizer(InstDistribution _data_in_class) {
+ //List<Instance> _instancese
+ this.data = new ArrayList<Instance>((int)_data_in_class.getSum());
+ this.distribution = _data_in_class;
+ this.targetDomain = _data_in_class.getClassDomain();
+
+ for (int category = 0; category<targetDomain.getCategoryCount(); category++) {
+ Object targetCategory = targetDomain.getCategory(category);
+ data.addAll(_data_in_class.getSupportersFor(targetCategory));
+ }
+
+ this.targetComp = new InstanceComparator(targetDomain.getFReferenceName());
+ }
+
+ public void findSplits(QuantitativeDomain attrDomain) {
+ this.splitDomain = attrDomain;
+ this.attrComp = new InstanceComparator(attrDomain.getFReferenceName());
+
+ init_binary_domain();
+
+ // CATEGORIZATION 1. sort the values
+ Collections.sort(this.data, this.attrComp);
+
+ int last_index = this.data.size()-1;
+ 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);
+ return;
+ }
+
+ public static Domain init_binary_domain() {
+ //if (binaryDomain == null) {
+ 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));
+ //}
+ return bD;
+ }
+
+ public ArrayList<Instance> getSortedInstances() {
+ return data;
+ }
+
+ public QuantitativeDomain getSplitDomain() {
+ return this.splitDomain;
+ }
+
+ private double find_a_split(int begin_index, int size, int depth,
+ ClassDistribution facts_in_class) {
+
+ if (flog.debug() !=null)
+ flog.debug().log("./n");
+ if (data.size() <= 1 || (size-begin_index)<2) {
+ if (flog.warn() !=null)
+ flog.warn().log("fact.size <=1 returning 0.0....");
+ return 0.0;
+ }
+// if (facts_in_class.getSum() == 0) {
+// return 0.0; // there is no one in it
+// }
+ facts_in_class.evaluateMajority();
+ if (facts_in_class.get_num_ideas()==1) {
+ if (flog.warn() !=null)
+ flog.warn().log("getNum_supported_target_classes=1 returning 0.0....");
+ return 0.0; //?
+ }
+
+ if (depth == 0) {
+ if (flog.warn() !=null)
+ flog.warn().log("depth == 0 returning 0.0....");
+ return 0.0;
+ }
+
+ /* initialize the distribution */
+ CondClassDistribution instances_by_attr = new CondClassDistribution(binaryDomain, this.targetDomain);
+ instances_by_attr.setDistForAttrValue(key1, facts_in_class);
+ instances_by_attr.setTotal(facts_in_class.getSum());
+
+ double best_sum = 100000.0;
+
+ 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.getFReferenceName());
+ SplitPoint bestPoint = new SplitPoint(last_index, last_value);
+ CondClassDistribution best_distribution = null;//instances_by_attr;
+ Instance i1 = data.get(begin_index), i2;
+
+ if (flog.debug() !=null)
+ flog.debug().log("\nentropy.info_cont() SEARCHING: "+begin_index+ " until "+size+" attr "+this.splitDomain.getFName()+ " "+ i1);
+ for(int index =begin_index+1; index < size; index ++) {
+ 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.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);
+ /*
+ * CATEGORIZATION 2.1. Cut points are points in the sorted list above where the class labels change.
+ * Eg. if I had five instances with values for the attribute of interest and labels
+ * (1.0,A), (1.4,A), (1.7, A), (2.0,B), (3.0, B), (7.0, A), then there are only
+ * two cutpoints of interest: 1.85 and 5 (mid-way between the points
+ * where the classes change from A to B or vice versa).
+ */
+ if ( targetComp.compare(i1, i2)!=0 && attrComp.compare(i1, i2)!=0) {
+ num_split_points++;
+
+ 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.getFReferenceName());
+ Object cp_i_next = i2.getAttrValue(this.splitDomain.getFReferenceName());
+
+ Class<?> fClass = this.splitDomain.getFType();
+
+ Object cut_point = Util.calculateMidPoint(fClass, cp_i, cp_i_next);
+
+ /*
+ * CATEGORIZATION 3. Evaluate your favourite disparity measure
+ * (info gain, gain ratio, gini coefficient, chi-squared test) on the cut point
+ * and calculate its gain
+ */
+ double sum = Entropy.calc_info_attr(instances_by_attr);
+ if (sum < best_sum) {
+ best_sum = sum;
+ split_index = index;
+
+ if (flog.debug() !=null)
+ flog.debug().log(Util.ntimes("?", 10)+"** FOUND: @"+(index)+" target ("+ i1.getAttrValue(this.targetDomain.getFName())
+ +"-|T|-"+ i2.getAttrValue(this.targetDomain.getFName())+")");
+ bestPoint = new SplitPoint(index-1, cut_point);
+ bestPoint.setInformationValue(best_sum);
+
+// if (best_distribution != null)
+// best_distribution.clear();
+ best_distribution = new CondClassDistribution(instances_by_attr);
+ }
+ }
+ i1 = i2;
+
+ }
+ if (best_distribution != null) {
+ if (flog.debug() !=null)
+ flog.debug().log("bp:"+ bestPoint);
+
+ this.splitDomain.addSplitPoint(bestPoint);
+
+ /*
+ * TODO : can we put the conditional class distribution to its correct place instead of the split
+ */
+
+ if (flog.debug() !=null)
+ flog.debug().log("bd:"+ best_distribution.getNumCondClasses());
+ double sum1 = find_a_split(begin_index, split_index, depth-1, best_distribution.getDistributionOf(key0));
+
+ double sum2 = find_a_split(split_index, size, depth-1, best_distribution.getDistributionOf(key1));
+
+ return sum1 + sum2;
+ } else
+ return 0.0;
+
+ /* return best_sum;
+ * TODO find the correct formula of the sumi's for the return
+ */
+
+
+
+ }
+
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Categorizer.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/ClassDistribution.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/ClassDistribution.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/ClassDistribution.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,133 @@
+package org.drools.learner.eval;
+
+import java.util.Hashtable;
+
+import org.drools.learner.Domain;
+import org.drools.learner.tools.Util;
+
+
+/* simple histogram keeps the number of instances in each class
+ * class: categories of the target attribute*/
+public class ClassDistribution {
+
+ //private static final Logger log = LoggerFactory.getSysOutLogger(LogLevel.ERROR);
+ //protected static final Logger flog = LoggerFactory.getFileLogger(ClassDistribution.class, LogLevel.ERROR, Util.log_file);
+
+
+ protected Domain target_attr;
+ private Hashtable<Object, Double> quantity_by_class;
+
+ private String sum_key = Util.sum();
+ private int num_category_ideas;
+ private Object winner_category;
+
+ 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);
+ quantity_by_class.put(category, 0.0d);
+ }
+
+ quantity_by_class.put(sum_key, 0.0d);
+
+ num_category_ideas = 0;
+ }
+
+ public ClassDistribution(ClassDistribution copy_dist) {
+ this.target_attr = copy_dist.getClassDomain();
+ this.quantity_by_class = new Hashtable<Object, Double>(this.target_attr.getCategoryCount() + 1);
+ this.setDistribution(copy_dist);
+
+ this.num_category_ideas = copy_dist.get_num_ideas();
+ this.winner_category = copy_dist.get_winner_class();
+
+ }
+
+ public void setSum(double sum) {
+ quantity_by_class.put(sum_key, sum);
+ }
+
+ public double getSum() {
+ return quantity_by_class.get(sum_key);
+ }
+
+ public Domain getClassDomain() {
+ return target_attr;
+ }
+
+ public void change(Object target_category, double i) {
+ /* TODO ????
+ * if (target_category == sum_key) return;
+ */
+ double num_1 = quantity_by_class.get(target_category);
+ num_1 += i;
+ quantity_by_class.put(target_category, num_1);
+
+ //quantity_by_class.put(target_category, quantity_by_class.get(target_category)+i);
+ }
+
+ public double getVoteFor(Object targetCategory) {
+ return quantity_by_class.get(targetCategory);
+ }
+
+ public void evaluateMajority() {
+ double winner_vote = 0.0d;
+ int num_ideas = 0; // the number of target categories that the instances belong to
+
+ Object winner = null;
+
+ for (int c=0; c<this.target_attr.getCategoryCount(); c++) {
+ Object category = this.target_attr.getCategory(c);
+
+ double num_in_class = this.getVoteFor(category);
+ if (num_in_class > 0) {
+ num_ideas++;
+ if (num_in_class > winner_vote) {
+ winner_vote = num_in_class;
+ winner = category;
+ }
+ }
+ }
+
+ this.set_num_ideas(num_ideas);
+ this.set_winner_class(winner);
+ }
+
+ public void set_num_ideas(int num_supperted_target_classes) {
+ this.num_category_ideas = num_supperted_target_classes;
+ }
+
+ public void set_winner_class(Object the_winner_target_class) {
+ this.winner_category = the_winner_target_class;
+ }
+
+ public int get_num_ideas() {
+ return this.num_category_ideas;
+ }
+
+ public Object get_winner_class() {
+ return this.winner_category;
+ }
+
+ public String toString() {
+ StringBuffer sb_out = new StringBuffer("ClassDist: target:"+ this.target_attr.getFName()+ " total: "+ this.getSum() + " & categories:");
+ for (int c=0; c<this.target_attr.getCategoryCount(); c++) {
+ Object category = this.target_attr.getCategory(c);
+ sb_out.append(this.getVoteFor(category) +" @"+category+ ", ");
+ }
+// out +="\n";
+ return sb_out.toString();
+ }
+
+ public void setDistribution(ClassDistribution targetDist) {
+ for (int c=0; c<this.target_attr.getCategoryCount(); c++) {
+ Object category = this.target_attr.getCategory(c);
+ this.quantity_by_class.put(category, targetDist.getVoteFor(category));
+ }
+ this.quantity_by_class.put(sum_key, targetDist.getSum());
+ }
+
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/ClassDistribution.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/CondClassDistribution.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/CondClassDistribution.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/CondClassDistribution.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,101 @@
+package org.drools.learner.eval;
+
+import java.util.Hashtable;
+
+import org.drools.learner.Domain;
+import org.drools.learner.tools.Util;
+
+public class CondClassDistribution {
+
+ private String sum_key = Util.sum();
+
+ private Domain cond_attr; // domain of the attr we distribute the instances conditionally
+ private Hashtable<Object, ClassDistribution> cond_quantity_by_class;
+
+ private double total_num;
+
+ public CondClassDistribution(Domain attributeDomain, Domain targetDomain) {
+ this.cond_attr = attributeDomain;
+ //List<?> attributeValues = this.domain.getValues();
+ cond_quantity_by_class = new Hashtable<Object, ClassDistribution>(attributeDomain.getCategoryCount());
+
+ for (int c_idx = 0; c_idx<attributeDomain.getCategoryCount(); c_idx++) {
+ Object attr_category = attributeDomain.getCategory(c_idx);
+ cond_quantity_by_class.put(attr_category, new ClassDistribution(targetDomain));
+ }
+
+ }
+
+ public CondClassDistribution(CondClassDistribution copy) {
+ this.cond_attr = copy.getAttrDomain();
+ this.cond_quantity_by_class = new Hashtable<Object, ClassDistribution>(copy.getNumCondClasses());
+
+ for (int c_idx = 0; c_idx< this.cond_attr.getCategoryCount(); c_idx++) {
+ Object attr_category = this.cond_attr.getCategory(c_idx);
+ this.cond_quantity_by_class.put(attr_category, new ClassDistribution(copy.getDistributionOf(attr_category)));
+ }
+ this.total_num = copy.getTotal();
+
+ }
+
+ public double getTotal() {
+ return this.total_num;
+ }
+
+ public void setTotal(double size) {
+ this.total_num = size;
+ }
+
+ public Domain getAttrDomain() {
+ return cond_attr;
+ }
+// public String getTargetName() {
+// return target_attr.getFName();
+// }
+
+ public Object getCondClass(int idx) {
+ return cond_attr.getCategory(idx);
+ }
+
+ public int getNumCondClasses() {
+ return cond_attr.getCategoryCount();
+ }
+
+ public double getTotal_AttrCategory(Object attr_value) {
+ return cond_quantity_by_class.get(attr_value).getSum();
+ }
+
+ public void change(Object attr_category, Object target_class, double i) {
+// System.out.print("The cond_dist: a_cat:"+ attr_category+" t_cat:"+ target_class);
+// System.out.println(" the nums: "+cond_quantity_by_class.get(attr_category));
+
+ cond_quantity_by_class.get(attr_category).change(target_class, i);
+ cond_quantity_by_class.get(attr_category).change(sum_key, i);
+
+ }
+
+ public ClassDistribution getDistributionOf(Object attr_value) {
+ return cond_quantity_by_class.get(attr_value);
+ }
+ public void clear() {
+ this.cond_quantity_by_class.clear();
+ // all for each?
+ }
+
+ public void setDistForAttrValue(Object attr_value, ClassDistribution facts_in_class) {
+ //cond_quantity_by_class.put(attr_value, targetDist);
+ /* TODO should i make a clone */
+ cond_quantity_by_class.get(attr_value).setDistribution(facts_in_class);
+
+ }
+ public String toString() {
+ StringBuffer sb_out = new StringBuffer("\nCondClassDist: attr: "+cond_attr.getFName()+" total num: "+ this.getTotal() + "\n") ;
+ for (int c_idx = 0; c_idx<cond_attr.getCategoryCount(); c_idx++) {
+ Object attr_category = cond_attr.getCategory(c_idx);
+ ClassDistribution td = cond_quantity_by_class.get(attr_category);
+ sb_out.append("(ATTR:"+attr_category+ "=> "+ td +")");
+ }
+ return sb_out.toString();
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/CondClassDistribution.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/CrossValidation.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/CrossValidation.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/CrossValidation.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,209 @@
+package org.drools.learner.eval;
+
+
+import java.util.ArrayList;
+
+import org.drools.learner.DecisionTree;
+import org.drools.learner.InstanceList;
+import org.drools.learner.Stats;
+import org.drools.learner.builder.Learner;
+import org.drools.learner.builder.SingleTreeTester;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+import org.drools.learner.tools.Util;
+
+public class CrossValidation implements Estimator{
+
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(CrossValidation.class, SimpleLogger.DEFAULT_LEVEL);
+ private static SimpleLogger slog = LoggerFactory.getSysOutLogger(CrossValidation.class, SimpleLogger.DEBUG);
+
+ private int k_fold, num_instances;
+
+ private final int MIN_NUM_FOLDS = 2;
+
+ /* estimated values
+ * validation_error_estimate is used to estimate the true misclassification rate
+ * */
+ private double validation_error_estimate, training_error_estimate, num_leaves_estimate, alpha_estimate;
+ private int [] crossed_set;
+ private int [] [] fold_indices;
+ private ArrayList<DecisionTree> forest;
+ private InstanceList class_instances;
+
+ private int VALID_SET_0 = 0, VALID_SET_1 = 1;
+
+ private boolean WITH_REP = false;
+ public CrossValidation(int _k, InstanceList _instances) {
+ if (_k <=1) {
+ if (flog.warn() !=null)
+ flog.warn().log("There is 1 or less number of folds specified, i am setting "+MIN_NUM_FOLDS+" folds\n");
+ k_fold = MIN_NUM_FOLDS;
+ } else {
+ k_fold = _k;
+ }
+ forest = new ArrayList<DecisionTree> (k_fold);
+ validation_error_estimate = 0.0d;
+ training_error_estimate = 0.0d;
+ num_leaves_estimate = 0.0d;
+ alpha_estimate = 0.0d;
+ class_instances = _instances;
+
+ num_instances = class_instances.getSize();
+ fold_indices = new int [k_fold] [2];
+ }
+ public int [] cross_set(int N) {
+
+ if (WITH_REP)
+ return Util.bag_w_rep(N, N);
+ else
+ return Util.bag_wo_rep(N, N);
+ }
+
+
+ // for small samples
+ public void validate(Learner _trainer) {
+ if (class_instances.getTargets().size()>1 ) {
+ //throw new FeatureNotSupported("There is more than 1 target candidates");
+ if (flog.error() !=null)
+ flog.error().log("There is more than 1 target candidates\n");
+ System.exit(0);
+ // TODO put the feature not supported exception || implement it
+ }
+
+ crossed_set = cross_set(num_instances);
+
+ // N-fold
+ calc_fold_indices(num_instances);
+
+ int i = 0;
+// int[] bag;
+ while (i++ < k_fold ) {
+ int fold_size = getFoldSize(i);
+ if (slog.debug() !=null)
+ slog.debug().log("i "+(i-1)+"/"+k_fold);
+ ArrayList<InstanceList> sets = getFold(i-1);
+ InstanceList learning_set = sets.get(0);
+ InstanceList validation_set = sets.get(1);
+
+ DecisionTree dt = _trainer.train_tree(learning_set);
+ dt.setID(i-1);
+ forest.add(dt);
+
+ int error = 0;
+ SingleTreeTester t= new SingleTreeTester(dt);
+ if (slog.debug() !=null)
+ slog.debug().log("validation fold_size " +fold_size + "\n");
+ for (int index_i = 0; index_i < fold_size; index_i++) {
+
+ if (slog.warn() !=null)
+ slog.warn().log(" validation index_i " +index_i + (index_i ==fold_size -1?"\n":""));
+ Integer result = t.test(validation_set.getInstance(index_i));
+ if (result == Stats.INCORRECT) {
+ error ++;
+ }
+ }
+ dt.setValidationError(error);
+ dt.calc_num_node_leaves(dt.getRoot());
+
+ if (slog.error() !=null)
+ slog.error().log("The estimate of : "+(i-1)+" training=" +dt.getTrainingError() +" valid=" + error +" num_leaves=" + dt.getRoot().getNumLeaves()+"\n");
+
+ validation_error_estimate += (double)error/(double)k_fold;
+ training_error_estimate += (double)dt.getTrainingError()/(double)k_fold;
+ num_leaves_estimate += (double)dt.getRoot().getNumLeaves()/(double)k_fold;
+
+
+// if (slog.stat() !=null)
+// slog.stat().stat("."+ (i == k_fold?"\n":""));
+
+ }
+ alpha_estimate = (validation_error_estimate - training_error_estimate) /num_leaves_estimate;
+ if (slog.stat() !=null)
+ slog.stat().log(" The estimates: training=" +training_error_estimate +" valid=" + validation_error_estimate +" num_leaves=" + num_leaves_estimate+ " the alpha"+ alpha_estimate+"\n");
+ // TODO how to compute a best tree from the forest
+ }
+
+ private void calc_fold_indices(int num_instances2) {
+ // TODO Auto-generated method stub
+ System.out.println(num_instances2 + " by "+ k_fold);
+ int excess = num_instances2 % k_fold;
+ int fold_index = 0, divide_index = 0;
+ while (fold_index < k_fold) {
+
+ fold_indices[fold_index][VALID_SET_0] = divide_index;
+ int fold_size = getFoldSize(fold_index);
+ fold_indices[fold_index][VALID_SET_1] = fold_indices[fold_index][VALID_SET_0] + fold_size -1;
+
+ System.out.println(fold_indices[fold_index][VALID_SET_0] +" - "+ fold_indices[fold_index][VALID_SET_1]);
+ divide_index+= fold_size;
+ fold_index++;
+ }
+
+ }
+ public ArrayList<InstanceList> getFold(int i) {
+// // first part divide = 0; divide < fold_size*i
+// // the validation set divide = fold_size*i; divide < fold_size*(i+1)-1
+// // last part divide = fold_size*(i+1); divide < N
+ int valid_fold_size = getFoldSize(i);
+ InstanceList learning_set = new InstanceList(class_instances.getSchema(), num_instances - valid_fold_size +1);
+ InstanceList validation_set = new InstanceList(class_instances.getSchema(), valid_fold_size);
+ for (int divide_index = 0; divide_index < num_instances; divide_index++){
+
+ if (slog.info() !=null)
+ slog.info().log("index " +divide_index+ " fold_size" + valid_fold_size + " i "+i+" = from "+fold_indices[i][VALID_SET_0]+" to "+fold_indices[i][VALID_SET_1]+" num_instances "+num_instances+ "\n");
+ if (divide_index >= fold_indices[i][VALID_SET_0] && divide_index <= fold_indices[i][VALID_SET_1]) { // validation
+ // validation [fold_size*i, fold_size*(i+1))
+ if (slog.info() !=null)
+ slog.info().log("validation one " +divide_index+ "\n");
+ validation_set.addAsInstance(class_instances.getInstance(crossed_set[divide_index]));
+ } else { // learninf part
+ learning_set.addAsInstance(class_instances.getInstance(crossed_set[divide_index]));
+ }
+ }
+
+ ArrayList<InstanceList> lists = new ArrayList<InstanceList>(2);
+ lists.add(learning_set);
+ lists.add(validation_set);
+ return lists;
+
+ }
+
+// public ArrayList<InstanceList> getFolds() {
+//// // first part divide = 0; divide < fold_size*i
+//// // the validation set divide = fold_size*i; divide < fold_size*(i+1)-1
+//// // last part divide = fold_size*(i+1); divide < N
+// int fold_size = getFoldSize();
+// InstanceList learning_set = new InstanceList(class_instances.getSchema(), num_instances - fold_size +1);
+// InstanceList validation_set = new InstanceList(class_instances.getSchema(), fold_size);
+// for (int divide_index = 0; divide_index < num_instances; divide_index++){
+// if (divide_index >= fold_size*i && divide_index < fold_size*(i+1)-1) { // validation
+// validation_set.addAsInstance(class_instances.getInstance(crossed_set[divide_index]));
+// } else { // learninf part
+// learning_set.addAsInstance(class_instances.getInstance(crossed_set[divide_index]));
+// }
+// }
+//
+// ArrayList<InstanceList> lists = new ArrayList<InstanceList>(2);
+// lists.add(learning_set);
+// lists.add(validation_set);
+// return lists;
+//
+// }
+
+
+ private int getFoldSize(int i) {
+ int excess = num_instances % k_fold;
+ return (int) num_instances/k_fold + (i < excess? 1:0);
+ }
+ public double getValidationErrorEstimate() {
+ return validation_error_estimate;
+ }
+
+ public ArrayList<DecisionTree> getEstimators() {
+ return forest;
+ }
+
+ public int getEstimatorSize() {
+ return k_fold;
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/CrossValidation.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Entropy.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Entropy.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Entropy.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,205 @@
+package org.drools.learner.eval;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.learner.Domain;
+import org.drools.learner.Instance;
+import org.drools.learner.QuantitativeDomain;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+import org.drools.learner.tools.Util;
+
+public class Entropy implements Heuristic{
+
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(Entropy.class, SimpleLogger.DEFAULT_LEVEL);
+ //public Entropy
+ /*
+ * - chooses the best attribute,
+ * - return the choosen attributes evaluation results (information gain and/or gain ratio)
+ * can process categorical, and quantitative attribute domains
+ *
+ * used by:
+ * c45Alternator, c45Learner, c45Iterator
+ */
+ protected double data_eval;
+ protected InstDistribution insts_by_target;
+ protected ArrayList<Instance> sorted_instances;
+ protected Domain domain;
+
+ public Entropy() {
+ //
+ }
+
+ public void init(InstDistribution _insts_by_target) {
+ insts_by_target = _insts_by_target;
+ data_eval = calc_info(insts_by_target);
+ sorted_instances = null;
+ domain = null;
+ }
+
+
+ public double getEval(Domain attr_domain) {
+ CondClassDistribution insts_by_attr = info_attr(attr_domain);
+ return data_eval - Entropy.calc_info_attr(insts_by_attr);
+ }
+
+ public double getEval_cont(Domain attr_domain) {
+
+ double attribute_eval= 0.0d;
+ QuantitativeDomain trialDomain = QuantitativeDomain.createFromDomain(attr_domain);
+
+ Categorizer visitor = new Categorizer(insts_by_target);
+ visitor.findSplits(trialDomain);
+
+ // trial domain is modified
+ if (trialDomain.getNumIndices() > 1) {
+ CondClassDistribution insts_by_attr = info_contattr(visitor); //.getSortedInstances(), trialDomain);
+ attribute_eval = data_eval - Entropy.calc_info_attr(insts_by_attr);
+ }
+ domain = trialDomain;
+ sorted_instances = visitor.getSortedInstances();
+ return attribute_eval;
+ }
+
+ public double getDataEval() {
+ return data_eval;
+ }
+
+ public Domain getDomain() {
+ return domain;
+ }
+
+ public ArrayList<Instance> getSortedInstances() {
+ return sorted_instances;
+ }
+
+ public double getWorstEval() {
+ return -1000;
+ }
+
+ public CondClassDistribution info_attr(Domain attr_domain) {
+
+ Domain target_domain = insts_by_target.getClassDomain();
+
+ //flog.debug("What is the attributeToSplit? " + attr_domain);
+
+ /* initialize the hashtable */
+ CondClassDistribution insts_by_attr = new CondClassDistribution(attr_domain, target_domain);
+ insts_by_attr.setTotal(insts_by_target.getSum());
+
+ //flog.debug("Cond distribution for "+ attr_domain + " \n"+ insts_by_attr);
+
+ for (int category = 0; category<target_domain.getCategoryCount(); category++) {
+ Object targetCategory = target_domain.getCategory(category);
+
+ for (Instance inst: insts_by_target.getSupportersFor(targetCategory)) {
+ Object inst_attr_category = inst.getAttrValue(attr_domain.getFReferenceName());
+
+ Object inst_class = inst.getAttrValue(target_domain.getFReferenceName());
+
+ if (!targetCategory.equals(inst_class)) {
+ if (flog.error() != null)
+ flog.error().log("How the fuck they are not the same ? "+ targetCategory + " " + inst_class);
+ System.exit(0);
+ }
+ insts_by_attr.change(inst_attr_category, targetCategory, inst.getWeight()); //+1
+
+ }
+ }
+
+ return insts_by_attr;
+ }
+
+
+ /* calculates the information of a quantitative domain given the split indexes of instances
+ * a wrapper for the quantitative domain to be able to calculate the stats
+ * */
+ //public static double info_contattr(InstanceList data, Domain targetDomain, QuantitativeDomain splitDomain) {
+ public CondClassDistribution info_contattr(Categorizer visitor) {
+
+ List<Instance> data = visitor.getSortedInstances();
+ QuantitativeDomain splitDomain = visitor.getSplitDomain();
+ Domain targetDomain = insts_by_target.getClassDomain();
+ String targetAttr = targetDomain.getFReferenceName();
+
+ CondClassDistribution instances_by_attr = new CondClassDistribution(splitDomain, targetDomain);
+ instances_by_attr.setTotal(data.size());
+
+ int index = 0;
+ int split_index = 0;
+ Object attr_key = splitDomain.getCategory(split_index);
+ for (Instance i : data) {
+
+ if (index == splitDomain.getSplit(split_index).getIndex()+1 ) {
+ attr_key = splitDomain.getCategory(split_index+1);
+ split_index++;
+ }
+ Object targetKey = i.getAttrValue(targetAttr);
+ instances_by_attr.change(attr_key, targetKey, i.getWeight()); //+1
+
+ index++;
+ }
+
+ return instances_by_attr;
+// double sum = calc_info_attr(instances_by_attr);
+// return sum;
+
+ }
+
+ /*
+ * for both
+ */
+ public static double calc_info_attr( CondClassDistribution instances_by_attr) {
+ //Collection<Object> attributeValues = instances_by_attr.getAttributes();
+ double data_size = instances_by_attr.getTotal();
+ double sum = 0.0;
+ if (data_size>0)
+ for (int attr_idx=0; attr_idx<instances_by_attr.getNumCondClasses(); attr_idx++) {
+ Object attr_category = instances_by_attr.getCondClass(attr_idx);
+ double total_num_attr = instances_by_attr.getTotal_AttrCategory(attr_category);
+
+ if (total_num_attr > 0) {
+ double prob = total_num_attr / data_size;
+ //flog.debug("{("+total_num_attr +"/"+data_size +":"+prob +")* [");
+ double info = calc_info(instances_by_attr.getDistributionOf(attr_category));
+
+ sum += prob * info;
+ //flog.debug("]} ");
+ }
+ }
+ //flog.debug("\n == "+sum);
+ return sum;
+ }
+
+ /* you can calculate this before */
+ /**
+ * it returns the information value of facts entropy that characterizes the
+ * (im)purity of an arbitrary collection of examples
+ *
+ * @param quantity_by_class the distribution of the instances by the class attribute (target)
+ */
+ public static double calc_info(ClassDistribution quantity_by_class) {
+
+ double data_size = quantity_by_class.getSum();
+
+ double prob, sum = 0;
+ Domain target_domain = quantity_by_class.getClassDomain();
+ if (data_size > 0)
+ for (int category = 0; category<target_domain.getCategoryCount(); category++) {
+
+ Object targetCategory = target_domain.getCategory(category);
+ double num_in_class = quantity_by_class.getVoteFor(targetCategory);
+
+ if (num_in_class > 0) {
+ prob = num_in_class / data_size;
+ /* TODO what if it is a sooo small number ???? */
+ //flog.debug("("+num_in_class+ "/"+data_size+":"+prob+")" +"*"+ Util.log2(prob) + " + ");
+ sum -= prob * Util.log2(prob);
+ }
+ }
+ //flog.debug("= " +sum);
+ return sum;
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Entropy.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Estimator.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Estimator.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Estimator.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,15 @@
+package org.drools.learner.eval;
+
+import java.util.ArrayList;
+
+import org.drools.learner.DecisionTree;
+import org.drools.learner.InstanceList;
+
+public interface Estimator {
+
+ public int getEstimatorSize();
+ public ArrayList<DecisionTree> getEstimators();
+ public ArrayList<InstanceList> getFold(int id);
+
+ public double getValidationErrorEstimate();
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Estimator.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/GainRatio.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/GainRatio.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/GainRatio.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,71 @@
+package org.drools.learner.eval;
+
+import org.drools.learner.Domain;
+import org.drools.learner.QuantitativeDomain;
+import org.drools.learner.tools.Util;
+
+public class GainRatio extends Entropy implements Heuristic{
+
+ public GainRatio() {
+ super();
+ }
+
+
+ public double getEval(Domain attr_domain) {
+ CondClassDistribution insts_by_attr = super.info_attr(attr_domain);
+ double info_gain = super.data_eval - Entropy.calc_info_attr(insts_by_attr);
+
+ double split_info = GainRatio.split_info(insts_by_attr);
+
+ System.err.println("(GainRatio) info_gain = "+ info_gain + "/"+ split_info);
+ return info_gain /split_info;
+ }
+
+ public double getEval_cont(Domain attr_domain) {
+
+ double attribute_eval= 0.0d, split_info = 1.0d;
+ QuantitativeDomain trialDomain = QuantitativeDomain.createFromDomain(attr_domain);
+
+ Categorizer visitor = new Categorizer(insts_by_target);
+ visitor.findSplits(trialDomain);
+
+ // trial domain is modified
+ if (trialDomain.getNumIndices() > 1) {
+ CondClassDistribution insts_by_attr = super.info_contattr(visitor);
+ attribute_eval = super.data_eval - Entropy.calc_info_attr(insts_by_attr);
+
+ split_info = GainRatio.split_info(insts_by_attr);
+ }
+ domain = trialDomain;
+ sorted_instances = visitor.getSortedInstances();
+ return attribute_eval / split_info;
+ }
+
+ private static double split_info( CondClassDistribution instances_by_attr) {
+ //Collection<Object> attributeValues = instances_by_attr.getAttributes();
+ double data_size = instances_by_attr.getTotal();
+ double sum = 1.0;
+ if (data_size>0) {
+ for (int attr_idx = 0; attr_idx < instances_by_attr.getNumCondClasses(); attr_idx++) {
+ Object attr_category = instances_by_attr.getCondClass(attr_idx);
+ double num_in_attr = instances_by_attr.getTotal_AttrCategory(attr_category);
+
+ if (num_in_attr > 0.0) {
+ double prob = num_in_attr / data_size;
+ sum -= prob * Util.log2(prob);
+ }
+ }
+ } else {
+ System.err.println("????? data_size = "+ data_size);
+ System.exit(0);
+ }
+
+ //flog.debug("\n == "+sum);
+ return sum;
+ }
+
+
+
+
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/GainRatio.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/GlobalCategorizer.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/GlobalCategorizer.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/GlobalCategorizer.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,116 @@
+package org.drools.learner.eval;
+
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+
+import org.drools.learner.DecisionTree;
+import org.drools.learner.Domain;
+import org.drools.learner.Instance;
+import org.drools.learner.InstanceList;
+import org.drools.learner.Memory;
+import org.drools.learner.QuantitativeDomain;
+import org.drools.learner.tools.FeatureNotSupported;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.SimpleLogger;
+
+public class GlobalCategorizer {
+
+ private static SimpleLogger flog = LoggerFactory.getUniqueFileLogger(GlobalCategorizer.class, SimpleLogger.DEFAULT_LEVEL);
+ private static SimpleLogger slog = LoggerFactory.getSysOutLogger(GlobalCategorizer.class, SimpleLogger.DEFAULT_LEVEL);
+
+ public GlobalCategorizer(Memory mem) {
+ InstanceList class_instances = mem.getClassInstances();
+
+ if (class_instances.getTargets().size()>1) {
+ //throw new FeatureNotSupported("There is more than 1 target candidates");
+ if (flog.error() !=null)
+ flog.error().log("There is more than 1 target candidates");
+
+ System.exit(0);
+ // TODO put the feature not supported exception || implement it
+ }
+ build(class_instances);
+
+
+ }
+
+ public void build(InstanceList working_instances) {
+
+ Iterator<String> it_target= working_instances.getTargets().iterator();
+ String target = it_target.next();
+
+ DecisionTree dt = new DecisionTree(working_instances.getSchema(), target);
+
+ //flog.debug("Num of attributes: "+ dt.getAttrDomains().size());
+
+ InstDistribution stats_by_class = new InstDistribution(dt.getTargetDomain());
+ stats_by_class.calculateDistribution(working_instances.getInstances());
+ dt.FACTS_READ += working_instances.getSize();//
+
+ categorize(stats_by_class, dt.getAttrDomains());
+ //flog.debug("Result tree\n" + dt);
+ return;// dt;
+ }
+
+ public void categorize(InstDistribution insts_by_target, List<Domain> attr_domains) {
+
+ for (int attr_idx = 0 ; attr_idx< attr_domains.size(); attr_idx++) {
+ Domain attr_domain = attr_domains.get(attr_idx);
+ /* No need to clone the domain as soon as no need to change the domain
+ * All domains are categorical so i will use them the way they are
+ */
+ if (attr_domain.isCategorical()) {
+ // do nothing
+ } else {
+// the continuous domain
+
+ QuantitativeDomain trialDomain = QuantitativeDomain.createFromDomain(attr_domain);
+ Categorizer visitor = new Categorizer(insts_by_target);
+ visitor.findSplits(trialDomain);
+
+// trial domain is modified
+ if (trialDomain.getNumIndices()==1) {
+ } else {
+ }
+
+ InformationContainer categorized_eval = new InformationContainer();
+ categorized_eval.domain = trialDomain;
+ categorized_eval.sorted_data = visitor.getSortedInstances();
+
+
+ Hashtable<Object, InstDistribution> filtered_stats = null;
+ try {
+ filtered_stats = insts_by_target.split(categorized_eval);
+
+ /* need to create a fake domain from trial domain
+ * with possible number of values = trialDomain.trialDomain.getNumIndices();
+ */
+ 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()) {
+ InstDistribution category_dist = filtered_stats.get(category);
+
+ 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.getFReferenceName()+"_fake", category);
+ }
+ }
+
+
+ }
+ attr_domains.add(trialDomain);
+
+ } catch (FeatureNotSupported e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+ }
+ return;
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/GlobalCategorizer.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Heuristic.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Heuristic.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Heuristic.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,31 @@
+package org.drools.learner.eval;
+
+import java.util.ArrayList;
+
+import org.drools.learner.Domain;
+import org.drools.learner.Instance;
+
+
+public interface Heuristic {
+
+ public void init(InstDistribution _insts_by_target);
+
+ public double getEval(Domain attr_domain);
+ public double getEval_cont(Domain attr_domain);
+
+ public Domain getDomain();
+ public ArrayList<Instance> getSortedInstances();
+
+ public double getWorstEval();
+
+// public abstract double info_attr(InstDistribution insts_by_target, Domain attr_domain);
+// public abstract double info_contattr(List<Instance> data, Domain targetDomain, QuantitativeDomain splitDomain);
+//
+// public abstract double calc_info_attr( CondClassDistribution instances_by_attr);
+// public abstract double calc_info(ClassDistribution quantity_by_class);
+
+
+
+
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/Heuristic.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/InformationContainer.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/InformationContainer.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/InformationContainer.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,28 @@
+package org.drools.learner.eval;
+
+import java.util.ArrayList;
+
+import org.drools.learner.Domain;
+import org.drools.learner.Instance;
+
+public class InformationContainer {
+
+ public Domain domain;
+ public double attribute_eval;
+ //public double gain_ratio;
+ public ArrayList<Instance> sorted_data;
+
+ public InformationContainer() {
+ domain = null;
+ attribute_eval = 0.0;
+ sorted_data = null;
+
+ }
+
+// public InformationContainer(Domain _domain, double _attribute_eval, double _gain_ratio) {
+// this.domain = _domain;
+// this.attribute_eval = _attribute_eval;
+// this.gain_ratio = _gain_ratio;
+// }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/InformationContainer.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/InstDistribution.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/InstDistribution.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/InstDistribution.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,189 @@
+package org.drools.learner.eval;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+
+import org.drools.learner.Domain;
+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;
+
+ //private Hashtable<Object, List<Instance>>
+
+ public InstDistribution(Domain targetDomain) {
+ super(targetDomain);
+
+ instance_by_class = new Hashtable<Object, List<Instance>>(targetDomain.getCategoryCount());
+ for (int t=0; t<targetDomain.getCategoryCount(); t++) {
+ Object obj_t = targetDomain.getCategory(t);
+ instance_by_class.put(obj_t, new ArrayList<Instance>());
+ }
+ }
+
+ public void calculateDistribution(List<Instance> instances){
+ double data_size = 0.0;
+ String tName = super.getClassDomain().getFReferenceName();
+ if (slog.debug() != null)
+ slog.debug().log("tName : " +tName + "\n");
+ for (Instance inst : instances) {
+ if (slog.debug() != null)
+ slog.debug().log("inst : " +inst + "\n");
+ data_size += inst.getWeight();
+
+ Object target_key = inst.getAttrValue(tName);
+ super.change(target_key, inst.getWeight()); // add inst.getWeight() vote for the target value of the instance : target_key
+ //super.change(attr_sum, inst.getWeight()); // ?????
+
+ this.addSupporter(target_key, inst);
+ }
+ //super.change(attr_sum, data_size); // TODO should i write special function for changing the sum
+ super.setSum(data_size);
+ }
+
+ public List<Instance> getSupportersFor(Object category) {
+ return instance_by_class.get(category);
+ }
+
+ private void addSupporter(Object target_category, Instance inst) {
+ this.instance_by_class.get(target_category).add(inst);
+ }
+
+
+ private Hashtable<Object, InstDistribution> instantiateLists(Domain splitDomain) {
+ Domain target_domain = super.getClassDomain();
+ Hashtable<Object, InstDistribution> instLists = new Hashtable<Object, InstDistribution>(splitDomain.getCategoryCount());
+ for (int c=0; c<splitDomain.getCategoryCount(); c++) {
+ Object category = splitDomain.getCategory(c);
+ instLists.put(category, new InstDistribution(target_domain));
+ }
+ return instLists;
+ }
+
+ /* spliting during the training for C45TreeIterator */
+ public Hashtable<Object, InstDistribution> split(InformationContainer splitDomainEval) throws FeatureNotSupported {
+ Domain splitDomain = splitDomainEval.domain;
+ Hashtable<Object, InstDistribution> instLists = this.instantiateLists(splitDomain);
+
+ if (splitDomain.isCategorical()) {
+ this.splitFromCategorical(splitDomain, instLists);
+ } else {
+ if (splitDomain instanceof QuantitativeDomain && splitDomainEval.sorted_data != null) {
+ QuantitativeDomain q_splitDomain = (QuantitativeDomain) splitDomain;
+
+
+ //Collections.sort(facts, choosenDomain.factComparator()); /* hack*/
+ this.splitFromQuantitative(splitDomainEval.sorted_data, q_splitDomain, instLists);
+ }
+ else {
+ throw new FeatureNotSupported("Can not split a quatitative domain if it's object type is not QuantitativeDomain "+splitDomain);
+ }
+
+ }
+
+ return instLists;
+ }
+
+
+ public Hashtable<Object, InstDistribution> splitFromCategorical(
+ Domain splitDomain, Hashtable<Object, InstDistribution> instLists) {
+ if (instLists == null)
+ instLists = this.instantiateLists(splitDomain);
+
+ Domain target_domain = super.getClassDomain();
+ String attrName = splitDomain.getFReferenceName();
+ for (int category = 0; category<target_domain.getCategoryCount() ; category++) {
+ Object targetCategory = target_domain.getCategory(category);
+ //this.calculateDistribution(this.getSupportersFor(targetCategory));
+
+ for (Instance inst: this.getSupportersFor(targetCategory)) {
+ Object inst_attr_category = inst.getAttrValue(attrName);
+
+ instLists.get(inst_attr_category).change(targetCategory, inst.getWeight()); // add one for vote for the target value : target_key
+ instLists.get(inst_attr_category).change(attr_sum, inst.getWeight());
+ instLists.get(inst_attr_category).addSupporter(targetCategory, inst);
+
+ }
+ }
+ return instLists;
+ }
+
+ private void splitFromQuantitative(ArrayList<Instance> data,
+ QuantitativeDomain attributeDomain, Hashtable<Object, InstDistribution> instLists) {
+
+ String attributeName = attributeDomain.getFName();
+ String targetName = super.getClassDomain().getFReferenceName();
+
+ //flog.debug("FactProcessor.splitFacts_cont() attr_split "+ attributeName);
+
+
+ int start_point = 0;
+ for (int index = 0; index < attributeDomain.getNumIndices(); index ++) {
+ int integer_index = attributeDomain.getSplit(index).getIndex(); //splits_it.next().intValue();
+
+ Object inst_attr_category = attributeDomain.getSplit(index).getValue(); //splitValues.get(index);
+ //System.out.println("FactProcessor.splitFacts_cont() new category: "+ category);
+
+ try {
+
+ //flog.debug("FactProcessor.splitFacts_cont() new category: "+ inst_attr_category+
+ // " ("+start_point+","+integer_index+")");
+
+ List<Instance> data_at_category = data.subList(start_point, integer_index+1);
+ for (Instance inst: data_at_category) {
+
+ Object targetCategory = inst.getAttrValue(targetName);
+
+ instLists.get(inst_attr_category).change(targetCategory, inst.getWeight()); // add one for vote for the target value : target_key
+ instLists.get(inst_attr_category).change(attr_sum, inst.getWeight());
+ instLists.get(inst_attr_category).addSupporter(targetCategory, inst);
+ }
+ start_point = integer_index+1;
+
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public void missClassifiedInstances(HashSet<Instance> missclassification) {
+ Object winner = super.get_winner_class();
+
+ for (int idx = 0; idx < super.target_attr.getCategoryCount(); idx++) {
+ Object looser = super.target_attr.getCategory(idx);
+ double num_supp = this.getVoteFor(looser);
+
+ if ((num_supp > 0) && !winner.equals(looser)) {
+
+ //System.out.println(Util.ntimes("DANIEL", 2)+ " one looser ? "+looser + " num of sup="+num_supp);
+ //System.out.println(" the num of supporters = "+ stats.getVoteFor(looser));
+ //System.out.println(" but the guys "+ stats.getSupportersFor(looser));
+ //System.out.println("How many bok: "+stats.getSupportersFor(looser).size());
+ missclassification.addAll(getSupportersFor(looser));
+ } else {
+ //System.out.println(Util.ntimes("DANIEL", 5)+ "how many times matching?? not a looser "+ looser );
+ }
+ }
+
+ }
+
+
+
+}
+
+
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/InstDistribution.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/SplitPoint.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/SplitPoint.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/SplitPoint.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,26 @@
+package org.drools.learner.eval;
+
+public class SplitPoint {
+
+ private int index;
+ private Object cut_point;
+ private double info_value;
+
+ public SplitPoint(int _index, Object _point) {
+ this.index = _index;
+ this.cut_point = _point;
+ }
+
+ public Object getValue() {
+ return cut_point;
+ }
+
+ public int getIndex() {
+ return index;
+ }
+
+ public void setInformationValue(double info_sum) {
+ this.info_value = info_sum;
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/eval/SplitPoint.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassAnnotation.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassAnnotation.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassAnnotation.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,8 @@
+package org.drools.learner.tools;
+import java.lang.annotation.*;
+
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target({ElementType.TYPE})
+public @interface ClassAnnotation {
+ String label_element() default "";
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassAnnotation.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassLogger.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassLogger.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassLogger.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,92 @@
+package org.drools.learner.tools;
+
+import java.io.Writer;
+
+public class ClassLogger {
+
+ public static enum LogLevel { NO , STAT, ERROR, WARN, DEBUG, INF0}
+ private static final LogLevel DEFAULT_LEVEL = LogLevel.ERROR;
+
+ /*
+ 4 - info
+ 3 - debug
+ 2 - warning
+ 1 - error
+ 0 - nothing
+ */
+ public LogLevel level = DEFAULT_LEVEL;
+
+ private Class<?> klass;
+ private Writer w;
+
+ public ClassLogger(Class<?> _class, Writer _w) {
+ klass =_class;
+ w= _w;
+ }
+
+ public ClassLogger(Class<?> _class, Writer _w, LogLevel _level) {
+ klass = _class;
+ level = _level;
+ w = _w;
+ }
+
+
+ public void stat(String s) {
+ //if (level.compareTo(LogLevel.STAT) >= 0) {
+ if (level.ordinal() >= LogLevel.STAT.ordinal()) {
+ try {
+ w.write(s);
+ //w.flush();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ public void info(String s) {
+ //if (level.compareTo(LogLevel.INF0) >= 0) {
+ if (level.ordinal() >= LogLevel.INF0.ordinal()) {
+ try {
+ w.write(("[info](" + klass.getSimpleName() + ") " +s));
+ //w.flush();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public void debug(String s) {
+ //if (level.compareTo(LogLevel.DEBUG) >= 0) {
+ if (level.ordinal() >= LogLevel.DEBUG.ordinal()) {
+ try {
+ w.write(("[debug](" + klass.getSimpleName() + ") " +s));
+ //w.flush();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public void warn(String s) {
+ //if (level.compareTo(LogLevel.WARN) >= 0) {
+ if (level.ordinal() >= LogLevel.WARN.ordinal()) {
+ try {
+ w.write(("[warn](" + klass.getSimpleName() + ") " +s));
+ //w.flush();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public void error(String s) {
+ //if (level.compareTo(LogLevel.ERROR) >= 0) {
+ if (level.ordinal() >= LogLevel.ERROR.ordinal()) {
+ try {
+ w.write(("[error](" + klass.getSimpleName() + ") " +s));
+ //w.flush();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassLogger.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassStructure.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassStructure.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassStructure.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,76 @@
+package org.drools.learner.tools;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+
+import org.drools.learner.builder.Learner.DataType;
+
+public class ClassStructure {
+ private Class<?> klass, parent_klass;
+
+ private ArrayList<Method> methods;
+
+// private ArrayList<Field> fields;
+// private ArrayList<DataType> field_types;
+ private HashMap<Field, DataType> field_structure;
+
+ private boolean done;
+
+ public ClassStructure(Class<?> _klass) {
+ klass = _klass;
+ done = false;
+ field_structure = new HashMap<Field, DataType>();
+ methods = new ArrayList<Method>();
+ }
+
+
+ public void setDone() {
+ done = true;
+ }
+ public boolean isDone() {
+ return done;
+ }
+
+
+ public void addField(Field f, DataType type) {
+// fields.add(f);
+// field_types.add(type);
+ field_structure.put(f, type);
+ }
+
+ public Collection<Field> getFields() {
+ //return fields.iterator();
+ return field_structure.keySet();
+ }
+
+ public DataType getFieldType(Field f) {
+ return field_structure.get(f);
+ }
+ public boolean hasLabel() {
+ return methods.size()>0;
+ }
+ public Collection<Method> getMethods() {
+ return methods;
+ }
+ public void addMethod(Method m) {
+ methods.add(m);
+ }
+ public Class<?> getOwnerClass() {
+ return klass;
+ }
+
+ public Class<?> getParent() {
+ return parent_klass;
+ }
+
+ public void setParent(Class<?> parent) {
+ parent_klass = parent;
+ }
+
+
+
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassStructure.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassVisitor.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassVisitor.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassVisitor.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,248 @@
+package org.drools.learner.tools;
+
+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.ClassFieldAccessorCache;
+import org.drools.learner.Domain;
+import org.drools.learner.Schema;
+import org.drools.learner.builder.Learner;
+import org.drools.learner.builder.Learner.DataType;
+import org.drools.learner.builder.Learner.DomainAlgo;
+//import org.drools.spi.Extractor;ReadAccessor
+import org.drools.spi.ReadAccessor;
+
+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 static ClassFieldAccessorCache cache = ClassFieldAccessorCache.getInstance();
+
+ private DomainAlgo domain_type = Learner.DEFAULT_DOMAIN;
+ private DataType data_type = Learner.DEFAULT_DATA;
+
+ private Schema class_schema;
+ private Stack<Field> class_relation;
+
+ private boolean TARGET_FOUND;
+ private boolean MULTIPLE_TARGETS = false;
+
+
+ public ClassVisitor (DomainAlgo _domain_type, DataType _data_type) {
+ domain_type = _domain_type;
+ data_type = _data_type;
+
+ }
+
+ public ClassVisitor (Schema _class_schema, DomainAlgo _domain_type, DataType _data_type) {
+ domain_type = _domain_type;
+ data_type = _data_type;
+
+ this.class_schema = _class_schema;
+ }
+
+ public void visit() throws FeatureNotSupported {
+// this.all_klasses = new HashMap<Class<?>,ClassStructure>();
+ TARGET_FOUND = false;
+ class_relation = new Stack<Field>();
+ getStructuredSuperFields(class_schema.getObjectClass()/*, null*/);
+
+ return;
+ }
+
+ public HashMap<Class<?>,ClassStructure> getStructure() {
+ return class_schema.getClassStructure();
+ }
+
+ 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) {
+ 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/*, Class<?> owner_clazz*/) throws FeatureNotSupported {
+
+// if (slog.warn() != null)
+// slog.warn().log("!!!!!!!!!The field "+f+" " +f.getName()+ "\n");
+ // can get the field annotation
+ // if it is ignored do not do anything
+ FieldAnnotation f_spec = Util.getFieldAnnotations(f);
+ boolean skip_by_annotation = false;
+ if (f_spec != null) {
+ // the type of the fields that cannot be processed
+ if (!f_spec.ignore() && f.getType() == String.class && !f_spec.discrete()) {
+ throw new FeatureNotSupported("String categorization not supported");
+ }
+ switch (domain_type) {
+ case CATEGORICAL: //ID3 can work only with categorical types
+ if (f_spec.ignore() || !f_spec.discrete())
+ skip_by_annotation = true;
+ break;
+ case QUANTITATIVE: // C45 can work with categorical || quantitative domain
+ if (f_spec.ignore())
+ skip_by_annotation = true;
+ break;
+ default:
+ if (f_spec.ignore())
+ skip_by_annotation = true;
+ }
+ // only if the annotations are given and the flag to ignore is set true
+ // 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();
+ 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
+ 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 {
+ ReadAccessor f_extractor;
+// if (f_name.startsWith("get")) {//TODO check
+// System.out.println(f_name.substring(3));
+// f_extractor = cache.getAccessor( _obj_klass, f_name.substring(3) , _obj_klass.getClassLoader() );
+// } else
+ f_extractor = cache.getAccessor( _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");
+ }
+ } 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");
+ }
+ }
+ return;
+ }
+
+ public void processClassLabel(ClassStructure clazz_structure) {
+
+ Class<?> clazz = clazz_structure.getOwnerClass();
+ /* Apperantly the getAnnotation function recurse on the superclasses
+ * so use the getDeclaredAnnotations() not to recurse
+ */
+ ClassAnnotation class_label = Util.getDecClassAnnotations(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 java function "getMethod()" recurses 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);
+ if (Util.isSimpleType(m.getReturnType())) {
+ String mName = class_label.label_element();
+// if (mName.startsWith("get")) {//TODO check??
+// mName = mName..toLowerCase();
+// }
+ System.out.println(mName);
+ String f_refName = Util.getFReference(clazz, mName); // class.name + "@" + label
+ Domain fieldDomain = new Domain(clazz, mName, m.getReturnType());
+ fieldDomain.setArtificial(true);
+ Class<?> method_class = m.getReturnType();
+
+ Util.processDomain(fieldDomain, method_class);
+ clazz_structure.addMethod(m);
+ class_schema.putDomain(f_refName, fieldDomain);
+
+ ReadAccessor m_extractor = new PseudoFieldExtractor(clazz, m);
+ //cache.getExtractor( clazz, lab.label_element(), clazz.getClassLoader() );
+ class_schema.putExtractor(f_refName, m_extractor);
+ if (!MULTIPLE_TARGETS)
+ class_schema.clearTargets();
+ class_schema.addTarget(f_refName);
+ TARGET_FOUND = true;
+ if (slog.warn() != null)
+ slog.warn().log("!!!!!:processClassLabel: TARGET FOUND "+f_refName+" "+class_label.label_element() + ")\n");
+
+ //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();
+ }
+ }
+ }
+
+ public boolean isTargetFound() {
+ // TODO Auto-generated method stub
+ return TARGET_FOUND;
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ClassVisitor.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/FeatureNotSupported.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/FeatureNotSupported.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/FeatureNotSupported.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,14 @@
+package org.drools.learner.tools;
+
+public class FeatureNotSupported extends Exception {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public FeatureNotSupported(String string) {
+ super(string);
+ }
+
+}
\ No newline at end of file
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/FeatureNotSupported.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/FieldAnnotation.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/FieldAnnotation.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/FieldAnnotation.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,13 @@
+package org.drools.learner.tools;
+
+import java.lang.annotation.*;
+
+ at Retention(RetentionPolicy.RUNTIME)
+ at Target({ElementType.METHOD, ElementType.FIELD})
+public @interface FieldAnnotation {
+ int readingSeq() default 0;
+ boolean ignore() default false;
+ boolean target() default false;
+ boolean discrete() default true;
+ String[] values() default {"bok"};
+}
\ No newline at end of file
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/FieldAnnotation.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/LogMethod.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/LogMethod.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/LogMethod.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,7 @@
+package org.drools.learner.tools;
+
+import java.io.Writer;
+
+public interface LogMethod {
+ void log(Object o, Writer w);
+}
\ No newline at end of file
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/LogMethod.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/Logger.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/Logger.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/Logger.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,71 @@
+package org.drools.learner.tools;
+
+import java.io.Writer;
+
+
+public class Logger {
+ public static enum LogLevel_ { NULL, STAT, ERROR, WARN, DEBUG, INFO; }
+
+ private static NullLogMethod null_log = new NullLogMethod();
+
+ private Writer writer;
+ private Class<?> klass;
+ private LogMethod stat_m = null_log, error_m = null_log, warn_m = null_log,
+ debug_m = null_log, info_m = null_log ;
+
+ public Logger(Class<?> _class, Writer w) {
+ klass = _class;
+ writer = w;
+ }
+ public void setVerbosity(LogLevel_ lvl) {
+// switch (lvl) {
+// case INFO:
+// info_m = new SimpleLogMethod();;
+// case DEBUG:
+// debug_m = new SimpleLogMethod();
+// case WARN:
+// warn_m = new SimpleLogMethod();
+// case ERROR:
+// error_m = new SimpleLogMethod();
+// case STAT:
+// stat_m = new SimpleLogMethod();
+// case NULL:
+// }
+ }
+
+ public void stat(Object o) {
+ stat_m.log(o, writer);//"[stat](" + klass.getSimpleName() + ") " +
+ }
+
+ public void error(Object o) {
+ error_m.log("[error](" + klass.getSimpleName() + ") " + o, writer);
+ }
+
+ public void warn(Object o) {
+ warn_m.log("[warn](" + klass.getSimpleName() + ") " + o, writer);
+ }
+
+ public void debug(Object o) {
+ debug_m.log("[debug](" + klass.getSimpleName() + ") " + o, writer);
+ }
+
+ public void info(Object o) {
+ info_m.log("[info](" + klass.getSimpleName() + ") " + o, writer);
+ }
+}
+
+
+class NullLogMethod implements LogMethod {
+ public void log(Object o, Writer w) {}
+}
+
+//class SimpleLogMethod implements LogMethod {
+// public void log(Object o, Writer w) {
+// try {
+// w.write(o.toString());
+// w.flush();
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+// }
+//}
\ No newline at end of file
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/Logger.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/LoggerFactory.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/LoggerFactory.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/LoggerFactory.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,129 @@
+package org.drools.learner.tools;
+
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.HashMap;
+
+public class LoggerFactory {
+
+ private static StringWriter str_writer = new StringWriter();
+ private static BufferedWriter buffer = new BufferedWriter(str_writer);
+ private static HashMap<Class<?>, SimpleLogger> fileLoggers = new HashMap<Class<?>, SimpleLogger>();
+
+ public static SimpleLogger getUniqueFileLogger(Class<?> klass, int level) {
+ SimpleLogger sl = fileLoggers.get(klass);
+ if (sl == null) {
+ sl = new SimpleLogger(level, new WriterLogger(klass, buffer));
+ fileLoggers.put(klass, sl);
+ }
+ return sl;
+ }
+
+ public static SimpleLogger getSysOutLogger(Class<?> klass, int level) {
+ return new SimpleLogger(level, new SysOutLogger(klass));
+ }
+
+ public static SimpleLogger getFileLogger(Class<?> klass, int level, String fname) {
+ FileWriter file;
+ try {
+ file = new FileWriter("log/"+fname);
+ return new SimpleLogger(level, new WriterLogger(klass, file));
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static void dump_buffer(String file_sign, String directory) {
+ // TODO Auto-generated method stub
+
+ int last_slash = file_sign.lastIndexOf('/');
+ String file_name = file_sign.substring(0, last_slash+1) + directory+file_sign.substring(last_slash)+"."+directory;
+ System.out.println("file "+ file_name+ " logged ");
+
+
+ PrintWriter writer;
+ try {
+ writer = new PrintWriter (new BufferedWriter (new FileWriter (file_name)));
+ buffer.flush();
+// System.out.println("LOG1: "+ str_writer.getBuffer());
+// System.out.println("LOG2: "+ str_writer.getBuffer().toString());
+
+ writer.write(str_writer.getBuffer().toString()); //str_buffer.getBuffer());
+ str_writer.close();
+ buffer.close();
+ writer.flush();
+ // Close the BufferedWriter object and the underlying
+ // StringWriter object.
+ writer.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+
+}
+
+class SysOutLogger implements LoggerInterface {
+ private Class<?> klass;
+ private String msg;
+ public SysOutLogger(Class<?> _klass) {
+ klass = _klass;
+ }
+
+ public void setMsg(String _msg) {
+ msg = _msg;
+ }
+ public void stat(String s) {
+ System.out.print(s);
+ }
+ public void log(String s) {
+ System.out.print("["+msg + "] ("+klass.getSimpleName()+ ") "+ s);
+ }
+ public SysOutLogger clone() {
+ // TODO Auto-generated method stub
+ return new SysOutLogger(klass);
+ }
+}
+
+class WriterLogger implements LoggerInterface {
+ private Writer writer;
+ private Class<?> klass;
+ private String msg;
+ public WriterLogger(Class<?> _klass, Writer w) {
+ writer = w;
+ klass = _klass;
+ }
+ public void stat(String s) {
+ try {
+ writer.write(s);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void log(String s) {
+ try {
+ writer.write("["+msg + "] ("+klass.getSimpleName()+ ") "+ s);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setMsg(String s) {
+ msg = s;
+
+ }
+ @Override
+ public WriterLogger clone() {
+ // TODO Auto-generated method stub
+ return new WriterLogger(klass, writer);
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/LoggerFactory.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/LoggerInterface.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/LoggerInterface.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/LoggerInterface.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,10 @@
+package org.drools.learner.tools;
+
+public interface LoggerInterface {
+ void log(String s);
+ void stat(String s);
+
+ void setMsg(String s) ;
+
+ LoggerInterface clone();
+}
\ No newline at end of file
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/LoggerInterface.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/NumberComparator.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/NumberComparator.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/NumberComparator.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,17 @@
+package org.drools.learner.tools;
+
+import java.util.Comparator;
+
+public class NumberComparator implements Comparator<Number> {
+ public NumberComparator() {
+ }
+
+ public int compare(Number n0, Number n1) {
+ if (n0.doubleValue() < n1.doubleValue())
+ return -1;
+ else if (n0.doubleValue() > n1.doubleValue())
+ return 1;
+ else
+ return 0;
+ }
+}
\ No newline at end of file
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/NumberComparator.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ObjectFactory.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ObjectFactory.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ObjectFactory.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,258 @@
+package org.drools.learner.tools;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
+
+public class ObjectFactory {
+
+// public static List<Object> getObjectsFromFile(Class<?> clazz, String filename, String separator) {
+//
+// ObjectFactory class_factory = new ObjectFactory(clazz);
+// List<Object> new_objects = fromFileAsObject(filename, separator);
+//
+// }
+ public static List<Object> getObjects(Class<?> obj_class, String filename) {
+ ObjectFactory class_factory = new ObjectFactory(obj_class);
+ try {
+ //return class_factory.fromFileAsObject("src/main/java/org/drools"+filename, ",");
+ return class_factory.fromFileAsObject(filename, ",");
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ private Class<?> obj_clazz;
+ private ArrayList<Field> clazz_fields;
+ private HashMap<String,Integer> field_sequences;
+
+ private ObjectFactory (Class<?> clazz) {
+ this.obj_clazz = clazz;
+ this.clazz_fields = new ArrayList<Field>();
+ Util.getSuperFields(clazz, clazz_fields);
+
+ this.field_sequences = getFieldReadingSeqs(clazz, clazz_fields);
+ }
+
+ public List<Object> fromFileAsObject(String filename, String separator)
+ throws Exception
+ {
+
+ List<Object> obj_read = new ArrayList<Object>();
+
+ /**/
+ File file =new File(filename);
+ if(!file.exists()){
+ System.out.println("where is the file ? "+ filename);
+ //System.exit(0);
+
+ file =new File("src/main/java/org/drools/examples/learner/"+filename);
+ if(!file.exists()){
+ file =new File("drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/"+filename);
+
+ System.out.println("where is still the file ? "+ file);
+ if(!file.exists()){
+ System.out.println("where is still still the file ? "+ file);
+ System.exit(0);
+ }
+ }
+ }
+
+ BufferedReader reader = new BufferedReader(new FileReader(file));
+ /**/
+
+// BufferedReader reader = new BufferedReader(new InputStreamReader(
+// this.obj_clazz.getResourceAsStream(filename)));// "../data/"
+ String line;
+ while ((line = reader.readLine()) != null) {
+ line = line.trim();
+ if (line.length() == 0)
+ break;
+ Object element = this.read(line, separator);
+ //System.out.println("New object "+ element);
+ obj_read.add(element);
+
+ }
+ return obj_read;
+ }
+
+ private Object read(String data, String separator) throws Exception {
+ Object element = null;
+
+ try {
+ element = this.obj_clazz.newInstance();
+
+
+ if (data.endsWith("."))
+ data = data.substring(0, data.length() - 1);
+ List<String> fieldValues = Arrays.asList(data.split(separator));
+
+
+ Method[] element_methods = this.obj_clazz.getDeclaredMethods();
+
+ for (Method m : element_methods) {
+ String m_name = m.getName();
+ Class<?>[] param_type_name = m.getParameterTypes();
+ 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
+ */
+ Field f = null;
+ for (Field _f: this.clazz_fields) {
+ 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());
+ try {
+ m.invoke(element, fieldValue);
+ } catch (IllegalArgumentException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ System.out.println("invoking the method of the element e:"+element + " v:"+ fieldValue);
+
+ e.printStackTrace();
+ }
+
+
+ }
+ }
+ }
+
+ /*
+ for (Field f: element_fields) {
+ String f_name = f.getName();
+
+ String fieldString = fieldValues.get(fieldSequences.get(f_name));
+ Object fieldValue = readString(f, fieldString);
+
+ ClassFieldExtractor f_extractor = cache.getExtractor( clazz, f_name, clazz.getClassLoader() );
+// f_extractor.
+
+ }*/
+ } catch (InstantiationException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return element;
+ }
+
+
+ private static HashMap<String,Integer> getFieldReadingSeqs(Class<? extends Object> classObj, ArrayList<Field> element_fields) {
+
+ HashMap<String,Integer> readingSeqs = new HashMap<String,Integer>(element_fields.size()) ;
+ for( Field f: element_fields) {
+ String f_name = f.getName();
+
+ Annotation[] annotations = f.getAnnotations();
+ FieldAnnotation spec = null;
+ for (Annotation a : annotations) {
+ if (a instanceof FieldAnnotation) {
+ spec = (FieldAnnotation)a; // here it is !!!
+ readingSeqs.put(f_name, spec.readingSeq());
+ break;
+ }
+ }
+ }
+ return readingSeqs;
+ }
+
+ private static Object readString(Field f, String text) {
+
+ Class<?> type_name = f.getType();
+ if (type_name.isPrimitive()) { //boolean, byte, char, short, int, long, float, and double.
+ if (type_name == Boolean.TYPE) {
+ return readBooleanFromString(text);
+ } else if (type_name == Integer.TYPE) {
+ return readIntegerFromString(text);
+ } else if (type_name == Short.TYPE) {
+ return readShortFromString(text);
+ } else if (type_name == Long.TYPE) {
+ return readLongFromString(text);
+ } else if (type_name == Double.TYPE) {
+ return readDoubleFromString(text);
+ } else if (type_name == Float.TYPE) {
+ return readFloatFromString(text);
+ } else {
+ System.out.print("ObjectFactory.readString(field, text) primitive type "+type_name);
+ return null;
+ }
+ } else if (type_name.isAssignableFrom(String.class)) {
+ return text.trim();
+ } else if (type_name.isAssignableFrom(Boolean.class)) {
+ return readBooleanFromString(text);
+ } else if (type_name.isAssignableFrom(Integer.class)) {
+ return readIntegerFromString(text);
+ } else if (type_name.isAssignableFrom(Short.class)) {
+ return readShortFromString(text);
+ } else if (type_name.isAssignableFrom(Long.class)) {
+ return readLongFromString(text);
+ } else if (type_name.isAssignableFrom(Double.class)) {
+ return readDoubleFromString(text);
+ } else if (type_name.isAssignableFrom(Float.class)) {
+ return readFloatFromString(text);
+ } else {
+ System.out.print("ObjectFactory.readString(field, text) object type "+type_name);
+ return null;
+ }
+
+ }
+
+
+ private static Object readBooleanFromString(String data) {
+ //System.out.print("What is the data : "+ data);
+ if (data.trim().equalsIgnoreCase("true"))
+ return Boolean.TRUE;
+ else if ((data.trim().equalsIgnoreCase("false")))
+ return Boolean.FALSE;
+ else if (data.trim().equalsIgnoreCase("1"))
+ return Boolean.TRUE;
+ else if (data.trim().equalsIgnoreCase("0"))
+ return Boolean.FALSE;
+ else
+ return Boolean.parseBoolean(data);
+ }
+
+ private static Object readIntegerFromString(String data) {
+ return Integer.parseInt(data);
+ }
+ private static Object readShortFromString(String data) {
+ return Short.parseShort(data);
+ }
+ private static Object readLongFromString(String data) {
+ return Long.parseLong(data);
+ }
+ private static Object readFloatFromString(String data) {
+ return Float.parseFloat(data);
+ }
+
+ private static Object readDoubleFromString(String data) {
+ return Double.parseDouble(data);
+ }
+
+
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/ObjectFactory.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/PseudoFieldExtractor.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/PseudoFieldExtractor.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/PseudoFieldExtractor.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,126 @@
+package org.drools.learner.tools;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import org.drools.base.ValueType;
+import org.drools.spi.ReadAccessor;
+
+public class PseudoFieldExtractor implements ReadAccessor{
+
+ //private String methodName;
+ private Method method;
+ //private Class clazz;
+
+ public PseudoFieldExtractor(Class<?> _clazz, Method m) {
+ super();
+ method = m;
+ //clazz = _clazz;
+ }
+
+ public boolean getBooleanValue(Object object) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public byte getByteValue(Object object) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public char getCharValue(Object object) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public double getDoubleValue(Object object) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public Class<?> getExtractToClass() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String getExtractToClassName() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public float getFloatValue(Object object) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public int getHashCode(Object object) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public int getIndex() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public int getIntValue(Object object) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public long getLongValue(Object object) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public Method getNativeReadMethod() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public short getShortValue(Object object) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ /* DONT FORGET THAT */
+ public Object getValue(Object object) {
+ try {
+ return method.invoke(object, null);
+ } catch (IllegalArgumentException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public ValueType getValueType() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public boolean isNullValue(Object object) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public void readExternal(ObjectInput in) throws IOException,
+ ClassNotFoundException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ // TODO Auto-generated method stub
+
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/PseudoFieldExtractor.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/RulePrinter.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/RulePrinter.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/RulePrinter.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,641 @@
+package org.drools.learner.tools;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+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 org.drools.learner.DecisionTree;
+import org.drools.learner.DecisionTreeVisitor;
+import org.drools.learner.LeafNode;
+import org.drools.learner.NodeValue;
+import org.drools.learner.Path;
+
+public class RulePrinter {
+
+ 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.print(learned_dt, Util.SORT_RULES_BY_RANK);
+
+ String all_rules = my_printer.write2string();
+ if (Util.PRINT_RULES) {
+ //my_printer.write2file("examples", "src/rules/examples/" + file);
+ my_printer.write2File(all_rules, false, Util.DRL_DIRECTORY+learned_dt.getSignature());
+ }
+
+ return new StringReader(all_rules);
+ }
+
+ private Class<?> rule_clazz;
+
+ private DecisionTreeVisitor visitor;
+ private ArrayList<Rule> rules;
+
+ private int bound_on_num_rules;
+ private double num_instances;
+
+ private HashMap<String, ArrayList<Field>> attrRelations;
+ private HashMap<String, Class<?>> importList; // TODO init
+
+ //private NumberComparator nComparator;
+
+ public RulePrinter() {
+// /* most important */
+// this.nodes = new Stack<NodeValue>();
+
+ this.visitor = new DecisionTreeVisitor();
+
+ this.rules = new ArrayList<Rule>();
+ //ruleText = new ArrayList<String>();
+
+ this.bound_on_num_rules = -1;
+ this.num_instances = -1.0d;
+ }
+
+ public Class<?> getRuleClass() {
+ return rule_clazz;
+ }
+
+ public int getBoundOnNumRules() {
+ return bound_on_num_rules;
+ }
+
+ public void setBoundOnNumRules(int max_num_rules) {
+ this.bound_on_num_rules = max_num_rules;
+ }
+
+ public double getNumInstances() {
+ return this.num_instances;
+ }
+
+ public void setNumInstances(int num) {
+ this.num_instances = num;
+ }
+
+ public void print(DecisionTree dt, boolean sort) {//, PrintStream object
+ this.rule_clazz = dt.getObjClass();
+ this.attrRelations = dt.getAttrRelationMap();
+ this.importList = new HashMap<String, Class<?>>();
+ this.num_instances = dt.getRoot().getNumMatch();
+
+ visitor.visit(dt);
+
+ for (Path p: visitor.getPathList()) {
+ Rule newRule = createRule(p);
+ newRule.setId(rules.size());
+ rules.add(newRule);
+ }
+
+ if (sort)
+ Collections.sort(rules, Rule.getRankComparator());
+ }
+
+ private Rule createRule(Path p) {
+ //, Stack<NodeValue> leaves // if more than one leaf
+ Rule newRule = new Rule(this.getRuleClass());// (nodes, leaves) //if more than one leaf
+
+ Iterator<NodeValue> it = p.getConditionIterator();
+ 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()) {
+ 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 { }
+ }
+ NodeValue action_node = p.getAction();
+ ArrayList<Field> nodeRelations = attrRelations.get(action_node.getFReference());
+ if (nodeRelations == null || nodeRelations.isEmpty()) {
+ // this a direct child add to reference to the main guy
+ newRule.addActionToMain(action_node);
+ } else {
+ newRule.processNodeValue(action_node, nodeRelations, 0, 2); //int condition_or_action = action = 2
+ }
+ return newRule;
+ }
+
+ public void write2File(String toWrite, boolean append, String fileSignature) {//DomainType domain_type, int tree_set
+
+ //String drlFileName =
+ if (!fileSignature.endsWith(".drl"))
+ fileSignature += ".drl";
+ System.out.println("file:"+ fileSignature);
+ File file =new File(fileSignature);
+ if (append)
+ {
+ if(!file.exists())
+ //flog.warn("File doesnot exit, creating...");
+ try {
+ BufferedWriter out = new BufferedWriter(new FileWriter(fileSignature, true));
+ out.write(toWrite);
+ out.close();
+ //System.out.println("I wrote "+ toWrite);
+ } catch (IOException e) {
+ //flog.error("No I couldnot append to the file e:"+ e);
+ /* TODO */
+ }
+
+ } else {
+ if(file.exists()&& (file.length()>0)) {
+ file.delete();
+ //flog.warn("File exits, deleting...");
+ }
+ try {
+ BufferedWriter out = new BufferedWriter(new FileWriter(fileSignature));
+ out.write(toWrite);
+ out.close();
+ } catch (IOException e) {
+ //flog.error("No I couldnot create the file e:"+ e);
+ /* TODO */
+ }
+ }
+ }
+
+ public String write2string(){//String packageName) {
+ StringBuffer introBuffer = new StringBuffer();
+ StringBuffer bodyBuffer = new StringBuffer();
+
+ String packageName = this.getRuleClass().getPackage().getName();
+
+ //log.debug("Package name: "+ packageName);
+
+ if (packageName != null)
+ introBuffer.append("package " + packageName +";\n\n");
+ else {
+ //TODO throw exception
+ //flog.error("RulePrinter write2string packageName="+packageName);
+ }
+
+ int total_num_facts=0;
+ int i = 0, active_i = 0;
+ for( Rule rule: rules) {
+ i++;
+ //flog.debug("Rule: "+ i);
+ if (Util.ONLY_ACTIVE_RULES) {
+ if (rule.getRank() >= 0) {
+ active_i++;
+ bodyBuffer.append(rule.toString());
+ bodyBuffer.append("\n");
+
+ introBuffer.append(getImports(rule.getDeclarationIt()));
+ }
+
+ } else {
+ if (rule.getRank() >= 0) {
+ active_i++;
+ }
+ bodyBuffer.append(rule.toString());
+ bodyBuffer.append("\n");
+ introBuffer.append(getImports(rule.getDeclarationIt()));
+ }
+ total_num_facts += rule.getNumClassifiedInstances();
+ if (this.getBoundOnNumRules()>0 && i >= this.getBoundOnNumRules())
+ break;
+ }
+ bodyBuffer.append("//THE END: Total number of facts correctly classified= "+ total_num_facts + " over "+ this.getNumInstances());
+ bodyBuffer.append("\n//with " + active_i + " number of rules over "+i+" total number of rules ");
+ bodyBuffer.append("\n"); // EOF
+
+
+ StringBuffer outputBuffer = new StringBuffer();
+ outputBuffer.append(introBuffer);
+ outputBuffer.append("\n");
+ outputBuffer.append(bodyBuffer);
+ return outputBuffer.toString();
+ }
+
+ private StringBuffer getImports(Iterator<Declaration> declarationIt) {
+ StringBuffer importBuffer = new StringBuffer();
+ while (declarationIt.hasNext()) {
+ Declaration dec = declarationIt.next();
+ String name = dec.getDeclaringTypeName();
+ if (!importList.containsKey(name)) {
+ importList.put(name, dec.getDeclaringType());
+ //String import_name = dec.getDeclaringType().getName().replaceAll("$", ".");
+ String import_name = dec.getDeclaringType().getName().replace('$', '.');
+ importBuffer.append("import "+ import_name);
+ importBuffer.append("\n");
+ }
+ }
+ return importBuffer;
+ }
+}
+
+class Rule {
+
+ 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) {
+ 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);
+ }
+
+ public Iterator<Declaration> getDeclarationIt() {
+ return rule_decs.iterator();
+ }
+
+ public void addConditionToMain(NodeValue current) {
+ rule_decs.get(main_obj_id).addCondition(current);
+ }
+
+ 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 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 String getObjectClassName() {
+ return main_obj.getSimpleName();
+ }
+
+ private int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id= id;
+ }
+
+ private void setNumClassifiedInstances(double dataSize) {
+ this.num_classified_instances = dataSize;
+ }
+ public double getNumClassifiedInstances() {
+ return this.num_classified_instances;
+ }
+
+ public void setRank(double r) {
+ this.rank = r;
+ }
+ public double getRank() {
+ return this.rank;
+ }
+
+ 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
+
+ // 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("");
+
+ sb_out.append("\t when");
+ 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.getDeclaringTypeName()+"("+ "");
+ 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(")");
+ }
+ sb_out.append("\n");
+ StringBuffer sb_action = new StringBuffer("");
+ StringBuffer sb_field = new StringBuffer("");
+ StringBuffer sb_expected_value = new StringBuffer("");
+ for (AttrReference act: actions) {
+ sb_action.append(act.getValue() + " , ");
+ sb_expected_value.append(act.getVariableName());
+ sb_field.append(act.getFName() + "");
+
+ }
+ sb_action.delete(sb_action.length()-3, sb_action.length()-1);
+
+ 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();
+ }
+
+ private static class RuleComparator implements Comparator<Rule>{
+ // this will sort from best rank to least rank
+ public int compare(Rule r1, Rule r2) {
+ if (r1.getRank() < r2.getRank())
+ return 1; // normally -1
+ else if (r1.getRank() > r2.getRank())
+ return -1; // normally 1
+ else
+ return 0;
+ }
+ }
+
+}
+
+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 Class<?> getDeclaringType() {
+ return declared_obj;
+ }
+ public String getDeclaringTypeName() {
+ return declared_obj.getSimpleName();
+ }
+
+ public void addCondition(NodeValue current) {
+ /* TODO check do u need to copy the node value
+ NodeValue nv = new NodeValue(current.getNode());
+ nv.setNodeValue(current.getNodeValue());
+ conditions.add(nv);
+ /**/
+ conditions.add(current);
+ }
+
+ 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;
+ /* TODO is the copying really necessary?
+ real_value = new NodeValue(v.getNode());
+ real_value.setNodeValue(v.getNodeValue());
+ */
+ real_value = v;
+ }
+ public Object getVariableName() {
+ return "$target_label";
+ }
+ public Object getValue() {
+ return real_value.getValue();
+ }
+ public String getFName() {
+ return fName;
+ }
+
+ public String toString() {
+ return getVariableName()+" : "+ fName ;
+ }
+}
+
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/RulePrinter.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/SimpleLogger.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/SimpleLogger.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/SimpleLogger.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,62 @@
+package org.drools.learner.tools;
+
+
+public class SimpleLogger {
+
+ public static final int STAT = 0;
+ public static final int ERROR = 1;
+ public static final int WARN = 2;
+ public static final int DEBUG = 3;
+ public static final int INFO = 4;
+
+ public static final int DEFAULT_LEVEL = ERROR;
+
+ public static String[] msgs = {"stat","error", "warn", "debug", "info"};
+
+ public static final int LAST = INFO;
+
+ public LoggerInterface[] loggers = new LoggerInterface[LAST+1];
+
+ public SimpleLogger() {
+
+ for (int i = 0; i <= LAST; ++i) {
+ loggers[i] = null;
+ }
+ }
+
+ public SimpleLogger(int _lvl, LoggerInterface _logint) {
+ for (int i = 0; i <= LAST; ++i) {
+ if (i > _lvl)
+ loggers[i] = null;
+ else {
+ loggers[i] = _logint.clone();
+ loggers[i].setMsg(msgs[i]);
+ }
+ }
+ }
+
+ public final LoggerInterface get(int _index) {
+ return loggers[_index];
+ }
+
+ public final LoggerInterface stat() {
+ return loggers[STAT];
+ }
+
+ public final LoggerInterface error() {
+ return loggers[ERROR];
+ }
+
+ public final LoggerInterface warn() {
+ return loggers[WARN];
+ }
+
+ public final LoggerInterface debug() {
+ return loggers[DEBUG];
+ }
+
+ public final LoggerInterface info() {
+ return loggers[INFO];
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/SimpleLogger.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/Util.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/Util.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/Util.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,352 @@
+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;
+ public static final String DRL_DIRECTORY = "src/main/rules/";
+ /*
+ public static final boolean DEBUG = false;
+ public static final boolean DEBUG_TEST = false;
+ public static final boolean DEBUG_RULE_PRINTER = false;
+ public static final boolean DEBUG_LEARNER = false;
+ public static final boolean DEBUG_CATEGORIZER = false;
+ public static final boolean DEBUG_ENTROPY = false;
+ public static final boolean DEBUG_DIST = false;
+ public static final boolean DEBUG_DECISION_TREE = false;
+ */
+ public static int MAX_NUM_RULES = 10;
+ public static boolean ONLY_ACTIVE_RULES = true; /* TODO into global settings */
+
+ public static boolean SORT_RULES_BY_RANK = true;
+ public static boolean PRINT_RULES = true;
+
+ private static Random BAGGING = new Random(System.currentTimeMillis());
+ //public static String log_file = "testing.log";
+
+
+ public static String ntimes(String s,int n){
+ StringBuffer buf = new StringBuffer();
+ for (int i = 0; i < n; i++) {
+ buf.append(s);
+ }
+ return buf.toString();
+ }
+
+ public static String sum() {
+ return "sum";
+ }
+
+ public static double log2(double prob) {
+ return Math.log(prob) / Math.log(2);
+ }
+
+ public static double ln(double prob) {
+ return Math.log(prob);
+ }
+
+ public static double exp(double prob) {
+ return Math.exp(prob);
+ }
+
+ /* TODO make this all_fields arraylist as hashmap */
+ public static void getSuperFields(Class<?> clazz, ArrayList<Field> all_fields) {
+ if (clazz == Object.class)
+ return;
+
+ //Field [] element_fields_ = clazz.getFields();
+ Field [] element_fields = clazz.getDeclaredFields(); //clazz.getFields();
+ for (Field f: element_fields) {
+ all_fields.add(f);
+ }
+ 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 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"))
+ 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"))
+ 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 */
+ private static void getAllFields(Class<?> clazz, ArrayList<Field> all_fields, ArrayList<Class<?>> all_classes) {
+ if (clazz == Object.class)
+ return;
+ all_classes.add(clazz);
+ //Field [] element_fields_ = clazz.getFields();
+ Field [] element_fields = clazz.getDeclaredFields(); //clazz.getFields();
+ for (Field f: element_fields) {
+ all_fields.add(f);
+ }
+ getAllFields(clazz.getSuperclass(), all_fields, all_classes);
+
+ return;
+ }
+
+ public static Object calculateMidPoint(Class<?> fClass, Object cp_i, Object cp_i_next) {
+ if (fClass.isAssignableFrom(Integer.class) || fClass == Integer.TYPE) {
+ return ((Integer)cp_i + (Integer) cp_i_next) / 2;
+ } else if (fClass.isAssignableFrom(Short.class) || fClass == Short.TYPE) {
+ return ((Short)cp_i + (Short) cp_i_next) / 2;
+ } else if (fClass.isAssignableFrom(Long.class) || fClass == Long.TYPE) {
+ return ((Long)cp_i + (Long) cp_i_next) / 2;
+ } else if (fClass.isAssignableFrom(Double.class) || fClass == Double.TYPE) {
+ return ((Double)cp_i + (Double) cp_i_next) / 2;
+ } else if (fClass.isAssignableFrom(Float.class) || fClass == Float.TYPE) {
+ return ((Float)cp_i + (Float) cp_i_next) / 2;
+ } else {
+ System.out.print("What should i do then Categorizer.find_a_split() for "+fClass);
+ System.exit(0);
+ }
+ return 0.0;
+ }
+
+ private static int getType(Class<?>[] type_name) {
+ /*
+ * simpletype.contains(type_name)
+ * how do you get the simple type
+ */
+ if (type_name.length==1) {
+ if (type_name[0].getName().equalsIgnoreCase("boolean") ||
+ type_name[0].getName().equalsIgnoreCase("int") ||
+ type_name[0].getName().equalsIgnoreCase("double") ||
+ type_name[0].getName().equalsIgnoreCase("float"))
+ return 1;
+ else if (type_name[0].getName().equalsIgnoreCase("java.lang.String"))
+ return 2;
+ else
+ return -1;
+ } else
+ return 0;
+ }
+
+ public static int[] bag_w_rep(int k, int N) {
+ int[] bag = new int[k];
+ int i = 0;
+ while (i<k) {
+ bag[i++] = BAGGING.nextInt(N);
+ }
+ return bag;
+ }
+
+ public static int[] bag_wo_rep(int k, int N) {
+ int[] bag = new int[k];
+ boolean[] selected = new boolean[N];
+ int i = 0;
+ while (i<k) {
+ int new_i = BAGGING.nextInt(N--);
+ //if (Util.DEBUG) System.out.print("new_i "+ new_i +"\t");
+ int selected_j=0, j=0;
+ while (j<new_i || selected[j]) {
+ if (selected[j]) {
+ new_i++;
+ selected_j = j;
+ }
+ j++;
+ }
+ selected[j] = true;
+ bag[i] = j;
+ i++;
+ }
+ return bag;
+ }
+
+ private static Object convertPrimitiveType (Object primitiveValue) {
+ Class klass = primitiveValue.getClass();
+ if (klass.equals(Boolean.TYPE)) {
+ return (Boolean)primitiveValue;
+
+ }
+ return null;
+
+ }
+
+ public boolean bok = false;
+
+ public Boolean bokkafa = Boolean.FALSE;
+ public String sbok = "x";
+
+ public static final void main(final String[] args) throws Exception {
+ System.out.println(Util.convertPrimitiveType(false));
+
+ Util u = new Util();
+ Field f = u.getClass().getField("bok");
+ System.out.println(Util.convertPrimitiveType(f.get(u)));
+ if (f.getType().isPrimitive())
+ System.out.println("Primitive" + f.get(u));
+ else
+ System.out.println("Not Primitive" + f.get(u));
+ Field fkafa = u.getClass().getField("bokkafa");
+ if (fkafa.getType().isPrimitive())
+ System.out.println("Primitive" + fkafa.get(u));
+ else
+ System.out.println("Not Primitive kafa" + fkafa.get(u));
+ Field f_s = u.getClass().getField("sbok");
+ if (f_s.getType() == String.class)
+ System.out.println(f_s.get(u));
+
+ String abd = "abd";
+ String abcm = "abcm";
+ ArrayList<String> x = new ArrayList<String>(2);
+ x.add(abd);
+ x.add(abcm);
+ x.add("q");
+ x.add("abdm");
+ x.add("abc");
+ System.out.println("the result: "+abd.compareTo(abcm));
+
+ Collections.sort(x);
+
+ for (String s:x){
+ System.out.println(s);
+ }
+
+
+ }
+}
+
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/main/java/org/drools/learner/tools/Util.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/test/java/org/drools/learner/LoggerTest.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/test/java/org/drools/learner/LoggerTest.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/test/java/org/drools/learner/LoggerTest.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,42 @@
+package org.drools.learner;
+
+import org.drools.learner.tools.Logger;
+import org.drools.learner.tools.LoggerFactory;
+import org.drools.learner.tools.Logger.LogLevel_;
+
+public class LoggerTest {
+
+// private static final Logger log = LoggerFactory.getSysOutLogger(LoggerTest.class, LogLevel_.ERROR);
+// private static final Logger flog = LoggerFactory.getFileLogger(LoggerTest.class, LogLevel_.ERROR, "log_test.log");
+//
+//
+// private static final Logger deflog = LoggerFactory.getSysOutLogger(LoggerTest.class);
+// private static final Logger f_deflog = LoggerFactory.getFileLogger(LoggerTest.class);
+
+
+ public static final void main(final String[] args) {
+
+
+// log.debug(new Object() {
+// public String toString() {
+// String out = "\nTesting logger->";
+// return out;
+//
+// }
+// });
+//
+// Object o = new String("bok");
+// log.error(o);
+//
+// Object o2 = new String("fbok");
+// flog.info(o2);
+// flog.error(o2);
+//
+// f_deflog.info(o2);
+// f_deflog.error(o2);
+//
+// deflog.stat(o2);
+// f_deflog.stat(o2);
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/test/java/org/drools/learner/LoggerTest.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/test/java/org/drools/learner/StructuredTestFactory.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/test/java/org/drools/learner/StructuredTestFactory.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/test/java/org/drools/learner/StructuredTestFactory.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,41 @@
+package org.drools.learner;
+
+import org.drools.WorkingMemory;
+import org.drools.learner.builder.C45Learner;
+import org.drools.learner.builder.Learner;
+import org.drools.learner.builder.SingleTreeBuilder;
+import org.drools.learner.builder.SingleTreeTester;
+import org.drools.learner.builder.Learner.DataType;
+import org.drools.learner.builder.DecisionTreeFactory;
+import org.drools.learner.eval.Entropy;
+import org.drools.learner.tools.FeatureNotSupported;
+
+public class StructuredTestFactory extends DecisionTreeFactory{
+
+
+ public static DecisionTree testStructuredMemory(WorkingMemory wm, Class<? extends Object> obj_class) throws FeatureNotSupported {
+
+ DataType data = Learner.DEFAULT_DATA;
+ Entropy heuristic = new Entropy();
+ C45Learner learner = new C45Learner(heuristic);
+
+ SingleTreeBuilder single_builder = new SingleTreeBuilder();
+
+ String algo_suffices = DecisionTreeFactory.getAlgoSuffices(learner.getDomainAlgo(), single_builder.getTreeAlgo());
+ String executionSignature = DecisionTreeFactory.getSignature(obj_class, "", algo_suffices);
+
+ /* create the memory */
+ Memory mem = Memory.createFromWorkingMemory(wm, obj_class, learner.getDomainAlgo(), data);
+ boolean BUILD_TREE = false;
+ if (BUILD_TREE) {
+ single_builder.build(mem, learner);//obj_class, target_attr, working_attr
+
+ SingleTreeTester tester = new SingleTreeTester(learner.getTree());
+ //tester.printStats(tester.test(mem.getClassInstances()), Util.DRL_DIRECTORY + executionSignature);
+ //Tester.test(c45, mem.getClassInstances());
+
+ learner.getTree().setSignature(executionSignature);
+ }
+ return learner.getTree();
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-core/src/test/java/org/drools/learner/StructuredTestFactory.java
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-dataloaders/drools-dataloaders-smooks/.classpath
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-dataloaders/drools-dataloaders-smooks/.classpath 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-dataloaders/drools-dataloaders-smooks/.classpath 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,25 +1,25 @@
-<classpath>
- <classpathentry kind="src" path="src/main/java"/>
- <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
- <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
- <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
- <classpathentry kind="output" path="target/classes"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/milyn/milyn-smooks-javabean/1.0.1/milyn-smooks-javabean-1.0.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/commons-lang/commons-lang/2.3/commons-lang-2.3.jar"/>
- <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.13/log4j-1.2.13.jar"/>
- <classpathentry kind="var" path="M2_REPO/milyn/milyn-smooks-core/1.0.1/milyn-smooks-core-1.0.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/milyn/milyn-commons/1.0/milyn-commons-1.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/hsqldb/hsqldb/1.8.0.2/hsqldb-1.8.0.2.jar"/>
- <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar"/>
- <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/freemarker/freemarker/2.3.9/freemarker-2.3.9.jar"/>
- <classpathentry kind="src" path="/drools-compiler"/>
- <classpathentry kind="src" path="/drools-core"/>
- <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
- <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+ <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+ <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
+ <classpathentry kind="output" path="target/classes"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/milyn/milyn-smooks-javabean/1.0.1/milyn-smooks-javabean-1.0.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-lang/commons-lang/2.3/commons-lang-2.3.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.13/log4j-1.2.13.jar"/>
+ <classpathentry kind="var" path="M2_REPO/milyn/milyn-smooks-core/1.0.1/milyn-smooks-core-1.0.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/milyn/milyn-commons/1.0/milyn-commons-1.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/hsqldb/hsqldb/1.8.0.2/hsqldb-1.8.0.2.jar"/>
+ <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar"/>
+ <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/freemarker/freemarker/2.3.9/freemarker-2.3.9.jar"/>
+ <classpathentry kind="src" path="/drools-compiler"/>
+ <classpathentry kind="src" path="/drools-core"/>
+ <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
+ <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
</classpath>
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-dataloaders/drools-dataloaders-smooks/.project
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-dataloaders/drools-dataloaders-smooks/.project 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-dataloaders/drools-dataloaders-smooks/.project 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,16 +1,16 @@
-<projectDescription>
- <name>drools-dataloaders-smooks</name>
- <comment>A rule production system</comment>
- <projects>
- <project>drools-compiler</project>
- <project>drools-core</project>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
+<projectDescription>
+ <name>drools-dataloaders-smooks</name>
+ <comment>A rule production system</comment>
+ <projects>
+ <project>drools-compiler</project>
+ <project>drools-core</project>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
</projectDescription>
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/.classpath
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/.classpath 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/.classpath 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,13 +1,16 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="src" path="src/main/java"/>
- <classpathentry excluding="**/*.java" kind="src" path="src/main/resources"/>
- <classpathentry excluding="**/*.java" kind="src" path="src/main/rules"/>
- <classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
- <classpathentry excluding="**/*.java" kind="src" output="target/test-classes" path="src/test/resources"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="lib" path="lib/foxtrot-2.0.jar"/>
- <classpathentry kind="lib" path="lib/jgoodies-forms-1.0.4.jar"/>
- <classpathentry kind="con" path="DROOLS/Drools"/>
- <classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry excluding="**/*.java" kind="src" path="src/main/resources"/>
+ <classpathentry excluding="**/*.java" kind="src" path="src/main/rules"/>
+ <classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
+ <classpathentry excluding="**/*.java" kind="src" output="target/test-classes" path="src/test/resources"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="lib" path="lib/foxtrot-2.0.jar"/>
+ <classpathentry kind="lib" path="lib/jgoodies-forms-1.0.4.jar"/>
+ <classpathentry kind="con" path="DROOLS/Drools"/>
+ <classpathentry kind="src" path="/drools-core"/>
+ <classpathentry kind="src" path="/drools-compiler"/>
+ <classpathentry kind="src" path="/drools-decisiontables"/>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/benchmark/manners/MannersBenchmark.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/benchmark/manners/MannersBenchmark.java 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/benchmark/manners/MannersBenchmark.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -15,9 +15,10 @@
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.StatefulSession;
+import org.drools.rule.Package;
+
import org.drools.compiler.PackageBuilder;
import org.drools.compiler.PackageBuilderConfiguration;
-import org.drools.rule.Package;
public class MannersBenchmark {
/** Number of guests at the dinner (default: 16). */
@@ -73,7 +74,7 @@
* Convert the facts from the <code>InputStream</code> to a list of
* objects.
*/
- protected static List getInputObjects(InputStream inputStream)
+ public static List getInputObjects(InputStream inputStream)
throws IOException {
List list = new ArrayList();
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/FibonacciExample.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/FibonacciExample.java 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/FibonacciExample.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -6,6 +6,7 @@
import org.drools.RuleBaseFactory;
import org.drools.StatefulSession;
import org.drools.audit.WorkingMemoryFileLogger;
+
import org.drools.compiler.PackageBuilder;
public class FibonacciExample {
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/Car.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/Car.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/Car.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,103 @@
+package org.drools.examples.learner;
+
+import org.drools.learner.tools.ClassAnnotation;
+import org.drools.learner.tools.FieldAnnotation;
+
+//@ClassAnnotation(label_element = "getLabel2")
+public class Car {
+ @FieldAnnotation(readingSeq = 0)
+ private String buying; //"vhigh", "high", "med", "low"
+ @FieldAnnotation(readingSeq = 1)
+ private String maint; //"vhigh", "high", "med", "low"
+ @FieldAnnotation(readingSeq = 2)
+ private String doors; //"2", "3", "4", "5more"
+ @FieldAnnotation(readingSeq = 3)
+ private String persons; //"2", "4", "more"
+ @FieldAnnotation(readingSeq = 4)
+ private String lug_boot; //"small", "med", "big"
+ @FieldAnnotation(readingSeq = 5)
+ private String safety; //"low", "med", "high"
+ @FieldAnnotation(readingSeq = 6, target = true)
+ private String target; //"unacc", "acc", "good", "vgood"
+
+ public boolean getLabel2() {
+ return (doors.equalsIgnoreCase("5more") && safety.equalsIgnoreCase("med") && buying.equalsIgnoreCase("low"));
+ }
+ public Car() {
+
+ }
+ public String getBuying() {
+ return buying;
+ }
+
+ public void setBuying(String buying) {
+ this.buying = buying;
+ }
+
+ public String getMaint() {
+ return maint;
+ }
+
+ public void setMaint(String maint) {
+ this.maint = maint;
+ }
+
+ public String getDoors() {
+ return doors;
+ }
+
+ public void setDoors(String doors) {
+ this.doors = doors;
+ }
+
+ public String getPersons() {
+ return persons;
+ }
+
+ public void setPersons(String persons) {
+ this.persons = persons;
+ }
+
+ public String getLug_boot() {
+ return lug_boot;
+ }
+
+ public void setLug_boot(String lug_boot) {
+ this.lug_boot = lug_boot;
+ }
+
+ public String getSafety() {
+ return safety;
+ }
+
+ public void setSafety(String safety) {
+ this.safety = safety;
+ }
+
+ public String getTarget() {
+ return target;
+ }
+
+ public void setTarget(String carClass) {
+ this.target = carClass;
+ }
+
+
+ public boolean getLabel() {
+ return (doors.equalsIgnoreCase("5more"));
+ }
+
+
+ public String toString() {
+ String out = "Car(buy:" +getBuying() +
+ " doors:"+getDoors()+
+ " lug_boot:"+getLug_boot()+
+ " maint:"+getMaint()+
+ " persons:"+getPersons()+
+ " safety:"+getSafety()+
+ " target:"+getTarget();
+ return out;
+ }
+
+
+}
\ No newline at end of file
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/Car.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExample.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExample.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExample.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,101 @@
+package org.drools.examples.learner;
+
+import java.util.List;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
+import org.drools.audit.WorkingMemoryFileLogger;
+import org.drools.compiler.PackageBuilder;
+import org.drools.event.DebugAgendaEventListener;
+import org.drools.event.DebugWorkingMemoryEventListener;
+import org.drools.learner.DecisionTree;
+import org.drools.learner.builder.DecisionTreeBuilder;
+import org.drools.learner.builder.DecisionTreeFactory;
+import org.drools.learner.tools.ObjectFactory;
+
+public class CarExample {
+
+
+ public static final void main(final String[] args) throws Exception {
+ // my rule base
+ final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+
+ final StatefulSession session = ruleBase.newStatefulSession(); // LearningSession
+
+ //session.addEventListener( new DebugAgendaEventListener() );
+ //session.addEventListener( new DebugWorkingMemoryEventListener() );
+
+ //final WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger( session );
+ //logger.setFileName( "log/car" );
+
+ String inputFile = new String("data/car/car.data.txt");
+ Class<?> obj_class = Car.class;
+ List<Object> facts = ObjectFactory.getObjects(obj_class, inputFile);
+ for (Object r : facts) {
+ session.insert(r);
+ }
+
+ // instantiate a learner for a specific object class and pass session to train
+ DecisionTree decision_tree; int ALGO = 400;
+ /*
+ * Single 1xx, Bag 2xx, Boost 3xx
+ * ID3 x1x, C45 x2x
+ * Entropy xx1, Gain xx2
+ */
+ switch (ALGO) {
+ case 111:
+ decision_tree = DecisionTreeFactory.createSingleID3E(session, obj_class);
+ break;
+ case 112:
+ decision_tree = DecisionTreeFactory.createSingleID3G(session, obj_class);
+ break;
+ case 121:
+ decision_tree = DecisionTreeFactory.createSingleC45E(session, obj_class);
+ break;
+ case 122:
+ decision_tree = DecisionTreeFactory.createSingleC45G(session, obj_class);
+ break;
+ case 221:
+ decision_tree = DecisionTreeFactory.createBagC45E(session, obj_class);
+ break;
+ case 222:
+ decision_tree = DecisionTreeFactory.createBagC45G(session, obj_class);
+ break;
+ case 321:
+ decision_tree = DecisionTreeFactory.createBoostedC45E(session, obj_class);
+ break;
+ case 322:
+ decision_tree = DecisionTreeFactory.createBoostedC45G(session, obj_class);
+ break;
+// case 3:
+// decision_tree = DecisionTreeFactory.createGlobal2(session, obj_class);
+// break;
+ case 400:
+ decision_tree = DecisionTreeFactory.createSinglePrunnedC45E(session, obj_class);
+ break;
+ default:
+ decision_tree = DecisionTreeFactory.createSingleID3E(session, obj_class);
+
+ }
+
+ final PackageBuilder builder = new PackageBuilder();
+ //this wil generate the rules, then parse and compile in one step
+ builder.addPackageFromTree( decision_tree );
+// System.exit(0);
+ ruleBase.addPackage( builder.getPackage() );
+ /*
+ final Reader source = new InputStreamReader( HelloWorldExample.class.getResourceAsStream( "HelloWorld.drl" ) );
+ //get the compiled package (which is serializable)
+ final Package pkg = builder.getPackage();
+ //add the package to a rulebase (deploy the rule package).
+ ruleBase.addPackage( pkg );
+ */
+
+ session.fireAllRules();
+
+ //logger.writeToDisk();
+
+ session.dispose();
+ }
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExample.java
___________________________________________________________________
Name: svn:eol-style
+ native
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExampleFromDrl.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExampleFromDrl.java (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExampleFromDrl.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,64 @@
+package org.drools.examples.learner;
+
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.List;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.StatefulSession;
+import org.drools.audit.WorkingMemoryFileLogger;
+import org.drools.compiler.PackageBuilder;
+import org.drools.event.DebugAgendaEventListener;
+import org.drools.event.DebugWorkingMemoryEventListener;
+import org.drools.learner.tools.ObjectFactory;
+import org.drools.rule.Package;
+
+public class CarExampleFromDrl {
+
+ public static final void main(final String[] args) throws Exception {
+ //read in the source
+ //final Reader source = new InputStreamReader( HelloWorldExample.class.getResourceAsStream( "HelloWorld.drl" ) );
+ final Reader source = new InputStreamReader( Car.class.getResourceAsStream( "car_c45_boost2.drl" ) );
+
+ final PackageBuilder builder = new PackageBuilder();
+
+ //this wil parse and compile in one step
+ builder.addPackageFromDrl( source );
+
+ // Check the builder for errors
+ if ( builder.hasErrors() ) {
+ System.out.println( builder.getErrors().toString() );
+ throw new RuntimeException( "Unable to compile \"car_c45_boost2.drl\".");
+ }
+
+ //get the compiled package (which is serializable)
+ final Package pkg = builder.getPackage();
+
+ //add the package to a rulebase (deploy the rule package).
+ final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ruleBase.addPackage( pkg );
+
+ final StatefulSession session = ruleBase.newStatefulSession();
+
+ session.addEventListener( new DebugAgendaEventListener() );
+ session.addEventListener( new DebugWorkingMemoryEventListener() );
+
+ final WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger( session );
+ logger.setFileName( "log/car_c45_boost2" );
+
+ String inputFile = new String("data/car/car.data.txt");
+ Class<?> obj_class = Car.class;
+ List<Object> facts = ObjectFactory.getObjects(obj_class, inputFile);
+ for (Object r : facts) {
+ session.insert(r);
+ }
+
+ session.fireAllRules();
+
+ logger.writeToDisk();
+
+ session.dispose();
+ }
+
+}
Property changes on: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/learner/CarExampleFromDrl.java
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/troubleticket/TroubleTicketWithDT.java
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/troubleticket/TroubleTicketWithDT.java 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/troubleticket/TroubleTicketWithDT.java 2008-07-16 17:39:52 UTC (rev 21071)
@@ -8,15 +8,12 @@
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.StatefulSession;
-import org.drools.StatelessSession;
-import org.drools.WorkingMemory;
import org.drools.audit.WorkingMemoryFileLogger;
+
import org.drools.compiler.DroolsParserException;
import org.drools.compiler.PackageBuilder;
import org.drools.decisiontable.InputType;
import org.drools.decisiontable.SpreadsheetCompiler;
-import org.drools.examples.decisiontable.Driver;
-import org.drools.examples.decisiontable.Policy;
/**
* This shows off a decision table.
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/HelloWorld.drl
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/HelloWorld.drl 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/HelloWorld.drl 2008-07-16 17:39:52 UTC (rev 21071)
@@ -3,7 +3,7 @@
import org.drools.examples.HelloWorldExample.Message;
global java.util.List list
- /*
+
rule "Hello World"
dialect "mvel"
when
@@ -24,13 +24,13 @@
System.out.println( message );
System.out.println( message );
end
-*/
+
rule "new rule"
dialect "mvel"
when
m : Message( status == Message.HELLO, message : message )
- eval( null )
+// eval( null )
then
System.out.println( list );
-end
\ No newline at end of file
+end
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/car_c45_one.drl
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/car_c45_one.drl (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/car_c45_one.drl 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,69 @@
+package org.drools.examples.learner;
+
+import org.drools.examples.learner.Car
+
+rule "#0 label2= false classifying 432.0 num of facts with rank:0.25"
+ when
+ $car_0 : Car(buying == "high", $target_label : label2 )
+ then
+ System.out.println("[label2] Expected value (" + $target_label + "), Classified as (false )");
+end
+
+rule "#4 label2= false classifying 432.0 num of facts with rank:0.25"
+ when
+ $car_0 : Car(buying == "vhigh", $target_label : label2 )
+ then
+ System.out.println("[label2] Expected value (" + $target_label + "), Classified as (false )");
+end
+
+rule "#6 label2= false classifying 432.0 num of facts with rank:0.25"
+ when
+ $car_0 : Car(buying == "med", $target_label : label2 )
+ then
+ System.out.println("[label2] Expected value (" + $target_label + "), Classified as (false )");
+end
+
+rule "#5 label2= false classifying 108.0 num of facts with rank:0.0625"
+ when
+ $car_0 : Car(buying == "low", doors == "4", $target_label : label2 )
+ then
+ System.out.println("[label2] Expected value (" + $target_label + "), Classified as (false )");
+end
+
+rule "#7 label2= false classifying 108.0 num of facts with rank:0.0625"
+ when
+ $car_0 : Car(buying == "low", doors == "2", $target_label : label2 )
+ then
+ System.out.println("[label2] Expected value (" + $target_label + "), Classified as (false )");
+end
+
+rule "#8 label2= false classifying 108.0 num of facts with rank:0.0625"
+ when
+ $car_0 : Car(buying == "low", doors == "3", $target_label : label2 )
+ then
+ System.out.println("[label2] Expected value (" + $target_label + "), Classified as (false )");
+end
+
+rule "#1 label2= true classifying 36.0 num of facts with rank:0.020833333333333332"
+ when
+ $car_0 : Car(buying == "low", doors == "5more", safety == "med", $target_label : label2 )
+ then
+ System.out.println("[label2] Expected value (" + $target_label + "), Classified as (true )");
+end
+
+rule "#2 label2= false classifying 36.0 num of facts with rank:0.020833333333333332"
+ when
+ $car_0 : Car(buying == "low", doors == "5more", safety == "high", $target_label : label2 )
+ then
+ System.out.println("[label2] Expected value (" + $target_label + "), Classified as (false )");
+end
+
+rule "#3 label2= false classifying 36.0 num of facts with rank:0.020833333333333332"
+ when
+ $car_0 : Car(buying == "low", doors == "5more", safety == "low", $target_label : label2 )
+ then
+ System.out.println("[label2] Expected value (" + $target_label + "), Classified as (false )");
+end
+
+//THE END: Total number of facts correctly classified= 1728 over 1728.0
+//with 9 number of rules over 9 total number of rules
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/car_c45_one.stats
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/car_c45_one.stats (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/car_c45_one.stats 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,4 @@
+TESTING results: incorrect 0
+TESTING results: correct 1728
+TESTING results: unknown 0
+TESTING results: Total Number 1728
\ No newline at end of file
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/golf_c45_one.drl
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/golf_c45_one.drl (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/golf_c45_one.drl 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,41 @@
+package org.drools.examples.learner;
+
+import org.drools.examples.learner.Golf
+
+rule "#0 decision= Play classifying 4.0 num of facts with rank:0.2857142857142857"
+ when
+ $golf_0 : Golf(outlook == "overcast", $target_label : decision )
+ then
+ System.out.println("[decision] Expected value (" + $target_label + "), Classified as (Play )");
+end
+
+rule "#3 decision= Play classifying 3.0 num of facts with rank:0.21428571428571427"
+ when
+ $golf_0 : Golf(outlook == "rain", windy == false, $target_label : decision )
+ then
+ System.out.println("[decision] Expected value (" + $target_label + "), Classified as (Play )");
+end
+
+rule "#4 decision= Don't Play classifying 3.0 num of facts with rank:0.21428571428571427"
+ when
+ $golf_0 : Golf(outlook == "sunny", humidity > 77, $target_label : decision )
+ then
+ System.out.println("[decision] Expected value (" + $target_label + "), Classified as (Don't Play )");
+end
+
+rule "#1 decision= Play classifying 2.0 num of facts with rank:0.14285714285714285"
+ when
+ $golf_0 : Golf(outlook == "sunny", humidity <= 77, $target_label : decision )
+ then
+ System.out.println("[decision] Expected value (" + $target_label + "), Classified as (Play )");
+end
+
+rule "#2 decision= Don't Play classifying 2.0 num of facts with rank:0.14285714285714285"
+ when
+ $golf_0 : Golf(outlook == "rain", windy == true, $target_label : decision )
+ then
+ System.out.println("[decision] Expected value (" + $target_label + "), Classified as (Don't Play )");
+end
+
+//THE END: Total number of facts correctly classified= 14 over 14.0
+//with 5 number of rules over 5 total number of rules
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/golf_c45_one.stats
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/golf_c45_one.stats (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/golf_c45_one.stats 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,4 @@
+TESTING results: incorrect 0
+TESTING results: correct 14
+TESTING results: unknown 0
+TESTING results: Total Number 14
\ No newline at end of file
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/log/car_c45_one.log
===================================================================
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/log/golf_c45_one.log
===================================================================
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/log/restaurant_id3_one.log
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/log/restaurant_id3_one.log (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/log/restaurant_id3_one.log 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1 @@
+[stat] (Learner) ******************** 1st best attr: patrons[stat] (Learner) ******************** 1st best attr: hungry[stat] (Learner) ******************** 1st best attr: type[stat] (Learner) ******************** 1st best attr: fri_sat
\ No newline at end of file
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/restaurant_id3_one.drl
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/restaurant_id3_one.drl (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/restaurant_id3_one.drl 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,55 @@
+package org.drools.examples.learner;
+
+import org.drools.examples.learner.Restaurant
+
+rule "#7 will_wait= true classifying 3.0 num of facts with rank:0.2727272727272727"
+ when
+ $restaurant_0 : Restaurant(patrons == "Some", $target_label : will_wait )
+ then
+ System.out.println("[will_wait] Expected value (" + $target_label + "), Classified as (true )");
+end
+
+rule "#1 will_wait= false classifying 2.0 num of facts with rank:0.18181818181818182"
+ when
+ $restaurant_0 : Restaurant(patrons == "None", $target_label : will_wait )
+ then
+ System.out.println("[will_wait] Expected value (" + $target_label + "), Classified as (false )");
+end
+
+rule "#4 will_wait= false classifying 2.0 num of facts with rank:0.18181818181818182"
+ when
+ $restaurant_0 : Restaurant(patrons == "Full", hungry == false, $target_label : will_wait )
+ then
+ System.out.println("[will_wait] Expected value (" + $target_label + "), Classified as (false )");
+end
+
+rule "#2 will_wait= false classifying 1.0 num of facts with rank:0.09090909090909091"
+ when
+ $restaurant_0 : Restaurant(patrons == "Full", hungry == true, type == "Italian", $target_label : will_wait )
+ then
+ System.out.println("[will_wait] Expected value (" + $target_label + "), Classified as (false )");
+end
+
+rule "#3 will_wait= false classifying 1.0 num of facts with rank:0.09090909090909091"
+ when
+ $restaurant_0 : Restaurant(patrons == "Full", hungry == true, type == "Thai", fri_sat == false, $target_label : will_wait )
+ then
+ System.out.println("[will_wait] Expected value (" + $target_label + "), Classified as (false )");
+end
+
+rule "#5 will_wait= true classifying 1.0 num of facts with rank:0.09090909090909091"
+ when
+ $restaurant_0 : Restaurant(patrons == "Full", hungry == true, type == "Thai", fri_sat == true, $target_label : will_wait )
+ then
+ System.out.println("[will_wait] Expected value (" + $target_label + "), Classified as (true )");
+end
+
+rule "#6 will_wait= true classifying 1.0 num of facts with rank:0.09090909090909091"
+ when
+ $restaurant_0 : Restaurant(patrons == "Full", hungry == true, type == "Burger", $target_label : will_wait )
+ then
+ System.out.println("[will_wait] Expected value (" + $target_label + "), Classified as (true )");
+end
+
+//THE END: Total number of facts correctly classified= 11 over 11.0
+//with 7 number of rules over 8 total number of rules
Added: labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/restaurant_id3_one.stats
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/restaurant_id3_one.stats (rev 0)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-examples/drools-examples-drl/src/main/rules/org/drools/examples/learner/restaurant_id3_one.stats 2008-07-16 17:39:52 UTC (rev 21071)
@@ -0,0 +1,4 @@
+TESTING results: incorrect 0
+TESTING results: correct 11
+TESTING results: unknown 0
+TESTING results: Total Number 11
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-guvnor/.classpath
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-guvnor/.classpath 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-guvnor/.classpath 2008-07-16 17:39:52 UTC (rev 21071)
@@ -67,7 +67,7 @@
<classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-annotations/3.3.0.ga/hibernate-annotations-3.3.0.ga.jar"/>
<classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-entitymanager/3.3.1.ga/hibernate-entitymanager-3.3.1.ga.jar"/>
<classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-commons-annotations/3.0.0.ga/hibernate-commons-annotations-3.0.0.ga.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-validator/3.0.0.ga/hibernate-validator-3.0.0.ga.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-validator/3.0.0.ga/hibernate-validator-3.0.0.GA.jar"/>
<classpathentry kind="var" path="M2_REPO/org/jboss/security/identity-impl/2.0.2.CR6/identity-impl-2.0.2.CR6.jar"/>
<classpathentry kind="var" path="M2_REPO/org/jboss/security/jboss-security-acl/2.0.2.Beta4/jboss-security-acl-2.0.2.Beta4.jar"/>
<classpathentry kind="var" path="M2_REPO/org/jboss/security/acl-spi/2.0.2.CR6/acl-spi-2.0.2.CR6.jar"/>
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-jsr94/.classpath
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-jsr94/.classpath 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-jsr94/.classpath 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,21 +1,21 @@
-<classpath>
- <classpathentry kind="src" path="src/main/java"/>
- <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
- <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
- <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
- <classpathentry kind="output" path="target/classes"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="var" path="M2_REPO/jsr94/jsr94/1.1/jsr94-1.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/jsr94/jsr94-sigtest/1.1/jsr94-sigtest-1.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/jsr94/jsr94-tck/1.0.3/jsr94-tck-1.0.3.jar"/>
- <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
- <classpathentry kind="src" path="/drools-compiler"/>
- <classpathentry kind="src" path="/drools-core"/>
- <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
- <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
- <classpathentry kind="src" path="/drools-decisiontables"/>
- <classpathentry kind="src" path="/drools-templates"/>
- <classpathentry kind="var" path="M2_REPO/jexcelapi/jxl/2.4.2/jxl-2.4.2.jar"/>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+ <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+ <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
+ <classpathentry kind="output" path="target/classes"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="var" path="M2_REPO/jsr94/jsr94/1.1/jsr94-1.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/jsr94/jsr94-sigtest/1.1/jsr94-sigtest-1.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/jsr94/jsr94-tck/1.0.3/jsr94-tck-1.0.3.jar"/>
+ <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+ <classpathentry kind="src" path="/drools-compiler"/>
+ <classpathentry kind="src" path="/drools-core"/>
+ <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
+ <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
+ <classpathentry kind="src" path="/drools-decisiontables"/>
+ <classpathentry kind="src" path="/drools-templates"/>
+ <classpathentry kind="var" path="M2_REPO/jexcelapi/jxl/2.4.2/jxl-2.4.2.jar"/>
</classpath>
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-jsr94/.project
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-jsr94/.project 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-jsr94/.project 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,18 +1,18 @@
-<projectDescription>
- <name>drools-jsr94</name>
- <comment>A rule production system</comment>
- <projects>
- <project>drools-compiler</project>
- <project>drools-core</project>
- <project>drools-decisiontables</project>
- <project>drools-templates</project>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
+<projectDescription>
+ <name>drools-jsr94</name>
+ <comment>A rule production system</comment>
+ <projects>
+ <project>drools-compiler</project>
+ <project>drools-core</project>
+ <project>drools-decisiontables</project>
+ <project>drools-templates</project>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
</projectDescription>
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-repository/.classpath
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-repository/.classpath 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-repository/.classpath 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,59 +1,59 @@
-<classpath>
- <classpathentry kind="src" path="src/main/java"/>
- <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
- <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
- <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
- <classpathentry kind="output" path="target/classes"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="var" path="M2_REPO/hsqldb/hsqldb/1.8.0.2/hsqldb-1.8.0.2.jar"/>
- <classpathentry kind="var" path="M2_REPO/javax/jcr/jcr/1.0/jcr-1.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.13/log4j-1.2.13.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-core/1.4.1/jackrabbit-core-1.4.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/concurrent/concurrent/1.3.4/concurrent-1.3.4.jar"/>
- <classpathentry kind="var" path="M2_REPO/commons-collections/commons-collections/3.1/commons-collections-3.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-api/1.4/jackrabbit-api-1.4.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-jcr-commons/1.4/jackrabbit-jcr-commons-1.4.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.3.0/slf4j-api-1.3.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-spi-commons/1.4/jackrabbit-spi-commons-1.4.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-spi/1.4/jackrabbit-spi-1.4.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-text-extractors/1.4/jackrabbit-text-extractors-1.4.jar"/>
- <classpathentry kind="var" path="M2_REPO/xerces/xercesImpl/2.8.0/xercesImpl-2.8.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/xml-apis/xml-apis/2.0.2/xml-apis-2.0.2.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/lucene/lucene-core/2.2.0/lucene-core-2.2.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/derby/derby/10.2.1.6/derby-10.2.1.6.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/jboss/security/acl-spi/2.0.2.CR6/acl-spi-2.0.2.CR6.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/jboss/security/identity-spi/2.0.2.CR6/identity-spi-2.0.2.CR6.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/jboss/security/authorization-spi/2.0.2.CR6/authorization-spi-2.0.2.CR6.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/jboss/security/jboss-security-acl/2.0.2.Beta4/jboss-security-acl-2.0.2.Beta4.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/jboss/jboss-common-core/2.2.1.GA/jboss-common-core-2.2.1.GA.jar"/>
- <classpathentry kind="var" path="M2_REPO/apache-xerces/xml-apis/2.7.1/xml-apis-2.7.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/apache-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar"/>
- <classpathentry kind="var" path="M2_REPO/apache-slide/webdavlib/2.0/webdavlib-2.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/jboss/jboss-common-logging-spi/2.0.4.GA/jboss-common-logging-spi-2.0.4.GA.jar"/>
- <classpathentry kind="var" path="M2_REPO/jboss/jboss-logging-spi/2.0.2.GA/jboss-logging-spi-2.0.2.GA.jar"/>
- <classpathentry kind="var" path="M2_REPO/jboss/jboss-logging-log4j/2.0.2.GA/jboss-logging-log4j-2.0.2.GA.jar"/>
- <classpathentry kind="var" path="M2_REPO/jboss/jboss-common-core/2.0.2.GA/jboss-common-core-2.0.2.GA.jar"/>
- <classpathentry kind="var" path="M2_REPO/apache-log4j/log4j/1.2.14/log4j-1.2.14.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/jboss/security/jboss-security-acl-impl/2.0.2.CR6/jboss-security-acl-impl-2.0.2.CR6.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/jboss/security/jboss-security-spi/2.0.2.CR6/jboss-security-spi-2.0.2.CR6.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate/3.2.4.sp1/hibernate-3.2.4.sp1.jar"/>
- <classpathentry kind="var" path="M2_REPO/net/sf/ehcache/ehcache/1.2.3/ehcache-1.2.3.jar"/>
- <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar"/>
- <classpathentry kind="var" path="M2_REPO/javax/transaction/jta/1.0.1B/jta-1.0.1B.jar"/>
- <classpathentry kind="var" path="M2_REPO/asm/asm-attrs/1.5.3/asm-attrs-1.5.3.jar"/>
- <classpathentry kind="var" path="M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6.jar"/>
- <classpathentry kind="var" path="M2_REPO/cglib/cglib/2.1_3/cglib-2.1_3.jar"/>
- <classpathentry kind="var" path="M2_REPO/asm/asm/1.5.3/asm-1.5.3.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-annotations/3.3.0.ga/hibernate-annotations-3.3.0.ga.jar"/>
- <classpathentry kind="var" path="M2_REPO/javax/persistence/persistence-api/1.0/persistence-api-1.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-entitymanager/3.3.1.ga/hibernate-entitymanager-3.3.1.ga.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-commons-annotations/3.0.0.ga/hibernate-commons-annotations-3.0.0.ga.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-validator/3.0.0.ga/hibernate-validator-3.0.0.ga.jar"/>
- <classpathentry kind="var" path="M2_REPO/jboss/javassist/3.3.ga/javassist-3.3.ga.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/jboss/security/identity-impl/2.0.2.CR6/identity-impl-2.0.2.CR6.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-log4j12/1.3.0/slf4j-log4j12-1.3.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/tmatesoft/svnkit/1.1.2/svnkit-1.1.2.jar"/>
- <classpathentry kind="var" path="M2_REPO/ch/ethz/ganymed/ganymed-ssh2/build210/ganymed-ssh2-build210.jar"/>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+ <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+ <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
+ <classpathentry kind="output" path="target/classes"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="var" path="M2_REPO/hsqldb/hsqldb/1.8.0.2/hsqldb-1.8.0.2.jar"/>
+ <classpathentry kind="var" path="M2_REPO/javax/jcr/jcr/1.0/jcr-1.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.13/log4j-1.2.13.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-core/1.4.1/jackrabbit-core-1.4.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/concurrent/concurrent/1.3.4/concurrent-1.3.4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-collections/commons-collections/3.1/commons-collections-3.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-api/1.4/jackrabbit-api-1.4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-jcr-commons/1.4/jackrabbit-jcr-commons-1.4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.3.0/slf4j-api-1.3.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-spi-commons/1.4/jackrabbit-spi-commons-1.4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-spi/1.4/jackrabbit-spi-1.4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/jackrabbit/jackrabbit-text-extractors/1.4/jackrabbit-text-extractors-1.4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/xerces/xercesImpl/2.8.0/xercesImpl-2.8.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/xml-apis/xml-apis/2.0.2/xml-apis-2.0.2.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/lucene/lucene-core/2.2.0/lucene-core-2.2.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/derby/derby/10.2.1.6/derby-10.2.1.6.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/jboss/security/acl-spi/2.0.2.CR6/acl-spi-2.0.2.CR6.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/jboss/security/identity-spi/2.0.2.CR6/identity-spi-2.0.2.CR6.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/jboss/security/authorization-spi/2.0.2.CR6/authorization-spi-2.0.2.CR6.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/jboss/security/jboss-security-acl/2.0.2.Beta4/jboss-security-acl-2.0.2.Beta4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/jboss/jboss-common-core/2.2.1.GA/jboss-common-core-2.2.1.GA.jar"/>
+ <classpathentry kind="var" path="M2_REPO/apache-xerces/xml-apis/2.7.1/xml-apis-2.7.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/apache-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar"/>
+ <classpathentry kind="var" path="M2_REPO/apache-slide/webdavlib/2.0/webdavlib-2.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/jboss/jboss-common-logging-spi/2.0.4.GA/jboss-common-logging-spi-2.0.4.GA.jar"/>
+ <classpathentry kind="var" path="M2_REPO/jboss/jboss-logging-spi/2.0.2.GA/jboss-logging-spi-2.0.2.GA.jar"/>
+ <classpathentry kind="var" path="M2_REPO/jboss/jboss-logging-log4j/2.0.2.GA/jboss-logging-log4j-2.0.2.GA.jar"/>
+ <classpathentry kind="var" path="M2_REPO/jboss/jboss-common-core/2.0.2.GA/jboss-common-core-2.0.2.GA.jar"/>
+ <classpathentry kind="var" path="M2_REPO/apache-log4j/log4j/1.2.14/log4j-1.2.14.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/jboss/security/jboss-security-acl-impl/2.0.2.CR6/jboss-security-acl-impl-2.0.2.CR6.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/jboss/security/jboss-security-spi/2.0.2.CR6/jboss-security-spi-2.0.2.CR6.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate/3.2.4.sp1/hibernate-3.2.4.sp1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/net/sf/ehcache/ehcache/1.2.3/ehcache-1.2.3.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/javax/transaction/jta/1.0.1B/jta-1.0.1B.jar"/>
+ <classpathentry kind="var" path="M2_REPO/asm/asm-attrs/1.5.3/asm-attrs-1.5.3.jar"/>
+ <classpathentry kind="var" path="M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/antlr/antlr/2.7.6/antlr-2.7.6.jar"/>
+ <classpathentry kind="var" path="M2_REPO/cglib/cglib/2.1_3/cglib-2.1_3.jar"/>
+ <classpathentry kind="var" path="M2_REPO/asm/asm/1.5.3/asm-1.5.3.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-annotations/3.3.0.ga/hibernate-annotations-3.3.0.ga.jar"/>
+ <classpathentry kind="var" path="M2_REPO/javax/persistence/persistence-api/1.0/persistence-api-1.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-entitymanager/3.3.1.ga/hibernate-entitymanager-3.3.1.ga.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-commons-annotations/3.0.0.ga/hibernate-commons-annotations-3.0.0.ga.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/hibernate/hibernate-validator/3.0.0.ga/hibernate-validator-3.0.0.GA.jar"/>
+ <classpathentry kind="var" path="M2_REPO/jboss/javassist/3.3.ga/javassist-3.3.ga.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/jboss/security/identity-impl/2.0.2.CR6/identity-impl-2.0.2.CR6.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-log4j12/1.3.0/slf4j-log4j12-1.3.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/tmatesoft/svnkit/1.1.2/svnkit-1.1.2.jar"/>
+ <classpathentry kind="var" path="M2_REPO/ch/ethz/ganymed/ganymed-ssh2/build210/ganymed-ssh2-build210.jar"/>
</classpath>
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-repository/.project
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-repository/.project 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-repository/.project 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,13 +1,13 @@
-<projectDescription>
- <name>drools-repository</name>
- <comment>A rule production system</comment>
- <projects/>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
+<projectDescription>
+ <name>drools-repository</name>
+ <comment>A rule production system</comment>
+ <projects/>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
</projectDescription>
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-solver/drools-solver-core/.classpath
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-solver/drools-solver-core/.classpath 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-solver/drools-solver-core/.classpath 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,22 +1,22 @@
-<classpath>
- <classpathentry kind="src" path="src/main/java"/>
- <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
- <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
- <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
- <classpathentry kind="output" path="target/classes"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar"/>
- <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
- <classpathentry kind="var" path="M2_REPO/commons-lang/commons-lang/2.3/commons-lang-2.3.jar"/>
- <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.13/log4j-1.2.13.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-io/1.3.2/commons-io-1.3.2.jar"/>
- <classpathentry kind="src" path="/drools-compiler"/>
- <classpathentry kind="src" path="/drools-core"/>
- <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
- <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.3.0/slf4j-api-1.3.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-log4j12/1.3.0/slf4j-log4j12-1.3.0.jar"/>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+ <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+ <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
+ <classpathentry kind="output" path="target/classes"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar"/>
+ <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-lang/commons-lang/2.3/commons-lang-2.3.jar"/>
+ <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.13/log4j-1.2.13.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-io/1.3.2/commons-io-1.3.2.jar"/>
+ <classpathentry kind="src" path="/drools-compiler"/>
+ <classpathentry kind="src" path="/drools-core"/>
+ <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
+ <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.3.0/slf4j-api-1.3.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-log4j12/1.3.0/slf4j-log4j12-1.3.0.jar"/>
</classpath>
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-solver/drools-solver-core/.project
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-solver/drools-solver-core/.project 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-solver/drools-solver-core/.project 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,16 +1,16 @@
-<projectDescription>
- <name>drools-solver-core</name>
- <comment>Drools solver core ... TODO</comment>
- <projects>
- <project>drools-compiler</project>
- <project>drools-core</project>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
+<projectDescription>
+ <name>drools-solver-core</name>
+ <comment>Drools solver core ... TODO</comment>
+ <projects>
+ <project>drools-compiler</project>
+ <project>drools-core</project>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
</projectDescription>
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-solver/drools-solver-examples/.classpath
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-solver/drools-solver-examples/.classpath 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-solver/drools-solver-examples/.classpath 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,23 +1,23 @@
-<classpath>
- <classpathentry kind="src" path="src/main/java"/>
- <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
- <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
- <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
- <classpathentry kind="output" path="target/classes"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar"/>
- <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
- <classpathentry kind="var" path="M2_REPO/commons-lang/commons-lang/2.3/commons-lang-2.3.jar"/>
- <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.13/log4j-1.2.13.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-io/1.3.2/commons-io-1.3.2.jar"/>
- <classpathentry kind="src" path="/drools-solver-core"/>
- <classpathentry kind="src" path="/drools-core"/>
- <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
- <classpathentry kind="src" path="/drools-compiler"/>
- <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
- <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.3.0/slf4j-api-1.3.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-log4j12/1.3.0/slf4j-log4j12-1.3.0.jar"/>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+ <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+ <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
+ <classpathentry kind="output" path="target/classes"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar"/>
+ <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/>
+ <classpathentry kind="var" path="M2_REPO/commons-lang/commons-lang/2.3/commons-lang-2.3.jar"/>
+ <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.13/log4j-1.2.13.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/commons/commons-io/1.3.2/commons-io-1.3.2.jar"/>
+ <classpathentry kind="src" path="/drools-solver-core"/>
+ <classpathentry kind="src" path="/drools-core"/>
+ <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
+ <classpathentry kind="src" path="/drools-compiler"/>
+ <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
+ <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.3.0/slf4j-api-1.3.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-log4j12/1.3.0/slf4j-log4j12-1.3.0.jar"/>
</classpath>
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-solver/drools-solver-examples/.project
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-solver/drools-solver-examples/.project 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-solver/drools-solver-examples/.project 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,17 +1,17 @@
-<projectDescription>
- <name>drools-solver-examples</name>
- <comment>Drools solver examples ... TODO</comment>
- <projects>
- <project>drools-solver-core</project>
- <project>drools-core</project>
- <project>drools-compiler</project>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
+<projectDescription>
+ <name>drools-solver-examples</name>
+ <comment>Drools solver examples ... TODO</comment>
+ <projects>
+ <project>drools-solver-core</project>
+ <project>drools-core</project>
+ <project>drools-compiler</project>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
</projectDescription>
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-templates/.classpath
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-templates/.classpath 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-templates/.classpath 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,15 +1,15 @@
-<classpath>
- <classpathentry kind="src" path="src/main/java"/>
- <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
- <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
- <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
- <classpathentry kind="output" path="target/classes"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
- <classpathentry kind="src" path="/drools-compiler"/>
- <classpathentry kind="src" path="/drools-core"/>
- <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
- <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
+ <classpathentry kind="src" path="src/test/java" output="target/test-classes"/>
+ <classpathentry kind="src" path="src/test/resources" output="target/test-classes" excluding="**/*.java"/>
+ <classpathentry kind="output" path="target/classes"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
+ <classpathentry kind="src" path="/drools-compiler"/>
+ <classpathentry kind="src" path="/drools-core"/>
+ <classpathentry kind="var" path="M2_REPO/org/mvel/mvel/2.0-dp4/mvel-2.0-dp4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/antlr/antlr-runtime/3.0/antlr-runtime-3.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/eclipse/jdt/core/3.2.3.v_686_R32x/core-3.2.3.v_686_R32x.jar"/>
+ <classpathentry kind="var" path="M2_REPO/janino/janino/2.5.10/janino-2.5.10.jar"/>
</classpath>
\ No newline at end of file
Modified: labs/jbossrules/contrib/machinelearning/5.0/drools-templates/.project
===================================================================
--- labs/jbossrules/contrib/machinelearning/5.0/drools-templates/.project 2008-07-16 17:22:56 UTC (rev 21070)
+++ labs/jbossrules/contrib/machinelearning/5.0/drools-templates/.project 2008-07-16 17:39:52 UTC (rev 21071)
@@ -1,16 +1,16 @@
-<projectDescription>
- <name>drools-templates</name>
- <comment>A rule production system</comment>
- <projects>
- <project>drools-compiler</project>
- <project>drools-core</project>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
+<projectDescription>
+ <name>drools-templates</name>
+ <comment>A rule production system</comment>
+ <projects>
+ <project>drools-compiler</project>
+ <project>drools-core</project>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
</projectDescription>
\ No newline at end of file
More information about the jboss-svn-commits
mailing list