[jboss-svn-commits] JBL Code SVN: r18174 - in labs/jbossrules/trunk/drools-analytics/src: main/resources/org/drools/analytics/subsumption and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Jan 28 08:30:21 EST 2008


Author: Rikkola
Date: 2008-01-28 08:30:21 -0500 (Mon, 28 Jan 2008)
New Revision: 18174

Modified:
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/CauseType.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Redundancy.java
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Subsumption.java
   labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/subsumption/Possibilities.drl
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/subsumption/SubsumptantPossibilitiesTest.java
   labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/subsumption/SubsumptionTestBase.java
Log:
Rules can now find subsumption between rules.

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/CauseType.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/CauseType.java	2008-01-28 11:03:46 UTC (rev 18173)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/CauseType.java	2008-01-28 13:30:21 UTC (rev 18174)
@@ -1,6 +1,5 @@
 package org.drools.analytics.report.components;
 
-
 public class CauseType {
 
 	public static final CauseType RULE = new CauseType(0);
@@ -16,6 +15,7 @@
 	public static final CauseType PREDICATE = new CauseType(10);
 	public static final CauseType CONSTRAINT = new CauseType(11);
 	public static final CauseType CONSEQUENCE = new CauseType(12);
+	public static final CauseType SUBSUMPTION = new CauseType(13);
 
 	public final int index;
 

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Redundancy.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Redundancy.java	2008-01-28 11:03:46 UTC (rev 18173)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Redundancy.java	2008-01-28 13:30:21 UTC (rev 18174)
@@ -3,59 +3,29 @@
 /**
  * Presents a redundancy between two Causes. The link between them can be WEAK
  * or STRONG.
- *
+ * 
  * WEAK redundancy is for example two AnalyticsRules, but not theyr's rule
  * possibilities. STRONG redundancy includes possibilities.
- *
+ * 
  * @author Toni Rikkola
  */
-public class Redundancy implements Cause {
-
-
-
-	private static int index = 0;
-
-	private int id = index++;
+public class Redundancy extends Subsumption implements Cause {
 	// By default the redundancy is weak.
 	private RedundancyType type = RedundancyType.WEAK;
-	private Cause left;
-	private Cause right;
 
 	public Redundancy(Cause left, Cause right) {
-		this.left = left;
-		this.right = right;
+		super(left, right);
 	}
 
 	public Redundancy(RedundancyType type, Cause left, Cause right) {
+		super(left, right);
 		this.type = type;
-		this.left = left;
-		this.right = right;
 	}
 
 	public CauseType getCauseType() {
 		return CauseType.REDUNDANCY;
 	}
 
-	public int getId() {
-		return id;
-	}
-
-	public Cause getLeft() {
-		return left;
-	}
-
-	public void setLeft(Cause left) {
-		this.left = left;
-	}
-
-	public Cause getRight() {
-		return right;
-	}
-
-	public void setRight(Cause right) {
-		this.right = right;
-	}
-
 	public RedundancyType getType() {
 		return type;
 	}
@@ -66,6 +36,7 @@
 
 	@Override
 	public String toString() {
-		return "Redundancy between: (" + left + ") and (" + right + ").";
+		return "Redundancy between: (" + getLeft() + ") and (" + getRight()
+				+ ").";
 	}
 }

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Subsumption.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Subsumption.java	2008-01-28 11:03:46 UTC (rev 18173)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/report/components/Subsumption.java	2008-01-28 13:30:21 UTC (rev 18174)
@@ -4,8 +4,12 @@
  * 
  * @author Toni Rikkola
  */
-public class Subsumption {
+public class Subsumption implements Cause {
 
+	private static int index = 0;
+
+	private int id = index++;
+
 	private Cause left;
 	private Cause right;
 
@@ -14,6 +18,14 @@
 		this.right = right;
 	}
 
+	public int getId() {
+		return id;
+	}
+
+	public CauseType getCauseType() {
+		return CauseType.SUBSUMPTION;
+	}
+
 	public Cause getLeft() {
 		return left;
 	}
@@ -29,4 +41,10 @@
 	public void setRight(Cause right) {
 		this.right = right;
 	}
+
+	@Override
+	public String toString() {
+		return "Subsumption between: (" + getLeft() + ") and (" + getRight()
+				+ ").";
+	}
 }

Modified: labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/subsumption/Possibilities.drl
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/subsumption/Possibilities.drl	2008-01-28 11:03:46 UTC (rev 18173)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/subsumption/Possibilities.drl	2008-01-28 13:30:21 UTC (rev 18174)
@@ -34,7 +34,7 @@
 				this memberOf $pp1.items
 			)
 
-			Redundancy(
+			Subsumption(
 				left == $r,
 				right memberOf $pp2.items
 			)
@@ -52,12 +52,12 @@
 					orderNumber > $r1.orderNumber
 				)
 			and
-				not Redundancy(
+				not Subsumption(
 					left memberOf $pp1.items,
 					right == $r1
 				)
 			and
-				Redundancy(
+				Subsumption(
 					left memberOf $pp1.items,
 					right == $r2
 				)
@@ -75,79 +75,82 @@
 #
 rule "Find subsumptant rule possibilities"
 	when
+		
 		$redundancy :Redundancy(
-			left.causeType == CauseType.RULE,
-			$leftRuleId :left.id,
-			$rightRuleId :right.id
+			left.causeType == CauseType.RULE
 		)
 
 		# Find two RulePossibilities.
 		$rp1 :RulePossibility(
-			ruleId == $leftRuleId
+			eval( ruleId == $redundancy.getLeft().getId() )
 		)
 		$rp2 :RulePossibility(
-			ruleId == $rightRuleId
+			eval( ruleId == $redundancy.getRight().getId() )
 		)
-
-		# For every pattern possibility in $rp1 there is a redundant pattern possibility in $rp2.
+		
+		# For every PatternPossibility in $rp1 there is a redundancy to PatternPossibility in $rp2.
 		forall(
 			$pp :PatternPossibility(
-				ruleId == $rp1.ruleId,
 				this memberOf $rp1.items
 			)
 
-			Redundancy(
-				type == RedundancyType.STRONG,
+			Subsumption(
 				left == $pp,
 				right memberOf $rp2.items
 			)
 		)
-
-		#  There is at least one PatternPossibility in $rp2 that does not hava a redundancy to PatternPossibility in $rp1.
-		$pp :PatternPossibility(
-			ruleId == $rp2.ruleId,
-			this memberOf $rp2.items
-		)
 		
-		# XXX: Problem here, or splits the rule in to two.
-		exists( 
+		# There is no PatternPossibility on $rp2 that has no redundancy in $rp1 
+		# and has a lower order number than an existing PatternPossibility from $rp2 to $rp1.
+		not(
+				$pp1 :PatternPossibility(
+					this memberOf $rp2.items
+				)
+			and
+				$pp2 :PatternPossibility(
+					this memberOf $rp2.items,
+					orderNumber > $pp1.orderNumber
+				)
+			and
+				not Subsumption(
+					left memberOf $rp1.items,
+					right == $pp1
+				)
+			and
 				Subsumption(
-					left memberOf $rp2.items,
-					right memberOf $rp1.items
+					left memberOf $rp1.items,
+					right == $pp2
 				)
-			or
-				Redundancy(
-					type == RedundancyType.STRONG,
-					left memberOf $rp2.items,
-					right memberOf $rp1.items
-				)
 		)
+	then
+		insert( new Subsumption( $rp1, $rp2 ) );
+end
+
+rule "XXX: test rule"
+	when
+		$redundancy :Redundancy(
+			left.causeType == CauseType.RULE
+		)
+
+		# Find two RulePossibilities.
+		$rp1 :RulePossibility(
+			eval( ruleId == $redundancy.getLeft().getId() )
+		)
+		$rp2 :RulePossibility(
+			eval( ruleId == $redundancy.getRight().getId() )
+		)
 		
-		# There is at least one PatternPossibility in $rp2 that does not hava a redundancy to PatternPossibility in $rp1.
-		#not(
-		#		$pp :PatternPossibility(
-		#			ruleId == $rp2.ruleId,
-		#			this memberOf $rp2.items
-		#		)
-		#	and
-		#		forall (
-		#			Redundancy(
-		#				type == RedundancyType.STRONG,
-		#				(
-		#					left == $pp
-		#					&&
-		#					right memberOf $rp1.items
-		#				) || (
-		#					left memberOf $rp1.items
-		#					&&
-		#					right == $pp
-		#				)
-		#			)
-		#		)
-		#)
+		forall(
+			$pp :PatternPossibility(
+				this memberOf $rp1.items
+			)
 
+			Redundancy(
+				left == $pp,
+				right memberOf $rp2.items
+			)
+		)
 	then
-		System.out.println("pim");
-		insert( new Subsumption( $rp1, $rp2 ) );
+		System.out.println( "pim" );
 end
 

Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/subsumption/SubsumptantPossibilitiesTest.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/subsumption/SubsumptantPossibilitiesTest.java	2008-01-28 11:03:46 UTC (rev 18173)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/subsumption/SubsumptantPossibilitiesTest.java	2008-01-28 13:30:21 UTC (rev 18174)
@@ -15,8 +15,10 @@
 import org.drools.analytics.components.RulePossibility;
 import org.drools.analytics.dao.AnalyticsResult;
 import org.drools.analytics.dao.AnalyticsResultFactory;
+import org.drools.analytics.report.components.Cause;
 import org.drools.analytics.report.components.Redundancy;
 import org.drools.analytics.report.components.RedundancyType;
+import org.drools.analytics.report.components.Subsumption;
 import org.drools.base.RuleNameMatchesAgendaFilter;
 
 public class SubsumptantPossibilitiesTest extends SubsumptionTestBase {
@@ -80,10 +82,10 @@
 
 		StatelessSessionResult sessionResult = session.executeWithResults(data);
 
-		Map<String, Set<String>> map = createSubsumptionMap(sessionResult
+		Map<Cause, Set<Cause>> map = createSubsumptionMap(sessionResult
 				.iterateObjects());
 
-		assertTrue(TestBase.mapContains(map, ruleName1, ruleName2));
+		assertTrue(TestBase.causeMapContains(map, pp1, pp2));
 
 		if (!map.isEmpty()) {
 			fail("More redundancies than was expected.");
@@ -151,17 +153,17 @@
 
 		StatelessSessionResult sessionResult = session.executeWithResults(data);
 
-		Map<String, Set<String>> map = createSubsumptionMap(sessionResult
+		Map<Cause, Set<Cause>> map = createSubsumptionMap(sessionResult
 				.iterateObjects());
 
-		assertFalse(TestBase.mapContains(map, ruleName1, ruleName2));
+		assertFalse(TestBase.causeMapContains(map, pp1, pp2));
 
 		if (!map.isEmpty()) {
 			fail("More redundancies than was expected.");
 		}
 	}
 
-	public void FIXMEtestRulePossibilityRedundancy() throws Exception {
+	public void testRulePossibilityRedundancy1() throws Exception {
 		StatelessSession session = getStatelessSession(this.getClass()
 				.getResourceAsStream("Possibilities.drl"));
 
@@ -218,13 +220,88 @@
 
 		StatelessSessionResult sessionResult = session.executeWithResults(data);
 
-		Map<String, Set<String>> map = createSubsumptionMap(sessionResult
+		Map<Cause, Set<Cause>> map = createSubsumptionMap(sessionResult
 				.iterateObjects());
 
-		assertTrue(TestBase.mapContains(map, ruleName2, ruleName1));
+		assertTrue(TestBase.causeMapContains(map, rp1, rp2));
 
 		if (!map.isEmpty()) {
 			fail("More redundancies than was expected.");
 		}
 	}
+
+	public void testRulePossibilityRedundancy2() throws Exception {
+		StatelessSession session = getStatelessSession(this.getClass()
+				.getResourceAsStream("Possibilities.drl"));
+
+		 session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
+		 "Find subsumptant rule possibilities"));
+//		session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
+//				"XXX: test rule"));
+
+		Collection<Object> data = new ArrayList<Object>();
+
+		AnalyticsResult result = AnalyticsResultFactory.createAnalyticsResult();
+		session.setGlobal("result", result);
+
+		/*
+		 * First rules. These are subsumptant,
+		 */
+		String ruleName1 = "Rule 1";
+		String ruleName2 = "Rule 2";
+
+		AnalyticsRule r1 = new AnalyticsRule();
+		r1.setRuleName(ruleName1);
+		AnalyticsRule r2 = new AnalyticsRule();
+		r2.setRuleName(ruleName2);
+
+		PatternPossibility pp1 = new PatternPossibility();
+		pp1.setRuleName(ruleName1);
+		PatternPossibility pp2 = new PatternPossibility();
+		pp2.setRuleName(ruleName1);
+		PatternPossibility pp3 = new PatternPossibility();
+		pp3.setRuleName(ruleName2);
+		PatternPossibility pp4 = new PatternPossibility();
+		pp4.setRuleName(ruleName2);
+
+		RulePossibility rp1 = new RulePossibility();
+		rp1.setRuleId(r1.getId());
+		rp1.setRuleName(ruleName1);
+		rp1.add(pp1);
+		rp1.add(pp2);
+
+		RulePossibility rp2 = new RulePossibility();
+		rp2.setRuleId(r2.getId());
+		rp2.setRuleName(ruleName2);
+		rp2.add(pp3);
+		rp2.add(pp4);
+
+		Redundancy possibilityredundancy = new Redundancy(
+				RedundancyType.STRONG, pp1, pp3);
+		Subsumption possibilitysubsupmtion = new Subsumption(pp2, pp4);
+		Redundancy ruleRedundancy = new Redundancy(r1, r2);
+
+		data.add(r1);
+		data.add(r2);
+		data.add(pp1);
+		data.add(pp2);
+		data.add(pp3);
+		data.add(possibilityredundancy);
+		data.add(possibilitysubsupmtion);
+		data.add(ruleRedundancy);
+		data.add(rp1);
+		data.add(rp2);
+
+		StatelessSessionResult sessionResult = session.executeWithResults(data);
+
+		Map<Cause, Set<Cause>> map = createSubsumptionMap(sessionResult
+				.iterateObjects());
+
+		assertTrue(TestBase.causeMapContains(map, rp1, rp2));
+		assertTrue(TestBase.causeMapContains(map, pp2, pp4));
+
+		if (!map.isEmpty()) {
+			fail("More redundancies than was expected.");
+		}
+	}
 }

Modified: labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/subsumption/SubsumptionTestBase.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/subsumption/SubsumptionTestBase.java	2008-01-28 11:03:46 UTC (rev 18173)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/subsumption/SubsumptionTestBase.java	2008-01-28 13:30:21 UTC (rev 18174)
@@ -7,7 +7,8 @@
 import java.util.Set;
 
 import org.drools.analytics.TestBase;
-import org.drools.analytics.components.AnalyticsComponent;
+import org.drools.analytics.report.components.Cause;
+import org.drools.analytics.report.components.Redundancy;
 import org.drools.analytics.report.components.Subsumption;
 
 /**
@@ -29,24 +30,23 @@
 	 * @param iter
 	 * @return
 	 */
-	protected Map<String, Set<String>> createSubsumptionMap(
-			Iterator<Object> iter) {
+	protected Map<Cause, Set<Cause>> createSubsumptionMap(Iterator<Object> iter) {
 
-		Map<String, Set<String>> map = new HashMap<String, Set<String>>();
+		Map<Cause, Set<Cause>> map = new HashMap<Cause, Set<Cause>>();
 		while (iter.hasNext()) {
 			Object o = (Object) iter.next();
-			if (o instanceof Subsumption) {
+			if (o instanceof Subsumption && !(o instanceof Redundancy)) {
 				Subsumption s = (Subsumption) o;
-				AnalyticsComponent left = (AnalyticsComponent) s.getLeft();
-				AnalyticsComponent right = (AnalyticsComponent) s.getRight();
+				Cause left = s.getLeft();
+				Cause right = s.getRight();
 
-				if (map.containsKey(left.getRuleName())) {
-					Set<String> set = map.get(left.getRuleName());
-					set.add(right.getRuleName());
+				if (map.containsKey(left)) {
+					Set<Cause> set = map.get(left);
+					set.add(right);
 				} else {
-					Set<String> set = new HashSet<String>();
-					set.add(right.getRuleName());
-					map.put(left.getRuleName(), set);
+					Set<Cause> set = new HashSet<Cause>();
+					set.add(right);
+					map.put(left, set);
 				}
 			}
 		}




More information about the jboss-svn-commits mailing list