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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Apr 24 09:16:20 EDT 2009


Author: ge0ffrey
Date: 2009-04-24 09:16:20 -0400 (Fri, 24 Apr 2009)
New Revision: 26240

Added:
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/score/definition/
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/score/definition/ScoreDefinitionConfig.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/DefaultHardAndSoftConstraintScoreCalculator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/AbstractScoreDefinition.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/HardAndSoftScoreDefinition.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/ScoreDefinition.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/SimpleScoreDefinition.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/score/definition/
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/score/definition/HardAndSoftScoreDefinitionTest.java
Removed:
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/evaluation/
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/AbstractHardAndSoftConstraintScoreCalculator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/DynamicHardAndSoftConstraintScoreCalculator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/StaticHardAndSoftConstraintScoreCalculator.java
Modified:
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/benchmark/SolverBenchmark.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/benchmark/SolverBenchmarkResult.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/LocalSearchSolverConfig.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/finish/FinishConfig.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/score/ScoreConfig.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
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/DefaultDecider.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/MoveScope.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/greatdeluge/GreatDelugeAccepter.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/simulatedannealing/SimulatedAnnealingAccepter.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/tabu/AbstractTabuAccepter.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForager.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/TopListSelector.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/finish/FeasableScoreFinish.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/DefaultHardAndSoftScore.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/DefaultSimpleScore.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/Score.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/AbstractScoreCalculator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/HardAndSoftConstraintScoreCalculator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/ScoreCalculator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/SimpleScoreCalculator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/AbstractScoreComparator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/HardAndSoftScoreComparator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/ScoreComparator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/SimpleScoreComparator.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/accepter/greatdeluge/GreatDelugeAccepterTest.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForagerTest.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
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/solver/solution/initializer/CurriculumCourseStartingSolutionInitializer.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/solution/initializer/ExaminationStartingSolutionInitializer.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/curriculumcourse/benchmark/curriculumCourseShortSolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/curriculumcourse/benchmark/curriculumCourseSolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/curriculumcourse/solver/curriculumCourseSolverConfig.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationShortSolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationSolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/lessonschedule/solver/lessonScheduleSolverConfig.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/nqueens/benchmark/nqueensSolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/nqueens/solver/nqueensSolverConfig.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/benchmark/smart/breakNl14SolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/benchmark/smart/smartTravelingTournamentSolverBenchmarkConfig.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/solver/simple/simpleTravelingTournamentSolverConfig.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/solver/smart/smartTravelingTournamentSolverConfig.xml
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/test/java/org/drools/solver/examples/nqueens/NQueensSmokeTest.java
   labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/test/resources/org/drools/solver/examples/nqueens/solver/nqueensSmokeSolverConfig.xml
   labs/jbossrules/trunk/drools-solver/src/main/assembly/docs/UpgradeFromPreviousVersionRecipe.txt
Log:
The Big Score Refactor

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/benchmark/SolverBenchmark.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/benchmark/SolverBenchmark.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/benchmark/SolverBenchmark.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -92,8 +92,8 @@
     public SolverBenchmarkResult getWorstResult() {
         SolverBenchmarkResult worstResult = null;
         for (SolverBenchmarkResult solverBenchmarkResult : solverBenchmarkResultList) {
-            if (worstResult == null || solverBenchmarkResult.getScore() < worstResult.getScore()
-                    || (solverBenchmarkResult.getScore() == worstResult.getScore()
+            if (worstResult == null || solverBenchmarkResult.getScore().compareTo(worstResult.getScore()) < 0
+                    || (solverBenchmarkResult.getScore().equals(worstResult.getScore())
                     && solverBenchmarkResult.getTimeMillesSpend() > worstResult.getTimeMillesSpend())) {
                 worstResult = solverBenchmarkResult;
             }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/benchmark/SolverBenchmarkResult.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/benchmark/SolverBenchmarkResult.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/benchmark/SolverBenchmarkResult.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -3,6 +3,7 @@
 import java.io.File;
 
 import com.thoughtworks.xstream.annotations.XStreamAlias;
+import org.drools.solver.core.score.Score;
 
 /**
  * @author Geoffrey De Smet
@@ -11,7 +12,7 @@
 public class SolverBenchmarkResult {
 
     private File unsolvedSolutionFile = null;
-    private Double score = null;
+    private Score score = null;
     private Long timeMillesSpend = null;
     private File solvedSolutionFile = null;
 
@@ -23,11 +24,11 @@
         this.unsolvedSolutionFile = unsolvedSolutionFile;
     }
 
-    public Double getScore() {
+    public Score getScore() {
         return score;
     }
 
-    public void setScore(Double score) {
+    public void setScore(Score score) {
         this.score = score;
     }
 

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/LocalSearchSolverConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/LocalSearchSolverConfig.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/LocalSearchSolverConfig.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -16,14 +16,15 @@
 import org.drools.solver.config.localsearch.decider.accepter.AccepterConfig;
 import org.drools.solver.config.localsearch.decider.forager.ForagerConfig;
 import org.drools.solver.config.localsearch.decider.selector.SelectorConfig;
-import org.drools.solver.config.localsearch.evaluation.scorecalculator.ScoreCalculatorConfig;
 import org.drools.solver.config.localsearch.finish.FinishConfig;
+import org.drools.solver.config.score.definition.ScoreDefinitionConfig;
 import org.drools.solver.core.localsearch.DefaultLocalSearchSolver;
 import org.drools.solver.core.localsearch.LocalSearchSolver;
 import org.drools.solver.core.localsearch.bestsolution.BestSolutionRecaller;
 import org.drools.solver.core.localsearch.decider.Decider;
 import org.drools.solver.core.localsearch.decider.DefaultDecider;
 import org.drools.solver.core.solution.initializer.StartingSolutionInitializer;
+import org.drools.solver.core.score.definition.ScoreDefinition;
 
 /**
  * @author Geoffrey De Smet
@@ -35,8 +36,8 @@
 
     @XStreamImplicit(itemFieldName = "scoreDrl")
     private List<String> scoreDrlList = null;
-    @XStreamAlias("scoreCalculator")
-    private ScoreCalculatorConfig scoreCalculatorConfig = new ScoreCalculatorConfig();
+    @XStreamAlias("scoreDefinition")
+    private ScoreDefinitionConfig scoreDefinitionConfig = new ScoreDefinitionConfig();
 
     private StartingSolutionInitializer startingSolutionInitializer = null;
     private Class<StartingSolutionInitializer> startingSolutionInitializerClass = null;
@@ -67,12 +68,12 @@
         this.scoreDrlList = scoreDrlList;
     }
 
-    public ScoreCalculatorConfig getScoreCalculatorConfig() {
-        return scoreCalculatorConfig;
+    public ScoreDefinitionConfig getScoreDefinitionConfig() {
+        return scoreDefinitionConfig;
     }
 
-    public void setScoreCalculatorConfig(ScoreCalculatorConfig scoreCalculatorConfig) {
-        this.scoreCalculatorConfig = scoreCalculatorConfig;
+    public void setScoreDefinitionConfig(ScoreDefinitionConfig scoreDefinitionConfig) {
+        this.scoreDefinitionConfig = scoreDefinitionConfig;
     }
 
     public StartingSolutionInitializer getStartingSolutionInitializer() {
@@ -135,10 +136,13 @@
             localSearchSolver.setRandomSeed(0L);
         }
         localSearchSolver.setRuleBase(buildRuleBase());
-        localSearchSolver.setScoreCalculator(scoreCalculatorConfig.buildScoreCalculator());
+        ScoreDefinition scoreDefinition = scoreDefinitionConfig.buildScoreDefinition();
+        localSearchSolver.setScoreDefinition(scoreDefinition);
+        // remove when score-in-solution refactor
+        localSearchSolver.setScoreCalculator(scoreDefinitionConfig.buildScoreCalculator());
         localSearchSolver.setStartingSolutionInitializer(buildStartingSolutionInitializer());
         localSearchSolver.setBestSolutionRecaller(new BestSolutionRecaller());
-        localSearchSolver.setFinish(finishConfig.buildFinish());
+        localSearchSolver.setFinish(finishConfig.buildFinish(scoreDefinition));
         localSearchSolver.setDecider(buildDecider());
         return localSearchSolver;
     }
@@ -214,10 +218,10 @@
                 }
             }
         }
-        if (scoreCalculatorConfig == null) {
-            scoreCalculatorConfig = inheritedConfig.getScoreCalculatorConfig();
-        } else if (inheritedConfig.getScoreCalculatorConfig() != null) {
-            scoreCalculatorConfig.inherit(inheritedConfig.getScoreCalculatorConfig());
+        if (scoreDefinitionConfig == null) {
+            scoreDefinitionConfig = inheritedConfig.getScoreDefinitionConfig();
+        } else if (inheritedConfig.getScoreDefinitionConfig() != null) {
+            scoreDefinitionConfig.inherit(inheritedConfig.getScoreDefinitionConfig());
         }
         if (startingSolutionInitializer == null && startingSolutionInitializerClass == null) {
             startingSolutionInitializer = inheritedConfig.getStartingSolutionInitializer();

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/finish/FinishConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/finish/FinishConfig.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/localsearch/finish/FinishConfig.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -12,6 +12,7 @@
 import org.drools.solver.core.localsearch.finish.StepCountFinish;
 import org.drools.solver.core.localsearch.finish.TimeMillisSpendFinish;
 import org.drools.solver.core.localsearch.finish.UnimprovedStepCountFinish;
+import org.drools.solver.core.score.definition.ScoreDefinition;
 
 /**
  * @author Geoffrey De Smet
@@ -29,7 +30,7 @@
     private Long maximumSecondsSpend = null;
     private Long maximumMinutesSpend = null;
     private Long maximumHouresSpend = null;
-    private Double feasableScore = null;
+    private String feasableScore = null;
     private Integer maximumUnimprovedStepCount = null;
 
     public Finish getFinish() {
@@ -96,11 +97,11 @@
         this.maximumHouresSpend = maximumHouresSpend;
     }
 
-    public Double getFeasableScore() {
+    public String getFeasableScore() {
         return feasableScore;
     }
 
-    public void setFeasableScore(Double feasableScore) {
+    public void setFeasableScore(String feasableScore) {
         this.feasableScore = feasableScore;
     }
 
@@ -116,7 +117,7 @@
     // Builder methods
     // ************************************************************************
 
-    public Finish buildFinish() {
+    public Finish buildFinish(ScoreDefinition scoreDefinition) {
         List<Finish> finishList = new ArrayList<Finish>();
         if (finish != null) {
             finishList.add(finish);
@@ -159,7 +160,7 @@
         }
         if (feasableScore != null) {
             FeasableScoreFinish finish = new FeasableScoreFinish();
-            finish.setFeasableScore(feasableScore);
+            finish.setFeasableScore(scoreDefinition.parseScore(feasableScore));
             finishList.add(finish);
         }
         if (maximumUnimprovedStepCount != null) {

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/score/ScoreConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/score/ScoreConfig.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/score/ScoreConfig.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -1,7 +1,6 @@
 package org.drools.solver.config.score;
 
 import com.thoughtworks.xstream.annotations.XStreamAlias;
-import org.drools.solver.core.score.Score;
 import org.drools.solver.core.score.DefaultSimpleScore;
 import org.drools.solver.core.score.DefaultHardAndSoftScore;
 
@@ -49,9 +48,9 @@
         } else if (scoreType != null) {
             switch (scoreType) {
                 case SIMPLE:
-                    return DefaultSimpleScore.valueOf(scoreString);
+                    return DefaultSimpleScore.parseScore(scoreString);
                 case HARD_AND_SOFT:
-                    return DefaultHardAndSoftScore.valueOf(scoreString);
+                    return DefaultHardAndSoftScore.parseScore(scoreString);
                 default:
                     throw new IllegalStateException("scoreType (" + scoreType + ") not implemented");
             }

Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/score/definition/ScoreDefinitionConfig.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/score/definition/ScoreDefinitionConfig.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/config/score/definition/ScoreDefinitionConfig.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -0,0 +1,107 @@
+package org.drools.solver.config.score.definition;
+
+import org.drools.solver.core.score.definition.ScoreDefinition;
+import org.drools.solver.core.score.definition.SimpleScoreDefinition;
+import org.drools.solver.core.score.definition.HardAndSoftScoreDefinition;
+import org.drools.solver.core.score.calculator.ScoreCalculator;
+import org.drools.solver.core.score.calculator.SimpleScoreCalculator;
+import org.drools.solver.core.score.calculator.DefaultHardAndSoftConstraintScoreCalculator;
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+
+/**
+ * @author Geoffrey De Smet
+ */
+ at XStreamAlias("scoreDefinition")
+public class ScoreDefinitionConfig {
+
+    private ScoreDefinition scoreDefinition = null;
+    private Class<ScoreDefinition> scoreDefinitionClass = null;
+    private ScoreDefinitionType scoreDefinitionType = null;
+
+    public ScoreDefinition getScoreDefinition() {
+        return scoreDefinition;
+    }
+
+    public void setScoreDefinition(ScoreDefinition scoreDefinition) {
+        this.scoreDefinition = scoreDefinition;
+    }
+
+    public Class<ScoreDefinition> getScoreDefinitionClass() {
+        return scoreDefinitionClass;
+    }
+
+    public void setScoreDefinitionClass(Class<ScoreDefinition> scoreDefinitionClass) {
+        this.scoreDefinitionClass = scoreDefinitionClass;
+    }
+
+    public ScoreDefinitionType getScoreDefinitionType() {
+        return scoreDefinitionType;
+    }
+
+    public void setScoreDefinitionType(ScoreDefinitionType scoreDefinitionType) {
+        this.scoreDefinitionType = scoreDefinitionType;
+    }
+
+    // ************************************************************************
+    // Builder methods
+    // ************************************************************************
+
+    public ScoreDefinition buildScoreDefinition() {
+        if (scoreDefinition != null) {
+            return scoreDefinition;
+        } else if (scoreDefinitionClass != null) {
+            try {
+                return scoreDefinitionClass.newInstance();
+            } catch (InstantiationException e) {
+                throw new IllegalArgumentException("scoreDefinitionClass (" + scoreDefinitionClass.getName()
+                        + ") does not have a public no-arg constructor", e);
+            } catch (IllegalAccessException e) {
+                throw new IllegalArgumentException("scoreDefinitionClass (" + scoreDefinitionClass.getName()
+                        + ") does not have a public no-arg constructor", e);
+            }
+        } else if (scoreDefinitionType != null) {
+            switch (scoreDefinitionType) {
+                case SIMPLE:
+                    return new SimpleScoreDefinition();
+                case HARD_AND_SOFT:
+                    return new HardAndSoftScoreDefinition();
+                default:
+                    throw new IllegalStateException("scoreDefinitionType (" + scoreDefinitionType + ") not implemented");
+            }
+        } else {
+            return new SimpleScoreDefinition();
+        }
+    }
+
+    /**
+     * @TODO score-in-solution refactor
+     */
+    public ScoreCalculator buildScoreCalculator() {
+        if (scoreDefinitionType != null) {
+            switch (scoreDefinitionType) {
+                case SIMPLE:
+                    return new SimpleScoreCalculator();
+                case HARD_AND_SOFT:
+                    return new DefaultHardAndSoftConstraintScoreCalculator();
+                default:
+                    throw new IllegalStateException("scoreDefinitionType (" + scoreDefinitionType + ") not implemented");
+            }
+        } else {
+            return new SimpleScoreCalculator();
+        }
+    }
+
+    public void inherit(ScoreDefinitionConfig inheritedConfig) {
+        if (scoreDefinition == null && scoreDefinitionClass == null && scoreDefinitionType == null) {
+            scoreDefinition = inheritedConfig.getScoreDefinition();
+            scoreDefinitionClass = inheritedConfig.getScoreDefinitionClass();
+            scoreDefinitionType = inheritedConfig.getScoreDefinitionType();
+        }
+    }
+
+    public static enum ScoreDefinitionType {
+        SIMPLE,
+        HARD_AND_SOFT,
+    }
+
+}

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-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/Solver.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -1,6 +1,7 @@
 package org.drools.solver.core;
 
 import org.drools.solver.core.solution.Solution;
+import org.drools.solver.core.score.Score;
 
 /**
  * A Solver solves planning problems.
@@ -10,7 +11,7 @@
 
     void setStartingSolution(Solution startingSolution);
 
-    double getBestScore();
+    Score getBestScore();
     Solution getBestSolution();
 
     /**

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-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/DefaultLocalSearchSolver.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -8,12 +8,16 @@
 import org.drools.solver.core.localsearch.finish.Finish;
 import org.drools.solver.core.move.Move;
 import org.drools.solver.core.score.calculator.ScoreCalculator;
+import org.drools.solver.core.score.Score;
+import org.drools.solver.core.score.HardAndSoftScore;
+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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
+ * Default implementation of {@link LocalSearchSolver}.
  * @author Geoffrey De Smet
  */
 public class DefaultLocalSearchSolver implements LocalSearchSolver, LocalSearchSolverLifecycleListener {
@@ -37,6 +41,10 @@
         localSearchSolverScope.setRuleBase(ruleBase);
     }
 
+    public void setScoreDefinition(ScoreDefinition scoreDefinition) {
+        localSearchSolverScope.setScoreDefinition(scoreDefinition);
+    }
+
     public void setScoreCalculator(ScoreCalculator scoreCalculator) {
         localSearchSolverScope.setWorkingScoreCalculator(scoreCalculator);
     }
@@ -72,7 +80,7 @@
         localSearchSolverScope.setWorkingSolution(startingSolution);
     }
 
-    public double getBestScore() {
+    public Score getBestScore() {
         return this.localSearchSolverScope.getBestScore();
     }
 

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-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/LocalSearchSolverScope.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -6,6 +6,8 @@
 import org.drools.StatefulSession;
 import org.drools.WorkingMemory;
 import org.drools.solver.core.score.calculator.ScoreCalculator;
+import org.drools.solver.core.score.Score;
+import org.drools.solver.core.score.definition.ScoreDefinition;
 import org.drools.solver.core.solution.Solution;
 
 /**
@@ -16,6 +18,7 @@
     public static final String GLOBAL_SCORE_CALCULATOR_KEY = "scoreCalculator";
 
     protected RuleBase ruleBase;
+    private ScoreDefinition scoreDefinition;
 
     private long startingSystemTimeMillis;
 
@@ -24,18 +27,30 @@
     private ScoreCalculator workingScoreCalculator;
     private Random workingRandom;
 
-    private double startingScore;
+    private Score startingScore;
 
     private int bestSolutionStepIndex;
     private Solution bestSolution;
-    private double bestScore;
+    private Score bestScore;
 
     private StepScope lastCompletedStepScope;
 
+    public RuleBase getRuleBase() {
+        return ruleBase;
+    }
+
     public void setRuleBase(RuleBase ruleBase) {
         this.ruleBase = ruleBase;
     }
 
+    public ScoreDefinition getScoreDefinition() {
+        return scoreDefinition;
+    }
+
+    public void setScoreDefinition(ScoreDefinition scoreDefinition) {
+        this.scoreDefinition = scoreDefinition;
+    }
+
     public long getStartingSystemTimeMillis() {
         return startingSystemTimeMillis;
     }
@@ -73,11 +88,11 @@
         this.workingRandom = workingRandom;
     }
 
-    public double getStartingScore() {
+    public Score getStartingScore() {
         return startingScore;
     }
 
-    public void setStartingScore(double startingScore) {
+    public void setStartingScore(Score startingScore) {
         this.startingScore = startingScore;
     }
 
@@ -97,11 +112,11 @@
         this.bestSolution = bestSolution;
     }
 
-    public double getBestScore() {
+    public Score getBestScore() {
         return bestScore;
     }
 
-    public void setBestScore(double bestScore) {
+    public void setBestScore(Score bestScore) {
         this.bestScore = bestScore;
     }
 
@@ -117,9 +132,9 @@
     // Calculated methods
     // ************************************************************************
 
-    public double calculateScoreFromWorkingMemory() {
+    public Score calculateScoreFromWorkingMemory() {
         workingMemory.fireAllRules();
-        return workingScoreCalculator.calculateStepScore();
+        return workingScoreCalculator.calculateScore();
     }
 
     public void resetTimeMillisSpend() {

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-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/StepScope.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -5,6 +5,7 @@
 import org.drools.WorkingMemory;
 import org.drools.solver.core.move.Move;
 import org.drools.solver.core.solution.Solution;
+import org.drools.solver.core.score.Score;
 
 /**
  * @author Geoffrey De Smet
@@ -17,7 +18,7 @@
     private double timeGradient = Double.NaN;
     private Move step = null;
     private Move undoStep = null;
-    private double score = Double.NaN;
+    private Score score = null;
     private Solution clonedSolution = null;
 
     public StepScope(LocalSearchSolverScope localSearchSolverScope) {
@@ -60,11 +61,11 @@
         this.undoStep = undoStep;
     }
 
-    public double getScore() {
+    public Score getScore() {
         return score;
     }
 
-    public void setScore(double score) {
+    public void setScore(Score score) {
         this.score = score;
     }
 
@@ -75,6 +76,7 @@
     public void setClonedSolution(Solution clonedSolution) {
         this.clonedSolution = clonedSolution;
     }
+
     // ************************************************************************
     // Calculated methods
     // ************************************************************************

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-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/bestsolution/BestSolutionRecaller.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -5,6 +5,7 @@
 import org.drools.solver.core.localsearch.LocalSearchSolverLifecycleListener;
 import org.drools.solver.core.localsearch.LocalSearchSolverScope;
 import org.drools.solver.core.localsearch.StepScope;
+import org.drools.solver.core.score.Score;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -27,7 +28,7 @@
     // ************************************************************************
 
     public void solvingStarted(LocalSearchSolverScope localSearchSolverScope) {
-        double initialScore = localSearchSolverScope.getStartingScore();
+        Score initialScore = localSearchSolverScope.getStartingScore();
         logger.info("Initialization time spend ({}) for score ({}). Updating best solution and best score.",
                 localSearchSolverScope.calculateTimeMillisSpend(), initialScore);
         localSearchSolverScope.setBestSolutionStepIndex(-1);
@@ -43,9 +44,9 @@
 
     public void stepTaken(StepScope stepScope) {
         LocalSearchSolverScope localSearchSolverScope = stepScope.getLocalSearchSolverScope();
-        double newScore = stepScope.getScore();
-        double bestScore = localSearchSolverScope.getBestScore();
-        if (newScore > bestScore) {
+        Score newScore = stepScope.getScore();
+        Score bestScore = localSearchSolverScope.getBestScore();
+        if (newScore.compareTo(bestScore) > 0) {
             logger.info("New score ({}) is better then last best score ({}). Updating best solution and best score.",
                     newScore, bestScore);
             localSearchSolverScope.setBestSolutionStepIndex(stepScope.getStepIndex());

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/DefaultDecider.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/DefaultDecider.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/DefaultDecider.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -10,6 +10,7 @@
 import org.drools.solver.core.localsearch.decider.forager.Forager;
 import org.drools.solver.core.localsearch.decider.selector.Selector;
 import org.drools.solver.core.move.Move;
+import org.drools.solver.core.score.Score;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -104,9 +105,9 @@
         processMove(moveScope);
         undoMove.doMove(workingMemory);
         if (verifyUndoMoveIsUncorrupted) {
-            double undoScore = moveScope.getStepScope().getLocalSearchSolverScope().calculateScoreFromWorkingMemory();
-            if (undoScore != moveScope.getStepScope().getLocalSearchSolverScope()
-                    .getLastCompletedStepScope().getScore()) {
+            Score undoScore = moveScope.getStepScope().getLocalSearchSolverScope().calculateScoreFromWorkingMemory();
+            if (!undoScore.equals(moveScope.getStepScope().getLocalSearchSolverScope()
+                    .getLastCompletedStepScope().getScore())) {
                 throw new IllegalStateException(
                         "Corrupted undo move (" + undoMove + ") received from move (" + move + ").");
             }
@@ -116,7 +117,7 @@
     }
 
     private void processMove(MoveScope moveScope) {
-        double score = moveScope.getStepScope().getLocalSearchSolverScope().calculateScoreFromWorkingMemory();
+        Score score = moveScope.getStepScope().getLocalSearchSolverScope().calculateScoreFromWorkingMemory();
         moveScope.setScore(score);
         double acceptChance = accepter.calculateAcceptChance(moveScope);
         moveScope.setAcceptChance(acceptChance);

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/MoveScope.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/MoveScope.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/MoveScope.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -6,6 +6,8 @@
 import org.drools.solver.core.localsearch.StepScope;
 import org.drools.solver.core.move.Move;
 import org.drools.solver.core.solution.Solution;
+import org.drools.solver.core.score.Score;
+import org.drools.solver.core.score.DefaultHardAndSoftScore;
 
 /**
  * @author Geoffrey De Smet
@@ -16,8 +18,7 @@
     private Move move = null;
     private Move undoMove = null;
     private double acceptChance = Double.NaN;
-    private double score = Double.NEGATIVE_INFINITY;
-    private double decisionScore = Double.NaN;
+    private Score score = DefaultHardAndSoftScore.valueOf(Integer.MIN_VALUE, Integer.MIN_VALUE);
 
     public MoveScope(StepScope stepScope) {
         this.stepScope = stepScope;
@@ -51,22 +52,14 @@
         this.acceptChance = acceptChance;
     }
 
-    public double getScore() {
+    public Score getScore() {
         return score;
     }
 
-    public void setScore(double score) {
+    public void setScore(Score score) {
         this.score = score;
     }
 
-    public double getDecisionScore() {
-        return decisionScore;
-    }
-
-    public void setDecisionScore(double decisionScore) {
-        this.decisionScore = decisionScore;
-    }
-
     // ************************************************************************
     // Calculated methods
     // ************************************************************************

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/greatdeluge/GreatDelugeAccepter.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/greatdeluge/GreatDelugeAccepter.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/greatdeluge/GreatDelugeAccepter.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -4,8 +4,10 @@
 import org.drools.solver.core.localsearch.StepScope;
 import org.drools.solver.core.localsearch.decider.MoveScope;
 import org.drools.solver.core.localsearch.decider.accepter.AbstractAccepter;
+import org.drools.solver.core.score.Score;
 
 /**
+ * TODO Under construction. Feel free to create a patch to improve this accepter!
  * @author Geoffrey De Smet
  */
 public class GreatDelugeAccepter extends AbstractAccepter {
@@ -14,18 +16,12 @@
     protected final double waterRisingRate;
     // TODO lowerboundRate when waterLevel rises on every MoveScope (not just every step) to reset waterlevel to upperbound
 //    protected final double waterLevelLowerBoundRate;
-    protected final double perfectScore;
 
-    protected double waterLevelScore = Double.NaN;
+    protected Score waterLevelScore = null;
 
     public GreatDelugeAccepter(double waterLevelUpperBoundRate, double waterRisingRate) {
-        this(waterLevelUpperBoundRate, waterRisingRate, 0.0);
-    }
-
-    public GreatDelugeAccepter(double waterLevelUpperBoundRate, double waterRisingRate, double perfectScore) {
         this.waterLevelUpperBoundRate = waterLevelUpperBoundRate;
         this.waterRisingRate = waterRisingRate;
-        this.perfectScore = perfectScore;
     }
 
     // ************************************************************************
@@ -42,27 +38,32 @@
             throw new IllegalArgumentException("The greatDelugeWaterRisingRate (" + waterRisingRate
                     + ") should be between 0.0 and 1.0 (preferably very close to 0.0).");
         }
-        waterLevelScore = localSearchSolverScope.getBestScore() * waterLevelUpperBoundRate;
-        if (waterLevelScore >= perfectScore) {
+        waterLevelScore = localSearchSolverScope.getBestScore().multiply(waterLevelUpperBoundRate);
+        Score perfectMaximumScore = localSearchSolverScope.getScoreDefinition().getPerfectMaximumScore();
+        if (waterLevelScore.compareTo(perfectMaximumScore) > 0) {
             throw new IllegalArgumentException("The waterLevelScore (" + waterLevelScore
-                    + ") should be higher than the perfectScore(" + perfectScore + ").");
+                    + ") should not be higher than the perfectMaximumScore(" + perfectMaximumScore + ").");
         }
     }
 
     public double calculateAcceptChance(MoveScope moveScope) {
-        if (moveScope.getScore() >= waterLevelScore) {
+        if (moveScope.getScore().compareTo(waterLevelScore) >= 0) {
             return 1.0;
+        } else {
+            return 0.0;
         }
-        return 0.0;
     }
 
     @Override
     public void stepTaken(StepScope stepScope) {
         if (stepScope.getStepIndex() == stepScope.getLocalSearchSolverScope().getBestSolutionStepIndex()) {
             // New best score
-            waterLevelScore = stepScope.getLocalSearchSolverScope().getBestScore() * waterLevelUpperBoundRate;
+            waterLevelScore = stepScope.getLocalSearchSolverScope().getBestScore().multiply(waterLevelUpperBoundRate);
         } else {
-            waterLevelScore += (perfectScore - waterLevelScore) * waterRisingRate;
+            Score perfectMaximumScore = stepScope.getLocalSearchSolverScope().getScoreDefinition()
+                    .getPerfectMaximumScore();
+            Score waterLevelAugend = perfectMaximumScore.substract(waterLevelScore).multiply(waterRisingRate);
+            waterLevelScore = waterLevelScore.add(waterLevelAugend);
             // TODO maybe if waterlevel is higher than bestScore, than ...
         }
     }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/simulatedannealing/SimulatedAnnealingAccepter.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/simulatedannealing/SimulatedAnnealingAccepter.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/simulatedannealing/SimulatedAnnealingAccepter.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -2,20 +2,17 @@
 
 import org.drools.solver.core.localsearch.decider.MoveScope;
 import org.drools.solver.core.localsearch.decider.accepter.AbstractAccepter;
+import org.drools.solver.core.localsearch.LocalSearchSolverScope;
+import org.drools.solver.core.score.Score;
 
 /**
- * TODO Under construction
+ * TODO Under construction. Feel free to create a patch to improve this accepter!
  * @author Geoffrey De Smet
  */
 public class SimulatedAnnealingAccepter extends AbstractAccepter {
 
-    protected double scoreDeltaNormalizer = 10000.0;
     protected boolean compareToBestScore = false;
 
-    public void setScoreDeltaNormalizer(double scoreDeltaNormalizer) {
-        this.scoreDeltaNormalizer = scoreDeltaNormalizer;
-    }
-
     public void setCompareToBestScore(boolean compareToBestScore) {
         this.compareToBestScore = compareToBestScore;
     }
@@ -25,20 +22,22 @@
     // ************************************************************************
 
     public double calculateAcceptChance(MoveScope moveScope) {
-        double compareScore = compareToBestScore
+        Score compareScore = compareToBestScore
                 ? moveScope.getStepScope().getLocalSearchSolverScope().getBestScore()
                 : moveScope.getStepScope().getLocalSearchSolverScope().getLastCompletedStepScope().getScore();
         // TODO Support for decision score
-        double scoreDelta = moveScope.getScore() - compareScore;
-        if (scoreDelta > 0.0) { // TODO if scoreDelta 0 then it will end up 1.0 anyway?
+        Score moveScore = moveScope.getScore();
+        if (moveScore.compareTo(compareScore) > 0) {
+            // It's better so accept it.
             return 1.0;
-        } else {
-            double timeGradient = moveScope.getStepScope().getTimeGradient();
-            double acceptChance = Math.exp(scoreDelta * timeGradient / scoreDeltaNormalizer);
-//            double acceptChance = Math.min(Math.exp(scoreDelta / scoreDeltaNormalizer), 1.0) * (1.0 - timeGradient);
-            // Math.min(acceptChance, 1.0) is oboselete because scoreDelta <= 0.0
-            return acceptChance;
         }
+        double timeGradient = moveScope.getStepScope().getTimeGradient();
+        LocalSearchSolverScope localSearchSolverScope = moveScope.getStepScope().getLocalSearchSolverScope();
+        // TODO This algorithm might be nice, but the normal temparture based algorithm should also be possible
+        double scoreDelta = 1.0 - localSearchSolverScope.getScoreDefinition().calculateTimeGradient(
+                localSearchSolverScope.getStartingScore(), compareScore, moveScore);
+        double acceptChance = Math.exp(timeGradient * scoreDelta);
+        return acceptChance;
     }
     
 }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/tabu/AbstractTabuAccepter.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/tabu/AbstractTabuAccepter.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/accepter/tabu/AbstractTabuAccepter.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -78,7 +78,7 @@
             return 1.0;
         }
         if (aspirationEnabled
-                && moveScope.getScore() > moveScope.getStepScope().getLocalSearchSolverScope().getBestScore()) {
+                && moveScope.getScore().compareTo(moveScope.getStepScope().getLocalSearchSolverScope().getBestScore()) > 0) {
             logger.debug("    Proposed move ({}) is tabu, but aspiration undoes its tabu.", moveScope.getMove());
             return 1.0;
         }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForager.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForager.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForager.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -8,6 +8,7 @@
 import org.drools.solver.core.localsearch.StepScope;
 import org.drools.solver.core.localsearch.decider.MoveScope;
 import org.drools.solver.core.move.Move;
+import org.drools.solver.core.score.Score;
 
 /**
  * An AcceptedForager is a Forager which forages accepted moves and ignores unaccepted moves.
@@ -24,7 +25,7 @@
 
     protected List<MoveScope> acceptedList;
     protected boolean listSorted;
-    protected double maxScore;
+    protected Score maxScore;
     protected double acceptChanceMaxScoreTotal;
 
     protected MoveScope earlyPickedMoveScope = null;
@@ -52,7 +53,7 @@
     public void beforeDeciding(StepScope stepScope) {
         acceptedList = new ArrayList<MoveScope>(); // TODO use size of moveList in decider
         listSorted = false;
-        maxScore = Double.NEGATIVE_INFINITY;
+        maxScore = stepScope.getLocalSearchSolverScope().getScoreDefinition().getPerfectMinimumScore();
         acceptChanceMaxScoreTotal = 0.0;
         earlyPickedMoveScope = null;
     }
@@ -69,13 +70,13 @@
             case NONE:
                 break;
             case FIRST_BEST_SCORE_IMPROVING:
-                if (moveScope.getScore() > moveScope.getStepScope().getLocalSearchSolverScope().getBestScore()) {
+                if (moveScope.getScore().compareTo(moveScope.getStepScope().getLocalSearchSolverScope().getBestScore()) > 0) {
                     earlyPickedMoveScope = moveScope;
                 }
                 break;
             case FIRST_LAST_STEP_SCORE_IMPROVING:
-                if (moveScope.getScore() > moveScope.getStepScope().getLocalSearchSolverScope()
-                        .getLastCompletedStepScope().getScore()) {
+                if (moveScope.getScore().compareTo(moveScope.getStepScope().getLocalSearchSolverScope()
+                        .getLastCompletedStepScope().getScore()) > 0) {
                     earlyPickedMoveScope = moveScope;
                 }
                 break;
@@ -97,10 +98,10 @@
     protected void addMoveScopeToAcceptedList(MoveScope moveScope) {
         acceptedList.add(moveScope);
         listSorted = false;
-        if (moveScope.getScore() > maxScore) {
+        if (moveScope.getScore().compareTo(maxScore) > 0) {
             acceptChanceMaxScoreTotal = moveScope.getAcceptChance();
             maxScore = moveScope.getScore();
-        } else if (moveScope.getScore() == maxScore) {
+        } else if (moveScope.getScore().equals(maxScore)) {
             acceptChanceMaxScoreTotal += moveScope.getAcceptChance();
         }
     }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/TopListSelector.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/TopListSelector.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/decider/selector/TopListSelector.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -36,7 +36,7 @@
 
     @Override
     public void stepTaken(StepScope stepScope) {
-        // TODO fixme
+        // TODO FIXME: it shouldn't know DefaultLocalSearchSolver that intemitly
         topList = ((DefaultLocalSearchSolver) localSearchSolver).getDecider().getForager().getTopList(topSize);
     }
 

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/finish/FeasableScoreFinish.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/finish/FeasableScoreFinish.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/localsearch/finish/FeasableScoreFinish.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -2,15 +2,16 @@
 
 import org.drools.solver.core.localsearch.LocalSearchSolverScope;
 import org.drools.solver.core.localsearch.StepScope;
+import org.drools.solver.core.score.Score;
 
 /**
  * @author Geoffrey De Smet
  */
 public class FeasableScoreFinish extends AbstractFinish {
 
-    private double feasableScore;
+    private Score feasableScore;
     
-    public void setFeasableScore(double feasableScore) {
+    public void setFeasableScore(Score feasableScore) {
         this.feasableScore = feasableScore;
     }
 
@@ -19,21 +20,16 @@
     // ************************************************************************
 
     public boolean isFinished(StepScope stepScope) {
-        double bestScore = stepScope.getLocalSearchSolverScope().getBestScore();
-        return bestScore >= feasableScore;
+        Score bestScore = stepScope.getLocalSearchSolverScope().getBestScore();
+        return bestScore.compareTo(feasableScore) >= 0;
     }
 
     public double calculateTimeGradient(StepScope stepScope) {
         LocalSearchSolverScope localSearchSolverScope = stepScope.getLocalSearchSolverScope();
-        double startingScore = localSearchSolverScope.getStartingScore();
-        double stepScore = localSearchSolverScope.getLastCompletedStepScope().getScore();
-        if (feasableScore <= stepScore) {
-            return 1.0;
-        } else if (stepScore <= startingScore) {
-            return 0.0;
-        } else {
-            return (stepScore - startingScore) / (feasableScore - startingScore);
-        }
+        Score startingScore = localSearchSolverScope.getStartingScore();
+        Score stepScore = localSearchSolverScope.getLastCompletedStepScope().getScore();
+        return localSearchSolverScope.getScoreDefinition()
+                .calculateTimeGradient(startingScore, feasableScore, stepScore);
     }
     
 }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/DefaultHardAndSoftScore.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/DefaultHardAndSoftScore.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/DefaultHardAndSoftScore.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -4,6 +4,7 @@
  * Default implementation of {@link HardAndSoftScore}.
  * <p/>
  * This class is immutable.
+ * @see HardAndSoftScore
  * @author Geoffrey De Smet
  */
 public final class DefaultHardAndSoftScore extends AbstractScore<HardAndSoftScore>
@@ -12,7 +13,7 @@
     private static final String HARD_LABEL = "hard";
     private static final String SOFT_LABEL = "soft";
 
-    public static Score valueOf(String scoreString) {
+    public static DefaultHardAndSoftScore parseScore(String scoreString) {
         String[] scoreTokens = scoreString.split(HARD_LABEL + "\\/");
         if (scoreTokens.length != 2 || !scoreTokens[1].endsWith(SOFT_LABEL)) {
             throw new IllegalArgumentException("The scoreString (" + scoreString
@@ -23,11 +24,11 @@
         return valueOf(hardScore, softScore);
     }
 
-    public static Score valueOf(int hardScore) {
+    public static DefaultHardAndSoftScore valueOf(int hardScore) {
         return new DefaultHardAndSoftScore(hardScore);
     }
 
-    public static Score valueOf(int hardScore, int softScore) {
+    public static DefaultHardAndSoftScore valueOf(int hardScore, int softScore) {
         return new DefaultHardAndSoftScore(hardScore, softScore);
     }
 
@@ -56,8 +57,28 @@
     // Worker methods
     // ************************************************************************
 
+    public HardAndSoftScore add(HardAndSoftScore augend) {
+        return new DefaultHardAndSoftScore(this.hardScore + augend.getHardScore(),
+                this.softScore + augend.getSoftScore());
+    }
+
+    public HardAndSoftScore substract(HardAndSoftScore subtrahend) {
+        return new DefaultHardAndSoftScore(this.hardScore - subtrahend.getHardScore(),
+                this.softScore - subtrahend.getSoftScore());
+    }
+
+    public HardAndSoftScore multiply(double multiplicand) {
+        return new DefaultHardAndSoftScore((int) Math.round(this.hardScore * multiplicand),
+                (int) Math.round(this.softScore * multiplicand));
+    }
+
+    public HardAndSoftScore divide(double divisor) {
+        return new DefaultHardAndSoftScore((int) Math.round(this.hardScore / divisor),
+                (int) Math.round(this.softScore / divisor));
+    }
+
     public boolean equals(Object o) {
-        // A direct implementation (instead of EqualsBuilder) for to avoid dependencies
+        // A direct implementation (instead of EqualsBuilder) to avoid dependencies
         if (this == o) {
             return true;
         } else if (o instanceof HardAndSoftScore) {
@@ -70,12 +91,12 @@
     }
 
     public int hashCode() {
-        // A direct implementation (instead of HashCodeBuilder) for to avoid dependencies
+        // A direct implementation (instead of HashCodeBuilder) to avoid dependencies
         return (((17 * 37) + hardScore)) * 37 + softScore;
     }
 
     public int compareTo(HardAndSoftScore other) {
-        // A direct implementation (instead of CompareToBuilder) for to avoid dependencies
+        // A direct implementation (instead of CompareToBuilder) to avoid dependencies
         if (hardScore != other.getHardScore()) {
             if (hardScore < other.getHardScore()) {
                 return -1;

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/DefaultSimpleScore.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/DefaultSimpleScore.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/DefaultSimpleScore.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -7,17 +7,18 @@
  * Default implementation of {@link SimpleScore}.
  * <p/>
  * This class is immutable.
+ * @see SimpleScore
  * @author Geoffrey De Smet
  */
 public final class DefaultSimpleScore extends AbstractScore<SimpleScore>
         implements SimpleScore {
 
-    public static Score valueOf(int score) {
-        return new DefaultSimpleScore(score);
+    public static DefaultSimpleScore parseScore(String scoreString) {
+        return valueOf(Integer.parseInt(scoreString));
     }
 
-    public static Score valueOf(String scoreString) {
-        return valueOf(Integer.parseInt(scoreString));
+    public static DefaultSimpleScore valueOf(int score) {
+        return new DefaultSimpleScore(score);
     }
 
     private final int score;
@@ -34,8 +35,24 @@
     // Worker methods
     // ************************************************************************
 
+    public SimpleScore add(SimpleScore augend) {
+        return new DefaultSimpleScore(this.score + augend.getScore());
+    }
+
+    public SimpleScore substract(SimpleScore subtrahend) {
+        return new DefaultSimpleScore(this.score - subtrahend.getScore());
+    }
+
+    public SimpleScore multiply(double multiplicand) {
+        return new DefaultSimpleScore((int) Math.round(this.score * multiplicand));
+    }
+
+    public SimpleScore divide(double divisor) {
+        return new DefaultSimpleScore((int) Math.round(this.score / divisor));
+    }
+
     public boolean equals(Object o) {
-        // A direct implementation (instead of EqualsBuilder) for to avoid dependencies
+        // A direct implementation (instead of EqualsBuilder) to avoid dependencies
         if (this == o) {
             return true;
         } else if (o instanceof SimpleScore) {
@@ -47,12 +64,12 @@
     }
 
     public int hashCode() {
-        // A direct implementation (instead of HashCodeBuilder) for to avoid dependencies
+        // A direct implementation (instead of HashCodeBuilder) to avoid dependencies
         return (17 * 37) + score;
     }
 
     public int compareTo(SimpleScore other) {
-        // A direct implementation (instead of CompareToBuilder) for to avoid dependencies
+        // A direct implementation (instead of CompareToBuilder) to avoid dependencies
        if (score < other.getScore()) {
            return -1;
        } else if (score > other.getScore()) {

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/Score.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/Score.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/Score.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -10,4 +10,34 @@
  */
 public interface Score<S extends Score> extends Comparable<S> {
 
+    /**
+     * Returns a Score whose value is (this + augend).
+     * @param augend value to be added to this Score
+     * @return this + augend
+     */
+    S add(S augend);
+
+    /**
+     * Returns a Score whose value is (this - subtrahend).
+     * @param subtrahend value to be subtracted from this Score
+     * @return this - subtrahend, rounded as necessary
+     */
+    S substract(S subtrahend);
+
+    /**
+     * Returns a Score whose value is (this × multiplicand).
+     * Rounding will be applied as needed.
+     * @param multiplicand value to be multiplied by this Score.
+     * @return this * multiplicand
+     */
+    S multiply(double  multiplicand);
+
+    /**
+     * Returns a Score whose value is (this / divisor).
+     * Rounding will be applied as needed.
+     * @param divisor value by which this Score is to be divided
+     * @return this / divisor
+     */
+    S divide(double divisor);
+
 }

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/AbstractHardAndSoftConstraintScoreCalculator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/AbstractHardAndSoftConstraintScoreCalculator.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/AbstractHardAndSoftConstraintScoreCalculator.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -1,38 +0,0 @@
-package org.drools.solver.core.score.calculator;
-
-/**
- * @author Geoffrey De Smet
- */
-public abstract class AbstractHardAndSoftConstraintScoreCalculator extends AbstractScoreCalculator
-        implements HardAndSoftConstraintScoreCalculator {
-
-    protected int hardConstraintsBroken;
-    protected int softConstraintsBroken;
-
-    public int getHardConstraintsBroken() {
-        return hardConstraintsBroken;
-    }
-
-    public void setHardConstraintsBroken(int hardConstraintsBroken) {
-        this.hardConstraintsBroken = hardConstraintsBroken;
-    }
-
-    public int getSoftConstraintsBroken() {
-        return softConstraintsBroken;
-    }
-
-    public void setSoftConstraintsBroken(int softConstraintsBroken) {
-        this.softConstraintsBroken = softConstraintsBroken;
-    }
-
-    // ************************************************************************
-    // Worker methods
-    // ************************************************************************
-
-    public double calculateHardAndSoftConstraintScore(double hardConstraintsWeight) {
-        double constraintsBroken = ((double) hardConstraintsBroken) * hardConstraintsWeight;
-        constraintsBroken += (double) softConstraintsBroken;
-        return -constraintsBroken;
-    }
-
-}

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/AbstractScoreCalculator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/AbstractScoreCalculator.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/AbstractScoreCalculator.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -12,8 +12,4 @@
     // Worker methods
     // ************************************************************************
 
-    public double calculateDecisionScore() {
-        return calculateStepScore();
-    }
-
 }

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/DefaultHardAndSoftConstraintScoreCalculator.java (from rev 26022, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/AbstractHardAndSoftConstraintScoreCalculator.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/DefaultHardAndSoftConstraintScoreCalculator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/DefaultHardAndSoftConstraintScoreCalculator.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -0,0 +1,39 @@
+package org.drools.solver.core.score.calculator;
+
+import org.drools.solver.core.score.Score;
+import org.drools.solver.core.score.DefaultHardAndSoftScore;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class DefaultHardAndSoftConstraintScoreCalculator extends AbstractScoreCalculator
+        implements HardAndSoftConstraintScoreCalculator {
+
+    protected int hardConstraintsBroken;
+    protected int softConstraintsBroken;
+
+    public int getHardConstraintsBroken() {
+        return hardConstraintsBroken;
+    }
+
+    public void setHardConstraintsBroken(int hardConstraintsBroken) {
+        this.hardConstraintsBroken = hardConstraintsBroken;
+    }
+
+    public int getSoftConstraintsBroken() {
+        return softConstraintsBroken;
+    }
+
+    public void setSoftConstraintsBroken(int softConstraintsBroken) {
+        this.softConstraintsBroken = softConstraintsBroken;
+    }
+
+    // ************************************************************************
+    // Worker methods
+    // ************************************************************************
+
+    public Score calculateScore() {
+        return DefaultHardAndSoftScore.valueOf(-hardConstraintsBroken, -softConstraintsBroken);
+    }
+
+}

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/DynamicHardAndSoftConstraintScoreCalculator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/DynamicHardAndSoftConstraintScoreCalculator.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/DynamicHardAndSoftConstraintScoreCalculator.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -1,66 +0,0 @@
-package org.drools.solver.core.score.calculator;
-
-/**
- * @author Geoffrey De Smet
- */
-public class DynamicHardAndSoftConstraintScoreCalculator extends AbstractHardAndSoftConstraintScoreCalculator {
-
-    private double decisionHardConstraintsWeight;
-    private double minHardConstraintsWeight;
-    private double maxHardConstraintsWeight;
-    private double hardConstraintsWeightStepAdjustment;
-
-    public DynamicHardAndSoftConstraintScoreCalculator() {
-        this(1000000.0);
-    }
-
-    public DynamicHardAndSoftConstraintScoreCalculator(double startHardConstraintsWeight) {
-        this(startHardConstraintsWeight, startHardConstraintsWeight / 1000.0, startHardConstraintsWeight);
-    }
-
-    public DynamicHardAndSoftConstraintScoreCalculator(double startHardConstraintsWeight, double minHardConstraintsWeight, double maxHardConstraintsWeight) {
-        this(startHardConstraintsWeight, minHardConstraintsWeight, maxHardConstraintsWeight, 1.2);
-    }
-
-    public DynamicHardAndSoftConstraintScoreCalculator(double startHardConstraintsWeight,
-            double minHardConstraintsWeight, double maxHardConstraintsWeight,
-            double hardConstraintsWeightStepAdjustment) {
-        if (minHardConstraintsWeight > startHardConstraintsWeight) {
-            throw new IllegalArgumentException("minHardConstraintsWeight (" + minHardConstraintsWeight
-                    + ") cannot be larger than startHardConstraintsWeight(" + startHardConstraintsWeight + ").");
-        }
-        if (startHardConstraintsWeight > maxHardConstraintsWeight) {
-            throw new IllegalArgumentException("startHardConstraintsWeight (" + startHardConstraintsWeight
-                    + ") cannot be larger than maxHardConstraintsWeight(" + maxHardConstraintsWeight + ").");
-        }
-        this.decisionHardConstraintsWeight = startHardConstraintsWeight;
-        this.minHardConstraintsWeight = minHardConstraintsWeight;
-        this.maxHardConstraintsWeight = maxHardConstraintsWeight;
-        this.hardConstraintsWeightStepAdjustment = hardConstraintsWeightStepAdjustment;
-    }
-
-    // ************************************************************************
-    // Worker methods
-    // ************************************************************************
-
-    public double calculateStepScore() {
-        adjustDecisionHardConstraintsWeight();
-        return calculateHardAndSoftConstraintScore(maxHardConstraintsWeight); // the step score is always calculated on the maximum
-    }
-
-    private void adjustDecisionHardConstraintsWeight() {
-        if (hardConstraintsBroken == 0) {
-            decisionHardConstraintsWeight /= hardConstraintsWeightStepAdjustment;
-            decisionHardConstraintsWeight = Math.max(decisionHardConstraintsWeight, minHardConstraintsWeight);
-        } else {
-            decisionHardConstraintsWeight *= hardConstraintsWeightStepAdjustment;
-            decisionHardConstraintsWeight = Math.min(decisionHardConstraintsWeight, maxHardConstraintsWeight);
-        }
-    }
-
-    @Override
-    public double calculateDecisionScore() {
-        return calculateHardAndSoftConstraintScore(decisionHardConstraintsWeight);
-    }
-    
-}

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/HardAndSoftConstraintScoreCalculator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/HardAndSoftConstraintScoreCalculator.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/HardAndSoftConstraintScoreCalculator.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -1,6 +1,7 @@
 package org.drools.solver.core.score.calculator;
 
 /**
+ * @TODO rename to HardAndSoftScoreCalculator if it survives the score-in-solution refactor
  * @author Geoffrey De Smet
  */
 public interface HardAndSoftConstraintScoreCalculator extends ScoreCalculator {

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/ScoreCalculator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/ScoreCalculator.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/ScoreCalculator.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -1,14 +1,17 @@
 package org.drools.solver.core.score.calculator;
 
+import org.drools.solver.core.score.Score;
+
 /**
  * Evaluates a solution based on its WorkingMemory (which is part of the rule production system).
+ * @TODO score-in-solution refactor
  * @author Geoffrey De Smet
  */
 public interface ScoreCalculator {
 
     /**
-     * Calculates the step score: the solution (encountered at a step)
-     * with the highest step score will be seen as the the best solution.
+     * Calculates the score: the solution (encountered at a step)
+     * with the highest score will be seen as the the best solution.
      * </p>
      * The step score calculation should be kept stable over all steps.
      * </p>
@@ -16,26 +19,8 @@
      * the WorkingMemory's FactHandles should have been correctly notified.
      * Before the score is calculated, all rules are fired,
      * which should trigger an update of this instance.
-     * @return the step score of the solution
+     * @return never null, the score of the solution
      */
-    double calculateStepScore();
+    Score calculateScore();
 
-    /**
-     * Calculates the decision score: the move with the highest decision score
-     * will be chosen as the next step (provided it is accepted by the accepter of course).
-     * </p>
-     * The decision score calculation should be kept stable in a single step decision,
-     * but it can change between steps.
-     * For example: the weight of hard constraints can be lowered (hightened) if few (many) are broken
-     * to allow to pass through (avoid) hard constraint solution zones.
-     * </p>
-     * When the solution is modified during a Move,
-     * the WorkingMemory's FactHandles should have been correctly notified.
-     * Before the score is calculated, all rules are fired,
-     * which should trigger an update of this instance.
-     * @return the decision score of the solution, ussually the same as the step score
-     * @see AbstractScoreCalculator
-     */
-    double calculateDecisionScore();
-    
 }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/SimpleScoreCalculator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/SimpleScoreCalculator.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/SimpleScoreCalculator.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -1,17 +1,20 @@
 package org.drools.solver.core.score.calculator;
 
+import org.drools.solver.core.score.Score;
+import org.drools.solver.core.score.DefaultSimpleScore;
+
 /**
  * @author Geoffrey De Smet
  */
 public class SimpleScoreCalculator extends AbstractScoreCalculator {
 
-    private double score;
+    private int score;
 
-    public double getScore() {
+    public int getScore() {
         return score;
     }
 
-    public void setScore(double score) {
+    public void setScore(int score) {
         this.score = score;
     }
 
@@ -19,8 +22,8 @@
     // Worker methods
     // ************************************************************************
 
-    public double calculateStepScore() {
-        return score;
+    public Score calculateScore() {
+        return DefaultSimpleScore.valueOf(score);
     }
 
 }

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/StaticHardAndSoftConstraintScoreCalculator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/StaticHardAndSoftConstraintScoreCalculator.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/calculator/StaticHardAndSoftConstraintScoreCalculator.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -1,26 +0,0 @@
-package org.drools.solver.core.score.calculator;
-
-/**
- * @author Geoffrey De Smet
- */
-public class StaticHardAndSoftConstraintScoreCalculator extends AbstractHardAndSoftConstraintScoreCalculator {
-
-    protected double hardConstraintsWeight;
-
-    public StaticHardAndSoftConstraintScoreCalculator() {
-        this(1000000.0);
-    }
-
-    public StaticHardAndSoftConstraintScoreCalculator(double hardConstraintsWeight) {
-        this.hardConstraintsWeight = hardConstraintsWeight;
-    }
-
-    // ************************************************************************
-    // Worker methods
-    // ************************************************************************
-
-    public double calculateStepScore() {
-        return calculateHardAndSoftConstraintScore(hardConstraintsWeight);
-    }
-
-}

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/AbstractScoreComparator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/AbstractScoreComparator.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/AbstractScoreComparator.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -24,11 +24,6 @@
         return compare(score1, score2);
     }
 
-    public S getPerfectScore() {
-        // Hook which can be optionally overwritten by subclasses.
-        return null;
-    }
-
     public double calculateTimeGradient(S startScore, S endScore, S score) {
         // Hook which can be optionally overwritten by subclasses.
         if (startScore.compareTo(score) <= 0) {

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/HardAndSoftScoreComparator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/HardAndSoftScoreComparator.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/HardAndSoftScoreComparator.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -12,19 +12,9 @@
  * @author Geoffrey De Smet
  */
 public class HardAndSoftScoreComparator extends AbstractScoreComparator<HardAndSoftScore> {
-
-    private HardAndSoftScore perfectScore = new DefaultHardAndSoftScore(0, 0);
-    private HardAndSoftScore worstScore = new DefaultHardAndSoftScore(Integer.MIN_VALUE, Integer.MIN_VALUE);
+    
     private double hardScoreTimeGradientWeight = 0.5;
 
-    public void setPerfectScore(HardAndSoftScore perfectScore) {
-        this.perfectScore = perfectScore;
-    }
-
-    public void setWorstScore(HardAndSoftScore worstScore) {
-        this.worstScore = worstScore;
-    }
-
     public void setHardScoreTimeGradientWeight(double hardScoreTimeGradientWeight) {
         this.hardScoreTimeGradientWeight = hardScoreTimeGradientWeight;
         if (hardScoreTimeGradientWeight < 0.0 || hardScoreTimeGradientWeight > 1.0) {
@@ -74,14 +64,6 @@
         return compare(score1, score2);
     }
 
-    public HardAndSoftScore getPerfectScore() {
-        return perfectScore;
-    }
-
-    public HardAndSoftScore getWorstScore() {
-        return worstScore;
-    }
-
     public double calculateTimeGradient(HardAndSoftScore startScore, HardAndSoftScore endScore,
             HardAndSoftScore score) {
         double timeGradient = 0.0;

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/ScoreComparator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/ScoreComparator.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/ScoreComparator.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -55,26 +55,6 @@
     int compareWithShiftingPenalty(S score1, S score2);
 
     /**
-     * The perfect score is the score of which there is no better in any problem instance.
-     * This doesn't mean that the current problem instance, or any problem instance for that matter,
-     * could ever attain that score.
-     * </p>
-     * For example, most cases have a perfect score of zero, as most use cases only have negative scores.
-     * @return null if not supported
-     */
-    S getPerfectScore();
-
-    /**
-     * The worst score is the score of which there is no worser in any problem instance.
-     * This doesn't mean that the current problem instance, or any problem instance for that matter,
-     * could ever attain such a bad score.
-     * </p>
-     * For example, most cases have a worst score of negative infinity.
-     * @return null if not supported
-     */
-    S getWorstScore();
-
-    /**
      *
      * @param startScore never null
      * @param endScore never null

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/SimpleScoreComparator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/SimpleScoreComparator.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/SimpleScoreComparator.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -13,17 +13,6 @@
  */
 public class SimpleScoreComparator extends AbstractScoreComparator<SimpleScore> {
 
-    private SimpleScore perfectScore = new DefaultSimpleScore(0);
-    private SimpleScore worstScore = new DefaultSimpleScore(Integer.MIN_VALUE);
-
-    public void setPerfectScore(SimpleScore perfectScore) {
-        this.perfectScore = perfectScore;
-    }
-
-    public void setWorstScore(SimpleScore worstScore) {
-        this.worstScore = worstScore;
-    }
-
     // ************************************************************************
     // Worker methods
     // ************************************************************************
@@ -61,14 +50,6 @@
         return compare(score1, score2);
     }
 
-    public SimpleScore getPerfectScore() {
-        return perfectScore;
-    }
-
-    public SimpleScore getWorstScore() {
-        return worstScore;
-    }
-
     public double calculateTimeGradient(SimpleScore startScore, SimpleScore endScore, SimpleScore score) {
         double timeGradient = 0.0;
         int totalScore = Math.max(0, endScore.getScore() - startScore.getScore());

Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/AbstractScoreDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/AbstractScoreDefinition.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/AbstractScoreDefinition.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -0,0 +1,25 @@
+package org.drools.solver.core.score.definition;
+
+import java.io.Serializable;
+
+import org.drools.solver.core.score.Score;
+
+/**
+ * Abstract superclass for {@link ScoreDefinition}.
+ * @see ScoreDefinition
+ * @see HardAndSoftScoreDefinition
+ * @author Geoffrey De Smet
+ */
+public abstract class AbstractScoreDefinition<S extends Score> implements ScoreDefinition<S>, Serializable {
+
+    public S getPerfectMaximumScore() {
+        // Hook which can be optionally overwritten by subclasses.
+        return null;
+    }
+
+    public S getPerfectMinimumScore() {
+        // Hook which can be optionally overwritten by subclasses
+        return null;
+    }
+
+}

Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/HardAndSoftScoreDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/HardAndSoftScoreDefinition.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/HardAndSoftScoreDefinition.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -0,0 +1,86 @@
+package org.drools.solver.core.score.definition;
+
+import org.drools.solver.core.score.HardAndSoftScore;
+import org.drools.solver.core.score.DefaultHardAndSoftScore;
+import org.drools.solver.core.score.Score;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class HardAndSoftScoreDefinition extends AbstractScoreDefinition<HardAndSoftScore> {
+
+    private double hardScoreTimeGradientWeight = 0.75;
+
+    private HardAndSoftScore perfectMaximumScore = new DefaultHardAndSoftScore(0, 0);
+    private HardAndSoftScore perfectMinimumScore = new DefaultHardAndSoftScore(Integer.MIN_VALUE, Integer.MIN_VALUE);
+
+    /**
+     * It's recommended to use a number which can be exactly represented as a double,
+     * such as 0.5, 0.25, 0.75, 0.125, ... but not 0.1, 0.2, ... 
+     * @param hardScoreTimeGradientWeight 0.0 <= hardScoreTimeGradientWeight <= 1.0
+     */
+    public void setHardScoreTimeGradientWeight(double hardScoreTimeGradientWeight) {
+        this.hardScoreTimeGradientWeight = hardScoreTimeGradientWeight;
+        if (hardScoreTimeGradientWeight < 0.0 || hardScoreTimeGradientWeight > 1.0) {
+            throw new IllegalArgumentException("Property hardScoreTimeGradientWeight (" + hardScoreTimeGradientWeight
+                    + ") must be greater or equal to 0.0jg and smaller or equal to 1.0.");
+        }
+    }
+
+    public void setPerfectMaximumScore(HardAndSoftScore perfectMaximumScore) {
+        this.perfectMaximumScore = perfectMaximumScore;
+    }
+
+    public void setPerfectMinimumScore(HardAndSoftScore perfectMinimumScore) {
+        this.perfectMinimumScore = perfectMinimumScore;
+    }
+
+    // ************************************************************************
+    // Worker methods
+    // ************************************************************************
+
+    public HardAndSoftScore getPerfectMaximumScore() {
+        return perfectMaximumScore;
+    }
+
+    public HardAndSoftScore getPerfectMinimumScore() {
+        return perfectMinimumScore;
+    }
+
+    public Score parseScore(String scoreString) {
+        return DefaultHardAndSoftScore.parseScore(scoreString);
+    }
+
+    public double calculateTimeGradient(HardAndSoftScore startScore, HardAndSoftScore endScore,
+            HardAndSoftScore score) {
+        if (score.getHardScore() > endScore.getHardScore()) {
+            return 1.0;
+        } else if (startScore.getHardScore() > score.getHardScore()) {
+            return 0.0;
+        }
+        double softScoreTimeGradientWeight;
+        double timeGradient;
+        if (startScore.getHardScore() == endScore.getHardScore()) {
+            softScoreTimeGradientWeight = 1.0;
+            timeGradient = 0.0;
+        } else {
+            softScoreTimeGradientWeight = 1.0 - hardScoreTimeGradientWeight;
+            int hardScoreTotal = endScore.getHardScore() - startScore.getHardScore();
+            int hardScoreDelta = score.getHardScore() - startScore.getHardScore();
+            double hardTimeGradient = (double) hardScoreDelta / (double) hardScoreTotal;
+            timeGradient = hardTimeGradient * hardScoreTimeGradientWeight;
+        }
+        if (score.getSoftScore() >= endScore.getSoftScore()) {
+            timeGradient += softScoreTimeGradientWeight;
+        } else if (startScore.getSoftScore() >= score.getSoftScore()) {
+            // No change: timeGradient += 0.0
+        } else {
+            int softScoreTotal = endScore.getSoftScore() - startScore.getSoftScore();
+            int softScoreDelta = score.getSoftScore() - startScore.getSoftScore();
+            double softTimeGradient = (double) softScoreDelta / (double) softScoreTotal;
+            timeGradient += softTimeGradient * softScoreTimeGradientWeight;
+        }
+        return timeGradient;
+    }
+
+}

Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/ScoreDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/ScoreDefinition.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/ScoreDefinition.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -0,0 +1,56 @@
+package org.drools.solver.core.score.definition;
+
+import org.drools.solver.core.score.Score;
+import org.drools.solver.core.score.comparator.ScoreComparator;
+
+/**
+ * A ScoreDefinition knows how to compare scores and what the perfect maximum/minimum Score is.
+ * @see AbstractScoreDefinition
+ * @see HardAndSoftScoreDefinition
+ * @author Geoffrey De Smet
+ */
+public interface ScoreDefinition<S extends Score> {
+
+//    ScoreComparator getScoreComparator();
+//
+//    ScoreComparator getShiftingPenaltyScoreComparator();
+
+    /**
+     * The perfect maximum score is the score of which there is no better in any problem instance.
+     * This doesn't mean that the current problem instance, or any problem instance for that matter,
+     * could ever attain that score.
+     * </p>
+     * For example, most cases have a perfect maximum score of zero, as most use cases only have negative scores.
+     * @return null if not supported
+     */
+    S getPerfectMaximumScore();
+
+    /**
+     * The perfect minimum score is the score of which there is no worser in any problem instance.
+     * This doesn't mean that the current problem instance, or any problem instance for that matter,
+     * could ever attain such a bad score.
+     * </p>
+     * For example, most cases have a perfect minimum score of negative infinity.
+     * @return null if not supported
+     */
+    S getPerfectMinimumScore();
+
+    /**
+     * Parses the String and returns a Score.
+     * @param scoreString never null
+     * @return never null
+     */
+    Score parseScore(String scoreString);
+
+    /**
+     * @TODO rename because
+     *       org.drools.solver.core.localsearch.decider.accepter.simulatedannealing.SimulatedAnnealingAccepter
+     *       also uses it
+     * @param startScore never null
+     * @param endScore never null
+     * @param score never null
+     * @return between 0.0 and 1.0
+     */
+    double calculateTimeGradient(S startScore, S endScore, S score);
+
+}

Added: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/SimpleScoreDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/SimpleScoreDefinition.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/definition/SimpleScoreDefinition.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -0,0 +1,50 @@
+package org.drools.solver.core.score.definition;
+
+import org.drools.solver.core.score.SimpleScore;
+import org.drools.solver.core.score.DefaultSimpleScore;
+import org.drools.solver.core.score.Score;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class SimpleScoreDefinition extends AbstractScoreDefinition<SimpleScore> {
+
+    private SimpleScore perfectMaximumScore = new DefaultSimpleScore(0);
+    private SimpleScore perfectMinimumScore = new DefaultSimpleScore(Integer.MIN_VALUE);
+
+    public void setPerfectMaximumScore(SimpleScore perfectMaximumScore) {
+        this.perfectMaximumScore = perfectMaximumScore;
+    }
+
+    public void setPerfectMinimumScore(SimpleScore perfectMinimumScore) {
+        this.perfectMinimumScore = perfectMinimumScore;
+    }
+
+    // ************************************************************************
+    // Worker methods
+    // ************************************************************************
+
+    public SimpleScore getPerfectMaximumScore() {
+        return perfectMaximumScore;
+    }
+
+    public SimpleScore getPerfectMinimumScore() {
+        return perfectMinimumScore;
+    }
+
+    public Score parseScore(String scoreString) {
+        return DefaultSimpleScore.parseScore(scoreString);
+    }
+
+    public double calculateTimeGradient(SimpleScore startScore, SimpleScore endScore, SimpleScore score) {
+        if (score.getScore() >= endScore.getScore()) {
+            return 1.0;
+        } else if (startScore.getScore() >= score.getScore()) {
+            return 0.0;
+        }
+        int scoreTotal = endScore.getScore() - startScore.getScore();
+        int scoreDelta = score.getScore() - startScore.getScore();
+        return ((double) scoreDelta) / ((double) scoreTotal);
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/accepter/greatdeluge/GreatDelugeAccepterTest.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/accepter/greatdeluge/GreatDelugeAccepterTest.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/accepter/greatdeluge/GreatDelugeAccepterTest.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -8,6 +8,9 @@
 import org.drools.solver.core.localsearch.decider.MoveScope;
 import org.drools.solver.core.localsearch.decider.accepter.Accepter;
 import org.drools.solver.core.move.DummyMove;
+import org.drools.solver.core.score.DefaultSimpleScore;
+import org.drools.solver.core.score.Score;
+import org.drools.solver.core.score.definition.SimpleScoreDefinition;
 
 /**
  * @author Geoffrey De Smet
@@ -23,13 +26,13 @@
         stepScope.setStepIndex(0);
         accepter.beforeDeciding(stepScope);
         // Pre conditions
-        MoveScope a1 = createMoveScope(stepScope, -2000.0);
-        MoveScope a2 = createMoveScope(stepScope, -1300.0);
-        MoveScope a3 = createMoveScope(stepScope, -1200.0);
-        MoveScope b1 = createMoveScope(stepScope, -1200.0);
-        MoveScope b2 = createMoveScope(stepScope, -100.0);
-        MoveScope c1 = createMoveScope(stepScope, -1100.0);
-        MoveScope c2 = createMoveScope(stepScope, -120.0);
+        MoveScope a1 = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-2000));
+        MoveScope a2 = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-1300));
+        MoveScope a3 = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-1200));
+        MoveScope b1 = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-1200));
+        MoveScope b2 = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-100));
+        MoveScope c1 = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-1100));
+        MoveScope c2 = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-120));
         // Do stuff
         assertEquals(0.0, accepter.calculateAcceptChance(a1));
         assertEquals(0.0, accepter.calculateAcceptChance(a2));
@@ -49,19 +52,20 @@
 
     private LocalSearchSolverScope createLocalSearchSolverScope() {
         LocalSearchSolverScope localSearchSolverScope = new LocalSearchSolverScope();
+        localSearchSolverScope.setScoreDefinition(new SimpleScoreDefinition());
         localSearchSolverScope.setWorkingRandom(new Random() {
             public double nextDouble() {
                 return 0.2;
             }
         });
-        localSearchSolverScope.setBestScore(-1000.0);
+        localSearchSolverScope.setBestScore(DefaultSimpleScore.valueOf(-1000));
         StepScope lastStepScope = new StepScope(localSearchSolverScope);
-        lastStepScope.setScore(-1000.0);
+        lastStepScope.setScore(DefaultSimpleScore.valueOf(-1000));
         localSearchSolverScope.setLastCompletedStepScope(lastStepScope);
         return localSearchSolverScope;
     }
 
-    public MoveScope createMoveScope(StepScope stepScope, double score) {
+    public MoveScope createMoveScope(StepScope stepScope, Score score) {
         MoveScope moveScope = new MoveScope(stepScope);
         moveScope.setMove(new DummyMove());
         moveScope.setScore(score);

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForagerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForagerTest.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/localsearch/decider/forager/AcceptedForagerTest.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -9,6 +9,9 @@
 import org.drools.solver.core.localsearch.decider.MoveScope;
 import org.drools.solver.core.move.DummyMove;
 import org.drools.solver.core.move.Move;
+import org.drools.solver.core.score.DefaultSimpleScore;
+import org.drools.solver.core.score.Score;
+import org.drools.solver.core.score.definition.SimpleScoreDefinition;
 
 /**
  * @author Geoffrey De Smet
@@ -23,11 +26,11 @@
         StepScope stepScope = new StepScope(localSearchSolverScope);
         forager.beforeDeciding(stepScope);
         // Pre conditions
-        MoveScope a = createMoveScope(stepScope, -20.0, 30.0);
-        MoveScope b = createMoveScope(stepScope, -1.0, 9.0);
-        MoveScope c = createMoveScope(stepScope, -20.0, 20.0);
-        MoveScope d = createMoveScope(stepScope, -300.0, 50000.0);
-        MoveScope e = createMoveScope(stepScope, -1.0, 1.0);
+        MoveScope a = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-20), 30.0);
+        MoveScope b = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-1), 9.0);
+        MoveScope c = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-20), 20.0);
+        MoveScope d = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-300), 50000.0);
+        MoveScope e = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-1), 1.0);
         // Do stuff
         forager.addMove(a);
         assertFalse(forager.isQuitEarly());
@@ -59,10 +62,10 @@
         StepScope stepScope = new StepScope(localSearchSolverScope);
         forager.beforeDeciding(stepScope);
         // Pre conditions
-        MoveScope a = createMoveScope(stepScope, -1.0, 0.0);
-        MoveScope b = createMoveScope(stepScope, -20.0, 1.0);
-        MoveScope c = createMoveScope(stepScope, -300.0, 1.0);
-        MoveScope d = createMoveScope(stepScope, -1.0, 0.3);
+        MoveScope a = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-1), 0.0);
+        MoveScope b = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-20), 1.0);
+        MoveScope c = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-300), 1.0);
+        MoveScope d = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-1), 0.3);
         // Do stuff
         forager.addMove(a);
         assertFalse(forager.isQuitEarly());
@@ -89,10 +92,10 @@
         StepScope stepScope = new StepScope(localSearchSolverScope);
         forager.beforeDeciding(stepScope);
         // Pre conditions
-        MoveScope a = createMoveScope(stepScope, -1.0, 0.0);
-        MoveScope b = createMoveScope(stepScope, -300.0, 1.0);
-        MoveScope c = createMoveScope(stepScope, -4000.0, 1.0);
-        MoveScope d = createMoveScope(stepScope, -20.0, 0.3);
+        MoveScope a = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-1), 0.0);
+        MoveScope b = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-300), 1.0);
+        MoveScope c = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-4000), 1.0);
+        MoveScope d = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-20), 0.3);
         // Do stuff
         forager.addMove(a);
         assertFalse(forager.isQuitEarly());
@@ -119,10 +122,10 @@
         StepScope stepScope = new StepScope(localSearchSolverScope);
         forager.beforeDeciding(stepScope);
         // Pre conditions
-        MoveScope a = createMoveScope(stepScope, -20.0, 0.0);
-        MoveScope b = createMoveScope(stepScope, -1.0, 0.1);
-        MoveScope c = createMoveScope(stepScope, -1.0, 0.0);
-        MoveScope d = createMoveScope(stepScope, -20.0, 0.3);
+        MoveScope a = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-20), 0.0);
+        MoveScope b = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-1), 0.1);
+        MoveScope c = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-1), 0.0);
+        MoveScope d = createMoveScope(stepScope, DefaultSimpleScore.valueOf(-20), 0.3);
         // Do stuff
         forager.addMove(a);
         assertFalse(forager.isQuitEarly());
@@ -143,19 +146,20 @@
 
     private LocalSearchSolverScope createLocalSearchSolverScope() {
         LocalSearchSolverScope localSearchSolverScope = new LocalSearchSolverScope();
+        localSearchSolverScope.setScoreDefinition(new SimpleScoreDefinition());
         localSearchSolverScope.setWorkingRandom(new Random() {
             public double nextDouble() {
                 return 0.2;
             }
         });
-        localSearchSolverScope.setBestScore(-10.0);
+        localSearchSolverScope.setBestScore(DefaultSimpleScore.valueOf(-10));
         StepScope lastStepScope = new StepScope(localSearchSolverScope);
-        lastStepScope.setScore(-100.0);
+        lastStepScope.setScore(DefaultSimpleScore.valueOf(-100));
         localSearchSolverScope.setLastCompletedStepScope(lastStepScope);
         return localSearchSolverScope;
     }
 
-    public MoveScope createMoveScope(StepScope stepScope, double score, double acceptChance) {
+    public MoveScope createMoveScope(StepScope stepScope, Score score, double acceptChance) {
         MoveScope moveScope = new MoveScope(stepScope);
         moveScope.setMove(new DummyMove());
         moveScope.setScore(score);

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/score/definition/HardAndSoftScoreDefinitionTest.java (from rev 26022, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/score/DefaultHardAndSoftScoreTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/score/definition/HardAndSoftScoreDefinitionTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/test/java/org/drools/solver/core/score/definition/HardAndSoftScoreDefinitionTest.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -0,0 +1,72 @@
+package org.drools.solver.core.score.definition;
+
+import junit.framework.TestCase;
+import org.drools.solver.core.score.Score;
+import org.drools.solver.core.score.DefaultHardAndSoftScore;
+
+/**
+ * @author Geoffrey De Smet
+ */
+public class HardAndSoftScoreDefinitionTest extends TestCase {
+
+    public void testCalculateTimeGradient() {
+        HardAndSoftScoreDefinition scoreDefinition = new HardAndSoftScoreDefinition();
+        scoreDefinition.setHardScoreTimeGradientWeight(0.75);
+
+        // Normal cases
+        // Smack in the middle
+        assertEquals(0.6, scoreDefinition.calculateTimeGradient(
+                DefaultHardAndSoftScore.valueOf(-20,-400), DefaultHardAndSoftScore.valueOf(-10,-300),
+                DefaultHardAndSoftScore.valueOf(-14,-340)));
+        // No hard broken, total soft broken
+        assertEquals(0.75, scoreDefinition.calculateTimeGradient(
+                DefaultHardAndSoftScore.valueOf(-20,-400), DefaultHardAndSoftScore.valueOf(-10,-300),
+                DefaultHardAndSoftScore.valueOf(-10,-400)));
+        // Total hard broken, no soft broken
+        assertEquals(0.25, scoreDefinition.calculateTimeGradient(
+                DefaultHardAndSoftScore.valueOf(-20,-400), DefaultHardAndSoftScore.valueOf(-10,-300),
+                DefaultHardAndSoftScore.valueOf(-20,-300)));
+        // No hard broken, more than total soft broken
+        assertEquals(0.75, scoreDefinition.calculateTimeGradient(
+                DefaultHardAndSoftScore.valueOf(-20,-400), DefaultHardAndSoftScore.valueOf(-10,-300),
+                DefaultHardAndSoftScore.valueOf(-10,-900)));
+        // More than total hard broken, no soft broken
+        assertEquals(0.0, scoreDefinition.calculateTimeGradient(
+                DefaultHardAndSoftScore.valueOf(-20,-400), DefaultHardAndSoftScore.valueOf(-10,-300),
+                DefaultHardAndSoftScore.valueOf(-90,-300)));
+
+        // Perfect min/max cases
+        assertEquals(1.0, scoreDefinition.calculateTimeGradient(
+                DefaultHardAndSoftScore.valueOf(-10,-300), DefaultHardAndSoftScore.valueOf(-10,-300),
+                DefaultHardAndSoftScore.valueOf(-10,-300)));
+        assertEquals(0.0, scoreDefinition.calculateTimeGradient(
+                DefaultHardAndSoftScore.valueOf(-20,-400), DefaultHardAndSoftScore.valueOf(-10,-300),
+                DefaultHardAndSoftScore.valueOf(-20,-400)));
+        assertEquals(1.0, scoreDefinition.calculateTimeGradient(
+                DefaultHardAndSoftScore.valueOf(-20,-400), DefaultHardAndSoftScore.valueOf(-10,-300),
+                DefaultHardAndSoftScore.valueOf(-10,-300)));
+
+        // Hard total delta is 0
+        assertEquals(0.6, scoreDefinition.calculateTimeGradient(
+                DefaultHardAndSoftScore.valueOf(-10,-400), DefaultHardAndSoftScore.valueOf(-10,-300),
+                DefaultHardAndSoftScore.valueOf(-10,-340)));
+        assertEquals(0.0, scoreDefinition.calculateTimeGradient(
+                DefaultHardAndSoftScore.valueOf(-10,-400), DefaultHardAndSoftScore.valueOf(-10,-300),
+                DefaultHardAndSoftScore.valueOf(-20,-340)));
+        assertEquals(1.0, scoreDefinition.calculateTimeGradient(
+                DefaultHardAndSoftScore.valueOf(-10,-400), DefaultHardAndSoftScore.valueOf(-10,-300),
+                DefaultHardAndSoftScore.valueOf(-0,-340)));
+
+        // Soft total delta is 0
+        assertEquals((0.6 * 0.75) + 0.25, scoreDefinition.calculateTimeGradient(
+                DefaultHardAndSoftScore.valueOf(-20,-300), DefaultHardAndSoftScore.valueOf(-10,-300),
+                DefaultHardAndSoftScore.valueOf(-14,-300)));
+        assertEquals(0.6 * 0.75, scoreDefinition.calculateTimeGradient(
+                DefaultHardAndSoftScore.valueOf(-20,-300), DefaultHardAndSoftScore.valueOf(-10,-300),
+                DefaultHardAndSoftScore.valueOf(-14,-400)));
+        assertEquals((0.6 * 0.75) + 0.25, scoreDefinition.calculateTimeGradient(
+                DefaultHardAndSoftScore.valueOf(-20,-300), DefaultHardAndSoftScore.valueOf(-10,-300),
+                DefaultHardAndSoftScore.valueOf(-14,-0)));
+    }
+
+}
\ No newline at end of file

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-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/business/SolutionBusiness.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -20,6 +20,7 @@
 import org.drools.solver.core.score.constraint.DoubleConstraintOccurrence;
 import org.drools.solver.core.score.constraint.IntConstraintOccurrence;
 import org.drools.solver.core.score.constraint.UnweightedConstraintOccurrence;
+import org.drools.solver.core.score.Score;
 import org.drools.solver.core.solution.Solution;
 import org.drools.solver.examples.common.persistence.SolutionDao;
 import org.slf4j.Logger;
@@ -87,7 +88,7 @@
         return localSearchSolverScope.getWorkingSolution();
     }
 
-    public double getScore() {
+    public Score getScore() {
         return localSearchSolverScope.calculateScoreFromWorkingMemory();
     }
 

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-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/common/swingui/WorkflowFrame.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -28,8 +28,6 @@
  */
 public class WorkflowFrame extends JFrame {
     
-    public static final NumberFormat NUMBER_FORMAT = NumberFormat.getInstance();
-
     protected final transient Logger logger = LoggerFactory.getLogger(getClass());
 
     private SolutionBusiness solutionBusiness;
@@ -186,7 +184,7 @@
     public void updateScreen() {
         solutionPanel.resetPanel();
         validate();
-        resultLabel.setText("Score = " + NUMBER_FORMAT.format(solutionBusiness.getScore()));
+        resultLabel.setText("Score = " + solutionBusiness.getScore());
     }
 
 }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/solver/solution/initializer/CurriculumCourseStartingSolutionInitializer.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/solver/solution/initializer/CurriculumCourseStartingSolutionInitializer.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/curriculumcourse/solver/solution/initializer/CurriculumCourseStartingSolutionInitializer.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -9,6 +9,8 @@
 import org.drools.runtime.rule.FactHandle;
 import org.drools.solver.core.localsearch.LocalSearchSolverScope;
 import org.drools.solver.core.solution.initializer.AbstractStartingSolutionInitializer;
+import org.drools.solver.core.score.Score;
+import org.drools.solver.core.score.DefaultHardAndSoftScore;
 import org.drools.solver.examples.common.domain.PersistableIdComparator;
 import org.drools.solver.examples.itc2007.curriculumcourse.domain.Course;
 import org.drools.solver.examples.itc2007.curriculumcourse.domain.CurriculumCourseSchedule;
@@ -41,7 +43,7 @@
 
         List<Lecture> lectureList = createLectureList(schedule);
         for (Lecture lecture : lectureList) {
-            double unscheduledScore = localSearchSolverScope.calculateScoreFromWorkingMemory();
+            Score unscheduledScore = localSearchSolverScope.calculateScoreFromWorkingMemory();
             FactHandle lectureHandle = null;
 
             List<PeriodScoring> periodScoringList = new ArrayList<PeriodScoring>(periodList.size());
@@ -53,17 +55,17 @@
                     lecture.setPeriod(period);
                     workingMemory.update(lectureHandle, lecture);
                 }
-                double score = localSearchSolverScope.calculateScoreFromWorkingMemory();
+                Score score = localSearchSolverScope.calculateScoreFromWorkingMemory();
                 periodScoringList.add(new PeriodScoring(period, score));
             }
             Collections.sort(periodScoringList);
 
             boolean almostPerfectMatch = false;
-            double bestScore = Double.NEGATIVE_INFINITY;
+            Score bestScore = DefaultHardAndSoftScore.valueOf(Integer.MIN_VALUE, Integer.MIN_VALUE);
             Period bestPeriod = null;
             Room bestRoom = null;
             for (PeriodScoring periodScoring : periodScoringList) {
-                if (bestScore >= periodScoring.getScore()) {
+                if (bestScore.compareTo(periodScoring.getScore()) >= 0) {
                     // No need to check the rest
                     break;
                 }
@@ -73,14 +75,14 @@
                 for (Room room : roomList) {
                     lecture.setRoom(room);
                     workingMemory.update(lectureHandle, lecture);
-                    double score = localSearchSolverScope.calculateScoreFromWorkingMemory();
-                    if (score < unscheduledScore) {
-                        if (score > bestScore) {
+                    Score score = localSearchSolverScope.calculateScoreFromWorkingMemory();
+                    if (score.compareTo(unscheduledScore) < 0) {
+                        if (score.compareTo(bestScore) > 0) {
                             bestScore = score;
                             bestPeriod = periodScoring.getPeriod();
                             bestRoom = room;
                         }
-                    } else if (score >= unscheduledScore) {
+                    } else if (score.compareTo(unscheduledScore) >= 0) {
                         // TODO due to the score rules, the score can unscheduledScore can be higher than the score
                         // In theory every possibility should be looked into
                         almostPerfectMatch = true;
@@ -169,9 +171,9 @@
     private class PeriodScoring implements Comparable<PeriodScoring> {
 
         private Period period;
-        private double score;
+        private Score score;
 
-        private PeriodScoring(Period period, double score) {
+        private PeriodScoring(Period period, Score score) {
             this.period = period;
             this.score = score;
         }
@@ -180,7 +182,7 @@
             return period;
         }
 
-        public double getScore() {
+        public Score getScore() {
             return score;
         }
 

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/solution/initializer/ExaminationStartingSolutionInitializer.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/solution/initializer/ExaminationStartingSolutionInitializer.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/java/org/drools/solver/examples/itc2007/examination/solver/solution/initializer/ExaminationStartingSolutionInitializer.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -13,6 +13,8 @@
 import org.drools.FactHandle;
 import org.drools.solver.core.localsearch.LocalSearchSolverScope;
 import org.drools.solver.core.solution.initializer.AbstractStartingSolutionInitializer;
+import org.drools.solver.core.score.Score;
+import org.drools.solver.core.score.DefaultHardAndSoftScore;
 import org.drools.solver.examples.common.domain.PersistableIdComparator;
 import org.drools.solver.examples.itc2007.examination.domain.Exam;
 import org.drools.solver.examples.itc2007.examination.domain.Examination;
@@ -49,7 +51,7 @@
         List<ExamInitializationWeight> examInitialWeightList = createExamAssigningScoreList(examination);
 
         for (ExamInitializationWeight examInitialWeight : examInitialWeightList) {
-            double unscheduledScore = localSearchSolverScope.calculateScoreFromWorkingMemory();
+            Score unscheduledScore = localSearchSolverScope.calculateScoreFromWorkingMemory();
             Exam leader = examInitialWeight.getExam();
             FactHandle leaderHandle = null;
 
@@ -77,7 +79,7 @@
                         workingMemory.modifyInsert(examToHandle.getExamHandle(), examToHandle.getExam());
                     }
                 }
-                double score = localSearchSolverScope.calculateScoreFromWorkingMemory();
+                Score score = localSearchSolverScope.calculateScoreFromWorkingMemory();
                 periodScoringList.add(new PeriodScoring(period, score));
             }
             Collections.sort(periodScoringList);
@@ -101,14 +103,14 @@
     }
 
     private void scheduleLeader(List<PeriodScoring> periodScoringList, List<Room> roomList,
-            LocalSearchSolverScope localSearchSolverScope, WorkingMemory workingMemory, double unscheduledScore,
+            LocalSearchSolverScope localSearchSolverScope, WorkingMemory workingMemory, Score unscheduledScore,
             List<ExamToHandle> examToHandleList, Exam leader, FactHandle leaderHandle) {
         boolean perfectMatch = false;
-        double bestScore = Double.NEGATIVE_INFINITY;
+        Score bestScore = DefaultHardAndSoftScore.valueOf(Integer.MIN_VALUE, Integer.MIN_VALUE);
         Period bestPeriod = null;
         Room bestRoom = null;
         for (PeriodScoring periodScoring : periodScoringList) {
-            if (bestScore >= periodScoring.getScore()) {
+            if (bestScore.compareTo(periodScoring.getScore()) >= 0) {
                 // No need to check the rest
                 break;
             }
@@ -121,14 +123,14 @@
                 workingMemory.modifyRetract(leaderHandle);
                 leader.setRoom(room);
                 workingMemory.modifyInsert(leaderHandle, leader);
-                double score = localSearchSolverScope.calculateScoreFromWorkingMemory();
-                if (score < unscheduledScore) {
-                    if (score > bestScore) {
+                Score score = localSearchSolverScope.calculateScoreFromWorkingMemory();
+                if (score.compareTo(unscheduledScore) < 0) {
+                    if (score.compareTo(bestScore) > 0) {
                         bestScore = score;
                         bestPeriod = periodScoring.getPeriod();
                         bestRoom = room;
                     }
-                } else if (score == unscheduledScore) {
+                } else if (score.equals(unscheduledScore)) {
                     perfectMatch = true;
                     break;
                 } else {
@@ -163,21 +165,21 @@
         if (exam.getRoom() != null) {
             throw new IllegalStateException("Exam (" + exam + ") already has a room.");
         }
-        double unscheduledScore = localSearchSolverScope.calculateScoreFromWorkingMemory();
+        Score unscheduledScore = localSearchSolverScope.calculateScoreFromWorkingMemory();
         boolean perfectMatch = false;
-        double bestScore = Double.NEGATIVE_INFINITY;
+        Score bestScore = DefaultHardAndSoftScore.valueOf(Integer.MIN_VALUE, Integer.MIN_VALUE);
         Room bestRoom = null;
         for (Room room : roomList) {
             workingMemory.modifyRetract(examHandle);
             exam.setRoom(room);
             workingMemory.modifyInsert(examHandle, exam);
-            double score = localSearchSolverScope.calculateScoreFromWorkingMemory();
-            if (score < unscheduledScore) {
-                if (score > bestScore) {
+            Score score = localSearchSolverScope.calculateScoreFromWorkingMemory();
+            if (score.compareTo(unscheduledScore) < 0) {
+                if (score.compareTo(bestScore) > 0) {
                     bestScore = score;
                     bestRoom = room;
                 }
-            } else if (score == unscheduledScore) {
+            } else if (score.equals(unscheduledScore)) {
                 perfectMatch = true;
                 break;
             } else {
@@ -345,9 +347,9 @@
     private class PeriodScoring implements Comparable<PeriodScoring> {
 
         private Period period;
-        private double score;
+        private Score score;
 
-        private PeriodScoring(Period period, double score) {
+        private PeriodScoring(Period period, Score score) {
             this.period = period;
             this.score = score;
         }
@@ -356,7 +358,7 @@
             return period;
         }
 
-        public double getScore() {
+        public Score getScore() {
             return score;
         }
 

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/curriculumcourse/benchmark/curriculumCourseShortSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/curriculumcourse/benchmark/curriculumCourseShortSolverBenchmarkConfig.xml	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/curriculumcourse/benchmark/curriculumCourseShortSolverBenchmarkConfig.xml	2009-04-24 13:16:20 UTC (rev 26240)
@@ -17,9 +17,9 @@
 
     <solverBenchmark>
         <localSearchSolver>
-            <scoreCalculator>
-                <scoreCalculatorType>HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>
-            </scoreCalculator>
+            <scoreDefinition>
+                <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>
+            </scoreDefinition>
             <selector>
                 <selector>
                     <topSize>10</topSize>

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/curriculumcourse/benchmark/curriculumCourseSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/curriculumcourse/benchmark/curriculumCourseSolverBenchmarkConfig.xml	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/curriculumcourse/benchmark/curriculumCourseSolverBenchmarkConfig.xml	2009-04-24 13:16:20 UTC (rev 26240)
@@ -35,9 +35,9 @@
 
     <solverBenchmark>
         <localSearchSolver>
-            <scoreCalculator>
-                <scoreCalculatorType>DYNAMIC_HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>
-            </scoreCalculator>
+            <scoreDefinition>
+                <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>
+            </scoreDefinition>
             <selector>
                 <selector>
                     <topSize>10</topSize>

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/curriculumcourse/solver/curriculumCourseSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/curriculumcourse/solver/curriculumCourseSolverConfig.xml	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/curriculumcourse/solver/curriculumCourseSolverConfig.xml	2009-04-24 13:16:20 UTC (rev 26240)
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <localSearchSolver>
     <scoreDrl>/org/drools/solver/examples/itc2007/curriculumcourse/solver/curriculumCourseScoreRules.drl</scoreDrl>
-    <scoreCalculator>
-        <scoreCalculatorType>DYNAMIC_HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>
-    </scoreCalculator>
+    <scoreDefinition>
+        <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>
+    </scoreDefinition>
     <startingSolutionInitializerClass>org.drools.solver.examples.itc2007.curriculumcourse.solver.solution.initializer.CurriculumCourseStartingSolutionInitializer</startingSolutionInitializerClass>
     <finish>
         <!--
@@ -12,7 +12,7 @@
             ge0ffrey's old pc: 1152
         -->
         <maximumSecondsSpend>429</maximumSecondsSpend>
-        <!--<feasableScore>-999999.0</feasableScore>-->
+        <!--<feasableScore>-0hard/-999999soft</feasableScore>-->
         <!--<maximumStepCount>100</maximumStepCount>-->
     </finish>
     <selector>
@@ -41,26 +41,26 @@
     </forager>
     <!-- Great deluge experiments: -->
     <!--<selector>-->
-        <!--<selector>-->
-            <!--<moveFactoryClass>org.drools.solver.examples.itc2007.curriculumcourse.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>-->
-            <!--<relativeSelection>0.002</relativeSelection>-->
-        <!--</selector>-->
-        <!--<selector>-->
-            <!--<moveFactoryClass>org.drools.solver.examples.itc2007.curriculumcourse.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>-->
-            <!--<relativeSelection>0.002</relativeSelection>-->
-        <!--</selector>-->
-        <!--<selector>-->
-            <!--<moveFactoryClass>org.drools.solver.examples.itc2007.curriculumcourse.solver.move.factory.LectureSwitchMoveFactory</moveFactoryClass>-->
-            <!--<shuffle>true</shuffle>-->
-        <!--</selector>-->
+    <!--<selector>-->
+    <!--<moveFactoryClass>org.drools.solver.examples.itc2007.curriculumcourse.solver.move.factory.PeriodChangeMoveFactory</moveFactoryClass>-->
+    <!--<relativeSelection>0.002</relativeSelection>-->
     <!--</selector>-->
+    <!--<selector>-->
+    <!--<moveFactoryClass>org.drools.solver.examples.itc2007.curriculumcourse.solver.move.factory.RoomChangeMoveFactory</moveFactoryClass>-->
+    <!--<relativeSelection>0.002</relativeSelection>-->
+    <!--</selector>-->
+    <!--<selector>-->
+    <!--<moveFactoryClass>org.drools.solver.examples.itc2007.curriculumcourse.solver.move.factory.LectureSwitchMoveFactory</moveFactoryClass>-->
+    <!--<shuffle>true</shuffle>-->
+    <!--</selector>-->
+    <!--</selector>-->
     <!--<accepter>-->
-        <!--<greatDelugeWaterLevelUpperBoundRate>1.30</greatDelugeWaterLevelUpperBoundRate>-->
-        <!--<greatDelugeWaterRisingRate>0.000000143</greatDelugeWaterRisingRate>-->
-        <!--<completePropertyTabuSize>10</completePropertyTabuSize>-->
+    <!--<greatDelugeWaterLevelUpperBoundRate>1.30</greatDelugeWaterLevelUpperBoundRate>-->
+    <!--<greatDelugeWaterRisingRate>0.000000143</greatDelugeWaterRisingRate>-->
+    <!--<completePropertyTabuSize>10</completePropertyTabuSize>-->
     <!--</accepter>-->
     <!--<forager>-->
-        <!--<foragerType>FIRST_RANDOMLY_ACCEPTED</foragerType>-->
+    <!--<foragerType>FIRST_RANDOMLY_ACCEPTED</foragerType>-->
     <!--</forager>-->
 </localSearchSolver>
         
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationShortSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationShortSolverBenchmarkConfig.xml	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationShortSolverBenchmarkConfig.xml	2009-04-24 13:16:20 UTC (rev 26240)
@@ -16,9 +16,9 @@
 
     <solverBenchmark>
         <localSearchSolver>
-        <scoreCalculator>
-            <scoreCalculatorType>DYNAMIC_HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>
-        </scoreCalculator>
+            <scoreDefinition>
+                <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>
+            </scoreDefinition>
             <selector>
                 <selector>
                     <topSize>10</topSize>

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationSolverBenchmarkConfig.xml	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/benchmark/examinationSolverBenchmarkConfig.xml	2009-04-24 13:16:20 UTC (rev 26240)
@@ -29,9 +29,9 @@
 
     <solverBenchmark>
         <localSearchSolver>
-            <scoreCalculator>
-                <scoreCalculatorType>DYNAMIC_HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>
-            </scoreCalculator>
+            <scoreDefinition>
+                <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>
+            </scoreDefinition>
             <selector>
                 <selector>
                     <topSize>10</topSize>

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/itc2007/examination/solver/examinationSolverConfig.xml	2009-04-24 13:16:20 UTC (rev 26240)
@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <localSearchSolver>
     <scoreDrl>/org/drools/solver/examples/itc2007/examination/solver/examinationScoreRules.drl</scoreDrl>
-    <scoreCalculator>
-        <!--<scoreCalculatorType>HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>-->
-        <scoreCalculatorType>DYNAMIC_HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>
-    </scoreCalculator>
+    <scoreDefinition>
+        <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>
+    </scoreDefinition>
     <startingSolutionInitializerClass>org.drools.solver.examples.itc2007.examination.solver.solution.initializer.ExaminationStartingSolutionInitializer</startingSolutionInitializerClass>
     <finish>
         <!--
@@ -13,7 +12,7 @@
             ge0ffrey's old pc: 1152
         -->
         <maximumSecondsSpend>429</maximumSecondsSpend>
-        <!--<feasableScore>-999999.0</feasableScore>-->
+        <!--<feasableScore>-0hard/-999999soft</feasableScore>-->
         <!--<maximumStepCount>100</maximumStepCount>-->
     </finish>
     <selector>

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/lessonschedule/solver/lessonScheduleSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/lessonschedule/solver/lessonScheduleSolverConfig.xml	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/lessonschedule/solver/lessonScheduleSolverConfig.xml	2009-04-24 13:16:20 UTC (rev 26240)
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <localSearchSolver>
     <scoreDrl>/org/drools/solver/examples/lessonschedule/solver/lessonScheduleScoreRules.drl</scoreDrl>
-    <scoreCalculator>
-        <scoreCalculatorType>HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>
-    </scoreCalculator>
+    <scoreDefinition>
+        <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>
+    </scoreDefinition>
     <finish>
         <maximumUnimprovedStepCount>10</maximumUnimprovedStepCount>
     </finish>

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/nqueens/benchmark/nqueensSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/nqueens/benchmark/nqueensSolverBenchmarkConfig.xml	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/nqueens/benchmark/nqueensSolverBenchmarkConfig.xml	2009-04-24 13:16:20 UTC (rev 26240)
@@ -10,13 +10,13 @@
     <inheritedUnsolvedSolutionFile>data/nqueens/unsolved/unsolvedNQueens32.xml</inheritedUnsolvedSolutionFile>
     <inheritedLocalSearchSolver>
         <scoreDrl>/org/drools/solver/examples/nqueens/solver/nQueensScoreRules.drl</scoreDrl>
-        <scoreCalculator>
-            <scoreCalculatorType>SIMPLE</scoreCalculatorType>
-        </scoreCalculator>
+        <scoreDefinition>
+            <scoreDefinitionType>SIMPLE</scoreDefinitionType>
+        </scoreDefinition>
         <finish>
             <finishCompositionStyle>OR</finishCompositionStyle>
             <maximumSecondsSpend>10</maximumSecondsSpend>
-            <feasableScore>0.0</feasableScore>
+            <feasableScore>0</feasableScore>
         </finish>
         <selector>
             <moveFactoryClass>org.drools.solver.examples.nqueens.solver.move.factory.NQueensMoveFactory</moveFactoryClass>

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/nqueens/solver/nqueensSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/nqueens/solver/nqueensSolverConfig.xml	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/nqueens/solver/nqueensSolverConfig.xml	2009-04-24 13:16:20 UTC (rev 26240)
@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <localSearchSolver>
     <scoreDrl>/org/drools/solver/examples/nqueens/solver/nQueensScoreRules.drl</scoreDrl>
-    <scoreCalculator>
-        <scoreCalculatorType>SIMPLE</scoreCalculatorType>
-    </scoreCalculator>
+    <scoreDefinition>
+        <scoreDefinitionType>SIMPLE</scoreDefinitionType>
+    </scoreDefinition>
     <finish>
         <finishCompositionStyle>OR</finishCompositionStyle>
         <maximumStepCount>100</maximumStepCount>
-        <feasableScore>0.0</feasableScore>
+        <feasableScore>0</feasableScore>
     </finish>
     <selector>
         <moveFactoryClass>org.drools.solver.examples.nqueens.solver.move.factory.NQueensMoveFactory</moveFactoryClass>

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/benchmark/smart/breakNl14SolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/benchmark/smart/breakNl14SolverBenchmarkConfig.xml	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/benchmark/smart/breakNl14SolverBenchmarkConfig.xml	2009-04-24 13:16:20 UTC (rev 26240)
@@ -7,9 +7,9 @@
     <inheritedUnsolvedSolutionFile>data/travelingtournament/smart/unsolved/1-nl14.xml</inheritedUnsolvedSolutionFile>
     <inheritedLocalSearchSolver>
         <scoreDrl>/org/drools/solver/examples/travelingtournament/solver/smart/smartTravelingTournamentScoreRules.drl</scoreDrl>
-        <scoreCalculator>
-            <scoreCalculatorType>DYNAMIC_HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>
-        </scoreCalculator>
+        <scoreDefinition>
+            <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>
+        </scoreDefinition>
         <selector>
             <moveFactoryClass>org.drools.solver.examples.travelingtournament.solver.smart.move.factory.SmartTravelingTournamentMoveFactory</moveFactoryClass>
         </selector>
@@ -25,7 +25,7 @@
         <localSearchSolver>
             <finish>
                 <finishCompositionStyle>AND</finishCompositionStyle>
-                <feasableScore>-188727.0</feasableScore><!-- 188728 (Van Hentenryck and Vergados, May 18 2006) -->
+                <feasableScore>-0hard/-188727soft</feasableScore><!-- 188728 (Van Hentenryck and Vergados, May 18 2006) -->
                 <maximumUnimprovedStepCount>20</maximumUnimprovedStepCount>
             </finish>
         </localSearchSolver>

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/benchmark/smart/smartTravelingTournamentSolverBenchmarkConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/benchmark/smart/smartTravelingTournamentSolverBenchmarkConfig.xml	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/benchmark/smart/smartTravelingTournamentSolverBenchmarkConfig.xml	2009-04-24 13:16:20 UTC (rev 26240)
@@ -7,9 +7,9 @@
     <inheritedUnsolvedSolutionFile>data/travelingtournament/smart/unsolved/1-nl10.xml</inheritedUnsolvedSolutionFile>
     <inheritedLocalSearchSolver>
         <scoreDrl>/org/drools/solver/examples/travelingtournament/solver/smart/smartTravelingTournamentScoreRules.drl</scoreDrl>
-        <scoreCalculator>
-            <scoreCalculatorType>HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>
-        </scoreCalculator>
+        <scoreDefinition>
+            <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>
+        </scoreDefinition>
         <finish>
             <maximumHouresSpend>2</maximumHouresSpend>
         </finish>

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/solver/simple/simpleTravelingTournamentSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/solver/simple/simpleTravelingTournamentSolverConfig.xml	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/solver/simple/simpleTravelingTournamentSolverConfig.xml	2009-04-24 13:16:20 UTC (rev 26240)
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <localSearchSolver>
     <scoreDrl>/org/drools/solver/examples/travelingtournament/solver/simple/simpleTravelingTournamentScoreRules.drl</scoreDrl>
-    <scoreCalculator>
-        <scoreCalculatorType>HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>
-    </scoreCalculator>
+    <scoreDefinition>
+        <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>
+    </scoreDefinition>
     <finish>
         <maximumHouresSpend>2</maximumHouresSpend>
     </finish>

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/solver/smart/smartTravelingTournamentSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/solver/smart/smartTravelingTournamentSolverConfig.xml	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/main/resources/org/drools/solver/examples/travelingtournament/solver/smart/smartTravelingTournamentSolverConfig.xml	2009-04-24 13:16:20 UTC (rev 26240)
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <localSearchSolver>
     <scoreDrl>/org/drools/solver/examples/travelingtournament/solver/smart/smartTravelingTournamentScoreRules.drl</scoreDrl>
-    <scoreCalculator>
-        <scoreCalculatorType>HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>
-    </scoreCalculator>
+    <scoreDefinition>
+        <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>
+    </scoreDefinition>
     <finish>
         <!--<maximumHouresSpend>2</maximumHouresSpend>-->
         <maximumStepCount>100</maximumStepCount>

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/test/java/org/drools/solver/examples/nqueens/NQueensSmokeTest.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/test/java/org/drools/solver/examples/nqueens/NQueensSmokeTest.java	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/test/java/org/drools/solver/examples/nqueens/NQueensSmokeTest.java	2009-04-24 13:16:20 UTC (rev 26240)
@@ -2,6 +2,8 @@
 
 import junit.framework.TestCase;
 import org.drools.solver.core.Solver;
+import org.drools.solver.core.score.Score;
+import org.drools.solver.core.score.DefaultSimpleScore;
 import org.drools.solver.core.solution.Solution;
 import org.drools.solver.config.XmlSolverConfigurer;
 import org.drools.solver.examples.common.persistence.XstreamSolutionDaoImpl;
@@ -28,8 +30,8 @@
         solver.solve();
         Solution bestSolution = solver.getBestSolution();
         assertNotNull(bestSolution);
-        double bestScore = solver.getBestScore();
-        assertEquals(0.0, bestScore);
+        Score bestScore = solver.getBestScore();
+        assertEquals(DefaultSimpleScore.valueOf(0), bestScore);
     }
 
 }

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/test/resources/org/drools/solver/examples/nqueens/solver/nqueensSmokeSolverConfig.xml
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/test/resources/org/drools/solver/examples/nqueens/solver/nqueensSmokeSolverConfig.xml	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-examples/src/test/resources/org/drools/solver/examples/nqueens/solver/nqueensSmokeSolverConfig.xml	2009-04-24 13:16:20 UTC (rev 26240)
@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <localSearchSolver>
     <scoreDrl>/org/drools/solver/examples/nqueens/solver/nQueensScoreRules.drl</scoreDrl>
-    <scoreCalculator>
-        <scoreCalculatorType>SIMPLE</scoreCalculatorType>
-    </scoreCalculator>
+    <scoreDefinition>
+        <scoreDefinitionType>SIMPLE</scoreDefinitionType>
+    </scoreDefinition>
     <finish>
         <finishCompositionStyle>OR</finishCompositionStyle>
         <maximumStepCount>5</maximumStepCount>
-        <feasableScore>0.0</feasableScore>
+        <feasableScore>0</feasableScore>
     </finish>
     <selector>
         <moveFactoryClass>org.drools.solver.examples.nqueens.solver.move.factory.NQueensMoveFactory</moveFactoryClass>

Modified: labs/jbossrules/trunk/drools-solver/src/main/assembly/docs/UpgradeFromPreviousVersionRecipe.txt
===================================================================
--- labs/jbossrules/trunk/drools-solver/src/main/assembly/docs/UpgradeFromPreviousVersionRecipe.txt	2009-04-24 09:31:27 UTC (rev 26239)
+++ labs/jbossrules/trunk/drools-solver/src/main/assembly/docs/UpgradeFromPreviousVersionRecipe.txt	2009-04-24 13:16:20 UTC (rev 26240)
@@ -8,3 +8,69 @@
 ----------------------
 
 No backwards imcompatible changes.
+
+From 5.0.0 to 5.0.1
+-------------------
+
+A score is no longer a double, now it's a Score instance.
+
+
+In the Solver interface, the return type of the getBestScore() method changed:
+Before:
+    double score = solver.getBestScore();
+After:
+    Score score = solver.getBestScore();
+
+
+Simple scores are written "-999", and hard and soft scores are written "-999hard/-999soft".
+You will see this in the examples GUI.
+In the *ScoreConfig.xml, configuring a feasableScore also reflects this.
+Before with simple score:
+    <finish>
+        <feasableScore>-123456789.0</feasableScore>
+    </finish>
+After:
+    <finish>
+        <feasableScore>-123456789</feasableScore>
+    </finish>
+Before with hard and soft score (Note that the hard part started from 1000000):
+    <finish>
+        <feasableScore>-123456789.0</feasableScore>
+    </finish>
+After:
+    <finish>
+        <feasableScore>-123hard/-456789soft</feasableScore>-->
+    </finish>
+
+
+In the *ScoreConfig.xml, you no longer configure a ScoreCalculator,
+but now you configure a ScoreDefinition instead.
+
+Before:
+    <scoreCalculator>
+        <scoreCalculatorType>SIMPLE</scoreCalculatorType>
+    </scoreCalculator>
+After:
+    <scoreDefinition>
+        <scoreDefinitionType>SIMPLE</scoreDefinitionType>
+    </scoreDefinition>
+
+Before:
+    <scoreCalculator>
+        <scoreCalculatorType>HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>
+    </scoreCalculator>
+After:
+    <scoreDefinition>
+        <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>
+    </scoreDefinition>
+
+DYNAMIC_HARD_AND_SOFT_CONSTRAINTS was bugged and has been removed, but will be replaced
+by shiftingPenalty support.
+Before:
+    <scoreCalculator>
+        <scoreCalculatorType>DYNAMIC_HARD_AND_SOFT_CONSTRAINTS</scoreCalculatorType>
+    </scoreCalculator>
+After:
+    <scoreDefinition>
+        <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType>
+    </scoreDefinition>




More information about the jboss-svn-commits mailing list