EFSM inference tool which takes in system execution traces and returns an EFSM model of the observed behaviour. The inference process is formalised in Isabelle/HOL and then exported to an executable tool using the code generator. Further details of the process can be found in [1, 2].
The tool can be build and run using Docker without the need to install any additional dependencies natively.
cd inference
docker build -t inference .
docker run inference [<options>] trainfile testfile
You may additionally need to pass in "volume mounts" to Docker to enable it to access files on the host, i.e. trainfile and testfile, or to write logs to the host. This can be done by passing the -v option to docker, the structure being -v <path on host>:<path on container>. Please note that all paths must be absolute.
An example is as follows.
docker run -v ~/Documents/efsm-inference/inference-tool/sample-traces:/home/sbtuser/efsm-inference/sample-traces -v ~/Documents/efsm-inference/inference-tool/dotfiles:/home/sbtuser/efsm-inference/dotfiles inference -d dotfiles sample-traces/vend1.json sample-traces/vend2.json
Here, we run the container with sample-traces and dotfiles mounted as volumes. We then use sample-traces/vend1.json as our train file and sample-traces/vend2.json as our test file. We then use the -d option (full list below) to write all output to the dotfiles directory.
NOTE: To make output files visible after inference has run, you must pass in your intended output directory as a volume to the docker container, otherwise it will disappear when the volume exits.
In order to run the tool, certain requirements must be met:
- Install SBT
- Install a JDK (I used
openjdk-11-jdk-headless) - Install z3 with support for java and move
libz3java.soandlibz3.sointo a directory in your java.library.path
The tool can be compiled by calling sbt assembly from within the inference-tool directory. This will create a jar file inference-tool-assembly-0.1.0-SNAPSHOT.jar in inference-tool/scala-2.X/. This can then be run with java -jar target/scala-2.12/inference-tool-assembly-0.1.0-SNAPSHOT.jar [options] trainFile testFile
--help prints this usage text
-h, --heuristics <heuristic1>,<heuristic2>...
heuristics to give the inference process Heuristics.ValueSet(store, inputgen, inc, distinguish, same, ws, lob)
-k, --k k The depth of the k-tails (defaults to zero)
-t, --numTraces numTraces
The number of traces in the log to actually use
-i, --gpIterations GP iterations
The number of iterations to run the symbolic regression heuristic for (defaults to 50)
-s, --strategy strategy The preferred strategy to rank state merges Strategies.ValueSet(naive, naive_eq_bonus, rank, comprehensive, comprehensiveEQ, eq)
-n, --nondeterminism nondeterminism checker
The preferred definition of nondeterminism - defaults to label, arity, and guard check Nondeterminisms.ValueSet(basic, labar, labar_d)
-d, --dotfiles dir The directory in which to save dotfiles produced during the inference process - defaults to 'dotfiles'
--skip Set this flag to skip some model checking tests which should be trivially true
--mkdir Set this flag to skip all inference and just test the making of directories
-p, --preprocessor preprocessor
Preprocessor to use before inference begins Preprocessors.ValueSet(gp, dropGuards, none)
--small Set this flag to map integers down to smaller values
-l, --level level The log level {info, debug, warn, error}
-f, --logFile logFile The name/location of the logFile
-g, --guardSeed Random seed for guard GP
-o, --outputSeed Random seed for output GP
-u, --updateSeed Random seed for update GP
trainFile The json file listing the training traces
testFile The json file listing the test traces
The JSON training and test files should contain a list of lists of objects of the form {"label": "label1", "inputs": ["i1", "i2",...],"outputs": ["o1", "o2",...]},. Examples can be found within the inference-tool/experimental-data directory.
[1] Formalising Extended Finite State Machine Transition Merging
Michael Foster, Achim D. Brucker, Ramsay G. Taylor, John Derrick
In Proceedings of the 20th International Conference on Formal Engineering Methods, 2018
[2] Incorporating Data into EFSM Inference
Michael Foster, Achim D. Brucker, Ramsay G. Taylor, Siobhán North, John Derrick
In Software Engineering and Formal Methods, 2019
[2] Reverse-Engineering EFSMs with Data Dependencies
Michael Foster, John Derrick, Neil Walkinshaw
In Testing Software and Systems, 2021