@Override public int compareTo(HardMediumSoftLongScore other) { // A direct implementation (instead of CompareToBuilder) to avoid dependencies if (initScore != other.getInitScore()) { return initScore < other.getInitScore() ? -1 : 1; } else if (hardScore != other.getHardScore()) { return hardScore < other.getHardScore() ? -1 : 1; } else if (mediumScore != other.getMediumScore()) { return mediumScore < other.getMediumScore() ? -1 : 1; } else { return Long.compare(softScore, other.getSoftScore()); } }
@Override public boolean equals(Object o) { // A direct implementation (instead of EqualsBuilder) to avoid dependencies if (this == o) { return true; } else if (o instanceof HardMediumSoftLongScore) { HardMediumSoftLongScore other = (HardMediumSoftLongScore) o; return initScore == other.getInitScore() && hardScore == other.getHardScore() && mediumScore == other.getMediumScore() && softScore == other.getSoftScore(); } else { return false; } }
@Override public HardMediumSoftLongScore add(HardMediumSoftLongScore augment) { return new HardMediumSoftLongScore( initScore + augment.getInitScore(), hardScore + augment.getHardScore(), mediumScore + augment.getMediumScore(), softScore + augment.getSoftScore()); }
@Override public HardMediumSoftLongScore subtract(HardMediumSoftLongScore subtrahend) { return new HardMediumSoftLongScore( initScore - subtrahend.getInitScore(), hardScore - subtrahend.getHardScore(), mediumScore - subtrahend.getMediumScore(), softScore - subtrahend.getSoftScore()); }
@Override public HardMediumSoftLongScore buildOptimisticBound(InitializingScoreTrend initializingScoreTrend, HardMediumSoftLongScore score) { InitializingScoreTrendLevel[] trendLevels = initializingScoreTrend.getTrendLevels(); return HardMediumSoftLongScore.ofUninitialized(0, trendLevels[0] == InitializingScoreTrendLevel.ONLY_DOWN ? score.getHardScore() : Long.MAX_VALUE, trendLevels[1] == InitializingScoreTrendLevel.ONLY_DOWN ? score.getMediumScore() : Long.MAX_VALUE, trendLevels[2] == InitializingScoreTrendLevel.ONLY_DOWN ? score.getSoftScore() : Long.MAX_VALUE); }
@Override public HardMediumSoftLongScore buildPessimisticBound(InitializingScoreTrend initializingScoreTrend, HardMediumSoftLongScore score) { InitializingScoreTrendLevel[] trendLevels = initializingScoreTrend.getTrendLevels(); return HardMediumSoftLongScore.ofUninitialized(0, trendLevels[0] == InitializingScoreTrendLevel.ONLY_UP ? score.getHardScore() : Long.MIN_VALUE, trendLevels[1] == InitializingScoreTrendLevel.ONLY_UP ? score.getMediumScore() : Long.MIN_VALUE, trendLevels[2] == InitializingScoreTrendLevel.ONLY_UP ? score.getSoftScore() : Long.MIN_VALUE); }
@Override public void configureConstraintWeight(Rule rule, HardMediumSoftLongScore constraintWeight) { super.configureConstraintWeight(rule, constraintWeight); BiConsumer<RuleContext, Long> matchExecutor; if (constraintWeight.equals(HardMediumSoftLongScore.ZERO)) { matchExecutor = (RuleContext kcontext, Long matchWeight) -> {}; } else if (constraintWeight.getMediumScore() == 0 && constraintWeight.getSoftScore() == 0) { matchExecutor = (RuleContext kcontext, Long matchWeight) -> addHardConstraintMatch(kcontext, constraintWeight.getHardScore() * matchWeight); } else if (constraintWeight.getHardScore() == 0 && constraintWeight.getSoftScore() == 0) { matchExecutor = (RuleContext kcontext, Long matchWeight) -> addMediumConstraintMatch(kcontext, constraintWeight.getMediumScore() * matchWeight); } else if (constraintWeight.getHardScore() == 0 && constraintWeight.getMediumScore() == 0) { matchExecutor = (RuleContext kcontext, Long matchWeight) -> addSoftConstraintMatch(kcontext, constraintWeight.getSoftScore() * matchWeight); } else { matchExecutor = (RuleContext kcontext, Long matchWeight) -> addMultiConstraintMatch(kcontext, constraintWeight.getHardScore() * matchWeight, constraintWeight.getMediumScore() * matchWeight, constraintWeight.getSoftScore() * matchWeight); } matchExecutorByNumberMap.put(rule, matchExecutor); matchExecutorByScoreMap.put(rule, (RuleContext kcontext, HardMediumSoftLongScore weightMultiplier) -> addMultiConstraintMatch(kcontext, constraintWeight.getHardScore() * weightMultiplier.getHardScore(), constraintWeight.getMediumScore() * weightMultiplier.getMediumScore(), constraintWeight.getSoftScore() * weightMultiplier.getSoftScore())); }
@Test public void buildPessimisticBoundOnlyDown() { HardMediumSoftLongScoreDefinition scoreDefinition = new HardMediumSoftLongScoreDefinition(); HardMediumSoftLongScore pessimisticBound = scoreDefinition.buildPessimisticBound( InitializingScoreTrend.buildUniformTrend(InitializingScoreTrendLevel.ONLY_DOWN, 3), HardMediumSoftLongScore.of(-1L, -2L, -3L)); assertEquals(0, pessimisticBound.getInitScore()); assertEquals(Long.MIN_VALUE, pessimisticBound.getHardScore()); assertEquals(Long.MIN_VALUE, pessimisticBound.getMediumScore()); assertEquals(Long.MIN_VALUE, pessimisticBound.getSoftScore()); }
@Test public void buildOptimisticBoundOnlyUp() { HardMediumSoftLongScoreDefinition scoreDefinition = new HardMediumSoftLongScoreDefinition(); HardMediumSoftLongScore optimisticBound = scoreDefinition.buildOptimisticBound( InitializingScoreTrend.buildUniformTrend(InitializingScoreTrendLevel.ONLY_UP, 3), HardMediumSoftLongScore.of(-1L, -2L, -3L)); assertEquals(0, optimisticBound.getInitScore()); assertEquals(Long.MAX_VALUE, optimisticBound.getHardScore()); assertEquals(Long.MAX_VALUE, optimisticBound.getMediumScore()); assertEquals(Long.MAX_VALUE, optimisticBound.getSoftScore()); }
@Test public void buildOptimisticBoundOnlyDown() { HardMediumSoftLongScoreDefinition scoreDefinition = new HardMediumSoftLongScoreDefinition(); HardMediumSoftLongScore optimisticBound = scoreDefinition.buildOptimisticBound( InitializingScoreTrend.buildUniformTrend(InitializingScoreTrendLevel.ONLY_DOWN, 3), HardMediumSoftLongScore.of(-1L, -2L, -3L)); assertEquals(0, optimisticBound.getInitScore()); assertEquals(-1L, optimisticBound.getHardScore()); assertEquals(-2L, optimisticBound.getMediumScore()); assertEquals(-3L, optimisticBound.getSoftScore()); }
@Test public void buildPessimisticBoundOnlyUp() { HardMediumSoftLongScoreDefinition scoreDefinition = new HardMediumSoftLongScoreDefinition(); HardMediumSoftLongScore pessimisticBound = scoreDefinition.buildPessimisticBound( InitializingScoreTrend.buildUniformTrend(InitializingScoreTrendLevel.ONLY_UP, 3), HardMediumSoftLongScore.of(-1L, -2L, -3L)); assertEquals(0, pessimisticBound.getInitScore()); assertEquals(-1L, pessimisticBound.getHardScore()); assertEquals(-2L, pessimisticBound.getMediumScore()); assertEquals(-3L, pessimisticBound.getSoftScore()); }
@Test public void serializeAndDeserialize() { PlannerTestUtils.serializeAndDeserializeWithAll( HardMediumSoftLongScore.of(-12L, 3400L, -56L), output -> { assertEquals(0, output.getInitScore()); assertEquals(-12L, output.getHardScore()); assertEquals(3400L, output.getMediumScore()); assertEquals(-56L, output.getSoftScore()); } ); PlannerTestUtils.serializeAndDeserializeWithAll( HardMediumSoftLongScore.ofUninitialized(-7, -12L, 3400L, -56L), output -> { assertEquals(-7, output.getInitScore()); assertEquals(-12L, output.getHardScore()); assertEquals(3400L, output.getMediumScore()); assertEquals(-56L, output.getSoftScore()); } ); }