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 
33 
39 public final class CpModel {
40  static class CpModelException extends Exception {
41  public CpModelException(String methodName, String msg) {
42  // Call constructor of parent Exception
43  super("CpModel." + methodName + ": " + msg);
44  }
45  }
46 
48  public static class MismatchedArrayLengths extends CpModelException {
49  public MismatchedArrayLengths(String methodName, String array1Name, String array2Name) {
50  super(methodName, array1Name + " and " + array2Name + " have mismatched lengths");
51  }
52  }
53 
55  public static class WrongLength extends CpModelException {
56  public WrongLength(String methodName, String msg) {
57  super(methodName, msg);
58  }
59  }
60 
61  public CpModel() {
62  modelBuilder = CpModelProto.newBuilder();
63  }
64 
65  // Integer variables.
66 
68  public IntVar newIntVar(long lb, long ub, String name) {
69  return new IntVar(modelBuilder, new Domain(lb, ub), name);
70  }
71 
79  public IntVar newIntVarFromDomain(Domain domain, String name) {
80  return new IntVar(modelBuilder, domain, name);
81  }
82 
84  public IntVar newBoolVar(String name) {
85  return new IntVar(modelBuilder, new Domain(0, 1), name);
86  }
87 
89  public IntVar newConstant(long value) {
90  return new IntVar(modelBuilder, new Domain(value), ""); // bounds and name.
91  }
92 
93  // Boolean Constraints.
94 
96  public Constraint addBoolOr(Literal[] literals) {
97  Constraint ct = new Constraint(modelBuilder);
98  BoolArgumentProto.Builder boolOr = ct.getBuilder().getBoolOrBuilder();
99  for (Literal lit : literals) {
100  boolOr.addLiterals(lit.getIndex());
101  }
102  return ct;
103  }
104 
106  public Constraint addBoolAnd(Literal[] literals) {
107  Constraint ct = new Constraint(modelBuilder);
108  BoolArgumentProto.Builder boolOr = ct.getBuilder().getBoolAndBuilder();
109  for (Literal lit : literals) {
110  boolOr.addLiterals(lit.getIndex());
111  }
112  return ct;
113  }
114 
116  public Constraint addBoolXor(Literal[] literals) {
117  Constraint ct = new Constraint(modelBuilder);
118  BoolArgumentProto.Builder boolOr = ct.getBuilder().getBoolXorBuilder();
119  for (Literal lit : literals) {
120  boolOr.addLiterals(lit.getIndex());
121  }
122  return ct;
123  }
124 
127  return addBoolOr(new Literal[] {a.not(), b});
128  }
129 
130  // Linear constraints.
131 
134  Constraint ct = new Constraint(modelBuilder);
135  LinearConstraintProto.Builder lin = ct.getBuilder().getLinearBuilder();
136  for (int i = 0; i < expr.numElements(); ++i) {
137  lin.addVars(expr.getVariable(i).getIndex()).addCoeffs(expr.getCoefficient(i));
138  }
139  for (long b : domain.flattenedIntervals()) {
140  lin.addDomain(b);
141  }
142  return ct;
143  }
144 
146  public Constraint addLinearConstraint(LinearExpr expr, long lb, long ub) {
147  return addLinearExpressionInDomain(expr, new Domain(lb, ub));
148  }
149 
151  public Constraint addEquality(LinearExpr expr, long value) {
152  return addLinearExpressionInDomain(expr, new Domain(value));
153  }
154 
157  return addLinearExpressionInDomain(new Difference(left, right), new Domain(0));
158  }
159 
161  public Constraint addEqualityWithOffset(LinearExpr left, LinearExpr right, long offset) {
162  return addLinearExpressionInDomain(new Difference(left, right), new Domain(-offset));
163  }
164 
166  public Constraint addLessOrEqual(LinearExpr expr, long value) {
167  return addLinearExpressionInDomain(expr, new Domain(Long.MIN_VALUE, value));
168  }
169 
172  return addLinearExpressionInDomain(new Difference(left, right), new Domain(Long.MIN_VALUE, 0));
173  }
174 
176  public Constraint addLessThan(LinearExpr expr, long value) {
177  return addLinearExpressionInDomain(expr, new Domain(Long.MIN_VALUE, value - 1));
178  }
179 
182  return addLinearExpressionInDomain(new Difference(left, right), new Domain(Long.MIN_VALUE, -1));
183  }
184 
186  public Constraint addLessOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset) {
188  new Difference(left, right), new Domain(Long.MIN_VALUE, -offset));
189  }
190 
192  public Constraint addGreaterOrEqual(LinearExpr expr, long value) {
193  return addLinearExpressionInDomain(expr, new Domain(value, Long.MAX_VALUE));
194  }
195 
198  return addLinearExpressionInDomain(new Difference(left, right), new Domain(0, Long.MAX_VALUE));
199  }
200 
202  public Constraint addGreaterThan(LinearExpr expr, long value) {
203  return addLinearExpressionInDomain(expr, new Domain(value + 1, Long.MAX_VALUE));
204  }
205 
208  return addLinearExpressionInDomain(new Difference(left, right), new Domain(1, Long.MAX_VALUE));
209  }
210 
212  public Constraint addGreaterOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset) {
214  new Difference(left, right), new Domain(-offset, Long.MAX_VALUE));
215  }
216 
218  public Constraint addDifferent(LinearExpr expr, long value) {
219  return addLinearExpressionInDomain(expr,
221  new long[] {Long.MIN_VALUE, value - 1, value + 1, Long.MAX_VALUE}));
222  }
223 
225  public Constraint addDifferent(IntVar left, IntVar right) {
226  return addLinearExpressionInDomain(new Difference(left, right),
227  Domain.fromFlatIntervals(new long[] {Long.MIN_VALUE, -1, 1, Long.MAX_VALUE}));
228  }
229 
231  public Constraint addDifferentWithOffset(IntVar left, IntVar right, long offset) {
232  return addLinearExpressionInDomain(new Difference(left, right),
234  new long[] {Long.MIN_VALUE, -offset - 1, -offset + 1, Long.MAX_VALUE}));
235  }
236 
237  // Integer constraints.
238 
247  public Constraint addAllDifferent(IntVar[] variables) {
248  Constraint ct = new Constraint(modelBuilder);
249  AllDifferentConstraintProto.Builder allDiff = ct.getBuilder().getAllDiffBuilder();
250  for (IntVar var : variables) {
251  allDiff.addVars(var.getIndex());
252  }
253  return ct;
254  }
255 
257  public Constraint addElement(IntVar index, IntVar[] variables, IntVar target) {
258  Constraint ct = new Constraint(modelBuilder);
260  ct.getBuilder().getElementBuilder().setIndex(index.getIndex());
261  for (IntVar var : variables) {
262  element.addVars(var.getIndex());
263  }
264  element.setTarget(target.getIndex());
265  return ct;
266  }
267 
269  public Constraint addElement(IntVar index, long[] values, IntVar target) {
270  Constraint ct = new Constraint(modelBuilder);
272  ct.getBuilder().getElementBuilder().setIndex(index.getIndex());
273  for (long v : values) {
274  element.addVars(indexFromConstant(v));
275  }
276  element.setTarget(target.getIndex());
277  return ct;
278  }
279 
281  public Constraint addElement(IntVar index, int[] values, IntVar target) {
282  Constraint ct = new Constraint(modelBuilder);
284  ct.getBuilder().getElementBuilder().setIndex(index.getIndex());
285  for (long v : values) {
286  element.addVars(indexFromConstant(v));
287  }
288  element.setTarget(target.getIndex());
289  return ct;
290  }
291 
307  public Constraint addCircuit(int[] tails, int[] heads, Literal[] literals)
308  throws MismatchedArrayLengths {
309  if (tails.length != heads.length) {
310  throw new MismatchedArrayLengths("addCircuit", "tails", "heads");
311  }
312  if (tails.length != literals.length) {
313  throw new MismatchedArrayLengths("addCircuit", "tails", "literals");
314  }
315 
316  Constraint ct = new Constraint(modelBuilder);
317  CircuitConstraintProto.Builder circuit = ct.getBuilder().getCircuitBuilder();
318  for (int t : tails) {
319  circuit.addTails(t);
320  }
321  for (int h : heads) {
322  circuit.addHeads(h);
323  }
324  for (Literal lit : literals) {
325  circuit.addLiterals(lit.getIndex());
326  }
327  return ct;
328  }
329 
343  public Constraint addAllowedAssignments(IntVar[] variables, long[][] tuplesList)
344  throws WrongLength {
345  Constraint ct = new Constraint(modelBuilder);
346  TableConstraintProto.Builder table = ct.getBuilder().getTableBuilder();
347  for (IntVar var : variables) {
348  table.addVars(var.getIndex());
349  }
350  int numVars = variables.length;
351  for (int t = 0; t < tuplesList.length; ++t) {
352  if (tuplesList[t].length != numVars) {
353  throw new WrongLength("addAllowedAssignments",
354  "tuple " + t + " does not have the same length as the variables");
355  }
356  for (int i = 0; i < tuplesList[t].length; ++i) {
357  table.addValues(tuplesList[t][i]);
358  }
359  }
360  return ct;
361  }
362 
368  public Constraint addAllowedAssignments(IntVar[] variables, int[][] tuplesList)
369  throws WrongLength {
370  Constraint ct = new Constraint(modelBuilder);
371  TableConstraintProto.Builder table = ct.getBuilder().getTableBuilder();
372  for (IntVar var : variables) {
373  table.addVars(var.getIndex());
374  }
375  int numVars = variables.length;
376  for (int t = 0; t < tuplesList.length; ++t) {
377  if (tuplesList[t].length != numVars) {
378  throw new WrongLength("addAllowedAssignments",
379  "tuple " + t + " does not have the same length as the variables");
380  }
381  for (int i = 0; i < tuplesList[t].length; ++i) {
382  table.addValues(tuplesList[t][i]);
383  }
384  }
385  return ct;
386  }
387 
400  public Constraint addForbiddenAssignments(IntVar[] variables, long[][] tuplesList)
401  throws WrongLength {
402  Constraint ct = addAllowedAssignments(variables, tuplesList);
403  // Reverse the flag.
404  ct.getBuilder().getTableBuilder().setNegated(true);
405  return ct;
406  }
407 
413  public Constraint addForbiddenAssignments(IntVar[] variables, int[][] tuplesList)
414  throws WrongLength {
415  Constraint ct = addAllowedAssignments(variables, tuplesList);
416  // Reverse the flag.
417  ct.getBuilder().getTableBuilder().setNegated(true);
418  return ct;
419  }
420 
452  public Constraint addAutomaton(IntVar[] transitionVariables, long startingState,
453  long[] finalStates, long[][] transitions) throws WrongLength {
454  Constraint ct = new Constraint(modelBuilder);
455  AutomatonConstraintProto.Builder automaton = ct.getBuilder().getAutomatonBuilder();
456  for (IntVar var : transitionVariables) {
457  automaton.addVars(var.getIndex());
458  }
459  automaton.setStartingState(startingState);
460  for (long c : finalStates) {
461  automaton.addFinalStates(c);
462  }
463  for (long[] t : transitions) {
464  if (t.length != 3) {
465  throw new WrongLength("addAutomaton", "transition does not have length 3");
466  }
467  automaton.addTransitionTail(t[0]).addTransitionLabel(t[1]).addTransitionHead(t[2]);
468  }
469  return ct;
470  }
471 
483  public Constraint addInverse(IntVar[] variables, IntVar[] inverseVariables)
484  throws MismatchedArrayLengths {
485  if (variables.length != inverseVariables.length) {
486  throw new MismatchedArrayLengths("addInverse", "variables", "inverseVariables");
487  }
488  Constraint ct = new Constraint(modelBuilder);
489  InverseConstraintProto.Builder inverse = ct.getBuilder().getInverseBuilder();
490  for (IntVar var : variables) {
491  inverse.addFDirect(var.getIndex());
492  }
493  for (IntVar var : inverseVariables) {
494  inverse.addFInverse(var.getIndex());
495  }
496  return ct;
497  }
498 
523  IntVar[] times, long[] demands, long minLevel, long maxLevel) throws MismatchedArrayLengths {
524  if (times.length != demands.length) {
525  throw new MismatchedArrayLengths("addReservoirConstraint", "times", "demands");
526  }
527  if (minLevel > 0) {
528  throw new IllegalArgumentException("addReservoirConstraint: minLevel must be <= 0");
529  }
530  if (maxLevel < 0) {
531  throw new IllegalArgumentException("addReservoirConstraint: maxLevel must be >= 0");
532  }
533  Constraint ct = new Constraint(modelBuilder);
534  ReservoirConstraintProto.Builder reservoir = ct.getBuilder().getReservoirBuilder();
535  for (IntVar var : times) {
536  reservoir.addTimes(var.getIndex());
537  }
538  for (long d : demands) {
539  reservoir.addDemands(d);
540  }
541  reservoir.setMinLevel(minLevel).setMaxLevel(maxLevel);
542  return ct;
543  }
544 
551  IntVar[] times, int[] demands, long minLevel, long maxLevel) throws MismatchedArrayLengths {
552  return addReservoirConstraint(times, toLongArray(demands), minLevel, maxLevel);
553  }
554 
578  public Constraint addReservoirConstraintWithActive(IntVar[] times, long[] demands,
579  IntVar[] actives, long minLevel, long maxLevel) throws MismatchedArrayLengths {
580  if (times.length != demands.length) {
581  throw new MismatchedArrayLengths("addReservoirConstraint", "times", "demands");
582  }
583  if (times.length != actives.length) {
584  throw new MismatchedArrayLengths("addReservoirConstraint", "times", "actives");
585  }
586  if (minLevel > 0) {
587  throw new IllegalArgumentException("addReservoirConstraint: minLevel must be <= 0");
588  }
589  if (maxLevel < 0) {
590  throw new IllegalArgumentException("addReservoirConstraint: maxLevel must be >= 0");
591  }
592 
593  Constraint ct = new Constraint(modelBuilder);
594  ReservoirConstraintProto.Builder reservoir = ct.getBuilder().getReservoirBuilder();
595  for (IntVar var : times) {
596  reservoir.addTimes(var.getIndex());
597  }
598  for (long d : demands) {
599  reservoir.addDemands(d);
600  }
601  for (IntVar var : actives) {
602  reservoir.addActives(var.getIndex());
603  }
604  reservoir.setMinLevel(minLevel).setMaxLevel(maxLevel);
605  return ct;
606  }
607 
613  public Constraint addReservoirConstraintWithActive(IntVar[] times, int[] demands,
614  IntVar[] actives, long minLevel, long maxLevel) throws MismatchedArrayLengths {
616  times, toLongArray(demands), actives, minLevel, maxLevel);
617  }
618 
620  public void addMapDomain(IntVar var, Literal[] booleans, long offset) {
621  for (int i = 0; i < booleans.length; ++i) {
622  addEquality(var, offset + i).onlyEnforceIf(booleans[i]);
623  addDifferent(var, offset + i).onlyEnforceIf(booleans[i].not());
624  }
625  }
626 
628  public Constraint addMinEquality(IntVar target, IntVar[] vars) {
629  Constraint ct = new Constraint(modelBuilder);
631  ct.getBuilder().getIntMinBuilder().setTarget(target.getIndex());
632  for (IntVar var : vars) {
633  intMin.addVars(var.getIndex());
634  }
635  return ct;
636  }
637 
639  public Constraint addMaxEquality(IntVar target, IntVar[] vars) {
640  Constraint ct = new Constraint(modelBuilder);
642  ct.getBuilder().getIntMaxBuilder().setTarget(target.getIndex());
643  for (IntVar var : vars) {
644  intMax.addVars(var.getIndex());
645  }
646  return ct;
647  }
648 
650  public Constraint addDivisionEquality(IntVar target, IntVar num, IntVar denom) {
651  Constraint ct = new Constraint(modelBuilder);
652  ct.getBuilder()
653  .getIntDivBuilder()
654  .setTarget(target.getIndex())
655  .addVars(num.getIndex())
656  .addVars(denom.getIndex());
657  return ct;
658  }
659 
661  public Constraint addAbsEquality(IntVar target, IntVar var) {
662  Constraint ct = new Constraint(modelBuilder);
663  ct.getBuilder()
664  .getIntMaxBuilder()
665  .setTarget(target.getIndex())
666  .addVars(var.getIndex())
667  .addVars(-var.getIndex() - 1);
668  return ct;
669  }
670 
672  public Constraint addModuloEquality(IntVar target, IntVar var, IntVar mod) {
673  Constraint ct = new Constraint(modelBuilder);
674  ct.getBuilder()
675  .getIntModBuilder()
676  .setTarget(target.getIndex())
677  .addVars(var.getIndex())
678  .addVars(mod.getIndex());
679  return ct;
680  }
681 
683  public Constraint addModuloEquality(IntVar target, IntVar var, long mod) {
684  Constraint ct = new Constraint(modelBuilder);
685  ct.getBuilder()
686  .getIntModBuilder()
687  .setTarget(target.getIndex())
688  .addVars(var.getIndex())
689  .addVars(indexFromConstant(mod));
690  return ct;
691  }
692 
694  public Constraint addProductEquality(IntVar target, IntVar[] vars) {
695  Constraint ct = new Constraint(modelBuilder);
696  IntegerArgumentProto.Builder intProd =
697  ct.getBuilder().getIntProdBuilder().setTarget(target.getIndex());
698  for (IntVar var : vars) {
699  intProd.addVars(var.getIndex());
700  }
701  return ct;
702  }
703 
704  // Scheduling support.
705 
720  public IntervalVar newIntervalVar(IntVar start, IntVar size, IntVar end, String name) {
721  return new IntervalVar(modelBuilder, start.getIndex(), size.getIndex(), end.getIndex(), name);
722  }
723 
729  public IntervalVar newIntervalVar(IntVar start, IntVar size, long end, String name) {
730  return new IntervalVar(
731  modelBuilder, start.getIndex(), size.getIndex(), indexFromConstant(end), name);
732  }
733 
739  public IntervalVar newIntervalVar(IntVar start, long size, IntVar end, String name) {
740  return new IntervalVar(
741  modelBuilder, start.getIndex(), indexFromConstant(size), end.getIndex(), name);
742  }
743 
749  public IntervalVar newIntervalVar(long start, IntVar size, IntVar end, String name) {
750  return new IntervalVar(
751  modelBuilder, indexFromConstant(start), size.getIndex(), end.getIndex(), name);
752  }
753 
755  public IntervalVar newFixedInterval(long start, long size, String name) {
756  return new IntervalVar(modelBuilder, indexFromConstant(start), indexFromConstant(size),
757  indexFromConstant(start + size), name);
758  }
759 
778  IntVar start, IntVar size, IntVar end, Literal isPresent, String name) {
779  return new IntervalVar(modelBuilder, start.getIndex(), size.getIndex(), end.getIndex(),
780  isPresent.getIndex(), name);
781  }
782 
789  IntVar start, IntVar size, long end, Literal isPresent, String name) {
790  return new IntervalVar(modelBuilder, start.getIndex(), size.getIndex(), indexFromConstant(end),
791  isPresent.getIndex(), name);
792  }
793 
800  IntVar start, long size, IntVar end, Literal isPresent, String name) {
801  return new IntervalVar(modelBuilder, start.getIndex(), indexFromConstant(size), end.getIndex(),
802  isPresent.getIndex(), name);
803  }
804 
807  long start, IntVar size, IntVar end, Literal isPresent, String name) {
808  return new IntervalVar(modelBuilder, indexFromConstant(start), size.getIndex(), end.getIndex(),
809  isPresent.getIndex(), name);
810  }
811 
818  long start, long size, Literal isPresent, String name) {
819  return new IntervalVar(modelBuilder, indexFromConstant(start), indexFromConstant(size),
820  indexFromConstant(start + size), isPresent.getIndex(), name);
821  }
822 
831  public Constraint addNoOverlap(IntervalVar[] intervalVars) {
832  Constraint ct = new Constraint(modelBuilder);
833  NoOverlapConstraintProto.Builder noOverlap = ct.getBuilder().getNoOverlapBuilder();
834  for (IntervalVar var : intervalVars) {
835  noOverlap.addIntervals(var.getIndex());
836  }
837  return ct;
838  }
839 
851  public Constraint addNoOverlap2D(IntervalVar[] xIntervals, IntervalVar[] yIntervals) {
852  Constraint ct = new Constraint(modelBuilder);
853  NoOverlap2DConstraintProto.Builder noOverlap2d = ct.getBuilder().getNoOverlap2DBuilder();
854  for (IntervalVar x : xIntervals) {
855  noOverlap2d.addXIntervals(x.getIndex());
856  }
857  for (IntervalVar y : yIntervals) {
858  noOverlap2d.addYIntervals(y.getIndex());
859  }
860  return ct;
861  }
862 
878  public Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, IntVar capacity) {
879  Constraint ct = new Constraint(modelBuilder);
880  CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
881  for (IntervalVar interval : intervals) {
882  cumul.addIntervals(interval.getIndex());
883  }
884  for (IntVar var : demands) {
885  cumul.addDemands(var.getIndex());
886  }
887  cumul.setCapacity(capacity.getIndex());
888  return ct;
889  }
890 
896  public Constraint addCumulative(IntervalVar[] intervals, long[] demands, IntVar capacity) {
897  Constraint ct = new Constraint(modelBuilder);
898  CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
899  for (IntervalVar interval : intervals) {
900  cumul.addIntervals(interval.getIndex());
901  }
902  for (long d : demands) {
903  cumul.addDemands(indexFromConstant(d));
904  }
905  cumul.setCapacity(capacity.getIndex());
906  return ct;
907  }
908 
914  public Constraint addCumulative(IntervalVar[] intervals, int[] demands, IntVar capacity) {
915  return addCumulative(intervals, toLongArray(demands), capacity);
916  }
917 
923  public Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, long capacity) {
924  Constraint ct = new Constraint(modelBuilder);
925  CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
926  for (IntervalVar interval : intervals) {
927  cumul.addIntervals(interval.getIndex());
928  }
929  for (IntVar var : demands) {
930  cumul.addDemands(var.getIndex());
931  }
932  cumul.setCapacity(indexFromConstant(capacity));
933  return ct;
934  }
935 
941  public Constraint addCumulative(IntervalVar[] intervals, long[] demands, long capacity) {
942  Constraint ct = new Constraint(modelBuilder);
943  CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
944  for (IntervalVar interval : intervals) {
945  cumul.addIntervals(interval.getIndex());
946  }
947  for (long d : demands) {
948  cumul.addDemands(indexFromConstant(d));
949  }
950  cumul.setCapacity(indexFromConstant(capacity));
951  return ct;
952  }
953 
959  public Constraint addCumulative(IntervalVar[] intervals, int[] demands, long capacity) {
960  return addCumulative(intervals, toLongArray(demands), capacity);
961  }
962 
964  public void addHint(IntVar var, long value) {
965  modelBuilder.getSolutionHintBuilder().addVars(var.getIndex());
966  modelBuilder.getSolutionHintBuilder().addValues(value);
967  }
968 
969  // Objective.
970 
972  public void minimize(LinearExpr expr) {
973  CpObjectiveProto.Builder obj = modelBuilder.getObjectiveBuilder();
974  for (int i = 0; i < expr.numElements(); ++i) {
975  obj.addVars(expr.getVariable(i).getIndex()).addCoeffs(expr.getCoefficient(i));
976  }
977  }
978 
980  public void maximize(LinearExpr expr) {
981  CpObjectiveProto.Builder obj = modelBuilder.getObjectiveBuilder();
982  for (int i = 0; i < expr.numElements(); ++i) {
983  obj.addVars(expr.getVariable(i).getIndex()).addCoeffs(-expr.getCoefficient(i));
984  }
985  obj.setScalingFactor(-1.0);
986  }
987 
988  // DecisionStrategy
989 
991  public void addDecisionStrategy(IntVar[] variables,
994  DecisionStrategyProto.Builder ds = modelBuilder.addSearchStrategyBuilder();
995  for (IntVar var : variables) {
996  ds.addVariables(var.getIndex());
997  }
998  ds.setVariableSelectionStrategy(varStr).setDomainReductionStrategy(domStr);
999  }
1000 
1002  public String modelStats() {
1003  return SatHelper.modelStats(model());
1004  }
1005 
1007  public String validate() {
1008  return SatHelper.validateModel(model());
1009  }
1010 
1012  public Boolean exportToFile(String file) {
1013  return SatHelper.writeModelToFile(model(), file);
1014  }
1015 
1016  // Helpers
1017 
1018  long[] toLongArray(int[] values) {
1019  long[] result = new long[values.length];
1020  for (int i = 0; i < values.length; ++i) {
1021  result[i] = values[i];
1022  }
1023  return result;
1024  }
1025 
1026  int indexFromConstant(long constant) {
1027  int index = modelBuilder.getVariablesCount();
1028  modelBuilder.addVariablesBuilder().addDomain(constant).addDomain(constant);
1029  return index;
1030  }
1031 
1032  // Getters.
1033 
1034  public CpModelProto model() {
1035  return modelBuilder.build();
1036  }
1037 
1038  public int negated(int index) {
1039  return -index - 1;
1040  }
1041 
1044  return modelBuilder;
1045  }
1046 
1047  private final CpModelProto.Builder modelBuilder;
1048 }
Exception thrown when parallel arrays have mismatched lengths.
Definition: CpModel.java:48
Constraint addNoOverlap2D(IntervalVar[] xIntervals, IntervalVar[] yIntervals)
Adds.
Definition: CpModel.java:851
Constraint addElement(IntVar index, IntVar[] variables, IntVar target)
Adds the element constraint:
Definition: CpModel.java:257
Constraint addBoolOr(Literal[] literals)
Adds.
Definition: CpModel.java:96
Constraint addAbsEquality(IntVar target, IntVar var)
Adds.
Definition: CpModel.java:661
IntervalVar newFixedInterval(long start, long size, String name)
Creates a fixed interval from its start and its size.
Definition: CpModel.java:755
Wrapper around a ConstraintProto.
Constraint addNoOverlap(IntervalVar[] intervalVars)
Adds.
Definition: CpModel.java:831
Constraint addGreaterOrEqual(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:197
Constraint addProductEquality(IntVar target, IntVar[] vars)
Adds.
Definition: CpModel.java:694
static boolean writeModelToFile(com.google.ortools.sat.CpModelProto model_proto, String filename)
Definition: SatHelper.java:96
int negated(int index)
Definition: CpModel.java:1038
Constraint addLinearConstraint(LinearExpr expr, long lb, long ub)
Adds.
Definition: CpModel.java:146
CpModelProto.Builder getBuilder()
Returns the model builder.
Definition: CpModel.java:1043
Constraint addGreaterThan(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:202
WrongLength(String methodName, String msg)
Definition: CpModel.java:56
Constraint addLessOrEqual(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:166
CpModel()
Definition: CpModel.java:61
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:672
IntervalVar newOptionalIntervalVar(IntVar start, long size, IntVar end, Literal isPresent, String name)
Creates an optional interval with a fixed size.
Definition: CpModel.java:799
IntVar newIntVarFromDomain(Domain domain, String name)
Creates an integer variable with given domain.
Definition: CpModel.java:79
Constraint addMinEquality(IntVar target, IntVar[] vars)
Adds.
Definition: CpModel.java:628
IntervalVar newOptionalIntervalVar(IntVar start, IntVar size, long end, Literal isPresent, String name)
Creates an optional interval with a fixed end.
Definition: CpModel.java:788
Constraint addDifferentWithOffset(IntVar left, IntVar right, long offset)
Adds.
Definition: CpModel.java:231
long getCoefficient(int index)
Returns the ith coefficient.
.lang.Override int getVariablesCount()
Constraint addEqualityWithOffset(LinearExpr left, LinearExpr right, long offset)
Adds.
Definition: CpModel.java:161
Constraint addAllDifferent(IntVar[] variables)
Adds.
Definition: CpModel.java:247
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:639
Constraint addCumulative(IntervalVar[] intervals, long[] demands, long capacity)
Adds.
Definition: CpModel.java:941
Constraint addModuloEquality(IntVar target, IntVar var, long mod)
Adds.
Definition: CpModel.java:683
IntervalVar newIntervalVar(IntVar start, IntVar size, IntVar end, String name)
Creates an interval variable from start, size, and end.
Definition: CpModel.java:720
Constraint addLinearExpressionInDomain(LinearExpr expr, Domain domain)
Adds.
Definition: CpModel.java:133
Constraint addEquality(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:156
Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, long capacity)
Adds.
Definition: CpModel.java:923
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:817
Constraint addDivisionEquality(IntVar target, IntVar num, IntVar denom)
Adds.
Definition: CpModel.java:650
Constraint addLessThan(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:181
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:55
Constraint addDifferent(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:218
Constraint addGreaterOrEqual(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:192
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:452
IntervalVar newIntervalVar(IntVar start, long size, IntVar end, String name)
Creates an interval variable with a fixed size.
Definition: CpModel.java:739
Constraint addBoolAnd(Literal[] literals)
Adds.
Definition: CpModel.java:106
String validate()
Returns a non empty string explaining the issue if the model is invalid.
Definition: CpModel.java:1007
IntVar newIntVar(long lb, long ub, String name)
Creates an integer variable with domain [lb, ub].
Definition: CpModel.java:68
Constraint addForbiddenAssignments(IntVar[] variables, long[][] tuplesList)
Adds.
Definition: CpModel.java:400
Constraint addReservoirConstraint(IntVar[] times, int[] demands, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:550
Constraint addCumulative(IntervalVar[] intervals, int[] demands, IntVar capacity)
Adds.
Definition: CpModel.java:914
Constraint addReservoirConstraint(IntVar[] times, long[] demands, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:522
Constraint addLessOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset)
Adds.
Definition: CpModel.java:186
Constraint addCumulative(IntervalVar[] intervals, long[] demands, IntVar capacity)
Adds.
Definition: CpModel.java:896
Constraint addGreaterOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset)
Adds.
Definition: CpModel.java:212
Definition: SatHelper.java:13
Constraint addEquality(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:151
IntervalVar newIntervalVar(IntVar start, IntVar size, long end, String name)
Creates an interval variable with a fixed end.
Definition: CpModel.java:729
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:777
Constraint addCircuit(int[] tails, int[] heads, Literal[] literals)
Adds.
Definition: CpModel.java:307
Constraint addCumulative(IntervalVar[] intervals, int[] demands, long capacity)
Adds.
Definition: CpModel.java:959
CpModelProto model()
Definition: CpModel.java:1034
Constraint addImplication(Literal a, Literal b)
Adds.
Definition: CpModel.java:126
Constraint addAllowedAssignments(IntVar[] variables, long[][] tuplesList)
Adds.
Definition: CpModel.java:343
IntVar getVariable(int index)
Returns the ith variable.
IntVar newConstant(long value)
Creates a constant variable.
Definition: CpModel.java:89
Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, IntVar capacity)
Adds.
Definition: CpModel.java:878
Constraint addElement(IntVar index, long[] values, IntVar target)
Adds the element constraint:
Definition: CpModel.java:269
Constraint addForbiddenAssignments(IntVar[] variables, int[][] tuplesList)
Adds.
Definition: CpModel.java:413
int getIndex()
Constraint addReservoirConstraintWithActive(IntVar[] times, long[] demands, IntVar[] actives, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:578
Main modeling class.
Definition: CpModel.java:39
Constraint addDifferent(IntVar left, IntVar right)
Adds.
Definition: CpModel.java:225
Constraint addInverse(IntVar[] variables, IntVar[] inverseVariables)
Adds.
Definition: CpModel.java:483
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:972
void addHint(IntVar var, long value)
Adds hinting to a variable.
Definition: CpModel.java:964
static Builder newBuilder()
Constraint addBoolXor(Literal[] literals)
Adds.
Definition: CpModel.java:116
An integer variable.
Literal not()
Returns the Boolean negation of the current literal.
Constraint addAllowedAssignments(IntVar[] variables, int[][] tuplesList)
Adds.
Definition: CpModel.java:368
IntervalVar newOptionalIntervalVar(long start, IntVar size, IntVar end, Literal isPresent, String name)
Creates an optional interval with a fixed start.
Definition: CpModel.java:806
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:991
Constraint addReservoirConstraintWithActive(IntVar[] times, int[] demands, IntVar[] actives, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:613
IntervalVar newIntervalVar(long start, IntVar size, IntVar end, String name)
Creates an interval variable with a fixed start.
Definition: CpModel.java:749
Definition: Domain.java:9
Constraint addElement(IntVar index, int[] values, IntVar target)
Adds the element constraint:
Definition: CpModel.java:281
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:1002
Constraint addGreaterThan(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:207
void maximize(LinearExpr expr)
Adds a maximization objective of a linear expression.
Definition: CpModel.java:980
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:1012
MismatchedArrayLengths(String methodName, String array1Name, String array2Name)
Definition: CpModel.java:49
void addMapDomain(IntVar var, Literal[] booleans, long offset)
Adds.
Definition: CpModel.java:620
Constraint addLessOrEqual(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:171
Constraint addLessThan(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:176
IntVar newBoolVar(String name)
Creates a Boolean variable with the given name.
Definition: CpModel.java:84