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
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
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
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