Source code for jupedsim.models

# Copyright © 2012-2023 Forschungszentrum Jülich GmbH
# SPDX-License-Identifier: LGPL-3.0-or-later

from dataclasses import dataclass

import jupedsim.native as py_jps


@dataclass(kw_only=True)
[docs]class CollisionFreeSpeedModel: """Parameters for Collision Free Speed Model All attributes are initialized with reasonably good defaults. Attributes: strength_neighbor_repulsion: Strength of the repulsion from neighbors range_neighbor_repulsion: Range of the repulsion from neighbors strength_geometry_repulsion: Strength of the repulsion from geometry boundaries range_geometry_repulsion: Range of the repulsion from geometry boundaries """
[docs] strength_neighbor_repulsion: float = 8.0
[docs] range_neighbor_repulsion: float = 0.1
[docs] strength_geometry_repulsion: float = 5.0
[docs] range_geometry_repulsion: float = 0.02
@dataclass(kw_only=True)
[docs]class GeneralizedCentrifugalForceModel: """Parameters for Generalized Centrifugal Force Model All attributes are initialized with reasonably good defaults. Attributes: strength_neighbor_repulsion: Strength of the repulsion from neighbors strength_geometry_repulsion: Strength of the repulsion from geometry boundaries max_neighbor_interaction_distance: cut-off-radius for ped-ped repulsion (r_c in FIG. 7) max_geometry_interaction_distance: cut-off-radius for ped-wall repulsion (r_c in FIG. 7) max_neighbor_interpolation_distance: distance of interpolation of repulsive force for ped-ped interaction (r_eps in FIG. 7) max_geometry_interpolation_distance: distance of interpolation of repulsive force for ped-wall interaction (r_eps in FIG. 7) max_neighbor_repulsion_force: maximum of the repulsion force for ped-ped interaction by contact of ellipses (f_m in FIG. 7) max_geometry_repulsion_force: maximum of the repulsion force for ped-wall interaction by contact of ellipses (f_m in FIG. 7) """
[docs] strength_neighbor_repulsion: float = 0.3
[docs] strength_geometry_repulsion: float = 0.2
[docs] max_neighbor_interaction_distance: float = 2
[docs] max_geometry_interaction_distance: float = 2
[docs] max_neighbor_interpolation_distance: float = 0.1
[docs] max_geometry_interpolation_distance: float = 0.1
[docs] max_neighbor_repulsion_force: float = 3
[docs] max_geometry_repulsion_force: float = 3
@dataclass(kw_only=True)
[docs]class GeneralizedCentrifugalForceModelAgentParameters: """ Parameters required to create an Agent in the Generalized Centrifugal Force Model. See the scientific publication for more details about this model https://arxiv.org/abs/1008.4297 .. note:: Instances of this type are copied when creating the agent, you can safely create one instance of this type and modify it between calls to `add_agent` E.g.: .. code:: python positions = [...] # List of initial agent positions params = GeneralizedCentrifugalForceModelAgentParameters(speed=0.9) # all agents are slower for p in positions: params.position = p sim.add_agent(params) Attributes: speed: Speed of the agent. e0: Desired direction of the agent. position: Position of the agent. orientation: Orientation of the agent. journey_id: Id of the journey the agent follows. stage_id: Id of the stage the agent targets. mass: Mass of the agent. tau: Time constant that describes how fast the agent accelerates to its desired speed (v0). v0: Maximum speed of the agent. a_v: Stretch of the ellipsis semi-axis along the movement vector. a_min: Minimum length of the ellipsis semi-axis along the movement vector. b_min: Minimum length of the ellipsis semi-axis orthogonal to the movement vector. b_max: Maximum length of the ellipsis semi-axis orthogonal to the movement vector. """
[docs] speed: float = 0.0
[docs] e0: tuple[float, float] = (0.0, 0.0)
[docs] position: tuple[float, float] = (0.0, 0.0)
[docs] orientation: tuple[float, float] = (0.0, 0.0)
[docs] journey_id: int = -1
[docs] stage_id: int = -1
[docs] mass: float = 1
[docs] tau: float = 0.5
[docs] v0: float = 1.2
[docs] a_v: float = 1
[docs] a_min: float = 0.2
[docs] b_min: float = 0.2
[docs] b_max: float = 0.4
[docs] def as_native( self, ) -> py_jps.GeneralizedCentrifugalForceModelAgentParameters: return py_jps.GeneralizedCentrifugalForceModelAgentParameters( speed=self.speed, e0=self.e0, position=self.position, orientation=self.orientation, journey_id=self.journey_id, stage_id=self.stage_id, mass=self.mass, tau=self.tau, v0=self.v0, a_v=self.a_v, a_min=self.a_min, b_min=self.b_min, b_max=self.b_max, )
@dataclass(kw_only=True)
[docs]class CollisionFreeSpeedModelAgentParameters: """ Agent parameters for Collision Free Speed Model. See the scientific publication for more details about this model https://arxiv.org/abs/1512.05597 .. note:: Instances of this type are copied when creating the agent, you can safely create one instance of this type and modify it between calls to `add_agent` E.g.: .. code:: python positions = [...] # List of initial agent positions params = CollisionFreeSpeedModelAgentParameters(speed=0.9) # all agents are slower for p in positions: params.position = p sim.add_agent(params) Attributes: position: Position of the agent. time_gap: Time constant that describe how fast pedestrian close gaps. v0: Maximum speed of the agent. radius: Radius of the agent. journey_id: Id of the journey the agent follows. stage_id: Id of the stage the agent targets. """
[docs] position: tuple[float, float] = (0.0, 0.0)
[docs] time_gap: float = 1.0
[docs] v0: float = 1.2
[docs] radius: float = 0.2
[docs] journey_id: int = 0
[docs] stage_id: int = 0
[docs] def as_native(self) -> py_jps.CollisionFreeSpeedModelAgentParameters: return py_jps.CollisionFreeSpeedModelAgentParameters( position=self.position, time_gap=self.time_gap, v0=self.v0, radius=self.radius, journey_id=self.journey_id, stage_id=self.stage_id, )
[docs]class GeneralizedCentrifugalForceModelState: def __init__(self, backing) -> None: self._obj = backing @property
[docs] def speed(self) -> float: """Speed of this agent.""" return self._obj.speed
@speed.setter def speed(self, speed): self._obj.speed = speed @property
[docs] def e0(self) -> tuple[float, float]: """Desired direction of this agent.""" return self._obj.e0
@e0.setter def e0(self, e0): self._obj.e0 = e0 @property
[docs] def tau(self) -> float: return self._obj.tau
@tau.setter def tau(self, tau): self._obj.tau = tau @property
[docs] def v0(self) -> float: """Maximum speed of this agent.""" return self._obj.v0
@v0.setter def v0(self, v0): self._obj.v0 = v0 @property
[docs] def a_v(self) -> float: """Stretch of the ellipsis semi-axis along the movement vector.""" return self._obj.a_v
@a_v.setter def a_v(self, a_v): self._obj.a_v = a_v @property
[docs] def a_min(self) -> float: """Minimum length of the ellipsis semi-axis along the movement vector.""" return self._obj.a_min
@a_min.setter def a_min(self, a_min): self._obj.a_min = a_min @property
[docs] def b_min(self) -> float: """Minimum length of the ellipsis semi-axis orthogonal to the movement vector.""" return self._obj.b_min
@b_min.setter def b_min(self, b_min): self._obj.b_min = b_min @property
[docs] def b_max(self) -> float: """Maximum length of the ellipsis semi-axis orthogonal to the movement vector.""" return self._obj.b_max
@b_max.setter def b_max(self, b_max): self._obj.b_max = b_max
[docs]class CollisionFreeSpeedModelState: def __init__(self, backing): self._obj = backing @property
[docs] def time_gap(self) -> float: return self._obj.time_gap
@time_gap.setter def time_gap(self, time_gap): self._obj.time_gap = time_gap @property
[docs] def v0(self) -> float: """Maximum speed of this agent.""" return self._obj.v0
@v0.setter def v0(self, v0): self._obj.v0 = v0 @property
[docs] def radius(self) -> float: """Radius of this agent.""" return self._obj.radius
@radius.setter def radius(self, radius): self._obj.radius = radius