dfa-identify


Namedfa-identify JSON
Version 3.10.2 PyPI version JSON
download
home_pagehttps://github.com/mvcisback/dfa-identify
SummaryPython library for identifying (learning) DFAs (automata) from labeled examples.
upload_time2024-01-28 19:46:28
maintainer
docs_urlNone
authorMarcell Vazquez-Chanlatte
requires_python>=3.9,<4.0
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # dfa-identify
Python library for identifying (learning) minimal DFAs from labeled examples
by reduction to SAT.

[![Build Status](https://cloud.drone.io/api/badges/mvcisback/dfa-identify/status.svg)](https://cloud.drone.io/mvcisback/dfa-identify)
[![PyPI version](https://badge.fury.io/py/dfa-identify.svg)](https://badge.fury.io/py/dfa-identify)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

**Table of Contents**

- [Installation](#installation)
- [Usage](#usage)
- [Encoding](#encoding)
- [Goals and related libraries](#goals-and-related-libraries)

# Installation

If you just need to use `dfa`, you can just run:

`$ pip install dfa`

For developers, note that this project uses the
[poetry](https://poetry.eustace.io/) python package/dependency
management tool. Please familarize yourself with it and then
run:

`$ poetry install`

# Usage

`dfa_identify` is centered around the `find_dfa` and `find_dfas` function. Both take in
sequences of accepting and rejecting "words", where are word is a
sequence of arbitrary python objects. 

1. `find_dfas` returns all minimally sized (no `DFA`s exist of size
smaller) consistent with the given labeled data.

2. `find_dfa` returns an arbitrary (first) minimally sized `DFA`.

The returned `DFA` object is from the [dfa](https://github.com/mvcisback/dfa) library.


```python
from dfa_identify import find_dfa


accepting = ['a', 'abaa', 'bb']
rejecting = ['abb', 'b']
    
my_dfa = find_dfa(accepting=accepting, rejecting=rejecting)

assert all(my_dfa.label(x) for x in accepting)
assert all(not my_dfa.label(x) for x in rejecting)
```

Because words are sequences of arbitrary python objects, the
identification problem, with `a` ↦ 0 and `b` ↦ 1, is given below:


```python
accepting = [[0], [0, 'z', 0, 0], ['z', 'z']]
rejecting = [[0, 'z', 'z'], ['z']]

my_dfa = find_dfa(accepting=accepting, rejecting=rejecting)
```

# Minimality

There are two forms of "minimality" supported by `dfa-identify`.

1. By default, dfa-identify returns DFAs that have the minimum
   number of states required to seperate the accepting and
   rejecting set.
2. If the `order_by_stutter` flag is set to `True`, then the
   `find_dfas` (lazily) orders the DFAs so that the number of
   self loops (stuttering transitions) appearing the DFAs decreases.
   `find_dfa` thus returns a DFA with the most number of self loops
   given the minimal number of states.

# Encoding

This library currently uses the encodings outlined in [Heule, Marijn JH, and Sicco Verwer. "Exact DFA identification using SAT solvers." International Colloquium on Grammatical Inference. Springer, Berlin, Heidelberg, 2010.](https://link.springer.com/chapter/10.1007/978-3-642-15488-1_7) and [Ulyantsev, Vladimir, Ilya Zakirzyanov, and Anatoly Shalyto. "Symmetry Breaking Predicates for SAT-based DFA Identification."](https://arxiv.org/abs/1602.05028).

The key difference is in the use of the symmetry breaking clauses. Two kinds are exposed.

1. clique (Heule 2010): Partially breaks symmetries by analyzing
   conflict graph.
2. bfs (Ulyantsev 2016): Breaks all symmetries so that each model corresponds to a unique DFA.

# Goals and related libraries

There are many other python libraries that 
perform DFA and other automata inference.

1. [DFA-Inductor-py](https://github.com/ctlab/DFA-Inductor-py) - State of the art passive inference via reduction to SAT (as of 2019).
2. [z3gi](https://gitlab.science.ru.nl/rick/z3gi): Uses SMT backed passive learning algorithm.
3. [lstar](https://pypi.org/project/lstar/): Active learning algorithm based L* derivative.

The primary goal of this library is to loosely track the state of the art in passive SAT based inference while providing a simple implementation and API.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/mvcisback/dfa-identify",
    "name": "dfa-identify",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.9,<4.0",
    "maintainer_email": "",
    "keywords": "",
    "author": "Marcell Vazquez-Chanlatte",
    "author_email": "mvc@linux.com",
    "download_url": "https://files.pythonhosted.org/packages/3f/09/17067df7700d50bad120d8e16a61f593db7781e4c1a2420221d4ecd3ca35/dfa_identify-3.10.2.tar.gz",
    "platform": null,
    "description": "# dfa-identify\nPython library for identifying (learning) minimal DFAs from labeled examples\nby reduction to SAT.\n\n[![Build Status](https://cloud.drone.io/api/badges/mvcisback/dfa-identify/status.svg)](https://cloud.drone.io/mvcisback/dfa-identify)\n[![PyPI version](https://badge.fury.io/py/dfa-identify.svg)](https://badge.fury.io/py/dfa-identify)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n**Table of Contents**\n\n- [Installation](#installation)\n- [Usage](#usage)\n- [Encoding](#encoding)\n- [Goals and related libraries](#goals-and-related-libraries)\n\n# Installation\n\nIf you just need to use `dfa`, you can just run:\n\n`$ pip install dfa`\n\nFor developers, note that this project uses the\n[poetry](https://poetry.eustace.io/) python package/dependency\nmanagement tool. Please familarize yourself with it and then\nrun:\n\n`$ poetry install`\n\n# Usage\n\n`dfa_identify` is centered around the `find_dfa` and `find_dfas` function. Both take in\nsequences of accepting and rejecting \"words\", where are word is a\nsequence of arbitrary python objects. \n\n1. `find_dfas` returns all minimally sized (no `DFA`s exist of size\nsmaller) consistent with the given labeled data.\n\n2. `find_dfa` returns an arbitrary (first) minimally sized `DFA`.\n\nThe returned `DFA` object is from the [dfa](https://github.com/mvcisback/dfa) library.\n\n\n```python\nfrom dfa_identify import find_dfa\n\n\naccepting = ['a', 'abaa', 'bb']\nrejecting = ['abb', 'b']\n    \nmy_dfa = find_dfa(accepting=accepting, rejecting=rejecting)\n\nassert all(my_dfa.label(x) for x in accepting)\nassert all(not my_dfa.label(x) for x in rejecting)\n```\n\nBecause words are sequences of arbitrary python objects, the\nidentification problem, with `a` \u21a6 0 and `b` \u21a6 1, is given below:\n\n\n```python\naccepting = [[0], [0, 'z', 0, 0], ['z', 'z']]\nrejecting = [[0, 'z', 'z'], ['z']]\n\nmy_dfa = find_dfa(accepting=accepting, rejecting=rejecting)\n```\n\n# Minimality\n\nThere are two forms of \"minimality\" supported by `dfa-identify`.\n\n1. By default, dfa-identify returns DFAs that have the minimum\n   number of states required to seperate the accepting and\n   rejecting set.\n2. If the `order_by_stutter` flag is set to `True`, then the\n   `find_dfas` (lazily) orders the DFAs so that the number of\n   self loops (stuttering transitions) appearing the DFAs decreases.\n   `find_dfa` thus returns a DFA with the most number of self loops\n   given the minimal number of states.\n\n# Encoding\n\nThis library currently uses the encodings outlined in [Heule, Marijn JH, and Sicco Verwer. \"Exact DFA identification using SAT solvers.\" International Colloquium on Grammatical Inference. Springer, Berlin, Heidelberg, 2010.](https://link.springer.com/chapter/10.1007/978-3-642-15488-1_7) and [Ulyantsev, Vladimir, Ilya Zakirzyanov, and Anatoly Shalyto. \"Symmetry Breaking Predicates for SAT-based DFA Identification.\"](https://arxiv.org/abs/1602.05028).\n\nThe key difference is in the use of the symmetry breaking clauses. Two kinds are exposed.\n\n1. clique (Heule 2010): Partially breaks symmetries by analyzing\n   conflict graph.\n2. bfs (Ulyantsev 2016): Breaks all symmetries so that each model corresponds to a unique DFA.\n\n# Goals and related libraries\n\nThere are many other python libraries that \nperform DFA and other automata inference.\n\n1. [DFA-Inductor-py](https://github.com/ctlab/DFA-Inductor-py) - State of the art passive inference via reduction to SAT (as of 2019).\n2. [z3gi](https://gitlab.science.ru.nl/rick/z3gi): Uses SMT backed passive learning algorithm.\n3. [lstar](https://pypi.org/project/lstar/): Active learning algorithm based L* derivative.\n\nThe primary goal of this library is to loosely track the state of the art in passive SAT based inference while providing a simple implementation and API.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Python library for identifying (learning) DFAs (automata) from labeled examples.",
    "version": "3.10.2",
    "project_urls": {
        "Homepage": "https://github.com/mvcisback/dfa-identify",
        "Repository": "https://github.com/mvcisback/dfa-identify"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a7643367335752f42c9b6d508734cb2a12dfc46a1fc3233989929440b35d2069",
                "md5": "97bfb6381c0b4de2742423b38357a4fc",
                "sha256": "9e53d2eb83817eb53bf2949e93167cdb7aee5d0c757d669e6f38017c89cec099"
            },
            "downloads": -1,
            "filename": "dfa_identify-3.10.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "97bfb6381c0b4de2742423b38357a4fc",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9,<4.0",
            "size": 13618,
            "upload_time": "2024-01-28T19:46:26",
            "upload_time_iso_8601": "2024-01-28T19:46:26.455548Z",
            "url": "https://files.pythonhosted.org/packages/a7/64/3367335752f42c9b6d508734cb2a12dfc46a1fc3233989929440b35d2069/dfa_identify-3.10.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3f0917067df7700d50bad120d8e16a61f593db7781e4c1a2420221d4ecd3ca35",
                "md5": "3a2c1bdb4b75dae34f4b4cc16bead12a",
                "sha256": "9e71641cc11fbe8b54d75ae2c0253a56fb50997bcabf1ac24cc5134d0cddb2d2"
            },
            "downloads": -1,
            "filename": "dfa_identify-3.10.2.tar.gz",
            "has_sig": false,
            "md5_digest": "3a2c1bdb4b75dae34f4b4cc16bead12a",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9,<4.0",
            "size": 13319,
            "upload_time": "2024-01-28T19:46:28",
            "upload_time_iso_8601": "2024-01-28T19:46:28.219681Z",
            "url": "https://files.pythonhosted.org/packages/3f/09/17067df7700d50bad120d8e16a61f593db7781e4c1a2420221d4ecd3ca35/dfa_identify-3.10.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-01-28 19:46:28",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "mvcisback",
    "github_project": "dfa-identify",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "dfa-identify"
}
        
Elapsed time: 0.20554s