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.
Release files for probabilistic-automata 0.4.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| probabilistic_automata-0.4.2.tar.gz | 10.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| probabilistic_automata-0.4.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 20.1 kB
Release files / probabilistic_automata-0.4.2.tar.gz
| Download URL | probabilistic_automata-0.4.2.tar.gz |
|---|---|
| Size | 10.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6ec0cf5ad5cf719d6f87604657a3cf82ed2b1562cc2fd2807a5261d6f3e83c1e
|
|
BLAKE2b-256 checksum How to use checksums |
83b4fc74ab9320c4dc0e62d098bb8daacf4d69f6f67c34f65320ff68f9091852
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.0.10 CPython/3.8.5 Linux/5.4.0-51-generic
|
Release files / probabilistic_automata-0.4.2-py3-none-any.whl
| Download URL | probabilistic_automata-0.4.2-py3-none-any.whl |
|---|---|
| Size | 9.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
98679851fcb5e36fe880e33be17473c8222fd8ae04985bd9a0156e9b85b93906
|
|
BLAKE2b-256 checksum How to use checksums |
c425954ef42250b0744c81066959cebdbf2daf730e7ecd0721bd5bb2124b2b88
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.0.10 CPython/3.8.5 Linux/5.4.0-51-generic
|