1
Fork 0
mirror of https://github.com/Jaxan/satuio.git synced 2025-04-27 14:47:46 +02:00
satuio/README.md
2022-04-08 14:26:02 +02:00

63 lines
2 KiB
Markdown

satuio
======
Using SAT solvers to construct UIOs and ADSs for Mealy machines (aka
finite state machines). Both problems are PSpace-complete, and so a
SAT solver does not really make sense. However, with a given bound
(encoded unary), the problems are in NP, and so can be encoded in SAT.
There are some Mealy machines in `examples` directory. And even for the
machine with roughly 500 states, the encodings are efficient, and
sequences can be found within minutes.
## Dependencies
This project uses Python3. It uses the following packages which can be
installed with `pip` as follows:
```bash
pip3 install python-sat tqdm rich
```
* [`pysat`](https://github.com/pysathq/pysat)
* [`tqdm`](https://github.com/tqdm/tqdm)
* [`rich`](https://github.com/Textualize/rich/)
## Usage
All scripts show their usage with the `--help` flag. Note that the
flags and options are subject to change, since this is WIP. I
recommend to read the source code of these scripts to see what is
going on. (Or read the upcoming paper.)
```bash
# Finding UIO sequences of fixed length in a Mealy machine
python3 satuio/uio.py --help
# Finding UIO sequences while incrementing the length in a Mealy machine
python3 satuio/uio-incr.py --help
# Finding an ADS in a Mealy machine for a set of states
python3 satuio/ads.py --help
# Returning an unsat core in the case an ADS does not exist
python3 satuio/ads-core.py --help
```
The solver can be specified (as long as pysat supports it). The default is
[Glucose3](https://www.labri.fr/perso/lsimon/glucose/), as that worked
well on the examples. After a bit more testing, these work well: `g3`, `mc`,
`m22`. These are okay: `gc3`, `gc4`, `g4`, `mgh`. And these were slow for me:
`cd`, `lgl`, `mcb`, `mcm`, `mpl`, `mg3`.
The encoding currectly defaults to `seqcounter` for cardinality constraints.
This seems to work just fine, and I am not even sure the encodings are really
different for cardinality of `k=1`. It could be worth doing more testing to
see which is the fastest.
## Copyright
© Joshua Moerman, Open Universiteit, 2022