Skip to content

Commit

Permalink
fixup! tests: add ETCS LoA (slowdown) tests on speed-space chart
Browse files Browse the repository at this point in the history
Process PR's comments

Signed-off-by: Pierre-Etienne Bougué <[email protected]>
  • Loading branch information
bougue-pe committed Feb 12, 2025
1 parent ffbcda3 commit 8770d7b
Showing 1 changed file with 40 additions and 28 deletions.
68 changes: 40 additions & 28 deletions tests/tests/test_train_schedule.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,17 @@
from .services import EDITOAST_URL


def kph2ms(kmh_speed: float) -> float:
return kmh_speed / 3.6


MAX_SPEED_288 = kph2ms(288)
SPEED_LIMIT_142 = kph2ms(141.9984)
SPEED_LIMIT_112 = kph2ms(111.9996)
SAFE_SPEED_30 = kph2ms(29.9988)
SHORT_SLIP_SPEED_10 = kph2ms(10.0008)


def _update_simulation_with_mareco_allowances(editoast_url, train_Schedule_id):
response = requests.get(editoast_url + f"/train_schedule/{train_Schedule_id}/")
assert response.status_code == 200
Expand Down Expand Up @@ -177,20 +188,20 @@ def test_etcs_schedule_stop_brakes_result_never_reach_mrsp(etcs_scenario: Scenar
# In practice, check noticeable points of the braking curves (with the stops already checked)
offset_first_high_speed = 14_509_017
offset_first_brake_220_kph_speed = 17_544_856
assert abs(_get_current_or_next_speed_at(simulation_final_output, offset_first_high_speed) - kph2ms(274.176)) < 1e-2
assert (
abs(_get_current_or_next_speed_at(simulation_final_output, offset_first_brake_220_kph_speed) - kph2ms(221.004))
< 1e-2
_assert_equal_speeds(
_get_current_or_next_speed_at(simulation_final_output, offset_first_high_speed), kph2ms(274.176)
)
_assert_equal_speeds(
_get_current_or_next_speed_at(simulation_final_output, offset_first_brake_220_kph_speed), kph2ms(221.004)
)

offset_fourth_high_speed = 37_087_342
offset_fourth_brake_220_kph_speed = 37_661_601
assert (
abs(_get_current_or_next_speed_at(simulation_final_output, offset_fourth_high_speed) - kph2ms(230.976)) < 1e-2
_assert_equal_speeds(
_get_current_or_next_speed_at(simulation_final_output, offset_fourth_high_speed), kph2ms(230.976)
)
assert (
abs(_get_current_or_next_speed_at(simulation_final_output, offset_fourth_brake_220_kph_speed) - kph2ms(219.744))
< 1e-2
_assert_equal_speeds(
_get_current_or_next_speed_at(simulation_final_output, offset_fourth_brake_220_kph_speed), kph2ms(219.744)
)


Expand Down Expand Up @@ -277,13 +288,13 @@ def test_etcs_schedule_result_stop_brake_from_mrsp(etcs_scenario: Scenario, etcs
# Check that the braking curves from the MRSP for the first and second stops start at the expected offset
offset_start_first_brake = 21_467_192
speed_before_first_brake = _get_current_or_next_speed_at(simulation_final_output, offset_start_first_brake)
assert abs(speed_before_first_brake - kph2ms(288)) < 1e-2
_assert_equal_speeds(speed_before_first_brake, MAX_SPEED_288)
assert (
_get_current_or_next_speed_at(simulation_final_output, offset_start_first_brake + 1) < speed_before_first_brake
)
offset_start_second_brake = 40_663_532
speed_before_second_brake = _get_current_or_next_speed_at(simulation_final_output, offset_start_second_brake)
assert abs(speed_before_second_brake - kph2ms(141.9984)) < 1e-2
_assert_equal_speeds(speed_before_second_brake, SPEED_LIMIT_142)
assert (
_get_current_or_next_speed_at(simulation_final_output, offset_start_second_brake + 1)
< speed_before_second_brake
Expand Down Expand Up @@ -333,7 +344,7 @@ def test_etcs_schedule_result_slowdowns(etcs_scenario: Scenario, etcs_rolling_st
# To debug this test: please add a breakpoint then use front to display speed-space chart
# (activate Context for Slopes and Speed limits).

# Check that the curves does respect Ends of Authority (EoA = stops), and that there is an
# Check that the curves do respect Ends of Authority (EoA = stops), and that there is an
# acceleration then deceleration in between (maintain speed when reach the MRSP).
# This is the case here because MRSP is not doing ups-and-downs.
final_stop_offset = 47_000_000
Expand Down Expand Up @@ -364,15 +375,15 @@ def test_etcs_schedule_result_slowdowns(etcs_scenario: Scenario, etcs_rolling_st
# Check that the braking curves for limits of Authority (LoA = slowdowns of the MRSP) start and end at the
# expected offset.
# Also check a bending point for the first curve (where Guidance curve's influence stops).
# Note: the end of the braking is upstream the actual MRSP slowdown's target as per the offset applied to
# Note: the end of the braking is upstream of the actual MRSP slowdown's target as per the offset applied to
# LoA braking curves.

# First slowdown
offset_start_brake_288_to_142 = 35_051_929
speed_before_brake_288_to_142 = _get_current_or_next_speed_at(
simulation_final_output, offset_start_brake_288_to_142
)
assert abs(speed_before_brake_288_to_142 - kph2ms(288)) < 1e-2
_assert_equal_speeds(speed_before_brake_288_to_142, MAX_SPEED_288)
assert (
_get_current_or_next_speed_at(simulation_final_output, offset_start_brake_288_to_142 + 1)
< speed_before_brake_288_to_142
Expand All @@ -382,22 +393,22 @@ def test_etcs_schedule_result_slowdowns(etcs_scenario: Scenario, etcs_rolling_st
speed_at_bending_guidance_point = _get_current_or_next_speed_at(
simulation_final_output, offset_bending_guidance_point
)
assert abs(speed_at_bending_guidance_point - kph2ms(235.901_491_880_851_1)) < 1e-2
_assert_equal_speeds(speed_at_bending_guidance_point, kph2ms(235.901_491_880_851_1))

offset_end_brake_288_to_142 = 40_724_374
speed_after_brake_288_to_142 = _get_current_or_next_speed_at(simulation_final_output, offset_end_brake_288_to_142)
assert (
_get_current_or_prev_speed_at(simulation_final_output, offset_end_brake_288_to_142 - 1)
> speed_after_brake_288_to_142
)
assert abs(speed_after_brake_288_to_142 - kph2ms(141.9984)) < 1e-2
_assert_equal_speeds(speed_after_brake_288_to_142, SPEED_LIMIT_142)

# Second slowdown
offset_start_brake_142_to_120 = 44_313_934
speed_before_brake_142_to_120 = _get_current_or_next_speed_at(
simulation_final_output, offset_start_brake_142_to_120
)
assert abs(speed_before_brake_142_to_120 - kph2ms(141.9984)) < 1e-2
_assert_equal_speeds(speed_before_brake_142_to_120, SPEED_LIMIT_142)
assert (
_get_current_or_next_speed_at(simulation_final_output, offset_start_brake_142_to_120 + 1)
< speed_before_brake_142_to_120
Expand All @@ -408,12 +419,12 @@ def test_etcs_schedule_result_slowdowns(etcs_scenario: Scenario, etcs_rolling_st
_get_current_or_prev_speed_at(simulation_final_output, offset_end_brake_142_to_120 - 1)
> speed_after_brake_142_to_120
)
assert abs(speed_after_brake_142_to_120 - kph2ms(111.9996)) < 1e-2
_assert_equal_speeds(speed_after_brake_142_to_120, SPEED_LIMIT_112)

# Slowdown for Safety Speed stop: should probably disappear for ETCS at some point
# Slowdown for Safety Speed stop: should probably disappear for ETCS at some point.
offset_start_brake_120_to_30 = 45_536_480
speed_before_brake_120_to_30 = _get_current_or_next_speed_at(simulation_final_output, offset_start_brake_120_to_30)
assert abs(speed_before_brake_120_to_30 - kph2ms(111.9996)) < 1e-2
_assert_equal_speeds(speed_before_brake_120_to_30, SPEED_LIMIT_112)
assert (
_get_current_or_next_speed_at(simulation_final_output, offset_start_brake_120_to_30 + 1)
< speed_before_brake_120_to_30
Expand All @@ -424,12 +435,12 @@ def test_etcs_schedule_result_slowdowns(etcs_scenario: Scenario, etcs_rolling_st
_get_current_or_prev_speed_at(simulation_final_output, offset_end_brake_120_to_30 - 1)
> speed_after_brake_120_to_30
)
assert abs(speed_after_brake_120_to_30 - kph2ms(29.9988)) < 1e-2
_assert_equal_speeds(speed_after_brake_120_to_30, SAFE_SPEED_30)

# Slowdown for short slip stop: should probably disappear for ETCS at some point
# Slowdown for short slip stop: should probably disappear for ETCS at some point.
offset_start_brake_30_to_10 = 46_597_240
speed_before_brake_30_to_10 = _get_current_or_next_speed_at(simulation_final_output, offset_start_brake_30_to_10)
assert abs(speed_before_brake_30_to_10 - kph2ms(29.9988)) < 1e-2
_assert_equal_speeds(speed_before_brake_30_to_10, SAFE_SPEED_30)
assert (
_get_current_or_next_speed_at(simulation_final_output, offset_start_brake_30_to_10 + 1)
< speed_before_brake_30_to_10
Expand All @@ -440,20 +451,21 @@ def test_etcs_schedule_result_slowdowns(etcs_scenario: Scenario, etcs_rolling_st
_get_current_or_prev_speed_at(simulation_final_output, offset_end_brake_30_to_10 - 1)
> speed_after_brake_30_to_10
)
assert abs(speed_after_brake_30_to_10 - kph2ms(10.0008)) < 1e-2
_assert_equal_speeds(speed_after_brake_30_to_10, SHORT_SLIP_SPEED_10)

# Final slowdown: EoA (complete stop) braking curve is applied
# Final slowdown: EoA (complete stop) braking curve is applied.
# Note: This should also be impacted if Safety Speed stop and short slip stop disappear for ETCS.
offset_start_brake_10_to_0 = 46_953_914
speed_before_brake_10_to_0 = _get_current_or_next_speed_at(simulation_final_output, offset_start_brake_10_to_0)
assert abs(speed_before_brake_10_to_0 - kph2ms(10.0008)) < 1e-2
_assert_equal_speeds(speed_before_brake_10_to_0, SHORT_SLIP_SPEED_10)
assert (
_get_current_or_next_speed_at(simulation_final_output, offset_start_brake_10_to_0 + 1)
< speed_before_brake_10_to_0
)


def kph2ms(kmh_speed: float) -> float:
return kmh_speed / 3.6
def _assert_equal_speeds(left, right):
assert abs(left - right) < 1e-2


def _get_current_or_next_speed_at(simulation_final_output: Dict[str, Any], position: int) -> int:
Expand Down

0 comments on commit 8770d7b

Please sign in to comment.