[jboss-svn-commits] JBL Code SVN: r25944 - in labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score: comparator and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Apr 5 14:53:30 EDT 2009


Author: ge0ffrey
Date: 2009-04-05 14:53:30 -0400 (Sun, 05 Apr 2009)
New Revision: 25944

Added:
   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/HardAndSoftScore.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/SimpleScore.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/
   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
Removed:
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/HardAndSoftScore.java
Modified:
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/AbstractScore.java
   labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/Score.java
Log:
score_refactor attempt 1 - subpart of Score and ScoreComparator without weaving them into the code

Modified: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/AbstractScore.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/AbstractScore.java	2009-04-05 18:51:22 UTC (rev 25943)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/AbstractScore.java	2009-04-05 18:53:30 UTC (rev 25944)
@@ -3,9 +3,14 @@
 import java.io.Serializable;
 
 /**
+ * Abstract superclass for {@link Score}.
+ * <p/>
+ * Subclasses must be immutable.
+ * @see Score
+ * @see DefaultHardAndSoftScore
  * @author Geoffrey De Smet
  */
-public abstract class AbstractScore<S extends AbstractScore<S>>
+public abstract class AbstractScore<S extends Score>
         implements Score<S>, Serializable {
 
 }

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/DefaultHardAndSoftScore.java (from rev 25280, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/HardAndSoftScore.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/DefaultHardAndSoftScore.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/DefaultHardAndSoftScore.java	2009-04-05 18:53:30 UTC (rev 25944)
@@ -0,0 +1,100 @@
+package org.drools.solver.core.score;
+
+/**
+ * Default implementation of {@link HardAndSoftScore}.
+ * <p/>
+ * This class is immutable.
+ * @author Geoffrey De Smet
+ */
+public final class DefaultHardAndSoftScore extends AbstractScore<HardAndSoftScore>
+        implements HardAndSoftScore {
+
+    private static final String HARD_LABEL = "hard";
+    private static final String SOFT_LABEL = "soft";
+
+    public static Score valueOf(String scoreString) {
+        String[] scoreTokens = scoreString.split(HARD_LABEL + "\\/");
+        if (scoreTokens.length != 2 || !scoreTokens[1].endsWith(SOFT_LABEL)) {
+            throw new IllegalArgumentException("The scoreString (" + scoreString
+                    + ") doesn't follow the 999hard/999soft pattern.");
+        }
+        int hardScore = Integer.parseInt(scoreTokens[0]);
+        int softScore = Integer.parseInt(scoreTokens[1].substring(0, scoreTokens[1].length() - SOFT_LABEL.length()));
+        return valueOf(hardScore, softScore);
+    }
+
+    public static Score valueOf(int hardScore) {
+        return new DefaultHardAndSoftScore(hardScore);
+    }
+
+    public static Score valueOf(int hardScore, int softScore) {
+        return new DefaultHardAndSoftScore(hardScore, softScore);
+    }
+
+    private final int hardScore;
+    private final int softScore;
+
+    public DefaultHardAndSoftScore(int hardScore) {
+        // Any other softScore is better
+        this(hardScore, Integer.MIN_VALUE);
+    }
+
+    public DefaultHardAndSoftScore(int hardScore, int softScore) {
+        this.hardScore = hardScore;
+        this.softScore = softScore;
+    }
+
+    public int getHardScore() {
+        return hardScore;
+    }
+
+    public int getSoftScore() {
+        return softScore;
+    }
+
+    // ************************************************************************
+    // Worker methods
+    // ************************************************************************
+
+    public boolean equals(Object o) {
+        // A direct implementation (instead of EqualsBuilder) for to avoid dependencies
+        if (this == o) {
+            return true;
+        } else if (o instanceof HardAndSoftScore) {
+            HardAndSoftScore other = (HardAndSoftScore) o;
+            return hardScore == other.getHardScore()
+                    && softScore == other.getSoftScore();
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        // A direct implementation (instead of HashCodeBuilder) for to avoid dependencies
+        return (((17 * 37) + hardScore)) * 37 + softScore;
+    }
+
+    public int compareTo(HardAndSoftScore other) {
+        // A direct implementation (instead of CompareToBuilder) for to avoid dependencies
+        if (hardScore != other.getHardScore()) {
+            if (hardScore < other.getHardScore()) {
+                return -1;
+            } else {
+                return 1;
+            }
+        } else {
+           if (softScore < other.getSoftScore()) {
+               return -1;
+           } else if (softScore > other.getSoftScore()) {
+               return 1;
+           } else {
+               return 0;
+           }
+        }
+    }
+
+    public String toString() {
+        return hardScore + HARD_LABEL + "/" + softScore + SOFT_LABEL;
+    }
+
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/DefaultSimpleScore.java	2009-04-05 18:53:30 UTC (rev 25944)
@@ -0,0 +1,69 @@
+package org.drools.solver.core.score;
+
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+
+/**
+ * Default implementation of {@link SimpleScore}.
+ * <p/>
+ * This class is immutable.
+ * @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 Score valueOf(String scoreString) {
+        return valueOf(Integer.parseInt(scoreString));
+    }
+
+    private final int score;
+
+    public DefaultSimpleScore(int score) {
+        this.score = score;
+    }
+
+    public int getScore() {
+        return score;
+    }
+
+    // ************************************************************************
+    // Worker methods
+    // ************************************************************************
+
+    public boolean equals(Object o) {
+        // A direct implementation (instead of EqualsBuilder) for to avoid dependencies
+        if (this == o) {
+            return true;
+        } else if (o instanceof SimpleScore) {
+            SimpleScore other = (SimpleScore) o;
+            return score == other.getScore();
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        // A direct implementation (instead of HashCodeBuilder) for to avoid dependencies
+        return (17 * 37) + score;
+    }
+
+    public int compareTo(SimpleScore other) {
+        // A direct implementation (instead of CompareToBuilder) for to avoid dependencies
+       if (score < other.getScore()) {
+           return -1;
+       } else if (score > other.getScore()) {
+           return 1;
+       } else {
+           return 0;
+       }
+    }
+
+    public String toString() {
+        return Integer.toString(score);
+    }
+
+}
\ No newline at end of file

Deleted: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/HardAndSoftScore.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/HardAndSoftScore.java	2009-04-05 18:51:22 UTC (rev 25943)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/HardAndSoftScore.java	2009-04-05 18:53:30 UTC (rev 25944)
@@ -1,45 +0,0 @@
-package org.drools.solver.core.score;
-
-/**
- * This class is immutable.
- * @author Geoffrey De Smet
- */
-public class HardAndSoftScore extends AbstractScore<HardAndSoftScore> {
-
-    private int hardScore;
-    private int softScore;
-
-    public HardAndSoftScore(int hardScore) {
-        this.hardScore = hardScore;
-        // Any other softScore is better
-        softScore = Integer.MIN_VALUE;
-    }
-
-    public HardAndSoftScore(int hardScore, int softScore) {
-        this.hardScore = hardScore;
-        this.softScore = softScore;
-    }
-
-    public int compareTo(HardAndSoftScore other) {
-        if (hardScore != other.hardScore) {
-            if (hardScore < other.hardScore) {
-                return -1;
-            } else {
-                return 1;
-            }
-        } else {
-           if (softScore < other.softScore) {
-               return -1;
-           } else if (softScore > other.softScore) {
-               return 1;
-           } else {
-               return 0;
-           }
-        }
-    }
-
-    public String toString() {
-        return hardScore + "hard/" + softScore + "soft";
-    }
-
-}

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/HardAndSoftScore.java (from rev 25280, 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/HardAndSoftScore.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/HardAndSoftScore.java	2009-04-05 18:53:30 UTC (rev 25944)
@@ -0,0 +1,34 @@
+package org.drools.solver.core.score;
+
+/**
+ * A HardAndSoftScore is a Score based on hard constraints and soft constraints.
+ * Hard constraints have priority over soft constraints.
+ * <p/>
+ * Implementations must be immutable.
+ * @see Score
+ * @see DefaultHardAndSoftScore
+ * @author Geoffrey De Smet
+ */
+public interface HardAndSoftScore extends Score<HardAndSoftScore> {
+
+    /**
+     * The total of the broken negative hard constraints and fulfilled postive hard constraints.
+     * Their weight is included in the total.
+     * The hard score is usually a negative number because most use cases only have negative constraints.
+     *
+     * @return higher is better, usually negative, 0 if no hard constraints are broken/fulfilled
+     */
+    int getHardScore();
+
+    /**
+     * The total of the broken negative soft constraints and fulfilled postive soft constraints.
+     * Their weight is included in the total.
+     * The soft score is usually a negative number because most use cases only have negative constraints.
+     * <p/>
+     * In a normal score comparison, the soft score is irrelevant if the 2 scores don't have the same hard score.
+     * 
+     * @return higher is better, usually negative, 0 if no soft constraints are broken/fulfilled
+     */
+    int getSoftScore();
+
+}
\ No newline at end of file

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-05 18:51:22 UTC (rev 25943)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/Score.java	2009-04-05 18:53:30 UTC (rev 25944)
@@ -1,11 +1,13 @@
 package org.drools.solver.core.score;
 
 /**
- * Implementations should be immutable.
+ * A Score is result of the score function (AKA fitness function) on a single possible solution.
+ * <p/>
+ * Implementations must be immutable.
+ * @see AbstractScore
+ * @see DefaultHardAndSoftScore
  * @author Geoffrey De Smet
  */
-public interface Score<S extends Score<S>> extends Comparable<S> {
+public interface Score<S extends Score> extends Comparable<S> {
 
-
-
 }

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/SimpleScore.java (from rev 25280, 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/SimpleScore.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/SimpleScore.java	2009-04-05 18:53:30 UTC (rev 25944)
@@ -0,0 +1,22 @@
+package org.drools.solver.core.score;
+
+/**
+ * A SimpleScore is a Score based on constraints.
+ * <p/>
+ * Implementations must be immutable.
+ * @see Score
+ * @see DefaultSimpleScore
+ * @author Geoffrey De Smet
+ */
+public interface SimpleScore extends Score<SimpleScore> {
+
+    /**
+     * The total of the broken negative constraints and fulfilled postive hard constraints.
+     * Their weight is included in the total.
+     * The score is usually a negative number because most use cases only have negative constraints.
+     *
+     * @return higher is better, usually negative, 0 if no constraints are broken/fulfilled
+     */
+    int getScore();
+
+}
\ No newline at end of file

Copied: labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/AbstractScoreComparator.java (from rev 25249, labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/AbstractScore.java)
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/AbstractScoreComparator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/AbstractScoreComparator.java	2009-04-05 18:53:30 UTC (rev 25944)
@@ -0,0 +1,43 @@
+package org.drools.solver.core.score.comparator;
+
+import java.io.Serializable;
+
+import org.drools.solver.core.score.Score;
+
+/**
+ * Abstract superclass for {@link ScoreComparator}.
+ * @see ScoreComparator
+ * @author Geoffrey De Smet
+ */
+public abstract class AbstractScoreComparator<S extends Score> implements ScoreComparator<S>, Serializable {
+
+    // ************************************************************************
+    // Worker methods
+    // ************************************************************************
+
+    public int compare(S score1, S score2) {
+        return score1.compareTo(score2);
+    }
+
+    public int compareWithShiftingPenalty(S score1, S score2) {
+        // Hook which can be optionally overwritten by subclasses.
+        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) {
+            return 0.0;
+        } else if (score.compareTo(endScore) >= 0) {
+            return 1.0;
+        } else {
+            return 0.5;
+        }
+    }
+
+}
\ No newline at end of file

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/HardAndSoftScoreComparator.java	2009-04-05 18:53:30 UTC (rev 25944)
@@ -0,0 +1,94 @@
+package org.drools.solver.core.score.comparator;
+
+import java.io.Serializable;
+
+import org.drools.solver.core.score.Score;
+import org.drools.solver.core.score.HardAndSoftScore;
+import org.drools.solver.core.score.DefaultHardAndSoftScore;
+
+/**
+ * A HardAndSoftScoreComparator is a ScoreComparator for HardAndSoftScores.
+ * @see HardAndSoftScore
+ * @author Geoffrey De Smet
+ */
+public class HardAndSoftScoreComparator extends AbstractScoreComparator<HardAndSoftScore> {
+
+    private HardAndSoftScore perfectScore = new DefaultHardAndSoftScore(0, 0);
+    private double hardScoreTimeGradientWeight = 0.5;
+
+    public void setPerfectScore(HardAndSoftScore perfectScore) {
+        this.perfectScore = perfectScore;
+    }
+
+    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.");
+        }
+    }
+
+    // ************************************************************************
+    // Worker methods
+    // ************************************************************************
+
+    public int compare(HardAndSoftScore score1, HardAndSoftScore score2) {
+        return score1.compareTo(score2);
+    }
+
+    public boolean better(HardAndSoftScore score1, HardAndSoftScore score2) {
+        return (score1.getHardScore() > score2.getHardScore())
+                || (score1.getHardScore() == score2.getHardScore() && score1.getSoftScore() > score2.getSoftScore());
+    }
+
+    public boolean betterOrEqual(HardAndSoftScore score1, HardAndSoftScore score2) {
+        return (score1.getHardScore() > score2.getHardScore())
+                || (score1.getHardScore() == score2.getHardScore() && score1.getSoftScore() >= score2.getSoftScore());
+    }
+
+    public boolean equal(HardAndSoftScore score1, HardAndSoftScore score2) {
+        return score1.getHardScore() == score2.getHardScore() && score1.getSoftScore() == score2.getSoftScore();
+    }
+
+    public boolean notEqual(HardAndSoftScore score1, HardAndSoftScore score2) {
+        return score1.getHardScore() != score2.getHardScore() || score1.getSoftScore() != score2.getSoftScore();
+    }
+
+    public boolean worse(HardAndSoftScore score1, HardAndSoftScore score2) {
+        return (score1.getHardScore() < score2.getHardScore())
+                || (score1.getHardScore() == score2.getHardScore() && score1.getSoftScore() < score2.getSoftScore());
+    }
+
+    public boolean worseOrEqual(HardAndSoftScore score1, HardAndSoftScore score2) {
+        return (score1.getHardScore() < score2.getHardScore())
+                || (score1.getHardScore() == score2.getHardScore() && score1.getSoftScore() <= score2.getSoftScore());
+    }
+
+    public int compareWithShiftingPenalty(HardAndSoftScore score1, HardAndSoftScore score2) {
+        // TODO implement me
+        return compare(score1, score2);
+    }
+
+    public HardAndSoftScore getPerfectScore() {
+        return perfectScore;
+    }
+
+    public double calculateTimeGradient(HardAndSoftScore startScore, HardAndSoftScore endScore,
+            HardAndSoftScore score) {
+        double timeGradient = 0.0;
+        int totalHardScore = Math.max(0, endScore.getHardScore() - startScore.getHardScore());
+        if (totalHardScore > 0) {
+            int hardScoreDelta = Math.max(0, score.getHardScore() - startScore.getHardScore());
+            double hardTimeGradient = Math.min(1.0, (double) hardScoreDelta / (double) totalHardScore);
+            timeGradient += (hardTimeGradient * hardScoreTimeGradientWeight);
+        }
+        int totalSoftScore = Math.max(0, endScore.getSoftScore() - startScore.getSoftScore());
+        if (totalSoftScore > 0) {
+            int softScoreDelta = Math.max(0, score.getSoftScore() - startScore.getSoftScore());
+            double softTimeGradient = Math.min(1.0, (double) softScoreDelta / (double) totalSoftScore);
+            timeGradient += (softTimeGradient * (1.0 - hardScoreTimeGradientWeight)); 
+        }
+        return timeGradient;
+    }
+
+}
\ No newline at end of file

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/ScoreComparator.java	2009-04-05 18:53:30 UTC (rev 25944)
@@ -0,0 +1,76 @@
+package org.drools.solver.core.score.comparator;
+
+import java.util.Comparator;
+
+import org.drools.solver.core.score.Score;
+import org.drools.solver.core.score.HardAndSoftScore;
+
+/**
+ * A ScoreComparator can compare 2 Scores, optionally taking shifting penalties into account.
+ * <p/>
+ * Most implementations are writting specifically for a certain Score implementation.
+ * @see Score
+ * @see AbstractScoreComparator
+ * @see SimpleScoreComparator
+ * @see HardAndSoftScoreComparator
+ * @author Geoffrey De Smet
+ */
+public interface ScoreComparator<S extends Score> extends Comparator<S> {
+
+    /**
+     * Compares 2 scores. The better score is greater than the other score.
+     * This method follows the conventions of {@link Comparator#compare}.
+     *
+     * @param score1 the first score to be compared, never null.
+     * @param score2 the second score to be compared, never null.
+     * @return a negative integer, zero, or a positive integer as the
+     * 	       first score is worse than, equal to, or better than the
+     *	       second score.
+     * @see #compareWithShiftingPenalty
+     */
+    int compare(S score1, S score2);
+
+    boolean better(S score1, S score2);
+    boolean betterOrEqual(S score1, S score2);
+    boolean equal(S score1, S score2);
+    boolean notEqual(S score1, S score2);
+    boolean worse(S score1, S score2);
+    boolean worseOrEqual(S score1, S score2);
+
+    /**
+     * Compares 2 scores, taking a shifting penalty into consideration if a shifting penalty is applied.
+     * The better score is greater than the other score.
+     * This method follows the conventions of {@link Comparator#compare}.
+     * </p>
+     * A shifting penalty can for example lower (resp. highten) the weight of a constraint
+     * if for a number of steps that constraint is satisfied (resp. not satisfied).
+     *
+     * @param score1 the first score to be compared, never null.
+     * @param score2 the second score to be compared, never null.
+     * @return a negative integer, zero, or a positive integer as the
+     * 	       first score is worse than, equal to, or better than the
+     *	       second score.
+     * @see #compare
+     */
+    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();
+
+    /**
+     *
+     * @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/comparator/SimpleScoreComparator.java
===================================================================
--- labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/SimpleScoreComparator.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-solver/drools-solver-core/src/main/java/org/drools/solver/core/score/comparator/SimpleScoreComparator.java	2009-04-05 18:53:30 UTC (rev 25944)
@@ -0,0 +1,73 @@
+package org.drools.solver.core.score.comparator;
+
+import java.io.Serializable;
+
+import org.drools.solver.core.score.Score;
+import org.drools.solver.core.score.SimpleScore;
+import org.drools.solver.core.score.DefaultSimpleScore;
+
+/**
+ * A SimpleScoreComparator is a ScoreComparator for SimpleScores.
+ * @see SimpleScore
+ * @author Geoffrey De Smet
+ */
+public class SimpleScoreComparator extends AbstractScoreComparator<SimpleScore> {
+
+    private SimpleScore perfectScore = new DefaultSimpleScore(0);
+
+    public void setPerfectScore(SimpleScore perfectScore) {
+        this.perfectScore = perfectScore;
+    }
+
+    // ************************************************************************
+    // Worker methods
+    // ************************************************************************
+
+    public int compare(SimpleScore score1, SimpleScore score2) {
+        return score1.compareTo(score2);
+    }
+
+    public boolean better(SimpleScore score1, SimpleScore score2) {
+        return score1.getScore() > score2.getScore();
+    }
+
+    public boolean betterOrEqual(SimpleScore score1, SimpleScore score2) {
+        return score1.getScore() >= score2.getScore();
+    }
+
+    public boolean equal(SimpleScore score1, SimpleScore score2) {
+        return score1.getScore() == score2.getScore();
+    }
+
+    public boolean notEqual(SimpleScore score1, SimpleScore score2) {
+        return score1.getScore() != score2.getScore();
+    }
+
+    public boolean worse(SimpleScore score1, SimpleScore score2) {
+        return score1.getScore() < score2.getScore();
+    }
+
+    public boolean worseOrEqual(SimpleScore score1, SimpleScore score2) {
+        return score1.getScore() <= score2.getScore();
+    }
+
+    public int compareWithShiftingPenalty(SimpleScore score1, SimpleScore score2) {
+        // TODO implement me
+        return compare(score1, score2);
+    }
+
+    public SimpleScore getPerfectScore() {
+        return perfectScore;
+    }
+
+    public double calculateTimeGradient(SimpleScore startScore, SimpleScore endScore, SimpleScore score) {
+        double timeGradient = 0.0;
+        int totalSoftScore = Math.max(0, endScore.getScore() - startScore.getScore());
+        if (totalSoftScore > 0) {
+            int softScoreDelta = Math.max(0, score.getScore() - startScore.getScore());
+            timeGradient = Math.min(1.0, (double) softScoreDelta / (double) totalSoftScore);
+        }
+        return timeGradient;
+    }
+
+}
\ No newline at end of file




More information about the jboss-svn-commits mailing list