From 4577da7bdaea1c4288a69d5f7783be4bb5452f3a Mon Sep 17 00:00:00 2001 From: Koen van Leeuwen Date: Tue, 27 Jun 2023 11:30:20 +0200 Subject: [PATCH 1/3] Add SolutionValue() method naming analogous to the Variable method --- ortools/linear_solver/csharp/LinearExpr.cs | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/ortools/linear_solver/csharp/LinearExpr.cs b/ortools/linear_solver/csharp/LinearExpr.cs index 3679d84d5bd..7658c2e8ff5 100644 --- a/ortools/linear_solver/csharp/LinearExpr.cs +++ b/ortools/linear_solver/csharp/LinearExpr.cs @@ -23,6 +23,11 @@ public virtual double DoVisit(Dictionary coefficients, double return 0; } + public virtual double SolutionValue() + { + return 0; + } + public double Visit(Dictionary coefficients) { return DoVisit(coefficients, 1.0); @@ -185,6 +190,11 @@ public override double DoVisit(Dictionary coefficients, double } } + public override double SolutionValue() + { + return expr_.SolutionValue() * coeff_; + } + private LinearExpr expr_; private double coeff_; } @@ -213,6 +223,11 @@ public override double DoVisit(Dictionary coefficients, double return 0.0; } } + + public override double SolutionValue() + { + return expr_.SolutionValue() + coeff_; + } private LinearExpr expr_; private double coeff_; @@ -246,6 +261,11 @@ public override double DoVisit(Dictionary coefficients, double return 0.0; } + public override double SolutionValue() + { + return var_.SolutionValue(); + } + private Variable var_; } @@ -274,6 +294,11 @@ public override double DoVisit(Dictionary coefficients, double } } + public override double SolutionValue() + { + return left_.SolutionValue() + right_.SolutionValue(); + } + private LinearExpr left_; private LinearExpr right_; } @@ -302,6 +327,15 @@ public override double DoVisit(Dictionary coefficients, double } } + public override double SolutionValue() + { + double sum = 0.0; + foreach (LinearExpr expr in array_) + { + sum += expr.SolutionValue(); + } + } + private LinearExpr[] array_; } @@ -331,6 +365,15 @@ public override double DoVisit(Dictionary coefficients, double return 0.0; } + public override double SolutionValue() + { + double sum = 0.0; + foreach (Variable var in array_) + { + sum += var.SolutionValue(); + } + } + private Variable[] array_; } } // namespace Google.OrTools.LinearSolver From a4c7921469a8c6f75d933e9adc18dbbf8b149f99 Mon Sep 17 00:00:00 2001 From: Koen van Leeuwen Date: Wed, 28 Jun 2023 17:53:20 +0200 Subject: [PATCH 2/3] Add sum --- ortools/linear_solver/csharp/LinearExpr.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ortools/linear_solver/csharp/LinearExpr.cs b/ortools/linear_solver/csharp/LinearExpr.cs index 7658c2e8ff5..58eaa274180 100644 --- a/ortools/linear_solver/csharp/LinearExpr.cs +++ b/ortools/linear_solver/csharp/LinearExpr.cs @@ -334,6 +334,7 @@ public override double SolutionValue() { sum += expr.SolutionValue(); } + return sum; } private LinearExpr[] array_; @@ -372,6 +373,7 @@ public override double SolutionValue() { sum += var.SolutionValue(); } + return sum; } private Variable[] array_; From aa894f0149153d45db3d152d8f827be3efd22b12 Mon Sep 17 00:00:00 2001 From: Koen van Leeuwen Date: Wed, 28 Jun 2023 18:23:48 +0200 Subject: [PATCH 3/3] Add test for new LinearExpr.SolutionValue() method --- .../linear_solver/csharp/LinearSolverTests.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/ortools/linear_solver/csharp/LinearSolverTests.cs b/ortools/linear_solver/csharp/LinearSolverTests.cs index 7af9c0ff40b..273ff042ab8 100644 --- a/ortools/linear_solver/csharp/LinearSolverTests.cs +++ b/ortools/linear_solver/csharp/LinearSolverTests.cs @@ -442,5 +442,28 @@ static void testSetHintAndSolverGetters() solver.SetHint(new Variable[] { x, y }, new double[] { 2.0, 3.0 }); } + + [Fact] + static void Given_a_LinearExpr_and_a_solution_When_SolutionValue_is_called_then_the_result_is_correct() + { + Console.WriteLine(nameof(Given_a_LinearExpr_and_a_solution_When_SolutionValue_is_called_then_the_result_is_correct)); + Solver solver = Solver.CreateSolver("glop"); + // x, y and z are fixed; we don't want to test the solver here. + Variable x = solver.MakeIntVar(3, 3, "x"); + Variable y = solver.MakeIntVar(4, 4, "y"); + Variable z = solver.MakeIntVar(5, 5, "z"); + + LinearExpr part1 = x * 2; // 6 + LinearExpr part2 = y * 3 + z + 4; // 21 + LinearExpr objective = part1 + part2; // 27 + LinearExpr anew = new(); + solver.Maximize(objective); + solver.Solve(); + Assert.Equal(27, objective.SolutionValue(), precision: 9); + Assert.Equal(6, part1.SolutionValue(), precision: 9); + Assert.Equal(21, part2.SolutionValue(), precision: 9); + Assert.Equal(0, anew.SolutionValue(), precision: 9); + Assert.Equal(27, (objective + anew).SolutionValue(), precision: 9); + } } } // namespace Google.OrTools.Tests