[jboss-svn-commits] JBL Code SVN: r26664 - in labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools: base and 15 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu May 21 22:32:46 EDT 2009


Author: dsotty
Date: 2009-05-21 22:32:45 -0400 (Thu, 21 May 2009)
New Revision: 26664

Modified:
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/BaseImperfectEvaluator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/SequentialKnowledgeHelper.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImplicationBetaConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/IntervalDegree.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/IDegreeFactory.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/IntervalDegreeFactory.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/SimpleDegreeFactory.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/SimpleFuzzyDegreeFactory.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/IDegreeCombiner.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/IMergeStrategy.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/INullHandlingStrategy.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/NegationOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/DefaultIntervalMergeStrategy.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/DefaultIntervalNullHandlingStrategy.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalDiscountOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalDoubleMPOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalEquivOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalExistsOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalForAnyOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalForallOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalIntersectionOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalLukasAndOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalLukasOrOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalMaxOrOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalMinAndOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalModusPonensOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalNegationOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalXorOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleAverage.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleDotAnd.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleDoubleMPOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleEquiv.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleIdentityOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleLukasAnd.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleLukasOr.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMaxOr.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMinAnd.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleNot.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleNullHandlingStrategy.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleProbSumOr.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleVeryModifier.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleXor.java
   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/evaluators/FuzzyNumericEvaluator.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/RandomEvaluator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/RandomEvaluatorDefinition.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/impl/StatefulKnowledgeSessionImpl.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/process/command/impl/CommandBasedStatefulKnowledgeSession.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluation.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluationTemplate.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeLeftTupleSinkAdapter.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalRecord.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Evaluation.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvaluationTemplate.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/GammaMemory.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectExistsNode.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectRuleBase.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ModusPonensNode.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/OperatorInstaller.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Rete.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SetCompositeEvaluation.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SingleEvaluationTemplate.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SingleLeftTupleSinkAdapter.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectGroupElementBuilder.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/DefaultIntervalFilterStrategy.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/SimpleFilterStrategy.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/AndConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/GroupElement.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/GroupElementFactory.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/MutableTypeConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/OrConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java
Log:
Major update

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/RuleBaseConfiguration.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -136,6 +136,7 @@
     private String                         ruleBaseUpdateHandler;
     private boolean 					   imperfect;    
     
+    
 
     private EventProcessingMode            eventProcessingMode;
 
@@ -155,6 +156,7 @@
     private NodeInstanceFactoryRegistry    processNodeInstanceFactoryRegistry;
 
     private String						   imperfectFactoryName;
+    private boolean						   cwa;
     
     private transient ClassLoader          classLoader;
 
@@ -185,6 +187,7 @@
         out.writeInt( maxThreads );
         out.writeObject( eventProcessingMode );
         out.writeObject(imperfectFactoryName);
+        out.writeBoolean(cwa);
     }
 
     public void readExternal(ObjectInput in) throws IOException,
@@ -213,6 +216,7 @@
         maxThreads = in.readInt();
         eventProcessingMode = (EventProcessingMode) in.readObject();
         imperfectFactoryName = (String) in.readObject();
+        cwa = in.readBoolean();
     }
 
     /**
@@ -304,12 +308,16 @@
             setEventProcessingMode( EventProcessingMode.determineAssertBehaviour( StringUtils.isEmpty( value ) ? "cloud" : value ) );
         } else if ( name.equals( "org.drools.chance.factory" ) ) {
             setFactoryName(value);
+        } else if ( name.equals( "org.drools.chance.cwa" ) ) {
+            setClosedWorldAssumption(StringUtils.isEmpty( value ) ? true : Boolean.valueOf( value ));
         } else if ( name.equals( "org.drools.chance.enable" ) ) {
-            setImperfectActive(Boolean.parseBoolean(value));
+            setImperfectActive(StringUtils.isEmpty( value ) ? true : Boolean.valueOf( value ));
         }
     }
 
-    public String getProperty(String name) {
+    
+
+	public String getProperty(String name) {
         name = name.trim();
         if ( StringUtils.isEmpty( name ) ) {
             return null;
@@ -357,7 +365,9 @@
             return getEventProcessingMode().toExternalForm();
         } else if ( name.equals( "org.drools.chance.factory" ) ) {
             return getFactoryName();
-        }
+        } else if ( name.equals( "org.drools.chance.cwa" ) ) {
+            return Boolean.toString( getClosedWorldAssumption());
+        } 
 
         return null;
     }
@@ -462,11 +472,21 @@
         setFactoryName(this.chainedProperties.getProperty("org.drools.chance.factory", "org.drools.degrees.factory.SimpleDegreeFactory"));
         
         setImperfectActive( Boolean.valueOf( this.chainedProperties.getProperty("org.drools.chance.enable", "false")).booleanValue());
+        
+        setClosedWorldAssumption( Boolean.valueOf( this.chainedProperties.getProperty("org.drools.chance.cwa", "true")).booleanValue());
     }
 
     private void setImperfectActive(boolean booleanValue) {
     	this.imperfect = booleanValue;		
 	}
+    
+    private void setClosedWorldAssumption(boolean b) {
+		this.cwa = b;
+	}
+    
+    public boolean getClosedWorldAssumption() {
+    	return this.cwa;
+    }
 
 	/**
      * Makes the configuration object immutable. Once it becomes immutable,

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/BaseImperfectEvaluator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/BaseImperfectEvaluator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/BaseImperfectEvaluator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -10,6 +10,7 @@
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.reteoo.ImperfectRuleBase;
+import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
 import org.drools.spi.FieldValue;
 import org.drools.spi.InternalReadAccessor;
@@ -26,8 +27,9 @@
 public abstract class BaseImperfectEvaluator extends BaseEvaluator  {
 
 	
-	public BaseImperfectEvaluator(final ValueType type, final Operator operator) {
+	public BaseImperfectEvaluator(final ValueType type, final Operator operator, String parameters) {
 		super(type,operator);
+		this.parseParameters( parameters );	
 	}
 	
 	
@@ -40,8 +42,107 @@
 	
 	
 	
+	public boolean evaluate(InternalWorkingMemory workingMemory,
+            final InternalReadAccessor leftExtractor,
+            final Object left,
+            final InternalReadAccessor rightExtractor,
+            final Object right) {
+		return evaluate(workingMemory,
+				getFactory(workingMemory),
+				leftExtractor,
+				left,
+				rightExtractor,
+				right).toBoolean();
+	}
+    
+    public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
+            final VariableContextEntry context,
+            final Object left) {
+    	return evaluateCachedRight(workingMemory,    					
+    					context,
+    					getFactory(workingMemory),
+    					left).toBoolean();
+    }
+    
+    public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
+            final VariableContextEntry context,
+            final Object right) {
+    	return evaluateCachedLeft(workingMemory, 
+    					context, 
+    					getFactory(workingMemory),
+    					right).toBoolean();
+    }
+    
+    public boolean evaluate(InternalWorkingMemory workingMemory,
+            final InternalReadAccessor extractor,
+            final Object object,
+            final FieldValue value) {
+    	return evaluate(workingMemory,
+    					getFactory(workingMemory),
+    					extractor, 
+    					object, 
+    					value).toBoolean();
+    }
+    
+    
+    
+    
+    
+    
+    
+    public IDegree evaluate(InternalWorkingMemory workingMemory,
+    		IDegreeFactory factory, InternalReadAccessor extractor, 
+    		Object object1, FieldValue value) {
+		        					
+		Object field = extractor.getValue(object1);
+		    		    								
+		return eval(field, value, factory);											
+	}
+    
+	public IDegree evaluate(InternalWorkingMemory workingMemory,
+			IDegreeFactory factory, InternalReadAccessor leftExtractor,
+			Object left, InternalReadAccessor rightExtractor, Object right) {
+		
+		Object leftArg = leftExtractor.getValue(workingMemory,left);
+		Object rightArg = rightExtractor.getValue(workingMemory,right);
+					
+		return eval(leftArg, rightArg, factory);
+	}
 	
+	public IDegree evaluateCachedLeft(InternalWorkingMemory workingMemory,
+			VariableContextEntry context, IDegreeFactory factory, Object object1) {
+					
+		Object v1 = ((ObjectVariableContextEntry) context).left;
+		Object v2 = object1;
+		
+		return eval(v1,v2,factory);
+	}
+	
+	public IDegree evaluateCachedRight(InternalWorkingMemory workingMemory,
+			VariableContextEntry context, IDegreeFactory factory, Object object) {
+			
+		Object o1 =  object;
+		Object o2 =  ((ObjectVariableContextEntry) context).right;			
+		
+		return eval(o1,o2,factory);
+		
+	}
 
 	
+	
+	
+	protected abstract IDegree eval(Object left, Object right, IDegreeFactory factory);
+	
+	
+	public String toString() {
+		return getOperator().getOperatorString() ;
+	}
+	
+	
+	
+	protected void parseParameters(String s) {
+		
+	}
+	
 
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/DefaultKnowledgeHelper.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -285,58 +285,119 @@
     
     
     
-    
+    public IDegree getConsequenceDegree() {
+    	return consequenceDegree;    
+    }
    
     public void setConsequenceDegree(IDegree deg) {
     	this.consequenceDegree = deg;
     }
     
+    
+
+	public Evaluation getEvaluation() {
+		return evaluation;
+	}
+	
+	public void setEvaluation(Evaluation eval) {
+		this.evaluation = eval;
+	}
+    
+    
+    
+    
+    
+    
+	
+	
+	
+	
+	
+	
+	
+	
+    
     public void injectKey(ArgList args, String field, String op, String value) {
     	System.out.println("\n"+this.getClass()+" : KH injects a rule for degree "+getConsequenceDegree());
     	workingMemory.inject(this.getRule().getName(), 
     					     args,
     					     new ConstraintKey(field,op,value),
-    					     getConsequenceDegree());    	
+    					     getConsequenceDegree(),
+    					     false);    	
     }
+    public void injectKey(ArgList args, String field, String op, String value, boolean killer) {
+    	System.out.println("\n"+this.getClass()+" : KH injects a rule for degree "+getConsequenceDegree());
+    	workingMemory.inject(this.getRule().getName(), 
+    					     args,
+    					     new ConstraintKey(field,op,value),
+    					     getConsequenceDegree(),
+    					     killer);    	
+    }
     
-    
-    
-    public IDegree getConsequenceDegree() {
-    	return consequenceDegree;    
-    }
-
-	public void injectKey(Object arg, String field, String op, String value) {
-		this.injectKey(new ArgList(arg), field, op, value);
-	}
-
-	public void injectKey(Object[] args, String field, String op, String value) {
-		this.injectKey(new ArgList(args), field, op, value);
+    public void injectKey(Object arg, String key) {
+		workingMemory.inject(this.getRule().getName(), 
+							 new ArgList(arg), 
+							 new ConstraintKey(key),
+							 getConsequenceDegree(),
+							 false);
 		
 	}
-
-	public void injectKey(Object arg, String key) {
+    public void injectKey(Object arg, String key, boolean killer) {
 		workingMemory.inject(this.getRule().getName(), 
 							 new ArgList(arg), 
 							 new ConstraintKey(key),
-							 getConsequenceDegree());
+							 getConsequenceDegree(),
+							 killer);
 		
 	}
+	public void rejectKey(Object arg, String key) {
+		workingMemory.reject(this.getRule().getName(), 
+							 new ArgList(arg), 
+							 new ConstraintKey(key),
+							 getConsequenceDegree(),
+							 false);
+		
+	}
+	public void rejectKey(Object arg, String key, boolean killer) {
+		workingMemory.reject(this.getRule().getName(), 
+							 new ArgList(arg), 
+							 new ConstraintKey(key),
+							 getConsequenceDegree(),
+							 killer);
+		
+	}
+	
 
 	public void injectKey(Object[] args, String key) {
 		workingMemory.inject(this.getRule().getName(), 
 				 new ArgList(args), 
 				 new ConstraintKey(key),
-				 getConsequenceDegree());		
+				 getConsequenceDegree(),
+				 false);		
 	}
+	public void injectKey(Object[] args, String key, boolean killer) {
+		workingMemory.inject(this.getRule().getName(), 
+				 new ArgList(args), 
+				 new ConstraintKey(key),
+				 getConsequenceDegree(),
+				 killer);		
+	}
+	public void rejectKey(Object[] args, String key) {
+		workingMemory.reject(this.getRule().getName(), 
+				 new ArgList(args), 
+				 new ConstraintKey(key),
+				 getConsequenceDegree(),
+				 false);		
+	}
+	public void rejectKey(Object[] args, String key, boolean killer) {
+		workingMemory.reject(this.getRule().getName(), 
+				 new ArgList(args), 
+				 new ConstraintKey(key),
+				 getConsequenceDegree(),
+				 killer);		
+	}
 	
 	
-	public Evaluation getEvaluation() {
-		return evaluation;
-	}
-	
-	public void setEvaluation(Evaluation eval) {
-		this.evaluation = eval;
-	}
 
 	
 	
@@ -345,33 +406,176 @@
 		workingMemory.inject(this.getRule().getName(), 
 				 new ArgList(arg), 
 				 key,
-				 getConsequenceDegree());	
+				 getConsequenceDegree(),
+				 false);	
 	}
+	public void injectId(Object arg, String id, boolean killer) {
+		ConstraintKey key = workingMemory.retrieveKeyForId(id);
+		workingMemory.inject(this.getRule().getName(), 
+				 new ArgList(arg), 
+				 key,
+				 getConsequenceDegree(),
+				 killer);	
+	}
+	public void rejectId(Object arg, String id) {
+		ConstraintKey key = workingMemory.retrieveKeyForId(id);
+		workingMemory.reject(this.getRule().getName(), 
+				 new ArgList(arg), 
+				 key,
+				 getConsequenceDegree(),
+				 false);	
+	}
+	public void rejectId(Object arg, String id, boolean killer) {
+		ConstraintKey key = workingMemory.retrieveKeyForId(id);
+		workingMemory.reject(this.getRule().getName(), 
+				 new ArgList(arg), 
+				 key,
+				 getConsequenceDegree(),
+				 killer);	
+	}
+	
+	
 
 	public void injectId(Object[] args, String id) {
 		ConstraintKey key = workingMemory.retrieveKeyForId(id);
 		workingMemory.inject(this.getRule().getName(), 
 				 new ArgList(args), 
 				 key,
-				 getConsequenceDegree());	
+				 getConsequenceDegree(),
+				 false);	
 	}
+	public void injectId(Object[] args, String id,boolean killer) {
+		ConstraintKey key = workingMemory.retrieveKeyForId(id);
+		workingMemory.inject(this.getRule().getName(), 
+				 new ArgList(args), 
+				 key,
+				 getConsequenceDegree(),
+				 killer);	
+	}
+	public void rejectId(Object[] args, String id) {
+		ConstraintKey key = workingMemory.retrieveKeyForId(id);
+		workingMemory.reject(this.getRule().getName(), 
+				 new ArgList(args), 
+				 key,
+				 getConsequenceDegree(),
+				 false);	
+	}
+	public void rejectId(Object[] args, String id,boolean killer) {
+		ConstraintKey key = workingMemory.retrieveKeyForId(id);
+		workingMemory.reject(this.getRule().getName(), 
+				 new ArgList(args), 
+				 key,
+				 getConsequenceDegree(),
+				 killer);	
+	}
+    
+   
 
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	
+	public void injectKey(Object arg, String field, String op, String value) {
+		this.injectKey(new ArgList(arg), field, op, value,false);
+	}
+	public void injectKey(Object arg, String field, String op, String value, boolean killer) {
+		this.injectKey(new ArgList(arg), field, op, value,killer);
+	}
+	public void rejectKey(Object arg, String field, String op, String value) {
+		this.rejectKey(new ArgList(arg), field, op, value,false);
+	}
+	public void rejectKey(Object arg, String field, String op, String value, boolean killer) {
+		this.rejectKey(new ArgList(arg), field, op, value, killer);
+	}
+	
+	
+	
+
+	public void injectKey(Object[] args, String field, String op, String value) {
+		this.injectKey(new ArgList(args), field, op, value,false);		
+	}
+	public void injectKey(Object[] args, String field, String op, String value, boolean killer) {
+		this.injectKey(new ArgList(args), field, op, value, killer);		
+	}
+	public void rejectKey(Object[] args, String field, String op, String value) {
+		this.rejectKey(new ArgList(args), field, op, value, false);		
+	}
+	public void rejectKey(Object[] args, String field, String op, String value, boolean killer) {
+		this.rejectKey(new ArgList(args), field, op, value, killer);		
+	}
+
+	
+	
+
 	public void inject(Object arg, String field, String op, String value) {
-		injectKey(arg,field,op,value);
-		
+		injectKey(arg,field,op,value,false);		
 	}
+	public void inject(Object arg, String field, String op, String value, boolean killer) {
+		injectKey(arg,field,op,value,killer);		
+	}
+	public void reject(Object arg, String field, String op, String value) {
+		rejectKey(arg,field,op,value,false);		
+	}
+	public void reject(Object arg, String field, String op, String value, boolean killer) {
+		rejectKey(arg,field,op,value, killer);		
+	}
 
+	
+	
 	public void inject(Object[] args, String field, String op, String value) {
-		injectKey(args,field,op,value);
+		injectKey(args,field,op,value,false);
 	}
+	public void inject(Object[] args, String field, String op, String value, boolean killer) {
+		injectKey(args,field,op,value,killer);
+	}
+	public void reject(Object[] args, String field, String op, String value) {
+		rejectKey(args,field,op,value,false);
+	}
+	public void reject(Object[] args, String field, String op, String value,boolean killer) {
+		rejectKey(args,field,op,value,killer);
+	}
 
+	
+	
 	public void inject(Object arg, String key) {
-		injectKey(arg,key);
+		injectKey(arg,key,false);
 	}
+	public void inject(Object arg, String key,boolean killer) {
+		injectKey(arg,key,killer);
+	}
+	public void reject(Object arg, String key) {
+		rejectKey(arg,key,false);
+	}
+	public void reject(Object arg, String key,boolean killer) {
+		rejectKey(arg,key,killer);
+	}
 
+	
+	
 	public void inject(Object[] args, String key) {
-		injectKey(args,key);
+		injectKey(args,key,false);
 	}
+	public void inject(Object[] args, String key,boolean killer) {
+		injectKey(args,key,killer);
+	}
+	public void reject(Object[] args, String key) {
+		rejectKey(args,key,false);
+	}
+	public void reject(Object[] args, String key, boolean killer) {
+		rejectKey(args,key,killer);
+	}
+
+	
+
+	
     
     
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/SequentialKnowledgeHelper.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/SequentialKnowledgeHelper.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/base/SequentialKnowledgeHelper.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -285,4 +285,162 @@
 		// TODO Auto-generated method stub
 		
 	}
+
+	public void reject(Object arg, String field, String op, String value) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void reject(Object[] args, String field, String op, String value) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void reject(Object arg, String key) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void reject(Object[] args, String key) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void rejectId(Object arg, String key) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void rejectId(Object[] args, String key) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void rejectKey(Object arg, String field, String op, String value) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void rejectKey(Object[] args, String field, String op, String value) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void rejectKey(Object arg, String key) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void rejectKey(Object[] args, String key) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void inject(Object arg, String field, String op, String value,
+			boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void inject(Object[] args, String field, String op, String value,
+			boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void inject(Object arg, String key, boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void inject(Object[] args, String key, boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void injectId(Object arg, String key, boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void injectId(Object[] args, String key, boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void injectKey(Object arg, String field, String op, String value,
+			boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void injectKey(Object[] args, String field, String op, String value,
+			boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void injectKey(Object arg, String key, boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void injectKey(Object[] args, String key, boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void reject(Object arg, String field, String op, String value,
+			boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void reject(Object[] args, String field, String op, String value,
+			boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void reject(Object arg, String key, boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void reject(Object[] args, String key, boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void rejectId(Object arg, String key, boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void rejectId(Object[] args, String key, boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void rejectKey(Object arg, String field, String op, String value,
+			boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void rejectKey(Object[] args, String field, String op, String value,
+			boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void rejectKey(Object arg, String key, boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void rejectKey(Object[] args, String key, boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -55,6 +55,8 @@
 import org.drools.definition.process.Process;
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.operators.IDegreeCombiner;
+import org.drools.degrees.operators.NegationOperator;
 import org.drools.event.AgendaEventListener;
 import org.drools.event.AgendaEventSupport;
 import org.drools.event.RuleBaseEventListener;
@@ -1943,11 +1945,15 @@
     
     
     
+    public void reject(String ruleName, ArgList args, ConstraintKey key, IDegree degree, boolean killer) {
+    	NegationOperator non = (NegationOperator) ((ImperfectRuleBase) getRuleBase()).getDegreeFactory().getNegationOperator();
+    		IDegree negDegree = non.negate(degree);
+    	inject(ruleName, args, key, negDegree, killer);
+    }
     
     
     
-    
-    public void inject(String ruleName, ArgList args, ConstraintKey key, IDegree degree) {
+    public void inject(String ruleName, ArgList args, ConstraintKey key, IDegree degree, boolean killer) {
     	Object factHandle = this.getObjectStore().getHandleForObject(args.getObject());
     	    	
     	IGammaNode node = this.ruleBase.getRete().getNode(key);
@@ -1956,7 +1962,7 @@
     		//Object does not exist, YET
     		//Prepare eval to be collected...    	
     		if (node != null)
-    			node.storeEvaluation(args, prepareEval(ruleName,args,key,degree,node));
+    			node.storeEvaluation(args, prepareEval(ruleName,args,key,degree,node,killer));
     	} else {
     		if (factHandle instanceof ImperfectFactHandle) {
     			
@@ -1967,13 +1973,13 @@
     			if (eval == null && node != null) {    				    				
     				// Object exsits, but its prop hasn't been evaluated yet
     				// Prepare eval to be collected at the node...
-    				node.storeEvaluation(args,prepareEval(ruleName,args,key,degree,node));
+    				node.storeEvaluation(args,prepareEval(ruleName,args,key,degree,node,killer));
     				    				    				
     			} else if (eval != null) {
     				// Object exists and has already been eval'ed
     				// Add new degree to evaluation
     				//TODO: 1 should be confidence!    				
-    				eval.addDegree(ruleName, degree,1,true);
+    				eval.addDegree(ruleName, degree,1,killer,true);
     				//Notification is implicit in the record...
     			} else if (node == null) {
     				System.out.println("Warning - injected USELESS eval");
@@ -1994,12 +2000,13 @@
     }
 
 	private Evaluation prepareEval(String ruleName, ArgList args, ConstraintKey key,
-			IDegree degree, IGammaNode node) {
+			IDegree degree, IGammaNode node, boolean killer) {
 				
 		EvaluationTemplate templ = node.getEvaluationTemplate(key);
 		
-		return templ.spawn(ruleName,degree, args);
-		
+		Evaluation eval = templ.spawn(ruleName,degree, args);
+			eval.setKiller(ruleName,killer);
+		return eval;
 	}
 
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImplicationBetaConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImplicationBetaConstraint.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImplicationBetaConstraint.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -230,7 +230,7 @@
 
 	public EvaluationTemplate[] buildEvaluationTemplates(int id, Map<ConstraintKey, Set<String>> dependencies, IDegreeFactory factory) {
 		template = new EvaluationTemplate[1];
-			template[0] = new SingleEvaluationTemplate(id,singletonKeys[0],dependencies.get(singletonKeys[0]),factory.getMergeStrategy(),factory.getNullHandlingStrategy());			
+			template[0] = new SingleEvaluationTemplate(id,singletonKeys[0],dependencies.get(singletonKeys[0]),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),factory);			
 		return template;
 	}
 

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceEqualsConstraint.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -236,7 +236,8 @@
 												this.getConstraintKey(),
 												dependencies.get(this.getConstraintKey()),
 												factory.getMergeStrategy(),
-												factory.getNullHandlingStrategy());
+												factory.getNullHandlingStrategy(),
+												factory);
 		return template;
 	}
 	

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/InstanceNotEqualsConstraint.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -241,7 +241,8 @@
 												this.getConstraintKey(),
 												dependencies.get(this.getConstraintKey()),
 												factory.getMergeStrategy(),
-												factory.getNullHandlingStrategy());
+												factory.getNullHandlingStrategy(),
+												factory);
 		return template;
 	}
 	

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -489,11 +489,17 @@
 
 	
 	public void inject(String premise, ArgList args,
-			ConstraintKey key, IDegree degree) {
+			ConstraintKey key, IDegree degree, boolean killer) {
 		// TODO Auto-generated method stub
 		
 	}
 
+	public void reject(String ruleName, ArgList args, ConstraintKey key,
+			IDegree degree, boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
 	
 
 	

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/TupleStartEqualsConstraint.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -244,7 +244,8 @@
 												this.getConstraintKey(),
 												dependencies.get(this.getConstraintKey()),
 												factory.getMergeStrategy(),
-												factory.getNullHandlingStrategy());
+												factory.getNullHandlingStrategy(),
+												factory);
 		return template;
 	}
 

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/IntervalDegree.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/IntervalDegree.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/IntervalDegree.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -73,4 +73,28 @@
 		return 1.0f - getPhi();
 	}
 
+	
+	public int hashCode() {
+		return new Float(getLow()).hashCode()^new Float(getUpp()).hashCode();
+	}
+	
+	public boolean equals(Object other) {
+		if (other == null) {
+			return false;
+		} else if (other == this) {
+			return true;
+		} else if (other.getClass().equals(this.getClass()) ) {
+			IntervalDegree o = (IntervalDegree) other;
+			return (this.phi == o.phi) && (this.tau == o.tau);
+		} else {
+			return false;
+		}		
+	}
+
+
+
+	public float getConfidence(boolean cwa) {
+		return phi+tau;
+	}
+	
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/IDegreeFactory.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/IDegreeFactory.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/IDegreeFactory.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -4,13 +4,17 @@
 import org.drools.degrees.operators.IDegreeCombiner;
 import org.drools.reteoo.filters.IFilterStrategy;
 
+import org.drools.degrees.operators.IDiscountOperator;
+import org.drools.degrees.operators.IDiscountStrategy;
 import org.drools.degrees.operators.IMergeStrategy;
 import org.drools.degrees.operators.INullHandlingStrategy;
 
 public interface IDegreeFactory {
 	
 	
+	public void setClosedWorldAssumption(boolean cwa);		
 	
+	public boolean isClosedWorldAssumption();
 	
 	
 	public IDegree buildDegree(float val);
@@ -38,7 +42,9 @@
 	
 	public IDegreeCombiner getXorOperator();
 	
+	public IDegreeCombiner getImplicationOperator();
 	
+	
 	public IDegreeCombiner getAggregator();
 	
 	
@@ -73,7 +79,7 @@
 	public IDegreeCombiner getDoubleMPOperator();
 
 
-	public IDegreeCombiner getDiscountOperator();
+	public IDiscountOperator getDiscountOperator();
 	
 	
 	public IDegreeCombiner getHedgeOperator();
@@ -94,6 +100,8 @@
 
 
 	public IDegreeCombiner getXorOperator(String params);
+	
+	public IDegreeCombiner getImplicationOperator(String params);
 
 
 	public IDegreeCombiner getOrOperator(String params);
@@ -109,6 +117,9 @@
 
 
 	public IDegree buildDegree(String priorStr);
+
+
+	public IDiscountStrategy getDiscountStrategy();
 	
 	
 

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/IntervalDegreeFactory.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/IntervalDegreeFactory.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/IntervalDegreeFactory.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -1,13 +1,19 @@
 package org.drools.degrees.factory;
 
+import java.util.StringTokenizer;
+
 import org.drools.degrees.IDegree;
 import org.drools.degrees.IntervalDegree;
+import org.drools.degrees.SimpleDegree;
 import org.drools.degrees.operators.IDegreeCombiner;
+import org.drools.degrees.operators.IDiscountOperator;
+import org.drools.degrees.operators.IDiscountStrategy;
 import org.drools.degrees.operators.IMergeStrategy;
 import org.drools.degrees.operators.INullHandlingStrategy;
 import org.drools.degrees.operators.intervals.DefaultIntervalMergeStrategy;
 import org.drools.degrees.operators.intervals.DefaultIntervalNullHandlingStrategy;
 import org.drools.degrees.operators.intervals.IntervalDiscountOperator;
+import org.drools.degrees.operators.intervals.IntervalDiscountStrategy;
 import org.drools.degrees.operators.intervals.IntervalDoubleMPOperator;
 import org.drools.degrees.operators.intervals.IntervalEquivOperator;
 import org.drools.degrees.operators.intervals.IntervalExistsOperator;
@@ -15,6 +21,7 @@
 import org.drools.degrees.operators.intervals.IntervalForallOperator;
 import org.drools.degrees.operators.intervals.IntervalIntersectionOperator;
 import org.drools.degrees.operators.intervals.IntervalLukasAndOperator;
+import org.drools.degrees.operators.intervals.IntervalLukasImplicationOperator;
 import org.drools.degrees.operators.intervals.IntervalLukasOrOperator;
 import org.drools.degrees.operators.intervals.IntervalMaxOrOperator;
 import org.drools.degrees.operators.intervals.IntervalMinAndOperator;
@@ -32,6 +39,8 @@
 	public static IDegree TRUE = new IntervalDegree(1,1);
 	public static IDegree UNKNOWN = new IntervalDegree(0,1);
 	
+	private boolean cwa;
+	
 	public IDegree False() {
 		return FALSE;
 	}
@@ -120,7 +129,7 @@
 		return new IntervalLukasOrOperator();
 	}
 
-	public IDegreeCombiner getDiscountOperator() {
+	public IDiscountOperator getDiscountOperator() {
 		return new IntervalDiscountOperator();
 	}
 
@@ -129,8 +138,12 @@
 	}
 	
 	
+	public IDegreeCombiner getImplicationOperator() {
+		return new IntervalLukasImplicationOperator();
+	}
 	
 	
+	
 
 	public IDegreeCombiner getAndOperator(String params) {
 		// TODO Auto-generated method stub
@@ -161,6 +174,10 @@
 		// TODO Auto-generated method stub
 		return null;
 	}
+	
+	public IDegreeCombiner getImplicationOperator(String params) {
+		return new IntervalLukasImplicationOperator();
+	}
 
 	public IDegreeCombiner getHedgeOperator() {
 		throw new UnsupportedOperationException("Not yet...");
@@ -171,8 +188,28 @@
 	}
 
 	public IDegree buildDegree(String priorStr) {
-		// TODO Auto-generated method stub
-		throw new UnsupportedOperationException("Not yet...");
+		if (priorStr.equals("unknown"))
+			return Unknown();
+		
+		
+		StringTokenizer tok = new StringTokenizer(priorStr,"[,]");
+		if (tok.countTokens() == 2) {
+			try {
+				float low = Float.parseFloat(tok.nextToken());
+				float upp = Float.parseFloat(tok.nextToken());
+				return new IntervalDegree(low, upp);
+			} catch (NumberFormatException nfe) {
+				return Unknown();
+			}	
+						
+		} else {
+			try {
+				float val = Float.parseFloat(tok.nextToken());
+				return new IntervalDegree(val,val);
+			} catch (NumberFormatException nfe) {
+				return Unknown();
+			}
+		}
 	}
 
 	public IDegreeCombiner getModusPonensOperator(String params) {
@@ -188,4 +225,16 @@
 		
 	}
 
+	public IDiscountStrategy getDiscountStrategy() {
+		return new IntervalDiscountStrategy(getDiscountOperator());
+	}
+
+	public boolean isClosedWorldAssumption() {
+		return cwa;
+	}
+
+	public void setClosedWorldAssumption(boolean cwa) {
+		this.cwa = cwa;		
+	}
+
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/SimpleDegreeFactory.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/SimpleDegreeFactory.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/SimpleDegreeFactory.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -1,23 +1,28 @@
 package org.drools.degrees.factory;
 
 import org.drools.degrees.IDegree;
-import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.SimpleDegree;
 import org.drools.degrees.operators.IDegreeCombiner;
+import org.drools.degrees.operators.IDiscountOperator;
+import org.drools.degrees.operators.IDiscountStrategy;
 import org.drools.degrees.operators.IMergeStrategy;
 import org.drools.degrees.operators.INullHandlingStrategy;
 import org.drools.degrees.operators.simple.SimpleAverage;
+import org.drools.degrees.operators.simple.SimpleDiscountOperator;
+import org.drools.degrees.operators.simple.SimpleDiscountStrategy;
 import org.drools.degrees.operators.simple.SimpleDotAnd;
 import org.drools.degrees.operators.simple.SimpleDoubleMPOperator;
 import org.drools.degrees.operators.simple.SimpleEquiv;
 import org.drools.degrees.operators.simple.SimpleExists;
 import org.drools.degrees.operators.simple.SimpleIdentityOperator;
 import org.drools.degrees.operators.simple.SimpleLukasAnd;
+import org.drools.degrees.operators.simple.SimpleLukasImplication;
 import org.drools.degrees.operators.simple.SimpleLukasOr;
 import org.drools.degrees.operators.simple.SimpleMaxOr;
 import org.drools.degrees.operators.simple.SimpleMinAnd;
+import org.drools.degrees.operators.simple.SimpleMinMergeStrategy;
 import org.drools.degrees.operators.simple.SimpleNot;
-import org.drools.degrees.operators.simple.SimpleMergeStrategy;
+import org.drools.degrees.operators.simple.SimpleMaxMergeStrategy;
 import org.drools.degrees.operators.simple.SimpleNullHandlingStrategy;
 import org.drools.degrees.operators.simple.SimpleProbSumOr;
 import org.drools.degrees.operators.simple.SimpleVeryModifier;
@@ -30,12 +35,15 @@
 
 public class SimpleDegreeFactory implements IDegreeFactory {
 	
-	public static IDegree FALSE = new SimpleDegree(0);
-	public static IDegree TRUE = new SimpleDegree(1);
+	private boolean cwa = true;
 	
-	//BEWARE OF CWA
-	public static IDegree UNKNOWN = new SimpleDegree(0);
 	
+	public static IDegree FALSE = SimpleDegree.FALSE();
+	public static IDegree TRUE = SimpleDegree.TRUE();
+	
+	//BEWARE OF OWA
+	//private static IDegree UNKNOWN = SimpleDegree.UNKNOWN();
+	
 	public IDegree False() {
 		return FALSE;
 	}
@@ -45,7 +53,12 @@
 	}
 
 	public IDegree Unknown() {
-		return UNKNOWN;
+		if (cwa) {
+			return FALSE;
+		} else {
+			return TRUE;
+		}
+		//return UNKNOWN;
 	}
 
 	
@@ -92,10 +105,10 @@
 		return new SimpleMinAnd();
 	}
 
-	public IDegree mergeIntersect(IDegree d1,
-			IDegree d2) {
-		return getAggregator().eval(new IDegree[] {d1,d2});
-	}
+//	public IDegree mergeIntersect(IDegree d1,
+//			IDegree d2) {
+//		return getAggregator().eval(new IDegree[] {d1,d2});
+//	}
 
 
 	public IDegreeCombiner getEquivModusPonensOp() {
@@ -109,6 +122,10 @@
 		return new SimpleAverage() ;
 	}
 
+	public IDegreeCombiner getImplicationOperator() {
+		return new SimpleLukasImplication();
+	}
+	
 
 	public IDegreeCombiner getMaxOrOperator() {
 		return new SimpleMaxOr();
@@ -128,7 +145,11 @@
 	}
 
 	public IMergeStrategy getMergeStrategy() {
-		return new SimpleMergeStrategy();
+		if (cwa) {
+			return new SimpleMaxMergeStrategy();
+		} else {
+			return new SimpleMinMergeStrategy();
+		}		
 	}
 
 	public INullHandlingStrategy getNullHandlingStrategy() {
@@ -148,8 +169,8 @@
 		return this.getAndOperator();
 	}
 
-	public IDegreeCombiner getDiscountOperator() {
-		return new SimpleIdentityOperator();
+	public IDiscountOperator getDiscountOperator() {
+		return new SimpleDiscountOperator(this.Unknown().getDegree());
 	}
 
 	public IDegreeCombiner getDoubleMPOperator() {
@@ -217,6 +238,9 @@
 	}
 
 	public IDegree buildDegree(String priorStr) {
+		if (priorStr.toLowerCase().contains("unknown"))
+			return this.Unknown();
+		
 		return new SimpleDegree(Float.parseFloat(priorStr));
 	}
 
@@ -232,5 +256,23 @@
 			return getModusPonensOp();
 		
 	}
+
 	
+
+	public IDegreeCombiner getImplicationOperator(String params) {
+		return new SimpleLukasImplication();
+	}
+	
+	public IDiscountStrategy getDiscountStrategy() {
+		return new SimpleDiscountStrategy(this.getDiscountOperator());
+	}
+
+	public boolean isClosedWorldAssumption() {
+		return cwa;
+	}
+
+	public void setClosedWorldAssumption(boolean cwa) {
+		this.cwa = cwa;		
+	}
+	
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/SimpleFuzzyDegreeFactory.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/SimpleFuzzyDegreeFactory.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/SimpleFuzzyDegreeFactory.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -1,13 +1,25 @@
 package org.drools.degrees.factory;
 
+import org.drools.degrees.IDegree;
+import org.drools.degrees.SimpleDegree;
+import org.drools.degrees.operators.IMergeStrategy;
+import org.drools.degrees.operators.simple.SimpleMaxMergeStrategy;
 import org.drools.reteoo.filters.FuzzyFilterStrategy;
 import org.drools.reteoo.filters.IFilterStrategy;
 import org.drools.reteoo.filters.SimpleFilterStrategy;
 
 public class SimpleFuzzyDegreeFactory extends SimpleDegreeFactory {
 	
+	public IDegree Unknown() {
+		return SimpleDegree.FALSE();
+	}
+	
 	public IFilterStrategy getDefaultStrategy() {
 		return FuzzyFilterStrategy.getInstance();
 	}
 
+	public IMergeStrategy getMergeStrategy() {
+		return new SimpleMaxMergeStrategy();
+	}
+	
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/IDegreeCombiner.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/IDegreeCombiner.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/IDegreeCombiner.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -7,6 +7,7 @@
 import java.util.Collection;
 
 import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 
 
 /**
@@ -25,10 +26,10 @@
      * @param args  The truth values to be combined
      * @return      The output combination
      */
-    public IDegree eval(IDegree[] args);
+    public IDegree eval(IDegree[] args, IDegreeFactory factory);
     
  
-    public IDegree eval(Collection<? extends IDegree> args);
+    public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory );
     
     public String getName();
     

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/IMergeStrategy.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/IMergeStrategy.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/IMergeStrategy.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -1,9 +1,10 @@
 package org.drools.degrees.operators;
 
 import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 
 public interface IMergeStrategy extends IDegreeCombiner {
 
-	public IDegree eval(IDegree[] degrees, INullHandlingStrategy nullStrat);
+	public IDegree eval(IDegree[] degrees, boolean[] killerFlags, INullHandlingStrategy nullStrat, IDegreeFactory factory);
 
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/INullHandlingStrategy.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/INullHandlingStrategy.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/INullHandlingStrategy.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -5,6 +5,6 @@
 
 public interface INullHandlingStrategy {
 
-	public IDegree convertNull();
+	public IDegree convertNull(IDegreeFactory factory);
 	
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/NegationOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/NegationOperator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/NegationOperator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -3,6 +3,7 @@
 import java.util.Collection;
 
 import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 
 public abstract  class NegationOperator implements IDegreeCombiner {
 	
@@ -15,12 +16,12 @@
 		this.operator = op;
 	}
 
-	public IDegree eval(IDegree[] args) {
-		return negate(operator.eval(args));
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
+		return negate(operator.eval(args,factory));
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
-		return negate(operator.eval(args));
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
+		return negate(operator.eval(args,factory));
 	}
 
 	public String getName() {
@@ -28,7 +29,7 @@
 	}
 	
 	
-	protected abstract IDegree negate(IDegree arg);
+	public abstract IDegree negate(IDegree arg);
 	
 
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/DefaultIntervalMergeStrategy.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/DefaultIntervalMergeStrategy.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/DefaultIntervalMergeStrategy.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -5,26 +5,37 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.IntervalDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.operators.IDiscountStrategy;
 import org.drools.degrees.operators.IMergeStrategy;
 import org.drools.degrees.operators.INullHandlingStrategy;
+import org.drools.reteoo.DiscountOperatorInstaller;
 
 public class DefaultIntervalMergeStrategy implements IMergeStrategy {
 	
 	private IntervalIntersectionOperator op = new IntervalIntersectionOperator();
 
-	public IDegree eval(IDegree[] degrees, INullHandlingStrategy nullStrat) {
+	public IDegree eval(IDegree[] degrees, boolean[] kFlags, INullHandlingStrategy nullStrat, IDegreeFactory factory) {
 		IDegree[] args = new IDegree[degrees.length];
+		
+		
 		for (int j = 0; j < degrees.length; j++) {
-			args[j] = degrees[j] != null ? degrees[j] : nullStrat.convertNull(); 
+			args[j] = degrees[j] != null ? degrees[j] : nullStrat.convertNull(factory);							
 		}
-		return op.eval(args);
+		
+		if (kFlags != null) {
+			IDiscountStrategy discountStrat = factory.getDiscountStrategy();
+			return op.eval(discountStrat.discount(args, kFlags,factory), factory);
+		} else {
+			return op.eval(args, factory);
+		}
 	}
 
-	public IDegree eval(IDegree[] args) {
-		return eval(args, new DefaultIntervalNullHandlingStrategy());
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
+		return eval(args, null, new DefaultIntervalNullHandlingStrategy(),factory);
 	}
 
-	public IDegree eval(Collection<? extends IDegree> degrees) {
+	public IDegree eval(Collection<? extends IDegree> degrees, IDegreeFactory factory) {
 		IDegree[] args = new IDegree[degrees.size()];
 		Iterator<? extends IDegree> iter = degrees.iterator();
 		INullHandlingStrategy nullStrat = new DefaultIntervalNullHandlingStrategy();
@@ -32,9 +43,9 @@
 		int j = 0;
 		while (iter.hasNext()) {
 			IDegree deg = iter.next();
-			args[j++] = deg != null ? deg : nullStrat.convertNull(); 
+			args[j++] = deg != null ? deg : nullStrat.convertNull(factory); 
 		}
-		return op.eval(args);
+		return op.eval(args, factory);
 	}
 
 	public String getName() {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/DefaultIntervalNullHandlingStrategy.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/DefaultIntervalNullHandlingStrategy.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/DefaultIntervalNullHandlingStrategy.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -1,14 +1,15 @@
 package org.drools.degrees.operators.intervals;
 
 import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.operators.INullHandlingStrategy;
 
 public class DefaultIntervalNullHandlingStrategy implements
 		INullHandlingStrategy {
 
-	public IDegree convertNull() {
-		return IntervalDegreeFactory.UNKNOWN;
+	public IDegree convertNull(IDegreeFactory factory) {
+		return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();
 	}
 
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalDiscountOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalDiscountOperator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalDiscountOperator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -6,26 +6,36 @@
 import org.drools.degrees.IDegree;
 import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.SimpleDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
+import org.drools.degrees.operators.IDiscountOperator;
 
-public class IntervalDiscountOperator implements IDegreeCombiner {
+public class IntervalDiscountOperator implements IDiscountOperator {
 
-	public IDegree eval(IDegree[] args) {
+	
+	public IDegree discount(IDegree arg, float strength) {
+		float alfa = strength;
+		IntervalDegree ival = (IntervalDegree) arg;
+		return new IntervalDegree(ival.getTau()*alfa, 1 - ival.getPhi()*alfa);	
+	}
+	
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length < 2)
-			return SimpleDegreeFactory.UNKNOWN;
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();
 		
 		IntervalDegree ival = (IntervalDegree) args[0];
 		SimpleDegree disc = args[1].getDegree();
 		float alfa = disc.getValue();	
 		
+		return new IntervalDegree(ival.getTau()*alfa, 1 - ival.getPhi()*alfa);
 		
-		return new IntervalDegree(ival.getTau()*alfa, 1 - ival.getPhi()*alfa);
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() < 2)
-			return SimpleDegreeFactory.UNKNOWN;
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();
 		Iterator<? extends IDegree> iter= args.iterator();
 		
 		IntervalDegree ival = (IntervalDegree) iter.next();
@@ -40,4 +50,6 @@
 		return "i_discount";
 	}
 
+	
+
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalDoubleMPOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalDoubleMPOperator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalDoubleMPOperator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -6,15 +6,17 @@
 import org.drools.degrees.IDegree;
 import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.SimpleDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 import org.drools.time.Interval;
 
 public class IntervalDoubleMPOperator implements IDegreeCombiner {
 
-	public IDegree eval(IDegree[] args) {
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length < 2)
-			return SimpleDegreeFactory.UNKNOWN;
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();
 		
 		IntervalDegree prem = (IntervalDegree) args[0];
 		IntervalDegree impl = (IntervalDegree) args[1];
@@ -22,13 +24,13 @@
 		float tau = Math.min(prem.getTau(),impl.getTau());
 		float phi = Math.min(prem.getPhi(),impl.getTau());
 			
-		return new IntervalDegree(tau, phi);
+		return new IntervalDegree(tau, 1-phi);
 		                    
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() < 2)
-			return SimpleDegreeFactory.UNKNOWN;
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();
 		Iterator<? extends IDegree> iter= args.iterator();
 		
 		IntervalDegree prem = (IntervalDegree) iter.next();
@@ -37,7 +39,7 @@
 		float tau = Math.min(prem.getTau(),impl.getTau());
 		float phi = Math.min(prem.getPhi(),impl.getTau());
 			
-		return new IntervalDegree(tau, phi);
+		return new IntervalDegree(tau, 1-phi);
 	}
 	
 	public String getName() {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalEquivOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalEquivOperator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalEquivOperator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -5,15 +5,15 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.IntervalDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 public class IntervalEquivOperator implements IDegreeCombiner {
 
-	public IDegree eval(IDegree[] args) {
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length < 2)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		IntervalDegree a1 = (IntervalDegree) args[0];
 		IntervalDegree a2 = (IntervalDegree) args[1];
 		
@@ -25,10 +25,9 @@
 		
 	}		
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() < 2)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		Iterator<? extends IDegree> iter = args.iterator();
 		IntervalDegree a1 = (IntervalDegree) iter.next();
 		IntervalDegree a2 = (IntervalDegree) iter.next();

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalExistsOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalExistsOperator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalExistsOperator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -4,15 +4,15 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.IntervalDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 public class IntervalExistsOperator implements IDegreeCombiner {
 
-	public IDegree eval(IDegree[] args) {
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length == 0)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		float tau = 0;
 		float phi = 1.0f;
 		for (IDegree deg : args) {
@@ -25,10 +25,9 @@
 		return new IntervalDegree(tau,1.0f-phi);
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() == 0)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		float tau = 0;
 		float phi = 1.0f;
 		for (IDegree deg : args) {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalForAnyOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalForAnyOperator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalForAnyOperator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -4,15 +4,15 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.IntervalDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 public class IntervalForAnyOperator implements IDegreeCombiner {
 
-	public IDegree eval(IDegree[] args) {		
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {		
 		if (args == null || args.length == 0)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		float low = 0;
 		float upp = 0;
 		for (IDegree deg : args) {
@@ -26,10 +26,9 @@
 		return new IntervalDegree(low,upp);
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() == 0)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		float low = 0;
 		float upp = 0;
 		for (IDegree deg : args) {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalForallOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalForallOperator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalForallOperator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -4,15 +4,15 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.IntervalDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 public class IntervalForallOperator implements IDegreeCombiner {
 
-	public IDegree eval(IDegree[] args) {
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length == 0)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		float tau = 1.0f;
 		float phi = 0.0f;
 		for (IDegree deg : args) {
@@ -25,10 +25,9 @@
 		return new IntervalDegree(tau,1.0f-phi);
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() == 0)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		float tau = 1.0f;
 		float phi = 0.0f;
 		for (IDegree deg : args) {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalIntersectionOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalIntersectionOperator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalIntersectionOperator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -4,6 +4,7 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.IntervalDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
@@ -11,10 +12,9 @@
 
 	
 	
-	public IDegree eval(IDegree[] args) {
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length == 0)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		float tau = 0;
 		float phi = 0;
 		for (IDegree deg : args) {
@@ -27,10 +27,9 @@
 		return new IntervalDegree(tau,1.0f-phi);
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() == 0)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		float tau = 0;
 		float phi = 0;
 		for (IDegree deg : args) {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalLukasAndOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalLukasAndOperator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalLukasAndOperator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -4,6 +4,7 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.IntervalDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
@@ -11,10 +12,9 @@
 
 	
 	
-	public IDegree eval(IDegree[] args) {		
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {		
 		if (args == null || args.length == 0)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		float tau = 0;
 		float phi = 0;
 		for (IDegree deg : args) {
@@ -28,10 +28,9 @@
 		return new IntervalDegree(tau,phi);
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() == 0)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		float tau = 0;
 		float phi = 0;
 		for (IDegree deg : args) {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalLukasOrOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalLukasOrOperator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalLukasOrOperator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -4,15 +4,15 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.IntervalDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 public class IntervalLukasOrOperator implements IDegreeCombiner {
 
-	public IDegree eval(IDegree[] args) {		
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {		
 		if (args == null || args.length == 0)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		float tau = 0;
 		float phi = 0;
 		for (IDegree deg : args) {
@@ -26,10 +26,9 @@
 		return new IntervalDegree(tau,phi);
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() == 0)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		float tau = 0;
 		float phi = 0;
 		for (IDegree deg : args) {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalMaxOrOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalMaxOrOperator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalMaxOrOperator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -4,15 +4,15 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.IntervalDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 public class IntervalMaxOrOperator implements IDegreeCombiner {
 
-	public IDegree eval(IDegree[] args) {
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length == 0)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		float tau = 0;
 		float phi = 1.0f;
 		for (IDegree deg : args) {
@@ -25,10 +25,9 @@
 		return new IntervalDegree(tau,1.0f-phi);
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() == 0)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		float tau = 0;
 		float phi = 1.0f;
 		for (IDegree deg : args) {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalMinAndOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalMinAndOperator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalMinAndOperator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -4,15 +4,15 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.IntervalDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 public class IntervalMinAndOperator implements IDegreeCombiner {
 
-	public IDegree eval(IDegree[] args) {
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length == 0)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		float tau = 1.0f;
 		float phi = 0.0f;
 		for (IDegree deg : args) {
@@ -25,10 +25,9 @@
 		return new IntervalDegree(tau,1.0f-phi);
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() == 0)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		float tau = 1.0f;
 		float phi = 0.0f;
 		for (IDegree deg : args) {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalModusPonensOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalModusPonensOperator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalModusPonensOperator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -5,15 +5,15 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.IntervalDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 public class IntervalModusPonensOperator implements IDegreeCombiner {
 
-	public IDegree eval(IDegree[] args) {
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length < 2)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		IntervalDegree a1 = (IntervalDegree) args[0];
 		IntervalDegree a2 = (IntervalDegree) args[1];
 		
@@ -21,10 +21,9 @@
 		return new IntervalDegree(Math.min(a1.getLow(),a2.getLow()),1);
 	}		
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() < 2)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		Iterator<? extends IDegree> iter = args.iterator();
 		IntervalDegree a1 = (IntervalDegree) iter.next();
 		IntervalDegree a2 = (IntervalDegree) iter.next();

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalNegationOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalNegationOperator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalNegationOperator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -11,7 +11,7 @@
 public class IntervalNegationOperator extends NegationOperator {
 
 	
-	protected IDegree negate(IDegree arg) {
+	public IDegree negate(IDegree arg) {
 		IntervalDegree iDeg = (IntervalDegree) arg;
 		return new IntervalDegree(iDeg.getPhi(),1-iDeg.getTau());
 	}

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalXorOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalXorOperator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalXorOperator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -5,15 +5,15 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.IntervalDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 public class IntervalXorOperator implements IDegreeCombiner {
 
-	public IDegree eval(IDegree[] args) {
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length < 2)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		IntervalDegree a1 = (IntervalDegree) args[0];
 		IntervalDegree a2 = (IntervalDegree) args[1];
 		
@@ -25,10 +25,9 @@
 		
 	}		
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() < 2)
-			return IntervalDegreeFactory.UNKNOWN;
-		
+			return factory == null ? IntervalDegreeFactory.UNKNOWN : factory.Unknown();		
 		Iterator<? extends IDegree> iter = args.iterator();
 		IntervalDegree a1 = (IntervalDegree) iter.next();
 		IntervalDegree a2 = (IntervalDegree) iter.next();

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleAverage.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleAverage.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleAverage.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -4,15 +4,17 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.SimpleDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.factory.SimpleDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 public final class SimpleAverage implements IDegreeCombiner {
 
 
 		
-	public IDegree eval(IDegree[] args) {					
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {					
 		if (args == null || args.length == 0)
-			return SimpleDegree.UNKNOWN();
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();
 		
 		float ans = 0;
 		int n = 0;
@@ -55,7 +57,7 @@
 	}
 */
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		// TODO Auto-generated method stub
 		return null;
 	}

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleDotAnd.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleDotAnd.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleDotAnd.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -4,16 +4,17 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.SimpleDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.factory.SimpleDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 
 public class SimpleDotAnd implements IDegreeCombiner {
 
 	
-	public IDegree eval(IDegree[] args) {
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length == 0)
-			return SimpleDegree.UNKNOWN();
-		
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();		
 		float ans = 1;
 		for (IDegree deg : args) {
 			SimpleDegree d = deg.getDegree();				
@@ -23,7 +24,7 @@
 		return new SimpleDegree(ans);
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		// TODO Auto-generated method stub
 		return null;
 	}

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleDoubleMPOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleDoubleMPOperator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleDoubleMPOperator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -5,15 +5,15 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.SimpleDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 public class SimpleDoubleMPOperator implements IDegreeCombiner {
 
-	public IDegree eval(IDegree[] args) {
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length < 2)
-			return SimpleDegreeFactory.UNKNOWN;
-		
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();		
 		IDegree prem = args[0];
 		IDegree impl = args[1];
 		
@@ -27,9 +27,9 @@
 		                    
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() < 2)
-			return SimpleDegreeFactory.UNKNOWN;
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();
 		Iterator<? extends IDegree> iter= args.iterator();
 		
 		IDegree prem = iter.next();

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleEquiv.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleEquiv.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleEquiv.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -6,6 +6,7 @@
 import org.drools.degrees.IDegree;
 import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.SimpleDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
@@ -13,7 +14,7 @@
 public class SimpleEquiv implements IDegreeCombiner {
 
 	
-	public IDegree eval(IDegree[] args) {	
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {	
 		return new SimpleDegree( 1 - Math.abs(
 						args[0].getDegree().getValue() 
 						- args[1].getDegree().getValue())
@@ -21,10 +22,10 @@
 	}
 
 	
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		
 		if (args == null || args.size() < 2)
-			return SimpleDegreeFactory.UNKNOWN;
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();
 		
 		Iterator<? extends IDegree> iter = args.iterator();
 		SimpleDegree a1 = (SimpleDegree) iter.next();

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleIdentityOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleIdentityOperator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleIdentityOperator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -4,15 +4,17 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.SimpleDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.factory.SimpleDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 public final class SimpleIdentityOperator implements IDegreeCombiner {
 
 
 		
-	public IDegree eval(IDegree[] args) {					
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {					
 		if (args == null || args.length == 0)
-			return SimpleDegree.UNKNOWN();
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();
 		
 		return args[0];
 	}
@@ -47,9 +49,9 @@
 	}
 */
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() == 0)
-			return SimpleDegree.UNKNOWN();
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();
 		
 		return args.iterator().next();
 	}

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleLukasAnd.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleLukasAnd.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleLukasAnd.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -4,16 +4,17 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.SimpleDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.factory.SimpleDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 
 public class SimpleLukasAnd implements IDegreeCombiner {
 
 	
-	public IDegree eval(IDegree[] args) {
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length == 0)
-			return SimpleDegree.UNKNOWN();
-		
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();		
 		float ans = 1;
 		for (IDegree deg : args) {
 			SimpleDegree d = deg.getDegree();				
@@ -23,10 +24,9 @@
 		return new SimpleDegree(Math.max(0,ans));
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() == 0)
-			return SimpleDegree.UNKNOWN();
-		
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();		
 		float ans = 1;
 		for (IDegree deg : args) {
 			SimpleDegree d = deg.getDegree();				

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleLukasOr.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleLukasOr.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleLukasOr.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -4,16 +4,17 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.SimpleDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.factory.SimpleDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 
 public class SimpleLukasOr implements IDegreeCombiner {
 
 	
-	public IDegree eval(IDegree[] args) {
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length == 0)
-			return SimpleDegree.UNKNOWN();
-		
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();		
 		float ans = 0;
 		for (IDegree deg : args) {
 			SimpleDegree d = deg.getDegree();				
@@ -23,10 +24,9 @@
 		return new SimpleDegree(Math.min(1,ans));
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() == 0)
-			return SimpleDegree.UNKNOWN();
-		
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();		
 
 		float ans = 0;
 		for (IDegree deg : args) {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMaxOr.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMaxOr.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMaxOr.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -4,16 +4,17 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.SimpleDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.factory.SimpleDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 
 public class SimpleMaxOr implements IDegreeCombiner {
 
 	
-	public IDegree eval(IDegree[] args) {
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length == 0)
-			return SimpleDegree.UNKNOWN();
-		
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();		
 		float ans = 0;
 		for (IDegree deg : args) {
 			SimpleDegree d = deg.getDegree();				
@@ -23,10 +24,9 @@
 		return new SimpleDegree(ans);
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() == 0)
-			return SimpleDegree.UNKNOWN();
-		
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();		
 		float ans = 0;
 		for (IDegree deg : args) {
 			SimpleDegree d = deg.getDegree();				

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMinAnd.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMinAnd.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMinAnd.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -4,15 +4,16 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.SimpleDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.factory.SimpleDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 public class SimpleMinAnd implements IDegreeCombiner {
 
 	
-	public IDegree eval(IDegree[] args) {
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length == 0)
-			return SimpleDegree.UNKNOWN();
-		
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();		
 		float ans = 1;
 		for (IDegree deg : args) {
 			SimpleDegree d = deg.getDegree();				
@@ -22,7 +23,7 @@
 		return new SimpleDegree(ans);
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		// TODO Auto-generated method stub
 		return null;
 	}

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleNot.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleNot.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleNot.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -9,7 +9,7 @@
 
 public class SimpleNot extends NegationOperator {
 
-	protected IDegree negate(IDegree arg) {
+	public IDegree negate(IDegree arg) {
 		return new SimpleDegree(1-arg.getDegree().getValue());
 	}
 

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleNullHandlingStrategy.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleNullHandlingStrategy.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleNullHandlingStrategy.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -2,12 +2,14 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.SimpleDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.factory.SimpleDegreeFactory;
 import org.drools.degrees.operators.INullHandlingStrategy;
 
 public class SimpleNullHandlingStrategy implements INullHandlingStrategy {
 
-	public IDegree convertNull() {
-		return new SimpleDegree(0);
+	public IDegree convertNull(IDegreeFactory factory) {
+		return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();	
 	}
 
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleProbSumOr.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleProbSumOr.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleProbSumOr.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -4,23 +4,23 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.SimpleDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.factory.SimpleDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 
 public class SimpleProbSumOr implements IDegreeCombiner {
 
 	
-	public IDegree eval(IDegree[] args) {
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length == 0)
-			return SimpleDegree.UNKNOWN();
-		
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();		
 		throw new UnsupportedOperationException("Still to be done");
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() == 0)
-			return SimpleDegree.UNKNOWN();
-		
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();		
 		throw new UnsupportedOperationException("Still to be done");
 	}
 

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleVeryModifier.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleVeryModifier.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleVeryModifier.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -4,26 +4,26 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.SimpleDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.factory.SimpleDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 
 public class SimpleVeryModifier implements IDegreeCombiner {
 
 	
-	public IDegree eval(IDegree[] args) {
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length == 0)
-			return SimpleDegree.UNKNOWN();
-		
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();		
 		float arg = args[0].getDegree().getValue();
 		
 		
 		return new SimpleDegree(arg*arg);
 	}
 
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		if (args == null || args.size() == 0)
-			return SimpleDegree.UNKNOWN();
-		
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();		
 		float arg = args.iterator().next().getDegree().getValue();
 		
 		

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleXor.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleXor.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleXor.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -5,13 +5,14 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.SimpleDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 public class SimpleXor implements IDegreeCombiner {
 
 	
-	public IDegree eval(IDegree[] args) {	
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {	
 		return new SimpleDegree( Math.abs(
 						args[0].getDegree().getValue() 
 						- args[1].getDegree().getValue())
@@ -19,11 +20,10 @@
 	}
 
 	
-	public IDegree eval(Collection<? extends IDegree> args) {
+	public IDegree eval(Collection<? extends IDegree> args, IDegreeFactory factory) {
 		
 		if (args == null || args.size() < 2)
-			return SimpleDegreeFactory.UNKNOWN;
-		
+			return factory == null ? SimpleDegree.UNKNOWN(true) : factory.Unknown();		
 		Iterator<? extends IDegree> iter = args.iterator();
 		SimpleDegree a1 = (SimpleDegree) iter.next();
 		SimpleDegree a2 = (SimpleDegree) iter.next();

Modified: 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	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/FuzzyDomain.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -8,11 +8,12 @@
 
 import org.drools.base.ValueType;
 import org.drools.base.evaluators.EvaluatorDefinition;
+import org.drools.base.evaluators.ImperfectEvaluatorDefinition;
 import org.drools.base.evaluators.Operator;
 import org.drools.base.evaluators.EvaluatorDefinition.Target;
 import org.drools.spi.Evaluator;
 
-public abstract class FuzzyDomain implements EvaluatorDefinition {
+public abstract class FuzzyDomain implements ImperfectEvaluatorDefinition {
 	
 	
 	private Map<String, FuzzySet> granules;

Modified: 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	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/FuzzySet.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -23,10 +23,12 @@
 		return name;
 	}
 	
+	public float getConfidence(boolean cwa) {		
+		return 1;
+	}
 	
 	
 	
-	
 	public SimpleDegree getDegree() {
 		// TODO Defuzzify here
 		return null;

Modified: 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	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/NumericDomainFuzzySet.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -14,6 +14,9 @@
 	public Number defuzzify() {
 		return ((FuzzyNumericEvaluator) this.membershipEvaluator).getCenter();
 	}
+
+
 	
 	
+	
 }

Modified: 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	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/FuzzyNumericEvaluator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -36,10 +36,8 @@
 	public FuzzyNumericEvaluator(Operator op, final ValueType type,
             				final boolean isNegated,
             				final String parameters) {
-			super( type , op );
+			super( type , op, parameters );
 			this.isNegated = isNegated;
-			
-            this.mu = this.parseParameters( parameters );	        
 	}
 	
 	
@@ -58,11 +56,13 @@
 	
 	
    
-    protected IDegree eval(Number number, IDegreeFactory factory) {
+    protected IDegree eval(Object left, Object right, IDegreeFactory factory) {
     			
-		if (number == null) return factory.Unknown();
+		if (left == null) return factory.Unknown();
+		if (! (left instanceof Number))
+			throw new RuntimeDroolsException("Numbers only");
 		
-		return mu.eval(number, factory);
+		return mu.eval((Number) left, factory);
     }
     
     
@@ -70,72 +70,12 @@
     	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;
@@ -161,11 +101,11 @@
      *
      * @param parameters
      */
-    private INumericSetMembershipFunction parseParameters(String parameters) {
+    public void parseParameters(String parameters) {
     	    	    	    	
         StringTokenizer tok = new StringTokenizer(parameters," ,");   
         if (tok.countTokens() == 0) 
-        	return new SkepticNumericMembershipFunction();
+        	setMu(new SkepticNumericMembershipFunction());
         	
         String className = tok.nextToken();
                 
@@ -185,7 +125,8 @@
 					
 					INumericSetMembershipFunction mu = (INumericSetMembershipFunction) obj;
 					mu.init(params);
-					return mu;
+					setMu(mu);
+					return;
 				}
 			} catch (ClassNotFoundException e) {	
 				System.out.println(e.toString());
@@ -215,6 +156,17 @@
         
     }
 
+
+	public INumericSetMembershipFunction getMu() {
+		return mu;
+	}
+
+
+
+	public void setMu(INumericSetMembershipFunction mu) {
+		this.mu = mu;
+	}
+
 }
 	
 	
\ No newline at end of file

Modified: 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	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/MockEvaluator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -21,101 +21,26 @@
 
 
 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 MockEvaluator(ValueType type, Operator operator, String parameters) {
+		super(type, operator, 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();
-		
+	@Override
+	protected IDegree eval(Object left, Object right, IDegreeFactory factory) {
 		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

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/RandomEvaluator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/RandomEvaluator.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/RandomEvaluator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -12,77 +12,26 @@
 
 public class RandomEvaluator extends BaseImperfectEvaluator {
 
-	public RandomEvaluator(ValueType type, Operator operator) {
-		super(type, operator);		
-	}
-
 	
 	public RandomEvaluator(ValueType type, boolean isNegated,
 			String parameterText) {
-		super(type, RandomEvaluatorDefinition.RANDOM);
+		super(type, RandomEvaluatorDefinition.RANDOM, parameterText);
 	}
 
 
-	public boolean evaluate(InternalWorkingMemory workingMemory,
-			InternalReadAccessor leftExtractor, Object left,
-			InternalReadAccessor rightExtractor, Object right) {
-		return getFactory(workingMemory).Random().toBoolean();
-	}
-
 	
-	public boolean evaluate(InternalWorkingMemory workingMemory,
-			InternalReadAccessor extractor, Object object, FieldValue value) {
-		return getFactory(workingMemory).Random().toBoolean();
-	}
 
-	
-	public boolean evaluateCachedLeft(InternalWorkingMemory workingMemory,
-			VariableContextEntry context, Object right) {
-		return getFactory(workingMemory).Random().toBoolean();
-	}
 
-	
-	public boolean evaluateCachedRight(InternalWorkingMemory workingMemory,
-			VariableContextEntry context, Object left) {
-		return getFactory(workingMemory).Random().toBoolean();
+	@Override
+	protected IDegree eval(Object left, Object right, IDegreeFactory factory) {
+		return factory.buildDegree((float) Math.random());
 	}
 	
 	
-	public String toString() {
-		return "random";
-	}
 	
 	
 	
 	
 	
-	
-	
-	public IDegree evaluate(InternalWorkingMemory workingMemory,
-			IDegreeFactory factory, InternalReadAccessor extractor,
-			Object object, FieldValue value) {
-		return factory.Random();
-	}
 
-	public IDegree evaluate(InternalWorkingMemory workingMemory,
-			IDegreeFactory factory, InternalReadAccessor leftExtractor,
-			Object left, InternalReadAccessor rightExtractor, Object right) {
-		return factory.Random();
-	}
-
-	public IDegree evaluateCachedLeft(InternalWorkingMemory workingMemory,
-			VariableContextEntry context, IDegreeFactory factory,
-			Object right) {
-		return factory.Random();
-	}
-
-	public IDegree evaluateCachedRight(InternalWorkingMemory workingMemory,
-			VariableContextEntry context, IDegreeFactory factory,
-			Object left) {
-		return factory.Random();
-	}
-	
-	
-	
-
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/RandomEvaluatorDefinition.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/RandomEvaluatorDefinition.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/RandomEvaluatorDefinition.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -14,8 +14,10 @@
 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.ImperfectAbstractEvaluatorDefinition;
+import org.drools.base.evaluators.ImperfectEvaluatorDefinition;
 import org.drools.base.evaluators.Operator;
+import org.drools.base.evaluators.EvaluatorDefinition.Target;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
@@ -36,7 +38,7 @@
  *
  */
 public class RandomEvaluatorDefinition 
-	implements ImperfectBinaryEvaluatorDefinition {
+	extends ImperfectAbstractEvaluatorDefinition {
 	
 	
 	
@@ -52,17 +54,10 @@
 
 	private static final String[]  SUPPORTED_IDS = {RANDOM.getOperatorString()};
 
-	private Map<String, Evaluator> cache         = Collections.emptyMap();
-
 	
-	
-	
-	
-	
 	public Evaluator getEvaluator(ValueType type, String operatorId,
-			boolean isNegated, String parameterText) {
+			boolean isNegated, String parameterText, Target left, Target right) {
 		
-		
 		if ( this.cache == Collections.EMPTY_MAP ) {
             this.cache = new HashMap<String, Evaluator>();
         }
@@ -81,25 +76,10 @@
         
 	}
 
-	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"
+	 * Operator is known as "random"
 	 */
 	public String[] getEvaluatorIds() {
 		return SUPPORTED_IDS;
@@ -111,87 +91,7 @@
 	
 	
 	
-	/** 
-	 * 
-	 * 
-	 */
-	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;
-	}
-
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
 }

Modified: 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	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/SeemsEvaluator.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -34,61 +34,29 @@
 	public SeemsEvaluator() {		
 		this(ValueType.OBJECT_TYPE,false,"");
 	}
-	
-	
+		
 	public SeemsEvaluator(final ValueType type,
             				final boolean isNegated,
             				final String parameters) {
 			super( type,
-                   SeemsEvaluatorDefinition.SEEMS);            
+                   SeemsEvaluatorDefinition.SEEMS,
+                   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("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));
-		
+    	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,
@@ -96,7 +64,7 @@
 			InternalReadAccessor leftExtractor, Object left,
 			InternalReadAccessor rightExtractor, Object right) {
 		
-		
+
 		Object set = rightExtractor.getValue(right);
 			if (set == null) {
 				return factory.Unknown();
@@ -104,69 +72,18 @@
 		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);
+	@Override
+	protected IDegree eval(Object left, Object right, IDegreeFactory factory) {
+		return factory.Unknown();
 	}
-	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) {
-        
-    }
+ 
 
 	
 

Modified: 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	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/SeemsEvaluatorDefinition.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -16,8 +16,10 @@
 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.ImperfectAbstractEvaluatorDefinition;
+import org.drools.base.evaluators.ImperfectEvaluatorDefinition;
 import org.drools.base.evaluators.Operator;
+import org.drools.base.evaluators.EvaluatorDefinition.Target;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.rule.VariableRestriction.ObjectVariableContextEntry;
 import org.drools.rule.VariableRestriction.VariableContextEntry;
@@ -34,11 +36,11 @@
 /**
  * 
  * @author sotty
-
+ 
  *
  */
 public class SeemsEvaluatorDefinition 
-	implements ImperfectBinaryEvaluatorDefinition {
+	extends ImperfectAbstractEvaluatorDefinition {
 	
 	
 	
@@ -54,17 +56,13 @@
 
 	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) {
+			boolean isNegated, String parameterText, Target left, Target right) {
 		
-		
 		if ( this.cache == Collections.EMPTY_MAP ) {
             this.cache = new HashMap<String, Evaluator>();
         }
@@ -83,23 +81,6 @@
         
 	}
 
-	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"
 	 */
@@ -113,87 +94,15 @@
 	
 	
 	
-	/** 
-	 * 
-	 * 
-	 */
-	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;
-	}
-
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
-	
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -668,11 +668,17 @@
     
     
 	public void inject(String rule, ArgList args, ConstraintKey key,
-			IDegree degree) {
+			IDegree degree, boolean killer) {
 		// TODO Auto-generated method stub
 		
 	}
 
+	public void reject(String ruleName, ArgList args, ConstraintKey key,
+			IDegree degree, boolean killer) {
+		// TODO Auto-generated method stub
+		
+	}
+
     
     
     

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/process/command/impl/CommandBasedStatefulKnowledgeSession.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/process/command/impl/CommandBasedStatefulKnowledgeSession.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/process/command/impl/CommandBasedStatefulKnowledgeSession.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -392,9 +392,15 @@
 	
 
 	public void inject(String premise, ArgList args, ConstraintKey key,
-			IDegree degree) {
+			IDegree degree, boolean killer) {
 		// TODO Auto-generated method stub
 		
+	}
+
+	public void reject(String ruleName, ArgList args, ConstraintKey key,
+			IDegree degree, boolean killer) {
+		// TODO Auto-generated method stub
+		
 	}    
 
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -195,6 +195,7 @@
         }
     }
     
+    
 	public void assertObject(ImperfectFactHandle factHandle,
 			PropagationContext propagationContext,
 			InternalWorkingMemory workingMemory, IDegreeFactory factory,
@@ -211,7 +212,7 @@
 			factHandle.addPropertyDegrees(storedEvals);
 		}
 			
-		
+		boolean doCut = false;
 		//Call internal evaluator, if not done before
 		ConstraintKey key = this.constraint.getConstraintKey();
 		Evaluation eval = factHandle.getPropertyDegree(key);
@@ -221,7 +222,8 @@
 					memory.context,
 					factory
                 	);	
-			 
+			 if (eval.getDegree().equals(factory.False()) && constraint.isCutter())
+				 doCut = true;
 			
 			for (Evaluation subEval : eval.getEvalTree()) {
 				factHandle.addPropertyDegree(subEval);
@@ -236,6 +238,10 @@
 						memory.context,
 						factory
 	                	);		
+				
+				if (localEval.getDegree().equals(factory.False()) && constraint.isCutter())
+					 doCut = true;
+				
 				record.addEvaluation(localEval);
 			}			
 		}   
@@ -244,7 +250,8 @@
 		
 		int verdict;
     	
-    	if (this.constraint.isCutter() && record.getDegree().equals(factory.False()))
+    	//if (this.constraint.isCutter() && record.getDegree().equals(factory.False()))
+		if (doCut)
     		verdict = IFilterStrategy.DROP;
     	else 
     		verdict = this.filterStrat.doTry(record); 

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluation.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluation.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluation.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -10,6 +10,7 @@
 
 import org.drools.RuntimeDroolsException;
 import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 import org.drools.degrees.operators.IMergeStrategy;
 import org.drools.degrees.operators.INullHandlingStrategy;
@@ -21,8 +22,8 @@
 	private float opRate;
 	
 	public CompositeEvaluation(int id, ConstraintKey key, Set<String> deps,
-			Evaluation[] evalDegrees, IDegreeCombiner operator, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, ArgList args) {		
-		super(id,key,deps,mergeStrat,nullStrat, args);
+			Evaluation[] evalDegrees, IDegreeCombiner operator, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, IDegreeFactory factory, ArgList args) {		
+		super(id,key,deps,mergeStrat,nullStrat, factory, args);
 		
 		if (evalDegrees != null) {
 			this.operands = new Vector<Evaluation>(evalDegrees.length);
@@ -41,8 +42,8 @@
 	
 	
 	protected CompositeEvaluation(int id, ConstraintKey key, Set<String> deps,
-			IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat,ArgList args) {		
-		super(id,key,deps,mergeStrat,nullStrat, args);
+			IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, IDegreeFactory factory,ArgList args) {		
+		super(id,key,deps,mergeStrat,nullStrat, factory,args);
 				
 		this.operands = new Vector<Evaluation>(1,1);			
 		this.operator = null;
@@ -54,8 +55,8 @@
 	
 	
 	public CompositeEvaluation(int id, ConstraintKey key, Set<String> deps,
-			int arity, IDegreeCombiner operator, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, ArgList args) {		
-		super(id,key,deps,mergeStrat,nullStrat, args);
+			int arity, IDegreeCombiner operator, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, IDegreeFactory factory, ArgList args) {		
+		super(id,key,deps,mergeStrat,nullStrat, factory, args);
 				
 		this.operands = new Vector<Evaluation>(arity,2);
 		
@@ -97,13 +98,13 @@
 		
 			int j = 0;
 			for (Evaluation eval : getOperands()) {
-				args[j++] = eval == null ? this.getNullHandlingStrat().convertNull() : eval.getDegree();		
+				args[j++] = eval == null ? this.getNullHandlingStrat().convertNull(getFactory()) : eval.getDegree();		
 			}
 		}		
 		
 		
 		
-		IDegree opDeg = this.operator.eval(args);
+		IDegree opDeg = this.operator.eval(args,getFactory());
 		updateOpRate();
 		boolean newContrib = this.addDegree(Evaluation.EVAL, opDeg, getOpRate(),true);
 						

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluationTemplate.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluationTemplate.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluationTemplate.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -22,8 +22,8 @@
 	protected Map<ConstraintKey,EvaluationTemplate> children;
 	
 	
-	public CompositeEvaluationTemplate(int id, ConstraintKey key, Set<String> deps, int N, IDegreeCombiner operator, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
-		super(id,key,deps,mergeStrat,nullStrat);
+	public CompositeEvaluationTemplate(int id, ConstraintKey key, Set<String> deps, int N, IDegreeCombiner operator, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, IDegreeFactory factory) {
+		super(id,key,deps,mergeStrat,nullStrat, factory);
 		
 		children = new HashMap<ConstraintKey, EvaluationTemplate>();
 		this.N = N;
@@ -48,19 +48,19 @@
 
 	
 	public Evaluation spawn(Evaluation[] evalDegree) {
-		return new CompositeEvaluation(id,key.clone(),deps,evalDegree,operator,mergeStrat,nullStrat,new ArgList());
+		return new CompositeEvaluation(id,key.clone(),deps,evalDegree,operator,mergeStrat,nullStrat,factory, new ArgList());
 	}
 	
 	public Evaluation spawn(ArgList args) {
-		return new CompositeEvaluation(id,key.clone(),deps,children.values().toArray(new Evaluation[children.values().size()]),operator,mergeStrat,nullStrat,args);
+		return new CompositeEvaluation(id,key.clone(),deps,children.values().toArray(new Evaluation[children.values().size()]),operator,mergeStrat,nullStrat,factory,args);
 	}
 	
 	public Evaluation spawn(int N) {
-		return new CompositeEvaluation(id,key.clone(),deps,N,operator,mergeStrat,nullStrat,new ArgList());
+		return new CompositeEvaluation(id,key.clone(),deps,N,operator,mergeStrat,nullStrat,factory,new ArgList());
 	}
 	
 	public Evaluation spawn(OperandSet args, BetaConstraints joinConstraints) {
-		return new SetCompositeEvaluation(id,key.clone(),deps,operator,args,mergeStrat,nullStrat,joinConstraints);
+		return new SetCompositeEvaluation(id,key.clone(),deps,operator,factory,args,mergeStrat,nullStrat,joinConstraints);
 	}
 	
 	

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeLeftTupleSinkAdapter.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeLeftTupleSinkAdapter.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeLeftTupleSinkAdapter.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -95,7 +95,7 @@
 
     	for( LeftTupleSinkNode sink = this.sinks.getFirst(); sink != null; sink = sink.getNextLeftTupleSinkNode() ) {
     		
-    		EvalRecord masterRecord = new EvalRecord(-1,factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),new ArgList()); 
+    		EvalRecord masterRecord = new EvalRecord(-1,factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),factory,new ArgList()); 
         		masterRecord.addEvaluation(record);
             doPropagateAssertLeftTuple( context, workingMemory, factory, sink,
                                         new ImperfectLeftTuple( factHandle, sink, leftTupleMemoryEnabled, masterRecord ) );

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EntryPointNode.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -331,7 +331,7 @@
 		
 			for ( int i = 0, length = cachedNodes.length; i < length; i++ ) {
 				System.out.println(this.getClass() + " dispatching obj"+ (handle.getObject().getClass().getSimpleName()) + "to node "+cachedNodes[i].hashCode());
-				EvalRecord record = new EvalRecord(this.getId(),factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),new ArgList());				
+				EvalRecord record = new EvalRecord(this.getId(),factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),factory,new ArgList());				
 				cachedNodes[i].assertObject(handle,
 		                        context,
 		                        workingMemory,

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalConditionNode.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -217,7 +217,7 @@
 
         EvalRecord record = leftTuple.getRecord();
         ConstraintKey key = new ConstraintKey("eval",this.condition.getEvalExpression().toString());
-        EvaluationTemplate templ = new SingleEvaluationTemplate(this.getId(),key,Collections.EMPTY_SET,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+        EvaluationTemplate templ = new SingleEvaluationTemplate(this.getId(),key,Collections.EMPTY_SET,factory.getMergeStrategy(),factory.getNullHandlingStrategy(),factory);
         
         Evaluation eval = templ.spawn(ans,leftTuple.getArgList());
         record.addEvaluation(eval);

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalRecord.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalRecord.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalRecord.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -46,7 +46,7 @@
 	private ImperfectRightTuple					rightTuple;
     private PropagationContext					propagationContext;
     private InternalWorkingMemory 				workingMemory;
-    private IDegreeFactory						factory;
+    //private IDegreeFactory						factory;
     
 	
 	
@@ -57,8 +57,8 @@
 //	}
 	
 		
-	public EvalRecord(int id,IDegreeCombiner operator,IMergeStrategy mergeStrat,INullHandlingStrategy nullStrat, ArgList args) {
-		super(id,new DynamicConstraintKey(operator.getName()),null,null,operator,mergeStrat,nullStrat, args);
+	public EvalRecord(int id,IDegreeCombiner operator,IMergeStrategy mergeStrat,INullHandlingStrategy nullStrat, IDegreeFactory factory, ArgList args) {
+		super(id,new DynamicConstraintKey(operator.getName()),null,null,operator,mergeStrat,nullStrat,factory, args);
 		
 		//mainKey = null;
 		//evalMap = new HashMap<ConstraintKey, Evaluation>();
@@ -185,7 +185,7 @@
 	
 	public EvalRecord clone() {
 		
-		EvalRecord ans = new EvalRecord(this.getNodeId(),this.getOperator(),this.getMergeStrat(),this.getNullHandlingStrat(), (ArgList) this.getArgs().clone());
+		EvalRecord ans = new EvalRecord(this.getNodeId(),this.getOperator(),this.getMergeStrat(),this.getNullHandlingStrat(), this.getFactory(), (ArgList) this.getArgs().clone());
 		ans.addEvaluations(this);
 		
 		return ans;
@@ -282,21 +282,21 @@
 		return workingMemory;
 	}
 
-	/**
-	 * @param factory the factory to set
-	 */
-	public void setFactory(IDegreeFactory factory) {
-		this.factory = factory;
-	}
+//	/**
+//	 * @param factory the factory to set
+//	 */
+//	public void setFactory(IDegreeFactory factory) {
+//		this.factory = factory;
+//	}
+//
+//	/**
+//	 * @return the factory
+//	 */
+//	public IDegreeFactory getFactory() {
+//		return factory;
+//	}
 
 	/**
-	 * @return the factory
-	 */
-	public IDegreeFactory getFactory() {
-		return factory;
-	}
-
-	/**
 	 * @param leftTuple the leftTuple to set
 	 */
 	public void setLeftTuple(ImperfectLeftTuple leftTuple) {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Evaluation.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Evaluation.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Evaluation.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -11,6 +11,7 @@
 import java.util.Set;
 
 import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.operators.IMergeStrategy;
 import org.drools.degrees.operators.INullHandlingStrategy;
 
@@ -29,27 +30,38 @@
 	private Map<String,IDegree> degrees;
 	private int totDegrees;
 	private Map<String,Float> confidence;
+	private Map<String,Boolean> killer;
 	
 	private IDegree aggDegree;
 	
 	private IMergeStrategy 				mergeStrat;
 	private INullHandlingStrategy 		nullStrat;
 	
+	private IDegreeFactory				factory;
+	
 	private ArgList args;
+	
+	
 
 	
 	
-	public Evaluation(int id, ConstraintKey key, Set<String> deps, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, ArgList args) {
+	public Evaluation(int id, ConstraintKey key, Set<String> deps, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, IDegreeFactory factory, ArgList args) {
+		this.factory = factory;
+
+		
 		if (deps == null)
 			deps = Collections.emptySet();
 		this.nodeId = id;
 		this.degrees = new HashMap<String,IDegree>();
 		this.confidence = new HashMap<String,Float>();
+		this.killer = new HashMap<String,Boolean>();
+		
 			this.degrees.put(PRIOR, null);	
 			this.degrees.put(EVAL, null);
 			for (String s : deps) {
 				this.degrees.put(s, null);
 				confidence.put(s,new Float(0));
+				killer.put(s,false);
 			}
 			totDegrees = 2+deps.size();			
 			
@@ -60,14 +72,14 @@
 		this.args = args;
 	}
 	
-	public Evaluation(int id, ConstraintKey key, Set<String> deps, IDegree evalDeg, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, ArgList args) {
-		this(id,key,deps,mergeStrat,nullStrat,args);
+	public Evaluation(int id, ConstraintKey key, Set<String> deps, IDegree evalDeg, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, IDegreeFactory factory, ArgList args) {
+		this(id,key,deps,mergeStrat,nullStrat,factory,args);
 		this.addDegree(Evaluation.EVAL,evalDeg,1,true);
 		
 	}
 	
-	public Evaluation(int id, ConstraintKey key, Set<String> deps, IDegree evalDeg, String source, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, ArgList args) {
-		this(id,key,deps,mergeStrat,nullStrat,args);
+	public Evaluation(int id, ConstraintKey key, Set<String> deps, IDegree evalDeg, String source, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, IDegreeFactory factory, ArgList args) {
+		this(id,key,deps,mergeStrat,nullStrat,factory,args);
 		this.addDegree(source,evalDeg,1,true);
 	}
 	
@@ -96,14 +108,19 @@
 	
 	
 	public void merge(Evaluation other) {	
-		this.addDegrees(other.degrees, other.confidence);
+		this.addDegrees(other.degrees, other.confidence, other.killer);
 	}
 
-	private void addDegrees(Map<String, IDegree> moreDegrees, Map<String, Float> conf) {
+	private void addDegrees(Map<String, IDegree> moreDegrees, Map<String, Float> conf, Map<String, Boolean> killer) {
 		boolean newContrib = false;
 		
 		for (String source : moreDegrees.keySet()) {
 			IDegree evalDeg = moreDegrees.get(source);
+			
+			Boolean killerContri = killer.get(source);
+				if (killerContri == null) 
+					killerContri = false;
+				
 			if (evalDeg != null) {
 				System.out.println("Trying to merge degrees for source "+ source + "+1");
 				
@@ -117,7 +134,7 @@
 					this.degrees.put(source,evalDeg);
 				}
 				 */
-				newContrib = newContrib || this.addDegree(source, evalDeg, conf.get(source),false);
+				newContrib = newContrib || this.addDegree(source, evalDeg, conf.get(source),killerContri,false);
 				
 				
 				
@@ -135,8 +152,11 @@
 	
 	}
 	
+	public boolean addDegree(String source, IDegree evalDeg, float wgt, boolean immediateUpdate) {
+		return addDegree(source, evalDeg, wgt, false, immediateUpdate);
+	}
 		
-	public boolean addDegree(String source, IDegree evalDeg, float wgt, boolean immediateUpdate) {
+	public boolean addDegree(String source, IDegree evalDeg, float wgt, boolean isKiller, boolean immediateUpdate) {
 		boolean newContrib = false;
 		boolean rateIncr = false;
 		Float prevConf;
@@ -154,10 +174,12 @@
 				confidence.put(source, wgt);
 			rateIncr = prevConf == null ? true : prevConf.floatValue() < wgt;
 			
+						
 			IDegree oldVal = getDegreeBit(source);
 			if (oldVal == null) {
 				System.out.println(this.key+" Added degree for source "+ source + " with wgt "+wgt);
-				this.degrees.put(source,evalDeg);					
+				this.degrees.put(source,evalDeg);
+				this.killer.put(source,isKiller);
 				newContrib = true;
 			} else {
 					if (oldVal.equals(evalDeg)) {
@@ -168,6 +190,12 @@
 						this.degrees.put(source,evalDeg);
 						newContrib = true;
 					}
+					
+					boolean wasKiller = killer.get(source);
+					if (wasKiller != isKiller) {
+						killer.put(source,isKiller);
+						newContrib = true;
+					}
 			}
 			
 //			if (getDegreeBit(source) == null) {
@@ -233,11 +261,24 @@
 	
 	protected IDegree mergeDegrees() {
 		IDegree[] bits = new IDegree[this.totDegrees];
+		boolean[] killerFlags = new boolean[this.totDegrees];
+		boolean needKill = false;
+		
 		int j = 0;
-		for (String s : degrees.keySet())
-			bits[j++] = degrees.get(s);
+		for (String s : degrees.keySet()) {
+			bits[j] = degrees.get(s);
+			Boolean flag = killer.get(s);
+			killerFlags[j] = flag == null ? false : flag;
+				if (killerFlags[j]) 
+					needKill = true;
+			
+			j++;
+		}
 		
-		return this.mergeStrat.eval(bits,nullStrat);		
+		if (needKill)
+			return this.mergeStrat.eval(bits, killerFlags, nullStrat, getFactory());
+		else
+			return this.mergeStrat.eval(bits, null, nullStrat, getFactory());
 	}
 	
 	
@@ -350,6 +391,34 @@
 	public ArgList getArgs() {
 		return args;
 	}
+
+	/**
+	 * @param factory the factory to set
+	 */
+	public void setFactory(IDegreeFactory factory) {
+		this.factory = factory;
+	}
+
+	/**
+	 * @return the factory
+	 */
+	public IDegreeFactory getFactory() {
+		return factory;
+	}
+
+	/**
+	 * @param killer the killer to set
+	 */
+	public void setKiller(String id, boolean killer) {
+		this.killer.put(id,killer);
+	}
+
+	/**
+	 * @return the killer
+	 */
+	public boolean isKiller(String id) {
+		return killer.get(id);
+	}
 	
 	
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvaluationTemplate.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvaluationTemplate.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvaluationTemplate.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -3,6 +3,7 @@
 import java.util.Set;
 
 import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 import org.drools.degrees.operators.IMergeStrategy;
 import org.drools.degrees.operators.INullHandlingStrategy;
@@ -16,14 +17,17 @@
 	
 	protected IMergeStrategy 				mergeStrat;
 	protected INullHandlingStrategy 		nullStrat;
+	protected IDegreeFactory				factory;
 	
 	
-	public EvaluationTemplate(int id, ConstraintKey key, Set<String> deps, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
+	
+	public EvaluationTemplate(int id, ConstraintKey key, Set<String> deps, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, IDegreeFactory factory) {
 		this.id = id;
 		this.key = key;
 		this.deps = deps;		
 		this.mergeStrat = mergeStrat;
 		this.nullStrat = nullStrat;
+		this.factory = factory;
 	}
 	
 	
@@ -31,15 +35,15 @@
 	
 	
 	public Evaluation spawn(IDegree evalDegree, ArgList args) {		
-		return new Evaluation(id,key,deps,evalDegree,mergeStrat,nullStrat,args);		
+		return new Evaluation(id,key,deps,evalDegree,mergeStrat,nullStrat,factory,args);		
 	}
 	
 	public Evaluation spawn(String source, IDegree evalDegree, ArgList args) {		
-		return new Evaluation(id,key,deps,evalDegree,source,mergeStrat,nullStrat,args);		
+		return new Evaluation(id,key,deps,evalDegree,source,mergeStrat,nullStrat,factory,args);		
 	}
 		
 	public Evaluation spawn(ArgList args) {
-		return new Evaluation(id,key,deps,null,mergeStrat,nullStrat,args);
+		return new Evaluation(id,key,deps,null,mergeStrat,nullStrat,factory,args);
 	}
 	
 	
@@ -48,8 +52,14 @@
 	}
 	
 	public abstract Evaluation spawn(Evaluation[] evalDegree);
+
+
+
+
+
 	
 	
 	
+	
 
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/GammaMemory.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/GammaMemory.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/GammaMemory.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -9,15 +9,32 @@
 
 	private Map<ArgList, Collection<Evaluation>> store;
 	
+	private Collection<Evaluation> all = null;
+	
 	public GammaMemory() {
 		store = new HashMap<ArgList, Collection<Evaluation>>();
 	}
 	
 	public Collection<Evaluation> retrieve(ArgList o) {
+		Collection<Evaluation> ans;
+							
 		if (o.isPersistent())
-			return this.store.get(o);
+			ans = this.store.get(o);
 		else
-			return this.store.remove(o);		
+			ans = this.store.remove(o);
+		
+		if (all != null) {
+			
+			if (ans == null) {
+				ans = all;
+			} else {
+				ans.addAll(all);
+			}
+			
+			
+		}
+		
+		return ans;
 	}
 	
 	public Collection<ArgList> getKeys() {
@@ -25,6 +42,12 @@
 	}
 	
 	public void store(ArgList o, Evaluation eval) {
+		if (o.getObject() instanceof Jolly) {
+			all = new LinkedList<Evaluation>();
+			all.add(eval);
+			return;
+		}
+		
 		Collection<Evaluation> coll = store.get(o);
 		if (coll == null) {
 			coll = new LinkedList<Evaluation>();

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectExistsNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectExistsNode.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectExistsNode.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -58,7 +58,7 @@
 	}
 	
 	
-	public EvaluationTemplate buildEvaluationTemplate(IDegreeCombiner operator, Map<ConstraintKey,Set<String>> deps, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
+	public EvaluationTemplate buildEvaluationTemplate(IDegreeCombiner operator, Map<ConstraintKey,Set<String>> deps, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, IDegreeFactory factory) {
 		
 		
 		
@@ -69,7 +69,8 @@
 				1,
 				operator,
 				mergeStrat,
-				nullStrat);
+				nullStrat,
+				factory);
 		
 		return template;
 	

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectRuleBase.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectRuleBase.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ImperfectRuleBase.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -93,10 +93,12 @@
                factHandleFactory
                );               
         
-        String factoryName = config.getProperty("org.drools.chance.factory");        
+        String factoryName = config.getProperty("org.drools.chance.factory");
+        	boolean cwa = config.getClosedWorldAssumption();
         IDegreeFactory factory = null;
         try {
 			factory = (IDegreeFactory) Class.forName(factoryName).newInstance();
+			factory.setClosedWorldAssumption(cwa);
 			System.out.println("Created instance of "+factoryName);
 		} catch (InstantiationException e) {
 			// TODO Auto-generated catch block
@@ -153,6 +155,7 @@
 						getDegreeFactory().getAndOperator(),
 						getDegreeFactory().getMergeStrategy(),
 						getDegreeFactory().getNullHandlingStrategy(),
+						getDegreeFactory(),
 						new ArgList(object));
 		
 				getRete().assertObject( (ImperfectFactHandle) handle,

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/JoinNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/JoinNode.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -203,7 +203,7 @@
     		
     		
         	
-        	
+        	boolean doCut = false;
         	//Call internal evaluator, if not done before
     		ConstraintKey[] keys = this.constraints.getConstraintKeys();
     		if (keys != null) {
@@ -215,6 +215,11 @@
 		    			
 		    			Evaluation[] evals = this.constraints.isSatisfiedCachedLeft(memory.getContext(), factHandle, factory);
 		    			
+		    			for (Evaluation eval : evals) {
+		    				if (eval.getDegree().equals(factory.False()) && constraints.isCutter())
+		    					doCut = true;
+		    			}
+		    			
 		    			//B-constraints are 0 to N
 		    			//Each is evaluated and, if it is the first time, added to the object's handle
 		    			if (evals != null) {
@@ -259,7 +264,8 @@
         	
         	int verdict;
         	
-        	if (this.isCutter && mainRecord.getDegree().equals(factory.False()))
+        	//if (this.isCutter && mainRecord.getDegree().equals(factory.False()))
+        	if (doCut)
         		verdict = IFilterStrategy.DROP;
         	else 
         		verdict = this.filterStrat.doTry(mainRecord); 
@@ -413,7 +419,7 @@
     		
     		
         	
-        	
+    		boolean doCut = false;
         	//Call internal evaluator, if not done before
     		ConstraintKey[] keys = this.constraints.getConstraintKeys();
     		Evaluation[] evals = null;
@@ -423,6 +429,9 @@
 		    			evals = this.constraints.isSatisfiedCachedRight( memory.getContext(),
 		                        													  leftTuple, 
 		                        													  factory );
+		    			for (Evaluation eval : evals)
+		    				if (eval.getDegree().equals(factory.False()) && constraints.isCutter())
+		    					doCut = true;
 		    			//B-constraints are 0 to N
 		    			//Each is evaluated and, if it is the first time, added to the object's handle
 		    			if (evals != null) {
@@ -468,7 +477,8 @@
         		
         	int verdict;
         	
-        	if (this.isCutter && mainRecord.getDegree().equals(factory.False()))
+        	//if (this.isCutter && mainRecord.getDegree().equals(factory.False()))
+        	if (doCut)
         		verdict = IFilterStrategy.DROP;
         	else 
         		verdict = this.filterStrat.doTry(mainRecord); 

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ModusPonensNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ModusPonensNode.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ModusPonensNode.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -103,6 +103,8 @@
             ImperfectRightTuple dummyRT = new ImperfectRightTuple(handle,this,null);
             
             Evaluation implEval = this.constraints.isSatisfiedCachedLeft( new ContextEntry[] {adHocCtx}, handle, factory)[0];
+            	// For future injections...
+            	((ImperfectFactHandle) leftTuple.getLastHandle()).addPropertyDegree(implEval);
 
         	
             ArgList args = leftTuple.getArgList();
@@ -115,7 +117,7 @@
     		
     		
     		
-        	EvalRecord mpRecord = new EvalRecord(this.id,getMPOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),new ArgList());
+        	EvalRecord mpRecord = new EvalRecord(this.id,getMPOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),factory,new ArgList());
         		Evaluation core = premiseRecord.getOperands().iterator().next();
         		core.deleteObserver(premiseRecord);
         	mpRecord.addEvaluation(core);        		

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -199,7 +199,8 @@
     										getConstraintKey(),
     										deps,
     										factory.getMergeStrategy(),
-    										factory.getNullHandlingStrategy());
+    										factory.getNullHandlingStrategy(),
+    										factory);
 		return templ;
 	}
 
@@ -640,7 +641,7 @@
 
 		Evaluation eval = factHandle.getPropertyDegree(key); 
 		if (eval == null) {			
-			eval = this.template.spawn(storedEvals == null ? factory.True() : factory.False(),new ArgList(factHandle.getObject())); 				
+			eval = this.template.spawn(storedEvals == null ? factory.True() : factory.Unknown(),new ArgList(factHandle.getObject())); 				
 			factHandle.addPropertyDegree(eval);
 		}
 		

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/OperatorInstaller.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/OperatorInstaller.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/OperatorInstaller.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -51,7 +51,7 @@
 		
 	}
 	
-	public EvaluationTemplate buildEvaluationTemplate(IDegreeCombiner operator, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
+	public EvaluationTemplate buildEvaluationTemplate(IDegreeCombiner operator, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, IDegreeFactory factory) {
 						
 		template = new CompositeEvaluationTemplate( this.getId(),
 													new DynamicConstraintKey(operator.getName()),													
@@ -59,7 +59,8 @@
 													getArity(),
 													operator,
 													mergeStrat,
-													nullStrat												
+													nullStrat,
+													factory
 													);
 					
 		return template;

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Rete.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Rete.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Rete.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -285,7 +285,7 @@
 		}
 		else {
 			if (! node.equals(constraintIndex.get(key)))
-				throw new RuntimeDroolsException("Found duplicate key: this may be a know issue");
+				throw new RuntimeDroolsException("Found duplicate key: "+key+" this may be a know issue");
 		}
 	}
 	

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SetCompositeEvaluation.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SetCompositeEvaluation.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SetCompositeEvaluation.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -28,10 +28,10 @@
 	//IOperandSet args;
 	
 	public SetCompositeEvaluation(int id, ConstraintKey key, Set<String> deps,
-			IDegreeCombiner operator, OperandSet opSet,
+			IDegreeCombiner operator, IDegreeFactory factory, OperandSet opSet,
 			IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat,
 			BetaConstraints joinConstraints) {
-		super(id,key,deps,mergeStrat,nullStrat, new ArgList());
+		super(id,key,deps,mergeStrat,nullStrat, factory, new ArgList());
 		
 		setOperator(operator);
 		

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SingleEvaluationTemplate.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SingleEvaluationTemplate.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SingleEvaluationTemplate.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -3,6 +3,7 @@
 import java.util.Set;
 
 import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.operators.IDegreeCombiner;
 import org.drools.degrees.operators.IMergeStrategy;
 import org.drools.degrees.operators.INullHandlingStrategy;
@@ -10,8 +11,8 @@
 public class SingleEvaluationTemplate extends EvaluationTemplate {
 
 		
-	public SingleEvaluationTemplate(int id, ConstraintKey key, Set<String> deps, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat) {
-		super(id,key,deps,mergeStrat,nullStrat);
+	public SingleEvaluationTemplate(int id, ConstraintKey key, Set<String> deps, IMergeStrategy mergeStrat, INullHandlingStrategy nullStrat, IDegreeFactory factory) {
+		super(id,key,deps,mergeStrat,nullStrat,factory);
 	}
 
 	@Override

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SingleLeftTupleSinkAdapter.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SingleLeftTupleSinkAdapter.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/SingleLeftTupleSinkAdapter.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -120,7 +120,7 @@
 			InternalWorkingMemory workingMemory, IDegreeFactory factory,
 			EvalRecord record, boolean leftTupleMemoryEnabled) {
     	
-    	EvalRecord masterRecord = new EvalRecord(-1,factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),new ArgList());
+    	EvalRecord masterRecord = new EvalRecord(-1,factory.getAndOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),factory,new ArgList());
     		masterRecord.addEvaluation(record);
     		
 //    		System.out.println("--------------------------------------");

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectGroupElementBuilder.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectGroupElementBuilder.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/ImperfectGroupElementBuilder.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -60,6 +60,9 @@
         this.getGeBuilders().put( GroupElement.EQV,
                 new ImperfectEqvBuilder() );
         
+        this.getGeBuilders().put( GroupElement.IMPLIES,
+                new ImperfectImpliesBuilder() );
+        
         this.getGeBuilders().put( GroupElement.EXISTS,
                              new ImperfectExistsBuilder() );
         
@@ -195,7 +198,7 @@
 													context.getRuleBase().getConfiguration().isMultithreadEvaluation());
         
         
-        instNode.buildEvaluationTemplate(operator,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+        instNode.buildEvaluationTemplate(operator,factory.getMergeStrategy(),factory.getNullHandlingStrategy(),factory);
         
         context.setTupleSource((LeftTupleSource) utils.attachNode(
         							context,
@@ -257,6 +260,16 @@
 		}				
 	}
 	
+	private static class ImperfectImpliesBuilder extends ImperfectOperatorArgsBuilder  {
+		@Override
+		protected IDegreeCombiner getOperator(IDegreeFactory factory, String params) {
+			if (params == null)
+				return factory.getImplicationOperator();
+			else 
+				return factory.getImplicationOperator(params);
+		}				
+	}
+	
 	private static class ImperfectEqvBuilder extends ImperfectOperatorArgsBuilder  {
 		@Override
 		protected IDegreeCombiner getOperator(IDegreeFactory factory, String params) {
@@ -302,234 +315,8 @@
 	
 	
 	
-	
-//
-//	private static class ImperfectAndBuilder
-//        implements
-//        ReteooComponentBuilder {
-//
-//        /**
-//         * @inheritDoc
-//         * 
-//         * And group elements just iterate over their children
-//         * selecting and calling the build procedure for each one
-//         * 
-//         */
-//        public void build(final BuildContext context,
-//                          final BuildUtils utils,
-//                          final RuleConditionElement rce) {
-//
-//        	
-//        	
-//        	IDegreeFactory factory = ((ImperfectRuleBase) context.getRuleBase()).getDegreeFactory();
-//            
-//            IDegreeCombiner operator;
-//            if (context.isNegated()) {
-//            	operator = factory.getNegationOperator();
-//            		((NegationOperator) operator).setOperator(factory.getAndOperator());
-//            	context.toggleNegated();	
-//            	
-//            } else {
-//            	operator = factory.getAndOperator();
-//            }
-//        	
-//        	
-//            final GroupElement ge = (GroupElement) rce;
-//
-//            // iterate over each child and build it
-//            for ( final Iterator it = ge.getChildren().iterator(); it.hasNext(); ) {
-//
-//                final RuleConditionElement child = (RuleConditionElement) it.next();
-//
-//                final ReteooComponentBuilder builder = utils.getBuilderFor( child );
-//
-//               builder.build( context,
-//                               utils,
-//                               child );
-//
-//                // if a previous object source was bound, but no tuple source
-//                if ( context.getObjectSource() != null && context.getTupleSource() == null ) {
-//                    // adapt it to a Tuple source                    
-//                    context.setTupleSource( (LeftTupleSource) utils.attachNode( context,
-//                                                                                new LeftInputAdapterNode( context.getNextId(),
-//                                                                                                          context.getObjectSource(),
-//                                                                                                          context ) ) );
-//
-//                    context.setObjectSource( null );
-//                }
-//
-//                // if there was a previous tuple source, then a join node is needed
-//                if ( context.getObjectSource() != null && context.getTupleSource() != null ) {
-//                    // so, create the tuple source and clean up the constraints and object source
-//                    final BetaConstraints betaConstraints = utils.createBetaNodeConstraint( context,
-//                                                                                            context.getBetaconstraints(),
-//                                                                                            false );
-//
-//                    Behavior[] behaviors = createBehaviorArray( context );
-//
-//                    context.setTupleSource( (LeftTupleSource) utils.attachNode( context,
-//                    														    new JoinNode( context.getNextId(),
-//                    														    		context.getTupleSource(),
-//                    														    		context.getObjectSource(),
-//                    														    		betaConstraints,
-//                    														    		behaviors,
-//                    														    		context ) ) );
-//                    context.setBetaconstraints( null );
-//                    context.setObjectSource( null );
-//                }
-//            }
-//            
-//            int arity = ge.getChildren().size();
-//            	Object firstChild = ge.getChildren().get(0);
-//            	if (firstChild instanceof Pattern) {
-//            		Pattern pat = (Pattern) firstChild;
-//            		if (pat.getObjectType().isAssignableFrom(new ClassObjectType(InitialFact.class))) 
-//            			arity--;
-//            	}
-////            	if (firstChild.isPatternScopeDelimiter())
-////            		;
-//            		
-//            OperatorInstaller instNode = new AndOperatorInstaller(
-//														context.getTupleSource(),
-//														arity,
-//														context.getNextId(),
-//														context.getPartitionId(),
-//														context.getRuleBase().getConfiguration().isMultithreadEvaluation());
-//            
-//            
-//            instNode.buildEvaluationTemplate(operator,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
-//            
-//            context.setTupleSource((LeftTupleSource) utils.attachNode(
-//            							context,
-//            							instNode
-//            							));
-//            
-//            
-//            
-//        }
-//
-//        public boolean requiresLeftActivation(final BuildUtils utils,
-//                                              final RuleConditionElement rce) {
-//            final GroupElement and = (GroupElement) rce;
-//
-//            // need to check this because in the case of an empty rule, the root AND
-//            // will have no child
-//            if ( and.getChildren().isEmpty() ) {
-//                return true;
-//            }
-//
-//            final RuleConditionElement child = (RuleConditionElement) and.getChildren().get( 0 );
-//            final ReteooComponentBuilder builder = utils.getBuilderFor( child );
-//
-//            return builder.requiresLeftActivation( utils,
-//                                                   child );
-//        }
-//    }
-//
-//    private static class ImperfectOrBuilder
-//        implements
-//        ReteooComponentBuilder {
-//
-//       
-//    	
-//    	 public void build(final BuildContext context,
-//                 final BuildUtils utils,
-//                 final RuleConditionElement rce) {
-//
-//    		 IDegreeFactory factory = ((ImperfectRuleBase) context.getRuleBase()).getDegreeFactory();
-//
-//    		 IDegreeCombiner operator;
-//             if (context.isNegated()) {
-//             	operator = factory.getNegationOperator();
-//             		((NegationOperator) operator).setOperator(factory.getOrOperator());
-//             	context.toggleNegated();	
-//             	
-//             } else {
-//             	operator = factory.getOrOperator();
-//             }
-//    		 
-//	
-//    		 final GroupElement ge = (GroupElement) rce;
-//
-//    		 // 	iterate over each child and build it
-//    		 for ( final Iterator it = ge.getChildren().iterator(); it.hasNext(); ) {
-//    			 
-//    			 final RuleConditionElement child = (RuleConditionElement) it.next();
-//
-//    			 final ReteooComponentBuilder builder = utils.getBuilderFor( child );
-//
-//    			 builder.build( context,
-//    					 utils,
-//    					 child );
-//
-//       // 	if a previous object source was bound, but no tuple source
-//    			 if ( context.getObjectSource() != null && context.getTupleSource() == null ) {
-//           // 	adapt it to a Tuple source                    
-//    				 context.setTupleSource( (LeftTupleSource) utils.attachNode( context,
-//                                                                       new LeftInputAdapterNode( context.getNextId(),
-//                                                                                                 context.getObjectSource(),
-//                                                                                                 context ) ) );
-//
-//    				 context.setObjectSource( null );
-//    			 }
-//
-//    			 // if there was a previous tuple source, then a join node is needed
-//    			 if ( context.getObjectSource() != null && context.getTupleSource() != null ) {
-//           // 	so, create the tuple source and clean up the constraints and object source
-//    				 final BetaConstraints betaConstraints = utils.createBetaNodeConstraint( context,
-//    						 context.getBetaconstraints(),
-//    						 false );
-//
-//    				 Behavior[] behaviors = createBehaviorArray( context );
-//
-//    				 context.setTupleSource( (LeftTupleSource) utils.attachNode( context,
-//    						 new JoinNode( context.getNextId(),
-//    								 context.getTupleSource(),
-//    								 context.getObjectSource(),
-//    								 betaConstraints,
-//    								 behaviors,
-//    								 context ) ) );
-//    				 context.setBetaconstraints( null );
-//    				 context.setObjectSource( null );
-//    			 }
-//    		 }
-//    		     		              
-//    		 OperatorInstaller instNode = new OrOperatorInstaller(
-//						context.getTupleSource(),
-//						ge.getChildren().size(),
-//						context.getNextId(),
-//						context.getPartitionId(),
-//						context.getRuleBase().getConfiguration().isMultithreadEvaluation());
-//    		 
-//    		 
-//    		 instNode.buildEvaluationTemplate(operator,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
-//    		 
-//    		 context.setTupleSource((LeftTupleSource) utils.attachNode(
-//						context,
-//						instNode
-//						));
-//             
-//    	 }
-//
-//    	 public boolean requiresLeftActivation(final BuildUtils utils,
-//    			 final RuleConditionElement rce) {
-//    		 final GroupElement and = (GroupElement) rce;
-//
-//    		 // need to check this because in the case of an empty rule, the root AND
-//   // 	will have no child
-//    		 if ( and.getChildren().isEmpty() ) {
-//    			 return true;
-//    		 }
-//
-//    		 final RuleConditionElement child = (RuleConditionElement) and.getChildren().get( 0 );
-//    		 final ReteooComponentBuilder builder = utils.getBuilderFor( child );
-//
-//    		 return builder.requiresLeftActivation( utils,
-//                                          child );
-//    	 }
-//    	
-//    }
 
+
     private static class ImperfectNotBuilder
         implements
         ReteooComponentBuilder {
@@ -659,7 +446,7 @@
                     behaviors,
                     context );
             
-            exNode.buildEvaluationTemplate(operator,context.getRule().getDependencies(),factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+            exNode.buildEvaluationTemplate(operator,context.getRule().getDependencies(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),factory);
             
             context.setTupleSource( (LeftTupleSource) utils.attachNode( context,
                                                                          exNode) );
@@ -771,7 +558,7 @@
                 behaviors,
                 context );
         
-        exNode.buildEvaluationTemplate(operator,context.getRule().getDependencies(),factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+        exNode.buildEvaluationTemplate(operator,context.getRule().getDependencies(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),factory);
         
         context.setTupleSource( (LeftTupleSource) utils.attachNode( context,
                                                                      exNode) );

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/DefaultIntervalFilterStrategy.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/DefaultIntervalFilterStrategy.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/DefaultIntervalFilterStrategy.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -34,7 +34,7 @@
 			return DROP;
 			*/
 		
-		return PASS;
+		return (eval.getInfoRate() == 1) ? PASS : HOLD;
 		
 	}
 

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/SimpleFilterStrategy.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/SimpleFilterStrategy.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/filters/SimpleFilterStrategy.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -19,14 +19,18 @@
 	@Override
 	public int doTry(Evaluation eval) {
 		//return eval.getDegree().toBoolean() ? PASS : DROP;
-		System.out.println(""+eval.getInfoRate());
-		if (eval.getDegree().toBoolean() && eval.getInfoRate() == 1.0f) 
-			return PASS;
-		else if (eval.getDegree().toBoolean() && eval.getInfoRate() < 1.0f)
-			return HOLD;
-		else 
-			return DROP;
+		System.out.println(this.getClass()+" : "+eval.getInfoRate());
 		
+		//Changed since CUT can be used
+//		if (eval.getDegree().toBoolean() && eval.getInfoRate() == 1.0f) 
+//			return PASS;
+//		else if (eval.getDegree().toBoolean() && eval.getInfoRate() < 1.0f)
+//			return HOLD;
+//		else 
+//			return DROP;
+		return eval.getInfoRate() == 1.0f? PASS : HOLD;
+		
+		
 	}
 
 	@Override

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/AndCompositeRestriction.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -51,7 +51,7 @@
                                                   handle,
                                                   workingMemory,
                                                   context, factory );
-    	return factory.getAndOperator().eval(degs);
+    	return factory.getAndOperator().eval(degs,factory);
         
 	}
 
@@ -81,7 +81,7 @@
                                                             handle, factory );
             
         
-        return factory.getAndOperator().eval(degs);
+        return factory.getAndOperator().eval(degs,factory);
 	}
 
 	
@@ -110,7 +110,7 @@
         													contextEntry.contextEntries[i],
         													factory );
                    
-        return factory.getAndOperator().eval(degs);
+        return factory.getAndOperator().eval(degs,factory);
 	}
 
     

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/AndConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/AndConstraint.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/AndConstraint.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -274,7 +274,8 @@
     			N,
     			this.getOperator(),
     			factory.getMergeStrategy(),
-    			factory.getNullHandlingStrategy());
+    			factory.getNullHandlingStrategy(),
+    			factory);
 
     	int Na = this.alphaConstraints.length;
 		int Nb = this.betaConstraints.length;		

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/GroupElement.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/GroupElement.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/GroupElement.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -39,6 +39,7 @@
     public static final Type OR = Type.OR;
     public static final Type NOT = Type.NOT;
     public static final Type XOR = Type.XOR;
+    public static final Type IMPLIES = Type.IMPLIES;
     public static final Type EQV = Type.EQV;
     public static final Type EXISTS = Type.EXISTS;
 //    public static final Type FORANY = Type.FORANY;
@@ -323,6 +324,10 @@
         return XOR.equals( this.type );
     }
     
+    public boolean isImplies() {
+        return IMPLIES.equals( this.type );
+    }
+    
     public boolean isEqv() {
         return EQV.equals( this.type );
     }
@@ -408,6 +413,7 @@
         OR(false), 
         NOT(true),
         XOR(false),
+        IMPLIES(false),
         EQV(false),
         EXISTS(true),
         AVG(false),

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/GroupElementFactory.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/GroupElementFactory.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/GroupElementFactory.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -50,6 +50,10 @@
         return new GroupElement( GroupElement.XOR );
     }
 	
+	public static GroupElement newImpliesInstance() {
+        return new GroupElement( GroupElement.IMPLIES );
+    }
+	
 	public static GroupElement newEqvInstance() {
         return new GroupElement( GroupElement.EQV );
     }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/LiteralConstraint.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -230,7 +230,7 @@
 		 
 		
 		 
-	   	this.template = new SingleEvaluationTemplate(id,this.getConstraintKey(),deps,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+	   	this.template = new SingleEvaluationTemplate(id,this.getConstraintKey(),deps,factory.getMergeStrategy(),factory.getNullHandlingStrategy(),factory);
 	   	return template;
 	}
 

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/MultiRestrictionFieldConstraint.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -181,7 +181,7 @@
     	
 				
 		//EvaluationTemplate temp = buildTemplateForRestriction(this.restrictions, null, id, dependencies, factory);
-		EvaluationTemplate temp = new SingleEvaluationTemplate(id,this.restrictions.getConstraintKey(),dependencies.get(restrictions.getConstraintKey()),factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+		EvaluationTemplate temp = new SingleEvaluationTemplate(id,this.restrictions.getConstraintKey(),dependencies.get(restrictions.getConstraintKey()),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),factory);
     			    	    		
 		this.setTemplate(temp);
     	return getTemplate();

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/MutableTypeConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/MutableTypeConstraint.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/MutableTypeConstraint.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -145,7 +145,7 @@
 		 
 		
 		 
-	   	this.template = new SingleEvaluationTemplate(id,this.getConstraintKey(),deps,factory.getMergeStrategy(),factory.getNullHandlingStrategy());
+	   	this.template = new SingleEvaluationTemplate(id,this.getConstraintKey(),deps,factory.getMergeStrategy(),factory.getNullHandlingStrategy(),factory);
 	   	return template;
 	}
     

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/OrCompositeRestriction.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -51,7 +51,7 @@
                                                   handle,
                                                   workingMemory,
                                                   context, factory );
-    	return factory.getOrOperator().eval(degs);
+    	return factory.getOrOperator().eval(degs,factory);
         
 	}
 
@@ -78,7 +78,7 @@
                                                             handle, factory );
             
         
-        return factory.getOrOperator().eval(degs);
+        return factory.getOrOperator().eval(degs,factory);
 	}
 
     public boolean isAllowedCachedRight(final LeftTuple tuple,
@@ -104,7 +104,7 @@
         													contextEntry.contextEntries[i],
         													factory );
                    
-        return factory.getOrOperator().eval(degs);
+        return factory.getOrOperator().eval(degs,factory);
 	}
 
     public Object clone() {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/OrConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/OrConstraint.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/OrConstraint.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -65,7 +65,8 @@
     			N,
     			getOperator(),
     			factory.getMergeStrategy(),
-    			factory.getNullHandlingStrategy());
+    			factory.getNullHandlingStrategy(),
+    			factory);
 
     	int Na = this.alphaConstraints.length;
 		int Nb = this.betaConstraints.length;		

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/VariableRestriction.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/VariableRestriction.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -138,11 +138,12 @@
     
     public IDegree isSatisfiedCachedLeft(ContextEntry context,
 			InternalFactHandle handle, IDegreeFactory factory) {
-    	return this.evaluator.evaluateCachedLeft(    			
+    	IDegree deg = this.evaluator.evaluateCachedLeft(    			
     			((VariableContextEntry) context).workingMemory,    			
                 (VariableContextEntry) context,
                 factory,
                 this.evaluator.prepareLeftObject( handle ) );
+    	return deg;
 	}
 
     

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java	2009-05-22 02:31:50 UTC (rev 26663)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/spi/KnowledgeHelper.java	2009-05-22 02:32:45 UTC (rev 26664)
@@ -138,26 +138,56 @@
     
     
     public void inject(Object arg, String field, String op, String value);
+    public void inject(Object arg, String field, String op, String value,boolean killer);
+    public void reject(Object arg, String field, String op, String value);
+    public void reject(Object arg, String field, String op, String value,boolean killer);
     
     public void inject(Object[] args, String field, String op, String value);
+    public void inject(Object[] args, String field, String op, String value,boolean killer);
+    public void reject(Object[] args, String field, String op, String value);
+    public void reject(Object[] args, String field, String op, String value,boolean killer);
     
     public void inject(Object arg, String key);
+    public void inject(Object arg, String key,boolean killer);
+    public void reject(Object arg, String key);
+    public void reject(Object arg, String key,boolean killer);
     
     public void inject(Object[] args, String key);
+    public void inject(Object[] args, String key,boolean killer);
+    public void reject(Object[] args, String key);
+    public void reject(Object[] args, String key,boolean killer);
     
     
     public void injectKey(Object arg, String field, String op, String value);
+    public void injectKey(Object arg, String field, String op, String value,boolean killer);
+    public void rejectKey(Object arg, String field, String op, String value);
+    public void rejectKey(Object arg, String field, String op, String value,boolean killer);
     
     public void injectKey(Object[] args, String field, String op, String value);
+    public void injectKey(Object[] args, String field, String op, String value,boolean killer);
+    public void rejectKey(Object[] args, String field, String op, String value);
+    public void rejectKey(Object[] args, String field, String op, String value,boolean killer);
     
     public void injectKey(Object arg, String key);
+    public void injectKey(Object arg, String key,boolean killer);
+    public void rejectKey(Object arg, String key);
+    public void rejectKey(Object arg, String key,boolean killer);
     
     public void injectKey(Object[] args, String key);
+    public void injectKey(Object[] args, String key,boolean killer);
+    public void rejectKey(Object[] args, String key);
+    public void rejectKey(Object[] args, String key,boolean killer);
     
     
     public void injectId(Object arg, String key);
+    public void injectId(Object arg, String key,boolean killer);
+    public void rejectId(Object arg, String key);
+    public void rejectId(Object arg, String key,boolean killer);
     
     public void injectId(Object[] args, String key);
+    public void injectId(Object[] args, String key,boolean killer);
+    public void rejectId(Object[] args, String key);
+    public void rejectId(Object[] args, String key,boolean killer);
 
     
     




More information about the jboss-svn-commits mailing list