diff --git a/rota.ipynb b/rota.ipynb index 75925d0..ec28828 100644 --- a/rota.ipynb +++ b/rota.ipynb @@ -25,12 +25,13 @@ "cells": [ { "cell_type": "code", - "execution_count": 112, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from pyomo.environ import *\n", "from pyomo.opt import SolverFactory\n", + "from shifts import ShiftsClass, ShiftCollection, days, sites\n", "\n", "import datetime\n", "import itertools" @@ -38,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": 113, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -50,145 +51,28 @@ }, { "cell_type": "code", - "execution_count": 114, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ - "# Define days (1 week)\n", - "days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']\n", + "\n", "\n", "#weeks = [i for i in range(1,weeks_to_rota+1)]\n", "\n", "#weeks_days_product = list(itertools.product(weeks, days))\n", "\n", - "sites = (\"truro\", \"exeter\", \"torquay\", \"barnstaple\", \"plymouth\")\n", - "\n", - "class shiftsClass:\n", - " def __init__(self, sites, name, length, shift_days, balance_by_site=True, workers_required=1, rota_on_nwds=False):\n", - " self.site = sites\n", - " self.name = name\n", - " self.length = length\n", - " self.shift_days = shift_days\n", - " self.balance_by_site = balance_by_site\n", - " self.workers_required = workers_required\n", - " self.rota_on_nwds = rota_on_nwds\n", - "\n", - "\n", - "class shiftCollection:\n", - " def __init__(self):\n", - " self.shifts = []\n", - "\n", - " self.weeks = [i for i in range(1,weeks_to_rota+1)]\n", - "\n", - " self.weeks_days_product = list(itertools.product(self.weeks, days))\n", - "\n", - " self.start_date = datetime.date(2020,9,7)\n", - " self.rota_days_length = len(self.weeks) * 7\n", - " self.rota_end_date = self.start_date + datetime.timedelta(self.rota_days_length)\n", - "\n", - " def AddShift(self, shift):\n", - " self.shifts.append(shift)\n", - " self.BuildShifts()\n", - "\n", - " def AddShifts(self, *shifts):\n", - " self.shifts.extend(shifts)\n", - " self.BuildShifts()\n", - " \n", - " def GetShiftNamesByDay(self, day):\n", - " return self.day_shifts_dict[day]\n", - "\n", - " def GetShiftByName(self, name):\n", - " return self.shifts_by_name[name]\n", - "\n", - " def GetShiftLengthByName(self, name):\n", - " return self.shifts_by_name[name].length\n", - "\n", - " def BuildShifts(self):\n", - " self.shifts_by_name = {}\n", - " self.shift_names = []\n", - "\n", - " self.day_shifts_dict = { day: set() for day in days }\n", - "\n", - " for s in self.shifts:\n", - " self.shifts_by_name[s.name] = s\n", - " self.shift_names.append(s.name)\n", - "\n", - " for day in s.shift_days:\n", - " self.day_shifts_dict[day].add(s.name)\n", - "\n", - " self.week_day_shift_product = []\n", - " self.week_day_shiftclass_product = []\n", - " for week, day in self.weeks_days_product:\n", - " for s in self.shifts:\n", - " if day in s.shift_days:\n", - " self.week_day_shift_product.append((week, day, s.name))\n", - " self.week_day_shiftclass_product.append((week, day, s))\n", - "\n", - " self.day_shift_product = []\n", - " self.day_shiftclass_product = []\n", - " for s in self.shifts:\n", - " for day in days:\n", - " if day in s.shift_days:\n", - " self.day_shift_product.append((day, s.name))\n", - " self.day_shiftclass_product.append((day, s))\n", - " \n", - " def GetAllDayShiftsAsNames(self):\n", - " return self.day_shift_product\n", - " \n", - " def GetAllDayShiftsAsClass(self):\n", - " return self.day_shiftclass_product\n", - "\n", - " def GetAllShiftsAsNames(self):\n", - " return self.week_day_shift_product\n", - "\n", - " def GetAllShiftsAsClass(self):\n", - " return self.week_day_shiftclass_product\n", - "\n", - " def GetAllWeeksDays(self):\n", - " return self.weeks_days_product\n", - "\n", - " def GetShiftOptions(self):\n", - " return self.shifts\n", - "\n", - " def GetShiftNames(self):\n", - " return self.shift_names\n", - "\n", - " def GetWeeksInBlocks(self, block_length):\n", - " blocks = []\n", - " for i in range(len(self.weeks)):\n", - " blocks.append(self.weeks[i:i+block_length])\n", - " return blocks\n", - "\n", - " def GetRequiredShiftsWorkersAndSites(self):\n", - " l = []\n", - " for week, day, shift in self.week_day_shiftclass_product:\n", - " if day in shift.shift_days:\n", - " l.append((week, day, shift.name, shift.workers_required, shift.site))\n", - "\n", - " return l\n", - "\n", - " def GetNotRequiredShifts(self):\n", - " l = set()\n", - "\n", - " for week in self.weeks:\n", - " for day in days:\n", - " for shift in self.shifts:\n", - " l.add((week, day, shift))\n", - "\n", - " return l - set(self.GetAllShiftsAsClass())\n", - "\n", - "Shifts = shiftCollection()\n", + "Shifts = ShiftCollection(weeks_to_rota=weeks_to_rota)\n", "\n", "Shifts.AddShifts(\n", - " shiftsClass((\"exeter\",), \"exeter_twilight\", 12.5, days[:5]),\n", - " shiftsClass((\"truro\",), \"truro_twilight\", 12.5, days[:5]),\n", - " shiftsClass((\"torquay\",), \"torquay_twilight\", 12.5, days[:5]),\n", - " shiftsClass((\"plymouth\",), \"plymouth_twilight\", 12.5, days[:5]), \n", - " shiftsClass((\"exeter\",), \"weekend_exeter\", 12.5, days[5:]), \n", - " shiftsClass((\"truro\",), \"weekend_truro\", 12.5, days[5:]), \n", - " shiftsClass((\"torquay\",), \"weekend_torquay\", 12.5, days[5:]), \n", - " shiftsClass((\"plymouth\",), \"weekend_plymouth\", 8, days[5:], workers_required=2), \n", - " shiftsClass((sites), \"night\", 12.5, days, balance_by_site=False, workers_required=3, rota_on_nwds=True), \n", + " ShiftsClass((\"exeter\",), \"exeter_twilight\", 12.5, days[:5]),\n", + " ShiftsClass((\"truro\",), \"truro_twilight\", 12.5, days[:5]),\n", + " ShiftsClass((\"torquay\",), \"torquay_twilight\", 12.5, days[:5]),\n", + " ShiftsClass((\"plymouth\",), \"plymouth_twilight\", 12.5, days[:5]), \n", + " ShiftsClass((\"exeter\",), \"weekend_exeter\", 12.5, days[5:]), \n", + " ShiftsClass((\"truro\",), \"weekend_truro\", 12.5, days[5:]), \n", + " ShiftsClass((\"torquay\",), \"weekend_torquay\", 12.5, days[5:]), \n", + " ShiftsClass((\"plymouth\",), \"weekend_plymouth\", 8, days[5:], workers_required=2), \n", + " ShiftsClass((sites), \"night\", 12.5, days, balance_by_site=False, workers_required=3, rota_on_nwds=True), \n", ")\n", "\n", "# Enter shifts of each day\n", @@ -277,17 +161,14 @@ " return \"{} {} {}\".format(self.id, self.site[0], self.grade)\n", "\n", "\n", - "\n", "#unavailable_to_work.update([(\"W1\", 1, \"Mon\"),(\"W1\", 1, \"Fri\"),(\"W1\", 1, \"Thu\"),(\"W3\", 1, \"Mon\"),(\"W2\", 1, \"Mon\"),(\"W2\", 1, \"Tue\"),(\"W2\", 1, \"Wed\"),(\"W6\", 1, \"Thu\"),(\"W5\", 1, \"Fri\"),(\"W9\", 1, \"Fri\"),(\"W14\", 1, \"Fri\"),(\"W21\", 1, \"Fri\")])\n", "\n", - "\n", - "\n", "#for i in range(11,30):" ] }, { "cell_type": "code", - "execution_count": 115, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -301,7 +182,7 @@ "text/plain": "['Alex Wood',\n 'Michal Tomek',\n 'Wijhdan Abusrewil',\n 'Salma Aslam',\n 'Sayed Alqarooni',\n 'Delilah Trimmer',\n 'Rebecca Murphy',\n 'Tom Welsh',\n 'Jin Virdi',\n 'Tania King Mohammed',\n 'Tom Davies',\n 'Alexander Sanchez- Cabello',\n 'Hannah Lewis',\n 'Seren Peters',\n 'Adeola Omotade',\n 'Amina Odeh',\n 'Jean Sukumar',\n 'Jenn Fong',\n 'George Edwards',\n 'Khalil Madbak',\n 'Natasha Hougham',\n 'Richard Chaytor',\n 'S Ghauri',\n 'Safi Rahman',\n 'Sophie McGlade',\n 'Huub Witt',\n 'Jon Stokes',\n 'Karis McFeely',\n 'Mirna Long',\n 'Christian Greer',\n 'Max Ireland',\n 'Alan Eccles',\n 'Charles Finan',\n 'Chong Ng',\n 'Matthew Thorley',\n 'Mo Babsail',\n 'Neil McIntyre',\n 'Paul Jenkins',\n 'Gana Kugathasan',\n 'Harriet Conley',\n 'Jon Skinner',\n 'Nicolas Dziad',\n 'Vilim Kalamar',\n 'Chi Leung',\n 'Jenna Millington',\n 'Paul Ward',\n 'Sarath Vennam',\n 'Amoolya Mannava',\n 'Ross Kruger',\n 'Jack Looker',\n 'Pete Abernethy']" }, "metadata": {}, - "execution_count": 115 + "execution_count": 4 } ], "source": [ @@ -607,6 +488,7 @@ "\n", "# Limit to 1 ST2 (or below) on a night shift\n", "def nightShiftMaxSTRule(model, week, block):\n", + " \"\"\"Limits to 1 ST2 (or below) per night\"\"\"\n", " single_workers = [w for w in workers if w.grade < 3]\n", " if not single_workers:\n", " return Constraint.Skip\n", @@ -621,8 +503,6 @@ " return (sum(model.nights[w.id, week, block] for w in single_workers) >= 1)\n", "model.night_shifts_min_st4_constraint = Constraint([week for week in Shifts.weeks], [block for block in [\"weekday\", \"weekend\"]], rule=nightShiftMinST4Rule)\n", "\n", - "\n", - "\n", " \n", "# Constraint (def of model.needed)\n", "#for worker in workers:\n", @@ -649,7 +529,7 @@ { "output_type": "stream", "name": "stdout", - "text": "18.923156172353192 16.923156172353192\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n8.169262468941277 6.169262468941276\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n10.585467038309456 8.585467038309456\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n8.668373630647567 6.668373630647567\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n10.585467038309456 8.585467038309456\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n8.668373630647567 6.668373630647567\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n13.661885903885262 11.661885903885262\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.064754361554105 4.064754361554105\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n15.337656041691915 13.337656041691915\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.735062416676766 4.735062416676766\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n18.923156172353192 16.923156172353192\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n8.169262468941277 6.169262468941276\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n18.923156172353192 16.923156172353192\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n8.169262468941277 6.169262468941276\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n10.585467038309456 8.585467038309456\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n8.668373630647567 6.668373630647567\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n13.661885903885262 11.661885903885262\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.064754361554105 4.064754361554105\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n15.337656041691915 13.337656041691915\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.735062416676766 4.735062416676766\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n1.0 -1.0\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n1.0 -1.0\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n1.0 -1.0\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n1.0 -1.0\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n10.585467038309456 8.585467038309456\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n8.668373630647567 6.668373630647567\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n13.661885903885262 11.661885903885262\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.064754361554105 4.064754361554105\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n11.12950872310821 9.12950872310821\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n5.051803489243284 3.0518034892432837\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n15.337656041691915 13.337656041691915\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.735062416676766 4.735062416676766\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n15.337656041691915 13.337656041691915\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.735062416676766 4.735062416676766\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n18.923156172353192 16.923156172353192\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n8.169262468941277 6.169262468941276\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.751280222985675 4.751280222985675\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n5.60102417838854 3.60102417838854\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n10.585467038309456 8.585467038309456\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n8.668373630647567 6.668373630647567\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n13.661885903885262 11.661885903885262\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.064754361554105 4.064754361554105\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n13.661885903885262 11.661885903885262\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.064754361554105 4.064754361554105\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n9.60259362501515 7.60259362501515\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n4.4410374500060605 2.44103745000606\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n15.337656041691915 13.337656041691915\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.735062416676766 4.735062416676766\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n18.923156172353192 16.923156172353192\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n8.169262468941277 6.169262468941276\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n18.923156172353192 16.923156172353192\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n8.169262468941277 6.169262468941276\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n9.961578086176596 7.961578086176596\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n4.584631234470638 2.584631234470638\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n10.585467038309456 8.585467038309456\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n8.668373630647567 6.668373630647567\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n10.585467038309456 8.585467038309456\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n8.668373630647567 6.668373630647567\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n10.585467038309456 8.585467038309456\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n8.668373630647567 6.668373630647567\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.751280222985675 4.751280222985675\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n5.60102417838854 3.60102417838854\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n10.585467038309456 8.585467038309456\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n8.668373630647567 6.668373630647567\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n1.0 -1.0\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n1.0 -1.0\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n10.585467038309456 8.585467038309456\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n8.668373630647567 6.668373630647567\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n13.661885903885262 11.661885903885262\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.064754361554105 4.064754361554105\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n13.661885903885262 11.661885903885262\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.064754361554105 4.064754361554105\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n13.661885903885262 11.661885903885262\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.064754361554105 4.064754361554105\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n15.337656041691915 13.337656041691915\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.735062416676766 4.735062416676766\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n15.337656041691915 13.337656041691915\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.735062416676766 4.735062416676766\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n0.7518332222289559 -1.2481667777710441\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n0.9007332888915823 -1.0992667111084176\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.3769468517059575 4.3769468517059575\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n3.150778740682383 1.1507787406823828\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n9.370704805769346 7.370704805769346\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n4.348281922307739 2.3482819223077387\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n10.585467038309456 8.585467038309456\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n8.668373630647567 6.668373630647567\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n3.896707072016594 1.8967070720165942\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n3.3173656576132755 1.3173656576132755\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n1.5751280222985673 -0.4248719777014326\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n1.460102417838854 -0.539897582161146\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n10.585467038309456 8.585467038309456\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n8.668373630647567 6.668373630647567\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n1.0 -1.0\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n1.0 -1.0\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n13.661885903885262 11.661885903885262\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.064754361554105 4.064754361554105\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.913518141924435 4.913518141924435\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n3.365407256769774 1.3654072567697741\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n15.337656041691915 13.337656041691915\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n6.735062416676766 4.735062416676766\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n7.696158041449521 5.696158041449521\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n3.6784632165798086 1.6784632165798086\nWARNING: DEPRECATED: Chained inequalities are deprecated. Use the inequality()\n function to express ranged inequality expressions.\n" + "text": "18.923156172353192 16.923156172353192\n8.169262468941277 6.169262468941276\n18.923156172353192 16.923156172353192\n8.169262468941277 6.169262468941276\n18.923156172353192 16.923156172353192\n8.169262468941277 6.169262468941276\n1.0 -1.0\n1.0 -1.0\n18.923156172353192 16.923156172353192\n8.169262468941277 6.169262468941276\n9.961578086176596 7.961578086176596\n4.584631234470638 2.584631234470638\n18.923156172353192 16.923156172353192\n8.169262468941277 6.169262468941276\n18.923156172353192 16.923156172353192\n8.169262468941277 6.169262468941276\n9.370704805769346 7.370704805769346\n4.348281922307739 2.3482819223077387\n6.3769468517059575 4.3769468517059575\n3.150778740682383 1.1507787406823828\n0.7518332222289559 -1.2481667777710441\n0.9007332888915823 -1.0992667111084176\n10.585467038309456 8.585467038309456\n8.668373630647567 6.668373630647567\n10.585467038309456 8.585467038309456\n8.668373630647567 6.668373630647567\n10.585467038309456 8.585467038309456\n8.668373630647567 6.668373630647567\n1.0 -1.0\n1.0 -1.0\n10.585467038309456 8.585467038309456\n8.668373630647567 6.668373630647567\n6.751280222985675 4.751280222985675\n5.60102417838854 3.60102417838854\n10.585467038309456 8.585467038309456\n8.668373630647567 6.668373630647567\n10.585467038309456 8.585467038309456\n8.668373630647567 6.668373630647567\n10.585467038309456 8.585467038309456\n8.668373630647567 6.668373630647567\n6.751280222985675 4.751280222985675\n5.60102417838854 3.60102417838854\n10.585467038309456 8.585467038309456\n8.668373630647567 6.668373630647567\n10.585467038309456 8.585467038309456\n8.668373630647567 6.668373630647567\n1.0 -1.0\n1.0 -1.0\n10.585467038309456 8.585467038309456\n8.668373630647567 6.668373630647567\n10.585467038309456 8.585467038309456\n8.668373630647567 6.668373630647567\n1.5751280222985673 -0.4248719777014326\n1.460102417838854 -0.539897582161146\n10.585467038309456 8.585467038309456\n8.668373630647567 6.668373630647567\n3.896707072016594 1.8967070720165942\n3.3173656576132755 1.3173656576132755\n13.661885903885262 11.661885903885262\n6.064754361554105 4.064754361554105\n13.661885903885262 11.661885903885262\n6.064754361554105 4.064754361554105\n11.12950872310821 9.12950872310821\n5.051803489243284 3.0518034892432837\n13.661885903885262 11.661885903885262\n6.064754361554105 4.064754361554105\n13.661885903885262 11.661885903885262\n6.064754361554105 4.064754361554105\n13.661885903885262 11.661885903885262\n6.064754361554105 4.064754361554105\n13.661885903885262 11.661885903885262\n6.064754361554105 4.064754361554105\n13.661885903885262 11.661885903885262\n6.064754361554105 4.064754361554105\n13.661885903885262 11.661885903885262\n6.064754361554105 4.064754361554105\n6.913518141924435 4.913518141924435\n3.365407256769774 1.3654072567697741\n1.0 -1.0\n1.0 -1.0\n13.661885903885262 11.661885903885262\n6.064754361554105 4.064754361554105\n15.337656041691915 13.337656041691915\n6.735062416676766 4.735062416676766\n15.337656041691915 13.337656041691915\n6.735062416676766 4.735062416676766\n15.337656041691915 13.337656041691915\n6.735062416676766 4.735062416676766\n9.60259362501515 7.60259362501515\n4.4410374500060605 2.44103745000606\n15.337656041691915 13.337656041691915\n6.735062416676766 4.735062416676766\n15.337656041691915 13.337656041691915\n6.735062416676766 4.735062416676766\n15.337656041691915 13.337656041691915\n6.735062416676766 4.735062416676766\n15.337656041691915 13.337656041691915\n6.735062416676766 4.735062416676766\n15.337656041691915 13.337656041691915\n6.735062416676766 4.735062416676766\n7.696158041449521 5.696158041449521\n3.6784632165798086 1.6784632165798086\n" } ], "source": [ @@ -682,7 +562,7 @@ " \n", " model.constraints.add(\n", " #min_shifts <= sum(model.works[worker.id, week, day, shift.name] for week, day in Shifts.GetAllWeeksDays()) <= max_shifts\n", - " return inequality(min_shifts, sum(model.works[wid, week, day, shiftClass.name] for week, day in Shifts.GetAllWeeksDays()), max_shifts)\n", + " inequality(min_shifts, sum(model.works[worker.id, week, day, shift.name] for week, day in Shifts.GetAllWeeksDays()), max_shifts)\n", " )\n", " #return inequality(min_shifts, sum(model.works[wid, week, day, shiftClass.name] for week, day in Shifts.GetAllWeeksDays()), max_shifts)" ] @@ -713,7 +593,7 @@ { "output_type": "execute_result", "data": { - "text/plain": "[1, 6, 7, 11, 18, 25, 26, 27, 40, 41, 42]" + "text/plain": "[7, 6, 1, 11, 18, 27, 26, 25, 42, 41, 40]" }, "metadata": {}, "execution_count": 14 @@ -904,7 +784,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 18, "metadata": { "tags": [ "outputPrepend", @@ -915,7 +795,7 @@ { "output_type": "stream", "name": "stdout", - "text": "1 exeter_twilight\n1 truro_twilight\n1 torquay_twilight\n1 plymouth_twilight\n1 weekend_exeter\n1 weekend_truro\n1 weekend_torquay\n1 weekend_plymouth\n1 night\n2 exeter_twilight\n2 truro_twilight\n2 torquay_twilight\n2 plymouth_twilight\n2 weekend_exeter\n2 weekend_truro\n2 weekend_torquay\n2 weekend_plymouth\n2 night\n3 exeter_twilight\n3 truro_twilight\n3 torquay_twilight\n3 plymouth_twilight\n3 weekend_exeter\n3 weekend_truro\n3 weekend_torquay\n3 weekend_plymouth\n3 night\n4 exeter_twilight\n4 truro_twilight\n4 torquay_twilight\n4 plymouth_twilight\n4 weekend_exeter\n4 weekend_truro\n4 weekend_torquay\n4 weekend_plymouth\n4 night\n5 exeter_twilight\n5 truro_twilight\n5 torquay_twilight\n5 plymouth_twilight\n5 weekend_exeter\n5 weekend_truro\n5 weekend_torquay\n5 weekend_plymouth\n5 night\n6 exeter_twilight\n6 truro_twilight\n6 torquay_twilight\n6 plymouth_twilight\n6 weekend_exeter\n6 weekend_truro\n6 weekend_torquay\n6 weekend_plymouth\n6 night\n7 exeter_twilight\n7 truro_twilight\n7 torquay_twilight\n7 plymouth_twilight\n7 weekend_exeter\n7 weekend_truro\n7 weekend_torquay\n7 weekend_plymouth\n7 night\n8 exeter_twilight\n8 truro_twilight\n8 torquay_twilight\n8 plymouth_twilight\n8 weekend_exeter\n8 weekend_truro\n8 weekend_torquay\n8 weekend_plymouth\n8 night\n9 exeter_twilight\n9 truro_twilight\n9 torquay_twilight\n9 plymouth_twilight\n9 weekend_exeter\n9 weekend_truro\n9 weekend_torquay\n9 weekend_plymouth\n9 night\n10 exeter_twilight\n10 truro_twilight\n10 torquay_twilight\n10 plymouth_twilight\n10 weekend_exeter\n10 weekend_truro\n10 weekend_torquay\n10 weekend_plymouth\n10 night\n11 exeter_twilight\n11 truro_twilight\n11 torquay_twilight\n11 plymouth_twilight\n11 weekend_exeter\n11 weekend_truro\n11 weekend_torquay\n11 weekend_plymouth\n11 night\n12 exeter_twilight\n12 truro_twilight\n12 torquay_twilight\n12 plymouth_twilight\n12 weekend_exeter\n12 weekend_truro\n12 weekend_torquay\n12 weekend_plymouth\n12 night\n13 exeter_twilight\n13 truro_twilight\n13 torquay_twilight\n13 plymouth_twilight\n13 weekend_exeter\n13 weekend_truro\n13 weekend_torquay\n13 weekend_plymouth\n13 night\n14 exeter_twilight\n14 truro_twilight\n14 torquay_twilight\n14 plymouth_twilight\n14 weekend_exeter\n14 weekend_truro\n14 weekend_torquay\n14 weekend_plymouth\n14 night\n15 exeter_twilight\n15 truro_twilight\n15 torquay_twilight\n15 plymouth_twilight\n15 weekend_exeter\n15 weekend_truro\n15 weekend_torquay\n15 weekend_plymouth\n15 night\n16 exeter_twilight\n16 truro_twilight\n16 torquay_twilight\n16 plymouth_twilight\n16 weekend_exeter\n16 weekend_truro\n16 weekend_torquay\n16 weekend_plymouth\n16 night\n17 exeter_twilight\n17 truro_twilight\n17 torquay_twilight\n17 plymouth_twilight\n17 weekend_exeter\n17 weekend_truro\n17 weekend_torquay\n17 weekend_plymouth\n17 night\n18 exeter_twilight\n18 truro_twilight\n18 torquay_twilight\n18 plymouth_twilight\n18 weekend_exeter\n18 weekend_truro\n18 weekend_torquay\n18 weekend_plymouth\n18 night\n19 exeter_twilight\n19 truro_twilight\n19 torquay_twilight\n19 plymouth_twilight\n19 weekend_exeter\n19 weekend_truro\n19 weekend_torquay\n19 weekend_plymouth\n19 night\n20 exeter_twilight\n20 truro_twilight\n20 torquay_twilight\n20 plymouth_twilight\n20 weekend_exeter\n20 weekend_truro\n20 weekend_torquay\n20 weekend_plymouth\n20 night\n21 exeter_twilight\n21 truro_twilight\n21 torquay_twilight\n21 plymouth_twilight\n21 weekend_exeter\n21 weekend_truro\n21 weekend_torquay\n21 weekend_plymouth\n21 night\n22 exeter_twilight\n22 truro_twilight\n22 torquay_twilight\n22 plymouth_twilight\n22 weekend_exeter\n22 weekend_truro\n22 weekend_torquay\n22 weekend_plymouth\n22 night\n23 exeter_twilight\n23 truro_twilight\n23 torquay_twilight\n23 plymouth_twilight\n23 weekend_exeter\n23 weekend_truro\n23 weekend_torquay\n23 weekend_plymouth\n23 night\n24 exeter_twilight\n24 truro_twilight\n24 torquay_twilight\n24 plymouth_twilight\n24 weekend_exeter\n24 weekend_truro\n24 weekend_torquay\n24 weekend_plymouth\n24 night\n25 exeter_twilight\n25 truro_twilight\n25 torquay_twilight\n25 plymouth_twilight\n25 weekend_exeter\n25 weekend_truro\n25 weekend_torquay\n25 weekend_plymouth\n25 night\n26 exeter_twilight\n26 truro_twilight\n26 torquay_twilight\n26 plymouth_twilight\n26 weekend_exeter\n26 weekend_truro\n26 weekend_torquay\n26 weekend_plymouth\n26 night\n27 exeter_twilight\n27 truro_twilight\n27 torquay_twilight\n27 plymouth_twilight\n27 weekend_exeter\n27 weekend_truro\n27 weekend_torquay\n27 weekend_plymouth\n27 night\n28 exeter_twilight\n28 truro_twilight\n28 torquay_twilight\n28 plymouth_twilight\n28 weekend_exeter\n28 weekend_truro\n28 weekend_torquay\n28 weekend_plymouth\n28 night\n29 exeter_twilight\n29 truro_twilight\n29 torquay_twilight\n29 plymouth_twilight\n29 weekend_exeter\n29 weekend_truro\n29 weekend_torquay\n29 weekend_plymouth\n29 night\n30 exeter_twilight\n30 truro_twilight\n30 torquay_twilight\n30 plymouth_twilight\n30 weekend_exeter\n30 weekend_truro\n30 weekend_torquay\n30 weekend_plymouth\n30 night\n31 exeter_twilight\n31 truro_twilight\n31 torquay_twilight\n31 plymouth_twilight\n31 weekend_exeter\n31 weekend_truro\n31 weekend_torquay\n31 weekend_plymouth\n31 night\n32 exeter_twilight\n32 truro_twilight\n32 torquay_twilight\n32 plymouth_twilight\n32 weekend_exeter\n32 weekend_truro\n32 weekend_torquay\n32 weekend_plymouth\n32 night\n33 exeter_twilight\n33 truro_twilight\n33 torquay_twilight\n33 plymouth_twilight\n33 weekend_exeter\n33 weekend_truro\n33 weekend_torquay\n33 weekend_plymouth\n33 night\n34 exeter_twilight\n34 truro_twilight\n34 torquay_twilight\n34 plymouth_twilight\n34 weekend_exeter\n34 weekend_truro\n34 weekend_torquay\n34 weekend_plymouth\n34 night\n35 exeter_twilight\n35 truro_twilight\n35 torquay_twilight\n35 plymouth_twilight\n35 weekend_exeter\n35 weekend_truro\n35 weekend_torquay\n35 weekend_plymouth\n35 night\n36 exeter_twilight\n36 truro_twilight\n36 torquay_twilight\n36 plymouth_twilight\n36 weekend_exeter\n36 weekend_truro\n36 weekend_torquay\n36 weekend_plymouth\n36 night\n37 exeter_twilight\n37 truro_twilight\n37 torquay_twilight\n37 plymouth_twilight\n37 weekend_exeter\n37 weekend_truro\n37 weekend_torquay\n37 weekend_plymouth\n37 night\n38 exeter_twilight\n38 truro_twilight\n38 torquay_twilight\n38 plymouth_twilight\n38 weekend_exeter\n38 weekend_truro\n38 weekend_torquay\n38 weekend_plymouth\n38 night\n39 exeter_twilight\n39 truro_twilight\n39 torquay_twilight\n39 plymouth_twilight\n39 weekend_exeter\n39 weekend_truro\n39 weekend_torquay\n39 weekend_plymouth\n39 night\n40 exeter_twilight\n40 truro_twilight\n40 torquay_twilight\n40 plymouth_twilight\n40 weekend_exeter\n40 weekend_truro\n40 weekend_torquay\n40 weekend_plymouth\n40 night\n41 exeter_twilight\n41 truro_twilight\n41 torquay_twilight\n41 plymouth_twilight\n41 weekend_exeter\n41 weekend_truro\n41 weekend_torquay\n41 weekend_plymouth\n41 night\n42 exeter_twilight\n42 truro_twilight\n42 torquay_twilight\n42 plymouth_twilight\n42 weekend_exeter\n42 weekend_truro\n42 weekend_torquay\n42 weekend_plymouth\n42 night\n43 exeter_twilight\n43 truro_twilight\n43 torquay_twilight\n43 plymouth_twilight\n43 weekend_exeter\n43 weekend_truro\n43 weekend_torquay\n43 weekend_plymouth\n43 night\n44 exeter_twilight\n44 truro_twilight\n44 torquay_twilight\n44 plymouth_twilight\n44 weekend_exeter\n44 weekend_truro\n44 weekend_torquay\n44 weekend_plymouth\n44 night\n45 exeter_twilight\n45 truro_twilight\n45 torquay_twilight\n45 plymouth_twilight\n45 weekend_exeter\n45 weekend_truro\n45 weekend_torquay\n45 weekend_plymouth\n45 night\n46 exeter_twilight\n46 truro_twilight\n46 torquay_twilight\n46 plymouth_twilight\n46 weekend_exeter\n46 weekend_truro\n46 weekend_torquay\n46 weekend_plymouth\n46 night\n47 exeter_twilight\n47 truro_twilight\n47 torquay_twilight\n47 plymouth_twilight\n47weekend_exeter\n47 weekend_truro\n47 weekend_torquay\n47 weekend_plymouth\n47 night\n48 exeter_twilight\n48 truro_twilight\n48 torquay_twilight\n48 plymouth_twilight\n48 weekend_exeter\n48 weekend_truro\n48 weekend_torquay\n48 weekend_plymouth\n48 night\n49 exeter_twilight\n49 truro_twilight\n49 torquay_twilight\n49 plymouth_twilight\n49 weekend_exeter\n49 weekend_truro\n49 weekend_torquay\n49 weekend_plymouth\n49 night\n50 exeter_twilight\n50 truro_twilight\n50 torquay_twilight\n50 plymouth_twilight\n50 weekend_exeter\n50 weekend_truro\n50 weekend_torquay\n50 weekend_plymouth\n50 night\n51 exeter_twilight\n51 truro_twilight\n51 torquay_twilight\n51 plymouth_twilight\n51 weekend_exeter\n51 weekend_truro\n51 weekend_torquay\n51 weekend_plymouth\n51 night\n" + "text": "7 exeter_twilight\n7 truro_twilight\n7 torquay_twilight\n7 plymouth_twilight\n7 weekend_exeter\n7 weekend_truro\n7 weekend_torquay\n7 weekend_plymouth\n7 night\n6 exeter_twilight\n6 truro_twilight\n6 torquay_twilight\n6 plymouth_twilight\n6 weekend_exeter\n6 weekend_truro\n6 weekend_torquay\n6 weekend_plymouth\n6 night\n1 exeter_twilight\n1 truro_twilight\n1 torquay_twilight\n1 plymouth_twilight\n1 weekend_exeter\n1 weekend_truro\n1 weekend_torquay\n1 weekend_plymouth\n1 night\n11 exeter_twilight\n11 truro_twilight\n11 torquay_twilight\n11 plymouth_twilight\n11 weekend_exeter\n11 weekend_truro\n11 weekend_torquay\n11 weekend_plymouth\n11 night\n18 exeter_twilight\n18 truro_twilight\n18 torquay_twilight\n18 plymouth_twilight\n18 weekend_exeter\n18 weekend_truro\n18 weekend_torquay\n18 weekend_plymouth\n18 night\n27 exeter_twilight\n27 truro_twilight\n27 torquay_twilight\n27 plymouth_twilight\n27 weekend_exeter\n27 weekend_truro\n27 weekend_torquay\n27 weekend_plymouth\n27 night\n26 exeter_twilight\n26 truro_twilight\n26 torquay_twilight\n26 plymouth_twilight\n26 weekend_exeter\n26 weekend_truro\n26 weekend_torquay\n26 weekend_plymouth\n26 night\n25 exeter_twilight\n25 truro_twilight\n25 torquay_twilight\n25 plymouth_twilight\n25 weekend_exeter\n25 weekend_truro\n25 weekend_torquay\n25 weekend_plymouth\n25 night\n42 exeter_twilight\n42 truro_twilight\n42 torquay_twilight\n42 plymouth_twilight\n42 weekend_exeter\n42 weekend_truro\n42 weekend_torquay\n42 weekend_plymouth\n42 night\n41 exeter_twilight\n41 truro_twilight\n41 torquay_twilight\n41 plymouth_twilight\n41 weekend_exeter\n41 weekend_truro\n41 weekend_torquay\n41 weekend_plymouth\n41 night\n40 exeter_twilight\n40 truro_twilight\n40 torquay_twilight\n40 plymouth_twilight\n40 weekend_exeter\n40 weekend_truro\n40 weekend_torquay\n40weekend_plymouth\n40 night\n8 exeter_twilight\n8 truro_twilight\n8 torquay_twilight\n8 plymouth_twilight\n8 weekend_exeter\n8 weekend_truro\n8 weekend_torquay\n8 weekend_plymouth\n8 night\n3 exeter_twilight\n3 truro_twilight\n3 torquay_twilight\n3 plymouth_twilight\n3 weekend_exeter\n3 weekend_truro\n3 weekend_torquay\n3 weekend_plymouth\n3 night\n2 exeter_twilight\n2 truro_twilight\n2 torquay_twilight\n2 plymouth_twilight\n2 weekend_exeter\n2 weekend_truro\n2 weekend_torquay\n2 weekend_plymouth\n2 night\n12 exeter_twilight\n12 truro_twilight\n12 torquay_twilight\n12 plymouth_twilight\n12 weekend_exeter\n12 weekend_truro\n12 weekend_torquay\n12 weekend_plymouth\n12 night\n13 exeter_twilight\n13 truro_twilight\n13 torquay_twilight\n13 plymouth_twilight\n13 weekend_exeter\n13 weekend_truro\n13 weekend_torquay\n13 weekend_plymouth\n13 night\n19 exeter_twilight\n19 truro_twilight\n19 torquay_twilight\n19 plymouth_twilight\n19 weekend_exeter\n19 weekend_truro\n19 weekend_torquay\n19 weekend_plymouth\n19 night\n20 exeter_twilight\n20 truro_twilight\n20 torquay_twilight\n20 plymouth_twilight\n20 weekend_exeter\n20 weekend_truro\n20 weekend_torquay\n20 weekend_plymouth\n20 night\n34 exeter_twilight\n34 truro_twilight\n34 torquay_twilight\n34 plymouth_twilight\n34 weekend_exeter\n34 weekend_truro\n34 weekend_torquay\n34 weekend_plymouth\n34 night\n30 exeter_twilight\n30 truro_twilight\n30 torquay_twilight\n30 plymouth_twilight\n30 weekend_exeter\n30 weekend_truro\n30 weekend_torquay\n30 weekend_plymouth\n30 night\n31 exeter_twilight\n31 truro_twilight\n31 torquay_twilight\n31 plymouth_twilight\n31 weekend_exeter\n31 weekend_truro\n31 weekend_torquay\n31 weekend_plymouth\n31 night\n32 exeter_twilight\n32 truro_twilight\n32 torquay_twilight\n32 plymouth_twilight\n32 weekend_exeter\n32 weekend_truro\n32 weekend_torquay\n32 weekend_plymouth\n32 night\n29 exeter_twilight\n29 truro_twilight\n29 torquay_twilight\n29 plymouth_twilight\n29 weekend_exeter\n29 weekend_truro\n29 weekend_torquay\n29 weekend_plymouth\n29 night\n33 exeter_twilight\n33 truro_twilight\n33 torquay_twilight\n33 plymouth_twilight\n33 weekend_exeter\n33 weekend_truro\n33 weekend_torquay\n33weekend_plymouth\n33 night\n28 exeter_twilight\n28 truro_twilight\n28 torquay_twilight\n28 plymouth_twilight\n28 weekend_exeter\n28 weekend_truro\n28 weekend_torquay\n28 weekend_plymouth\n28 night\n43 exeter_twilight\n43 truro_twilight\n43 torquay_twilight\n43 plymouth_twilight\n43 weekend_exeter\n43 weekend_truro\n43 weekend_torquay\n43 weekend_plymouth\n43 night\n45 exeter_twilight\n45 truro_twilight\n45 torquay_twilight\n45 plymouth_twilight\n45 weekend_exeter\n45 weekend_truro\n45 weekend_torquay\n45 weekend_plymouth\n45 night\n46 exeter_twilight\n46 truro_twilight\n46 torquay_twilight\n46 plymouth_twilight\n46 weekend_exeter\n46 weekend_truro\n46 weekend_torquay\n46 weekend_plymouth\n46 night\n44 exeter_twilight\n44 truro_twilight\n44 torquay_twilight\n44 plymouth_twilight\n44 weekend_exeter\n44 weekend_truro\n44 weekend_torquay\n44 weekend_plymouth\n44 night\n4 exeter_twilight\n4 truro_twilight\n4 torquay_twilight\n4 plymouth_twilight\n4 weekend_exeter\n4 weekend_truro\n4 weekend_torquay\n4 weekend_plymouth\n4 night\n9 exeter_twilight\n9 truro_twilight\n9 torquay_twilight\n9 plymouth_twilight\n9 weekend_exeter\n9 weekend_truro\n9 weekend_torquay\n9 weekend_plymouth\n9 night\n15 exeter_twilight\n15 truro_twilight\n15 torquay_twilight\n15 plymouth_twilight\n15 weekend_exeter\n15 weekend_truro\n15 weekend_torquay\n15 weekend_plymouth\n15 night\n14 exeter_twilight\n14 truro_twilight\n14 torquay_twilight\n14 plymouth_twilight\n14 weekend_exeter\n14 weekend_truro\n14 weekend_torquay\n14 weekend_plymouth\n14 night\n21 exeter_twilight\n21 truro_twilight\n21 torquay_twilight\n21 plymouth_twilight\n21 weekend_exeter\n21 weekend_truro\n21 weekend_torquay\n21 weekend_plymouth\n21 night\n22 exeter_twilight\n22 truro_twilight\n22 torquay_twilight\n22 plymouth_twilight\n22 weekend_exeter\n22 weekend_truro\n22 weekend_torquay\n22 weekend_plymouth\n22 night\n36 exeter_twilight\n36 truro_twilight\n36 torquay_twilight\n36 plymouth_twilight\n36 weekend_exeter\n36 weekend_truro\n36 weekend_torquay\n36 weekend_plymouth\n36 night\n35 exeter_twilight\n35 truro_twilight\n35 torquay_twilight\n35 plymouth_twilight\n35 weekend_exeter\n35 weekend_truro\n35 weekend_torquay\n35 weekend_plymouth\n35 night\n37 exeter_twilight\n37 truro_twilight\n37 torquay_twilight\n37 plymouth_twilight\n37 weekend_exeter\n37 weekend_truro\n37 weekend_torquay\n37 weekend_plymouth\n37 night\n49 exeter_twilight\n49 truro_twilight\n49 torquay_twilight\n49 plymouth_twilight\n49 weekend_exeter\n49 weekend_truro\n49 weekend_torquay\n49 weekend_plymouth\n49 night\n47 exeter_twilight\n47 truro_twilight\n47 torquay_twilight\n47 plymouth_twilight\n47 weekend_exeter\n47 weekend_truro\n47 weekend_torquay\n47 weekend_plymouth\n47 night\n48 exeter_twilight\n48 truro_twilight\n48 torquay_twilight\n48 plymouth_twilight\n48 weekend_exeter\n48 weekend_truro\n48 weekend_torquay\n48 weekend_plymouth\n48 night\n5 exeter_twilight\n5 truro_twilight\n5 torquay_twilight\n5 plymouth_twilight\n5 weekend_exeter\n5 weekend_truro\n5 weekend_torquay\n5 weekend_plymouth\n5 night\n10 exeter_twilight\n10 truro_twilight\n10 torquay_twilight\n10 plymouth_twilight\n10 weekend_exeter\n10 weekend_truro\n10 weekend_torquay\n10 weekend_plymouth\n10 night\n24 exeter_twilight\n24 truro_twilight\n24 torquay_twilight\n24 plymouth_twilight\n24 weekend_exeter\n24 weekend_truro\n24 weekend_torquay\n24 weekend_plymouth\n24 night\n23 exeter_twilight\n23 truro_twilight\n23 torquay_twilight\n23 plymouth_twilight\n23 weekend_exeter\n23 weekend_truro\n23 weekend_torquay\n23 weekend_plymouth\n23 night\n17 exeter_twilight\n17 truro_twilight\n17 torquay_twilight\n17 plymouth_twilight\n17 weekend_exeter\n17 weekend_truro\n17 weekend_torquay\n17 weekend_plymouth\n17 night\n16 exeter_twilight\n16 truro_twilight\n16 torquay_twilight\n16 plymouth_twilight\n16 weekend_exeter\n16 weekend_truro\n16 weekend_torquay\n16 weekend_plymouth\n16 night\n39 exeter_twilight\n39 truro_twilight\n39 torquay_twilight\n39 plymouth_twilight\n39 weekend_exeter\n39 weekend_truro\n39 weekend_torquay\n39 weekend_plymouth\n39 night\n38 exeter_twilight\n38 truro_twilight\n38 torquay_twilight\n38 plymouth_twilight\n38 weekend_exeter\n38 weekend_truro\n38 weekend_torquay\n38 weekend_plymouth\n38 night\n50 exeter_twilight\n50 truro_twilight\n50 torquay_twilight\n50 plymouth_twilight\n50 weekend_exeter\n50 weekend_truro\n50 weekend_torquay\n50 weekend_plymouth\n50 night\n51 exeter_twilight\n51 truro_twilight\n51 torquay_twilight\n51 plymouth_twilight\n51 weekend_exeter\n51 weekend_truro\n51 weekend_torquay\n51 weekend_plymouth\n51 night\n" } ], "source": [ @@ -1005,7 +885,7 @@ }, { "cell_type": "code", - "execution_count": 116, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -1046,13 +926,13 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 20, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", - "text": "Worker 11111112222222333333344444445555555666666677777778888888999999900000001111111222222233333334444444555555566666667777777888888899999990000000111111122222223333333444444455555556666666\nWijhdan Abusrewil e----w----e---e------e-----w---e----e---w-----e----e------------e---------e---e-----nnnn----------e-----w----e--nnnn------e-------e---------nnnn--w-----------e---e----------w---e---w\nSeren Peters ---p---p-----------w------w--------p--------p---w----p--nnnn--------w-nnnn-------------p----p------------------w----nnn---------p--------nnn--p---w------w---------------------------w\nHannah Lewis -----w---p---w--------p--nnn--p---w----------------p---w-----w-nnnn--------w------w----------p-nnn---p--------w----------p-------------------p-----p-----------------nnn--------------\nChristian Greer -----w------w-----------t------t---t-----------------nnn--------------t---t-----t-------t-----t--------w------------t----t----nnnn----------------w----nnn--t----nnnn--------w----t---\nNicolas Dziad nnnn---t--------------t---w------w-----t----t-----------------------w---t-nnn---t----t-------------t---w----t---------w-----------t-----------t-nnn---t-----t-nnn---t------t--------w-\nMichal Tomek ----e----e-nnn-------nnnn----------e--------e-----e-------e---w----e--------------w---e---w------w-----w-nnnn---e-------e--nnn--e-------e---e----w-------w-------e---e----e----e---e--\nAlex Wood -------nnnn--w----e---e------e---w-----nnn-----w---------e-----e---nnn--e-----------e---e-----e----------e-----w---e---e---e---e---w------w------------e---e----w---e----e---------nnn\nAlexander Sanchez- Cabello-p-----------------w------w-nnnn----p---w-nnnn-----------p---w-------w---p-----p---------------p-------w---p-nnn----------------------p------------nnnn-------p----------p----------w-\nMax Ireland -t--nnn------------w-------w-------nnnn-----t---w-----w-----nnn------------w---t-----------t---t------------t---t-----------------t----t-----t---------t------------t----t--nnn-------\nVilim Kalamar --t---w----t------nnn--t----t---nnn-----------------------t-------t----t------------t-----------w-----t----t----t------------w-----w-nnnn---t-------t-----nnnn---------w-----------t--\nSalma Aslam -------------------------------------------------------------------------------------------e------------------------------------------------------------------------------------------\nAdeola Omotade ----------------------------------------------------------------------------------------------------------------------------------------------------------------w-------p-------------\nAmina Odeh ------w---p--------------p------------p---p---------p-----p-nnn-----------nnn-------------w---p--------w-nnnn----------p----w-------w-----w----p----------nnnn---------------w--------\nCharles Finan ------w------w-----------------------t---w-----------nnn--t------t---w--------t-----t---nnn----------t-----t------t-----t--nnn---t------t---nnnn---t------------------w---------t-----\nAlan Eccles -------t------t-------------------w---------------------t---t--nnnn----t---------------------t----t---nnn----t---t-----------w------w-----------------t----t----w-------nnnn----------\nSarath Vennam ------------w---t-nnn-----------t------nnn------w------w----t---------t------------w---t----t-------t-nnn--------t--------t----t-------t---w----nnn--t-----t----w---------t-----------\nPaul Ward t----------------t---nnnn-----t-----t----w---t---t---t-------w-----------t----------nnnn--w---t---------w-----------t--nnnn---t-----w----t--------w-----------nnn--t-----t--------t---\nSayed Alqarooni -e------e--------e--------w-------w------w----nnn---e---e---e----e---w---e-------------e----e--nnn--e---------w-----e-------w----e----e--------e-----e----e----w-nnnn----------nnnn---\nJean Sukumar -----------nnn---p-------------------------------p------nnnn-------p-------------nnn------------------------------------p---w----p-----p---w------------w------w----------------------\nJenn Fong nnnn-------p---p-----p-------p----------------p--nnnn------p------p---------w-------p------p-----w------------------nnn-------p---nnn-------------w------w-----w-------w-----w--------\nChong Ng ----------t---------w--------t---------t-------w-nnnn--w-----w-----nnn--t------------t----------------t---------------w---t---t-------t--nnn---------t-nnn----t---------t-------------\nMatthew Thorley ----nnn----------t---t---t-------w------w---------------------w----------t-------nnn--t----nnnn-----t------------------t----w-----nnn------w--------t--------t-------t-----t---t------\nJenna Millington --------t-----nnnn---------w----------t-------------------------------nnnn--------------t----t---w---t--------w-----------------t-------t---------------------t------t--------w-------\nChi Leung ---t---nnnn---t---t------------t---t----w---------------t------------------w------w--------t---t--nnnn----t-------t-----t--------t-----------------t----w------w--------nnnn---t------\nTom Welsh --e--------e---e----w-------e---e--nnnn------e---nnnn--w--------------e----------e------nnn----e------e---e------e---w-------w-------e-----w----nnn---e------e-----e---w---e----e---w-\nRebecca Murphy -----------nnn--e-------e-------nnn----e---e-----e----w----e--------w------w---e-----e---w---------e-------e----nnnn-----e----e-----w----e----e----e----w---e-----------e-----w----nnn\nDelilah Trimmer -------------------------e------------e---e-----w----nnn--------------------w----------------e-------e------e---------w----------------e--------e---------------------w-----e--nnnn---\nSophie McGlade -----w--------------w------w------w-------------w--------------nnnn----p------p--nnn-----w--------p---p---p---------nnn----p-------------p-----------p--------nnn-----w---p----p----w-\nS Ghauri ----nnn-----w----------p----p--------p---w-----w-------w----p------nnn------w-----w-------------------nnn---p-----p---w--------------nnnn-------p---------p---------p------p----------\nKhalil Madbak ------w------w-------------w----------------------------p------p----w------w-------w----p--nnnn-----p--------nnn---p---nnnn----p---w--------nnnn-------p---p----------------p---------\nNatasha Hougham --------------p---------------------------------------w-------w--------------p---p--------------w------------nnn----------p----------nnnn--w----------------------p----w---------p----\nRichard Chaytor --------------------w----nnn---p----------nnnn----p---w-------w-----------------p-----p-nnn------w------w----p---p----w------w-----w----p---p---------p--------------nnn--------p-----\nSafi Rahman ----------------------------------------------------------------------p----------------------------------------w----------------------------------------------------------------------\nGeorge Edwards ----p---p-----nnnn-------------------------p---w--------nnnn---------w----p--------------w------w-------w-------p----w-----nnn----p-------w------w-----------p---p---p-------------nnn\nNeil McIntyre t--------t-----t------t---------nnn-----------------t-----------t------------t---t-----t----t----w-------------w-----w-------------w-----nnn---t----------nnnn---t----------nnn--t---w\nMo Babsail ----t---t-----nnnn----------t----------nnn----t---t---------------t---------w-------------w-----w---------t--------------------------t------t----w-nnnn---t--------t------t-nnn-----w-\nPaul Jenkins --t-----------------------w-nnnn----t-----t--------t-----t-----t---t---------------w-----w-----nnn-------t----w-nnnn------------t-nnn----t----t---------w---------t---------t---------\nRoss Kruger ----t----------t-----t-------t------------t---t---t------------t-----w------w------------w--------nnnn---t---t---------t----w-nnnn--------w----t---nnnn--w---t-------nnn----t----t----\nAmoolya Mannava ---------t---w-----------t-----------t---------w---t-------t-----t--------t---t-----nnnn----------nnnn-------------t-----t------------t------t---w--------t-------t---w------w-nnnn--w\nTom Davies --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\nTania King Mohammed ------w-----------nnn--------------------------------------------------e--------e---------------w-----------------e--------------------------e------e--nnn------------------------e---\nJin Virdi ---e---e----w------w---e------e------e----nnnn-------e-------w----e---nnnn---e-----w--------------------------------------------------------------------------------------------------\nHuub Witt ------------w---p---------------p------------p------------------p-------p----nnnn--w---------------p----------------p---------nnnn--w------------w------w---p------p----nnnn--w------w\nMirna Long p-----------------p--nnnn--------w-------w--------------------------------------------------------------------------------------------------------------------------------------------\nJon Stokes ----------------------------------------w-----------------------------------------------------------------------------------------------------------------------------------------p---\nKaris McFeely --p---------------------p--------w-----p------nnn-----------nnn--p-----------nnnn----p----w--------------p----w------w-nnnn--w-------p--------------p-----------w-----w-------w----p--\nHarriet Conley ---------------------------------------------t-------------------------------------------------------------------------------------------------------------------------w--------------\nJon Skinner nnnn-------t----t-------------t-------t-------nnn----t-----t-----------------nnnn------------------t----w----------t-------t---t----------w-----t--------w-----w-nnnn---------w----t--\nGana Kugathasan ---t--------------t----t--------t--nnnn----t-----t------------------w-----nnn-----w---------------------------------------------------------------------------------------------------\nJack Looker -t---w----t--------w----t---nnnn----------------------w-------w----t-----------t------t----nnnn---t------nnnn--w-----w-----t---------t----------t------t---------t------t-------t-----\nPete Abernethy -------nnnn---------w----nnn------w--------t--------t----t------t------------t---t----------------------------------------------------------------------------------------------------\n1 e 2: ,exeter_twilight (18),weekend_exeter (7),night (12)\n2 p 2: ,plymouth_twilight (9),weekend_plymouth (8),night (14)\n3 p 2: ,plymouth_twilight (9),weekend_plymouth (8),night (13)\n4 t 2: ,torquay_twilight (12),weekend_torquay (5),night (14)\n5 t 2: ,truro_twilight (15),weekend_truro (6),night (13)\n6 e 2: ,exeter_twilight (18),weekend_exeter (7),night (14)\n7 e 2: ,exeter_twilight (18),weekend_exeter (7),night (13)\n8 p 2: ,plymouth_twilight (10),weekend_plymouth (7),night (15)\n9 t 2: ,torquay_twilight (13),weekend_torquay (5),night (13)\n10 t 2: ,truro_twilight (14),weekend_truro (5),night (14)\n11 e 3: ,exeter_twilight (1)\n12 p 3: ,plymouth_twilight (1),weekend_plymouth (1)\n13 p 3: ,plymouth_twilight (9),weekend_plymouth (7),night (14)\n14 t 3: ,torquay_twilight (13),weekend_torquay (5),night (13)\n15 t 3: ,torquay_twilight (11),weekend_torquay (4),night (11)\n16 t 3: ,truro_twilight (14),weekend_truro (6),night (12)\n17 t 3: ,truro_twilight (15),weekend_truro (6),night (15)\n18 e 3: ,exeter_twilight (17),weekend_exeter (7),night (14)\n19 p 3: ,plymouth_twilight (6),weekend_plymouth (4),night (10)\n20 p 3: ,plymouth_twilight (10),weekend_plymouth (7),night (14)\n21 t 3: ,torquay_twilight (12),weekend_torquay (5),night (13)\n22 t 3: ,torquay_twilight (12),weekend_torquay (5),night (13)\n23 t 3: ,truro_twilight (9),weekend_truro (4),night (8)\n24 t 3: ,truro_twilight (14),weekend_truro (5),night (12)\n25 e 4: ,exeter_twilight (18),weekend_exeter (7),night (14)\n26 e 4: ,exeter_twilight (17),weekend_exeter (7),night (13)\n27 e 4: ,exeter_twilight (9),weekend_exeter (4),night (7)\n28 p 4: ,plymouth_twilight (10),weekend_plymouth (8),night (13)\n29 p 4: ,plymouth_twilight (10),weekend_plymouth (7),night (13)\n30 p 4: ,plymouth_twilight (9),weekend_plymouth (7),night (15)\n31 p 4: ,plymouth_twilight (6),weekend_plymouth (5),night (7)\n32 p 4: ,plymouth_twilight (10),weekend_plymouth (8),night (13)\n33 p 4: ,plymouth_twilight (1),weekend_plymouth (1)\n34 p 4: ,plymouth_twilight (9),weekend_plymouth (8),night (14)\n35 t 4: ,torquay_twilight (13),weekend_torquay (5),night (13)\n36 t 4: ,torquay_twilight (12),weekend_torquay (5),night (14)\n37 t 4: ,torquay_twilight (13),weekend_torquay (5),night (14)\n38 t 4: ,truro_twilight (15),weekend_truro (6),night (15)\n39 t 4: ,truro_twilight (14),weekend_truro (6),night (12)\n40 e 5: \n41 e 5: ,exeter_twilight (6),weekend_exeter (2),night (6)\n42 e 5: ,exeter_twilight (8),weekend_exeter (4),night (8)\n43 p 5: ,plymouth_twilight (9),weekend_plymouth (7),night (12)\n44 p 5: ,plymouth_twilight (2),weekend_plymouth (2),night (4)\n45 p 5: ,plymouth_twilight (1),weekend_plymouth (1)\n46 p 5: ,plymouth_twilight (9),weekend_plymouth (8),night (14)\n47 t 5: ,torquay_twilight (1),weekend_torquay (1)\n48 t 5: ,torquay_twilight (12),weekend_torquay (5),night (15)\n49 t 5: ,torquay_twilight (6),weekend_torquay (2),night (7)\n50 t 5: ,truro_twilight (14),weekend_truro (6),night (12)\n51 t 5: ,truro_twilight (6),weekend_truro (2),night (7)\n" + "text": "Worker 11111112222222333333344444445555555666666677777778888888999999900000001111111222222233333334444444555555566666667777777888888899999990000000111111122222223333333444444455555556666666\nAlex Wood --e-------e-------e-------w-nnnn-----e------e---w-----------e---e----w-------nnnn--w--------e---w---e------e------e----e-------------e---e--nnnn--w-----w-----e----e-----e--nnn--e----\nMichal Tomek ---e---------w---e-------e-------w--------e------nnnn-----e------e--------------e-------e-----e---nnnn--w---e--------w----e--------w----e----e-----e---e---e---w-nnnn---e----w----e---\nWijhdan Abusrewil -e-----e------e----w-nnnn---e------e----------e---e------------e---nnn---------------e---w-----------e-------e---e-------e---w---e----e-----e----w-nnnn--w---e---------w------w----nnn\nSalma Aslam ---------------------e----------------------------------------------------------------------------------------w-----------------------------------------------------------------------\nSayed Alqarooni e----w-nnnn----e-------e-nnn---e---nnnn--w------------w------w----e---e-----w-------e-----w-------e---e------------e----------e---e--nnnn--w--------------e------e---e------e------e--\nDelilah Trimmer ----e-----------------------------------w----------e---w---e-------------e-----e------e----------------------------------------e---------nnn---------e----------w---e---nnnn----------\nRebecca Murphy ------------------------e----e---------e-------w-----e--nnnn--w-----w---e----e---nnn---e-----e---w--------e----w----e---e---w---e-nnn--e-------e----e--nnn--e--------------e---------w\nTom Welsh --------e---w---e---w---------e-nnn---e------e-----------e-----nnnn-------e---e---w--------e---e---e---w--------e-----w----e--------w-----------e-----e---nnnn----e---w---e----e---nnn\nJin Virdi nnnn--w----e----------e----w----e---e------e-----e------e----------e---e---w-nnnn-----------------------------------------------------------------------------------------------------\nTania King Mohammed ---------e------------------nnnn--w-----------------e----------------------------e-----------------------e--------------------------------w---e---------------------------------e---w-\nTom Davies --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\nAlexander Sanchez- Cabello--------p---w------w-----nnn-----w--------nnnn---------w----nnn-------p--------p----------w---p-------p----p--------nnn----p-------w------------p--------w---p-------p--------------w-\nHannah Lewis ------w------w---p-----p------------p--nnn-----------nnn-----------p----------p----w-----w--------p------------w--------------p-----w----nnn---p-------nnn------------w----p---p------\nSeren Peters --p-----------------w---p---p---nnn------w---p-------p----------------nnnn---p----w-----nnn------------w-----p-----p---------w--------p----w------------w-----nnn-----w---------------\nAdeola Omotade ---------------------------------------------------------------------w--------------------------------------------------------------------------------------------p-------------------\nAmina Odeh -------p---------------------------p-----------w-------w-----w----------p-------p---p------nnnn---------w-------------w-------nnnn---p----w-nnnn------------p---w-----------p---p-----\nJean Sukumar ---------p--------------------p--------nnn-----------------p-----------p---w----------p----------------------nnn----p-------w-----nnn------w------w----------------------------------w\nJenn Fong ---p-----------p--nnn------------------p--nnnn---p-------------------------w-nnnn------p----p---w--------------------w---p-----p----w----p-------w-nnnn---p-----w-------------w-----w-\nGeorge Edwards -------------w-----------p-----p-------nnn----p---p---w-----nnn-----w-------w----nnn---------p-----p---w---------p---------------------------p-------p---w----nnn------w----nnn-------\nKhalil Madbak p---nnn-------------w------------w---------p--------p----------p---nnn----p--------w-----w------w---------------p---nnn-----w----------p----------------------nnn---p---p----w----p---\nNatasha Hougham -------------------w-----------------p---w----------------p-----------nnnn--------w--------------w------------w---------p-----------------------nnn-----------p-----------p-----------\nRichard Chaytor ---------------------------w------w-----w-----nnn-----w------w----p-----------------nnnn--w---------------p-------p-nnn------------w----p---p---------p----p---w-nnnn----p-------p----\nS Ghauri ------w---p-----p----------w----------------------------------w------w-----------p--nnnn---p--------p----p-----w-----w--------nnnn------------p----p-------------nnnn---------w----p--\nSafi Rahman ------------------------------------------p----------------------------------------------------------------------------------------------------------------------------w--------------\nSophie McGlade -p---w------w---------p------------nnnn---------w----nnn------w-----w----p-----------p--nnn----p------nnn---p-------------p------p--------w-------w----p-----------------------------w\nHuub Witt -----w--------p------p-------p--------------p-----------p---p---p-----------w----nnn-------nnnn--w------w-------nnnn--w------w----p---------nnnn----p---w--------p--------------------\nJon Stokes ----p-----------------------------w---------------------------------------------------------------------------------------------------------------------------------------------------\nKaris McFeely -----------p------p-------w-------------w-nnnn--w--------p-------p--------nnn-----------p------nnn---p--------w--------p--------p----------------w-------------w---p-nnn-----w--------\nMirna Long -----------nnn------------w-----p-----p--------w---p----------------------------------------------------------------------------------------------------------------------------------\nChristian Greer nnnn-------t------nnn--t------t----------w---t---t------------------------t-------------t---------t----w-nnnn--------w----t---t---------------t----t------t-----w----nnn------w-------\nMax Ireland -t----w----nnn-------------w---t--------------t----t--------t----t-----------t---t--------w-----------nnn--t-------t---nnnn------t--------------nnn------------w------w----t---t------\nAlan Eccles ----------t--------w------w---------------t------------w-------t---------t-------------t--------------nnn---t---nnnn--w--------------t-----------------t---t--------------t-nnn--t----\nCharles Finan ---t--------------------t---------w--------t---w---------t-----nnnn---t-----w------------w----t------t---nnnn--------------nnn----t------nnn---t------t-----------t------t-----------w\nChong Ng t------------w----t----------t--------------t-nnn-------t----------nnn------------w-----nnn-----------t------t----------t--nnn-----w---t---w---------------------t------t-------t---w-\nMatthew Thorley ----t----t-nnn---t--------------t------t--------w---t--------------t----------t-------------t---w---t----------w--------------nnnn----------t-------t---w-nnnn---------w-------nnnn---\nMo Babsail ----nnn-------nnnn---------------w----t--------------t-----t---------w----------t----t-----------w------w----nnn--t------t-nnn--t--------t---t----w---------t-------t-------------t---\nNeil McIntyre -----w--------------w----nnn---------t------------t--nnn--------t------t---w--------t------t---t--nnnn----------t---t-------w---------t---------t--------w---t-------nnn----t---------\nPaul Jenkins nnnn----------t-------t------------t------------------w------------------------t------------------nnnn----t------t-----t---t---t----w-----w------w---t----nnnn-----t---------w-----t--\nGana Kugathasan -------t----w---t----t---t------nnn--------------------------w----t---nnnn---------w--------------------------------------------------------------------------------------------------\nHarriet Conley ---------------------------------------------------------------------------------------------t----------------------------------------------------------------------------------------\nJon Skinner --t-----t------t--nnn-------t-------t---w--------nnnn-----t---w-----w---t-nnn---------t------------t-----t----w--------------w----------t----------nnnn-------t------t----------------\nNicolas Dziad -------t------nnnn-------------t----t----w------w---------------t----w------w-------nnnn------t------t------t-------t-------------nnn--t---w---t---t---t-------w-----t----t----nnnn---\nVilim Kalamar ------w----t-----t---t--------t----nnnn--------------------t--------w----------t--------t--nnnn--w---------t-nnn-----w-----t------t--nnnn---t-----------w---t------------t----w----t--\nChi Leung t------nnnn--w---------t----nnnn-----t-------t---t----w-nnnn------------------t--------t-----t-nnn----t-------w---------t----w---t------t-----------------------------------t---t---w-\nJenna Millington ---------------t----------------t--------------------t--------w---t-----t----------------w---------------t------nnnn---t------t-----------w---------------------w-------nnnn------t---\nPaul Ward --t-nnn-----w---t-------t---t-----w---------------t-------t---------------nnn---t---------w------------------------t---nnnn-----t---w--------t--------t----t------t---w-nnnn-----t----\nSarath Vennam -t------------------w------------------t---t----------------nnn--------------t------t----------nnn--t---w-------t-----w---t----t---w----------t-nnn--t---w---t---t------t----------nnn\nAmoolya Mannava ---t----t-----t---t---t---w--------t----------nnn---t---nnnn---t------t---t-------w---t----t----w--------nnnn--w-------nnnn-----------t----------w--------t---------t--------w--------\nRoss Kruger -----w-nnnn----------nnnn--w--------------t---t----------t---w-nnnn------t---------w-----------t---t------t------t-------t-----------t---t--------w----nnn----t--------w---t---t------\nJack Looker ---------t---------w-nnnn-------------t--------w---t----t---t------t-------w-----t---t------t-----t----w-----t----t---------w--------nnnn-------t---t--------------t-----------nnnn--w\nPete Abernethy ----t-----t---nnnn-------t---t---w------w---t----nnnn--w---------t-----t--------------------------------------------------------------------------------------------------------------\n7 e 2: ,exeter_twilight (18),weekend_exeter (7),night (15)\n6 e 2: ,exeter_twilight (18),weekend_exeter (7),night (12)\n1 e 2: ,exeter_twilight (17),weekend_exeter (7),night (14)\n11 e 3: ,exeter_twilight (1),weekend_exeter (1)\n18 e 3: ,exeter_twilight (17),weekend_exeter (7),night (15)\n27 e 4: ,exeter_twilight (9),weekend_exeter (3),night (7)\n26 e 4: ,exeter_twilight (17),weekend_exeter (7),night (13)\n25 e 4: ,exeter_twilight (18),weekend_exeter (7),night (14)\n42 e 5: ,exeter_twilight (9),weekend_exeter (3),night (8)\n41 e 5: ,exeter_twilight (6),weekend_exeter (3),night (4)\n40 e 5: \n8 p 2: ,plymouth_twilight (10),weekend_plymouth (8),night (13)\n3 p 2: ,plymouth_twilight (10),weekend_plymouth (7),night (12)\n2 p 2: ,plymouth_twilight (9),weekend_plymouth (8),night (13)\n12 p 3: ,plymouth_twilight (1),weekend_plymouth (1)\n13 p 3: ,plymouth_twilight (9),weekend_plymouth (7),night (12)\n19 p 3: ,plymouth_twilight (6),weekend_plymouth (5),night (9)\n20 p 3: ,plymouth_twilight (10),weekend_plymouth (8),night (15)\n34 p 4: ,plymouth_twilight (9),weekend_plymouth (7),night (15)\n30 p 4: ,plymouth_twilight (10),weekend_plymouth (7),night (12)\n31 p 4: ,plymouth_twilight (5),weekend_plymouth (5),night (7)\n32 p 4: ,plymouth_twilight (9),weekend_plymouth (8),night (14)\n29 p 4: ,plymouth_twilight (9),weekend_plymouth (7),night (12)\n33 p 4: ,plymouth_twilight (1),weekend_plymouth (1)\n28 p 4: ,plymouth_twilight (9),weekend_plymouth (8),night (13)\n43 p 5: ,plymouth_twilight (10),weekend_plymouth (7),night (15)\n45 p 5: ,plymouth_twilight (1),weekend_plymouth (1)\n46 p 5: ,plymouth_twilight (9),weekend_plymouth (7),night (13)\n44 p 5: ,plymouth_twilight (3),weekend_plymouth (2),night (3)\n4 t 2: ,torquay_twilight (13),weekend_torquay (5),night (14)\n9 t 2: ,torquay_twilight (13),weekend_torquay (5),night (13)\n15 t 3: ,torquay_twilight (11),weekend_torquay (4),night (10)\n14 t 3: ,torquay_twilight (12),weekend_torquay (5),night (14)\n21 t 3: ,torquay_twilight (12),weekend_torquay (5),night (12)\n22 t 3: ,torquay_twilight (12),weekend_torquay (5),night (15)\n36 t 4: ,torquay_twilight (13),weekend_torquay (5),night (13)\n35 t 4: ,torquay_twilight (13),weekend_torquay (5),night (13)\n37 t 4: ,torquay_twilight (12),weekend_torquay (5),night (12)\n49 t 5: ,torquay_twilight (5),weekend_torquay (3),night (7)\n47 t 5: ,torquay_twilight (1)\n48 t 5: ,torquay_twilight (13),weekend_torquay (5),night (14)\n5 t 2: ,truro_twilight (14),weekend_truro (6),night (15)\n10 t 2: ,truro_twilight (14),weekend_truro (6),night (15)\n24 t 3: ,truro_twilight (14),weekend_truro (5),night (15)\n23 t 3: ,truro_twilight (9),weekend_truro (4),night (8)\n17 t 3: ,truro_twilight (14),weekend_truro (5),night (14)\n16 t 3: ,truro_twilight (14),weekend_truro (5),night (12)\n39 t 4: ,truro_twilight (15),weekend_truro (6),night (15)\n38 t 4: ,truro_twilight (14),weekend_truro (6),night (15)\n50 t 5: ,truro_twilight (15),weekend_truro (6),night (12)\n51 t 5: ,truro_twilight (7),weekend_truro (3),night (8)\n" } ], "source": [ @@ -1063,7 +943,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -1072,7 +952,7 @@ "text/plain": "[('Mon', 'exeter_twilight'),\n ('Tue', 'exeter_twilight'),\n ('Wed', 'exeter_twilight'),\n ('Thu', 'exeter_twilight'),\n ('Fri', 'exeter_twilight'),\n ('Mon', 'truro_twilight'),\n ('Tue', 'truro_twilight'),\n ('Wed', 'truro_twilight'),\n ('Thu', 'truro_twilight'),\n ('Fri', 'truro_twilight'),\n ('Mon', 'torquay_twilight'),\n ('Tue', 'torquay_twilight'),\n ('Wed', 'torquay_twilight'),\n ('Thu', 'torquay_twilight'),\n ('Fri', 'torquay_twilight'),\n ('Mon', 'plymouth_twilight'),\n ('Tue', 'plymouth_twilight'),\n ('Wed', 'plymouth_twilight'),\n ('Thu', 'plymouth_twilight'),\n ('Fri', 'plymouth_twilight'),\n ('Sat', 'weekend_exeter'),\n ('Sun', 'weekend_exeter'),\n ('Sat', 'weekend_truro'),\n ('Sun', 'weekend_truro'),\n ('Sat', 'weekend_torquay'),\n ('Sun', 'weekend_torquay'),\n ('Sat', 'weekend_plymouth'),\n ('Sun', 'weekend_plymouth'),\n ('Mon', 'night'),\n ('Tue', 'night'),\n ('Wed', 'night'),\n ('Thu', 'night'),\n ('Fri', 'night'),\n ('Sat', 'night'),\n ('Sun', 'night')]" }, "metadata": {}, - "execution_count": 80 + "execution_count": 21 } ], "source": [ @@ -1082,16 +962,16 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 22, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { - "text/plain": "4']},\n 'Wed': {'exeter_twilight': ['41 e 5'],\n 'truro_twilight': ['24 t 3'],\n 'torquay_twilight': ['14 t 3'],\n 'plymouth_twilight': ['29 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['1 e 2', '26 e 4', '37 t 4']},\n 'Thu': {'exeter_twilight': ['7 e 2'],\n 'truro_twilight': ['39 t 4'],\n 'torquay_twilight': ['48 t 5'],\n 'plymouth_twilight': ['30 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['1 e 2', '26 e 4', '37 t 4']},\n 'Fri': {'exeter_twilight': ['18 e 3'],\n 'truro_twilight': ['17 t 3'],\n 'torquay_twilight': ['4 t 2'],\n 'plymouth_twilight': ['43 p 5'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['2 p 2', '20 p 3', '28 p 4']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['25 e 4'],\n 'weekend_truro': ['50 t 5'],\n 'weekend_torquay': ['35 t 4'],\n 'weekend_plymouth': ['34 p 4', '46 p 5'],\n 'night': ['2 p 2', '20 p 3', '28 p 4']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['27 e 4'],\n 'weekend_truro': ['5 t 2'],\n 'weekend_torquay': ['21 t 3'],\n 'weekend_plymouth': ['29 p 4', '32 p 4'],\n 'night': ['2 p 2', '20 p 3', '28 p 4']}},\n 18: {'Mon': {'exeter_twilight': ['7 e 2'],\n 'truro_twilight': ['38 t 4'],\n 'torquay_twilight': ['22 t 3'],\n 'plymouth_twilight': ['13 p 3'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['17 t 3', '30 p 4', '46 p 5']},\n 'Tue': {'exeter_twilight': ['6 e 2'],\n 'truro_twilight': ['24 t 3'],\n 'torquay_twilight': ['14 t 3'],\n 'plymouth_twilight': ['19 p 3'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['17 t 3', '30 p 4', '46 p 5']},\n 'Wed': {'exeter_twilight': ['26 e 4'],\n 'truro_twilight': ['39 t 4'],\n 'torquay_twilight': ['4 t 2'],\n 'plymouth_twilight': ['3 p 2'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['17 t 3', '30 p 4', '46 p 5']},\n 'Thu': {'exeter_twilight': ['1 e 2'],\n 'truro_twilight': ['16 t 3'],\n 'torquay_twilight': ['21 t 3'],\n 'plymouth_twilight': ['31 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['17 t 3', '30 p 4', '46 p 5']},\n 'Fri': {'exeter_twilight': ['7 e 2'],\n 'truro_twilight': ['50 t 5'],\n 'torquay_twilight': ['48 t 5'],\n 'plymouth_twilight': ['28 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['6 e 2', '14 t 3', '34 p 4']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['18 e 3'],\n 'weekend_truro': ['38 t 4'],\n 'weekend_torquay': ['22 t 3'],\n 'weekend_plymouth': ['13 p 3', '19 p 3'],\n 'night': ['6 e 2', '14 t 3', '34 p 4']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['25 e 4'],\n 'weekend_truro': ['10 t 2'],\n 'weekend_torquay': ['15 t 3'],\n 'weekend_plymouth': ['32 p 4', '46 p 5'],\n 'night': ['6 e 2', '14 t 3', '34 p 4']}},\n 19: {'Mon': {'exeter_twilight': ['26 e 4'],\n 'truro_twilight': ['17 t 3'],\n 'torquay_twilight': ['21 t 3'],\n 'plymouth_twilight': ['20 p 3'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['4 t 2', '38 t 4', '43 p 5']},\n 'Tue': {'exeter_twilight': ['7 e 2'],\n 'truro_twilight': ['16 t 3'],\n 'torquay_twilight': ['48 t 5'],\n 'plymouth_twilight': ['30 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['4 t 2', '38 t 4', '43 p 5']},\n 'Wed': {'exeter_twilight': ['6 e 2'],\n 'truro_twilight': ['23 t 3'],\n 'torquay_twilight': ['37 t 4'],\n 'plymouth_twilight': ['2 p 2'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['4 t 2', '38 t 4', '43 p 5']},\n 'Thu': {'exeter_twilight': ['18 e 3'],\n 'truro_twilight': ['24 t 3'],\n 'torquay_twilight': ['14 t 3'],\n 'plymouth_twilight': ['19 p 3'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['4 t 2', '38 t 4', '43 p 5']},\n 'Fri': {'exeter_twilight': ['1 e 2'],\n 'truro_twilight': ['5 t 2'],\n 'torquay_twilight': ['9 t 2'],\n 'plymouth_twilight': ['34 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['20 p 3', '22 t 3', '37 t 4']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['7 e 2'],\n 'weekend_truro': ['10 t 2'],\n 'weekend_torquay': ['35 t 4'],\n 'weekend_plymouth': ['30 p 4', '32 p 4'],\n 'night': ['20 p 3', '22 t 3', '37 t 4']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['26 e 4'],\n 'weekend_truro': ['17 t 3'],\n 'weekend_torquay': ['15 t 3'],\n 'weekend_plymouth': ['13 p 3', '43 p 5'],\n 'night': ['20 p 3', '22 t 3', '37 t 4']}},\n 20: {'Mon': {'exeter_twilight': ['25 e 4'],\n 'truro_twilight': ['50 t 5'],\n 'torquay_twilight': ['36 t 4'],\n 'plymouth_twilight': ['46 p 5'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['10 t 2', '29 p 4', '31 p 4']},\n 'Tue': {'exeter_twilight': ['18 e 3'],\n 'truro_twilight': ['39 t 4'],\n 'torquay_twilight': ['21 t 3'],\n 'plymouth_twilight': ['8 p 2'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['10 t 2', '29 p 4', '31 p 4']},\n 'Wed': {'exeter_twilight': ['27 e 4'],\n 'truro_twilight': ['16 t 3'],\n 'torquay_twilight': ['9 t 2'],\n 'plymouth_twilight': ['19 p 3'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['10 t 2', '29 p 4', '31 p 4']},\n 'Thu': {'exeter_twilight': ['6 e 2'],\n 'truro_twilight': ['23 t 3'],\n 'torquay_twilight': ['14 t 3'],\n 'plymouth_twilight': ['32 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['10 t 2', '29 p 4', '31 p 4']},\n 'Fri': {'exeter_twilight': ['26 e 4'],\n 'truro_twilight': ['17 t 3'],\n 'torquay_twilight': ['37 t 4'],\n 'plymouth_twilight': ['28 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['2 p 2', '21 t 3', '35 t 4']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['7 e 2'],\n 'weekend_truro': ['38 t 4'],\n 'weekend_torquay': ['48 t 5'],\n 'weekend_plymouth': ['13 p 3', '34 p 4'],\n 'night': ['2 p 2', '21 t 3', '35 t 4']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['25 e 4'],\n 'weekend_truro': ['16 t 3'],\n 'weekend_torquay': ['22 t 3'],\n 'weekend_plymouth': ['19 p 3', '31 p 4'],\n 'night': ['2 p 2', '21 t 3', '35 t 4']}},\n 21: {'Mon': {'exeter_twilight': ['6 e 2'],\n 'truro_twilight': ['10 t 2'],\n 'torquay_twilight': ['36 t 4'],\n 'plymouth_twilight': ['32 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['1 e 2', '14 t 3', '30 p 4']},\n 'Tue': {'exeter_twilight': ['41 e 5'],\n 'truro_twilight': ['39 t 4'],\n 'torquay_twilight': ['9 t 2'],\n 'plymouth_twilight': ['3 p 2'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['1 e 2', '14 t 3', '30 p 4']},\n 'Wed': {'exeter_twilight': ['26 e 4'],\n 'truro_twilight': ['5 t 2'],\n 'torquay_twilight': ['37 t 4'],\n 'plymouth_twilight': ['2 p 2'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['1 e 2', '14 t 3', '30 p 4']},\n 'Thu': {'exeter_twilight': ['18 e 3'],\n 'truro_twilight': ['38 t 4'],\n 'torquay_twilight': ['35 t 4'],\n 'plymouth_twilight': ['13 p 3'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['1 e 2', '14 t 3', '30 p 4']},\n 'Fri': {'exeter_twilight': ['27 e 4'],\n 'truro_twilight': ['50 t 5'],\n 'torquay_twilight': ['48 t 5'],\n 'plymouth_twilight': ['29 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['5 t 2', '16 t 3', '25 e 4']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['6 e 2'],\n 'weekend_truro': ['39 t 4'],\n 'weekend_torquay': ['36 t 4'],\n 'weekend_plymouth': ['34 p 4', '43 p 5'],\n 'night': ['5 t 2', '16 t 3', '25 e 4']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['1 e 2'],\n 'weekend_truro': ['17 t 3'],\n 'weekend_torquay': ['4 t 2'],\n 'weekend_plymouth': ['2 p 2', '20 p 3'],\n 'night': ['5 t 2', '16 t 3', '25 e 4']}},\n 22: {'Mon': {'exeter_twilight': ['26 e 4'],\n 'truro_twilight': ['24 t 3'],\n 'torquay_twilight': ['14 t 3'],\n 'plymouth_twilight': ['3 p 2'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['8 p 2', '36 t 4', '38 t 4']},\n 'Tue': {'exeter_twilight': ['41 e 5'],\n 'truro_twilight': ['10 t 2'],\n 'torquay_twilight': ['22 t 3'],\n 'plymouth_twilight': ['46 p 5'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['8 p 2', '36 t 4', '38 t 4']},\n 'Wed': {'exeter_twilight': ['18 e 3'],\n 'truro_twilight': ['16 t 3'],\n 'torquay_twilight': ['21 t 3'],\n 'plymouth_twilight': ['28 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['8 p 2', '36 t 4', '38 t 4']},\n 'Thu': {'exeter_twilight': ['25 e 4'],\n 'truro_twilight': ['5 t 2'],\n 'torquay_twilight': ['15 t 3'],\n 'plymouth_twilight': ['32 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['8 p 2', '36 t 4', '38 t 4']},\n 'Fri': {'exeter_twilight': ['7 e 2'],\n 'truro_twilight': ['50 t 5'],\n 'torquay_twilight': ['9 t 2'],\n 'plymouth_twilight': ['30 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['4 t 2', '21 t 3', '41 e 5']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['26 e 4'],\n 'weekend_truro': ['24 t 3'],\n 'weekend_torquay': ['37 t 4'],\n 'weekend_plymouth': ['19 p 3', '43 p 5'],\n 'night': ['4 t 2', '21 t 3', '41 e 5']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['6 e 2'],\n 'weekend_truro': ['38 t 4'],\n 'weekend_torquay': ['48 t 5'],\n 'weekend_plymouth': ['2 p 2', '20 p 3'],\n 'night': ['4 t 2', '21 t 3', '41 e 5']}},\n 23: {'Mon': {'exeter_twilight': ['18 e 3'],\n 'truro_twilight': ['39 t 4'],\n 'torquay_twilight': ['36 t 4'],\n 'plymouth_twilight': ['29 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['10 t 2', '13 p 3', '35 t 4']},\n 'Tue': {'exeter_twilight': ['7 e 2'],\n 'truro_twilight': ['16 t 3'],\n 'torquay_twilight': ['15 t 3'],\n 'plymouth_twilight': ['30 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['10 t 2', '13 p 3', '35 t 4']},\n 'Wed': {'exeter_twilight': ['26 e 4'],\n 'truro_twilight': ['5 t 2'],\n 'torquay_twilight': ['4 t 2'],\n 'plymouth_twilight': ['43 p 5'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['10 t 2', '13 p 3', '35 t 4']},\n 'Thu': {'exeter_twilight': ['25 e 4'],\n 'truro_twilight': ['38 t 4'],\n 'torquay_twilight': ['22 t 3'],\n 'plymouth_twilight': ['34 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['10 t 2', '13 p 3', '35 t 4']},\n 'Fri': {'exeter_twilight': ['1 e 2'],\n 'truro_twilight': ['23 t 3'],\n 'torquay_twilight': ['21 t 3'],\n 'plymouth_twilight': ['8 p 2'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['5 t 2', '17 t 3', '28 p 4']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['18 e 3'],\n 'weekend_truro': ['24 t 3'],\n 'weekend_torquay': ['48 t 5'],\n 'weekend_plymouth': ['19 p 3', '20 p 3'],\n 'night': ['5 t 2', '17 t 3', '28 p 4']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['7 e 2'],\n 'weekend_truro': ['16 t 3'],\n 'weekend_torquay': ['15 t 3'],\n 'weekend_plymouth': ['12 p 3', '46 p 5'],\n 'night': ['5 t 2', '17 t 3', '28 p 4']}},\n 24: {'Mon': {'exeter_twilight': ['6 e 2'],\n 'truro_twilight': ['50 t 5'],\n 'torquay_twilight': ['35 t 4'],\n 'plymouth_twilight': ['34 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['4 t 2', '18 e 3', '48 t 5']},\n 'Tue': {'exeter_twilight': ['1 e 2'],\n 'truro_twilight': ['39 t 4'],\n 'torquay_twilight': ['37 t 4'],\n 'plymouth_twilight': ['31 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['4 t 2', '18 e 3', '48 t 5']},\n 'Wed': {'exeter_twilight': ['25 e 4'],\n 'truro_twilight': ['17 t 3'],\n 'torquay_twilight': ['36 t 4'],\n 'plymouth_twilight': ['43 p 5'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['4 t 2', '18 e 3', '48 t 5']},\n 'Thu': {'exeter_twilight': ['7 e 2'],\n 'truro_twilight': ['5 t 2'],\n 'torquay_twilight': ['9 t 2'],\n 'plymouth_twilight': ['29 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['4 t 2', '18 e 3', '48 t 5']},\n 'Fri': {'exeter_twilight': ['6 e 2'],\n 'truro_twilight': ['23 t 3'],\n 'torquay_twilight': ['22 t 3'],\n 'plymouth_twilight': ['34 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['3 p 2', '32 p 4', '38 t 4']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['27 e 4'],\n 'weekend_truro': ['39 t 4'],\n 'weekend_torquay': ['14 t 3'],\n 'weekend_plymouth': ['28 p 4', '46 p 5'],\n 'night': ['3 p 2', '32 p 4', '38 t 4']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['25 e 4'],\n 'weekend_truro': ['10 t 2'],\n 'weekend_torquay': ['47 t 5'],\n 'weekend_plymouth': ['20 p 3', '31 p 4'],\n 'night': ['3 p 2', '32 p 4', '38 t 4']}},\n 25: {'Mon': {'exeter_twilight': ['26 e 4'],\n 'truro_twilight': ['50 t 5'],\n 'torquay_twilight': ['21 t 3'],\n 'plymouth_twilight': ['12 p 3'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['15 t 3', '24 t 3', '43 p 5']},\n 'Tue': {'exeter_twilight': ['7 e 2'],\n 'truro_twilight': ['17 t 3'],\n 'torquay_twilight': ['9 t 2'],\n 'plymouth_twilight': ['8 p 2'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['15 t 3', '24 t 3', '43 p 5']},\n 'Wed': {'exeter_twilight': ['6 e 2'],\n 'truro_twilight': ['16 t 3'],\n 'torquay_twilight': ['36 t 4'],\n 'plymouth_twilight': ['28 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['15 t 3', '24 t 3', '43 p 5']},\n 'Thu': {'exeter_twilight': ['25 e 4'],\n 'truro_twilight': ['5 t 2'],\n 'torquay_twilight': ['22 t 3'],\n 'plymouth_twilight': ['29 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['15 t 3', '24 t 3', '43 p 5']},\n 'Fri': {'exeter_twilight': ['27 e 4'],\n 'truro_twilight': ['38 t 4'],\n 'torquay_twilight': ['37 t 4'],\n 'plymouth_twilight': ['30 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['9 t 2', '35 t 4', '36 t 4']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['1 e 2'],\n 'weekend_truro': ['39 t 4'],\n 'weekend_torquay': ['4 t 2'],\n 'weekend_plymouth': ['13 p 3', '20 p 3'],\n 'night': ['9 t 2', '35 t 4', '36 t 4']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['26 e 4'],\n 'weekend_truro': ['23 t 3'],\n 'weekend_torquay': ['48 t 5'],\n 'weekend_plymouth': ['43 p 5', '46 p 5'],\n 'night': ['9 t 2', '35 t 4', '36 t 4']}},\n 26: {'Mon': {'exeter_twilight': ['6 e 2'],\n 'truro_twilight': ['24 t 3'],\n 'torquay_twilight': ['22 t 3'],\n 'plymouth_twilight': ['28 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['18 e 3', '27 e 4', '39 t 4']},\n 'Tue': {'exeter_twilight': ['25 e 4'],\n 'truro_twilight': ['50 t 5'],\n 'torquay_twilight': ['14 t 3'],\n 'plymouth_twilight': ['32 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['18 e 3', '27 e 4', '39 t 4']},\n 'Wed': {'exeter_twilight': ['1 e 2'],\n 'truro_twilight': ['38 t 4'],\n 'torquay_twilight': ['35 t 4'],\n 'plymouth_twilight': ['31 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['18 e 3', '27 e 4', '39 t 4']},\n 'Thu': {'exeter_twilight': ['41 e 5'],\n 'truro_twilight': ['17 t 3'],\n 'torquay_twilight': ['4 t 2'],\n 'plymouth_twilight': ['45 p 5'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['18 e 3', '27 e 4', '39 t 4']},\n 'Fri': {'exeter_twilight': ['6 e 2'],\n 'truro_twilight': ['10 t 2'],\n 'torquay_twilight': ['48 t 5'],\n 'plymouth_twilight': ['46 p 5'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['7 e 2', '26 e 4', '34 p 4']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['25 e 4'],\n 'weekend_truro': ['5 t 2'],\n 'weekend_torquay': ['36 t 4'],\n 'weekend_plymouth': ['8 p 2', '28 p 4'],\n 'night': ['7 e 2', '26 e 4', '34 p 4']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['1 e 2'],\n 'weekend_truro': ['39 t 4'],\n 'weekend_torquay': ['35 t 4'],\n 'weekend_plymouth': ['2 p 2', '43 p 5'],\n 'night': ['7 e 2', '26 e 4', '34 p 4']}}}" + "text/plain": "5 t 3', '23 t 3']},\n 'Wed': {'exeter_twilight': ['7 e 2'],\n 'truro_twilight': ['50 t 5'],\n 'torquay_twilight': ['36 t 4'],\n 'plymouth_twilight': ['32 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['43 p 5', '15 t 3', '23 t 3']},\n 'Thu': {'exeter_twilight': ['18 e 3'],\n 'truro_twilight': ['17 t 3'],\n 'torquay_twilight': ['9 t 2'],\n 'plymouth_twilight': ['2 p 2'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['43 p 5', '15 t 3', '23 t 3']},\n 'Fri': {'exeter_twilight': ['26 e 4'],\n 'truro_twilight': ['5 t 2'],\n 'torquay_twilight': ['35 t 4'],\n 'plymouth_twilight': ['19 p 3'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['8 p 2', '30 p 4', '32 p 4']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['6 e 2'],\n 'weekend_truro': ['10 t 2'],\n 'weekend_torquay': ['4 t 2'],\n 'weekend_plymouth': ['20 p 3', '29 p 4'],\n 'night': ['8 p 2', '30 p 4', '32 p 4']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['25 e 4'],\n 'weekend_truro': ['16 t 3'],\n 'weekend_torquay': ['15 t 3'],\n 'weekend_plymouth': ['13 p 3', '43 p 5'],\n 'night': ['8 p 2', '30 p 4', '32 p 4']}},\n 18: {'Mon': {'exeter_twilight': ['7 e 2'],\n 'truro_twilight': ['23 t 3'],\n 'torquay_twilight': ['37 t 4'],\n 'plymouth_twilight': ['46 p 5'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['9 t 2', '17 t 3', '39 t 4']},\n 'Tue': {'exeter_twilight': ['26 e 4'],\n 'truro_twilight': ['24 t 3'],\n 'torquay_twilight': ['21 t 3'],\n 'plymouth_twilight': ['31 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['9 t 2', '17 t 3', '39 t 4']},\n 'Wed': {'exeter_twilight': ['1 e 2'],\n 'truro_twilight': ['38 t 4'],\n 'torquay_twilight': ['36 t 4'],\n 'plymouth_twilight': ['20 p 3'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['9 t 2', '17 t 3', '39 t 4']},\n 'Thu': {'exeter_twilight': ['6 e 2'],\n 'truro_twilight': ['16 t 3'],\n 'torquay_twilight': ['4 t 2'],\n 'plymouth_twilight': ['28 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['9 t 2', '17 t 3', '39 t 4']},\n 'Fri': {'exeter_twilight': ['25 e 4'],\n 'truro_twilight': ['10 t 2'],\n 'torquay_twilight': ['37 t 4'],\n 'plymouth_twilight': ['8 p 2'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['14 t 3', '21 t 3', '36 t 4']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['26 e 4'],\n 'weekend_truro': ['50 t 5'],\n 'weekend_torquay': ['35 t 4'],\n 'weekend_plymouth': ['19 p 3', '30 p 4'],\n 'night': ['14 t 3', '21 t 3', '36 t 4']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['1 e 2'],\n 'weekend_truro': ['24 t 3'],\n 'weekend_torquay': ['48 t 5'],\n 'weekend_plymouth': ['2 p 2', '43 p 5'],\n 'night': ['14 t 3', '21 t 3', '36 t 4']}},\n 19: {'Mon': {'exeter_twilight': ['18 e 3'],\n 'truro_twilight': ['23 t 3'],\n 'torquay_twilight': ['4 t 2'],\n 'plymouth_twilight': ['3 p 2'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['13 p 3', '29 p 4', '22 t 3']},\n 'Tue': {'exeter_twilight': ['27 e 4'],\n 'truro_twilight': ['16 t 3'],\n 'torquay_twilight': ['37 t 4'],\n 'plymouth_twilight': ['20 p 3'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['13 p 3', '29 p 4', '22 t 3']},\n 'Wed': {'exeter_twilight': ['26 e 4'],\n 'truro_twilight': ['17 t 3'],\n 'torquay_twilight': ['36 t 4'],\n 'plymouth_twilight': ['46 p 5'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['13 p 3', '29 p 4', '22 t 3']},\n 'Thu': {'exeter_twilight': ['1 e 2'],\n 'truro_twilight': ['24 t 3'],\n 'torquay_twilight': ['9 t 2'],\n 'plymouth_twilight': ['28 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['13 p 3', '29 p 4', '22 t 3']},\n 'Fri': {'exeter_twilight': ['18 e 3'],\n 'truro_twilight': ['10 t 2'],\n 'torquay_twilight': ['14 t 3'],\n 'plymouth_twilight': ['43 p 5'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['26 e 4', '19 p 3', '5 t 2']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['6 e 2'],\n 'weekend_truro': ['16 t 3'],\n 'weekend_torquay': ['21 t 3'],\n 'weekend_plymouth': ['8 p 2', '32 p 4'],\n 'night': ['26 e 4', '19 p 3', '5 t 2']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['25 e 4'],\n 'weekend_truro': ['17 t 3'],\n 'weekend_torquay': ['37 t 4'],\n 'weekend_plymouth': ['3 p 2', '20 p 3'],\n 'night': ['26 e 4', '19 p 3', '5 t 2']}},\n 20: {'Mon': {'exeter_twilight': ['7 e 2'],\n 'truro_twilight': ['38 t 4'],\n 'torquay_twilight': ['15 t 3'],\n 'plymouth_twilight': ['13 p 3'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['18 e 3', '10 t 2', '50 t 5']},\n 'Tue': {'exeter_twilight': ['1 e 2'],\n 'truro_twilight': ['39 t 4'],\n 'torquay_twilight': ['35 t 4'],\n 'plymouth_twilight': ['2 p 2'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['18 e 3', '10 t 2', '50 t 5']},\n 'Wed': {'exeter_twilight': ['26 e 4'],\n 'truro_twilight': ['5 t 2'],\n 'torquay_twilight': ['21 t 3'],\n 'plymouth_twilight': ['30 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['18 e 3', '10 t 2', '50 t 5']},\n 'Thu': {'exeter_twilight': ['6 e 2'],\n 'truro_twilight': ['24 t 3'],\n 'torquay_twilight': ['48 t 5'],\n 'plymouth_twilight': ['32 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['18 e 3', '10 t 2', '50 t 5']},\n 'Fri': {'exeter_twilight': ['7 e 2'],\n 'truro_twilight': ['38 t 4'],\n 'torquay_twilight': ['36 t 4'],\n 'plymouth_twilight': ['20 p 3'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['27 e 4', '3 p 2', '14 t 3']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['41 e 5'],\n 'weekend_truro': ['23 t 3'],\n 'weekend_torquay': ['37 t 4'],\n 'weekend_plymouth': ['13 p 3', '28 p 4'],\n 'night': ['27 e 4', '3 p 2', '14 t 3']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['18 e 3'],\n 'weekend_truro': ['5 t 2'],\n 'weekend_torquay': ['21 t 3'],\n 'weekend_plymouth': ['2 p 2', '19 p 3'],\n 'night': ['27 e 4', '3 p 2', '14 t 3']}},\n 21: {'Mon': {'exeter_twilight': ['1 e 2'],\n 'truro_twilight': ['10 t 2'],\n 'torquay_twilight': ['22 t 3'],\n 'plymouth_twilight': ['32 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['7 e 2', '13 p 3', '43 p 5']},\n 'Tue': {'exeter_twilight': ['6 e 2'],\n 'truro_twilight': ['17 t 3'],\n 'torquay_twilight': ['36 t 4'],\n 'plymouth_twilight': ['34 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['7 e 2', '13 p 3', '43 p 5']},\n 'Wed': {'exeter_twilight': ['41 e 5'],\n 'truro_twilight': ['16 t 3'],\n 'torquay_twilight': ['4 t 2'],\n 'plymouth_twilight': ['29 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['7 e 2', '13 p 3', '43 p 5']},\n 'Thu': {'exeter_twilight': ['26 e 4'],\n 'truro_twilight': ['5 t 2'],\n 'torquay_twilight': ['14 t 3'],\n 'plymouth_twilight': ['3 p 2'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['7 e 2', '13 p 3', '43 p 5']},\n 'Fri': {'exeter_twilight': ['25 e 4'],\n 'truro_twilight': ['50 t 5'],\n 'torquay_twilight': ['35 t 4'],\n 'plymouth_twilight': ['8 p 2'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['31 p 4', '9 t 2', '16 t 3']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['1 e 2'],\n 'weekend_truro': ['39 t 4'],\n 'weekend_torquay': ['37 t 4'],\n 'weekend_plymouth': ['20 p 3', '46 p 5'],\n 'night': ['31 p 4', '9 t 2', '16 t 3']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['7 e 2'],\n 'weekend_truro': ['38 t 4'],\n 'weekend_torquay': ['36 t 4'],\n 'weekend_plymouth': ['19 p 3', '28 p 4'],\n 'night': ['31 p 4', '9 t 2', '16 t 3']}},\n 22: {'Mon': {'exeter_twilight': ['6 e 2'],\n 'truro_twilight': ['5 t 2'],\n 'torquay_twilight': ['4 t 2'],\n 'plymouth_twilight': ['29 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['1 e 2', '20 p 3', '48 t 5']},\n 'Tue': {'exeter_twilight': ['26 e 4'],\n 'truro_twilight': ['50 t 5'],\n 'torquay_twilight': ['22 t 3'],\n 'plymouth_twilight': ['43 p 5'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['1 e 2', '20 p 3', '48 t 5']},\n 'Wed': {'exeter_twilight': ['27 e 4'],\n 'truro_twilight': ['16 t 3'],\n 'torquay_twilight': ['37 t 4'],\n 'plymouth_twilight': ['34 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['1 e 2', '20 p 3', '48 t 5']},\n 'Thu': {'exeter_twilight': ['25 e 4'],\n 'truro_twilight': ['17 t 3'],\n 'torquay_twilight': ['14 t 3'],\n 'plymouth_twilight': ['32 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['1 e 2', '20 p 3', '48 t 5']},\n 'Fri': {'exeter_twilight': ['6 e 2'],\n 'truro_twilight': ['5 t 2'],\n 'torquay_twilight': ['15 t 3'],\n 'plymouth_twilight': ['28 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['26 e 4', '3 p 2', '38 t 4']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['7 e 2'],\n 'weekend_truro': ['10 t 2'],\n 'weekend_torquay': ['22 t 3'],\n 'weekend_plymouth': ['2 p 2', '43 p 5'],\n 'night': ['26 e 4', '3 p 2', '38 t 4']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['1 e 2'],\n 'weekend_truro': ['16 t 3'],\n 'weekend_torquay': ['35 t 4'],\n 'weekend_plymouth': ['8 p 2', '34 p 4'],\n 'night': ['26 e 4', '3 p 2', '38 t 4']}},\n 23: {'Mon': {'exeter_twilight': ['18 e 3'],\n 'truro_twilight': ['39 t 4'],\n 'torquay_twilight': ['4 t 2'],\n 'plymouth_twilight': ['20 p 3'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['25 e 4', '22 t 3', '37 t 4']},\n 'Tue': {'exeter_twilight': ['6 e 2'],\n 'truro_twilight': ['17 t 3'],\n 'torquay_twilight': ['15 t 3'],\n 'plymouth_twilight': ['32 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['25 e 4', '22 t 3', '37 t 4']},\n 'Wed': {'exeter_twilight': ['26 e 4'],\n 'truro_twilight': ['10 t 2'],\n 'torquay_twilight': ['36 t 4'],\n 'plymouth_twilight': ['13 p 3'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['25 e 4', '22 t 3', '37 t 4']},\n 'Thu': {'exeter_twilight': ['1 e 2'],\n 'truro_twilight': ['16 t 3'],\n 'torquay_twilight': ['35 t 4'],\n 'plymouth_twilight': ['8 p 2'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['25 e 4', '22 t 3', '37 t 4']},\n 'Fri': {'exeter_twilight': ['7 e 2'],\n 'truro_twilight': ['38 t 4'],\n 'torquay_twilight': ['48 t 5'],\n 'plymouth_twilight': ['31 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['2 p 2', '34 p 4', '30 p 4']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['6 e 2'],\n 'weekend_truro': ['5 t 2'],\n 'weekend_torquay': ['9 t 2'],\n 'weekend_plymouth': ['32 p 4', '46 p 5'],\n 'night': ['2 p 2', '34 p 4', '30 p 4']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['27 e 4'],\n 'weekend_truro': ['23 t 3'],\n 'weekend_torquay': ['4 t 2'],\n 'weekend_plymouth': ['13 p 3', '20 p 3'],\n 'night': ['2 p 2', '34 p 4', '30 p 4']}},\n 24: {'Mon': {'exeter_twilight': ['18 e 3'],\n 'truro_twilight': ['16 t 3'],\n 'torquay_twilight': ['21 t 3'],\n 'plymouth_twilight': ['43 p 5'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['6 e 2', '32 p 4', '29 p 4']},\n 'Tue': {'exeter_twilight': ['25 e 4'],\n 'truro_twilight': ['17 t 3'],\n 'torquay_twilight': ['14 t 3'],\n 'plymouth_twilight': ['12 p 3'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['6 e 2', '32 p 4', '29 p 4']},\n 'Wed': {'exeter_twilight': ['7 e 2'],\n 'truro_twilight': ['50 t 5'],\n 'torquay_twilight': ['37 t 4'],\n 'plymouth_twilight': ['46 p 5'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['6 e 2', '32 p 4', '29 p 4']},\n 'Thu': {'exeter_twilight': ['27 e 4'],\n 'truro_twilight': ['39 t 4'],\n 'torquay_twilight': ['36 t 4'],\n 'plymouth_twilight': ['30 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['6 e 2', '32 p 4', '29 p 4']},\n 'Fri': {'exeter_twilight': ['18 e 3'],\n 'truro_twilight': ['5 t 2'],\n 'torquay_twilight': ['48 t 5'],\n 'plymouth_twilight': ['8 p 2'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['46 p 5', '4 t 2', '35 t 4']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['25 e 4'],\n 'weekend_truro': ['17 t 3'],\n 'weekend_torquay': ['9 t 2'],\n 'weekend_plymouth': ['3 p 2', '2 p 2'],\n 'night': ['46 p 5', '4 t 2', '35 t 4']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['1 e 2'],\n 'weekend_truro': ['38 t 4'],\n 'weekend_torquay': ['22 t 3'],\n 'weekend_plymouth': ['34 p 4', '33 p 4'],\n 'night': ['46 p 5', '4 t 2', '35 t 4']}},\n 25: {'Mon': {'exeter_twilight': ['6 e 2'],\n 'truro_twilight': ['16 t 3'],\n 'torquay_twilight': ['21 t 3'],\n 'plymouth_twilight': ['30 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['27 e 4', '23 t 3', '17 t 3']},\n 'Tue': {'exeter_twilight': ['7 e 2'],\n 'truro_twilight': ['10 t 2'],\n 'torquay_twilight': ['14 t 3'],\n 'plymouth_twilight': ['32 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['27 e 4', '23 t 3', '17 t 3']},\n 'Wed': {'exeter_twilight': ['25 e 4'],\n 'truro_twilight': ['5 t 2'],\n 'torquay_twilight': ['15 t 3'],\n 'plymouth_twilight': ['31 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['27 e 4', '23 t 3', '17 t 3']},\n 'Thu': {'exeter_twilight': ['26 e 4'],\n 'truro_twilight': ['38 t 4'],\n 'torquay_twilight': ['9 t 2'],\n 'plymouth_twilight': ['3 p 2'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['27 e 4', '23 t 3', '17 t 3']},\n 'Fri': {'exeter_twilight': ['18 e 3'],\n 'truro_twilight': ['24 t 3'],\n 'torquay_twilight': ['35 t 4'],\n 'plymouth_twilight': ['13 p 3'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['7 e 2', '34 p 4', '15 t 3']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['6 e 2'],\n 'weekend_truro': ['39 t 4'],\n 'weekend_torquay': ['37 t 4'],\n 'weekend_plymouth': ['30 p 4', '46 p 5'],\n 'night': ['7 e 2', '34 p 4', '15 t 3']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['1 e 2'],\n 'weekend_truro': ['10 t 2'],\n 'weekend_torquay': ['4 t 2'],\n 'weekend_plymouth': ['20 p 3', '29 p 4'],\n 'night': ['7 e 2', '34 p 4', '15 t 3']}},\n 26: {'Mon': {'exeter_twilight': ['25 e 4'],\n 'truro_twilight': ['38 t 4'],\n 'torquay_twilight': ['9 t 2'],\n 'plymouth_twilight': ['3 p 2'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['22 t 3', '5 t 2', '50 t 5']},\n 'Tue': {'exeter_twilight': ['41 e 5'],\n 'truro_twilight': ['24 t 3'],\n 'torquay_twilight': ['21 t 3'],\n 'plymouth_twilight': ['13 p 3'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['22 t 3', '5 t 2', '50 t 5']},\n 'Wed': {'exeter_twilight': ['7 e 2'],\n 'truro_twilight': ['17 t 3'],\n 'torquay_twilight': ['15 t 3'],\n 'plymouth_twilight': ['32 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['22 t 3', '5 t 2', '50 t 5']},\n 'Thu': {'exeter_twilight': ['6 e 2'],\n 'truro_twilight': ['23 t 3'],\n 'torquay_twilight': ['36 t 4'],\n 'plymouth_twilight': ['30 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['22 t 3', '5 t 2', '50 t 5']},\n 'Fri': {'exeter_twilight': ['18 e 3'],\n 'truro_twilight': ['10 t 2'],\n 'torquay_twilight': ['37 t 4'],\n 'plymouth_twilight': ['29 p 4'],\n 'weekend_exeter': [],\n 'weekend_truro': [],\n 'weekend_torquay': [],\n 'weekend_plymouth': [],\n 'night': ['1 e 2', '25 e 4', '16 t 3']},\n 'Sat': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['41 e 5'],\n 'weekend_truro': ['24 t 3'],\n 'weekend_torquay': ['21 t 3'],\n 'weekend_plymouth': ['8 p 2', '20 p 3'],\n 'night': ['1 e 2', '25 e 4', '16 t 3']},\n 'Sun': {'exeter_twilight': [],\n 'truro_twilight': [],\n 'torquay_twilight': [],\n 'plymouth_twilight': [],\n 'weekend_exeter': ['26 e 4'],\n 'weekend_truro': ['50 t 5'],\n 'weekend_torquay': ['14 t 3'],\n 'weekend_plymouth': ['19 p 3', '28 p 4'],\n 'night': ['1 e 2', '25 e 4', '16 t 3']}}}" }, "metadata": {}, - "execution_count": 81 + "execution_count": 22 } ], "source": [ @@ -1100,7 +980,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -1109,7 +989,7 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -1118,7 +998,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -1127,7 +1007,7 @@ "text/plain": "1" }, "metadata": {}, - "execution_count": 84 + "execution_count": 25 } ], "source": [ @@ -1136,7 +1016,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -1145,7 +1025,7 @@ "text/plain": "0" }, "metadata": {}, - "execution_count": 85 + "execution_count": 26 } ], "source": [ @@ -1154,7 +1034,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -1165,7 +1045,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -1175,7 +1055,7 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mNameError\u001b[0m: name 'a' is not defined" ] } @@ -1186,7 +1066,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -1195,7 +1075,7 @@ "text/plain": "0" }, "metadata": {}, - "execution_count": 88 + "execution_count": 29 } ], "source": [ @@ -1204,7 +1084,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -1213,7 +1093,7 @@ "text/plain": "6" }, "metadata": {}, - "execution_count": 89 + "execution_count": 30 } ], "source": [ diff --git a/shifts.py b/shifts.py new file mode 100644 index 0000000..e4d109e --- /dev/null +++ b/shifts.py @@ -0,0 +1,136 @@ +import datetime +import itertools + + +days = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + +# weeks = [i for i in range(1,weeks_to_rota+1)] + +# weeks_days_product = list(itertools.product(weeks, days)) + +sites = ("truro", "exeter", "torquay", "barnstaple", "plymouth") + + +class ShiftsClass(object): + def __init__( + self, + sites, + name, + length, + shift_days, + balance_by_site=True, + workers_required=1, + rota_on_nwds=False, + ): + self.site = sites + self.name = name + self.length = length + self.shift_days = shift_days + self.balance_by_site = balance_by_site + self.workers_required = workers_required + self.rota_on_nwds = rota_on_nwds + + +class ShiftCollection(object): + def __init__(self, weeks_to_rota=26): + self.shifts = [] + + self.weeks = [i for i in range(1, weeks_to_rota + 1)] + + self.weeks_days_product = list(itertools.product(self.weeks, days)) + + self.start_date = datetime.date(2020, 9, 7) + self.rota_days_length = len(self.weeks) * 7 + self.rota_end_date = self.start_date + datetime.timedelta(self.rota_days_length) + + def AddShift(self, shift): + """Add a shift to the collection""" + self.shifts.append(shift) + self.BuildShifts() + + def AddShifts(self, *shifts): + self.shifts.extend(shifts) + self.BuildShifts() + + def GetShiftNamesByDay(self, day): + return self.day_shifts_dict[day] + + def GetShiftByName(self, name): + return self.shifts_by_name[name] + + def GetShiftLengthByName(self, name): + return self.shifts_by_name[name].length + + def BuildShifts(self): + self.shifts_by_name = {} + self.shift_names = [] + + self.day_shifts_dict = {day: set() for day in days} + + for s in self.shifts: + self.shifts_by_name[s.name] = s + self.shift_names.append(s.name) + + for day in s.shift_days: + self.day_shifts_dict[day].add(s.name) + + self.week_day_shift_product = [] + self.week_day_shiftclass_product = [] + for week, day in self.weeks_days_product: + for s in self.shifts: + if day in s.shift_days: + self.week_day_shift_product.append((week, day, s.name)) + self.week_day_shiftclass_product.append((week, day, s)) + + self.day_shift_product = [] + self.day_shiftclass_product = [] + for s in self.shifts: + for day in days: + if day in s.shift_days: + self.day_shift_product.append((day, s.name)) + self.day_shiftclass_product.append((day, s)) + + def GetAllDayShiftsAsNames(self): + return self.day_shift_product + + def GetAllDayShiftsAsClass(self): + return self.day_shiftclass_product + + def GetAllShiftsAsNames(self): + return self.week_day_shift_product + + def GetAllShiftsAsClass(self): + return self.week_day_shiftclass_product + + def GetAllWeeksDays(self): + return self.weeks_days_product + + def GetShiftOptions(self): + return self.shifts + + def GetShiftNames(self): + return self.shift_names + + def GetWeeksInBlocks(self, block_length): + blocks = [] + for i in range(len(self.weeks)): + blocks.append(self.weeks[i : i + block_length]) + return blocks + + def GetRequiredShiftsWorkersAndSites(self): + l = [] + for week, day, shift in self.week_day_shiftclass_product: + if day in shift.shift_days: + l.append((week, day, shift.name, shift.workers_required, shift.site)) + + return l + + def GetNotRequiredShifts(self): + l = set() + + for week in self.weeks: + for day in days: + for shift in self.shifts: + l.add((week, day, shift)) + + return l - set(self.GetAllShiftsAsClass())