Java Reference

Java Reference

CpModel.java
Go to the documentation of this file.
1// Copyright 2010-2021 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
14package com.google.ortools.sat;
15
16import com.google.ortools.sat.AllDifferentConstraintProto;
17import com.google.ortools.sat.AutomatonConstraintProto;
18import com.google.ortools.sat.BoolArgumentProto;
19import com.google.ortools.sat.CircuitConstraintProto;
20import com.google.ortools.sat.CpModelProto;
21import com.google.ortools.sat.CpObjectiveProto;
22import com.google.ortools.sat.CumulativeConstraintProto;
23import com.google.ortools.sat.DecisionStrategyProto;
24import com.google.ortools.sat.ElementConstraintProto;
25import com.google.ortools.sat.FloatObjectiveProto;
26import com.google.ortools.sat.InverseConstraintProto;
27import com.google.ortools.sat.LinearArgumentProto;
28import com.google.ortools.sat.LinearConstraintProto;
29import com.google.ortools.sat.LinearExpressionProto;
30import com.google.ortools.sat.NoOverlap2DConstraintProto;
31import com.google.ortools.sat.NoOverlapConstraintProto;
32import com.google.ortools.sat.ReservoirConstraintProto;
33import com.google.ortools.sat.TableConstraintProto;
34import com.google.ortools.util.Domain;
35import java.util.LinkedHashMap;
36import java.util.Map;
37
38// TODO(user): Rewrite API to be closer to the C++ CpModel class.
44public final class CpModel {
45 static class CpModelException extends RuntimeException {
46 public CpModelException(String methodName, String msg) {
47 // Call constructor of parent Exception
48 super(methodName + ": " + msg);
49 }
50 }
51
53 public static class MismatchedArrayLengths extends CpModelException {
54 public MismatchedArrayLengths(String methodName, String array1Name, String array2Name) {
55 super(methodName, array1Name + " and " + array2Name + " have mismatched lengths");
56 }
57 }
58
60 public static class WrongLength extends CpModelException {
61 public WrongLength(String methodName, String msg) {
62 super(methodName, msg);
63 }
64 }
65 public CpModel() {
66 modelBuilder = CpModelProto.newBuilder();
67 constantMap = new LinkedHashMap<>();
68 }
69
70 // Integer variables.
71
73 public IntVar newIntVar(long lb, long ub, String name) {
74 return new IntVar(modelBuilder, new Domain(lb, ub), name);
75 }
76
84 public IntVar newIntVarFromDomain(Domain domain, String name) {
85 return new IntVar(modelBuilder, domain, name);
86 }
87
89 public IntVar newBoolVar(String name) {
90 return new IntVar(modelBuilder, new Domain(0, 1), name);
91 }
92
94 public IntVar newConstant(long value) {
95 if (constantMap.containsKey(value)) {
96 return constantMap.get(value);
97 }
98 IntVar cste = new IntVar(modelBuilder, new Domain(value), ""); // bounds and name.
99 constantMap.put(value, cste);
100 return cste;
101 }
102
105 return newConstant(1);
106 }
107
110 return newConstant(0);
111 }
112
113 // Boolean Constraints.
114
116 public Constraint addBoolOr(Literal[] literals) {
117 Constraint ct = new Constraint(modelBuilder);
118 BoolArgumentProto.Builder boolOr = ct.getBuilder().getBoolOrBuilder();
119 for (Literal lit : literals) {
120 boolOr.addLiterals(lit.getIndex());
121 }
122 return ct;
123 }
124
126 public Constraint addBoolAnd(Literal[] literals) {
127 Constraint ct = new Constraint(modelBuilder);
128 BoolArgumentProto.Builder boolOr = ct.getBuilder().getBoolAndBuilder();
129 for (Literal lit : literals) {
130 boolOr.addLiterals(lit.getIndex());
131 }
132 return ct;
133 }
134
136 public Constraint addBoolXor(Literal[] literals) {
137 Constraint ct = new Constraint(modelBuilder);
138 BoolArgumentProto.Builder boolOr = ct.getBuilder().getBoolXorBuilder();
139 for (Literal lit : literals) {
140 boolOr.addLiterals(lit.getIndex());
141 }
142 return ct;
143 }
144
147 return addBoolOr(new Literal[] {a.not(), b});
148 }
149
150 // Linear constraints.
151
154 Constraint ct = new Constraint(modelBuilder);
155 LinearConstraintProto.Builder lin = ct.getBuilder().getLinearBuilder();
156 for (int i = 0; i < expr.numElements(); ++i) {
157 lin.addVars(expr.getVariable(i).getIndex()).addCoeffs(expr.getCoefficient(i));
158 }
159 long offset = expr.getOffset();
160 if (offset != 0) {
161 lin.addVars(newConstant(1).getIndex()).addCoeffs(offset);
162 }
163 for (long b : domain.flattenedIntervals()) {
164 lin.addDomain(b);
165 }
166 return ct;
167 }
168
170 public Constraint addLinearConstraint(LinearExpr expr, long lb, long ub) {
171 return addLinearExpressionInDomain(expr, new Domain(lb, ub));
172 }
173
175 public Constraint addEquality(LinearExpr expr, long value) {
176 return addLinearExpressionInDomain(expr, new Domain(value));
177 }
178
181 return addLinearExpressionInDomain(new Difference(left, right), new Domain(0));
182 }
183
185 public Constraint addEqualityWithOffset(LinearExpr left, LinearExpr right, long offset) {
186 return addLinearExpressionInDomain(new Difference(left, right), new Domain(-offset));
187 }
188
190 public Constraint addLessOrEqual(LinearExpr expr, long value) {
191 return addLinearExpressionInDomain(expr, new Domain(Long.MIN_VALUE, value));
192 }
193
196 return addLinearExpressionInDomain(new Difference(left, right), new Domain(Long.MIN_VALUE, 0));
197 }
198
200 public Constraint addLessThan(LinearExpr expr, long value) {
201 return addLinearExpressionInDomain(expr, new Domain(Long.MIN_VALUE, value - 1));
202 }
203
206 return addLinearExpressionInDomain(new Difference(left, right), new Domain(Long.MIN_VALUE, -1));
207 }
208
210 public Constraint addLessOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset) {
212 new Difference(left, right), new Domain(Long.MIN_VALUE, -offset));
213 }
214
216 public Constraint addGreaterOrEqual(LinearExpr expr, long value) {
217 return addLinearExpressionInDomain(expr, new Domain(value, Long.MAX_VALUE));
218 }
219
222 return addLinearExpressionInDomain(new Difference(left, right), new Domain(0, Long.MAX_VALUE));
223 }
224
226 public Constraint addGreaterThan(LinearExpr expr, long value) {
227 return addLinearExpressionInDomain(expr, new Domain(value + 1, Long.MAX_VALUE));
228 }
229
232 return addLinearExpressionInDomain(new Difference(left, right), new Domain(1, Long.MAX_VALUE));
233 }
234
238 new Difference(left, right), new Domain(-offset, Long.MAX_VALUE));
239 }
240
242 public Constraint addDifferent(LinearExpr expr, long value) {
243 return addLinearExpressionInDomain(expr,
245 new long[] {Long.MIN_VALUE, value - 1, value + 1, Long.MAX_VALUE}));
246 }
247
250 return addLinearExpressionInDomain(new Difference(left, right),
251 Domain.fromFlatIntervals(new long[] {Long.MIN_VALUE, -1, 1, Long.MAX_VALUE}));
252 }
253
255 public Constraint addDifferentWithOffset(LinearExpr left, LinearExpr right, long offset) {
256 return addLinearExpressionInDomain(new Difference(left, right),
258 new long[] {Long.MIN_VALUE, -offset - 1, -offset + 1, Long.MAX_VALUE}));
259 }
260
261 // Integer constraints.
262
271 public Constraint addAllDifferent(IntVar[] variables) {
272 Constraint ct = new Constraint(modelBuilder);
273 AllDifferentConstraintProto.Builder allDiff = ct.getBuilder().getAllDiffBuilder();
274 for (IntVar var : variables) {
275 allDiff.addExprs(getLinearExpressionProtoBuilderFromLinearExpr(var, /*negate=*/false));
276 }
277 return ct;
278 }
279
288 public Constraint addAllDifferent(LinearExpr[] expressions) {
289 Constraint ct = new Constraint(modelBuilder);
290 AllDifferentConstraintProto.Builder allDiff = ct.getBuilder().getAllDiffBuilder();
291 for (LinearExpr expr : expressions) {
292 allDiff.addExprs(getLinearExpressionProtoBuilderFromLinearExpr(expr, /*negate=*/false));
293 }
294 return ct;
295 }
296
298 public Constraint addElement(IntVar index, IntVar[] variables, IntVar target) {
299 Constraint ct = new Constraint(modelBuilder);
301 ct.getBuilder().getElementBuilder().setIndex(index.getIndex());
302 for (IntVar var : variables) {
303 element.addVars(var.getIndex());
304 }
305 element.setTarget(target.getIndex());
306 return ct;
307 }
308
310 public Constraint addElement(IntVar index, long[] values, IntVar target) {
311 Constraint ct = new Constraint(modelBuilder);
313 ct.getBuilder().getElementBuilder().setIndex(index.getIndex());
314 for (long v : values) {
315 element.addVars(indexFromConstant(v));
316 }
317 element.setTarget(target.getIndex());
318 return ct;
319 }
320
322 public Constraint addElement(IntVar index, int[] values, IntVar target) {
323 Constraint ct = new Constraint(modelBuilder);
325 ct.getBuilder().getElementBuilder().setIndex(index.getIndex());
326 for (long v : values) {
327 element.addVars(indexFromConstant(v));
328 }
329 element.setTarget(target.getIndex());
330 return ct;
331 }
332
348 public Constraint addCircuit(int[] tails, int[] heads, Literal[] literals) {
349 if (tails.length != heads.length) {
350 throw new MismatchedArrayLengths("CpModel.addCircuit", "tails", "heads");
351 }
352 if (tails.length != literals.length) {
353 throw new MismatchedArrayLengths("CpModel.addCircuit", "tails", "literals");
354 }
355
356 Constraint ct = new Constraint(modelBuilder);
357 CircuitConstraintProto.Builder circuit = ct.getBuilder().getCircuitBuilder();
358 for (int t : tails) {
359 circuit.addTails(t);
360 }
361 for (int h : heads) {
362 circuit.addHeads(h);
363 }
364 for (Literal lit : literals) {
365 circuit.addLiterals(lit.getIndex());
366 }
367 return ct;
368 }
369
383 public Constraint addAllowedAssignments(IntVar[] variables, long[][] tuplesList) {
384 Constraint ct = new Constraint(modelBuilder);
385 TableConstraintProto.Builder table = ct.getBuilder().getTableBuilder();
386 for (IntVar var : variables) {
387 table.addVars(var.getIndex());
388 }
389 int numVars = variables.length;
390 for (int t = 0; t < tuplesList.length; ++t) {
391 if (tuplesList[t].length != numVars) {
392 throw new WrongLength("CpModel.addAllowedAssignments",
393 "tuple " + t + " does not have the same length as the variables");
394 }
395 for (int i = 0; i < tuplesList[t].length; ++i) {
396 table.addValues(tuplesList[t][i]);
397 }
398 }
399 return ct;
400 }
401
407 public Constraint addAllowedAssignments(IntVar[] variables, int[][] tuplesList) {
408 Constraint ct = new Constraint(modelBuilder);
409 TableConstraintProto.Builder table = ct.getBuilder().getTableBuilder();
410 for (IntVar var : variables) {
411 table.addVars(var.getIndex());
412 }
413 int numVars = variables.length;
414 for (int t = 0; t < tuplesList.length; ++t) {
415 if (tuplesList[t].length != numVars) {
416 throw new WrongLength("CpModel.addAllowedAssignments",
417 "tuple " + t + " does not have the same length as the variables");
418 }
419 for (int i = 0; i < tuplesList[t].length; ++i) {
420 table.addValues(tuplesList[t][i]);
421 }
422 }
423 return ct;
424 }
425
438 public Constraint addForbiddenAssignments(IntVar[] variables, long[][] tuplesList) {
439 Constraint ct = addAllowedAssignments(variables, tuplesList);
440 // Reverse the flag.
441 ct.getBuilder().getTableBuilder().setNegated(true);
442 return ct;
443 }
444
450 public Constraint addForbiddenAssignments(IntVar[] variables, int[][] tuplesList) {
451 Constraint ct = addAllowedAssignments(variables, tuplesList);
452 // Reverse the flag.
453 ct.getBuilder().getTableBuilder().setNegated(true);
454 return ct;
455 }
456
489 IntVar[] transitionVariables, long startingState, long[] finalStates, long[][] transitions) {
490 Constraint ct = new Constraint(modelBuilder);
491 AutomatonConstraintProto.Builder automaton = ct.getBuilder().getAutomatonBuilder();
492 for (IntVar var : transitionVariables) {
493 automaton.addVars(var.getIndex());
494 }
495 automaton.setStartingState(startingState);
496 for (long c : finalStates) {
497 automaton.addFinalStates(c);
498 }
499 for (long[] t : transitions) {
500 if (t.length != 3) {
501 throw new WrongLength("CpModel.addAutomaton", "transition does not have length 3");
502 }
503 automaton.addTransitionTail(t[0]).addTransitionLabel(t[1]).addTransitionHead(t[2]);
504 }
505 return ct;
506 }
507
519 public Constraint addInverse(IntVar[] variables, IntVar[] inverseVariables) {
520 if (variables.length != inverseVariables.length) {
521 throw new MismatchedArrayLengths("CpModel.addInverse", "variables", "inverseVariables");
522 }
523 Constraint ct = new Constraint(modelBuilder);
524 InverseConstraintProto.Builder inverse = ct.getBuilder().getInverseBuilder();
525 for (IntVar var : variables) {
526 inverse.addFDirect(var.getIndex());
527 }
528 for (IntVar var : inverseVariables) {
529 inverse.addFInverse(var.getIndex());
530 }
531 return ct;
532 }
533
559 IntVar[] times, long[] levelChanges, long minLevel, long maxLevel) {
560 if (times.length != levelChanges.length) {
561 throw new MismatchedArrayLengths("CpModel.addReservoirConstraint", "times", "levelChanges");
562 }
563 if (minLevel > 0) {
564 throw new IllegalArgumentException("CpModel.addReservoirConstraint: minLevel must be <= 0");
565 }
566 if (maxLevel < 0) {
567 throw new IllegalArgumentException("CpModel.addReservoirConstraint: maxLevel must be >= 0");
568 }
569 Constraint ct = new Constraint(modelBuilder);
570 ReservoirConstraintProto.Builder reservoir = ct.getBuilder().getReservoirBuilder();
571 for (IntVar time : times) {
572 reservoir.addTimeExprs(getLinearExpressionProtoBuilderFromLinearExpr(time, /*negate=*/false));
573 }
574 for (long d : levelChanges) {
575 reservoir.addLevelChanges(d);
576 }
577 reservoir.setMinLevel(minLevel).setMaxLevel(maxLevel);
578 return ct;
579 }
580
587 IntVar[] times, int[] levelChanges, long minLevel, long maxLevel) {
588 return addReservoirConstraint(times, toLongArray(levelChanges), minLevel, maxLevel);
589 }
590
616 LinearExpr[] times, long[] levelChanges, long minLevel, long maxLevel) {
617 if (times.length != levelChanges.length) {
618 throw new MismatchedArrayLengths("CpModel.addReservoirConstraint", "times", "levelChanges");
619 }
620 if (minLevel > 0) {
621 throw new IllegalArgumentException("CpModel.addReservoirConstraint: minLevel must be <= 0");
622 }
623 if (maxLevel < 0) {
624 throw new IllegalArgumentException("CpModel.addReservoirConstraint: maxLevel must be >= 0");
625 }
626 Constraint ct = new Constraint(modelBuilder);
627 ReservoirConstraintProto.Builder reservoir = ct.getBuilder().getReservoirBuilder();
628 for (LinearExpr time : times) {
629 reservoir.addTimeExprs(getLinearExpressionProtoBuilderFromLinearExpr(time, /*negate=*/false));
630 }
631 for (long d : levelChanges) {
632 reservoir.addLevelChanges(d);
633 }
634 reservoir.setMinLevel(minLevel).setMaxLevel(maxLevel);
635 return ct;
636 }
637
644 LinearExpr[] times, int[] levelChanges, long minLevel, long maxLevel) {
645 return addReservoirConstraint(times, toLongArray(levelChanges), minLevel, maxLevel);
646 }
647
673 IntVar[] times, long[] levelChanges, IntVar[] actives, long minLevel, long maxLevel) {
674 if (times.length != levelChanges.length) {
675 throw new MismatchedArrayLengths(
676 "CpModel.addReservoirConstraintWithActive", "times", "levelChanges");
677 }
678 if (times.length != actives.length) {
679 throw new MismatchedArrayLengths(
680 "CpModel.addReservoirConstraintWithActive", "times", "actives");
681 }
682 if (minLevel > 0) {
683 throw new IllegalArgumentException(
684 "CpModel.addReservoirConstraintWithActive: minLevel must be <= 0");
685 }
686 if (maxLevel < 0) {
687 throw new IllegalArgumentException(
688 "CpModel.addReservoirConstraintWithActive: maxLevel must be >= 0");
689 }
690
691 Constraint ct = new Constraint(modelBuilder);
692 ReservoirConstraintProto.Builder reservoir = ct.getBuilder().getReservoirBuilder();
693 for (IntVar time : times) {
694 reservoir.addTimeExprs(getLinearExpressionProtoBuilderFromLinearExpr(time, /*negate=*/false));
695 }
696 for (long d : levelChanges) {
697 reservoir.addLevelChanges(d);
698 }
699 for (IntVar var : actives) {
700 reservoir.addActiveLiterals(var.getIndex());
701 }
702 reservoir.setMinLevel(minLevel).setMaxLevel(maxLevel);
703 return ct;
704 }
705
712 IntVar[] times, int[] levelChanges, IntVar[] actives, long minLevel, long maxLevel) {
714 times, toLongArray(levelChanges), actives, minLevel, maxLevel);
715 }
716
742 LinearExpr[] times, long[] levelChanges, IntVar[] actives, long minLevel, long maxLevel) {
743 if (times.length != levelChanges.length) {
744 throw new MismatchedArrayLengths(
745 "CpModel.addReservoirConstraintWithActive", "times", "levelChanges");
746 }
747 if (times.length != actives.length) {
748 throw new MismatchedArrayLengths(
749 "CpModel.addReservoirConstraintWithActive", "times", "actives");
750 }
751 if (minLevel > 0) {
752 throw new IllegalArgumentException(
753 "CpModel.addReservoirConstraintWithActive: minLevel must be <= 0");
754 }
755 if (maxLevel < 0) {
756 throw new IllegalArgumentException(
757 "CpModel.addReservoirConstraintWithActive: maxLevel must be >= 0");
758 }
759
760 Constraint ct = new Constraint(modelBuilder);
761 ReservoirConstraintProto.Builder reservoir = ct.getBuilder().getReservoirBuilder();
762 for (LinearExpr time : times) {
763 reservoir.addTimeExprs(getLinearExpressionProtoBuilderFromLinearExpr(time, /*negate=*/false));
764 }
765 for (long l : levelChanges) {
766 reservoir.addLevelChanges(l);
767 }
768 for (IntVar var : actives) {
769 reservoir.addActiveLiterals(var.getIndex());
770 }
771 reservoir.setMinLevel(minLevel).setMaxLevel(maxLevel);
772 return ct;
773 }
774
781 LinearExpr[] times, int[] levelChanges, IntVar[] actives, long minLevel, long maxLevel) {
783 times, toLongArray(levelChanges), actives, minLevel, maxLevel);
784 }
785
787 public void addMapDomain(IntVar var, Literal[] booleans, long offset) {
788 for (int i = 0; i < booleans.length; ++i) {
789 addEquality(var, offset + i).onlyEnforceIf(booleans[i]);
790 addDifferent(var, offset + i).onlyEnforceIf(booleans[i].not());
791 }
792 }
793
796 Constraint ct = new Constraint(modelBuilder);
797 LinearArgumentProto.Builder linMax = ct.getBuilder().getLinMaxBuilder();
798 linMax.setTarget(getLinearExpressionProtoBuilderFromLinearExpr(target, /*negate=*/true));
799 for (IntVar var : vars) {
800 linMax.addExprs(getLinearExpressionProtoBuilderFromLinearExpr(var, /*negate=*/true));
801 }
802 return ct;
803 }
804
807 Constraint ct = new Constraint(modelBuilder);
808 LinearArgumentProto.Builder linMax = ct.getBuilder().getLinMaxBuilder();
809 linMax.setTarget(getLinearExpressionProtoBuilderFromLinearExpr(target, /*negate=*/true));
810 for (LinearExpr expr : exprs) {
811 linMax.addExprs(getLinearExpressionProtoBuilderFromLinearExpr(expr, /*negate=*/true));
812 }
813 return ct;
814 }
815
818 Constraint ct = new Constraint(modelBuilder);
819 LinearArgumentProto.Builder linMax = ct.getBuilder().getLinMaxBuilder();
820 linMax.setTarget(getLinearExpressionProtoBuilderFromLinearExpr(target, /*negate=*/false));
821 for (IntVar var : vars) {
822 linMax.addExprs(getLinearExpressionProtoBuilderFromLinearExpr(var, /*negate=*/false));
823 }
824 return ct;
825 }
826
829 Constraint ct = new Constraint(modelBuilder);
830 LinearArgumentProto.Builder linMax = ct.getBuilder().getLinMaxBuilder();
831 linMax.setTarget(getLinearExpressionProtoBuilderFromLinearExpr(target, /*negate=*/false));
832 for (LinearExpr expr : exprs) {
833 linMax.addExprs(getLinearExpressionProtoBuilderFromLinearExpr(expr, /*negate=*/false));
834 }
835 return ct;
836 }
837
840 Constraint ct = new Constraint(modelBuilder);
841 ct.getBuilder()
842 .getIntDivBuilder()
843 .setTarget(getLinearExpressionProtoBuilderFromLinearExpr(target, /*negate=*/false))
844 .addExprs(getLinearExpressionProtoBuilderFromLinearExpr(num, /*negate=*/false))
845 .addExprs(getLinearExpressionProtoBuilderFromLinearExpr(denom, /*negate=*/false));
846 return ct;
847 }
848
851 Constraint ct = new Constraint(modelBuilder);
852 LinearArgumentProto.Builder linMax = ct.getBuilder().getLinMaxBuilder();
853 linMax.setTarget(getLinearExpressionProtoBuilderFromLinearExpr(target, /*negate=*/false));
854 linMax.addExprs(getLinearExpressionProtoBuilderFromLinearExpr(expr, /*negate=*/false));
855 linMax.addExprs(getLinearExpressionProtoBuilderFromLinearExpr(expr, /*negate=*/true));
856 return ct;
857 }
858
861 Constraint ct = new Constraint(modelBuilder);
862 ct.getBuilder()
863 .getIntModBuilder()
864 .setTarget(getLinearExpressionProtoBuilderFromLinearExpr(target, /*negate=*/false))
865 .addExprs(getLinearExpressionProtoBuilderFromLinearExpr(var, /*negate=*/false))
866 .addExprs(getLinearExpressionProtoBuilderFromLinearExpr(mod, /*negate=*/false));
867 return ct;
868 }
869
871 public Constraint addModuloEquality(LinearExpr target, LinearExpr var, long mod) {
872 Constraint ct = new Constraint(modelBuilder);
873 ct.getBuilder()
874 .getIntModBuilder()
875 .setTarget(getLinearExpressionProtoBuilderFromLinearExpr(target, /*negate=*/false))
876 .addExprs(getLinearExpressionProtoBuilderFromLinearExpr(var, /*negate=*/false))
877 .addExprs(getLinearExpressionProtoBuilderFromLong(mod));
878 return ct;
879 }
880
883 Constraint ct = new Constraint(modelBuilder);
884 LinearArgumentProto.Builder intProd = ct.getBuilder().getIntProdBuilder();
885 intProd.setTarget(getLinearExpressionProtoBuilderFromLinearExpr(target, /*negate=*/false));
886 for (IntVar var : vars) {
887 intProd.addExprs(getLinearExpressionProtoBuilderFromLinearExpr(var, /*negate=*/false));
888 }
889 return ct;
890 }
891
894 Constraint ct = new Constraint(modelBuilder);
895 LinearArgumentProto.Builder intProd = ct.getBuilder().getIntProdBuilder();
896 intProd.setTarget(getLinearExpressionProtoBuilderFromLinearExpr(target, /*negate=*/false));
897 for (LinearExpr expr : exprs) {
898 intProd.addExprs(getLinearExpressionProtoBuilderFromLinearExpr(expr, /*negate=*/false));
899 }
900 return ct;
901 }
902
903 // Scheduling support.
904
920 LinearExpr start, LinearExpr size, LinearExpr end, String name) {
921 addEquality(new Sum(start, size), end);
922 return new IntervalVar(modelBuilder,
923 getLinearExpressionProtoBuilderFromLinearExpr(start, /*negate=*/false),
924 getLinearExpressionProtoBuilderFromLinearExpr(size, /*negate=*/false),
925 getLinearExpressionProtoBuilderFromLinearExpr(end, /*negate=*/false), name);
926 }
927
939 public IntervalVar newFixedSizeIntervalVar(LinearExpr start, long size, String name) {
940 return new IntervalVar(modelBuilder,
941 getLinearExpressionProtoBuilderFromLinearExpr(start, /*negate=*/false),
942 getLinearExpressionProtoBuilderFromLong(size),
943 getLinearExpressionProtoBuilderFromLinearExpr(new Sum(start, size), /*negate=*/false),
944 name);
945 }
946
948 public IntervalVar newFixedInterval(long start, long size, String name) {
949 return new IntervalVar(modelBuilder, getLinearExpressionProtoBuilderFromLong(start),
950 getLinearExpressionProtoBuilderFromLong(size),
951 getLinearExpressionProtoBuilderFromLong(start + size), name);
952 }
953
973 LinearExpr start, LinearExpr size, LinearExpr end, Literal isPresent, String name) {
974 addEquality(new Sum(start, size), end).onlyEnforceIf(isPresent);
975 return new IntervalVar(modelBuilder,
976 getLinearExpressionProtoBuilderFromLinearExpr(start, /*negate=*/false),
977 getLinearExpressionProtoBuilderFromLinearExpr(size, /*negate=*/false),
978 getLinearExpressionProtoBuilderFromLinearExpr(end, /*negate=*/false), isPresent.getIndex(),
979 name);
980 }
981
996 LinearExpr start, long size, Literal isPresent, String name) {
997 return new IntervalVar(modelBuilder,
998 getLinearExpressionProtoBuilderFromLinearExpr(start, /*negate=*/false),
999 getLinearExpressionProtoBuilderFromLong(size),
1000 getLinearExpressionProtoBuilderFromLinearExpr(new Sum(start, size), /*negate=*/false),
1001 isPresent.getIndex(), name);
1002 }
1003
1006 long start, long size, Literal isPresent, String name) {
1007 return new IntervalVar(modelBuilder, getLinearExpressionProtoBuilderFromLong(start),
1008 getLinearExpressionProtoBuilderFromLong(size),
1009 getLinearExpressionProtoBuilderFromLong(start + size), isPresent.getIndex(), name);
1010 }
1011
1020 public Constraint addNoOverlap(IntervalVar[] intervalVars) {
1021 Constraint ct = new Constraint(modelBuilder);
1022 NoOverlapConstraintProto.Builder noOverlap = ct.getBuilder().getNoOverlapBuilder();
1023 for (IntervalVar var : intervalVars) {
1024 noOverlap.addIntervals(var.getIndex());
1025 }
1026 return ct;
1027 }
1028
1042 public Constraint addNoOverlap2D(IntervalVar[] xIntervals, IntervalVar[] yIntervals) {
1043 Constraint ct = new Constraint(modelBuilder);
1044 NoOverlap2DConstraintProto.Builder noOverlap2d = ct.getBuilder().getNoOverlap2DBuilder();
1045 for (IntervalVar x : xIntervals) {
1046 noOverlap2d.addXIntervals(x.getIndex());
1047 }
1048 for (IntervalVar y : yIntervals) {
1049 noOverlap2d.addYIntervals(y.getIndex());
1050 }
1051 return ct;
1052 }
1053
1070 IntervalVar[] intervals, LinearExpr[] demands, LinearExpr capacity) {
1071 Constraint ct = new Constraint(modelBuilder);
1072 CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
1073 for (IntervalVar interval : intervals) {
1074 cumul.addIntervals(interval.getIndex());
1075 }
1076 for (LinearExpr d : demands) {
1077 cumul.addDemands(getLinearExpressionProtoBuilderFromLinearExpr(d, false));
1078 }
1079 cumul.setCapacity(getLinearExpressionProtoBuilderFromLinearExpr(capacity, false));
1080 return ct;
1081 }
1082
1088 public Constraint addCumulative(IntervalVar[] intervals, LinearExpr[] demands, long capacity) {
1089 Constraint ct = new Constraint(modelBuilder);
1090 CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
1091 for (IntervalVar interval : intervals) {
1092 cumul.addIntervals(interval.getIndex());
1093 }
1094 for (LinearExpr d : demands) {
1095 cumul.addDemands(getLinearExpressionProtoBuilderFromLinearExpr(d, false));
1096 }
1097 cumul.getCapacityBuilder().setOffset(capacity);
1098 return ct;
1099 }
1100
1106 public Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, LinearExpr capacity) {
1107 Constraint ct = new Constraint(modelBuilder);
1108 CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
1109 for (IntervalVar interval : intervals) {
1110 cumul.addIntervals(interval.getIndex());
1111 }
1112 for (IntVar var : demands) {
1113 cumul.addDemandsBuilder().addVars(var.getIndex()).addCoeffs(1);
1114 }
1115 cumul.setCapacity(getLinearExpressionProtoBuilderFromLinearExpr(capacity, false));
1116 return ct;
1117 }
1118
1124 public Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, long capacity) {
1125 Constraint ct = new Constraint(modelBuilder);
1126 CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
1127 for (IntervalVar interval : intervals) {
1128 cumul.addIntervals(interval.getIndex());
1129 }
1130 for (IntVar var : demands) {
1131 cumul.addDemandsBuilder().addVars(var.getIndex()).addCoeffs(1);
1132 }
1133 cumul.getCapacityBuilder().setOffset(capacity);
1134 return ct;
1135 }
1136
1142 public Constraint addCumulative(IntervalVar[] intervals, long[] demands, LinearExpr capacity) {
1143 Constraint ct = new Constraint(modelBuilder);
1144 CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
1145 for (IntervalVar interval : intervals) {
1146 cumul.addIntervals(interval.getIndex());
1147 }
1148 for (long d : demands) {
1149 cumul.addDemandsBuilder().setOffset(d);
1150 }
1151 cumul.setCapacity(getLinearExpressionProtoBuilderFromLinearExpr(capacity, false));
1152 return ct;
1153 }
1154
1160 public Constraint addCumulative(IntervalVar[] intervals, int[] demands, LinearExpr capacity) {
1161 return addCumulative(intervals, toLongArray(demands), capacity);
1162 }
1163
1169 public Constraint addCumulative(IntervalVar[] intervals, long[] demands, long capacity) {
1170 Constraint ct = new Constraint(modelBuilder);
1171 CumulativeConstraintProto.Builder cumul = ct.getBuilder().getCumulativeBuilder();
1172 for (IntervalVar interval : intervals) {
1173 cumul.addIntervals(interval.getIndex());
1174 }
1175 for (long d : demands) {
1176 cumul.addDemandsBuilder().setOffset(d);
1177 }
1178 cumul.getCapacityBuilder().setOffset(capacity);
1179 return ct;
1180 }
1181
1187 public Constraint addCumulative(IntervalVar[] intervals, int[] demands, long capacity) {
1188 return addCumulative(intervals, toLongArray(demands), capacity);
1189 }
1190
1192 public void addHint(IntVar var, long value) {
1193 modelBuilder.getSolutionHintBuilder().addVars(var.getIndex());
1194 modelBuilder.getSolutionHintBuilder().addValues(value);
1195 }
1196
1198 public void clearHints() {
1199 modelBuilder.clearSolutionHint();
1200 }
1201
1203 public void addAssumption(Literal lit) {
1204 modelBuilder.addAssumptions(lit.getIndex());
1205 }
1206
1208 public void addAssumptions(Literal[] literals) {
1209 for (Literal lit : literals) {
1210 addAssumption(lit);
1211 }
1212 }
1213
1215 public void clearAssumptions() {
1216 modelBuilder.clearAssumptions();
1217 }
1218
1219 // Objective.
1220
1222 public void minimize(LinearExpr expr) {
1223 CpObjectiveProto.Builder obj = modelBuilder.getObjectiveBuilder();
1224 for (int i = 0; i < expr.numElements(); ++i) {
1225 obj.addVars(expr.getVariable(i).getIndex()).addCoeffs(expr.getCoefficient(i));
1226 }
1227 obj.setOffset(expr.getOffset());
1228 }
1229
1230 public void minimize(DoubleLinearExpr expr) {
1231 FloatObjectiveProto.Builder obj = modelBuilder.getFloatingPointObjectiveBuilder();
1232 for (int i = 0; i < expr.numElements(); ++i) {
1233 obj.addVars(expr.getVariable(i).getIndex()).addCoeffs(expr.getCoefficient(i));
1234 }
1235 obj.setOffset(expr.getOffset()).setMaximize(false);
1236 }
1237
1239 public void maximize(LinearExpr expr) {
1240 CpObjectiveProto.Builder obj = modelBuilder.getObjectiveBuilder();
1241 for (int i = 0; i < expr.numElements(); ++i) {
1242 obj.addVars(expr.getVariable(i).getIndex()).addCoeffs(-expr.getCoefficient(i));
1243 }
1244 obj.setOffset(-expr.getOffset());
1245 obj.setScalingFactor(-1.0);
1246 }
1247
1248 public void maximize(DoubleLinearExpr expr) {
1249 FloatObjectiveProto.Builder obj = modelBuilder.getFloatingPointObjectiveBuilder();
1250 for (int i = 0; i < expr.numElements(); ++i) {
1251 obj.addVars(expr.getVariable(i).getIndex()).addCoeffs(expr.getCoefficient(i));
1252 }
1253 obj.setOffset(expr.getOffset()).setMaximize(true);
1254 }
1255
1256 // DecisionStrategy
1257
1259 public void addDecisionStrategy(IntVar[] variables,
1262 DecisionStrategyProto.Builder ds = modelBuilder.addSearchStrategyBuilder();
1263 for (IntVar var : variables) {
1264 ds.addVariables(var.getIndex());
1265 }
1266 ds.setVariableSelectionStrategy(varStr).setDomainReductionStrategy(domStr);
1267 }
1268
1270 public String modelStats() {
1271 return CpSatHelper.modelStats(model());
1272 }
1273
1275 public String validate() {
1277 }
1278
1287 public Boolean exportToFile(String file) {
1288 return CpSatHelper.writeModelToFile(model(), file);
1289 }
1290
1291 // Helpers
1292
1293 long[] toLongArray(int[] values) {
1294 long[] result = new long[values.length];
1295 for (int i = 0; i < values.length; ++i) {
1296 result[i] = values[i];
1297 }
1298 return result;
1299 }
1300
1301 int indexFromConstant(long constant) {
1302 IntVar constVar = newConstant(constant);
1303 return constVar.getIndex();
1304 }
1305
1306 LinearExpressionProto.Builder getLinearExpressionProtoBuilderFromLinearExpr(
1307 LinearExpr expr, boolean negate) {
1308 LinearExpressionProto.Builder builder = LinearExpressionProto.newBuilder();
1309 final int numVariables = expr.numElements();
1310 final long mult = negate ? -1 : 1;
1311 for (int i = 0; i < numVariables; ++i) {
1312 builder.addVars(expr.getVariable(i).getIndex());
1313 builder.addCoeffs(expr.getCoefficient(i) * mult);
1314 }
1315 builder.setOffset(expr.getOffset() * mult);
1316 return builder;
1317 }
1318
1319 LinearExpressionProto.Builder getLinearExpressionProtoBuilderFromLong(long value) {
1320 LinearExpressionProto.Builder builder = LinearExpressionProto.newBuilder();
1321 builder.setOffset(value);
1322 return builder;
1323 }
1324
1325 // Getters.
1326
1328 return modelBuilder.build();
1329 }
1330
1331 public int negated(int index) {
1332 return -index - 1;
1333 }
1334
1337 return modelBuilder;
1338 }
1339
1340 private final CpModelProto.Builder modelBuilder;
1341 private final Map<Long, IntVar> constantMap;
1342}
ConstraintProto.Builder getBuilder()
Returns the constraint builder.
void onlyEnforceIf(Literal lit)
Adds a literal to the constraint.
Exception thrown when parallel arrays have mismatched lengths.
Definition: CpModel.java:53
MismatchedArrayLengths(String methodName, String array1Name, String array2Name)
Definition: CpModel.java:54
Exception thrown when an array has a wrong length.
Definition: CpModel.java:60
WrongLength(String methodName, String msg)
Definition: CpModel.java:61
Main modeling class.
Definition: CpModel.java:44
Constraint addAllowedAssignments(IntVar[] variables, int[][] tuplesList)
Adds.
Definition: CpModel.java:407
Constraint addCumulative(IntervalVar[] intervals, long[] demands, LinearExpr capacity)
Adds.
Definition: CpModel.java:1142
Constraint addReservoirConstraint(IntVar[] times, long[] levelChanges, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:558
Constraint addMultiplicationEquality(LinearExpr target, IntVar[] vars)
Adds.
Definition: CpModel.java:882
Constraint addCumulative(IntervalVar[] intervals, LinearExpr[] demands, LinearExpr capacity)
Adds.
Definition: CpModel.java:1069
Constraint addModuloEquality(LinearExpr target, LinearExpr var, LinearExpr mod)
Adds.
Definition: CpModel.java:860
IntervalVar newIntervalVar(LinearExpr start, LinearExpr size, LinearExpr end, String name)
Creates an interval variable from three affine expressions start, size, and end.
Definition: CpModel.java:919
IntVar newConstant(long value)
Creates a constant variable.
Definition: CpModel.java:94
Constraint addCumulative(IntervalVar[] intervals, long[] demands, long capacity)
Adds.
Definition: CpModel.java:1169
IntVar newBoolVar(String name)
Creates a Boolean variable with the given name.
Definition: CpModel.java:89
Constraint addModuloEquality(LinearExpr target, LinearExpr var, long mod)
Adds.
Definition: CpModel.java:871
Constraint addGreaterOrEqual(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:216
Constraint addForbiddenAssignments(IntVar[] variables, int[][] tuplesList)
Adds.
Definition: CpModel.java:450
void clearAssumptions()
Remove all assumptions from the model.
Definition: CpModel.java:1215
Constraint addGreaterOrEqual(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:221
Constraint addCumulative(IntervalVar[] intervals, LinearExpr[] demands, long capacity)
Adds.
Definition: CpModel.java:1088
Constraint addMultiplicationEquality(LinearExpr target, LinearExpr[] exprs)
Adds.
Definition: CpModel.java:893
Constraint addMinEquality(LinearExpr target, IntVar[] vars)
Adds.
Definition: CpModel.java:795
Constraint addAutomaton(IntVar[] transitionVariables, long startingState, long[] finalStates, long[][] transitions)
Adds an automaton constraint.
Definition: CpModel.java:488
void maximize(DoubleLinearExpr expr)
Definition: CpModel.java:1248
Boolean exportToFile(String file)
Write the model as a protocol buffer to 'file'.
Definition: CpModel.java:1287
Constraint addLessOrEqual(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:190
IntervalVar newOptionalFixedInterval(long start, long size, Literal isPresent, String name)
Creates an optional fixed interval from start and size, and an isPresent literal.
Definition: CpModel.java:1005
Constraint addLessThan(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:200
Constraint addElement(IntVar index, long[] values, IntVar target)
Adds the element constraint:
Definition: CpModel.java:310
Constraint addReservoirConstraint(IntVar[] times, int[] levelChanges, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:586
Literal falseLiteral()
Returns the false literal.
Definition: CpModel.java:109
Constraint addLessOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset)
Adds.
Definition: CpModel.java:210
IntervalVar newOptionalFixedSizeIntervalVar(LinearExpr start, long size, Literal isPresent, String name)
Creates an optional interval variable from an affine expression start, and a fixed size.
Definition: CpModel.java:995
void addAssumptions(Literal[] literals)
Adds multiple literals to the model as assumptions.
Definition: CpModel.java:1208
Constraint addCumulative(IntervalVar[] intervals, int[] demands, LinearExpr capacity)
Adds.
Definition: CpModel.java:1160
Constraint addEquality(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:180
Constraint addAllDifferent(LinearExpr[] expressions)
Adds.
Definition: CpModel.java:288
void minimize(LinearExpr expr)
Adds a minimization objective of a linear expression.
Definition: CpModel.java:1222
IntervalVar newFixedSizeIntervalVar(LinearExpr start, long size, String name)
Creates an interval variable from an affine expression start, and a fixed size.
Definition: CpModel.java:939
Constraint addReservoirConstraintWithActive(LinearExpr[] times, long[] levelChanges, IntVar[] actives, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:741
Constraint addDifferentWithOffset(LinearExpr left, LinearExpr right, long offset)
Adds.
Definition: CpModel.java:255
Constraint addReservoirConstraint(LinearExpr[] times, int[] levelChanges, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:643
Constraint addGreaterThan(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:226
void addAssumption(Literal lit)
Adds a literal to the model as assumption.
Definition: CpModel.java:1203
void addHint(IntVar var, long value)
Adds hinting to a variable.
Definition: CpModel.java:1192
IntervalVar newFixedInterval(long start, long size, String name)
Creates a fixed interval from its start and its size.
Definition: CpModel.java:948
Constraint addGreaterThan(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:231
Constraint addReservoirConstraintWithActive(LinearExpr[] times, int[] levelChanges, IntVar[] actives, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:780
Constraint addCircuit(int[] tails, int[] heads, Literal[] literals)
Adds.
Definition: CpModel.java:348
String modelStats()
Returns some statistics on model as a string.
Definition: CpModel.java:1270
Constraint addDivisionEquality(LinearExpr target, LinearExpr num, LinearExpr denom)
Adds.
Definition: CpModel.java:839
Constraint addMaxEquality(LinearExpr target, LinearExpr[] exprs)
Adds.
Definition: CpModel.java:828
Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, LinearExpr capacity)
Adds.
Definition: CpModel.java:1106
Constraint addEqualityWithOffset(LinearExpr left, LinearExpr right, long offset)
Adds.
Definition: CpModel.java:185
Constraint addElement(IntVar index, IntVar[] variables, IntVar target)
Adds the element constraint:
Definition: CpModel.java:298
Constraint addAllowedAssignments(IntVar[] variables, long[][] tuplesList)
Adds.
Definition: CpModel.java:383
Constraint addMinEquality(LinearExpr target, LinearExpr[] exprs)
Adds.
Definition: CpModel.java:806
Constraint addReservoirConstraintWithActive(IntVar[] times, long[] levelChanges, IntVar[] actives, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:672
Constraint addReservoirConstraintWithActive(IntVar[] times, int[] levelChanges, IntVar[] actives, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:711
void maximize(LinearExpr expr)
Adds a maximization objective of a linear expression.
Definition: CpModel.java:1239
Constraint addAllDifferent(IntVar[] variables)
Adds.
Definition: CpModel.java:271
Constraint addImplication(Literal a, Literal b)
Adds.
Definition: CpModel.java:146
Constraint addBoolXor(Literal[] literals)
Adds.
Definition: CpModel.java:136
Constraint addLessThan(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:205
void minimize(DoubleLinearExpr expr)
Definition: CpModel.java:1230
Constraint addCumulative(IntervalVar[] intervals, IntVar[] demands, long capacity)
Adds.
Definition: CpModel.java:1124
IntVar newIntVar(long lb, long ub, String name)
Creates an integer variable with domain [lb, ub].
Definition: CpModel.java:73
Constraint addAbsEquality(LinearExpr target, LinearExpr expr)
Adds.
Definition: CpModel.java:850
void addMapDomain(IntVar var, Literal[] booleans, long offset)
Adds.
Definition: CpModel.java:787
void addDecisionStrategy(IntVar[] variables, DecisionStrategyProto.VariableSelectionStrategy varStr, DecisionStrategyProto.DomainReductionStrategy domStr)
Adds.
Definition: CpModel.java:1259
Constraint addInverse(IntVar[] variables, IntVar[] inverseVariables)
Adds.
Definition: CpModel.java:519
Constraint addNoOverlap2D(IntervalVar[] xIntervals, IntervalVar[] yIntervals)
Adds.
Definition: CpModel.java:1042
Constraint addMaxEquality(LinearExpr target, IntVar[] vars)
Adds.
Definition: CpModel.java:817
IntervalVar newOptionalIntervalVar(LinearExpr start, LinearExpr size, LinearExpr end, Literal isPresent, String name)
Creates an optional interval variable from three affine expressions start, size, end,...
Definition: CpModel.java:972
Constraint addLinearConstraint(LinearExpr expr, long lb, long ub)
Adds.
Definition: CpModel.java:170
Constraint addNoOverlap(IntervalVar[] intervalVars)
Adds.
Definition: CpModel.java:1020
Literal trueLiteral()
Returns the true literal.
Definition: CpModel.java:104
Constraint addForbiddenAssignments(IntVar[] variables, long[][] tuplesList)
Adds.
Definition: CpModel.java:438
Constraint addDifferent(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:242
Constraint addElement(IntVar index, int[] values, IntVar target)
Adds the element constraint:
Definition: CpModel.java:322
Constraint addEquality(LinearExpr expr, long value)
Adds.
Definition: CpModel.java:175
void clearHints()
Remove all solution hints.
Definition: CpModel.java:1198
String validate()
Returns a non empty string explaining the issue if the model is invalid.
Definition: CpModel.java:1275
Constraint addGreaterOrEqualWithOffset(LinearExpr left, LinearExpr right, long offset)
Adds.
Definition: CpModel.java:236
Constraint addReservoirConstraint(LinearExpr[] times, long[] levelChanges, long minLevel, long maxLevel)
Adds.
Definition: CpModel.java:615
Constraint addCumulative(IntervalVar[] intervals, int[] demands, long capacity)
Adds.
Definition: CpModel.java:1187
Constraint addDifferent(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:249
Constraint addBoolOr(Literal[] literals)
Adds.
Definition: CpModel.java:116
IntVar newIntVarFromDomain(Domain domain, String name)
Creates an integer variable with given domain.
Definition: CpModel.java:84
Constraint addLinearExpressionInDomain(LinearExpr expr, Domain domain)
Adds.
Definition: CpModel.java:153
Constraint addBoolAnd(Literal[] literals)
Adds.
Definition: CpModel.java:126
Constraint addLessOrEqual(LinearExpr left, LinearExpr right)
Adds.
Definition: CpModel.java:195
CpModelProto.Builder getBuilder()
Returns the model builder.
Definition: CpModel.java:1336
static String validateModel(com.google.ortools.sat.CpModelProto model_proto)
static String modelStats(com.google.ortools.sat.CpModelProto model_proto)
static boolean writeModelToFile(com.google.ortools.sat.CpModelProto model_proto, String filename)
A linear expression interface that can be parsed.
int numElements()
Returns the number of elements in the interface.
double getCoefficient(int index)
Returns the ith coefficient.
double getOffset()
Returns the constant part of the expression.
IntVar getVariable(int index)
Returns the ith variable.
int getIndex()
Internal, returns the index of the variable in the underlying CpModelProto.
We call domain any subset of Int64 = [kint64min, kint64max].
static Domain fromFlatIntervals(long[] flat_intervals)
This method is available in Python, Java and .NET.
long[] flattenedIntervals()
This method returns the flattened list of interval bounds of the domain.
A linear expression interface that can be parsed.
Definition: LinearExpr.java:20
long getCoefficient(int index)
Returns the ith coefficient.
int numElements()
Returns the number of elements in the interface.
long getOffset()
Returns the constant part of the expression.
IntVar getVariable(int index)
Returns the ith variable.
Interface to describe a boolean variable or its negation.
Definition: Literal.java:17
Literal not()
Returns the Boolean negation of the current literal.