Source code for rolland.arrangement
"""Arrangement classes for the definition of non-uniform mounting properties.
.. autosummary::
:toctree: arrangement
Arrangement
PeriodicArrangement
RandomArrangement
"""
import abc
import random
from scipy.stats import truncnorm
from traitlets import Any
from .abstract_traits import ABCHasTraits
[docs]
class Arrangement(ABCHasTraits):
r"""Abstract base class for the definition of non-uniform mounting properties.
Attributes
----------
item : any
Characteristic object or objects to repeat.
"""
item = Any()
[docs]
@abc.abstractmethod
def generate(self, num_mount):
"""Generate count repetitions of objects."""
[docs]
class PeriodicArrangement(Arrangement):
r"""Periodic arrangement of given objects.
Given sequence of objects is repeated periodically when building track using
:class:`~rolland.track.ArrangedSlabSingleRailTrack` or
:class:`~rolland.track.ArrangedBallastedSingleRailTrack` class. Mounting positions start at
:math:`x=0`.
Attributes
----------
item : any
Characteristic object or objects to repeat.
Example
--------
>>> from rolland.database.rail.db_rail import UIC60
>>> from rolland.components import DiscrPad, Sleeper
>>> from rolland.arrangement import PeriodicArrangement
>>> from rolland.track import ArrangedBallastedSingleRailTrack
>>> thepadA = DiscrPad(sp = [300*10**6, 0], dp = [30000, 0])
>>> thepadB = DiscrPad(sp = [400*10**6, 0], dp = [40000, 0])
>>> thesleeperA = Sleeper(ms = 150)
>>> thesleeperB = Sleeper(ms = 200)
>>> pad = PeriodicArrangement(item=[thepadA, thepadB])
>>> distance = PeriodicArrangement(item=[0.65, 0.5])
>>> sleeper = PeriodicArrangement(item=[thesleeperA, thesleeperB])
>>> tr = ArrangedBallastedSingleRailTrack(
... rail=UIC60,
... pad=pad,
... sleeper=sleeper,
... distance=distance,
... num_mount=100)
"""
[docs]
def generate(self, num_mount):
"""Generate count repetitions of objects."""
c = 0
while c < num_mount:
if isinstance(self.item, list):
for item_ in self.item:
yield item_
c += 1
else:
yield self.item
c += 1
[docs]
class RandomArrangement(Arrangement):
r"""Random arrangement of given objects.
Given sequence of objects is repeated randomly when building track using
:class:`~rolland.track.ArrangedSlabSingleRailTrack` or
:class:`~rolland.track.ArrangedBallastedSingleRailTrack` class. Mounting positions start at
:math:`x=0`.
Attributes
----------
item : any
Characteristic object or objects to repeat.
Example
--------
>>> from rolland.database.rail.db_rail import UIC60
>>> from rolland.components import DiscrPad, Sleeper
>>> from rolland.arrangement import RandomArrangement
>>> from rolland.track import ArrangedBallastedSingleRailTrack
>>> thepadA = DiscrPad(sp = [300*10**6, 0], dp = [30000, 0])
>>> thepadB = DiscrPad(sp = [400*10**6, 0], dp = [40000, 0])
>>> thesleeperA = Sleeper(ms = 150)
>>> thesleeperB = Sleeper(ms = 200)
>>> pad = RandomArrangement(item=[thepadA, thepadB])
>>> distance = RandomArrangement(item=[0.65, 0.5])
>>> sleeper = RandomArrangement(item=[thesleeperA, thesleeperB])
>>> tr = ArrangedBallastedSingleRailTrack(
... rail=UIC60,
... pad=pad,
... sleeper=sleeper,
... distance=distance,
... num_mount=100)
"""
[docs]
def generate(self, num_mount):
"""Generate count repetitions of objects."""
for _ in range(num_mount):
if isinstance(self.item, list):
yield random.choice(self.item)
else:
yield self.item
[docs]
@staticmethod
def trunc_norm(mean, sd, minv, max_v) -> float:
"""Calculate truncated normal distribution.
Parameters
----------
mean : float
Mean value.
sd : float
Standard deviation.
minv : float
Minimum value.
max_v : float
Maximum value.
Returns
-------
object
"""
sd = sd + 1e-6 # Low value added to avoid error.
minv = minv - 1e-6
max_v = max_v + 1e-6
return float(truncnorm((minv - mean) / sd, (max_v - mean) / sd, loc=mean, scale=sd).rvs(1).item())