Refactor schedulers into an own module

merge-requests/52/head
Fabian P. Schmidt 2019-11-02 15:15:44 +01:00
parent 44c37aaff2
commit f1ab63149d
3 changed files with 54 additions and 51 deletions

View File

@ -0,0 +1,50 @@
import logging
import random
from .pass_predictor import overlap
def ordered_scheduler(passes, scheduledpasses, wait_time_seconds):
"""Loop through a list of ordered passes and schedule each next one that fits"""
# Loop over passes
for satpass in passes:
# Schedule if there is no overlap with already scheduled passes
if not overlap(satpass, scheduledpasses, wait_time_seconds):
scheduledpasses.append(satpass)
return scheduledpasses
def random_scheduler(passes, scheduledpasses, wait_time_seconds):
"""Schedule passes based on random ordering"""
# Shuffle passes
random.shuffle(passes)
return ordered_scheduler(passes, scheduledpasses, wait_time_seconds)
def report_efficiency(scheduledpasses, passes):
if scheduledpasses:
# Loop over passes
start = False
for satpass in scheduledpasses:
if not start:
dt = satpass['ts'] - satpass['tr']
tmin = satpass['tr']
tmax = satpass['ts']
start = True
else:
dt += satpass['ts'] - satpass['tr']
if satpass['tr'] < tmin:
tmin = satpass['tr']
if satpass['ts'] > tmax:
tmax = satpass['ts']
# Total time covered
dttot = tmax - tmin
logging.info("%d passes selected out of %d, %.0f s out of %.0f s at %.3f%% efficiency" %
(len(scheduledpasses), len(passes), dt.total_seconds(), dttot.total_seconds(),
100 * dt.total_seconds() / dttot.total_seconds()))
else:
logging.info("No appropriate passes found for scheduling.")

View File

@ -9,10 +9,12 @@ import lxml.html
import argparse import argparse
import logging import logging
from utils import get_active_transmitter_info, get_transmitter_stats, \ from utils import get_active_transmitter_info, get_transmitter_stats, \
get_groundstation_info, get_scheduled_passes_from_network, ordered_scheduler, \ get_groundstation_info, get_scheduled_passes_from_network, \
report_efficiency, find_passes, schedule_observation, read_priorities_transmitters, \ find_passes, schedule_observation, read_priorities_transmitters, \
get_satellite_info, update_needed, get_priority_passes get_satellite_info, update_needed, get_priority_passes
from auto_scheduler import twolineelement, satellite from auto_scheduler import twolineelement, satellite
from auto_scheduler.schedulers import ordered_scheduler, \
report_efficiency
import settings import settings
from tqdm import tqdm from tqdm import tqdm
import sys import sys

View File

@ -1,7 +1,6 @@
import requests import requests
import logging import logging
import math import math
import random
from datetime import datetime, timedelta from datetime import datetime, timedelta
import ephem import ephem
import lxml import lxml
@ -10,8 +9,6 @@ from tqdm import tqdm
import os import os
import sys import sys
from auto_scheduler.pass_predictor import overlap
def get_paginated_endpoint(url, max_entries=None): def get_paginated_endpoint(url, max_entries=None):
r = requests.get(url=url) r = requests.get(url=url)
@ -143,52 +140,6 @@ def get_scheduled_passes_from_network(ground_station, tmin, tmax):
return scheduledpasses return scheduledpasses
def ordered_scheduler(passes, scheduledpasses, wait_time_seconds):
"""Loop through a list of ordered passes and schedule each next one that fits"""
# Loop over passes
for satpass in passes:
# Schedule if there is no overlap with already scheduled passes
if not overlap(satpass, scheduledpasses, wait_time_seconds):
scheduledpasses.append(satpass)
return scheduledpasses
def random_scheduler(passes, scheduledpasses, wait_time_seconds):
"""Schedule passes based on random ordering"""
# Shuffle passes
random.shuffle(passes)
return ordered_scheduler(passes, scheduledpasses, wait_time_seconds)
def report_efficiency(scheduledpasses, passes):
if scheduledpasses:
# Loop over passes
start = False
for satpass in scheduledpasses:
if not start:
dt = satpass['ts'] - satpass['tr']
tmin = satpass['tr']
tmax = satpass['ts']
start = True
else:
dt += satpass['ts'] - satpass['tr']
if satpass['tr'] < tmin:
tmin = satpass['tr']
if satpass['ts'] > tmax:
tmax = satpass['ts']
# Total time covered
dttot = tmax - tmin
logging.info("%d passes selected out of %d, %.0f s out of %.0f s at %.3f%% efficiency" %
(len(scheduledpasses), len(passes), dt.total_seconds(), dttot.total_seconds(),
100 * dt.total_seconds() / dttot.total_seconds()))
else:
logging.info("No appropriate passes found for scheduling.")
def find_passes(satellites, observer, tmin, tmax, minimum_altitude, min_pass_duration): def find_passes(satellites, observer, tmin, tmax, minimum_altitude, min_pass_duration):
# Loop over satellites # Loop over satellites
passes = [] passes = []