@ -366,6 +366,62 @@ TEST(DdJaniModelBuilderTest_Cudd, SynchronizationVectors) {
EXPECT_THROW ( newComposition = std : : make_shared < storm : : jani : : ParallelComposition > ( automataCompositions , synchronizationVectors ) , storm : : exceptions : : WrongFormatException ) ;
}
TEST ( DdJaniModelBuilderTest_Sylvan , SynchronizationVectors ) {
storm : : storage : : SymbolicModelDescription modelDescription = storm : : parser : : PrismParser : : parse ( STORM_CPP_TESTS_BASE_PATH " /functional/builder/SmallPrismTest.nm " ) ;
storm : : jani : : Model janiModel = modelDescription . toJani ( true ) . preprocess ( ) . asJaniModel ( ) ;
storm : : builder : : DdJaniModelBuilder < storm : : dd : : DdType : : Sylvan , double > builder ;
// Start by checking the original composition.
std : : shared_ptr < storm : : models : : symbolic : : Model < storm : : dd : : DdType : : Sylvan > > model = builder . build ( janiModel ) ;
EXPECT_EQ ( 7ul , model - > getNumberOfStates ( ) ) ;
EXPECT_EQ ( 10ul , model - > getNumberOfTransitions ( ) ) ;
// Now we tweak it's system composition to check whether synchronization vectors work.
std : : vector < std : : shared_ptr < storm : : jani : : Composition > > automataCompositions ;
automataCompositions . push_back ( std : : make_shared < storm : : jani : : AutomatonComposition > ( " one " ) ) ;
automataCompositions . push_back ( std : : make_shared < storm : : jani : : AutomatonComposition > ( " two " ) ) ;
automataCompositions . push_back ( std : : make_shared < storm : : jani : : AutomatonComposition > ( " three " ) ) ;
// First, make all actions non-synchronizing.
std : : vector < storm : : jani : : SynchronizationVector > synchronizationVectors ;
std : : shared_ptr < storm : : jani : : Composition > newComposition = std : : make_shared < storm : : jani : : ParallelComposition > ( automataCompositions , synchronizationVectors ) ;
janiModel . setSystemComposition ( newComposition ) ;
model = builder . build ( janiModel ) ;
EXPECT_EQ ( 24ul , model - > getNumberOfStates ( ) ) ;
EXPECT_EQ ( 48ul , model - > getNumberOfTransitions ( ) ) ;
// Then, make only a, b and c synchronize.
std : : vector < std : : string > inputVector ;
inputVector . push_back ( " a " ) ;
inputVector . push_back ( " b " ) ;
inputVector . push_back ( " c " ) ;
synchronizationVectors . push_back ( storm : : jani : : SynchronizationVector ( inputVector , " d " ) ) ;
newComposition = std : : make_shared < storm : : jani : : ParallelComposition > ( automataCompositions , synchronizationVectors ) ;
janiModel . setSystemComposition ( newComposition ) ;
model = builder . build ( janiModel ) ;
EXPECT_EQ ( 7ul , model - > getNumberOfStates ( ) ) ;
EXPECT_EQ ( 10ul , model - > getNumberOfTransitions ( ) ) ;
inputVector . clear ( ) ;
inputVector . push_back ( " c " ) ;
inputVector . push_back ( " c " ) ;
inputVector . push_back ( " a " ) ;
synchronizationVectors . push_back ( storm : : jani : : SynchronizationVector ( inputVector , " d " ) ) ;
newComposition = std : : make_shared < storm : : jani : : ParallelComposition > ( automataCompositions , synchronizationVectors ) ;
janiModel . setSystemComposition ( newComposition ) ;
model = builder . build ( janiModel ) ;
EXPECT_EQ ( 3ul , model - > getNumberOfStates ( ) ) ;
EXPECT_EQ ( 3ul , model - > getNumberOfTransitions ( ) ) ;
inputVector . clear ( ) ;
inputVector . push_back ( " b " ) ;
inputVector . push_back ( " c " ) ;
inputVector . push_back ( " b " ) ;
synchronizationVectors . push_back ( storm : : jani : : SynchronizationVector ( inputVector , " e " ) ) ;
EXPECT_THROW ( newComposition = std : : make_shared < storm : : jani : : ParallelComposition > ( automataCompositions , synchronizationVectors ) , storm : : exceptions : : WrongFormatException ) ;
}
TEST ( DdJaniModelBuilderTest_Sylvan , Composition ) {
storm : : storage : : SymbolicModelDescription modelDescription = storm : : parser : : PrismParser : : parse ( STORM_CPP_TESTS_BASE_PATH " /functional/builder/system_composition.nm " ) ;
storm : : jani : : Model janiModel = modelDescription . toJani ( true ) . preprocess ( ) . asJaniModel ( ) ;
@ -416,3 +472,66 @@ TEST(DdJaniModelBuilderTest_Cudd, Composition) {
EXPECT_EQ ( 21ul , mdp - > getNumberOfChoices ( ) ) ;
}
TEST ( DdJaniModelBuilderTest_Cudd , InputEnabling ) {
storm : : storage : : SymbolicModelDescription modelDescription = storm : : parser : : PrismParser : : parse ( STORM_CPP_TESTS_BASE_PATH " /functional/builder/SmallPrismTest2.nm " ) ;
storm : : jani : : Model janiModel = modelDescription . toJani ( true ) . preprocess ( ) . asJaniModel ( ) ;
storm : : builder : : DdJaniModelBuilder < storm : : dd : : DdType : : CUDD , double > builder ;
// Make some automaton compositions input-enabled.
std : : vector < std : : shared_ptr < storm : : jani : : Composition > > automataCompositions ;
automataCompositions . push_back ( std : : make_shared < storm : : jani : : AutomatonComposition > ( " one " ) ) ;
automataCompositions . push_back ( std : : make_shared < storm : : jani : : AutomatonComposition > ( " two " ) ) ;
automataCompositions . push_back ( std : : make_shared < storm : : jani : : AutomatonComposition > ( " three " , std : : set < std : : string > { " a " } ) ) ;
// Create the synchronization vectors.
std : : vector < storm : : jani : : SynchronizationVector > synchronizationVectors ;
std : : vector < std : : string > inputVector ;
inputVector . push_back ( " a " ) ;
inputVector . push_back ( " b " ) ;
inputVector . push_back ( " c " ) ;
synchronizationVectors . push_back ( storm : : jani : : SynchronizationVector ( inputVector , " d " ) ) ;
inputVector . clear ( ) ;
inputVector . push_back ( " c " ) ;
inputVector . push_back ( " c " ) ;
inputVector . push_back ( " a " ) ;
synchronizationVectors . push_back ( storm : : jani : : SynchronizationVector ( inputVector , " d " ) ) ;
std : : shared_ptr < storm : : jani : : Composition > newComposition = std : : make_shared < storm : : jani : : ParallelComposition > ( automataCompositions , synchronizationVectors ) ;
janiModel . setSystemComposition ( newComposition ) ;
std : : shared_ptr < storm : : models : : symbolic : : Model < storm : : dd : : DdType : : CUDD > > model = builder . build ( janiModel ) ;
EXPECT_EQ ( 4ul , model - > getNumberOfStates ( ) ) ;
EXPECT_EQ ( 5ul , model - > getNumberOfTransitions ( ) ) ;
}
TEST ( DdJaniModelBuilderTest_Sylvan , InputEnabling ) {
storm : : storage : : SymbolicModelDescription modelDescription = storm : : parser : : PrismParser : : parse ( STORM_CPP_TESTS_BASE_PATH " /functional/builder/SmallPrismTest2.nm " ) ;
storm : : jani : : Model janiModel = modelDescription . toJani ( true ) . preprocess ( ) . asJaniModel ( ) ;
storm : : builder : : DdJaniModelBuilder < storm : : dd : : DdType : : Sylvan , double > builder ;
// Make some automaton compositions input-enabled.
std : : vector < std : : shared_ptr < storm : : jani : : Composition > > automataCompositions ;
automataCompositions . push_back ( std : : make_shared < storm : : jani : : AutomatonComposition > ( " one " ) ) ;
automataCompositions . push_back ( std : : make_shared < storm : : jani : : AutomatonComposition > ( " two " ) ) ;
automataCompositions . push_back ( std : : make_shared < storm : : jani : : AutomatonComposition > ( " three " , std : : set < std : : string > { " a " } ) ) ;
// Create the synchronization vectors.
std : : vector < storm : : jani : : SynchronizationVector > synchronizationVectors ;
std : : vector < std : : string > inputVector ;
inputVector . push_back ( " a " ) ;
inputVector . push_back ( " b " ) ;
inputVector . push_back ( " c " ) ;
synchronizationVectors . push_back ( storm : : jani : : SynchronizationVector ( inputVector , " d " ) ) ;
inputVector . clear ( ) ;
inputVector . push_back ( " c " ) ;
inputVector . push_back ( " c " ) ;
inputVector . push_back ( " a " ) ;
synchronizationVectors . push_back ( storm : : jani : : SynchronizationVector ( inputVector , " d " ) ) ;
std : : shared_ptr < storm : : jani : : Composition > newComposition = std : : make_shared < storm : : jani : : ParallelComposition > ( automataCompositions , synchronizationVectors ) ;
janiModel . setSystemComposition ( newComposition ) ;
std : : shared_ptr < storm : : models : : symbolic : : Model < storm : : dd : : DdType : : Sylvan > > model = builder . build ( janiModel ) ;
EXPECT_EQ ( 4ul , model - > getNumberOfStates ( ) ) ;
EXPECT_EQ ( 5ul , model - > getNumberOfTransitions ( ) ) ;
}