32 columnValue = entryIt->getValue();
33 hasEntryInColumn =
true;
38 entriesInRow.erase(entryIt);
47 STORM_LOG_TRACE((hasEntryInColumn ?
"State has entry in column." :
"State does not have entry in column."));
49 STORM_LOG_ASSERT(hasEntryInColumn,
"The scaling mode 'divide' requires an element in the given column.");
53 if (hasEntryInColumn) {
67 if (hasEntryInColumn) {
68 for (
auto entryIt = entriesInRow.begin(), entryIte = entriesInRow.end(); entryIt != entryIte; ++entryIt) {
70 if (entryIt->getColumn() != column) {
74 updateValue(row, columnValue);
78 FlexibleRowType& elementsWithEntryInColumnEqualRow = transposedMatrix.getRow(column);
82 FlexibleRowType rowsKeepingEntryInColumnEqualRow;
86 std::vector<FlexibleRowType> newBackwardEntries(entriesInRow.size());
87 for (
auto& backwardEntry : newBackwardEntries) {
88 backwardEntry.reserve(elementsWithEntryInColumnEqualRow.size());
93 for (
auto const& predecessorEntry : elementsWithEntryInColumnEqualRow) {
94 uint_fast64_t predecessor = predecessorEntry.getColumn();
98 if (predecessor == row) {
104 if (isFilterPredecessor() && !filterPredecessor(predecessor)) {
105 rowsKeepingEntryInColumnEqualRow.emplace_back(predecessorEntry);
106 STORM_LOG_TRACE(
"Not eliminating predecessor " << predecessor <<
", because it does not fit the filter.");
113 FlexibleRowType& predecessorForwardTransitions = matrix.getRow(predecessor);
114 FlexibleRowIterator multiplyElement = std::find_if(predecessorForwardTransitions.begin(), predecessorForwardTransitions.end(),
115 [&](MatrixEntry
const& a) { return a.getColumn() == column; });
118 STORM_LOG_THROW(multiplyElement != predecessorForwardTransitions.end(), storm::exceptions::InvalidStateException,
119 "No probability for successor found.");
120 ValueType multiplyFactor = multiplyElement->getValue();
124 FlexibleRowIterator first1 = predecessorForwardTransitions.begin();
125 FlexibleRowIterator last1 = predecessorForwardTransitions.end();
126 FlexibleRowIterator first2 = entriesInRow.begin();
127 FlexibleRowIterator last2 = entriesInRow.end();
129 FlexibleRowType newSuccessors;
130 newSuccessors.reserve((last1 - first1) + (last2 - first2));
131 std::insert_iterator<FlexibleRowType> result(newSuccessors, newSuccessors.end());
133 uint_fast64_t successorOffsetInNewBackwardTransitions = 0;
135 for (; first1 != last1; ++result) {
137 if (first1->getColumn() == column || (first2 != last2 && first2->getColumn() == column)) {
138 if (first1->getColumn() == column) {
141 if (first2 != last2 && first2->getColumn() == column) {
147 if (first2 == last2) {
148 std::copy_if(first1, last1, result, [&](MatrixEntry
const& a) {
return a.getColumn() != column; });
151 if (first2->getColumn() < first1->getColumn()) {
153 *result = MatrixEntry(first2->getColumn(), successorValue);
154 newBackwardEntries[successorOffsetInNewBackwardTransitions].emplace_back(predecessor, successorValue);
156 ++successorOffsetInNewBackwardTransitions;
157 }
else if (first1->getColumn() < first2->getColumn()) {
161 ValueType sprod = multiplyFactor * first2->getValue();
164 *result = MatrixEntry(first1->getColumn(), probability);
165 newBackwardEntries[successorOffsetInNewBackwardTransitions].emplace_back(predecessor, probability);
168 ++successorOffsetInNewBackwardTransitions;
171 for (; first2 != last2; ++first2) {
172 if (first2->getColumn() != column) {
174 *result = MatrixEntry(first2->getColumn(), probability);
175 newBackwardEntries[successorOffsetInNewBackwardTransitions].emplace_back(predecessor, probability);
176 ++successorOffsetInNewBackwardTransitions;
181 predecessorForwardTransitions = std::move(newSuccessors);
182 STORM_LOG_TRACE(
"Fixed new next-state probabilities of predecessor state " << predecessor <<
".");
184 updatePredecessor(predecessor, multiplyFactor, row);
187 updatePriority(predecessor);
191 uint_fast64_t successorOffsetInNewBackwardTransitions = 0;
192 for (
auto const& successorEntry : entriesInRow) {
193 if (successorEntry.getColumn() == column) {
197 FlexibleRowType& successorBackwardTransitions = transposedMatrix.getRow(successorEntry.getColumn());
202 FlexibleRowIterator elimIt = std::find_if(successorBackwardTransitions.begin(), successorBackwardTransitions.end(),
203 [&](MatrixEntry
const& a) { return a.getColumn() == row; });
205 "Expected a proper backward transition from " << successorEntry.getColumn() <<
" to " << column <<
", but found none.");
206 successorBackwardTransitions.erase(elimIt);
209 FlexibleRowIterator first1 = successorBackwardTransitions.begin();
210 FlexibleRowIterator last1 = successorBackwardTransitions.end();
211 FlexibleRowIterator first2 = newBackwardEntries[successorOffsetInNewBackwardTransitions].begin();
212 FlexibleRowIterator last2 = newBackwardEntries[successorOffsetInNewBackwardTransitions].end();
214 FlexibleRowType newPredecessors;
215 newPredecessors.reserve((last1 - first1) + (last2 - first2));
216 std::insert_iterator<FlexibleRowType> result(newPredecessors, newPredecessors.end());
218 for (; first1 != last1; ++result) {
219 if (first2 == last2) {
220 std::copy(first1, last1, result);
223 if (first2->getColumn() < first1->getColumn()) {
224 if (first2->getColumn() != row) {
228 }
else if (first1->getColumn() == first2->getColumn()) {
241 if (isFilterPredecessor()) {
242 std::copy_if(first2, last2, result, [&](MatrixEntry
const& a) {
return a.getColumn() != row && filterPredecessor(a.getColumn()); });
244 std::copy_if(first2, last2, result, [&](MatrixEntry
const& a) {
return a.getColumn() != row; });
247 successorBackwardTransitions = std::move(newPredecessors);
248 ++successorOffsetInNewBackwardTransitions;
254 entriesInRow.clear();
255 entriesInRow.shrink_to_fit();
259 if (isFilterPredecessor()) {
260 elementsWithEntryInColumnEqualRow = std::move(rowsKeepingEntryInColumnEqualRow);
262 elementsWithEntryInColumnEqualRow.clear();
263 elementsWithEntryInColumnEqualRow.shrink_to_fit();
267template<
typename ValueType, ScalingMode Mode>
270 bool hasEntryInColumn =
false;
273 for (
auto entryIt = entriesInRow.begin(), entryIte = entriesInRow.end(); entryIt != entryIte; ++entryIt) {
274 if (entryIt->getColumn() == state) {
275 columnValue = entryIt->getValue();
276 hasEntryInColumn =
true;
282 STORM_LOG_TRACE((hasEntryInColumn ?
"State has entry in column." :
"State does not have entry in column."));
284 STORM_LOG_ASSERT(hasEntryInColumn,
"The scaling mode 'divide' requires an element in the given column.");
288 if (hasEntryInColumn) {
301 if (hasEntryInColumn) {
302 for (
auto entryIt = entriesInRow.begin(), entryIte = entriesInRow.end(); entryIt != entryIte; ++entryIt) {
304 if (entryIt->getColumn() != state) {
313template<
typename ValueType, ScalingMode Mode>
318template<
typename ValueType, ScalingMode Mode>
324template<
typename ValueType, ScalingMode Mode>
329template<
typename ValueType, ScalingMode Mode>
335template<
typename ValueType, ScalingMode Mode>