[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