Java Reference

Java Reference

CpModel.java
Go to the documentation of this file.
1 // Copyright 2010-2018 Google LLC
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
14 package com.google.ortools.sat;
15 
34 
40 public final class CpModel {
41  static class CpModelException extends Exception {
42  public CpModelException(String methodName, String msg) {
43  // Call constructor of parent Exception
44  super("CpModel." + methodName + ": " + msg);
45  }
46  }
47 
49  public static class MismatchedArrayLengths extends CpModelException {
50  public MismatchedArrayLengths(String methodName, String array1Name, String array2Name) {
51  super(methodName, array1Name + " and " + array2Name + " have mismatched lengths");
52  }
53  }
54 
56  public static class WrongLength extends CpModelException {
57  public WrongLength(String methodName, String msg) {
58  super(methodName, msg);
59  }
60  }
61 
62  public CpModel() {
63  modelBuilder = CpModelProto.newBuilder();
64  }
65 
66  // Integer variables.
67 
69  public IntVar newIntVar(long lb, long ub, String name) {
70  return new IntVar(modelBuilder, new Domain(lb, ub), name);
71  }
72 
80  public IntVar newIntVarFromDomain(Domain domain, String name) {
81  return new IntVar(modelBuilder, domain, name);
82  }
83 
85  public IntVar newBoolVar(String name) {
86  return new IntVar(modelBuilder, new Domain(0, 1), name);
87  }
88 
90  public IntVar newConstant(long value) {
91  return new IntVar(modelBuilder, new Domain(value), ""); // bounds and name.
92  }
93 
94  // Boolean Constraints.
95 
97  public Constraint addBoolOr(Literal[] literals) {
98  Constraint ct = new Constraint(modelBuilder);
99  BoolArgumentProto.Builder boolOr = ct.getBuilder().getBoolOrBuilder();
100  for (Literal lit : literals) {
101  boolOr.addLiterals(lit.getIndex());
102  }
103  return ct;
104  }
105 
107  public Constraint addBoolAnd(Literal[] literals) {
108  Constraint ct = new Constraint(modelBuilder);
109  BoolArgumentProto.Builder boolOr = ct.getBuilder().getBoolAndBuilder();
110  for (Literal lit : literals) {
111  boolOr.addLiterals(lit.getIndex());
112  }
113  return ct;
114  }
115 
117  public Constraint addBoolXor(Literal[] literals) {
118  Constraint ct = new Constraint(modelBuilder);
119  BoolArgumentProto.Builder boolOr = ct.getBuilder().getBoolXorBuilder();
120  for (Literal lit : literals) {
121  boolOr.addLiterals(lit.getIndex());
122  }
123  return ct;
124  }
125 
128  return addBoolOr(new Literal[] {a.not(), b});
129  }
130 
131  // Linear constraints.
132 
135  Constraint ct = new Constraint(modelBuilder);
136  LinearConstraintProto.Builder lin = ct.getBuilder().getLinearBuilder();
137  for (int i = 0; i < expr.numElements(); ++i) {
138  lin.addVars(expr.getVariable(i).getIndex()).addCoeffs(expr.getCoefficient(i));
139  }
140  for (long b : domain.flattenedIntervals()) {
141  lin.addDomain(b);
142  }
143  return ct;
144  }
145 
147  public Constraint addLinearConstraint(LinearExpr expr, long lb, long ub) {
148  return addLinearExpressionInDomain(expr, new Domain(lb, ub));
149  }
150 
152  public Constraint addEquality(LinearExpr expr, long value) {
153  return addLinearExpressionInDomain(expr, new Domain(value));
154  }
155 
158  return addLinearExpressionInDomain(new Difference(left, right), new Domain(0));
159  }
160 
162  public Constraint addEqualityWithOffset(LinearExpr left, LinearExpr right, long offset) {
163  return addLinearExpressionInDomain(new Difference(left, right), new Domain(-offset));
164  }
165 
167  public Constraint addLessOrEqual(LinearExpr expr, long value) {
168  return addLinearExpressionInDomain(expr, new Domain(Long.MIN_VALUE, value));
169  }
170 
173  return addLinearExpressionInDomain(new Difference(left, right), new Domain(Long.MIN_VALUE, 0));
174  }
175 
177  public Constraint addLessThan(LinearExpr expr, long value) {
178  return addLinearExpressionInDomain(expr, new Domain(Long.MIN_VALUE, value - 1));
179  }
180 
183  return addLinearExpressionInDomain(new Difference(left, right), new Domain(Long.MIN_VALUE, -1));
184  }
185 
187  public Constraint addLessOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset) {
189  new Difference(left, right), new Domain(Long.MIN_VALUE, -offset));
190  }
191 
193  public Constraint addGreaterOrEqual(LinearExpr expr, long value) {
194  return addLinearExpressionInDomain(expr, new Domain(value, Long.MAX_VALUE));
195  }
196 
199  return addLinearExpressionInDomain(new Difference(left, right), new Domain(0, Long.MAX_VALUE));
200  }
201 
203  public Constraint addGreaterThan(LinearExpr expr, long value) {
204  return addLinearExpressionInDomain(expr, new Domain(value + 1, Long.MAX_VALUE));
205  }
206 
209  return addLinearExpressionInDomain(new Difference(left, right), new Domain(1, Long.MAX_VALUE));
210  }
211 
213  public Constraint addGreaterOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset) {
215  new Difference(left, right), new Domain(-offset, Long.MAX_VALUE));
216  }
217 
219  public Constraint addDifferent(LinearExpr expr, long value) {
220  return addLinearExpressionInDomain(expr,
222  new long[] {Long.MIN_VALUE, value - 1, value + 1, Long.MAX_VALUE}));
223  }
224 
226  public Constraint addDifferent(IntVar left, IntVar right) {
227  return addLinearExpressionInDomain(new Difference(left, right),
228  Domain.fromFlatIntervals(new long[] {Long.MIN_VALUE, -1, 1, Long.MAX_VALUE}));
229  }
230 
232  public Constraint addDifferentWithOffset(IntVar left, IntVar right, long offset) {
233  return addLinearExpressionInDomain(new Difference(left, right),
235  new long[] {Long.MIN_VALUE, -offset - 1, -offset + 1, Long.MAX_VALUE}));
236  }
237 
238  // Integer constraints.
239 
248  public Constraint addAllDifferent(IntVar[] variables) {
249  Constraint ct = new Constraint(modelBuilder);
250  AllDifferentConstraintProto.Builder allDiff = ct.getBuilder().getAllDiffBuilder();
251  for (IntVar var : variables) {
252  allDiff.addVars(var.getIndex());
253  }
254  return ct;
255  }
256 
258  public Constraint addElement(IntVar index, IntVar[] variables, IntVar target) {
259  Constraint ct = new Constraint(modelBuilder);
261  ct.getBuilder().getElementBuilder().setIndex(index.getIndex());
262  for (IntVar var : variables) {
263  element.addVars(var.getIndex());
264  }
265  element.setTarget(target.getIndex());
266  return ct;
267  }
268 
270  public Constraint addElement(IntVar index, long[] values, IntVar target) {
271  Constraint ct = new Constraint(modelBuilder);
273  ct.getBuilder().getElementBuilder().setIndex(index.getIndex());
274  for (long v : values) {
275  element.addVars(indexFromConstant(v));
276  }
277  element.setTarget(target.getIndex());
278  return ct;
279  }
280 
282  public Constraint addElement(IntVar index, int[] values, IntVar target) {
283  Constraint ct = new Constraint(modelBuilder);
285  ct.getBuilder().getElementBuilder().setIndex(index.getIndex());
286  for (long v : values) {
287  element.addVars(indexFromConstant(v));
288  }
289  element.setTarget(target.getIndex());
290  return ct;
291  }
292 
308  public Constraint addCircuit(int[] tails, int[] heads, Literal[] literals)
309  throws MismatchedArrayLengths {
310  if (tails.length != heads.length) {
311  throw new MismatchedArrayLengths("addCircuit", "tails", "heads");
312  }
313  if (tails.length != literals.length) {
314  throw new MismatchedArrayLengths("addCircuit", "tails", "literals");
315  }
316 
317  Constraint ct = new Constraint(modelBuilder);
318  CircuitConstraintProto.Builder circuit = ct.getBuilder().getCircuitBuilder();
319  for (int t : tails) {
320  circuit.addTails(t);
321  }
322  for (int h : heads) {
323  circuit.addHeads(h);
324  }
325  for (Literal lit : literals) {
326  circuit.addLiterals(lit.getIndex());
327  }
328  return ct;
329  }
330 
344  public Constraint addAllowedAssignments(IntVar[] variables, long[][] tuplesList)
345  throws WrongLength {
346  Constraint ct = new Constraint(modelBuilder);
347  TableConstraintProto.Builder table = ct.getBuilder().getTableBuilder();
348  for (IntVar var : variables) {
349  table.addVars(var.getIndex());
350  }
351  int numVars = variables.length;
352  for (int t = 0; t < tuplesList.length; ++t) {
353  if (tuplesList[t].length != numVars) {
354  throw new WrongLength("addAllowedAssignments",
355  "tuple " + t + " does not have the same length as the variables");
356  }
357  for (int i = 0; i < tuplesList[t].length; ++i) {
358  table.addValues(tuplesList[t][i]);
359  }
360  }
361  return ct;
362  }
363 
369  public Constraint addAllowedAssignments(IntVar[] variables, int[][] tuplesList)
370  throws WrongLength {
371  Constraint ct = new Constraint(modelBuilder);
372  TableConstraintProto.Builder table = ct.getBuilder().getTableBuilder();
373  for (IntVar var : variables) {
374  table.addVars(var.getIndex());
375  }
376  int numVars = variables.length;
377  for (int t = 0; t < tuplesList.length; ++t) {
378  if (tuplesList[t].length != numVars) {
379  throw new WrongLength("addAllowedAssignments",
380  "tuple " + t + " does not have the same length as the variables");
381  }
382  for (int i = 0; i < tuplesList[t].length; ++i) {
383  table.addValues(tuplesList[t][i]);
384  }
385  }
386  return ct;
387  }
388 
401  public Constraint addForbiddenAssignments(IntVar[] variables, long[][] tuplesList)
402  throws WrongLength {
403  Constraint ct = addAllowedAssignments(variables, tuplesList);
404  // Reverse the flag.
405  ct.getBuilder().getTableBuilder().setNegated(true);
406  return ct;
407  }
408 
414  public Constraint addForbiddenAssignments(IntVar[] variables, int[][] tuplesList)
415  throws WrongLength {
416  Constraint ct = addAllowedAssignments(variables, tuplesList);
417  // Reverse the flag.
418  ct.getBuilder().getTableBuilder().setNegated(true);
419  return ct;
420  }
421 
453  public Constraint addAutomaton(IntVar[] transitionVariables, long startingState,
454  long[] finalStates, long[][] transitions) throws WrongLength {
455  Constraint ct = new Constraint(modelBuilder);
456  AutomatonConstraintProto.Builder automaton = ct.getBuilder().getAutomatonBuilder();
457  for (IntVar var : transitionVariables) {
458  automaton.addVars(var.getIndex());
459  }
460  automaton.setStartingState(startingState);
461  for (long c : finalStates) {
462  automaton.addFinalStates(c);
463  }
464  for (long[] t : transitions) {
465  if (t.length != 3) {
466  throw new WrongLength("addAutomaton", "transition does not have length 3");
467  }
468  automaton.addTransitionTail(t[0]).addTransitionLabel(t[1]).addTransitionHead(t[2]);
469  }
470  return ct;
471  }
472 
484  public Constraint addInverse(IntVar[] variables, IntVar[] inverseVariables)
485  throws MismatchedArrayLengths {
486  if (variables.length != inverseVariables.length) {
487  throw new MismatchedArrayLengths("addInverse", "variables", "inverseVariables");
488  }
489  Constraint ct = new Constraint(modelBuilder);
490  InverseConstraintProto.Builder inverse = ct.getBuilder().getInverseBuilder();
491  for (IntVar var : variables) {
492  inverse.addFDirect(var.getIndex());
493  }
494  for (IntVar var : inverseVariables) {
495  inverse.addFInverse(var.getIndex());
496  }
497  return ct;
498  }
499 
524  IntVar[] times, long[] demands, long minLevel, long maxLevel) throws MismatchedArrayLengths {
525  if (times.length != demands.length) {
526  throw new MismatchedArrayLengths("addReservoirConstraint", "times", "demands");
527  }
528  Constraint ct = new Constraint(modelBuilder);
529  ReservoirConstraintProto.Builder reservoir = ct.getBuilder().getReservoirBuilder();
530  for (IntVar var : times) {
531  reservoir.addTimes(var.getIndex());
532  }
533  for (long d : demands) {
534  reservoir.addDemands(d);
535  }
536  reservoir.setMinLevel(minLevel).setMaxLevel(maxLevel);
537  return ct;
538  }
539 
546  IntVar[] times, int[] demands, long minLevel, long maxLevel) throws MismatchedArrayLengths {
547  return addReservoirConstraint(times, toLongArray(demands), minLevel, maxLevel);
548  }
549 
575  public Constraint addReservoirConstraintWithActive(IntVar[] times, long[] demands,
576  IntVar[] actives, long minLevel, long maxLevel) throws MismatchedArrayLengths {
577  if (times.length != demands.length) {
578  throw new MismatchedArrayLengths("addReservoirConstraint", "times", "demands");
579  }
580  if (times.length != actives.length) {
581  throw new MismatchedArrayLengths("addReservoirConstraint", "times", "actives");
582  }
583 
584  Constraint ct = new Constraint(modelBuilder);
585  ReservoirConstraintProto.Builder reservoir = ct.getBuilder().getReservoirBuilder();
586  for (IntVar var : times) {
587  reservoir.addTimes(var.getIndex());
588  }
589  for (long d : demands) {
590  reservoir.addDemands(d);
591  }
592  for (IntVar var : actives) {
593  reservoir.addActives(var.getIndex());
594  }
595  reservoir.setMinLevel(minLevel).setMaxLevel(maxLevel);
596  return ct;
597  }
598 
604  public Constraint addReservoirConstraintWithActive(IntVar[] times, int[] demands,
605  IntVar[] actives, long minLevel, long maxLevel) throws MismatchedArrayLengths {
607  times, toLongArray(demands), actives, minLevel, maxLevel);
608  }
609 
611  public void addMapDomain(IntVar var, Literal[] booleans, long offset) {
612  for (int i = 0; i < booleans.length; ++i) {
613  addEquality(var, offset + i).onlyEnforceIf(booleans[i]);
614  addDifferent(var, offset + i).onlyEnforceIf(booleans[i].not());
615  }
616  }
617 
619  public Constraint addMinEquality(IntVar target, IntVar[] vars) {
620  Constraint ct = new Constraint(modelBuilder);
622  ct.getBuilder().getIntMinBuilder().setTarget(target.getIndex());
623  for (IntVar var : vars) {
624  intMin.addVars(var.getIndex());
625  }
626  return ct;
627  }
628 
630  public Constraint addMaxEquality(IntVar target, IntVar[] vars) {
631  Constraint ct = new Constraint(modelBuilder);
633  ct.getBuilder().getIntMaxBuilder().setTarget(target.getIndex());
634  for (IntVar var : vars) {
635  intMax.addVars(var.getIndex());
636  }
637  return ct;
638  }
639 
641  public Constraint addDivisionEquality(IntVar target, IntVar num, IntVar denom) {
642  Constraint ct = new Constraint(modelBuilder);
643  IntegerArgumentProto.Builder intDiv = ct.getBuilder().getIntDivBuilder();
644  intDiv.setTarget(target.getIndex());
645  intDiv.addVars(num.getIndex());
646  intDiv.addVars(denom.getIndex());
647  return ct;
648  }
649 
651  public Constraint addAbsEquality(IntVar target, IntVar var) {
652  Constraint ct = new Constraint(modelBuilder);
654  .getIntMaxBuilder()
655  .setTarget(target.getIndex())
656  .addVars(var.getIndex())
657  .addVars(-var.getIndex() - 1);
658  return ct;
659  }
660 
662  public Constraint addModuloEquality(IntVar target, IntVar var, IntVar mod) {
663  Constraint ct = new Constraint(modelBuilder);
664  IntegerArgumentProto.Builder intMod = ct.getBuilder().getIntModBuilder();
665  intMod.setTarget(target.getIndex());
666  intMod.addVars(var.getIndex());
667  intMod.addVars(mod.getIndex());
668  return ct;
669  }
670 
672  public Constraint addModuloEquality(IntVar target, IntVar var, long mod) {
673  Constraint ct = new Constraint(modelBuilder);
674  IntegerArgumentProto.Builder intMod = ct.getBuilder().getIntModBuilder();
675  intMod.setTarget(target.getIndex());
676  intMod.addVars(var.getIndex());
677  intMod.addVars(indexFromConstant(mod));
678  return ct;
679  }
680 
682  public Constraint addProductEquality(IntVar target, IntVar[] vars) {
683  Constraint ct = new Constraint(modelBuilder);
684  IntegerArgumentProto.Builder intProd = ct.getBuilder().getIntProdBuilder();
685  intProd.setTarget(target.getIndex());
686  for (IntVar var : vars) {
687  intProd.addVars(var.getIndex());
688  }
689  return ct;
690  }
691 
692  // Scheduling support.
693 
708  public IntervalVar newIntervalVar(IntVar start, IntVar size, IntVar end, String name) {
709  return new IntervalVar(modelBuilder, start.getIndex(), size.getIndex(), end.getIndex(), name);
710  }
711 
717  public IntervalVar newIntervalVar(IntVar start, IntVar size, long end, String name) {
718  return new IntervalVar(
719  modelBuilder, start.getIndex(), size.getIndex(), indexFromConstant(end), name);
720  }
721 
727  public IntervalVar newIntervalVar(IntVar start, long size, IntVar end, String name) {
728  return new IntervalVar(
729  modelBuilder, start.getIndex(), indexFromConstant(size), end.getIndex(), name);
730  }
731 
737  public IntervalVar newIntervalVar(long start, IntVar size, IntVar end, String name) {
738  return new IntervalVar(
739  modelBuilder, indexFromConstant(start), size.getIndex(), end.getIndex(), name);
740  }
741 
743  public IntervalVar newFixedInterval(long start, long size, String name) {
744  return new IntervalVar(modelBuilder, indexFromConstant(start), indexFromConstant(size),
745  indexFromConstant(start + size), name);
746  }
747 
766  IntVar start, IntVar size, IntVar end, Literal isPresent, String name) {
767  return new IntervalVar(modelBuilder, start.getIndex(), size.getIndex(), end.getIndex(),
768  isPresent.getIndex(), name);
769  }
770 
777  IntVar start, IntVar size, long end, Literal isPresent, String name) {
778  return new IntervalVar(modelBuilder, start.getIndex(), size.getIndex(), indexFromConstant(end),
779  isPresent.getIndex(), name);
780  }
781 
788  IntVar start, long size, IntVar end, Literal isPresent, String name) {
789  return new IntervalVar(modelBuilder, start.getIndex(), indexFromConstant(size), end.getIndex(),
790  isPresent.getIndex(), name);
791  }
792 
795  long start, IntVar size, IntVar end, Literal isPresent, String name) {
796  return new IntervalVar(modelBuilder, indexFromConstant(start), size.getIndex(), end.getIndex(),
797  isPresent.getIndex(), name);
798  }
799 
806  long start, long size, Literal isPresent, String name) {
807  return new IntervalVar(modelBuilder, indexFromConstant(start), indexFromConstant(size),
808  indexFromConstant(start + size), isPresent.getIndex(), name);
809  }
810 
819  public Constraint addNoOverlap(IntervalVar[] intervalVars) {
820  Constraint ct = new Constraint(modelBuilder);
821  NoOverlapConstraintProto.Builder noOverlap = ct.getBuilder().getNoOverlapBuilder();
822  for (IntervalVar var : intervalVars) {
823  noOverlap.addIntervals(var.getIndex());
824  }
825  return ct;
826  }
827 
839  public Constraint addNoOverlap2D(IntervalVar[] xIntervals, IntervalVar[] yIntervals) {
840  Constraint ct = new Constraint(modelBuilder);
841  NoOverlap2DConstraintProto.Builder noOverlap2d = ct.getBuilder().getNoOverlap2DBuilder();
842  for (IntervalVar x : xIntervals) {
843  noOverlap2d.addXIntervals(x.getIndex());
844  }
845  for (IntervalVar y : yIntervals) {
846  noOverlap2d.addYIntervals(y.getIndex());
847  }
848  return ct;
849  }
850 
866  public Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, IntVar capacity) {
867  Constraint ct = new Constraint(modelBuilder);
868  CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
869  for (IntervalVar interval : intervals) {
870  cumul.addIntervals(interval.getIndex());
871  }
872  for (IntVar var : demands) {
873  cumul.addDemands(var.getIndex());
874  }
875  cumul.setCapacity(capacity.getIndex());
876  return ct;
877  }
878 
884  public Constraint addCumulative(IntervalVar[] intervals, long[] demands, IntVar capacity) {
885  Constraint ct = new Constraint(modelBuilder);
886  CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
887  for (IntervalVar interval : intervals) {
888  cumul.addIntervals(interval.getIndex());
889  }
890  for (long d : demands) {
891  cumul.addDemands(indexFromConstant(d));
892  }
893  cumul.setCapacity(capacity.getIndex());
894  return ct;
895  }
896 
902  public Constraint addCumulative(IntervalVar[] intervals, int[] demands, IntVar capacity) {
903  return addCumulative(intervals, toLongArray(demands), capacity);
904  }
905 
911  public Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, long capacity) {
912  Constraint ct = new Constraint(modelBuilder);
913  CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
914  for (IntervalVar interval : intervals) {
915  cumul.addIntervals(interval.getIndex());
916  }
917  for (IntVar var : demands) {
918  cumul.addDemands(var.getIndex());
919  }
920  cumul.setCapacity(indexFromConstant(capacity));
921  return ct;
922  }
923 
929  public Constraint addCumulative(IntervalVar[] intervals, long[] demands, long capacity) {
930  Constraint ct = new Constraint(modelBuilder);
931  CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
932  for (IntervalVar interval : intervals) {
933  cumul.addIntervals(interval.getIndex());
934  }
935  for (long d : demands) {
936  cumul.addDemands(indexFromConstant(d));
937  }
938  cumul.setCapacity(indexFromConstant(capacity));
939  return ct;
940  }
941 
947  public Constraint addCumulative(IntervalVar[] intervals, int[] demands, long capacity) {
948  return addCumulative(intervals, toLongArray(demands), capacity);
949  }
950 
952  public void addHint(IntVar var, long value) {
953  modelBuilder.getSolutionHintBuilder().addVars(var.getIndex());
954  modelBuilder.getSolutionHintBuilder().addValues(value);
955  }
956 
957  // Objective.
958 
960  public void minimize(LinearExpr expr) {
961  CpObjectiveProto.Builder obj = modelBuilder.getObjectiveBuilder();
962  for (int i = 0; i < expr.numElements(); ++i) {
963  obj.addVars(expr.getVariable(i).getIndex());
964  obj.addCoeffs(expr.getCoefficient(i));
965  }
966  }
967 
969  public void maximize(LinearExpr expr) {
970  CpObjectiveProto.Builder obj = modelBuilder.getObjectiveBuilder();
971  for (int i = 0; i < expr.numElements(); ++i) {
972  obj.addVars(expr.getVariable(i).getIndex());
973  obj.addCoeffs(-expr.getCoefficient(i));
974  }
975  obj.setScalingFactor(-1.0);
976  }
977 
978  // DecisionStrategy
979 
981  public void addDecisionStrategy(IntVar[] variables,
984  DecisionStrategyProto.Builder ds = modelBuilder.addSearchStrategyBuilder();
985  for (IntVar var : variables) {
986  ds.addVariables(var.getIndex());
987  }
988  ds.setVariableSelectionStrategy(varStr);
989  ds.setDomainReductionStrategy(domStr);
990  }
991 
993  public String modelStats() {
994  return SatHelper.modelStats(model());
995  }
996 
998  public String validate() {
999  return SatHelper.validateModel(model());
1000  }
1001 
1003  public Boolean exportToFile(String file) {
1004  return SatHelper.writeModelToFile(model(), file);
1005  }
1006 
1007  // Helpers
1008 
1009  long[] toLongArray(int[] values) {
1010  long[] result = new long[values.length];
1011  for (int i = 0; i < values.length; ++i) {
1012  result[i] = values[i];
1013  }
1014  return result;
1015  }
1016 
1017  int indexFromConstant(long constant) {
1018  int index = modelBuilder.getVariablesCount();
1019  IntegerVariableProto.Builder cst = modelBuilder.addVariablesBuilder();
1020  cst.addDomain(constant);
1021  cst.addDomain(constant);
1022  return index;
1023  }
1024 
1025  // Getters.
1026 
1027  public CpModelProto model() {
1028  return modelBuilder.build();
1029  }
1030 
1031  public int negated(int index) {
1032  return -index - 1;
1033  }
1034 
1037  return modelBuilder;
1038  }
1039 
1040  private final CpModelProto.Builder modelBuilder;
1041 }
Exception thrown when parallel arrays have mismatched lengths.
Definition: CpModel.java:49
Constraint addNoOverlap2D(IntervalVar[] xIntervals, IntervalVar[] yIntervals)
Adds.
Definition: CpModel.java:839
Constraint addElement(IntVar index, IntVar[] variables, IntVar target)
Adds the element constraint:
Definition: CpModel.java:258
Constraint addBoolOr(Literal[] literals)
Adds.
Definition: CpModel.java:97
Constraint addAbsEquality(IntVar target, IntVar var)
Adds.
Definition: CpModel.java:651
IntervalVar newFixedInterval(long start, long size, String name)
Creates a fixed interval from its start and its size.
Definition: CpModel.java:743
Wrapper around a ConstraintProto.
Constraint addNoOverlap(IntervalVar[] intervalVars)
Adds.
Definition: CpModel.java:819
Constraint addGreaterOrEqual(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:198
Constraint addProductEquality(IntVar target, IntVar[] vars)
Adds.
Definition: CpModel.java:682
static boolean writeModelToFile(com.google.ortools.sat.CpModelProto model_proto, String filename)
Definition: SatHelper.java:96
int negated(int index)
Definition: CpModel.java:1031
Constraint addLinearConstraint(LinearExpr expr, long lb, long ub)
Adds.
Definition: CpModel.java:147
CpModelProto.Builder getBuilder()
Returns the model builder.
Definition: CpModel.java:1036
Constraint addGreaterThan(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:203
WrongLength(String methodName, String msg)
Definition: CpModel.java:57
Constraint addLessOrEqual(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:167
CpModel()
Definition: CpModel.java:62
long[] flattenedIntervals()
This method returns the flattened list of interval bounds of the domain.
Definition: Domain.java:111
Constraint addModuloEquality(IntVar target, IntVar var, IntVar mod)
Adds.
Definition: CpModel.java:662
IntervalVar newOptionalIntervalVar(IntVar start, long size, IntVar end, Literal isPresent, String name)
Creates an optional interval with a fixed size.
Definition: CpModel.java:787
IntVar newIntVarFromDomain(Domain domain, String name)
Creates an integer variable with given domain.
Definition: CpModel.java:80
Constraint addMinEquality(IntVar target, IntVar[] vars)
Adds.
Definition: CpModel.java:619
IntervalVar newOptionalIntervalVar(IntVar start, IntVar size, long end, Literal isPresent, String name)
Creates an optional interval with a fixed end.
Definition: CpModel.java:776
Constraint addDifferentWithOffset(IntVar left, IntVar right, long offset)
Adds.
Definition: CpModel.java:232
long getCoefficient(int index)
Returns the ith coefficient.
.lang.Override int getVariablesCount()
Constraint addEqualityWithOffset(LinearExpr left, LinearExpr right, long offset)
Adds.
Definition: CpModel.java:162
Constraint addAllDifferent(IntVar[] variables)
Adds.
Definition: CpModel.java:248
ConstraintProto.Builder getBuilder()
Returns the constraint builder.
int numElements()
Returns the number of elements in the interface.
Constraint addMaxEquality(IntVar target, IntVar[] vars)
Adds.
Definition: CpModel.java:630
Constraint addCumulative(IntervalVar[] intervals, long[] demands, long capacity)
Adds.
Definition: CpModel.java:929
Constraint addModuloEquality(IntVar target, IntVar var, long mod)
Adds.
Definition: CpModel.java:672
IntervalVar newIntervalVar(IntVar start, IntVar size, IntVar end, String name)
Creates an interval variable from start, size, and end.
Definition: CpModel.java:708
Constraint addLinearExpressionInDomain(LinearExpr expr, Domain domain)
Adds.
Definition: CpModel.java:134
Constraint addEquality(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:157
Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, long capacity)
Adds.
Definition: CpModel.java:911
void onlyEnforceIf(Literal lit)
Adds a literal to the constraint.
IntervalVar newOptionalFixedInterval(long start, long size, Literal isPresent, String name)
Creates an optional fixed interval from start and size.
Definition: CpModel.java:805
Constraint addDivisionEquality(IntVar target, IntVar num, IntVar denom)
Adds.
Definition: CpModel.java:641
Constraint addLessThan(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:182
Interface to describe a boolean variable or its negation.
Definition: Literal.java:17
Exception thrown when an array has a wrong length.
Definition: CpModel.java:56
Constraint addDifferent(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:219
Constraint addGreaterOrEqual(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:193
We call domain any subset of Int64 = [kint64min, kint64max].
Definition: Domain.java:21
Constraint addAutomaton(IntVar[] transitionVariables, long startingState, long[] finalStates, long[][] transitions)
Adds an automaton constraint.
Definition: CpModel.java:453
IntervalVar newIntervalVar(IntVar start, long size, IntVar end, String name)
Creates an interval variable with a fixed size.
Definition: CpModel.java:727
Constraint addBoolAnd(Literal[] literals)
Adds.
Definition: CpModel.java:107
String validate()
Returns a non empty string explaining the issue if the model is invalid.
Definition: CpModel.java:998
IntVar newIntVar(long lb, long ub, String name)
Creates an integer variable with domain [lb, ub].
Definition: CpModel.java:69
Constraint addForbiddenAssignments(IntVar[] variables, long[][] tuplesList)
Adds.
Definition: CpModel.java:401
Constraint addReservoirConstraint(IntVar[] times, int[] demands, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:545
Constraint addCumulative(IntervalVar[] intervals, int[] demands, IntVar capacity)
Adds.
Definition: CpModel.java:902
Constraint addReservoirConstraint(IntVar[] times, long[] demands, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:523
Constraint addLessOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset)
Adds.
Definition: CpModel.java:187
Constraint addCumulative(IntervalVar[] intervals, long[] demands, IntVar capacity)
Adds.
Definition: CpModel.java:884
Constraint addGreaterOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset)
Adds.
Definition: CpModel.java:213
Definition: SatHelper.java:13
Constraint addEquality(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:152
IntervalVar newIntervalVar(IntVar start, IntVar size, long end, String name)
Creates an interval variable with a fixed end.
Definition: CpModel.java:717
IntervalVar newOptionalIntervalVar(IntVar start, IntVar size, IntVar end, Literal isPresent, String name)
Creates an optional interval variable from start, size, end, and isPresent.
Definition: CpModel.java:765
Constraint addCircuit(int[] tails, int[] heads, Literal[] literals)
Adds.
Definition: CpModel.java:308
Constraint addCumulative(IntervalVar[] intervals, int[] demands, long capacity)
Adds.
Definition: CpModel.java:947
CpModelProto model()
Definition: CpModel.java:1027
Constraint addImplication(Literal a, Literal b)
Adds.
Definition: CpModel.java:127
Constraint addAllowedAssignments(IntVar[] variables, long[][] tuplesList)
Adds.
Definition: CpModel.java:344
IntVar getVariable(int index)
Returns the ith variable.
IntVar newConstant(long value)
Creates a constant variable.
Definition: CpModel.java:90
Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, IntVar capacity)
Adds.
Definition: CpModel.java:866
Constraint addElement(IntVar index, long[] values, IntVar target)
Adds the element constraint:
Definition: CpModel.java:270
Constraint addForbiddenAssignments(IntVar[] variables, int[][] tuplesList)
Adds.
Definition: CpModel.java:414
int getIndex()
Constraint addReservoirConstraintWithActive(IntVar[] times, long[] demands, IntVar[] actives, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:575
Main modeling class.
Definition: CpModel.java:40
Constraint addDifferent(IntVar left, IntVar right)
Adds.
Definition: CpModel.java:226
Constraint addInverse(IntVar[] variables, IntVar[] inverseVariables)
Adds.
Definition: CpModel.java:484
int getIndex()
Internal, returns the index of the variable in the underlying CpModelProto.
static Domain fromFlatIntervals(long[] flat_intervals)
This method is available in Python, Java and .NET.
Definition: Domain.java:100
void minimize(LinearExpr expr)
Adds a minimization objective of a linear expression.
Definition: CpModel.java:960
void addHint(IntVar var, long value)
Adds hinting to a variable.
Definition: CpModel.java:952
static Builder newBuilder()
Constraint addBoolXor(Literal[] literals)
Adds.
Definition: CpModel.java:117
An integer variable.
Literal not()
Returns the Boolean negation of the current literal.
Constraint addAllowedAssignments(IntVar[] variables, int[][] tuplesList)
Adds.
Definition: CpModel.java:369
IntervalVar newOptionalIntervalVar(long start, IntVar size, IntVar end, Literal isPresent, String name)
Creates an optional interval with a fixed start.
Definition: CpModel.java:794
static String modelStats(com.google.ortools.sat.CpModelProto model_proto)
Definition: SatHelper.java:80
An interval variable.
void addDecisionStrategy(IntVar[] variables, DecisionStrategyProto.VariableSelectionStrategy varStr, DecisionStrategyProto.DomainReductionStrategy domStr)
Adds.
Definition: CpModel.java:981
Constraint addReservoirConstraintWithActive(IntVar[] times, int[] demands, IntVar[] actives, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:604
IntervalVar newIntervalVar(long start, IntVar size, IntVar end, String name)
Creates an interval variable with a fixed start.
Definition: CpModel.java:737
Definition: Domain.java:9
Constraint addElement(IntVar index, int[] values, IntVar target)
Adds the element constraint:
Definition: CpModel.java:282
static String validateModel(com.google.ortools.sat.CpModelProto model_proto)
Definition: SatHelper.java:88
String modelStats()
Returns some statistics on model as a string.
Definition: CpModel.java:993
Constraint addGreaterThan(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:208
void maximize(LinearExpr expr)
Adds a maximization objective of a linear expression.
Definition: CpModel.java:969
A linear expression interface that can be parsed.
Definition: LinearExpr.java:17
Boolean exportToFile(String file)
Write the model as a ascii protocol buffer to 'file'.
Definition: CpModel.java:1003
MismatchedArrayLengths(String methodName, String array1Name, String array2Name)
Definition: CpModel.java:50
void addMapDomain(IntVar var, Literal[] booleans, long offset)
Adds.
Definition: CpModel.java:611
Constraint addLessOrEqual(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:172
Constraint addLessThan(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:177
IntVar newBoolVar(String name)
Creates a Boolean variable with the given name.
Definition: CpModel.java:85