def test_equality(self): self.assertEqual(Binary("a"), Binary("a")) self.assertNotEqual(Binary("a"), Binary("b")) exp1 = Binary("a") + 2 exp2 = Binary("a") + 2 exp3 = Binary("b") + 2 self.assertEqual(exp1, exp2) self.assertNotEqual(exp1, exp3) mul1 = Placeholder("p") * Binary("b") mul2 = Placeholder("p") * Binary("b") mul3 = Placeholder("p") * Binary("a") self.assertEqual(mul1, mul2) self.assertNotEqual(mul1, mul3) class CustomPenalty(WithPenalty): def __init__(self, hamiltonian, penalty, label="label"): super().__init__(hamiltonian, penalty, label) a, b = Binary("a"), Binary("b") p1 = 1 + CustomPenalty(a + b, a * b) p2 = 1 + CustomPenalty(a + b, a * b) p3 = 1 + CustomPenalty(a * b, a + b) self.assertEqual(p1, p2) self.assertNotEqual(p1, p3) subh1 = SubH(a + b, label="c1") subh2 = SubH(a + b, label="c1") subh3 = SubH(a + b, label="c2") self.assertEqual(subh1, subh2) self.assertNotEqual(subh1, subh3)
def test_namespaces(self): s1, s2, s3 = Spin("s1"), Spin("s2"), Spin("s3") H = (SubH(2 * s1 + 4 * s2, "n1") + SubH(6 * s3 + s2, "n2"))**2 model = H.compile() self.assertTrue(model.namespaces[0]['n1'] == {'s1', 's2'}) self.assertTrue(model.namespaces[0]['n2'] == {'s2', 's3'})
def test_or_from_vars(self): a, b, c = Binary("a"), Binary("b"), Binary("c") exp = (SubH(a + b, 'n1') + SubH(b + c, 'n2'))**2 model = exp.compile() set_x = VarSetFromVarLabels([a, b]) set_y = VarSetFromVarLabels([b, c]) set_z = OrVars(set_x, set_y) self.assertTrue(set_x.var_names(model) == {'a', 'b'}) self.assertTrue(set_y.var_names(model) == {'b', 'c'}) self.assertTrue(set_z.var_names(model) == {'a', 'b', 'c'})
def test_and_from_model(self): a, b, c = Binary("a"), Binary("b"), Binary("c") exp = (SubH(a + b, 'n1') + SubH(b + c, 'n2'))**2 model = exp.compile() set_x = VarSetFromSubH('n1') set_y = VarSetFromSubH('n2') set_z = AndVars(set_x, set_y) self.assertTrue(set_x.var_names(model) == {'a', 'b'}) self.assertTrue(set_y.var_names(model) == {'b', 'c'}) self.assertTrue(set_z.var_names(model) == {'b'})
def test_compile_subh(self): a, b = Binary("a"), Binary("b") p = Placeholder("p") exp = p * SubH((a + b - 1)**2, label="subh") + a * b expected_qubo = {('a', 'a'): -3.0, ('a', 'b'): 7.0, ('b', 'b'): -3.0} expected_offset = 3 feed_dict = {"p": 3} self.compile_check(exp, expected_qubo, expected_offset, feed_dict)
def __init__(self, label, value_range, strength): lower, upper = value_range assert upper > lower, "upper value should be larger than lower value" assert isinstance(lower, int) assert isinstance(upper, int) assert isinstance(strength, int) or isinstance(strength, float) or\ isinstance(strength, Placeholder) self._num_variables = (upper - lower + 1) self.array = Array.create(label, shape=self._num_variables, vartype='BINARY') self.constraint = Constraint((sum(self.array)-1)**2, label=label+"_const", condition=lambda x: x==0) express = SubH(lower + sum(i*x for i, x in enumerate(self.array)), label=label) penalty = self.constraint * strength super().__init__( label=label, value_range=value_range, express=express, penalty=penalty)
def test_decode_sample(self): x = Array.create("x", (2, 2), vartype="BINARY") exp = SubH((x[1, 1] + x[0, 1] + x[0, 0] - 1)**2, label="const") model = exp.compile() # type of solution is dict[label, int] ## vartype = BINARY sample = {'x[0][1]': 1, 'x[1][1]': 1, 'x[0][0]': 0} decoded_sample = model.decode_sample(sample, vartype="BINARY") self.assertTrue(decoded_sample.sample == sample) self.assertTrue( len([ label for label, energy in decoded_sample.subh.items() if energy > 0 ]) == 1) self.assertTrue(decoded_sample.energy == 1) self.assertTrue(decoded_sample.array("x", (0, 0)) == 0) self.assertTrue(decoded_sample.array("x", (0, 1)) == 1) self.assertTrue(decoded_sample.array("x", (1, 1)) == 1) sample = {'x[0][1]': 1, 'x[1][1]': 0, 'x[0][0]': 0} decoded_sample = model.decode_sample(sample, vartype="BINARY") self.assertTrue(decoded_sample.sample == sample) self.assertTrue( len([ label for label, energy in decoded_sample.subh.items() if energy > 0 ]) == 0) self.assertTrue(decoded_sample.energy == 0) self.assertTrue(decoded_sample.array("x", (0, 0)) == 0) self.assertTrue(decoded_sample.array("x", (0, 1)) == 1) self.assertTrue(decoded_sample.array("x", (1, 1)) == 0) ## vartype = SPIN sample = {'x[0][1]': 1, 'x[1][1]': 1, 'x[0][0]': -1} decoded_sample = model.decode_sample(sample, vartype="SPIN") self.assertTrue(decoded_sample.sample == sample) self.assertTrue( len([ label for label, energy in decoded_sample.subh.items() if energy > 0 ]) == 1) self.assertTrue(decoded_sample.energy == 1) self.assertTrue(decoded_sample.array("x", (0, 0)) == -1) self.assertTrue(decoded_sample.array("x", (0, 1)) == 1) self.assertTrue(decoded_sample.array("x", (1, 1)) == 1) sample = {'x[0][1]': 1, 'x[1][1]': -1, 'x[0][0]': -1} decoded_sample = model.decode_sample(sample, vartype="SPIN") self.assertTrue(decoded_sample.sample == sample) self.assertTrue( len([ label for label, energy in decoded_sample.subh.items() if energy > 0 ]) == 0) self.assertTrue(decoded_sample.energy == 0) self.assertTrue(decoded_sample.array("x", (0, 0)) == -1) self.assertTrue(decoded_sample.array("x", (0, 1)) == 1) self.assertTrue(decoded_sample.array("x", (1, 1)) == -1) # type of solution is list[int] ## vartype = BINARY sample = {'x[0][1]': 1, 'x[1][1]': 0, 'x[0][0]': 1} list_sample = [sample[v] for v in model.variables] decoded_sample = model.decode_sample(list_sample, vartype="BINARY") self.assertTrue(decoded_sample.sample == sample) self.assertTrue( len([ label for label, energy in decoded_sample.subh.items() if energy > 0 ]) == 1) self.assertTrue(decoded_sample.energy == 1) self.assertTrue(decoded_sample.array("x", (0, 0)) == 1) self.assertTrue(decoded_sample.array("x", (0, 1)) == 1) self.assertTrue(decoded_sample.array("x", (1, 1)) == 0) sample = {'x[0][1]': 1, 'x[1][1]': 0, 'x[0][0]': 0} list_sample = [sample[v] for v in model.variables] decoded_sample = model.decode_sample(list_sample, vartype="BINARY") self.assertTrue(decoded_sample.sample == sample) self.assertTrue( len([ label for label, energy in decoded_sample.subh.items() if energy > 0 ]) == 0) self.assertTrue(decoded_sample.energy == 0) self.assertTrue(decoded_sample.array("x", (0, 0)) == 0) self.assertTrue(decoded_sample.array("x", (0, 1)) == 1) self.assertTrue(decoded_sample.array("x", (1, 1)) == 0) ## vartype = SPIN sample = {'x[0][1]': 1, 'x[1][1]': 1, 'x[0][0]': -1} list_sample = [sample[v] for v in model.variables] decoded_sample = model.decode_sample(list_sample, vartype="SPIN") self.assertTrue(decoded_sample.sample == sample) self.assertTrue( len([ label for label, energy in decoded_sample.subh.items() if energy > 0 ]) == 1) self.assertTrue(decoded_sample.energy == 1) self.assertTrue(decoded_sample.array("x", (0, 0)) == -1) self.assertTrue(decoded_sample.array("x", (0, 1)) == 1) self.assertTrue(decoded_sample.array("x", (1, 1)) == 1) sample = {'x[0][1]': 1, 'x[1][1]': -1, 'x[0][0]': -1} list_sample = [sample[v] for v in model.variables] decoded_sample = model.decode_sample(list_sample, vartype="SPIN") self.assertTrue(decoded_sample.sample == sample) self.assertTrue( len([ label for label, energy in decoded_sample.subh.items() if energy > 0 ]) == 0) self.assertTrue(decoded_sample.energy == 0) self.assertTrue(decoded_sample.array("x", (0, 0)) == -1) self.assertTrue(decoded_sample.array("x", (0, 1)) == 1) self.assertTrue(decoded_sample.array("x", (1, 1)) == -1) # type of solution is dict[index_label(int), bit] ## vartype = BINARY sample = {'x[0][1]': 1, 'x[1][1]': 0, 'x[0][0]': 1} sample_index = {v: sample[v] for v in model.variables} decoded_sample = model.decode_sample(sample_index, vartype="BINARY") self.assertTrue(decoded_sample.sample == sample) self.assertTrue( len([ label for label, energy in decoded_sample.subh.items() if energy > 0 ]) == 1) self.assertTrue(decoded_sample.energy == 1) self.assertTrue(decoded_sample.array("x", (0, 0)) == 1) self.assertTrue(decoded_sample.array("x", (0, 1)) == 1) self.assertTrue(decoded_sample.array("x", (1, 1)) == 0) sample = {'x[0][1]': 1, 'x[1][1]': 0, 'x[0][0]': 0} sample_index = {v: sample[v] for v in model.variables} decoded_sample = model.decode_sample(sample_index, vartype="BINARY") self.assertTrue(decoded_sample.sample == sample) self.assertTrue( len([ label for label, energy in decoded_sample.subh.items() if energy > 0 ]) == 0) self.assertTrue(decoded_sample.energy == 0) self.assertTrue(decoded_sample.array("x", (0, 0)) == 0) self.assertTrue(decoded_sample.array("x", (0, 1)) == 1) self.assertTrue(decoded_sample.array("x", (1, 1)) == 0) ## vartype = SPIN sample = {'x[0][1]': 1, 'x[1][1]': 1, 'x[0][0]': -1} sample_index = {v: sample[v] for v in model.variables} decoded_sample = model.decode_sample(sample_index, vartype="SPIN") self.assertTrue(decoded_sample.sample == sample) self.assertTrue( len([ label for label, energy in decoded_sample.subh.items() if energy > 0 ]) == 1) self.assertTrue(decoded_sample.energy == 1) self.assertTrue(decoded_sample.array("x", (0, 0)) == -1) self.assertTrue(decoded_sample.array("x", (0, 1)) == 1) self.assertTrue(decoded_sample.array("x", (1, 1)) == 1) sample = {'x[0][1]': 1, 'x[1][1]': -1, 'x[0][0]': -1} sample_index = {v: sample[v] for v in model.variables} decoded_sample = model.decode_sample(sample_index, vartype="SPIN") self.assertTrue(decoded_sample.sample == sample) self.assertTrue( len([ label for label, energy in decoded_sample.subh.items() if energy > 0 ]) == 0) self.assertTrue(decoded_sample.energy == 0) self.assertTrue(decoded_sample.array("x", (0, 0)) == -1) self.assertTrue(decoded_sample.array("x", (0, 1)) == 1) self.assertTrue(decoded_sample.array("x", (1, 1)) == -1) # invalid solution self.assertRaises( ValueError, lambda: model.decode_sample([1, 1, 1, 1], vartype="BINARY")) qubo = model.to_qubo() self.assertRaises( ValueError, lambda: model.decode_sample( { 'x[0][2]': 1, 'x[1][1]': 0, 'x[0][0]': 1 }, vartype="BINARY")) self.assertRaises( TypeError, lambda: model.decode_sample((1, 1), vartype="BINARY"))