diff --git a/aman/sys/aco/RunwayManager.py b/aman/sys/aco/RunwayManager.py index 6433286..887b7f3 100644 --- a/aman/sys/aco/RunwayManager.py +++ b/aman/sys/aco/RunwayManager.py @@ -2,6 +2,7 @@ from datetime import datetime, timedelta +from aman.config.RunwaySequencing import RunwayAssignmentType from aman.sys.aco.Configuration import Configuration from aman.sys.aco.Constraints import SpacingConstraints from aman.sys.aco.Node import Node @@ -57,15 +58,85 @@ class RunwayManager: else: return eta, timedelta(seconds = 0) + def selectShallShouldMayArrivalRunway(self, node : Node, runways, useETA : bool, earliestArrivalTime : datetime): + candidate = None + delay = None + + for runway in runways: + if True == useETA: + reference = node.ArrivalCandidates[runway.Runway.Name].EarliestArrivalTime + else: + reference = node.ArrivalCandidates[runway.Runway.Name].InitialArrivalTime + + eta, _ = self.calculateEarliestArrivalTime(runway.Runway.Name, node) + if None == delay: + delay = eta - reference + candidate = runway + elif delay > (eta - reference): + delay = eta- reference + candidate = runway + + return candidate + + def executeShallShouldMayAssignment(self, node : Node, useETA : bool, earliestArrivalTime : datetime): + shallRunways = [] + shouldRunways = [] + mayRunways = [] + + for runway in self.Configuration.RunwayConstraints.ActiveArrivalRunways: + # test the shall assignments + if RunwayAssignmentType.AircraftType in runway.ShallAssignments: + if node.Inbound.Report.aircraft.type in runway.ShallAssignments[RunwayAssignmentType.AircraftType]: + shallRunways.append(runway) + if RunwayAssignmentType.GateAssignment in runway.ShallAssignments: + if node.Inbound.Report.plannedGate in runway.ShallAssignments[RunwayAssignmentType.GateAssignment]: + shallRunways.append(runway) + + # test the should assignments + if RunwayAssignmentType.AircraftType in runway.ShouldAssignments: + if node.Inbound.Report.aircraft.type in runway.ShouldAssignments[RunwayAssignmentType.AircraftType]: + shouldRunways.append(runway) + if RunwayAssignmentType.GateAssignment in runway.ShouldAssignments: + if node.Inbound.Report.plannedGate in runway.ShouldAssignments[RunwayAssignmentType.GateAssignment]: + shouldRunways.append(runway) + + if True == useETA: + reference = node.ArrivalCandidates[runway.Runway.Name].EarliestArrivalTime + else: + reference = node.ArrivalCandidates[runway.Runway.Name].InitialArrivalTime + + # test the may assignments + if RunwayAssignmentType.AircraftType in runway.MayAssignments: + if node.Inbound.Report.aircraft.type in runway.MayAssignments[RunwayAssignmentType.AircraftType]: + eta, _ = self.calculateEarliestArrivalTime(runway.Runway.Name, node, useETA, earliestArrivalTime) + if (eta - reference) <= self.Configuration.MaxDelayMay: + mayRunways.append(runway) + if RunwayAssignmentType.GateAssignment in runway.MayAssignments: + if node.Inbound.Report.plannedGate in runway.MayAssignments[RunwayAssignmentType.GateAssignment]: + eta, _ = self.calculateEarliestArrivalTime(runway.Runway.Name, node, useETA, earliestArrivalTime) + if (eta - reference) <= self.Configuration.MaxDelayMay: + mayRunways.append(runway) + + runway = self.selectShallShouldMayArrivalRunway(node, shallRunways, useETA, earliestArrivalTime) + if None != runway: + return [ runway ] + runway = self.selectShallShouldMayArrivalRunway(node, shouldRunways, useETA, earliestArrivalTime) + if None != runway: + return [ runway ] + runway = self.selectShallShouldMayArrivalRunway(node, mayRunways, useETA, earliestArrivalTime) + if None != runway: + return [ runway ] + + return self.Configuration.RunwayConstraints.ActiveArrivalRunways + def selectArrivalRunway(self, node : Node, useETA : bool, earliestArrivalTime : datetime): availableRunways = self.Configuration.RunwayConstraints.ActiveArrivalRunways - #if 1 < len(availableRunways): - # TODO filter based on type - # TODO filter based on airline - # ensure that at least one runway is available + if True == self.Configuration.RunwayConstraints.UseShallShouldMay: + availableRunways = self.executeShallShouldMayAssignment(node, useETA, earliestArrivalTime) + else: + availableRunways = self.Configuration.RunwayConstraints.ActiveArrivalRunways - # fallback to check if we have available runways if 0 == len(availableRunways): runway = self.Configuration.RunwayConstraints.ActiveArrivalRunways[0] return runway, self.calculateEarliestArrivalTime(runway.Runway.Name, node, useETA, earliestArrivalTime)