Пример #1
0
    def test_nonzero_configuration(self):
        """MaxGap is currently not supporting non-zero feasible states. This is checking that
        non-zero feasible state problems don't get run.
        """
        graph = nx.complete_graph(3)
        spec = pm.Specification(graph, [0, 1], {
            (-1, 1): 0,
            (-1, -1): -2
        }, dimod.SPIN)

        with self.assertRaises(ImpossiblePenaltyModel):
            maxgap.get_penalty_model(spec)
Пример #2
0
    def test_and_on_k44(self):
        graph = nx.Graph()
        for i in range(4):
            for j in range(4, 8):
                graph.add_edge(i, j)

        decision_variables = (0, 2, 3)
        feasible_configurations = AND(2)

        mapping = {0: '0', 1: '1', 2: '2', 3: '3'}
        graph = nx.relabel_nodes(graph, mapping)
        decision_variables = tuple(mapping[x] for x in decision_variables)

        spin_configurations = tuple(
            [tuple([2 * i - 1 for i in b]) for b in feasible_configurations])
        spec = pm.Specification(graph,
                                decision_variables,
                                spin_configurations,
                                vartype=dimod.SPIN)

        pm0 = maxgap.get_penalty_model(spec)
        self.check_generated_ising_model(pm0.feasible_configurations,
                                         pm0.decision_variables,
                                         pm0.model.linear, pm0.model.quadratic,
                                         pm0.ground_energy, pm0.classical_gap)
Пример #3
0
    def test_typical(self):
        graph = nx.complete_graph(3)
        spec = pm.Specification(graph, [0, 1], {
            (-1, -1): 0,
            (+1, +1): 0
        }, dimod.SPIN)

        widget = maxgap.get_penalty_model(spec)

        # some quick test to see that the penalty model propogated in
        for v in graph:
            self.assertIn(v, widget.model.linear)
        for (u, v) in graph.edges:
            self.assertIn(u, widget.model.adj[v])
Пример #4
0
    def test_binary_specification(self):
        graph = nx.Graph()
        for i in range(4):
            for j in range(4, 8):
                graph.add_edge(i, j)

        decision_variables = (0, 1)
        feasible_configurations = ((0, 0), (1, 1))  # equality

        spec = pm.Specification(graph,
                                decision_variables,
                                feasible_configurations,
                                vartype=dimod.BINARY)
        widget = maxgap.get_penalty_model(spec)

        self.assertIs(widget.model.vartype, dimod.BINARY)

        # test the correctness of the widget
        energies = {}
        for decision_config in itertools.product((0, 1), repeat=2):
            energies[decision_config] = float('inf')

            for aux_config in itertools.product((0, 1), repeat=6):
                sample = dict(enumerate(decision_config + aux_config))
                energy = widget.model.energy(sample)

                energies[decision_config] = min(energies[decision_config],
                                                energy)

        for decision_config, energy in energies.items():
            if decision_config in feasible_configurations:
                self.assertAlmostEqual(energy, widget.ground_energy)
            else:
                self.assertGreaterEqual(
                    energy,
                    widget.ground_energy + widget.classical_gap - 10**-6)