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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Jun 10 02:48:39 EDT 2009


Author: dsotty
Date: 2009-06-10 02:48:39 -0400 (Wed, 10 Jun 2009)
New Revision: 26894

Added:
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/AbstractOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianAlternativeOr.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianAnd.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianDiscounter.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianDotAnd.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianMergeStrategy.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianModusPonensOperator.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianNullHandlingStragy.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Droobservable.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/RecordHackerNode.java
Modified:
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/bayesian/BooleanDomain.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/ImperfectAgendaGroup.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImperfectFactHandle.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/ProbabilityDistributionDegree.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/BayesianDegreeFactory.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/operators/IDegreeCombiner.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/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/IntervalLukasImplicationOperator.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/SimpleDiscountOperator.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/SimpleLukasImplication.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/SimpleMaxMergeStrategy.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/SimpleMinMergeStrategy.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/evaluators/RandomEvaluator.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/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/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/ObservableRightTupleMemoryWrapper.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/OperandSet.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.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/OrConstraint.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/Pattern.java
   labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/Rule.java
Log:


Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/bayesian/BooleanDomain.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/bayesian/BooleanDomain.java	2009-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/bayesian/BooleanDomain.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -36,4 +36,14 @@
 		
 	}
 
+	
+	public boolean equals(Object object) {
+		if (object == null)
+			return false;
+		return object instanceof BooleanDomain;
+	}
+	
+	public int hashCode() {
+		return -52643423; 
+	}
 }

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -1980,6 +1980,7 @@
     				// Add new degree to evaluation
     				//TODO: 1 should be confidence!    				
     				eval.addDegree(ruleName, degree,1,killer,true);
+    				System.out.println();
     				//Notification is implicit in the record...
     			} else if (node == null) {
     				System.out.println("Warning - injected USELESS eval");

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImperfectAgendaGroup.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImperfectAgendaGroup.java	2009-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImperfectAgendaGroup.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -99,7 +99,7 @@
 		
 		store.remove(activ);
 		
-		System.out.println("Afer getting next");
+		System.out.println("\nAfer getting next");
 		System.out.println(this.getStatus());
 		System.out.println();
 		return activ;

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImperfectFactHandle.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImperfectFactHandle.java	2009-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/common/ImperfectFactHandle.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -17,7 +17,12 @@
 	}
 	
 	public void addPropertyDegree(Evaluation eval) {
-		properties.put(eval.getKey(),eval);
+		Evaluation existing = properties.get(eval.getKey());
+		if (existing == null) {
+			properties.put(eval.getKey(),eval);
+		} else {
+			existing.merge(eval);
+		}
 	}
 	
 	public void addPropertyDegrees(Collection<Evaluation> storedEvals) {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/ProbabilityDistributionDegree.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/ProbabilityDistributionDegree.java	2009-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/ProbabilityDistributionDegree.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -29,21 +29,46 @@
 		setDomain(domain);
 		setN(domain.getN());
 		setDistribution(new Matrix(getN(), 1, 1.0/getN()));
+		
+		if (getDistribution().getRowDimension() != N && getDistribution().getColumnDimension() != 1)
+			throw new RuntimeException("X-ED ");
 	}
 	
-	public ProbabilityDistributionDegree(double[] distrib, boolean check) {
+	public ProbabilityDistributionDegree(IDomain domain, Matrix distribution) {
+		setDomain(domain);
+		setN(domain.getN());
+		
+	
+		double[][] data = distribution.getArray();
+		Matrix mat = new Matrix(data);
+		normalize(mat);
+		
+		
+		setDistribution(mat);
+		
+		if (getDistribution().getRowDimension() != N && getDistribution().getColumnDimension() != 1)
+			throw new RuntimeException("X-ED 2");
+	}
+	
+	
+	
+	public ProbabilityDistributionDegree(double[] distrib) {
+		setDomain(new BooleanDomain());
 		setN(distrib.length);
 		
-		if (check) {
+		
 			double acc = 0;
 			for (int j = 0; j < getN(); j++)
 				acc += distrib[j];
-			if (acc - 1 > tHold) {
-				throw new RuntimeException("Invalid Probability Distribution");
-			}
-		}
+			if (Math.abs(acc - 1) > tHold) {
+				for (int j = 0; j < getN(); j++)
+					distrib[j] = acc == 0 ? 1.0/getN() : (distrib[j] / acc);						
+			}		
 		
-		setDistribution(new Matrix(distrib,1));
+		setDistribution(new Matrix(distrib,getN()));
+		
+		if (getDistribution().getRowDimension() != N && getDistribution().getColumnDimension() != 1)
+			throw new RuntimeException("X-ED 3");
 	}
 	
 		
@@ -99,14 +124,149 @@
 	}
 
 	public String toString() {
-		StringBuilder sb = new StringBuilder("<");
-			 for (int j = 0; j < getN(); j++) {
-				 sb.append(""+distribution.get(j,0));
+		if (distribution.getColumnDimension() == 1) {
+			StringBuilder sb = new StringBuilder("<");
+				 for (int j = 0; j < distribution.getRowDimension(); j++) {
+					 sb.append(" "+distribution.get(j,0));
+					 if (j != getN() - 1)
+						 sb.append(",");
+				 }
+			sb.append(">");
+			return sb.toString();
+		} else {
+			StringBuilder sb = new StringBuilder("[");
+			
+			 
+			for (int j = 0; j < distribution.getRowDimension(); j++) {
+				for (int k = 0; k < distribution.getColumnDimension(); k++) {
+				 sb.append(" "+distribution.get(j,k));
 				 if (j != getN() - 1)
-					 sb.append(",");
-			 }
-		sb.append(">");
+					 sb.append(" ");
+				}
+				sb.append(" ; ");
+			}
+			
+		sb.append("]");
 		return sb.toString();
+		}
 	}
+
+
+	public ProbabilityDistributionDegree copy() {
+		ProbabilityDistributionDegree ans = new ProbabilityDistributionDegree(this.domain, this.distribution.copy());
+		return ans;
+	}
+
+
+	public void arrayTimesEquals(
+			ProbabilityDistributionDegree probabilityDistributionDegree) {
+		Matrix m1 = this.distribution;
+		Matrix m2 = probabilityDistributionDegree.getDistribution();
+		Matrix ans = null;
+		
+		if (m1.getColumnDimension() == m2.getColumnDimension()
+			&& m2.getRowDimension() == m1.getRowDimension()) {
+			ans = m1.arrayTimes(m2);
+		} else if (m2.getRowDimension() == m1.getRowDimension()
+				   && m2.getColumnDimension() != m1.getColumnDimension()) {
+				
+			if (m1.getColumnDimension() < m2.getColumnDimension()) {
+				this.distribution = expand(m1,m2.getColumnDimension());
+			} else {
+				m2 = expand(m2,m1.getColumnDimension());
+			}
+			ans = this.distribution.arrayTimes(m2);
+				
+		} else if (m2.getRowDimension() != m1.getRowDimension()
+				   && m2.getColumnDimension() == m1.getColumnDimension()) {
+				
+			if (m1.getRowDimension() < m2.getRowDimension()) {
+				this.distribution = expandRow(m1,m2.getRowDimension());
+			} else {
+				m2 = expandRow(m2,m1.getRowDimension());
+			}
+			ans = this.distribution.arrayTimes(m2);
+			
+			
+		} else {
+			throw new RuntimeException("Mismatched matrix size, no way to convert");
+		}
+		
+		
+		normalize(ans);
+		setDistribution(ans);
+		
+	}
 	
+	
+	private void normalize(Matrix mat) {
+		double[][] data = mat.getArray();
+		int C = mat.getColumnDimension();
+		int R = mat.getRowDimension();
+		
+		double acc = 0;
+		for (int j = 0; j < R; j++) 
+			for (int k = 0; k < C; k++) 
+				acc += data[j][k];
+		
+		if (acc != 0 && Math.abs(acc - 1) > tHold) {
+			for (int j = 0; j < R; j++) 
+				for (int k = 0; k < C; k++) 
+					data[j][k] /= acc;
+		}
+		
+	}
+
+
+	private Matrix expand(Matrix m, int cols) {
+		// m should be 1-col
+		// need to be cols-col
+		Matrix k = new Matrix(1,cols,1.0);
+		Matrix ans = m.times(k).times(1.0/cols);
+		return ans;
+	}
+	
+	
+	private Matrix expandRow(Matrix m, int row) {
+		// m should be k-row
+		// need to be row-col
+		int numBlocks = row / m.getRowDimension();
+		double[][] core = m.getArray();
+		double[][] ans = new double[row][1];
+		
+		for (int j = 0; j < numBlocks; j++)
+			for (int k = 0; k < m.getRowDimension(); k++)
+				ans[j*m.getRowDimension()+k][0] = (1.0/numBlocks)*core[k][0];
+		
+		return new Matrix(ans);
+	}
+	
+	public int hashCode() {
+		return distribution.hashCode();
+	}
+	
+	public boolean equals(Object object) {
+		if (object == null)
+			return false;
+		else if (object == this)
+			return true;
+		else if (object instanceof ProbabilityDistributionDegree) {
+			ProbabilityDistributionDegree other = (ProbabilityDistributionDegree) object;
+			
+			Matrix m1 = this.distribution;
+			Matrix m2 = other.distribution;
+			
+			if (m1.getRowDimension() != m2.getRowDimension() || m1.getColumnDimension() != m2.getColumnDimension())
+				return false;
+			
+			for (int j = 0; j < m1.getRowDimension(); j++)
+				for (int k = 0; k < m2.getColumnDimension(); k++)
+					if (Math.abs(m1.get(j,k)-m2.get(j, k)) > tHold)
+						return false;
+			
+			return true;
+		} else
+			return false;
+	}
+	
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/BayesianDegreeFactory.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/BayesianDegreeFactory.java	2009-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/BayesianDegreeFactory.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -1,75 +1,113 @@
 package org.drools.degrees.factory;
 
+import java.util.StringTokenizer;
+
+import org.drools.bayesian.BooleanDomain;
 import org.drools.degrees.IDegree;
+import org.drools.degrees.ProbabilityDistributionDegree;
 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.bayesian.BayesianAlternativeOr;
+import org.drools.degrees.operators.bayesian.BayesianAnd;
+import org.drools.degrees.operators.bayesian.BayesianDiscounter;
+import org.drools.degrees.operators.bayesian.BayesianMergeStrategy;
+import org.drools.degrees.operators.bayesian.BayesianModusPonensOperator;
+import org.drools.degrees.operators.bayesian.BayesianNullHandlingStragy;
+
+import org.drools.reteoo.filters.AlwaysPassFilterStrategy;
 import org.drools.reteoo.filters.IFilterStrategy;
 
+import Jama.Matrix;
+
 public class BayesianDegreeFactory implements IDegreeFactory {
 	
 	boolean cwa = false;
 
-	public IDegree False() {
-		// TODO Auto-generated method stub
-		return null;
+	public IDegree False() {		
+		return new ProbabilityDistributionDegree(new double[] {1,0});
 	}
 
 	public IDegree Random() {
-		// TODO Auto-generated method stub
-		return null;
+		double r = Math.random();
+//		return new ProbabilityDistributionDegree(new double[] {r,1-r});
+		return new ProbabilityDistributionDegree(new double[] {0.3,0.7});
 	}
 
 	public IDegree True() {
-		// TODO Auto-generated method stub
-		return null;
+		return new ProbabilityDistributionDegree(new double[] {0,1});
 	}
 
 	public IDegree Unknown() {
-		// TODO Auto-generated method stub
-		return null;
+		return new ProbabilityDistributionDegree(new double[] {0.5,0.5});		
 	}
 
-	public IDegree buildDegree(float val) {
-		// TODO Auto-generated method stub
-		return null;
+	
+	
+	
+	
+	
+	
+	public IDegree buildDegree(double val) {
+		return new ProbabilityDistributionDegree(new double[] {val,1-val}); 
 	}
 
+	
+	
 	public IDegree buildDegree(String priorStr) {
-		// TODO Auto-generated method stub
-		return null;
+		String valueS = priorStr.trim();
+		valueS = valueS.substring(1,valueS.length()-1);
+		
+		StringTokenizer tok = new StringTokenizer(valueS,";");
+		int rows = tok.countTokens();
+		
+		String row = tok.nextToken();
+		StringTokenizer tokRow = new StringTokenizer(row,", ");
+		int cols = tokRow.countTokens();
+		
+		double[][] core = new double[rows][cols];
+		for (int r = 0; r < rows; r++) {
+			for (int k = 0; k < cols; k++) {
+				core[r][k] = Double.parseDouble(tokRow.nextToken()); 
+			}
+			if (r != rows-1) {
+				row = tok.nextToken();
+				tokRow = new StringTokenizer(row,", ");
+			}
+		}
+
+		return new ProbabilityDistributionDegree(new BooleanDomain(),new Matrix(core)); 
 	}
 
+	
+	
 	public IDegree fromBoolean(boolean b) {
-		// TODO Auto-generated method stub
-		return null;
+		return b ? True() : False();
 	}
 
+	
+	
 	public IDegreeCombiner getAggregator() {
 		// TODO Auto-generated method stub
 		return null;
 	}
 
 	public IDegreeCombiner getAndOperator() {
-		// TODO Auto-generated method stub
-		return null;
+		return new BayesianAnd();
 	}
 
 	public IDegreeCombiner getAndOperator(String params) {
-		// TODO Auto-generated method stub
-		return null;
+		return new BayesianAnd();
 	}
 
 	public IFilterStrategy getDefaultStrategy() {
-		// TODO Auto-generated method stub
-		return null;
+		return new AlwaysPassFilterStrategy();
 	}
 
 	public IDiscountOperator getDiscountOperator() {
-		// TODO Auto-generated method stub
-		return null;
+		return new BayesianDiscounter();
 	}
 
 	public IDegreeCombiner getDiscountOperator(String params) {
@@ -143,8 +181,7 @@
 	}
 
 	public IMergeStrategy getMergeStrategy() {
-		// TODO Auto-generated method stub
-		return null;
+		return new BayesianMergeStrategy();
 	}
 
 	public IDegreeCombiner getMinAndOperator() {
@@ -158,8 +195,7 @@
 	}
 
 	public IDegreeCombiner getModusPonensOperator(String params) {
-		// TODO Auto-generated method stub
-		return null;
+		return new BayesianModusPonensOperator();
 	}
 
 	public IDegreeCombiner getNegationOperator() {
@@ -168,18 +204,15 @@
 	}
 
 	public INullHandlingStrategy getNullHandlingStrategy() {
-		// TODO Auto-generated method stub
-		return null;
+		return new BayesianNullHandlingStragy();
 	}
 
 	public IDegreeCombiner getOrOperator() {
-		// TODO Auto-generated method stub
-		return null;
+		return new BayesianAlternativeOr();
 	}
 
 	public IDegreeCombiner getOrOperator(String params) {
-		// TODO Auto-generated method stub
-		return null;
+		return new BayesianAlternativeOr(params);
 	}
 
 	public IDegreeCombiner getXorOperator() {
@@ -192,14 +225,15 @@
 		return null;
 	}
 
-	public boolean isClosedWorldAssumption() {
-		// TODO Auto-generated method stub
+	
+	
+	public boolean isClosedWorldAssumption() {		
 		return false;
 	}
 
 	public void setClosedWorldAssumption(boolean cwa) {
-		// TODO Auto-generated method stub
-
+		// do nothing
+		this.cwa = false; 
 	}
 
 }

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/IDegreeFactory.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -17,7 +17,7 @@
 	public boolean isClosedWorldAssumption();
 	
 	
-	public IDegree buildDegree(float val);
+	public IDegree buildDegree(double val);
 	
 	
 	public IDegree True();

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/IntervalDegreeFactory.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -59,7 +59,7 @@
 		return new IntervalDegree(low,upp);
 	}
 
-	public IDegree buildDegree(float val) {
+	public IDegree buildDegree(double val) {
 		return new IntervalDegree(val,val);
 	}
 

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/factory/SimpleDegreeFactory.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -66,7 +66,7 @@
 		return new SimpleDegree((float) Math.random());
 	}
 	
-	public IDegree buildDegree(float val) {
+	public IDegree buildDegree(double val) {
 		return new SimpleDegree(val);
 	}
 
@@ -184,11 +184,11 @@
 	public IDegreeCombiner getAndOperator(String params) {
 		if (params == null)
 			return getAndOperator();
-		if (params.equals("Lukas"))
+		if (params.equals("kind:Lukas"))
 			return new SimpleLukasAnd();
-		else if (params.equals("Prod"))
+		else if (params.equals("kind:Prod"))
 			return new SimpleDotAnd();
-		else if (params.equals("Min"))
+		else if (params.equals("kind:Min"))
 			return new SimpleMinAnd();
 		else return getAndOperator();
 	}
@@ -209,11 +209,11 @@
 		if (params == null)
 			return getOrOperator();
 		
-		if (params.equals("Lukas"))
+		if (params.equals("kind:Lukas"))
 			return new SimpleLukasOr();
-		else if (params.equals("Plus"))
+		else if (params.equals("kind:Plus"))
 			return new SimpleProbSumOr();
-		else if (params.equals("Max"))
+		else if (params.equals("kind:Max"))
 			return new SimpleMaxOr();
 		else return getOrOperator();
 	}
@@ -248,13 +248,9 @@
 		if (params == null)
 			return getModusPonensOp();
 		
-		if (params.equals("implication")) {
-			return getModusPonensOp();
-		} else if (params.equals("equivalence")) {
-			return getDoubleMPOperator();			
-		} else
-			return getModusPonensOp();
+		return getAndOperator(params);
 		
+		
 	}
 
 	

Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/AbstractOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/AbstractOperator.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/AbstractOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -0,0 +1,53 @@
+package org.drools.degrees.operators;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.CompositeEvaluation;
+import org.drools.reteoo.Evaluation;
+
+public abstract class AbstractOperator implements IDegreeCombiner {
+
+	
+
+	public IDegree eval(Collection<? extends IDegree> args,
+			IDegreeFactory factory) {
+		IDegree[] argz = new IDegree[args.size()];
+		Iterator<? extends IDegree> iter = args.iterator();
+		for (int j = 0; j < args.size(); j++)
+			argz[j] = iter.next();
+		return eval(argz,factory);
+	}
+	
+
+	public IDegree eval(Evaluation evaluation, IDegreeFactory factory) {
+		IDegree[] args;
+		if (evaluation instanceof CompositeEvaluation) {
+			CompositeEvaluation combo = (CompositeEvaluation) evaluation;
+			args = null;
+			
+			if (combo.getOperands() != null) {				
+				int N = combo.getOperands().size();
+				args = new IDegree[N];
+			
+				int j = 0;
+				for (Evaluation eval : combo.getOperands()) {
+					args[j++] = eval == null ? factory.getNullHandlingStrategy().convertNull(factory) : eval.getDegree();		
+				}
+			}
+			
+		
+		} else {
+			args = new IDegree[] {evaluation.getDegree()};
+		}
+		
+		return eval(args,factory);
+	}
+
+	public boolean isTruthFunctional() {
+		return true;
+	}
+
+}

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/IDegreeCombiner.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -8,6 +8,8 @@
 
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.reteoo.CompositeEvaluation;
+import org.drools.reteoo.Evaluation;
 
 
 /**
@@ -33,4 +35,8 @@
     
     public String getName();
     
+    public boolean isTruthFunctional();
+    
+    public IDegree eval(Evaluation eval, 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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/NegationOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -5,7 +5,7 @@
 import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 
-public abstract  class NegationOperator implements IDegreeCombiner {
+public abstract  class NegationOperator extends AbstractOperator  implements IDegreeCombiner {
 	
 	
 	

Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianAlternativeOr.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianAlternativeOr.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianAlternativeOr.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -0,0 +1,224 @@
+package org.drools.degrees.operators.bayesian;
+
+import java.util.Iterator;
+import java.util.StringTokenizer;
+
+import org.drools.degrees.IDegree;
+import org.drools.degrees.ProbabilityDistributionDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
+import org.drools.reteoo.CompositeEvaluation;
+import org.drools.reteoo.EvalRecord;
+import org.drools.reteoo.Evaluation;
+
+import Jama.Matrix;
+
+public class BayesianAlternativeOr extends AbstractOperator {
+
+	private boolean isLambda = false;
+	
+	private String linkSource = null;
+	
+	private int skip = -1;
+	
+	public BayesianAlternativeOr() { 
+		
+	}
+	
+	public BayesianAlternativeOr(String params) {
+		StringTokenizer tok = new StringTokenizer(params,",");
+		while (tok.hasMoreTokens()) {			
+			String param = tok.nextToken();
+			if (param.startsWith("args:")) {
+				
+				param = param.substring(5);
+				if (param.startsWith("lambda"))
+					setLambda(true);
+				
+				if (param.startsWith("lambda") || param.startsWith("pi")) {
+					setLinkSource(revert(param));;
+				}
+				
+				int ix = param.lastIndexOf('_');
+				if (isLambda() && ix >= 0)
+					setSkip(Integer.parseInt(param.substring(ix+1).trim()));
+			}
+			
+			
+		}
+	}
+
+
+
+
+
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
+		if (args.length == 0)
+			return factory.Unknown();
+		
+		int n = args.length;
+		int N = (int) Math.pow(2,args.length);
+		int M = getSkip() >= 0 ? 2 : 1;
+		double[][] core = new double[N/M][M];
+	
+		
+		for (int j = 0; j < N; j++) {
+			double x = 1;
+			
+			for (int k = 0; k < n; k++) {
+				int pow = (int) Math.pow(2,k);
+				int bit = (j & pow) > 0 ? 1 : 0;
+				
+				x *= ((ProbabilityDistributionDegree) args[k]).getDistribution().get(bit,0);
+			}
+			
+			core[j][0] = x;
+		}
+		
+		System.out.println();
+		
+		
+		return new ProbabilityDistributionDegree(((ProbabilityDistributionDegree) args[0]).getDomain(),new Matrix(core));
+	}
+
+	
+	
+	
+	
+	public IDegree eval(Evaluation evaluation, IDegreeFactory factory) {
+		CompositeEvaluation combo = (CompositeEvaluation) evaluation;
+		
+		IDegree[] args = new IDegree[combo.getOperands().size()];
+		// Need to clean the operands from the lambda inv contribution
+		
+		Iterator<Evaluation> iter = combo.getOperands().iterator();
+			int j = 0;
+			while (iter.hasNext()) {
+				
+				Evaluation operand = iter.next();
+				
+				Evaluation sub = lookForBit(operand,getLinkSource());
+				if (sub != null) {
+					operand = sub;
+				
+				
+					IDegree[] bits = new IDegree[operand.getDegreeBitSources().size()-1];
+					int k = 0;
+					for (String source : operand.getDegreeBitSources()) {
+						if (! matches(source,(getLinkSource())))
+							bits[k++] = operand.getDegreeBit(source);
+					}
+					ProbabilityDistributionDegree msg = (ProbabilityDistributionDegree) factory.getMergeStrategy().eval(bits, factory);
+					
+					args[j++] = msg;
+					
+				} else {
+					
+					args[j++] = operand.getDegree();
+				}
+//				ProbabilityDistributionDegree msg = (ProbabilityDistributionDegree) factory.getMergeStrategy().eval(args, factory);
+				
+				//ProbabilityDistributionDegree distr = (ProbabilityDistributionDegree) operand.getDegree(); 
+				//Matrix belief = distr.getDistribution();
+//				
+//				Evaluation combo = (ruleId.indexOf("->") > -1) ? lookForBit(premise,target) : null;
+//					if (combo != null) {
+//						exclude = true;
+//						premise = combo;
+//						
+//						IDegree[] args = new IDegree[premise.getDegreeBitSources().size()-1];
+//						int j = 0;
+//						for (String source : premise.getDegreeBitSources()) {
+//							if (! source.equals(target))
+//								args[j++] = premise.getDegreeBit(source);
+//						}
+//						
+//						ProbabilityDistributionDegree msg = (ProbabilityDistributionDegree) factory.getMergeStrategy().eval(args, factory);
+//						belief = msg.getDistribution();
+//					
+//					}
+				
+				
+			}
+				
+				
+					
+		return eval(args,factory);
+	}
+	
+
+	
+	private Evaluation lookForBit(Evaluation operand, String key) {
+		for (String bit : operand.getDegreeBitSources())
+			if (matches(bit,key))
+				return operand;
+		if (operand instanceof CompositeEvaluation) {
+			CompositeEvaluation combo = (CompositeEvaluation) operand;
+			for (Evaluation eval : combo.getOperands()) {
+				Evaluation ans = lookForBit(eval,key);
+				if (ans != null) 
+					return ans;
+			}				
+		}
+		return null;
+	}
+
+	private boolean matches(String bit, String key) {
+		int ix1 = bit.lastIndexOf('_');
+		int ix2 = key.lastIndexOf('_');
+		
+		String test1 = (ix1 >= 0 && bit.startsWith("lambda")) ? bit.substring(0,ix1) : bit;
+		String test2 = (ix2 >= 0 && key.startsWith("lambda")) ? key.substring(0,ix2) : key;
+		return (test1.equals(test2)); 					
+	}
+
+	private String revert(String ruleId) {
+		int idx = ruleId.indexOf(':');
+		String type = ruleId.substring(0,idx);
+		
+		String rule = ruleId.substring(idx+1);
+			int idx2 = rule.lastIndexOf('_');
+			if (type.equals("lambda") && idx2 >= 0)
+				rule = rule.substring(0,idx2);
+		
+		String ntype = type.equals("lambda") ? "pi" : "lambda"; 
+		
+		return ntype + ":" + rule; 
+		 
+	}
+
+
+	public boolean isTruthFunctional() {
+		return false;
+	}
+	
+	
+	public String getName() {
+		return "B_vel";
+	}
+
+	public void setLinkSource(String linkSource) {
+		this.linkSource = linkSource;
+	}
+
+	public String getLinkSource() {
+		return linkSource;
+	}
+
+	public void setLambda(boolean isLambda) {
+		this.isLambda = isLambda;
+	}
+
+	public boolean isLambda() {
+		return isLambda;
+	}
+
+	public void setSkip(int skip) {
+		this.skip = skip;
+	}
+
+	public int getSkip() {
+		return skip;
+	}
+
+}

Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianAnd.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianAnd.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianAnd.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -0,0 +1,59 @@
+package org.drools.degrees.operators.bayesian;
+
+import java.lang.reflect.Array;
+import java.util.Collection;
+import java.util.Iterator;
+
+
+import org.drools.degrees.IDegree;
+import org.drools.degrees.ProbabilityDistributionDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
+import org.drools.degrees.operators.IDegreeCombiner;
+import org.drools.util.ArrayUtils;
+
+import Jama.Matrix;
+
+public class BayesianAnd extends AbstractOperator implements IDegreeCombiner {
+
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
+		if (args.length == 0)
+			return factory.Unknown();
+	
+				
+		ProbabilityDistributionDegree p0 = (ProbabilityDistributionDegree) args[0]; 
+		double[][] core = p0.getDistribution().getArrayCopy();
+		
+		for (int j = 1 ; j < args.length; j++) {
+			double[][] more = ((ProbabilityDistributionDegree) args[j]).getDistribution().getArray();
+			core[1][0] = core[1][0]*more[1][0];
+			core[0][0] = 1-core[1][0];
+		}
+		
+		return new ProbabilityDistributionDegree(p0.getDomain(),new Matrix(core));
+	
+	}
+
+	public IDegree eval(Collection<? extends IDegree> args,
+			IDegreeFactory factory) {
+		if (args.size() == 0)
+			return factory.Unknown();
+		
+		Iterator<? extends IDegree> iter = args.iterator();
+		ProbabilityDistributionDegree p0 = (ProbabilityDistributionDegree) iter.next(); 
+		double[][] core = p0.getDistribution().getArrayCopy();
+		
+		while (iter.hasNext()) {			
+				double[][] more = ((ProbabilityDistributionDegree) iter.next()).getDistribution().getArray();
+				core[1][0] = core[1][0]*more[1][0];
+				core[0][0] = 1-core[1][0];
+			}
+			
+		return new ProbabilityDistributionDegree(p0.getDomain(),new Matrix(core));		
+	}
+
+	public String getName() {
+		return "B_and";
+	}
+
+}

Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianDiscounter.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianDiscounter.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianDiscounter.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -0,0 +1,39 @@
+package org.drools.degrees.operators.bayesian;
+
+import java.util.Collection;
+
+import org.drools.degrees.IDegree;
+import org.drools.degrees.ProbabilityDistributionDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
+import org.drools.degrees.operators.IDiscountOperator;
+
+import Jama.Matrix;
+
+public class BayesianDiscounter extends AbstractOperator  implements IDiscountOperator {
+
+	public IDegree discount(IDegree arg, double strength) {
+		ProbabilityDistributionDegree p = (ProbabilityDistributionDegree) arg;
+		Matrix m = p.getDistribution();
+		int N = m.getRowDimension();
+		double[] distr = new double[N];
+			for (int j = 0; j < N; j++)
+				distr[j] = m.get(j,1)*strength + (1.0-strength)/N;
+		Matrix discountedDistr = new Matrix(distr,1);
+		return new ProbabilityDistributionDegree(p.getDomain(),discountedDistr);
+	}
+
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
+		return args[0];
+	}
+
+	public IDegree eval(Collection<? extends IDegree> args,
+			IDegreeFactory factory) {
+		return args.iterator().next();
+	}
+
+	public String getName() {
+		return "B_disc";
+	}
+
+}

Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianDotAnd.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianDotAnd.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianDotAnd.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -0,0 +1,62 @@
+package org.drools.degrees.operators.bayesian;
+
+import java.lang.reflect.Array;
+import java.util.Collection;
+import java.util.Iterator;
+
+
+import org.drools.degrees.IDegree;
+import org.drools.degrees.ProbabilityDistributionDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
+import org.drools.degrees.operators.IDegreeCombiner;
+import org.drools.util.ArrayUtils;
+
+import Jama.Matrix;
+
+public class BayesianDotAnd extends AbstractOperator  implements IDegreeCombiner {
+
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
+		if (args.length == 0)
+			return factory.Unknown();
+	
+				
+		ProbabilityDistributionDegree p0 = ((ProbabilityDistributionDegree) args[0]).copy(); 
+		//Matrix core = p0.getDistribution().copy();
+		
+		
+		for (int j = 1 ; j < args.length; j++) {
+			//Matrix more = ((ProbabilityDistributionDegree) args[j]).getDistribution();
+			//core.arrayTimesEquals(more);
+			p0.arrayTimesEquals(((ProbabilityDistributionDegree) args[j]));
+		}
+		
+		//return new ProbabilityDistributionDegree(p0.getDomain(),core);
+		return p0;
+	}
+
+	public IDegree eval(Collection<? extends IDegree> args,
+			IDegreeFactory factory) {
+		if (args.size() == 0)
+			return factory.Unknown();
+		
+		Iterator<? extends IDegree> iter = args.iterator();
+		ProbabilityDistributionDegree p0 = ((ProbabilityDistributionDegree) iter.next()).copy(); 
+		//Matrix core = p0.getDistribution().copy();
+		
+		
+		while (iter.hasNext()) {
+			//Matrix more = ((ProbabilityDistributionDegree) args[j]).getDistribution();
+			//core.arrayTimesEquals(more);
+			p0.arrayTimesEquals(((ProbabilityDistributionDegree) iter.next()));
+		}
+		
+		//return new ProbabilityDistributionDegree(p0.getDomain(),core);
+		return p0;
+	}
+
+	public String getName() {
+		return "B_.*";
+	}
+
+}

Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianMergeStrategy.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianMergeStrategy.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianMergeStrategy.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -0,0 +1,57 @@
+package org.drools.degrees.operators.bayesian;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.drools.degrees.IDegree;
+import org.drools.degrees.ProbabilityDistributionDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
+import org.drools.degrees.operators.IDiscountStrategy;
+import org.drools.degrees.operators.IMergeStrategy;
+import org.drools.degrees.operators.INullHandlingStrategy;
+import org.drools.degrees.operators.intervals.IntervalIntersectionOperator;
+
+import Jama.Matrix;
+
+public class BayesianMergeStrategy extends AbstractOperator  implements IMergeStrategy {
+	
+	private BayesianDotAnd op = new BayesianDotAnd();
+
+
+	public IDegree eval(IDegree[] degrees, boolean[] killerFlags,
+			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(factory);							
+		}
+		
+		if (killerFlags != null) {
+			IDiscountStrategy discountStrat = factory.getDiscountStrategy();
+			return op.eval(discountStrat.discount(args, killerFlags,factory), factory);
+		} else {
+			return op.eval(args, factory);
+		}
+					
+	}
+
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
+		return eval(args, null, factory.getNullHandlingStrategy(),factory);
+	}
+
+	public IDegree eval(Collection<? extends IDegree> args,
+			IDegreeFactory factory) {
+		Iterator<? extends IDegree> iter = args.iterator();
+		IDegree[] argArray = new IDegree[args.size()];
+			for (int j = 0; j < argArray.length; j++)
+				argArray[j] = iter.next();
+		return eval(argArray, null, factory.getNullHandlingStrategy(),factory);
+	}
+
+	public String getName() {
+		return "B_merge";
+	}
+
+}

Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianModusPonensOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianModusPonensOperator.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianModusPonensOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -0,0 +1,168 @@
+package org.drools.degrees.operators.bayesian;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.drools.degrees.IDegree;
+import org.drools.degrees.ProbabilityDistributionDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
+import org.drools.degrees.operators.IDegreeCombiner;
+import org.drools.reteoo.CompositeEvaluation;
+import org.drools.reteoo.EvalRecord;
+import org.drools.reteoo.Evaluation;
+
+import Jama.Matrix;
+
+public class BayesianModusPonensOperator extends AbstractOperator  implements IDegreeCombiner {
+
+	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
+//		if (args.length < 2)
+//			return factory.Unknown();
+//		
+//		ProbabilityDistributionDegree prem = (ProbabilityDistributionDegree) args[0];
+//		ProbabilityDistributionDegree impl = (ProbabilityDistributionDegree) args[1];
+//		
+//		Matrix conclDistr = impl.getDistribution().times(prem.getDistribution());
+//		
+//		return new ProbabilityDistributionDegree(impl.getDomain(),conclDistr);
+		throw new UnsupportedOperationException("Should not be here...., Bayes MP is not t-functional");
+	}
+
+	
+	
+	
+	
+	
+	public IDegree eval(Evaluation evaluation, IDegreeFactory factory) {
+		boolean exclude = false;
+		
+				
+		EvalRecord record = (EvalRecord) evaluation;
+		if (record.getOperands().size() < 2)
+			return factory.Unknown();
+		
+		Iterator<Evaluation> iter = record.getOperands().iterator();
+		
+		String ruleId = record.getRuleId();
+//		
+//		
+//		
+//			String target = revertLinkId(ruleId);
+//			
+		Evaluation premise = iter.next();
+		ProbabilityDistributionDegree premDistr = (ProbabilityDistributionDegree) premise.getDegree(); 
+		Matrix belief = premDistr.getDistribution();
+//		
+//		Evaluation combo = (ruleId.indexOf("->") > -1) ? lookForBit(premise,target) : null;
+//			if (combo != null) {
+//				exclude = true;
+//				premise = combo;
+//				
+//				IDegree[] args = new IDegree[premise.getDegreeBitSources().size()-1];
+//				int j = 0;
+//				for (String source : premise.getDegreeBitSources()) {
+//					if (! source.equals(target))
+//						args[j++] = premise.getDegreeBit(source);
+//				}
+//				
+//				ProbabilityDistributionDegree msg = (ProbabilityDistributionDegree) factory.getMergeStrategy().eval(args, factory);
+//				belief = msg.getDistribution();
+//			
+//			}
+//					
+		
+		ProbabilityDistributionDegree condTable = (ProbabilityDistributionDegree) iter.next().getDegree();
+		
+		Matrix conclDistr = null;
+		if (isLambda(ruleId)) {
+			conclDistr = (belief.transpose().times(condTable.getDistribution())).transpose();
+		} else {
+			conclDistr = condTable.getDistribution().times(belief);
+		}
+		
+		return new ProbabilityDistributionDegree(premDistr.getDomain(), conclDistr );
+	}
+	
+	
+	
+	
+	/*
+	public IDegree eval(Evaluation evaluation, IDegreeFactory factory) {
+		boolean exclude = false;
+		
+				
+		EvalRecord record = (EvalRecord) evaluation;
+		if (record.getOperands().size() < 2)
+			return factory.Unknown();
+		
+		Iterator<Evaluation> iter = record.getOperands().iterator();
+		
+		String ruleId = record.getRuleId();
+		
+		
+		
+			String target = revertLinkId(ruleId);
+			
+		Evaluation premise = iter.next();
+		ProbabilityDistributionDegree premDistr = (ProbabilityDistributionDegree) premise.getDegree(); 
+		Matrix belief = premDistr.getDistribution();
+		
+		Evaluation combo = (ruleId.indexOf("->") > -1) ? lookForBit(premise,target) : null;
+			if (combo != null) {
+				exclude = true;
+				premise = combo;
+				
+				IDegree[] args = new IDegree[premise.getDegreeBitSources().size()-1];
+				int j = 0;
+				for (String source : premise.getDegreeBitSources()) {
+					if (! source.equals(target))
+						args[j++] = premise.getDegreeBit(source);
+				}
+				
+				ProbabilityDistributionDegree msg = (ProbabilityDistributionDegree) factory.getMergeStrategy().eval(args, factory);
+				belief = msg.getDistribution();
+			
+			}
+					
+		
+		ProbabilityDistributionDegree condTable = (ProbabilityDistributionDegree) iter.next().getDegree();
+		
+		Matrix conclDistr = null;
+		if (isLambda(ruleId)) {
+			conclDistr = (belief.transpose().times(condTable.getDistribution())).transpose();
+		} else {
+			conclDistr = condTable.getDistribution().times(belief);
+		}
+		
+		return new ProbabilityDistributionDegree(premDistr.getDomain(), conclDistr );
+	}
+	
+	*/
+	
+	
+//	private String revertLinkId(String ruleId) {
+//		if (isLambda(ruleId))
+//			return ruleId.substring(4);
+//		else 
+//			return "Inv:"+ruleId;
+//	}
+	
+	private boolean isLambda(String ruleId) {
+		return ruleId.startsWith("lambda");
+	}
+
+
+
+
+
+	public boolean isTruthFunctional() {
+		return false;
+	}
+
+	public String getName() {
+		return "B_m|p";
+	}
+
+		
+}

Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianNullHandlingStragy.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianNullHandlingStragy.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/bayesian/BayesianNullHandlingStragy.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -0,0 +1,13 @@
+package org.drools.degrees.operators.bayesian;
+
+import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.operators.INullHandlingStrategy;
+
+public class BayesianNullHandlingStragy implements INullHandlingStrategy {
+
+	public IDegree convertNull(IDegreeFactory factory) {
+		return factory.Unknown();
+	}
+
+}

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/DefaultIntervalMergeStrategy.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,12 +6,13 @@
 import org.drools.degrees.IDegree;
 import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 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 {
+public class DefaultIntervalMergeStrategy extends AbstractOperator  implements IMergeStrategy {
 	
 	private IntervalIntersectionOperator op = new IntervalIntersectionOperator();
 

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalDiscountOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -9,10 +9,11 @@
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 import org.drools.degrees.operators.IDiscountOperator;
 
-public class IntervalDiscountOperator implements IDiscountOperator {
+public class IntervalDiscountOperator extends AbstractOperator  implements IDiscountOperator {
 
 	
 	public IDegree discount(IDegree arg, double strength) {

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalDoubleMPOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -9,10 +9,11 @@
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 import org.drools.time.Interval;
 
-public class IntervalDoubleMPOperator implements IDegreeCombiner {
+public class IntervalDoubleMPOperator extends AbstractOperator  implements IDegreeCombiner {
 
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length < 2)

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalEquivOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -7,9 +7,10 @@
 import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
-public class IntervalEquivOperator implements IDegreeCombiner {
+public class IntervalEquivOperator extends AbstractOperator  implements IDegreeCombiner {
 
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length < 2)

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalExistsOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,9 +6,10 @@
 import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
-public class IntervalExistsOperator implements IDegreeCombiner {
+public class IntervalExistsOperator extends AbstractOperator  implements IDegreeCombiner {
 
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length == 0)

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalForAnyOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,9 +6,10 @@
 import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
-public class IntervalForAnyOperator implements IDegreeCombiner {
+public class IntervalForAnyOperator extends AbstractOperator  implements IDegreeCombiner {
 
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {		
 		if (args == null || args.length == 0)

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalForallOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,9 +6,10 @@
 import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
-public class IntervalForallOperator implements IDegreeCombiner {
+public class IntervalForallOperator extends AbstractOperator  implements IDegreeCombiner {
 
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length == 0)

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalIntersectionOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,9 +6,10 @@
 import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
-public class IntervalIntersectionOperator implements IDegreeCombiner {
+public class IntervalIntersectionOperator extends AbstractOperator  implements IDegreeCombiner {
 
 	
 	

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalLukasAndOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,9 +6,10 @@
 import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
-public class IntervalLukasAndOperator implements IDegreeCombiner {
+public class IntervalLukasAndOperator extends AbstractOperator  implements IDegreeCombiner {
 
 	
 	

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalLukasImplicationOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalLukasImplicationOperator.java	2009-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalLukasImplicationOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -7,9 +7,10 @@
 import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
-public class IntervalLukasImplicationOperator implements IDegreeCombiner {
+public class IntervalLukasImplicationOperator extends AbstractOperator  implements IDegreeCombiner {
 
 	
 	

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalLukasOrOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,9 +6,10 @@
 import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
-public class IntervalLukasOrOperator implements IDegreeCombiner {
+public class IntervalLukasOrOperator extends AbstractOperator  implements IDegreeCombiner {
 
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {		
 		if (args == null || args.length == 0)

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalMaxOrOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,9 +6,10 @@
 import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
-public class IntervalMaxOrOperator implements IDegreeCombiner {
+public class IntervalMaxOrOperator extends AbstractOperator  implements IDegreeCombiner {
 
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length == 0)

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalMinAndOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,9 +6,10 @@
 import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
-public class IntervalMinAndOperator implements IDegreeCombiner {
+public class IntervalMinAndOperator extends AbstractOperator  implements IDegreeCombiner {
 
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length == 0)

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalModusPonensOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -7,9 +7,10 @@
 import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
-public class IntervalModusPonensOperator implements IDegreeCombiner {
+public class IntervalModusPonensOperator extends AbstractOperator  implements IDegreeCombiner {
 
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length < 2)

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalNegationOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -5,6 +5,7 @@
 import org.drools.degrees.IDegree;
 import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.factory.IntervalDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 import org.drools.degrees.operators.NegationOperator;
 

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/intervals/IntervalXorOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -7,9 +7,10 @@
 import org.drools.degrees.IntervalDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
-public class IntervalXorOperator implements IDegreeCombiner {
+public class IntervalXorOperator extends AbstractOperator  implements IDegreeCombiner {
 
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length < 2)

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleAverage.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,9 +6,10 @@
 import org.drools.degrees.SimpleDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
-public final class SimpleAverage implements IDegreeCombiner {
+public final class SimpleAverage extends AbstractOperator  implements IDegreeCombiner {
 
 
 		

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleDiscountOperator.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleDiscountOperator.java	2009-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleDiscountOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,9 +6,10 @@
 import org.drools.degrees.IDegree;
 import org.drools.degrees.SimpleDegree;
 import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDiscountOperator;
 
-public class SimpleDiscountOperator implements IDiscountOperator {
+public class SimpleDiscountOperator extends AbstractOperator  implements IDiscountOperator {
 
 		
 	private SimpleDegree unk;

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleDotAnd.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,10 +6,11 @@
 import org.drools.degrees.SimpleDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 
-public class SimpleDotAnd implements IDegreeCombiner {
+public class SimpleDotAnd extends AbstractOperator  implements IDegreeCombiner {
 
 	
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleDoubleMPOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -7,9 +7,10 @@
 import org.drools.degrees.SimpleDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
-public class SimpleDoubleMPOperator implements IDegreeCombiner {
+public class SimpleDoubleMPOperator extends AbstractOperator  implements IDegreeCombiner {
 
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {
 		if (args == null || args.length < 2)

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleEquiv.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -9,9 +9,10 @@
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.IntervalDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
-public class SimpleEquiv implements IDegreeCombiner {
+public class SimpleEquiv extends AbstractOperator  implements IDegreeCombiner {
 
 	
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {	

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleIdentityOperator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,9 +6,10 @@
 import org.drools.degrees.SimpleDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
-public final class SimpleIdentityOperator implements IDegreeCombiner {
+public final class SimpleIdentityOperator extends AbstractOperator  implements IDegreeCombiner {
 
 
 		

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleLukasAnd.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,10 +6,11 @@
 import org.drools.degrees.SimpleDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 
-public class SimpleLukasAnd implements IDegreeCombiner {
+public class SimpleLukasAnd extends AbstractOperator  implements IDegreeCombiner {
 
 	
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleLukasImplication.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleLukasImplication.java	2009-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleLukasImplication.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -7,10 +7,11 @@
 import org.drools.degrees.SimpleDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 
-public class SimpleLukasImplication implements IDegreeCombiner {
+public class SimpleLukasImplication extends AbstractOperator  implements IDegreeCombiner {
 
 	
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleLukasOr.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,10 +6,11 @@
 import org.drools.degrees.SimpleDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 
-public class SimpleLukasOr implements IDegreeCombiner {
+public class SimpleLukasOr extends AbstractOperator  implements IDegreeCombiner {
 
 	
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMaxMergeStrategy.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMaxMergeStrategy.java	2009-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMaxMergeStrategy.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,11 +6,12 @@
 import org.drools.degrees.SimpleDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDiscountStrategy;
 import org.drools.degrees.operators.IMergeStrategy;
 import org.drools.degrees.operators.INullHandlingStrategy;
 
-public class SimpleMaxMergeStrategy implements IMergeStrategy {
+public class SimpleMaxMergeStrategy extends AbstractOperator  implements IMergeStrategy {
 
 	public IDegree eval(IDegree[] degrees, boolean[] kFlags, INullHandlingStrategy nullStrat, IDegreeFactory factory) {
 		IDegree[] args = new IDegree[degrees.length];

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMaxOr.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,10 +6,11 @@
 import org.drools.degrees.SimpleDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 
-public class SimpleMaxOr implements IDegreeCombiner {
+public class SimpleMaxOr extends AbstractOperator  implements IDegreeCombiner {
 
 	
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMinAnd.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,9 +6,10 @@
 import org.drools.degrees.SimpleDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
-public class SimpleMinAnd implements IDegreeCombiner {
+public class SimpleMinAnd extends AbstractOperator  implements IDegreeCombiner {
 
 	
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMinMergeStrategy.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMinMergeStrategy.java	2009-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleMinMergeStrategy.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,11 +6,13 @@
 import org.drools.degrees.SimpleDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDiscountStrategy;
 import org.drools.degrees.operators.IMergeStrategy;
 import org.drools.degrees.operators.INullHandlingStrategy;
 
-public class SimpleMinMergeStrategy implements IMergeStrategy {
+public class SimpleMinMergeStrategy extends AbstractOperator 
+implements IMergeStrategy {
 
 	public IDegree eval(IDegree[] degrees, boolean[] kFlags, INullHandlingStrategy nullStrat, IDegreeFactory factory) {
 		IDegree[] args = new IDegree[degrees.length];

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleProbSumOr.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,10 +6,11 @@
 import org.drools.degrees.SimpleDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 
-public class SimpleProbSumOr implements IDegreeCombiner {
+public class SimpleProbSumOr extends AbstractOperator  implements IDegreeCombiner {
 
 	
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleVeryModifier.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -6,10 +6,11 @@
 import org.drools.degrees.SimpleDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
 
-public class SimpleVeryModifier implements IDegreeCombiner {
+public class SimpleVeryModifier  extends AbstractOperator  implements IDegreeCombiner {
 
 	
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/degrees/operators/simple/SimpleXor.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -7,9 +7,10 @@
 import org.drools.degrees.SimpleDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.degrees.factory.SimpleDegreeFactory;
+import org.drools.degrees.operators.AbstractOperator;
 import org.drools.degrees.operators.IDegreeCombiner;
 
-public class SimpleXor implements IDegreeCombiner {
+public class SimpleXor  extends AbstractOperator  implements IDegreeCombiner {
 
 	
 	public IDegree eval(IDegree[] args, IDegreeFactory factory) {	

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/fuzzy/evaluators/RandomEvaluator.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -24,7 +24,8 @@
 
 	@Override
 	public IDegree eval(Object left, Object right, IDegreeFactory factory) {
-		return factory.buildDegree((float) Math.random());
+		//return factory.buildDegree((float) Math.random());
+		return factory.Random();
 	}
 	
 	

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/AlphaNode.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -312,7 +312,7 @@
 		
 		case PASS :
 			//go on
-			record.deleteObserver(this);
+			record.deleteObserver(this);					
 			//throw new RuntimeException("Awakened objeect");
 			//TODO
 			this.sink.propagateAssertObject(record.getFactHandle(),

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/CompositeEvaluation.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -90,24 +90,34 @@
 	protected boolean combine() {
 		
 		
-		IDegree[] args = null;
+		IDegree opDeg = null;
+		if (operator.isTruthFunctional()) {
+			IDegree[] args = null;
+			
+			if (getOperands() != null) {				
+				int N = getOperands().size();
+				args = new IDegree[N];
+			
+				int j = 0;
+				for (Evaluation eval : getOperands()) {
+					args[j++] = eval == null ? this.getNullHandlingStrat().convertNull(getFactory()) : eval.getDegree();		
+				}
+			}		
+			opDeg = this.operator.eval(args,getFactory());
+		} else {
+			opDeg = this.operator.eval(this,getFactory());
+		}
 		
-		if (getOperands() != null) {				
-			int N = getOperands().size();
-			args = new IDegree[N];
 		
-			int j = 0;
-			for (Evaluation eval : getOperands()) {
-				args[j++] = eval == null ? this.getNullHandlingStrat().convertNull(getFactory()) : eval.getDegree();		
-			}
-		}		
 		
-		
-		
-		IDegree opDeg = this.operator.eval(args,getFactory());
 		updateOpRate();
 		boolean newContrib = this.addDegree(Evaluation.EVAL, opDeg, getOpRate(),true);
 						
+//		if (this instanceof EvalRecord && ! this.getOperator().isTruthFunctional() && ((EvalRecord)this).getRuleId() != null) {
+//			String ruleId = ((EvalRecord)this).getRuleId();
+//			if (ruleId.equals("Bay1"))
+//				System.out.println();
+//		}
 		return newContrib;
 		
 	}

Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Droobservable.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Droobservable.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Droobservable.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -0,0 +1,54 @@
+package org.drools.reteoo;
+
+import java.util.HashSet;
+import java.util.Observable;
+import java.util.Observer;
+import java.util.Vector;
+
+
+public class Droobservable extends Observable {
+	
+	private boolean changd;
+	
+	private Vector<Observer> observers = new Vector<Observer>();
+	
+	public void deleteObserver(Observer o) {
+		if (o == null)
+			return;
+		for (int j = 0; j < observers.size(); j++)
+			if (observers.get(j) == o) {
+				observers.remove(j);
+				return;
+			}
+	}
+	
+	public void deleteObservers() {
+		this.observers.clear();
+	}
+	
+	public void addObserver(Observer o) {
+		this.observers.add(o);
+	}
+	
+	public int countObservers() {
+		return observers.size();
+	}
+
+	public void notifyObservers(Object arg) {
+		if (isChanged()) {
+			this.changd = false;
+			for (Observer o : observers)
+				o.update(this, arg);
+				
+		}
+	}
+
+	public void setChanged() {
+		this.changd = true;
+	}
+
+	public boolean isChanged() {
+		return changd;
+	}
+	
+}

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/EvalRecord.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -46,6 +46,7 @@
 	private ImperfectRightTuple					rightTuple;
     private PropagationContext					propagationContext;
     private InternalWorkingMemory 				workingMemory;
+    private String								ruleId;
     //private IDegreeFactory						factory;
     
 	
@@ -141,6 +142,8 @@
 			
 		}
 		
+			
+		
 			addedEval.deleteObserver(this);
 			addedEval.addObserver(this);
 		
@@ -186,8 +189,14 @@
 	public EvalRecord clone() {
 		
 		EvalRecord ans = new EvalRecord(this.getNodeId(),this.getOperator(),this.getMergeStrat(),this.getNullHandlingStrat(), this.getFactory(), (ArgList) this.getArgs().clone());
+		
+
+		ans.merge(this);
+		
 		ans.addEvaluations(this);
 		
+		
+		
 		return ans;
 	}
 	
@@ -379,6 +388,19 @@
 	}
 
 	
+	public void setOperator(IDegreeCombiner newOp) {
+		super.setOperator(newOp);
+		
+		((DynamicConstraintKey) this.getKey()).replaceOp(newOp.getName());
+	}
+
+	public void setRuleId(String ruleId) {
+		this.ruleId = ruleId;
+	}
+
+	public String getRuleId() {
+		return ruleId;
+	}
 	
 	
 	

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/Evaluation.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -16,7 +16,7 @@
 import org.drools.degrees.operators.INullHandlingStrategy;
 
 
-public class Evaluation extends Observable {
+public class Evaluation extends Droobservable {
 
 	
 	public static final String EVAL = "EVAL";
@@ -29,7 +29,7 @@
 	
 	private Map<String,IDegree> degrees;
 	private int totDegrees;
-	private Map<String,Float> confidence;
+	private Map<String,Double> confidence;
 	private Map<String,Boolean> killer;
 	
 	private IDegree aggDegree;
@@ -53,14 +53,14 @@
 			deps = Collections.emptySet();
 		this.nodeId = id;
 		this.degrees = new HashMap<String,IDegree>();
-		this.confidence = new HashMap<String,Float>();
+		this.confidence = new HashMap<String,Double>();
 		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));
+				confidence.put(s,new Double(0));
 				killer.put(s,false);
 			}
 			totDegrees = 2+deps.size();			
@@ -111,7 +111,7 @@
 		this.addDegrees(other.degrees, other.confidence, other.killer);
 	}
 
-	private void addDegrees(Map<String, IDegree> moreDegrees, Map<String, Float> conf, Map<String, Boolean> killer) {
+	private void addDegrees(Map<String, IDegree> moreDegrees, Map<String, Double> conf, Map<String, Boolean> killer) {
 		boolean newContrib = false;
 		
 		for (String source : moreDegrees.keySet()) {
@@ -152,14 +152,14 @@
 	
 	}
 	
-	public boolean addDegree(String source, IDegree evalDeg, float wgt, boolean immediateUpdate) {
+	public boolean addDegree(String source, IDegree evalDeg, double wgt, boolean immediateUpdate) {
 		return addDegree(source, evalDeg, wgt, false, immediateUpdate);
 	}
 		
-	public boolean addDegree(String source, IDegree evalDeg, float wgt, boolean isKiller, boolean immediateUpdate) {
+	public boolean addDegree(String source, IDegree evalDeg, double wgt, boolean isKiller, boolean immediateUpdate) {
 		boolean newContrib = false;
 		boolean rateIncr = false;
-		Float prevConf;
+		Double prevConf;
 		
 		if (evalDeg == null) {
 			/*
@@ -172,7 +172,7 @@
 			prevConf = confidence.get(source);
 			System.out.println(prevConf);
 				confidence.put(source, wgt);
-			rateIncr = prevConf == null ? true : prevConf.floatValue() < wgt;
+			rateIncr = prevConf == null ? true : prevConf.doubleValue() < wgt;
 			
 						
 			IDegree oldVal = getDegreeBit(source);
@@ -224,8 +224,8 @@
 		
 	}
 	
-	protected void setInfoRate(String source, float delta) {
-		confidence.put(source,new Float(delta));
+	protected void setInfoRate(String source, double delta) {
+		confidence.put(source,new Double(delta));
 	}
 	
 	
@@ -259,6 +259,11 @@
 		return degrees.get(source);
 	}
 	
+	public Collection<String> getDegreeBitSources() {
+		return this.degrees.keySet();
+	}
+	
+	
 	protected IDegree mergeDegrees() {
 		IDegree[] bits = new IDegree[this.totDegrees];
 		boolean[] killerFlags = new boolean[this.totDegrees];
@@ -284,7 +289,7 @@
 	
 	
 	public String toString() {
-		return "("+this.args.hashCode()+"@"+this.nodeId + ") : " + this.aggDegree  + " " + this.key +" "+ this.getBitS();
+		return "("+this.args.hashCode()+"@"+this.nodeId + ") : " + this.aggDegree +"/"+ this.getInfoRate() + " " + this.key +" "+ this.getBitS();
 	}
 	
 	public String expand() {
@@ -340,9 +345,9 @@
 	/**
 	 * @return the infoRate
 	 */
-	public float getInfoRate() {
+	public double getInfoRate() {
 		//Prior injection can't be controlled!
-		float info = 0;
+		double info = 0;
 		for (String s : confidence.keySet())
 			info += confidence.get(s);
 		
@@ -357,6 +362,8 @@
 		for (String s : degrees.keySet()) {
 			if (degrees.get(s) != null)
 				sb.append(s+" " + this.degrees.get(s) +",");
+			else
+				sb.append(s+" " + "o" + ",");
 		}
 		return sb.append("]").toString();
 	}

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ModusPonensNode.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -4,6 +4,7 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.util.Collection;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Observable;
 
@@ -63,9 +64,20 @@
 		} catch (Exception e) {
 			throw new RuntimeDroolsException(e);
 		}
-				
-		setMPOperator(factory.getModusPonensOperator(rule.getEntailMode()));
 		
+		String mode = rule.getEntailMode();
+		String kind = rule.getModusPonensKind();
+		IDegreeCombiner mpOperator = null;
+		if (mode == null || mode.equals("implication")) {
+			mpOperator = (kind == null) ?
+					factory.getModusPonensOp() : factory.getModusPonensOperator(kind);
+		} else if (mode.equals("equivalence")) {
+			mpOperator = (kind == null) ?
+					factory.getDoubleMPOperator() : factory.getDoubleMPOperator(kind);
+		}
+			
+		setMPOperator(mpOperator);
+		
 	}
 	
 	public void attach() {        
@@ -118,6 +130,11 @@
     		
     		
         	EvalRecord mpRecord = new EvalRecord(this.id,getMPOperator(),factory.getMergeStrategy(),factory.getNullHandlingStrategy(),factory,new ArgList());
+        	
+        	Iterator ruleIter = this.getRules().iterator();
+        	String rule = (String) ruleIter.next();
+        	mpRecord.setRuleId(rule);
+        	
         		Evaluation core = premiseRecord.getOperands().iterator().next();
         		core.deleteObserver(premiseRecord);
         	mpRecord.addEvaluation(core);        		
@@ -259,6 +276,11 @@
 	}
 	
 	
+	public String toString() {
+		Iterator ruleIter = this.getRules().iterator();
+    	String rule = (String) ruleIter.next();
+		return "MP Node for rule "+rule;
+	}
 	
 	
 	
@@ -266,6 +288,8 @@
 	
 	
 	
+	
+	
 	public void networkUpdated() {
         //this.rightInput.networkUpdated();
         this.leftInput.networkUpdated();
@@ -329,6 +353,8 @@
 			
 		}
 		
+		
+		
 	}
 	
 

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObjectTypeNode.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -40,6 +40,7 @@
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.NodeMemory;
 import org.drools.common.PropagationContextImpl;
+import org.drools.degrees.IDegree;
 import org.drools.degrees.factory.IDegreeFactory;
 import org.drools.reteoo.ReteooWorkingMemory.WorkingMemoryReteExpireAction;
 import org.drools.reteoo.builder.BuildContext;
@@ -111,13 +112,17 @@
 
 	private GammaMemory gamma; 
 	
-	private String		label;
 
+
 	private IFilterStrategy 	filterStrat;
 
 	private ConstraintKey singletonKey;
 
+	private String		label;
+	
+////	
 
+
     public ObjectTypeNode() {
 
     }
@@ -421,7 +426,12 @@
      * Uses he hashCode() of the underlying ObjectType implementation.
      */
     public int hashCode() {
-        return this.objectType.hashCode() ^ this.source.hashCode();
+        int code = this.objectType.hashCode() ^ this.source.hashCode();
+//        if (this.getParams() != null)
+//        	code ^= this.getParams().hashCode();
+//        if (this.getPrior() != null)
+//        	code ^= this.getPrior().hashCode();
+        return code;
     }
 
     public boolean equals(final Object object) {
@@ -435,9 +445,14 @@
 
         final ObjectTypeNode other = (ObjectTypeNode) object;
 
-        return this.objectType.equals( other.objectType ) && this.source.equals( other.source );
+        return this.objectType.equals( other.objectType ) 
+        	   && this.source.equals( other.source );
+        
+//        	   && (compareConfig(this.getParams(),other.getParams()))
+//        	   && (compareConfig(this.getPrior(),other.getPrior()));
     }
 
+    
     /**
      * @inheritDoc
      */
@@ -604,8 +619,8 @@
 			PropagationContext context,
 			InternalWorkingMemory workingMemory, IDegreeFactory factory,
 			EvalRecord record) {
+				
 		
-		
 		if ( context.getType() == PropagationContext.MODIFICATION && this.skipOnModify && context.getDormantActivations() == 0 ) {
             // we do this after the shadowproxy update, just so that its up to date for the future
             return;
@@ -711,6 +726,25 @@
 
 	
 
+//	private EvalRecord buildRecordOnTheFly(IDegreeFactory factory) {
+//		EvalRecord record = new EvalRecord(
+//									this.getId(),
+//									factory.getAndOperator(this.getParams()),
+//									factory.getMergeStrategy(),
+//									factory.getNullHandlingStrategy(),
+//									factory,
+//									new ArgList());
+//		if (getPrior() != null) {
+//			IDegree priorDeg = factory.buildDegree(getPrior());
+//			if (priorDeg != null)
+//				record.addDegree(Evaluation.PRIOR, priorDeg, 1.0, false);
+//		}
+//		
+//		
+//		
+//		return record;
+//	}
+
 	public void update(Observable watcher, Object arg) {
 		EvalRecord record = (EvalRecord) watcher;
 		System.out.println("**************************************************************UPDATE @ALPHA NODE");
@@ -796,7 +830,31 @@
 	public String getLabel() {
 		return label;
 	}
+
+//	public void setParams(String params) {
+//		this.params = params;
+//	}
+//
+//	public String getParams() {
+//		return params;
+//	}
+//
+//	public void setCutter(boolean isCutter) {
+//		this.isCutter = isCutter;
+//	}
+//
+//	public boolean isCutter() {
+//		return isCutter;
+//	}
+//
+//	public void setPrior(String prior) {
+//		this.prior = prior;
+//	}
+//
+//	public String getPrior() {
+//		return prior;
+//	}
+//	
 	
 	
-	
 }

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObservableRightTupleMemoryWrapper.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObservableRightTupleMemoryWrapper.java	2009-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/ObservableRightTupleMemoryWrapper.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -10,7 +10,7 @@
 import org.drools.spi.PropagationContext;
 import org.drools.util.Iterator;
 
-public class ObservableRightTupleMemoryWrapper extends Observable 
+public class ObservableRightTupleMemoryWrapper extends Droobservable 
 	implements RightTupleMemory {
 	
 	

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/OperandSet.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/OperandSet.java	2009-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/OperandSet.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -17,7 +17,7 @@
 import org.drools.spi.PropagationContext;
 
 
-public class OperandSet extends Observable implements Observer {
+public class OperandSet extends Droobservable implements Observer {
 	
 	private ObservableRightTupleMemoryWrapper memory;
 	private ContextEntry context[];

Added: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/RecordHackerNode.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/RecordHackerNode.java	                        (rev 0)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/RecordHackerNode.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -0,0 +1,212 @@
+package org.drools.reteoo;
+
+import org.drools.common.BaseNode;
+import org.drools.common.ImperfectFactHandle;
+import org.drools.common.InternalFactHandle;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.common.PropagationContextImpl;
+import org.drools.degrees.IDegree;
+import org.drools.degrees.factory.IDegreeFactory;
+import org.drools.degrees.operators.IDegreeCombiner;
+import org.drools.reteoo.builder.BuildContext;
+import org.drools.spi.PropagationContext;
+
+public class RecordHackerNode extends ObjectSource 
+	implements ObjectSinkNode {
+
+
+	private String priorStr;
+	private String operatorStr;
+	
+	private boolean isCutter = false;
+	
+	private IDegree prior = null;
+	private IDegreeCombiner operator = null;
+	
+	private ObjectSinkNode previousRightTupleSinkNode;
+	private ObjectSinkNode nextRightTupleSinkNode; 
+	
+	
+	
+	public RecordHackerNode(BuildContext context, String priorStr, String operatorStr, boolean isCutter ) {
+		
+		super( context.getNextId(),
+	               context.getPartitionId(),
+	               context.getRuleBase().getConfiguration().isMultithreadEvaluation(),
+	               context.getObjectSource(),
+	               context.getRuleBase().getConfiguration().getAlphaNodeHashingThreshold() );
+		
+		
+		this.priorStr = priorStr;
+		this.operatorStr = operatorStr;
+		this.isCutter = isCutter;
+	}
+	
+	public ConstraintKey getConstraintKey() {	
+		return null;
+	}
+	
+	 public void attach() {
+	        this.source.addObjectSink( this );
+	    }
+
+	 public void attach(final InternalWorkingMemory[] workingMemories) {
+	        attach();
+	        for ( int i = 0, length = workingMemories.length; i < length; i++ ) {
+	            final InternalWorkingMemory workingMemory = workingMemories[i];
+	            final PropagationContext propagationContext = new PropagationContextImpl( workingMemory.getNextPropagationIdCounter(),
+	                                                                                      PropagationContext.RULE_ADDITION, 
+	                                                                                      
+	                                                                                      null,
+	                                                                                      null,
+	                                                                                      null );
+	            this.source.updateSink( this,
+	                                    propagationContext,
+	                                    workingMemory );
+	        }
+	    }
+
+
+	 protected void doRemove(final RuleRemovalContext context,
+             final ReteooBuilder builder,
+             final BaseNode node,
+             final InternalWorkingMemory[] workingMemories) {
+		 if ( !node.isInUse() ) {
+			 removeObjectSink( (ObjectSink) node );
+		 }		
+		 this.source.remove( context,
+				 builder,
+				 this,
+				 workingMemories );
+	 }
+	 
+	 public void updateSink(final ObjectSink sink,
+             final PropagationContext context,
+             final InternalWorkingMemory workingMemory) {
+		 
+		 this.source.updateSink( sink,
+                  context,
+                  workingMemory );
+	 }
+
+	
+	
+	
+	
+	 /**
+	     * Returns the next node
+	     * @return
+	     *      The next ObjectSinkNode
+	     */
+	    public ObjectSinkNode getNextObjectSinkNode() {
+	        return this.nextRightTupleSinkNode;
+	    }
+
+	    /**
+	     * Sets the next node
+	     * @param next
+	     *      The next ObjectSinkNode
+	     */
+	    public void setNextObjectSinkNode(final ObjectSinkNode next) {
+	        this.nextRightTupleSinkNode = next;
+	    }
+
+	    /**
+	     * Returns the previous node
+	     * @return
+	     *      The previous ObjectSinkNode
+	     */
+	    public ObjectSinkNode getPreviousObjectSinkNode() {
+	        return this.previousRightTupleSinkNode;
+	    }
+
+	    /**
+	     * Sets the previous node
+	     * @param previous
+	     *      The previous ObjectSinkNode
+	     */
+	    public void setPreviousObjectSinkNode(final ObjectSinkNode previous) {
+	        this.previousRightTupleSinkNode = previous;
+	    }
+	
+	
+	
+	    
+	    
+	    
+	public void assertObject(InternalFactHandle factHandle,
+			PropagationContext propagationContext,
+			InternalWorkingMemory workingMemory) {		
+		this.sink.propagateAssertObject(factHandle, propagationContext, workingMemory);
+	}
+
+	
+	
+	public void assertObject(ImperfectFactHandle factHandle,
+			PropagationContext propagationContext,
+			InternalWorkingMemory workingMemory, IDegreeFactory factory,
+			EvalRecord record) {
+		
+		if (prior == null && priorStr != null)
+			prior = factory.buildDegree(this.priorStr);
+		if (operator == null && operatorStr != null)
+			operator = factory.getAndOperator(operatorStr);
+		
+		if (operator != null) 
+			record.setOperator(operator);
+		if (prior != null)
+			record.addDegree(Evaluation.PRIOR, prior, 1, true);
+		
+		if (isCutter && record.getDegree().equals(factory.False()) ) {
+			// DROP...
+		} else {			
+			this.sink.propagateAssertObject(factHandle, propagationContext,workingMemory,factory,record);
+		}
+	}
+
+	
+	
+	
+	
+	 public int hashCode() {
+	        return this.source.hashCode() * 17 
+	        		+ ((this.priorStr != null) ? this.priorStr.hashCode() : 0)
+	        		+ ((this.operatorStr != null) ? this.operatorStr.hashCode() : 0) 
+	        		+ (isCutter ? 1 : -1);
+	 }
+
+	    /*
+	     * (non-Javadoc)
+	     *
+	     * @see java.lang.Object#equals(java.lang.Object)
+	     */
+	    public boolean equals(final Object object) {
+	        if ( this == object ) {
+	            return true;
+	        }
+
+	        if ( object == null || !(object instanceof RecordHackerNode) ) {
+	            return false;
+	        }
+
+	        final RecordHackerNode other = (RecordHackerNode) object;
+
+	        return this.source.equals( other.source ) && 
+	        	compareConfig(this.operatorStr, other.operatorStr) &&
+	        	compareConfig(this.priorStr, other.priorStr) &&
+	        	this.isCutter == other.isCutter;
+	    }
+	
+	
+	
+	    boolean compareConfig(String a, String b) {
+	    	if (a == null && b == null) return true;
+	    	if (a != null)
+	    		return a.equals(b);
+	    	return false;
+	    }
+	
+	
+	
+	
+}

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java	2009-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/BuildUtils.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -113,6 +113,8 @@
             Map<ObjectType, ObjectTypeNode> map = context.getRuleBase().getRete().getObjectTypeNodes( context.getCurrentEntryPoint() );
             if ( map != null ) {
                 otn = map.get( otn.getObjectType() );
+                //TODO: improve...
+                                               
                 if ( otn != null ) {
                     // adjusting expiration offset
                     otn.setExpirationOffset( Math.max( otn.getExpirationOffset(),

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java	2009-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -34,6 +34,7 @@
 import org.drools.reteoo.ObjectTypeNode;
 import org.drools.reteoo.PatternNegator;
 import org.drools.reteoo.PropagationQueuingNode;
+import org.drools.reteoo.RecordHackerNode;
 import org.drools.rule.Behavior;
 import org.drools.rule.CompositeMaxDuration;
 import org.drools.rule.Declaration;
@@ -296,17 +297,43 @@
             }
         }
 
+        
+        
+                                       
+        
         ObjectTypeNode returnedOtn = (ObjectTypeNode) utils.attachNode( context, otn ); 
         context.setObjectSource( returnedOtn  );
         
-        //Notice that == is called on purpose
-        if (returnedOtn == otn) {
-        	if (pattern.getLabel() != null)
-        		otn.setLabel(pattern.getLabel());
+        //Notice that == is called deliberately
+        if (returnedOtn == otn) {   
+        	//this is the first time that a specific OTN is required, so it must be configured.
         	otn.setImperfectStructures(context);
         }
         
+        if (pattern.getPrior() != null || pattern.getParams() != null) {
+        	
+        	RecordHackerNode recordHacker = new RecordHackerNode(context, pattern.getPrior(),pattern.getParams(), pattern.isCutter());
+        	
+        	context.setObjectSource( (ObjectSource) utils.attachNode( context,
+                    recordHacker) );
+        }
+//        
+//
+//        	if (pattern.getLabel() != null)
+//        		otn.setLabel(pattern.getLabel());
+//        	
+//        	if (pattern.getPrior() != null)
+//        		otn.setPrior(pattern.getPrior());
+//        	
+//        	if (pattern.getParams() != null)
+//        		otn.setParams(pattern.getParams());
+//        	        	
+//        	otn.setCutter(pattern.isCutter());
+        	
+        	
+        	
         
+        
 
         for ( final Iterator<Constraint> it = alphaConstraints.iterator(); it.hasNext(); ) {
             final AlphaNodeFieldConstraint constraint = (AlphaNodeFieldConstraint) it.next();
@@ -340,6 +367,9 @@
         context.setAlphaNodeMemoryAllowed( alphaMemory );
 
     }
+    
+    
+   
 
     /**
      * @param context

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java	2009-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/AbstractCompositeConstraint.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -368,6 +368,9 @@
     
 	
 	 public EvaluationTemplate getEvalTemplate(ConstraintKey key) {
+		 if (key.equals(this.getTemplate().getConstraintKey()))
+			 return this.getTemplate();
+		 else
 			return ((CompositeEvaluationTemplate) this.getTemplate()).getTemplate(key);
 	}
 	

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/AndConstraint.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -264,7 +264,13 @@
 
 	
     public EvaluationTemplate buildEvaluationTemplate(int id, Map<ConstraintKey, Set<String>> dependencies, IDegreeFactory factory) {
-		//BUILD A COMPOSITE TEMPLATE
+    	int Na = this.alphaConstraints.length;
+		int Nb = this.betaConstraints.length;
+		
+		for (int j = 0; j < Na; j++)
+			alphaConstraints[j].buildEvaluationTemplate(id, dependencies, factory);
+    	
+    	//BUILD A COMPOSITE TEMPLATE
     	int N = this.getAlphaConstraints().length + this.getBetaConstraints().length;
     	this.setOperator(factory.getAndOperator(this.getParams()));
     	CompositeEvaluationTemplate temp = new CompositeEvaluationTemplate(
@@ -277,11 +283,10 @@
     			factory.getNullHandlingStrategy(),
     			factory);
 
-    	int Na = this.alphaConstraints.length;
-		int Nb = this.betaConstraints.length;		
+    			
 	
 		for (int j = 0; j < Na; j++)
-			temp.addChild(alphaConstraints[j].buildEvaluationTemplate(id, dependencies, factory));
+			temp.addChild(alphaConstraints[j].getEvalTemplate(alphaConstraints[j].getConstraintKey()));
 		//for (int j = 0; j < Nb; j++)
 		//	temp.addChild(betaConstraints[j].build);
 

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-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/OrConstraint.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -58,6 +58,12 @@
     	//BUILD A COMPOSITE TEMPLATE    	
     	int N = this.getAlphaConstraints().length + this.getBetaConstraints().length;
     	
+    	int Na = this.alphaConstraints.length;
+		int Nb = this.betaConstraints.length;		
+	
+		for (int j = 0; j < Na; j++)
+			alphaConstraints[j].buildEvaluationTemplate(id, dependencies, factory);
+    	
     	setOperator(factory.getOrOperator(this.getParams()));
     	CompositeEvaluationTemplate temp = new CompositeEvaluationTemplate(id,
     			this.getConstraintKey(),
@@ -68,11 +74,9 @@
     			factory.getNullHandlingStrategy(),
     			factory);
 
-    	int Na = this.alphaConstraints.length;
-		int Nb = this.betaConstraints.length;		
-	
+    	
 		for (int j = 0; j < Na; j++)
-			temp.addChild(alphaConstraints[j].buildEvaluationTemplate(id, dependencies, factory));
+			temp.addChild(alphaConstraints[j].getEvalTemplate(alphaConstraints[j].getConstraintKey()));
 		//for (int j = 0; j < Nb; j++)
 		//	temp.addChild(betaConstraints[j].build);
 

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/Pattern.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/Pattern.java	2009-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/Pattern.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -57,6 +57,8 @@
     // this is the offset of the related fact inside a tuple. i.e:
     // the position of the related fact inside the tuple;
     private int               offset;
+	private String 			  params = null;
+	private String 			  prior = null;
 
     public Pattern() {
         this( 0,
@@ -408,4 +410,21 @@
 	public String getLabel() {
 		return label;
 	}
+	
+	public String getParams() {
+		return params;
+	}
+
+	public void setParams(String params) {
+		this.params = params;
+		
+	}
+
+	public String getPrior() {
+		return prior;
+	}
+	
+	public void setPrior(String prior) {
+		this.prior = prior;		
+	}
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/Rule.java
===================================================================
--- labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/Rule.java	2009-06-10 06:47:23 UTC (rev 26893)
+++ labs/jbossrules/branches/DroolsChance/drools-core/src/main/java/org/drools/rule/Rule.java	2009-06-10 06:48:39 UTC (rev 26894)
@@ -131,10 +131,13 @@
     private String			  priorDescription;
     
     private String			  filterStrategy;
-    
 
+    private String 			  mpKind = null;
+
 	private Map<ConstraintKey, Set<String>> dependencies;
 
+	
+
     public void writeExternal(ObjectOutput out) throws IOException {
         out.writeObject(pkg);
         out.writeObject(name);
@@ -765,4 +768,12 @@
 	public String getFilterStrategy() {
 		return filterStrategy;
 	}
+
+	public void setModusPonensKind(String value) {
+		this.mpKind = "kind:"+value;
+	}
+	
+	public String getModusPonensKind() {
+		return this.mpKind;
+	}
 }




More information about the jboss-svn-commits mailing list