19template<
typename ValueType,
typename StateType>
25template<
typename ValueType,
typename StateType>
27 uint64_t actionIndex) {
29 bool res = func(val, actionIndex);
33template<
typename ValueType,
typename StateType>
38 expressionManager(expressionManager.getSharedPointer()),
39 variableInformation(variableInformation),
42 comparator(
storm::utility::convertNumber<ValueType>(options.getStochasticTolerance())),
47template<
typename ValueType,
typename StateType>
52 expressionManager(expressionManager.getSharedPointer()),
53 variableInformation(),
56 comparator(
storm::utility::convertNumber<ValueType>(options.getStochasticTolerance())),
59template<
typename ValueType,
typename StateType>
62template<
typename ValueType,
typename StateType>
67template<
typename ValueType,
typename StateType>
69 return variableInformation.getTotalBitOffset(
true);
72template<
typename ValueType,
typename StateType>
74 if (variableInformation.hasOutOfBoundsBit()) {
77 if (options.isAddOverlappingGuardLabelSet()) {
78 overlappingGuardStates = std::vector<uint64_t>();
82template<
typename ValueType,
typename StateType>
85 for (
auto const& v : variableInformation.locationVariables) {
88 for (
auto const& v : variableInformation.booleanVariables) {
91 for (
auto const& v : variableInformation.integerVariables) {
97template<
typename ValueType,
typename StateType>
100 for (
auto const& v : variableInformation.booleanVariables) {
105 for (
auto const& v : variableInformation.integerVariables) {
110 for (
auto const& l : variableInformation.observationLabels) {
116template<
typename ValueType,
typename StateType>
122 this->state = &state;
125template<
typename ValueType,
typename StateType>
130 return evaluator->asBool(expression);
133template<
typename ValueType,
typename StateType>
135 return variableInformation;
138template<
typename ValueType,
typename StateType>
141 std::vector<bool> booleanValues;
142 booleanValues.reserve(variableInformation.booleanVariables.size());
143 std::vector<int64_t> integerValues;
144 integerValues.reserve(variableInformation.locationVariables.size() + variableInformation.integerVariables.size());
145 extractVariableValues(*this->state, variableInformation, integerValues, booleanValues, integerValues);
146 valuationsBuilder.
addState(currentStateIndex, std::move(booleanValues), std::move(integerValues));
149template<
typename ValueType,
typename StateType>
152 for (
auto const& observationEntry : observabilityMap) {
153 std::vector<bool> booleanValues;
154 booleanValues.reserve(variableInformation.booleanVariables.size());
155 std::vector<int64_t> integerValues;
156 integerValues.reserve(variableInformation.locationVariables.size() +
157 variableInformation.integerVariables.size());
158 std::vector<int64_t> observationLabelValues;
159 observationLabelValues.reserve(variableInformation.observationLabels.size());
161 for (
auto const& v : variableInformation.booleanVariables) {
166 for (
auto const& v : variableInformation.integerVariables) {
171 for (uint64_t labelStart = variableInformation.getTotalBitOffset(
true); labelStart < observationEntry.first.size(); labelStart += 64) {
172 observationLabelValues.push_back(observationEntry.first.getAsInt(labelStart, 64));
174 valuationsBuilder.
addState(observationEntry.second, std::move(booleanValues), std::move(integerValues), {}, std::move(observationLabelValues));
176 return valuationsBuilder.
build();
179template<
typename ValueType,
typename StateType>
182 std::vector<StateType>
const& deadlockStateIndices, std::vector<StateType>
const& unexploredStateIndices,
183 std::vector<std::pair<std::string, storm::expressions::Expression>> labelsAndExpressions) {
184 labelsAndExpressions.insert(labelsAndExpressions.end(), this->options.getExpressionLabels().begin(), this->options.getExpressionLabels().end());
187 std::sort(labelsAndExpressions.begin(), labelsAndExpressions.end(),
188 [](std::pair<std::string, storm::expressions::Expression>
const& a, std::pair<std::string, storm::expressions::Expression>
const& b) {
189 return a.first < b.first;
191 auto it = std::unique(labelsAndExpressions.begin(), labelsAndExpressions.end(),
192 [](std::pair<std::string, storm::expressions::Expression>
const& a, std::pair<std::string, storm::expressions::Expression>
const& b) {
193 return a.first == b.first;
195 labelsAndExpressions.resize(std::distance(labelsAndExpressions.begin(), it));
201 for (
auto const& label : labelsAndExpressions) {
205 auto const& states = stateStorage.
stateToId;
206 for (
auto const& stateIndexPair : states) {
208 unpackTransientVariableValuesIntoEvaluator(stateIndexPair.first, *this->evaluator);
210 for (
auto const& label : labelsAndExpressions) {
212 if (evaluator->asBool(label.second)) {
218 auto addSpecialLabel = [&result](std::string
const& label,
auto const& indices) {
221 for (
auto index : indices) {
226 addSpecialLabel(
"init", initialStateIndices);
227 addSpecialLabel(
"deadlock", deadlockStateIndices);
228 if (!unexploredStateIndices.empty()) {
229 addSpecialLabel(
"unexplored", unexploredStateIndices);
231 if (this->options.isAddOverlappingGuardLabelSet()) {
233 "Label 'overlap_guards' is reserved when adding overlapping guard labels");
234 addSpecialLabel(
"overlap_guards", overlappingGuardStates.get());
236 if (this->options.isAddOutOfBoundsStateSet() && stateStorage.
stateToId.
contains(outOfBoundsState)) {
238 "Label 'out_of_bounds' is reserved when adding out of bounds states.");
239 addSpecialLabel(
"out_of_bounds", std::vector{stateStorage.
stateToId.
getValue(outOfBoundsState)});
245template<
typename ValueType,
typename StateType>
247 return label ==
"init" || label ==
"deadlock" || label ==
"unexplored" || label ==
"overlap_guards" || label ==
"out_of_bounds";
250template<
typename ValueType,
typename StateType>
257template<
typename ValueType,
typename StateType>
261 bool foundPreviousMarkovianChoice =
false;
263 uint64_t numberOfChoicesToDelete = 0;
265 for (uint_fast64_t index = 0; index + numberOfChoicesToDelete < result.
getNumberOfChoices();) {
269 if (foundPreviousMarkovianChoice) {
278 ++numberOfChoicesToDelete;
282 std::swap(result.
getChoices().front(), choice);
284 foundPreviousMarkovianChoice =
true;
293 if (numberOfChoicesToDelete > 0) {
299template<
typename ValueType,
typename StateType>
301 return toString(state, variableInformation);
304template<
typename ValueType,
typename StateType>
307 extendStateInformation(result);
311template<
typename ValueType,
typename StateType>
316template<
typename ValueType,
typename StateType>
321template<
typename ValueType,
typename StateType>
323 std::vector<boost::any>& )
const {
324 STORM_LOG_ERROR_COND(!options.isBuildChoiceOriginsSet(),
"Generating choice origins is not supported for the considered model format.");
328template<
typename ValueType,
typename StateType>
330 if (this->mask.size() == 0) {
337template<
typename ValueType,
typename StateType>
339 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"Generating player mappings is not supported for this model input format");
342template<
typename ValueType,
typename StateType>
344 if (overlappingGuardStates != boost::none) {
346 "Remapping of Ids during model building is not supported for overlapping guard statements.");
bool isTrue() const
Checks if the expression is equal to the boolean literal true.
This class is responsible for managing a set of typed variables and all expressions using these varia...
A simple implementation of the valuation interface.
virtual int_fast64_t getIntegerValue(Variable const &integerVariable) const override
Retrieves the value of the given integer variable.
virtual bool getBooleanValue(Variable const &booleanVariable) const override
Retrieves the value of the given boolean variable.
Action masks are arguments you can give to the state generator that limit which states are generated.
virtual std::shared_ptr< storm::storage::sparse::ChoiceOrigins > generateChoiceOrigins(std::vector< boost::any > &dataForChoiceOrigins) const
NextStateGenerator(storm::expressions::ExpressionManager const &expressionManager, VariableInformation const &variableInformation, NextStateGeneratorOptions const &options, std::shared_ptr< ActionMask< ValueType, StateType > > const &=nullptr)
virtual std::map< std::string, storm::storage::PlayerIndex > getPlayerNameToIndexMap() const
virtual storm::storage::sparse::StateValuations makeObservationValuation() const
Adds the valuation for the currently loaded state.
bool isSpecialLabel(std::string const &label) const
Checks if the input label has a special purpose (e.g.
virtual ~NextStateGenerator()
void initializeSpecialStates()
Initializes the out-of-bounds state and states with overlapping guards.
std::string stateToString(CompressedState const &state) const
virtual storm::storage::sparse::StateValuationsBuilder initializeStateValuationsBuilder() const
Initializes a builder for state valuations by adding the appropriate variables.
void postprocess(StateBehavior< ValueType, StateType > &result)
uint32_t observabilityClass(CompressedState const &state) const
virtual void extendStateInformation(storm::json< BaseValueType > &stateInfo) const
NextStateGeneratorOptions const & getOptions() const
storm::expressions::SimpleValuation currentStateToSimpleValuation() const
storm::json< ValueType > currentStateToJson(bool onlyObservable=false) const
void load(CompressedState const &state)
virtual storm::storage::sparse::StateValuationsBuilder initializeObservationValuationsBuilder() const
bool satisfies(storm::expressions::Expression const &expression) const
virtual void addStateValuation(storm::storage::sparse::state_type const ¤tStateIndex, storm::storage::sparse::StateValuationsBuilder &valuationsBuilder) const
Adds the valuation for the currently loaded state to the given builder.
void remapStateIds(std::function< StateType(StateType const &)> const &remapping)
Performs a remapping of all values stored by applying the given remapping.
uint64_t getStateSize() const
VariableInformation const & getVariableInformation() const
virtual void unpackTransientVariableValuesIntoEvaluator(CompressedState const &state, storm::expressions::ExpressionEvaluator< BaseValueType > &evaluator) const
Sets the values of all transient variables in the current state to the given evaluator.
virtual storm::models::sparse::StateLabeling label(storm::storage::sparse::StateStorage< StateType > const &stateStorage, std::vector< StateType > const &initialStateIndices={}, std::vector< StateType > const &deadlockStateIndices={}, std::vector< StateType > const &unexploredStateIndices={})=0
std::vector< Choice< ValueType, StateType > > const & getChoices() const
Retrieves the vector of choices.
std::size_t getNumberOfChoices() const
Retrieves the number of choices in the behavior.
A particular instance of the action mask that uses a callback function to evaluate whether an action ...
StateValuationFunctionMask(std::function< bool(storm::expressions::SimpleValuation const &, uint64_t)> const &f)
bool query(storm::generator::NextStateGenerator< ValueType, StateType > const &generator, uint64_t actionIndex) override
This method is called to check whether an action should be expanded.
void addLabel(std::string const &label)
Adds a new label to the labelings.
bool containsLabel(std::string const &label) const
Checks whether a label is registered within this labeling.
This class manages the labeling of the state space with a number of (atomic) labels.
void addLabelToState(std::string const &label, storm::storage::sparse::state_type state)
Adds a label to a given state.
ValueType getValue(storm::storage::BitVector const &key) const
Retrieves the value associated with the given key (if any).
bool contains(storm::storage::BitVector const &key) const
Checks if the given key is already contained in the map.
A bit vector that is internally represented as a vector of 64-bit values.
void addState(storm::storage::sparse::state_type const &state, std::vector< bool > &&booleanValues={}, std::vector< int64_t > &&integerValues={})
Adds a new state.
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.
#define STORM_LOG_ERROR_COND(cond, message)
#define STORM_LOG_THROW(cond, exception, message)
void unpackStateIntoEvaluator(CompressedState const &state, VariableInformation const &variableInformation, storm::expressions::ExpressionEvaluator< ValueType > &evaluator)
Unpacks the compressed state into the evaluator.
storm::expressions::SimpleValuation unpackStateIntoValuation(CompressedState const &state, VariableInformation const &variableInformation, storm::expressions::ExpressionManager const &manager)
Converts the compressed state into an explicit representation in the form of a valuation.
void extractVariableValues(CompressedState const &state, VariableInformation const &variableInformation, std::vector< int64_t > &locationValues, std::vector< bool > &booleanValues, std::vector< int64_t > &integerValues)
Appends the values of the given variables in the given state to the corresponding result vectors.
uint32_t unpackStateToObservabilityClass(CompressedState const &state, storm::storage::BitVector const &observationVector, std::unordered_map< storm::storage::BitVector, uint32_t > &observabilityMap, storm::storage::BitVector const &mask)
std::string toString(CompressedState const &state, VariableInformation const &variableInformation)
Returns a (human readable) string representation of the variable valuation encoded by the given state...
CompressedState createOutOfBoundsState(VariableInformation const &varInfo, bool roundTo64Bit)
storm::storage::BitVector computeObservabilityMask(VariableInformation const &variableInformation)
nlohmann::basic_json< std::map, std::vector, std::string, bool, int64_t, uint64_t, ValueType > json
bool isMarkovian() const
Retrieves whether the choice is Markovian.
uint64_t getNumberOfStates() const
storm::storage::BitVectorHashMap< StateType > stateToId