3#include <boost/algorithm/string/join.hpp>
20 std::vector<storm::RationalNumber>&& rationalValues, std::vector<int64_t>&& observationLabelValues)
21 : booleanValues(
std::move(booleanValues)),
22 integerValues(
std::move(integerValues)),
23 rationalValues(
std::move(rationalValues)),
24 observationLabelValues(
std::move(observationLabelValues)) {
30 STORM_LOG_ASSERT(assertValuation(valuations[stateIndex]),
"Invalid state valuations");
31 return valuations[stateIndex];
35 typename std::map<std::string, uint64_t>::const_iterator labelIt,
36 typename std::map<storm::expressions::Variable, uint64_t>::const_iterator variableBegin,
37 typename std::map<storm::expressions::Variable, uint64_t>::const_iterator variableEnd,
38 typename std::map<std::string, uint64_t>::const_iterator labelBegin,
39 typename std::map<std::string, uint64_t>::const_iterator labelEnd,
StateValuation const* valuation)
40 : variableIt(variableIt),
42 variableBegin(variableBegin),
43 variableEnd(variableEnd),
44 labelBegin(labelBegin),
46 valuation(valuation) {
51 return variableIt != variableEnd;
55 return variableIt == variableEnd;
60 return variableIt->first;
64 return labelIt->first;
67 return isVariableAssignment() && getVariable().hasBooleanType();
70 return isVariableAssignment() && getVariable().hasIntegerType();
73 return isVariableAssignment() && getVariable().hasRationalType();
77 if (isVariableAssignment()) {
78 return getVariable().getName();
86 return valuation->booleanValues[variableIt->second];
91 return valuation->integerValues[variableIt->second];
97 "Label index " << labelIt->second <<
" larger than number of labels " << valuation->observationLabelValues.size());
98 return valuation->observationLabelValues[labelIt->second];
103 return valuation->rationalValues[variableIt->second];
107 STORM_LOG_ASSERT(valuation == valuation,
"Comparing iterators for different states");
108 return variableIt == other.variableIt && labelIt == other.labelIt;
111 return !(*
this == other);
115 if (variableIt != variableEnd) {
125 if (labelIt != labelBegin) {
134 std::map<std::string, uint64_t>
const& labelMap,
StateValuation const* valuation)
135 : variableMap(variableMap), labelMap(labelMap), valuation(valuation) {
140 return StateValueIterator(variableMap.cbegin(), labelMap.cbegin(), variableMap.cbegin(), variableMap.cend(), labelMap.cbegin(), labelMap.cend(), valuation);
144 return StateValueIterator(variableMap.cend(), labelMap.cend(), variableMap.cbegin(), variableMap.cend(), labelMap.cbegin(), labelMap.cend(), valuation);
148 auto const& valuation = getValuation(stateIndex);
149 STORM_LOG_ASSERT(variableToIndexMap.count(booleanVariable) > 0,
"Variable " << booleanVariable.
getName() <<
" is not part of this valuation.");
151 return valuation.booleanValues[variableToIndexMap.at(booleanVariable)];
156 auto const& valuation = getValuation(stateIndex);
157 STORM_LOG_ASSERT(variableToIndexMap.count(integerVariable) > 0,
"Variable " << integerVariable.
getName() <<
" is not part of this valuation.");
159 return valuation.integerValues[variableToIndexMap.at(integerVariable)];
164 auto const& valuation = getValuation(stateIndex);
165 STORM_LOG_ASSERT(variableToIndexMap.count(rationalVariable) > 0,
"Variable " << rationalVariable.
getName() <<
" is not part of this valuation.");
167 return valuation.rationalValues[variableToIndexMap.at(rationalVariable)];
171 STORM_LOG_ASSERT(variableToIndexMap.count(booleanVariable) > 0,
"Variable " << booleanVariable.
getName() <<
" is not part of this valuation.");
173 auto const varIndex = variableToIndexMap.at(booleanVariable);
176 if (getValuation(stateIndex).booleanValues[varIndex]) {
177 result.
set(stateIndex);
184 STORM_LOG_ASSERT(variableToIndexMap.count(integerVariable) > 0,
"Variable " << integerVariable.
getName() <<
" is not part of this valuation.");
186 auto const varIndex = variableToIndexMap.at(integerVariable);
187 std::vector<int64_t> result;
190 result.push_back(getValuation(stateIndex).integerValues[varIndex]);
196 STORM_LOG_ASSERT(variableToIndexMap.count(rationalVariable) > 0,
"Variable " << rationalVariable.
getName() <<
" is not part of this valuation.");
198 auto const varIndex = variableToIndexMap.at(rationalVariable);
199 std::vector<storm::RationalNumber> result;
202 result.push_back(getValuation(stateIndex).rationalValues[varIndex]);
208 auto const& valuation = valuations[stateIndex];
209 return valuation.booleanValues.empty() && valuation.integerValues.empty() && valuation.rationalValues.empty() && valuation.observationLabelValues.empty();
213 boost::optional<std::set<storm::expressions::Variable>>
const& selectedVariables)
const {
214 auto const& valueAssignment =
at(stateIndex);
215 typename std::set<storm::expressions::Variable>::const_iterator setIt;
216 if (selectedVariables) {
217 setIt = selectedVariables->begin();
219 std::vector<std::string> assignments;
220 for (
auto valIt = valueAssignment.begin(); valIt != valueAssignment.end(); ++valIt) {
221 if (selectedVariables && (*setIt != valIt.getVariable())) {
225 std::stringstream stream;
227 if (valIt.isBoolean() && !valIt.getBooleanValue()) {
230 stream << valIt.getName();
231 if (valIt.isInteger()) {
232 stream <<
"=" << valIt.getIntegerValue();
233 }
else if (valIt.isRational()) {
234 stream <<
"=" << valIt.getRationalValue();
235 }
else if (valIt.isLabelAssignment()) {
236 stream <<
"=" << valIt.getLabelValue();
238 STORM_LOG_THROW(valIt.isBoolean(), storm::exceptions::InvalidTypeException,
"Unexpected variable type.");
241 if (valIt.isBoolean()) {
242 stream << std::boolalpha << valIt.getBooleanValue() << std::noboolalpha;
243 }
else if (valIt.isInteger()) {
244 stream << valIt.getIntegerValue();
245 }
else if (valIt.isRational()) {
246 stream << valIt.getRationalValue();
247 }
else if (valIt.isLabelAssignment()) {
248 stream << valIt.getLabelValue();
251 assignments.push_back(stream.str());
253 if (selectedVariables) {
258 STORM_LOG_ASSERT(!selectedVariables || setIt == selectedVariables->end(),
"Valuation does not consider selected variable " << setIt->getName() <<
".");
261 return "[" + boost::join(assignments,
"\t& ") +
"]";
263 return "[" + boost::join(assignments,
"\t") +
"]";
267template<
typename JsonRationalType>
269 boost::optional<std::set<storm::expressions::Variable>>
const& selectedVariables)
const {
270 auto const& valueAssignment =
at(stateIndex);
271 typename std::set<storm::expressions::Variable>::const_iterator setIt;
272 if (selectedVariables) {
273 setIt = selectedVariables->begin();
276 for (
auto valIt = valueAssignment.begin(); valIt != valueAssignment.end(); ++valIt) {
277 if (selectedVariables && (*setIt != valIt.getVariable())) {
281 if (valIt.isBoolean()) {
282 result[valIt.getName()] = valIt.getBooleanValue();
283 }
else if (valIt.isInteger()) {
284 result[valIt.getName()] = valIt.getIntegerValue();
285 }
else if (valIt.isLabelAssignment()) {
286 result[valIt.getLabel()] = valIt.getLabelValue();
288 STORM_LOG_ASSERT(valIt.isRational(),
"Unexpected variable type for variable " << valIt.getName());
289 result[valIt.getName()] = storm::utility::convertNumber<JsonRationalType>(valIt.getRationalValue());
292 if (selectedVariables) {
300bool StateValuations::assertValuation(StateValuation
const& valuation)
const {
304 for (
auto const& varIndex : variableToIndexMap) {
306 if (varIndex.first.hasBooleanType()) {
307 bv = &foundBooleanValues;
308 }
else if (varIndex.first.hasIntegerType()) {
309 bv = &foundIntegerValues;
310 }
else if (varIndex.first.hasRationalType()) {
311 bv = &foundRationalValues;
313 STORM_LOG_THROW(
false, storm::exceptions::InvalidTypeException,
"Unexpected variable type.");
315 if (varIndex.second < bv->
size()) {
316 if (bv->
get(varIndex.second)) {
320 bv->
set(varIndex.second,
true);
322 STORM_LOG_ERROR(
"Valuation does not provide a value for all variables");
326 if (!(foundBooleanValues.full() && foundIntegerValues.full() && foundRationalValues.full())) {
333 : variableToIndexMap(variableToIndexMap), valuations(valuations) {
348 return valuations.size();
360 std::vector<StateValuation> selectedValuations;
361 selectedValuations.reserve(selectedStates.size());
362 for (
auto const& selectedState : selectedStates) {
363 if (selectedState < valuations.size()) {
364 selectedValuations.push_back(valuations[selectedState]);
366 selectedValuations.emplace_back();
369 return StateValuations(variableToIndexMap, std::move(selectedValuations));
373 std::vector<StateValuation> newValuations;
374 for (
auto const& oldState : mapNewToOld) {
375 newValuations.push_back(valuations[oldState]);
385 STORM_LOG_ASSERT(currentStateValuations.valuations.empty(),
"Tried to add a variable, although a state has already been added before.");
386 STORM_LOG_ASSERT(currentStateValuations.variableToIndexMap.count(variable) == 0,
"Variable " << variable.
getName() <<
" already added.");
388 currentStateValuations.variableToIndexMap[variable] = booleanVarCount++;
391 currentStateValuations.variableToIndexMap[variable] = integerVarCount++;
394 currentStateValuations.variableToIndexMap[variable] = rationalVarCount++;
399 currentStateValuations.observationLabels[label] = labelCount++;
403 std::vector<int64_t>&& integerValues) {
404 addState(state, std::move(booleanValues), std::move(integerValues), {});
408 std::vector<storm::RationalNumber>&& rationalValues, std::vector<int64_t>&& observationLabelValues) {
409 if (state > currentStateValuations.valuations.size()) {
410 currentStateValuations.valuations.resize(state);
412 if (state == currentStateValuations.valuations.size()) {
413 currentStateValuations.valuations.emplace_back(std::move(booleanValues), std::move(integerValues), std::move(rationalValues),
414 std::move(observationLabelValues));
416 STORM_LOG_ASSERT(currentStateValuations.
isEmpty(state),
"Adding a valuation to the same state multiple times.");
418 std::move(rationalValues), std::move(observationLabelValues));
423 return booleanVarCount;
427 return integerVarCount;
437 rationalVarCount = 0;
439 return std::move(currentStateValuations);
443 boost::optional<std::set<storm::expressions::Variable>>
const&)
const;
bool hasBooleanType() const
Checks whether the variable is of boolean type.
bool hasIntegerType() const
Checks whether the variable is of integral type.
bool hasRationalType() const
Checks whether the variable is of rational type.
std::string const & getName() const
Retrieves the name of the variable.
A bit vector that is internally represented as a vector of 64-bit values.
void set(uint_fast64_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(uint_fast64_t index) const
Retrieves the truth value of the bit at the given index and performs a bound check.
bool getBooleanValue() const
storm::expressions::Variable const & getVariable() const
bool operator==(StateValueIterator const &other)
int64_t getLabelValue() const
bool operator!=(StateValueIterator const &other)
int64_t getIntegerValue() const
bool isVariableAssignment() const
StateValueIterator & operator++()
storm::RationalNumber getRationalValue() const
StateValueIterator & operator--()
bool isLabelAssignment() const
StateValueIterator(typename std::map< storm::expressions::Variable, uint64_t >::const_iterator variableIt, typename std::map< std::string, uint64_t >::const_iterator labelIt, typename std::map< storm::expressions::Variable, uint64_t >::const_iterator variableBegin, typename std::map< storm::expressions::Variable, uint64_t >::const_iterator variableEnd, typename std::map< std::string, uint64_t >::const_iterator labelBegin, typename std::map< std::string, uint64_t >::const_iterator labelEnd, StateValuation const *valuation)
std::string const & getLabel() const
std::string const & getName() const
StateValueIterator begin() const
StateValueIterator end() const
StateValueIteratorRange(std::map< storm::expressions::Variable, uint64_t > const &variableMap, std::map< std::string, uint64_t > const &labelMap, StateValuation const *valuation)
uint64_t getIntegerVarCount() const
uint64_t getBooleanVarCount() const
void addState(storm::storage::sparse::state_type const &state, std::vector< bool > &&booleanValues={}, std::vector< int64_t > &&integerValues={})
Adds a new state.
uint64_t getLabelCount() const
void addObservationLabel(std::string const &label)
StateValuations build()
Creates the finalized state valuations object.
void addVariable(storm::expressions::Variable const &variable)
Adds a new variable to keep track of for the state valuations.
uint_fast64_t getNumberOfStates() const
std::vector< storm::RationalNumber > getRationalValues(storm::expressions::Variable const &rationalVariable) const
Returns a vector of size getNumberOfStates() such that the i'th entry is the value of the given varia...
std::string toString(storm::storage::sparse::state_type const &stateIndex, bool pretty=true, boost::optional< std::set< storm::expressions::Variable > > const &selectedVariables=boost::none) const
Returns a string representation of the valuation.
StateValuations selectStates(storm::storage::BitVector const &selectedStates) const
storm::RationalNumber const & getRationalValue(storm::storage::sparse::state_type const &stateIndex, storm::expressions::Variable const &rationalVariable) const
bool isEmpty(storm::storage::sparse::state_type const &stateIndex) const
Returns true, if this valuation does not contain any value.
StateValuations()=default
std::vector< int64_t > getIntegerValues(storm::expressions::Variable const &integerVariable) const
Returns a vector of size getNumberOfStates() such that the i'th entry is the value of the given varia...
int64_t const & getIntegerValue(storm::storage::sparse::state_type const &stateIndex, storm::expressions::Variable const &integerVariable) const
storm::storage::BitVector getBooleanValues(storm::expressions::Variable const &booleanVariable) const
Returns a vector of size getNumberOfStates() such that the i'th entry is the value of the given varia...
storm::json< JsonRationalType > toJson(storm::storage::sparse::state_type const &stateIndex, boost::optional< std::set< storm::expressions::Variable > > const &selectedVariables=boost::none) const
Returns a JSON representation of this valuation.
StateValuations blowup(std::vector< uint64_t > const &mapNewToOld) const
StateValueIteratorRange at(storm::storage::sparse::state_type const &state) const
virtual std::size_t hash() const
virtual std::string getStateInfo(storm::storage::sparse::state_type const &state) const override
bool getBooleanValue(storm::storage::sparse::state_type const &stateIndex, storm::expressions::Variable const &booleanVariable) const
#define STORM_LOG_ERROR(message)
#define STORM_LOG_ASSERT(cond, message)
#define STORM_LOG_THROW(cond, exception, message)
std::vector< Type > filterVector(std::vector< Type > const &in, storm::storage::BitVector const &filter)
nlohmann::basic_json< std::map, std::vector, std::string, bool, int64_t, uint64_t, ValueType > json