Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add frequency + fallback value selector #1057

Merged
merged 7 commits into from
Aug 23, 2023
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 29 additions & 29 deletions parsers/src/test/resources/xcsp/instances.csv
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ basics;Allergy.xml.lzma;1;_;1;0
basics;AllInterval-005.xml.lzma;1;_;13;9
basics;Auction-cnt-example_c18.xml.lzma;2;54;7;4
basics;Auction-sum-example_c18.xml.lzma;2;54;6;3
basics;Bacp-m1-06_c18.xml.lzma;3;10;38111;37700
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

shouldn't we add the time ?
It should be compared with care but still it would be nice to have an idea if it is faster or slower

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Honestly, I won't add this for the reason described here (https://buildjet.com/for-github-actions/blog/why-github-actions-is-so-slow#what-hardware-is-actually-github-actions-using).
In two words, you cannot select the hardware the VM is running on.
This explains why Minizinc tests often fail on GH even though they work on my computer.

It's something I've been wanting to check for a long time now, but I can't find the right way to do it.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that GitHub test runtime is hard to trust, but this file is updated locally (i.e. on your computer), no ?
Even if it is not perfect (various contributors may have several machines), it may be better than nothing...

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Such artifact already exists. For instance, https://github.com/chocoteam/choco-solver/actions/runs/5766875782 you can get the artifact which contains 2 files, one for xcsp and the other for mzn

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the question should be: how to test performance regression?

basics;Bacp-m2-06_c18.xml.lzma;3;10;152931;151070
basics;Bacp-m1-06_c18.xml.lzma;3;10;39219;38817
basics;Bacp-m2-06_c18.xml.lzma;3;10;248257;245681
basics;Bibd-sc-06-050-25-03-10.xml.lzma;1;_;714;666
basics;Bibd-sum-06-050-25-03-10.xml.lzma;1;_;498;462
basics;Blackhole-04-3-00.xml.lzma;1;_;11;0
basics;BusScheduling-cnt-t1.xml.lzma;1;7;334;333
basics;CarSequencing-dingbas.xml.lzma;1;_;23;16
basics;ChessboardColoration-07-07.xml.lzma;2;2;1958;1909
basics;ChessboardColoration-07-07.xml.lzma;2;2;2066;2016
basics;ColouredQueens-07.xml.lzma;1;_;90;78
basics;CostasArray-12.xml.lzma;1;_;47;39
basics;Crossword-lex-vg-5-6.xml.lzma;1;_;10701;10543
Expand All @@ -19,13 +19,13 @@ basics;CryptoPuzzle-cross-roads-danger.xml.lzma;1;_;6;1
basics;Cutstock-small.xml.lzma;1;4;10;9
basics;Domino-300-300.xml.lzma;1;_;1;0
basics;driverlogw-09.xml.lzma;1;_;2738;2649
basics;Fapp-m2s-ex2_c18.xml.lzma;5;13871;108;99
basics;Filters-dct_2_3.xml.lzma;17;16;55552;53838
basics;FlexibleJobshop-easy01.xml.lzma;94;253;768;565
basics;FlexibleJobshop-easy02.xml.lzma;27;11;4486;4057
basics;Fapp-m2s-ex2_c18.xml.lzma;5;13871;167;158
basics;Filters-dct_2_3.xml.lzma;21;16;133996;127366
basics;FlexibleJobshop-easy01.xml.lzma;94;253;778;575
basics;FlexibleJobshop-easy02.xml.lzma;27;11;2891;2544
basics;Furniture.xml.lzma;1;603;21;20
basics;GracefulGraph-K02-P04.xml.lzma;1;_;73;64
basics;GraphColoring-3-fullins-4.xml.lzma;1;6;22854;22403
basics;GraphColoring-3-fullins-4.xml.lzma;1;6;22143;21706
basics;GraphColoring-qwhdec-o5-h10-1.xml.lzma;1;4;1;0
basics;Hanoi-05.xml.lzma;1;_;31;0
basics;Kakuro-easy-000-ext.xml.lzma;1;_;1;0
Expand All @@ -41,11 +41,11 @@ basics;MagicSequence-008-co.xml.lzma;1;_;5;1
basics;MagicSquare-4-table.xml.lzma;1;_;20;13
basics;MagicSquare-6-mdd.xml.lzma;1;_;693;662
basics;MagicSquare-6-sum.xml.lzma;1;_;960;928
basics;Mapping-full2x2_mp3.xml.lzma;4;1100;1815;1722
basics;Mario-easy-4.xml.lzma;4;545;1913;1883
basics;Mapping-full2x2_mp3.xml.lzma;4;1100;1780;1684
basics;Mario-easy-4.xml.lzma;4;545;2193;2163
basics;MarketSplit-01.xml.lzma;1;_;1243457;1236746
basics;MSPSP-easy_01.xml.lzma;5;26;281;272
basics;MSPSP-hard_01.xml.lzma;22;35;1792;1703
basics;MSPSP-hard_01.xml.lzma;21;35;1001;939
basics;MultiKnapsack-1-0_X2.xml.lzma;1;_;2;0
basics;MultiKnapsack-1-01.xml.lzma;1;_;2;0
basics;NFC-12_2_10.xml.lzma;1;848;12;11
Expand All @@ -58,24 +58,24 @@ basics;Ortholatin-005.xml.lzma;1;_;10;0
basics;Pb-gr-05.xml.lzma;5;11;703;685
basics;Pb-robin08.xml.lzma;1;_;2395;1438
basics;PeacableArmies-m1-05_c18.xml.lzma;3;4;3074;3020
basics;PeacableArmies-m2-05_c18.xml.lzma;5;4;2058;2017
basics;PizzaVoucher-10a_c18.xml.lzma;8;210;36531;36289
basics;PeacableArmies-m2-05_c18.xml.lzma;5;4;2002;1953
basics;PizzaVoucher-10a_c18.xml.lzma;8;210;39022;38777
basics;Primes-15-20-2-1.xml.lzma;1;_;7;0
basics;PrizeCollecting-15-3-5-0.xml.lzma;4;20;1635;1590
basics;PrizeCollecting-15-3-5-0.xml.lzma;7;20;1518;1480
basics;qcp-15-120-00_X2.xml.lzma;1;_;484;458
basics;QuadraticAssignment-qap_c18.xml.lzma;10;4776;945;924
basics;QuadraticAssignment-qap.xml.lzma;10;4776;945;924
basics;QuadraticAssignment-qap_c18.xml.lzma;10;4776;1018;997
basics;QuadraticAssignment-qap.xml.lzma;10;4776;1018;997
basics;QuasiGroup-3-04.xml.lzma;1;_;2;0
basics;QuasiGroup-7-09.xml.lzma;1;_;419;410
basics;QueenAttacking-06.xml.lzma;3;0;18563;18240
basics;Queens-0008-m1.xml.lzma;1;_;120;116
basics;QueenAttacking-06.xml.lzma;3;0;11455;11251
basics;Queens-0008-m1.xml.lzma;1;_;6;0
basics;RadarSurveillance-8-24-3-2-00.xml.lzma;1;_;75;4
basics;Ramsey-12.xml.lzma;3;2;13885;13107
basics;Ramsey-12.xml.lzma;3;2;42073;40593
basics;Rcpsp-j30-01-01_c18.xml.lzma;7;43;159;146
basics;Rlfap-graph-04-opt_c18.xml.lzma;1;394;236;235
basics;Rlfap-graph-04-opt_c18.xml.lzma;1;394;197;196
basics;RoomMate-sr0050-int.xml.lzma;1;_;6;4
basics;SocialGolfers-4-3-4-cp.xml.lzma;1;_;55;38
basics;Sonet-s2ring02.xml.lzma;7;14;459188;454754
basics;Sonet-s2ring02.xml.lzma;7;14;857492;849368
basics;SportsScheduling-08.xml.lzma;1;_;3220;3154
basics;SteelMillSlab-m1-simple_c18.xml.lzma;4;0;86;79
basics;SteelMillSlab-m2-simple_c18.xml.lzma;4;0;124;117
Expand All @@ -85,11 +85,11 @@ basics;StillLife-wastage-03.xml.lzma;3;6;22;17
basics;StripPacking-C1P1.xml.lzma;1;_;7948;7731
basics;Subisomorphism-A-10.xml.lzma;1;_;18;16
basics;Sudoku-s01a-alldiff.xml.lzma;1;_;1;0
basics;SumColoring-myciel4_c18.xml.lzma;5;22;27017;26883
basics;Taillard-os-04-04-0.xml.lzma;19;193;15620;15434
basics;SumColoring-myciel4_c18.xml.lzma;5;22;5446;5399
basics;Taillard-os-04-04-0.xml.lzma;20;193;10826;10683
basics;Tal-01_c18.xml.lzma;1;6;4;3
basics;TeamAssignment-data1_4_6.xml.lzma;19;2948;5684;5599
basics;TeamAssignment-data1_4_6.xml.lzma;19;2948;5684;5599
basics;TeamAssignment-data1_4_6.xml.lzma;21;2948;4211;4138
basics;TeamAssignment-data1_4_6.xml.lzma;21;2948;4211;4138
basics;TemplateDesign-m1-1_c18.xml.lzma;1;2;10;9
basics;TemplateDesign-m1s-1_c18.xml.lzma;1;2;12;11
basics;TemplateDesign-m2-1_c18.xml.lzma;1;2;10;9
Expand All @@ -98,8 +98,8 @@ basics;testExtension2.xml.lzma;1;_;4;0
basics;testExtension3.xml.lzma;0;_;15;16
basics;testObjective1.xml.lzma;3;11;11;6
basics;testPrimitive.xml.lzma;1;_;3;1
basics;TestSchedulingM18-t30m10r3-15.xml.lzma;93;4149;3450;2650
basics;TestSchedulingM18-t30m10r3-15.xml.lzma;27;4149;1959;1500
basics;Tpp-3-3-20-1.xml.lzma;5;126;87;78
basics;TravelingTournament-a3-galaxy04_c18.xml.lzma;4;416;4180;4139
basics;Warehouse-opl.xml.lzma;1;383;568;557
basics;Zebra.xml.lzma;1;_;13;6
basics;TravelingTournament-a3-galaxy04_c18.xml.lzma;4;416;4553;4516
basics;Warehouse-opl.xml.lzma;10;383;573;544
basics;Zebra.xml.lzma;1;_;9;3
6 changes: 4 additions & 2 deletions solver/src/main/java/org/chocosolver/solver/Solver.java
Original file line number Diff line number Diff line change
Expand Up @@ -1162,8 +1162,10 @@ public void setPropagate(Propagate p) {
* @see #clearRestarter()
*/
public void addRestarter(AbstractRestart restarter) {
restarter.setNext(this.restarter);
this.restarter = restarter;
if(restarter != AbstractRestart.NO_RESTART) {
restarter.setNext(this.restarter);
this.restarter = restarter;
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.chocosolver.solver.variables.IntVar;

import java.util.function.BiPredicate;
import java.util.function.Function;

/**
* Value selector for optimization problems:
Expand All @@ -43,6 +44,10 @@ public final class IntDomainBest implements IntValueSelector {
*/
private final BiPredicate<IntVar, Integer> condition;

private final IntValueSelector fallbackValueSelector;

private final Function<IntVar, Boolean> trigger;

/**
* Create a value selector that returns the best value wrt to the objective to optimize.
* When an enumerated variable domain exceeds {@link #maxdom}, only bounds are considered.
Expand All @@ -54,14 +59,40 @@ public final class IntDomainBest implements IntValueSelector {
* is kept.
* </p>
*
* @param maxdom a maximum domain size to satisfy to use this value selector.
* @param dop the decision operator used to make the decision
* @param condition predicate to break ties
* @param maxdom a maximum domain size to satisfy to use this value selector
* @param intValueSelector fallback value selector
* @param trigger the function that indicates when the best value selector is applied.
* When it returns true, the best value selector is applied.
* Otherwise, the fallback value selector is applied.
* @param dop the decision operator used to make the decision
* @param condition predicate to break ties
*/
public IntDomainBest(int maxdom, DecisionOperator<IntVar> dop, BiPredicate<IntVar, Integer> condition) {
public IntDomainBest(int maxdom, IntValueSelector intValueSelector, Function<IntVar, Boolean> trigger, DecisionOperator<IntVar> dop, BiPredicate<IntVar, Integer> condition) {
this.maxdom = maxdom;
this.dop = dop;
this.condition = condition;
this.fallbackValueSelector = intValueSelector;
this.trigger = trigger;
}

/**
* Create a value selector that returns the best value wrt to the objective to optimize.
* When an enumerated variable domain exceeds {@link #maxdom}, only bounds are considered.
*
* <p>
* {@code condition} is called when the evaluated {@code value} returns a score
* equals to the current best one. In that case, if {@code condition} returns {@code true}
* then {@code value} is retained as the new best candidate, otherwise the previous one
* is kept.
* </p>
*
* @param intValueSelector fallback value selector
* @param trigger the function that indicates when the best value selector is applied.
* When it returns true, the best value selector is applied.
* Otherwise, the fallback value selector is applied.
*/
public IntDomainBest(IntValueSelector intValueSelector, Function<IntVar, Boolean> trigger) {
this(100, intValueSelector, trigger, DecisionOperatorFactory.makeIntEq(), (k, v) -> false);
}

/**
Expand All @@ -76,26 +107,51 @@ public IntDomainBest(int maxdom, DecisionOperator<IntVar> dop, BiPredicate<IntVa
* </p>
*
* @param condition predicate to break ties
* @apiNote The default values are:
* <ul>
* <li>maxdom is set to 100</li>
* <li>the trigger is set to restart count % 16 == 0</li>
* <li>the decision operator is set to '='</li>
* </ul>
*/
public IntDomainBest(BiPredicate<IntVar, Integer> condition) {
this(100, DecisionOperatorFactory.makeIntEq(), condition);
this(100,
new IntDomainMin(),
v -> v.getModel().getSolver().getRestartCount() % 16 == 0,
DecisionOperatorFactory.makeIntEq(),
condition);
}


/**
* Create a value selector for assignments that returns the best value wrt to the objective to
* optimize. When an enumerated variable domain exceeds 100, only bounds are considered.
* Always-false condition is set by default.
*
* @apiNote The default values are:
* <ul>
* <li>maxdom is set to 100</li>
* <li>the trigger is set to restart count % 16 == 0</li>
* <li>the decision operator is set to '='</li>
* <li>the predicate to break ties is lexico</li>
* </ul>
*/
public IntDomainBest() {
this(100, DecisionOperatorFactory.makeIntEq(), (k, v) -> false);
this(100,
new IntDomainMin(),
v -> v.getModel().getSolver().getRestartCount() % 16 == 0,
DecisionOperatorFactory.makeIntEq(),
(k, v) -> false);
}

/**
* {@inheritDoc}
*/
@Override
public int selectValue(IntVar var) {
if (!trigger.apply(var)) {
return fallbackValueSelector.selectValue(var);
}
assert var.getModel().getObjective() != null;
if (var.hasEnumeratedDomain() && var.getDomainSize() < maxdom) {
int bestCost = Integer.MAX_VALUE;
Expand Down
Loading