def analyse(file, graph_directory, export_directory): print('-' * 25) print('Analysis of \'' + file.stem + '\'') print(file) engine = Engine(graph_directory) context = engine.import_context_from_file(file) # context_extended = engine.transform_to_extended_context(context) latice_context = Lattice(engine, context) latice_context.generate_graph(graph_directory) # context.display() # context.export_txt_for_conex(export_directory) # latice_context = Lattice(engine, context_extended) # latice_context.generate_graph(graph_directory, add_name = '_ext', extended = True) # context.display() # context.export_txt_for_conex(export_directory) median_context = engine.transform_to_median_context(context) lattice_median_context = Lattice(engine, median_context) lattice_median_context.generate_graph(graph_directory, differences=context.J) print('-' * 25)
def transform_to_median_context(self, context): # print('Generate the context with distributive first filters \'' + context.context_name+'_df\' from the context \'' + context.context_name+'\'') if context.mode == Context.median: return context global_context = self.transform_to_standard_context(context) atoms = global_context.get_atoms() # global_context_copy = deepcopy(global_context) ext_global_context = self.transform_to_extended_context(global_context) step = 0 median = False while not median: previous_global_context = deepcopy(global_context) median = True atoms_contexts = self.extract_atoms_contexts( ext_global_context, atoms) for atom_context in atoms_contexts: # print('test median') if not self.context_is_distributive(atom_context): median = False if not median: step += 1 global_context = self.step_transform_to_median_context( previous_global_context, atoms) ext_global_context = self.transform_to_extended_context( global_context) lattice = Lattice(self, ext_global_context) lattice.generate_graph(self.graph_directory, '_distri' + str(step), extended=True) merge_ended = False countLoop = 0 while not merge_ended: countLoop += 1 # print('Debug - median', step, countLoop) merge_ended = True ext_global_context_copy = deepcopy(ext_global_context) for concept in ext_global_context_copy.J: count = 0 for atom in atoms: if ext_global_context.get_j_prime(atom).issuperset( ext_global_context.get_j_prime(concept)): count += 1 if count > 1: break if count > 1: concept_prime = ext_global_context.get_j_prime( concept) sups = ext_global_context.get_directs_j_sups( concept_prime) # sups.difference_update(global_context_copy.J) if len(sups) > 1: # Check if e's sups are mergable sups_mergables = set() concept_second = ext_global_context.get_j_second( concept) modification = True while modification: #len(sups) > 0: modification = False sups.difference_update(sups_mergables) sups_mergables = set() atoms_source = set() for sup in sups: if sup in ext_global_context.J.difference( global_context.J): sup_seconds = ext_global_context.get_j_second( sup) sup_seconds.discard(sup) sup_edits = sup_seconds.difference( concept_second) sup_edits_prime = set() for sup_edit in sup_edits: sup_edits_prime.update( ext_global_context. get_j_prime(sup_edit)) mergeable = True for atom_source in atoms_source: atom_prime = ext_global_context.get_j_prime( atom_source) for sup_second in sup_edits: if atom_prime.issuperset( ext_global_context. get_j_prime( sup_second)): mergeable = False break if mergeable: for atom in atoms: atom_prime = ext_global_context.get_j_prime( atom) for sup_second in sup_edits: if atom_prime.issuperset( ext_global_context .get_j_prime( sup_second) ): atoms_source.add( atom) break sups_mergables.add(sup) modification = True # if len(sups_mergables) > 1: sups_unions = set() sups_second_union = set() sups_second_inter = copy( ext_global_context.J) # print('Debug, POWER') # ext_global_context.display() # print('Debug, sups_mergables', sups_mergables) for sup in sups_mergables: sup_prime = ext_global_context.get_j_prime( sup) sups_unions.update(sup_prime) # print('Union', sup, sup_prime, sups_unions) second = ext_global_context.get_j_second( sup) sups_second_union.update(second) # print('Second Union', sup, second, sups_second_union) sups_second_inter.intersection_update( second) # print('Second Inter', sup, second, sups_second_inter) # for sups_union in sorted(sups_unions): # label += '_'+sups_union for sup_second in sups_second_union: for sups_union in sups_unions: ext_global_context.add_i( sup_second, sups_union) # print('In loop, old', sup_second, sups_unions) label = ext_global_context.new_m_id( 'n') ext_global_context.add_m(label) for sup_second in sups_second_inter: ext_global_context.add_i( sup_second, label) # print('In loop, new', sups_second_inter, label) # ext_global_context.display() merge_ended = False break elif len(sups) < 2: infs = ext_global_context.get_directs_j_infs( concept_prime) if len(infs) == 1: counter = 0 for inf in infs: counter += 1 assert counter < 2 inf_prime = ext_global_context.get_j_prime( inf) for inf_m in inf_prime: ext_global_context.add_i( concept, inf_m) merge_ended = False break global_context = self.transform_to_standard_context( ext_global_context) # global_context.context_name = 'debug_std'+str(countLoop) # global_context.display() ext_global_context = self.transform_to_extended_context( global_context) # ext_global_context.context_name = 'debug_ext'+str(countLoop) # ext_global_context.display() if not merge_ended: lattice = Lattice(self, ext_global_context) lattice.generate_graph( self.graph_directory, '_distri' + str(step) + '_merge' + str(countLoop)) previous_global_context.context_name += '_median' previous_global_context.mode = Context.median return previous_global_context