diff --git a/examples/dotnet/ShiftSchedulingSat.cs b/examples/dotnet/ShiftSchedulingSat.cs index edf0926e6b..e1d5c7722c 100644 --- a/examples/dotnet/ShiftSchedulingSat.cs +++ b/examples/dotnet/ShiftSchedulingSat.cs @@ -546,25 +546,3 @@ public class ShiftSchedulingSat } } -public class ObjectiveSolutionPrinter : CpSolverSolutionCallback -{ - private DateTime _startTime; - private int _solutionCount; - - public ObjectiveSolutionPrinter() - { - _startTime = DateTime.Now; - } - - public override void OnSolutionCallback() - { - var currentTime = DateTime.Now; - var objective = ObjectiveValue(); - var objectiveBound = BestObjectiveBound(); - var time = currentTime - _startTime; - - Console.WriteLine($"Solution {_solutionCount}, time = {time.TotalSeconds} s, objective = [{objectiveBound}, {objective}]"); - - _solutionCount++; - } -} diff --git a/makefiles/Makefile.dotnet.mk b/makefiles/Makefile.dotnet.mk index a0da48d8c7..92f282d114 100644 --- a/makefiles/Makefile.dotnet.mk +++ b/makefiles/Makefile.dotnet.mk @@ -327,6 +327,7 @@ $(DOTNET_ORTOOLS_NATIVE_NUPKG): \ $(SRC_DIR)/ortools/sat/csharp/CpSolver.cs \ $(SRC_DIR)/ortools/sat/csharp/IntegerExpressions.cs \ $(SRC_DIR)/ortools/sat/csharp/IntervalVariables.cs \ + $(SRC_DIR)/ortools/sat/csharp/SearchHelpers.cs \ $(SRC_DIR)/ortools/util/csharp/NestedArrayHelper.cs \ $(SRC_DIR)/ortools/util/csharp/ProtoHelper.cs \ $(GEN_DIR)/ortools/constraint_solver/SearchLimit.pb.cs \ diff --git a/ortools/sat/csharp/CpSolver.cs b/ortools/sat/csharp/CpSolver.cs index 48e93758ca..b055430a99 100644 --- a/ortools/sat/csharp/CpSolver.cs +++ b/ortools/sat/csharp/CpSolver.cs @@ -15,80 +15,7 @@ using System; using System.Collections.Generic; namespace Google.OrTools.Sat -{ - - public class CpSolverSolutionCallback : SolutionCallback - { - public long Value(IntegerExpression e) - { - List exprs = new List(); - List coeffs = new List(); - exprs.Add(e); - coeffs.Add(1L); - long constant = 0; - - while (exprs.Count > 0) - { - IntegerExpression expr = exprs[0]; - exprs.RemoveAt(0); - long coeff = coeffs[0]; - coeffs.RemoveAt(0); - if (coeff == 0) continue; - - if (expr is ProductCst) - { - ProductCst p = (ProductCst)expr; - if (p.Coeff != 0) - { - exprs.Add(p.Expr); - coeffs.Add(p.Coeff * coeff); - } - } - else if (expr is SumArray) - { - SumArray a = (SumArray)expr; - constant += coeff * a.Constant; - foreach (IntegerExpression sub in a.Expressions) - { - exprs.Add(sub); - coeffs.Add(coeff); - } - } - else if (expr is IntVar) - { - int index = expr.Index; - long value = SolutionIntegerValue(index); - constant += coeff * value; - } - else if (expr is NotBooleanVariable) - { - throw new ArgumentException( - "Cannot evaluate a literal in an integer expression."); - } - else - { - throw new ArgumentException("Cannot evaluate '" + expr.ToString() + - "' in an integer expression"); - } - } - return constant; - } - - public Boolean BooleanValue(ILiteral literal) - { - if (literal is IntVar || literal is NotBooleanVariable) - { - int index = literal.GetIndex(); - return SolutionBooleanValue(index); - } - else - { - throw new ArgumentException("Cannot evaluate '" + literal.ToString() + - "' as a boolean literal"); - } - } - } - +{ public class CpSolver { diff --git a/ortools/sat/csharp/SearchHelpers.cs b/ortools/sat/csharp/SearchHelpers.cs new file mode 100644 index 0000000000..1705bb7d7a --- /dev/null +++ b/ortools/sat/csharp/SearchHelpers.cs @@ -0,0 +1,119 @@ +// Copyright 2010-2018 Google LLC +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using System.Collections.Generic; + +namespace Google.OrTools.Sat +{ + + public class CpSolverSolutionCallback : SolutionCallback + { + public long Value(IntegerExpression e) + { + List exprs = new List(); + List coeffs = new List(); + exprs.Add(e); + coeffs.Add(1L); + long constant = 0; + + while (exprs.Count > 0) + { + IntegerExpression expr = exprs[0]; + exprs.RemoveAt(0); + long coeff = coeffs[0]; + coeffs.RemoveAt(0); + if (coeff == 0) continue; + + if (expr is ProductCst) + { + ProductCst p = (ProductCst)expr; + if (p.Coeff != 0) + { + exprs.Add(p.Expr); + coeffs.Add(p.Coeff * coeff); + } + } + else if (expr is SumArray) + { + SumArray a = (SumArray)expr; + constant += coeff * a.Constant; + foreach (IntegerExpression sub in a.Expressions) + { + exprs.Add(sub); + coeffs.Add(coeff); + } + } + else if (expr is IntVar) + { + int index = expr.Index; + long value = SolutionIntegerValue(index); + constant += coeff * value; + } + else if (expr is NotBooleanVariable) + { + throw new ArgumentException( + "Cannot evaluate a literal in an integer expression."); + } + else + { + throw new ArgumentException("Cannot evaluate '" + expr.ToString() + + "' in an integer expression"); + } + } + return constant; + } + + public Boolean BooleanValue(ILiteral literal) + { + if (literal is IntVar || literal is NotBooleanVariable) + { + int index = literal.GetIndex(); + return SolutionBooleanValue(index); + } + else + { + throw new ArgumentException("Cannot evaluate '" + literal.ToString() + + "' as a boolean literal"); + } + } + } + +public class ObjectiveSolutionPrinter : CpSolverSolutionCallback +{ + private DateTime _startTime; + private int _solutionCount; + + public ObjectiveSolutionPrinter() + { + _startTime = DateTime.Now; + } + + public override void OnSolutionCallback() + { + var currentTime = DateTime.Now; + var objective = ObjectiveValue(); + var objectiveBound = BestObjectiveBound(); + var objLb = Math.Min(objective, objectiveBound); + var objUb = Math.Max(objective, objectiveBound); + var time = currentTime - _startTime; + + Console.WriteLine(value: $"Solution {_solutionCount}, time = {time.TotalSeconds} s, objective = [{objLb}, {objUb}]"); + + _solutionCount++; + } + + public int solutionCount() => _solutionCount; +} + +} // namespace Google.OrTools.Sat