def test_local_solver_sa_ising(): model = LogicalModel(mtype="ising") s = model.variables("s", shape=(2,)) model.add_interaction(s[0], coefficient=1.0) model.add_interaction(s[1], coefficient=2.0) model.add_interaction((s[0], s[1]), coefficient=-3.0) model.offset(10.0) solver = LocalSolver() sampleset1 = solver.solve(model.to_physical(), seed=12345) assert sampleset1.variables == ["s[0]", "s[1]"] assert len(sampleset1.record) == 1 # Check the ground state assert np.array_equal(sampleset1.record[0].sample, [-1, 1]) assert sampleset1.record[0].energy == 6.0 assert sampleset1.record[0].num_occurrences == 1 # Check the second solve with the same solver instance sampleset2 = solver.solve(model.to_physical(), seed=54321) assert sampleset2.variables == ["s[0]", "s[1]"] assert len(sampleset2.record) == 1 # Check the ground state assert np.array_equal(sampleset2.record[0].sample, [-1, 1]) assert sampleset2.record[0].energy == 6.0 assert sampleset2.record[0].num_occurrences == 1
def test_sawatabi_solver_invalid_reverse_options(): model = LogicalModel(mtype="ising") x = model.variables("x", shape=(2,)) for i in range(2): model.add_interaction(x[i], coefficient=-1.0) solver = SawatabiSolver() with pytest.raises(ValueError): solver.solve(model.to_physical(), reverse_options={"reverse_period": 5}) with pytest.raises(ValueError): solver.solve(model.to_physical(), reverse_options={"reverse_temperature": 10.0})
def test_sawatabi_solver_reuse_solver_instance(): model = LogicalModel(mtype="ising") x = model.variables("x", shape=(2,)) for i in range(2): model.add_interaction(x[i], coefficient=-1.0) solver = SawatabiSolver() sampleset_1 = solver.solve(model.to_physical(), num_reads=1, num_sweeps=10, cooling_rate=0.5, seed=12345) assert np.array_equal(sampleset_1.record[0].sample, [-1, -1]) assert sampleset_1.record[0].energy == -2.0 sampleset_2 = solver.solve(model.to_physical(), num_reads=1, num_sweeps=10, cooling_rate=0.5, seed=12345) assert np.array_equal(sampleset_2.record[0].sample, [-1, -1]) assert sampleset_2.record[0].energy == -2.0
def test_logical_model_to_physical(mtype): model = LogicalModel(mtype=mtype) x = model.variables("x", shape=(2,)) model.add_interaction(x[0], coefficient=1.0) model.add_interaction((x[0], x[1]), coefficient=-1.0) model._update_interactions_dataframe_from_arrays() # Update the interactions DataFrame for debug assert model._interactions[model._interactions["name"] == "x[0]"]["dirty"].values[0] assert model._interactions[model._interactions["name"] == "x[0]*x[1]"]["dirty"].values[0] physical = model.to_physical() model._update_interactions_dataframe_from_arrays() # Update the interactions DataFrame for debug assert physical.get_mtype() == mtype assert len(physical._raw_interactions[constants.INTERACTION_LINEAR]) == 1 assert len(physical._raw_interactions[constants.INTERACTION_QUADRATIC]) == 1 assert physical._raw_interactions[constants.INTERACTION_LINEAR]["x[0]"] == 1.0 assert physical._raw_interactions[constants.INTERACTION_QUADRATIC][("x[0]", "x[1]")] == -1.0 assert not model._interactions[model._interactions["name"] == "x[0]"]["dirty"].values[0] assert not model._interactions[model._interactions["name"] == "x[0]*x[1]"]["dirty"].values[0] assert physical._label_to_index["x[0]"] == 0 assert physical._label_to_index["x[1]"] == 1 assert len(physical._label_to_index) == 2 assert physical._index_to_label[0] == "x[0]" assert physical._index_to_label[1] == "x[1]" assert len(physical._index_to_label) == 2
def test_sawatabi_solver_with_initial_states_reverse(): model = LogicalModel(mtype="ising") x = model.variables("x", shape=(6,)) for i in range(6): model.add_interaction(x[i], coefficient=10.0) solver = SawatabiSolver() initial_states = [ { "x[0]": -1, "x[1]": -1, "x[2]": -1, "x[3]": -1, "x[4]": -1, "x[5]": -1, }, ] sampleset = solver.solve( model.to_physical(), num_reads=1, num_sweeps=10, initial_states=initial_states, reverse_options={"reverse_period": 5, "reverse_temperature": 10.0}, seed=12345, ) assert len(sampleset.record) == 1 # Check the ground state assert np.array_equal(sampleset.record[0].sample, [1, 1, 1, 1, 1, 1]) assert sampleset.record[0].energy == -60.0 assert sampleset.record[0].num_occurrences == 1
def test_sawatabi_solver_with_initial_states_qubo(): model = LogicalModel(mtype="qubo") x = model.variables("x", shape=(6,)) for i in range(6): model.add_interaction(x[i], coefficient=-1.0) solver = SawatabiSolver() initial_states = [ { "x[0]": 1, "x[1]": 0, "x[2]": 1, "x[3]": 0, "x[4]": 1, "x[5]": 0, }, ] sampleset = solver.solve(model.to_physical(), num_reads=1, num_sweeps=10, cooling_rate=0.5, initial_states=initial_states, seed=12345) assert len(sampleset.record) == 1 # Check the ground state assert np.array_equal(sampleset.record[0].sample, [0, 0, 0, 0, 0, 0]) assert sampleset.record[0].energy == 0.0 assert sampleset.record[0].num_occurrences == 1
def test_sawatabi_solver_with_initial_states_ising(): model = LogicalModel(mtype="ising") x = model.variables("x", shape=(12,)) for i in range(12): model.add_interaction(x[i], coefficient=-1.0) solver = SawatabiSolver() initial_states = [ { "x[0]": 1, "x[1]": -1, "x[2]": -1, "x[3]": -1, "x[4]": -1, "x[5]": -1, "x[6]": -1, "x[7]": -1, "x[8]": -1, "x[9]": -1, "x[10]": -1, "x[11]": -1, }, ] sampleset = solver.solve(model.to_physical(), num_reads=1, num_sweeps=1, pickup_mode="sequential", initial_temperature=1e-9, initial_states=initial_states) assert len(sampleset.record) == 1 # Check the ground state assert np.array_equal(sampleset.record[0].sample, [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]) assert sampleset.record[0].energy == -12.0 assert sampleset.record[0].num_occurrences == 1
def physical(): model = LogicalModel(mtype="qubo") x = model.variables("x", shape=(2, )) model.add_interaction(x[0], coefficient=1.0) model.add_interaction((x[0], x[1]), coefficient=-1.0) physical = model.to_physical() return physical
def _create_ising_model_for_eq(): model = LogicalModel(mtype="ising") x = model.variables(name="x", shape=(3, )) model.delete_variable(x[0]) model.add_interaction(x[1], coefficient=1.0) model.add_interaction(x[2], coefficient=2.0) model.add_interaction((x[1], x[2]), coefficient=3.0) return model.to_physical()
def qubo(): model = LogicalModel(mtype="qubo") x = model.variables(name="x", shape=(3, )) model.delete_variable(x[0]) model.add_interaction(x[1], coefficient=1.0) model.add_interaction(x[2], coefficient=2.0) model.add_interaction((x[1], x[2]), coefficient=3.0) return model.to_physical()
def test_optigan_solver_with_ising_model_fails(): model = LogicalModel(mtype="ising") s = model.variables("s", shape=(2, )) model.add_interaction((s[0], s[1]), coefficient=-1.0) physical = model.to_physical() solver = OptiganSolver() with pytest.raises(ValueError): solver.solve(physical)
def test_optigan_solver_with_empty_config_fails(): model = LogicalModel(mtype="qubo") x = model.variables("x", shape=(2, )) model.add_interaction((x[0], x[1]), coefficient=-1.0) physical = model.to_physical() solver = OptiganSolver(config="/tmp/.optigan.yml") with pytest.raises(FileNotFoundError): solver.solve(physical)
def test_sawatabi_solver_invalid_pickup_mode(): model = LogicalModel(mtype="ising") x = model.variables("x", shape=(2,)) for i in range(2): model.add_interaction(x[i], coefficient=-1.0) solver = SawatabiSolver() with pytest.raises(ValueError): solver.solve(model.to_physical(), pickup_mode="invalid")
def test_sawatabi_solver_with_initial_states_fails(): model = LogicalModel(mtype="ising") x = model.variables("x", shape=(2,)) for i in range(2): model.add_interaction(x[i], coefficient=-1.0) solver = SawatabiSolver() initial_states = [{"x[0]": 1, "x[1]": 1}] with pytest.raises(ValueError): solver.solve(model.to_physical(), num_reads=2, initial_states=initial_states)
def test_local_solver_default_beta_range(): model = LogicalModel(mtype="ising") s = model.variables("s", shape=(2,)) model.add_interaction(s[0], coefficient=1.0) model.add_interaction(s[1], coefficient=2.0) model.add_interaction((s[0], s[1]), coefficient=-3.0) solver = LocalSolver() beta_range = solver.default_beta_range(model.to_physical()) assert beta_range == [0.13862943611198905, 4.605170185988092]
def test_sawatabi_solver_with_stats(): model = LogicalModel(mtype="ising") x = model.variables("x", shape=(2,)) for i in range(2): model.add_interaction(x[i], coefficient=-1.0) solver = SawatabiSolver() sampleset, stats = solver.solve(model.to_physical(), num_reads=1, num_sweeps=10, cooling_rate=0.5, seed=12345, need_stats=True) assert stats[0]["acceptance_history"][-1] == 0 assert stats[0]["energy_history"][-1] == -2.0 assert stats[0]["temperature_history"] == [100.0, 50.0, 25.0, 12.5, 6.25, 3.125, 1.5625, 0.78125, 0.390625, 0.1953125]
def test_sawatabi_solver_n_hot_ising_with_deleting(n, s, i): # n out of (s - 1) variables should be 1 model = LogicalModel(mtype="ising") x = model.variables("x", shape=(s,)) model.add_constraint(NHotConstraint(variables=x, n=n)) model.delete_variable(x[i]) solver = SawatabiSolver() sampleset = solver.solve(model.to_physical(), seed=12345) result = np.array(sampleset.record[0].sample) assert np.count_nonzero(result == 1) == n assert np.count_nonzero(result == -1) == s - n - 1
def test_sawatabi_solver_n_hot_qubo(n, s): # n out of s variables should be 1 model = LogicalModel(mtype="qubo") x = model.variables("x", shape=(s,)) model.add_constraint(NHotConstraint(variables=x, n=n)) solver = SawatabiSolver() sampleset = solver.solve(model.to_physical(), seed=12345) result = np.array(sampleset.record[0].sample) assert np.count_nonzero(result == 1) == n assert np.count_nonzero(result == 0) == s - n # Execution time should be within practical seconds (20 sec). assert sampleset.info["timing"]["execution_sec"] <= 20.0
def test_logical_model_to_physical_with_n_hot_constraint_qubo(n, s): # n out of s variables should be 1 model = LogicalModel(mtype="qubo") x = model.variables("x", shape=(s,)) model.add_constraint(NHotConstraint(x, n=n)) physical = model.to_physical() for i in range(s): assert physical._raw_interactions[constants.INTERACTION_LINEAR][f"x[{i}]"] == 2 * n - 1.0 for i in range(s): for j in range(s): l1 = f"x[{i}]" l2 = f"x[{j}]" if l1 < l2: assert physical._raw_interactions[constants.INTERACTION_QUADRATIC][(l1, l2)] == -2.0
def test_local_solver_zero_or_one_hot_qubo(n): model = LogicalModel(mtype="qubo") x = model.variables("x", shape=(n,)) model.add_constraint(ZeroOrOneHotConstraint(variables=x)) solver = LocalSolver() physical = model.to_physical() for seed in [11, 22, 33, 44, 55]: sampleset = solver.solve(physical, seed=seed) result = np.array(sampleset.record[0].sample) assert np.count_nonzero(result == 1) in [0, 1] # Execution time should be within practical seconds (20 sec). assert sampleset.info["timing"]["execution_sec"] <= 20.0
def test_local_solver_n_hot_ising(n, s): # n out of s spins should be +1 model = LogicalModel(mtype="ising") x = model.variables("x", shape=(s,)) model.add_constraint(NHotConstraint(variables=x, n=n)) solver = LocalSolver() physical = model.to_physical() for seed in [11, 22, 33, 44, 55]: sampleset = solver.solve(physical, seed=seed) result = np.array(sampleset.record[0].sample) assert np.count_nonzero(result == 1) == n assert np.count_nonzero(result == -1) == s - n # Execution time should be within practical seconds (20 sec). assert sampleset.info["timing"]["execution_sec"] <= 20.0
def test_sawatabi_solver_ising(): model = LogicalModel(mtype="ising") s = model.variables("s", shape=(2,)) model.add_interaction(s[0], coefficient=1.0) model.add_interaction(s[1], coefficient=2.0) model.add_interaction((s[0], s[1]), coefficient=-3.0) model.offset(10.0) solver = SawatabiSolver() sampleset = solver.solve(model.to_physical(), num_reads=2, num_sweeps=10, cooling_rate=0.5, initial_temperature=10.0, seed=12345) assert sampleset.variables == ["s[0]", "s[1]"] assert len(sampleset.record) == 1 # Check the ground state assert np.array_equal(sampleset.record[0].sample, [-1, 1]) assert sampleset.record[0].energy == 6.0 assert sampleset.record[0].num_occurrences == 2
def test_sawatabi_solver_qubo(): model = LogicalModel(mtype="qubo") x = model.variables("x", shape=(2,)) model.add_interaction(x[0], coefficient=1.0) model.add_interaction(x[1], coefficient=2.0) model.add_interaction((x[0], x[1]), coefficient=-5.0) model.offset(10.0) solver = SawatabiSolver() sampleset = solver.solve(model.to_physical(), num_reads=1, num_sweeps=10, cooling_rate=0.55, seed=12345) assert sampleset.variables == ["x[0]", "x[1]"] assert len(sampleset.record) == 1 # Check the ground state record = sorted(sampleset.record, key=lambda r: r.energy) # sort by energy assert np.array_equal(record[0].sample, [0, 1]) assert record[0].energy == 8.0
def test_logical_model_to_physical_with_n_hot_constraint_ising(n, s): # n out of s spins should be +1 model = LogicalModel(mtype="ising") x = model.variables("x", shape=(s,)) model.add_constraint(NHotConstraint(x, n=n)) physical = model.to_physical() for i in range(s): if s != 2 * n: assert physical._raw_interactions[constants.INTERACTION_LINEAR][f"x[{i}]"] == -0.5 * (s - 2 * n) else: assert f"x[{i}]" not in physical._raw_interactions[constants.INTERACTION_LINEAR] for i in range(s): for j in range(s): l1 = f"x[{i}]" l2 = f"x[{j}]" if l1 < l2: assert physical._raw_interactions[constants.INTERACTION_QUADRATIC][(l1, l2)] == -0.5
def test_local_solver_sa_qubo(): model = LogicalModel(mtype="qubo") x = model.variables("x", shape=(2,)) model.add_interaction(x[0], coefficient=1.0) model.add_interaction(x[1], coefficient=2.0) model.add_interaction((x[0], x[1]), coefficient=-5.0) model.offset(10.0) solver = LocalSolver(exact=False) sampleset = solver.solve(model.to_physical(), seed=12345) assert sampleset.variables == ["x[0]", "x[1]"] assert len(sampleset.record) == 1 # Check the ground state assert np.array_equal(sampleset.record[0].sample, [0, 1]) assert sampleset.record[0].energy == 8.0 assert sampleset.record[0].num_occurrences == 1
def test_local_solver_equality_qubo(m, n): model = LogicalModel(mtype="qubo") x = model.variables("x", shape=(m,)) y = model.variables("y", shape=(n,)) model.add_constraint(EqualityConstraint(variables_1=x, variables_2=y)) solver = LocalSolver() physical = model.to_physical() for seed in [11, 22, 33, 44, 55]: sampleset = solver.solve(physical, seed=seed) result = np.array(sampleset.record[0].sample) result_1 = result[0:m] result_2 = result[m : (m + n)] # noqa: E203 assert np.count_nonzero(result_1 == 1) == np.count_nonzero(result_2 == 1) # Execution time should be within practical seconds (20 sec). assert sampleset.info["timing"]["execution_sec"] <= 20.0
def test_sawatabi_solver_qubo_without_active_var(): model = LogicalModel(mtype="qubo") x = model.variables("x", shape=(2, 2)) model.add_interaction(x[0, 1], coefficient=1.0) model.add_interaction((x[1, 0], x[1, 1]), coefficient=2.0) physical = model.to_physical() assert len(physical._label_to_index) == 3 assert len(physical._index_to_label) == 3 solver = SawatabiSolver() sampleset = solver.solve(physical, seed=12345) assert sampleset.variables == ["x[0][1]", "x[1][0]", "x[1][1]"] assert len(sampleset.record) == 1 # Check the ground state assert np.array_equal(sampleset.record[0].sample, [1, 1, 1]) assert sampleset.record[0].energy == -3.0 assert sampleset.record[0].num_occurrences == 1
def test_local_solver_exact_qubo(): model = LogicalModel(mtype="qubo") x = model.variables("x", shape=(2,)) model.add_interaction(x[0], coefficient=1.0) model.add_interaction(x[1], coefficient=2.0) model.add_interaction((x[0], x[1]), coefficient=-5.0) solver = LocalSolver(exact=True) sampleset = solver.solve(model.to_physical()) assert sampleset.variables == ["x[0]", "x[1]"] assert len(sampleset.record) == 4 for r in sampleset.record: # Check the ground state if np.array_equal(r.sample, [0, 1]): assert r.energy == -2.0 assert r.num_occurrences == 1 break else: assert False
def test_sawatabi_solver_ising_without_active_var(): model = LogicalModel(mtype="ising") s = model.variables("s", shape=(2, 2)) model.add_interaction(s[0, 1], coefficient=1.0) model.add_interaction((s[1, 0], s[1, 1]), coefficient=2.0) physical = model.to_physical() assert len(physical._label_to_index) == 3 assert len(physical._index_to_label) == 3 solver = SawatabiSolver() sampleset = solver.solve(physical, num_reads=10, seed=12345) assert sampleset.variables == ["s[0][1]", "s[1][0]", "s[1][1]"] assert len(sampleset.record) == 2 # Check the ground state assert np.array_equal(sampleset.record[0].sample, [1, -1, -1]) assert np.array_equal(sampleset.record[1].sample, [1, 1, 1]) assert sampleset.record[0].energy == -3 assert sampleset.record[1].energy == -3 assert sampleset.record[0].num_occurrences + sampleset.record[1].num_occurrences == 10
def test_logical_model_delete_dealing_with_nhot_constraints_qubo(): model = LogicalModel(mtype="qubo") x = model.variables("x", shape=(4, )) default_label = "Default N-hot Constraint" model.add_constraint(NHotConstraint(x, n=1, strength=1.0)) assert len(model.get_constraints()) == 1 assert default_label in model.get_constraints() assert model.get_constraints_by_label(default_label)._n == 1 assert len(model.get_constraints_by_label(default_label)._variables) == 4 model.delete_variable(x[0]) assert len(model.get_constraints()) == 1 assert default_label in model.get_constraints() assert model.get_constraints_by_label(default_label)._n == 1 assert len(model.get_constraints_by_label(default_label)._variables) == 3 physical = model.to_physical() assert physical._raw_interactions[ constants.INTERACTION_LINEAR]["x[1]"] == 1.0 assert physical._raw_interactions[constants.INTERACTION_QUADRATIC][( "x[1]", "x[2]")] == -2.0