42template<
typename ValueType>
52 if (value.denominator().isConstant()) {
53 return value.nominator().complexity();
55 return value.denominator().complexity() * value.nominator().complexity();
59template<
typename ValueType>
62 std::vector<ValueType>
const& oneStepProbabilities) {
63 uint_fast64_t penalty = 0;
64 bool hasParametricSelfLoop =
false;
66 for (
auto const& predecessor : backwardTransitions.
getRow(state)) {
67 for (
auto const& successor : transitionMatrix.
getRow(state)) {
70 if (predecessor.getColumn() == state) {
78 if (hasParametricSelfLoop) {
85template<
typename ValueType>
89 return backwardTransitions.
getRow(state).size() * transitionMatrix.
getRow(state).size();
92template<
typename ValueType>
94 boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,
100 std::vector<storm::storage::sparse::state_type> sortedStates(states.
begin(), states.
end());
103 std::random_device randomDevice;
105 std::shuffle(sortedStates.begin(), sortedStates.end(),
generator);
106 return std::make_unique<StaticStatePriorityQueue>(sortedStates);
109 STORM_LOG_THROW(
static_cast<bool>(distanceBasedStatePriorities), storm::exceptions::InvalidStateException,
110 "Unable to build state priority queue without distance-based priorities.");
111 std::sort(sortedStates.begin(), sortedStates.end(),
113 return distanceBasedStatePriorities.get()[state1] < distanceBasedStatePriorities.get()[state2];
115 return std::make_unique<StaticStatePriorityQueue>(sortedStates);
117 std::vector<std::pair<storm::storage::sparse::state_type, uint_fast64_t>> statePenalties(sortedStates.size());
120 for (uint_fast64_t index = 0; index < sortedStates.size(); ++index) {
121 statePenalties[index] =
122 std::make_pair(sortedStates[index], penaltyFunction(sortedStates[index], transitionMatrix, backwardTransitions, oneStepProbabilities));
126 statePenalties.begin(), statePenalties.end(),
127 [](std::pair<storm::storage::sparse::state_type, uint_fast64_t>
const& statePenalty1,
128 std::pair<storm::storage::sparse::state_type, uint_fast64_t>
const& statePenalty2) { return statePenalty1.second < statePenalty2.second; });
132 for (uint_fast64_t index = 0; index < sortedStates.size(); ++index) {
133 sortedStates[index] = statePenalties[index].first;
135 return std::make_unique<StaticStatePriorityQueue>(sortedStates);
138 return std::make_unique<DynamicStatePriorityQueue<ValueType>>(statePenalties, transitionMatrix, backwardTransitions, oneStepProbabilities,
143 STORM_LOG_THROW(
false, storm::exceptions::InvalidSettingsException,
"Illegal elimination order selected.");
147 std::vector<storm::storage::sparse::state_type> sortedStates(states.
begin(), states.
end());
148 return std::make_shared<StaticStatePriorityQueue>(sortedStates);
152 return std::make_shared<StaticStatePriorityQueue>(states);
155template<
typename ValueType>
159 bool forward,
bool reverse) {
160 std::vector<uint_fast64_t> statePriorities(transitionMatrix.
getRowCount());
161 std::vector<storm::storage::sparse::state_type> states(transitionMatrix.
getRowCount());
162 for (std::size_t index = 0; index < states.size(); ++index) {
163 states[index] = index;
166 std::vector<uint_fast64_t> distances =
getStateDistances(transitionMatrix, transitionMatrixTransposed, initialStates, oneStepProbabilities,
170 if (forward ^ reverse) {
171 std::sort(states.begin(), states.end(),
173 return distances[state1] < distances[state2];
177 std::sort(states.begin(), states.end(),
179 return distances[state1] > distances[state2];
184 for (uint_fast64_t index = 0; index < states.size(); ++index) {
185 statePriorities[states[index]] = index;
188 return statePriorities;
191template<
typename ValueType>
202 for (std::size_t index = 0; index < oneStepProbabilities.size(); ++index) {
204 pseudoTargetStates.
set(index);
214 boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,
221 std::vector<double>
const& oneStepProbabilities);
225 std::vector<double>
const& oneStepProbabilities);
229 bool forward,
bool reverse);
237 boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,
240 std::vector<storm::RationalNumber>
const& oneStepProbabilities,
245 std::vector<storm::RationalNumber>
const& oneStepProbabilities);
249 std::vector<storm::RationalNumber>
const& oneStepProbabilities);
254 std::vector<storm::RationalNumber>
const& oneStepProbabilities,
bool forward,
bool reverse);
258 std::vector<storm::RationalNumber>
const& oneStepProbabilities,
bool forward);
261 boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,
264 std::vector<storm::RationalFunction>
const& oneStepProbabilities,
269 std::vector<storm::RationalFunction>
const& oneStepProbabilities);
273 std::vector<storm::RationalFunction>
const& oneStepProbabilities);
278 std::vector<storm::RationalFunction>
const& oneStepProbabilities,
bool forward,
bool reverse);
282 std::vector<storm::RationalFunction>
const& oneStepProbabilities,
bool forward);
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)
bool eliminationOrderIsStatic(EliminationOrder const &order)
uint_fast64_t estimateComplexity(ValueType const &)
bool eliminationOrderNeedsReversedDistances(EliminationOrder const &order)
bool eliminationOrderNeedsForwardDistances(EliminationOrder const &order)
bool eliminationOrderIsPenaltyBased(EliminationOrder const &order)
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)
std::shared_ptr< StatePriorityQueue > createStatePriorityQueue(EliminationOrder const &order, 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)
bool eliminationOrderNeedsDistances(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 &)
EliminationOrder
An enum that contains all available state elimination orders.
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 > getDistanceBasedPriorities(EliminationOrder const &order, 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)
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...
bool isConstant(ValueType const &)
carl::RationalFunction< Polynomial, true > RationalFunction