74 std::vector<ValueType>
const& oneStepProbabilities) {
75 uint_fast64_t penalty = 0;
76 bool hasParametricSelfLoop =
false;
78 for (
auto const& predecessor : backwardTransitions.
getRow(state)) {
79 for (
auto const& successor : transitionMatrix.
getRow(state)) {
82 if (predecessor.getColumn() == state) {
90 if (hasParametricSelfLoop) {
105std::shared_ptr<StatePriorityQueue>
createStatePriorityQueue(boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,
109 STORM_LOG_TRACE(
"Creating state priority queue for states " << states);
113 storm::settings::getModule<storm::settings::modules::EliminationSettings>().getEliminationOrder();
115 std::vector<storm::storage::sparse::state_type> sortedStates(states.
begin(), states.
end());
118 std::random_device randomDevice;
119 std::mt19937 generator(randomDevice());
120 std::shuffle(sortedStates.begin(), sortedStates.end(), generator);
121 return std::make_unique<StaticStatePriorityQueue>(sortedStates);
124 STORM_LOG_THROW(
static_cast<bool>(distanceBasedStatePriorities), storm::exceptions::InvalidStateException,
125 "Unable to build state priority queue without distance-based priorities.");
126 std::sort(sortedStates.begin(), sortedStates.end(),
128 return distanceBasedStatePriorities.get()[state1] < distanceBasedStatePriorities.get()[state2];
130 return std::make_unique<StaticStatePriorityQueue>(sortedStates);
132 std::vector<std::pair<storm::storage::sparse::state_type, uint_fast64_t>> statePenalties(sortedStates.size());
135 : computeStatePenalty<ValueType>;
136 for (uint_fast64_t index = 0; index < sortedStates.size(); ++index) {
137 statePenalties[index] =
138 std::make_pair(sortedStates[index], penaltyFunction(sortedStates[index], transitionMatrix, backwardTransitions, oneStepProbabilities));
142 statePenalties.begin(), statePenalties.end(),
143 [](std::pair<storm::storage::sparse::state_type, uint_fast64_t>
const& statePenalty1,
144 std::pair<storm::storage::sparse::state_type, uint_fast64_t>
const& statePenalty2) { return statePenalty1.second < statePenalty2.second; });
148 for (uint_fast64_t index = 0; index < sortedStates.size(); ++index) {
149 sortedStates[index] = statePenalties[index].first;
151 return std::make_unique<StaticStatePriorityQueue>(sortedStates);
154 return std::make_unique<DynamicStatePriorityQueue<ValueType>>(statePenalties, transitionMatrix, backwardTransitions, oneStepProbabilities,
159 STORM_LOG_THROW(
false, storm::exceptions::InvalidSettingsException,
"Illegal elimination order selected.");
175 bool forward,
bool reverse) {
176 std::vector<uint_fast64_t> statePriorities(transitionMatrix.
getRowCount());
177 std::vector<storm::storage::sparse::state_type> states(transitionMatrix.
getRowCount());
178 for (std::size_t index = 0; index < states.size(); ++index) {
179 states[index] = index;
182 std::vector<uint_fast64_t> distances =
183 getStateDistances(transitionMatrix, transitionMatrixTransposed, initialStates, oneStepProbabilities,
184 storm::settings::getModule<storm::settings::modules::EliminationSettings>().getEliminationOrder() ==
186 storm::settings::getModule<storm::settings::modules::EliminationSettings>().getEliminationOrder() ==
190 if (forward ^ reverse) {
191 std::sort(states.begin(), states.end(),
193 return distances[state1] < distances[state2];
197 std::sort(states.begin(), states.end(),
199 return distances[state1] > distances[state2];
204 for (uint_fast64_t index = 0; index < states.size(); ++index) {
205 statePriorities[states[index]] = index;
208 return statePriorities;
222 for (std::size_t index = 0; index < oneStepProbabilities.size(); ++index) {
223 if (oneStepProbabilities[index] != storm::utility::zero<ValueType>()) {
224 pseudoTargetStates.
set(index);
233template std::shared_ptr<StatePriorityQueue>
createStatePriorityQueue(boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,
256template std::shared_ptr<StatePriorityQueue>
createStatePriorityQueue(boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,
278template std::shared_ptr<StatePriorityQueue>
createStatePriorityQueue(boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,