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.
		
		
		
		
		
			
		
			
				
					
					
						
							58 lines
						
					
					
						
							1.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							58 lines
						
					
					
						
							1.8 KiB
						
					
					
				| import stormpy.core | |
| 
 | |
| class Simulator: | |
|     """ | |
|     Base class for simulators. | |
|     """ | |
|     def __init__(self, seed=None): | |
|         self._seed = seed | |
| 
 | |
|     def step(self, action=None): | |
|         raise NotImplementedError("Abstract superclass") | |
| 
 | |
|     def restart(self): | |
|         raise NotImplementedError("Abstract superclass") | |
| 
 | |
| 
 | |
| class SparseSimulator(Simulator): | |
|     """ | |
|     Simulator on top of sparse models. | |
|     """ | |
| 
 | |
|     def __init__(self, model, seed=None): | |
|         super().__init__(seed) | |
|         self._model = model | |
|         self._engine = stormpy.core._DiscreteTimeSparseModelSimulatorDouble(model) | |
|         if seed is not None: | |
|             self._engine.set_seed(seed) | |
| 
 | |
|     def step(self, action=None): | |
|         if action is None: | |
|             if self._model.is_nondeterministic_model: | |
|                 raise RuntimeError("Must specify an action in nondeterministic models") | |
|             check = self._engine.step(0) | |
|             assert(check) | |
|         else: | |
|             if action >= self._model.get_nondeterministic_choices(): | |
|                 raise RuntimeError(f"Only {self._model.get_nondeterministic_choices()} actions available") | |
|             check = self._engine.step(action) | |
|             assert(check) | |
|         return self._engine.get_current_state() | |
| 
 | |
|     def restart(self): | |
|         self._engine.reset_to_initial_state() | |
| 
 | |
| 
 | |
| def create_simulator(model, seed = None): | |
|     """ | |
|     Factory method for creating a simulator. | |
|  | |
|     :param model: Some form of model | |
|     :param seed: A seed for reproducibility. If None (default), the seed is internally generated. | |
|     :return: A simulator that can simulate on top of this model | |
|     """ | |
|     if isinstance(model, stormpy.storage._ModelBase): | |
|         if model.is_sparse_model: | |
|             return SparseSimulator(model, seed) | |
|     else: | |
|         raise NotImplementedError("Currently, we only support simulators for sparse models.")
 |