[jboss-svn-commits] JBL Code SVN: r26258 - in labs/jbossrules/trunk/drools-solver: drools-solver-core/src/main/java/org/drools/solver/core/localsearch and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Apr 25 13:29:58 EDT 2009


Author: ge0ffrey
Date: 2009-04-25 13:29:58 -0400 (Sat, 25 Apr 2009)
New Revision: 26258

Added:
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/AbstractSolver.java
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/localsearch/DefaultLocalSearchSolver.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/business/SolutionBusiness.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/swingui/WorkflowFrame.java
Log:
cancel support in Solver, button enabling

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/AbstractSolver.java	2009-04-25 17:29:58 UTC (rev 26258)
@@ -0,0 +1,42 @@
+package org.drools.solver.core;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.drools.solver.core.localsearch.DefaultLocalSearchSolver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Abstract superclass for {@link Solver}.
+ * @see Solver
+ * @see DefaultLocalSearchSolver
+ * @author Geoffrey De Smet
+ */
+public abstract class AbstractSolver implements Solver {
+
+    protected final transient Logger logger = LoggerFactory.getLogger(getClass());
+
+    // 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 cancelled = new AtomicBoolean(false);
+
+    public boolean cancel() {
+        boolean cancellingSuccesful = !cancelled.getAndSet(true);
+        if (cancellingSuccesful) {
+            logger.info("Cancelling solver.");
+        }
+        return cancellingSuccesful;
+    }
+
+    public boolean isCancelled() {
+        return cancelled.get();
+    }
+
+    public final void solve() {
+        cancelled.set(false);
+        solveImplementation();
+    }
+
+    protected abstract void solveImplementation();
+
+}

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-04-25 15:30:54 UTC (rev 26257)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/Solver.java	2009-04-25 17:29:58 UTC (rev 26258)
@@ -1,5 +1,7 @@
 package org.drools.solver.core;
 
+import java.util.concurrent.Future;
+
 import org.drools.solver.core.solution.Solution;
 import org.drools.solver.core.score.Score;
 
@@ -20,5 +22,17 @@
     long getTimeMillisSpend();
 
     void solve();
+
+    /**
+     * @see Future#cancel(boolean)
+     * @return true if successful
+     */
+    boolean cancel();
+
+    /**
+     * @see Future#isCancelled()
+     * @return true if cancelled
+     */
+    boolean isCancelled();
     
 }

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-04-25 15:30:54 UTC (rev 26257)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/DefaultLocalSearchSolver.java	2009-04-25 17:29:58 UTC (rev 26258)
@@ -13,6 +13,7 @@
 import org.drools.solver.core.score.definition.ScoreDefinition;
 import org.drools.solver.core.solution.Solution;
 import org.drools.solver.core.solution.initializer.StartingSolutionInitializer;
+import org.drools.solver.core.AbstractSolver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -20,10 +21,9 @@
  * Default implementation of {@link LocalSearchSolver}.
  * @author Geoffrey De Smet
  */
-public class DefaultLocalSearchSolver implements LocalSearchSolver, LocalSearchSolverLifecycleListener {
+public class DefaultLocalSearchSolver extends AbstractSolver implements LocalSearchSolver,
+        LocalSearchSolverLifecycleListener {
 
-    protected final transient Logger logger = LoggerFactory.getLogger(getClass());
-
     protected long randomSeed; // TODO refactor to AbstractSolver
 
     protected StartingSolutionInitializer startingSolutionInitializer = null; // TODO refactor to AbstractSolver
@@ -100,12 +100,13 @@
     // Worker methods
     // ************************************************************************
 
-    public void solve() {
+    @Override
+    protected void solveImplementation() {
         LocalSearchSolverScope localSearchSolverScope = this.localSearchSolverScope;
         solvingStarted(localSearchSolverScope);
 
         StepScope stepScope = createNextStepScope(localSearchSolverScope, null);
-        while (!finish.isFinished(stepScope)) {
+        while (!cancelled.get() && !finish.isFinished(stepScope)) {
             stepScope.setTimeGradient(finish.calculateTimeGradient(stepScope));
             beforeDeciding(stepScope);
             decider.decideNextStep(stepScope);
@@ -179,9 +180,11 @@
         bestSolutionRecaller.solvingEnded(localSearchSolverScope);
         finish.solvingEnded(localSearchSolverScope);
         decider.solvingEnded(localSearchSolverScope);
-        logger.info("Solved in {} steps and {} time millis spend.",
+        logger.info("Solved at step index ({}) with time spend ({}) for best score ({}).", new Object[] {
                 localSearchSolverScope.getLastCompletedStepScope().getStepIndex(),
-                localSearchSolverScope.calculateTimeMillisSpend());
+                localSearchSolverScope.calculateTimeMillisSpend(),
+                localSearchSolverScope.getBestScore()
+        });
     }
 
 }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/business/SolutionBusiness.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/business/SolutionBusiness.java	2009-04-25 15:30:54 UTC (rev 26257)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/business/SolutionBusiness.java	2009-04-25 17:29:58 UTC (rev 26258)
@@ -150,6 +150,10 @@
         solver.setStartingSolution(solution);
     }
 
+    public void cancelSolving() {
+        solver.cancel();
+    }
+
     public class SolverExampleFileFilter implements FileFilter {
 
         public boolean accept(File file) {

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/swingui/WorkflowFrame.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/swingui/WorkflowFrame.java	2009-04-25 15:30:54 UTC (rev 26257)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/swingui/WorkflowFrame.java	2009-04-25 17:29:58 UTC (rev 26258)
@@ -5,7 +5,6 @@
 import java.awt.GridLayout;
 import java.awt.event.ActionEvent;
 import java.io.File;
-import java.text.NumberFormat;
 
 import javax.swing.AbstractAction;
 import javax.swing.Action;
@@ -35,6 +34,9 @@
     private SolutionPanel solutionPanel;
     private JLabel resultLabel;
     private ConstraintScoreMapDialog constraintScoreMapDialog;
+    private Action cancelSolvingAction;
+    private Action solveAction;
+    private Action saveAction;
 
     public WorkflowFrame(SolutionPanel solutionPanel, String exampleName) {
         super("Drools solver example " + exampleName);
@@ -107,6 +109,8 @@
 
         public void actionPerformed(ActionEvent e) {
             solutionBusiness.load(file);
+            solveAction.setEnabled(true);
+            saveAction.setEnabled(true);
             updateScreen();
         }
 
@@ -114,9 +118,14 @@
 
     private JComponent createProcessingPanel() {
         JPanel panel = new JPanel(new GridLayout(0, 1));
-        Action solveAction = new SolveAction();
+        solveAction = new SolveAction();
+        solveAction.setEnabled(false);
         panel.add(new JButton(solveAction));
-        Action saveAction = new SaveAction();
+        cancelSolvingAction = new CancelSolvingAction();
+        cancelSolvingAction.setEnabled(false);
+        panel.add(new JButton(cancelSolvingAction));
+        saveAction = new SaveAction();
+        saveAction.setEnabled(false);
         panel.add(new JButton(saveAction));
         return panel;
     }
@@ -128,12 +137,27 @@
         }
 
         public void actionPerformed(ActionEvent e) {
+            cancelSolvingAction.setEnabled(true);
             solutionBusiness.solve();
+            cancelSolvingAction.setEnabled(false);
             updateScreen();
         }
 
     }
 
+    private class CancelSolvingAction extends AbstractAction {
+
+        public CancelSolvingAction() {
+            super("Cancel solving");
+        }
+
+        public void actionPerformed(ActionEvent e) {
+            // This async, so it doesn't stop the solving immediatly
+            solutionBusiness.cancelSolving();
+        }
+
+    }
+
     private class SaveAction extends AbstractAction {
 
         public SaveAction() {




More information about the jboss-svn-commits mailing list