69 std::vector<ValueType>
const& oneStepProbabilities) {
70 uint_fast64_t penalty = 0;
71 bool hasParametricSelfLoop =
false;
73 for (
auto const& predecessor : backwardTransitions.
getRow(state)) {
74 for (
auto const& successor : transitionMatrix.
getRow(state)) {
77 if (predecessor.getColumn() == state) {
85 if (hasParametricSelfLoop) {
100std::shared_ptr<StatePriorityQueue>
createStatePriorityQueue(boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,
104 STORM_LOG_TRACE(
"Creating state priority queue for states " << states);
108 storm::settings::getModule<storm::settings::modules::EliminationSettings>().getEliminationOrder();
110 std::vector<storm::storage::sparse::state_type> sortedStates(states.
begin(), states.
end());
113 std::random_device randomDevice;
114 std::mt19937 generator(randomDevice());
115 std::shuffle(sortedStates.begin(), sortedStates.end(), generator);
116 return std::make_unique<StaticStatePriorityQueue>(sortedStates);
119 STORM_LOG_THROW(
static_cast<bool>(distanceBasedStatePriorities), storm::exceptions::InvalidStateException,
120 "Unable to build state priority queue without distance-based priorities.");
121 std::sort(sortedStates.begin(), sortedStates.end(),
123 return distanceBasedStatePriorities.get()[state1] < distanceBasedStatePriorities.get()[state2];
125 return std::make_unique<StaticStatePriorityQueue>(sortedStates);
127 std::vector<std::pair<storm::storage::sparse::state_type, uint_fast64_t>> statePenalties(sortedStates.size());
130 : computeStatePenalty<ValueType>;
131 for (uint_fast64_t index = 0; index < sortedStates.size(); ++index) {
132 statePenalties[index] =
133 std::make_pair(sortedStates[index], penaltyFunction(sortedStates[index], transitionMatrix, backwardTransitions, oneStepProbabilities));
137 statePenalties.begin(), statePenalties.end(),
138 [](std::pair<storm::storage::sparse::state_type, uint_fast64_t>
const& statePenalty1,
139 std::pair<storm::storage::sparse::state_type, uint_fast64_t>
const& statePenalty2) { return statePenalty1.second < statePenalty2.second; });
143 for (uint_fast64_t index = 0; index < sortedStates.size(); ++index) {
144 sortedStates[index] = statePenalties[index].first;
146 return std::make_unique<StaticStatePriorityQueue>(sortedStates);
149 return std::make_unique<DynamicStatePriorityQueue<ValueType>>(statePenalties, transitionMatrix, backwardTransitions, oneStepProbabilities,
154 STORM_LOG_THROW(
false, storm::exceptions::InvalidSettingsException,
"Illegal elimination order selected.");
170 bool forward,
bool reverse) {
171 std::vector<uint_fast64_t> statePriorities(transitionMatrix.
getRowCount());
172 std::vector<storm::storage::sparse::state_type> states(transitionMatrix.
getRowCount());
173 for (std::size_t index = 0; index < states.size(); ++index) {
174 states[index] = index;
177 std::vector<uint_fast64_t> distances =
178 getStateDistances(transitionMatrix, transitionMatrixTransposed, initialStates, oneStepProbabilities,
179 storm::settings::getModule<storm::settings::modules::EliminationSettings>().getEliminationOrder() ==
181 storm::settings::getModule<storm::settings::modules::EliminationSettings>().getEliminationOrder() ==
185 if (forward ^ reverse) {
186 std::sort(states.begin(), states.end(),
188 return distances[state1] < distances[state2];
192 std::sort(states.begin(), states.end(),
194 return distances[state1] > distances[state2];
199 for (uint_fast64_t index = 0; index < states.size(); ++index) {
200 statePriorities[states[index]] = index;
203 return statePriorities;
217 for (std::size_t index = 0; index < oneStepProbabilities.size(); ++index) {
218 if (oneStepProbabilities[index] != storm::utility::zero<ValueType>()) {
219 pseudoTargetStates.
set(index);
228template std::shared_ptr<StatePriorityQueue>
createStatePriorityQueue(boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,
250template std::shared_ptr<StatePriorityQueue>
createStatePriorityQueue(boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,
272template std::shared_ptr<StatePriorityQueue>
createStatePriorityQueue(boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,