@ -137,6 +137,84 @@ namespace storm {
out < < " ___________________________________________________________________ " < < std : : endl ;
out < < " ___________________________________________________________________ " < < std : : endl ;
}
}
template < typename ValueType >
void PreScheduler < ValueType > : : printJsonToStream ( std : : ostream & out , std : : shared_ptr < storm : : models : : sparse : : Model < ValueType > > model , bool skipUniqueChoices ) const {
STORM_LOG_THROW ( model = = nullptr | | model - > getNumberOfStates ( ) = = schedulerChoices . front ( ) . size ( ) , storm : : exceptions : : InvalidOperationException , " The given model is not compatible with this scheduler. " ) ;
STORM_LOG_WARN_COND ( ! ( skipUniqueChoices & & model = = nullptr ) , " Can not skip unique choices if the model is not given. " ) ;
storm : : json < storm : : RationalNumber > output ;
for ( uint64_t state = 0 ; state < schedulerChoices . front ( ) . size ( ) ; + + state ) {
// Check whether the state is skipped
if ( skipUniqueChoices & & model ! = nullptr & & model - > getTransitionMatrix ( ) . getRowGroupSize ( state ) = = 1 ) {
continue ;
}
for ( uint_fast64_t memoryState = 0 ; memoryState < getNumberOfMemoryStates ( ) ; + + memoryState ) {
storm : : json < storm : : RationalNumber > stateChoicesJson ;
if ( model & & model - > hasStateValuations ( ) ) {
stateChoicesJson [ " s " ] = model - > getStateValuations ( ) . template toJson < storm : : RationalNumber > ( state ) ;
} else {
stateChoicesJson [ " s " ] = state ;
}
if ( ! isMemorylessScheduler ( ) ) {
stateChoicesJson [ " m " ] = memoryState ;
}
auto const & choice = schedulerChoices [ memoryState ] [ state ] ;
storm : : json < storm : : RationalNumber > choicesJson ;
for ( auto const & choiceProbPair : choice . getChoiceMap ( ) ) {
uint64_t globalChoiceIndex = model - > getTransitionMatrix ( ) . getRowGroupIndices ( ) [ state ] ; //+ choiceProbPair.first;
storm : : json < storm : : RationalNumber > choiceJson ;
if ( model & & model - > hasChoiceOrigins ( ) & &
model - > getChoiceOrigins ( ) - > getIdentifier ( globalChoiceIndex ) ! =
model - > getChoiceOrigins ( ) - > getIdentifierForChoicesWithNoOrigin ( ) ) {
choiceJson [ " origin " ] = model - > getChoiceOrigins ( ) - > getChoiceAsJson ( globalChoiceIndex ) ;
}
if ( model & & model - > hasChoiceLabeling ( ) ) {
auto choiceLabels = model - > getChoiceLabeling ( ) . getLabelsOfChoice ( globalChoiceIndex ) ;
choiceJson [ " labels " ] = std : : vector < std : : string > ( choiceLabels . begin ( ) ,
choiceLabels . end ( ) ) ;
}
choiceJson [ " index " ] = globalChoiceIndex ;
choiceJson [ " prob " ] = storm : : utility : : convertNumber < storm : : RationalNumber > (
std : : get < 1 > ( choiceProbPair ) ) ;
// Memory updates
if ( ! isMemorylessScheduler ( ) ) {
choiceJson [ " memory-updates " ] = std : : vector < storm : : json < storm : : RationalNumber > > ( ) ;
uint64_t row = model - > getTransitionMatrix ( ) . getRowGroupIndices ( ) [ state ] ; //+ std::get<0>(choiceProbPair);
for ( auto entryIt = model - > getTransitionMatrix ( ) . getRow ( row ) . begin ( ) ; entryIt < model - > getTransitionMatrix ( ) . getRow ( row ) . end ( ) ; + + entryIt ) {
storm : : json < storm : : RationalNumber > updateJson ;
// next model state
if ( model & & model - > hasStateValuations ( ) ) {
updateJson [ " s' " ] = model - > getStateValuations ( ) . template toJson < storm : : RationalNumber > ( entryIt - > getColumn ( ) ) ;
} else {
updateJson [ " s' " ] = entryIt - > getColumn ( ) ;
}
// next memory state
updateJson [ " m' " ] = this - > memoryStructure - > getSuccessorMemoryState ( memoryState , entryIt - model - > getTransitionMatrix ( ) . begin ( ) ) ;
choiceJson [ " memory-updates " ] . push_back ( std : : move ( updateJson ) ) ;
}
}
choicesJson . push_back ( std : : move ( choiceJson ) ) ;
}
if ( ! choicesJson . is_null ( ) ) {
stateChoicesJson [ " c " ] = std : : move ( choicesJson ) ;
output . push_back ( std : : move ( stateChoicesJson ) ) ;
}
}
}
out < < output . dump ( 4 ) ;
}
template class PreScheduler < double > ;
template class PreScheduler < double > ;
# ifdef STORM_HAVE_CARL
# ifdef STORM_HAVE_CARL
template class PreScheduler < storm : : RationalNumber > ;
template class PreScheduler < storm : : RationalNumber > ;