示例#1
0
 def test_decode2(self):
     x = Matrix("x", n_row=2, n_col=2)
     exp = Constraint(-(x[1, 1] - x[0, 1])**2, label="const")
     model = exp.compile()
     self.assertRaises(
         ValueError,
         lambda: model.decode_solution([1, 0], var_type="binary"))
示例#2
0
 def test_decode2(self):
     x = Array.create("x", (2, 2), vartype="BINARY")
     exp = Constraint(-(x[1, 1] - x[0, 1])**2, label="const")
     model = exp.compile()
     self.assertRaises(
         ValueError,
         lambda: model.decode_solution([1, 0], vartype="BINARY"))
示例#3
0
    def test_constraint(self):
        sampler = dimod.ExactSolver()
        x = Array.create('x', shape=(3), vartype="BINARY")
        H = Constraint(x[0] * x[1] * x[2], label="C1")
        model = H.compile()
        bqm = model.to_bqm()
        responses = sampler.sample(bqm)
        solutions = model.decode_sampleset(responses)

        for sol in solutions:
            if sol.energy == 1.0:
                self.assertEqual(sol.subh['C1'], 1.0)
示例#4
0
 def test_placeholder_in_constraint(self):
     a = Binary("a")
     exp = Constraint(2 * Placeholder("c") + a, "const1")
     m = exp.compile()
     sol, broken, energy = m.decode_solution({"a": 1},
                                             vartype="BINARY",
                                             feed_dict={"c": 1})
     self.assertEqual(energy, 3.0)
     self.assertEqual(broken,
                      {'const1': {
                          'result': {
                              'a': 1
                          },
                          'penalty': 3.0
                      }})
     self.assertEqual(sol, {'a': 1})
示例#5
0
    def test_decode(self):
        x = Matrix("x", n_row=2, n_col=2)
        exp = Constraint((x[1, 1] - x[0, 1])**2, label="const")
        model = exp.compile()

        # check __repr__ of CompiledQubo
        expected_repr = "CompiledQubo({('x[0][1]', 'x[0][1]'): 1.0,\n" \
            " ('x[0][1]', 'x[1][1]'): -2.0,\n" \
            " ('x[1][1]', 'x[1][1]'): 1.0}, offset=0.0)"
        self.assertEqual(repr(model.compiled_qubo), expected_repr)

        # check __repr__ of Model
        expected_repr = "Model(CompiledQubo({('x[0][1]', 'x[0][1]'): 1.0,\n"\
                        " ('x[0][1]', 'x[1][1]'): -2.0,\n"\
                        " ('x[1][1]', 'x[1][1]'): 1.0}, offset=0.0), "\
                        "structure={'x[0][0]': ('x', 0, 0),\n"\
                        " 'x[0][1]': ('x', 0, 1),\n"\
                        " 'x[1][0]': ('x', 1, 0),\n"\
                        " 'x[1][1]': ('x', 1, 1)})"
        self.assertEqual(repr(model), expected_repr)

        # when the constraint is not broken

        # type of solution is dict[label, bit]
        decoded_sol, broken, energy = model.decode_solution(
            {
                'x[0][1]': 1.0,
                'x[1][1]': 1.0
            }, var_type="binary")
        self.assertTrue(decoded_sol == {'x': {0: {1: 1}, 1: {1: 1}}})
        self.assertTrue(len(broken) == 0)
        self.assertTrue(energy == 0)

        # type of solution is list[bit]
        decoded_sol, broken, energy = model.decode_solution([1, 1],
                                                            var_type="binary")
        self.assertTrue(decoded_sol == {'x': {0: {1: 1}, 1: {1: 1}}})
        self.assertTrue(len(broken) == 0)
        self.assertTrue(energy == 0)

        # type of solution is dict[index_label(int), bit]
        decoded_sol, broken, energy = model.decode_solution({
            0: 1.0,
            1: 1.0
        },
                                                            var_type="binary")
        self.assertTrue(decoded_sol == {'x': {0: {1: 1}, 1: {1: 1}}})
        self.assertTrue(len(broken) == 0)
        self.assertTrue(energy == 0)

        # when the constraint is broken

        # type of solution is dict[label, bit]
        decoded_sol, broken, energy = model.decode_solution(
            {
                'x[0][1]': 0.0,
                'x[1][1]': 1.0
            }, var_type="binary")
        self.assertTrue(decoded_sol == {'x': {0: {1: 0}, 1: {1: 1}}})
        self.assertTrue(len(broken) == 1)
        self.assertTrue(energy == 1)

        # type of solution is dict[label, spin]
        decoded_sol, broken, energy = model.decode_solution(
            {
                'x[0][1]': 1.0,
                'x[1][1]': -1.0
            }, var_type="spin")
        self.assertTrue(decoded_sol == {'x': {0: {1: 1}, 1: {1: -1}}})
        self.assertTrue(len(broken) == 1)
        self.assertTrue(energy == 1)

        # invalid solution
        self.assertRaises(
            ValueError,
            lambda: model.decode_solution([1, 1, 1], var_type="binary"))
        self.assertRaises(
            ValueError, lambda: model.decode_solution(
                {
                    'x[0][2]': 1.0,
                    'x[1][1]': 0.0
                }, var_type="binary"))
        self.assertRaises(
            TypeError, lambda: model.decode_solution(
                (1, 1), var_type="binary"))

        # invalid var_type
        self.assertRaises(AssertionError,
                          lambda: model.decode_solution([1, 1], var_type="sp"))
示例#6
0
import dimod
from pyqubo import Constraint, Array

exactsolver = dimod.ExactSolver()

# Set up variables
x = Array.create('x', shape=5, vartype='BINARY')

# Set up the QUBO. Start with the equation insisting that there are 3
# numbers turned on, and then the equation insisting that they sum up to 8.
H = Constraint((sum(x) - 3)**2, label='3_hot')
H += Constraint(
    (x[0] + (2 * x[1]) + (3 * x[2]) + (4 * x[3]) + (5 * x[4]) - 8)**2,
    label='8_sum')

# Compile the model, and turn it into a QUBO object
model = H.compile()
Q = model.to_qubo()
bqm = dimod.BinaryQuadraticModel.from_qubo(Q[0], offset=Q[1])

# solve the problem
results = exactsolver.sample(bqm)

# print the results
for sample, energy in results.data(['sample', 'energy']):
    _, broken, _ = model.decode_solution(sample, vartype='BINARY')
    if not broken:
        print(sample, energy)