LinearConstraint.cs
Go to the documentation of this file.
1 // Copyright 2010-2018 Google LLC
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
15 {
16  using System;
17  using System.Collections.Generic;
18 
19 public class LinearConstraint
20 {
21 
22  public virtual String ToString()
23  {
24  return "LinearConstraint";
25  }
26 
27  public virtual Constraint Extract(Solver solver)
28  {
29  return null;
30  }
31 }
32 
34 {
35 
36  public RangeConstraint(LinearExpr expr, double lb, double ub)
37  {
38  this.expr_ = expr;
39  this.lb_ = lb;
40  this.ub_ = ub;
41  }
42 
43  public override String ToString()
44  {
45  return "" + lb_ + " <= " + expr_.ToString() + " <= " + ub_;
46  }
47 
48  public override Constraint Extract(Solver solver)
49  {
50  Dictionary<Variable, double> coefficients =
51  new Dictionary<Variable, double>();
52  double constant = expr_.Visit(coefficients);
53  Constraint ct = solver.MakeConstraint(lb_ - constant, ub_ - constant);
54  foreach (KeyValuePair<Variable, double> pair in coefficients)
55  {
56  ct.SetCoefficient(pair.Key, pair.Value);
57  }
58  return ct;
59  }
60 
61  public static implicit operator bool(RangeConstraint ct)
62  {
63  return false;
64  }
65 
66  private LinearExpr expr_;
67  private double lb_;
68  private double ub_;
69 }
70 
71 public class Equality : LinearConstraint
72 {
73  public Equality(LinearExpr left, LinearExpr right, bool equality)
74  {
75  this.left_ = left;
76  this.right_ = right;
77  this.equality_ = equality;
78  }
79 
80  public override String ToString()
81  {
82  return "" + left_.ToString() + " == " + right_.ToString();
83  }
84 
85  public override Constraint Extract(Solver solver)
86  {
87  Dictionary<Variable, double> coefficients =
88  new Dictionary<Variable, double>();
89  double constant = left_.Visit(coefficients);
90  constant += right_.DoVisit(coefficients, -1);
91  Constraint ct = solver.MakeConstraint(-constant, -constant);
92  foreach (KeyValuePair<Variable, double> pair in coefficients)
93  {
94  ct.SetCoefficient(pair.Key, pair.Value);
95  }
96  return ct;
97  }
98 
99  public static implicit operator bool(Equality ct)
100  {
101  return (object)ct.left_ == (object)ct.right_ ? ct.equality_ : !ct.equality_;
102  }
103 
104  private LinearExpr left_;
105  private LinearExpr right_;
106  private bool equality_;
107 }
108 
110 {
111  public VarEquality(Variable left, Variable right, bool equality)
112  {
113  this.left_ = left;
114  this.right_ = right;
115  this.equality_ = equality;
116  }
117 
118  public override String ToString()
119  {
120  return "" + left_.Name() + " == " + right_.Name();
121  }
122 
123  public override Constraint Extract(Solver solver)
124  {
125  Constraint ct = solver.MakeConstraint(0.0, 0.0);
126  ct.SetCoefficient(left_, 1.0);
127  ct.SetCoefficient(right_, -1.0);
128  return ct;
129  }
130 
131  public static implicit operator bool(VarEquality ct)
132  {
133  return (object)ct.left_ == (object)ct.right_ ? ct.equality_ : !ct.equality_;
134  }
135 
136  private Variable left_;
137  private Variable right_;
138  private bool equality_;
139 }
140 
141 // TODO(user): Try to move this code back to the .swig with @define macros.
142 public partial class MPConstraintVector: IDisposable, System.Collections.IEnumerable
143 #if !SWIG_DOTNET_1
144  , System.Collections.Generic.IList<Constraint>
145 #endif
146 {
147  // cast from C# MPConstraint array
148  public static implicit operator MPConstraintVector(Constraint[] inVal) {
149  var outVal= new MPConstraintVector();
150  foreach (Constraint element in inVal) {
151  outVal.Add(element);
152  }
153  return outVal;
154  }
155 
156  // cast to C# MPConstraint array
157  public static implicit operator Constraint[](MPConstraintVector inVal) {
158  var outVal= new Constraint[inVal.Count];
159  inVal.CopyTo(outVal);
160  return outVal;
161  }
162 }
163 } // namespace Google.OrTools.LinearSolver
override Constraint Extract(Solver solver)
RangeConstraint(LinearExpr expr, double lb, double ub)
override Constraint Extract(Solver solver)
void SetCoefficient(Variable var, double coeff)
VarEquality(Variable left, Variable right, bool equality)
virtual double DoVisit(Dictionary< Variable, double > coefficients, double multiplier)
Definition: LinearExpr.cs:21
virtual Constraint Extract(Solver solver)
Constraint MakeConstraint(double lb, double ub)
Equality(LinearExpr left, LinearExpr right, bool equality)
override Constraint Extract(Solver solver)
double Visit(Dictionary< Variable, double > coefficients)
Definition: LinearExpr.cs:27