Пример #1
0
    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)
Пример #2
0
    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