def _build_qubo_pre_calc()

in source/src/molecule-unfolding/utility/QMUQUBO.py [0:0]


    def _build_qubo_pre_calc(self, mol_data, M, D, A, var, rb_var_map, var_rb_map, theta_option):
        # initial constraint
        hubo_constraints = {}
        # for m in range(M):
        #     for d1 in range(D):
        #         var_1 = var[str(m+1)][str(d1+1)]
        #         for d2 in range(D):
        #             var_2 = var[str(m+1)][str(d2+1)]
        #             if (var_2, var_1) in hubo_constraints.keys():
        #                 hubo_constraints[(var_2, var_1)] = hubo_constraints[(
        #                     var_2, var_1)] + A
        #             elif var_1 == var_2:
        #                 hubo_constraints[(var_1, var_1)] = -A
        #             else:
        #                 hubo_constraints[(var_1, var_2)] = A

        def update_constraint(ris, hubo_constraints):
            for d1 in range(D):
                var_1 = var[rb_var_map[ris]][str(d1+1)]
                for d2 in range(D):
                    var_2 = var[rb_var_map[ris]][str(d2+1)]
                    if (var_2, var_1) in hubo_constraints.keys():
                        hubo_constraints[(var_2, var_1)] = hubo_constraints[(
                            var_2, var_1)] + A
                    elif var_1 == var_2:
                        hubo_constraints[(var_1, var_1)] = -A
                    else:
                        hubo_constraints[(var_1, var_2)] = A

        # update distance term
        hubo_distances = {}

        def update_hubo(torsion_group, up_list):
            if len(torsion_group) == 1:
                #         print(tor_group)
                for d in range(D):
                    final_list = up_list + \
                        [var[rb_var_map[torsion_group[0]]][str(d+1)]]
                    # distance
                    final_list_name = []
                    if len(final_list) == 1:
                        final_list_name = final_list + final_list
                    else:
                        final_list_name = final_list
#                     hubo_distances[tuple(final_list_name)] = -1
                    distance = -atom_distance_func(tuple(final_list), mol_data, var_rb_map, theta_option, M)
                    hubo_distances[tuple(final_list_name)] = distance
                    logging.debug(f"final list {final_list} with distance {distance}")
            else:
                for d in range(D):
                    final_list = up_list + \
                        [var[rb_var_map[torsion_group[0]]][str(d+1)]]
                    update_hubo(torsion_group[1:], final_list)

        for ris in mol_data.bond_graph.sort_ris_data[str(M)].keys():
            start = time.time()
            logging.debug(f"ris group {ris} ")
            end = time.time()
            torsion_group = ris.split(",")
            if len(torsion_group) == 1:
                # update constraint
                update_constraint(ris, hubo_constraints)
            logging.info(torsion_group)
            # update hubo terms
            update_hubo(torsion_group, [])
            logging.debug(
                f"elapsed time for torsion group {ris} : {(end-start)/60} min")

        return hubo_constraints, hubo_distances