45 bool addSelfLoopAtSinkStates =
false) {
48 for (
auto const& ec : ecs) {
49 for (
auto const& stateActionsPair : ec) {
50 keptStates.
set(stateActionsPair.first,
false);
54 <<
" original states plus " << ecs.
size() <<
"new end component states.");
57 std::vector<uint_fast64_t> newRowGroupIndices;
62 for (uint64_t keptState : keptStates) {
69 for (
auto const& ec : ecs) {
71 bool ecGetsSinkRow =
false;
72 for (
auto const& stateActionsPair : ec) {
76 if (stateActionsPair.second.find(row) == stateActionsPair.second.end()) {
80 ecGetsSinkRow |= addSinkRowStates.
get(stateActionsPair.first);
84 "Didn't expect to see more rows in the reduced matrix than in the original one.");
93 addSelfLoopAtSinkStates);
94 STORM_LOG_DEBUG(
"EndComponentEliminator is done. Resulting matrix has " << result.
matrix.getRowGroupCount() <<
" row groups.");
121 return transform(originalMatrix, ecs, subsystemStates, addSinkRowStates, addSelfLoopAtSinkStates);
134 uint_fast64_t row = 0;
135 for (uint_fast64_t rowGroup = 0; rowGroup < originalMatrix.
getRowGroupCount(); ++rowGroup) {
138 bool keepRow = possibleECRows.
get(row);
140 for (
auto const& entry : originalMatrix.
getRow(row)) {
141 keepRow &= subsystemStates.
get(entry.getColumn());
145 for (
auto const& entry : originalMatrix.
getRow(row)) {
146 builder.addNextValue(row, entry.getColumn(), entry.getValue());
153 builder.newRowGroup(row);
155 storm::storage::SparseMatrix<ValueType> auxiliaryMatrix =
157 storm::storage::SparseMatrix<ValueType> backwardsTransitions = auxiliaryMatrix.
transpose(
true);
158 storm::storage::BitVector sinkStateAsBitVector(auxiliaryMatrix.
getRowGroupCount(),
false);
159 sinkStateAsBitVector.set(sinkState);
160 storm::storage::BitVector auxSubsystemStates = subsystemStates;
161 auxSubsystemStates.
resize(subsystemStates.
size() + 1,
true);
164 auxSubsystemStates, sinkStateAsBitVector));
165 return storm::storage::MaximalEndComponentDecomposition<ValueType>(auxiliaryMatrix, backwardsTransitions, auxSubsystemStates);
168 static storm::storage::SparseMatrix<ValueType> buildTransformedMatrix(storm::storage::SparseMatrix<ValueType>
const& originalMatrix,
169 std::vector<uint_fast64_t>
const& newRowGroupIndices,
170 std::vector<uint_fast64_t>
const& newToOldRowMapping,
171 std::vector<uint_fast64_t>
const& oldToNewStateMapping,
172 storm::storage::BitVector
const& sinkRows,
bool addSelfLoopAtSinkStates) {
173 uint_fast64_t numRowGroups = newRowGroupIndices.size() - 1;
174 uint_fast64_t newRow = 0;
175 storm::storage::SparseMatrixBuilder<ValueType> builder(newToOldRowMapping.size(), numRowGroups, originalMatrix.
getEntryCount(),
false,
true,
177 for (uint_fast64_t newRowGroup = 0; newRowGroup < numRowGroups; ++newRowGroup) {
178 builder.newRowGroup(newRow);
179 for (; newRow < newRowGroupIndices[newRowGroup + 1]; ++newRow) {
180 if (sinkRows.
get(newRow)) {
181 if (addSelfLoopAtSinkStates) {
187 std::map<uint_fast64_t, ValueType> sortedEntries;
188 for (
auto const& entry : originalMatrix.
getRow(newToOldRowMapping[newRow])) {
189 uint_fast64_t newColumn = oldToNewStateMapping[entry.getColumn()];
190 if (newColumn < numRowGroups) {
191 auto insertResult = sortedEntries.insert(std::make_pair(newColumn, entry.getValue()));
192 if (!insertResult.second) {
194 insertResult.first->second += entry.getValue();
198 for (
auto const& sortedEntry : sortedEntries) {
199 builder.addNextValue(newRow, sortedEntry.first, sortedEntry.second);
204 return builder.build(newToOldRowMapping.size(), numRowGroups, numRowGroups);
storm::storage::BitVector performProbGreater0A(storm::storage::SparseMatrix< T > const &transitionMatrix, std::vector< uint_fast64_t > const &nondeterministicChoiceIndices, storm::storage::SparseMatrix< T > const &backwardTransitions, storm::storage::BitVector const &phiStates, storm::storage::BitVector const &psiStates, bool useStepBound, uint_fast64_t maximalSteps, boost::optional< storm::storage::BitVector > const &choiceConstraint)
Computes the sets of states that have probability greater 0 of satisfying phi until psi under any pos...