コード例 #1
0
    def test_trivial_constraints_from_docplex_mp(self):
        """test trivial constraints of from_docplex_mp"""

        with self.subTest("trivial linear constraint"), self.assertWarns(
                UserWarning):
            mod = Model()
            x = mod.binary_var("x")
            mod.add_constraint(x + 1 <= x + 1)
            q_p = from_docplex_mp(mod)
            self.assertListEqual([v.name for v in q_p.variables], ["x"])
            self.assertEqual(q_p.get_num_linear_constraints(), 1)
            self.assertEqual(q_p.get_num_quadratic_constraints(), 0)
            lin = q_p.get_linear_constraint(0)
            self.assertEqual(lin.name, "c0")
            self.assertEqual(lin.sense, Constraint.Sense.LE)
            self.assertDictEqual(lin.linear.to_dict(), {})
            self.assertAlmostEqual(lin.rhs, 0)

        with self.subTest("trivial quadratic constraint"), self.assertWarns(
                UserWarning):
            mod = Model()
            x = mod.binary_var("x")
            mod.add_constraint(x * x == x * x)
            q_p = from_docplex_mp(mod)
            self.assertListEqual([v.name for v in q_p.variables], ["x"])
            self.assertEqual(q_p.get_num_linear_constraints(), 0)
            self.assertEqual(q_p.get_num_quadratic_constraints(), 1)
            quad = q_p.get_quadratic_constraint(0)
            self.assertEqual(quad.name, "q0")
            self.assertEqual(quad.sense, Constraint.Sense.EQ)
            self.assertDictEqual(quad.linear.to_dict(), {})
            self.assertDictEqual(quad.quadratic.to_dict(), {})
            self.assertAlmostEqual(quad.rhs, 0)

        with self.subTest("trivial indicator constraint"), self.assertWarns(
                UserWarning):
            mod = Model()
            x = mod.binary_var("x")
            mod.add_indicator(x, x + 1 >= x + 1)
            q_p = from_docplex_mp(mod)
            self.assertListEqual([v.name for v in q_p.variables], ["x"])
            self.assertEqual(q_p.get_num_linear_constraints(), 1)
            self.assertEqual(q_p.get_num_quadratic_constraints(), 0)
            ind = q_p.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind0")
            self.assertEqual(ind.sense, Constraint.Sense.GE)
            self.assertDictEqual(ind.linear.to_dict(), {})
            self.assertAlmostEqual(ind.rhs, 0)
コード例 #2
0
 def test_from_without_variable_names(self):
     """test from_docplex_mp without explicit variable names"""
     mod = Model()
     x = mod.binary_var()
     y = mod.continuous_var()
     z = mod.integer_var()
     mod.minimize(x + y + z + x * y + y * z + x * z)
     mod.add_constraint(x + y == z)  # linear EQ
     mod.add_constraint(x + y >= z)  # linear GE
     mod.add_constraint(x + y <= z)  # linear LE
     mod.add_constraint(x * y == z)  # quadratic EQ
     mod.add_constraint(x * y >= z)  # quadratic GE
     mod.add_constraint(x * y <= z)  # quadratic LE
     q_p = from_docplex_mp(mod)
     var_names = [v.name for v in q_p.variables]
     self.assertListEqual(var_names, ["x0", "x1", "x2"])
     senses = [
         Constraint.Sense.EQ, Constraint.Sense.GE, Constraint.Sense.LE
     ]
     for i, c in enumerate(q_p.linear_constraints):
         self.assertDictEqual(c.linear.to_dict(use_name=True), {
             "x0": 1,
             "x1": 1,
             "x2": -1
         })
         self.assertEqual(c.rhs, 0)
         self.assertEqual(c.sense, senses[i])
     for i, c in enumerate(q_p.quadratic_constraints):
         self.assertEqual(c.rhs, 0)
         self.assertDictEqual(c.linear.to_dict(use_name=True), {"x2": -1})
         self.assertDictEqual(c.quadratic.to_dict(use_name=True),
                              {("x0", "x1"): 1})
         self.assertEqual(c.sense, senses[i])
コード例 #3
0
    def test_from_and_to(self):
        """test from_docplex_mp and to_docplex_mp"""
        q_p = QuadraticProgram("test")
        q_p.binary_var(name="x")
        q_p.integer_var(name="y", lowerbound=-2, upperbound=4)
        q_p.continuous_var(name="z", lowerbound=-1.5, upperbound=3.2)
        q_p.minimize(
            constant=1,
            linear={
                "x": 1,
                "y": 2
            },
            quadratic={
                ("x", "y"): -1,
                ("z", "z"): 2
            },
        )
        q_p.linear_constraint({"x": 2, "z": -1}, "==", 1)
        q_p.quadratic_constraint({"x": 2, "z": -1}, {("y", "z"): 3}, "==", 1)
        q_p2 = from_docplex_mp(to_docplex_mp(q_p))
        self.assertEqual(q_p.export_as_lp_string(), q_p2.export_as_lp_string())

        mod = Model("test")
        x = mod.binary_var("x")
        y = mod.integer_var(-2, 4, "y")
        z = mod.continuous_var(-1.5, 3.2, "z")
        mod.minimize(1 + x + 2 * y - x * y + 2 * z * z)
        mod.add(2 * x - z == 1, "c0")
        mod.add(2 * x - z + 3 * y * z == 1, "q0")
        self.assertEqual(q_p.export_as_lp_string(), mod.export_as_lp_string())
コード例 #4
0
    def test_unsupported_features(self):
        """Test unsupported features"""
        with self.subTest("semiinteget_var"), self.assertRaises(
                QiskitOptimizationError):
            mod = Model()
            mod.semiinteger_var(lb=1, name="x")
            _ = from_docplex_mp(mod)

        with self.subTest("range constraint"), self.assertRaises(
                QiskitOptimizationError):
            mod = Model()
            x = mod.binary_var("x")
            mod.add_range(0, 2 * x, 1)
            _ = from_docplex_mp(mod)

        with self.subTest("equivalence constraint"), self.assertRaises(
                QiskitOptimizationError):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.binary_var("y")
            mod.add_equivalence(x, x + y <= 1, 1)
            _ = from_docplex_mp(mod)

        with self.subTest("not equal constraint"), self.assertRaises(
                QiskitOptimizationError):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.binary_var("y")
            mod.add(x != y)
            _ = from_docplex_mp(mod)

        with self.subTest("logical expression"), self.assertRaises(
                QiskitOptimizationError):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.binary_var("y")
            mod.add(mod.logical_and(x, y))
            _ = from_docplex_mp(mod)

        with self.subTest("PWL constraint"), self.assertRaises(
                QiskitOptimizationError):
            mod = Model()
            x = mod.binary_var("x")
            mod.add(mod.piecewise(-1, [(0, 0)], 1)(x) <= 1)
            _ = from_docplex_mp(mod)

        with self.subTest("lazy constraint"), self.assertRaises(
                QiskitOptimizationError):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.binary_var("y")
            mod.add_lazy_constraint(x + y <= 1)
            _ = from_docplex_mp(mod)

        with self.subTest("user cut constraint"), self.assertRaises(
                QiskitOptimizationError):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.binary_var("y")
            mod.add_user_cut_constraint(x + y <= 1)
            _ = from_docplex_mp(mod)

        with self.subTest("sos1"), self.assertRaises(QiskitOptimizationError):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.binary_var("y")
            mod.add_sos1([x, y])
            _ = from_docplex_mp(mod)

        with self.subTest("sos2"), self.assertRaises(QiskitOptimizationError):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.binary_var("y")
            z = mod.binary_var("z")
            mod.add_sos2([x, y, z])
            _ = from_docplex_mp(mod)
コード例 #5
0
    def test_indicator_constraints(self):
        """Test indicator constraints"""
        with self.subTest("active 0, sense <="):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=0,
                              linear_ct=(y + 2 * z <= 1),
                              name="ind")
            quad_prog = from_docplex_mp(mod)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 1)
            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind")
            self.assertEqual(ind.sense, Constraint.Sense.LE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": -5.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, 1)

        with self.subTest("active 0, sense >="):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=0,
                              linear_ct=(y + 2 * z >= 1),
                              name="ind")
            quad_prog = from_docplex_mp(mod)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 1)
            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind")
            self.assertEqual(ind.sense, Constraint.Sense.GE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": 4.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, 1)

        with self.subTest("active 1, sense <="):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=1,
                              linear_ct=(y + 2 * z <= 1),
                              name="ind")
            quad_prog = from_docplex_mp(mod)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 1)
            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind")
            self.assertEqual(ind.sense, Constraint.Sense.LE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": 5.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, 6)

        with self.subTest("active 1, sense >="):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=1,
                              linear_ct=(y + 2 * z >= 1),
                              name="ind")
            quad_prog = from_docplex_mp(mod)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 1)
            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind")
            self.assertEqual(ind.sense, Constraint.Sense.GE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": -4.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, -3)

        with self.subTest("active 0, sense =="):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=0,
                              linear_ct=(y + 2 * z == 1),
                              name="ind")
            quad_prog = from_docplex_mp(mod)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 2)

            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind_LE")
            self.assertEqual(ind.sense, Constraint.Sense.LE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": -5.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, 1)

            ind = quad_prog.get_linear_constraint(1)
            self.assertEqual(ind.name, "ind_GE")
            self.assertEqual(ind.sense, Constraint.Sense.GE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": 4.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, 1)

        with self.subTest("active 1, sense =="):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=1,
                              linear_ct=(y + 2 * z == 1),
                              name="ind")
            quad_prog = from_docplex_mp(mod)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 2)

            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind_LE")
            self.assertEqual(ind.sense, Constraint.Sense.LE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": 5.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, 6)

            ind = quad_prog.get_linear_constraint(1)
            self.assertEqual(ind.name, "ind_GE")
            self.assertEqual(ind.sense, Constraint.Sense.GE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": -4.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, -3)

        with self.subTest("active 0, sense <=, indicator_big_m"):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=0,
                              linear_ct=(y + 2 * z <= 1),
                              name="ind")
            quad_prog = from_docplex_mp(mod, indicator_big_m=100)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 1)
            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind")
            self.assertEqual(ind.sense, Constraint.Sense.LE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": -100.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, 1)

        with self.subTest("active 0, sense >=, indicator_big_m"):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=0,
                              linear_ct=(y + 2 * z >= 1),
                              name="ind")
            quad_prog = from_docplex_mp(mod, indicator_big_m=100)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 1)
            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind")
            self.assertEqual(ind.sense, Constraint.Sense.GE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": 100.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, 1)

        with self.subTest("active 1, sense <=, indicator_big_m"):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=1,
                              linear_ct=(y + 2 * z <= 1),
                              name="ind")
            quad_prog = from_docplex_mp(mod, indicator_big_m=100)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 1)
            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind")
            self.assertEqual(ind.sense, Constraint.Sense.LE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": 100.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, 101)

        with self.subTest("active 1, sense >=, indicator_big_m"):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=1,
                              linear_ct=(y + 2 * z >= 1),
                              name="ind")
            quad_prog = from_docplex_mp(mod, indicator_big_m=100)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 1)
            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind")
            self.assertEqual(ind.sense, Constraint.Sense.GE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": -100.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, -99)

        with self.subTest("active 0, sense ==, indicator_big_m"):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=0,
                              linear_ct=(y + 2 * z == 1),
                              name="ind")
            quad_prog = from_docplex_mp(mod, indicator_big_m=100)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 2)

            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind_LE")
            self.assertEqual(ind.sense, Constraint.Sense.LE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": -100.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, 1)

            ind = quad_prog.get_linear_constraint(1)
            self.assertEqual(ind.name, "ind_GE")
            self.assertEqual(ind.sense, Constraint.Sense.GE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": 100.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, 1)

        with self.subTest("active 1, sense ==, indicator_big_m"):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=1,
                              linear_ct=(y + 2 * z == 1),
                              name="ind")
            quad_prog = from_docplex_mp(mod, indicator_big_m=100)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 2)

            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind_LE")
            self.assertEqual(ind.sense, Constraint.Sense.LE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": 100.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, 101)

            ind = quad_prog.get_linear_constraint(1)
            self.assertEqual(ind.name, "ind_GE")
            self.assertEqual(ind.sense, Constraint.Sense.GE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": -100.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, -99)

        with self.subTest("active 0, sense <=, obvious bound"):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=0,
                              linear_ct=(y + 2 * z <= 10),
                              name="ind")
            quad_prog = from_docplex_mp(mod)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 1)
            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind")
            self.assertEqual(ind.sense, Constraint.Sense.LE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, 10)

        with self.subTest("active 0, sense >=, obvious bound"):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=0,
                              linear_ct=(y + 2 * z >= -10),
                              name="ind")
            quad_prog = from_docplex_mp(mod)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 1)
            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind")
            self.assertEqual(ind.sense, Constraint.Sense.GE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, -10)

        with self.subTest("active 1, sense <=, obvious bound"):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=1,
                              linear_ct=(y + 2 * z <= 10),
                              name="ind")
            quad_prog = from_docplex_mp(mod)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 1)
            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind")
            self.assertEqual(ind.sense, Constraint.Sense.LE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, 10)

        with self.subTest("active 1, sense >=, obvious bound"):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=1,
                              linear_ct=(y + 2 * z >= -10),
                              name="ind")
            quad_prog = from_docplex_mp(mod)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 1)
            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind")
            self.assertEqual(ind.sense, Constraint.Sense.GE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, -10)

        with self.subTest("active 0, sense ==, too small rhs"):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=0,
                              linear_ct=(y + 2 * z == -10),
                              name="ind")
            quad_prog = from_docplex_mp(mod)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 2)

            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind_LE")
            self.assertEqual(ind.sense, Constraint.Sense.LE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": -16.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, -10)

            ind = quad_prog.get_linear_constraint(1)
            self.assertEqual(ind.name, "ind_GE")
            self.assertEqual(ind.sense, Constraint.Sense.GE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, -10)

        with self.subTest("active 0, sense ==, too large rhs"):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=0,
                              linear_ct=(y + 2 * z == 10),
                              name="ind")
            quad_prog = from_docplex_mp(mod)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 2)

            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind_LE")
            self.assertEqual(ind.sense, Constraint.Sense.LE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, 10)

            ind = quad_prog.get_linear_constraint(1)
            self.assertEqual(ind.name, "ind_GE")
            self.assertEqual(ind.sense, Constraint.Sense.GE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": 13,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, 10)

        with self.subTest("active 1, sense ==, too small rhs"):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=1,
                              linear_ct=(y + 2 * z == -10),
                              name="ind")
            quad_prog = from_docplex_mp(mod)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 2)

            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind_LE")
            self.assertEqual(ind.sense, Constraint.Sense.LE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": 16.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, 6)

            ind = quad_prog.get_linear_constraint(1)
            self.assertEqual(ind.name, "ind_GE")
            self.assertEqual(ind.sense, Constraint.Sense.GE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, -10)

        with self.subTest("active 1, sense ==, too large rhs"):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.integer_var(lb=-1, ub=2, name="y")
            z = mod.continuous_var(lb=-1, ub=2, name="z")
            mod.add_indicator(binary_var=x,
                              active_value=1,
                              linear_ct=(y + 2 * z == 10),
                              name="ind")
            quad_prog = from_docplex_mp(mod)
            self.assertEqual(quad_prog.get_num_linear_constraints(), 2)

            ind = quad_prog.get_linear_constraint(0)
            self.assertEqual(ind.name, "ind_LE")
            self.assertEqual(ind.sense, Constraint.Sense.LE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, 10)

            ind = quad_prog.get_linear_constraint(1)
            self.assertEqual(ind.name, "ind_GE")
            self.assertEqual(ind.sense, Constraint.Sense.GE)
            self.assertDictEqual(ind.linear.to_dict(use_name=True), {
                "x": -13.0,
                "y": 1.0,
                "z": 2.0
            })
            self.assertEqual(ind.rhs, -3)
コード例 #6
0
    def test_logical_expressions(self):
        """test from_docplex_mp with logical expressions"""

        with self.subTest("logical NOT"):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.logical_not(x)
            mod.add_constraint(y <= 1)
            mod.add_constraint(y**2 == 2)
            q_p = from_docplex_mp(mod)
            self.assertListEqual([v.name for v in q_p.variables],
                                 ["x", "_not1"])
            self.assertEqual(q_p.get_num_linear_constraints(), 2)

            lin = q_p.get_linear_constraint(0)
            self.assertEqual(lin.name, "c0")
            self.assertEqual(lin.sense, Constraint.Sense.EQ)
            self.assertDictEqual(lin.linear.to_dict(use_name=True), {
                "x": 1,
                "_not1": 1
            })
            self.assertAlmostEqual(lin.rhs, 1)

            lin = q_p.get_linear_constraint(1)
            self.assertEqual(lin.name, "c1")
            self.assertEqual(lin.sense, Constraint.Sense.LE)
            self.assertDictEqual(lin.linear.to_dict(use_name=True),
                                 {"_not1": 1})
            self.assertAlmostEqual(lin.rhs, 1)

            self.assertEqual(q_p.get_num_quadratic_constraints(), 1)
            quad = q_p.get_quadratic_constraint(0)
            self.assertEqual(quad.name, "q0")
            self.assertEqual(quad.sense, Constraint.Sense.EQ)
            self.assertDictEqual(quad.linear.to_dict(), {})
            self.assertDictEqual(quad.quadratic.to_dict(use_name=True),
                                 {("_not1", "_not1"): 1})
            self.assertAlmostEqual(quad.rhs, 2)

        with self.subTest("logical AND"):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.binary_var("y")
            z = mod.logical_and(x, y)
            mod.add_constraint(z <= 1)
            mod.add_constraint(z**2 == 2)
            q_p = from_docplex_mp(mod)
            self.assertListEqual([v.name for v in q_p.variables],
                                 ["x", "y", "_and2"])
            self.assertEqual(q_p.get_num_linear_constraints(), 4)

            lin = q_p.get_linear_constraint(0)
            self.assertEqual(lin.name, "c0")
            self.assertEqual(lin.sense, Constraint.Sense.LE)
            self.assertDictEqual(lin.linear.to_dict(use_name=True), {
                "x": -1,
                "_and2": 1
            })
            self.assertAlmostEqual(lin.rhs, 0)

            lin = q_p.get_linear_constraint(1)
            self.assertEqual(lin.name, "c1")
            self.assertEqual(lin.sense, Constraint.Sense.LE)
            self.assertDictEqual(lin.linear.to_dict(use_name=True), {
                "y": -1,
                "_and2": 1
            })
            self.assertAlmostEqual(lin.rhs, 0)

            lin = q_p.get_linear_constraint(2)
            self.assertEqual(lin.name, "c2")
            self.assertEqual(lin.sense, Constraint.Sense.GE)
            self.assertDictEqual(lin.linear.to_dict(use_name=True), {
                "x": -1,
                "y": -1,
                "_and2": 1
            })
            self.assertAlmostEqual(lin.rhs, -1)

            lin = q_p.get_linear_constraint(3)
            self.assertEqual(lin.name, "c3")
            self.assertEqual(lin.sense, Constraint.Sense.LE)
            self.assertDictEqual(lin.linear.to_dict(use_name=True),
                                 {"_and2": 1})
            self.assertAlmostEqual(lin.rhs, 1)

            self.assertEqual(q_p.get_num_quadratic_constraints(), 1)
            quad = q_p.get_quadratic_constraint(0)
            self.assertEqual(quad.name, "q0")
            self.assertEqual(quad.sense, Constraint.Sense.EQ)
            self.assertDictEqual(quad.linear.to_dict(), {})
            self.assertDictEqual(quad.quadratic.to_dict(use_name=True),
                                 {("_and2", "_and2"): 1})
            self.assertAlmostEqual(quad.rhs, 2)

        with self.subTest("logical OR"):
            mod = Model()
            x = mod.binary_var("x")
            y = mod.binary_var("y")
            z = mod.logical_or(x, y)
            mod.add_constraint(z <= 1)
            mod.add_constraint(z**2 == 2)
            q_p = from_docplex_mp(mod)
            self.assertListEqual([v.name for v in q_p.variables],
                                 ["x", "y", "_or2"])
            self.assertEqual(q_p.get_num_linear_constraints(), 4)

            lin = q_p.get_linear_constraint(0)
            self.assertEqual(lin.name, "c0")
            self.assertEqual(lin.sense, Constraint.Sense.LE)
            self.assertDictEqual(lin.linear.to_dict(use_name=True), {
                "x": 1,
                "_or2": -1
            })
            self.assertAlmostEqual(lin.rhs, 0)

            lin = q_p.get_linear_constraint(1)
            self.assertEqual(lin.name, "c1")
            self.assertEqual(lin.sense, Constraint.Sense.LE)
            self.assertDictEqual(lin.linear.to_dict(use_name=True), {
                "y": 1,
                "_or2": -1
            })
            self.assertAlmostEqual(lin.rhs, 0)

            lin = q_p.get_linear_constraint(2)
            self.assertEqual(lin.name, "c2")
            self.assertEqual(lin.sense, Constraint.Sense.LE)
            self.assertDictEqual(lin.linear.to_dict(use_name=True), {
                "x": -1,
                "y": -1,
                "_or2": 1
            })
            self.assertAlmostEqual(lin.rhs, 0)

            lin = q_p.get_linear_constraint(3)
            self.assertEqual(lin.name, "c3")
            self.assertEqual(lin.sense, Constraint.Sense.LE)
            self.assertDictEqual(lin.linear.to_dict(use_name=True),
                                 {"_or2": 1})
            self.assertAlmostEqual(lin.rhs, 1)

            self.assertEqual(q_p.get_num_quadratic_constraints(), 1)
            quad = q_p.get_quadratic_constraint(0)
            self.assertEqual(quad.name, "q0")
            self.assertEqual(quad.sense, Constraint.Sense.EQ)
            self.assertDictEqual(quad.linear.to_dict(), {})
            self.assertDictEqual(quad.quadratic.to_dict(use_name=True),
                                 {("_or2", "_or2"): 1})
            self.assertAlmostEqual(quad.rhs, 2)