16namespace modelchecker {
17template<storm::dd::DdType Type,
typename ValueType>
22 std::vector<ValueType>
const& explicitValues)
23 : reachableStates(reachableStates),
24 symbolicStates(symbolicStates),
25 symbolicValues(symbolicValues),
26 explicitStates(explicitStates),
28 explicitValues(explicitValues) {
32template<storm::dd::DdType Type,
typename ValueType>
34 return std::make_unique<HybridQuantitativeCheckResult<Type, ValueType>>(this->reachableStates, this->symbolicStates, this->symbolicValues,
35 this->explicitStates, this->odd, this->explicitValues);
38template<storm::dd::DdType Type,
typename ValueType>
40 ValueType
const& bound)
const {
45 symbolicResult &= symbolicValues.less(bound);
47 symbolicResult &= symbolicValues.lessOrEqual(bound);
49 symbolicResult &= symbolicValues.greater(bound);
51 symbolicResult &= symbolicValues.greaterOrEqual(bound);
56 this->symbolicValues.getContainedMetaVariables(), comparisonType,
57 storm::utility::convertNumber<ValueType>(bound));
62template<storm::dd::DdType Type,
typename ValueType>
67 std::vector<ValueType> fullExplicitValues = symbolicValues.toVector(allStatesOdd);
72template<storm::dd::DdType Type,
typename ValueType>
77template<storm::dd::DdType Type,
typename ValueType>
79 return (symbolicStates || explicitStates) == reachableStates;
82template<storm::dd::DdType Type,
typename ValueType>
87template<storm::dd::DdType Type,
typename ValueType>
89 return symbolicStates;
92template<storm::dd::DdType Type,
typename ValueType>
94 return symbolicValues;
97template<storm::dd::DdType Type,
typename ValueType>
99 return explicitStates;
102template<storm::dd::DdType Type,
typename ValueType>
107template<storm::dd::DdType Type,
typename ValueType>
109 return explicitValues;
112template<
typename ValueType>
113void print(std::ostream& out, ValueType
const& value) {
114 if (value == storm::utility::infinity<ValueType>()) {
118 if (std::is_same<ValueType, storm::RationalNumber>::value) {
119 out <<
" (approx. " << storm::utility::convertNumber<double>(value) <<
")";
124template<
typename ValueType>
125void printRange(std::ostream& out, ValueType
const& min, ValueType
const& max) {
127 if (min == storm::utility::infinity<ValueType>()) {
133 if (max == storm::utility::infinity<ValueType>()) {
139 if (std::is_same<ValueType, storm::RationalNumber>::value) {
140 out <<
" (approx. [";
141 if (min == storm::utility::infinity<ValueType>()) {
144 out << storm::utility::convertNumber<double>(min);
147 if (max == storm::utility::infinity<ValueType>()) {
150 out << storm::utility::convertNumber<double>(max);
157template<storm::dd::DdType Type,
typename ValueType>
159 uint64_t totalNumberOfStates = this->symbolicStates.getNonZeroCount() + this->explicitStates.getNonZeroCount();
160 bool minMaxSupported = std::is_same<ValueType, double>::value || std::is_same<ValueType, storm::RationalNumber>::value;
161 bool printAsRange =
false;
163 if (totalNumberOfStates == 1) {
164 if (this->symbolicStates.isZero()) {
165 print(out, *this->explicitValues.begin());
167 print(out, this->symbolicValues.sumAbstract(this->symbolicValues.getContainedMetaVariables()).getValue());
169 }
else if (totalNumberOfStates >= 10 && minMaxSupported) {
174 if (!this->symbolicStates.isZero()) {
175 if (this->symbolicValues.isZero()) {
179 for (
auto valuationValuePair : this->symbolicValues) {
185 print(out, valuationValuePair.second);
187 if (symbolicStates.getNonZeroCount() != this->symbolicValues.getNonZeroCount()) {
192 if (!this->explicitStates.isZero()) {
193 for (
auto const& element : this->explicitValues) {
206 ValueType min = this->getMin();
207 ValueType max = this->getMax();
213template<storm::dd::DdType Type,
typename ValueType>
215 STORM_LOG_THROW(filter.isSymbolicQualitativeCheckResult(), storm::exceptions::InvalidOperationException,
216 "Cannot filter hybrid check result with non-symbolic filter.");
219 this->symbolicStates = this->symbolicStates && filter.asSymbolicQualitativeCheckResult<Type>().getTruthValuesVector();
220 this->symbolicValues *= symbolicStates.template toAdd<ValueType>();
225 this->explicitStates = this->explicitStates && filter.asSymbolicQualitativeCheckResult<Type>().getTruthValuesVector();
229 this->explicitValues = explicitStates.filterExplicitVector(this->odd, explicitValues);
234template<storm::dd::DdType Type,
typename ValueType>
239 symbolicStates.ite(this->symbolicValues, reachableStates.getDdManager().getConstant(storm::utility::infinity<ValueType>()));
240 ValueType min = tmp.
getMin();
241 if (!explicitStates.isZero()) {
242 for (
auto const& element : explicitValues) {
243 min = std::min(min, element);
249template<storm::dd::DdType Type,
typename ValueType>
251 ValueType max = this->symbolicValues.getMax();
252 if (!explicitStates.isZero()) {
253 for (
auto const& element : explicitValues) {
254 max = std::max(max, element);
260template<storm::dd::DdType Type,
typename ValueType>
262 ValueType sum = symbolicValues.sumAbstract(symbolicValues.getContainedMetaVariables()).getValue();
263 for (
auto const& value : explicitValues) {
269template<storm::dd::DdType Type,
typename ValueType>
271 return this->sum() / storm::utility::convertNumber<ValueType>((symbolicStates || explicitStates).getNonZeroCount());
274template<storm::dd::DdType Type,
typename ValueType>
278 symbolicValues = symbolicStates.ite(one - symbolicValues, zero);
280 for (
auto& element : explicitValues) {
281 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)