def build_ris_data()

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


    def build_ris_data(self, rb_data):
        ris_data = {}

        def judge_side_by_metrics(rb_data, candidate_pt):
            if candidate_pt in rb_data['f_0_set']:
                return 0
            if candidate_pt in rb_data['f_1_set']:
                return 1

        def update_bc_info(ris_data_bond, rb_data, bond_group):
            bc_num = []
            for rb in bond_group:
                bc_num.append(rb_data[rb]['bc_num'])
            ris_data_bond['avg_bc_num'] = sum(bc_num)/len(bc_num)
            ris_data_bond['rb_count_num'] = len(bc_num)

        def update_ris_data(ris_data, rb_data, candidate_pair):
            atom_l = candidate_pair[0]
            atom_r = candidate_pair[1]
            bond_group = []
            for rb, pts_data in rb_data.items():
                if (atom_l in pts_data['f_0_set'] and atom_r in pts_data['f_1_set']) or (atom_l in pts_data['f_1_set'] and atom_r in pts_data['f_0_set']):
                    bond_group.append(rb)

            if len(bond_group) == 0:
                return

            bond_name = ','.join(bond_group)

            if bond_name not in ris_data.keys():
                ris_data[bond_name] = {}
                ris_data[bond_name]['metrics'] = bond_group[0]
                ris_data[bond_name]['f_0_set'] = set()
                ris_data[bond_name]['f_1_set'] = set()
                # update bc score
                update_bc_info(ris_data[bond_name], rb_data, bond_group)

            for atom in candidate_pair:
                side = judge_side_by_metrics(
                    rb_data[ris_data[bond_name]['metrics']], atom)
                ris_data[bond_name]['f_{}_set'.format(side)].add(atom)

        for atom_l in range(1, self.atom_num+1):
            for atom_r in range(atom_l+1, self.atom_num+1):
                candidate_pair = (str(atom_l), str(atom_r))
                update_ris_data(ris_data, rb_data, candidate_pair)
        #         print("{}-{}".format(atom_l, atom_r))

        # sorted(ris_data, key=lambda ris: (ris['rb_count_num']))
        # sort by num of bond at first (from small to large)
        # sort by bc_num at second ( from large to small)
        sor_ris_data = {k: v for k, v in sorted(ris_data.items(), key=lambda ris: (
            ris[1]['rb_count_num'], -ris[1]['avg_bc_num']))}
        return sor_ris_data