73 std::vector<ValueType>
const& oneStepProbabilities) {
74 uint_fast64_t penalty = 0;
75 bool hasParametricSelfLoop =
false;
77 for (
auto const& predecessor : backwardTransitions.
getRow(state)) {
78 for (
auto const& successor : transitionMatrix.
getRow(state)) {
81 if (predecessor.getColumn() == state) {
89 if (hasParametricSelfLoop) {
104std::shared_ptr<StatePriorityQueue>
createStatePriorityQueue(boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,
108 STORM_LOG_TRACE(
"Creating state priority queue for states " << states);
112 storm::settings::getModule<storm::settings::modules::EliminationSettings>().getEliminationOrder();
114 std::vector<storm::storage::sparse::state_type> sortedStates(states.
begin(), states.
end());
117 std::random_device randomDevice;
118 std::mt19937 generator(randomDevice());
119 std::shuffle(sortedStates.begin(), sortedStates.end(), generator);
120 return std::make_unique<StaticStatePriorityQueue>(sortedStates);
123 STORM_LOG_THROW(
static_cast<bool>(distanceBasedStatePriorities), storm::exceptions::InvalidStateException,
124 "Unable to build state priority queue without distance-based priorities.");
125 std::sort(sortedStates.begin(), sortedStates.end(),
127 return distanceBasedStatePriorities.get()[state1] < distanceBasedStatePriorities.get()[state2];
129 return std::make_unique<StaticStatePriorityQueue>(sortedStates);
131 std::vector<std::pair<storm::storage::sparse::state_type, uint_fast64_t>> statePenalties(sortedStates.size());
134 : computeStatePenalty<ValueType>;
135 for (uint_fast64_t index = 0; index < sortedStates.size(); ++index) {
136 statePenalties[index] =
137 std::make_pair(sortedStates[index], penaltyFunction(sortedStates[index], transitionMatrix, backwardTransitions, oneStepProbabilities));
141 statePenalties.begin(), statePenalties.end(),
142 [](std::pair<storm::storage::sparse::state_type, uint_fast64_t>
const& statePenalty1,
143 std::pair<storm::storage::sparse::state_type, uint_fast64_t>
const& statePenalty2) { return statePenalty1.second < statePenalty2.second; });
147 for (uint_fast64_t index = 0; index < sortedStates.size(); ++index) {
148 sortedStates[index] = statePenalties[index].first;
150 return std::make_unique<StaticStatePriorityQueue>(sortedStates);
153 return std::make_unique<DynamicStatePriorityQueue<ValueType>>(statePenalties, transitionMatrix, backwardTransitions, oneStepProbabilities,
158 STORM_LOG_THROW(
false, storm::exceptions::InvalidSettingsException,
"Illegal elimination order selected.");
174 bool forward,
bool reverse) {
175 std::vector<uint_fast64_t> statePriorities(transitionMatrix.
getRowCount());
176 std::vector<storm::storage::sparse::state_type> states(transitionMatrix.
getRowCount());
177 for (std::size_t index = 0; index < states.size(); ++index) {
178 states[index] = index;
181 std::vector<uint_fast64_t> distances =
182 getStateDistances(transitionMatrix, transitionMatrixTransposed, initialStates, oneStepProbabilities,
183 storm::settings::getModule<storm::settings::modules::EliminationSettings>().getEliminationOrder() ==
185 storm::settings::getModule<storm::settings::modules::EliminationSettings>().getEliminationOrder() ==
189 if (forward ^ reverse) {
190 std::sort(states.begin(), states.end(),
192 return distances[state1] < distances[state2];
196 std::sort(states.begin(), states.end(),
198 return distances[state1] > distances[state2];
203 for (uint_fast64_t index = 0; index < states.size(); ++index) {
204 statePriorities[states[index]] = index;
207 return statePriorities;
221 for (std::size_t index = 0; index < oneStepProbabilities.size(); ++index) {
222 if (oneStepProbabilities[index] != storm::utility::zero<ValueType>()) {
223 pseudoTargetStates.
set(index);
232template std::shared_ptr<StatePriorityQueue>
createStatePriorityQueue(boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,
255template std::shared_ptr<StatePriorityQueue>
createStatePriorityQueue(boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,
277template std::shared_ptr<StatePriorityQueue>
createStatePriorityQueue(boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,