15 using System.Collections.Generic;
23 static IntegerVariableProto NewIntegerVariable(
long lb,
long ub)
25 IntegerVariableProto var =
new IntegerVariableProto();
31 static ConstraintProto NewLinear2(
int v1,
int v2,
long c1,
long c2,
long lb,
long ub)
33 LinearConstraintProto linear =
new LinearConstraintProto();
36 linear.Coeffs.Add(c1);
37 linear.Coeffs.Add(c2);
38 linear.Domain.Add(lb);
39 linear.Domain.Add(ub);
40 ConstraintProto ct =
new ConstraintProto();
45 static ConstraintProto NewLinear3(
int v1,
int v2,
int v3,
long c1,
long c2,
long c3,
long lb,
long ub)
47 LinearConstraintProto linear =
new LinearConstraintProto();
51 linear.Coeffs.Add(c1);
52 linear.Coeffs.Add(c2);
53 linear.Coeffs.Add(c3);
54 linear.Domain.Add(lb);
55 linear.Domain.Add(ub);
56 ConstraintProto ct =
new ConstraintProto();
61 static CpObjectiveProto NewMinimize1(
int v1,
long c1)
63 CpObjectiveProto obj =
new CpObjectiveProto();
69 static CpObjectiveProto NewMaximize1(
int v1,
long c1)
71 CpObjectiveProto obj =
new CpObjectiveProto();
72 obj.Vars.Add(-v1 - 1);
74 obj.ScalingFactor = -1;
78 static CpObjectiveProto NewMaximize2(
int v1,
int v2,
long c1,
long c2)
80 CpObjectiveProto obj =
new CpObjectiveProto();
81 obj.Vars.Add(-v1 - 1);
82 obj.Vars.Add(-v2 - 1);
85 obj.ScalingFactor = -1;
93 CpModelProto model =
new CpModelProto();
94 model.Variables.Add(NewIntegerVariable(-10, 10));
95 model.Variables.Add(NewIntegerVariable(-10, 10));
96 model.Variables.Add(NewIntegerVariable(-1000000, 1000000));
97 model.Constraints.Add(NewLinear2(0, 1, 1, 1, -1000000, 100000));
98 model.Constraints.Add(NewLinear3(0, 1, 2, 1, 2, -1, 0, 100000));
99 model.Objective = NewMaximize1(2, 1);
101 SolveWrapper solve_wrapper =
new SolveWrapper();
102 CpSolverResponse response = solve_wrapper.Solve(model);
103 Assert.Equal(CpSolverStatus.Optimal, response.Status);
104 Assert.Equal(30, response.ObjectiveValue);
105 Assert.Equal(
new long[] { 10, 10, 30 }, response.Solution);
112 CpModelProto model =
new CpModelProto();
113 model.Variables.Add(NewIntegerVariable(-10, 10));
114 model.Variables.Add(NewIntegerVariable(-10, 10));
115 model.Constraints.Add(NewLinear2(0, 1, 1, 1, -1000000, 100000));
116 model.Objective = NewMaximize2(0, 1, 1, -2);
119 SolveWrapper solve_wrapper =
new SolveWrapper();
120 CpSolverResponse response = solve_wrapper.Solve(model);
121 Assert.Equal(CpSolverStatus.Optimal, response.Status);
122 Assert.Equal(30, response.ObjectiveValue);
123 Assert.Equal(
new long[] { 10, -10 }, response.Solution);
138 Assert.Equal(v1.
Domain.FlattenedIntervals(),
new long[] { -10, 10 });
142 CpSolverStatus status = solver.
Solve(model);
143 Assert.Equal(CpSolverStatus.Optimal, status);
145 CpSolverResponse response = solver.
Response;
146 Assert.Equal(30, response.ObjectiveValue);
147 Assert.Equal(
new long[] { 10, 10, 30 }, response.Solution);
162 CpSolverStatus status = solver.
Solve(model);
163 Assert.Equal(CpSolverStatus.Optimal, status);
165 CpSolverResponse response = solver.
Response;
166 Assert.Equal(30, response.ObjectiveValue);
167 Assert.Equal(
new long[] { 10, -10 }, response.Solution);
177 model.
Add(-100000 <= v1 + 2 * v2 <= 100000);
182 CpSolverStatus status = solver.
Solve(model);
183 Assert.Equal(CpSolverStatus.Optimal, status);
185 CpSolverResponse response = solver.
Response;
186 Assert.Equal(-10, solver.
Value(v1));
187 Assert.Equal(10, solver.
Value(v2));
188 Assert.Equal(
new long[] { -10, 10 }, response.Solution);
189 Assert.Equal(-30, solver.
Value(v1 - 2 * v2));
190 Assert.Equal(-30, response.ObjectiveValue);
202 model.
Add(x == boolvar * 4);
203 model.
Add(delta == x - 5);
209 CpSolverStatus status = solver.
Solve(model);
210 CpSolverResponse response = solver.
Response;
211 Console.WriteLine(
"response = " + response.ToString());
213 Assert.Equal(CpSolverStatus.Optimal, status);
215 Assert.Equal(1, solver.
Value(boolvar));
216 Assert.Equal(4, solver.
Value(x));
217 Assert.Equal(-1, solver.
Value(delta));
218 Assert.Equal(1, solver.
Value(squaredDelta));
219 Assert.Equal(
new long[] { 1, 4, -1, 1 }, response.Solution);
220 Assert.Equal(1.0, response.ObjectiveValue, 5);
233 model.
Add(delta == x - 5);
234 long[,] tuples = { { -5, 25 }, { -4, 16 }, { -3, 9 }, { -2, 4 }, { -1, 1 }, { 0, 0 },
235 { 1, 1 }, { 2, 4 }, { 3, 9 }, { 4, 16 }, { 5, 25 } };
240 CpSolverStatus status = solver.
Solve(model);
242 CpSolverResponse response = solver.
Response;
243 Assert.Equal(1, solver.
Value(boolvar));
244 Assert.Equal(4, solver.
Value(x));
245 Assert.Equal(-1, solver.
Value(delta));
246 Assert.Equal(1, solver.
Value(squaredDelta));
247 Assert.Equal(
new long[] { 1, 4, -1, 1 }, response.Solution);
248 Assert.Equal(1.0, response.ObjectiveValue, 6);
257 model.AddDivisionEquality(3, v1, v2);
261 CpSolverStatus status = solver.
Solve(model);
262 Assert.Equal(CpSolverStatus.Optimal, status);
264 CpSolverResponse response = solver.
Response;
265 Assert.Equal(3, solver.
Value(v1));
266 Assert.Equal(1, solver.
Value(v2));
267 Assert.Equal(
new long[] { 3, 1 }, response.Solution);
268 Assert.Equal(0, response.ObjectiveValue);
278 model.AddModuloEquality(3, v1, v2);
282 CpSolverStatus status = solver.
Solve(model);
283 Assert.Equal(CpSolverStatus.Optimal, status);
285 CpSolverResponse response = solver.
Response;
286 Assert.Equal(3, solver.
Value(v1));
287 Assert.Equal(4, solver.
Value(v2));
288 Assert.Equal(
new long[] { 3, 4 }, response.Solution);
289 Assert.Equal(0, response.ObjectiveValue);
297 List<IntVar> vars =
new List<IntVar>();
298 List<long> coeffs =
new List<long>();
300 for (
int i = 0; i < 100000; ++i)
306 var watch = System.Diagnostics.Stopwatch.StartNew();
309 var elapsedMs = watch.ElapsedMilliseconds;
310 Console.WriteLine($
"Long: Elapsed time {elapsedMs}");
317 List<IntVar> vars =
new List<IntVar>();
318 List<int> coeffs =
new List<int>();
320 for (
int i = 0; i < 100000; ++i)
326 var watch = System.Diagnostics.Stopwatch.StartNew();
329 var elapsedMs = watch.ElapsedMilliseconds;
330 Console.WriteLine($
"Int: Elapsed time {elapsedMs}");
337 List<LinearExpr> exprs =
new List<LinearExpr>();
339 for (
int i = 0; i < 100000; ++i)
344 var watch = System.Diagnostics.Stopwatch.StartNew();
347 var elapsedMs = watch.ElapsedMilliseconds;
348 Console.WriteLine($
"Exprs: Elapsed time {elapsedMs}");
355 List<IntVar> vars =
new List<IntVar>();
356 List<long> coeffs =
new List<long>();
358 for (
int i = 0; i < 100000; ++i)
364 var watch = System.Diagnostics.Stopwatch.StartNew();
366 for (
int i = 0; i < 100000; ++i)
368 obj.
AddTerm(vars[i], coeffs[i]);
372 var elapsedMs = watch.ElapsedMilliseconds;
373 Console.WriteLine($
"Proto: Elapsed time {elapsedMs}");
379 Console.WriteLine(
"LinearExprStaticCompileTest");
385 long[] c1 =
new long[] { 2L, 4L };
386 int[] c2 =
new int[] { 2, 4 };
388 Console.WriteLine(e1.ToString());
390 Console.WriteLine(e2.ToString());
392 Console.WriteLine(e3.ToString());
394 Console.WriteLine(e4.ToString());
396 Console.WriteLine(e5.ToString());
398 Console.WriteLine(e6.ToString());
400 Console.WriteLine(e7.ToString());
402 Console.WriteLine(e8.ToString());
404 Console.WriteLine(e9.ToString());
410 Console.WriteLine(
"LinearExprBuilderCompileTest");
416 long[] c1 =
new long[] { 2L, 4L };
417 int[] c2 =
new int[] { 2, 4 };
419 Console.WriteLine(e1.ToString());
421 Console.WriteLine(e2.ToString());
423 Console.WriteLine(e3.ToString());
425 Console.WriteLine(e4.ToString());
427 Console.WriteLine(e5.ToString());
429 Console.WriteLine(e6.ToString());
431 Console.WriteLine(e7.ToString());
433 Console.WriteLine(e8.ToString());
435 Console.WriteLine(e9.ToString());
437 Console.WriteLine(e10.ToString());
439 Console.WriteLine(e11.ToString());
441 Console.WriteLine(e12.ToString());
443 Console.WriteLine(e13.ToString());
445 Console.WriteLine(e14.ToString());
447 Console.WriteLine(e15.ToString());
453 Console.WriteLine(
"LinearExprIntVarOperatorTest");
457 Console.WriteLine(e);
459 Console.WriteLine(e);
461 Console.WriteLine(e);
463 Console.WriteLine(e);
465 Console.WriteLine(e);
467 Console.WriteLine(e);
469 Console.WriteLine(e);
471 Console.WriteLine(e);
477 Console.WriteLine(
"LinearExprBoolVarOperatorTest");
481 Console.WriteLine(e);
483 Console.WriteLine(e);
485 Console.WriteLine(e);
487 Console.WriteLine(e);
489 Console.WriteLine(e);
491 Console.WriteLine(e);
493 Console.WriteLine(e);
495 Console.WriteLine(e);
501 Console.WriteLine(
"LinearExprBoolVarNotOperatorTest");
505 Console.WriteLine(e);
507 Console.WriteLine(e);
509 Console.WriteLine(e);
511 Console.WriteLine(e);
513 Console.WriteLine(e);
515 Console.WriteLine(e);
517 Console.WriteLine(e);
519 Console.WriteLine(e);
527 model.
Add(-100000 <= v1 + 2 * v2 <= 100000);
529 Assert.True(model.
ExportToFile(
"test_model_dotnet.pbtxt"));
530 Console.WriteLine(
"Model written to file");
536 string model_str =
@"
539 { ""name"": ""C"", ""domain"": [ ""1"", ""9"" ] },
540 { ""name"": ""P"", ""domain"": [ ""0"", ""9"" ] },
541 { ""name"": ""I"", ""domain"": [ ""1"", ""9"" ] },
542 { ""name"": ""S"", ""domain"": [ ""0"", ""9"" ] },
543 { ""name"": ""F"", ""domain"": [ ""1"", ""9"" ] },
544 { ""name"": ""U"", ""domain"": [ ""0"", ""9"" ] },
545 { ""name"": ""N"", ""domain"": [ ""0"", ""9"" ] },
546 { ""name"": ""T"", ""domain"": [ ""1"", ""9"" ] },
547 { ""name"": ""R"", ""domain"": [ ""0"", ""9"" ] },
548 { ""name"": ""E"", ""domain"": [ ""0"", ""9"" ] }
551 { ""allDiff"": { ""exprs"": [
552 { ""vars"": [""0""], ""coeffs"": [""1""] },
553 { ""vars"": [""1""], ""coeffs"": [""1""] },
554 { ""vars"": [""2""], ""coeffs"": [""1""] },
555 { ""vars"": [""3""], ""coeffs"": [""1""] },
556 { ""vars"": [""4""], ""coeffs"": [""1""] },
557 { ""vars"": [""5""], ""coeffs"": [""1""] },
558 { ""vars"": [""6""], ""coeffs"": [""1""] },
559 { ""vars"": [""7""], ""coeffs"": [""1""] },
560 { ""vars"": [""8""], ""coeffs"": [""1""] },
561 { ""vars"": [""9""], ""coeffs"": [""1""] } ] } },
562 { ""linear"": { ""vars"": [ 6, 5, 9, 4, 3, 7, 8, 2, 0, 1 ], ""coeffs"": [ ""1"", ""0"", ""-1"", ""100"", ""1"", ""-1000"", ""-100"", ""10"", ""10"", ""1"" ], ""domain"": [ ""0"", ""0"" ] } }
565 CpModelProto model =
Google.Protobuf.JsonParser.Default.Parse<CpModelProto>(model_str);
566 SolveWrapper solve_wrapper =
new SolveWrapper();
567 CpSolverResponse response = solve_wrapper.Solve(model);
568 Console.WriteLine(response);
574 Console.WriteLine(
"CaptureLog test");
582 Assert.Equal(v1.
Domain.FlattenedIntervals(),
new long[] { -10, 10 });
590 Assert.NotEmpty(log);
591 Assert.Contains(
"OPTIMAL", log);
597 Console.WriteLine(
"TestInterval test");
600 IntervalVar i = model.NewFixedSizeIntervalVar(v, 3,
"i");
601 Assert.Equal(
"v", i.
StartExpr().ToString());
602 Assert.Equal(
"3", i.
SizeExpr().ToString());
603 Assert.Equal(
"v + 3", i.
EndExpr().ToString());