示例#1
0
    def __init__(self, child_sampler, bqm=None, h=None, J=None, offset=0,
                 scalar=None, bias_range=1, quadratic_range=None,
                 ignored_variables=None, ignored_interactions=None,
                 ignore_offset=False, **other_params):

        scale_options = dict(scalar=scalar,
                             bias_range=bias_range,
                             quadratic_range=quadratic_range,
                             ignored_variables=ignored_variables,
                             ignored_interactions=ignored_interactions,
                             ignore_offset=ignore_offset)
        self.child = child_sampler

        if bqm is not None:
            self.bqm, _ = _scaled_bqm(bqm, **scale_options)

        elif h is not None and J is not None:
            if max(map(len, J.keys())) == 2:
                bqm = BinaryQuadraticModel.from_ising(h, J, offset=offset)
                self.bqm, _ = _scaled_bqm(bqm, **scale_options)
            else:
                h_sc, J_sc, offset_sc = _scaled_hubo(h, J, offset=offset,
                                                     **scale_options)
                self.h = h_sc
                self.J = J_sc
                self.offset = offset_sc
示例#2
0
 def test_sample_bias_range(self):
     linear = {'a': -4.0, 'b': -4.0}
     quadratic = {('a', 'b'): 3.2}
     ignored_variables, ignored_interactions = _check_params(None, None)
     bqm = BinaryQuadraticModel.from_ising(linear, quadratic)
     comp_parameters = dict(ignored_interactions=ignored_interactions,
                            ignored_variables=ignored_variables,
                            bias_range=2.)
     sampler = ScaleComposite(
         ScalingChecker(ExactSolver(), bqm=bqm, **comp_parameters))
     response = sampler.sample(bqm, **comp_parameters)
     self.assertAlmostEqual(response.first.energy, -4.8)
示例#3
0
    def test_info_propagation(self):
        bqm = BinaryQuadraticModel.from_ising({}, {})

        class MySampler:
            @staticmethod
            def sample(bqm):
                return dimod.SampleSet.from_samples_bqm([],
                                                        bqm,
                                                        info=dict(a=1))

        sampleset = ClipComposite(MySampler).sample(bqm)
        self.assertEqual(sampleset.info, {'a': 1})
    def test_roof_duality_triangle(self):
        bqm = BinaryQuadraticModel.from_ising({}, {
            'ab': -1,
            'bc': -1,
            'ac': -1
        })

        # two equally good solutions
        sampler = FixVariablesComposite(ExactSolver(),
                                        algorithm='roof_duality')
        sampleset = sampler.sample(bqm)

        self.assertEqual(set(sampleset.variables), set('abc'))
        dtest.assert_response_energies(sampleset, bqm)
    def test_roof_duality_triangle_not_strict(self):
        bqm = BinaryQuadraticModel.from_ising({}, {
            'ab': -1,
            'bc': -1,
            'ac': -1
        })

        # two equally good solutions, but with strict=False, it will pick one
        sampler = FixVariablesComposite(ExactSolver(),
                                        algorithm='roof_duality')

        sampleset = sampler.sample(bqm, strict=False)

        self.assertEqual(set(sampleset.variables), set('abc'))
        self.assertEqual(len(sampleset), 1)  # all should be fixed
        dtest.assert_response_energies(sampleset, bqm)
示例#6
0
    def test_sample_ignore_variables(self):
        linear = {'a': -4.0, 'b': -4.0}
        quadratic = {('a', 'b'): 3.2}
        offset = 5
        bqm = BinaryQuadraticModel.from_ising(linear, quadratic, offset=offset)
        ignored_variables, ignored_interactions = _check_params(
            ['a'], None)
        comp_parameters = dict(ignored_interactions=ignored_interactions,
                               ignored_variables=ignored_variables,
                               ignore_offset=True,
                               scalar=0.5)

        sampler = ScaleComposite(ScalingChecker(ExactSolver(), h=linear,
                                                J=quadratic, offset=offset,
                                                **comp_parameters))
        response = sampler.sample(bqm, **comp_parameters)
        self.assertAlmostEqual(response.first.energy, 0.2)
示例#7
0
    def test_scaling_bqm(self):
        linear = {'a': -4.0, 'b': -4.0}
        quadratic = {('a', 'b'): 3.2}

        ignored_variables, ignored_interactions = _check_params(None, None)
        bqm = BinaryQuadraticModel.from_ising(linear, quadratic, offset=5.0)
        scalar = None
        quadratic_range = None
        ignore_offset = False
        bqm_new = _scaled_bqm(bqm, scalar, 2, quadratic_range,
                              ignored_variables, ignored_interactions,
                              ignore_offset)

        sc = 2.
        hsc = {
            k: v / sc if k not in ignored_variables else v
            for k, v in linear.items()
        }
        Jsc = {
            k: v / sc if k not in ignored_interactions else v
            for k, v in quadratic.items()
        }
        bqm_scaled = BinaryQuadraticModel.from_ising(hsc, Jsc, offset=5.0 / 2.)
        self.assertEqual(bqm_scaled, bqm_new)

        ignored_variables, ignored_interactions = _check_params(None, None)
        bqm = BinaryQuadraticModel.from_ising(linear, quadratic, offset=5.0)
        bqm_new = _scaled_bqm(bqm, scalar, 2, quadratic_range,
                              ignored_variables, ignored_interactions, True)

        sc = 2.
        hsc = {
            k: v / sc if k not in ignored_variables else v
            for k, v in linear.items()
        }
        Jsc = {
            k: v / sc if k not in ignored_interactions else v
            for k, v in quadratic.items()
        }
        bqm_scaled = BinaryQuadraticModel.from_ising(hsc, Jsc, offset=5.0)
        self.assertEqual(bqm_scaled, bqm_new)

        bqm_new = _scaled_bqm(bqm, scalar, 1, (-1, 0.4), ignored_variables,
                              ignored_interactions, ignore_offset)

        sc = 3.2 / 0.4
        hsc = {
            k: v / sc if k not in ignored_variables else v
            for k, v in linear.items()
        }
        Jsc = {
            k: v / sc if k not in ignored_interactions else v
            for k, v in quadratic.items()
        }

        bqm_scaled = BinaryQuadraticModel.from_ising(hsc, Jsc, offset=5.0 / sc)
        self.assertEqual(bqm_scaled, bqm_new)

        ignored_variables = ['a', 'b']
        ignored_interactions = None
        ignored_variables, ignored_interactions = _check_params(
            ignored_variables, ignored_interactions)
        bqm = BinaryQuadraticModel.from_ising(linear, quadratic)

        bqm_new = _scaled_bqm(bqm, scalar, (2, 2), quadratic_range,
                              ignored_variables, ignored_interactions,
                              ignore_offset)

        sc = 3.2 / 2.
        hsc = {
            k: v / sc if k not in ignored_variables else v
            for k, v in linear.items()
        }
        Jsc = {
            k: v / sc if k not in ignored_interactions else v
            for k, v in quadratic.items()
        }

        bqm_scaled = BinaryQuadraticModel.from_ising(hsc, Jsc, offset=0)
        self.assertEqual(bqm_scaled, bqm_new)

        ignored_variables = None
        ignored_interactions = [('a', 'b')]
        ignored_variables, ignored_interactions = _check_params(
            ignored_variables, ignored_interactions)

        bqm = BinaryQuadraticModel.from_ising(linear, quadratic)
        bqm_new = _scaled_bqm(bqm, scalar, 1, 0.5, ignored_variables,
                              ignored_interactions, ignore_offset)

        sc = 4.
        hsc = {
            k: v / sc if k not in ignored_variables else v
            for k, v in linear.items()
        }
        Jsc = {
            k: v / sc if k not in ignored_interactions else v
            for k, v in quadratic.items()
        }

        bqm_scaled = BinaryQuadraticModel.from_ising(hsc, Jsc, offset=0)
        self.assertEqual(bqm_scaled, bqm_new)