diff --git a/com/google/ortools/constraintsolver/ValCstPair.cs b/com/google/ortools/constraintsolver/ValCstPair.cs index 4217598710..082e2d5cac 100644 --- a/com/google/ortools/constraintsolver/ValCstPair.cs +++ b/com/google/ortools/constraintsolver/ValCstPair.cs @@ -42,4 +42,45 @@ namespace Google.OrTools.ConstraintSolver return valCstPair.Cst; } } + + public class ConstraintAndEquality + { + public ConstraintAndEquality(IntExpr a, IntExpr b, bool equality) + { + this.left_ = a; + this.right_ = b; + this.equality_ = equality; + } + + bool IsTrue() + { + return (object)left_ == (object)right_ ? equality_ : !equality_; + } + + Constraint ToConstraint() + { + return equality_ ? + left_.solver().MakeEquality(left_.Var(), right_.Var()) : + left_.solver().MakeNonEquality(left_.Var(), right_.Var()); + } + + public static bool operator true(ConstraintAndEquality eq) + { + return eq.IsTrue(); + } + + public static bool operator false(ConstraintAndEquality eq) + { + return !eq.IsTrue(); + } + + public static implicit operator Constraint(ConstraintAndEquality eq) + { + return eq.ToConstraint(); + } + + private IntExpr left_; + private IntExpr right_; + private bool equality_; + } } // namespace Google.OrTools.ConstraintSolver diff --git a/constraint_solver/constraint_solver.swig b/constraint_solver/constraint_solver.swig index 68eeaff60a..fb5389dfde 100644 --- a/constraint_solver/constraint_solver.swig +++ b/constraint_solver/constraint_solver.swig @@ -1563,11 +1563,11 @@ namespace operations_research { public static ValCstPair operator !=(IntExpr a, long v) { return new ValCstPair(a.solver().MakeNonEquality(a.Var(), v)); } - public Constraint Equality(IntExpr b) { - return this.solver().MakeEquality(this.Var(), b.Var()); + public static ConstraintAndEquality operator ==(IntExpr a, IntExpr b) { + return new ConstraintAndEquality(a, b, true); } - public Constraint NonEquality(IntExpr b) { - return this.solver().MakeNonEquality(this.Var(), b.Var()); + public static ConstraintAndEquality operator !=(IntExpr a, IntExpr b) { + return new ConstraintAndEquality(a, b, false); } public static ValCstPair operator >=(IntExpr a, long v) { return new ValCstPair(a.solver().MakeGreaterOrEqual(a, v)); diff --git a/csharp/a_round_of_golf.cs b/csharp/a_round_of_golf.cs index 092613ca96..c3f8a74e1a 100644 --- a/csharp/a_round_of_golf.cs +++ b/csharp/a_round_of_golf.cs @@ -117,13 +117,13 @@ public class ARoundOfGolf // 2. Mr. Clubb, who isn't Paul, hit several balls into the woods and // scored ten strokes more than the pro-shop clerk. solver.Add(Clubb != Paul); - solver.Add(score.Element(Clubb).Equality(score.Element(clerk) + 10)); + solver.Add(score.Element(Clubb) == score.Element(clerk) + 10); // 3. In some order, Frank and the caddy scored four and seven more // strokes than Mr. Sands. solver.Add(caddy != Frank); solver.Add(Sands != Frank); - solver.Add(caddy.NonEquality(Sands)); + solver.Add(caddy != Sands); IntVar b3_a_1 = (score.Element(Sands) + 4).IsEqual(score[Frank]); IntVar b3_a_2 = score.Element(caddy).IsEqual(score.Element(Sands) + 7); diff --git a/csharp/all_interval.cs b/csharp/all_interval.cs index dbbeb0c1bc..793db46ac0 100644 --- a/csharp/all_interval.cs +++ b/csharp/all_interval.cs @@ -47,10 +47,8 @@ public class AllInterval solver.Add(diffs.AllDifferent()); for(int k = 0; k < n - 1; k++) { - // solver.Add( - // solver.MakeEquality(diffs[k], - // solver.MakeAbs(x[k + 1] - x[k]).Var())); - solver.Add(diffs[k].Equality((x[k + 1] - x[k]).Abs())); + // solver.Add(diffs[k] == (x[k + 1] - x[k]).Abs()); + solver.Add(diffs[k] == (x[k + 1] - x[k].Abs())); } diff --git a/csharp/circuit.cs b/csharp/circuit.cs index c27df9226e..810719c521 100644 --- a/csharp/circuit.cs +++ b/csharp/circuit.cs @@ -42,9 +42,9 @@ public class CircuitTest solver.Add(z.AllDifferent()); // put the orbit of x[0] in z[0..n-1] - solver.Add(z[0].Equality(x[0])); + solver.Add(z[0] == x[0]); for(int i = 1; i < n-1; i++) { - solver.Add(z[i].Equality(x.Element(z[i-1]).Var())); + solver.Add(z[i] == x.Element(z[i-1].Var())); } // z may not be 0 for i < n-1 diff --git a/csharp/circuit2.cs b/csharp/circuit2.cs index 03f976369b..09101edcb7 100644 --- a/csharp/circuit2.cs +++ b/csharp/circuit2.cs @@ -43,9 +43,9 @@ public class CircuitTest2 solver.Add(z.AllDifferent()); // put the orbit of x[0] in z[0..n-1] - solver.Add(z[0].Equality(x[0])); + solver.Add(z[0] == x[0]); for(int i = 1; i < n-1; i++) { - solver.Add(z[i].Equality(x.Element(z[i-1]).Var())); + solver.Add(z[i] == x.Element(z[i-1].Var())); } // z may not be 0 for i < n-1 diff --git a/csharp/contiguity_regular.cs b/csharp/contiguity_regular.cs index cef25b8c27..a22cc5c290 100644 --- a/csharp/contiguity_regular.cs +++ b/csharp/contiguity_regular.cs @@ -26,7 +26,7 @@ public class ContiguityRegular /* * Global constraint regular * - * This is a translation of MiniZinc's regular constraint (defined in + * This is a translation of MiniZinc's regular constraint (defined in * lib/zinc/globals.mzn), via the Comet code refered above. * All comments are from the MiniZinc code. * """ @@ -52,9 +52,9 @@ public class ContiguityRegular int[,] d, int q0, int[] F) { - - + + Debug.Assert(Q > 0, "regular: 'Q' must be greater than zero"); Debug.Assert(S > 0, "regular: 'S' must be greater than zero"); @@ -85,8 +85,8 @@ public class ContiguityRegular // string). int m = 0; int n = x.Length; - - IntVar[] a = solver.MakeIntVarArray(n+1-m, 0,Q+1, "a"); + + IntVar[] a = solver.MakeIntVarArray(n+1-m, 0,Q+1, "a"); // Check that the final state is in F solver.Add(a[a.Length-1].Member(F)); // First state is q0 @@ -96,10 +96,10 @@ public class ContiguityRegular solver.Add(x[i] >= 1); solver.Add(x[i] <= S); // Determine a[i+1]: a[i+1] == d2[a[i], x[i]] - solver.Add(a[i+1].Equality(d2_flatten.Element(((a[i])*S)+(x[i]-1)))); + solver.Add(a[i+1] == d2_flatten.Element(((a[i]*S)+(x[i]-1)))); } - + } @@ -115,13 +115,13 @@ public class ContiguityRegular int[] accepting_states = {1,2,3}; // The regular expression 0*1*0* - int[,] transition_fn = + int[,] transition_fn = { {1,2}, // state 1 (start): input 0 -> state 1, input 1 -> state 2 i.e. 0* - {3,2}, // state 2: 1* - {3,0}, // state 3: 0* + {3,2}, // state 2: 1* + {3,0}, // state 3: 0* }; - + MyRegular(solver, x, n_states, input_max, transition_fn, initial_state, accepting_states); @@ -139,13 +139,13 @@ public class ContiguityRegular * From Global Constraint Catalogue * http://www.emn.fr/x-info/sdemasse/gccat/Cglobal_contiguity.html * """ - * Enforce all variables of the VARIABLES collection to be assigned to 0 or 1. + * Enforce all variables of the VARIABLES collection to be assigned to 0 or 1. * In addition, all variables assigned to value 1 appear contiguously. * * Example: * (<0, 1, 1, 0>) * - * The global_contiguity constraint holds since the sequence 0 1 1 0 contains + * The global_contiguity constraint holds since the sequence 0 1 1 0 contains * no more than one group of contiguous 1. * """ * @@ -165,7 +165,7 @@ public class ContiguityRegular // // Decision variables // - + // Note: We use 1..2 (instead of 0..1) and subtract 1 in the solution IntVar[] reg_input = solver.MakeIntVarArray(n, 1, 2, "reg_input"); diff --git a/csharp/crew.cs b/csharp/crew.cs index bfbad8ca78..ab7ec158ef 100644 --- a/csharp/crew.cs +++ b/csharp/crew.cs @@ -37,7 +37,7 @@ public class Crew * number of cabin crew, and they have to speak certain languages. * Every cabin crew member has two flights off after an attended flight. * """ - * + * * Also see http://www.hakank.org/or-tools/crew.pl * */ @@ -68,7 +68,7 @@ public class Crew "Jean", "Heather", "Juliet"}; - + int num_persons = names.Length; @@ -98,7 +98,7 @@ public class Crew {0,1,0,1,1}, // Heather = 18 {0,1,1,0,0} // Juliet = 19 }; - + // // Required number of crew members. @@ -155,7 +155,7 @@ public class Crew } nw[p] = tmp.Sum().IsGreater(0); } - solver.Add(nw.Sum().Equality(num_working)); + solver.Add(nw.Sum() == num_working); for(int f = 0; f < num_flights; f++) { // size of crew @@ -164,7 +164,7 @@ public class Crew tmp[p] = crew[f,p]; } solver.Add(tmp.Sum() == required_crew[f,0]); - + // attributes and requirements for(int a = 0; a < 5; a++) { IntVar[] tmp2 = new IntVar[num_persons]; @@ -181,7 +181,7 @@ public class Crew solver.Add(crew[f,i] + crew[f+1,i] + crew[f+2,i] <= 1); } } - + // extra contraint: all must work at least two of the flights /* for(int p = 0; p < num_persons; p++) { @@ -269,7 +269,7 @@ public class Crew } if (args.Length > 1) { - min = Convert.ToInt32(args[0]); + min = Convert.ToInt32(args[1]); } Solve(n, min); diff --git a/csharp/crossword.cs b/csharp/crossword.cs index 20f76cd96a..8da74c7e8f 100644 --- a/csharp/crossword.cs +++ b/csharp/crossword.cs @@ -141,11 +141,8 @@ public class Crossword // for(int I = 0; I < num_overlapping; I++) { solver.Add( - solver.MakeEquality( - A_flat.Element(E[overlapping[I,0]] * word_len + - overlapping[I,1]).Var(), - A_flat.Element(E[overlapping[I,2]] * word_len + - overlapping[I,3]).Var())); + A_flat.Element(E[overlapping[I,0]] * word_len + overlapping[I,1]) == + A_flat.Element(E[overlapping[I,2]] * word_len + overlapping[I,3])); } diff --git a/csharp/debruijn.cs b/csharp/debruijn.cs index 66f41c18c1..e0e68f7dad 100644 --- a/csharp/debruijn.cs +++ b/csharp/debruijn.cs @@ -34,7 +34,7 @@ public class DeBruijn for(int i = 0; i < len; i++) { tmp[i] = (a[i]*(int)Math.Pow(bbase,(len-i-1))).Var(); } - return tmp.Sum().Equality(num); + return tmp.Sum() == num; } @@ -105,18 +105,18 @@ public class DeBruijn // elements in binary[i-1] for(int i = 1; i < m; i++) { for(int j = 1; j < n; j++) { - solver.Add(binary[i - 1,j].Equality(binary[i,j - 1])); + solver.Add(binary[i - 1,j] == binary[i,j - 1]); } } // ... and around the corner for(int j = 1; j < n; j++) { - solver.Add(binary[m - 1,j].Equality(binary[0,j - 1])); + solver.Add(binary[m - 1,j] == binary[0,j - 1]); } // converts binary -> bin_code (de Bruijn sequence) for(int i = 0; i < m; i++) { - solver.Add(bin_code[i].Equality(binary[i,0])); + solver.Add(bin_code[i] == binary[i,0]); } @@ -127,13 +127,13 @@ public class DeBruijn solver.Add(bin_code.Distribute(gcc)); if (check_same_gcc && m % bbase == 0) { for(int i = 1; i < bbase; i++) { - solver.Add(gcc[i].Equality(gcc[i - 1])); + solver.Add(gcc[i] == gcc[i - 1]); } } // symmetry breaking: // the minimum value of x should be first - // solver.Add(x[0].Equality(x.Min())); + // solver.Add(x[0] == x.Min()); // diff --git a/csharp/divisible_by_9_through_1.cs b/csharp/divisible_by_9_through_1.cs index 303488c4e9..ffa00fe6c2 100644 --- a/csharp/divisible_by_9_through_1.cs +++ b/csharp/divisible_by_9_through_1.cs @@ -35,7 +35,7 @@ public class DivisibleBy9Through1 * */ public static void MyMod(Solver solver, IntVar x, IntVar y, IntVar r) { - + long lbx = x.Min(); long ubx = x.Max(); long ubx_neg = -ubx; @@ -44,7 +44,7 @@ public class DivisibleBy9Through1 int max_x = (int)Math.Max(ubx, lbx_neg); IntVar d = solver.MakeIntVar(min_x, max_x, "d"); - + // r >= 0 solver.Add(r >= 0); @@ -65,7 +65,7 @@ public class DivisibleBy9Through1 // x == y*d+r solver.Add(x - (y*d + r) == 0); - + } @@ -83,7 +83,7 @@ public class DivisibleBy9Through1 for(int i = 0; i < len; i++) { tmp[i] = (a[i]*(int)Math.Pow(bbase,(len-i-1))).Var(); } - return tmp.Sum().Equality(num); + return tmp.Sum() == num; } /** @@ -153,7 +153,7 @@ public class DivisibleBy9Through1 Console.Write(t[i].Value() + " "); } Console.WriteLine("\n"); - + if (bbase != 10) { Console.Write("Number base 10: " + t[0].Value()); Console.Write(" Base " + bbase + ": "); @@ -161,7 +161,7 @@ public class DivisibleBy9Through1 Console.Write(digits_str[(int)x[i].Value() + 1]); } Console.WriteLine("\n"); - + } } diff --git a/csharp/dudeney.cs b/csharp/dudeney.cs index 0ab49524bf..0ed1ca0d03 100644 --- a/csharp/dudeney.cs +++ b/csharp/dudeney.cs @@ -22,7 +22,7 @@ using Google.OrTools.ConstraintSolver; public class DudeneyNumbers { - + private static Constraint ToNum(IntVar[] a, IntVar num, int bbase) { int len = a.Length; @@ -31,7 +31,7 @@ public class DudeneyNumbers for(int i = 0; i < len; i++) { tmp[i] = (a[i]*(int)Math.Pow(bbase,(len-i-1))).Var(); } - return tmp.Sum().Equality(num); + return tmp.Sum() == num; } @@ -43,17 +43,17 @@ public class DudeneyNumbers * http://cp-is-fun.blogspot.com/2010/09/test-python.html * """ * I discovered yesterday Dudeney Numbers - * A Dudeney Numbers is a positive integer that is a perfect cube such that the sum - * of its decimal digits is equal to the cube root of the number. There are only six + * A Dudeney Numbers is a positive integer that is a perfect cube such that the sum + * of its decimal digits is equal to the cube root of the number. There are only six * Dudeney Numbers and those are very easy to find with CP. - * I made my first experience with google cp solver so find these numbers (model below) + * I made my first experience with google cp solver so find these numbers (model below) * and must say that I found it very convenient to build CP models in python! - * When you take a close look at the line: + * When you take a close look at the line: * solver.Add(sum([10**(n-i-1)*x[i] for i in range(n)]) == nb) - * It is difficult to argue that it is very far from dedicated + * It is difficult to argue that it is very far from dedicated * optimization languages! * """ - * + * * Also see: http://en.wikipedia.org/wiki/Dudeney_number * */ @@ -77,15 +77,15 @@ public class DudeneyNumbers // // Constraints // - solver.Add(nb.Equality(s*s*s)); - solver.Add(x.Sum().Equality(s)); + solver.Add(nb == s*s*s); + solver.Add(x.Sum() == s); // solver.Add(ToNum(x, nb, 10)); // alternative solver.Add((from i in Enumerable.Range(0, n) select (x[i]*(int)Math.Pow(10,n-i-1)).Var()). - ToArray().Sum().Equality(nb)); + ToArray().Sum() == nb); // diff --git a/csharp/furniture_moving.cs b/csharp/furniture_moving.cs index b87e2c2723..695a789c5e 100644 --- a/csharp/furniture_moving.cs +++ b/csharp/furniture_moving.cs @@ -44,11 +44,11 @@ public class FurnitureMoving * */ static void MyCumulative(Solver solver, - IntVar[] s, - int[] d, - int[] r, + IntVar[] s, + int[] d, + int[] r, IntVar b) { - + int[] tasks = (from i in Enumerable.Range(0, s.Length) where r[i] > 0 && d[i] > 0 select i).ToArray(); @@ -64,7 +64,7 @@ public class FurnitureMoving } solver.Add((bb.ToArray(typeof(IntVar)) as IntVar[]).Sum() <= b); } - + // Somewhat experimental: // This constraint is needed to constrain the upper limit of b. if (b is IntVar) { @@ -80,7 +80,7 @@ public class FurnitureMoving * * Marriott & Stukey: 'Programming with constraints', page 112f * - * The model implements an decomposition of the global constraint + * The model implements an decomposition of the global constraint * cumulative (see above). * * Also see http://www.hakank.org/or-tools/furniture_moving.py @@ -111,10 +111,10 @@ public class FurnitureMoving // Constraints // for(int i = 0; i < n; i++) { - solver.Add(end_times[i].Equality(start_times[i] + duration[i])); + solver.Add(end_times[i] == start_times[i] + duration[i]); } - solver.Add(end_time.Equality(end_times.Max())); + solver.Add(end_time == end_times.Max()); MyCumulative(solver, start_times, duration, demand, num_resources); @@ -156,7 +156,7 @@ public class FurnitureMoving Console.WriteLine("num_resources: {0} end_time: {1}", num_resources.Value(), end_time.Value()); for(int i = 0; i < n; i++) { - Console.WriteLine("Task {0,1}: {1,2} -> {2,2} -> {3,2} (demand: {4})", + Console.WriteLine("Task {0,1}: {1,2} -> {2,2} -> {3,2} (demand: {4})", i, start_times[i].Value(), duration[i], diff --git a/csharp/grocery.cs b/csharp/grocery.cs index cf79725775..7268aed59c 100644 --- a/csharp/grocery.cs +++ b/csharp/grocery.cs @@ -61,7 +61,7 @@ public class Grocery solver.Add(item.Sum() == c); solver.Add(item[0] * item[1] * item[2] * item[3] - (c * 100*100*100) == 0); // solver.Add(item.Prod() - (c * 100*100*100) == 0); - // solver.Add(item.Prod().Equality(c * 100*100*100)); + // solver.Add(item.Prod() == c * 100*100*100); // Symmetry breaking Decreasing(solver, item); diff --git a/csharp/map.cs b/csharp/map.cs index 339dbc202b..bafba79858 100644 --- a/csharp/map.cs +++ b/csharp/map.cs @@ -50,15 +50,15 @@ public class Map // // Constraints // - solver.Add(color[France].NonEquality(color[Belgium])); - solver.Add(color[France].NonEquality(color[Luxembourg])); - solver.Add(color[France].NonEquality(color[Germany])); - solver.Add(color[Luxembourg].NonEquality(color[Germany])); - solver.Add(color[Luxembourg].NonEquality(color[Belgium])); - solver.Add(color[Belgium].NonEquality(color[Netherlands])); - solver.Add(color[Belgium].NonEquality(color[Germany])); - solver.Add(color[Germany].NonEquality(color[Netherlands])); - solver.Add(color[Germany].NonEquality(color[Denmark])); + solver.Add(color[France] != color[Belgium]); + solver.Add(color[France] != color[Luxembourg]); + solver.Add(color[France] != color[Germany]); + solver.Add(color[Luxembourg] != color[Germany]); + solver.Add(color[Luxembourg] != color[Belgium]); + solver.Add(color[Belgium] != color[Netherlands]); + solver.Add(color[Belgium] != color[Germany]); + solver.Add(color[Germany] != color[Netherlands]); + solver.Add(color[Germany] != color[Denmark]); // Symmetry breaking solver.Add(color[Belgium] == 1); diff --git a/csharp/map2.cs b/csharp/map2.cs index 384dffe0c5..b58eaa1411 100644 --- a/csharp/map2.cs +++ b/csharp/map2.cs @@ -67,7 +67,7 @@ public class Map2 // Constraints // for(int i = 0; i < neighbours.GetLength(0); i++) { - solver.Add(color[neighbours[i,0]].NonEquality(color[neighbours[i,1]])); + solver.Add(color[neighbours[i,0]] != color[neighbours[i,1]]); } // Symmetry breaking diff --git a/csharp/nurse_rostering_regular.cs b/csharp/nurse_rostering_regular.cs index 8a0ab2a7c9..7017cbaa28 100644 --- a/csharp/nurse_rostering_regular.cs +++ b/csharp/nurse_rostering_regular.cs @@ -27,7 +27,7 @@ public class NurseRostering /* * Global constraint regular * - * This is a translation of MiniZinc's regular constraint (defined in + * This is a translation of MiniZinc's regular constraint (defined in * lib/zinc/globals.mzn), via the Comet code refered above. * All comments are from the MiniZinc code. * """ @@ -53,9 +53,9 @@ public class NurseRostering int[,] d, int q0, int[] F) { - - + + Debug.Assert(Q > 0, "regular: 'Q' must be greater than zero"); Debug.Assert(S > 0, "regular: 'S' must be greater than zero"); @@ -86,8 +86,8 @@ public class NurseRostering // string). int m = 0; int n = x.Length; - - IntVar[] a = solver.MakeIntVarArray(n+1-m, 0,Q+1, "a"); + + IntVar[] a = solver.MakeIntVarArray(n+1-m, 0,Q+1, "a"); // Check that the final state is in F solver.Add(a[a.Length-1].Member(F)); // First state is q0 @@ -97,10 +97,10 @@ public class NurseRostering solver.Add(x[i] >= 1); solver.Add(x[i] <= S); // Determine a[i+1]: a[i+1] == d2[a[i], x[i]] - solver.Add(a[i+1].Equality(d2_flatten.Element(((a[i])*S)+(x[i]-1)))); + solver.Add(a[i+1] == d2_flatten.Element(((a[i])*S)+(x[i]-1))); } - + } @@ -155,7 +155,7 @@ public class NurseRostering {6,0,1}, // state 5 {0,0,1} // state 6 }; - + string[] days = {"d","n","o"}; // for presentation @@ -163,7 +163,7 @@ public class NurseRostering // // Decision variables // - + // For regular IntVar[,] x = new IntVar[num_nurses, num_days]; IntVar[] x_flat = new IntVar[num_nurses*num_days]; @@ -198,11 +198,11 @@ public class NurseRostering MyRegular(solver, reg_input, n_states, input_max, transition_fn, initial_state, accepting_states); - + } - // + // // Statistics and constraints for each nurse // for(int i = 0; i < num_nurses; i++) { @@ -212,7 +212,7 @@ public class NurseRostering for(int j = 0; j < num_days; j++) { b[j] = (x[i,j].IsEqual(day_shift) + x[i,j].IsEqual(night_shift)).Var(); } - solver.Add(b.Sum().Equality(nurse_stat[i])); + solver.Add(b.Sum() == nurse_stat[i]); // Each nurse must work between 7 and 10 // days/nights during this period @@ -222,7 +222,7 @@ public class NurseRostering } - // + // // Statistics and constraints for each day // for(int j = 0; j < num_days; j++) { @@ -231,7 +231,7 @@ public class NurseRostering for(int i = 0; i < num_nurses; i++) { b[i] = (x[i,j].IsEqual(t)).Var(); } - solver.Add(b.Sum().Equality(day_stat[j,t])); + solver.Add(b.Sum() == day_stat[j,t]); } // @@ -283,7 +283,7 @@ public class NurseRostering occ[v]++; Console.Write(days[v] + " "); } - + Console.Write(" #workdays: {0,2}", nurse_stat[i].Value()); foreach(int s in valid_shifts) { int v = 0; @@ -293,7 +293,7 @@ public class NurseRostering Console.Write(" {0}:{1}", days[s-1], v); } Console.WriteLine(); - + } Console.WriteLine(); diff --git a/csharp/nurse_rostering_transition.cs b/csharp/nurse_rostering_transition.cs index c8c604dc8a..41efa10e4c 100644 --- a/csharp/nurse_rostering_transition.cs +++ b/csharp/nurse_rostering_transition.cs @@ -108,7 +108,7 @@ public class NurseRostering // // Decision variables // - + // // For TransitionConstraint // @@ -153,7 +153,7 @@ public class NurseRostering accepting_states)); } - // + // // Statistics and constraints for each nurse // for(int i = 0; i < num_nurses; i++) { @@ -163,7 +163,7 @@ public class NurseRostering for(int j = 0; j < num_days; j++) { b[j] = (x[i,j].IsEqual(day_shift) + x[i,j].IsEqual(night_shift)).Var(); } - solver.Add(b.Sum().Equality(nurse_stat[i])); + solver.Add(b.Sum() == nurse_stat[i]); // Each nurse must work between 7 and 10 // days/nights during this period @@ -173,7 +173,7 @@ public class NurseRostering } - // + // // Statistics and constraints for each day // for(int j = 0; j < num_days; j++) { @@ -182,7 +182,7 @@ public class NurseRostering for(int i = 0; i < num_nurses; i++) { b[i] = (x[i,j].IsEqual(t)).Var(); } - solver.Add(b.Sum().Equality(day_stat[j,t])); + solver.Add(b.Sum() == day_stat[j,t]); } // @@ -234,7 +234,7 @@ public class NurseRostering occ[v]++; Console.Write(days[v] + " "); } - + Console.Write(" #workdays: {0,2}", nurse_stat[i].Value()); foreach(int s in valid_shifts) { int v = 0; @@ -244,7 +244,7 @@ public class NurseRostering Console.Write(" {0}:{1}", days[s-1], v); } Console.WriteLine(); - + } Console.WriteLine(); diff --git a/csharp/send_more_money.cs b/csharp/send_more_money.cs index 64a7845233..e047ddb703 100644 --- a/csharp/send_more_money.cs +++ b/csharp/send_more_money.cs @@ -46,8 +46,8 @@ public class SendMoreMoney // Constraints // solver.Add(x.AllDifferent()); - solver.Add((S*1000 + E*100 + N*10 + D + M*1000 + O*100 + R*10 + E).Equality( - M*10000 + O*1000 + N*100 + E*10 + Y)); + solver.Add(S*1000 + E*100 + N*10 + D + M*1000 + O*100 + R*10 + E == + M*10000 + O*1000 + N*100 + E*10 + Y); solver.Add(S > 0); solver.Add(M > 0); diff --git a/csharp/send_more_money2.cs b/csharp/send_more_money2.cs index a3a1a3310b..79e64d2e34 100644 --- a/csharp/send_more_money2.cs +++ b/csharp/send_more_money2.cs @@ -49,8 +49,8 @@ public class SendMoreMoney solver.Add(x.AllDifferent()); /* - solver.Add((S*1000 + E*100 + N*10 + D + M*1000 + O*100 + R*10 + E).Equality( - M*10000 + O*1000 + N*100 + E*10 + Y)); + solver.Add(S*1000 + E*100 + N*10 + D + M*1000 + O*100 + R*10 + E == + M*10000 + O*1000 + N*100 + E*10 + Y); */ // Here we use scalar product instead. @@ -61,20 +61,18 @@ public class SendMoreMoney new int[] {1000,100,10,1}), solver.MakeScalProd(new IntVar[] {M, O, R, E}, new int[] {1000,100,10,1})) - .Equality( + == solver.MakeScalProd(new IntVar[] {M,O,N,E,Y}, new int[] {10000, 1000, 100, 10, 1} - )) + ) ); */ - // Alternative + // Alternative int[] s1 = new int[] {1000,100,10,1}; int[] s2 = new int[] {10000,1000,100,10,1}; solver.Add(solver.MakeSum(new IntVar[] {S,E,N,D}.ScalProd(s1), new IntVar[] {M,O,R,E}.ScalProd(s1)) - .Equality( - new IntVar[] {M,O,N,E,Y}.ScalProd(s2)) - ); + == new IntVar[] {M,O,N,E,Y}.ScalProd(s2)); solver.Add(S > 0); diff --git a/csharp/ski_assignment.cs b/csharp/ski_assignment.cs index 0ed55cbfa3..4412214b56 100644 --- a/csharp/ski_assignment.cs +++ b/csharp/ski_assignment.cs @@ -79,7 +79,7 @@ public class SkiAssignment } // IntVar z = solver.MakeIntVar(0, ski_heights.Sum(), "z"); - // solver.Add(z_tmp.Sum().Equality(z)); + // solver.Add(z_tmp.Sum() == z); // The direct cast from IntExpr to IntVar is potentially faster than // the above code. IntVar z = z_tmp.Sum().VarWithName("z"); diff --git a/csharp/strimko2.cs b/csharp/strimko2.cs index d54bed9809..1b5a735b80 100644 --- a/csharp/strimko2.cs +++ b/csharp/strimko2.cs @@ -44,7 +44,7 @@ public class Strimko2 {4,6,6,6,7,7,5}, {6,4,6,4,5,5,7}, {6,6,4,7,7,7,7}}; - + // Note: This is 1-based int[,] placed = {{2,1,1}, {2,3,7}, @@ -59,7 +59,7 @@ public class Strimko2 int n = streams.GetLength(0); int num_placed = placed.GetLength(0); - + // // Decision variables // @@ -74,7 +74,7 @@ public class Strimko2 // // Constraints - // + // // all rows and columns must be unique, i.e. a Latin Square for(int i = 0; i < n; i++) { IntVar[] row = new IntVar[n]; @@ -87,10 +87,10 @@ public class Strimko2 solver.Add(row.AllDifferent()); solver.Add(col.AllDifferent()); } - + // streams for(int s = 1; s <= n; s++) { - IntVar[] tmp = (from i in Enumerable.Range(0, n) + IntVar[] tmp = (from i in Enumerable.Range(0, n) from j in Enumerable.Range(0, n) where streams[i,j] == s select x[i,j]).ToArray(); @@ -101,8 +101,7 @@ public class Strimko2 // placed for(int i = 0; i < num_placed; i++) { // note: also adjust to 0-based - solver.Add(solver.MakeEquality(x[placed[i,0] - 1,placed[i,1] - 1], - placed[i,2])); + solver.Add(x[placed[i,0] - 1,placed[i,1] - 1] == placed[i,2]); } // diff --git a/csharp/to_num.cs b/csharp/to_num.cs index d4642d2f15..76ff19c649 100644 --- a/csharp/to_num.cs +++ b/csharp/to_num.cs @@ -34,7 +34,7 @@ public class ToNumTest for(int i = 0; i < len; i++) { tmp[i] = (a[i]*(int)Math.Pow(bbase,(len-i-1))).Var(); } - return tmp.Sum().Equality(num); + return tmp.Sum() == num; } diff --git a/csharp/young_tableaux.cs b/csharp/young_tableaux.cs index 2adf30dd9e..94fdacd986 100644 --- a/csharp/young_tableaux.cs +++ b/csharp/young_tableaux.cs @@ -85,7 +85,7 @@ public class YoungTableaux for(int j = 0; j < n; j++) { b[j] = x[i, j].IsLessOrEqual(n); } - solver.Add(p[i].Equality(b.Sum())); + solver.Add(p[i] == b.Sum()); } solver.Add(p.Sum() == n); diff --git a/csharp/zebra.cs b/csharp/zebra.cs index 36a5891e5e..f1d0ba6fd5 100644 --- a/csharp/zebra.cs +++ b/csharp/zebra.cs @@ -25,7 +25,7 @@ public class NQueens * * This is a port of the or-tools/Python model zebra.py * - * + * * """ * This is the zebra problem as invented by Lewis Caroll. * @@ -45,7 +45,7 @@ public class NQueens * The Lucky Strike smoker drinks orange juice. * The Japanese smokes Parliaments. * The Norwegian lives next to the blue house. - * + * * Who owns a zebra and who drinks water? * """ * @@ -80,14 +80,14 @@ public class NQueens IntVar fox = solver.MakeIntVar(1, n, "fox"); IntVar zebra = solver.MakeIntVar(1, n, "zebra"); IntVar horse = solver.MakeIntVar(1, n, "horse"); - + // Drink IntVar tea = solver.MakeIntVar(1, n, "tea"); IntVar coffee = solver.MakeIntVar(1, n, "coffee"); IntVar water = solver.MakeIntVar(1, n, "water"); IntVar milk = solver.MakeIntVar(1, n, "milk"); IntVar fruit_juice = solver.MakeIntVar(1, n, "fruit juice"); - + // Smoke IntVar old_gold = solver.MakeIntVar(1, n, "old gold"); IntVar kools = solver.MakeIntVar(1, n, "kools"); @@ -97,7 +97,7 @@ public class NQueens // for search - IntVar[] all_vars = + IntVar[] all_vars = {parliaments, kools, chesterfields, lucky_strike, old_gold, englishman, spaniard, japanese, ukrainian, norwegian, dog, snails, fox, zebra, horse, @@ -106,38 +106,38 @@ public class NQueens // // Constraints - // + // // Alldifferents - solver.Add(new IntVar[] + solver.Add(new IntVar[] {red, green, yellow, blue, ivory}.AllDifferent()); - solver.Add(new IntVar[] + solver.Add(new IntVar[] {englishman, spaniard, japanese, ukrainian, norwegian}.AllDifferent()); - solver.Add(new IntVar[] + solver.Add(new IntVar[] {dog, snails, fox, zebra, horse}.AllDifferent()); - solver.Add(new IntVar[] + solver.Add(new IntVar[] {tea, coffee, water, milk, fruit_juice}.AllDifferent()); - solver.Add(new IntVar[] + solver.Add(new IntVar[] {parliaments, kools, chesterfields, lucky_strike, old_gold}.AllDifferent()); // // The clues // - solver.Add(englishman.Equality(red)); - solver.Add(spaniard.Equality(dog)); - solver.Add(coffee.Equality(green)); - solver.Add(ukrainian.Equality(tea)); - solver.Add(green.Equality(ivory + 1)); - solver.Add(old_gold.Equality(snails)); - solver.Add(kools.Equality(yellow)); + solver.Add(englishman == red); + solver.Add(spaniard == dog); + solver.Add(coffee == green); + solver.Add(ukrainian == tea); + solver.Add(green == ivory + 1); + solver.Add(old_gold == snails); + solver.Add(kools == yellow); solver.Add(milk == 3); solver.Add(norwegian == 1); solver.Add((fox - chesterfields).Abs() == 1); solver.Add((horse - kools).Abs() == 1); - solver.Add(lucky_strike.Equality(fruit_juice)); - solver.Add(japanese.Equality(parliaments)); + solver.Add(lucky_strike == fruit_juice); + solver.Add(japanese == parliaments); solver.Add((norwegian - blue).Abs() == 1); - + // // Search @@ -151,11 +151,11 @@ public class NQueens IntVar[] p = {englishman, spaniard, japanese, ukrainian, norwegian}; int[] ix = {0,1,2,3,4}; while (solver.NextSolution()) { - int water_drinker = (from i in ix - where p[i].Value() == water.Value() + int water_drinker = (from i in ix + where p[i].Value() == water.Value() select i).First(); - int zebra_owner = (from i in ix - where p[i].Value() == zebra.Value() + int zebra_owner = (from i in ix + where p[i].Value() == zebra.Value() select i).First(); Console.WriteLine("The {0} drinks water.", p[water_drinker].ToString()); Console.WriteLine("The {0} owns the zebra", p[zebra_owner].ToString());