def test_quad_to_linear(self): J = {(0, 1): -1, (0, 1, 2): 1, (0, 1, 3): 1} h = {} off = .5 poly = J.copy() poly.update({(v, ): bias for v, bias in h.items()}) poly[()] = off bqm = make_quadratic(J, 10.0, bqm=dimod.BinaryQuadraticModel.from_ising( h, {}, off)) variables = set(h).union(*J) aux_variables = tuple(set(bqm.linear) - variables) variables = tuple(variables) self.assertTrue(aux_variables) for config in itertools.product((-1, 1), repeat=len(variables)): sample = dict(zip(variables, config)) energy = poly_energy(sample, poly) reduced_energies = [] for aux_config in itertools.product((-1, 1), repeat=len(aux_variables)): aux_sample = dict(zip(aux_variables, aux_config)) aux_sample.update(sample) reduced_energies.append(bqm.energy(aux_sample)) self.assertAlmostEqual(energy, min(reduced_energies))
def test_several_terms(self): poly = {(0, 1, 2): -1, (1, 2, 3): 1, (0, 2, 3): .5, (0,): .4, (): .5} bqm = make_quadratic(poly, 5.0, bqm=dimod.BinaryQuadraticModel.empty(dimod.SPIN)) variables = set().union(*poly) aux_variables = tuple(set(bqm.linear) - variables) variables = tuple(variables) self.assertTrue(aux_variables) for config in itertools.product((-1, 1), repeat=len(variables)): sample = dict(zip(variables, config)) energy = poly_energy(sample, poly) reduced_energies = [] for aux_config in itertools.product((-1, 1), repeat=len(aux_variables)): aux_sample = dict(zip(aux_variables, aux_config)) aux_sample.update(sample) reduced_energies.append(bqm.energy(aux_sample)) self.assertAlmostEqual(energy, min(reduced_energies))
def test_several_terms(self): poly = {(0, 1, 2): -1, (1, 2, 3): 1, (0, 2, 3): .5, (0,): .4, (): .5} cqm = make_quadratic_cqm(poly, dimod.SPIN, cqm=dimod.ConstrainedQuadraticModel()) variables = set().union(*poly) aux_variables = tuple(set(cqm.variables) - variables) variables = tuple(variables) self.assertTrue(aux_variables) for config in itertools.product((-1, 1), repeat=len(variables)): sample = dict(zip(variables, config)) energy = poly_energy(sample, poly) reduced_energies = [] for aux_config in itertools.product((-1, 1), repeat=len(aux_variables)): aux_sample = dict(zip(aux_variables, aux_config)) aux_sample.update(sample) if cqm.check_feasible(aux_sample): reduced_energies.append(cqm.objective.energy(aux_sample)) self.assertAlmostEqual(energy, min(reduced_energies))
def test_quad_to_linear(self): J = {(0, 1): -1, (0, 1, 2): 1, (0, 1, 3): 1} h = {} off = .5 poly = J.copy() poly.update({(v,): bias for v, bias in h.items()}) poly[()] = off cqm0 = dimod.ConstrainedQuadraticModel() cqm0.set_objective(dimod.BinaryQuadraticModel.from_ising(h, {}, off)) cqm = make_quadratic_cqm(J, dimod.SPIN, cqm=cqm0) variables = set(h).union(*J) aux_variables = tuple(set(cqm.variables) - variables) variables = tuple(variables) self.assertTrue(aux_variables) for config in itertools.product((-1, 1), repeat=len(variables)): sample = dict(zip(variables, config)) energy = poly_energy(sample, poly) reduced_energies = [] for aux_config in itertools.product((-1, 1), repeat=len(aux_variables)): aux_sample = dict(zip(aux_variables, aux_config)) aux_sample.update(sample) if cqm.check_feasible(aux_sample): reduced_energies.append(cqm.objective.energy(aux_sample)) self.assertAlmostEqual(energy, min(reduced_energies))
def test_poly_energies(self): linear = {0: 1.0, 1: 1.0} j = {(0, 1, 2): 0.5} poly = dimod.BinaryPolynomial.from_hising(linear, j) samples = [[1, 1, -1], [1, -1, 1], [1, 1, 1], [-1, 1, -1]] en = poly_energies(samples, poly) self.assertListEqual(list(en), [1.5, -0.5, 2.5, 0.5]) en = poly_energy(samples[0], poly) self.assertAlmostEqual(en, 1.5) with self.assertRaises(ValueError): poly_energy(samples, poly) poly = {('a',): 1.0, ('b',): 1.0, ('a', 'b', 'c'): 0.5} samples = [{'a': 1, 'b': 1, 'c': -1}, {'a': 1, 'b': -1, 'c': 1}, {'a': 1, 'b': 1, 'c': 1}, {'a': -1, 'b': 1, 'c': -1}] en = poly_energies(samples, poly) self.assertListEqual(list(en), [1.5, -0.5, 2.5, 0.5]) en = poly_energy(samples[0], poly) self.assertAlmostEqual(en, 1.5) with self.assertRaises(ValueError): poly_energy(samples, poly)
def test_no_higher_order(self): poly = {(0, 1): -1, (1, 2): 1} bqm = make_quadratic(poly, 1.0, dimod.SPIN) variables = set().union(*poly) aux_variables = tuple(set(bqm.linear) - variables) variables = tuple(variables) for config in itertools.product((-1, 1), repeat=len(variables)): sample = dict(zip(variables, config)) energy = poly_energy(sample, poly) reduced_energies = [] for aux_config in itertools.product((-1, 1), repeat=len(aux_variables)): aux_sample = dict(zip(aux_variables, aux_config)) aux_sample.update(sample) reduced_energies.append(bqm.energy(aux_sample)) self.assertAlmostEqual(energy, min(reduced_energies))
def test_binary_polynomial(self): HUBO = {(0, 1, 2): .5, (0, 1): 1.3, (2, 4, 1): -1, (3, 2): -1} bqm = make_quadratic(HUBO, 1000.0, dimod.BINARY) variables = set().union(*HUBO) aux_variables = tuple(set(bqm.linear) - variables) variables = tuple(variables) self.assertTrue(aux_variables) for config in itertools.product((0, 1), repeat=len(variables)): sample = dict(zip(variables, config)) energy = poly_energy(sample, HUBO) reduced_energies = [] for aux_config in itertools.product((0, 1), repeat=len(aux_variables)): aux_sample = dict(zip(aux_variables, aux_config)) aux_sample.update(sample) reduced_energies.append(bqm.energy(aux_sample)) self.assertAlmostEqual(energy, min(reduced_energies))
def test_poly_energies(self): from dimod.higherorder import create_poly linear = {0: 1.0, 1: 1.0} j = {(0, 1, 2): 0.5} poly = create_poly(linear, j) samples = [[1, 1, -1], [1, -1, 1], [1, 1, 1], [-1, 1, -1]] en = poly_energies(samples, poly) self.assertListEqual(list(en), [1.5, -0.5, 2.5, 0.5]) en = poly_energy(samples[0], poly) self.assertAlmostEqual(en, 1.5) with self.assertRaises(ValueError): poly_energy(samples, poly) poly = {('a', ): 1.0, ('b', ): 1.0, ('a', 'b', 'c'): 0.5} samples = [{ 'a': 1, 'b': 1, 'c': -1 }, { 'a': 1, 'b': -1, 'c': 1 }, { 'a': 1, 'b': 1, 'c': 1 }, { 'a': -1, 'b': 1, 'c': -1 }] en = poly_energies(samples, poly) self.assertListEqual(list(en), [1.5, -0.5, 2.5, 0.5]) en = poly_energy(samples[0], poly) self.assertAlmostEqual(en, 1.5) with self.assertRaises(ValueError): poly_energy(samples, poly)