示例#1
0
    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)
示例#2
0
    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'})
示例#3
0
    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'})
示例#4
0
    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'})
示例#5
0
 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)
示例#6
0
    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)
示例#7
0
    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"))