DotNet Reference

DotNet Reference

LinearExpr.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 LinearExpr
20 {
21  public virtual double DoVisit(Dictionary<Variable, double> coefficients,
22  double multiplier)
23  {
24  return 0;
25  }
26 
27  public double Visit(Dictionary<Variable, double> coefficients)
28  {
29  return DoVisit(coefficients, 1.0);
30  }
31 
32  public static LinearExpr operator+(LinearExpr a, double v)
33  {
34  return new SumCst(a, v);
35  }
36 
37  public static LinearExpr operator+(double v, LinearExpr a)
38  {
39  return new SumCst(a, v);
40  }
41 
43  {
44  return new Sum(a, b);
45  }
46 
47  public static LinearExpr operator-(LinearExpr a, double v)
48  {
49  return new SumCst(a, -v);
50  }
51 
52  public static LinearExpr operator-(double v, LinearExpr a)
53  {
54  return new SumCst(new ProductCst(a, -1.0), v);
55  }
56 
58  {
59  return new Sum(a, new ProductCst(b, -1.0));
60  }
61 
62  public static LinearExpr operator-(LinearExpr a)
63  {
64  return new ProductCst(a, -1.0);
65  }
66 
67  public static LinearExpr operator*(LinearExpr a, double v)
68  {
69  return new ProductCst(a, v);
70  }
71 
72  public static LinearExpr operator/(LinearExpr a, double v)
73  {
74  return new ProductCst(a, 1 / v);
75  }
76 
77  public static LinearExpr operator*(double v, LinearExpr a)
78  {
79  return new ProductCst(a, v);
80  }
81 
82  public static RangeConstraint operator==(LinearExpr a, double v)
83  {
84  return new RangeConstraint(a, v, v);
85  }
86 
87  public static RangeConstraint operator==(double v, LinearExpr a)
88  {
89  return new RangeConstraint(a, v, v);
90  }
91 
92  public static RangeConstraint operator!=(LinearExpr a, double v)
93  {
94  return new RangeConstraint(a, 1, -1);
95  }
96 
97  public static RangeConstraint operator!=(double v, LinearExpr a)
98  {
99  return new RangeConstraint(a, 1, -1);
100  }
101 
103  {
104  return new Equality(a, b, true);
105  }
106 
108  {
109  return new Equality(a, b, false);
110  }
111 
112  public static RangeConstraint operator<=(LinearExpr a, double v)
113  {
114  return new RangeConstraint(a, double.NegativeInfinity, v);
115  }
116 
117  public static RangeConstraint operator>=(LinearExpr a, double v)
118  {
119  return new RangeConstraint(a, v, double.PositiveInfinity);
120  }
121 
123  {
124  return a - b <= 0;
125  }
126 
128  {
129  return a - b >= 0;
130  }
131 
132  public static implicit operator LinearExpr(Variable a)
133  {
134  return new VarWrapper(a);
135  }
136 }
137 
138 public static class LinearExprArrayHelper
139 {
140  public static LinearExpr Sum(this LinearExpr[] exprs)
141  {
142  return new SumArray(exprs);
143  }
144 
145  public static LinearExpr Sum(this Variable[] vars)
146  {
147  return new SumVarArray(vars);
148  }
149 }
150 
151  // def __ge__(self, arg):
152  // if isinstance(arg, (int, long, float)):
153  // return LinearConstraint(self, arg, 1e308)
154  // else:
155  // return LinearConstraint(Sum(self, ProductCst(arg, -1)), 0.0, 1e308)
156 
157  // def __le__(self, arg):
158  // if isinstance(arg, (int, long, float)):
159  // return LinearConstraint(self, -1e308, arg)
160  // else:
161  // return LinearConstraint(Sum(self, ProductCst(arg, -1)), -1e308, 0.0)
162 
163 
165 {
166  public ProductCst(LinearExpr expr, double coeff)
167  {
168  this.coeff_ = coeff;
169  this.expr_ = expr;
170  }
171 
172  public override String ToString()
173  {
174  return "(" + expr_.ToString() + " * " + coeff_ + ")";
175  }
176 
177  public override double DoVisit(Dictionary<Variable, double> coefficients,
178  double multiplier)
179  {
180  double current_multiplier = multiplier * coeff_;
181  if (current_multiplier != 0.0)
182  {
183  return expr_.DoVisit(coefficients, current_multiplier);
184  }
185  else
186  {
187  return 0.0;
188  }
189  }
190 
191  private LinearExpr expr_;
192  private double coeff_;
193 }
194 
196 {
197  public SumCst(LinearExpr expr, double coeff)
198  {
199  this.coeff_ = coeff;
200  this.expr_ = expr;
201  }
202 
203  public override String ToString()
204  {
205  return "(" + expr_.ToString() + " + " + coeff_ + ")";
206  }
207 
208  public override double DoVisit(Dictionary<Variable, double> coefficients,
209  double multiplier)
210  {
211  if (multiplier != 0.0)
212  {
213  return coeff_ * multiplier + expr_.DoVisit(coefficients, multiplier);
214  }
215  else
216  {
217  return 0.0;
218  }
219  }
220 
221  private LinearExpr expr_;
222  private double coeff_;
223 }
224 
226 {
227  public VarWrapper(Variable var)
228  {
229  this.var_ = var;
230  }
231 
232  public override String ToString()
233  {
234  return var_.Name();
235  }
236 
237  public override double DoVisit(Dictionary<Variable, double> coefficients,
238  double multiplier)
239  {
240  if (multiplier != 0.0)
241  {
242  if (coefficients.ContainsKey(var_))
243  {
244  coefficients[var_] += multiplier;
245  }
246  else
247  {
248  coefficients[var_] = multiplier;
249  }
250  }
251  return 0.0;
252  }
253 
254  private Variable var_;
255 }
256 
257 
259 {
260  public Sum(LinearExpr left, LinearExpr right)
261  {
262  this.left_ = left;
263  this.right_ = right;
264  }
265 
266  public override String ToString()
267  {
268  return "(" + left_.ToString() + " + " + right_.ToString() + ")";
269  }
270 
271  public override double DoVisit(Dictionary<Variable, double> coefficients,
272  double multiplier)
273  {
274  if (multiplier != 0.0)
275  {
276  return left_.DoVisit(coefficients, multiplier) +
277  right_.DoVisit(coefficients, multiplier);
278  }
279  else
280  {
281  return 0.0;
282  }
283  }
284 
285  private LinearExpr left_;
286  private LinearExpr right_;
287 }
288 
289 public class SumArray : LinearExpr
290 {
291  public SumArray(LinearExpr[] array)
292  {
293  this.array_ = array;
294  }
295 
296  public override double DoVisit(Dictionary<Variable, double> coefficients,
297  double multiplier) {
298  if (multiplier != 0.0)
299  {
300  double constant = 0.0;
301  foreach (LinearExpr expr in array_)
302  {
303  constant += expr.DoVisit(coefficients, multiplier);
304  }
305  return constant;
306  }
307  else
308  {
309  return 0.0;
310  }
311  }
312 
313  private LinearExpr[] array_;
314 }
315 
316 public class SumVarArray : LinearExpr
317 {
318  public SumVarArray(Variable[] array)
319  {
320  this.array_ = array;
321  }
322 
323  public override double DoVisit(Dictionary<Variable, double> coefficients,
324  double multiplier) {
325  if (multiplier != 0.0)
326  {
327  foreach (Variable var in array_)
328  {
329  if (coefficients.ContainsKey(var))
330  {
331  coefficients[var] += multiplier;
332  }
333  else
334  {
335  coefficients[var] = multiplier;
336  }
337  }
338  }
339  return 0.0;
340  }
341 
342  private Variable[] array_;
343 }
344 } // namespace Google.OrTools.LinearSolver
static RangeConstraint operator!=(LinearExpr a, double v)
Definition: LinearExpr.cs:92
static Equality operator==(LinearExpr a, LinearExpr b)
Definition: LinearExpr.cs:102
Definition: Variable.cs:13
static LinearExpr operator+(LinearExpr a, LinearExpr b)
Definition: LinearExpr.cs:42
Sum(LinearExpr left, LinearExpr right)
Definition: LinearExpr.cs:260
override double DoVisit(Dictionary< Variable, double > coefficients, double multiplier)
Definition: LinearExpr.cs:237
override double DoVisit(Dictionary< Variable, double > coefficients, double multiplier)
Definition: LinearExpr.cs:177
override String ToString()
Definition: LinearExpr.cs:172
static RangeConstraint operator<=(LinearExpr a, LinearExpr b)
Definition: LinearExpr.cs:122
VarWrapper(Variable var)
Definition: LinearExpr.cs:227
static LinearExpr operator-(LinearExpr a, LinearExpr b)
Definition: LinearExpr.cs:57
override String ToString()
Definition: LinearExpr.cs:203
static RangeConstraint operator>=(LinearExpr a, LinearExpr b)
Definition: LinearExpr.cs:127
static LinearExpr operator/(LinearExpr a, double v)
Definition: LinearExpr.cs:72
static LinearExpr operator*(LinearExpr a, double v)
Definition: LinearExpr.cs:67
Definition: LinearExpr.cs:259
override String ToString()
Definition: LinearExpr.cs:232
override double DoVisit(Dictionary< Variable, double > coefficients, double multiplier)
Definition: LinearExpr.cs:296
static LinearExpr operator-(double v, LinearExpr a)
Definition: LinearExpr.cs:52
static RangeConstraint operator==(double v, LinearExpr a)
Definition: LinearExpr.cs:87
static LinearExpr operator-(LinearExpr a)
Definition: LinearExpr.cs:62
static LinearExpr operator+(LinearExpr a, double v)
Definition: LinearExpr.cs:32
override double DoVisit(Dictionary< Variable, double > coefficients, double multiplier)
Definition: LinearExpr.cs:208
Definition: LinearExpr.cs:226
static RangeConstraint operator!=(double v, LinearExpr a)
Definition: LinearExpr.cs:97
SumVarArray(Variable[] array)
Definition: LinearExpr.cs:318
override String ToString()
Definition: LinearExpr.cs:266
static Equality operator!=(LinearExpr a, LinearExpr b)
Definition: LinearExpr.cs:107
Definition: LinearExpr.cs:139
SumCst(LinearExpr expr, double coeff)
Definition: LinearExpr.cs:197
Definition: LinearExpr.cs:196
override double DoVisit(Dictionary< Variable, double > coefficients, double multiplier)
Definition: LinearExpr.cs:323
Definition: LinearExpr.cs:290
Definition: LinearExpr.cs:20
static LinearExpr operator-(LinearExpr a, double v)
Definition: LinearExpr.cs:47
static RangeConstraint operator==(LinearExpr a, double v)
Definition: LinearExpr.cs:82
double Visit(Dictionary< Variable, double > coefficients)
Definition: LinearExpr.cs:27
SumArray(LinearExpr[] array)
Definition: LinearExpr.cs:291
static LinearExpr operator+(double v, LinearExpr a)
Definition: LinearExpr.cs:37
static LinearExpr Sum(this Variable[] vars)
Definition: LinearExpr.cs:145
static LinearExpr Sum(this LinearExpr[] exprs)
Definition: LinearExpr.cs:140
static LinearExpr operator*(double v, LinearExpr a)
Definition: LinearExpr.cs:77
Definition: LinearExpr.cs:165
static RangeConstraint operator>=(LinearExpr a, double v)
Definition: LinearExpr.cs:117
ProductCst(LinearExpr expr, double coeff)
Definition: LinearExpr.cs:166
virtual double DoVisit(Dictionary< Variable, double > coefficients, double multiplier)
Definition: LinearExpr.cs:21
Definition: LinearExpr.cs:317
static RangeConstraint operator<=(LinearExpr a, double v)
Definition: LinearExpr.cs:112
override double DoVisit(Dictionary< Variable, double > coefficients, double multiplier)
Definition: LinearExpr.cs:271
string Name()
Definition: Variable.cs:47