[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