|
@ -150,13 +150,31 @@ def model_checking(model, property): |
|
|
return core._model_checking_sparse_engine(model, task) |
|
|
return core._model_checking_sparse_engine(model, task) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def prob01min_states(model, eventually_formula): |
|
|
|
|
|
assert type(eventually_formula) == logic.EventuallyFormula |
|
|
|
|
|
labelform = eventually_formula.subformula |
|
|
|
|
|
labelprop = core.Property("label-prop", labelform) |
|
|
|
|
|
phiStates = BitVector(model.nr_states, True) |
|
|
|
|
|
psiStates = model_checking(model, labelprop).get_truth_values() |
|
|
|
|
|
return compute_prob01min_states(model, phiStates, psiStates) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def prob01max_states(model, eventually_formula): |
|
|
|
|
|
assert type(eventually_formula) == logic.EventuallyFormula |
|
|
|
|
|
labelform = eventually_formula.subformula |
|
|
|
|
|
labelprop = core.Property("label-prop", labelform) |
|
|
|
|
|
phiStates = BitVector(model.nr_states, True) |
|
|
|
|
|
psiStates = model_checking(model, labelprop).get_truth_values() |
|
|
|
|
|
return compute_prob01min_states(model, phiStates, psiStates) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def compute_prob01_states(model, phi_states, psi_states): |
|
|
def compute_prob01_states(model, phi_states, psi_states): |
|
|
""" |
|
|
""" |
|
|
Compute prob01 states for properties of the form phi_states until psi_states |
|
|
Compute prob01 states for properties of the form phi_states until psi_states |
|
|
|
|
|
|
|
|
:param SparseDTMC model: |
|
|
:param SparseDTMC model: |
|
|
:param BitVector phi_states: |
|
|
:param BitVector phi_states: |
|
|
:param BitVector psi_states: |
|
|
|
|
|
|
|
|
:param BitVector psi_states: Target states |
|
|
""" |
|
|
""" |
|
|
if model.model_type != ModelType.DTMC: |
|
|
if model.model_type != ModelType.DTMC: |
|
|
raise StormError("Prob 01 is only defined for DTMCs -- model must be a DTMC") |
|
|
raise StormError("Prob 01 is only defined for DTMCs -- model must be a DTMC") |
|
|