in source/src/molecule-unfolding/utility/QMUQUBO.py [0:0]
def _build_pre_calc_model(self, **model_param):
for M in model_param["M"]:
for D in model_param["D"]:
for A in model_param["A"]:
for hubo_qubo_val in model_param["hubo_qubo_val"]:
# update var_map
# prepare variables
self.var, self.var_rb_map, self.rb_var_map = self._prepare_var(
self.mol_data, D)
# check availability
if self._check_duplicate([M, D, A, hubo_qubo_val], ["M", "D", "A", "hubo_qubo_val"], "pre-calc"):
logging.info(
f"duplicate model !! pass !! M:{M},D:{D},A:{A},hubo_qubo_val {hubo_qubo_val}")
continue
start = time.time()
hubo = {}
theta_option = [x * 360/D for x in range(D)]
hubo_constraints, hubo_distances = self._build_qubo_pre_calc(self.mol_data, M, D, A, self.var,
self.rb_var_map, self.var_rb_map,
theta_option)
hubo.update(hubo_constraints)
hubo.update(hubo_distances)
# transfer hubo to qubo
# TODO why make_quadratic not work?
# qubo_raw = dimod.make_quadratic(
# hubo, hubo_qubo_val, dimod.BINARY).to_qubo()
qubo_raw = dimod.make_quadratic(
hubo, hubo_qubo_val, dimod.BINARY)
qubo = self._manual_qubo(qubo_raw.to_qubo())
end = time.time()
model_name = f"{M}_{D}_{A}_{hubo_qubo_val}"
self.model_qubo["pre-calc"][model_name] = {}
self.model_qubo["pre-calc"][model_name]["qubo"] = qubo
self.model_qubo["pre-calc"][model_name]["var"] = self.var
self.model_qubo["pre-calc"][model_name]["var_rb_map"] = self.var_rb_map
self.model_qubo["pre-calc"][model_name]["rb_var_map"] = self.rb_var_map
self.model_qubo["pre-calc"][model_name]["time"] = end-start
self.model_qubo["pre-calc"][model_name]["model_name"] = model_name
ris_name = list(self.mol_data.bond_graph.sort_ris_data[str(M)].keys()).copy()
valid_rb_name = []
for name in ris_name:
if len(name.split(',')) == 1:
valid_rb_name.append(name)
self.model_qubo["pre-calc"][model_name]["rb_name"] = valid_rb_name
# # optimize results
# self.model_qubo["pre-calc"][model_name]["optimizer"] = {}
# self.model_qubo["pre-calc"][model_name]["optimizer"]["post"] = {}
logging.info(
f"Construct model for M:{M},D:{D},A:{A},hubo_qubo_val:{hubo_qubo_val} {(end-start)/60} min")