A Quick Tour Through Prophesy¶
This tour focuses on the use of the Command Line Interface (CLI). While the tour is organised around a series of problems common in parameter synthesis, we recommend first-time users to follow the guide in a linear fashion.
Sampling¶
A parametric model can be instantiated with different values for the parameters (instantiations). Sampling explores the parameter space (i.e. the set of all instantiations) by evaluating various instantiated models
python scripts/parameter_synthesis.py load-problem model.pm property.pctl sample
The solution function problem¶
This problem asks for a closed-form representation that shows how the measure-of-interest (e.g., the probability to reach a predefined set of target states) depends on the parameter values. Many probabilistic model checkers support these computations: Prophesy can be used as a uniform gateway to these model checkers
python scripts/parameter_synthesis.py load-problem model.pm property.pctl compute-solution-function
This tells the CLI to load the problem instance described by the model file and the property file, and then to compute a solution function. The call can be adapted in several directions
python scripts/parameter_synthesis.py --mc storm load-problem model.pm property.pctl compute-solution-function --export sol.out
This call has been adapted in two directions: We now specified the model checker to be used, in this case storm, and that the result should be exported to a file sol.out.
The computed solution function can be used to speed up sampling:
TBD
The exact synthesis problem¶
The exact synthesis problem asks for an exact representation of all parameter instantiations that satisfy a specification. The solution function is a concise (but often very complex) solution. Prophesy currently does not support any other versions of the exact synthesis problem.
The feasible / optimal instantiation problem¶
The feasible instantiation problem asks for a parameter valuation such that the induced Markov model satisfies a given property.
There are various approaches to do so:
SMT
Particle Swarm Optimisation
Convex optimisation
Using particle swarm optimisation¶
The two essential arguments are whether you want to find a solution above or below the threshold, and what technique to use. Here, we specified to use PSO
$ python scripts/parameter_synthesis.py load-problem model.pm property.pctl set-threshold 0.1 find-feasible-instantiation below pso
The threshold and the direction in the property should not be specified, i.e., use P=? […] to specify your reachability property. Instead, we set the threshold to 0.1 by the command line, and then ask prophesy to find a feasible instantiation.
Using convex optimisation¶
To switch to convex optimisation, all you need to do is switch the last command to QCQP. We notice that this method requires gurobi
$ python scripts/parameter_synthesis.py load-problem model.pm property.pctl set-threshold 0.1 find-feasible-instantiation below qcqp
To speed things up, there are a couple of options that you want to set when using QCQP (they should soon become default flags)
$ python scripts/parameter_synthesis.py load-problem model.pm property.pctl set-threshold 0.1 find-feasible-instantiation --qcqp-incremental --qcqp-store-quadratic --qcqp-handle-violation minimisation --qcqp-mc full --precheck-welldefinedness below qcqp
Options¶
TBD
Using SMT¶
TBD
The parameter space partitioning problem¶
This problem asks to provide a partitioning into accepting, rejecting and unknown regions, trying to minimize the unknown regions.
$ python scripts/parameter_synthesis.py load-problem benchmarkfiles/smallpmdp/smallpmdp.pm benchmarkfiles/smallpmdp/min.pctl set-threshold 3/10 set-parameter-space --region-string "0.1<=p<=0.2,0.4<=q<=0.6" parameter-space-partitioning --iterations 30 pla quads
This method runs using the quad heuristic for splitting the parameter space, and uses PLA (parameter lifting) for verifying the regions.
It is often beneficial to sample a bit before running the parameter space partitiong. We do so by adding the sample command.
$ python scripts/parameter_synthesis.py load-problem benchmarkfiles/smallpmdp/smallpmdp.pm benchmarkfiles/smallpmdp/min.pctl set-threshold 3/10 set-parameter-space --region-string "0.1<=p<=0.2,0.4<=q<=0.6" sample --iterations 2 parameter-space-partitioning --iterations 30 pla quads