Пример #1
0
    def _toAFD(self, args):
        # Verificamos que tenemos todos los parametros necesarios
        if (len(args) < 4):
            print "El uso del programa debe ser: %s %s <archivo de datos> <archivo de resultado> [minimo]" % (
                args[0], args[1])
            sys.exit()

        dataFile = args[2]
        resultFile = args[3]

        # Instanciamos un AF
        af = AF()

        # Cargamos el AF desde un archivo
        self._loadFromFile(af, dataFile)

        # Ejecutamos el metodo que transforma el AFND a AFD
        af = af.toAFD()

        # Revisamos si el parametro "minimo" fue ingresado
        minimize = False
        if (len(args) > 4 and args[4] == "minimo"):
            minimize = True

        # En caso de ser pedido minimizamos el AFD
        if minimize:
            af.minimize()

        # Escribimos el AFD en un archivo
        self._writeOnFile(af, resultFile)

        print "Paso a AFD terminado correctamente."
Пример #2
0
    def _validar(self, args):
        # Verificamos que tenemos todos los parametros necesarios
        if (len(args) < 3):
            print "El uso del programa debe ser: %s %s <archivo de datos> [secuencia] (Si no se pasa secuencia se analizara la palabra vacia)" % (
                args[0], args[1])
            sys.exit()

        # Cargamos el nombre del archivo con el AF
        dataFile = args[2]

        # Verificamos si el parametro "secuence" fue pasado, en caso contrario
        # validaremos un string vacio
        secuence = ""
        if len(args) > 3:
            secuence = args[3]

        # Instanciamos un AF
        af = AF()

        # Cargamos el AF desde el archivo
        self._loadFromFile(af, dataFile)

        # Ejecutamos la validacion
        isValid = af.validateSecuence(secuence)

        # Imprimimos el resultado
        if isValid:
            print "La secuencia '%s' es valida segun el AF determinado" % (
                secuence)
        else:
            print "La secuencia '%s' NO es valida segun el AF determinado" % (
                secuence)
Пример #3
0
    def _complemento(self, args):
        # Verificamos que tenemos todos los parametros necesarios
        if (len(args) < 4):
            print "El uso del programa debe ser: %s %s <archivo de datos> <archivo de resultado>" % (args[0], args[1])
            sys.exit()

        dataFile = args[2]
        resultFile = args[3]

        # Instanciamos un AF
        af = AF()

        # Cargamos el AF desde un archivo
        self._loadFromFile(af, dataFile)

        # Ejecutamos el metodo que transforma el AFND a AFD
        af = af.toAFD()

        # Complementamos el AFD
        af.complement()

        # Escribimos el AFD en un archivo
        self._writeOnFile(af, resultFile)

        print "Paso a AFD complementado correctamente, el AFD de resultado esta en: %s" % (resultFile)
Пример #4
0
    def _validar(self, args):
        # Verificamos que tenemos todos los parametros necesarios
        if (len(args) < 3):
            print "El uso del programa debe ser: %s %s <archivo de datos> [secuencia] (Si no se pasa secuencia se analizara la palabra vacia)" % (args[0], args[1])
            sys.exit()

        # Cargamos el nombre del archivo con el AF
        dataFile = args[2]

        # Verificamos si el parametro "secuence" fue pasado, en caso contrario
        # validaremos un string vacio
        secuence = ""
        if len(args) > 3:
            secuence = args[3]

        # Instanciamos un AF
        af = AF()

        # Cargamos el AF desde el archivo
        self._loadFromFile(af, dataFile)

        # Ejecutamos la validacion
        isValid = af.validateSecuence(secuence)

        # Imprimimos el resultado
        if isValid:
            print "La secuencia '%s' es valida segun el AF determinado en %s" % (secuence, dataFile)
        else:
            print "La secuencia '%s' NO es valida segun el AF determinado en %s" % (secuence, dataFile)
Пример #5
0
    def _toAFD(self, args):
        # Verificamos que tenemos todos los parametros necesarios
        if (len(args) < 4):
            print "El uso del programa debe ser: %s %s <archivo de datos> <archivo de resultado> [minimo]" % (args[0], args[1])
            sys.exit()

        dataFile = args[2]
        resultFile = args[3]

        # Instanciamos un AF
        af = AF()

        # Cargamos el AF desde un archivo
        self._loadFromFile(af, dataFile)

        # Ejecutamos el metodo que transforma el AFND a AFD
        af = af.toAFD()

        # Revisamos si el parametro "minimo" fue ingresado
        minimize = False
        if(len(args) > 4 and args[4] == "minimo"):
            minimize = True

        # En caso de ser pedido minimizamos el AFD
        if minimize:
            af.minimize()

        # Escribimos el AFD en un archivo
        self._writeOnFile(af, resultFile)

        print "Paso a AFD %sterminado correctamente, el AFD de resultado esta en: %s" % ("minimo " if minimize else "", resultFile)
Пример #6
0
    def _concatenacion(self, args):
        # Verificamos que tenemos todos los parametros necesarios
        if (len(args) < 5):
            print "El uso del programa debe ser: %s %s <archivo de datos 1> <archivo de datos 2> <archivo de resultado>" % (args[0], args[1])
            sys.exit()

        dataFile = args[2]
        dataFileConcatenacion = args[3]
        resultFile = args[4]

        # Instanciamos un AF
        af = AF()

        # Cargamos el AF desde un archivo
        self._loadFromFile(af, dataFile)

         # Instanciamos el segundo AF
        afConcatenacion = AF()

        # Cargamos el AF desde el segundo archivo
        self._loadFromFile(afConcatenacion, dataFileConcatenacion)

        # Unimos los AFDs
        af.concat(afConcatenacion)

        # Escribimos el AFD en un archivo
        self._writeOnFile(af, resultFile)

        print "Proceso de concatenacion de AFs terminado correctamente. Resultado guardado en: %s" % (resultFile)
Пример #7
0
def primer_AF():
    return AF(estados={'q0', 'q1', 'q2', 'q3', 'q4'},
              alfabeto={'a', 'b', 'c'},
              transiciones={
                  'q0': {
                      'a': {'q2'},
                      'b': {'q1', 'q2'}
                  },
                  'q1': {
                      'a': {'q1'},
                      'b': {'q1'},
                      'c': {'q1', 'q2'}
                  },
                  'q2': {
                      'a': {'q3'},
                      'b': {'q2', 'q3'},
                  },
                  'q3': {
                      'a': {'q4'},
                      'b': {'q2'},
                  },
                  'q4': {
                      'c': {'q2'}
                  }
              },
              estado_inicial='q0',
              estados_finales={'q4'})
Пример #8
0
    def _minimizar(self, args):
        # Verificamos que tenemos todos los parametros necesarios
        if (len(args) < 4):
            print "El uso del programa debe ser: %s %s <archivo de datos> <archivo de resultado>" % (args[0], args[1])
            sys.exit()

        dataFile = args[2]
        resultFile = args[3]

        # Instanciamos un AF
        af = AF()

        # Cargamos el AF desde el archivo
        self._loadFromFile(af, dataFile)

        # Ejecutamos la minimizacion
        af.minimize()

        # Escribimos el AD minimizado en un archivo
        self._writeOnFile(af, resultFile)

        print "Minimizacion terminada correctamente, el AFD de resultado esta en: %s" % (resultFile)
Пример #9
0
    def _noAceptarVacia(self, args):
        # Verificamos que tenemos todos los parametros necesarios
        if (len(args) < 4):
            print "El uso del programa debe ser: %s %s <archivo de datos> <archivo de resultado>" % (args[0], args[1])
            sys.exit()

        dataFile = args[2]
        resultFile = args[3]

        # Instanciamos un AF
        af = AF()

        # Cargamos el AF desde un archivo
        self._loadFromFile(af, dataFile)

        # Ejecutamos el proceso en el AFD
        af.noAceptarVacia()

        # Escribimos el AFD en un archivo
        self._writeOnFile(af, resultFile)

        print "Proceso de NO aceptacion de la palabra vacia en el AF terminado correctamente. Resultado guardado en: %s" % (resultFile)
Пример #10
0
    def _kleene(self, args):
        # Verificamos que tenemos todos los parametros necesarios
        if (len(args) < 4):
            print "El uso del programa debe ser: %s %s <archivo de datos> <archivo de resultado>" % (args[0], args[1])
            sys.exit()

        dataFile = args[2]
        resultFile = args[3]

        # Instanciamos un AF
        af = AF()

        # Cargamos el AF desde un archivo
        self._loadFromFile(af, dataFile)

        # Ejecutamos el proceso en el AFD
        af.kleene()

        # Escribimos el AFD en un archivo
        self._writeOnFile(af, resultFile)

        print "AF transformado a AF* correctamente. Resultado guardado en: %s" % (resultFile)
Пример #11
0
    def completions(self, caf, arguments_to_add=None, relations_to_add=None):
        """ Return all possible completions of a given caf.

        Also has the possibility to add extra arguments or attack
        relations to all completions this function returns. This can be
        useful when calculating the completions of a caf under a certain
        control configuration.
        """

        if arguments_to_add is None:
            arguments_to_add = set()
        if relations_to_add is None:
            relations_to_add = set()

        all_comp = set()

        # For every combination of uncertain arguments,
        for u_comb in self.powerset(caf.arg_u):
            u_comb = set(u_comb)
            this_args = caf.arg_f | u_comb | set(arguments_to_add)

            # Find all combination of uncertain attacks for this
            # combination of arguments
            u_attack_combs = self.powerset([
                u_attack for u_attack in caf.att_u
                if u_attack.arg_start in this_args
                and u_attack.arg_end in this_args
            ])

            for u_attack_comb in u_attack_combs:
                u_attack_comb = set(u_attack_comb)
                this_attacks = caf.att_f | u_attack_comb | relations_to_add
                bidir_combs = self.powerset([
                    bidir for bidir in caf.att_b if
                    bidir.arg_start in this_args and bidir.arg_end in this_args
                ])

                # Find all combination of bidirectional attacks for this
                # combination of arguments and uncertain attacks
                for bidir_comb in bidir_combs:
                    # For every bidirectional, add one of the two
                    # directions. Note inversion of start and end!
                    all_comp.add(
                        AF(args=this_args,
                           attacks=this_attacks | {
                               bidir if bidir in bidir_comb else Attack(
                                   arg_start=bidir.arg_end,
                                   arg_end=bidir.arg_start)
                               for bidir in caf.att_b
                           }))
        return all_comp
Пример #12
0
    def _potencia(self, args):
        # Verificamos que tenemos todos los parametros necesarios
        if (len(args) < 4):
            print "El uso del programa debe ser: %s %s <archivo de datos> <archivo de resultado> <potencia>" % (args[0], args[1])
            sys.exit()

        n = 1
        try:
            n = int(args[4])
        except:
            print "El uso del programa debe ser: %s %s %s <archivo de resultado> <potencia>" % (args[0], args[1], args[2])
            sys.exit()

        # Cargamos el nombre del archivo con el AF
        dataFile = args[2]
        resultFile = args[3]

        # Instanciamos un AF
        af = AF()

        # Cargamos el AF desde el archivo
        self._loadFromFile(af, dataFile)

        # Concatenamos una copia del AF a si mismo n-1 veces
        n -= 1

        for i in xrange(n):
            copyAF = copy.deepcopy(af)

            af.concat(copyAF)

        # Escribimos el AFD en un archivo
        self._writeOnFile(af, resultFile)

        # Imprimimos el resultado
        print "AF elevado a la %s potencia. Resultado guardado en %s" % (str(n + 1), resultFile)
Пример #13
0
def segundo_AF():
    return AF(estados={'S', 'A', 'B', 'C', 'D', 'E', 'F'},
              alfabeto={'a', 'b', 'c'},
              transiciones={
                  'S': {
                      'a': {'A', 'D', 'F'},
                      'b': {'C', 'D', 'F'},
                  },
                  'A': {},
                  'B': {
                      'b': {'A', 'B', 'F'},
                  },
                  'C': {},
                  'D': {
                      'a': {'C'},
                      'c': {'E'}
                  },
                  'E': {
                      'b': {'F'},
                  },
                  'F': {}
              },
              estado_inicial='S',
              estados_finales={'F'})
Пример #14
0
from af import AF, estado

af = AF(['a', 'b', 'c', 'd'])
q0 = estado('q0', 'i')
q1 = estado('q1', '')
q2 = estado('q2', '')
q3 = estado('q3', '')
q4 = estado('q4', 'f')
q5 = estado('q5', 'f')
q6 = estado('q6', 'f')

af.transicao(q0, q0, ['a'])
af.transicao(q0, q1, ['a'])
af.transicao(q1, q2, ['b'])
af.transicao(q1, q3, ['b'])
af.transicao(q1, q5, ['b'])
af.transicao(q2, q1, ['a'])
af.transicao(q3, q4, ['c'])
af.transicao(q4, q4, ['c'])
af.transicao(q5, q6, ['c'])
af.transicao(q6, q6, ['d'])

af.testa('abe')
print()
af.testa('abc')
print()
af.testa('abcd')
print()
af.testa('abbbbcd')
Пример #15
0
    def _interseccion(self, args):
        # Verificamos que tenemos todos los parametros necesarios
        if (len(args) < 5):
            print "El uso del programa debe ser: %s %s <archivo de datos 1> <archivo de datos 2> <archivo de resultado>" % (args[0], args[1])
            sys.exit()

        dataFile = args[2]
        dataFileInterseccion = args[3]
        resultFile = args[4]

        # Instanciamos un AF
        af = AF()

        # Cargamos el AF desde un archivo
        self._loadFromFile(af, dataFile)

         # Instanciamos el segundo AF
        afInterseccion = AF()

        # Cargamos el AF desde el segundo archivo
        self._loadFromFile(afInterseccion, dataFileInterseccion)

        # La interseccion de M1 y M2 se define como:
        # (M1c U M2c)c

        # 1.- Complementamos cada AF
        af.complement()
        afInterseccion.complement()

        # 2.- Unimos el segundo AF al primero
        af.union(afInterseccion)

        # 3.- Complementamos el af de la union
        af.complement()

        # Escribimos el AFD en un archivo
        self._writeOnFile(af, resultFile)

        print "Proceso de interseccion de AFs terminado correctamente. Resultado guardado en: %s" % (resultFile)
Пример #16
0
def automata(estados, alfabeto, transiciones, estado_inicial, estados_finales):
    return AF(estados=estados,
              alfabeto=alfabeto,
              transiciones=transiciones,
              estado_inicial=estado_inicial,
              estados_finales=estados_finales)
Пример #17
0
def generate_afs(num_arguments,
                 offers,
                 agent_names,
                 args,
                 attacks,
                 all_args=cf.ALL_ARGS_IN_AF,
                 arguments_af=None,
                 p_attack_AF=cf.P_ATTACK_IN_AF):
    """ Generate the agents' AFs. """
    afs = dict()

    for agent_name in agent_names:

        # If the "All args" parameter is enabled, the AF contains all
        # arguments in the pool.
        if all_args:
            this_args = args

        # If the number of arguments is specified exactly, then sample
        # this many arguments
        elif arguments_af:
            this_args = set(random.sample(population=args, k=arguments_af))

        # If no exact number was specified, then sample between a range
        else:
            this_args = set(
                random.sample(population=args,
                              k=random.randint(
                                  max(cf.MIN_ARGUMENTS_AF, cf.NUM_OFFERS),
                                  min(cf.MAX_ARGUMENTS_AF, num_arguments))))

        # If not enough practical arguments to hold the number of
        # offers, then remove and add arguments until enough
        while len(offers) > len(
            [prc for prc in this_args if prc.PEtype == 'practical']):
            this_args.pop()
            new_arg = random.choice([
                prc for prc in args
                if prc.PEtype == 'practical' and prc not in this_args
            ])
            this_args.add(new_arg)

        this_attacks = set()
        for attack in attacks:

            if (attack.arg_start in this_args and attack.arg_end in this_args):

                rand = random.random()

                # Add valid attacks with a probability
                if rand < p_attack_AF:
                    this_attacks.add(attack)

        supp_args = dict()

        # List the practical arguments
        pracs = [prc for prc in this_args if prc.PEtype == 'practical']

        # Give a practical argument to every offer
        for offer in offers:
            prc = random.choice(pracs)
            supp_args[offer] = {prc}
            pracs.remove(prc)

        # Share the remaining practical arguments over the offers
        for prc in pracs:
            offer = random.choice(offers)
            supp_args[offer].add(prc)
            pracs.remove(prc)

        afs[agent_name] = AF(args=this_args,
                             attacks=this_attacks,
                             supp_args=supp_args)
    return afs