From 34fa6fbcf595f5c793fe4172bbd379e7f85acbe9 Mon Sep 17 00:00:00 2001 From: CoprDistGit Date: Thu, 18 May 2023 05:08:15 +0000 Subject: automatic import of python-dfa --- python-dfa.spec | 1022 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1022 insertions(+) create mode 100644 python-dfa.spec (limited to 'python-dfa.spec') diff --git a/python-dfa.spec b/python-dfa.spec new file mode 100644 index 0000000..b472274 --- /dev/null +++ b/python-dfa.spec @@ -0,0 +1,1022 @@ +%global _empty_manifest_terminate_build 0 +Name: python-dfa +Version: 4.6.3 +Release: 1 +Summary: Python library for modeling DFAs, Moore Machines, and Transition Systems. +License: MIT +URL: https://github.com/mvcisback/dfa +Source0: https://mirrors.nju.edu.cn/pypi/web/packages/3f/cd/d298844a3cb0e7477f5494f2140cf369907ab709391d1ed0079b8026ca41/dfa-4.6.3.tar.gz +BuildArch: noarch + +Requires: python3-attrs +Requires: python3-funcy +Requires: python3-pydot +Requires: python3-bidict +Requires: python3-bitarray + +%description +# DFA + +A simple python implementation of a DFA. + +[![Build Status](https://cloud.drone.io/api/badges/mvcisback/dfa/status.svg)](https://cloud.drone.io/mvcisback/dfa) +[![PyPI version](https://badge.fury.io/py/dfa.svg)](https://badge.fury.io/py/dfa) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) + + +**Table of Contents** + +- [Installation](#installation) +- [Usage](#usage) + - [Membership Queries](#membership-queries) + - [Transitions and Traces](#transitions-and-traces) + - [Non-boolean output alphabets](#non-boolean-output-alphabets) + - [Moore Machines](#moore-machines) + - [DFA <-> Dictionary](#dfa---dictionary) + - [Computing Reachable States](#computing-reachable-states) + - [Sampling Paths](#sampling-paths) + - [Running interactively (Co-Routine API)](#running-interactively-co-routine-api) + - [Visualizing DFAs](#visualizing-dfas) + + + + +**Features:** + +1. State can be any Hashable object. +2. Alphabet can be any finite sequence of Hashable objects. +3. Designed to be immutable and hashable (assuming components are + immutable and hashable). +4. Design choice to allow transition map and accepting set to be + given as functions rather than an explicit `dict` or `set`. + +# 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 + +The `dfa` api is centered around the `DFA` object. + +By default, the `DFA` object models a `Deterministic Finite Acceptor`, +e.g., a recognizer of a Regular Language. + +**Example Usage:** +```python +from dfa import DFA + +dfa1 = DFA( + start=0, + inputs={0, 1}, + label=lambda s: (s % 4) == 3, + transition=lambda s, c: (s + c) % 4, +) + +dfa2 = DFA( + start="left", + inputs={"move right", "move left"}, + label=lambda s: s == "left", + transition=lambda s, c: "left" if c == "move left" else "right", +) +``` + +## Membership Queries + +```python +assert dfa1.label([1, 1, 1, 1]) +assert not dfa1.label([1, 0]) + +assert dfa2.label(["move right"]*100 + ["move left"]) +assert not dfa2.label(["move left", "move right"]) +``` + +## Transitions and Traces + +```python +assert dfa1.transition([1, 1, 1]) == 3 +assert list(dfa1.trace([1, 1, 1])) == [0, 1, 2, 3] +``` + +## Non-boolean output alphabets + +Sometimes, it is useful to model an automata which can label a word +using a non-Boolean alphabet. For example, `{True, False, UNSURE}`. + +The `DFA` object supports this by specifying the output alphabet. + +```python +UNSURE = None + +def my_labeler(s): + if s % 4 == 2: + return None + return (s % 4) == 3 + + +dfa3 = DFA( + start=0, + inputs={0, 1}, + label=my_labeler, + transition=lambda s, c: (s + c) % 4, + outputs={True, False, UNSURE}, +) +``` + +**Note:** If `outputs` is set to `None`, then no checks are done that +the outputs are within the output alphabet. + +```python +dfa3 = DFA( + start=0, + inputs={0, 1}, + label=my_labeler, + transition=lambda s, c: (s + c) % 4, + outputs=None, +) +``` + +## Moore Machines + +Finally, by reinterpreting the structure of the `DFA` object, one can +model a Moore Machine. For example, in 3 state counter, `dfa1`, the +Moore Machine can output the current count. + +```python +assert dfa1.transduce(()) == () +assert dfa1.transduce((1,)) == (False,) +assert dfa1.transduce((1, 1, 1, 1)) == (False, False, False, True) +``` + +## Language Queries + +Utility functions are available for testing if a language: + +1. Is empty: `utils.find_word` +2. Is equivilent to another language: `utils.find_equiv_counterexample` +3. Is a subset of a another language: `utils.find_subset_counterexample` + +These operate by returning `None` if the property holds, i.e., +`lang(dfa1) = ∅, lang(dfa1) ≡ lang(dfa2), lang(dfa1) ⊆ lang(dfa2)`, and +returning a counterexample `Word` otherwise. + +## DFA <-> Dictionary + +Note that `dfa` provides helper functions for going from a dictionary +based representation of a deterministic transition system to a `DFA` +object and back. + +```python +from dfa import dfa2dict, dict2dfa + +# DFA encoded a nested dictionaries with the following +# signature. +# : (