[jboss-svn-commits] JBL Code SVN: r25969 - in labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools: fuzzy and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Apr 6 04:52:22 EDT 2009
Author: dsotty
Date: 2009-04-06 04:52:22 -0400 (Mon, 06 Apr 2009)
New Revision: 25969
Added:
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/FuzzyDomain.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/FuzzySet.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/NumericDomainFuzzySet.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/RealDomain.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/FuzzyNumericEvaluator.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/HotEvaluatorDefinition.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/IDynamicEvaluable.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/MockEvaluator.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/SeemsEvaluator.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/SeemsEvaluatorDefinition.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/IMembershipFunction.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/INumericSetMembershipFunction.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/Radial2DMembershipFunction.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/SkepticNumericMembershipFunction.java
labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/TriangleMembership.java
Log:
Imperfect Drools experimental
Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/FuzzyDomain.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/FuzzyDomain.java (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/FuzzyDomain.java 2009-04-06 08:52:22 UTC (rev 25969)
@@ -0,0 +1,119 @@
+package org.drools.fuzzy;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.base.ValueType;
+import org.drools.base.evaluators.EvaluatorDefinition;
+import org.drools.base.evaluators.Operator;
+import org.drools.base.evaluators.EvaluatorDefinition.Target;
+import org.drools.spi.Evaluator;
+
+public abstract class FuzzyDomain implements EvaluatorDefinition {
+
+
+ private Map<String, FuzzySet> granules;
+
+ private FuzzySet possibility;
+
+
+ public FuzzyDomain() {
+ granules = new HashMap<String, FuzzySet>();
+ }
+
+
+ public void addGranule(FuzzySet set) {
+ granules.put(set.getName(),set);
+ }
+
+ protected FuzzySet getGranule(String id) {
+ return granules.get(id);
+ }
+
+
+ public FuzzySet getReferenceSet(String name) {
+ return granules.get(name);
+ }
+
+ public FuzzySet getPossibilityDistribution() {
+ return possibility;
+ }
+
+ public void setPossibilityDistribution(FuzzySet distro) {
+ possibility = distro;
+ }
+
+
+ public abstract String[] getEvaluatorIds();
+
+
+
+
+
+
+
+
+
+
+
+
+
+ public Evaluator getEvaluator(ValueType type, String operatorId,
+ boolean isNegated, String parameterText, Target leftTarget,
+ Target rightTarget) {
+ return getEvaluator(operatorId);
+ }
+
+
+ public Evaluator getEvaluator(ValueType type, String operatorId,
+ boolean isNegated, String parameterText) {
+ return getEvaluator(operatorId);
+ }
+
+
+ public Evaluator getEvaluator(ValueType type, Operator operator,
+ String parameterText) {
+ return getEvaluator(operator.getOperatorString());
+ }
+
+
+ public Evaluator getEvaluator(ValueType type, Operator operator) {
+ return getEvaluator(operator.getOperatorString());
+ }
+
+
+ public Evaluator getEvaluator(String operatorString) {
+ return getGranule(operatorString).getEvaluator();
+ }
+
+
+ public Target getTarget() {
+ return Target.FACT;
+ }
+
+
+ public boolean isNegatable() {
+ return true;
+ }
+
+
+
+
+ public void readExternal(ObjectInput in) throws IOException,
+ ClassNotFoundException {
+ //TODO
+ throw new UnsupportedOperationException(this.getClass()+"Serialization not supported yet");
+ }
+
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ // TODO
+ throw new UnsupportedOperationException(this.getClass()+"Serialization not supported yet");
+ }
+
+
+
+}
Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/FuzzySet.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/FuzzySet.java (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/FuzzySet.java 2009-04-06 08:52:22 UTC (rev 25969)
@@ -0,0 +1,39 @@
+package org.drools.fuzzy;
+
+import org.drools.degrees.IDegree;
+import org.drools.degrees.SimpleDegree;
+import org.drools.fuzzy.evaluators.membership.IMembershipFunction;
+import org.drools.spi.Evaluator;
+
+public abstract class FuzzySet implements IDegree {
+
+ protected Evaluator membershipEvaluator;
+ protected String name;
+
+ public FuzzySet(String name, Evaluator mu) {
+ this.name = name;
+ this.membershipEvaluator = mu;
+ }
+
+ public Evaluator getEvaluator() {
+ return membershipEvaluator;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+
+
+
+
+ public SimpleDegree getDegree() {
+ // TODO Defuzzify here
+ return null;
+ }
+
+ public boolean toBoolean() {
+ return getDegree().toBoolean();
+ }
+
+}
Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/NumericDomainFuzzySet.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/NumericDomainFuzzySet.java (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/NumericDomainFuzzySet.java 2009-04-06 08:52:22 UTC (rev 25969)
@@ -0,0 +1,19 @@
+package org.drools.fuzzy;
+
+import org.drools.fuzzy.evaluators.FuzzyNumericEvaluator;
+import org.drools.fuzzy.evaluators.membership.IMembershipFunction;
+import org.drools.fuzzy.evaluators.membership.INumericSetMembershipFunction;
+
+public class NumericDomainFuzzySet extends FuzzySet {
+
+ public NumericDomainFuzzySet(String name, FuzzyNumericEvaluator mu) {
+ super(name, mu);
+ }
+
+
+ public Number defuzzify() {
+ return ((FuzzyNumericEvaluator) this.membershipEvaluator).getCenter();
+ }
+
+
+}
Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/RealDomain.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/RealDomain.java (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/RealDomain.java 2009-04-06 08:52:22 UTC (rev 25969)
@@ -0,0 +1,47 @@
+package org.drools.fuzzy;
+
+import org.drools.base.ValueType;
+import org.drools.degrees.IDegree;
+
+
+
+public abstract class RealDomain extends FuzzyDomain {
+
+ private Double value;
+
+
+ public Double getValue() {
+ if (value != null)
+ return value;
+ else if (getPossibilityDistribution() == null)
+ return null;
+ else return ((NumericDomainFuzzySet) getPossibilityDistribution()).defuzzify().doubleValue();
+ }
+
+ public void setValue(Double value) {
+ this.value = value;
+ }
+
+ protected void setValueBit(Double value) {
+ if (this.value == null)
+ this.value = value;
+ else this.value += value;
+ }
+
+
+ public void setValue(String op, IDegree deg) {
+ System.out.println(this.getClass()+" WARNING : NEED TO IMPLEMENT Alpha-Cuts AND SET UNION");
+ double refVal = ((NumericDomainFuzzySet) this.getGranule(op)).defuzzify().doubleValue();
+ double wgt = deg.getDegree().getValue();
+
+ setValueBit(refVal*wgt);
+ }
+
+
+ public boolean supportsType(ValueType type) {
+
+ return type.isNumber();
+ }
+
+
+}
Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/FuzzyNumericEvaluator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/FuzzyNumericEvaluator.java (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/FuzzyNumericEvaluator.java 2009-04-06 08:52:22 UTC (rev 25969)
@@ -0,0 +1,224 @@
+package org.drools.fuzzy.evaluators;
+
+
+import java.io.File;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.lang.reflect.InvocationTargetException;
+import java.rmi.server.Skeleton;
+import java.util.StringTokenizer;
+
+
+import org.drools.RuntimeDroolsException;
+import org.drools.WorkingMemory;
+import org.drools.base.BaseImperfectEvaluator;
+import org.drools.base.ValueType;
+import org.drools.base.evaluators.Operator;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.fuzzy.evaluators.membership.INumericSetMembershipFunction;
+import org.drools.fuzzy.evaluators.membership.SkepticNumericMembershipFunction;
+import org.drools.reteoo.ImperfectRuleBase;
+import org.drools.rule.VariableRestriction.VariableContextEntry;
+import org.drools.spi.FieldValue;
+
+import org.drools.spi.InternalReadAccessor;
+
+
+
+
+public class FuzzyNumericEvaluator extends BaseImperfectEvaluator {
+
+
+ private INumericSetMembershipFunction mu;
+
+ private boolean isNegated;
+
+
+ public FuzzyNumericEvaluator(Operator op, final ValueType type,
+ final boolean isNegated,
+ final String parameters) {
+ super( type , op );
+ this.isNegated = isNegated;
+
+ this.mu = this.parseParameters( parameters );
+ }
+
+
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ super.readExternal(in);
+ mu = (INumericSetMembershipFunction) in.readObject();
+ isNegated = in.readBoolean();
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ super.writeExternal(out);
+ out.writeObject(mu);
+ out.writeBoolean(isNegated);
+ }
+
+
+
+ protected IDegree eval(Number number, IDegreeFactory factory) {
+
+ if (number == null) return factory.Unknown();
+
+ return mu.eval(number, factory);
+ }
+
+
+ public String toString() {
+ return "FuzzyNumericEvaluator - " + getOperator().getOperatorString();
+ }
+
+
+
+
+
+ public IDegree evaluate(InternalWorkingMemory workingMemory, IDegreeFactory factory,
+ InternalReadAccessor extractor, Object object1, FieldValue value) {
+
+ Object field = extractor.getValue(object1);
+ if (field == null)
+ return eval(null, factory);
+
+ return eval((Number) field, factory);
+
+ }
+
+
+ public boolean evaluate(InternalWorkingMemory workingMemory,
+ InternalReadAccessor extractor, Object object1, FieldValue value) {
+ return evaluate(workingMemory, getFactory(workingMemory), extractor, object1, value).toBoolean();
+ }
+
+
+ public IDegree evaluate(InternalWorkingMemory workingMemory,
+ IDegreeFactory factory,
+ InternalReadAccessor leftExtractor, Object left,
+ InternalReadAccessor rightExtractor, Object right) {
+ throw new RuntimeDroolsException("Fuzzy Numeric Evaluator : Unary op ");
+ }
+
+ public boolean evaluate(InternalWorkingMemory workingMemory,
+ InternalReadAccessor leftExtractor, Object left,
+ InternalReadAccessor rightExtractor, Object right) {
+ throw new RuntimeDroolsException("Fuzzy Numeric Evaluator : Unary op ");
+ }
+
+
+ public IDegree evaluateUncertainCachedLeft(InternalWorkingMemory workingMemory,
+ VariableContextEntry context, Object object1) {
+ throw new RuntimeDroolsException("Fuzzy Numeric Evaluator : Unary op ");
+ }
+ public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+ VariableContextEntry context, Object object1) {
+ return evaluateUncertainCachedLeft(workingMemory,context,object1).toBoolean();
+ }
+
+
+ public IDegree evaluateUncertainCachedRight(InternalWorkingMemory workingMemory,
+ VariableContextEntry context, Object object2) {
+ throw new RuntimeDroolsException("Fuzzy Numeric Evaluator : Unary op ");
+ }
+ public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+ VariableContextEntry context, Object object2) {
+ return evaluateUncertainCachedRight(workingMemory, context, object2).toBoolean();
+ }
+
+
+
+
+
+ public Number getCenter() {
+ return mu.getCenter();
+ }
+
+
+
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 37;
+ int result = PRIME * super.hashCode() * mu.hashCode();
+ return result;
+ }
+
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if ( this == obj ) return true;
+ if ( !super.equals( obj ) ) return false;
+ if ( getClass() != obj.getClass() ) return false;
+ return this.mu.equals(((FuzzyNumericEvaluator) obj).mu);
+ }
+
+ /**
+ * This methods tries to parse the string of parameters to customize
+ * the evaluator.
+ *
+ * @param parameters
+ */
+ private INumericSetMembershipFunction parseParameters(String parameters) {
+
+ StringTokenizer tok = new StringTokenizer(parameters," ,");
+ if (tok.countTokens() == 0)
+ return new SkepticNumericMembershipFunction();
+
+ String className = tok.nextToken();
+
+ int numParm = tok.countTokens();
+ String[] params = new String[numParm];
+
+ for (int j = 0; j < numParm; j++) {
+ params[j] = tok.nextToken();
+ }
+
+
+ try {
+ Class clazz = Class.forName(className);
+ Object obj = clazz.getConstructor().newInstance();
+
+ if (obj instanceof INumericSetMembershipFunction) {
+
+ INumericSetMembershipFunction mu = (INumericSetMembershipFunction) obj;
+ mu.init(params);
+ return mu;
+ }
+ } catch (ClassNotFoundException e) {
+ System.out.println(e.toString());
+// e.printStackTrace();
+ } catch (SecurityException e) {
+ System.out.println(e.toString());
+// e.printStackTrace();
+ } catch (NoSuchMethodException e) {
+ System.out.println(e.toString());
+// e.printStackTrace();
+ } catch (IllegalArgumentException e) {
+ System.out.println(e.toString());
+// e.printStackTrace();
+ } catch (InstantiationException e) {
+ System.out.println(e.toString());
+// e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ System.out.println(e.toString());
+// e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ System.out.println(e.toString());
+// e.printStackTrace();
+ }
+
+ throw new RuntimeDroolsException( "[Fuzzy Numeric Evaluator]: Unable to parse parameters: '" + parameters + "'" );
+
+
+ }
+
+}
+
+
\ No newline at end of file
Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/HotEvaluatorDefinition.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/HotEvaluatorDefinition.java (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/HotEvaluatorDefinition.java 2009-04-06 08:52:22 UTC (rev 25969)
@@ -0,0 +1,92 @@
+package org.drools.fuzzy.evaluators;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.base.ValueType;
+import org.drools.base.evaluators.EvaluatorDefinition;
+import org.drools.base.evaluators.Operator;
+import org.drools.base.evaluators.EvaluatorDefinition.Target;
+import org.drools.spi.Evaluator;
+
+public class HotEvaluatorDefinition implements EvaluatorDefinition {
+
+ public static final Operator HOT = Operator.addOperatorToRegistry( "hot",
+ false );
+
+ private static final String[] SUPPORTED_IDS = {HOT.getOperatorString()};
+
+ private Map<String, Evaluator> cache = Collections.emptyMap();
+
+
+ public Evaluator getEvaluator(ValueType type, String operatorId,
+ boolean isNegated, String parameterText) {
+
+
+ if ( this.cache == Collections.EMPTY_MAP ) {
+ this.cache = new HashMap<String, Evaluator>();
+ }
+ String key = isNegated + ":" + parameterText;
+ Evaluator eval = this.cache.get( key );
+ if ( eval == null ) {
+// eval = new HotEvaluator( type,
+// isNegated,
+// parameterText );
+ eval = new FuzzyNumericEvaluator(HOT,
+ type,
+ isNegated,
+ parameterText);
+ this.cache.put( key,
+ eval );
+ }
+ return eval;
+
+
+
+ }
+
+ public Evaluator getEvaluator(ValueType type, Operator operator,
+ String parameterText) {
+ return getEvaluator(type,operator.getOperatorString(),false,parameterText);
+ }
+
+ public Evaluator getEvaluator(ValueType type, Operator operator) {
+ return getEvaluator(type,operator.getOperatorString(),false,"");
+ }
+
+ public Evaluator getEvaluator(ValueType type, String operatorId,
+ boolean isNegated, String parameterText, Target leftTarget,
+ Target rightTarget) {
+ return getEvaluator(type, operatorId, isNegated, parameterText);
+ }
+
+ public String[] getEvaluatorIds() {
+ return SUPPORTED_IDS;
+ }
+
+ public Target getTarget() {
+ return Target.FACT;
+ }
+
+ public boolean isNegatable() {
+ return true;
+ }
+
+ public boolean supportsType(ValueType type) {
+ return true;
+ }
+
+ public void readExternal(ObjectInput arg0) throws IOException,
+ ClassNotFoundException {
+
+ }
+
+ public void writeExternal(ObjectOutput arg0) throws IOException {
+
+ }
+
+}
Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/IDynamicEvaluable.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/IDynamicEvaluable.java (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/IDynamicEvaluable.java 2009-04-06 08:52:22 UTC (rev 25969)
@@ -0,0 +1,9 @@
+package org.drools.fuzzy.evaluators;
+
+import org.drools.spi.Evaluator;
+
+public interface IDynamicEvaluable {
+
+ public Evaluator getPred(String opId);
+
+}
Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/MockEvaluator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/MockEvaluator.java (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/MockEvaluator.java 2009-04-06 08:52:22 UTC (rev 25969)
@@ -0,0 +1,121 @@
+package org.drools.fuzzy.evaluators;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.WorkingMemory;
+import org.drools.base.BaseImperfectEvaluator;
+import org.drools.base.ValueType;
+import org.drools.base.evaluators.Operator;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ImperfectRuleBase;
+import org.drools.rule.VariableRestriction.VariableContextEntry;
+import org.drools.spi.FieldValue;
+import org.drools.spi.InternalReadAccessor;
+
+
+
+
+public class MockEvaluator extends BaseImperfectEvaluator {
+
+
+ private final static Operator MOP = Operator.addOperatorToRegistry("NOPERATOR", false) ;
+
+
+ public MockEvaluator(final ValueType type,
+ final boolean isNegated,
+ final String parameters) {
+ super( type,
+ MOP);
+ this.parseParameters( parameters );
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ super.readExternal(in);
+
+
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ super.writeExternal(out);
+
+
+ }
+
+
+
+ protected IDegree eval(WorkingMemory workingMemory) {
+ if (! (workingMemory.getRuleBase() instanceof ImperfectRuleBase)) {
+ throw new RuntimeDroolsException("Mock Evaluator : Uncertainty has not been enabled in the current Rule Base");
+ }
+ IDegreeFactory factory = ((ImperfectRuleBase) workingMemory.getRuleBase()).getDegreeFactory();
+
+ return factory.Unknown();
+ }
+
+
+ public boolean evaluate(InternalWorkingMemory workingMemory,
+ InternalReadAccessor extractor, Object object1, FieldValue value) {
+ return eval(workingMemory).toBoolean();
+ }
+
+
+
+ public boolean evaluate(InternalWorkingMemory workingMemory,
+ InternalReadAccessor leftExtractor, Object left,
+ InternalReadAccessor rightExtractor, Object right) {
+ return eval(workingMemory).toBoolean();
+ }
+
+
+ public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+ VariableContextEntry context, Object object1) {
+ return eval(workingMemory).toBoolean();
+ }
+
+
+ public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+ VariableContextEntry context, Object object2) {
+ return eval(workingMemory).toBoolean();
+ }
+
+
+
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 37;
+ int result = PRIME * super.hashCode();
+ return result;
+ }
+
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if ( this == obj ) return true;
+ if ( !super.equals( obj ) ) return false;
+ if ( getClass() != obj.getClass() ) return false;
+ return true;
+ }
+
+ /**
+ * This methods tries to parse the string of parameters to customize
+ * the evaluator.
+ *
+ * @param parameters
+ */
+ private void parseParameters(String parameters) {
+
+ }
+
+
+}
+
+
\ No newline at end of file
Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/SeemsEvaluator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/SeemsEvaluator.java (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/SeemsEvaluator.java 2009-04-06 08:52:22 UTC (rev 25969)
@@ -0,0 +1,175 @@
+package org.drools.fuzzy.evaluators;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.WorkingMemory;
+import org.drools.base.BaseImperfectEvaluator;
+import org.drools.base.ValueType;
+import org.drools.base.evaluators.Operator;
+import org.drools.base.field.LongFieldImpl;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.ImperfectRuleBase;
+import org.drools.rule.VariableRestriction.VariableContextEntry;
+import org.drools.spi.Evaluator;
+import org.drools.spi.FieldValue;
+
+import org.drools.spi.InternalReadAccessor;
+
+
+
+
+public class SeemsEvaluator
+ extends BaseImperfectEvaluator {
+
+
+
+
+
+
+ public SeemsEvaluator() {
+ this(ValueType.OBJECT_TYPE,false,"");
+ }
+
+
+ public SeemsEvaluator(final ValueType type,
+ final boolean isNegated,
+ final String parameters) {
+ super( type,
+ SeemsEvaluatorDefinition.SEEMS);
+ }
+
+
+
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ super.readExternal(in);
+
+
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ super.writeExternal(out);
+
+
+ }
+
+
+
+ protected IDegree eval(WorkingMemory workingMemory) {
+ if (! (workingMemory.getRuleBase() instanceof ImperfectRuleBase)) {
+ throw new RuntimeDroolsException("Seems Evaluator : Uncertainty has not been enabled in the current Rule Base");
+ }
+ IDegreeFactory factory = ((ImperfectRuleBase) workingMemory.getRuleBase()).getDegreeFactory();
+
+ return eval(factory);
+ }
+
+ protected IDegree eval(IDegreeFactory factory) {
+ return factory.Unknown();
+ }
+
+ public IDegree evaluate(InternalWorkingMemory workingMemory,
+ IDegreeFactory factory,
+ InternalReadAccessor extractor,
+ Object object1,
+ FieldValue value) {
+
+ Evaluator set = ((IDynamicEvaluable) object1).getPred(value.toString());
+
+ return set.evaluate(workingMemory, factory, extractor, object1, new LongFieldImpl(1));
+
+ }
+
+ public boolean evaluate(InternalWorkingMemory workingMemory,
+ InternalReadAccessor extractor, Object object1, FieldValue value) {
+ return eval(workingMemory).toBoolean();
+ }
+
+
+ public IDegree evaluate(InternalWorkingMemory workingMemory,
+ IDegreeFactory factory,
+ InternalReadAccessor leftExtractor, Object left,
+ InternalReadAccessor rightExtractor, Object right) {
+
+
+ Object set = rightExtractor.getValue(right);
+ if (set == null) {
+ return factory.Unknown();
+ }
+ return ((Evaluator) set).evaluate(workingMemory, factory, leftExtractor, left, new LongFieldImpl(1));
+
+ }
+
+ public boolean evaluate(InternalWorkingMemory workingMemory,
+ InternalReadAccessor leftExtractor, Object left,
+ InternalReadAccessor rightExtractor, Object right) {
+ return eval(workingMemory).toBoolean();
+ }
+
+
+ public IDegree evaluateCachedLeft(InternalWorkingMemory workingMemory,
+ VariableContextEntry context, IDegreeFactory factory, Object object1) {
+ return eval(factory);
+ }
+ public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+ VariableContextEntry context, Object object1) {
+ return eval(workingMemory).toBoolean();
+ }
+
+
+ public IDegree evaluateCachedRight(InternalWorkingMemory workingMemory,
+ VariableContextEntry context, IDegreeFactory factory, Object object2) {
+ return eval(factory);
+ }
+ public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+ VariableContextEntry context, Object object2) {
+ return eval(workingMemory).toBoolean();
+ }
+
+
+
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 37;
+ int result = PRIME * super.hashCode();
+ return result;
+ }
+
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if ( this == obj ) return true;
+ if ( !super.equals( obj ) ) return false;
+ if ( getClass() != obj.getClass() ) return false;
+ return true;
+ }
+
+
+ public String toString() {
+ return SeemsEvaluatorDefinition.SEEMS.getOperatorString();
+ }
+
+ /**
+ * This methods tries to parse the string of parameters to customize
+ * the evaluator.
+ *
+ * @param parameters
+ */
+ private void parseParameters(String parameters) {
+
+ }
+
+
+
+}
+
+
\ No newline at end of file
Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/SeemsEvaluatorDefinition.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/SeemsEvaluatorDefinition.java (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/SeemsEvaluatorDefinition.java 2009-04-06 08:52:22 UTC (rev 25969)
@@ -0,0 +1,199 @@
+package org.drools.fuzzy.evaluators;
+
+
+
+
+import java.awt.geom.Point2D;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.drools.RuntimeDroolsException;
+import org.drools.WorkingMemory;
+import org.drools.base.BaseEvaluator;
+import org.drools.base.BaseImperfectEvaluator;
+import org.drools.base.ValueType;
+import org.drools.base.evaluators.ImperfectBinaryEvaluatorDefinition;
+import org.drools.base.evaluators.Operator;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
+import org.drools.rule.VariableRestriction.VariableContextEntry;
+import org.drools.spi.Evaluator;
+import org.drools.spi.FieldValue;
+import org.drools.spi.InternalReadAccessor;
+
+
+
+
+
+
+
+/**
+ *
+ * @author sotty
+
+ *
+ */
+public class SeemsEvaluatorDefinition
+ implements ImperfectBinaryEvaluatorDefinition {
+
+
+
+
+
+
+
+
+
+
+ public static final Operator SEEMS = Operator.addOperatorToRegistry( "seems",
+ false );
+
+ private static final String[] SUPPORTED_IDS = {SEEMS.getOperatorString()};
+
+ private Map<String, Evaluator> cache = Collections.emptyMap();
+
+
+
+
+
+
+ public Evaluator getEvaluator(ValueType type, String operatorId,
+ boolean isNegated, String parameterText) {
+
+
+ if ( this.cache == Collections.EMPTY_MAP ) {
+ this.cache = new HashMap<String, Evaluator>();
+ }
+ String key = isNegated + ":" + parameterText;
+ Evaluator eval = this.cache.get( key );
+ if ( eval == null ) {
+ eval = new SeemsEvaluator( type,
+ isNegated,
+ parameterText );
+ this.cache.put( key,
+ eval );
+ }
+ return eval;
+
+
+
+ }
+
+ public Evaluator getEvaluator(ValueType type, Operator operator,
+ String parameterText) {
+ return getEvaluator(type,operator.getOperatorString(),false,parameterText);
+ }
+
+ public Evaluator getEvaluator(ValueType type, Operator operator) {
+ return getEvaluator(type,operator.getOperatorString(),false,"");
+ }
+
+ public Evaluator getEvaluator(ValueType type, String operatorId,
+ boolean isNegated, String parameterText, Target leftTarget,
+ Target rightTarget) {
+ return getEvaluator(type, operatorId, isNegated, parameterText);
+ }
+
+
+
+ /**
+ * Operator is known as "far"
+ */
+ public String[] getEvaluatorIds() {
+ return SUPPORTED_IDS;
+ }
+
+
+
+
+
+
+
+ /**
+ *
+ *
+ */
+ public boolean isNegatable() {
+ return true;
+ }
+
+
+
+ /**
+ * This evaluator operates on fact properties (i.e. age)
+ * and not on factHandles.
+ * So this returns false
+ */
+ public boolean operatesOnFactHandles() {
+ return false;
+ }
+
+
+
+
+
+ /**
+ *
+ */
+ public boolean supportsType(ValueType type) {
+ return type.isNumber();
+ }
+
+
+
+
+
+
+
+ /*
+ * TODO: Try and understand what this means. Copied from AfterEvalDef.
+ */
+
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ cache = (Map<String, Evaluator>) in.readObject();
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(cache);
+ }
+
+
+
+
+
+
+
+
+
+ public Target getTarget() {
+ return Target.FACT;
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/IMembershipFunction.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/IMembershipFunction.java (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/IMembershipFunction.java 2009-04-06 08:52:22 UTC (rev 25969)
@@ -0,0 +1,12 @@
+package org.drools.fuzzy.evaluators.membership;
+
+import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+
+
+
+public interface IMembershipFunction {
+
+ public IDegree eval(Object object, IDegreeFactory factory);
+
+}
Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/INumericSetMembershipFunction.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/INumericSetMembershipFunction.java (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/INumericSetMembershipFunction.java 2009-04-06 08:52:22 UTC (rev 25969)
@@ -0,0 +1,17 @@
+package org.drools.fuzzy.evaluators.membership;
+
+import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+
+
+public interface INumericSetMembershipFunction extends IMembershipFunction {
+
+ public void init(String[] args);
+
+ public IDegree eval(Number number, IDegreeFactory factory);
+
+
+
+ public Number getCenter();
+
+}
Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/Radial2DMembershipFunction.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/Radial2DMembershipFunction.java (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/Radial2DMembershipFunction.java 2009-04-06 08:52:22 UTC (rev 25969)
@@ -0,0 +1,36 @@
+package org.drools.fuzzy.evaluators.membership;
+
+import java.awt.geom.Point2D;
+
+import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+
+public class Radial2DMembershipFunction implements IMembershipFunction {
+
+ double x;
+ double y;
+ double extx;
+ double exty;
+
+ public Radial2DMembershipFunction(double x, double y, double extx, double exty) {
+ this.x = x;
+ this.y = y;
+ this.extx = extx;
+ this.exty = exty;
+ }
+
+
+
+ public IDegree eval(Object object, IDegreeFactory factory) {
+ double[] vals = (double[]) object;
+
+ double dx = (x - vals[0]) / extx;
+ double dy = (y - vals[1]) / exty;
+ double dist = Math.sqrt(dx*dx + dy*dy);
+ double val = Math.exp(-dist*dist);
+ return factory.buildDegree((float) val);
+ }
+
+
+
+}
Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/SkepticNumericMembershipFunction.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/SkepticNumericMembershipFunction.java (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/SkepticNumericMembershipFunction.java 2009-04-06 08:52:22 UTC (rev 25969)
@@ -0,0 +1,30 @@
+package org.drools.fuzzy.evaluators.membership;
+
+import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+
+
+public class SkepticNumericMembershipFunction implements
+ INumericSetMembershipFunction {
+
+
+ public IDegree eval(Number number, IDegreeFactory factory) {
+ return factory.Unknown();
+ }
+
+
+ public Number getCenter() {
+ return 0;
+ }
+
+
+ public void init(String[] args) {
+
+ }
+
+
+ public IDegree eval(Object object, IDegreeFactory factory) {
+ return factory.Unknown();
+ }
+
+}
Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/TriangleMembership.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/TriangleMembership.java (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/membership/TriangleMembership.java 2009-04-06 08:52:22 UTC (rev 25969)
@@ -0,0 +1,66 @@
+package org.drools.fuzzy.evaluators.membership;
+
+import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+
+
+public class TriangleMembership implements INumericSetMembershipFunction {
+
+ protected Number center;
+
+ protected Number ext;
+
+ public Number getCenter() {
+ return center;
+ }
+
+
+
+ public TriangleMembership() {
+
+ }
+
+ public void init(String[] args) {
+ center = Double.parseDouble(args[0]);
+ ext = Double.parseDouble(args[1]);
+ }
+
+
+ public TriangleMembership(Number center, Number ext) {
+ this.center = center;
+ this.ext = ext;
+ }
+
+
+
+
+ public IDegree eval(Number number, IDegreeFactory factory) {
+ double ans = 1 - Math.abs(number.doubleValue() - center.doubleValue()) / ext.doubleValue();
+ return factory.buildDegree((float) Math.max(0,ans));
+ }
+
+
+ public IDegree eval(Object object, IDegreeFactory factory) {
+ if (object instanceof Number)
+ return eval( (Number) object, factory);
+ else return null;
+ }
+
+
+
+
+ public int hashCode() {
+ final int PRIME = 37;
+ int result = PRIME * center.hashCode() * ext.hashCode();
+ return result;
+ }
+
+
+ public boolean equals(Object obj) {
+ if ( this == obj ) return true;
+ if ( !super.equals( obj ) ) return false;
+ if ( getClass() != obj.getClass() ) return false;
+ TriangleMembership other = (TriangleMembership) obj;
+ return (this.center == other.center) && (this.ext == other.ext);
+ }
+}
More information about the jboss-svn-commits
mailing list