[jboss-svn-commits] JBL Code SVN: r17341 - in labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch: api and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Dec 20 10:35:43 EST 2007


Author: shabino
Date: 2007-12-20 10:35:43 -0500 (Thu, 20 Dec 2007)
New Revision: 17341

Added:
   labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/api/
   labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/api/JobEligibility.java
   labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/api/JobExcludedException.java
Modified:
   labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/DispatchBenchmark.java
   labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/DispatchParameters.java
   labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/DispatchWrapper.java
Log:
Enhanced "getEligibility" method for rules engine

Modified: labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/DispatchBenchmark.java
===================================================================
--- labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/DispatchBenchmark.java	2007-12-20 15:34:57 UTC (rev 17340)
+++ labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/DispatchBenchmark.java	2007-12-20 15:35:43 UTC (rev 17341)
@@ -17,23 +17,29 @@
  */
 
 import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
 import org.drools.FactHandle;
 
+import benchmarks.dispatch.api.JobEligibility;
+import benchmarks.dispatch.api.JobExcludedException;
 import benchmarks.dispatch.fact.independent.DispatchState;
+import benchmarks.dispatch.fact.independent.Job;
 import benchmarks.dispatch.fact.independent.Worker;
 import benchmarks.dispatch.fact.independent.WorkerPosition;
 import benchmarks.dispatch.simulation.JobGenerator;
 import benchmarks.dispatch.simulation.WorkerGenerator;
 
 public class DispatchBenchmark {
-	
+
 	private DispatchWrapper dw;
-	
+
 	public DispatchBenchmark() throws Exception {
 		dw = new DispatchWrapper();
 	}
-	
+
 	public void go(int numWorkers, int numJobs) throws Exception {
 
 		DispatchState ds = new DispatchState();
@@ -49,33 +55,73 @@
 			dw.insert(wp);
 		}
 
+		Set<Job> jobs = new HashSet<Job>();
+
 		JobGenerator jg = new JobGenerator(100, ds.getCurrentTime());
 
 		for (int i = 0; i < numJobs; i++) {
-			dw.insert(jg.generateJob());
+			Job j = jg.generateJob();
+			jobs.add(j);
+			dw.insert(j);
 		}
 
 		dw.fireAllRules();
+
+		System.out.println("Inserts:" + dw.wmel.inserts);
+		System.out.println("Retracts:" + dw.wmel.retracts);
+		System.out.println("Updates:" + dw.wmel.updates);
+		System.out.println("-----");
+		System.out.println("Cancels:" + dw.ael.cancels);
+		System.out.println("Creates:" + dw.ael.creates);
+		System.out.println("FireAfter:" + dw.ael.fireAfter);
+		System.out.println("FireBefore:" + dw.ael.fireBefore);
+		System.out.println("Pops:" + dw.ael.pops);
+		System.out.println("Pushes:" + dw.ael.pushes);
+		System.out.println("--");
+		dw.ael.dump();
+
+		System.out.println("--");
+
+		for (Job j : jobs) {
+
+			List<JobEligibility> eligibilities = null;
+
+			try {
+				eligibilities = dw.getEligibileWorkersForJob(j.getJobId());
+			} catch (JobExcludedException jee) {
+				System.out.println("Job:" + j.getJobId() + ":" + "EXCLUDED");
+				continue;
+			}
+
+			System.out.println("Job:" + j.getJobId() + ":"
+					+ eligibilities.size() + ":"
+					+ eligibilities.get(0).getDistanceToJobInMiles());
+
+		}
+
 	}
 
 	public static void main(String args[]) throws Exception {
 		int numWorkers = 1;
 		int numJobs = 1;
 
-		if (args.length == 2){
+		if (args.length == 2) {
 			numWorkers = new Integer(args[0]);
 			numJobs = new Integer(args[1]);
 		}
+
+		System.out.println("Running benchmark with " + numWorkers
+				+ " workers and " + numJobs + " jobs.");
+
+		long startTime = System.currentTimeMillis();
 		
-		System.out.println("Running benchmark with " + numWorkers + " workers and " + numJobs + " jobs.");
-		
 		DispatchBenchmark db = new DispatchBenchmark();
 		
-		long startTime = System.currentTimeMillis();
-		
 		db.go(numWorkers, numJobs);
 		
-		System.out.println("Completed in " + (System.currentTimeMillis() - startTime)+ "ms");
+		System.out.println("Completed in "
+				+ (System.currentTimeMillis() - startTime) + "ms");
+
 	}
 
 }

Modified: labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/DispatchParameters.java
===================================================================
--- labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/DispatchParameters.java	2007-12-20 15:34:57 UTC (rev 17340)
+++ labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/DispatchParameters.java	2007-12-20 15:35:43 UTC (rev 17341)
@@ -1,9 +1,12 @@
 package benchmarks.dispatch;
 
 public class DispatchParameters {
-	public final static double INITIAL_SEARCH_RADIUS = 25D;
-	public final static double INCREMENTAL_SEARCH_RADIUS = 100D;
+	public final static double INITIAL_SEARCH_RADIUS = 100D;
+	public final static double INCREMENTAL_SEARCH_RADIUS = 50D;
 	
+	//Increase surface area by 25%
+	public final static double INCREMENTAL_SEARCH_RADIUS_MULTIPLIER = Math.sqrt(1.25);
+	
 	public final static int MIN_SCORED_WORKERS = 50;
 	
 }

Modified: labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/DispatchWrapper.java
===================================================================
--- labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/DispatchWrapper.java	2007-12-20 15:34:57 UTC (rev 17340)
+++ labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/DispatchWrapper.java	2007-12-20 15:35:43 UTC (rev 17341)
@@ -2,10 +2,17 @@
 
 import java.io.InputStreamReader;
 import java.io.Reader;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import org.drools.FactHandle;
+import org.drools.QueryResult;
+import org.drools.QueryResults;
 import org.drools.RuleBase;
 import org.drools.RuleBaseConfiguration;
 import org.drools.RuleBaseFactory;
@@ -13,18 +20,36 @@
 import org.drools.compiler.DrlParser;
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
+import org.drools.event.ActivationCancelledEvent;
+import org.drools.event.ActivationCreatedEvent;
+import org.drools.event.AfterActivationFiredEvent;
+import org.drools.event.AgendaEventListener;
+import org.drools.event.AgendaGroupPoppedEvent;
+import org.drools.event.AgendaGroupPushedEvent;
+import org.drools.event.BeforeActivationFiredEvent;
+import org.drools.event.ObjectInsertedEvent;
+import org.drools.event.ObjectRetractedEvent;
+import org.drools.event.ObjectUpdatedEvent;
+import org.drools.event.WorkingMemoryEventListener;
 import org.drools.lang.descr.PackageDescr;
 
+import benchmarks.dispatch.api.JobEligibility;
+import benchmarks.dispatch.api.JobExcludedException;
+import benchmarks.dispatch.fact.derived.DecimalInfo;
+import benchmarks.dispatch.fact.derived.Info;
+import benchmarks.dispatch.fact.derived.ScoreComponent;
+import benchmarks.dispatch.fact.derived.TopWorkers;
+
 public class DispatchWrapper {
-	
+
 	public DispatchWrapper() throws Exception {
 		createWM();
 	}
-	
-	public WorkingMemory getWM(){
+
+	public WorkingMemory getWM() {
 		return wm;
 	}
-	
+
 	private static final Set<String> rules = new HashSet<String>();
 
 	static {
@@ -38,6 +63,8 @@
 	}
 
 	private WorkingMemory wm;
+	public WMEL wmel;
+	public AEL ael;
 
 	public void createWM() throws Exception {
 
@@ -53,9 +80,8 @@
 
 		PackageBuilderConfiguration pbc = new PackageBuilderConfiguration();
 
-		pbc
-				.addAccumulateFunction("top_workers",
-						"benchmarks.dispatch.accumulator.TopWorkerAccumulator");
+		pbc.addAccumulateFunction("top_workers",
+				"benchmarks.dispatch.accumulator.TopWorkerAccumulator");
 
 		PackageBuilder builder = new PackageBuilder(pbc);
 
@@ -69,15 +95,180 @@
 		ruleBase.addPackage(builder.getPackage());
 
 		wm = ruleBase.newStatefulSession();
-		
+
+		wmel = new WMEL();
+
+		wm.addEventListener(wmel);
+
+		ael = new AEL();
+		wm.addEventListener(ael);
+
 		System.out.println("Created WM");
 
 	}
+
+	public static class AEL implements AgendaEventListener {
+
+		public long cancels, creates, fireAfter, fireBefore, pops, pushes;
+
+		public Map<String, Integer> fires = new HashMap<String, Integer>();
+
+		public void dump() {
+			for (Map.Entry<String, Integer> e : fires.entrySet()) {
+				System.out.println(e.getKey() + ":" + e.getValue());
+			}
+		}
+
+		public void activationCancelled(ActivationCancelledEvent event,
+				WorkingMemory workingMemory) {
+			cancels++;
+
+		}
+
+		public void activationCreated(ActivationCreatedEvent event,
+				WorkingMemory workingMemory) {
+			creates++;
+
+		}
+
+		public void afterActivationFired(AfterActivationFiredEvent event,
+				WorkingMemory workingMemory) {
+			String name = event.getActivation().getRule().getName();
+			Integer current = fires.get(name);
+			if (current == null) {
+				current = new Integer(0);
+			}
+			fires.put(name, ++current);
+			fireAfter++;
+
+		}
+
+		public void agendaGroupPopped(AgendaGroupPoppedEvent event,
+				WorkingMemory workingMemory) {
+			pops++;
+
+		}
+
+		public void agendaGroupPushed(AgendaGroupPushedEvent event,
+				WorkingMemory workingMemory) {
+			pushes++;
+
+		}
+
+		public void beforeActivationFired(BeforeActivationFiredEvent event,
+				WorkingMemory workingMemory) {
+			fireBefore++;
+
+		}
+
+	}
+
+	public static class WMEL implements WorkingMemoryEventListener {
+
+		public long inserts, updates, retracts;
+
+		public void objectInserted(ObjectInsertedEvent event) {
+			inserts++;
+		}
+
+		public void objectRetracted(ObjectRetractedEvent event) {
+			retracts++;
+
+		}
+
+		public void objectUpdated(ObjectUpdatedEvent event) {
+			updates++;
+
+		}
+
+	}
+
+	public List<JobEligibility> getEligibileWorkersForJob(String jobId)
+			throws Exception, JobExcludedException {
+		if (isJobExcluded(jobId)) {
+			throw new JobExcludedException();
+		}
+
+		TopWorkers topWorkers = getTopWorkersForJob(jobId);
+
+		List<JobEligibility> eligibilities = new ArrayList<JobEligibility>();
+
+		for (String workerId : topWorkers.getTopWorkers()) {
+			JobEligibility je = new JobEligibility();
+			je.setWorkerId(workerId);
+
+			// TODO: Handle the "no position" case
+
+			je.setDistanceToJobInMiles(((DecimalInfo) getInfo(jobId, workerId,
+					Info.Type.DISTANCE_TO_JOB_MILES)).getValue());
+			je.setMinutesLateToJob(((DecimalInfo) getInfo(jobId, workerId,
+					Info.Type.MINUTES_LATE_TO_JOB)).getValue());
+			je.setTimeToJobMinutes(((DecimalInfo) getInfo(jobId, workerId,
+					Info.Type.TIME_TO_JOB_MINUTES)).getValue());
+			
+			Set scores = getResultSetFromWM("getScoreComponents", new Object[]{jobId, workerId});
+			
+			for (Object o: scores){
+				ScoreComponent score = (ScoreComponent)o;
+				je.addScoreComponent(score);
+				
+			}
+			eligibilities.add(je);
+		}
+
+		return eligibilities;
+	}
+
+	private TopWorkers getTopWorkersForJob(String jobId) throws Exception {
+		return (TopWorkers) getSingleResultFromWM("getTopWorkersForJob",
+				new Object[] { jobId });
+	}
+
+	private Info getInfo(String jobId, String workerId, Info.Type type) {
+		return (Info) getSingleResultFromWM("getInfo", new Object[] { jobId,
+				workerId, type });
+	}
+
+	private boolean isJobExcluded(String jobId) {
+		return getSingleResultFromWM("getJobExclusion", new Object[] { jobId }) != null;
+	}
 	
+	private Set getResultSetFromWM(String query, Object[] params) {
+
+		Set resultSet = new HashSet();
+		
+		QueryResults qrs = wm.getQueryResults(query, params);
+		Iterator it = qrs.iterator();
+		while (it.hasNext()) {
+			QueryResult qr = (QueryResult) it.next();
+
+			for (int i = 0; i < qr.size(); i++) {
+				resultSet.add(qr.get(i));
+			}
+		}
+
+		return resultSet;
+	}
+
+	private Object getSingleResultFromWM(String query, Object[] params) {
+
+		QueryResults qrs = wm.getQueryResults(query, params);
+		Iterator it = qrs.iterator();
+		while (it.hasNext()) {
+			QueryResult qr = (QueryResult) it.next();
+
+			for (int i = 0; i < qr.size(); i++) {
+				return qr.get(i);
+			}
+		}
+
+		return null;
+	}
+
 	public FactHandle insert(Object o) throws Exception {
 		return wm.insert(o);
 	}
-	
+
 	public void fireAllRules() throws Exception {
 		wm.fireAllRules();
 	}
@@ -87,5 +278,4 @@
 				resourceName));
 	}
 
-	
 }

Added: labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/api/JobEligibility.java
===================================================================
--- labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/api/JobEligibility.java	                        (rev 0)
+++ labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/api/JobEligibility.java	2007-12-20 15:35:43 UTC (rev 17341)
@@ -0,0 +1,73 @@
+package benchmarks.dispatch.api;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import benchmarks.dispatch.fact.derived.Score;
+import benchmarks.dispatch.fact.derived.ScoreComponent;
+
+public class JobEligibility {
+	private String workerId;
+	private Set<ScoreComponent> scores = new HashSet<ScoreComponent>();
+
+	private Double distanceToJobInMiles, timeToJobMinutes, minutesLateToJob;
+
+	public JobEligibility() {
+
+	}
+
+	public String getWorkerId() {
+		return workerId;
+	}
+
+	public void setWorkerId(String workerId) {
+		this.workerId = workerId;
+	}
+
+	public Set<ScoreComponent> getScoreComponents() {
+		return scores;
+	}
+
+	public void setScoreComponents(Set<ScoreComponent> scores) {
+		this.scores = scores;
+	}
+	
+	public void addScoreComponent(ScoreComponent s){
+		scores.add(s);
+	}
+
+	public Double getTotalScore() {
+		double score = 0;
+
+		for (ScoreComponent s : scores) {
+			score += s.getContribution();
+		}
+
+		return score;
+	}
+
+	public Double getDistanceToJobInMiles() {
+		return distanceToJobInMiles;
+	}
+
+	public void setDistanceToJobInMiles(Double distanceToJobInMiles) {
+		this.distanceToJobInMiles = distanceToJobInMiles;
+	}
+
+	public Double getTimeToJobMinutes() {
+		return timeToJobMinutes;
+	}
+
+	public void setTimeToJobMinutes(Double timeToJobMinutes) {
+		this.timeToJobMinutes = timeToJobMinutes;
+	}
+
+	public Double getMinutesLateToJob() {
+		return minutesLateToJob;
+	}
+
+	public void setMinutesLateToJob(Double minutesLateToJob) {
+		this.minutesLateToJob = minutesLateToJob;
+	}
+
+}


Property changes on: labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/api/JobEligibility.java
___________________________________________________________________
Name: svn:eol-style
   + native

Added: labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/api/JobExcludedException.java
===================================================================
--- labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/api/JobExcludedException.java	                        (rev 0)
+++ labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/api/JobExcludedException.java	2007-12-20 15:35:43 UTC (rev 17341)
@@ -0,0 +1,11 @@
+package benchmarks.dispatch.api;
+
+public class JobExcludedException extends Exception {
+
+	private static final long serialVersionUID = 1L;
+	
+	public JobExcludedException(){
+		
+	}
+	
+}


Property changes on: labs/jbossrules/contrib/benchmarks/src/java/benchmarks/dispatch/api/JobExcludedException.java
___________________________________________________________________
Name: svn:eol-style
   + native




More information about the jboss-svn-commits mailing list