16namespace modelchecker {
17template<storm::dd::DdType Type,
typename ValueType>
20 : reachableStates(reachableStates), states(reachableStates), values(values) {
24template<storm::dd::DdType Type,
typename ValueType>
28 : reachableStates(reachableStates), states(states), values(values) {
32template<storm::dd::DdType Type,
typename ValueType>
34 : reachableStates(other.getReachableStates()), states(other.getStates()), values(other.getTruthValuesVector().template toAdd<ValueType>()) {
38template<storm::dd::DdType Type,
typename ValueType>
40 return std::make_unique<SymbolicQuantitativeCheckResult<Type, ValueType>>(this->reachableStates, this->states, this->values);
43template<storm::dd::DdType Type,
typename ValueType>
45 ValueType
const& bound)
const {
48 states &= values.less(bound);
50 states &= values.lessOrEqual(bound);
52 states &= values.greater(bound);
54 states &= values.greaterOrEqual(bound);
59template<storm::dd::DdType Type,
typename ValueType>
64template<storm::dd::DdType Type,
typename ValueType>
66 return states == reachableStates;
69template<storm::dd::DdType Type,
typename ValueType>
74template<storm::dd::DdType Type,
typename ValueType>
79template<storm::dd::DdType Type,
typename ValueType>
84template<storm::dd::DdType Type,
typename ValueType>
86 return reachableStates;
89template<
typename ValueType>
90void print(std::ostream& out, ValueType
const& value) {
91 if (value == storm::utility::infinity<ValueType>()) {
95 if (std::is_same<ValueType, storm::RationalNumber>::value) {
96 out <<
" (approx. " << storm::utility::convertNumber<double>(value) <<
")";
101template<
typename ValueType>
102void printRange(std::ostream& out, ValueType
const& min, ValueType
const& max) {
104 if (min == storm::utility::infinity<ValueType>()) {
110 if (max == storm::utility::infinity<ValueType>()) {
116 if (std::is_same<ValueType, storm::RationalNumber>::value) {
117 out <<
" (approx. [";
118 if (min == storm::utility::infinity<ValueType>()) {
121 out << storm::utility::convertNumber<double>(min);
124 if (max == storm::utility::infinity<ValueType>()) {
127 out << storm::utility::convertNumber<double>(max);
134template<storm::dd::DdType Type,
typename ValueType>
136 uint64_t totalNumberOfStates = states.getNonZeroCount();
137 bool minMaxSupported = std::is_same<ValueType, double>::value || std::is_same<ValueType, storm::RationalNumber>::value;
138 bool printAsRange =
false;
140 if (totalNumberOfStates == 1) {
141 print(out, this->values.sumAbstract(this->values.getContainedMetaVariables()).getValue());
142 }
else if (states.getNonZeroCount() >= 10 || !minMaxSupported) {
146 if (this->values.isZero()) {
150 for (
auto valuationValuePair : this->values) {
156 print(out, valuationValuePair.second);
158 if (states.getNonZeroCount() != this->values.getNonZeroCount()) {
166 printRange(out, this->getMin(), this->getMax());
171template<storm::dd::DdType Type,
typename ValueType>
173 STORM_LOG_THROW(filter.isSymbolicQualitativeCheckResult(), storm::exceptions::InvalidOperationException,
174 "Cannot filter symbolic check result with non-symbolic filter.");
175 this->states &= filter.asSymbolicQualitativeCheckResult<Type>().getTruthValuesVector();
176 this->values *= filter.asSymbolicQualitativeCheckResult<Type>().getTruthValuesVector().template toAdd<ValueType>();
179template<storm::dd::DdType Type,
typename ValueType>
183 return states.ite(this->values, states.getDdManager().getConstant(storm::utility::infinity<ValueType>())).getMin();
186template<storm::dd::DdType Type,
typename ValueType>
188 return this->values.getMax();
191template<storm::dd::DdType Type,
typename ValueType>
193 return this->sum() / storm::utility::convertNumber<ValueType>(this->states.getNonZeroCount());
196template<storm::dd::DdType Type,
typename ValueType>
198 return this->values.sumAbstract(this->values.getContainedMetaVariables()).getValue();
201template<storm::dd::DdType Type,
typename ValueType>
204 values = one - values;
virtual std::unique_ptr< CheckResult > clone() const override
virtual ValueType getMax() const override
storm::dd::Add< Type, ValueType > const & getValueVector() const
storm::dd::Bdd< Type > const & getStates() const
virtual void oneMinus() override
virtual ValueType getMin() const override
virtual void filter(QualitativeCheckResult const &filter) override
Filters the current result wrt.
virtual bool isSymbolicQuantitativeCheckResult() const override
virtual std::unique_ptr< CheckResult > compareAgainstBound(storm::logic::ComparisonType comparisonType, ValueType const &bound) const override
virtual bool isResultForAllStates() const override
virtual ValueType average() const override
virtual ValueType sum() const override
virtual std::ostream & writeToStream(std::ostream &out) const override
storm::dd::Bdd< Type > const & getReachableStates() const
SymbolicQuantitativeCheckResult()=default
virtual bool isSymbolic() const override
#define STORM_LOG_THROW(cond, exception, message)
void print(std::ostream &out, ValueType const &value)
void printRange(std::ostream &out, ValueType const &min, ValueType const &max)
ValueType max(ValueType const &first, ValueType const &second)
ValueType min(ValueType const &first, ValueType const &second)