81 lines
3.8 KiB
81 lines
3.8 KiB
#pragma once
|
|
|
|
#include <vector>
|
|
#include <memory>
|
|
|
|
#include "storm/models/sparse/StateLabeling.h"
|
|
#include "storm/models/sparse/StandardRewardModel.h"
|
|
#include "storm/storage/memorystructure/MemoryStructure.h"
|
|
|
|
namespace storm {
|
|
namespace storage {
|
|
|
|
template <typename ValueType, typename RewardModelType = storm::models::sparse::StandardRewardModel<ValueType>>
|
|
class MemoryStructureBuilder {
|
|
public:
|
|
|
|
/*!
|
|
* Initializes a new builder for a memory structure
|
|
* @param numberOfMemoryStates The number of states the resulting memory structure should have
|
|
*/
|
|
MemoryStructureBuilder(uint_fast64_t numberOfMemoryStates, storm::models::sparse::Model<ValueType, RewardModelType> const& model);
|
|
// TODO: Add variant with a flag: Consider non-initial model states
|
|
/*!
|
|
* Initializes a new builder with the data from the provided memory structure
|
|
*/
|
|
MemoryStructureBuilder(MemoryStructure const& memoryStructure, storm::models::sparse::Model<ValueType, RewardModelType> const& model);
|
|
|
|
/*!
|
|
* Specifies for the given initial state of the model the corresponding initial memory state.
|
|
*
|
|
* @note The default initial memory state is 0.
|
|
*
|
|
* @param initialModelState the index of an initial state of the model.
|
|
* @param initialMemoryState the initial memory state associated to the corresponding model state.
|
|
*/
|
|
void setInitialMemoryState(uint_fast64_t initialModelState, uint_fast64_t initialMemoryState);
|
|
|
|
/*!
|
|
* Specifies a transition of the memory structure.
|
|
* The interpretation is that we switch from startState to goalState upon entering one of the specified model states (via one of the specified choices).
|
|
*
|
|
* @note If it is not possible to move from startState to goalState, such a transition does not have to be set explicitly.
|
|
*
|
|
* @param startState the memorystate in which the transition starts
|
|
* @param goalState the memorystate in which the transition ends
|
|
* @param modelStates the model states that trigger this transition.
|
|
* @param modelChoices if given, filers the choices of the model that trigger this transition.
|
|
*
|
|
*/
|
|
void setTransition(uint_fast64_t const& startState, uint_fast64_t const& goalState, storm::storage::BitVector const& modelStates, boost::optional<storm::storage::BitVector> const& modelChoices = boost::none);
|
|
|
|
/*!
|
|
* Sets a label to the given memory state.
|
|
*/
|
|
void setLabel(uint_fast64_t const& state, std::string const& label);
|
|
|
|
/*!
|
|
* Builds the memory structure.
|
|
* @note Calling this invalidates this builder.
|
|
* @note When calling this method, the specified transitions should be deterministic and complete, i.e., every triple
|
|
* (memoryState, modelChoice, modelState) should uniquely specify a successor memory state.
|
|
*/
|
|
MemoryStructure build();
|
|
|
|
/*!
|
|
* Builds a trivial memory structure for the given model (consisting of a single memory state)
|
|
*/
|
|
static MemoryStructure buildTrivialMemoryStructure(storm::models::sparse::Model<ValueType, RewardModelType> const& model);
|
|
|
|
|
|
private:
|
|
storm::models::sparse::Model<ValueType, RewardModelType> const& model;
|
|
MemoryStructure::TransitionMatrix transitions;
|
|
storm::models::sparse::StateLabeling stateLabeling;
|
|
std::vector<uint_fast64_t> initialMemoryStates;
|
|
};
|
|
|
|
}
|
|
}
|
|
|
|
|