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)
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)
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)
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)
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))
# 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':