22namespace stateelimination {
51template<
typename ValueType>
62 if (value.denominator().isConstant()) {
63 return value.nominator().complexity();
65 return value.denominator().complexity() * value.nominator().complexity();
70template<
typename ValueType>
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) {
96template<
typename ValueType>
100 return backwardTransitions.
getRow(state).size() * transitionMatrix.
getRow(state).size();
103template<
typename ValueType>
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);
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.");
162 std::vector<storm::storage::sparse::state_type> sortedStates(states.
begin(), states.
end());
163 return std::make_shared<StaticStatePriorityQueue>(sortedStates);
167 return std::make_shared<StaticStatePriorityQueue>(states);
170template<
typename ValueType>
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,
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;
210template<
typename ValueType>
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,
239 std::vector<double>
const& oneStepProbabilities);
243 std::vector<double>
const& oneStepProbabilities);
247 bool forward,
bool reverse);
253#ifdef STORM_HAVE_CARL
255template std::shared_ptr<StatePriorityQueue>
createStatePriorityQueue(boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,
258 std::vector<storm::RationalNumber>
const& oneStepProbabilities,
263 std::vector<storm::RationalNumber>
const& oneStepProbabilities);
267 std::vector<storm::RationalNumber>
const& oneStepProbabilities);
271 std::vector<storm::RationalNumber>
const& oneStepProbabilities,
bool forward,
bool reverse);
275 std::vector<storm::RationalNumber>
const& oneStepProbabilities,
bool forward);
277template std::shared_ptr<StatePriorityQueue>
createStatePriorityQueue(boost::optional<std::vector<uint_fast64_t>>
const& distanceBasedStatePriorities,
280 std::vector<storm::RationalFunction>
const& oneStepProbabilities,
285 std::vector<storm::RationalFunction>
const& oneStepProbabilities);
289 std::vector<storm::RationalFunction>
const& oneStepProbabilities);
293 std::vector<storm::RationalFunction>
const& oneStepProbabilities,
bool forward,
bool reverse);
297 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.
const_iterator begin() const
Returns an iterator to the indices of the set bits in the bit vector.
void set(uint_fast64_t index, bool value=true)
Sets the given truth value at the given index.
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 &)