Skip to content

Conversation

@plindnercs
Copy link

@plindnercs plindnercs commented Nov 12, 2025

This feature extension includes IDTMC support to verify the following properties:

  • Reachability Probabilities
  • Reach-Reward
  • Propositional

Note:

I'm happy to receive any kind of feedback!

Copy link
Member

@tquatmann tquatmann left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good progress! My comment regarding the interval optimization direction is related to #807 .

solver->setHasUniqueSolution(false);
solver->setHasNoEndComponents(false);
solver->setLowerBound(storm::utility::zero<SolutionType>());
solver->setUpperBound(storm::utility::one<SolutionType>());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The upper bound of 1 does not apply if we compute expected rewareds

Environment const& env, CheckTask<storm::logic::UntilFormula, SolutionType> const& checkTask) {
storm::logic::UntilFormula const& pathFormula = checkTask.getFormula();
if (storm::IsIntervalType<ValueType>) {
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(), storm::exceptions::InvalidPropertyException,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's a bit odd that the optimization direction controls nature for IDTMCs (but not for IMDPs, it seems).
Suggestion: the interval optimization direction should be stored as an std::optional<storm::OptimizationDirection> in the Checktask (and then checked e.g. here). That forces an API user to set it explicitly.
When creating a checktask from a formula, the interval optimization direction can be derived automatically (following PRISM behaviour).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Of course, this also means that we have to read the IntervalOptimizationDirection from the SolveGoal (somewhere in the Helper).

Environment const& env, CheckTask<storm::logic::EventuallyFormula, SolutionType> const& checkTask) {
storm::logic::EventuallyFormula const& eventuallyFormula = checkTask.getFormula();
if (storm::IsIntervalType<ValueType>) {
STORM_LOG_THROW(checkTask.isOptimizationDirectionSet(), storm::exceptions::InvalidPropertyException,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See above

solver->setHasNoEndComponents();
// Uncertainty is not robust (=adversarial)
solver->setUncertaintyIsRobust(false);
solver->setUncertaintyResolutionMode(UncertaintyResolutionMode::Cooperative);
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In case the uncertaintyIsRobust-flag has been set explicitly, I used the corresponding enum value.

@plindnercs plindnercs requested a review from tquatmann December 12, 2025 19:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants