@ -27,27 +27,35 @@ namespace storm {
template < typename ParametricType , typename ConstantType >
template < typename ParametricType , typename ConstantType >
SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : ParameterRegion ( std : : map < VariableType , BoundType > lowerBounds , std : : map < VariableType , BoundType > upperBounds ) : lowerBounds ( lowerBounds ) , upperBounds ( upperBounds ) , checkResult ( RegionCheckResult : : UNKNOWN ) {
//todo: check whether both mappings map the same variables
SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : ParameterRegion ( std : : map < VariableType , CoefficientType > lowerBounds , std : : map < VariableType , CoefficientType > upperBounds ) : lowerBounds ( lowerBounds ) , upperBounds ( upperBounds ) , checkResult ( RegionCheckResult : : UNKNOWN ) {
//check whether both mappings map the same variables and precompute the set of variables
for ( auto const & variableWithBound : lowerBounds ) {
STORM_LOG_THROW ( ( upperBounds . find ( variableWithBound . first ) ! = upperBounds . end ( ) ) , storm : : exceptions : : InvalidArgumentException , " Couldn't create region. No upper bound specified for Variable " < < variableWithBound . first ) ;
this - > variables . insert ( variableWithBound . first ) ;
}
for ( auto const & variableWithBound : upperBounds ) {
STORM_LOG_THROW ( ( this - > variables . find ( variableWithBound . first ) ! = this - > variables . end ( ) ) , storm : : exceptions : : InvalidArgumentException , " Couldn't create region. No lower bound specified for Variable " < < variableWithBound . first ) ;
}
}
}
template < typename ParametricType , typename ConstantType >
template < typename ParametricType , typename ConstantType >
void SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : setViolatedPoint ( std : : map < VariableType , BoundType > const & violatedPoint ) {
void SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : setViolatedPoint ( std : : map < VariableType , Coefficient Type> const & violatedPoint ) {
this - > violatedPoint = violatedPoint ;
this - > violatedPoint = violatedPoint ;
}
}
template < typename ParametricType , typename ConstantType >
template < typename ParametricType , typename ConstantType >
std : : map < typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : VariableType , typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : Bound Type> SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : getViolatedPoint ( ) const {
std : : map < typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : VariableType , typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : Coefficient Type> SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : getViolatedPoint ( ) const {
return violatedPoint ;
return violatedPoint ;
}
}
template < typename ParametricType , typename ConstantType >
template < typename ParametricType , typename ConstantType >
void SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : setSatPoint ( std : : map < VariableType , Bound Type> const & satPoint ) {
void SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : setSatPoint ( std : : map < VariableType , Coefficient Type> const & satPoint ) {
this - > satPoint = satPoint ;
this - > satPoint = satPoint ;
}
}
template < typename ParametricType , typename ConstantType >
template < typename ParametricType , typename ConstantType >
std : : map < typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : VariableType , typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : Bound Type> SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : getSatPoint ( ) const {
std : : map < typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : VariableType , typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : Coefficient Type> SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : getSatPoint ( ) const {
return satPoint ;
return satPoint ;
}
}
@ -75,42 +83,38 @@ namespace storm {
template < typename ParametricType , typename ConstantType >
template < typename ParametricType , typename ConstantType >
std : : set < typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : VariableType > SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : getVariables ( ) const {
std : : set < typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : VariableType > SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : getVariables ( ) const {
std : : set < VariableType > result ;
for ( auto const & variableWithBound : lowerBounds ) {
result . insert ( variableWithBound . first ) ;
}
return result ;
return this - > variables ;
}
}
template < typename ParametricType , typename ConstantType >
template < typename ParametricType , typename ConstantType >
typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : Bound Type const & SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : getLowerBound ( VariableType const & variable ) const {
typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : CoefficientType const & SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : getLowerBound ( VariableType const & variable ) const {
auto const & result = lowerBounds . find ( variable ) ;
auto const & result = lowerBounds . find ( variable ) ;
STORM_LOG_THROW ( result ! = lowerBounds . end ( ) , storm : : exceptions : : IllegalArgumentException , " tried to find a lower bound of a variable that is not specified by this region " ) ;
STORM_LOG_THROW ( result ! = lowerBounds . end ( ) , storm : : exceptions : : IllegalArgumentException , " tried to find a lower bound of a variable that is not specified by this region " ) ;
return ( * result ) . second ;
return ( * result ) . second ;
}
}
template < typename ParametricType , typename ConstantType >
template < typename ParametricType , typename ConstantType >
typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : Bound Type const & SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : getUpperBound ( VariableType const & variable ) const {
typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : Coefficient Type const & SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : getUpperBound ( VariableType const & variable ) const {
auto const & result = upperBounds . find ( variable ) ;
auto const & result = upperBounds . find ( variable ) ;
STORM_LOG_THROW ( result ! = upperBounds . end ( ) , storm : : exceptions : : IllegalArgumentException , " tried to find an upper bound of a variable that is not specified by this region " ) ;
STORM_LOG_THROW ( result ! = upperBounds . end ( ) , storm : : exceptions : : IllegalArgumentException , " tried to find an upper bound of a variable that is not specified by this region " ) ;
return ( * result ) . second ;
return ( * result ) . second ;
}
}
template < typename ParametricType , typename ConstantType >
template < typename ParametricType , typename ConstantType >
const std : : map < typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : VariableType , typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : Bound Type> SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : getUpperBounds ( ) const {
const std : : map < typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : VariableType , typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : Coefficient Type> SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : getUpperBounds ( ) const {
return upperBounds ;
return upperBounds ;
}
}
template < typename ParametricType , typename ConstantType >
template < typename ParametricType , typename ConstantType >
const std : : map < typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : VariableType , typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : Bound Type> SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : getLowerBounds ( ) const {
const std : : map < typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : VariableType , typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : Coefficient Type> SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : getLowerBounds ( ) const {
return lowerBounds ;
return lowerBounds ;
}
}
template < typename ParametricType , typename ConstantType >
template < typename ParametricType , typename ConstantType >
std : : vector < std : : map < typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : VariableType , typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : Bound Type> > SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : getVerticesOfRegion ( std : : set < VariableType > const & consideredVariables ) const {
std : : vector < std : : map < typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : VariableType , typename SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : Coefficient Type> > SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : getVerticesOfRegion ( std : : set < VariableType > const & consideredVariables ) const {
std : : size_t const numOfVariables = consideredVariables . size ( ) ;
std : : size_t const numOfVariables = consideredVariables . size ( ) ;
std : : size_t const numOfVertices = std : : pow ( 2 , numOfVariables ) ;
std : : size_t const numOfVertices = std : : pow ( 2 , numOfVariables ) ;
std : : vector < std : : map < VariableType , Bound Type> > resultingVector ( numOfVertices , std : : map < VariableType , Bound Type> ( ) ) ;
std : : vector < std : : map < VariableType , Coefficient Type> > resultingVector ( numOfVertices , std : : map < VariableType , Coefficient Type> ( ) ) ;
if ( numOfVertices = = 1 ) {
if ( numOfVertices = = 1 ) {
//no variables are given, the returned vector should still contain an empty map
//no variables are given, the returned vector should still contain an empty map
return resultingVector ;
return resultingVector ;
@ -123,10 +127,10 @@ namespace storm {
std : : size_t variableIndex = 0 ;
std : : size_t variableIndex = 0 ;
for ( auto const & variable : consideredVariables ) {
for ( auto const & variable : consideredVariables ) {
if ( ( vertexId > > variableIndex ) % 2 = = 0 ) {
if ( ( vertexId > > variableIndex ) % 2 = = 0 ) {
resultingVector [ vertexId ] . insert ( std : : pair < VariableType , Bound Type> ( variable , getLowerBound ( variable ) ) ) ;
resultingVector [ vertexId ] . insert ( std : : pair < VariableType , Coefficient Type> ( variable , getLowerBound ( variable ) ) ) ;
}
}
else {
else {
resultingVector [ vertexId ] . insert ( std : : pair < VariableType , Bound Type> ( variable , getUpperBound ( variable ) ) ) ;
resultingVector [ vertexId ] . insert ( std : : pair < VariableType , Coefficient Type> ( variable , getUpperBound ( variable ) ) ) ;
}
}
+ + variableIndex ;
+ + variableIndex ;
}
}
@ -158,11 +162,11 @@ namespace storm {
std : : string SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : toString ( ) const {
std : : string SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : ParameterRegion : : toString ( ) const {
std : : stringstream regionstringstream ;
std : : stringstream regionstringstream ;
for ( auto var : this - > getVariables ( ) ) {
for ( auto var : this - > getVariables ( ) ) {
regionstringstream < < storm : : utility : : regions : : convertNumber < SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : Bound Type, double > ( this - > getLowerBound ( var ) ) ;
regionstringstream < < storm : : utility : : regions : : convertNumber < SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : Coefficient Type, double > ( this - > getLowerBound ( var ) ) ;
regionstringstream < < " <= " ;
regionstringstream < < " <= " ;
regionstringstream < < storm : : utility : : regions : : getVariableName ( var ) ;
regionstringstream < < storm : : utility : : regions : : getVariableName ( var ) ;
regionstringstream < < " <= " ;
regionstringstream < < " <= " ;
regionstringstream < < storm : : utility : : regions : : convertNumber < SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : Bound Type, double > ( this - > getUpperBound ( var ) ) ;
regionstringstream < < storm : : utility : : regions : : convertNumber < SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : Coefficient Type, double > ( this - > getUpperBound ( var ) ) ;
regionstringstream < < " , " ;
regionstringstream < < " , " ;
}
}
std : : string regionstring = regionstringstream . str ( ) ;
std : : string regionstring = regionstringstream . str ( ) ;
@ -364,7 +368,7 @@ namespace storm {
storm : : storage : : sparse : : state_type currentMdpRow = 0 ;
storm : : storage : : sparse : : state_type currentMdpRow = 0 ;
//go through rows:
//go through rows:
for ( storm : : storage : : sparse : : state_type oldStateIndex : subsys ) {
for ( storm : : storage : : sparse : : state_type oldStateIndex : subsys ) {
ParametricType valueToSinkState = storm : : utility : : regions : : getNewFunction < ParametricType , Bound Type> ( storm : : utility : : one < Bound Type> ( ) ) ;
ParametricType valueToSinkState = storm : : utility : : regions : : getNewFunction < ParametricType , Coefficient Type> ( storm : : utility : : one < Coefficient Type> ( ) ) ;
// the dtmc and the mdp rows need to sum up to one, therefore the first entry that we add has value one.
// the dtmc and the mdp rows need to sum up to one, therefore the first entry that we add has value one.
ConstantType dummyEntry = storm : : utility : : one < ConstantType > ( ) ;
ConstantType dummyEntry = storm : : utility : : one < ConstantType > ( ) ;
// store the columns and values that we have added because we need the same information for the next rows in the mdp
// store the columns and values that we have added because we need the same information for the next rows in the mdp
@ -760,7 +764,7 @@ namespace storm {
}
}
template < typename ParametricType , typename ConstantType >
template < typename ParametricType , typename ConstantType >
bool SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : checkPoint ( ParameterRegion & region , std : : map < VariableType , Bound Type> const & point , bool viaReachProbFunction ) {
bool SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : checkPoint ( ParameterRegion & region , std : : map < VariableType , Coefficient Type> const & point , bool viaReachProbFunction ) {
// check whether the property is satisfied or not at the given point
// check whether the property is satisfied or not at the given point
bool valueInBoundOfFormula ;
bool valueInBoundOfFormula ;
if ( viaReachProbFunction ) {
if ( viaReachProbFunction ) {
@ -769,7 +773,7 @@ namespace storm {
else {
else {
//put the values into the dtmc matrix
//put the values into the dtmc matrix
for ( std : : pair < ParametricType , typename storm : : storage : : MatrixEntry < storm : : storage : : sparse : : state_type , ConstantType > & > & mappingPair : this - > sampleDtmcMapping ) {
for ( std : : pair < ParametricType , typename storm : : storage : : MatrixEntry < storm : : storage : : sparse : : state_type , ConstantType > & > & mappingPair : this - > sampleDtmcMapping ) {
mappingPair . second . setValue ( storm : : utility : : regions : : convertNumber < Bound Type, ConstantType > (
mappingPair . second . setValue ( storm : : utility : : regions : : convertNumber < Coefficient Type, ConstantType > (
storm : : utility : : regions : : evaluateFunction < ParametricType , ConstantType > ( mappingPair . first , point )
storm : : utility : : regions : : evaluateFunction < ParametricType , ConstantType > ( mappingPair . first , point )
)
)
) ;
) ;
@ -782,7 +786,7 @@ namespace storm {
//Delete from here
//Delete from here
// ConstantType result=resultPtr->asExplicitQuantitativeCheckResult<ConstantType>().getValueVector()[*this->sampleDtmc->getInitialStates().begin()];
// ConstantType result=resultPtr->asExplicitQuantitativeCheckResult<ConstantType>().getValueVector()[*this->sampleDtmc->getInitialStates().begin()];
// ConstantType otherresult=storm::utility::regions::convertNumber<Bound Type, ConstantType>(storm::utility::regions::evaluateFunction<ParametricType, ConstantType>(this->reachProbFunction, point));
// ConstantType otherresult=storm::utility::regions::convertNumber<Coefficient Type, ConstantType>(storm::utility::regions::evaluateFunction<ParametricType, ConstantType>(this->reachProbFunction, point));
// STORM_LOG_THROW((std::abs(result - otherresult) <= 0.01),storm::exceptions::UnexpectedException, "The results of new DTMC algorithm does not match: " << result << " vs. " << otherresult);
// STORM_LOG_THROW((std::abs(result - otherresult) <= 0.01),storm::exceptions::UnexpectedException, "The results of new DTMC algorithm does not match: " << result << " vs. " << otherresult);
//To here
//To here
@ -927,7 +931,7 @@ namespace storm {
template < typename ParametricType , typename ConstantType >
template < typename ParametricType , typename ConstantType >
void SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : buildMdpForApproximation ( const ParameterRegion & region ) {
void SparseDtmcRegionModelChecker < ParametricType , ConstantType > : : buildMdpForApproximation ( const ParameterRegion & region ) {
//instantiate the substitutions for the given region
//instantiate the substitutions for the given region
std : : vector < std : : map < VariableType , Bound Type> > substitutions ( this - > approxMdpSubstitutions . size ( ) ) ;
std : : vector < std : : map < VariableType , Coefficient Type> > substitutions ( this - > approxMdpSubstitutions . size ( ) ) ;
for ( uint_fast64_t substitutionIndex = 0 ; substitutionIndex < this - > approxMdpSubstitutions . size ( ) ; + + substitutionIndex ) {
for ( uint_fast64_t substitutionIndex = 0 ; substitutionIndex < this - > approxMdpSubstitutions . size ( ) ; + + substitutionIndex ) {
for ( std : : pair < VariableType , TypeOfBound > const & sub : this - > approxMdpSubstitutions [ substitutionIndex ] ) {
for ( std : : pair < VariableType , TypeOfBound > const & sub : this - > approxMdpSubstitutions [ substitutionIndex ] ) {
switch ( sub . second ) {
switch ( sub . second ) {
@ -945,7 +949,7 @@ namespace storm {
//now put the values into the mdp matrix
//now put the values into the mdp matrix
for ( std : : tuple < ParametricType , typename storm : : storage : : MatrixEntry < storm : : storage : : sparse : : state_type , ConstantType > & , size_t > & mappingTriple : this - > approxMdpMapping ) {
for ( std : : tuple < ParametricType , typename storm : : storage : : MatrixEntry < storm : : storage : : sparse : : state_type , ConstantType > & , size_t > & mappingTriple : this - > approxMdpMapping ) {
std : : get < 1 > ( mappingTriple ) . setValue ( storm : : utility : : regions : : convertNumber < Bound Type, ConstantType > (
std : : get < 1 > ( mappingTriple ) . setValue ( storm : : utility : : regions : : convertNumber < Coefficient Type, ConstantType > (
storm : : utility : : regions : : evaluateFunction < ParametricType , ConstantType > ( std : : get < 0 > ( mappingTriple ) , substitutions [ std : : get < 2 > ( mappingTriple ) ] )
storm : : utility : : regions : : evaluateFunction < ParametricType , ConstantType > ( std : : get < 0 > ( mappingTriple ) , substitutions [ std : : get < 2 > ( mappingTriple ) ] )
)
)
) ;
) ;
@ -1008,7 +1012,7 @@ namespace storm {
selfloopIndex = numStates ; // --> selfloop will never be inserted again
selfloopIndex = numStates ; // --> selfloop will never be inserted again
}
}
for ( auto const & entry : this - > sparseTransitions . getRow ( oldStateIndex ) ) {
for ( auto const & entry : this - > sparseTransitions . getRow ( oldStateIndex ) ) {
ConstantType value = storm : : utility : : regions : : convertNumber < Bound Type, ConstantType > (
ConstantType value = storm : : utility : : regions : : convertNumber < Coefficient Type, ConstantType > (
storm : : utility : : regions : : evaluateFunction < ParametricType , ConstantType > ( entry . getValue ( ) , substitutions [ substitutionIndex ] )
storm : : utility : : regions : : evaluateFunction < ParametricType , ConstantType > ( entry . getValue ( ) , substitutions [ substitutionIndex ] )
) ;
) ;
missingProbability - = value ;
missingProbability - = value ;
@ -1022,7 +1026,7 @@ namespace storm {
}
}
if ( ! this - > parametricTypeComparator . isZero ( this - > oneStepProbabilities [ oldStateIndex ] ) ) { //transition to target state
if ( ! this - > parametricTypeComparator . isZero ( this - > oneStepProbabilities [ oldStateIndex ] ) ) { //transition to target state
ConstantType value = storm : : utility : : regions : : convertNumber < Bound Type, ConstantType > (
ConstantType value = storm : : utility : : regions : : convertNumber < Coefficient Type, ConstantType > (
storm : : utility : : regions : : evaluateFunction < ParametricType , ConstantType > ( this - > oneStepProbabilities [ oldStateIndex ] , substitutions [ substitutionIndex ] )
storm : : utility : : regions : : evaluateFunction < ParametricType , ConstantType > ( this - > oneStepProbabilities [ oldStateIndex ] , substitutions [ substitutionIndex ] )
) ;
) ;
missingProbability - = value ;
missingProbability - = value ;
@ -1716,7 +1720,7 @@ namespace storm {
# ifdef STORM_HAVE_CARL
# ifdef STORM_HAVE_CARL
template class SparseDtmcRegionModelChecker < storm : : RationalFunction , double > ;
template class SparseDtmcRegionModelChecker < storm : : RationalFunction , double > ;
# endif
# endif
//note: for other template instantiations, add a rule for the typedefs of VariableType and Bound Type
//note: for other template instantiations, add a rule for the typedefs of VariableType and Coefficient Type
} // namespace modelchecker
} // namespace modelchecker
} // namespace storm
} // namespace storm