[jboss-svn-commits] JBL Code SVN: r18158 - 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
Sun Jan 27 07:11:16 EST 2008


Author: Rikkola
Date: 2008-01-27 07:11:15 -0500 (Sun, 27 Jan 2008)
New Revision: 18158

Modified:
   labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/AnalyticsComponent.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
Log:
Fixed a rule that finds pattern subsumptions.

Modified: labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/AnalyticsComponent.java
===================================================================
--- labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/AnalyticsComponent.java	2008-01-27 11:45:43 UTC (rev 18157)
+++ labs/jbossrules/trunk/drools-analytics/src/main/java/org/drools/analytics/components/AnalyticsComponent.java	2008-01-27 12:11:15 UTC (rev 18158)
@@ -12,10 +12,10 @@
 	protected int id;
 
 	protected AnalyticsComponent parent;
-	protected int orderNumber = 0; // Order number of this instance under
+	
+	// Order number of this instance under parent.
+	protected int orderNumber = 0; 
 
-	// parent.
-
 	public abstract AnalyticsComponentType getComponentType();
 
 	public int compareTo(AnalyticsComponent o) {

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-27 11:45:43 UTC (rev 18157)
+++ labs/jbossrules/trunk/drools-analytics/src/main/resources/org/drools/analytics/subsumption/Possibilities.drl	2008-01-27 12:11:15 UTC (rev 18158)
@@ -13,96 +13,53 @@
 
 #declare any global variables here
 
-
-#
-# Finds subsumptant patterns possibilities
-#
-# Depandencies: TODO: Dependencies 
-#
 rule "Find subsumptant pattern possibilities"
 	when
+		
 		$redundancy :Redundancy(
 			left.causeType == CauseType.PATTERN
 		)
 
 		# Find two PatternPossibilities.
-		(
-				$pp1 :PatternPossibility(
-					eval( patternId == $redundancy.getLeft().getId() )
-				)
-			and
-				$pp2 :PatternPossibility(
-					eval( patternId == $redundancy.getRight().getId() )
-				)
-		) or (
-				$pp1 :PatternPossibility(
-					eval( patternId == $redundancy.getRight().getId() )
-				)
-			and
-				$pp2 :PatternPossibility(
-					eval( patternId == $redundancy.getLeft().getId() )
-				)
+		$pp1 :PatternPossibility(
+			eval( patternId == $redundancy.getLeft().getId() )
 		)
-
+		$pp2 :PatternPossibility(
+			eval( patternId == $redundancy.getRight().getId() )
+		)		
+		
 		# For every restriction in $pp1 there is a redundancy to restriction in $pp2.
 		forall(
 			$r :Restriction(
-				patternId == $pp1.patternId,
 				this memberOf $pp1.items
 			)
 
 			Redundancy(
-				(
-					left == $r
-					&&
-					right memberOf $pp2.items
-				) || (
-					left memberOf $pp2.items
-					&&
-					right == $r
-				)
+				left == $r,
+				right memberOf $pp2.items
 			)
 		)
-
-		# There is at least one restriction in $pp2 that has a redundancy to restriction in $pp1.
-		exists(
-				$r :Restriction(
-					patternId == $pp2.patternId,
+		
+		# There is no restriction on $pp2 that has no redundancy in $pp1 
+		# and has a lower order number than an existing redundancy from $pp2 to $pp1.
+		not(
+				$r1 :Restriction(
 					this memberOf $pp2.items
 				)
 			and
-				Redundancy(
-					(
-						left == $r
-						&&
-						right memberOf $pp1.items
-					) || (
-						left memberOf $pp1.items
-						&&
-						right == $r
-					)
+				$r2 :Restriction(
+					this memberOf $pp2.items,
+					orderNumber > $r1.orderNumber
 				)
-		)
-		
-		# There is at least one restriction in $pp2 that does not hava a redundancy to restriction in $pp1.
-		not(
-				$r :Restriction(
-					patternId == $pp2.patternId,
-					this memberOf $pp2.items
+			and
+				not Redundancy(
+					left memberOf $pp1.items,
+					right == $r1
 				)
 			and
-				forall (
-					Redundancy(
-						(
-							left == $r
-							&&
-							right memberOf $pp1.items
-						) || (
-							left memberOf $pp1.items
-							&&
-							right == $r
-						)
-					)
+				Redundancy(
+					left memberOf $pp1.items,
+					right == $r2
 				)
 		)
 
@@ -110,6 +67,7 @@
 		insert( new Subsumption( $pp1, $pp2 ) );
 end
 
+
 #
 # Finds subsumptant rule possibilities
 #
@@ -138,29 +96,30 @@
 				this memberOf $rp1.items
 			)
 
-#			Redundancy(
-#				type == RedundancyType.STRONG,
-#				left == $pp,
-#				right memberOf $rp2.items
-#			)
+			Redundancy(
+				type == RedundancyType.STRONG,
+				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
+		)
 		
-		#$pp :PatternPossibility(
-		#	ruleId == $rp2.ruleId,
-		#	this memberOf $rp2.items
-		#)
+		# XXX: Problem here, or splits the rule in to two.
 		exists( 
 				Subsumption(
-#					left memberOf $rp2.items,
-#					right memberOf $rp1.items
+					left memberOf $rp2.items,
+					right memberOf $rp1.items
 				)
 			or
 				Redundancy(
-#					type == RedundancyType.STRONG,
-#					left memberOf $rp2.items,
-#					right memberOf $rp1.items
+					type == RedundancyType.STRONG,
+					left memberOf $rp2.items,
+					right memberOf $rp1.items
 				)
 		)
 		
@@ -189,6 +148,6 @@
 
 	then
 		System.out.println("pim");
-		#insert( new Subsumption( $rp1, $rp2 ) );
+		insert( new Subsumption( $rp1, $rp2 ) );
 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-27 11:45:43 UTC (rev 18157)
+++ labs/jbossrules/trunk/drools-analytics/src/test/java/org/drools/analytics/subsumption/SubsumptantPossibilitiesTest.java	2008-01-27 12:11:15 UTC (rev 18158)
@@ -15,15 +15,13 @@
 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.CauseType;
 import org.drools.analytics.report.components.Redundancy;
 import org.drools.analytics.report.components.RedundancyType;
 import org.drools.base.RuleNameMatchesAgendaFilter;
 
 public class SubsumptantPossibilitiesTest extends SubsumptionTestBase {
 
-	public void FIXMEtestPatternPossibilityRedundancy() throws Exception {
+	public void testPatternPossibilityRedundancy1() throws Exception {
 		StatelessSession session = getStatelessSession(this.getClass()
 				.getResourceAsStream("Possibilities.drl"));
 
@@ -35,6 +33,9 @@
 		AnalyticsResult result = AnalyticsResultFactory.createAnalyticsResult();
 		session.setGlobal("result", result);
 
+		/*
+		 * Redundant patterns
+		 */
 		String ruleName1 = "Rule 1";
 		String ruleName2 = "Rule 2";
 
@@ -45,10 +46,13 @@
 
 		LiteralRestriction lr1 = new LiteralRestriction();
 		lr1.setRuleName(ruleName1);
+		lr1.setOrderNumber(0);
 		LiteralRestriction lr2 = new LiteralRestriction();
 		lr2.setRuleName(ruleName2);
+		lr2.setOrderNumber(0);
 		LiteralRestriction lr3 = new LiteralRestriction();
-		lr2.setRuleName(ruleName2);
+		lr3.setRuleName(ruleName2);
+		lr3.setOrderNumber(1);
 
 		PatternPossibility pp1 = new PatternPossibility();
 		pp1.setPatternId(p1.getId());
@@ -79,18 +83,84 @@
 		Map<String, Set<String>> map = createSubsumptionMap(sessionResult
 				.iterateObjects());
 
-		assertTrue(TestBase.mapContains(map, ruleName2, ruleName1));
+		assertTrue(TestBase.mapContains(map, ruleName1, ruleName2));
 
 		if (!map.isEmpty()) {
 			fail("More redundancies than was expected.");
 		}
 	}
 
-	/**
-	 * The problem is in this test -Rikkola-
-	 * 
-	 * @throws Exception
-	 */
+	public void testPatternPossibilityRedundancy2() throws Exception {
+		StatelessSession session = getStatelessSession(this.getClass()
+				.getResourceAsStream("Possibilities.drl"));
+
+		session.setAgendaFilter(new RuleNameMatchesAgendaFilter(
+				"Find subsumptant pattern possibilities"));
+
+		Collection<Object> data = new ArrayList<Object>();
+
+		AnalyticsResult result = AnalyticsResultFactory.createAnalyticsResult();
+		session.setGlobal("result", result);
+
+		/*
+		 * Not redundant patterns
+		 * 
+		 * For example: Pattern ( a==1, b==1, c==1) and Pattern ( a==1, c==1)
+		 */
+		String ruleName1 = "Rule 1";
+		String ruleName2 = "Rule 2";
+
+		Pattern p1 = new Pattern();
+		p1.setRuleName(ruleName1);
+		Pattern p2 = new Pattern();
+		p2.setRuleName(ruleName2);
+
+		LiteralRestriction lr1 = new LiteralRestriction();
+		lr1.setRuleName(ruleName1);
+		lr1.setOrderNumber(0);
+		LiteralRestriction lr2 = new LiteralRestriction();
+		lr2.setRuleName(ruleName2);
+		lr2.setOrderNumber(0);
+		LiteralRestriction lr3 = new LiteralRestriction();
+		lr3.setRuleName(ruleName2);
+		lr3.setOrderNumber(1);
+
+		PatternPossibility pp1 = new PatternPossibility();
+		pp1.setPatternId(p1.getId());
+		pp1.setRuleName(ruleName1);
+		pp1.add(lr1);
+
+		PatternPossibility pp2 = new PatternPossibility();
+		pp2.setPatternId(p2.getId());
+		pp2.setRuleName(ruleName2);
+		pp2.add(lr2);
+		pp2.add(lr3);
+
+		Redundancy r1 = new Redundancy(lr1, lr3);
+		Redundancy r2 = new Redundancy(p1, p2);
+
+		data.add(p1);
+		data.add(p2);
+		data.add(lr1);
+		data.add(lr2);
+		data.add(lr3);
+		data.add(pp1);
+		data.add(pp2);
+		data.add(r1);
+		data.add(r2);
+
+		StatelessSessionResult sessionResult = session.executeWithResults(data);
+
+		Map<String, Set<String>> map = createSubsumptionMap(sessionResult
+				.iterateObjects());
+
+		assertFalse(TestBase.mapContains(map, ruleName1, ruleName2));
+
+		if (!map.isEmpty()) {
+			fail("More redundancies than was expected.");
+		}
+	}
+
 	public void FIXMEtestRulePossibilityRedundancy() throws Exception {
 		StatelessSession session = getStatelessSession(this.getClass()
 				.getResourceAsStream("Possibilities.drl"));




More information about the jboss-svn-commits mailing list