Skip to content

Commit 40702e6

Browse files
authored
Merge branch 'google:main' into main
2 parents b571880 + 1571e79 commit 40702e6

File tree

9 files changed

+210
-76
lines changed

9 files changed

+210
-76
lines changed

ortools/linear_solver/python/model_builder.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ def get_linear_constraint_expressions(
510510
"""
511511
return _attribute_series(
512512
# pylint: disable=g-long-lambda
513-
func=lambda c: mbh.FlatExpression(
513+
func=lambda c: mbh.FlatExpr(
514514
# pylint: disable=g-complex-comprehension
515515
[
516516
Variable(self.__helper, var_id)
@@ -862,7 +862,7 @@ def add_linear_constraint( # pytype: disable=annotation-type-mismatch # numpy-
862862
self.__helper.set_constraint_lower_bound(ct.index, lb - linear_expr)
863863
self.__helper.set_constraint_upper_bound(ct.index, ub - linear_expr)
864864
elif isinstance(linear_expr, LinearExpr):
865-
flat_expr = mbh.FlatExpression(linear_expr)
865+
flat_expr = mbh.FlatExpr(linear_expr)
866866
# pylint: disable=protected-access
867867
self.__helper.set_constraint_lower_bound(ct.index, lb - flat_expr.offset)
868868
self.__helper.set_constraint_upper_bound(ct.index, ub - flat_expr.offset)
@@ -944,7 +944,7 @@ def add_enforced_linear_constraint( # pytype: disable=annotation-type-mismatch
944944
self.__helper.set_constraint_lower_bound(ct.index, lb - linear_expr)
945945
self.__helper.set_constraint_upper_bound(ct.index, ub - linear_expr)
946946
elif isinstance(linear_expr, LinearExpr):
947-
flat_expr = mbh.FlatExpression(linear_expr)
947+
flat_expr = mbh.FlatExpr(linear_expr)
948948
# pylint: disable=protected-access
949949
self.__helper.set_constraint_lower_bound(ct.index, lb - flat_expr.offset)
950950
self.__helper.set_constraint_upper_bound(ct.index, ub - flat_expr.offset)
@@ -1044,7 +1044,7 @@ def __optimize(self, linear_expr: LinearExprT, maximize: bool) -> None:
10441044
elif isinstance(linear_expr, Variable):
10451045
self.helper.set_var_objective_coefficient(linear_expr.index, 1.0)
10461046
elif isinstance(linear_expr, LinearExpr):
1047-
flat_expr = mbh.FlatExpression(linear_expr)
1047+
flat_expr = mbh.FlatExpr(linear_expr)
10481048
# pylint: disable=protected-access
10491049
self.helper.set_objective_offset(flat_expr.offset)
10501050
var_indices = [var.index for var in flat_expr.vars]
@@ -1070,7 +1070,7 @@ def objective_expression(self) -> "LinearExpr":
10701070
if coeff != 0.0:
10711071
variables.append(variable)
10721072
coefficients.append(coeff)
1073-
return mbh.FlatExpression(
1073+
return mbh.FlatExpr(
10741074
variables, coefficients, self.__helper.objective_offset()
10751075
)
10761076

ortools/linear_solver/python/model_builder_helper.cc

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ using ::operations_research::MPVariableProto;
5353
using ::operations_research::mb::AffineExpr;
5454
using ::operations_research::mb::BoundedLinearExpression;
5555
using ::operations_research::mb::FixedValue;
56-
using ::operations_research::mb::FlatExpression;
56+
using ::operations_research::mb::FlatExpr;
5757
using ::operations_research::mb::LinearExpr;
5858
using ::operations_research::mb::ModelBuilderHelper;
5959
using ::operations_research::mb::ModelSolverHelper;
@@ -232,9 +232,7 @@ LinearExpr* SumArguments(py::args args, const py::kwargs& kwargs) {
232232
}
233233
};
234234

235-
if (args.size() == 0) {
236-
return new FixedValue(0.0);
237-
} else if (args.size() == 1 && py::isinstance<py::sequence>(args[0])) {
235+
if (args.size() == 1 && py::isinstance<py::sequence>(args[0])) {
238236
// Normal list or tuple argument.
239237
py::sequence elements = args[0].cast<py::sequence>();
240238
linear_exprs.reserve(elements.size());
@@ -463,17 +461,17 @@ PYBIND11_MODULE(model_builder_helper, m) {
463461
});
464462

465463
// Expose Internal classes, mostly for testing.
466-
py::class_<FlatExpression, LinearExpr>(m, "FlatExpression")
464+
py::class_<FlatExpr, LinearExpr>(m, "FlatExpr")
467465
.def(py::init<const LinearExpr*>())
468466
.def(py::init<const LinearExpr*, const LinearExpr*>())
469467
.def(py::init<const std::vector<const Variable*>&,
470468
const std::vector<double>&, double>(),
471469
py::keep_alive<1, 2>())
472470
.def(py::init<double>())
473-
.def_property_readonly("vars", &FlatExpression::vars)
474-
.def("variable_indices", &FlatExpression::VarIndices)
475-
.def_property_readonly("coeffs", &FlatExpression::coeffs)
476-
.def_property_readonly("offset", &FlatExpression::offset);
471+
.def_property_readonly("vars", &FlatExpr::vars)
472+
.def("variable_indices", &FlatExpr::VarIndices)
473+
.def_property_readonly("coeffs", &FlatExpr::coeffs)
474+
.def_property_readonly("offset", &FlatExpr::offset);
477475

478476
py::class_<AffineExpr, LinearExpr>(m, "AffineExpr")
479477
.def(py::init<LinearExpr*, double, double>())

ortools/linear_solver/python/model_builder_test.py

Lines changed: 53 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131

3232
def build_dict(expr: mb.LinearExprT) -> Dict[mbh.Variable, float]:
3333
res = {}
34-
flat_expr = mbh.FlatExpression(expr)
34+
flat_expr = mbh.FlatExpr(expr)
3535
print(f"expr = {expr} flat_expr = {flat_expr}", flush=True)
3636
for var, coeff in zip(flat_expr.vars, flat_expr.coeffs):
3737
print(f"process {var} * {coeff}", flush=True)
@@ -209,7 +209,7 @@ def test_class_api(self):
209209
t = model.new_int_var(3, 10, "t")
210210

211211
e1 = mb.LinearExpr.sum([x, y, z])
212-
flat_e1 = mbh.FlatExpression(e1)
212+
flat_e1 = mbh.FlatExpr(e1)
213213
expected_vars = np.array([0, 1, 2], dtype=np.int32)
214214
np_testing.assert_array_equal(expected_vars, flat_e1.variable_indices())
215215
np_testing.assert_array_equal(
@@ -219,7 +219,7 @@ def test_class_api(self):
219219
self.assertEqual(e1.__str__(), "(x + y + z)")
220220

221221
e2 = mb.LinearExpr.sum([e1, 4.0])
222-
flat_e2 = mbh.FlatExpression(e2)
222+
flat_e2 = mbh.FlatExpr(e2)
223223
np_testing.assert_array_equal(expected_vars, flat_e2.variable_indices())
224224
np_testing.assert_array_equal(
225225
np.array([1, 1, 1], dtype=np.double), flat_e2.coeffs
@@ -229,7 +229,7 @@ def test_class_api(self):
229229
self.assertEqual(flat_e2.__str__(), "x + y + z + 4")
230230

231231
e3 = mb.LinearExpr.term(e2, 2)
232-
flat_e3 = mbh.FlatExpression(e3)
232+
flat_e3 = mbh.FlatExpr(e3)
233233
np_testing.assert_array_equal(expected_vars, flat_e3.variable_indices())
234234
np_testing.assert_array_equal(
235235
np.array([2, 2, 2], dtype=np.double), flat_e3.coeffs
@@ -239,7 +239,7 @@ def test_class_api(self):
239239
self.assertEqual(flat_e3.__str__(), "2 * x + 2 * y + 2 * z + 8")
240240

241241
e4 = mb.LinearExpr.weighted_sum([x, t], [-1, 1], constant=2)
242-
flat_e4 = mbh.FlatExpression(e4)
242+
flat_e4 = mbh.FlatExpr(e4)
243243
np_testing.assert_array_equal(
244244
np.array([0, 3], dtype=np.int32), flat_e4.variable_indices()
245245
)
@@ -250,7 +250,7 @@ def test_class_api(self):
250250
self.assertEqual(e4.__str__(), "(-x + t + 2)")
251251

252252
e4b = mb.LinearExpr.weighted_sum([e4 * 3], [1])
253-
flat_e4b = mbh.FlatExpression(e4b)
253+
flat_e4b = mbh.FlatExpr(e4b)
254254
np_testing.assert_array_equal(
255255
np.array([0, 3], dtype=np.int32), flat_e4b.variable_indices()
256256
)
@@ -261,7 +261,7 @@ def test_class_api(self):
261261
self.assertEqual(e4b.__str__(), "(3 * (-x + t + 2))")
262262

263263
e5 = mb.LinearExpr.sum([e1, -3, e4])
264-
flat_e5 = mbh.FlatExpression(e5)
264+
flat_e5 = mbh.FlatExpr(e5)
265265
np_testing.assert_array_equal(
266266
np.array([1, 2, 3], dtype=np.int32), flat_e5.variable_indices()
267267
)
@@ -272,7 +272,7 @@ def test_class_api(self):
272272
self.assertEqual(flat_e5.__str__(), "y + z + t - 1")
273273

274274
e6 = mb.LinearExpr.term(x, 2.0, constant=1.0)
275-
flat_e6 = mbh.FlatExpression(e6)
275+
flat_e6 = mbh.FlatExpr(e6)
276276
np_testing.assert_array_equal(
277277
np.array([0], dtype=np.int32), flat_e6.variable_indices()
278278
)
@@ -288,10 +288,36 @@ def test_class_api(self):
288288
e9 = mb.LinearExpr.term(x * 2 + 3, 1, constant=0)
289289
e10 = mb.LinearExpr.term(x, 2, constant=3)
290290
self.assertEqual(
291-
str(mbh.FlatExpression(e9)),
292-
str(mbh.FlatExpression(e10)),
291+
str(mbh.FlatExpr(e9)),
292+
str(mbh.FlatExpr(e10)),
293293
)
294294

295+
e10 = mb.LinearExpr.sum()
296+
self.assertEqual(str(e10), "0")
297+
298+
e11 = mb.LinearExpr.sum(x)
299+
self.assertIsInstance(e11, mb.Variable)
300+
self.assertEqual(x.index, e11.index)
301+
302+
e12 = mb.LinearExpr.sum(-1.0, x, 1.0)
303+
self.assertIsInstance(e12, mb.Variable)
304+
self.assertEqual(x.index, e12.index)
305+
306+
e13 = mb.LinearExpr.sum(-1.0, x, constant=1.0)
307+
self.assertIsInstance(e13, mb.Variable)
308+
self.assertEqual(x.index, e13.index)
309+
310+
e14 = mb.LinearExpr.weighted_sum([x, t, 1.2], [1, -1, -1.0], constant=2)
311+
flat_e14 = mbh.FlatExpr(e14)
312+
np_testing.assert_array_equal(
313+
np.array([0, 3], dtype=np.int32), flat_e14.variable_indices()
314+
)
315+
np_testing.assert_array_equal(
316+
np.array([1, -1], dtype=np.double), flat_e14.coeffs
317+
)
318+
self.assertEqual(flat_e14.offset, 0.8)
319+
self.assertEqual(e14.__str__(), "(x - t + 0.8)")
320+
295321
def test_variables(self):
296322
model = mb.Model()
297323
x = model.new_int_var(0.0, 4.0, "x")
@@ -580,27 +606,27 @@ def setUp(self):
580606
),
581607
# LinearExpression
582608
dict(
583-
testcase_name="FlatExpression(x.sum())",
584-
expr=lambda x, y: mbh.FlatExpression(x.sum()),
609+
testcase_name="FlatExpr(x.sum())",
610+
expr=lambda x, y: mbh.FlatExpr(x.sum()),
585611
expected_str="x[0] + x[1] + x[2]",
586612
),
587613
dict(
588-
testcase_name="FlatExpression(FlatExpression(x.sum()))",
614+
testcase_name="FlatExpr(FlatExpr(x.sum()))",
589615
# pylint: disable=g-long-lambda
590-
expr=lambda x, y: mbh.FlatExpression(mbh.FlatExpression(x.sum())),
616+
expr=lambda x, y: mbh.FlatExpr(mbh.FlatExpr(x.sum())),
591617
expected_str="x[0] + x[1] + x[2]",
592618
),
593619
dict(
594-
testcase_name="""FlatExpression(sum([
595-
FlatExpression(x.sum()),
596-
FlatExpression(x.sum()),
620+
testcase_name="""FlatExpr(sum([
621+
FlatExpr(x.sum()),
622+
FlatExpr(x.sum()),
597623
]))""",
598624
# pylint: disable=g-long-lambda
599-
expr=lambda x, y: mbh.FlatExpression(
625+
expr=lambda x, y: mbh.FlatExpr(
600626
sum(
601627
[
602-
mbh.FlatExpression(x.sum()),
603-
mbh.FlatExpression(x.sum()),
628+
mbh.FlatExpr(x.sum()),
629+
mbh.FlatExpr(x.sum()),
604630
]
605631
)
606632
),
@@ -610,7 +636,7 @@ def setUp(self):
610636
def test_str(self, expr, expected_str):
611637
x = self.x
612638
y = self.y
613-
self.assertEqual(str(mbh.FlatExpression(expr(x, y))), expected_str)
639+
self.assertEqual(str(mbh.FlatExpr(expr(x, y))), expected_str)
614640

615641

616642
class LinearBaseErrorsTest(absltest.TestCase):
@@ -623,7 +649,7 @@ class UnknownLinearType(mb.LinearExpr):
623649
def __init__(self):
624650
mb.LinearExpr.__init__(self)
625651

626-
mbh.FlatExpression(UnknownLinearType())
652+
mbh.FlatExpr(UnknownLinearType())
627653

628654
def test_division_by_zero(self):
629655
with self.assertRaises(ZeroDivisionError):
@@ -1483,8 +1509,8 @@ def assertLinearExpressionAlmostEqual(
14831509
expr2: mbh.LinearExpr,
14841510
) -> None:
14851511
"""Test that the two linear expressions are almost equal."""
1486-
flat_expr1 = mbh.FlatExpression(expr1)
1487-
flat_expr2 = mbh.FlatExpression(expr2)
1512+
flat_expr1 = mbh.FlatExpr(expr1)
1513+
flat_expr2 = mbh.FlatExpr(expr2)
14881514
self.assertEqual(len(flat_expr1.vars), len(flat_expr2.vars))
14891515
if len(flat_expr1.vars) > 0: # pylint: disable=g-explicit-length-test
14901516
self.assertSequenceEqual(flat_expr1.vars, flat_expr2.vars)
@@ -1511,7 +1537,6 @@ def test_set_objective(
15111537
x = model.new_var_series(name="x", index=variable_indices)
15121538
y = model.new_var_series(name="y", index=variable_indices)
15131539
objective_expression = expression(x, y)
1514-
print(f"objective_expression: {objective_expression}")
15151540
if is_maximize:
15161541
model.maximize(objective_expression)
15171542
else:
@@ -1529,7 +1554,7 @@ def test_set_new_objective(self):
15291554

15301555
# Set and check for old objective.
15311556
model.maximize(old_objective_expression)
1532-
flat_got_objective_expression = mbh.FlatExpression(model.objective_expression())
1557+
flat_got_objective_expression = mbh.FlatExpr(model.objective_expression())
15331558
self.assertEmpty(flat_got_objective_expression.vars)
15341559
self.assertEmpty(flat_got_objective_expression.coeffs)
15351560
self.assertAlmostEqual(flat_got_objective_expression.offset, 1)
@@ -1553,7 +1578,7 @@ def test_minimize(
15531578
model = mb.Model()
15541579
x = model.new_var_series(name="x", index=variable_indices)
15551580
y = model.new_var_series(name="y", index=variable_indices)
1556-
objective_expression = mbh.FlatExpression(expression(x, y))
1581+
objective_expression = mbh.FlatExpr(expression(x, y))
15571582
model.minimize(objective_expression)
15581583
got_objective_expression = model.objective_expression()
15591584
self.assertLinearExpressionAlmostEqual(
@@ -1572,7 +1597,7 @@ def test_maximize(
15721597
model = mb.Model()
15731598
x = model.new_var_series(name="x", index=variable_indices)
15741599
y = model.new_var_series(name="y", index=variable_indices)
1575-
objective_expression = mbh.FlatExpression(expression(x, y))
1600+
objective_expression = mbh.FlatExpr(expression(x, y))
15761601
model.maximize(objective_expression)
15771602
got_objective_expression = model.objective_expression()
15781603
self.assertLinearExpressionAlmostEqual(

0 commit comments

Comments
 (0)