The source code and dockerfile for the GSW2024 AI Lab.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

74 lines
3.0 KiB

4 weeks ago
  1. import stormpy
  2. import stormpy.logic
  3. from helpers.helper import get_example_path
  4. class TestFormulas:
  5. def test_probability_formula(self):
  6. formula_str = "P=? [F \"one\"]"
  7. properties = stormpy.parse_properties(formula_str)
  8. formula = properties[0].raw_formula
  9. assert type(formula) == stormpy.logic.ProbabilityOperator
  10. assert len(properties) == 1
  11. assert str(formula) == formula_str
  12. def test_reward_formula(self):
  13. formula_str = "R=? [F \"one\"]"
  14. properties = stormpy.parse_properties(formula_str)
  15. formula = properties[0].raw_formula
  16. assert type(formula) == stormpy.logic.RewardOperator
  17. assert len(properties) == 1
  18. assert str(formula) == "R[exp]=? [F \"one\"]"
  19. def test_formula_list(self):
  20. formulas = []
  21. prop = "=? [F \"one\"]"
  22. forms = stormpy.parse_properties("P" + prop)
  23. formulas.append(forms[0].raw_formula)
  24. forms = stormpy.parse_properties("R" + prop)
  25. formulas.append(forms[0].raw_formula)
  26. assert len(formulas) == 2
  27. assert str(formulas[0]) == "P" + prop
  28. assert str(formulas[1]) == "R[exp]" + prop
  29. def test_jani_formula(self):
  30. _, properties = stormpy.parse_jani_model(get_example_path("dtmc", "die.jani"))
  31. assert len(properties) == 2
  32. prop = properties[0]
  33. assert isinstance(prop, stormpy.Property)
  34. assert prop.name == "Probability to throw a six"
  35. prop = properties[1]
  36. assert isinstance(prop, stormpy.Property)
  37. assert prop.name == "Expected number of coin flips"
  38. def test_bounds(self):
  39. prop = "P=? [F \"one\"]"
  40. formula = stormpy.parse_properties(prop)[0].raw_formula
  41. assert not formula.has_bound
  42. prop = "P<0.4 [F \"one\"]"
  43. formula = stormpy.parse_properties(prop)[0].raw_formula
  44. assert formula.has_bound
  45. assert formula.threshold == stormpy.Rational("0.4")
  46. assert formula.comparison_type == stormpy.logic.ComparisonType.LESS
  47. def test_set_bounds(self):
  48. prop = "P<0.4 [F \"one\"]"
  49. formula = stormpy.parse_properties(prop)[0].raw_formula
  50. expression_manager = stormpy.ExpressionManager()
  51. rational = stormpy.Rational("0.2")
  52. expression = expression_manager.create_rational(rational)
  53. formula.set_bound(stormpy.logic.ComparisonType.GEQ, expression)
  54. assert formula.threshold == stormpy.Rational("0.2")
  55. assert formula.comparison_type == stormpy.logic.ComparisonType.GEQ
  56. assert str(formula) == "P>=1/5 [F \"one\"]"
  57. def test_subformula(self):
  58. prop = "P=? [F \"one\"]"
  59. formula = stormpy.parse_properties(prop)[0].raw_formula
  60. assert type(formula) == stormpy.logic.ProbabilityOperator
  61. pathform = formula.subformula
  62. assert type(pathform) == stormpy.logic.EventuallyFormula
  63. labelform = pathform.subformula
  64. assert type(labelform) == stormpy.logic.AtomicLabelFormula
  65. prop = stormpy.core.Property("label-formula", labelform)
  66. assert prop.raw_formula == labelform