Browse Source
			
			
			Added scheduler classes. Added method to model classes that applies a scheduler.
			
				
		Added scheduler classes. Added method to model classes that applies a scheduler.
	
		
	
			
				Former-commit-id: 73a4be11b2
			
			
				main
			
			
		
				 14 changed files with 250 additions and 8 deletions
			
			
		- 
					2src/counterexamples/MILPMinimalLabelSetGenerator.h
- 
					2src/counterexamples/SMTMinimalCommandSetGenerator.h
- 
					12src/models/AbstractModel.h
- 
					7src/models/AbstractNondeterministicModel.h
- 
					11src/models/Ctmc.h
- 
					12src/models/Ctmdp.h
- 
					14src/models/Dtmc.h
- 
					15src/models/Mdp.h
- 
					24src/storage/PartialScheduler.cpp
- 
					24src/storage/PartialScheduler.h
- 
					36src/storage/Scheduler.h
- 
					21src/storage/TotalScheduler.cpp
- 
					26src/storage/TotalScheduler.h
- 
					52src/utility/matrix.h
| @ -0,0 +1,24 @@ | |||||
|  | #include "src/storage/PartialScheduler.h"
 | ||||
|  | #include "src/exceptions/InvalidArgumentException.h"
 | ||||
|  | 
 | ||||
|  | namespace storm { | ||||
|  |     namespace storage { | ||||
|  |          | ||||
|  |         void PartialScheduler::setChoice(uint_fast64_t state, uint_fast64_t choice) { | ||||
|  |             choices[state] = choice; | ||||
|  |         } | ||||
|  |          | ||||
|  |         bool PartialScheduler::isChoiceDefined(uint_fast64_t state) const { | ||||
|  |             return choices.find(state) != choices.end(); | ||||
|  |         } | ||||
|  |          | ||||
|  |         uint_fast64_t PartialScheduler::getChoice(uint_fast64_t state) const { | ||||
|  |             auto stateChoicePair = choices.find(state); | ||||
|  |              | ||||
|  |             if (stateChoicePair == choices.end()) { | ||||
|  |                 throw storm::exceptions::InvalidArgumentException() << "Scheduler does not define a choice for state " << state; | ||||
|  |             } | ||||
|  |         } | ||||
|  |          | ||||
|  |     } // namespace storage
 | ||||
|  | } // namespace storm
 | ||||
| @ -0,0 +1,24 @@ | |||||
|  | #ifndef STORM_STORAGE_PARTIALSCHEDULER_H_ | ||||
|  | #define STORM_STORAGE_PARTIALSCHEDULER_H_ | ||||
|  | 
 | ||||
|  | #include "src/storage/Scheduler.h" | ||||
|  | 
 | ||||
|  | namespace storm { | ||||
|  |     namespace storage { | ||||
|  |          | ||||
|  |         class PartialScheduler : public Scheduler { | ||||
|  |         public: | ||||
|  |             void setChoice(uint_fast64_t state, uint_fast64_t choice) override; | ||||
|  |              | ||||
|  |             bool isChoiceDefined(uint_fast64_t state) const override; | ||||
|  |              | ||||
|  |             uint_fast64_t getChoice(uint_fast64_t state) const override; | ||||
|  |              | ||||
|  |         private: | ||||
|  |             // A mapping from all states that have defined choices to their respective choices. | ||||
|  |             std::unsorted_map<uint_fast64_t, uint_fast64_t> choices; | ||||
|  |         }; | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | #endif /* STORM_STORAGE_PARTIALSCHEDULER_H_ */ | ||||
| @ -0,0 +1,36 @@ | |||||
|  | #ifndef STORM_STORAGE_SCHEDULER_H_ | ||||
|  | #define STORM_STORAGE_SCHEDULER_H_ | ||||
|  | 
 | ||||
|  | namespace storm { | ||||
|  |     namespace storage { | ||||
|  |          | ||||
|  |         /* | ||||
|  |          * This class is the abstract base class of all scheduler classes. Scheduler classes define which action is chosen in a particular state of a non-deterministic model. | ||||
|  |          */ | ||||
|  |         class Scheduler { | ||||
|  |         public: | ||||
|  |             /* | ||||
|  |              * Sets the choice defined by the scheduler for the given state. | ||||
|  |              * | ||||
|  |              * @param state The state for which to set the choice. | ||||
|  |              * @param choice The choice to set for the given state. | ||||
|  |              */ | ||||
|  |             virtual void setChoice(uint_fast64_t state, uint_fast64_t choice) = 0; | ||||
|  |              | ||||
|  |             /* | ||||
|  |              * Retrieves whether this scheduler defines a choice for the given state. | ||||
|  |              * | ||||
|  |              * @param state The state for which to check whether the scheduler defines a choice. | ||||
|  |              * @return True if the scheduler defines a choice for the given state. | ||||
|  |              */ | ||||
|  |             virtual bool isChoiceDefined(uint_fast64_t state) const = 0; | ||||
|  |              | ||||
|  |             /*! | ||||
|  |              * Retrieves the choice for the given state under the assumption that the scheduler defines a proper choice for the state. | ||||
|  |              */ | ||||
|  |             virtual uint_fast64_t getChoice(uint_fast64_t state) const = 0; | ||||
|  |         }; | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | #endif /* STORM_STORAGE_SCHEDULER_H_ */ | ||||
| @ -0,0 +1,21 @@ | |||||
|  | #include "src/storage/TotalScheduler.h"
 | ||||
|  | 
 | ||||
|  | namespace storm { | ||||
|  |     namespace storage { | ||||
|  |         TotalScheduler::TotalScheduler(uint_fast64_t numberOfStates) : choices(numberOfStates) { | ||||
|  |             // Intentionally left empty.
 | ||||
|  |         } | ||||
|  |          | ||||
|  |         void setChoice(uint_fast64_t state, uint_fast64_t choice) override { | ||||
|  |             choices[state] = choice; | ||||
|  |         } | ||||
|  |          | ||||
|  |         bool isChoiceDefined(uint_fast64_t state) const override { | ||||
|  |             return true; | ||||
|  |         } | ||||
|  |          | ||||
|  |         uint_fast64_t getChoice(uint_fast64_t state) const override { | ||||
|  |             return choices[state]; | ||||
|  |         } | ||||
|  |     } | ||||
|  | } | ||||
| @ -0,0 +1,26 @@ | |||||
|  | #ifndef STORM_STORAGE_TOTALSCHEDULER_H_ | ||||
|  | #define STORM_STORAGE_TOTALSCHEDULER_H_ | ||||
|  | 
 | ||||
|  | #include "src/storage/Scheduler.h" | ||||
|  | 
 | ||||
|  | namespace storm { | ||||
|  |     namespace storage { | ||||
|  |          | ||||
|  |         class TotalScheduler : public Scheduler { | ||||
|  |         public: | ||||
|  |             TotalScheduler(uint_fast64_t numberOfStates); | ||||
|  |              | ||||
|  |             void setChoice(uint_fast64_t state, uint_fast64_t choice) override; | ||||
|  |              | ||||
|  |             bool isChoiceDefined(uint_fast64_t state) const override; | ||||
|  |              | ||||
|  |             uint_fast64_t getChoice(uint_fast64_t state) const override; | ||||
|  |              | ||||
|  |         private: | ||||
|  |             // A vector that stores the choice for each state. | ||||
|  |             std::vector<uint_fast64_t> choices; | ||||
|  |         }; | ||||
|  |     } // namespace storage | ||||
|  | } // namespace storm | ||||
|  | 
 | ||||
|  | #endif /* STORM_STORAGE_TOTALSCHEDULER_H_ */ | ||||
| @ -0,0 +1,52 @@ | |||||
|  | #ifndef STORM_UTILITY_MATRIX_H_ | ||||
|  | #define STORM_UTILITY_MATRIX_H_ | ||||
|  | 
 | ||||
|  | #include "src/storage/SparseMatrix.h" | ||||
|  | #include "src/storage/Scheduler.h" | ||||
|  | #include "src/exceptions/InvalidStateException.h" | ||||
|  | 
 | ||||
|  | namespace storm { | ||||
|  |     namespace utility { | ||||
|  |         namespace matrix { | ||||
|  |              | ||||
|  |             /*! | ||||
|  |              * Applies the given scheduler to the given transition matrix. This means that all choices that are not taken by the scheduler are | ||||
|  |              * dropped from the transition matrix. If a state has no choice enabled, it is equipped with a self-loop instead. | ||||
|  |              * | ||||
|  |              * @param transitionMatrix The transition matrix of the original system. | ||||
|  |              * @param nondeterministicChoiceIndices A vector indicating at which rows the choices for the states begin. | ||||
|  |              * @param scheduler The scheduler to apply to the system. | ||||
|  |              * @return A transition matrix that corresponds to all transitions of the given system that are selected by the given scheduler. | ||||
|  |              */ | ||||
|  |             template <typename T> | ||||
|  |             storm::storage::SparseMatrix<T> applyScheduler(storm::storage::SparseMatrix<T> const& transitionMatrix, std::vector<uint_fast64_t> const& nondeterministicChoiceIndices, storm::storage::Scheduler const& scheduler) { | ||||
|  |                 storm::storage::SparseMatrix<T> result(nondeterministicChoiceIndices.size() - 1, transitionMatrix.getColumnCount()); | ||||
|  |                  | ||||
|  |                 for (uint_fast64_t state = 0; state < nondeterministicChoiceIndices.size() - 1; ++state) { | ||||
|  |                     if (scheduler.isChoiceDefined(state)) { | ||||
|  |                         // Check whether the choice is valid for this state. | ||||
|  |                         uint_fast64_t choice = nondeterministicChoiceIndices[state] + scheduler.getChoice(state); | ||||
|  |                         if (choice >= nondeterministicChoiceIndices[state + 1]) { | ||||
|  |                             throw storm::exceptions::InvalidStateException() << "Scheduler defines illegal choice " << choice << " for state " << state << "."; | ||||
|  |                         } | ||||
|  |                          | ||||
|  |                         // If a valid choice for this state is defined, we copy over the corresponding entries. | ||||
|  |                         typename storm::storage::SparseMatrix<T>::Rows selectedRow = transitionMatrix.getRow(choice); | ||||
|  |                         for (auto entry : selectedRow) { | ||||
|  |                             result.insertNextValue(state, entry.column(), entry.value()); | ||||
|  |                         } | ||||
|  |                     } else { | ||||
|  |                         // If no valid choice for the state is defined, we insert a self-loop. | ||||
|  |                         result.insertNextValue(state, state, storm::utility::constGetOne<T>()); | ||||
|  |                     } | ||||
|  |                 } | ||||
|  |                  | ||||
|  |                 // Finalize the matrix creation and return result. | ||||
|  |                 result.finalize(); | ||||
|  |                 return result; | ||||
|  |             } | ||||
|  |         } | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | #endif /* STORM_UTILITY_MATRIX_H_ */ | ||||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue