>>> Random DTMC Generator (r-dtmc.cc)

Contains functions to generate random DTMCs and return them as a
MarkovChain (class declared in prmodel.h). Can be linked into
another program or compiled as a stand-alone (see Makefile).


>>> Random MDP Generator (r-mdp.cc)

Contains a function to generate a random MDP/PA and return it as a
ProbabilisticAutomaton (class declared in prmodel.h) . The
probability will always be distributed evenly between successors in
models created by this function. Can be linked into another program
or compiled as a stand-alone (see Makefile).


>>> Probabilistic Models (prmodel.cc, prmodel.h)

Interface class for some types of probabilistic models, namely
MCs and PAs. The class implementations include functions for parsing
models and generating string representations of models.


>>> Compact Maximum Flow (compactmaxflow.cc, maxflow.h)

Very lean maxflow implementation which is designed and optimized for
the requirements of maxflow calculation in strong simulation. Uses an
algorithm similar but not identical to push and relabel. Network
structure is restricted to bipartite with infinite edge capacity
except on edges connected to source/sink. Does not return the value
of the maximum flow, but rather a boolean value indicating whether or
not it is possible to saturate source edges and sink edges at the
same time.


>>> Simulation Relation (Simrel.h)

Interface for simulation relation deciders. Currently implemented only
for strong simulation (see below).


>>> Strong Simulation (Strong*.cc, Strong.h)

Decide strong simulation in different types of models using maximum
flow.

StrongMC.cc   : Implements decision strategy for Markov chains.
StrongPA.cc   : Implements decision strategy for probabilistic
                automata.
StrongQ.cc    : Implements the quotient decision strategy for both
                MCs and PAs.

The Strong* classes are used by passing a model to the Simulate()
function, optionally supplying a buffer that will receive a list of
pairs in the final relation (not including the identity relation).

The mode of operation of the classes is affected by a number of
preprocessor macros, which control the optimizations that are used.
These are explained below.


>>> State Partitioning (#define OPT_PARTITION)

State partitioning uses the fact that, when deciding strong simulation
in large networks, many pairs that are tested will be probabilistically
identical and do not need to be tested more than once. By splitting
the set of states up into several classes of probabilistically
identical states (i.e. identical for the intents and purposes of the
decision algorithm), the result of testing any two states from any two
classes (partitions) will be the same for any other two states from the
same two classes. In most practically relevant cases the time saved by
only testing one pair from two classes instead of all possible
combinations will outweigh the time used on partitioning the states and
speed up the decision process as a whole.

The partitioning of states described as above can only produce
correct results in the first iteration. Further iterations are therefor
not affected by this optimization.


>>> P-Invariant Checking (#define OPT_P_INVARIANT)

P-Invariant checking verifies a simple precondition which is necessary
(but not sufficient) for the flow of a network to saturate all source
and sink arcs. This can sometimes avoid more time consuming maximum
flow computations.


>>> Parametric Maximum Flow (#define OPT_CACHE_NETS)

Store the maximum flow networks associated with pairs of states between
iterations. Since most networks change only slightly between iterations
if they are not deleted entirely, the data structures from the last
iteration can be re-used. Unfortunately, the memory overhead of this
strategy is considerably, and in many cases, prohibitive.


>>> Significant Arc Detection (#define OPT_SIGNIFICIANT_ARC)

A combination of P-Invariant checking and parametric maximum flow. An
edge/arc in a maximum flow network is flagged "significant" if its
deletion would cause the P-Invariant condition to be violated. In that
case, the network can be discarded without any further computation.


>>> Quotient (#define OPT_QUOTIENT)

Use a partition refinement approach, rather than the refinement loop
used in all other approaches. This approach can only be combined with
parametric maximum flow; the other optimizations have no effect.


>>> Modelstat Tool (modelstat.cc)

A small tool which prints some statistics about input models, such as
number of states, min/max/avg number of transitions, etc.
