Exemplo n.º 1
0
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
Exemplo n.º 2
0
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})
Exemplo n.º 3
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
Exemplo n.º 4
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
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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
Exemplo n.º 8
0
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
Exemplo n.º 9
0
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()
Exemplo n.º 10
0
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()
Exemplo n.º 11
0
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)
Exemplo n.º 12
0
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)
Exemplo n.º 13
0
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")
Exemplo n.º 14
0
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)
Exemplo n.º 15
0
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]
Exemplo n.º 16
0
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]
Exemplo n.º 17
0
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
Exemplo n.º 18
0
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
Exemplo n.º 19
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
Exemplo n.º 20
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
Exemplo n.º 21
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
Exemplo n.º 22
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
Exemplo n.º 23
0
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
Exemplo n.º 24
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
Exemplo n.º 25
0
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
Exemplo n.º 26
0
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
Exemplo n.º 27
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
Exemplo n.º 28
0
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
Exemplo n.º 29
0
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
Exemplo n.º 30
0
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