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());
139  lin.addCoeffs(expr.getCoefficient(i));
140  }
141  for (long b : domain.flattenedIntervals()) {
142  lin.addDomain(b);
143  }
144  return ct;
145  }
146 
148  public Constraint addLinearConstraint(LinearExpr expr, long lb, long ub) {
149  return addLinearExpressionInDomain(expr, new Domain(lb, ub));
150  }
151 
153  public Constraint addEquality(LinearExpr expr, long value) {
154  return addLinearExpressionInDomain(expr, new Domain(value));
155  }
156 
159  return addLinearExpressionInDomain(new Difference(left, right), new Domain(0));
160  }
161 
163  public Constraint addEqualityWithOffset(LinearExpr left, LinearExpr right, long offset) {
164  return addLinearExpressionInDomain(new Difference(left, right), new Domain(-offset));
165  }
166 
168  public Constraint addLessOrEqual(LinearExpr expr, long value) {
169  return addLinearExpressionInDomain(expr, new Domain(Long.MIN_VALUE, value));
170  }
171 
174  return addLinearExpressionInDomain(new Difference(left, right), new Domain(Long.MIN_VALUE, 0));
175  }
176 
178  public Constraint addLessThan(LinearExpr expr, long value) {
179  return addLinearExpressionInDomain(expr, new Domain(Long.MIN_VALUE, value - 1));
180  }
181 
184  return addLinearExpressionInDomain(new Difference(left, right), new Domain(Long.MIN_VALUE, -1));
185  }
186 
188  public Constraint addLessOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset) {
190  new Difference(left, right), new Domain(Long.MIN_VALUE, -offset));
191  }
192 
194  public Constraint addGreaterOrEqual(LinearExpr expr, long value) {
195  return addLinearExpressionInDomain(expr, new Domain(value, Long.MAX_VALUE));
196  }
197 
200  return addLinearExpressionInDomain(new Difference(left, right), new Domain(0, Long.MAX_VALUE));
201  }
202 
204  public Constraint addGreaterThan(LinearExpr expr, long value) {
205  return addLinearExpressionInDomain(expr, new Domain(value + 1, Long.MAX_VALUE));
206  }
207 
210  return addLinearExpressionInDomain(new Difference(left, right), new Domain(1, Long.MAX_VALUE));
211  }
212 
214  public Constraint addGreaterOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset) {
216  new Difference(left, right), new Domain(-offset, Long.MAX_VALUE));
217  }
218 
220  public Constraint addDifferent(LinearExpr expr, long value) {
221  return addLinearExpressionInDomain(expr,
223  new long[] {Long.MIN_VALUE, value - 1, value + 1, Long.MAX_VALUE}));
224  }
225 
227  public Constraint addDifferent(IntVar left, IntVar right) {
228  return addLinearExpressionInDomain(new Difference(left, right),
229  Domain.fromFlatIntervals(new long[] {Long.MIN_VALUE, -1, 1, Long.MAX_VALUE}));
230  }
231 
233  public Constraint addDifferentWithOffset(IntVar left, IntVar right, long offset) {
234  return addLinearExpressionInDomain(new Difference(left, right),
236  new long[] {Long.MIN_VALUE, -offset - 1, -offset + 1, Long.MAX_VALUE}));
237  }
238 
239  // Integer constraints.
240 
249  public Constraint addAllDifferent(IntVar[] variables) {
250  Constraint ct = new Constraint(modelBuilder);
251  AllDifferentConstraintProto.Builder allDiff = ct.getBuilder().getAllDiffBuilder();
252  for (IntVar var : variables) {
253  allDiff.addVars(var.getIndex());
254  }
255  return ct;
256  }
257 
259  public Constraint addElement(IntVar index, IntVar[] variables, IntVar target) {
260  Constraint ct = new Constraint(modelBuilder);
261  ElementConstraintProto.Builder element = ct.getBuilder().getElementBuilder();
262  element.setIndex(index.getIndex());
263  for (IntVar var : variables) {
264  element.addVars(var.getIndex());
265  }
266  element.setTarget(target.getIndex());
267  return ct;
268  }
269 
271  public Constraint addElement(IntVar index, long[] values, IntVar target) {
272  Constraint ct = new Constraint(modelBuilder);
273  ElementConstraintProto.Builder element = ct.getBuilder().getElementBuilder();
274  element.setIndex(index.getIndex());
275  for (long v : values) {
276  element.addVars(indexFromConstant(v));
277  }
278  element.setTarget(target.getIndex());
279  return ct;
280  }
281 
283  public Constraint addElement(IntVar index, int[] values, IntVar target) {
284  Constraint ct = new Constraint(modelBuilder);
285  ElementConstraintProto.Builder element = ct.getBuilder().getElementBuilder();
286  element.setIndex(index.getIndex());
287  for (long v : values) {
288  element.addVars(indexFromConstant(v));
289  }
290  element.setTarget(target.getIndex());
291  return ct;
292  }
293 
309  public Constraint addCircuit(int[] tails, int[] heads, Literal[] literals)
310  throws MismatchedArrayLengths {
311  if (tails.length != heads.length) {
312  throw new MismatchedArrayLengths("addCircuit", "tails", "heads");
313  }
314  if (tails.length != literals.length) {
315  throw new MismatchedArrayLengths("addCircuit", "tails", "literals");
316  }
317 
318  Constraint ct = new Constraint(modelBuilder);
319  CircuitConstraintProto.Builder circuit = ct.getBuilder().getCircuitBuilder();
320  for (int t : tails) {
321  circuit.addTails(t);
322  }
323  for (int h : heads) {
324  circuit.addHeads(h);
325  }
326  for (Literal lit : literals) {
327  circuit.addLiterals(lit.getIndex());
328  }
329  return ct;
330  }
331 
345  public Constraint addAllowedAssignments(IntVar[] variables, long[][] tuplesList)
346  throws WrongLength {
347  Constraint ct = new Constraint(modelBuilder);
348  TableConstraintProto.Builder table = ct.getBuilder().getTableBuilder();
349  for (IntVar var : variables) {
350  table.addVars(var.getIndex());
351  }
352  int numVars = variables.length;
353  for (int t = 0; t < tuplesList.length; ++t) {
354  if (tuplesList[t].length != numVars) {
355  throw new WrongLength("addAllowedAssignments",
356  "tuple " + t + " does not have the same length as the variables");
357  }
358  for (int i = 0; i < tuplesList[t].length; ++i) {
359  table.addValues(tuplesList[t][i]);
360  }
361  }
362  return ct;
363  }
364 
370  public Constraint addAllowedAssignments(IntVar[] variables, int[][] tuplesList)
371  throws WrongLength {
372  Constraint ct = new Constraint(modelBuilder);
373  TableConstraintProto.Builder table = ct.getBuilder().getTableBuilder();
374  for (IntVar var : variables) {
375  table.addVars(var.getIndex());
376  }
377  int numVars = variables.length;
378  for (int t = 0; t < tuplesList.length; ++t) {
379  if (tuplesList[t].length != numVars) {
380  throw new WrongLength("addAllowedAssignments",
381  "tuple " + t + " does not have the same length as the variables");
382  }
383  for (int i = 0; i < tuplesList[t].length; ++i) {
384  table.addValues(tuplesList[t][i]);
385  }
386  }
387  return ct;
388  }
389 
402  public Constraint addForbiddenAssignments(IntVar[] variables, long[][] tuplesList)
403  throws WrongLength {
404  Constraint ct = addAllowedAssignments(variables, tuplesList);
405  // Reverse the flag.
406  ct.getBuilder().getTableBuilder().setNegated(true);
407  return ct;
408  }
409 
415  public Constraint addForbiddenAssignments(IntVar[] variables, int[][] tuplesList)
416  throws WrongLength {
417  Constraint ct = addAllowedAssignments(variables, tuplesList);
418  // Reverse the flag.
419  ct.getBuilder().getTableBuilder().setNegated(true);
420  return ct;
421  }
422 
454  public Constraint addAutomaton(IntVar[] transitionVariables, long startingState,
455  long[] finalStates, long[][] transitions) throws WrongLength {
456  Constraint ct = new Constraint(modelBuilder);
457  AutomatonConstraintProto.Builder automaton = ct.getBuilder().getAutomatonBuilder();
458  for (IntVar var : transitionVariables) {
459  automaton.addVars(var.getIndex());
460  }
461  automaton.setStartingState(startingState);
462  for (long c : finalStates) {
463  automaton.addFinalStates(c);
464  }
465  for (long[] t : transitions) {
466  if (t.length != 3) {
467  throw new WrongLength("addAutomaton", "transition does not have length 3");
468  }
469  automaton.addTransitionTail(t[0]);
470  automaton.addTransitionLabel(t[1]);
471  automaton.addTransitionHead(t[2]);
472  }
473  return ct;
474  }
475 
487  public Constraint addInverse(IntVar[] variables, IntVar[] inverseVariables)
488  throws MismatchedArrayLengths {
489  if (variables.length != inverseVariables.length) {
490  throw new MismatchedArrayLengths("addInverse", "variables", "inverseVariables");
491  }
492  Constraint ct = new Constraint(modelBuilder);
493  InverseConstraintProto.Builder inverse = ct.getBuilder().getInverseBuilder();
494  for (IntVar var : variables) {
495  inverse.addFDirect(var.getIndex());
496  }
497  for (IntVar var : inverseVariables) {
498  inverse.addFInverse(var.getIndex());
499  }
500  return ct;
501  }
502 
527  IntVar[] times, long[] demands, long minLevel, long maxLevel) throws MismatchedArrayLengths {
528  if (times.length != demands.length) {
529  throw new MismatchedArrayLengths("addReservoirConstraint", "times", "demands");
530  }
531  Constraint ct = new Constraint(modelBuilder);
532  ReservoirConstraintProto.Builder reservoir = ct.getBuilder().getReservoirBuilder();
533  for (IntVar var : times) {
534  reservoir.addTimes(var.getIndex());
535  }
536  for (long d : demands) {
537  reservoir.addDemands(d);
538  }
539  reservoir.setMinLevel(minLevel);
540  reservoir.setMaxLevel(maxLevel);
541  return ct;
542  }
543 
550  IntVar[] times, int[] demands, long minLevel, long maxLevel) throws MismatchedArrayLengths {
551  return addReservoirConstraint(times, toLongArray(demands), minLevel, maxLevel);
552  }
553 
579  public Constraint addReservoirConstraintWithActive(IntVar[] times, long[] demands,
580  IntVar[] actives, long minLevel, long maxLevel) throws MismatchedArrayLengths {
581  if (times.length != demands.length) {
582  throw new MismatchedArrayLengths("addReservoirConstraint", "times", "demands");
583  }
584  if (times.length != actives.length) {
585  throw new MismatchedArrayLengths("addReservoirConstraint", "times", "actives");
586  }
587 
588  Constraint ct = new Constraint(modelBuilder);
589  ReservoirConstraintProto.Builder reservoir = ct.getBuilder().getReservoirBuilder();
590  for (IntVar var : times) {
591  reservoir.addTimes(var.getIndex());
592  }
593  for (long d : demands) {
594  reservoir.addDemands(d);
595  }
596  for (IntVar var : actives) {
597  reservoir.addActives(var.getIndex());
598  }
599  reservoir.setMinLevel(minLevel);
600  reservoir.setMaxLevel(maxLevel);
601  return ct;
602  }
603 
609  public Constraint addReservoirConstraintWithActive(IntVar[] times, int[] demands,
610  IntVar[] actives, long minLevel, long maxLevel) throws MismatchedArrayLengths {
612  times, toLongArray(demands), actives, minLevel, maxLevel);
613  }
614 
616  public void addMapDomain(IntVar var, Literal[] booleans, long offset) {
617  for (int i = 0; i < booleans.length; ++i) {
618  addEquality(var, offset + i).onlyEnforceIf(booleans[i]);
619  addDifferent(var, offset + i).onlyEnforceIf(booleans[i].not());
620  }
621  }
622 
624  public Constraint addMinEquality(IntVar target, IntVar[] vars) {
625  Constraint ct = new Constraint(modelBuilder);
626  IntegerArgumentProto.Builder intMin = ct.getBuilder().getIntMinBuilder();
627  intMin.setTarget(target.getIndex());
628  for (IntVar var : vars) {
629  intMin.addVars(var.getIndex());
630  }
631  return ct;
632  }
633 
635  public Constraint addMaxEquality(IntVar target, IntVar[] vars) {
636  Constraint ct = new Constraint(modelBuilder);
637  IntegerArgumentProto.Builder intMax = ct.getBuilder().getIntMaxBuilder();
638  intMax.setTarget(target.getIndex());
639  for (IntVar var : vars) {
640  intMax.addVars(var.getIndex());
641  }
642  return ct;
643  }
644 
646  public Constraint addDivisionEquality(IntVar target, IntVar num, IntVar denom) {
647  Constraint ct = new Constraint(modelBuilder);
648  IntegerArgumentProto.Builder intDiv = ct.getBuilder().getIntDivBuilder();
649  intDiv.setTarget(target.getIndex());
650  intDiv.addVars(num.getIndex());
651  intDiv.addVars(denom.getIndex());
652  return ct;
653  }
654 
656  public Constraint addAbsEquality(IntVar target, IntVar var) {
657  Constraint ct = new Constraint(modelBuilder);
658  IntegerArgumentProto.Builder intMax = ct.getBuilder().getIntMaxBuilder();
659  intMax.setTarget(target.getIndex());
660  intMax.addVars(var.getIndex());
661  intMax.addVars(-var.getIndex() - 1);
662  return ct;
663  }
664 
666  public Constraint addModuloEquality(IntVar target, IntVar var, IntVar mod) {
667  Constraint ct = new Constraint(modelBuilder);
668  IntegerArgumentProto.Builder intMod = ct.getBuilder().getIntModBuilder();
669  intMod.setTarget(target.getIndex());
670  intMod.addVars(var.getIndex());
671  intMod.addVars(mod.getIndex());
672  return ct;
673  }
674 
676  public Constraint addModuloEquality(IntVar target, IntVar var, long mod) {
677  Constraint ct = new Constraint(modelBuilder);
678  IntegerArgumentProto.Builder intMod = ct.getBuilder().getIntModBuilder();
679  intMod.setTarget(target.getIndex());
680  intMod.addVars(var.getIndex());
681  intMod.addVars(indexFromConstant(mod));
682  return ct;
683  }
684 
686  public Constraint addProductEquality(IntVar target, IntVar[] vars) {
687  Constraint ct = new Constraint(modelBuilder);
688  IntegerArgumentProto.Builder intProd = ct.getBuilder().getIntProdBuilder();
689  intProd.setTarget(target.getIndex());
690  for (IntVar var : vars) {
691  intProd.addVars(var.getIndex());
692  }
693  return ct;
694  }
695 
696  // Scheduling support.
697 
712  public IntervalVar newIntervalVar(IntVar start, IntVar size, IntVar end, String name) {
713  return new IntervalVar(modelBuilder, start.getIndex(), size.getIndex(), end.getIndex(), name);
714  }
715 
721  public IntervalVar newIntervalVar(IntVar start, IntVar size, long end, String name) {
722  return new IntervalVar(
723  modelBuilder, start.getIndex(), size.getIndex(), indexFromConstant(end), name);
724  }
725 
731  public IntervalVar newIntervalVar(IntVar start, long size, IntVar end, String name) {
732  return new IntervalVar(
733  modelBuilder, start.getIndex(), indexFromConstant(size), end.getIndex(), name);
734  }
735 
741  public IntervalVar newIntervalVar(long start, IntVar size, IntVar end, String name) {
742  return new IntervalVar(
743  modelBuilder, indexFromConstant(start), size.getIndex(), end.getIndex(), name);
744  }
745 
747  public IntervalVar newFixedInterval(long start, long size, String name) {
748  return new IntervalVar(modelBuilder, indexFromConstant(start), indexFromConstant(size),
749  indexFromConstant(start + size), name);
750  }
751 
770  IntVar start, IntVar size, IntVar end, Literal isPresent, String name) {
771  return new IntervalVar(modelBuilder, start.getIndex(), size.getIndex(), end.getIndex(),
772  isPresent.getIndex(), name);
773  }
774 
781  IntVar start, IntVar size, long end, Literal isPresent, String name) {
782  return new IntervalVar(modelBuilder, start.getIndex(), size.getIndex(), indexFromConstant(end),
783  isPresent.getIndex(), name);
784  }
785 
792  IntVar start, long size, IntVar end, Literal isPresent, String name) {
793  return new IntervalVar(modelBuilder, start.getIndex(), indexFromConstant(size), end.getIndex(),
794  isPresent.getIndex(), name);
795  }
796 
799  long start, IntVar size, IntVar end, Literal isPresent, String name) {
800  return new IntervalVar(modelBuilder, indexFromConstant(start), size.getIndex(), end.getIndex(),
801  isPresent.getIndex(), name);
802  }
803 
810  long start, long size, Literal isPresent, String name) {
811  return new IntervalVar(modelBuilder, indexFromConstant(start), indexFromConstant(size),
812  indexFromConstant(start + size), isPresent.getIndex(), name);
813  }
814 
823  public Constraint addNoOverlap(IntervalVar[] intervalVars) {
824  Constraint ct = new Constraint(modelBuilder);
825  NoOverlapConstraintProto.Builder noOverlap = ct.getBuilder().getNoOverlapBuilder();
826  for (IntervalVar var : intervalVars) {
827  noOverlap.addIntervals(var.getIndex());
828  }
829  return ct;
830  }
831 
843  public Constraint addNoOverlap2D(IntervalVar[] xIntervals, IntervalVar[] yIntervals) {
844  Constraint ct = new Constraint(modelBuilder);
845  NoOverlap2DConstraintProto.Builder noOverlap2d = ct.getBuilder().getNoOverlap2DBuilder();
846  for (IntervalVar x : xIntervals) {
847  noOverlap2d.addXIntervals(x.getIndex());
848  }
849  for (IntervalVar y : yIntervals) {
850  noOverlap2d.addYIntervals(y.getIndex());
851  }
852  return ct;
853  }
854 
870  public Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, IntVar capacity) {
871  Constraint ct = new Constraint(modelBuilder);
872  CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
873  for (IntervalVar interval : intervals) {
874  cumul.addIntervals(interval.getIndex());
875  }
876  for (IntVar var : demands) {
877  cumul.addDemands(var.getIndex());
878  }
879  cumul.setCapacity(capacity.getIndex());
880  return ct;
881  }
882 
888  public Constraint addCumulative(IntervalVar[] intervals, long[] demands, IntVar capacity) {
889  Constraint ct = new Constraint(modelBuilder);
890  CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
891  for (IntervalVar interval : intervals) {
892  cumul.addIntervals(interval.getIndex());
893  }
894  for (long d : demands) {
895  cumul.addDemands(indexFromConstant(d));
896  }
897  cumul.setCapacity(capacity.getIndex());
898  return ct;
899  }
900 
906  public Constraint addCumulative(IntervalVar[] intervals, int[] demands, IntVar capacity) {
907  return addCumulative(intervals, toLongArray(demands), capacity);
908  }
909 
915  public Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, long capacity) {
916  Constraint ct = new Constraint(modelBuilder);
917  CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
918  for (IntervalVar interval : intervals) {
919  cumul.addIntervals(interval.getIndex());
920  }
921  for (IntVar var : demands) {
922  cumul.addDemands(var.getIndex());
923  }
924  cumul.setCapacity(indexFromConstant(capacity));
925  return ct;
926  }
927 
933  public Constraint addCumulative(IntervalVar[] intervals, long[] demands, long capacity) {
934  Constraint ct = new Constraint(modelBuilder);
935  CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
936  for (IntervalVar interval : intervals) {
937  cumul.addIntervals(interval.getIndex());
938  }
939  for (long d : demands) {
940  cumul.addDemands(indexFromConstant(d));
941  }
942  cumul.setCapacity(indexFromConstant(capacity));
943  return ct;
944  }
945 
951  public Constraint addCumulative(IntervalVar[] intervals, int[] demands, long capacity) {
952  return addCumulative(intervals, toLongArray(demands), capacity);
953  }
954 
956  public void addHint(IntVar var, long value) {
957  modelBuilder.getSolutionHintBuilder().addVars(var.getIndex());
958  modelBuilder.getSolutionHintBuilder().addValues(value);
959  }
960 
961  // Objective.
962 
964  public void minimize(LinearExpr expr) {
965  CpObjectiveProto.Builder obj = modelBuilder.getObjectiveBuilder();
966  for (int i = 0; i < expr.numElements(); ++i) {
967  obj.addVars(expr.getVariable(i).getIndex());
968  obj.addCoeffs(expr.getCoefficient(i));
969  }
970  }
971 
973  public void maximize(LinearExpr expr) {
974  CpObjectiveProto.Builder obj = modelBuilder.getObjectiveBuilder();
975  for (int i = 0; i < expr.numElements(); ++i) {
976  obj.addVars(expr.getVariable(i).getIndex());
977  obj.addCoeffs(-expr.getCoefficient(i));
978  }
979  obj.setScalingFactor(-1.0);
980  }
981 
982  // DecisionStrategy
983 
985  public void addDecisionStrategy(IntVar[] variables,
988  DecisionStrategyProto.Builder ds = modelBuilder.addSearchStrategyBuilder();
989  for (IntVar var : variables) {
990  ds.addVariables(var.getIndex());
991  }
992  ds.setVariableSelectionStrategy(varStr);
993  ds.setDomainReductionStrategy(domStr);
994  }
995 
997  public String modelStats() {
998  return SatHelper.modelStats(model());
999  }
1000 
1002  public String validate() {
1003  return SatHelper.validateModel(model());
1004  }
1005 
1006  // Helpers
1007 
1008  long[] toLongArray(int[] values) {
1009  long[] result = new long[values.length];
1010  for (int i = 0; i < values.length; ++i) {
1011  result[i] = values[i];
1012  }
1013  return result;
1014  }
1015 
1016  int indexFromConstant(long constant) {
1017  int index = modelBuilder.getVariablesCount();
1018  IntegerVariableProto.Builder cst = modelBuilder.addVariablesBuilder();
1019  cst.addDomain(constant);
1020  cst.addDomain(constant);
1021  return index;
1022  }
1023 
1024  // Getters.
1025 
1026  public CpModelProto model() {
1027  return modelBuilder.build();
1028  }
1029 
1030  public int negated(int index) {
1031  return -index - 1;
1032  }
1033 
1036  return modelBuilder;
1037  }
1038 
1039  private final CpModelProto.Builder modelBuilder;
1040 }
Exception thrown when parallel arrays have mismatched lengths.
Definition: CpModel.java:49
Constraint addNoOverlap2D(IntervalVar[] xIntervals, IntervalVar[] yIntervals)
Adds.
Definition: CpModel.java:843
Constraint addElement(IntVar index, IntVar[] variables, IntVar target)
Adds the element constraint:
Definition: CpModel.java:259
Constraint addBoolOr(Literal[] literals)
Adds.
Definition: CpModel.java:97
Constraint addAbsEquality(IntVar target, IntVar var)
Adds.
Definition: CpModel.java:656
IntervalVar newFixedInterval(long start, long size, String name)
Creates a fixed interval from its start and its size.
Definition: CpModel.java:747
Wrapper around a ConstraintProto.
Constraint addNoOverlap(IntervalVar[] intervalVars)
Adds.
Definition: CpModel.java:823
Constraint addGreaterOrEqual(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:199
Constraint addProductEquality(IntVar target, IntVar[] vars)
Adds.
Definition: CpModel.java:686
int negated(int index)
Definition: CpModel.java:1030
Constraint addLinearConstraint(LinearExpr expr, long lb, long ub)
Adds.
Definition: CpModel.java:148
CpModelProto.Builder getBuilder()
Returns the model builder.
Definition: CpModel.java:1035
Constraint addGreaterThan(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:204
WrongLength(String methodName, String msg)
Definition: CpModel.java:57
Constraint addLessOrEqual(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:168
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:666
IntervalVar newOptionalIntervalVar(IntVar start, long size, IntVar end, Literal isPresent, String name)
Creates an optional interval with a fixed size.
Definition: CpModel.java:791
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:624
IntervalVar newOptionalIntervalVar(IntVar start, IntVar size, long end, Literal isPresent, String name)
Creates an optional interval with a fixed end.
Definition: CpModel.java:780
Constraint addDifferentWithOffset(IntVar left, IntVar right, long offset)
Adds.
Definition: CpModel.java:233
long getCoefficient(int index)
Returns the ith coefficient.
.lang.Override int getVariablesCount()
Constraint addEqualityWithOffset(LinearExpr left, LinearExpr right, long offset)
Adds.
Definition: CpModel.java:163
Constraint addAllDifferent(IntVar[] variables)
Adds.
Definition: CpModel.java:249
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:635
Constraint addCumulative(IntervalVar[] intervals, long[] demands, long capacity)
Adds.
Definition: CpModel.java:933
Constraint addModuloEquality(IntVar target, IntVar var, long mod)
Adds.
Definition: CpModel.java:676
IntervalVar newIntervalVar(IntVar start, IntVar size, IntVar end, String name)
Creates an interval variable from start, size, and end.
Definition: CpModel.java:712
Constraint addLinearExpressionInDomain(LinearExpr expr, Domain domain)
Adds.
Definition: CpModel.java:134
Constraint addEquality(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:158
Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, long capacity)
Adds.
Definition: CpModel.java:915
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:809
Constraint addDivisionEquality(IntVar target, IntVar num, IntVar denom)
Adds.
Definition: CpModel.java:646
Constraint addLessThan(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:183
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:220
Constraint addGreaterOrEqual(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:194
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:454
IntervalVar newIntervalVar(IntVar start, long size, IntVar end, String name)
Creates an interval variable with a fixed size.
Definition: CpModel.java:731
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:1002
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:402
Constraint addReservoirConstraint(IntVar[] times, int[] demands, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:549
Constraint addCumulative(IntervalVar[] intervals, int[] demands, IntVar capacity)
Adds.
Definition: CpModel.java:906
Constraint addReservoirConstraint(IntVar[] times, long[] demands, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:526
Constraint addLessOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset)
Adds.
Definition: CpModel.java:188
Constraint addCumulative(IntervalVar[] intervals, long[] demands, IntVar capacity)
Adds.
Definition: CpModel.java:888
Constraint addGreaterOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset)
Adds.
Definition: CpModel.java:214
Definition: SatHelper.java:13
Constraint addEquality(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:153
IntervalVar newIntervalVar(IntVar start, IntVar size, long end, String name)
Creates an interval variable with a fixed end.
Definition: CpModel.java:721
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:769
Constraint addCircuit(int[] tails, int[] heads, Literal[] literals)
Adds.
Definition: CpModel.java:309
Constraint addCumulative(IntervalVar[] intervals, int[] demands, long capacity)
Adds.
Definition: CpModel.java:951
CpModelProto model()
Definition: CpModel.java:1026
Constraint addImplication(Literal a, Literal b)
Adds.
Definition: CpModel.java:127
Constraint addAllowedAssignments(IntVar[] variables, long[][] tuplesList)
Adds.
Definition: CpModel.java:345
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:870
Constraint addElement(IntVar index, long[] values, IntVar target)
Adds the element constraint:
Definition: CpModel.java:271
Constraint addForbiddenAssignments(IntVar[] variables, int[][] tuplesList)
Adds.
Definition: CpModel.java:415
int getIndex()
Constraint addReservoirConstraintWithActive(IntVar[] times, long[] demands, IntVar[] actives, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:579
Main modeling class.
Definition: CpModel.java:40
Constraint addDifferent(IntVar left, IntVar right)
Adds.
Definition: CpModel.java:227
Constraint addInverse(IntVar[] variables, IntVar[] inverseVariables)
Adds.
Definition: CpModel.java:487
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:964
void addHint(IntVar var, long value)
Adds hinting to a variable.
Definition: CpModel.java:956
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:370
IntervalVar newOptionalIntervalVar(long start, IntVar size, IntVar end, Literal isPresent, String name)
Creates an optional interval with a fixed start.
Definition: CpModel.java:798
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:985
Constraint addReservoirConstraintWithActive(IntVar[] times, int[] demands, IntVar[] actives, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:609
IntervalVar newIntervalVar(long start, IntVar size, IntVar end, String name)
Creates an interval variable with a fixed start.
Definition: CpModel.java:741
Definition: Domain.java:9
Constraint addElement(IntVar index, int[] values, IntVar target)
Adds the element constraint:
Definition: CpModel.java:283
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:997
Constraint addGreaterThan(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:209
void maximize(LinearExpr expr)
Adds a maximization objective of a linear expression.
Definition: CpModel.java:973
A linear expression interface that can be parsed.
Definition: LinearExpr.java:17
MismatchedArrayLengths(String methodName, String array1Name, String array2Name)
Definition: CpModel.java:50
void addMapDomain(IntVar var, Literal[] booleans, long offset)
Adds.
Definition: CpModel.java:616
Constraint addLessOrEqual(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:173
Constraint addLessThan(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:178
IntVar newBoolVar(String name)
Creates a Boolean variable with the given name.
Definition: CpModel.java:85