@ -95,11 +95,11 @@ namespace storm {
if ( ( ! subformula . hasLowerBound ( dim ) & & ! subformula . hasUpperBound ( dim ) ) | | ( subformula . hasLowerBound ( dim ) & & ! subformula . isLowerBoundStrict ( dim ) & & ! subformula . getLowerBound ( dim ) . containsVariables ( ) & & storm : : utility : : isZero ( subformula . getLowerBound ( dim ) . evaluateAsRational ( ) ) ) ) {
dimensionWiseEpochSteps . push_back ( std : : vector < uint64_t > ( model . getTransitionMatrix ( ) . getRowCount ( ) , 0 ) ) ;
dimension . scalingFactor = storm : : utility : : zero < ValueType > ( ) ;
dimension . isNot Bounded = tru e;
dimension . isBounded = fals e;
} else if ( subformula . getTimeBoundReference ( dim ) . isTimeBound ( ) | | subformula . getTimeBoundReference ( dim ) . isStepBound ( ) ) {
dimensionWiseEpochSteps . push_back ( std : : vector < uint64_t > ( model . getTransitionMatrix ( ) . getRowCount ( ) , 1 ) ) ;
dimension . scalingFactor = storm : : utility : : one < ValueType > ( ) ;
dimension . isNot Bounded = fals e;
dimension . isBounded = tru e;
} else {
STORM_LOG_ASSERT ( subformula . getTimeBoundReference ( dim ) . isRewardBound ( ) , " Unexpected type of time bound. " ) ;
std : : string const & rewardName = subformula . getTimeBoundReference ( dim ) . getRewardName ( ) ;
@ -110,7 +110,7 @@ namespace storm {
auto discretizedRewardsAndFactor = storm : : utility : : vector : : toIntegralVector < ValueType , uint64_t > ( actionRewards ) ;
dimensionWiseEpochSteps . push_back ( std : : move ( discretizedRewardsAndFactor . first ) ) ;
dimension . scalingFactor = std : : move ( discretizedRewardsAndFactor . second ) ;
dimension . isNot Bounded = fals e;
dimension . isBounded = tru e;
}
dimensions . emplace_back ( std : : move ( dimension ) ) ;
}
@ -121,7 +121,7 @@ namespace storm {
dimension . formula = subformula . restrictToDimension ( dim ) ;
dimension . objectiveIndex = objIndex ;
dimension . isUpperBounded = true ;
dimension . isNot Bounded = fals e;
dimension . isBounded = tru e;
if ( subformula . getTimeBoundReference ( dim ) . isTimeBound ( ) | | subformula . getTimeBoundReference ( dim ) . isStepBound ( ) ) {
dimensionWiseEpochSteps . push_back ( std : : vector < uint64_t > ( model . getTransitionMatrix ( ) . getRowCount ( ) , 1 ) ) ;
dimension . scalingFactor = storm : : utility : : one < ValueType > ( ) ;
@ -229,7 +229,7 @@ namespace storm {
ValueType discretizedBound = storm : : utility : : convertNumber < ValueType > ( bound . evaluateAsRational ( ) ) ;
// We always consider upper bounds to be non-strict and lower bounds to be strict.
// Thus, >=N would become >N-1. However, note that the case N=0 needs extra treatment
if ( ! dimensions [ dim ] . isNot Bounded ) {
if ( dimensions [ dim ] . isBounded ) {
discretizedBound / = dimensions [ dim ] . scalingFactor ;
if ( storm : : utility : : isInteger ( discretizedBound ) ) {
if ( isStrict = = dimensions [ dim ] . isUpperBounded ) {
@ -250,11 +250,11 @@ namespace storm {
typename MultiDimensionalRewardUnfolding < ValueType , SingleObjectiveMode > : : Epoch MultiDimensionalRewardUnfolding < ValueType , SingleObjectiveMode > : : getStartEpoch ( ) {
Epoch startEpoch = epochManager . getZeroEpoch ( ) ;
for ( uint64_t dim = 0 ; dim < epochManager . getDimensionCount ( ) ; + + dim ) {
if ( dimensions [ dim ] . isNotBounded ) {
epochManager . setBottomDimension ( startEpoch , dim ) ;
} else {
if ( dimensions [ dim ] . isBounded ) {
STORM_LOG_ASSERT ( dimensions [ dim ] . maxValue , " No max-value for dimension " < < dim < < " was given. " ) ;
epochManager . setDimensionOfEpoch ( startEpoch , dim , dimensions [ dim ] . maxValue . get ( ) ) ;
} else {
epochManager . setBottomDimension ( startEpoch , dim ) ;
}
}
STORM_LOG_TRACE ( " Start epoch is " < < epochManager . toString ( startEpoch ) ) ;
@ -745,7 +745,6 @@ namespace storm {
}
predecessorEpochs . erase ( currentEpoch . get ( ) ) ;
successorEpochs . erase ( currentEpoch . get ( ) ) ;
STORM_LOG_ASSERT ( ! predecessorEpochs . empty ( ) , " There are no predecessors for the epoch " < < epochManager . toString ( currentEpoch . get ( ) ) ) ;
// clean up solutions that are not needed anymore
for ( auto const & successorEpoch : successorEpochs ) {
@ -794,7 +793,6 @@ namespace storm {
template < typename ValueType , bool SingleObjectiveMode >
typename MultiDimensionalRewardUnfolding < ValueType , SingleObjectiveMode > : : SolutionType const & MultiDimensionalRewardUnfolding < ValueType , SingleObjectiveMode > : : getInitialStateResult ( Epoch const & epoch ) {
STORM_LOG_ASSERT ( model . getInitialStates ( ) . getNumberOfSetBits ( ) = = 1 , " The model has multiple initial states. " ) ;
STORM_LOG_ASSERT ( ! epochManager . hasBottomDimension ( epoch ) , " Tried to get the initial state result in an epoch that still contains at least one bottom dimension. " ) ;
return getStateSolution ( epoch , productModel - > getInitialProductState ( * model . getInitialStates ( ) . begin ( ) , model . getInitialStates ( ) ) ) ;
}