16template<
typename ValueType>
18 : states(
storm::
storage::BitVector(state + 1)), truthValues(1, value) {
22template<
typename ValueType>
25 : states(truthValues.size(), true), truthValues(truthValues), scheduler(scheduler) {
29template<
typename ValueType>
32 : states(truthValues.size(), true), truthValues(
std::move(truthValues)), scheduler(scheduler) {
36template<
typename ValueType>
39 : states(
std::move(states)), truthValues(
std::move(truthValues)), scheduler(scheduler) {
43template<
typename ValueType>
45 return std::make_unique<ExplicitQualitativeCheckResult<ValueType>>(*this);
48template<
typename ValueType>
52 "Cannot perform logical 'and' on check results of incompatible type.");
54 STORM_LOG_THROW(first.states == secondCheckResult.states && first.truthValues.
size() == secondCheckResult.truthValues.
size(),
55 storm::exceptions::InvalidOperationException,
"Cannot perform logical 'and' on check results of incompatible type.");
57 first.truthValues &= secondCheckResult.truthValues;
59 first.truthValues |= secondCheckResult.truthValues;
63template<
typename ValueType>
65 performLogicalOperation(*
this, other,
true);
69template<
typename ValueType>
71 performLogicalOperation(*
this, other,
false);
75template<
typename ValueType>
77 return !truthValues.empty();
80template<
typename ValueType>
82 return truthValues.full();
85template<
typename ValueType>
87 return truthValues.getNumberOfSetBits();
90template<
typename ValueType>
92 return state < states.size() && states.get(state);
95template<
typename ValueType>
97 STORM_LOG_ASSERT(this->hasValueForState(state),
"State '" << state <<
"' has no value.");
98 return states.getNumberOfSetBitsBeforeIndex(state);
101template<
typename ValueType>
103 return truthValues.get(this->getOffset(state));
106template<
typename ValueType>
111template<
typename ValueType>
116template<
typename ValueType>
121template<
typename ValueType>
126template<
typename ValueType>
128 return states.full();
131template<
typename ValueType>
136template<
typename ValueType>
139 out << (truthValues.get(0) ?
"true" :
"false");
140 }
else if (truthValues.full()) {
142 }
else if (truthValues.empty()) {
145 out <<
"{true, false}";
150template<
typename ValueType>
152 STORM_LOG_THROW(
filter.isExplicitQualitativeCheckResult(), storm::exceptions::InvalidOperationException,
153 "Cannot filter explicit check result with non-explicit filter.");
154 STORM_LOG_THROW(
filter.isResultForAllStates(), storm::exceptions::InvalidOperationException,
"Cannot filter check result with non-complete filter.");
160 uint64_t
const numStates = std::max(filterTruthValues.
size(), states.size());
162 available.
resize(numStates);
164 selected.
resize(numStates);
166 "The check result fails to contain some results referred to by the filter.");
168 truthValues = truthValues % (selected % available);
169 states = filterTruthValues;
172template<
typename ValueType>
174 return static_cast<bool>(scheduler);
177template<
typename ValueType>
179 this->scheduler = std::move(scheduler);
182template<
typename ValueType>
185 return *scheduler.value();
188template<
typename ValueType>
191 return *scheduler.value();
194template<
typename JsonRationalType>
196 std::optional<storm::storage::sparse::Valuations>
const& stateValuations = std::nullopt,
197 std::optional<storm::models::sparse::StateLabeling>
const& stateLabels = std::nullopt) {
199 if (stateValuations) {
200 entry[
"s"] = stateValuations->template toJson<JsonRationalType>(
id);
206 auto labs = stateLabels->getLabelsOfState(
id);
209 json.push_back(std::move(entry));
212template<
typename ValueType>
213template<
typename JsonRationalType>
215 std::optional<storm::models::sparse::StateLabeling>
const& stateLabels)
const {
225 std::optional<storm::models::sparse::StateLabeling>
const&)
const;
228 std::optional<storm::storage::sparse::Valuations>
const&, std::optional<storm::models::sparse::StateLabeling>
const&)
const;
232 std::optional<storm::storage::sparse::Valuations>
const&, std::optional<storm::models::sparse::StateLabeling>
const&)
const;
234 std::optional<storm::storage::sparse::Valuations>
const&, std::optional<storm::models::sparse::StateLabeling>
const&)
const;
238 std::optional<storm::storage::sparse::Valuations>
const&, std::optional<storm::models::sparse::StateLabeling>
const&)
const;
240 std::optional<storm::storage::sparse::Valuations>
const&, std::optional<storm::models::sparse::StateLabeling>
const&)
const;
244 std::optional<storm::models::sparse::StateLabeling>
const&)
const;
246 std::optional<storm::storage::sparse::Valuations>
const&, std::optional<storm::models::sparse::StateLabeling>
const&)
const;
ExplicitQualitativeCheckResult< ValueType > & asExplicitQualitativeCheckResult()
virtual bool isExplicitQualitativeCheckResult() const
A qualitative check result over the states of a sparse model.
virtual uint64_t count() const override
virtual bool forallTrue() const override
bool hasValueForState(storm::storage::sparse::state_type state) const
Retrieves whether the result holds a truth value for the given state.
storm::storage::Scheduler< ValueType > const & getScheduler() const
virtual bool isResultForAllStates() const override
virtual void filter(QualitativeCheckResult const &filter) override
Filters the current result wrt.
storm::json< JsonRationalType > toJson(std::optional< storm::storage::sparse::Valuations > const &stateValuations=std::nullopt, std::optional< storm::models::sparse::StateLabeling > const &stateLabels=std::nullopt) const
storm::storage::BitVector vector_type
virtual void complement() override
virtual bool isExplicit() const override
virtual QualitativeCheckResult & operator&=(QualitativeCheckResult const &other) override
virtual std::unique_ptr< CheckResult > clone() const override
storm::storage::BitVector const & getStates() const
Retrieves the states this result holds truth values for.
virtual bool hasScheduler() const override
virtual QualitativeCheckResult & operator|=(QualitativeCheckResult const &other) override
virtual bool existsTrue() const override
void setScheduler(std::unique_ptr< storm::storage::Scheduler< ValueType > > &&scheduler)
ExplicitQualitativeCheckResult(storm::storage::sparse::state_type state, bool value)
Creates a result that holds the given truth value for the given state only.
vector_type const & getTruthValuesVector() const
Retrieves the truth values, one per state this result is for.
virtual bool isExplicitQualitativeCheckResult() const override
virtual std::ostream & writeToStream(std::ostream &out) const override
bool operator[](storm::storage::sparse::state_type state) const
Retrieves the truth value of the given state.
A bit vector that is internally represented as a vector of 64-bit values.
void complement()
Negates all bits in the bit vector.
bool isSubsetOf(BitVector const &other) const
Checks whether all bits that are set in the current bit vector are also set in the given bit vector.
uint64_t getNumberOfSetBits() const
Returns the number of bits that are set to true in this bit vector.
size_t size() const
Retrieves the number of bits this bit vector can store.
void resize(uint64_t newLength, bool init=false)
Resizes the bit vector to hold the given new number of bits.
This class defines which action is chosen in a particular state of a non-deterministic model.
#define STORM_LOG_ASSERT(cond, message)
#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)
nlohmann::basic_json< std::map, std::vector, std::string, bool, int64_t, uint64_t, ValueType > json