/** * @param kcontext never null, the magic variable in DRL * @param softWeight higher is better, negative for a penalty, positive for a reward */ public void addSoftConstraintMatch(RuleContext kcontext, long softWeight) { softScore += softWeight; registerConstraintMatch(kcontext, () -> softScore -= softWeight, () -> HardMediumSoftLongScore.of(0L, 0L, softWeight)); }
@Override public HardMediumSoftLongScore subtract(HardMediumSoftLongScore subtrahend) { return new HardMediumSoftLongScore( initScore - subtrahend.getInitScore(), hardScore - subtrahend.getHardScore(), mediumScore - subtrahend.getMediumScore(), softScore - subtrahend.getSoftScore()); }
@Override public HardMediumSoftLongScore withInitScore(int newInitScore) { assertNoInitScore(); return new HardMediumSoftLongScore(newInitScore, hardScore, mediumScore, softScore); }
@Test public void feasible() { assertScoreNotFeasible( HardMediumSoftLongScore.of(-5L, -300L, -4000L), HardMediumSoftLongScore.ofUninitialized(-7, -5L, -300L, -4000L), HardMediumSoftLongScore.ofUninitialized(-7, 0L, -300L, -4000L) ); assertScoreFeasible( HardMediumSoftLongScore.of(0L, -300L, -4000L), HardMediumSoftLongScore.of(2L, -300L, -4000L), HardMediumSoftLongScore.ofUninitialized(0, 0L, -300L, -4000L) ); }
public static HardMediumSoftLongScore parseScore(String scoreString) { String[] scoreTokens = parseScoreTokens(HardMediumSoftLongScore.class, scoreString, HARD_LABEL, MEDIUM_LABEL, SOFT_LABEL); int initScore = parseInitScore(HardMediumSoftLongScore.class, scoreString, scoreTokens[0]); long hardScore = parseLevelAsLong(HardMediumSoftLongScore.class, scoreString, scoreTokens[1]); long mediumScore = parseLevelAsLong(HardMediumSoftLongScore.class, scoreString, scoreTokens[2]); long softScore = parseLevelAsLong(HardMediumSoftLongScore.class, scoreString, scoreTokens[3]); return ofUninitialized(initScore, hardScore, mediumScore, softScore); }
@Override public HardMediumSoftLongScore calculateScore() { return HardMediumSoftLongScore.of(hardScore, mediumScore, softScore); }
@Override public HardMediumSoftLongScore extractScore(int initScore) { return HardMediumSoftLongScore.ofUninitialized(initScore, hardScore, mediumScore, softScore); }
@Override public HardMediumSoftLongScore parseScore(String scoreString) { return HardMediumSoftLongScore.parseScore(scoreString); }
/** * Penalize a match by the {@link ConstraintWeight} negated. * @param kcontext never null, the magic variable in DRL */ public void penalize(RuleContext kcontext) { reward(kcontext, -1L); }
@Override public HardMediumSoftLongScore toInitializedScore() { return initScore == 0 ? this : new HardMediumSoftLongScore(0, hardScore, mediumScore, softScore); }
@Override public String toString() { return getInitPrefix() + hardScore + HARD_LABEL + "/" + mediumScore + MEDIUM_LABEL + "/" + softScore + SOFT_LABEL; }
/** * @param kcontext never null, the magic variable in DRL * @param hardWeight higher is better, negative for a penalty, positive for a reward */ public void addHardConstraintMatch(RuleContext kcontext, long hardWeight) { hardScore += hardWeight; registerConstraintMatch(kcontext, () -> hardScore -= hardWeight, () -> HardMediumSoftLongScore.of(hardWeight, 0L, 0L)); }
@Override public HardMediumSoftLongScore add(HardMediumSoftLongScore augment) { return new HardMediumSoftLongScore( initScore + augment.getInitScore(), hardScore + augment.getHardScore(), mediumScore + augment.getMediumScore(), softScore + augment.getSoftScore()); }
@Override public HardMediumSoftLongScore unmarshal(String scoreString) { return HardMediumSoftLongScore.parseScore(scoreString); }
/** * Reward a match by the {@link ConstraintWeight}. * @param kcontext never null, the magic variable in DRL */ public void reward(RuleContext kcontext) { reward(kcontext, 1L); }
@Override public HardMediumSoftLongScore negate() { return new HardMediumSoftLongScore(-initScore, -hardScore, -mediumScore, -softScore); }
/** * @param kcontext never null, the magic variable in DRL * @param mediumWeight higher is better, negative for a penalty, positive for a reward */ public void addMediumConstraintMatch(RuleContext kcontext, long mediumWeight) { mediumScore += mediumWeight; registerConstraintMatch(kcontext, () -> mediumScore -= mediumWeight, () -> HardMediumSoftLongScore.of(0L, mediumWeight, 0L)); }
/** * Penalize a match by the {@link ConstraintWeight} negated and multiplied with the weightMultiplier for all score levels. * @param kcontext never null, the magic variable in DRL * @param weightMultiplier at least 0 */ public void penalize(RuleContext kcontext, long weightMultiplier) { reward(kcontext, -weightMultiplier); }
public static HardMediumSoftLongScore ofSoft(long softScore) { return new HardMediumSoftLongScore(0, 0, 0, softScore); }
/** * Penalize a match by the {@link ConstraintWeight} negated and multiplied with the specific weightMultiplier per score level. * Slower than {@link #penalize(RuleContext, long)}. * @param kcontext never null, the magic variable in DRL * @param hardWeightMultiplier at least 0 * @param mediumWeightMultiplier at least 0 * @param softWeightMultiplier at least 0 */ public void penalize(RuleContext kcontext, long hardWeightMultiplier, long mediumWeightMultiplier, long softWeightMultiplier) { reward(kcontext, -hardWeightMultiplier, -mediumWeightMultiplier, -softWeightMultiplier); }