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