@ -522,21 +522,25 @@ namespace storm {
storm : : solver : : GeneralLinearEquationSolverFactory < ValueType > linearEquationSolverFactory ;
storm : : solver : : GeneralLinearEquationSolverFactory < ValueType > linearEquationSolverFactory ;
bool isEqSysFormat = linearEquationSolverFactory . getEquationProblemFormat ( env ) = = storm : : solver : : LinearEquationSolverProblemFormat : : EquationSystem ;
bool isEqSysFormat = linearEquationSolverFactory . getEquationProblemFormat ( env ) = = storm : : solver : : LinearEquationSolverProblemFormat : : EquationSystem ;
auto eqSysMatrix = this - > _transitionMatrix . getSubmatrix ( false , statesNotInComponent , statesNotInComponent , isEqSysFormat ) ;
auto eqSysMatrix = this - > _transitionMatrix . getSubmatrix ( false , statesNotInComponent , statesNotInComponent , isEqSysFormat ) ;
std : : unique_ptr < storm : : solver : : LinearEquationSolver < ValueType > > solver = linearEquationSolverFactory . create ( env , eqSysMatrix ) ;
solver - > setLowerBound ( storm : : utility : : zero < ValueType > ( ) ) ;
boost : : optional < std : : vector < ValueType > > upperBounds ;
// Check solver requirements
// Check solver requirements
auto requirements = solver - > getRequirements ( env ) ;
auto requirements = linearEquationSolverFactory . getRequirements ( env ) ;
requirements . clearLowerBounds ( ) ;
requirements . clearLowerBounds ( ) ;
if ( requirements . upperBounds ( ) ) {
if ( requirements . upperBounds ( ) ) {
auto toBsccProbabilities = this - > _transitionMatrix . getConstrainedRowSumVector ( statesNotInComponent , ~ statesNotInComponent ) ;
auto toBsccProbabilities = this - > _transitionMatrix . getConstrainedRowSumVector ( statesNotInComponent , ~ statesNotInComponent ) ;
solver - > setUpperBounds ( computeUpperBoundsForExpectedVisitingTimes ( eqSysMatrix , toBsccProbabilities ) ) ;
upperBounds = computeUpperBoundsForExpectedVisitingTimes ( eqSysMatrix , toBsccProbabilities ) ;
requirements . clearUpperBounds ( ) ;
requirements . clearUpperBounds ( ) ;
}
}
STORM_LOG_THROW ( ! requirements . hasEnabledCriticalRequirement ( ) , storm : : exceptions : : UnmetRequirementException , " Solver requirements " + requirements . getEnabledRequirementsAsString ( ) + " not checked. " ) ;
STORM_LOG_THROW ( ! requirements . hasEnabledCriticalRequirement ( ) , storm : : exceptions : : UnmetRequirementException , " Solver requirements " + requirements . getEnabledRequirementsAsString ( ) + " not checked. " ) ;
eqSysMatrix . transpose ( false , true ) ; // Transpose so that each row considers the predecessors
eqSysMatrix = eqSysMatrix . transpose ( false , true ) ; // Transpose so that each row considers the predecessors
if ( isEqSysFormat ) {
if ( isEqSysFormat ) {
eqSysMatrix . convertToEquationSystem ( ) ;
eqSysMatrix . convertToEquationSystem ( ) ;
}
}
std : : unique_ptr < storm : : solver : : LinearEquationSolver < ValueType > > solver = linearEquationSolverFactory . create ( env , eqSysMatrix ) ;
solver - > setLowerBound ( storm : : utility : : zero < ValueType > ( ) ) ;
if ( upperBounds ) {
solver - > setUpperBounds ( std : : move ( upperBounds . get ( ) ) ) ;
}
std : : vector < ValueType > eqSysRhs ;
std : : vector < ValueType > eqSysRhs ;
eqSysRhs . reserve ( eqSysMatrix . getRowCount ( ) ) ;
eqSysRhs . reserve ( eqSysMatrix . getRowCount ( ) ) ;
for ( auto state : statesNotInComponent ) {
for ( auto state : statesNotInComponent ) {