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