Python library for manipulating probabilistic automata.
Project description
Probabilistic Automata
Python library for manipulating Probabilistic Automata. This library
builds upon the dfa package.
Table of Contents
Installation
If you just need to use probabilistic_automata, you can just run:
$ pip install probabilistic_automata
For developers, note that this project uses the poetry python package/dependency management tool. Please familarize yourself with it and then run:
$ poetry install
Usage
The probabilistic_automata library centers around the PDFA object
which models a finite probabilistic transition system, e.g., a Markov
Decision Process, as a DFA or Moore Machine over a product alphabet
over the system's actions and the environment's stochastic action.
import probabilistic_automata as PA
def transition(state, composite_action):
sys_action, env_action = composite_action
return (state + sys_action + env_action) % 2
def env_dist(state, sys_action):
"""Based on state and the system action, what are the probabilities
of the environment's action."""
return {0: 1/2, 1: 1/2} # Always a coin flip.
noisy_parity = PA.pdfa(
start=0,
label=bool,
inputs={0, 1},
env_inputs={0, 1},
outputs={0, 1},
transition=transition,
env_dist=env_dist, # Equivalently, PA.uniform({0, 1}).
)
The support and transition probabilities can easily calculated:
assert noisy_parity.support(0, 0) == {0, 1}
assert noisy_parity.transition_probs(0, 0) == {0: 1/2, 1: 1/2}
assert noisy_parity.prob(start=0, action=0, end=0) == 1/2
Dict <-> PDFA
Note that pdfa provides helper functions for going from a dictionary
based representation of a probabilistic transition system to a PDFA
object and back.
import probabilistic_automata as PA
mapping = {
"s1": (True, {
'a': {'s1': 0.5, 's2': 0.5},
}),
"s2": (False, {
'a': {'s1': 1},
}),
}
start = "s1"
pdfa = PA.dict2pdfa(mapping=mapping, start=start)
assert pdfa.inputs == {'a'}
mapping2, start2 = PA.pdfa2dict(pdfa)
assert start == start2
assert mapping2 == mapping
DFA to PDFA
The probabilistic_automata library has two convenience methods for
transforming a Deterministic Finite Automaton (dfa.DFA) into a
PDFA.
- The
liftfunction simply creates aPDFAwhose transitions are deterministic and match the originaldfa.DFA.
import probabilistic_automata as PA
from dfa import DFA
parity = DFA(
start=0,
inputs={0, 1},
label=bool,
transition=lambda s, c: (s + c) & 1,
)
parity_pdfa = lift(parity)
assert pdfa.inputs == parity.inputs
assert pdfa.env_inputs == {None}
- The
randomizefunction takes aDFAand returns aPDFAmodeling the actions of theDFAbeing selected uniformly at random.
noisy_parity = PA.randomize(parity)
assert noisy_parity.inputs == {None}
assert noisy_parity.env_inputs == noisy_parity.inputs
Composition
Like their deterministic variants PDFA objects can be combined in
two ways:
- (Synchronous) Cascading Composition: Feed outputs of one
PDFAinto another.
machine = noisy_parity >> noisy_parity
assert machine.inputs == noisy_parity.inputs
assert machine.outputs == noisy_parity.outputs
assert machine.start == (0, 0)
assert machine.support((0, 0), 0) == {(0, 0), (0, 1), (1, 0), (1, 1)}
- (Synchronous) Parallel Composition: Run two
PDFAs in parallel.
machine = noisy_parity | noisy_parity
assert machine.inputs.left == noisy_parity.inputs
assert machine.inputs.right == noisy_parity.inputs
assert machine.outputs.left == noisy_parity.outputs
assert machine.outputs.right == noisy_parity.outputs
assert machine.env_inputs.left == noisy_parity.env_inputs
assert machine.env_inputs.right == noisy_parity.env_inputs
assert machine.start == (0, 0)
assert machine.support((0, 0), (0, 0)) == {(0, 0), (0, 1), (1, 0), (1, 1)}
Note Parallel composition results in a PDFA with
dfa.ProductAlphabet input and output alphabets.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file probabilistic_automata-0.4.2.tar.gz.
File metadata
- Download URL: probabilistic_automata-0.4.2.tar.gz
- Upload date:
- Size: 10.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.0.10 CPython/3.8.5 Linux/5.4.0-51-generic
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6ec0cf5ad5cf719d6f87604657a3cf82ed2b1562cc2fd2807a5261d6f3e83c1e
|
|
| MD5 |
c4dbb3ff0cea4e856aecd0777a43f7f3
|
|
| BLAKE2b-256 |
83b4fc74ab9320c4dc0e62d098bb8daacf4d69f6f67c34f65320ff68f9091852
|
File details
Details for the file probabilistic_automata-0.4.2-py3-none-any.whl.
File metadata
- Download URL: probabilistic_automata-0.4.2-py3-none-any.whl
- Upload date:
- Size: 9.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.0.10 CPython/3.8.5 Linux/5.4.0-51-generic
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
98679851fcb5e36fe880e33be17473c8222fd8ae04985bd9a0156e9b85b93906
|
|
| MD5 |
18ed2668feeea12e397d5f45c071ddcd
|
|
| BLAKE2b-256 |
c425954ef42250b0744c81066959cebdbf2daf730e7ecd0721bd5bb2124b2b88
|