Skip to content

Commit 0d8bdbc

Browse files
committed
core: add compulsory EnvelopeProfile attribute to EnvelopePart
1 parent 0cda4bd commit 0d8bdbc

File tree

18 files changed

+152
-119
lines changed

18 files changed

+152
-119
lines changed

core/envelope-sim/src/main/java/fr/sncf/osrd/envelope/EnvelopeSpeedCap.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
11
package fr.sncf.osrd.envelope;
22

33
import fr.sncf.osrd.envelope.part.EnvelopePartBuilder;
4+
import fr.sncf.osrd.envelope_sim.EnvelopeProfile;
45
import fr.sncf.osrd.envelope_utils.CmpOperator;
6+
import java.util.Collection;
7+
import java.util.HashSet;
58

69
public class EnvelopeSpeedCap {
710
/** Adds a global speed limit to an envelope */
811
public static Envelope from(
912
Envelope base,
10-
Iterable<EnvelopeAttr> attrs,
13+
Collection<EnvelopeAttr> attrs,
1114
double speedLimit
1215
) {
1316
var cursor = new EnvelopeCursor(base, false);
1417
var builder = OverlayEnvelopeBuilder.forward(base);
18+
var envelopeAttrs = new HashSet<>(attrs);
19+
envelopeAttrs.add(EnvelopeProfile.CONSTANT_SPEED);
1520
while (cursor.findSpeed(speedLimit, CmpOperator.STRICTLY_HIGHER)) {
1621
var startPos = cursor.getPosition();
1722

1823
var partBuilder = new EnvelopePartBuilder();
19-
partBuilder.setAttrs(attrs);
24+
partBuilder.setAttrs(envelopeAttrs);
2025
partBuilder.initEnvelopePart(startPos, speedLimit, 1);
2126

2227
var hasNotReachedEnd = cursor.findSpeed(speedLimit, CmpOperator.STRICTLY_LOWER);

core/envelope-sim/src/main/java/fr/sncf/osrd/envelope/part/EnvelopePart.java

+2-13
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import fr.sncf.osrd.envelope.EnvelopeAttr;
88
import fr.sncf.osrd.envelope.EnvelopePhysics;
99
import fr.sncf.osrd.envelope.SearchableEnvelope;
10+
import fr.sncf.osrd.envelope_sim.EnvelopeProfile;
1011
import fr.sncf.osrd.envelope_utils.ExcludeFromGeneratedCodeCoverage;
1112
import java.util.Arrays;
1213
import java.util.Collections;
@@ -106,19 +107,6 @@ public static EnvelopePart generateTimes(
106107
);
107108
}
108109

109-
/** Creates an envelope part by generating step times from speeds and positions */
110-
public static EnvelopePart generateTimes(
111-
double[] positions,
112-
double[] speeds
113-
) {
114-
return new EnvelopePart(
115-
new HashMap<>(),
116-
positions,
117-
speeds,
118-
computeTimes(positions, speeds)
119-
);
120-
}
121-
122110
// endregion
123111

124112
// region ATTRS
@@ -165,6 +153,7 @@ public Map<Class<? extends EnvelopeAttr>, EnvelopeAttr> getAttrs() {
165153
* (which should be avoided when possible) */
166154
private void runSanityChecks() {
167155
assert attrs != null : "missing attributes";
156+
assert hasAttr(EnvelopeProfile.class) : "missing EnvelopeProfile attribute";
168157
assert positions.length > 0 : "attempted to create an empty EnvelopePart";
169158
assert positions.length == speeds.length : "there must be the same number of point and speeds";
170159
assert timeDeltas.length == positions.length - 1 : "there must be as many timeDeltas as gaps between points";

core/envelope-sim/src/main/java/fr/sncf/osrd/envelope_sim/allowances/AbstractAllowanceWithRanges.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import fr.sncf.osrd.envelope.part.constraints.EnvelopeConstraint;
1515
import fr.sncf.osrd.envelope.part.constraints.EnvelopePartConstraint;
1616
import fr.sncf.osrd.envelope.part.constraints.PositionConstraint;
17+
import fr.sncf.osrd.envelope_sim.EnvelopeProfile;
1718
import fr.sncf.osrd.envelope_sim.EnvelopeSimContext;
1819
import fr.sncf.osrd.envelope_sim.PhysicsRollingStock;
1920
import fr.sncf.osrd.envelope_sim.allowances.utils.AllowanceRange;
@@ -157,7 +158,7 @@ private Envelope[] computeAllowanceRegion(Envelope envelopeRegion, EnvelopeSimCo
157158
var range = ranges.get(i);
158159
var percentage = range.value.getAllowanceRatio(
159160
envelopeRegion.getTimeBetween(range.beginPos, range.endPos),
160-
range.beginPos - range.endPos
161+
range.endPos - range.beginPos
161162
);
162163
rangePercentages[i] = new RangePercentage(range, percentage);
163164
}
@@ -401,6 +402,7 @@ private EnvelopePart computeLeftJunction(Envelope envelopeSection,
401402
EnvelopeDeceleration.decelerate(
402403
context, envelopeSection.getBeginPos(), imposedBeginSpeed, constrainedBuilder, 1
403404
);
405+
partBuilder.setAttr(EnvelopeProfile.BRAKING);
404406
lastIntersection = constrainedBuilder.lastIntersection;
405407
} else if (imposedBeginSpeed < envelopeSection.getBeginSpeed()) {
406408
constraints.add(new EnvelopeConstraint(envelopeTarget, CEILING));
@@ -412,6 +414,7 @@ private EnvelopePart computeLeftJunction(Envelope envelopeSection,
412414
EnvelopeAcceleration.accelerate(
413415
context, envelopeSection.getBeginPos(), imposedBeginSpeed, constrainedBuilder, 1
414416
);
417+
partBuilder.setAttr(EnvelopeProfile.ACCELERATING);
415418
lastIntersection = constrainedBuilder.lastIntersection;
416419
}
417420
if (lastIntersection == 0) {
@@ -449,6 +452,7 @@ private EnvelopePart computeRightJunction(Envelope envelopeSection,
449452
EnvelopeAcceleration.accelerate(
450453
context, envelopeSection.getEndPos(), imposedEndSpeed, constrainedBuilder, -1
451454
);
455+
partBuilder.setAttr(EnvelopeProfile.ACCELERATING);
452456
lastIntersection = constrainedBuilder.lastIntersection;
453457
} else if (imposedEndSpeed < envelopeSection.getEndSpeed()) {
454458
constraints.add(new EnvelopeConstraint(envelopeTarget, CEILING));
@@ -459,6 +463,7 @@ private EnvelopePart computeRightJunction(Envelope envelopeSection,
459463
EnvelopeDeceleration.decelerate(
460464
context, envelopeSection.getEndPos(), imposedEndSpeed, constrainedBuilder, -1
461465
);
466+
partBuilder.setAttr(EnvelopeProfile.BRAKING);
462467
lastIntersection = constrainedBuilder.lastIntersection;
463468
}
464469
if (lastIntersection == 0) {

core/envelope-sim/src/main/java/fr/sncf/osrd/envelope_sim/allowances/mareco_impl/CoastingGenerator.java

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public static EnvelopePart coastFromEnd(
5252

5353
// coast backwards from the end position until the base curve is met
5454
var backwardPartBuilder = new EnvelopePartBuilder();
55+
backwardPartBuilder.setAttr(EnvelopeProfile.COASTING);
5556
var constrainedBuilder = new ConstrainedEnvelopePartBuilder(
5657
backwardPartBuilder,
5758
new SpeedConstraint(0, FLOOR),

core/envelope-sim/src/test/java/fr/sncf/osrd/envelope/ConstraintBuilderTest.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55

66
import fr.sncf.osrd.envelope.EnvelopeTestUtils.TestAttr;
77
import fr.sncf.osrd.envelope.part.ConstrainedEnvelopePartBuilder;
8-
import fr.sncf.osrd.envelope.part.EnvelopePart;
98
import fr.sncf.osrd.envelope.part.EnvelopePartBuilder;
109
import fr.sncf.osrd.envelope.part.EnvelopePartConsumer;
1110
import fr.sncf.osrd.envelope.part.constraints.EnvelopeConstraint;
1211
import fr.sncf.osrd.envelope.part.constraints.PositionConstraint;
1312
import fr.sncf.osrd.envelope.part.constraints.SpeedConstraint;
13+
import fr.sncf.osrd.envelope_sim.EnvelopeProfile;
1414
import org.junit.jupiter.api.Test;
1515
import java.util.List;
1616

@@ -27,13 +27,11 @@ public class ConstraintBuilderTest {
2727
// 0 1 2 3 4 5 6 7 8 9 10
2828

2929
private ConstrainedEnvelopePartBuilder wrap(EnvelopePartConsumer sink) {
30-
var envelopeFloor = Envelope.make(EnvelopePart.generateTimes(
31-
List.of(),
30+
var envelopeFloor = Envelope.make(EnvelopeTestUtils.generateTimes(
3231
new double[] {0, 3, 4, 5, 6, 7, 10},
3332
new double[] {0, 0, 1, 2, 1, 0, 0}
3433
));
35-
var envelopeCeiling = Envelope.make(EnvelopePart.generateTimes(
36-
List.of(),
34+
var envelopeCeiling = Envelope.make(EnvelopeTestUtils.generateTimes(
3735
new double[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
3836
new double[] {2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2}
3937
));
@@ -53,6 +51,7 @@ void testAttrs() {
5351
var builder = wrap(partBuilder);
5452
builder.setAttrs(List.of(TestAttr.A));
5553
builder.setAttr(TestAttr.B);
54+
builder.setAttr(EnvelopeProfile.ACCELERATING);
5655
assertTrue(builder.initEnvelopePart(2, 0, 1));
5756
assertFalse(builder.addStep(5, 1));
5857
var part = partBuilder.build();

core/envelope-sim/src/test/java/fr/sncf/osrd/envelope/EnvelopeBuilderTest.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,17 @@
22

33
import static org.junit.jupiter.api.Assertions.assertTrue;
44

5-
import fr.sncf.osrd.envelope.part.EnvelopePart;
65
import org.junit.jupiter.api.Test;
76

87
public class EnvelopeBuilderTest {
98
@Test
109
public void testEnvelopeBuilder() {
1110
var builder = new EnvelopeBuilder();
12-
builder.addPart(EnvelopePart.generateTimes(
11+
builder.addPart(EnvelopeTestUtils.generateTimes(
1312
new double[]{0, 1},
1413
new double[]{10, 20}
1514
));
16-
builder.addPart(EnvelopePart.generateTimes(
15+
builder.addPart(EnvelopeTestUtils.generateTimes(
1716
new double[]{1, 2},
1817
new double[]{20, 30}
1918
));
@@ -24,11 +23,11 @@ public void testEnvelopeBuilder() {
2423
@Test
2524
public void testEnvelopeBuilderReversed() {
2625
var builder = new EnvelopeBuilder();
27-
builder.addPart(EnvelopePart.generateTimes(
26+
builder.addPart(EnvelopeTestUtils.generateTimes(
2827
new double[]{1, 2},
2928
new double[]{20, 30}
3029
));
31-
builder.addPart(EnvelopePart.generateTimes(
30+
builder.addPart(EnvelopeTestUtils.generateTimes(
3231
new double[]{0, 1},
3332
new double[]{10, 20}
3433
));

core/envelope-sim/src/test/java/fr/sncf/osrd/envelope/EnvelopeCursorTest.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,20 @@
22

33
import static org.junit.jupiter.api.Assertions.*;
44

5-
import fr.sncf.osrd.envelope.part.EnvelopePart;
65
import org.junit.jupiter.api.Test;
76

87

98
public class EnvelopeCursorTest {
109
public static final Envelope FLAT_ENVELOPE = Envelope.make(
11-
EnvelopePart.generateTimes(
10+
EnvelopeTestUtils.generateTimes(
1211
new double[]{1, 3, 4},
1312
new double[]{4, 4, 4}
1413
),
15-
EnvelopePart.generateTimes(
14+
EnvelopeTestUtils.generateTimes(
1615
new double[]{4, 6},
1716
new double[]{4, 4}
1817
),
19-
EnvelopePart.generateTimes(
18+
EnvelopeTestUtils.generateTimes(
2019
new double[]{6, 8, 10},
2120
new double[]{4, 4, 4}
2221
)

0 commit comments

Comments
 (0)