/** * @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)); }
@Test public void subtract() { assertEquals(HardMediumSoftLongScore.of(21L, 280L, -8000L), HardMediumSoftLongScore.of(20L, -20L, -4000L).subtract( HardMediumSoftLongScore.of(-1L, -300L, 4000L))); assertEquals(HardMediumSoftLongScore.ofUninitialized(-63, 21L, 280L, -8000L), HardMediumSoftLongScore.ofUninitialized(-70, 20L, -20L, -4000L).subtract( HardMediumSoftLongScore.ofUninitialized(-7, -1L, -300L, 4000L))); }
@Test public void add() { assertEquals(HardMediumSoftLongScore.of(19L, -320L, 0L), HardMediumSoftLongScore.of(20L, -20L, -4000L).add( HardMediumSoftLongScore.of(-1L, -300L, 4000L))); assertEquals(HardMediumSoftLongScore.ofUninitialized(-77, 19L, -320L, 0L), HardMediumSoftLongScore.ofUninitialized(-70, 20L, -20L, -4000L).add( HardMediumSoftLongScore.ofUninitialized(-7, -1L, -300L, 4000L))); }
/** * @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)); }
@Test public void divide() { assertEquals(HardMediumSoftLongScore.of(5L, -5L, 5L), HardMediumSoftLongScore.of(25L, -25L, 25L).divide(5.0)); assertEquals(HardMediumSoftLongScore.of(4L, -5L, 4L), HardMediumSoftLongScore.of(21L, -21L, 21L).divide(5.0)); assertEquals(HardMediumSoftLongScore.of(4L, -5L, 4L), HardMediumSoftLongScore.of(24L, -24L, 24L).divide(5.0)); assertEquals(HardMediumSoftLongScore.ofUninitialized(-7, 4L, -5L, 6L), HardMediumSoftLongScore.ofUninitialized(-14, 8L, -10L, 12L).divide(2.0)); }
/** * @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)); }
@Test public void multiply() { assertEquals(HardMediumSoftLongScore.of(6L, -6L, 6L), HardMediumSoftLongScore.of(5L, -5L, 5L).multiply(1.2)); assertEquals(HardMediumSoftLongScore.of(1L, -2L, 1L), HardMediumSoftLongScore.of(1L, -1L, 1L).multiply(1.2)); assertEquals(HardMediumSoftLongScore.of(4L, -5L, 4L), HardMediumSoftLongScore.of(4L, -4L, 4L).multiply(1.2)); assertEquals(HardMediumSoftLongScore.ofUninitialized(-14, 8L, -10L, 12L), HardMediumSoftLongScore.ofUninitialized(-7, 4L, -5L, 6L).multiply(2.0)); }
@Test public void power() { assertEquals(HardMediumSoftLongScore.of(9L, 16L, 25L), HardMediumSoftLongScore.of(3L, -4L, 5L).power(2.0)); assertEquals(HardMediumSoftLongScore.of(3L, 4L, 5L), HardMediumSoftLongScore.of(9L, 16L, 25L).power(0.5)); assertEquals(HardMediumSoftLongScore.ofUninitialized(-343, 27L, -64L, 125L), HardMediumSoftLongScore.ofUninitialized(-7, 3L, -4L, 5L).power(3.0)); }
@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 toInitializedScore() { assertEquals(HardMediumSoftLongScore.of(-147L, -258L, -369L), HardMediumSoftLongScore.of(-147L, -258L, -369L).toInitializedScore()); assertEquals(HardMediumSoftLongScore.of(-147L, -258L, -369L), HardMediumSoftLongScore.ofUninitialized(-7, -147L, -258L, -369L).toInitializedScore()); }
@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 persistAndMerge() { persistAndMerge(new TestJpaEntity(null), HardMediumSoftLongScore.of(-100L, -20L, -3L), HardMediumSoftLongScore.ofUninitialized(-7, -100L, -20L, -3L)); }
@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 withInitScore() { assertEquals(HardMediumSoftLongScore.ofUninitialized(-7, -147L, -258L, -369L), HardMediumSoftLongScore.of(-147L, -258L, -369L).withInitScore(-7)); }
@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 parseScore() { assertEquals(HardMediumSoftLongScore.of(-147L, -258L, -369L), HardMediumSoftLongScore.parseScore("-147hard/-258medium/-369soft")); assertEquals(HardMediumSoftLongScore.ofUninitialized(-7, -147L, -258L, -369L), HardMediumSoftLongScore.parseScore("-7init/-147hard/-258medium/-369soft")); assertEquals(HardMediumSoftLongScore.of(-147L, -258L, Long.MIN_VALUE), HardMediumSoftLongScore.parseScore("-147hard/-258medium/*soft")); assertEquals(HardMediumSoftLongScore.of(-147L, Long.MIN_VALUE, -369L), HardMediumSoftLongScore.parseScore("-147hard/*medium/-369soft")); }
@Test public void serializeAndDeserialize() { assertSerializeAndDeserialize(null, new TestHardMediumSoftLongScoreWrapper(null)); HardMediumSoftLongScore score = HardMediumSoftLongScore.of(1200L, 30L, 4L); assertSerializeAndDeserialize(score, new TestHardMediumSoftLongScoreWrapper(score)); score = HardMediumSoftLongScore.ofUninitialized(-7, 1200L, 30L, 4L); assertSerializeAndDeserialize(score, new TestHardMediumSoftLongScoreWrapper(score)); }
@Test public void serializeAndDeserialize() { assertSerializeAndDeserialize(null, new TestHardMediumSoftLongScoreWrapper(null)); HardMediumSoftLongScore score = HardMediumSoftLongScore.of(1200L, 30L, 4L); assertSerializeAndDeserialize(score, new TestHardMediumSoftLongScoreWrapper(score)); score = HardMediumSoftLongScore.ofUninitialized(-7, 1200L, 30L, 4L); assertSerializeAndDeserialize(score, new TestHardMediumSoftLongScoreWrapper(score)); }
@Test public void serializeAndDeserialize() { assertSerializeAndDeserialize(null, new TestHardMediumSoftLongScoreWrapper(null)); HardMediumSoftLongScore score = HardMediumSoftLongScore.of(1200L, 30L, 4L); assertSerializeAndDeserialize(score, new TestHardMediumSoftLongScoreWrapper(score)); score = HardMediumSoftLongScore.ofUninitialized(-7, 1200L, 30L, 4L); assertSerializeAndDeserialize(score, new TestHardMediumSoftLongScoreWrapper(score)); }