Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

core: implement path properties endpoint for time table v2 #7255

Merged
merged 3 commits into from
Apr 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions core/kt-osrd-rjs-parser/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ dependencies {
implementation libs.kotlin.logging

api project(':kt-osrd-sim-infra')
api project(":osrd-railjson")
api project(":kt-osrd-utils")
testImplementation libs.kotlin.test

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -202,11 +202,23 @@ private fun getBlockedGauge(
}
}
}
res.put(begin.meters, end.meters, fromAllowedSet(allowedTypes))
res.put(begin.meters, end.meters, buildBlockedGaugeTypesLoadingConstraint(allowedTypes))
}
return res
}

private fun buildBlockedGaugeTypesLoadingConstraint(
allowedTypes: Set<RJSLoadingGaugeType>
): LoadingGaugeConstraint {
val blockedTypes = mutableStaticIdxArraySetOf<LoadingGaugeType>()
for (gaugeType in RJSLoadingGaugeType.entries) {
if (!allowedTypes.contains(gaugeType)) {
blockedTypes.add(StaticIdx(gaugeType.ordinal.toUInt()))
}
}
return LoadingGaugeConstraint(blockedTypes)
}

private fun buildCompatibleGaugeTypesMap(): Map<RJSLoadingGaugeType, Set<RJSLoadingGaugeType>> {
val compatibleGaugeType = hashMapOf<RJSLoadingGaugeType, Set<RJSLoadingGaugeType>>()
for (gaugeType in enumValues<RJSLoadingGaugeType>()) {
Expand Down Expand Up @@ -754,12 +766,31 @@ fun parseRJSInfra(rjsInfra: RJSInfra): RawInfra {
for (opPart in operationalPoint.parts) {
// ignore duplicates
if (distinctParts.contains(opPart)) continue

distinctParts.add(opPart)

val operationalPointId = operationalPoint.id
val trackSectionName = opPart.track
val trackSectionOffset = Offset<TrackSection>(opPart.position.meters)
val props = mutableMapOf<String, String>()
if (operationalPoint.extensions?.identifier != null) {
val identifier = operationalPoint.extensions!!.identifier!!
props["identifier"] = identifier.name
props["uic"] = identifier.uic.toString()
}
if (operationalPoint.extensions?.sncf != null) {
val sncf = operationalPoint.extensions!!.sncf!!
props["ci"] = sncf.ci.toString()
props["ch"] = sncf.ch
props["chShortLabel"] = sncf.chShortLabel
props["chLongLabel"] = sncf.chLongLabel
props["trigram"] = sncf.trigram
}
if (opPart.extensions?.sncf != null) props["kp"] = opPart.extensions!!.sncf!!.kp
builder.operationalPointPart(
operationalPoint.id,
opPart.track,
Offset(opPart.position.meters)
operationalPointId,
trackSectionName,
trackSectionOffset,
props
)
}
}
Expand Down
2 changes: 1 addition & 1 deletion core/kt-osrd-sim-infra/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ dependencies {
implementation project(path: ':osrd-geom')
ksp project(':kt-fast-collections-generator')

// WARNING: this module should not depend on osrd-railjson
api project(":kt-osrd-utils")
api project(":osrd-railjson")
api project(":osrd-reporting")
implementation libs.kotlin.stdlib
implementation libs.kotlin.logging
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package fr.sncf.osrd.sim_infra.api

import fr.sncf.osrd.railjson.schema.rollingstock.RJSLoadingGaugeType
import fr.sncf.osrd.utils.indexing.StaticIdx
import fr.sncf.osrd.utils.indexing.StaticIdxSortedSet
import fr.sncf.osrd.utils.indexing.mutableStaticIdxArraySetOf

sealed interface LoadingGaugeType

Expand All @@ -15,13 +13,3 @@ data class LoadingGaugeConstraint(val blockedTypes: StaticIdxSortedSet<LoadingGa
return !blockedTypes.contains(trainType)
}
}

fun fromAllowedSet(allowedTypes: Set<RJSLoadingGaugeType>): LoadingGaugeConstraint {
val blockedTypes = mutableStaticIdxArraySetOf<LoadingGaugeType>()
for (gaugeType in RJSLoadingGaugeType.entries) {
if (!allowedTypes.contains(gaugeType)) {
blockedTypes.add(StaticIdx(gaugeType.ordinal.toUInt()))
}
}
return LoadingGaugeConstraint(blockedTypes)
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,15 @@ interface TrackProperties {
trackChunk: TrackChunkId
): StaticIdxList<OperationalPointPart>

fun getOperationalPointPartChunk(operationalPoint: OperationalPointPartId): TrackChunkId
fun getOperationalPointPartChunk(operationalPointPart: OperationalPointPartId): TrackChunkId

fun getOperationalPointPartChunkOffset(
operationalPoint: OperationalPointPartId
operationalPointPart: OperationalPointPartId
): Offset<TrackChunk>

fun getOperationalPointPartName(operationalPoint: OperationalPointPartId): String
fun getOperationalPointPartOpId(operationalPointPart: OperationalPointPartId): String

fun getOperationalPointPartProps(
operationalPointPart: OperationalPointPartId
): Map<String, String>
}
Original file line number Diff line number Diff line change
Expand Up @@ -522,18 +522,20 @@ class RawInfraFromRjsBuilder {
}

fun operationalPointPart(
operationalPointName: String,
operationalPointId: String,
trackSectionName: String,
trackSectionOffset: Offset<TrackSection>
trackSectionOffset: Offset<TrackSection>,
props: Map<String, String>
): OperationalPointPartId {
val trackSectionChunks = getTrackSectionDistanceSortedChunks(trackSectionName)
val chunkDistanceIdx = trackSectionChunks.floorEntry(trackSectionOffset.distance)
val opPartIdx =
operationalPointPartPool.add(
OperationalPointPartDescriptor(
operationalPointName,
operationalPointId,
Offset(trackSectionOffset.distance - chunkDistanceIdx.key),
chunkDistanceIdx.value
chunkDistanceIdx.value,
props
)
)
val oppList =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,9 +162,11 @@ class ZonePathDescriptor(
) : ZonePathSpec(entry, exit, movableElements, movableElementsConfigs)

class OperationalPointPartDescriptor(
val name: String,
// Multiple OperationalPointParts can have the same operationalPointId
val operationalPointId: String,
val chunkOffset: Offset<TrackChunk>,
val chunk: TrackChunkId,
val props: Map<String, String>,
)

class ZonePathCache(
Expand Down Expand Up @@ -439,19 +441,25 @@ class RawInfraImplFromRjs(
}

override fun getOperationalPointPartChunk(
operationalPoint: OperationalPointPartId
operationalPointPart: OperationalPointPartId
): TrackChunkId {
return operationalPointPartPool[operationalPoint].chunk
return operationalPointPartPool[operationalPointPart].chunk
}

override fun getOperationalPointPartChunkOffset(
operationalPoint: OperationalPointPartId
operationalPointPart: OperationalPointPartId
): Offset<TrackChunk> {
return operationalPointPartPool[operationalPoint].chunkOffset
return operationalPointPartPool[operationalPointPart].chunkOffset
}

override fun getOperationalPointPartOpId(operationalPointPart: OperationalPointPartId): String {
return operationalPointPartPool[operationalPointPart].operationalPointId
}

override fun getOperationalPointPartName(operationalPoint: OperationalPointPartId): String {
return operationalPointPartPool[operationalPoint].name
override fun getOperationalPointPartProps(
operationalPointPart: OperationalPointPartId
): Map<String, String> {
return operationalPointPartPool[operationalPointPart].props
}

override fun getTrackChunkGeom(trackChunk: TrackChunkId): LineString {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package fr.sncf.osrd.utils

import com.google.common.collect.Range
import com.google.common.collect.RangeMap
import com.google.common.collect.TreeRangeMap
import fr.sncf.osrd.utils.units.Distance
import fr.sncf.osrd.utils.units.MutableDistanceArrayList
import java.util.PriorityQueue
Expand Down Expand Up @@ -276,14 +278,22 @@ data class DistanceRangeMapImpl<T>(
}

companion object {
fun <T> from(map: RangeMap<Double, T>): DistanceRangeMap<T> {
fun <T> from(map: RangeMap<Distance, T>): DistanceRangeMap<T> {
val res = distanceRangeMapOf<T>()
for (entry in map.asMapOfRanges()) res.put(
Distance.fromMeters(entry.key.lowerEndpoint()),
Distance.fromMeters(entry.key.upperEndpoint()),
entry.key.lowerEndpoint(),
entry.key.upperEndpoint(),
entry.value
)
return res
}

fun <T> toRangeMap(distanceRangeMap: DistanceRangeMap<T>): RangeMap<Distance, T> {
val rangeMap = TreeRangeMap.create<Distance, T>()
for (entry in distanceRangeMap.asList()) {
rangeMap.put(Range.closed(entry.lower, entry.upper), entry.value!!)
}
return rangeMap
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,21 @@
import fr.sncf.osrd.railjson.schema.common.Identified;
import fr.sncf.osrd.railjson.schema.infra.trackranges.RJSOperationalPointPart;
import java.util.List;
import org.jetbrains.annotations.Nullable;

@SuppressFBWarnings({"UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD"})
public class RJSOperationalPoint implements Identified {
public String id;
public List<RJSOperationalPointPart> parts;

public RJSOperationalPoint(String id, List<RJSOperationalPointPart> parts) {
@Nullable
public RJSOperationalPointExtensions extensions;

public RJSOperationalPoint(
String id, List<RJSOperationalPointPart> parts, @Nullable RJSOperationalPointExtensions extensions) {
this.id = id;
this.parts = parts;
this.extensions = extensions;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package fr.sncf.osrd.railjson.schema.infra;

import org.jetbrains.annotations.Nullable;

public class RJSOperationalPointExtensions {
@Nullable
public RJSOperationalPointSncfExtension sncf;

@Nullable
public RJSOperationalPointIdentifierExtension identifier;

public RJSOperationalPointExtensions(
@Nullable RJSOperationalPointSncfExtension sncf,
@Nullable RJSOperationalPointIdentifierExtension identifier) {
this.sncf = sncf;
this.identifier = identifier;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package fr.sncf.osrd.railjson.schema.infra;

public class RJSOperationalPointIdentifierExtension {
public String name;
public long uic;

public RJSOperationalPointIdentifierExtension(String name, long uic) {
this.name = name;
this.uic = uic;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package fr.sncf.osrd.railjson.schema.infra;

import com.squareup.moshi.Json;

public class RJSOperationalPointSncfExtension {
public Long ci;
public String ch;

@Json(name = "ch_short_label")
public String chShortLabel;

@Json(name = "ch_long_label")
public String chLongLabel;

public String trigram;

public RJSOperationalPointSncfExtension(
Long ci, String ch, String chShortLabel, String chLongLabel, String trigram) {
this.ci = ci;
this.ch = ch;
this.chShortLabel = chShortLabel;
this.chLongLabel = chLongLabel;
this.trigram = trigram;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,18 @@
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import fr.sncf.osrd.railjson.schema.infra.trackobjects.RJSTrackObject;
import java.util.Objects;
import org.jetbrains.annotations.Nullable;

@SuppressFBWarnings({"URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD"})
public class RJSOperationalPointPart extends RJSTrackObject {
public RJSOperationalPointPart(String track, double position) {
@Nullable
public RJSOperationalPointPartExtensions extensions;

public RJSOperationalPointPart(
String track, double position, @Nullable RJSOperationalPointPartExtensions extensions) {
this.track = track;
this.position = position;
this.extensions = extensions;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package fr.sncf.osrd.railjson.schema.infra.trackranges;

import org.jetbrains.annotations.Nullable;

public class RJSOperationalPointPartExtensions {
@Nullable
public RJSOperationalPointPartSncfExtension sncf;

public RJSOperationalPointPartExtensions(@Nullable RJSOperationalPointPartSncfExtension sncf) {
this.sncf = sncf;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package fr.sncf.osrd.railjson.schema.infra.trackranges;

public class RJSOperationalPointPartSncfExtension {
public String kp;

public RJSOperationalPointPartSncfExtension(String kp) {
this.kp = kp;
}
}
2 changes: 2 additions & 0 deletions core/src/main/java/fr/sncf/osrd/cli/ApiServerCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.beust.jcommander.Parameter;
import com.beust.jcommander.Parameters;
import fr.sncf.osrd.api.*;
import fr.sncf.osrd.api.api_v2.path_properties.PathPropEndpoint;
import fr.sncf.osrd.api.api_v2.pathfinding.PathfindingBlocksEndpointV2;
import fr.sncf.osrd.api.pathfinding.PathfindingBlocksEndpoint;
import fr.sncf.osrd.api.stdcm.STDCMEndpoint;
Expand Down Expand Up @@ -84,6 +85,7 @@ public int run() {
new FkRegex("/health", ""),
new FkRegex("/pathfinding/routes", new PathfindingBlocksEndpoint(infraManager)),
new FkRegex("/v2/pathfinding/blocks", new PathfindingBlocksEndpointV2(infraManager)),
new FkRegex("/v2/path_properties", new PathPropEndpoint(infraManager)),
new FkRegex(
"/standalone_simulation",
new StandaloneSimulationEndpoint(infraManager, electricalProfileSetManager)),
Expand Down
Loading
Loading