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.
Metadata
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 | Provenance | |
|---|---|---|---|---|
| probabilistic_automata-0.4.2.tar.gz | 10.3 kB | Without provenance | 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
|
Security for probabilistic-automata 0.4.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.