Metadata-Version: 2.1
Name: dfa-mutate
Version: 0.1.0
Summary: Library for mutating a DFA represented using the dfa library.
License: MIT
Author: Marcell Vazquez-Chanlatte
Author-email: mvc@linux.com
Requires-Python: >=3.10,<4.0
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Requires-Dist: dfa (>=4.6.3,<5.0.0)
Requires-Dist: numpy (>=1.24.3,<2.0.0)
Description-Content-Type: text/markdown

# DFA Mutate

Primitives and utilities for manipulating deterministic finite automata (DFA) represented using the [dfa](https://github.com/mvcisback/dfa) library.

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

**Table of Contents**

- [Installation](#installation)
- [Usage](#usage)


 Installation

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

`$ pip install dfa_mutate`

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

**Example Usage:**
```python
from dfa import DFA
import dfa_mutate

dfa1 = DFA(
    start=0,
    inputs={0, 1},
    label=lambda s: (s % 4) == 3,
    transition=lambda s, c: (s + c) % 4,
)

# Pick a specific mutation.
dfa2 = dfa_mutate.add_state(dfa1)
dfa3 = dfa_mutate.change_start(dfa1)
dfa4 = dfa_mutate.change_transition(dfa1)
dfa5 = dfa_mutate.relabel_state(dfa1)

# Infinite Generator mutations round-robin (will repeat).
dfas = dfa_mutate.generate_mutations(orig)

# Sample DFA using softmax over a scoring function (default constant).
# Uses first n dfas generated by above generator.

# NOTE: requires the optional numpy dependency.
dfa6 = dfa_mutate.sample_mutation(dfa1, n=20, score=lambda d: len(d.states()))

# All functions support passing in random number generator.
import random
dfa7 = dfa_mutate.relabel_state(dfa1, random.Random(0))
```


