[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