From 839f7ef19c15db8d594fcd147785f339730d81b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre-Etienne=20Bougu=C3=A9?= Date: Wed, 3 Jul 2024 14:48:16 +0200 Subject: [PATCH] core: fix too drastic continuity test on speed envelopes This case can happen after rounding errors when allowance is processed. fix #7901 --- .../java/fr/sncf/osrd/envelope/Envelope.java | 4 +++- .../osrd/envelope/EnvelopeBuilderTest.java | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/core/envelope-sim/src/main/java/fr/sncf/osrd/envelope/Envelope.java b/core/envelope-sim/src/main/java/fr/sncf/osrd/envelope/Envelope.java index a6fa35d2a61..caa9a833721 100644 --- a/core/envelope-sim/src/main/java/fr/sncf/osrd/envelope/Envelope.java +++ b/core/envelope-sim/src/main/java/fr/sncf/osrd/envelope/Envelope.java @@ -5,6 +5,7 @@ import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import fr.sncf.osrd.envelope.part.EnvelopePart; +import fr.sncf.osrd.envelope_sim.TrainPhysicsIntegrator; import fr.sncf.osrd.reporting.exceptions.ErrorType; import fr.sncf.osrd.reporting.exceptions.OSRDError; import java.util.ArrayList; @@ -51,7 +52,8 @@ private Envelope(EnvelopePart[] parts) { for (int i = 0; i < parts.length - 1; i++) { if (parts[i].getEndPos() != parts[i + 1].getBeginPos()) throw new OSRDError(ErrorType.EnvelopePartsNotContiguous); - if (parts[i].getEndSpeed() != parts[i + 1].getBeginSpeed()) continuous = false; + if (!TrainPhysicsIntegrator.areSpeedsEqual(parts[i].getEndSpeed(), parts[i + 1].getBeginSpeed())) + continuous = false; } // find the minimum and maximum speeds for all envelope parts diff --git a/core/envelope-sim/src/test/java/fr/sncf/osrd/envelope/EnvelopeBuilderTest.java b/core/envelope-sim/src/test/java/fr/sncf/osrd/envelope/EnvelopeBuilderTest.java index bfc928bcc11..57a991acd83 100644 --- a/core/envelope-sim/src/test/java/fr/sncf/osrd/envelope/EnvelopeBuilderTest.java +++ b/core/envelope-sim/src/test/java/fr/sncf/osrd/envelope/EnvelopeBuilderTest.java @@ -1,5 +1,6 @@ package fr.sncf.osrd.envelope; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; @@ -14,6 +15,25 @@ public void testEnvelopeBuilder() { assertTrue(env.continuous); } + @Test + public void testEnvelopeBuilderEpsilonSpeedContinuity() { + // One example is that allowance can generate rounding errors + var builder = new EnvelopeBuilder(); + builder.addPart(EnvelopeTestUtils.generateTimes(new double[] {0, 1}, new double[] {10, 20})); + builder.addPart(EnvelopeTestUtils.generateTimes(new double[] {1, 2}, new double[] {20.0000001, 30})); + var env = builder.build(); + assertTrue(env.continuous); + } + + @Test + public void testEnvelopeBuilderEpsilonSpeedDiscontinuity() { + var builder = new EnvelopeBuilder(); + builder.addPart(EnvelopeTestUtils.generateTimes(new double[] {0, 1}, new double[] {10, 20})); + builder.addPart(EnvelopeTestUtils.generateTimes(new double[] {1, 2}, new double[] {20.001, 30})); + var env = builder.build(); + assertFalse(env.continuous); + } + @Test public void testEnvelopeBuilderReversed() { var builder = new EnvelopeBuilder();