<commit_before><?php

/**
 * SowerPHP
 * Copyright (C) SowerPHP (http://sowerphp.org)
 *
 * Este programa es software libre: usted puede redistribuirlo y/o
 * modificarlo bajo los términos de la Licencia Pública General Affero de GNU
 * publicada por la Fundación para el Software Libre, ya sea la versión
 * 3 de la Licencia, o (a su elección) cualquier versión posterior de la
 * misma.
 *
 * Este programa se distribuye con la esperanza de que sea útil, pero
 * SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita
 * MERCANTIL o de APTITUD PARA UN PROPÓSITO DETERMINADO.
 * Consulte los detalles de la Licencia Pública General Affero de GNU para
 * obtener una información más detallada.
 *
 * Debería haber recibido una copia de la Licencia Pública General Affero de GNU
 * junto a este programa.
 * En caso contrario, consulte <http://www.gnu.org/licenses/agpl.html>.
 */

namespace sowerphp\general;

/**
 * Clase para trabajar con un autómata finito determinístico (AFD)
 * @author <NAME>, DeLaF (esteban[at]delaf.cl)
 * @version 2014-12-19
 */

class Utility_Automata_AFD
{

    private $transitions; ///< Transiciones del autómata
    private $q0; ///< Estado inicial del autómata
    private $F; ///< Conjunto de estados finales
    private $status; ///< Estado en que se detuvo el AFD

    /**
     * Constructor de la clase
     *
     * Ejemplo de llamada:
     * \code
        $t = array(0=>array('a'=>1, 'b'=>'0'), 1=>array('a'=>0, 'b'=>'1'));
        $F = array(1);
        $q0 = 0;
        $afd = new \sowerphp\general\Utility_Automata_AFD($t, $F, $q0);
        \endcode
     *
     * @param transitions Transiciones definidas para el AFD
     * @param F Estados finales de aceptación
     * @param q0 Estado inicial del AFD
     * @author <NAME>, DeLaF (esteban[at]delaf.cl)
     * @version 2014-03-30
     */
    public function __construct ($transitions = array(), $F = array(), $q0 = 0)
    {
        $this->transitions = $transitions;
        $this->F = $F;
        $this->q0 = $q0;
    }

    /**
     * Método que evalua la entrada según las transiciones del autómata
     * @param input Entrada para el AFD (un string o un arreglo de símbolos)
     * @return =true si el estado de detención es de aceptación
     * @author <NAME>, DeLaF (esteban[at]delaf.cl)
     * @version 2013-08-15
     */
    public function run ($input)
    {
        $estado = $this->q0;
        $simbols = is_array($input) ? count($input) : strlen($input);
        for ($i=0; $i<$simbols; ++$i) {
            if (isset($this->transitions[$estado][$input[$i]])) {
                $estado = $this->transitions[$estado][$input[$i]];
            }
        }
        $this->status = $estado;
        return in_array($estado, $this->F);
    }

    /**
     * Obtener el estado final en que se detuvo el AFD
     * @return Entrega el estado donde se detuvo el AFD después de correr
     * @author <NAME>, DeLaF (esteban[at]delaf.cl)
     * @version 2013-08-17
     */
    public function getFinalState ()
    {
        return $this->status;
    }

    /**<commit_msg>Se agrega método para obtener input final del ADF<commit_after><?php

/**
 * SowerPHP
 * Copyright (C) SowerPHP (http://sowerphp.org)
 *
 * Este programa es software libre: usted puede redistribuirlo y/o
 * modificarlo bajo los términos de la Licencia Pública General Affero de GNU
 * publicada por la Fundación para el Software Libre, ya sea la versión
 * 3 de la Licencia, o (a su elección) cualquier versión posterior de la
 * misma.
 *
 * Este programa se distribuye con la esperanza de que sea útil, pero
 * SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita
 * MERCANTIL o de APTITUD PARA UN PROPÓSITO DETERMINADO.
 * Consulte los detalles de la Licencia Pública General Affero de GNU para
 * obtener una información más detallada.
 *
 * Debería haber recibido una copia de la Licencia Pública General Affero de GNU
 * junto a este programa.
 * En caso contrario, consulte <http://www.gnu.org/licenses/agpl.html>.
 */

namespace sowerphp\general;

/**
 * Clase para trabajar con un autómata finito determinístico (AFD)
 * @author <NAME>, DeLaF (esteban[at]delaf.cl)
 * @version 2017-09-13
 */

class Utility_Automata_AFD
{

    private $transitions; ///< Transiciones del autómata
    private $q0; ///< Estado inicial del autómata
    private $F; ///< Conjunto de estados finales
    private $status; ///< Estado en que se detuvo el AFD
    private $input; ///< Entrada en la que se detuvo el AFD

    /**
     * Constructor de la clase
     *
     * Ejemplo de llamada:
     * \code
        $t = array(0=>array('a'=>1, 'b'=>'0'), 1=>array('a'=>0, 'b'=>'1'));
        $F = array(1);
        $q0 = 0;
        $afd = new \sowerphp\general\Utility_Automata_AFD($t, $F, $q0);
        \endcode
     *
     * @param transitions Transiciones definidas para el AFD
     * @param F Estados finales de aceptación
     * @param q0 Estado inicial del AFD
     * @author <NAME>, DeLaF (esteban[at]delaf.cl)
     * @version 2014-03-30
     */
    public function __construct($transitions = array(), $F = array(), $q0 = 0)
    {
        $this->transitions = $transitions;
        $this->F = $F;
        $this->q0 = $q0;
    }

    /**
     * Método que evalua la entrada según las transiciones del autómata
     * @param input Entrada para el AFD (un string o un arreglo de símbolos)
     * @return =true si el estado de detención es de aceptación
     * @author <NAME>, DeLaF (esteban[at]delaf.cl)
     * @version 2013-08-15
     */
    public function run($input)
    {
        $estado = $this->q0;
        $simbols = is_array($input) ? count($input) : strlen($input);
        for ($i=0; $i<$simbols; ++$i) {
            if (isset($this->transitions[$estado][$input[$i]])) {
                $this->input = $input[$i];
                $estado = $this->transitions[$estado][$input[$i]];
            }
        }
        $this->status = $estado;
        return in_array($estado, $this->F);
    }

    /**
     * Obtener el estado final en que se detuvo el AFD
     * @return Entrega el estado donde se detuvo el AFD después de correr
     * @author <NAME>, DeLaF (esteban[at]delaf.cl)
     * @version 2013-08-17
     */
    public function getFinalState()
    {
        return $this->status;
    }

    /**
     * Obtener la entrada final en que se detuvo el AFD
     * @return Entrega el estado donde se detuvo el AFD después de correr
     * @author <NAME>, DeLaF (esteban[at]delaf.cl)
     * @version 2017-09-13
     */
    public function getFinalInput()
    {
        return $this->input;
    }

    /**
{'fraction_non_alphanumeric': 0.12233394271785497, 'fraction_numerical': 0.01675807434491164, 'mean_word_length': 2.601206801974767, 'pattern_counts': {'":': 0, '<': 27, '<?xml version=': 0, '>': 46, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1426009', 'n_tokens_mistral': 2318, 'n_tokens_neox': 2275, 'n_words': 697}