@@ -4,6 +4,7 @@ import com.carrotsearch.hppc.IntArrayList
4
4
import com.squareup.moshi.Json
5
5
import fr.sncf.osrd.api.ConflictDetectionEndpoint.ConflictDetectionResult.Conflict
6
6
import fr.sncf.osrd.api.ConflictDetectionEndpoint.ConflictDetectionResult.Conflict.ConflictType
7
+ import fr.sncf.osrd.api.ConflictDetectionEndpoint.ConflictDetectionResult.ConflictRequirement
7
8
import fr.sncf.osrd.standalone_sim.result.ResultTrain.RoutingRequirement
8
9
import fr.sncf.osrd.standalone_sim.result.ResultTrain.SpacingRequirement
9
10
import kotlin.math.max
@@ -171,12 +172,13 @@ class IncrementalConflictDetectorImpl(trainRequirements: List<TrainRequirements>
171
172
// look for requirement times overlaps.
172
173
// as spacing requirements are exclusive, any overlap is a conflict
173
174
val res = mutableListOf<Conflict >()
174
- for (requirements in spacingZoneRequirements.values ) {
175
- for (conflictGroup in detectRequirementConflicts(requirements ) { _, _ -> true }) {
175
+ for (entry in spacingZoneRequirements) {
176
+ for (conflictGroup in detectRequirementConflicts(entry.value ) { _, _ -> true }) {
176
177
val trains = conflictGroup.map { it.trainId }
177
178
val beginTime = conflictGroup.minBy { it.beginTime }.beginTime
178
179
val endTime = conflictGroup.maxBy { it.endTime }.endTime
179
- res.add(Conflict (trains, beginTime, endTime, ConflictType .SPACING ))
180
+ val conflictReq = ConflictRequirement (entry.key, beginTime, endTime)
181
+ res.add(Conflict (trains, beginTime, endTime, ConflictType .SPACING , listOf (conflictReq)))
180
182
}
181
183
}
182
184
return res
@@ -185,13 +187,14 @@ class IncrementalConflictDetectorImpl(trainRequirements: List<TrainRequirements>
185
187
private fun detectRoutingConflicts (): List <Conflict > {
186
188
// for each zone, check compatibility of overlapping requirements
187
189
val res = mutableListOf<Conflict >()
188
- for (requirements in routingZoneRequirements.values ) {
190
+ for (entry in routingZoneRequirements) {
189
191
for (conflictGroup in
190
- detectRequirementConflicts(requirements ) { a, b -> a.config != b.config }) {
192
+ detectRequirementConflicts(entry.value ) { a, b -> a.config != b.config }) {
191
193
val trains = conflictGroup.map { it.trainId }
192
194
val beginTime = conflictGroup.minBy { it.beginTime }.beginTime
193
195
val endTime = conflictGroup.maxBy { it.endTime }.endTime
194
- res.add(Conflict (trains, beginTime, endTime, ConflictType .ROUTING ))
196
+ val conflictReq = ConflictRequirement (entry.key, beginTime, endTime)
197
+ res.add(Conflict (trains, beginTime, endTime, ConflictType .ROUTING , listOf (conflictReq)))
195
198
}
196
199
}
197
200
return res
@@ -218,9 +221,10 @@ class IncrementalConflictDetectorImpl(trainRequirements: List<TrainRequirements>
218
221
for (otherReq in requirements) {
219
222
val beginTime = max(req.beginTime, otherReq.beginTime)
220
223
val endTime = min(req.endTime, otherReq.endTime)
224
+ val conflictReq = ConflictRequirement (req.zone, beginTime, endTime)
221
225
if (beginTime < endTime)
222
226
res.add(
223
- Conflict (listOf (otherReq.trainId), beginTime, endTime, ConflictType .SPACING )
227
+ Conflict (listOf (otherReq.trainId), beginTime, endTime, ConflictType .SPACING , listOf (conflictReq) )
224
228
)
225
229
}
226
230
@@ -238,9 +242,10 @@ class IncrementalConflictDetectorImpl(trainRequirements: List<TrainRequirements>
238
242
if (otherReq.config == zoneReqConfig) continue
239
243
val beginTime = max(req.beginTime, otherReq.beginTime)
240
244
val endTime = min(zoneReq.endTime, otherReq.endTime)
245
+ val conflictReq = ConflictRequirement (zoneReq.zone, beginTime, endTime)
241
246
if (beginTime < endTime)
242
247
res.add(
243
- Conflict (listOf (otherReq.trainId), beginTime, endTime, ConflictType .ROUTING )
248
+ Conflict (listOf (otherReq.trainId), beginTime, endTime, ConflictType .ROUTING , listOf (conflictReq) )
244
249
)
245
250
}
246
251
}
@@ -447,6 +452,12 @@ fun mergeMap(
447
452
events.add(Event (EventType .END , conflict.endTime))
448
453
}
449
454
455
+ // TODO: accumulate in the for loop below somehow?
456
+ val conflictReqs = mutableListOf<ConflictRequirement >()
457
+ for (conflict in conflicts) {
458
+ conflictReqs.addAll(conflict.requirements);
459
+ }
460
+
450
461
events.sort()
451
462
var eventCount = 0
452
463
var eventBeginning = 0.0
@@ -462,7 +473,8 @@ fun mergeMap(
462
473
trainIds.toMutableList(),
463
474
eventBeginning,
464
475
event.time,
465
- conflictType
476
+ conflictType,
477
+ conflictReqs
466
478
)
467
479
)
468
480
}
0 commit comments