Skip to content

Commit 13b72b1

Browse files
committed
wip move subPhysicsPath to its own file
1 parent e317513 commit 13b72b1

File tree

4 files changed

+111
-84
lines changed

4 files changed

+111
-84
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package fr.sncf.osrd.path.implementations
2+
3+
import com.google.common.collect.BoundType
4+
import com.google.common.collect.ImmutableRangeMap
5+
import com.google.common.collect.Range
6+
import com.google.common.collect.RangeMap
7+
import fr.sncf.osrd.path.interfaces.Electrification
8+
import fr.sncf.osrd.path.interfaces.PhysicsPath
9+
import fr.sncf.osrd.utils.entries
10+
11+
class SubPhysicsPath(val begin: Double, val end: Double, val path: PhysicsPath) : PhysicsPath {
12+
override val length: Double
13+
get() = end - begin
14+
15+
override fun getAverageGrade(begin: Double, end: Double): Double {
16+
require(end <= this.end)
17+
require(begin >= 0)
18+
val newBegin = begin + this.begin
19+
val newEnd = end + this.begin
20+
return path.getAverageGrade(newBegin, newEnd)
21+
}
22+
23+
override fun getMinGrade(begin: Double, end: Double): Double {
24+
require(end <= this.end)
25+
require(begin >= 0)
26+
val newBegin = begin + this.begin
27+
val newEnd = end + this.begin
28+
return path.getMinGrade(newBegin, newEnd)
29+
}
30+
31+
private fun makeRange(
32+
lower: Double,
33+
upper: Double,
34+
type: Pair<BoundType, BoundType>,
35+
): Range<Double> {
36+
return when (type) {
37+
Pair(BoundType.OPEN, BoundType.OPEN) -> Range.open(lower, upper)
38+
Pair(BoundType.OPEN, BoundType.CLOSED) -> Range.openClosed(lower, upper)
39+
Pair(BoundType.CLOSED, BoundType.OPEN) -> Range.closedOpen(lower, upper)
40+
Pair(BoundType.CLOSED, BoundType.CLOSED) -> Range.closed(lower, upper)
41+
else -> throw IllegalArgumentException("Unknown range type: $type")
42+
}
43+
}
44+
45+
override fun getElectrificationMap(
46+
basePowerClass: String?,
47+
powerRestrictionMap: RangeMap<Double, String>?,
48+
powerRestrictionToPowerClass: Map<String, String>?,
49+
ignoreElectricalProfiles: Boolean,
50+
): ImmutableRangeMap<Double, Electrification> {
51+
val powerRestrictionMapBuilder = ImmutableRangeMap.Builder<Double, String>()
52+
powerRestrictionMap?.entries?.forEach { (k, v) ->
53+
powerRestrictionMapBuilder.put(
54+
makeRange(
55+
k.lowerEndpoint() + begin,
56+
k.upperEndpoint() + begin,
57+
Pair(k.lowerBoundType(), k.upperBoundType()),
58+
),
59+
v,
60+
)
61+
}
62+
val newPowerRestrictionMap = powerRestrictionMapBuilder.build()
63+
val electrificationMap =
64+
path.getElectrificationMap(
65+
basePowerClass,
66+
newPowerRestrictionMap,
67+
powerRestrictionToPowerClass,
68+
ignoreElectricalProfiles,
69+
)
70+
val newElectrificationMapBuilder = ImmutableRangeMap.Builder<Double, Electrification>()
71+
electrificationMap.entries.forEach { (k, v) ->
72+
newElectrificationMapBuilder.put(
73+
makeRange(
74+
k.lowerEndpoint() - begin,
75+
k.upperEndpoint() - begin,
76+
Pair(k.lowerBoundType(), k.upperBoundType()),
77+
),
78+
v,
79+
)
80+
}
81+
return newElectrificationMapBuilder.build()
82+
}
83+
}

core/src/main/kotlin/fr/sncf/osrd/standalone_sim/ScheduleMetadataExtractor.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,9 @@ fun zoneOccupationChangeEvents(
668668
trainPath
669669
.getBacktrackLocations()
670670
.asSequence()
671-
.zipWithNext { current, next -> current < next - rollingStocks.get(next.distance)!!.length.meters }
671+
.zipWithNext { current, next ->
672+
current < next - rollingStocks.get(next.distance)!!.length.meters
673+
}
672674
.all { it }
673675
)
674676

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

Lines changed: 1 addition & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package fr.sncf.osrd.stdcm.graph
22

3-
import com.google.common.collect.BoundType
4-
import com.google.common.collect.ImmutableRangeMap
5-
import com.google.common.collect.Range
6-
import com.google.common.collect.RangeMap
73
import com.squareup.moshi.Json
84
import fr.sncf.osrd.api.stdcm.OutputSimDebugData
95
import fr.sncf.osrd.api.stdcm.generatePartialDebugData
@@ -18,7 +14,7 @@ import fr.sncf.osrd.envelope_sim.pipelines.SimStop
1814
import fr.sncf.osrd.envelope_sim.pipelines.maxEffortEnvelopeFrom
1915
import fr.sncf.osrd.envelope_sim.pipelines.maxSpeedEnvelopeFrom
2016
import fr.sncf.osrd.envelope_sim_infra.computeMRSP
21-
import fr.sncf.osrd.path.interfaces.Electrification
17+
import fr.sncf.osrd.path.implementations.SubPhysicsPath
2218
import fr.sncf.osrd.path.interfaces.PhysicsPath
2319
import fr.sncf.osrd.path.interfaces.TrainPath
2420
import fr.sncf.osrd.railjson.schema.rollingstock.Comfort
@@ -31,7 +27,6 @@ import fr.sncf.osrd.stdcm.preprocessing.interfaces.BlockAvailabilityInterface
3127
import fr.sncf.osrd.train.RollingStock
3228
import fr.sncf.osrd.train.TrainStop
3329
import fr.sncf.osrd.utils.areSpeedsEqual
34-
import fr.sncf.osrd.utils.entries
3530
import fr.sncf.osrd.utils.units.Distance
3631
import fr.sncf.osrd.utils.units.Length
3732
import fr.sncf.osrd.utils.units.Offset
@@ -66,80 +61,6 @@ data class FinalEnvelopeResult(
6661
val engineeringAllowanceRanges: List<EngineeringAllowanceRange>,
6762
)
6863

69-
class SubPhysicsPath(val begin: Double, val end: Double, val path: PhysicsPath) : PhysicsPath {
70-
override val length: Double
71-
get() = end - begin
72-
73-
override fun getAverageGrade(begin: Double, end: Double): Double {
74-
require(end <= this.end)
75-
require(begin >= 0)
76-
val newBegin = begin + this.begin
77-
val newEnd = end + this.begin
78-
return path.getAverageGrade(newBegin, newEnd)
79-
}
80-
81-
override fun getMinGrade(begin: Double, end: Double): Double {
82-
require(end <= this.end)
83-
require(begin >= 0)
84-
val newBegin = begin + this.begin
85-
val newEnd = end + this.begin
86-
return path.getMinGrade(newBegin, newEnd)
87-
}
88-
89-
private fun makeRange(
90-
lower: Double,
91-
upper: Double,
92-
type: Pair<BoundType, BoundType>,
93-
): Range<Double> {
94-
return when (type) {
95-
Pair(BoundType.OPEN, BoundType.OPEN) -> Range.open(lower, upper)
96-
Pair(BoundType.OPEN, BoundType.CLOSED) -> Range.openClosed(lower, upper)
97-
Pair(BoundType.CLOSED, BoundType.OPEN) -> Range.closedOpen(lower, upper)
98-
Pair(BoundType.CLOSED, BoundType.CLOSED) -> Range.closed(lower, upper)
99-
else -> throw IllegalArgumentException("Unknown range type: $type")
100-
}
101-
}
102-
103-
override fun getElectrificationMap(
104-
basePowerClass: String?,
105-
powerRestrictionMap: RangeMap<Double, String>?,
106-
powerRestrictionToPowerClass: Map<String, String>?,
107-
ignoreElectricalProfiles: Boolean,
108-
): ImmutableRangeMap<Double, Electrification> {
109-
val powerRestrictionMapBuilder = ImmutableRangeMap.Builder<Double, String>()
110-
powerRestrictionMap?.entries?.forEach { (k, v) ->
111-
powerRestrictionMapBuilder.put(
112-
makeRange(
113-
k.lowerEndpoint() + begin,
114-
k.upperEndpoint() + begin,
115-
Pair(k.lowerBoundType(), k.upperBoundType()),
116-
),
117-
v,
118-
)
119-
}
120-
val newPowerRestrictionMap = powerRestrictionMapBuilder.build()
121-
val electrificationMap =
122-
path.getElectrificationMap(
123-
basePowerClass,
124-
newPowerRestrictionMap,
125-
powerRestrictionToPowerClass,
126-
ignoreElectricalProfiles,
127-
)
128-
val newElectrificationMapBuilder = ImmutableRangeMap.Builder<Double, Electrification>()
129-
electrificationMap.entries.forEach { (k, v) ->
130-
newElectrificationMapBuilder.put(
131-
makeRange(
132-
k.lowerEndpoint() - begin,
133-
k.upperEndpoint() - begin,
134-
Pair(k.lowerBoundType(), k.upperBoundType()),
135-
),
136-
v,
137-
)
138-
}
139-
return newElectrificationMapBuilder.build()
140-
}
141-
}
142-
14364
/**
14465
* Build the final envelope, this time without any approximation. Apply the allowances properly. The
14566
* simulations can be approximations up to this point (when exploring the graph), this is where we

core/src/test/kotlin/fr/sncf/osrd/backtracks/BacktrackTests.kt

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,14 @@ class BacktrackTests {
383383
@Test
384384
fun testZoneOccupationBacktrackOverNothing() {
385385
val path = buildPathBacktrackingOverNothing(infra, rollingStock.length.meters)
386-
val rollingStocks = distanceRangeMapOf(DistanceRangeMap.RangeMapEntry(0.meters, path.length.meters, rollingStock as PhysicsRollingStock))
386+
val rollingStocks =
387+
distanceRangeMapOf(
388+
DistanceRangeMap.RangeMapEntry(
389+
0.meters,
390+
path.length.meters,
391+
rollingStock as PhysicsRollingStock,
392+
)
393+
)
387394
val stops = listOf(TrainStop(9700.0, 60.0, SHORT_SLIP_STOP), TrainStop(18700.0, 0.0, OPEN))
388395
val envelope = computeMrspWithStops(path, stops)
389396
val zoneOccupationChangeEvents = zoneOccupationChangeEvents(path, envelope, rollingStocks)
@@ -432,7 +439,14 @@ class BacktrackTests {
432439
@Test
433440
fun testZoneOccupationBacktrackingOverRouteDelimiter() {
434441
val path = buildPathBacktrackingOverRouteDelimiter(infra, rollingStock.length.meters)
435-
val rollingStocks = distanceRangeMapOf(DistanceRangeMap.RangeMapEntry(0.meters, path.length.meters, rollingStock as PhysicsRollingStock))
442+
val rollingStocks =
443+
distanceRangeMapOf(
444+
DistanceRangeMap.RangeMapEntry(
445+
0.meters,
446+
path.length.meters,
447+
rollingStock as PhysicsRollingStock,
448+
)
449+
)
436450
val stops = listOf(TrainStop(8000.0, 60.0, SHORT_SLIP_STOP), TrainStop(15300.0, 0.0, OPEN))
437451
val envelope = computeMrspWithStops(path, stops)
438452
val zoneOccupationChangeEvents = zoneOccupationChangeEvents(path, envelope, rollingStocks)
@@ -463,7 +477,14 @@ class BacktrackTests {
463477
fun testZoneOccupationBacktrackShortlyAfterRouteDelimiter() {
464478
val path =
465479
buildPathBacktrackingShortlyAfterRouteDelimiter(infra, rollingStock.length.meters)
466-
val rollingStocks = distanceRangeMapOf(DistanceRangeMap.RangeMapEntry(0.meters, path.length.meters, rollingStock as PhysicsRollingStock))
480+
val rollingStocks =
481+
distanceRangeMapOf(
482+
DistanceRangeMap.RangeMapEntry(
483+
0.meters,
484+
path.length.meters,
485+
rollingStock as PhysicsRollingStock,
486+
)
487+
)
467488
val stops = listOf(TrainStop(8400.0, 60.0, STOP), TrainStop(16400.0, 0.0, OPEN))
468489
val envelope = computeMrspWithStops(path, stops)
469490
val zoneOccupationChangeEvents = zoneOccupationChangeEvents(path, envelope, rollingStocks)

0 commit comments

Comments
 (0)