|
|
@ -87,43 +87,26 @@ namespace storm { |
|
|
|
tsToIsTransitionsBuilder.newRowGroup(currTsRow); |
|
|
|
} |
|
|
|
} |
|
|
|
// We need to uniformize which means that a diagonal entry for the selfloop will be inserted.
|
|
|
|
// If there are exit rates, the uniformization factor needs to be updated.
|
|
|
|
if (exitRates) { |
|
|
|
uniformizationFactor = (*exitRates)[componentState] / _uniformizationRate; |
|
|
|
} |
|
|
|
// We need to uniformize which means that a diagonal entry for the selfloop will be inserted.
|
|
|
|
ValueType selfLoopProb = storm::utility::one<ValueType>() - uniformizationFactor; |
|
|
|
uint64_t selfLoopColumn = toSubModelStateMapping[componentState]; |
|
|
|
for (auto componentChoiceIt = getComponentElementChoicesBegin(element); componentChoiceIt != getComponentElementChoicesEnd(element); ++componentChoiceIt) { |
|
|
|
bool insertedDiagElement = false; |
|
|
|
tsTransitionsBuilder.addDiagonalEntry(currTsRow, selfLoopProb); |
|
|
|
for (auto const& entry : this->_transitionMatrix.getRow(*componentChoiceIt)) { |
|
|
|
uint64_t subModelColumn = toSubModelStateMapping[entry.getColumn()]; |
|
|
|
if (isTimedState(entry.getColumn())) { |
|
|
|
// We have a transition from a timed state to a timed state
|
|
|
|
STORM_LOG_ASSERT(subModelColumn < numTsSubModelStates, "Invalid state for timed submodel"); |
|
|
|
if (!insertedDiagElement && subModelColumn > selfLoopColumn) { |
|
|
|
// We passed the diagonal entry, so add it now before moving on to the next entry
|
|
|
|
tsTransitionsBuilder.addNextValue(currTsRow, selfLoopColumn, selfLoopProb); |
|
|
|
insertedDiagElement = true; |
|
|
|
} |
|
|
|
if (!insertedDiagElement && subModelColumn == selfLoopColumn) { |
|
|
|
// The current entry is the diagonal (selfloop) entry
|
|
|
|
tsTransitionsBuilder.addNextValue(currTsRow, selfLoopColumn, selfLoopProb + uniformizationFactor * entry.getValue()); |
|
|
|
insertedDiagElement = true; |
|
|
|
} else { |
|
|
|
// The diagonal element either has been inserted already or still lies in front
|
|
|
|
tsTransitionsBuilder.addNextValue(currTsRow, subModelColumn, uniformizationFactor * entry.getValue()); |
|
|
|
} |
|
|
|
tsTransitionsBuilder.addNextValue(currTsRow, subModelColumn, uniformizationFactor * entry.getValue()); |
|
|
|
} else { |
|
|
|
// We have a transition from a timed to a instant state
|
|
|
|
STORM_LOG_ASSERT(subModelColumn < numIsSubModelStates, "Invalid state for instant submodel"); |
|
|
|
tsToIsTransitionsBuilder.addNextValue(currTsRow, subModelColumn, uniformizationFactor * entry.getValue()); |
|
|
|
} |
|
|
|
} |
|
|
|
// If the diagonal entry for the MS matrix still has not been set, we do that now
|
|
|
|
if (!insertedDiagElement) { |
|
|
|
tsTransitionsBuilder.addNextValue(currTsRow, selfLoopColumn, selfLoopProb); |
|
|
|
} |
|
|
|
++currTsRow; |
|
|
|
} |
|
|
|
} else { |
|
|
|