[jboss-svn-commits] JBL Code SVN: r28964 - in labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core: event and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Aug 17 11:02:27 EDT 2009
Author: ge0ffrey
Date: 2009-08-17 11:02:27 -0400 (Mon, 17 Aug 2009)
New Revision: 28964
Added:
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/event/
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/event/BestSolutionChangedEvent.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/event/SolverEventListener.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/event/SolverEventSupport.java
Modified:
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/AbstractSolver.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/Solver.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/DefaultLocalSearchSolver.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/LocalSearchSolverScope.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/StepScope.java
labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/bestsolution/BestSolutionRecaller.java
Log:
JBRULES-2250 BestSolutionChangedEvent
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/AbstractSolver.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/AbstractSolver.java 2009-08-17 14:44:46 UTC (rev 28963)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/AbstractSolver.java 2009-08-17 15:02:27 UTC (rev 28964)
@@ -3,6 +3,8 @@
import java.util.concurrent.atomic.AtomicBoolean;
import org.drools.solver.core.localsearch.DefaultLocalSearchSolver;
+import org.drools.solver.core.event.SolverEventSupport;
+import org.drools.solver.core.event.SolverEventListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -16,6 +18,8 @@
protected final transient Logger logger = LoggerFactory.getLogger(getClass());
+ protected SolverEventSupport solverEventSupport = new SolverEventSupport();
+
// TODO atomic enum with values NOT_STARTED, RUNNING, DONE, CANCELLED
// TODO introduce a solver factory and make a solver one time use
protected final AtomicBoolean terminatedEarly = new AtomicBoolean(false);
@@ -39,4 +43,12 @@
protected abstract void solveImplementation();
+ public void addEventListener(SolverEventListener eventListener) {
+ solverEventSupport.addEventListener(eventListener);
+ }
+
+ public void removeEventListener(SolverEventListener eventListener) {
+ solverEventSupport.removeEventListener(eventListener);
+ }
+
}
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/Solver.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/Solver.java 2009-08-17 14:44:46 UTC (rev 28963)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/Solver.java 2009-08-17 15:02:27 UTC (rev 28964)
@@ -4,6 +4,7 @@
import org.drools.solver.core.solution.Solution;
import org.drools.solver.core.score.Score;
+import org.drools.solver.core.event.SolverEventListener;
/**
* A Solver solves planning problems.
@@ -53,4 +54,13 @@
*/
boolean isTerminatedEarly();
+ /**
+ * @param eventListener never null
+ */
+ void addEventListener(SolverEventListener eventListener);
+ /**
+ * @param eventListener never null
+ */
+ void removeEventListener(SolverEventListener eventListener);
+
}
Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/event/BestSolutionChangedEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/event/BestSolutionChangedEvent.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/event/BestSolutionChangedEvent.java 2009-08-17 15:02:27 UTC (rev 28964)
@@ -0,0 +1,31 @@
+package org.drools.solver.core.event;
+
+import java.util.EventObject;
+
+import org.drools.solver.core.solution.Solution;
+
+/**
+ * Delivered when the best solution changes during solving.
+ * @author Geoffrey De Smet
+ */
+public class BestSolutionChangedEvent extends EventObject {
+
+ public final Solution newBestSolution;
+
+ /**
+ * Internal API.
+ * @param newBestSolution never null
+ */
+ public BestSolutionChangedEvent(Solution newBestSolution) {
+ super(newBestSolution); // TODO is this really the source of this event?
+ this.newBestSolution = newBestSolution;
+ }
+
+ /**
+ * @return never null
+ */
+ public Solution getNewBestSolution() {
+ return newBestSolution;
+ }
+
+}
Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/event/SolverEventListener.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/event/SolverEventListener.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/event/SolverEventListener.java 2009-08-17 15:02:27 UTC (rev 28964)
@@ -0,0 +1,17 @@
+package org.drools.solver.core.event;
+
+import java.util.EventListener;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public interface SolverEventListener extends EventListener {
+
+ /**
+ * Called from the solver thread.
+ * Should return fast, as it steals time from the Solver.
+ * @param event never null
+ */
+ void bestSolutionChanged(BestSolutionChangedEvent event);
+
+}
Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/event/SolverEventSupport.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/event/SolverEventSupport.java (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/event/SolverEventSupport.java 2009-08-17 15:02:27 UTC (rev 28964)
@@ -0,0 +1,26 @@
+package org.drools.solver.core.event;
+
+import java.util.Iterator;
+
+import org.drools.solver.core.solution.Solution;
+import org.drools.event.AbstractEventSupport;
+import org.drools.event.RuleBaseEventListener;
+import org.drools.event.BeforePackageAddedEvent;
+
+/**
+ * Internal API.
+ * @author Geoffrey De Smet
+ */
+public class SolverEventSupport extends AbstractEventSupport<SolverEventListener> {
+
+ public void fireBestSolutionChanged(Solution newBestSolution) {
+ final Iterator<SolverEventListener> iter = getEventListenersIterator();
+ if (iter.hasNext()) {
+ final BestSolutionChangedEvent event = new BestSolutionChangedEvent(newBestSolution);
+ do {
+ iter.next().bestSolutionChanged(event);
+ } while (iter.hasNext());
+ }
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/DefaultLocalSearchSolver.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/DefaultLocalSearchSolver.java 2009-08-17 14:44:46 UTC (rev 28963)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/DefaultLocalSearchSolver.java 2009-08-17 15:02:27 UTC (rev 28964)
@@ -57,6 +57,7 @@
public void setBestSolutionRecaller(BestSolutionRecaller bestSolutionRecaller) {
this.bestSolutionRecaller = bestSolutionRecaller;
this.bestSolutionRecaller.setLocalSearchSolver(this);
+ this.bestSolutionRecaller.setSolverEventSupport(solverEventSupport);
}
public Decider getDecider() {
@@ -115,6 +116,8 @@
nextStep, decider.getForager().getAcceptedMovesSize()});
stepDecided(stepScope);
nextStep.doMove(stepScope.getWorkingMemory());
+ // there is no need to recalculate the score, but we still need to set it
+ localSearchSolverScope.getWorkingSolution().setScore(stepScope.getScore());
stepTaken(stepScope);
stepScope = createNextStepScope(localSearchSolverScope, stepScope);
}
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/LocalSearchSolverScope.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/LocalSearchSolverScope.java 2009-08-17 14:44:46 UTC (rev 28963)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/LocalSearchSolverScope.java 2009-08-17 15:02:27 UTC (rev 28964)
@@ -31,7 +31,7 @@
private int bestSolutionStepIndex;
private Solution bestSolution;
- private Score bestScore;
+ private Score bestScore; // TODO remove me
private StepScope lastCompletedStepScope;
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/StepScope.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/StepScope.java 2009-08-17 14:44:46 UTC (rev 28963)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/StepScope.java 2009-08-17 15:02:27 UTC (rev 28964)
@@ -21,6 +21,7 @@
private Move step = null;
private Move undoStep = null;
private Score score = null;
+ // Stays null if there is no need to clone it
private Solution clonedSolution = null;
public StepScope(LocalSearchSolverScope localSearchSolverScope) {
Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/bestsolution/BestSolutionRecaller.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/bestsolution/BestSolutionRecaller.java 2009-08-17 14:44:46 UTC (rev 28963)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/bestsolution/BestSolutionRecaller.java 2009-08-17 15:02:27 UTC (rev 28964)
@@ -6,6 +6,8 @@
import org.drools.solver.core.localsearch.LocalSearchSolverScope;
import org.drools.solver.core.localsearch.StepScope;
import org.drools.solver.core.score.Score;
+import org.drools.solver.core.event.SolverEventSupport;
+import org.drools.solver.core.solution.Solution;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -18,11 +20,16 @@
protected final transient Logger logger = LoggerFactory.getLogger(getClass());
protected LocalSearchSolver localSearchSolver;
+ protected SolverEventSupport solverEventSupport;
public void setLocalSearchSolver(LocalSearchSolver localSearchSolver) {
this.localSearchSolver = localSearchSolver;
}
+ public void setSolverEventSupport(SolverEventSupport solverEventSupport) {
+ this.solverEventSupport = solverEventSupport;
+ }
+
// ************************************************************************
// Worker methods
// ************************************************************************
@@ -50,8 +57,10 @@
logger.info("New score ({}) is better then last best score ({}). Updating best solution and best score.",
newScore, bestScore);
localSearchSolverScope.setBestSolutionStepIndex(stepScope.getStepIndex());
- localSearchSolverScope.setBestSolution(stepScope.createOrGetClonedSolution());
- localSearchSolverScope.setBestScore(stepScope.getScore());
+ Solution newBestSolution = stepScope.createOrGetClonedSolution();
+ localSearchSolverScope.setBestSolution(newBestSolution);
+ localSearchSolverScope.setBestScore(newBestSolution.getScore());
+ solverEventSupport.fireBestSolutionChanged(newBestSolution);
} else {
logger.info("New score ({}) is not better then last best score ({}).", newScore, bestScore);
}
More information about the jboss-svn-commits
mailing list