diff --git a/SAS/TMSS/backend/services/scheduling/lib/constraints.py b/SAS/TMSS/backend/services/scheduling/lib/constraints.py index ade76fdf3b763aade818c1bb6f0b0c3571fe0880..e262904770496fc295dfd670743d10d6deec03c5 100644 --- a/SAS/TMSS/backend/services/scheduling/lib/constraints.py +++ b/SAS/TMSS/backend/services/scheduling/lib/constraints.py @@ -1818,6 +1818,11 @@ def get_earliest_possible_start_time_taking_used_stations_into_account(schedulin try: # check for any overlapping units... blocking_units = get_blocking_scheduled_or_observing_units(scheduling_unit, earliest_possible_start_time) + + if scheduling_unit.priority_queue.value == models.PriorityQueueType.Choices.A.value: + # A-prio units are never hindered/blocked by B-prio + blocking_units = blocking_units.exclude(priority_queue__value=models.PriorityQueueType.Choices.B.value) + if blocking_units.exists(): blocking_observing_units = blocking_units.filter(status__value=models.SchedulingUnitStatus.Choices.OBSERVING.value).all() blocking_scheduled_units = blocking_units.filter(status__value=models.SchedulingUnitStatus.Choices.SCHEDULED.value).all() @@ -1828,15 +1833,15 @@ def get_earliest_possible_start_time_taking_used_stations_into_account(schedulin scheduling_unit.id, ','.join(str(u.id) for u in blocking_scheduled_units)) blocking_scheduled_units_with_start_time = compute_start_times_for_units(list(blocking_scheduled_units), lower_bound, upper_bound, gridder, raise_if_interruped) - scored_units = compute_scores_for_units_with_start_time(blocking_scheduled_units_with_start_time+[SchedulingUnitAndStartTime(scheduling_unit, earliest_possible_start_time)], lower_bound, upper_bound, gridder, raise_if_interruped) + rescored_units = compute_scores_for_units_with_start_time(blocking_scheduled_units_with_start_time+[SchedulingUnitAndStartTime(scheduling_unit, earliest_possible_start_time)], lower_bound, upper_bound, gridder, raise_if_interruped) try: - scored_candidate = [su for su in scored_units if su.scheduling_unit.id==scheduling_unit.id][0] - scored_blocking_units = [su for su in scored_units if su.scheduling_unit.id!=scheduling_unit.id] + rescored_candidate = [su for su in rescored_units if su.scheduling_unit.id==scheduling_unit.id][0] + rescored_blocking_units = [su for su in rescored_units if su.scheduling_unit.id!=scheduling_unit.id] # if the candidate has a higher score, then it can override and unschedule the already scheduled units. # so, in that case, ignore the overlap with the blocking scheduled units. # else, the blocking units cannot/willnot be unscheduled, so advance the lower_bound until after the blocking units - better_scoring_blocking_units = [scored_blocking_unit for scored_blocking_unit in scored_blocking_units if scored_candidate.weighted_score < scored_blocking_unit.weighted_score] + better_scoring_blocking_units = [scored_blocking_unit for scored_blocking_unit in rescored_blocking_units if rescored_candidate.weighted_score < scored_blocking_unit.weighted_score] except: logger.debug("get_earliest_possible_start_time_taking_used_stations_into_account: could not re-score candidate unit id=%s and blocking units %s", scheduling_unit.id, ','.join(str(u.id) for u in blocking_scheduled_units)) @@ -1863,9 +1868,9 @@ def get_earliest_possible_start_time_taking_used_stations_into_account(schedulin scheduling_unit.id, advanced_earliest_possible_start_time, advanced_lower_bound, upper_bound) return advanced_earliest_possible_start_time - logger.debug("get_earliest_possible_start_time_taking_used_stations_into_account: SUB id=%s is blocked by units %s at earliest_possible_start_time='%s'", - scheduling_unit.id, ','.join(str(u.id) for u in blocking_units), earliest_possible_start_time) - return None + logger.info("get_earliest_possible_start_time_taking_used_stations_into_account: SUB id=%s is blocked by units %s at earliest_possible_start_time='%s'", + scheduling_unit.id, ','.join(str(u.id) for u in blocking_units), earliest_possible_start_time) + return None except Exception as e: logger.exception(e) @@ -2029,8 +2034,9 @@ def compute_start_times_for_units(scheduling_units: [models.SchedulingUnitBluepr if result is not None and result.start_time is not None: units_with_start_time.append(result) - logger.info("compute_start_times_for_units: unit [%d/%d] %.1f%% %s", - i+1, len(scheduling_units), 100.0 * (i+1) / len(scheduling_units), result) + logger.info("compute_start_times_for_units: %s%s", + "unit [%d/%d] %.1f%%" % (i+1, len(scheduling_units), 100.0 * (i+1) / len(scheduling_units)) if len(scheduling_units)>1 else "", + result) else: logger.info("compute_start_times_for_units: no start_time for unit [%d/%d] %.1f%% %s between ['%s', '%s']", i+1, len(scheduling_units), 100.0 * (i+1) / len(scheduling_units), result or su.id, lower_bound, upper_bound)