18template<
typename ValueType>
23template<
typename ValueType>
28template<
typename ValueType>
33template<
typename ValueType>
36 boost::get<map_type>(values).emplace(state, value);
39template<
typename ValueType>
44template<
typename ValueType>
49template<
typename ValueType>
52 : values(values), scheduler(scheduler) {
56template<
typename ValueType>
59 : values(
std::move(values)), scheduler(scheduler) {
63template<
typename ValueType>
69 newVector.reserve(bvValues.
size());
70 for (std::size_t i = 0, n = bvValues.
size(); i < n; i++) {
79 for (
auto const& e : bitMap) {
87template<
typename ValueType>
89 return std::make_unique<ExplicitQuantitativeCheckResult<ValueType>>(this->values, this->scheduler);
92template<
typename ValueType>
94 return boost::get<vector_type>(values);
97template<
typename ValueType>
99 return boost::get<vector_type>(values);
102template<
typename ValueType>
104 return boost::get<map_type>(values);
107template<
typename ValueType>
109 STORM_LOG_THROW(
filter.isExplicitQualitativeCheckResult(), storm::exceptions::InvalidOperationException,
110 "Cannot filter explicit check result with non-explicit filter.");
111 STORM_LOG_THROW(
filter.isResultForAllStates(), storm::exceptions::InvalidOperationException,
"Cannot filter check result with non-complete filter.");
112 STORM_LOG_THROW(
filter.hasValueType<ValueType>(), storm::exceptions::InvalidOperationException,
"Filter has unexpected value type.");
119 for (
auto element : filterTruthValues) {
123 this->values = newMap;
125 map_type const& map = boost::get<map_type>(values);
128 for (
auto const& element : map) {
129 if (filterTruthValues.
get(element.first)) {
130 newMap.insert(element);
135 "The check result fails to contain some results referred to by the filter.");
137 this->values = newMap;
141template<
typename ValueType>
143 STORM_LOG_THROW(!values.empty(), storm::exceptions::InvalidOperationException,
"Minimum of empty set is not defined.");
152template<
typename ValueType>
154 STORM_LOG_THROW(!values.empty(), storm::exceptions::InvalidOperationException,
"Minimum of empty set is not defined.");
163template<
typename ValueType>
165 STORM_LOG_THROW(!values.empty(), storm::exceptions::InvalidOperationException,
"Minimum/maximum of empty set is not defined.");
174template<
typename ValueType>
176 STORM_LOG_THROW(!values.empty(), storm::exceptions::InvalidOperationException,
"Sum of empty set is not defined.");
180 for (
auto& element : boost::get<vector_type>(values)) {
182 "Cannot compute the sum of values containing infinity.");
186 for (
auto& element : boost::get<map_type>(values)) {
188 "Cannot compute the sum of values containing infinity.");
189 sum += element.second;
195template<
typename ValueType>
197 STORM_LOG_THROW(!values.empty(), storm::exceptions::InvalidOperationException,
"Average of empty set is not defined.");
201 for (
auto& element : boost::get<vector_type>(values)) {
203 "Cannot compute the average of values containing infinity.");
206 return sum / boost::get<vector_type>(values).size();
208 for (
auto& element : boost::get<map_type>(values)) {
210 "Cannot compute the average of values containing infinity.");
211 sum += element.second;
213 return sum / boost::get<map_type>(values).size();
217template<
typename ValueType>
219 return static_cast<bool>(scheduler);
222template<
typename ValueType>
224 this->scheduler = std::move(scheduler);
227template<
typename ValueType>
230 return *scheduler.value();
233template<
typename ValueType>
236 return *scheduler.value();
239template<
typename ValueType>
240void print(std::ostream& out, ValueType
const& value) {
245 if (std::is_same<ValueType, storm::RationalNumber>::value) {
251template<
typename ValueType>
252void printRange(std::ostream& out, ValueType
const& min, ValueType
const& max) {
266 if (std::is_same<ValueType, storm::RationalNumber>::value) {
267 out <<
" (approx. [";
271 out << storm::utility::convertNumber<double>(min);
277 out << storm::utility::convertNumber<double>(max);
284template<
typename ValueType>
286 bool minMaxSupported = std::is_same<ValueType, double>::value || std::is_same<ValueType, storm::RationalNumber>::value;
287 bool printAsRange =
false;
290 vector_type const& valuesAsVector = boost::get<vector_type>(values);
291 if (valuesAsVector.size() >= 10 && minMaxSupported) {
296 for (
auto const& element : valuesAsVector) {
307 map_type const& valuesAsMap = boost::get<map_type>(values);
308 if (valuesAsMap.size() >= 10 && minMaxSupported) {
311 if (valuesAsMap.size() == 1) {
312 print(out, valuesAsMap.begin()->second);
316 for (
auto const& element : valuesAsMap) {
322 print(out, element.second);
330 std::pair<ValueType, ValueType> minmax = this->
getMinMax();
337template<
typename ValueType>
339 ValueType
const& bound)
const {
341 vector_type const& valuesAsVector = boost::get<vector_type>(values);
343 switch (comparisonType) {
345 for (uint_fast64_t index = 0; index < valuesAsVector.size(); ++index) {
346 if (valuesAsVector[index] < bound) {
352 for (uint_fast64_t index = 0; index < valuesAsVector.size(); ++index) {
353 if (valuesAsVector[index] <= bound) {
359 for (uint_fast64_t index = 0; index < valuesAsVector.size(); ++index) {
360 if (valuesAsVector[index] > bound) {
366 for (uint_fast64_t index = 0; index < valuesAsVector.size(); ++index) {
367 if (valuesAsVector[index] >= bound) {
375 map_type const& valuesAsMap = boost::get<map_type>(values);
376 std::map<storm::storage::sparse::state_type, bool> result;
377 switch (comparisonType) {
379 for (
auto const& element : valuesAsMap) {
380 result[element.first] = element.second < bound;
384 for (
auto const& element : valuesAsMap) {
385 result[element.first] = element.second <= bound;
389 for (
auto const& element : valuesAsMap) {
390 result[element.first] = element.second > bound;
394 for (
auto const& element : valuesAsMap) {
395 result[element.first] = element.second >= bound;
410template<
typename ValueType>
413 return boost::get<vector_type>(values)[state];
415 return boost::get<map_type>(values)[state];
419template<
typename ValueType>
422 return boost::get<vector_type>(values)[state];
424 map_type const& valuesAsMap = boost::get<map_type>(values);
425 auto const& keyValuePair = valuesAsMap.find(state);
426 STORM_LOG_THROW(keyValuePair != valuesAsMap.end(), storm::exceptions::InvalidOperationException,
"Unknown key '" << state <<
"'.");
427 return keyValuePair->second;
431template<
typename ValueType>
436template<
typename ValueType>
438 return values.which() == 0;
441template<
typename ValueType>
446template<
typename ValueType>
449 for (
auto& element : boost::get<vector_type>(values)) {
453 for (
auto& element : boost::get<map_type>(values)) {
459template<
typename ValueType>
461 std::optional<storm::storage::sparse::Valuations>
const& stateValuations = std::nullopt,
462 std::optional<storm::models::sparse::StateLabeling>
const& stateLabels = std::nullopt) {
464 if (stateValuations) {
465 entry[
"s"] = stateValuations->template toJson<ValueType>(
id);
471 auto labs = stateLabels->getLabelsOfState(
id);
474 json.push_back(std::move(entry));
477template<
typename ValueType>
479 std::optional<storm::models::sparse::StateLabeling>
const& stateLabels)
const {
482 vector_type const& valuesAsVector = boost::get<vector_type>(values);
483 for (uint64_t state = 0; state < valuesAsVector.size(); ++state) {
484 insertJsonEntry(result, state, valuesAsVector[state], stateValuations, stateLabels);
487 map_type const& valuesAsMap = boost::get<map_type>(values);
488 for (
auto const& stateValue : valuesAsMap) {
489 insertJsonEntry(result, stateValue.first, stateValue.second, stateValuations, stateLabels);
497 std::optional<storm::storage::sparse::Valuations>
const&, std::optional<storm::models::sparse::StateLabeling>
const&)
const {
498 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"Export of Check results is not supported for Rational Functions.");
ExplicitQualitativeCheckResult< ValueType > & asExplicitQualitativeCheckResult()
virtual bool isResultForAllStates() const override
std::map< storm::storage::sparse::state_type, bool > map_type
storm::storage::BitVector vector_type
map_type const & getTruthValuesMap() const
vector_type const & getTruthValuesVector() const
virtual std::ostream & writeToStream(std::ostream &out) const override
virtual bool hasScheduler() const override
virtual std::unique_ptr< CheckResult > clone() const override
storm::storage::Scheduler< ValueType > const & getScheduler() const
std::map< storm::storage::sparse::state_type, ValueType > map_type
map_type const & getValueMap() const
ValueType & operator[](storm::storage::sparse::state_type state)
virtual ValueType getMin() const override
ExplicitQuantitativeCheckResult()
virtual bool isResultForAllStates() const override
storm::json< ValueType > toJson(std::optional< storm::storage::sparse::Valuations > const &stateValuations=std::nullopt, std::optional< storm::models::sparse::StateLabeling > const &stateLabels=std::nullopt) const
virtual bool isExplicit() const override
virtual bool isExplicitQuantitativeCheckResult() const override
virtual ValueType sum() const override
virtual void oneMinus() override
virtual ValueType getMax() const override
std::vector< ValueType > vector_type
virtual std::pair< ValueType, ValueType > getMinMax() const
virtual void filter(QualitativeCheckResult const &filter) override
Filters the current result wrt.
vector_type const & getValueVector() const
void setScheduler(std::unique_ptr< storm::storage::Scheduler< ValueType > > &&scheduler)
virtual ValueType average() const override
virtual std::unique_ptr< CheckResult > compareAgainstBound(storm::logic::ComparisonType comparisonType, ValueType const &bound) const override
virtual std::unique_ptr< CheckResult > compareAgainstBound(storm::logic::ComparisonType comparisonType, ValueType const &bound) const
A bit vector that is internally represented as a vector of 64-bit values.
uint64_t getNumberOfSetBits() const
Returns the number of bits that are set to true in this bit vector.
void set(uint64_t index, bool value=true)
Sets the given truth value at the given index.
size_t size() const
Retrieves the number of bits this bit vector can store.
bool get(uint64_t index) const
Retrieves the truth value of the bit at the given index and performs a bound check.
This class defines which action is chosen in a particular state of a non-deterministic model.
#define STORM_LOG_THROW(cond, exception, message)
void insertJsonEntry(storm::json< JsonRationalType > &json, uint64_t const &id, bool value, std::optional< storm::storage::sparse::Valuations > const &stateValuations=std::nullopt, std::optional< storm::models::sparse::StateLabeling > const &stateLabels=std::nullopt)
void print(std::ostream &out, ValueType const &value)
void printRange(std::ostream &out, ValueType const &min, ValueType const &max)
ValueType minimum(std::vector< ValueType > const &values)
std::pair< ValueType, ValueType > minmax(std::vector< ValueType > const &values)
ValueType maximum(std::vector< ValueType > const &values)
TargetType convertNumber(SourceType const &number)
nlohmann::basic_json< std::map, std::vector, std::string, bool, int64_t, uint64_t, ValueType > json
carl::RationalFunction< Polynomial, true > RationalFunction