|
|
@ -29,14 +29,14 @@ namespace storm { |
|
|
|
if (!storm::utility::isConstant(entry)) { |
|
|
|
if (entry.denominator().isConstant()) { |
|
|
|
if (entry.denominatorAsNumber() > 0) { |
|
|
|
wellformedConstraintSet.emplace(entry.nominator().polynomial(), storm::CompareRelation::GEQ); |
|
|
|
wellformedConstraintSet.emplace(entry.nominator().polynomialWithCoefficient(), storm::CompareRelation::GEQ); |
|
|
|
} else if (entry.denominatorAsNumber() < 0) { |
|
|
|
wellformedConstraintSet.emplace(entry.nominator().polynomial(), storm::CompareRelation::LEQ); |
|
|
|
wellformedConstraintSet.emplace(entry.nominator().polynomialWithCoefficient(), storm::CompareRelation::LEQ); |
|
|
|
} else { |
|
|
|
assert(false); // Should fail before.
|
|
|
|
} |
|
|
|
} else { |
|
|
|
wellformedConstraintSet.emplace(entry.denominator().polynomial(), storm::CompareRelation::NEQ); |
|
|
|
wellformedConstraintSet.emplace(entry.denominator().polynomialWithCoefficient(), storm::CompareRelation::NEQ); |
|
|
|
STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Rational functions at state rewards not yet supported."); |
|
|
|
} |
|
|
|
} |
|
|
@ -52,34 +52,35 @@ namespace storm { |
|
|
|
if (!storm::utility::isConstant(transition.getValue())) { |
|
|
|
// Assert: 0 <= transition <= 1
|
|
|
|
if (transition.getValue().denominator().isConstant()) { |
|
|
|
assert(transition.getValue().denominator().constantPart() != 0); |
|
|
|
if (transition.getValue().denominator().constantPart() > 0) { |
|
|
|
// Assert: nom <= denom
|
|
|
|
wellformedConstraintSet.emplace((transition.getValue().nominator() - transition.getValue().denominator()).polynomial(), storm::CompareRelation::LEQ); |
|
|
|
wellformedConstraintSet.emplace((transition.getValue().nominator() - transition.getValue().denominator()).polynomialWithCoefficient(), storm::CompareRelation::LEQ); |
|
|
|
// Assert: nom >= 0
|
|
|
|
wellformedConstraintSet.emplace(transition.getValue().nominator().polynomial(), storm::CompareRelation::GEQ); |
|
|
|
wellformedConstraintSet.emplace(transition.getValue().nominator().polynomialWithCoefficient(), storm::CompareRelation::GEQ); |
|
|
|
} else if (transition.getValue().denominator().constantPart() < 0) { |
|
|
|
// Assert nom >= denom
|
|
|
|
wellformedConstraintSet.emplace((transition.getValue().nominator() - transition.getValue().denominator()).polynomial(), storm::CompareRelation::GEQ); |
|
|
|
wellformedConstraintSet.emplace((transition.getValue().nominator() - transition.getValue().denominator()).polynomialWithCoefficient(), storm::CompareRelation::GEQ); |
|
|
|
// Assert: nom <= 0
|
|
|
|
wellformedConstraintSet.emplace(transition.getValue().nominator().polynomial(), storm::CompareRelation::LEQ); |
|
|
|
wellformedConstraintSet.emplace(transition.getValue().nominator().polynomialWithCoefficient(), storm::CompareRelation::LEQ); |
|
|
|
} else { |
|
|
|
STORM_LOG_ASSERT(false, "Denominator must not equal 0."); |
|
|
|
} |
|
|
|
} else { |
|
|
|
// Assert: denom != 0
|
|
|
|
wellformedConstraintSet.emplace(transition.getValue().denominator().polynomial(), storm::CompareRelation::NEQ); |
|
|
|
wellformedConstraintSet.emplace(transition.getValue().denominator().polynomialWithCoefficient(), storm::CompareRelation::NEQ); |
|
|
|
// Assert: transition >= 0 <==> if denom > 0 then nom >= 0 else nom <= 0
|
|
|
|
wellformedConstraintSet.emplace(carl::FormulaType::ITE, typename ConstraintType<ValueType>::val(transition.getValue().denominator().polynomial(), storm::CompareRelation::GREATER), typename ConstraintType<ValueType>::val(transition.getValue().nominator().polynomial(), storm::CompareRelation::GEQ), typename ConstraintType<ValueType>::val(transition.getValue().nominator().polynomial(), storm::CompareRelation::LEQ)); |
|
|
|
wellformedConstraintSet.emplace(carl::FormulaType::ITE, typename ConstraintType<ValueType>::val(transition.getValue().denominator().polynomialWithCoefficient(), storm::CompareRelation::GREATER), typename ConstraintType<ValueType>::val(transition.getValue().nominator().polynomialWithCoefficient(), storm::CompareRelation::GEQ), typename ConstraintType<ValueType>::val(transition.getValue().nominator().polynomialWithCoefficient(), storm::CompareRelation::LEQ)); |
|
|
|
// TODO: Assert: transition <= 1 <==> if denom > 0 then nom - denom <= 0 else nom - denom >= 0
|
|
|
|
} |
|
|
|
// Assert: transition > 0
|
|
|
|
graphPreservingConstraintSet.emplace(transition.getValue().nominator().polynomial(), storm::CompareRelation::NEQ); |
|
|
|
graphPreservingConstraintSet.emplace(transition.getValue().nominator().polynomialWithCoefficient(), storm::CompareRelation::NEQ); |
|
|
|
} |
|
|
|
} |
|
|
|
STORM_LOG_ASSERT(!storm::utility::isConstant(sum) || storm::utility::isOne(sum), "If the sum is a constant, it must be equal to 1."); |
|
|
|
if(!storm::utility::isConstant(sum)) { |
|
|
|
// Assert: sum == 1
|
|
|
|
wellformedConstraintSet.emplace((sum.nominator() - sum.denominator()).polynomial(), storm::CompareRelation::EQ); |
|
|
|
wellformedConstraintSet.emplace((sum.nominator() - sum.denominator()).polynomialWithCoefficient(), storm::CompareRelation::EQ); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
@ -95,14 +96,14 @@ namespace storm { |
|
|
|
if(!entry.getValue().isConstant()) { |
|
|
|
if (entry.getValue().denominator().isConstant()) { |
|
|
|
if (entry.getValue().denominatorAsNumber() > 0) { |
|
|
|
wellformedConstraintSet.emplace(entry.getValue().nominator().polynomial(), storm::CompareRelation::GEQ); |
|
|
|
wellformedConstraintSet.emplace(entry.getValue().nominator().polynomialWithCoefficient(), storm::CompareRelation::GEQ); |
|
|
|
} else if (entry.getValue().denominatorAsNumber() < 0) { |
|
|
|
wellformedConstraintSet.emplace(entry.getValue().nominator().polynomial(), storm::CompareRelation::LEQ); |
|
|
|
wellformedConstraintSet.emplace(entry.getValue().nominator().polynomialWithCoefficient(), storm::CompareRelation::LEQ); |
|
|
|
} else { |
|
|
|
assert(false); // Should fail before.
|
|
|
|
} |
|
|
|
} else { |
|
|
|
wellformedConstraintSet.emplace(entry.getValue().denominator().polynomial(), storm::CompareRelation::NEQ); |
|
|
|
wellformedConstraintSet.emplace(entry.getValue().denominator().polynomialWithCoefficient(), storm::CompareRelation::NEQ); |
|
|
|
STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "Rational functions at transition rewards are not yet supported."); |
|
|
|
} |
|
|
|
} |
|
|
|