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,
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) {
115 if (std::is_same_v<ValueType, storm::RationalNumber> || std::is_same_v<ValueType, storm::ExtendedRationalNumber>) {
121template<
typename ValueType>
122void printRange(std::ostream& out, ValueType
const& min, ValueType
const& max) {
128 if (std::is_same_v<ValueType, storm::RationalNumber> || std::is_same_v<ValueType, storm::ExtendedRationalNumber>) {
129 out <<
" (approx. [";
133 out << storm::utility::convertNumber<double>(min);
139 out << storm::utility::convertNumber<double>(max);
146template<storm::dd::DdType Type,
typename ValueType>
148 uint64_t totalNumberOfStates = this->symbolicStates.getNonZeroCount() + this->explicitStates.getNonZeroCount();
149 bool minMaxSupported = std::is_same<ValueType, double>::value || std::is_same<ValueType, storm::RationalNumber>::value;
150 bool printAsRange =
false;
152 if (totalNumberOfStates == 1) {
153 if (this->symbolicStates.isZero()) {
158 }
else if (totalNumberOfStates >= 10 && minMaxSupported) {
163 if (!this->symbolicStates.isZero()) {
164 if (this->symbolicValues.isZero()) {
168 for (
auto valuationValuePair : this->symbolicValues) {
176 if (symbolicStates.getNonZeroCount() != this->symbolicValues.getNonZeroCount()) {
181 if (!this->explicitStates.isZero()) {
182 for (
auto const& element : this->explicitValues) {
200template<storm::dd::DdType Type,
typename ValueType>
202 STORM_LOG_THROW(
filter.isSymbolicQualitativeCheckResult(), storm::exceptions::InvalidOperationException,
203 "Cannot filter hybrid check result with non-symbolic filter.");
206 this->symbolicStates = this->symbolicStates &&
filter.asSymbolicQualitativeCheckResult<Type>().getTruthValuesVector();
207 this->symbolicValues *= symbolicStates.template toAdd<ValueType>();
212 this->explicitStates = this->explicitStates &&
filter.asSymbolicQualitativeCheckResult<Type>().getTruthValuesVector();
216 this->explicitValues = explicitStates.filterExplicitVector(this->odd, explicitValues);
221template<storm::dd::DdType Type,
typename ValueType>
228 if (!explicitStates.isZero()) {
229 for (
auto const& element : explicitValues) {
236template<storm::dd::DdType Type,
typename ValueType>
239 if (!explicitStates.isZero()) {
240 for (
auto const& element : explicitValues) {
247template<storm::dd::DdType Type,
typename ValueType>
256 for (
auto const& value : explicitValues) {
262template<storm::dd::DdType Type,
typename ValueType>
267template<storm::dd::DdType Type,
typename ValueType>
271 symbolicValues = symbolicStates.ite(one - symbolicValues, zero);
273 for (
auto& element : explicitValues) {
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.
A quantitative check result over the states of a sparse model.
virtual ExtendedValueType getMin() const override
virtual std::ostream & writeToStream(std::ostream &out) const override
typename QuantitativeCheckResult< ValueType >::ExtendedValueType ExtendedValueType
virtual ExtendedValueType average() const override
virtual ExtendedValueType sum() 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
std::unique_ptr< CheckResult > toExplicitQuantitativeCheckResult() const
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
storm::dd::Add< Type, ValueType > const & getSymbolicValueVector() const
virtual ExtendedValueType getMax() 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)
ExtendedValueType< ValueType > positiveInfinity()
ExtendedValueType< ValueType > fromSentinel(ValueType &&value)
Recognises the value that storm::utility::infinity still yields for the value types that have no infi...
bool isInfinity(ValueType const &a)
TargetType convertNumber(SourceType const &number)