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] 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] 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] 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