[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