13namespace modelchecker {
14template<storm::dd::DdType Type,
typename ValueType>
19 std::vector<ValueType>
const& explicitValues)
20 : reachableStates(reachableStates),
21 symbolicStates(symbolicStates),
22 symbolicValues(symbolicValues),
23 explicitStates(explicitStates),
25 explicitValues(explicitValues) {
29template<storm::dd::DdType Type,
typename ValueType>
31 return std::make_unique<HybridQuantitativeCheckResult<Type, ValueType>>(this->reachableStates, this->symbolicStates, this->symbolicValues,
32 this->explicitStates, this->odd, this->explicitValues);
35template<storm::dd::DdType Type,
typename ValueType>
37 ValueType
const& bound)
const {
42 symbolicResult &= symbolicValues.less(bound);
44 symbolicResult &= symbolicValues.lessOrEqual(bound);
46 symbolicResult &= symbolicValues.greater(bound);
48 symbolicResult &= symbolicValues.greaterOrEqual(bound);
53 this->symbolicValues.getContainedMetaVariables(), comparisonType,
54 storm::utility::convertNumber<ValueType>(bound));
59template<storm::dd::DdType Type,
typename ValueType>
64 std::vector<ValueType> fullExplicitValues = symbolicValues.toVector(allStatesOdd);
69template<storm::dd::DdType Type,
typename ValueType>
74template<storm::dd::DdType Type,
typename ValueType>
76 return (symbolicStates || explicitStates) == reachableStates;
79template<storm::dd::DdType Type,
typename ValueType>
84template<storm::dd::DdType Type,
typename ValueType>
86 return symbolicStates;
89template<storm::dd::DdType Type,
typename ValueType>
91 return symbolicValues;
94template<storm::dd::DdType Type,
typename ValueType>
96 return explicitStates;
99template<storm::dd::DdType Type,
typename ValueType>
104template<storm::dd::DdType Type,
typename ValueType>
106 return explicitValues;
109template<
typename ValueType>
110void print(std::ostream& out, ValueType
const& value) {
111 if (value == storm::utility::infinity<ValueType>()) {
115 if (std::is_same<ValueType, storm::RationalNumber>::value) {
116 out <<
" (approx. " << storm::utility::convertNumber<double>(value) <<
")";
121template<
typename ValueType>
122void printRange(std::ostream& out, ValueType
const& min, ValueType
const& max) {
124 if (min == storm::utility::infinity<ValueType>()) {
130 if (max == storm::utility::infinity<ValueType>()) {
136 if (std::is_same<ValueType, storm::RationalNumber>::value) {
137 out <<
" (approx. [";
138 if (min == storm::utility::infinity<ValueType>()) {
141 out << storm::utility::convertNumber<double>(min);
144 if (max == storm::utility::infinity<ValueType>()) {
147 out << storm::utility::convertNumber<double>(max);
154template<storm::dd::DdType Type,
typename ValueType>
156 uint64_t totalNumberOfStates = this->symbolicStates.getNonZeroCount() + this->explicitStates.getNonZeroCount();
157 bool minMaxSupported = std::is_same<ValueType, double>::value || std::is_same<ValueType, storm::RationalNumber>::value;
158 bool printAsRange =
false;
160 if (totalNumberOfStates == 1) {
161 if (this->symbolicStates.isZero()) {
162 print(out, *this->explicitValues.begin());
164 print(out, this->symbolicValues.sumAbstract(this->symbolicValues.getContainedMetaVariables()).getValue());
166 }
else if (totalNumberOfStates >= 10 && minMaxSupported) {
171 if (!this->symbolicStates.isZero()) {
172 if (this->symbolicValues.isZero()) {
176 for (
auto valuationValuePair : this->symbolicValues) {
182 print(out, valuationValuePair.second);
184 if (symbolicStates.getNonZeroCount() != this->symbolicValues.getNonZeroCount()) {
189 if (!this->explicitStates.isZero()) {
190 for (
auto const& element : this->explicitValues) {
203 ValueType min = this->getMin();
204 ValueType max = this->getMax();
210template<storm::dd::DdType Type,
typename ValueType>
212 STORM_LOG_THROW(filter.isSymbolicQualitativeCheckResult(), storm::exceptions::InvalidOperationException,
213 "Cannot filter hybrid check result with non-symbolic filter.");
216 this->symbolicStates = this->symbolicStates && filter.asSymbolicQualitativeCheckResult<Type>().getTruthValuesVector();
217 this->symbolicValues *= symbolicStates.template toAdd<ValueType>();
222 this->explicitStates = this->explicitStates && filter.asSymbolicQualitativeCheckResult<Type>().getTruthValuesVector();
226 this->explicitValues = explicitStates.filterExplicitVector(this->odd, explicitValues);
231template<storm::dd::DdType Type,
typename ValueType>
236 symbolicStates.ite(this->symbolicValues, reachableStates.getDdManager().getConstant(storm::utility::infinity<ValueType>()));
237 ValueType min = tmp.
getMin();
238 if (!explicitStates.isZero()) {
239 for (
auto const& element : explicitValues) {
240 min = std::min(min, element);
246template<storm::dd::DdType Type,
typename ValueType>
248 ValueType max = this->symbolicValues.getMax();
249 if (!explicitStates.isZero()) {
250 for (
auto const& element : explicitValues) {
251 max = std::max(max, element);
257template<storm::dd::DdType Type,
typename ValueType>
259 ValueType sum = symbolicValues.sumAbstract(symbolicValues.getContainedMetaVariables()).getValue();
260 for (
auto const& value : explicitValues) {
266template<storm::dd::DdType Type,
typename ValueType>
268 return this->sum() / storm::utility::convertNumber<ValueType>((symbolicStates || explicitStates).getNonZeroCount());
271template<storm::dd::DdType Type,
typename ValueType>
275 symbolicValues = symbolicStates.ite(one - symbolicValues, zero);
277 for (
auto& element : explicitValues) {
278 element = storm::utility::one<ValueType>() - element;
ValueType getMin() const
Retrieves the lowest function value of any encoding.
Odd createOdd() const
Creates an ODD based on the current BDD.
void expandExplicitVector(storm::dd::Odd const &newOdd, std::vector< ValueType > const &oldValues, std::vector< ValueType > &newValues) const
Adds the old values to the new values.
virtual std::ostream & writeToStream(std::ostream &out) const override
storm::dd::Odd const & getOdd() const
storm::dd::Bdd< Type > const & getExplicitStates() const
storm::dd::Bdd< Type > const & getSymbolicStates() const
HybridQuantitativeCheckResult()=default
virtual void oneMinus() override
virtual bool isHybrid() const override
std::vector< ValueType > const & getExplicitValueVector() const
virtual bool isResultForAllStates() const override
virtual ValueType average() const override
std::unique_ptr< CheckResult > toExplicitQuantitativeCheckResult() const
virtual ValueType getMax() const override
virtual std::unique_ptr< CheckResult > compareAgainstBound(storm::logic::ComparisonType comparisonType, ValueType const &bound) const override
virtual void filter(QualitativeCheckResult const &filter) override
Filters the current result wrt.
virtual bool isHybridQuantitativeCheckResult() const override
virtual std::unique_ptr< CheckResult > clone() const override
virtual ValueType sum() const override
virtual ValueType getMin() const override
storm::dd::Add< Type, ValueType > const & getSymbolicValueVector() const
#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)