Skip to content

Commit

Permalink
core: consideration of review
Browse files Browse the repository at this point in the history
also makes incompatibleGaugeRanges consistent with the rest (nest range)
  • Loading branch information
bougue-pe committed Jul 12, 2024
1 parent 72d64ce commit 65f3fe1
Show file tree
Hide file tree
Showing 8 changed files with 146 additions and 135 deletions.
Original file line number Diff line number Diff line change
@@ -1,22 +1,8 @@
package fr.sncf.osrd.signaling.impl

import fr.sncf.osrd.signaling.BlockDiagReporter
import fr.sncf.osrd.signaling.MovementAuthorityView
import fr.sncf.osrd.signaling.SigBlock
import fr.sncf.osrd.signaling.SigSystemManager
import fr.sncf.osrd.signaling.SignalDiagReporter
import fr.sncf.osrd.signaling.SignalingTrainState
import fr.sncf.osrd.signaling.SpeedLimitView
import fr.sncf.osrd.sim_infra.api.SigParameters
import fr.sncf.osrd.sim_infra.api.SigParametersSchema
import fr.sncf.osrd.sim_infra.api.SigSettings
import fr.sncf.osrd.sim_infra.api.SigSettingsSchema
import fr.sncf.osrd.sim_infra.api.SigState
import fr.sncf.osrd.sim_infra.api.SigStateSchema
import fr.sncf.osrd.signaling.*
import fr.sncf.osrd.sim_infra.api.*
import fr.sncf.osrd.sim_infra.api.SignalDriver
import fr.sncf.osrd.sim_infra.api.SignalDriverId
import fr.sncf.osrd.sim_infra.api.SignalingSystem
import fr.sncf.osrd.sim_infra.api.SignalingSystemId
import fr.sncf.osrd.utils.indexing.StaticIdxSpace

class MockSigSystemManager(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,8 @@
package fr.sncf.osrd.signaling.impl

import fr.sncf.osrd.signaling.BlockDiagReporter
import fr.sncf.osrd.signaling.MovementAuthorityView
import fr.sncf.osrd.signaling.SigBlock
import fr.sncf.osrd.signaling.SigSystemManager
import fr.sncf.osrd.signaling.SignalDiagReporter
import fr.sncf.osrd.signaling.SignalingSystemDriver
import fr.sncf.osrd.signaling.SignalingTrainState
import fr.sncf.osrd.signaling.SpeedLimitView
import fr.sncf.osrd.sim_infra.api.SigParameters
import fr.sncf.osrd.sim_infra.api.SigParametersSchema
import fr.sncf.osrd.sim_infra.api.SigSettings
import fr.sncf.osrd.sim_infra.api.SigSettingsSchema
import fr.sncf.osrd.sim_infra.api.SigState
import fr.sncf.osrd.sim_infra.api.SigStateSchema
import fr.sncf.osrd.signaling.*
import fr.sncf.osrd.sim_infra.api.*
import fr.sncf.osrd.sim_infra.api.SignalDriver
import fr.sncf.osrd.sim_infra.api.SignalDriverId
import fr.sncf.osrd.sim_infra.api.SignalingSystem
import fr.sncf.osrd.sim_infra.api.SignalingSystemId
import fr.sncf.osrd.sim_infra.api.findSignalingSystemOrThrow
import fr.sncf.osrd.utils.indexing.StaticIdxSpace
import fr.sncf.osrd.utils.indexing.StaticPool

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,7 @@ package fr.sncf.osrd.sim_infra.api
import fr.sncf.osrd.reporting.exceptions.OSRDError
import fr.sncf.osrd.sim_infra.impl.SignalParameters
import fr.sncf.osrd.utils.Direction
import fr.sncf.osrd.utils.indexing.DirStaticIdxList
import fr.sncf.osrd.utils.indexing.MutableStaticIdxArraySet
import fr.sncf.osrd.utils.indexing.StaticIdx
import fr.sncf.osrd.utils.indexing.StaticIdxList
import fr.sncf.osrd.utils.indexing.StaticIdxSpace
import fr.sncf.osrd.utils.indexing.mutableStaticIdxArrayListOf
import fr.sncf.osrd.utils.indexing.*
import fr.sncf.osrd.utils.units.Length
import fr.sncf.osrd.utils.units.OffsetList

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,14 +102,14 @@ fun <T> mergeDistanceRangeMaps(
* 'filter' map are not considered)
*/
fun <T, R> filterIntersection(
filtered: DistanceRangeMap<T>,
mapToFilter: DistanceRangeMap<T>,
filter: DistanceRangeMap<R>
): DistanceRangeMap<T> {
val res = distanceRangeMapOf<T>()
for (range in filter) {
val rangeFirst = filtered.clone()
rangeFirst.truncate(range.lower, range.upper)
res.putMany(rangeFirst.asList())
val filteredRange = mapToFilter.clone()
filteredRange.truncate(range.lower, range.upper)
res.putMany(filteredRange.asList())
}
return res
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fr.sncf.osrd.api.api_v2.pathfinding

import com.squareup.moshi.FromJson
import com.squareup.moshi.Json
import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.Moshi
Expand Down Expand Up @@ -67,13 +68,17 @@ class IncompatibleConstraintsPathResponse(
data class IncompatibleConstraints(
@Json(name = "incompatible_electrification_ranges")
val incompatibleElectrificationRanges: List<RangeValue<String>>,
@Json(name = "incompatible_gauge_ranges")
val incompatibleGaugeRanges: List<Range<TravelledPath>>,
@Json(name = "incompatible_gauge_ranges") val incompatibleGaugeRanges: List<RangeValue<String>>,
@Json(name = "incompatible_signaling_system_ranges")
val incompatibleSignalingSystemRanges: List<RangeValue<String>>
)

data class RangeValue<T>(val range: Range<TravelledPath>, val value: T)
data class RangeValue<T>(val range: Range<TravelledPath>, val value: T?) {
@FromJson
fun fromJson(range: Range<TravelledPath>): RangeValue<T> {
return RangeValue(range, null)
}
}

class PathfindingFailed(
@Json(name = "core_error") val coreError: OSRDError,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,14 @@ import fr.sncf.osrd.api.InfraManager
import fr.sncf.osrd.api.api_v2.TrackLocation
import fr.sncf.osrd.api.pathfinding.constraints.*
import fr.sncf.osrd.api.pathfinding.makePathProps
import fr.sncf.osrd.conflicts.TravelledPath
import fr.sncf.osrd.graph.*
import fr.sncf.osrd.graph.Pathfinding.EdgeLocation
import fr.sncf.osrd.railjson.schema.rollingstock.RJSLoadingGaugeType
import fr.sncf.osrd.reporting.exceptions.ErrorType
import fr.sncf.osrd.reporting.exceptions.OSRDError
import fr.sncf.osrd.reporting.warnings.DiagnosticRecorderImpl
import fr.sncf.osrd.sim_infra.api.*
import fr.sncf.osrd.utils.Direction
import fr.sncf.osrd.utils.DistanceRangeMap
import fr.sncf.osrd.utils.distanceRangeMapOf
import fr.sncf.osrd.utils.filterIntersection
import fr.sncf.osrd.utils.*
import fr.sncf.osrd.utils.indexing.*
import fr.sncf.osrd.utils.units.Distance
import fr.sncf.osrd.utils.units.Length
Expand Down Expand Up @@ -186,25 +182,43 @@ private fun buildIncompatibleConstraintsResponse(
}

val pathRanges = possiblePathWithoutErrorNoConstraints.ranges
val pathProps =
makePathProps(infra.rawInfra, infra.blockInfra, pathRanges.map { it.edge }, Offset.zero())

val elecConstraints = constraints.filterIsInstance<ElectrificationConstraints>()
assert(elecConstraints.size < 2)
val elecBlockedRangeValues =
getElecBlockedRangeValues(infra, pathRanges, elecConstraints.firstOrNull())
getConstraintsDistanceRange(
infra,
pathRanges,
pathProps.getElectrification(),
elecConstraints.firstOrNull()
)
.map { RangeValue(Pathfinding.Range(Offset(it.lower), Offset(it.upper)), it.value) }

val gaugeConstraints = constraints.filterIsInstance<LoadingGaugeConstraints>()
assert(gaugeConstraints.size < 2)
val gaugeBlockedRanges =
getGaugeBlockedRanges(infra, pathRanges, gaugeConstraints.firstOrNull())
getConstraintsDistanceRange(
infra,
pathRanges,
pathProps.getLoadingGauge(),
gaugeConstraints.firstOrNull()
)
.map { RangeValue<String>(Pathfinding.Range(Offset(it.lower), Offset(it.upper)), null) }

val signalingSystemConstraints = constraints.filterIsInstance<SignalingSystemConstraints>()
assert(signalingSystemConstraints.size < 2)
val blockList = pathRanges.map { it.edge }
val pathSignalingSystem = getPathSignalingSystems(infra, blockList)
val signalingSystemBlockedRangeValues =
getSignalingSystemBlockedRangeValues(
infra,
pathRanges,
signalingSystemConstraints.firstOrNull()
)
getConstraintsDistanceRange(
infra,
pathRanges,
pathSignalingSystem,
signalingSystemConstraints.firstOrNull()
)
.map { RangeValue(Pathfinding.Range(Offset(it.lower), Offset(it.upper)), it.value) }

if (
listOf(elecBlockedRangeValues, gaugeBlockedRanges, signalingSystemBlockedRangeValues).all {
Expand All @@ -224,68 +238,21 @@ private fun buildIncompatibleConstraintsResponse(
)
}

private fun getElecBlockedRangeValues(
infra: FullInfra,
pathRanges: List<Pathfinding.EdgeRange<BlockId, Block>>,
elecConstraint: ElectrificationConstraints?
): List<RangeValue<String>> {
if (elecConstraint == null) {
return listOf()
}

val travelledPathOffset = pathRanges.first().start.distance
val pathProps =
makePathProps(infra.rawInfra, infra.blockInfra, pathRanges.map { it.edge }, Offset.zero())
val blockedRanges = getBlockedRanges(infra, pathRanges, elecConstraint)

val pathElec = pathProps.getElectrification()
val filteredPathElec = filterIntersection(pathElec, blockedRanges)
filteredPathElec.shiftPositions(-travelledPathOffset)
return filteredPathElec.map {
RangeValue(Pathfinding.Range(Offset(it.lower), Offset(it.upper)), it.value)
}
}

private fun getGaugeBlockedRanges(
private fun <T> getConstraintsDistanceRange(
infra: FullInfra,
pathRanges: List<Pathfinding.EdgeRange<BlockId, Block>>,
gaugeConstraint: LoadingGaugeConstraints?
): List<Pathfinding.Range<TravelledPath>> {
if (gaugeConstraint == null) {
return listOf()
pathConstrainedValues: DistanceRangeMap<T>,
constraint: PathfindingConstraint<Block>?
): DistanceRangeMap<T> {
if (constraint == null) {
return distanceRangeMapOf()
}

val blockedRanges = getBlockedRanges(infra, pathRanges, constraint)
val filteredRangeValues = filterIntersection(pathConstrainedValues, blockedRanges)
val travelledPathOffset = pathRanges.first().start.distance
val pathProps =
makePathProps(infra.rawInfra, infra.blockInfra, pathRanges.map { it.edge }, Offset.zero())
val blockedRanges = getBlockedRanges(infra, pathRanges, gaugeConstraint)

// Split response on different gauges (even if no value is associated)
val pathGauge = pathProps.getLoadingGauge()
val filteredPathGauge = filterIntersection(pathGauge, blockedRanges)
filteredPathGauge.shiftPositions(-travelledPathOffset)
return filteredPathGauge.map { Pathfinding.Range(Offset(it.lower), Offset(it.upper)) }
}

private fun getSignalingSystemBlockedRangeValues(
infra: FullInfra,
pathRanges: List<Pathfinding.EdgeRange<BlockId, Block>>,
signalingSystemConstraint: SignalingSystemConstraints?
): List<RangeValue<String>> {
if (signalingSystemConstraint == null) {
return listOf()
}

val travelledPathOffset = pathRanges.first().start.distance
val blockList = pathRanges.map { it.edge }
val blockedRanges = getBlockedRanges(infra, pathRanges, signalingSystemConstraint)

val pathSignalingSystem = getPathSignalingSystems(infra, blockList)
val filteredPathSignalingSystem = filterIntersection(pathSignalingSystem, blockedRanges)
filteredPathSignalingSystem.shiftPositions(-travelledPathOffset)
return filteredPathSignalingSystem.map {
RangeValue(Pathfinding.Range(Offset(it.lower), Offset(it.upper)), it.value)
}
filteredRangeValues.shiftPositions(-travelledPathOffset)
return filteredRangeValues
}

private fun getBlockedRanges(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,7 @@ import com.google.common.collect.TreeRangeSet
import fr.sncf.osrd.api.pathfinding.makePathProps
import fr.sncf.osrd.graph.Pathfinding
import fr.sncf.osrd.graph.PathfindingConstraint
import fr.sncf.osrd.sim_infra.api.Block
import fr.sncf.osrd.sim_infra.api.BlockId
import fr.sncf.osrd.sim_infra.api.BlockInfra
import fr.sncf.osrd.sim_infra.api.PathProperties
import fr.sncf.osrd.sim_infra.api.RawSignalingInfra
import fr.sncf.osrd.sim_infra.api.*
import fr.sncf.osrd.utils.DistanceRangeMap
import fr.sncf.osrd.utils.units.Distance
import fr.sncf.osrd.utils.units.Offset
Expand Down
Loading

0 comments on commit 65f3fe1

Please sign in to comment.