def sub_generate(self, name, params, lArgs, prefix=''): if isinstance( params, dict): # si dict, on ajoute le suffixe au préfixe res = [ self.sub_generate( name, value, lArgs, prefix=prefix + key) for key, value in params.iteritems()] return futils.merge_lists(res) # si list on génère chaque élément en ajoutant le préfixe à chacun elif isinstance(params, list): res = [ self.sub_generate( name, value, lArgs, prefix=prefix) for value in params] return futils.merge_lists(res) else: # si c'est un élément try: # si on a pas posé de conditions logiques if self.isInvalidCase( name, prefix + str(params)): # a raffiner return [] except: # key error potentiellement pass return self.addArgToDicts(name, prefix + str(params), lArgs)
def sub_generate(self, name, params, lArgs, prefix=''): if isinstance(params, dict): # si dict, on ajoute le suffixe au préfixe res = [ self.sub_generate(name, value, lArgs, prefix=prefix + key) for key, value in params.iteritems() ] return futils.merge_lists(res) # si list on génère chaque élément en ajoutant le préfixe à chacun elif isinstance(params, list): res = [ self.sub_generate(name, value, lArgs, prefix=prefix) for value in params ] return futils.merge_lists(res) else: # si c'est un élément try: # si on a pas posé de conditions logiques if self.isInvalidCase(name, prefix + str(params)): # a raffiner return [] except: # key error potentiellement pass return self.addArgToDicts(name, prefix + str(params), lArgs)
def create_a_FileSol_wit_a_TPdistribution_for_each_agent( file_dcf, percTotal, seuilMin=1, method='short', outfilename=None): ''' return a new sol with this distribution and a new dcf with a new filename percTotal = [0;100] on considere ici que toutes les clauses sont des axioms method = ['random', 'short'] ''' pf = [] comments = [] # stocker pour chaque agent ses propres clauses allAgentsClauses = [] currentAgentClauses = [] currentAgent = None nbClauses = 0 nbAgents = 0 for line in copy.deepcopy(file_dcf.lines): if isinstance(line, futils.Clause): if currentAgent is None: raise Exception( 'wtf on a des cnf dans un dcf alors quon a pas declaé d agents !!') currentAgentClauses.append(line) nbClauses += 1 else: if line.data.startswith('agent('): nbAgents += 1 if currentAgent is not None: allAgentsClauses.append(currentAgentClauses) currentAgentClauses = [] currentAgent = re.findall(r'\d+', line.data)[0] elif line.data.startswith('pf('): pf.append(line) elif line.data.startswith('%'): comments.append(line) # on recupere les clauses du dernier agent allAgentsClauses.append(currentAgentClauses) # le nbre de tp que l on ecrit effectivnet nbNewTp = 0 # le nbre detop clauses que l on veut avoir a la fin nbTp = percTotal / 100. * nbClauses # nbre de clauses par agent nbClAg = int(nbTp / nbAgents) for agentClauses in allAgentsClauses: # faire un random sans remise sur la longueur des agents clauses et les transformer puis incrementer le compteur # pas besoin de verifier si c'est deja TOP CLAUSE ou pas if len(agentClauses) == 0: raise EmptyAgentException('partition d un agent vide...') sizesample = min(nbClAg, len(agentClauses)) if method == 'random': indexesTP = random.sample(range(len(agentClauses)), sizesample) elif method == 'short': agentClauses.sort(cmp=futils.comp_length_clauses) indexesTP = range(sizesample) # prendre les npremeirs # permet de reset et de controler les vertiables parametres for c in agentClauses: c.transformToAxiom() for indexC in indexesTP: agentClauses[indexC].transformToTP() nbNewTp += 1 cpt = nbTp - nbNewTp agentClausesIndex = 0 # on remplit les autres agents avec le nombre de TP restant while (cpt > 0 and nbNewTp != nbTp): agentClauses = allAgentsClauses[agentClausesIndex] for c in agentClauses: if c.isAxiom(): c.transformToTP() nbNewTp += 1 break # cela veut dire qu'on a que des top_clause ici if nbNewTp >= nbTp: break # pire cas : on veut rajouter n top clauses a nu seul agent... cpt -= 1 agentClausesIndex = (agentClausesIndex + 1) % len(agentClauses) sol_lines = comments + futils.merge_lists(allAgentsClauses) + pf if outfilename is None: outfilename = file_dcf.filename + '_TPuniform' + method + \ 'dist_per' + str(percTotal) + '_' + 'seuil' + str(seuilMin) return futils.FileSol( file_dcf.path, outfilename, ext='.sol', lines=sol_lines)
def create_a_FileSol_wit_a_TPdistribution_for_each_agent( file_dcf, percTotal, seuilMin=1, method='short', outfilename=None): ''' return a new sol with this distribution and a new dcf with a new filename percTotal = [0;100] on considere ici que toutes les clauses sont des axioms method = ['random', 'short'] ''' pf = [] comments = [] # stocker pour chaque agent ses propres clauses allAgentsClauses = [] currentAgentClauses = [] currentAgent = None nbClauses = 0 nbAgents = 0 for line in copy.deepcopy(file_dcf.lines): if isinstance(line, futils.Clause): if currentAgent is None: raise Exception( 'wtf on a des cnf dans un dcf alors quon a pas declaé d agents !!' ) currentAgentClauses.append(line) nbClauses += 1 else: if line.data.startswith('agent('): nbAgents += 1 if currentAgent is not None: allAgentsClauses.append(currentAgentClauses) currentAgentClauses = [] currentAgent = re.findall(r'\d+', line.data)[0] elif line.data.startswith('pf('): pf.append(line) elif line.data.startswith('%'): comments.append(line) # on recupere les clauses du dernier agent allAgentsClauses.append(currentAgentClauses) # le nbre de tp que l on ecrit effectivnet nbNewTp = 0 # le nbre detop clauses que l on veut avoir a la fin nbTp = percTotal / 100. * nbClauses # nbre de clauses par agent nbClAg = int(nbTp / nbAgents) for agentClauses in allAgentsClauses: # faire un random sans remise sur la longueur des agents clauses et les transformer puis incrementer le compteur # pas besoin de verifier si c'est deja TOP CLAUSE ou pas if len(agentClauses) == 0: raise EmptyAgentException('partition d un agent vide...') sizesample = min(nbClAg, len(agentClauses)) if method == 'random': indexesTP = random.sample(range(len(agentClauses)), sizesample) elif method == 'short': agentClauses.sort(cmp=futils.comp_length_clauses) indexesTP = range(sizesample) # prendre les npremeirs # permet de reset et de controler les vertiables parametres for c in agentClauses: c.transformToAxiom() for indexC in indexesTP: agentClauses[indexC].transformToTP() nbNewTp += 1 cpt = nbTp - nbNewTp agentClausesIndex = 0 # on remplit les autres agents avec le nombre de TP restant while (cpt > 0 and nbNewTp != nbTp): agentClauses = allAgentsClauses[agentClausesIndex] for c in agentClauses: if c.isAxiom(): c.transformToTP() nbNewTp += 1 break # cela veut dire qu'on a que des top_clause ici if nbNewTp >= nbTp: break # pire cas : on veut rajouter n top clauses a nu seul agent... cpt -= 1 agentClausesIndex = (agentClausesIndex + 1) % len(agentClauses) sol_lines = comments + futils.merge_lists(allAgentsClauses) + pf if outfilename is None: outfilename = file_dcf.filename + '_TPuniform' + method + \ 'dist_per' + str(percTotal) + '_' + 'seuil' + str(seuilMin) return futils.FileSol(file_dcf.path, outfilename, ext='.sol', lines=sol_lines)