Example #1
0
    def transform_to_distributive_context(self, context):
        """Generate distributive context from current
        
        Can add relations I(j,m) but can't destroy one
        
        """

        #         print('Generate the distributive context \''+context.context_name+'_d\' of the context \''+context.context_name+'\'')
        if context.mode == Context.distributive:
            return context

        distributive_context = Context(context.context_name + '_d')
        distributive_context.J = copy(context.J)
        for j in distributive_context.J:
            j_prime = context.get_j_prime(j)
            j_filters = set()
            X = set()
            for k in distributive_context.J:
                i_prime = context.get_j_prime(k)
                if j_prime >= i_prime:
                    j_filters.add(k)
                else:
                    X.add(k)
            mj = 'm_' + j
            distributive_context.add_m(mj)
            for x in X:
                distributive_context.add_i(x, mj)

        return distributive_context
Example #2
0
    def import_context_from_file(self, file):
        """Import context values from a file.
        
        Read line by line the file to create J, M and I sets.
        Keyword arguments:
        file_path -- the file path
        
        """

        #         print('Generate the context \'' + file.stem + '\' from \'' + str(file) + '\'')
        context = Context(file.stem)

        with file.open() as csv_file:
            lecteur = csv.reader(csv_file, delimiter='\t', quotechar='|')

            M_list = next(lecteur)
            for m in M_list:
                context.add_m(m)

            l = 1
            for line in lecteur:
                c = 0
                j = 'o' + str(l)
                context.add_j(j)
                for colonne in line:
                    if (colonne != '') and (colonne != '0'):
                        context.add_i(j, M_list[c])
                    c += 1
                l += 1

        return context
Example #3
0
    def step_transform_to_median_context(self, context, atoms):

        global_context = Context(context.context_name)

        # For each first filters
        for atom in atoms:

            # Create a new working context
            filter_context = Context(context.context_name + '_' + atom)
            for m in context.get_j_prime(atom):
                filter_context.M.add(m)
                for j in context.get_m_prime(m):
                    if j != atom:
                        filter_context.add_j(j)
                        filter_context.add_i(j, m)

            # Generate the distributive first filter context
            distributive_filter_context = self.transform_to_distributive_context(
                filter_context)

            if not len(distributive_filter_context.I):
                for j in distributive_filter_context.J:
                    m_label = 'c' + str(atom)
                    distributive_filter_context.add_m(m_label)
                    distributive_filter_context.add_i(j, m_label)

            # Fusion with previous distributive first filter context (no merge node atm)
            global_context.J.update(distributive_filter_context.J)
            # Add first filter if not exist
            # TODO: utile ?
            if not atom in global_context.J:
                global_context.add_j(atom)
                # If no attribute, create new one
                if not len(distributive_filter_context.M):
                    new_name_m = 'a' + str(global_context.name_next_variable)
                    global_context.add_m(new_name_m)
                    global_context.add_i(atom, new_name_m)
                    global_context.name_next_variable += 1
            # Add all M with a new name
            for m in distributive_filter_context.M:
                new_name_m = 'a' + str(global_context.name_next_variable)
                global_context.add_m(new_name_m)
                for i in distributive_filter_context.I:
                    if i[1] == m:
                        global_context.add_i(i[0], new_name_m)
                global_context.add_i(atom, new_name_m)
                global_context.name_next_variable += 1

        return global_context
Example #4
0
    def extract_atoms_contexts(self, context, atoms):

        list_contexts = set()

        std = self.transform_to_standard_context(context)
        # For each first filters
        for atom in atoms:

            # Create a new working context
            atom_context = Context(std.context_name + '_' + atom)
            for m in std.get_j_prime(atom):
                atom_context.add_m(m)
                for j in std.get_m_prime(m):
                    atom_context.add_j(j)
                    atom_context.add_i(j, m)
            list_contexts.add(atom_context)

        return list_contexts