def groundtruth_paths_gen(self, random_state=None): groundtruth_paths = OrderedSet() time = self.initial_state.timestamp or datetime.datetime.now() random_state = random_state if random_state is not None else self.random_state for _ in range(self.number_steps): # Random drop tracks groundtruth_paths.difference_update( gttrack for gttrack in groundtruth_paths.copy() if random_state.rand() <= self.death_probability) # Move tracks forward for gttrack in groundtruth_paths: self.index = gttrack[-1].metadata.get("index") trans_state_vector = self.transition_model.function( gttrack[-1], noise=True, time_interval=self.timestep) gttrack.append( GroundTruthState(trans_state_vector, timestamp=time, metadata={"index": self.index})) # Random create for _ in range(random_state.poisson(self.birth_rate)): self.index = 0 gttrack = GroundTruthPath() gttrack.append( GroundTruthState( self.initial_state.state_vector + self.initial_state.covar @ random_state.randn( self.initial_state.ndim, 1), timestamp=time, metadata={"index": self.index})) groundtruth_paths.add(gttrack) yield time, groundtruth_paths time += self.timestep