# -*- coding: utf-8 -*- def get_frames_differences(initial_frames, frames): differences = {'matching_frames': [], 'missing_frames': []} for ini_frame in initial_frames: matching_frame = get_matching_frame(frames, ini_frame) if matching_frame: differences['matching_frames'].append(ini_frame) else: differences['missing_frames'].append(ini_frame) return differences def get_matching_frame(frames, frame_to_find): for frame in frames.all(): if frames_match(frame, frame_to_find): return frame_to_find return None def frames_match(frame1, frame2): complements1 = frame1.complements complements2 = frame2.complements if complements1.count() == complements2.count(): for compl in complements1.all(): if not matching_complement_exists(complements2.all(), compl): return False else: return False return True def matching_complement_exists(complements, compl_to_find): for compl in complements: if complements_match(compl, compl_to_find): return True return False def complements_match(compl1, compl2): if (roles_match(compl1.roles, compl2.roles) and preference_match(compl1.selective_preference, compl2.selective_preference)): return True return False def roles_match(roles1, roles2): if set(roles1.all()) == set(roles2.all()): return True return False def preference_match(sel_preference1, sel_preference2): if(general_sel_prefs_match(sel_preference1, sel_preference2) and synset_sel_prefs_match(sel_preference1, sel_preference2) and relation_sel_prefs_match(sel_preference1, sel_preference2) and synset_rel_sel_prefs_match(sel_preference1, sel_preference2)): return True return False def general_sel_prefs_match(sel_preference1, sel_preference2): if set(sel_preference1.generals.all()) == set(sel_preference2.generals.all()): return True return False def synset_sel_prefs_match(sel_preference1, sel_preference2): if set(sel_preference1.synsets.all()) == set(sel_preference2.synsets.all()): return True return False def relation_sel_prefs_match(sel_preference1, sel_preference2): relations1 = sel_preference1.relations relations2 = sel_preference2.relations if relations1.count() == relations2.count(): for rel in relations1.all(): if not matching_relation_exists(rel, relations2): return False else: return False return True def matching_relation_exists(rel_to_find, relations): for rel in relations.filter(relation=rel_to_find.relation): if complements_match(rel_to_find.to, rel.to): return True return False def synset_rel_sel_prefs_match(sel_preference1, sel_preference2): relations1 = sel_preference1.synset_relations relations2 = sel_preference2.synset_relations if relations1.count() == relations2.count(): for rel in relations1.all(): if not matching_synset_relation_exists(rel, relations2): return False else: return False return True def matching_synset_relation_exists(rel_to_find, relations): for rel in relations.filter(relation=rel_to_find.relation): if rel_to_find.to == rel.to: return True return False