def _build_pre_calc_model()

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")