def test_typical(self): i, j, k = dimod.Integers('ijk') cqm = CQM() cqm.set_objective(2 * i * i + i * k) label = cqm.add_constraint(-3 * i * i + 4 * j * j <= 5) mapping = cqm.substitute_self_loops() self.assertIn('i', mapping) self.assertIn('j', mapping) self.assertEqual(len(mapping), 2) self.assertEqual(cqm.objective.quadratic, { ('k', 'i'): 1, (mapping['i'], 'i'): 2 }) self.assertEqual(cqm.constraints[label].lhs.quadratic, { (mapping['i'], 'i'): -3.0, (mapping['j'], 'j'): 4.0 }) self.assertEqual(len(cqm.constraints), 3) for v, new in mapping.items(): self.assertIn(new, cqm.constraints) self.assertEqual(cqm.constraints[new].sense, Sense.Eq) self.assertEqual(cqm.constraints[new].lhs.linear, {v: 1, new: -1}) self.assertEqual(cqm.constraints[new].rhs, 0)
def test_typedvariables(self): cqm = CQM() x = Binary('x') s = Spin('s') i = Integer('i') cqm.set_objective(x + i) cqm.add_constraint(i + s <= 1) with self.assertWarns(DeprecationWarning): self.assertEqual(cqm.variables.lower_bounds, {'x': 0.0, 'i': 0.0, 's': -1.0}) with self.assertWarns(DeprecationWarning): self.assertEqual(cqm.variables.upper_bounds, {'x': 1.0, 'i': 9007199254740991.0, 's': 1}) with self.assertWarns(DeprecationWarning): self.assertEqual(len(cqm.variables.lower_bounds), 3) with self.assertWarns(DeprecationWarning): self.assertEqual(len(cqm.variables.upper_bounds), 3) with self.assertWarns(DeprecationWarning): self.assertEqual(list(cqm.variables.vartypes), [dimod.BINARY, dimod.INTEGER, dimod.SPIN]) with self.assertWarns(DeprecationWarning): self.assertIs(cqm.variables.vartype('x'), dimod.BINARY)
def test_terms_integer_bounds(self): # bug report: https://github.com/dwavesystems/dimod/issues/943 cqm = CQM() i = Integer('i', lower_bound=-1, upper_bound=5) cqm.set_objective(i) label = cqm.add_constraint([('i', 1)], sense='<=') # failing in #943 self.assertEqual(cqm.constraints[label].lhs.lower_bound('i'), -1) self.assertEqual(cqm.constraints[label].lhs.upper_bound('i'), 5)
def test_construction(self): cqm = CQM() cqm.set_objective(dimod.AdjVectorBQM({'ab': 1}, 'SPIN')) label = cqm.add_constraint(dimod.AdjVectorBQM({'ab': 1}, 'SPIN'), sense='==', rhs=1) self.assertIsInstance(cqm.objective, BQM) self.assertIsInstance(cqm.constraints[label].lhs, BQM)
def test_construction(self): cqm = CQM() with self.assertWarns(DeprecationWarning): bqm = dimod.AdjVectorBQM({'ab': 1}, 'SPIN') cqm.set_objective(bqm) label = cqm.add_constraint(bqm, sense='==', rhs=1) self.assertIsInstance(cqm.objective, dimod.QuadraticModel) self.assertIsInstance(cqm.constraints[label].lhs, BQM)
def test_later_defn(self): i0 = Integer('i') i1 = Integer('i', upper_bound=1) cqm = CQM() cqm.add_variable('i', 'INTEGER') cqm.set_objective(i0) with self.assertRaises(ValueError): cqm.add_constraint(i1 <= 1) cqm.add_variable('i', 'INTEGER')
def test_terms_objective(self): cqm = CQM() a = cqm.add_variable('a', 'BINARY') b = cqm.add_variable('b', 'BINARY') c = cqm.add_variable('c', 'INTEGER') cqm.set_objective([(a, b, 1), (b, 2.5,), (3,), (c, 1.5)]) energy = cqm.objective.energy({'a': 1, 'b': 0, 'c': 10}) self.assertAlmostEqual(energy, 18) energy = cqm.objective.energy({'a': 1, 'b': 1, 'c': 3}) self.assertAlmostEqual(energy, 11)
def test_inconsistent(self): i0 = Integer('i') i1 = Integer('i', upper_bound=1) i2 = Integer('i', lower_bound=-2) cqm = CQM() cqm.set_objective(i0) with self.assertRaises(ValueError): cqm.add_constraint(i1 <= 1) cqm = CQM() cqm.add_constraint(i0 <= 1) with self.assertRaises(ValueError): cqm.set_objective(i2)
def test_deepcopy(self): from copy import deepcopy cqm = CQM() x = Binary('x') s = Spin('s') i = Integer('i') cqm.set_objective(i + s + x) constraint = cqm.add_constraint(i + s + x <= 1) new = deepcopy(cqm) self.assertTrue(new.objective.is_equal(cqm.objective)) self.assertTrue(new.constraints[constraint].lhs.is_equal(cqm.constraints[constraint].lhs))
def test_functional(self): cqm = CQM() bqm = BQM({'a': -1}, {'ab': 1}, 1.5, 'SPIN') cqm.add_constraint(bqm, '<=') cqm.add_constraint(bqm, '>=') cqm.set_objective(BQM({'c': -1}, {}, 'SPIN')) cqm.add_constraint(Spin('a')*Integer('d')*5 <= 3) new = CQM.from_file(cqm.to_file()) self.assertTrue(cqm.objective.is_equal(new.objective)) self.assertEqual(set(cqm.constraints), set(new.constraints)) for label, constraint in cqm.constraints.items(): self.assertTrue(constraint.lhs.is_equal(new.constraints[label].lhs)) self.assertEqual(constraint.rhs, new.constraints[label].rhs) self.assertEqual(constraint.sense, new.constraints[label].sense)
def test_header(self): from dimod.serialization.fileview import read_header cqm = CQM() x = Binary('x') s = Spin('s') i = Integer('i') cqm.set_objective(x + 3*i + s*x) cqm.add_constraint(x*s + x <= 5) cqm.add_constraint(i*i + i*s <= 4) header_info = read_header(cqm.to_file(), b'DIMODCQM') self.assertEqual(header_info.data, {'num_biases': 11, 'num_constraints': 2, 'num_quadratic_variables': 4, 'num_variables': 3})
def test_set(self): cqm = CQM() cqm.set_objective(Integer('a') * 5) self.assertTrue(cqm.objective.is_equal(Integer('a') * 5))
def test_set(self): cqm = CQM() cqm.set_objective(Spin('a') * 5) self.assertEqual(cqm.objective, Spin('a') * 5)