You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							100 lines
						
					
					
						
							4.4 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							100 lines
						
					
					
						
							4.4 KiB
						
					
					
				| #include "gtest/gtest.h" | |
|  | |
| #include "src/transformer/StateDuplicator.h" | |
|  | |
| 
 | |
| TEST(StateDuplicator, SimpleModelTest) { | |
|         | |
|     storm::storage::SparseMatrix<double> matrix; | |
|     storm::storage::SparseMatrixBuilder<double> builder(6, 4, 7, true, true, 4); | |
|     ASSERT_NO_THROW(builder.newRowGroup(0)); | |
|     ASSERT_NO_THROW(builder.addNextValue(0, 0, 0.3)); | |
|     ASSERT_NO_THROW(builder.addNextValue(0, 1, 0.7)); | |
|     ASSERT_NO_THROW(builder.addNextValue(1, 3, 1.0)); | |
|     ASSERT_NO_THROW(builder.newRowGroup(2)); | |
|     ASSERT_NO_THROW(builder.addNextValue(2, 1, 1.0)); | |
|     ASSERT_NO_THROW(builder.newRowGroup(3)); | |
|     ASSERT_NO_THROW(builder.addNextValue(3, 0, 1.0)); | |
|     ASSERT_NO_THROW(builder.newRowGroup(4)); | |
|     ASSERT_NO_THROW(builder.addNextValue(4, 0, 1.0)); | |
|     ASSERT_NO_THROW(builder.addNextValue(5, 3, 1.0)); | |
|     ASSERT_NO_THROW(matrix = builder.build()); | |
|      | |
|     storm::models::sparse::StateLabeling labeling(4); | |
|     storm::storage::BitVector initStates(4); | |
|     initStates.set(0); | |
|     labeling.addLabel("init", initStates); | |
|     storm::storage::BitVector gateStates(4); | |
|     gateStates.set(3); | |
|     labeling.addLabel("gate", gateStates); | |
|     storm::storage::BitVector aStates(4); | |
|     aStates.set(0); | |
|     aStates.set(2); | |
|     labeling.addLabel("a", aStates); | |
|     storm::storage::BitVector bStates(4); | |
|     bStates.set(1); | |
|     bStates.set(3); | |
|     labeling.addLabel("b", bStates); | |
|      | |
|     std::unordered_map<std::string, storm::models::sparse::StandardRewardModel<double>> rewardModels; | |
|     std::vector<double> stateReward = {1.0, 2.0, 3.0, 4.0}; | |
|     std::vector<double> stateActionReward = {1.1, 1.2, 2.1, 3.1, 4.1, 4.2}; | |
|     rewardModels.insert(std::make_pair("rewards", storm::models::sparse::StandardRewardModel<double>(stateReward, stateActionReward))); | |
|      | |
|     storm::models::sparse::Mdp<double> model(matrix, labeling, rewardModels); | |
|      | |
|     auto res = storm::transformer::StateDuplicator<storm::models::sparse::Mdp<double>>::transform(model, gateStates); | |
|      | |
|     storm::storage::SparseMatrixBuilder<double> expectedBuilder(8, 5, 10, true, true, 5); | |
|     ASSERT_NO_THROW(expectedBuilder.newRowGroup(0)); | |
|     ASSERT_NO_THROW(expectedBuilder.addNextValue(0, 0, 0.3)); | |
|     ASSERT_NO_THROW(expectedBuilder.addNextValue(0, 1, 0.7)); | |
|     ASSERT_NO_THROW(expectedBuilder.addNextValue(1, 2, 1.0)); | |
|     ASSERT_NO_THROW(expectedBuilder.newRowGroup(2)); | |
|     ASSERT_NO_THROW(expectedBuilder.addNextValue(2, 1, 1.0)); | |
|     ASSERT_NO_THROW(expectedBuilder.newRowGroup(3)); | |
|     ASSERT_NO_THROW(expectedBuilder.addNextValue(3, 3, 1.0)); | |
|     ASSERT_NO_THROW(expectedBuilder.addNextValue(4, 2, 1.0)); | |
|     ASSERT_NO_THROW(expectedBuilder.newRowGroup(5)); | |
|     ASSERT_NO_THROW(expectedBuilder.addNextValue(5, 3, 0.3)); | |
|     ASSERT_NO_THROW(expectedBuilder.addNextValue(5, 4, 0.7)); | |
|     ASSERT_NO_THROW(expectedBuilder.addNextValue(6, 2, 1.0)); | |
|     ASSERT_NO_THROW(expectedBuilder.newRowGroup(7)); | |
|     ASSERT_NO_THROW(expectedBuilder.addNextValue(7, 4, 1.0)); | |
|     ASSERT_NO_THROW(matrix = expectedBuilder.build()); | |
|     EXPECT_EQ(matrix, res.model->getTransitionMatrix()); | |
|      | |
|     initStates.resize(5); | |
|     EXPECT_EQ(initStates, res.model->getInitialStates()); | |
|     gateStates=storm::storage::BitVector(5); | |
|     gateStates.set(2); | |
|     EXPECT_EQ(gateStates, res.model->getStates("gate")); | |
|     aStates = initStates; | |
|     aStates.set(3); | |
|     EXPECT_EQ(aStates, res.model->getStates("a")); | |
|     bStates = ~aStates; | |
|     EXPECT_EQ(bStates, res.model->getStates("b")); | |
|      | |
|     EXPECT_TRUE(res.model->hasRewardModel("rewards")); | |
|     EXPECT_TRUE(res.model->getRewardModel("rewards").hasStateRewards()); | |
|     stateReward = {1.0, 2.0, 4.0, 1.0, 2.0}; | |
|     EXPECT_EQ(stateReward, res.model->getRewardModel("rewards").getStateRewardVector()); | |
|     EXPECT_TRUE(res.model->getRewardModel("rewards").hasStateActionRewards()); | |
|     stateActionReward = {1.1, 1.2, 2.1, 4.1, 4.2, 1.1, 1.2, 2.1}; | |
|     EXPECT_EQ(stateActionReward, res.model->getRewardModel("rewards").getStateActionRewardVector()); | |
|      | |
|     storm::storage::BitVector firstCopy(5); | |
|     firstCopy.set(0); | |
|     firstCopy.set(1); | |
|     EXPECT_EQ(firstCopy, res.firstCopy); | |
|     EXPECT_EQ(~firstCopy, res.secondCopy); | |
|      | |
|     std::vector<uint_fast64_t> mapping = {0,1,3,0,1}; | |
|     EXPECT_EQ(mapping, res.newToOldStateIndexMapping); | |
|     uint_fast64_t max = std::numeric_limits<uint_fast64_t>::max(); | |
|     mapping = {0, 1, max, max}; | |
|     EXPECT_EQ(mapping, res.firstCopyOldToNewStateIndexMapping); | |
|     mapping = {3, 4, max, 2}; | |
|     EXPECT_EQ(mapping, res.secondCopyOldToNewStateIndexMapping); | |
|      | |
| }
 |