15 std::vector<uint_fast64_t>
const& initialMemoryStates,
bool onlyInitialStatesRelevant)
16 : transitions(transitionMatrix),
17 stateLabeling(memoryStateLabeling),
18 initialMemoryStates(initialMemoryStates),
19 onlyInitialStatesRelevant(onlyInitialStatesRelevant) {
24 std::vector<uint_fast64_t>&& initialMemoryStates,
bool onlyInitialStatesRelevant)
25 : transitions(
std::move(transitionMatrix)),
26 stateLabeling(
std::move(memoryStateLabeling)),
27 initialMemoryStates(
std::move(initialMemoryStates)),
28 onlyInitialStatesRelevant(onlyInitialStatesRelevant) {
53 for (uint_fast64_t successorMemState = 0; successorMemState <
getNumberOfStates(); ++successorMemState) {
54 boost::optional<storm::storage::BitVector>
const& matrixEntry = transitions[currentMemoryState][successorMemState];
55 if ((matrixEntry) && matrixEntry.get().get(modelTransitionIndex)) {
56 return successorMemState;
59 STORM_LOG_THROW(
false, storm::exceptions::InvalidOperationException,
"The successor memorystate for the given transition could not be found.");
66 uint_fast64_t resNumStates = lhsNumStates * rhsNumStates;
69 TransitionMatrix resultTransitions(resNumStates, std::vector<boost::optional<storm::storage::BitVector>>(resNumStates));
70 uint_fast64_t resState = 0;
71 for (uint_fast64_t lhsState = 0; lhsState < lhsNumStates; ++lhsState) {
72 for (uint_fast64_t rhsState = 0; rhsState < rhsNumStates; ++rhsState) {
73 assert(resState == (lhsState * rhsNumStates) + rhsState);
74 auto& resStateTransitions = resultTransitions[resState];
75 for (uint_fast64_t lhsTransitionTarget = 0; lhsTransitionTarget < lhsNumStates; ++lhsTransitionTarget) {
78 for (uint_fast64_t rhsTransitionTarget = 0; rhsTransitionTarget < rhsNumStates; ++rhsTransitionTarget) {
81 uint_fast64_t resTransitionTarget = (lhsTransitionTarget * rhsNumStates) + rhsTransitionTarget;
82 resStateTransitions[resTransitionTarget] = rhsTransition.get() & lhsTransition.get();
84 if (resStateTransitions[resTransitionTarget]->empty()) {
85 resStateTransitions[resTransitionTarget] = boost::none;
100 for (
auto lhsState : lhsLabeledStates) {
101 for (uint_fast64_t rhsState = 0; rhsState < rhsNumStates; ++rhsState) {
102 resState = (lhsState * rhsNumStates) + rhsState;
103 resLabeledStates.
set(resState,
true);
106 resultLabeling.
addLabel(lhsLabel, std::move(resLabeledStates));
110 !resultLabeling.
containsLabel(rhsLabel), storm::exceptions::InvalidOperationException,
111 "Failed to build the product of two memory structures: State labelings are not disjoint as both structures contain the label " << rhsLabel <<
".");
114 for (
auto rhsState : rhsLabeledStates) {
115 for (uint_fast64_t lhsState = 0; lhsState < lhsNumStates; ++lhsState) {
116 resState = (lhsState * rhsNumStates) + rhsState;
117 resLabeledStates.
set(resState,
true);
120 resultLabeling.
addLabel(rhsLabel, std::move(resLabeledStates));
124 std::vector<uint_fast64_t> resultInitialMemoryStates;
126 "Tried to build the product of two memory structures that consider a different number of initial model states.");
131 resultInitialMemoryStates.push_back(*lhsStateIt * rhsNumStates + *rhsStateIt);
134 return MemoryStructure(std::move(resultTransitions), std::move(resultLabeling), std::move(resultInitialMemoryStates));
MemoryStructure(TransitionMatrix const &transitionMatrix, storm::models::sparse::StateLabeling const &memoryStateLabeling, std::vector< uint_fast64_t > const &initialMemoryStates, bool onlyInitialStatesRelevant=true)
Creates a memory structure with the given transition matrix, the given memory state labeling,...