49template<
typename ValueType>
59 if (value.denominator().isConstant()) {
60 return value.nominator().complexity();
62 return value.denominator().complexity() * value.nominator().complexity();
66template<
typename ValueType>
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) {
92template<
typename ValueType>
96 return backwardTransitions.
getRow(state).size() * transitionMatrix.
getRow(state).size();
99template<
typename ValueType>
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);
110 std::vector<storm::storage::sparse::state_type> sortedStates(states.
begin(), states.
end());
113 std::random_device 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());
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.");
158 std::vector<storm::storage::sparse::state_type> sortedStates(states.
begin(), states.
end());
159 return std::make_shared<StaticStatePriorityQueue>(sortedStates);
163 return std::make_shared<StaticStatePriorityQueue>(states);
166template<
typename ValueType>
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,
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;
206template<
typename ValueType>
217 for (std::size_t index = 0; index < oneStepProbabilities.size(); ++index) {
219 pseudoTargetStates.
set(index);
228template std::shared_ptr<StatePriorityQueue>
createStatePriorityQueue(boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,
235 std::vector<double>
const& oneStepProbabilities);
239 std::vector<double>
const& oneStepProbabilities);
243 bool forward,
bool reverse);
250template std::shared_ptr<StatePriorityQueue>
createStatePriorityQueue(boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,
253 std::vector<storm::RationalNumber>
const& oneStepProbabilities,
258 std::vector<storm::RationalNumber>
const& oneStepProbabilities);
262 std::vector<storm::RationalNumber>
const& oneStepProbabilities);
266 std::vector<storm::RationalNumber>
const& oneStepProbabilities,
bool forward,
bool reverse);
270 std::vector<storm::RationalNumber>
const& oneStepProbabilities,
bool forward);
272template std::shared_ptr<StatePriorityQueue>
createStatePriorityQueue(boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,
275 std::vector<storm::RationalFunction>
const& oneStepProbabilities,
280 std::vector<storm::RationalFunction>
const& oneStepProbabilities);
284 std::vector<storm::RationalFunction>
const& oneStepProbabilities);
288 std::vector<storm::RationalFunction>
const& oneStepProbabilities,
bool forward,
bool reverse);
292 std::vector<storm::RationalFunction>
const& oneStepProbabilities,
bool forward);
EliminationOrder
An enum that contains all available state elimination orders.
std::function< uint_fast64_t(storm::storage::sparse::state_type const &state, storm::storage::FlexibleSparseMatrix< ValueType > const &transitionMatrix, storm::storage::FlexibleSparseMatrix< ValueType > const &backwardTransitions, std::vector< ValueType > const &oneStepProbabilities)> PenaltyFunctionType
A bit vector that is internally represented as a vector of 64-bit values.
const_iterator end() const
Returns an iterator pointing at the element past the back of the bit vector.
void set(uint64_t index, bool value=true)
Sets the given truth value at the given index.
const_iterator begin() const
Returns an iterator to the indices of the set bits in the bit vector.
The flexible sparse matrix is used during state elimination.
row_type & getRow(index_type)
Returns an object representing the given row.
A class that holds a possibly non-square matrix in the compressed row storage format.
index_type getRowCount() const
Returns the number of rows of the matrix.
#define STORM_LOG_TRACE(message)
#define STORM_LOG_THROW(cond, exception, message)
SettingsType const & getModule()
Get module.
std::vector< uint_fast64_t > getDistances(storm::storage::SparseMatrix< T > const &transitionMatrix, storm::storage::BitVector const &initialStates, boost::optional< storm::storage::BitVector > const &subsystem)
Performs a breadth-first search through the underlying graph structure to compute the distance from a...
std::shared_ptr< StatePriorityQueue > createStatePriorityQueue(boost::optional< std::vector< uint_fast64_t > > const &distanceBasedStatePriorities, storm::storage::FlexibleSparseMatrix< ValueType > const &transitionMatrix, storm::storage::FlexibleSparseMatrix< ValueType > const &backwardTransitions, std::vector< ValueType > const &oneStepProbabilities, storm::storage::BitVector const &states)
uint_fast64_t computeStatePenalty(storm::storage::sparse::state_type const &state, storm::storage::FlexibleSparseMatrix< ValueType > const &transitionMatrix, storm::storage::FlexibleSparseMatrix< ValueType > const &backwardTransitions, std::vector< ValueType > const &oneStepProbabilities)
std::vector< uint_fast64_t > getStateDistances(storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::SparseMatrix< ValueType > const &transitionMatrixTransposed, storm::storage::BitVector const &initialStates, std::vector< ValueType > const &oneStepProbabilities, bool forward)
bool eliminationOrderIsStatic(storm::settings::modules::EliminationSettings::EliminationOrder const &order)
bool eliminationOrderNeedsForwardDistances(storm::settings::modules::EliminationSettings::EliminationOrder const &order)
uint_fast64_t computeStatePenaltyRegularExpression(storm::storage::sparse::state_type const &state, storm::storage::FlexibleSparseMatrix< ValueType > const &transitionMatrix, storm::storage::FlexibleSparseMatrix< ValueType > const &backwardTransitions, std::vector< ValueType > const &)
uint_fast64_t estimateComplexity(ValueType const &)
bool eliminationOrderNeedsDistances(storm::settings::modules::EliminationSettings::EliminationOrder const &order)
std::vector< uint_fast64_t > getDistanceBasedPriorities(storm::storage::SparseMatrix< ValueType > const &transitionMatrix, storm::storage::SparseMatrix< ValueType > const &transitionMatrixTransposed, storm::storage::BitVector const &initialStates, std::vector< ValueType > const &oneStepProbabilities, bool forward, bool reverse)
bool eliminationOrderNeedsReversedDistances(storm::settings::modules::EliminationSettings::EliminationOrder const &order)
bool eliminationOrderIsPenaltyBased(storm::settings::modules::EliminationSettings::EliminationOrder const &order)
bool isConstant(ValueType const &)
carl::RationalFunction< Polynomial, true > RationalFunction