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::StateValuations>
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::StateValuations>
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()
storm::json< ValueType > toJson(std::optional< storm::storage::sparse::StateValuations > const &stateValuations=std::nullopt, std::optional< storm::models::sparse::StateLabeling > const &stateLabels=std::nullopt) const
virtual bool isResultForAllStates() const override
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 print(std::ostream &out, ValueType const &value)
void printRange(std::ostream &out, ValueType const &min, ValueType const &max)
void insertJsonEntry(storm::json< JsonRationalType > &json, uint64_t const &id, bool value, std::optional< storm::storage::sparse::StateValuations > const &stateValuations=std::nullopt, std::optional< storm::models::sparse::StateLabeling > const &stateLabels=std::nullopt)
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