diff --git a/src/swarmsim/sensors/AbstractSensor.py b/src/swarmsim/sensors/AbstractSensor.py index e5a13423..515aaa9a 100644 --- a/src/swarmsim/sensors/AbstractSensor.py +++ b/src/swarmsim/sensors/AbstractSensor.py @@ -13,7 +13,8 @@ class AbstractSensor: config_vars = ['static_position', 'n_possible_states', 'show'] - def __init__(self, agent=None, parent=None, static_position=None, n_possible_states=0, draw=True, **kwargs): + def __init__(self, agent=None, parent=None, static_position=None, n_possible_states=0, + draw=True, seed=None, **kwargs): """Sensor class for the agent. Sensors should typically have a parent that is assigned to them that must be of subclass 'Agent' @@ -31,6 +32,7 @@ def __init__(self, agent=None, parent=None, static_position=None, n_possible_sta self.current_state = 0 self.detection_id = 0 self.goal_detected = False + self.set_seed(seed) def step(self, world): if self.agent is None and self.static_position is None: @@ -62,3 +64,17 @@ def set_agent(self, agent, parent=None): self.parent = parent elif self.parent is None or parent is ...: self.parent = agent + + def set_seed(self, seed): + if seed is None: + if hasattr(self.parent, 'rng'): + self.seed = self.parent.rng.integers(0, 2**31) + elif hasattr(self.agent, 'rng'): + self.seed = self.agent.rng.integers(0, 2**31) + else: + temp_rng = np.random.default_rng(None) + self.seed = int(temp_rng.integers(0, 2**31)) + else: + self.seed = seed + self.rng = np.random.default_rng(self.seed) + return self.seed diff --git a/src/swarmsim/sensors/BinaryFOVSensor.py b/src/swarmsim/sensors/BinaryFOVSensor.py index 0302ba1e..a7181163 100644 --- a/src/swarmsim/sensors/BinaryFOVSensor.py +++ b/src/swarmsim/sensors/BinaryFOVSensor.py @@ -69,7 +69,7 @@ def __init__( target_team=None, **kwargs ): - super().__init__(agent=agent, parent=parent) + super().__init__(agent=agent, parent=parent, seed=seed, **kwargs) self.angle = 0.0 self.theta = theta self.bias = bias @@ -99,10 +99,6 @@ def __init__( self.r = distance - self.seed = seed - if self.seed is not None: - np.random.seed(self.seed) - def checkForLOSCollisions(self, world: RectangularWorld) -> None: # Mathematics obtained from Sundaram Ramaswamy # https://legends2k.github.io/2d-fov/design.html @@ -342,7 +338,7 @@ def determineState(self, real_value, agent, world=None): invert = self.invert if real_value: # Consider Reporting False Negative - if np.random.random_sample() < self.fn: + if self.rng.random() < self.fn: self.agent_in_sight = None self.current_state = 1 if invert else 0 self.detection_id = 0 @@ -354,7 +350,7 @@ def determineState(self, real_value, agent, world=None): else: # Consider Reporting False Positive - if np.random.random_sample() < self.fp: + if self.rng.random() < self.fp: self.agent_in_sight = None self.detection_id = 0 self.current_state = 0 if invert else 1