uniformize name of linear constraints in CP-SAT Python/Java/C#

This commit is contained in:
Laurent Perron
2019-05-03 18:15:37 +02:00
parent 6fd7d5de73
commit 7097fa4829
15 changed files with 190 additions and 190 deletions

View File

@@ -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)

View File

@@ -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;
}

View File

@@ -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)

View File

@@ -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.

View File

@@ -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.

View File

@@ -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());

View File

@@ -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);

View File

@@ -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.

View File

@@ -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();

View File

@@ -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();

View File

@@ -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.

View File

@@ -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);

View File

@@ -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

View File

@@ -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())

View File

@@ -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