satisfiability based on wmis sample majority vote
This commit is contained in:
13
create_wmis_result_table.sql
Normal file
13
create_wmis_result_table.sql
Normal file
@@ -0,0 +1,13 @@
|
||||
create table c42_v5to84_1_wmis_qbsolv_results (
|
||||
result_id char(24),
|
||||
instance_id char(24),
|
||||
number_of_clauses int,
|
||||
number_of_variables int,
|
||||
number_of_found_assignments int,
|
||||
chain_break_fraction float,
|
||||
num_occurrences int,
|
||||
energy float,
|
||||
satisfiable boolean,
|
||||
|
||||
primary key (result_id)
|
||||
);
|
@@ -7,8 +7,10 @@ import dimod
|
||||
from tqdm import tqdm
|
||||
|
||||
def main():
|
||||
#wmis_results()
|
||||
wmis_siman_results_alpha_num_of_assignments()
|
||||
#wmis_siman_results()
|
||||
#minisat_runs()
|
||||
|
||||
def wmis_siman_results():
|
||||
db = script.connect_to_instance_pool()
|
||||
@@ -32,17 +34,19 @@ def wmis_siman_results_alpha_num_of_assignments():
|
||||
idb = script.connect_to_instance_pool()
|
||||
|
||||
q = queries.WMIS_result_scope_query_raw(idb)
|
||||
q.query("c42_v[5-84]_1", "wmis_siman_results")
|
||||
q.query("c42_v[5-84]_1", "wmis_qbsolv_results")
|
||||
|
||||
insert_row = ("INSERT INTO c42_v5to84_1_wmis_results "
|
||||
insert_row = ("INSERT INTO c42_v5to84_1_wmis_qbsolv_results "
|
||||
"(result_id, "
|
||||
" instance_id, "
|
||||
" number_of_clauses, "
|
||||
" number_of_variables, "
|
||||
" number_of_found_assignments, "
|
||||
" chain_break_fraction, "
|
||||
" num_occurrences, "
|
||||
" energy) "
|
||||
"VALUES (%s, %s, %s, %s, %s, %s, %s) ")
|
||||
" energy, "
|
||||
" satisfiable) "
|
||||
"VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) ")
|
||||
|
||||
for result in tqdm(q):
|
||||
sample_set = queries.read_raw_wmis_sample_set(result["data"])
|
||||
@@ -51,17 +55,77 @@ def wmis_siman_results_alpha_num_of_assignments():
|
||||
|
||||
sat = queries.get_instance_by_id(idb["instances"], result["instance"])
|
||||
|
||||
model = script.majority_vote_sample(sample_set.first.sample)
|
||||
|
||||
isSatisfiable = sat.checkAssignment(model)
|
||||
|
||||
edb_cursor.execute(insert_row, (str(result["_id"]),
|
||||
str(result["instance"]),
|
||||
int(sat.getNumberOfClauses()),
|
||||
int(sat.getNumberOfVariables()),
|
||||
int(data["number_of_assignments"]),
|
||||
float(data["chain_break_fraction"]),
|
||||
int(data["num_occurrences"]),
|
||||
int(data["energy"])))
|
||||
int(data["energy"]),
|
||||
isSatisfiable))
|
||||
|
||||
edb.commit()
|
||||
edb_cursor.close()
|
||||
edb.close()
|
||||
|
||||
def minisat_runs():
|
||||
edb = script.connect_to_experimetns_db()
|
||||
edb_cursor = edb.cursor();
|
||||
|
||||
idb = script.connect_to_instance_pool()
|
||||
|
||||
runs = queries.Minisat_run_scope_query_raw(idb)
|
||||
runs.query("c42_v[5-84]_1", "minisat_runs")
|
||||
|
||||
insert_row = ("INSERT INTO c42_v5to84_1_minisat_runs "
|
||||
"(run_id, "
|
||||
" instance_id, "
|
||||
" satisfiable) "
|
||||
"VALUES (%s, %s, %s) ")
|
||||
|
||||
for run in tqdm(runs):
|
||||
data = script.analyde_minisat_run(run)
|
||||
|
||||
edb_cursor.execute(insert_row, (str(run["_id"]),
|
||||
str(run["instance"]),
|
||||
int(data["satisfiable"])))
|
||||
|
||||
edb.commit()
|
||||
edb_cursor.close()
|
||||
edb.close()
|
||||
|
||||
def wmis_results():
|
||||
edb = script.connect_to_experimetns_db()
|
||||
edb_cursor = edb.cursor();
|
||||
|
||||
idb = script.connect_to_instance_pool()
|
||||
|
||||
q = queries.WMIS_result_scope_query_raw(idb)
|
||||
q.query("c42_v[5-84]_1", "wmis_qbsolv_results")
|
||||
|
||||
for i in range(501):
|
||||
q.__next__()
|
||||
|
||||
res = q.__next__()
|
||||
|
||||
sample_set = queries.read_raw_wmis_sample_set(res["data"])
|
||||
|
||||
|
||||
model = script.majority_vote_sample(sample_set.first.sample)
|
||||
|
||||
sat = queries.get_instance_by_id(idb["instances"], res["instance"])
|
||||
|
||||
print(model)
|
||||
|
||||
print(sat.getNumberOfVariables())
|
||||
print(sat.checkAssignment(model))
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
@@ -65,7 +65,8 @@ def __wmis3():
|
||||
solver_input_query = queries.WMIS_solver_input_scope_query(db)
|
||||
solver_input_query.query("c42_v[5-84]_1", target_graph_id)
|
||||
|
||||
base_sampler = SimulatedAnnealingSampler()
|
||||
#base_sampler = SimulatedAnnealingSampler()
|
||||
base_sampler = QBSolv()
|
||||
chimera_sampler = dimod.StructureComposite(base_sampler,
|
||||
target_graph.nodes(),
|
||||
target_graph.edges())
|
||||
@@ -73,12 +74,13 @@ def __wmis3():
|
||||
for solver_input in tqdm(solver_input_query):
|
||||
sampler = FixedEmbeddingComposite(chimera_sampler, solver_input["embeddings"][0])
|
||||
|
||||
res = sampler.sample_qubo(__negate_qubo(solver_input["qubo"]))
|
||||
res = sampler.sample_qubo(__negate_qubo(solver_input["qubo"]), solver_limit=2048)
|
||||
|
||||
script.save_simulated_annealing_result(db["wmis_siman_results"],
|
||||
script.save_simulated_annealing_result(db["wmis_qbsolv_results"],
|
||||
res,
|
||||
solver_input,
|
||||
0)
|
||||
|
||||
|
||||
|
||||
def __wmis():
|
||||
|
@@ -295,6 +295,46 @@ class WMIS_result_scope_query_raw:
|
||||
|
||||
def __next__(self):
|
||||
return self.__query.next()
|
||||
|
||||
class Minisat_run_scope_query_raw:
|
||||
def __init__(self, database):
|
||||
self.__database = database
|
||||
self.__query = None
|
||||
|
||||
def query(self, scope, collection):
|
||||
self.__query = self.__database["experiment_scopes"].aggregate([
|
||||
{
|
||||
"$match": {"_id": scope}
|
||||
},
|
||||
{
|
||||
"$unwind": "$instances"
|
||||
},
|
||||
{
|
||||
"$project": {"instance_id": "$instances"}
|
||||
},
|
||||
{
|
||||
"$lookup":
|
||||
{
|
||||
"from": collection,
|
||||
"localField": "instance_id",
|
||||
"foreignField": "instance",
|
||||
"as": "run"
|
||||
}
|
||||
},
|
||||
{
|
||||
"$unwind": "$run"
|
||||
},
|
||||
{
|
||||
"$replaceRoot": {"newRoot": "$run"}
|
||||
}
|
||||
])
|
||||
|
||||
def __iter__(self):
|
||||
return self
|
||||
|
||||
def __next__(self):
|
||||
return self.__query.next()
|
||||
|
||||
|
||||
def load_embedding(collection, qubo_id, solver_graph_id):
|
||||
doc = collection.find_one(
|
||||
|
@@ -300,3 +300,39 @@ def analyze_wmis_sample(sample):
|
||||
data["energy"] = sample.energy
|
||||
|
||||
return data
|
||||
|
||||
def analyde_minisat_run(run_document):
|
||||
data = {}
|
||||
|
||||
data["satisfiable"] = run_document["satisfiable"]
|
||||
|
||||
return data
|
||||
|
||||
def majority_vote_sample(sample):
|
||||
assignments = {}
|
||||
|
||||
for coupler, energy in sample.items():
|
||||
|
||||
var = abs(coupler[1])
|
||||
|
||||
if var not in assignments:
|
||||
assignments[var] = {"all": []}
|
||||
|
||||
if energy == 1:
|
||||
assignments[var]["all"].append(1 if coupler[1] > 0 else 0)
|
||||
|
||||
for var, a in assignments.items():
|
||||
assignments[var]["majority"] = 1 if __true_percentage(a["all"]) >= 0.5 else 0
|
||||
|
||||
assignment = [0 for i in range(len(assignments))]
|
||||
|
||||
for var, a in assignments.items():
|
||||
assignment[var - 1] = a["majority"]
|
||||
|
||||
return assignment
|
||||
|
||||
def __true_percentage(a):
|
||||
if len(a) == 0:
|
||||
return 0
|
||||
|
||||
return np.count_nonzero(a) / len(a)
|
||||
|
Reference in New Issue
Block a user