Skip to content

Commit 2ac5d52

Browse files
committed
core: fix error when missing traction in engineering allowances
Signed-off-by: Eloi Charpentier <[email protected]>
1 parent 016d2a3 commit 2ac5d52

File tree

3 files changed

+20
-11
lines changed

3 files changed

+20
-11
lines changed

core/envelope-sim/src/main/java/fr/sncf/osrd/envelope_sim/overlays/EnvelopeAcceleration.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import fr.sncf.osrd.envelope_sim.Action;
55
import fr.sncf.osrd.envelope_sim.EnvelopeSimContext;
66
import fr.sncf.osrd.envelope_sim.TrainPhysicsIntegrator;
7+
import fr.sncf.osrd.reporting.exceptions.ErrorType;
8+
import fr.sncf.osrd.reporting.exceptions.OSRDError;
79

810
public class EnvelopeAcceleration {
911
/** Accelerate, storing the resulting steps into consumer */
@@ -22,7 +24,7 @@ public static void accelerate(
2224
position += step.positionDelta;
2325
speed = step.endSpeed;
2426
if (!consumer.addStep(position, speed, step.timeDelta)) break;
25-
assert (step.positionDelta != 0.0);
27+
if (step.positionDelta == 0.0) throw new OSRDError(ErrorType.ImpossibleSimulationError);
2628
}
2729
}
2830
}

core/src/main/kotlin/fr/sncf/osrd/stdcm/graph/engineering_allowance/EngineeringAllowanceManager.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ class EngineeringAllowanceManager(
9696
val cachedSegments = backwardsSegments.cacheable()
9797
for ((i, segment) in cachedSegments.withIndex()) {
9898
val (newBeginSpeed, newTravelTime) =
99-
segment.computeAccelSequenceFromEndSpeed(currentSpeed)
99+
segment.computeAccelSequenceFromEndSpeed(currentSpeed) ?: break
100100

101101
val travelTimeDiff = max(0.0, newTravelTime - segment.travelTime)
102102
currentAddedDelay += travelTimeDiff

core/src/main/kotlin/fr/sncf/osrd/stdcm/graph/engineering_allowance/SimulationSegment.kt

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import fr.sncf.osrd.envelope.part.constraints.SpeedConstraint
99
import fr.sncf.osrd.envelope_sim.EnvelopeProfile
1010
import fr.sncf.osrd.envelope_sim.overlays.EnvelopeAcceleration
1111
import fr.sncf.osrd.path.interfaces.TrainPath
12+
import fr.sncf.osrd.reporting.exceptions.ErrorType
13+
import fr.sncf.osrd.reporting.exceptions.OSRDError
1214
import fr.sncf.osrd.stdcm.graph.STDCMEdge
1315
import fr.sncf.osrd.stdcm.graph.STDCMGraph
1416
import fr.sncf.osrd.utils.units.Distance
@@ -26,7 +28,7 @@ data class SimulationSegment(
2628
val maxAddedDelay: Double,
2729
// Function to compute an acceleration over this segment. Can be dummy values for tests,
2830
// wrap a full simulation pipeline in normal processing.
29-
val computeAccelSequenceFromEndSpeed: (Double) -> SummarizedSimulationResult,
31+
val computeAccelSequenceFromEndSpeed: (Double) -> SummarizedSimulationResult?,
3032
) {
3133
init {
3234
positive(beginTime)
@@ -109,7 +111,7 @@ private fun computeAcceleration(
109111
pathProperties: TrainPath,
110112
endSpeed: Double,
111113
graph: STDCMGraph,
112-
): SummarizedSimulationResult {
114+
): SummarizedSimulationResult? {
113115
// TODO: we could look into using const accelerations here as well instead of using
114116
// envelopes. We'd need to estimate the max slope for each segment.
115117
// It's a performance / accuracy tradeoff.
@@ -133,13 +135,18 @@ private fun computeAcceleration(
133135
SpeedConstraint(0.0, EnvelopePartConstraintType.FLOOR),
134136
PositionConstraint(0.0, pathProperties.getLength().meters),
135137
)
136-
EnvelopeAcceleration.accelerate(
137-
context,
138-
pathProperties.getLength().meters,
139-
endSpeed,
140-
overlayBuilder,
141-
-1.0,
142-
)
138+
try {
139+
EnvelopeAcceleration.accelerate(
140+
context,
141+
pathProperties.getLength().meters,
142+
endSpeed,
143+
overlayBuilder,
144+
-1.0,
145+
)
146+
} catch (e: OSRDError) {
147+
if (e.osrdErrorType == ErrorType.ImpossibleSimulationError) return null
148+
throw e
149+
}
143150
val speedupPart = speedupPartBuilder.build()
144151
val envelope = Envelope.make(speedupPart)
145152
val newTime = scaleAllowanceTime(graph, envelope.totalTime, pathProperties.getLength().distance)

0 commit comments

Comments
 (0)