[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