This commit is contained in:
Ross
2021-07-11 20:58:24 +01:00
parent 70b3f89e23
commit 161d37cd87
6 changed files with 334 additions and 424 deletions
+35 -10
View File
@@ -26,17 +26,12 @@ days = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
full_weekend_count = 2
# weeks = [i for i in range(1,weeks_to_rota+1)]
# weeks_days_product = list(itertools.product(weeks, days))
from govuk_bank_holidays.bank_holidays import BankHolidays
bank_holidays = BankHolidays()
bank_holiday_map = {}
for bank_holiday in bank_holidays.get_holidays():
bank_holiday_map[bank_holiday['date']] = bank_holiday['title']
# see BankHolidays source file for more methods and arguments
class SingleShift(object):
@@ -183,6 +178,34 @@ class RotaBuilder(object):
self.week_day_date_map[(week, day)] = d
n = n + 1
def solve_model(self, solver='cbc', use_neos=False, options={}):
print("Setting up solver")
self.opt = SolverFactory(solver)
print("Solving")
if use_neos:
solver_manager = SolverManagerFactory('neos') # Solve in neos server
#results = solver_manager.solve(Rota.model, opt=opt, logfile="test.log")
results = solver_manager.solve(self.model, keepfiles=True, tee=True, opt=self.opt, logfile="test.log")
else:
results = self.opt.solve(
self.model,
tee=True,
options=options,
#options={
# "threads": 10,
#},
logfile="test.log"
)
self.results = results
print(results)
results.solver.status
if not results.solver.status:
sys.exit(0)
def build_model(self):
# Initialize model
self.model = ConcreteModel()
@@ -1314,7 +1337,7 @@ class RotaBuilder(object):
Must be called prior to attempting to solve
"""
self.build_shifts()
#self.build_shifts()
self.workers = sorted(self.workers)
@@ -1592,6 +1615,10 @@ class RotaResults(object):
self.rota = rota
self.results = results
def export_rota_to_html(self, filename="rota"):
with open("{}.html".format(filename), "w") as f:
f.write(self.get_worker_timetable_html(True))
def export_rota_to_csv(self, filename="rota"):
works = self.rota.model.works
with open("{}.csv".format(filename), 'w', newline='') as f:
@@ -1722,7 +1749,7 @@ class RotaResults(object):
def get_worker_timetable_html(self,
include_html_tag=False,
table_name="Test"):
table_name="rota-table"):
model = self.rota.model
timetable = []
@@ -1826,8 +1853,6 @@ class RotaResults(object):
weekend_target=worker.weekend_shift_target_number, nights_at_derriford=worker.night_at_derriford, grade=worker.grade, pair=worker.pair
)
#print(shift_count_dict)
shift_count = shift_count + "#weekends_worked: {}\\#".format(
model.worker_weekend_count[worker.id].value)
@@ -2013,7 +2038,6 @@ class RotaResults(object):
"balance: {},".format(
self.rota.model.night_shift_count_w[worker.id].value),
)
"""
def get_weekend_details(self):
for worker in self.rota.workers:
@@ -2035,3 +2059,4 @@ class RotaResults(object):
self.rota.model.weekend_shift_count_w[worker.id].value),
)
"""