uniformize name of linear constraints in CP-SAT Python/Java/C#
This commit is contained in:
@@ -70,7 +70,7 @@ def find_combinations(durations, load_min, load_max, commute_time):
|
||||
]
|
||||
terms = [(variables[i], duration + commute_time)
|
||||
for i, duration in enumerate(durations)]
|
||||
model.AddLinearConstraintWithBounds(terms, [load_min, load_max])
|
||||
model.AddLinearConstraint(terms, load_min, load_max)
|
||||
|
||||
solver = cp_model.CpSolver()
|
||||
solution_collector = AllSolutionCollector(variables)
|
||||
|
||||
@@ -163,7 +163,7 @@ public class CpModel {
|
||||
|
||||
// Boolean Constraints.
|
||||
|
||||
/** Adds {@code Or(literals) == true}. */
|
||||
/** Add {@code Or(literals) == true}. */
|
||||
public Constraint addBoolOr(Literal[] literals) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
BoolArgumentProto.Builder boolOr = ct.getBuilder().getBoolOrBuilder();
|
||||
@@ -173,7 +173,7 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds {@code And(literals) == true}. */
|
||||
/** Add {@code And(literals) == true}. */
|
||||
public Constraint addBoolAnd(Literal[] literals) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
BoolArgumentProto.Builder boolOr = ct.getBuilder().getBoolAndBuilder();
|
||||
@@ -183,7 +183,7 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds {@code XOr(literals) == true}. */
|
||||
/** Add {@code XOr(literals) == true}. */
|
||||
public Constraint addBoolXor(Literal[] literals) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
BoolArgumentProto.Builder boolOr = ct.getBuilder().getBoolXorBuilder();
|
||||
@@ -193,15 +193,15 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds {@code a => b}. */
|
||||
/** Add {@code a => b}. */
|
||||
public Constraint addImplication(Literal a, Literal b) {
|
||||
return addBoolOr(new Literal[] {a.not(), b});
|
||||
}
|
||||
|
||||
// Linear constraints.
|
||||
|
||||
/** Adds {@code lb <= sum(vars) <= ub}. */
|
||||
public Constraint addLinearSum(IntVar[] vars, long lb, long ub) {
|
||||
/** Add {@code lb <= sum(vars) <= ub}. */
|
||||
public Constraint addSumConstraint(IntVar[] vars, long lb, long ub) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
LinearConstraintProto.Builder lin = ct.getBuilder().getLinearBuilder();
|
||||
for (IntVar var : vars) {
|
||||
@@ -214,37 +214,39 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code sum(vars) in bounds}, where bounds is a flattened domain similar to the one for
|
||||
* enumerated integer variables.
|
||||
* Add {@code sum(vars) in domain}, where domain is a flattened
|
||||
* list of intervals similar to the one for enumerated integer
|
||||
* variables.
|
||||
*/
|
||||
public Constraint addLinearSumWithBounds(IntVar[] vars, long[] bounds) {
|
||||
public Constraint addSumInDomain(IntVar[] vars, long[] domain) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
LinearConstraintProto.Builder lin = ct.getBuilder().getLinearBuilder();
|
||||
for (IntVar var : vars) {
|
||||
lin.addVars(var.getIndex());
|
||||
lin.addCoeffs(1);
|
||||
}
|
||||
for (long b : bounds) {
|
||||
for (long b : domain) {
|
||||
lin.addDomain(b);
|
||||
}
|
||||
return ct;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code sum(vars) in bounds}, where bounds is a flattened domain similar to the one for
|
||||
* enumerated integer variables.
|
||||
* Add {@code sum(vars) in domain}, where domain is a flattened
|
||||
* list of intervals similar to the one for enumerated integer
|
||||
* variables.
|
||||
*/
|
||||
public Constraint addLinearSumWithBounds(IntVar[] vars, int[] bounds) {
|
||||
return addLinearSumWithBounds(vars, toLongArray(bounds));
|
||||
public Constraint addSumInDomain(IntVar[] vars, int[] domain) {
|
||||
return addSumInDomain(vars, toLongArray(domain));
|
||||
}
|
||||
|
||||
/** Adds {@code sum(vars) == value}. */
|
||||
public Constraint addLinearSumEqual(IntVar[] vars, long value) {
|
||||
return addLinearSum(vars, value, value);
|
||||
/** Add {@code sum(vars) == value}. */
|
||||
public Constraint addSumEqual(IntVar[] vars, long value) {
|
||||
return addSumConstraint(vars, value, value);
|
||||
}
|
||||
|
||||
/** Adds {@code sum(vars) == target}. */
|
||||
public Constraint addLinearSumEqual(IntVar[] vars, IntVar target) {
|
||||
/** Add {@code sum(vars) == target}. */
|
||||
public Constraint addSumEqual(IntVar[] vars, IntVar target) {
|
||||
int size = vars.length;
|
||||
IntVar[] newVars = new IntVar[size + 1];
|
||||
long[] coeffs = new long[size + 1];
|
||||
@@ -254,11 +256,11 @@ public class CpModel {
|
||||
}
|
||||
newVars[size] = target;
|
||||
coeffs[size] = -1;
|
||||
return addScalProd(newVars, coeffs, 0, 0);
|
||||
return addLinearConstraint(newVars, coeffs, 0, 0);
|
||||
}
|
||||
|
||||
/** Adds {@code lb <= sum(vars[i] * coeffs[i]) <= ub}. */
|
||||
public Constraint addScalProd(IntVar[] vars, long[] coeffs, long lb, long ub) {
|
||||
/** Add {@code lb <= sum(vars[i] * coeffs[i]) <= ub}. */
|
||||
public Constraint addLinearConstraint(IntVar[] vars, long[] coeffs, long lb, long ub) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
LinearConstraintProto.Builder lin = ct.getBuilder().getLinearBuilder();
|
||||
for (IntVar var : vars) {
|
||||
@@ -272,16 +274,17 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds {@code lb <= sum(vars[i] * coeffs[i]) <= ub}. */
|
||||
public Constraint addScalProd(IntVar[] vars, int[] coeffs, long lb, long ub) {
|
||||
return addScalProd(vars, toLongArray(coeffs), lb, ub);
|
||||
/** Add {@code lb <= sum(vars[i] * coeffs[i]) <= ub}. */
|
||||
public Constraint addLinearConstraint(IntVar[] vars, int[] coeffs, long lb, long ub) {
|
||||
return addLinearConstraint(vars, toLongArray(coeffs), lb, ub);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code sum(vars[i] * coeffs[i]) in bounds}, where bounds is a flattened domain similar to
|
||||
* the one for enumerated integer variables.
|
||||
* Add {@code sum(vars[i] * coeffs[i]) in domain}, where domain is
|
||||
* a flattened list of intervals similar to the one for enumerated
|
||||
* integer variables.
|
||||
*/
|
||||
public Constraint addScalProdWithBounds(IntVar[] vars, long[] coeffs, long[] bounds) {
|
||||
public Constraint addLinearExpressionInDomain(IntVar[] vars, long[] coeffs, long[] domain) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
LinearConstraintProto.Builder lin = ct.getBuilder().getLinearBuilder();
|
||||
for (IntVar var : vars) {
|
||||
@@ -290,24 +293,24 @@ public class CpModel {
|
||||
for (long c : coeffs) {
|
||||
lin.addCoeffs(c);
|
||||
}
|
||||
for (long b : bounds) {
|
||||
for (long b : domain) {
|
||||
lin.addDomain(b);
|
||||
}
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds {@code sum(vars[i] * coeffs[i]) == value}. */
|
||||
public Constraint addScalProdEqual(IntVar[] vars, long[] coeffs, long value) {
|
||||
return addScalProd(vars, coeffs, value, value);
|
||||
/** Add {@code sum(vars[i] * coeffs[i]) == value}. */
|
||||
public Constraint addLinearExpressionEqual(IntVar[] vars, long[] coeffs, long value) {
|
||||
return addLinearConstraint(vars, coeffs, value, value);
|
||||
}
|
||||
|
||||
/** Adds {@code sum(vars[i] * coeffs[i]) == value}. */
|
||||
public Constraint addScalProdEqual(IntVar[] vars, int[] coeffs, long value) {
|
||||
return addScalProdEqual(vars, toLongArray(coeffs), value);
|
||||
/** Add {@code sum(vars[i] * coeffs[i]) == value}. */
|
||||
public Constraint addLinearExpressionEqual(IntVar[] vars, int[] coeffs, long value) {
|
||||
return addLinearConstraint(vars, toLongArray(coeffs), value, value);
|
||||
}
|
||||
|
||||
/** Adds {@code sum(vars[i] * coeffs[i]) == target}. */
|
||||
public Constraint addScalProdEqual(IntVar[] vars, long[] coeffs, IntVar target) {
|
||||
/** Add {@code sum(vars[i] * coeffs[i]) == target}. */
|
||||
public Constraint addLinearExpressionEqual(IntVar[] vars, long[] coeffs, IntVar target) {
|
||||
int size = vars.length;
|
||||
IntVar[] newVars = new IntVar[size + 1];
|
||||
long[] newCoeffs = new long[size + 1];
|
||||
@@ -317,15 +320,15 @@ public class CpModel {
|
||||
}
|
||||
newVars[size] = target;
|
||||
newCoeffs[size] = -1;
|
||||
return addScalProd(newVars, newCoeffs, 0, 0);
|
||||
return addLinearConstraint(newVars, newCoeffs, 0, 0);
|
||||
}
|
||||
|
||||
/** Adds {@code sum(vars[i] * coeffs[i]) == target}. */
|
||||
public Constraint addScalProdEqual(IntVar[] vars, int[] coeffs, IntVar target) {
|
||||
return addScalProdEqual(vars, toLongArray(coeffs), target);
|
||||
/** Add {@code sum(vars[i] * coeffs[i]) == target}. */
|
||||
public Constraint addLinearExpressionEqual(IntVar[] vars, int[] coeffs, IntVar target) {
|
||||
return addLinearExpressionEqual(vars, toLongArray(coeffs), target);
|
||||
}
|
||||
|
||||
/** Adds {@code var <= value}. */
|
||||
/** Add {@code var <= value}. */
|
||||
public Constraint addLessOrEqual(IntVar var, long value) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
LinearConstraintProto.Builder lin = ct.getBuilder().getLinearBuilder();
|
||||
@@ -336,12 +339,12 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds {@code before <= after}. */
|
||||
/** Add {@code before <= after}. */
|
||||
public Constraint addLessOrEqual(IntVar before, IntVar after) {
|
||||
return addLessOrEqualWithOffset(before, after, 0);
|
||||
}
|
||||
|
||||
/** Adds {@code var >= value}. */
|
||||
/** Add {@code var >= value}. */
|
||||
public Constraint addGreaterOrEqual(IntVar var, long value) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
LinearConstraintProto.Builder lin = ct.getBuilder().getLinearBuilder();
|
||||
@@ -352,7 +355,7 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds {@code var == value}. */
|
||||
/** Add {@code var == value}. */
|
||||
public Constraint addEquality(IntVar var, long value) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
LinearConstraintProto.Builder lin = ct.getBuilder().getLinearBuilder();
|
||||
@@ -363,12 +366,12 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds {@code a == b}. */
|
||||
/** Add {@code a == b}. */
|
||||
public Constraint addEquality(IntVar a, IntVar b) {
|
||||
return addEqualityWithOffset(a, b, 0);
|
||||
}
|
||||
|
||||
/** Adds {@code a + offset == b}. */
|
||||
/** Add {@code a + offset == b}. */
|
||||
public Constraint addEqualityWithOffset(IntVar a, IntVar b, long offset) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
LinearConstraintProto.Builder lin = ct.getBuilder().getLinearBuilder();
|
||||
@@ -381,7 +384,7 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds {@code var != value}. */
|
||||
/** Add {@code var != value}. */
|
||||
public Constraint addDifferent(IntVar var, long value) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
LinearConstraintProto.Builder lin = ct.getBuilder().getLinearBuilder();
|
||||
@@ -398,12 +401,12 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds {@code a != b}. */
|
||||
/** Add {@code a != b}. */
|
||||
public Constraint addDifferent(IntVar a, IntVar b) {
|
||||
return addDifferentWithOffset(a, b, 0);
|
||||
}
|
||||
|
||||
/** Adds {@code a + offset != b} */
|
||||
/** Add {@code a + offset != b} */
|
||||
public Constraint addDifferentWithOffset(IntVar a, IntVar b, long offset) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
LinearConstraintProto.Builder lin = ct.getBuilder().getLinearBuilder();
|
||||
@@ -422,7 +425,7 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds {@code before + offset <= after}. */
|
||||
/** Add {@code before + offset <= after}. */
|
||||
public Constraint addLessOrEqualWithOffset(IntVar before, IntVar after, long offset) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
LinearConstraintProto.Builder lin = ct.getBuilder().getLinearBuilder();
|
||||
@@ -438,7 +441,7 @@ public class CpModel {
|
||||
// Integer constraints.
|
||||
|
||||
/**
|
||||
* Adds {@code AllDifferent(variables)}.
|
||||
* Add {@code AllDifferent(variables)}.
|
||||
*
|
||||
* <p>This constraint forces all variables to have different values.
|
||||
*
|
||||
@@ -454,7 +457,7 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds the element constraint: {@code variables[index] == target}. */
|
||||
/** Add the element constraint: {@code variables[index] == target}. */
|
||||
public Constraint addElement(IntVar index, IntVar[] variables, IntVar target) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
ElementConstraintProto.Builder element = ct.getBuilder().getElementBuilder();
|
||||
@@ -466,7 +469,7 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds the element constraint: {@code values[index] == target}. */
|
||||
/** Add the element constraint: {@code values[index] == target}. */
|
||||
public Constraint addElement(IntVar index, long[] values, IntVar target) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
ElementConstraintProto.Builder element = ct.getBuilder().getElementBuilder();
|
||||
@@ -478,7 +481,7 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds the element constraint: {@code values[index] == target}. */
|
||||
/** Add the element constraint: {@code values[index] == target}. */
|
||||
public Constraint addElement(IntVar index, int[] values, IntVar target) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
ElementConstraintProto.Builder element = ct.getBuilder().getElementBuilder();
|
||||
@@ -491,9 +494,9 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code Circuit(tails, heads, literals)}.
|
||||
* Add {@code Circuit(tails, heads, literals)}.
|
||||
*
|
||||
* <p>Adds a circuit constraint from a sparse list of arcs that encode the graph.
|
||||
* <p>Add a circuit constraint from a sparse list of arcs that encode the graph.
|
||||
*
|
||||
* <p>A circuit is a unique Hamiltonian path in a subgraph of the total graph. In case a node 'i'
|
||||
* is not in the path, then there must be a loop arc {@code 'i -> i'} associated with a true
|
||||
@@ -529,7 +532,7 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code AllowedAssignments(variables, tuplesList)}.
|
||||
* Add {@code AllowedAssignments(variables, tuplesList)}.
|
||||
*
|
||||
* <p>An AllowedAssignments constraint is a constraint on an array of variables that forces, when
|
||||
* all variables are fixed to a single value, that the corresponding list of values is equal to
|
||||
@@ -562,7 +565,7 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code AllowedAssignments(variables, tuplesList)}.
|
||||
* Add {@code AllowedAssignments(variables, tuplesList)}.
|
||||
*
|
||||
* @see #addAllowedAssignments(IntVar[], long[][]) addAllowedAssignments
|
||||
*/
|
||||
@@ -587,7 +590,7 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code ForbiddenAssignments(variables, tuplesList)}.
|
||||
* Add {@code ForbiddenAssignments(variables, tuplesList)}.
|
||||
*
|
||||
* <p>A ForbiddenAssignments constraint is a constraint on an array of variables where the list of
|
||||
* impossible combinations is provided in the tuples list.
|
||||
@@ -607,7 +610,7 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code ForbiddenAssignments(variables, tuplesList)}.
|
||||
* Add {@code ForbiddenAssignments(variables, tuplesList)}.
|
||||
*
|
||||
* @see #addForbiddenAssignments(IntVar[], long[][]) addForbiddenAssignments
|
||||
*/
|
||||
@@ -620,7 +623,7 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an automaton constraint.
|
||||
* Add an automaton constraint.
|
||||
*
|
||||
* <p>An automaton constraint takes a list of variables (of size n), an initial state, a set of
|
||||
* final states, and a set of transitions. A transition is a triplet ('tail', 'transition',
|
||||
@@ -673,7 +676,7 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code Inverse(variables, inverseVariables)}.
|
||||
* Add {@code Inverse(variables, inverseVariables)}.
|
||||
*
|
||||
* <p>An inverse constraint enforces that if 'variables[i]' is assigned a value 'j', then
|
||||
* inverseVariables[j] is assigned a value 'i'. And vice versa.
|
||||
@@ -700,7 +703,7 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code Reservoir(times, demands, minLevel, maxLevel)}.
|
||||
* Add {@code Reservoir(times, demands, minLevel, maxLevel)}.
|
||||
*
|
||||
* <p>Maintains a reservoir level within bounds. The water level starts at 0, and at any non
|
||||
* negative time , it must be between minLevel and maxLevel. Furthermore, this constraints expect
|
||||
@@ -741,7 +744,7 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code Reservoir(times, demands, minLevel, maxLevel)}.
|
||||
* Add {@code Reservoir(times, demands, minLevel, maxLevel)}.
|
||||
*
|
||||
* @see #addReservoirConstraint(IntVar[], long[], long, long) Reservoir
|
||||
*/
|
||||
@@ -751,7 +754,7 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code Reservoir(times, demands, actives, minLevel, maxLevel)}.
|
||||
* Add {@code Reservoir(times, demands, actives, minLevel, maxLevel)}.
|
||||
*
|
||||
* <p>Maintains a reservoir level within bounds. The water level starts at 0, and at any non
|
||||
* negative time , it must be between minLevel and maxLevel. Furthermore, this constraints expect
|
||||
@@ -801,7 +804,7 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code Reservoir(times, demands, actives, minLevel, maxLevel)}.
|
||||
* Add {@code Reservoir(times, demands, actives, minLevel, maxLevel)}.
|
||||
*
|
||||
* @see #addReservoirConstraintWithActive(IntVar[], long[], actives, long, long) Reservoir
|
||||
*/
|
||||
@@ -811,7 +814,7 @@ public class CpModel {
|
||||
times, toLongArray(demands), actives, minLevel, maxLevel);
|
||||
}
|
||||
|
||||
/** Adds {@code var == i + offset <=> booleans[i] == true for all i in [0, booleans.length)}. */
|
||||
/** Add {@code var == i + offset <=> booleans[i] == true for all i in [0, booleans.length)}. */
|
||||
public void addMapDomain(IntVar var, Literal[] booleans, long offset) {
|
||||
for (int i = 0; i < booleans.length; ++i) {
|
||||
addEquality(var, offset + i).onlyEnforceIf(booleans[i]);
|
||||
@@ -819,7 +822,7 @@ public class CpModel {
|
||||
}
|
||||
}
|
||||
|
||||
/** Adds {@code target == Min(vars)}. */
|
||||
/** Add {@code target == Min(vars)}. */
|
||||
public Constraint addMinEquality(IntVar target, IntVar[] vars) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
IntegerArgumentProto.Builder intMin = ct.getBuilder().getIntMinBuilder();
|
||||
@@ -830,7 +833,7 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds {@code target == Max(vars)}. */
|
||||
/** Add {@code target == Max(vars)}. */
|
||||
public Constraint addMaxEquality(IntVar target, IntVar[] vars) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
IntegerArgumentProto.Builder intMax = ct.getBuilder().getIntMaxBuilder();
|
||||
@@ -841,7 +844,7 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds {@code target == num / denom}, rounded towards 0. */
|
||||
/** Add {@code target == num / denom}, rounded towards 0. */
|
||||
public Constraint addDivisionEquality(IntVar target, IntVar num, IntVar denom) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
IntegerArgumentProto.Builder intDiv = ct.getBuilder().getIntDivBuilder();
|
||||
@@ -851,7 +854,7 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds {@code target == Abs(var)}. */
|
||||
/** Add {@code target == Abs(var)}. */
|
||||
public Constraint addAbsEquality(IntVar target, IntVar var) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
IntegerArgumentProto.Builder intMax = ct.getBuilder().getIntMaxBuilder();
|
||||
@@ -861,7 +864,7 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds {@code target == var % mod}. */
|
||||
/** Add {@code target == var % mod}. */
|
||||
public Constraint addModuloEquality(IntVar target, IntVar var, IntVar mod) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
IntegerArgumentProto.Builder intMod = ct.getBuilder().getIntModBuilder();
|
||||
@@ -871,7 +874,7 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds {@code target == var % mod}. */
|
||||
/** Add {@code target == var % mod}. */
|
||||
public Constraint addModuloEquality(IntVar target, IntVar var, long mod) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
IntegerArgumentProto.Builder intMod = ct.getBuilder().getIntModBuilder();
|
||||
@@ -881,7 +884,7 @@ public class CpModel {
|
||||
return ct;
|
||||
}
|
||||
|
||||
/** Adds {@code target == Product(vars)}. */
|
||||
/** Add {@code target == Product(vars)}. */
|
||||
public Constraint addProductEquality(IntVar target, IntVar[] vars) {
|
||||
Constraint ct = new Constraint(modelBuilder);
|
||||
IntegerArgumentProto.Builder intProd = ct.getBuilder().getIntProdBuilder();
|
||||
@@ -1012,7 +1015,7 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code NoOverlap(intervalVars)}.
|
||||
* Add {@code NoOverlap(intervalVars)}.
|
||||
*
|
||||
* <p>A NoOverlap constraint ensures that all present intervals do not overlap in time.
|
||||
*
|
||||
@@ -1029,7 +1032,7 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code NoOverlap2D(xIntervals, yIntervals)}.
|
||||
* Add {@code NoOverlap2D(xIntervals, yIntervals)}.
|
||||
*
|
||||
* <p>A NoOverlap2D constraint ensures that all present rectangles do not overlap on a plan. Each
|
||||
* rectangle is aligned with the X and Y axis, and is defined by two intervals which represent its
|
||||
@@ -1052,7 +1055,7 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code Cumulative(intervals, demands, capacity)}.
|
||||
* Add {@code Cumulative(intervals, demands, capacity)}.
|
||||
*
|
||||
* <p>This constraint enforces that:
|
||||
*
|
||||
@@ -1080,7 +1083,7 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code Cumulative(intervals, demands, capacity)} with fixed demands.
|
||||
* Add {@code Cumulative(intervals, demands, capacity)} with fixed demands.
|
||||
*
|
||||
* @see #addCumulative(IntervalVar[], IntVar[], IntVar) AddCumulative
|
||||
*/
|
||||
@@ -1098,7 +1101,7 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code Cumulative(intervals, demands, capacity)} with fixed demands.
|
||||
* Add {@code Cumulative(intervals, demands, capacity)} with fixed demands.
|
||||
*
|
||||
* @see #addCumulative(IntervalVar[], IntVar[], IntVar) AddCumulative
|
||||
*/
|
||||
@@ -1107,7 +1110,7 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code Cumulative(intervals, demands, capacity)} with fixed capacity.
|
||||
* Add {@code Cumulative(intervals, demands, capacity)} with fixed capacity.
|
||||
*
|
||||
* @see #addCumulative(IntervalVar[], IntVar[], IntVar) AddCumulative
|
||||
*/
|
||||
@@ -1125,7 +1128,7 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code Cumulative(intervals, demands, capacity)} with fixed demands and fixed capacity.
|
||||
* Add {@code Cumulative(intervals, demands, capacity)} with fixed demands and fixed capacity.
|
||||
*
|
||||
* @see #addCumulative(IntervalVar[], IntVar[], IntVar) AddCumulative
|
||||
*/
|
||||
@@ -1143,7 +1146,7 @@ public class CpModel {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds {@code Cumulative(intervals, demands, capacity)} with fixed demands and fixed capacity.
|
||||
* Add {@code Cumulative(intervals, demands, capacity)} with fixed demands and fixed capacity.
|
||||
*
|
||||
* @see #addCumulative(IntervalVar[], IntVar[], IntVar) AddCumulative
|
||||
*/
|
||||
@@ -1153,14 +1156,14 @@ public class CpModel {
|
||||
|
||||
// Objective.
|
||||
|
||||
/** Adds a minimization objective of a single variable. */
|
||||
/** Add a minimization objective of a single variable. */
|
||||
public void minimize(IntVar var) {
|
||||
CpObjectiveProto.Builder obj = modelBuilder.getObjectiveBuilder();
|
||||
obj.addVars(var.getIndex());
|
||||
obj.addCoeffs(1);
|
||||
}
|
||||
|
||||
/** Adds a minimization objective of a sum of variables. */
|
||||
/** Add a minimization objective of a sum of variables. */
|
||||
public void minimizeSum(IntVar[] vars) {
|
||||
CpObjectiveProto.Builder obj = modelBuilder.getObjectiveBuilder();
|
||||
for (IntVar var : vars) {
|
||||
@@ -1169,8 +1172,8 @@ public class CpModel {
|
||||
}
|
||||
}
|
||||
|
||||
/** Adds a minimization objective of a scalar product of variables. */
|
||||
public void minimizeScalProd(IntVar[] vars, long[] coeffs) {
|
||||
/** Add a minimization objective of a scalar product of variables. */
|
||||
public void minimizeLinearExpression(IntVar[] vars, long[] coeffs) {
|
||||
CpObjectiveProto.Builder obj = modelBuilder.getObjectiveBuilder();
|
||||
for (IntVar var : vars) {
|
||||
obj.addVars(var.getIndex());
|
||||
@@ -1180,12 +1183,12 @@ public class CpModel {
|
||||
}
|
||||
}
|
||||
|
||||
/** Adds a minimization objective of a scalar product of variables. */
|
||||
public void minimizeScalProd(IntVar[] vars, int[] coeffs) {
|
||||
minimizeScalProd(vars, toLongArray(coeffs));
|
||||
/** Add a minimization objective of a scalar product of variables. */
|
||||
public void minimizeLinearExpression(IntVar[] vars, int[] coeffs) {
|
||||
minimizeLinearExpression(vars, toLongArray(coeffs));
|
||||
}
|
||||
|
||||
/** Adds a maximization objective of a single variable. */
|
||||
/** Add a maximization objective of a single variable. */
|
||||
public void maximize(IntVar var) {
|
||||
CpObjectiveProto.Builder obj = modelBuilder.getObjectiveBuilder();
|
||||
obj.addVars(negated(var.getIndex()));
|
||||
@@ -1193,7 +1196,7 @@ public class CpModel {
|
||||
obj.setScalingFactor(-1.0);
|
||||
}
|
||||
|
||||
/** Adds a maximization objective of a sum of variables. */
|
||||
/** Add a maximization objective of a sum of variables. */
|
||||
public void maximizeSum(IntVar[] vars) {
|
||||
CpObjectiveProto.Builder obj = modelBuilder.getObjectiveBuilder();
|
||||
for (IntVar var : vars) {
|
||||
@@ -1203,8 +1206,8 @@ public class CpModel {
|
||||
obj.setScalingFactor(-1.0);
|
||||
}
|
||||
|
||||
/** Adds a maximization objective of a scalar product of variables. */
|
||||
public void maximizeScalProd(IntVar[] vars, long[] coeffs) {
|
||||
/** Add a maximization objective of a scalar product of variables. */
|
||||
public void maximizeLinearExpression(IntVar[] vars, long[] coeffs) {
|
||||
CpObjectiveProto.Builder obj = modelBuilder.getObjectiveBuilder();
|
||||
for (IntVar var : vars) {
|
||||
obj.addVars(negated(var.getIndex()));
|
||||
@@ -1215,14 +1218,14 @@ public class CpModel {
|
||||
obj.setScalingFactor(-1.0);
|
||||
}
|
||||
|
||||
/** Adds a maximization objective of a scalar product of variables. */
|
||||
public void maximizeScalProd(IntVar[] vars, int[] coeffs) {
|
||||
maximizeScalProd(vars, toLongArray(coeffs));
|
||||
/** Add a maximization objective of a scalar product of variables. */
|
||||
public void maximizeLinearExpression(IntVar[] vars, int[] coeffs) {
|
||||
maximizeLinearExpression(vars, toLongArray(coeffs));
|
||||
}
|
||||
|
||||
// DecisionStrategy
|
||||
|
||||
/** Adds {@code DecisionStrategy(variables, varStr, domStr)}. */
|
||||
/** Add {@code DecisionStrategy(variables, varStr, domStr)}. */
|
||||
public void addDecisionStrategy(IntVar[] variables,
|
||||
DecisionStrategyProto.VariableSelectionStrategy varStr,
|
||||
DecisionStrategyProto.DomainReductionStrategy domStr) {
|
||||
@@ -1234,12 +1237,12 @@ public class CpModel {
|
||||
ds.setDomainReductionStrategy(domStr);
|
||||
}
|
||||
|
||||
/** Returns some statistics on model as a string. */
|
||||
/** Return some statistics on model as a string. */
|
||||
public String modelStats() {
|
||||
return SatHelper.modelStats(model());
|
||||
}
|
||||
|
||||
/** Returns a non empty string explaining the issue if the model is invalid. */
|
||||
/** Return a non empty string explaining the issue if the model is invalid. */
|
||||
public String validate() {
|
||||
return SatHelper.validateModel(model());
|
||||
}
|
||||
@@ -1272,7 +1275,7 @@ public class CpModel {
|
||||
return -index - 1;
|
||||
}
|
||||
|
||||
/** Returns the model builder. */
|
||||
/** Return the model builder. */
|
||||
public CpModelProto.Builder getBuilder() {
|
||||
return modelBuilder;
|
||||
}
|
||||
|
||||
@@ -95,6 +95,40 @@ public class CpModel
|
||||
return new IntVar(model_, bounds, name);
|
||||
}
|
||||
|
||||
public Constraint AddSumConstraint(IEnumerable<IntVar> vars, long lb,
|
||||
long ub)
|
||||
{
|
||||
Constraint ct = new Constraint(model_);
|
||||
LinearConstraintProto lin = new LinearConstraintProto();
|
||||
foreach (IntVar var in vars)
|
||||
{
|
||||
lin.Vars.Add(var.Index);
|
||||
lin.Coeffs.Add(1L);
|
||||
}
|
||||
lin.Domain.Add(lb);
|
||||
lin.Domain.Add(ub);
|
||||
ct.Proto.Linear = lin;
|
||||
return ct;
|
||||
}
|
||||
|
||||
public Constraint AddSumInDomain(
|
||||
IEnumerable<IntVar> variables, IEnumerable<long> bounds)
|
||||
{
|
||||
Constraint ct = new Constraint(model_);
|
||||
LinearConstraintProto lin = new LinearConstraintProto();
|
||||
foreach (IntVar var in variables)
|
||||
{
|
||||
lin.Vars.Add(var.Index);
|
||||
lin.Coeffs.Add(1);
|
||||
}
|
||||
foreach (long b in bounds)
|
||||
{
|
||||
lin.Domain.Add(b);
|
||||
}
|
||||
ct.Proto.Linear = lin;
|
||||
return ct;
|
||||
}
|
||||
|
||||
public Constraint AddLinearConstraint(IEnumerable<Tuple<IntVar, long>> terms,
|
||||
long lb, long ub)
|
||||
{
|
||||
@@ -151,25 +185,7 @@ public class CpModel
|
||||
return ct;
|
||||
}
|
||||
|
||||
public Constraint AddLinearSumWithBounds(
|
||||
IEnumerable<IntVar> variables, IEnumerable<long> bounds)
|
||||
{
|
||||
Constraint ct = new Constraint(model_);
|
||||
LinearConstraintProto lin = new LinearConstraintProto();
|
||||
foreach (IntVar var in variables)
|
||||
{
|
||||
lin.Vars.Add(var.Index);
|
||||
lin.Coeffs.Add(1);
|
||||
}
|
||||
foreach (long b in bounds)
|
||||
{
|
||||
lin.Domain.Add(b);
|
||||
}
|
||||
ct.Proto.Linear = lin;
|
||||
return ct;
|
||||
}
|
||||
|
||||
public Constraint AddLinearConstraintWithBounds(
|
||||
public Constraint AddLinearExpressionInDomain(
|
||||
IEnumerable<Tuple<IntVar, long>> terms, IEnumerable<long> bounds)
|
||||
{
|
||||
Constraint ct = new Constraint(model_);
|
||||
@@ -187,9 +203,9 @@ public class CpModel
|
||||
return ct;
|
||||
}
|
||||
|
||||
public Constraint AddLinearConstraintWithBounds(IEnumerable<IntVar> vars,
|
||||
IEnumerable<long> coeffs,
|
||||
IEnumerable<long> bounds)
|
||||
public Constraint AddLinearExpressionInDomain(IEnumerable<IntVar> vars,
|
||||
IEnumerable<long> coeffs,
|
||||
IEnumerable<long> bounds)
|
||||
{
|
||||
Constraint ct = new Constraint(model_);
|
||||
LinearConstraintProto lin = new LinearConstraintProto();
|
||||
@@ -209,9 +225,9 @@ public class CpModel
|
||||
return ct;
|
||||
}
|
||||
|
||||
public Constraint AddLinearConstraintWithBounds(IEnumerable<IntVar> vars,
|
||||
IEnumerable<int> coeffs,
|
||||
IEnumerable<long> bounds)
|
||||
public Constraint AddLinearExpressionInDomain(IEnumerable<IntVar> vars,
|
||||
IEnumerable<int> coeffs,
|
||||
IEnumerable<long> bounds)
|
||||
{
|
||||
Constraint ct = new Constraint(model_);
|
||||
LinearConstraintProto lin = new LinearConstraintProto();
|
||||
@@ -231,22 +247,6 @@ public class CpModel
|
||||
return ct;
|
||||
}
|
||||
|
||||
public Constraint AddSumConstraint(IEnumerable<IntVar> vars, long lb,
|
||||
long ub)
|
||||
{
|
||||
Constraint ct = new Constraint(model_);
|
||||
LinearConstraintProto lin = new LinearConstraintProto();
|
||||
foreach (IntVar var in vars)
|
||||
{
|
||||
lin.Vars.Add(var.Index);
|
||||
lin.Coeffs.Add(1L);
|
||||
}
|
||||
lin.Domain.Add(lb);
|
||||
lin.Domain.Add(ub);
|
||||
ct.Proto.Linear = lin;
|
||||
return ct;
|
||||
}
|
||||
|
||||
public Constraint Add(BoundIntegerExpression lin)
|
||||
{
|
||||
switch (lin.CtType)
|
||||
|
||||
@@ -582,7 +582,7 @@ class CpModel(object):
|
||||
A flattened list of intervals representing the set of values.
|
||||
|
||||
This method build a flattened domain suitable to be used in
|
||||
AddSumConstraintWithBounds and AddLinearConstraintWithBounds.
|
||||
AddSumInDomain and AddLinearExpressionInDomain.
|
||||
"""
|
||||
return pywrapsat.SatHelper.DomainFromValues(values)
|
||||
|
||||
@@ -596,7 +596,7 @@ class CpModel(object):
|
||||
A flattened list of intervals representing the union of the intervals.
|
||||
|
||||
This method build a flattened domain suitable to be used in
|
||||
AddSumConstraintWithBounds and AddLinearConstraintWithBounds.
|
||||
AddSumInDomain and AddLinearExpressionInDomain.
|
||||
"""
|
||||
starts = []
|
||||
ends = []
|
||||
@@ -636,21 +636,8 @@ class CpModel(object):
|
||||
|
||||
# Integer constraints.
|
||||
|
||||
def AddLinearConstraint(self, terms, lb, ub):
|
||||
"""Add the constraints lb <= sum(terms) <= ub, where term = (var, coef)."""
|
||||
ct = Constraint(self.__model.constraints)
|
||||
model_ct = self.__model.constraints[ct.Index()]
|
||||
for t in terms:
|
||||
if not isinstance(t[0], IntVar):
|
||||
raise TypeError('Wrong argument' + str(t))
|
||||
cp_model_helper.AssertIsInt64(t[1])
|
||||
model_ct.linear.vars.append(t[0].Index())
|
||||
model_ct.linear.coeffs.append(t[1])
|
||||
model_ct.linear.domain.extend([lb, ub])
|
||||
return ct
|
||||
|
||||
def AddSumConstraint(self, variables, lb, ub):
|
||||
"""Add the constraints lb <= sum(variables) <= ub."""
|
||||
"""Add lb <= sum(variables) <= ub."""
|
||||
ct = Constraint(self.__model.constraints)
|
||||
model_ct = self.__model.constraints[ct.Index()]
|
||||
for v in variables:
|
||||
@@ -659,8 +646,8 @@ class CpModel(object):
|
||||
model_ct.linear.domain.extend([lb, ub])
|
||||
return ct
|
||||
|
||||
def AddLinearConstraintWithBounds(self, terms, bounds):
|
||||
"""Add the constraints sum(terms) in bounds, where term = (var, coef)."""
|
||||
def AddLinearConstraint(self, terms, lb, ub):
|
||||
"""Add lb <= sum(terms) <= ub, where term = (var, coef)."""
|
||||
ct = Constraint(self.__model.constraints)
|
||||
model_ct = self.__model.constraints[ct.Index()]
|
||||
for t in terms:
|
||||
@@ -669,11 +656,24 @@ class CpModel(object):
|
||||
cp_model_helper.AssertIsInt64(t[1])
|
||||
model_ct.linear.vars.append(t[0].Index())
|
||||
model_ct.linear.coeffs.append(t[1])
|
||||
model_ct.linear.domain.extend(bounds)
|
||||
model_ct.linear.domain.extend([lb, ub])
|
||||
return ct
|
||||
|
||||
def AddSumConstraintWithBounds(self, variables, bounds):
|
||||
"""Add the constraints sum(variables) in bounds."""
|
||||
def AddLinearExpressionInDomain(self, terms, domain):
|
||||
"""Add sum(terms) in domain, where term = (var, coef)."""
|
||||
ct = Constraint(self.__model.constraints)
|
||||
model_ct = self.__model.constraints[ct.Index()]
|
||||
for t in terms:
|
||||
if not isinstance(t[0], IntVar):
|
||||
raise TypeError('Wrong argument' + str(t))
|
||||
cp_model_helper.AssertIsInt64(t[1])
|
||||
model_ct.linear.vars.append(t[0].Index())
|
||||
model_ct.linear.coeffs.append(t[1])
|
||||
model_ct.linear.domain.extend(domain)
|
||||
return ct
|
||||
|
||||
def AddSumInDomain(self, variables, domain):
|
||||
"""Add the constraints sum(variables) in domain."""
|
||||
ct = Constraint(self.__model.constraints)
|
||||
model_ct = self.__model.constraints[ct.Index()]
|
||||
for var in variables:
|
||||
@@ -681,7 +681,7 @@ class CpModel(object):
|
||||
raise TypeError('Wrong argument' + str(var))
|
||||
model_ct.linear.vars.append(var.Index())
|
||||
model_ct.linear.coeffs.append(1)
|
||||
model_ct.linear.domain.extend(bounds)
|
||||
model_ct.linear.domain.extend(domain)
|
||||
return ct
|
||||
|
||||
def Add(self, ct):
|
||||
@@ -689,7 +689,7 @@ class CpModel(object):
|
||||
if isinstance(ct, LinearInequality):
|
||||
coeffs_map, constant = ct.Expression().GetVarValueMap()
|
||||
bounds = [cp_model_helper.CapSub(x, constant) for x in ct.Bounds()]
|
||||
return self.AddLinearConstraintWithBounds(
|
||||
return self.AddLinearExpressionInDomain(
|
||||
iteritems(coeffs_map), bounds)
|
||||
elif ct and isinstance(ct, bool):
|
||||
pass # Nothing to do, was already evaluated to true.
|
||||
|
||||
@@ -65,7 +65,7 @@ public class BinPackingProblemSat {
|
||||
for (int i = 0; i < numItems; ++i) {
|
||||
vars[i] = x[i][b];
|
||||
}
|
||||
model.addScalProdEqual(vars, sizes, load[b]);
|
||||
model.addLinearExpressionEqual(vars, sizes, load[b]);
|
||||
}
|
||||
|
||||
// Place all items.
|
||||
@@ -74,7 +74,7 @@ public class BinPackingProblemSat {
|
||||
for (int b = 0; b < numBins; ++b) {
|
||||
vars[b] = x[i][b];
|
||||
}
|
||||
model.addLinearSumEqual(vars, items[i][1]);
|
||||
model.addSumEqual(vars, items[i][1]);
|
||||
}
|
||||
|
||||
// Links load and slack.
|
||||
|
||||
@@ -41,7 +41,7 @@ public class ChannelingSampleSat {
|
||||
|
||||
// Create our two half-reified constraints.
|
||||
// First, b implies (y == 10 - x).
|
||||
model.addLinearSumEqual(new IntVar[] {x, y}, 10).onlyEnforceIf(b);
|
||||
model.addSumEqual(new IntVar[] {x, y}, 10).onlyEnforceIf(b);
|
||||
// Second, not(b) implies y == 0.
|
||||
model.addEquality(y, 0).onlyEnforceIf(b.not());
|
||||
|
||||
|
||||
@@ -73,7 +73,8 @@ public class CpIsFunSat {
|
||||
model.addAllDifferent(letters);
|
||||
|
||||
// CP + IS + FUN = TRUE
|
||||
model.addScalProdEqual(new IntVar[] {c, p, i, s, f, u, n, t, r, u, e},
|
||||
model.addLinearExpressionEqual(
|
||||
new IntVar[] {c, p, i, s, f, u, n, t, r, u, e},
|
||||
new long[] {
|
||||
base, 1, base, 1, base * base, base, 1, -base * base * base, -base * base, -base, -1},
|
||||
0);
|
||||
|
||||
@@ -47,7 +47,7 @@ public class EarlinessTardinessCostSampleSat {
|
||||
|
||||
// First segment: s1 == earlinessCost * (earlinessDate - x).
|
||||
IntVar s1 = model.newIntVar(-largeConstant, largeConstant, "s1");
|
||||
model.addScalProdEqual(
|
||||
model.addLinearExpressionEqual(
|
||||
new IntVar[] {s1, x}, new long[] {1, earlinessCost}, earlinessCost* earlinessDate);
|
||||
|
||||
// Second segment.
|
||||
@@ -55,7 +55,7 @@ public class EarlinessTardinessCostSampleSat {
|
||||
|
||||
// Third segment: s3 == latenessCost * (x - latenessDate).
|
||||
IntVar s3 = model.newIntVar(-largeConstant, largeConstant, "s3");
|
||||
model.addScalProdEqual(
|
||||
model.addLinearExpressionEqual(
|
||||
new IntVar[] {s3, x}, new long[] {1, -latenessCost}, -latenessCost* latenessDate);
|
||||
|
||||
// Link together expr and x through s1, s2, and s3.
|
||||
|
||||
@@ -32,9 +32,9 @@ public class RabbitsAndPheasantsSat {
|
||||
IntVar r = model.newIntVar(0, 100, "r");
|
||||
IntVar p = model.newIntVar(0, 100, "p");
|
||||
// 20 heads.
|
||||
model.addLinearSumEqual(new IntVar[] {r, p}, 20);
|
||||
model.addSumEqual(new IntVar[] {r, p}, 20);
|
||||
// 56 legs.
|
||||
model.addScalProdEqual(new IntVar[] {r, p}, new long[] {4, 2}, 56);
|
||||
model.addLinearExpressionEqual(new IntVar[] {r, p}, new long[] {4, 2}, 56);
|
||||
|
||||
// Creates a solver and solves the model.
|
||||
CpSolver solver = new CpSolver();
|
||||
|
||||
@@ -89,7 +89,7 @@ public class RankingSampleSat {
|
||||
vars[numTasks] = ranks[i];
|
||||
coefs[numTasks] = -1;
|
||||
// ranks == sum(precedences) - 1;
|
||||
model.addScalProdEqual(vars, coefs, 1);
|
||||
model.addLinearExpressionEqual(vars, coefs, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -153,7 +153,7 @@ public class RankingSampleSat {
|
||||
}
|
||||
objectiveVars[numTasks] = makespan;
|
||||
objectiveCoefs[numTasks] = 2;
|
||||
model.minimizeScalProd(objectiveVars, objectiveCoefs);
|
||||
model.minimizeLinearExpression(objectiveVars, objectiveCoefs);
|
||||
|
||||
// Creates a solver and solves the model.
|
||||
CpSolver solver = new CpSolver();
|
||||
|
||||
@@ -70,7 +70,7 @@ public class SolveAndPrintIntermediateSolutionsSampleSat {
|
||||
|
||||
// Maximize a linear combination of variables.
|
||||
// [START objective]
|
||||
model.maximizeScalProd(new IntVar[] {x, y, z}, new int[] {1, 2, 3});
|
||||
model.maximizeLinearExpression(new IntVar[] {x, y, z}, new int[] {1, 2, 3});
|
||||
// [END objective]
|
||||
|
||||
// Create a solver and solve the model.
|
||||
|
||||
@@ -58,14 +58,14 @@ public class StepFunctionSampleSat
|
||||
|
||||
// expr == 0 on [5, 6] U [8, 10]
|
||||
ILiteral b0 = model.NewBoolVar("b0");
|
||||
model.AddLinearSumWithBounds(
|
||||
model.AddSumInDomain(
|
||||
new IntVar[] {x},
|
||||
model.DomainFromValues(new long[] {5, 6, 8, 9, 10})).OnlyEnforceIf(b0);
|
||||
model.Add(expr == 0).OnlyEnforceIf(b0);
|
||||
|
||||
// expr == 2 on [0, 1] U [3, 4] U [11, 20]
|
||||
ILiteral b2 = model.NewBoolVar("b2");
|
||||
model.AddLinearSumWithBounds(
|
||||
model.AddSumInDomain(
|
||||
new IntVar[] {x},
|
||||
model.DomainFromIntervals(
|
||||
new long[] {0, 1, 3, 4, 11, 20})).OnlyEnforceIf(b2);
|
||||
|
||||
@@ -45,13 +45,12 @@ public class StepFunctionSampleSat {
|
||||
|
||||
// expr == 0 on [5, 6] U [8, 10]
|
||||
Literal b0 = model.newBoolVar("b0");
|
||||
model.addLinearSumWithBounds(new IntVar[] {x}, new long[] {5, 6, 8, 10}).onlyEnforceIf(b0);
|
||||
model.addSumInDomain(new IntVar[] {x}, new long[] {5, 6, 8, 10}).onlyEnforceIf(b0);
|
||||
model.addEquality(expr, 0).onlyEnforceIf(b0);
|
||||
|
||||
// expr == 2 on [0, 1] U [3, 4] U [11, 20]
|
||||
Literal b2 = model.newBoolVar("b2");
|
||||
model.addLinearSumWithBounds(new IntVar[] {x}, new long[] {0, 1, 3, 4, 11, 20})
|
||||
.onlyEnforceIf(b2);
|
||||
model.addSumInDomain(new IntVar[] {x}, new long[] {0, 1, 3, 4, 11, 20}).onlyEnforceIf(b2);
|
||||
model.addEquality(expr, 2).onlyEnforceIf(b2);
|
||||
|
||||
// expr == 3 when x = 7
|
||||
|
||||
@@ -57,7 +57,7 @@ def SchedulingWithCalendarSampleSat():
|
||||
# We have 2 states (spanning across lunch or not)
|
||||
across = model.NewBoolVar('across')
|
||||
non_spanning_hours = model.DomainFromValues([8, 9, 10, 14, 15])
|
||||
model.AddSumConstraintWithBounds([start], non_spanning_hours).OnlyEnforceIf(
|
||||
model.AddSumInDomain([start], non_spanning_hours).OnlyEnforceIf(
|
||||
across.Not())
|
||||
model.AddSumConstraint([start], 11, 12).OnlyEnforceIf(across)
|
||||
model.Add(duration == 3).OnlyEnforceIf(across.Not())
|
||||
|
||||
@@ -59,17 +59,14 @@ def step_function_sample_sat():
|
||||
|
||||
# expr == 0 on [5, 6] U [8, 10]
|
||||
b0 = model.NewBoolVar('b0')
|
||||
model.AddSumConstraintWithBounds([x],
|
||||
model.DomainFromIntervals(
|
||||
[(5, 6), (8, 10)])).OnlyEnforceIf(b0)
|
||||
model.AddSumInDomain([x], model.DomainFromIntervals(
|
||||
[(5, 6), (8, 10)])).OnlyEnforceIf(b0)
|
||||
model.Add(expr == 0).OnlyEnforceIf(b0)
|
||||
|
||||
# expr == 2 on [0, 1] U [3, 4] U [11, 20]
|
||||
b2 = model.NewBoolVar('b2')
|
||||
model.AddSumConstraintWithBounds([x],
|
||||
model.DomainFromIntervals(
|
||||
[(0, 1), (3, 4),
|
||||
(11, 20)])).OnlyEnforceIf(b2)
|
||||
model.AddSumInDomain([x], model.DomainFromIntervals(
|
||||
[(0, 1), (3, 4), (11, 20)])).OnlyEnforceIf(b2)
|
||||
model.Add(expr == 2).OnlyEnforceIf(b2)
|
||||
|
||||
# expr == 3 when x == 7
|
||||
|
||||
Reference in New Issue
Block a user