Exemple #1
0
def test_sat_or():

    f = OR

    assert f() == {(): 1}
    assert f('x', 'y') == PUBO({('x', ): 1, ('y', ): 1, ('x', 'y'): -1})
    assert (f({('x', 'y'): 1}, 'a') == PUBO({
                   ('x', 'y'): 1,
                   ('a', ): 1,
                   ('x', 'y', 'a'): -1
               }))

    for n in range(1, 5):
        P = f(*tuple(range(n)))
        for i in range(1 << n):
            sol = decimal_to_boolean(i, n)
            if any(sol):
                assert P.value(sol) == 1
            else:
                assert not P.value(sol)

    # testing type
    x, y = boolean_var(0), boolean_var(1)
    for model in BOOLEAN_MODELS:
        assert isinstance(f(model(x), y), model)
Exemple #2
0
def test_sum():

    xs = [boolean_var(i) for i in range(100)]
    assert sum(xs) == qvsum(xs) == qvsum(xs[i] for i in range(100))
    assert sum(xs, 2) == qvsum(xs, 2)
    assert isinstance(qvsum(xs), PCBO)

    zs = [spin_var(i) for i in range(100)]
    assert sum(zs) == qvsum(zs) == qvsum(zs[i] for i in range(100))
    assert sum(zs, 2) == qvsum(zs, 2)
    assert isinstance(qvsum(zs), PCSO)
Exemple #3
0
def test_sat_not():

    f = NOT

    assert f('x') == {(): 1, ('x', ): -1}
    assert f({('x', 'y'): 1}) == 1 - PUBO({('x', 'y'): 1})

    # testing type
    x = boolean_var(0)
    for model in BOOLEAN_MODELS:
        assert isinstance(f(model(x)), model)
Exemple #4
0
def test_sat_one():

    f = BUFFER

    assert f('x') == {('x', ): 1}
    assert f({('x', 'y'): 1}) == PUBO({('x', 'y'): 1})

    # testing type
    x = boolean_var(0)
    for model in BOOLEAN_MODELS:
        assert isinstance(f(model(x)), model)
Exemple #5
0
idx_init = np.random.choice(np.arange(N * N), N, replace=False)
a = np.array([[i for i in range(N)] + idx_init[j] * N
              for j in range(N)]).ravel()
x_init = {a[i]: int(i % N == i // N) for i in range(N * N)}

init_vec = np.zeros((num_bits, 1), dtype=np.int64)
idx = np.array([k for (k, v) in x_init.items() if v])
init_vec[idx] = 1

sudoku_init = (
    np.kron(np.identity(N**2, dtype=np.int64), z) @ init_vec).reshape((N, N))
plot_mat(sudoku_init)

# Define binary variables for QUBO.
x = {
    i: boolean_var(f'x{i}')
    for i in range(num_bits) if i not in x_init.keys()
}
x.update(x_init)

# Define QUBO matrix.
penalty = 200
id_N = np.identity(N)
id_sqN = np.identity(sq_N)
A = np.concatenate((np.kron(np.kron(id_N, id_N), np.ones(
    (1, N))), np.kron(np.kron(id_N, np.ones((1, N))),
                      id_N), np.kron(np.kron(np.ones((1, N)), id_N), id_N),
                    np.kron(
                        np.kron(np.kron(id_sqN, np.ones((1, sq_N))),
                                np.kron(id_sqN, np.ones((1, sq_N)))), id_N)))
b = np.ones((4 * N * N, 1))
Exemple #6
0

# Press the green button in the gutter to run the script.
if __name__ == '__main__':

    lib = spio.loadmat('lib.mat')

    C = lib['M_C']
    A = lib['M_A']
    B = lib['M_B']
    CTYPE = lib['M_CTYPE']
    VARTYPE = lib['M_VARTYPE']

    N = len(VARTYPE)  # All variables from MATLAB are 'C', we can just assume they are 'B'

    x = {i: boolean_var('x%d' % i) for i in range(N)}

    # Objective function, default is minimization
    model = 0
    # min C' * X
    for i in range(N):
        model += C[i, 0] * x[i]

    # Construct constraints. A * X [ "=" | "<=" | ">=" ] B    S:'=' ,  U:'<=',  L: '>='
    N_con = len(CTYPE)
    for i in range(N_con):
        AX = 0
        for j in range(N):
            AX += A[i, j] * x[j]

        if CTYPE[i] == 'S':