diff --git a/controller/solver/__init__.py b/controller/solver/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/controller/solver/grid.py b/controller/solver/grid.py new file mode 100644 index 0000000..1dd0ec3 --- /dev/null +++ b/controller/solver/grid.py @@ -0,0 +1,54 @@ +""" +Time-grid constants: days, slot definitions, lab double-slot pairs, and +the special long-lecture slot. Pure data — no scheduling logic lives here. +""" + +DAYS = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"] + +# Normal theory grid: 5 x 90-minute slots, 09:00-16:30, no lunch break. +# Every placeable session (normal lecture, lab, or the special long +# lecture) is expressed as one or more of these slot indices (0-4) for +# clash-tracking purposes — see LONG_LECTURE_SLOT_INDEX below for why the +# long lecture also uses index 0 despite rendering at a different clock time. +TIME_SLOTS = [ + {"label": "S1", "start": "09:00", "end": "10:30", "is_lunch": False}, + {"label": "S2", "start": "10:30", "end": "12:00", "is_lunch": False}, + {"label": "S3", "start": "12:00", "end": "13:30", "is_lunch": False}, + {"label": "S4", "start": "13:30", "end": "15:00", "is_lunch": False}, + {"label": "S5", "start": "15:00", "end": "16:30", "is_lunch": False}, +] + +# Indices into TIME_SLOTS that are real teaching slots (no lunch to skip +# anymore, but kept for readability at call sites) +TEACHING_SLOT_INDICES = [i for i, s in enumerate(TIME_SLOTS) if not s["is_lunch"]] + +# Consecutive pairs of normal slots usable as a 180-minute lab double-slot: +# 10:30-13:30 (S2+S3) and 13:30-16:30 (S4+S5). Deliberately starts at slot +# 1, not slot 0 — slot 0 (09:00-10:30) is left free for normal lectures and +# the special long-lecture slot (see LONG_LECTURE_SLOT_INDEX below), so +# labs never crowd out a batch's only long-lecture opportunity for the day. +LAB_SLOT_PAIRS = [(1, 2), (3, 4)] + +# The special fixed slot for courses whose lecture is "2 hours once a +# week": 08:30-10:30. This overlaps 09:00-10:30 (normal slot index 0) in +# wall-clock time, so a long-lecture session is tracked as occupying slot +# index 0 too (same key _is_free/_mark_busy use) — that's what makes it +# correctly clash with anything else placed in normal slot 0 that day for +# the same room/instructor/batch. duration_minutes on the session dict is +# what distinguishes it from a normal 90-minute slot-0 session at render time. +LONG_LECTURE_SLOT_INDEX = 0 +LONG_LECTURE_START = "08:30" +LONG_LECTURE_END = "10:30" + +# Rows to render on every generated timetable grid: the special long-lecture +# row first (it starts earliest, 08:30), then the 5 normal 90-minute rows. +# Templates/xlsx_grid_helper key session lookups on (day, slot_index, +# duration_minutes) using these rows' slot_index/duration_minutes pairs. +DISPLAY_ROWS = [ + {"label": "Long", "start": LONG_LECTURE_START, "end": LONG_LECTURE_END, + "slot_index": LONG_LECTURE_SLOT_INDEX, "duration_minutes": 120}, +] + [ + {"label": s["label"], "start": s["start"], "end": s["end"], + "slot_index": i, "duration_minutes": 90} + for i, s in enumerate(TIME_SLOTS) +] diff --git a/controller/solver/phase1_general.py b/controller/solver/phase1_general.py new file mode 100644 index 0000000..e976775 --- /dev/null +++ b/controller/solver/phase1_general.py @@ -0,0 +1,59 @@ +""" +Phase 1: general courses (shared across every batch of a session). + +Simple strategy — small offering count, Tue/Thu preferred first. After +placing everything, self-repair: any batch left with two general-course +sessions in the same slot has the losing session unmarked and re-placed +(scanning every day) until this phase's own sessions are clash-free. +""" + +from . import grid + + +def run(board, data, preferred_days=("Tuesday", "Thursday"), max_repair_attempts=20): + """Places every general-course offering's weekly lectures. Returns this phase's sessions.""" + general = [o for o in data["offerings"] if o["course"]["is_general"]] + preferred_order = list(preferred_days) + [d for d in grid.DAYS if d not in preferred_days] + phase_start = len(board.sessions) + + for offering in general: + course = offering["course"] + room_candidates = board.room_candidates(course["lecture_room_id"], board.classrooms) + for _ in range(course["lectures_per_week"]): + session = board.place_lecture(offering, room_candidates, preferred_order) + if session is None: + print(f"WARNING: could not place a lecture for general course {offering['course_id']} section {offering['section_id']}") + + phase_sessions = board.sessions[phase_start:] + _repair_general_conflicts(board, data, phase_sessions, max_repair_attempts) + return phase_sessions + + +def _repair_general_conflicts(board, data, phase_sessions, max_attempts): + """Moves general-course sessions that clash for a batch to a free slot on any day.""" + from conflict_checker.student_conflict_checker import check_student_conflicts + + any_day_order = list(grid.DAYS) + for _ in range(max_attempts): + conflicts = check_student_conflicts(phase_sessions) + if not conflicts: + return + + # Re-place the last session involved in the first conflict; the + # other session(s) in that cell stay put. + losing_session = conflicts[0]["sessions"][-1] + offering = next( + o for o in data["offerings"] + if o["course_id"] == losing_session["course_id"] and o["section_id"] == losing_session["section_id"] + ) + board.remove_session(losing_session) + phase_sessions.remove(losing_session) + + room_candidates = board.room_candidates(offering["course"]["lecture_room_id"], board.classrooms) + new_session = board.place_lecture(offering, room_candidates, any_day_order) + if new_session is None: + print(f"WARNING: could not repair general-course conflict for {offering['course_id']} section {offering['section_id']}") + return + phase_sessions.append(new_session) + + print("WARNING: general-course conflicts remained unresolved after max repair attempts") diff --git a/controller/solver/phase2_labs.py b/controller/solver/phase2_labs.py new file mode 100644 index 0000000..93e8a53 --- /dev/null +++ b/controller/solver/phase2_labs.py @@ -0,0 +1,116 @@ +""" +Phase 2: labs. + +Slightly more advanced than Phase 1 — places every lab offering's weekly +labs greedily first, against Phase 1's already-fixed placements. When a +lab can't be placed, this backtracks *recursively*: it bumps an +already-placed lab from earlier in this phase that shares the contested +resource (same instructor or same lab room), and tries to re-place the +stuck lab; if the bumped lab then can't find a new slot either, that +bumped lab is itself backtracked the same way (bump one of *its* +resource-sharing predecessors), and so on, until either everything +settles or the attempt budget is exhausted. Phase 1's sessions are never +touched — only Phase 2's own placements are ever moved. +""" + +from . import grid + +MAX_BACKTRACK_ATTEMPTS = 2000 + + +def run(board, data): + """Places every lab offering's weekly labs. Returns this phase's sessions.""" + phase_start = len(board.sessions) + offerings = [o for o in data["offerings"] if not o["course"]["is_general"] and o["course"]["labs_per_week"] > 0] + + placed_so_far = [] # [(offering, session), ...] placed so far in this phase + attempts = [0] + + for offering in offerings: + course = offering["course"] + room_candidates = board.room_candidates(course["lab_room_id"], board.labs) + for _ in range(course["labs_per_week"]): + session = _place_lab_with_backtracking(board, offering, room_candidates, placed_so_far, attempts) + if session is None: + print(f"WARNING: could not place a lab for course {offering['course_id']} section {offering['section_id']} ({offering['batch_codes']}) even after backtracking") + else: + placed_so_far.append((offering, session)) + + return board.sessions[phase_start:] + + +def _place_lab_with_backtracking(board, offering, room_candidates, placed_so_far, attempts): + """ + Tries the plain first-fit placement first; if that fails, tries + bumping each resource-sharing predecessor (most recent first) out of + the way and recursively re-seating it, backing out cleanly if a given + bump doesn't lead anywhere. Returns the newly placed session dict, or + None if no arrangement works within the attempt budget. + """ + session = board.place_lab(offering, room_candidates, grid.DAYS) + if session is not None: + return session + + # Snapshot the current candidates once — recursive calls will extend + # placed_so_far with their own successful re-seatings, but we only + # want to consider *this call's* view of what existed when we started. + candidate_room_ids = {r["room_id"] for r in room_candidates} + candidates = [ + (other_offering, other_session) + for other_offering, other_session in placed_so_far + if _shares_contested_resource(offering, other_session, candidate_room_ids) + ] + + for other_offering, other_session in reversed(candidates): + if attempts[0] >= MAX_BACKTRACK_ATTEMPTS: + return None + attempts[0] += 1 + + if (other_offering, other_session) not in placed_so_far: + # Already moved by an earlier (failed) branch of this search. + continue + + placed_so_far.remove((other_offering, other_session)) + board.remove_session(other_session) + + session = board.place_lab(offering, room_candidates, grid.DAYS) + if session is not None: + other_room_candidates = board.room_candidates(other_offering["course"]["lab_room_id"], board.labs) + new_other_session = _place_lab_with_backtracking(board, other_offering, other_room_candidates, placed_so_far, attempts) + if new_other_session is not None: + placed_so_far.append((other_offering, new_other_session)) + return session + # Could not reseat the bumped lab even with recursion — undo + # our placement and put the bump back exactly as it was. + board.remove_session(session) + placed_so_far.append((other_offering, _restore_lab(board, other_offering, other_session))) + continue + + # Bumping didn't free a usable slot for `offering` — restore and + # try the next candidate. + placed_so_far.append((other_offering, _restore_lab(board, other_offering, other_session))) + + return None + + +def _restore_lab(board, offering, session): + """Re-marks and re-adds a lab session dict exactly as it was.""" + room = board.data["rooms_by_id"][session["room_id"]] + for slot_index in session["slot_indices"]: + board.mark_busy(session["day"], slot_index, session["room_id"], session["instructor_code"], session["batch_codes"]) + return board.add_session(offering, session["day"], session["slot_indices"], room) + + +def _shares_contested_resource(offering, other_session, candidate_room_ids): + """ + True if bumping other_session could plausibly free a slot offering + needs: shares the instructor, a usable lab room, or one of offering's + own batches (a batch can only be in one place at a time, so another + session competing for that batch's slot is a real contested resource + too, not just instructor/room). + """ + if other_session["instructor_code"] == offering["instructor_code"]: + return True + if other_session["room_id"] in candidate_room_ids: + return True + return bool(set(other_session["batch_codes"]) & set(offering["batch_codes"])) diff --git a/controller/solver/phase3_remaining.py b/controller/solver/phase3_remaining.py new file mode 100644 index 0000000..a867b99 --- /dev/null +++ b/controller/solver/phase3_remaining.py @@ -0,0 +1,193 @@ +""" +Phase 3: remaining (non-general) theory courses — batch by batch, with +recursive multi-bump backtracking. + +Processes batches in sorted batch_code order. Each batch must be fully +placed with zero conflicts before moving to the next batch. If a batch's +courses can't all be placed, this backtracks into *earlier, already- +completed Phase 3 batches*: it bumps sessions that share a contested +resource (same instructor, same room, or same batch) with the stuck +offering out of the way — trying combinations of more than one bumped +session where a single bump isn't enough — then reseats every bumped +session afterward (recursively backtracking again if a reseat itself gets +stuck), until either everything settles or the attempt budget is +exhausted. + +Phase 1 and Phase 2 sessions are never touched — only sessions this phase +itself placed for earlier batches are ever reopened. +""" + +from . import grid + +MAX_BACKTRACK_ATTEMPTS = 5000 +MAX_SIMULTANEOUS_BUMPS = 3 + + +def run(board, data): + """ + Places every remaining (non-general) theory offering's weekly + lectures, batch by batch. Returns this phase's sessions. + """ + phase_start = len(board.sessions) + offerings = [o for o in data["offerings"] if not o["course"]["is_general"]] + + # placed_so_far: flat list of (offering, session) for every session + # this phase has placed so far (across all completed batches) — the + # pool backtracking is allowed to bump from. + placed_so_far = [] + attempts = [0] + + for batch in sorted(data["batches"], key=lambda b: b["batch_code"]): + batch_code = batch["batch_code"] + batch_offerings = [o for o in offerings if batch_code in o["batch_codes"]] + # Place the most slot-constrained offerings first (long-lecture + # courses can only ever use slot 0, so they have the fewest + # options) — this way flexible 90-min courses fill in around them + # instead of greedily grabbing slot 0 first and starving a + # long-lecture course that has nowhere else to go. + batch_offerings.sort(key=lambda o: 0 if o["course"]["lecture_duration_minutes"] == 120 else 1) + + for offering in batch_offerings: + course = offering["course"] + room_candidates = board.room_candidates(course["lecture_room_id"], board.classrooms) + for _ in range(course["lectures_per_week"]): + session = _place_lecture_with_backtracking(board, offering, room_candidates, placed_so_far, attempts) + if session is None: + print( + f"WARNING: could not place a lecture for course {offering['course_id']} " + f"section {offering['section_id']} (batch {batch_code}) even after backtracking" + ) + else: + placed_so_far.append((offering, session)) + + return board.sessions[phase_start:] + + +def _place_lecture_with_backtracking(board, offering, room_candidates, placed_so_far, attempts): + """ + Tries the plain first-fit placement first; if that fails, tries + bumping *combinations* of resource-sharing predecessors out of the way + (starting with one at a time, then pairs, up to MAX_SIMULTANEOUS_BUMPS + together) until `offering` fits, then reseats every bumped session + (recursively backtracking again if a reseat itself gets stuck). + Returns the newly placed session dict, or None if no arrangement works + within the attempt budget. + """ + session = board.place_lecture(offering, room_candidates, grid.DAYS) + if session is not None: + return session + + candidate_room_ids = {r["room_id"] for r in room_candidates} + usable_slot_indices = {grid.LONG_LECTURE_SLOT_INDEX} if offering["course"]["lecture_duration_minutes"] == 120 else set(grid.TEACHING_SLOT_INDICES) + candidates = [ + (other_offering, other_session) + for other_offering, other_session in placed_so_far + if _shares_contested_resource(offering, other_session, candidate_room_ids, usable_slot_indices) + ] + # Most recently placed first — later placements are more likely to be + # "loose" (easier to reseat) than earlier, already-settled ones. + candidates.reverse() + + for bump_count in range(1, min(MAX_SIMULTANEOUS_BUMPS, len(candidates)) + 1): + result = _try_bump_combinations(board, offering, room_candidates, placed_so_far, attempts, candidates, bump_count) + if result is not None: + return result + if attempts[0] >= MAX_BACKTRACK_ATTEMPTS: + return None + + return None + + +def _try_bump_combinations(board, offering, room_candidates, placed_so_far, attempts, candidates, bump_count): + """ + Tries every way of picking `bump_count` candidates (in order) to bump + simultaneously, retrying `offering`'s placement after each bump. + Returns the newly placed session on success (with all bumped sessions + reseated), or None if no combination of this size works. + """ + from itertools import combinations + + for combo in combinations(range(len(candidates)), bump_count): + if attempts[0] >= MAX_BACKTRACK_ATTEMPTS: + return None + + chosen = [candidates[i] for i in combo] + if any((o, s) not in placed_so_far for o, s in chosen): + # One of these was already moved by an earlier failed branch. + continue + + bumped = [] + for other_offering, other_session in chosen: + attempts[0] += 1 + placed_so_far.remove((other_offering, other_session)) + board.remove_session(other_session) + bumped.append((other_offering, other_session)) + + session = board.place_lecture(offering, room_candidates, grid.DAYS) + if session is not None: + if _reseat_all(board, placed_so_far, attempts, bumped): + return session + # Reseating some bumped session failed even with recursion — + # undo our placement and restore everything bumped this round. + board.remove_session(session) + for other_offering, other_session in bumped: + placed_so_far.append((other_offering, _restore_session(board, other_offering, other_session))) + continue + + # This combination didn't free a usable slot — restore everything + # bumped this round and try the next combination. + for other_offering, other_session in bumped: + placed_so_far.append((other_offering, _restore_session(board, other_offering, other_session))) + + return None + + +def _reseat_all(board, placed_so_far, attempts, bumped): + """ + Reseats every (offering, session) in `bumped` (each currently removed + from the board), backtracking recursively if needed. All-or-nothing: + on any failure, every session reseated so far in this attempt is + removed again and `bumped` remains fully un-seated (the caller is + responsible for restoring them to their original slots). + """ + reseated = [] + for other_offering, other_session in bumped: + other_room_candidates = board.room_candidates(other_offering["course"]["lecture_room_id"], board.classrooms) + new_session = _place_lecture_with_backtracking(board, other_offering, other_room_candidates, placed_so_far, attempts) + if new_session is None: + for reseated_offering, reseated_session in reseated: + placed_so_far.remove((reseated_offering, reseated_session)) + board.remove_session(reseated_session) + return False + reseated.append((other_offering, new_session)) + placed_so_far.append((other_offering, new_session)) + return True + + +def _restore_session(board, offering, session): + """Re-marks and re-adds a session dict exactly as it was, at the same day/slots/room.""" + room = board.data["rooms_by_id"][session["room_id"]] + for slot_index in session["slot_indices"]: + board.mark_busy(session["day"], slot_index, session["room_id"], session["instructor_code"], session["batch_codes"]) + return board.add_session( + offering, session["day"], session["slot_indices"], room, + is_long_lecture=(session["duration_minutes"] == 120), + ) + + +def _shares_contested_resource(offering, other_session, candidate_room_ids, usable_slot_indices): + """ + True if bumping other_session could plausibly free a slot `offering` + can actually use: other_session must occupy at least one slot index + `offering` is eligible for, AND share the instructor, a usable room, + or (crucially) one of offering's own batches — a batch can only be in + one place at a time, so another course competing for the *same batch's* + slot-0 time is just as real a contested resource as instructor/room. + """ + if not any(slot_index in usable_slot_indices for slot_index in other_session["slot_indices"]): + return False + if other_session["instructor_code"] == offering["instructor_code"]: + return True + if other_session["room_id"] in candidate_room_ids: + return True + return bool(set(other_session["batch_codes"]) & set(offering["batch_codes"])) diff --git a/controller/solver/placement_board.py b/controller/solver/placement_board.py new file mode 100644 index 0000000..fb1b5f4 --- /dev/null +++ b/controller/solver/placement_board.py @@ -0,0 +1,171 @@ +""" +PlacementBoard: shared clash-tracking state and low-level placement +primitives. Owns the room/instructor/batch busy-maps and the accumulated +session list. Has zero scheduling policy of its own — every phase module +(phase1_general, phase2_labs, phase3_remaining) reads and writes the same +board, which is what makes each later phase automatically see earlier +phases' placements as fixed/locked. +""" + +from . import grid + + +class PlacementBoard: + def __init__(self, data): + self.data = data + self.classrooms = [r for r in data["rooms"] if r["room_type"] == "classroom"] + self.labs = [r for r in data["rooms"] if r["room_type"] == "lab"] + + # busy[(day, slot_index)] -> set of keys already occupied + self.room_busy = {} + self.instructor_busy = {} + self.batch_busy = {} + + self.sessions = [] + + # -- serialization ----------------------------------------------------- + + def to_state(self): + """Serializes accumulated sessions + busy-maps to a JSON-able dict.""" + def _dump_busy(busy_map): + return {f"{day}|{slot_index}": sorted(values) for (day, slot_index), values in busy_map.items()} + + return { + "sessions": self.sessions, + "room_busy": _dump_busy(self.room_busy), + "instructor_busy": _dump_busy(self.instructor_busy), + "batch_busy": _dump_busy(self.batch_busy), + } + + @classmethod + def from_state(cls, data, state): + """Rebuilds a PlacementBoard from a dict previously produced by to_state().""" + def _load_busy(dumped): + busy = {} + for key, values in dumped.items(): + day, slot_index = key.rsplit("|", 1) + busy[(day, int(slot_index))] = set(values) + return busy + + board = cls(data) + board.sessions = list(state["sessions"]) + board.room_busy = _load_busy(state["room_busy"]) + board.instructor_busy = _load_busy(state["instructor_busy"]) + board.batch_busy = _load_busy(state["batch_busy"]) + return board + + # -- clash-tracking primitives ------------------------------------------ + + def is_free(self, day, slot_index, room_id, instructor_code, batch_codes): + key = (day, slot_index) + if room_id in self.room_busy.get(key, set()): + return False + if instructor_code in self.instructor_busy.get(key, set()): + return False + if any(b in self.batch_busy.get(key, set()) for b in batch_codes): + return False + return True + + def mark_busy(self, day, slot_index, room_id, instructor_code, batch_codes): + key = (day, slot_index) + self.room_busy.setdefault(key, set()).add(room_id) + self.instructor_busy.setdefault(key, set()).add(instructor_code) + self.batch_busy.setdefault(key, set()).update(batch_codes) + + def unmark_busy(self, day, slot_index, room_id, instructor_code, batch_codes): + key = (day, slot_index) + self.room_busy.get(key, set()).discard(room_id) + self.instructor_busy.get(key, set()).discard(instructor_code) + for b in batch_codes: + self.batch_busy.get(key, set()).discard(b) + + def room_candidates(self, preferred_room_id, room_pool): + """Preferred room first, then the rest of the same-type pool.""" + preferred = self.data["rooms_by_id"].get(preferred_room_id) + rest = [r for r in room_pool if r["room_id"] != preferred_room_id] + return ([preferred] if preferred else []) + rest + + # -- session creation ---------------------------------------------------- + + def add_session(self, offering, day, slot_indices, room, is_long_lecture=False): + course = offering["course"] + if is_long_lecture: + start, end = grid.LONG_LECTURE_START, grid.LONG_LECTURE_END + duration_minutes = 120 + session_type = "theory" + else: + start = grid.TIME_SLOTS[slot_indices[0]]["start"] + end = grid.TIME_SLOTS[slot_indices[-1]]["end"] + duration_minutes = 90 * len(slot_indices) + session_type = "lab" if len(slot_indices) > 1 else "theory" + session = { + "day": day, + "slot_indices": slot_indices, + "start": start, + "end": end, + "duration_minutes": duration_minutes, + "course_id": offering["course_id"], + "course_name": course["course_name"], + "course_type": session_type, + "is_general": course["is_general"], + "section_id": offering["section_id"], + "instructor_code": offering["instructor_code"], + "instructor_name": offering["instructor_name"], + "room_id": room["room_id"], + "room_name": room["room_name"], + "batch_codes": offering["batch_codes"], + } + self.sessions.append(session) + return session + + def remove_session(self, session): + """Unmarks a previously placed session's slots and removes it from self.sessions.""" + for slot_index in session["slot_indices"]: + self.unmark_busy( + session["day"], slot_index, + session["room_id"], session["instructor_code"], session["batch_codes"], + ) + self.sessions.remove(session) + + # -- placement helpers shared by phase modules -------------------------- + + def place_theory_session(self, offering, room_candidates, day_order): + """Finds and locks a free normal 90-minute single-slot session; returns the session dict or None.""" + for day in day_order: + for slot_index in grid.TEACHING_SLOT_INDICES: + for room in room_candidates: + if self.is_free(day, slot_index, room["room_id"], offering["instructor_code"], offering["batch_codes"]): + self.mark_busy(day, slot_index, room["room_id"], offering["instructor_code"], offering["batch_codes"]) + return self.add_session(offering, day, [slot_index], room) + return None + + def place_long_lecture(self, offering, room_candidates, day_order): + """ + Finds and locks a free 08:30-10:30 long-lecture session. Occupies + the same clash-tracking slot index as normal slot 0 since they + overlap in wall-clock time. Returns the session dict or None. + """ + for day in day_order: + for room in room_candidates: + if self.is_free(day, grid.LONG_LECTURE_SLOT_INDEX, room["room_id"], offering["instructor_code"], offering["batch_codes"]): + self.mark_busy(day, grid.LONG_LECTURE_SLOT_INDEX, room["room_id"], offering["instructor_code"], offering["batch_codes"]) + return self.add_session(offering, day, [grid.LONG_LECTURE_SLOT_INDEX], room, is_long_lecture=True) + return None + + def place_lecture(self, offering, room_candidates, day_order): + """Dispatches to the long (120-min) or normal (90-min) lecture placement based on the course's lecture_duration_minutes.""" + if offering["course"]["lecture_duration_minutes"] == 120: + return self.place_long_lecture(offering, room_candidates, day_order) + return self.place_theory_session(offering, room_candidates, day_order) + + def place_lab(self, offering, room_candidates, day_order): + """Finds and locks a free 180-minute lab double-slot session; returns the session dict or None.""" + for day in day_order: + for slot_a, slot_b in grid.LAB_SLOT_PAIRS: + for room in room_candidates: + if self.is_free(day, slot_a, room["room_id"], offering["instructor_code"], offering["batch_codes"]) and \ + self.is_free(day, slot_b, room["room_id"], offering["instructor_code"], offering["batch_codes"]): + self.mark_busy(day, slot_a, room["room_id"], offering["instructor_code"], offering["batch_codes"]) + self.mark_busy(day, slot_b, room["room_id"], offering["instructor_code"], offering["batch_codes"]) + return self.add_session(offering, day, [slot_a, slot_b], room) + return None diff --git a/controller/template_controller.py b/controller/template_controller.py index 75e1269..319bb78 100644 --- a/controller/template_controller.py +++ b/controller/template_controller.py @@ -1,24 +1,23 @@ """ -Loads dummy CSV data and builds a clash-free schedule of sessions that all -five templates/*-wise template modules render from. +Loads dummy CSV data and exposes a thin Scheduler facade over the solver +engine in controller/solver/ (grid constants, PlacementBoard, and one +module per phase — phase1_general, phase2_labs, phase3_remaining). -Scheduling is done in three sequential, independently-verified phases (see -app/template_generator.py for the orchestration + per-phase conflict -checks). Each phase's placements are locked before the next phase starts: -once a (day, slot, room/instructor/batch) combination is marked busy by an -earlier phase, later phases can never reuse it. +Scheduling is done in three sequential, independently-verified phases, each +with its own tailored strategy (see controller/solver/phase*_*.py for the +per-phase logic). Each phase's placements are locked before the next phase +starts: once a (day, slot, room/instructor/batch) combination is marked +busy by an earlier phase, later phases can never reuse it — except Phase +3, which is allowed to backtrack and reopen *its own* earlier batches +(never Phase 1 or Phase 2) when a later batch can't otherwise be placed. 1. General courses (shared across every batch of a session), preferring - Tuesday/Thursday first. Each offering gets `lectures_per_week` - sessions. If two general courses still land in the same slot for a - batch, the losing session is moved to another day/slot until this - phase is clash-free (see `phase_1_general_courses`). - 2. Labs: each offering gets `labs_per_week` 180-minute / double-slot - sessions, in lab rooms only, scheduled against Phase 1's fixed - placements plus labs placed so far this phase. + Tuesday/Thursday first, self-repaired until clash-free. + 2. Labs, scheduled against Phase 1's fixed placements, then self-repaired + for lab-vs-lab clashes within Phase 2 only. 3. Remaining (non-general) theory sessions, scheduled batch by batch in - sorted batch_code order: for each batch, every one of its remaining - offerings is placed and locked before the next batch is considered. + sorted batch_code order, with backtracking into earlier Phase 3 + batches when a later batch can't otherwise fit. Time grid: 5 normal 90-minute slots, 09:00-16:30, no lunch break. Labs use 180-minute double-slots (09:00-12:00 and 12:00-15:00). A course whose @@ -34,55 +33,15 @@ preferred one is busy for that day/slot. import csv import os +from solver.grid import ( # noqa: F401 (re-exported for templates/backward compatibility) + DAYS, TIME_SLOTS, TEACHING_SLOT_INDICES, LAB_SLOT_PAIRS, + LONG_LECTURE_SLOT_INDEX, LONG_LECTURE_START, LONG_LECTURE_END, DISPLAY_ROWS, +) +from solver.placement_board import PlacementBoard +from solver import phase1_general, phase2_labs, phase3_remaining + DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "data", "dummy") -DAYS = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"] - -# Normal theory grid: 5 x 90-minute slots, 09:00-16:30, no lunch break. -# Every placeable session (normal lecture, lab, or the special long -# lecture) is expressed as one or more of these slot indices (0-4) for -# clash-tracking purposes — see LONG_LECTURE_SLOT below for why the long -# lecture also uses index 0 despite rendering at a different clock time. -TIME_SLOTS = [ - {"label": "S1", "start": "09:00", "end": "10:30", "is_lunch": False}, - {"label": "S2", "start": "10:30", "end": "12:00", "is_lunch": False}, - {"label": "S3", "start": "12:00", "end": "13:30", "is_lunch": False}, - {"label": "S4", "start": "13:30", "end": "15:00", "is_lunch": False}, - {"label": "S5", "start": "15:00", "end": "16:30", "is_lunch": False}, -] - -# Indices into TIME_SLOTS that are real teaching slots (no lunch to skip -# anymore, but kept for readability at call sites) -TEACHING_SLOT_INDICES = [i for i, s in enumerate(TIME_SLOTS) if not s["is_lunch"]] - -# Consecutive pairs of normal slots usable as a 180-minute lab double-slot: -# 09:00-12:00 (S1+S2) and 12:00-15:00 (S3+S4). -LAB_SLOT_PAIRS = [(0, 1), (2, 3)] - -# The special fixed slot for courses whose lecture is "2 hours once a -# week": 08:30-10:30. This overlaps 09:00-10:30 (normal slot index 0) in -# wall-clock time, so a long-lecture session is tracked as occupying slot -# index 0 too (same key _is_free/_mark_busy use) — that's what makes it -# correctly clash with anything else placed in normal slot 0 that day for -# the same room/instructor/batch. duration_minutes on the session dict is -# what distinguishes it from a normal 90-minute slot-0 session at render time. -LONG_LECTURE_SLOT_INDEX = 0 -LONG_LECTURE_START = "08:30" -LONG_LECTURE_END = "10:30" - -# Rows to render on every generated timetable grid: the special long-lecture -# row first (it starts earliest, 08:30), then the 5 normal 90-minute rows. -# Templates/xlsx_grid_helper key session lookups on (day, slot_index, -# duration_minutes) using these rows' slot_index/duration_minutes pairs. -DISPLAY_ROWS = [ - {"label": "Long", "start": LONG_LECTURE_START, "end": LONG_LECTURE_END, - "slot_index": LONG_LECTURE_SLOT_INDEX, "duration_minutes": 120}, -] + [ - {"label": s["label"], "start": s["start"], "end": s["end"], - "slot_index": i, "duration_minutes": 90} - for i, s in enumerate(TIME_SLOTS) -] - def _read_csv(relative_path): path = os.path.join(DATA_DIR, relative_path) @@ -139,263 +98,44 @@ def load_data(): class Scheduler: - """Greedy clash-free scheduler over rooms / instructors / batches.""" + """ + Thin facade over the solver engine: owns a PlacementBoard and + delegates each phase to its dedicated solver/phase*_*.py module. + Keeps the same public surface the rest of the app already relies on + (app/template_generator.py, controller/conflict_checker/*). + """ def __init__(self, data): self.data = data - self.classrooms = [r for r in data["rooms"] if r["room_type"] == "classroom"] - self.labs = [r for r in data["rooms"] if r["room_type"] == "lab"] + self.board = PlacementBoard(data) - # busy[(day, slot_index)] -> set of keys already occupied - self.room_busy = {} - self.instructor_busy = {} - self.batch_busy = {} - - self.sessions = [] + @property + def sessions(self): + return self.board.sessions def to_state(self): - """ - Serializes this scheduler's accumulated sessions and busy-maps to a - JSON-able dict, so a later process can resume exactly where this - one left off (used to run each phase as a separate CLI command). - """ - def _dump_busy(busy_map): - return {f"{day}|{slot_index}": sorted(values) for (day, slot_index), values in busy_map.items()} - - return { - "sessions": self.sessions, - "room_busy": _dump_busy(self.room_busy), - "instructor_busy": _dump_busy(self.instructor_busy), - "batch_busy": _dump_busy(self.batch_busy), - } + return self.board.to_state() @classmethod def from_state(cls, data, state): - """Rebuilds a Scheduler from a dict previously produced by to_state().""" - def _load_busy(dumped): - busy = {} - for key, values in dumped.items(): - day, slot_index = key.rsplit("|", 1) - busy[(day, int(slot_index))] = set(values) - return busy - scheduler = cls(data) - scheduler.sessions = list(state["sessions"]) - scheduler.room_busy = _load_busy(state["room_busy"]) - scheduler.instructor_busy = _load_busy(state["instructor_busy"]) - scheduler.batch_busy = _load_busy(state["batch_busy"]) + scheduler.board = PlacementBoard.from_state(data, state) return scheduler - def _is_free(self, day, slot_index, room_id, instructor_code, batch_codes): - key = (day, slot_index) - if room_id in self.room_busy.get(key, set()): - return False - if instructor_code in self.instructor_busy.get(key, set()): - return False - if any(b in self.batch_busy.get(key, set()) for b in batch_codes): - return False - return True - - def _mark_busy(self, day, slot_index, room_id, instructor_code, batch_codes): - key = (day, slot_index) - self.room_busy.setdefault(key, set()).add(room_id) - self.instructor_busy.setdefault(key, set()).add(instructor_code) - self.batch_busy.setdefault(key, set()).update(batch_codes) - - def _unmark_busy(self, day, slot_index, room_id, instructor_code, batch_codes): - key = (day, slot_index) - self.room_busy.get(key, set()).discard(room_id) - self.instructor_busy.get(key, set()).discard(instructor_code) - for b in batch_codes: - self.batch_busy.get(key, set()).discard(b) - - def _room_candidates(self, preferred_room_id, room_pool): - """Preferred room first, then the rest of the same-type pool.""" - preferred = self.data["rooms_by_id"].get(preferred_room_id) - rest = [r for r in room_pool if r["room_id"] != preferred_room_id] - return ([preferred] if preferred else []) + rest - - def _add_session(self, offering, day, slot_indices, room, is_long_lecture=False): - course = offering["course"] - if is_long_lecture: - start, end = LONG_LECTURE_START, LONG_LECTURE_END - duration_minutes = 120 - session_type = "theory" - else: - start = TIME_SLOTS[slot_indices[0]]["start"] - end = TIME_SLOTS[slot_indices[-1]]["end"] - duration_minutes = 90 * len(slot_indices) - session_type = "lab" if len(slot_indices) > 1 else "theory" - session = { - "day": day, - "slot_indices": slot_indices, - "start": start, - "end": end, - "duration_minutes": duration_minutes, - "course_id": offering["course_id"], - "course_name": course["course_name"], - "course_type": session_type, - "is_general": course["is_general"], - "section_id": offering["section_id"], - "instructor_code": offering["instructor_code"], - "instructor_name": offering["instructor_name"], - "room_id": room["room_id"], - "room_name": room["room_name"], - "batch_codes": offering["batch_codes"], - } - self.sessions.append(session) - return session - - def _place_theory_session(self, offering, room_candidates, day_order): - """Finds and locks a free normal 90-minute single-slot session; returns the session dict or None.""" - for day in day_order: - for slot_index in TEACHING_SLOT_INDICES: - for room in room_candidates: - if self._is_free(day, slot_index, room["room_id"], offering["instructor_code"], offering["batch_codes"]): - self._mark_busy(day, slot_index, room["room_id"], offering["instructor_code"], offering["batch_codes"]) - return self._add_session(offering, day, [slot_index], room) - return None - - def _place_long_lecture(self, offering, room_candidates, day_order): - """ - Finds and locks a free 08:30-10:30 long-lecture session (for - courses with lecture_duration_minutes=120). Occupies the same - clash-tracking slot index as normal slot 0 since they overlap in - wall-clock time (09:00-10:30). Returns the session dict or None. - """ - for day in day_order: - for room in room_candidates: - if self._is_free(day, LONG_LECTURE_SLOT_INDEX, room["room_id"], offering["instructor_code"], offering["batch_codes"]): - self._mark_busy(day, LONG_LECTURE_SLOT_INDEX, room["room_id"], offering["instructor_code"], offering["batch_codes"]) - return self._add_session(offering, day, [LONG_LECTURE_SLOT_INDEX], room, is_long_lecture=True) - return None - - def _place_lecture(self, offering, room_candidates, day_order): - """Dispatches to the long (120-min) or normal (90-min) lecture placement based on the course's lecture_duration_minutes.""" - if offering["course"]["lecture_duration_minutes"] == 120: - return self._place_long_lecture(offering, room_candidates, day_order) - return self._place_theory_session(offering, room_candidates, day_order) - - def phase_1_general_courses(self, preferred_days=("Tuesday", "Thursday"), max_repair_attempts=20): - """ - Places every general-course offering's weekly lectures, preferring - `preferred_days` first. Afterwards, self-repairs: any batch left - with two general-course sessions in the same slot has the losing - session unmarked and re-placed (scanning every day) until this - phase's own sessions are clash-free. Returns this phase's sessions. - """ - general = [o for o in self.data["offerings"] if o["course"]["is_general"]] - preferred_order = list(preferred_days) + [d for d in DAYS if d not in preferred_days] - phase_start = len(self.sessions) - - for offering in general: - course = offering["course"] - room_candidates = self._room_candidates(course["lecture_room_id"], self.classrooms) - for _ in range(course["lectures_per_week"]): - session = self._place_lecture(offering, room_candidates, preferred_order) - if session is None: - print(f"WARNING: could not place a lecture for general course {offering['course_id']} section {offering['section_id']}") - - phase_sessions = self.sessions[phase_start:] - self._repair_general_conflicts(phase_sessions, preferred_order, max_repair_attempts) - return phase_sessions - - def _repair_general_conflicts(self, phase_sessions, day_order, max_attempts): - """Moves general-course sessions that clash for a batch to a free slot on any day.""" - from conflict_checker.student_conflict_checker import check_student_conflicts - - any_day_order = list(DAYS) - for _ in range(max_attempts): - conflicts = check_student_conflicts(phase_sessions) - if not conflicts: - return - - # Re-place the last session involved in the first conflict; the - # other session(s) in that cell stay put. - losing_session = conflicts[0]["sessions"][-1] - offering = next( - o for o in self.data["offerings"] - if o["course_id"] == losing_session["course_id"] and o["section_id"] == losing_session["section_id"] - ) - self._unmark_busy( - losing_session["day"], losing_session["slot_indices"][0], - losing_session["room_id"], losing_session["instructor_code"], losing_session["batch_codes"], - ) - self.sessions.remove(losing_session) - phase_sessions.remove(losing_session) - - room_candidates = self._room_candidates(offering["course"]["lecture_room_id"], self.classrooms) - new_session = self._place_lecture(offering, room_candidates, any_day_order) - if new_session is None: - print(f"WARNING: could not repair general-course conflict for {offering['course_id']} section {offering['section_id']}") - return - phase_sessions.append(new_session) - - print("WARNING: general-course conflicts remained unresolved after max repair attempts") + def phase_1_general_courses(self): + return phase1_general.run(self.board, self.data) def phase_2_labs(self): - """ - Places every lab offering's weekly labs into lab rooms, treating - Phase 1's placements (already marked busy) as fixed. Returns this - phase's sessions. - """ - phase_start = len(self.sessions) - offerings = [o for o in self.data["offerings"] if not o["course"]["is_general"] and o["course"]["labs_per_week"] > 0] - for offering in offerings: - course = offering["course"] - room_candidates = self._room_candidates(course["lab_room_id"], self.labs) - - for _ in range(course["labs_per_week"]): - placed = False - for day in DAYS: - for slot_a, slot_b in LAB_SLOT_PAIRS: - for room in room_candidates: - if self._is_free(day, slot_a, room["room_id"], offering["instructor_code"], offering["batch_codes"]) and \ - self._is_free(day, slot_b, room["room_id"], offering["instructor_code"], offering["batch_codes"]): - self._mark_busy(day, slot_a, room["room_id"], offering["instructor_code"], offering["batch_codes"]) - self._mark_busy(day, slot_b, room["room_id"], offering["instructor_code"], offering["batch_codes"]) - self._add_session(offering, day, [slot_a, slot_b], room) - placed = True - break - if placed: - break - if placed: - break - if not placed: - print(f"WARNING: could not place a lab for course {offering['course_id']} section {offering['section_id']} ({offering['batch_codes']})") - - return self.sessions[phase_start:] + return phase2_labs.run(self.board, self.data) def phase_3_remaining_courses(self): - """ - Places every remaining (non-general) theory offering's weekly - lectures, batch by batch in sorted batch_code order: all of one - batch's offerings are placed and locked before the next batch is - considered. Treats Phases 1+2 (already marked busy) as fixed. - Returns this phase's sessions. - """ - phase_start = len(self.sessions) - offerings = [o for o in self.data["offerings"] if not o["course"]["is_general"]] - - for batch in sorted(self.data["batches"], key=lambda b: b["batch_code"]): - batch_code = batch["batch_code"] - batch_offerings = [o for o in offerings if batch_code in o["batch_codes"]] - - for offering in batch_offerings: - course = offering["course"] - room_candidates = self._room_candidates(course["lecture_room_id"], self.classrooms) - for _ in range(course["lectures_per_week"]): - session = self._place_lecture(offering, room_candidates, DAYS) - if session is None: - print(f"WARNING: could not place a lecture for course {offering['course_id']} section {offering['section_id']} ({offering['batch_codes']})") - - return self.sessions[phase_start:] + return phase3_remaining.run(self.board, self.data) def run(self): self.phase_1_general_courses() self.phase_2_labs() self.phase_3_remaining_courses() - return self.sessions + return self.board.sessions def build_schedule(): diff --git a/data/dummy/blocks/rooms.csv b/data/dummy/blocks/rooms.csv index 29111fc..727c978 100644 --- a/data/dummy/blocks/rooms.csv +++ b/data/dummy/blocks/rooms.csv @@ -3,8 +3,10 @@ A-101,Room 101,A,classroom,60 A-102,Room 102,A,classroom,60 A-103,Room 103,A,classroom,50 A-201,Room 201,A,classroom,60 +A-202,Room 202,A,classroom,60 A-L01,Computer Lab 1,A,lab,35 A-L02,Computer Lab 2,A,lab,35 +A-L03,Computer Lab 3,A,lab,35 B-101,Room 101 (B),B,classroom,50 B-102,Room 102 (B),B,classroom,50 B-L01,Electronics Lab,B,lab,30 diff --git a/data/dummy/courses/course_offering.csv b/data/dummy/courses/course_offering.csv index d9422dd..d4369c8 100644 --- a/data/dummy/courses/course_offering.csv +++ b/data/dummy/courses/course_offering.csv @@ -2,43 +2,43 @@ course_id,section_id,batch_codes,instructor_code CS101,A,25021519,1001 CS201,A,25021519,1002 CS301,A,25021519,1003 -CS302,A,25021519,1001 +CS302,A,25021519,1009 CS101,B,25021520,1001 CS201,B,25021520,1002 CS301,B,25021520,1003 -CS302,B,25021520,1001 +CS302,B,25021520,1012 EE101,A,25031519,1004 EE201,A,25031519,1005 -EE301,A,25031519,1004 +EE301,A,25031519,1010 EE101,B,25031520,1004 EE201,B,25031520,1005 -EE301,B,25031520,1004 +EE301,B,25031520,1010 BBA101,A,25041519,1007 BBA201,A,25041519,1008 -BBA301,A,25041519,1007 +BBA301,A,25041519,1011 BBA101,B,25041520,1007 BBA201,B,25041520,1008 -BBA301,B,25041520,1007 +BBA301,B,25041520,1011 CS101,C,26021519,1001 CS201,C,26021519,1002 CS301,C,26021519,1003 -CS302,C,26021519,1001 +CS302,C,26021519,1009 CS101,D,26021520,1001 CS201,D,26021520,1002 CS301,D,26021520,1003 -CS302,D,26021520,1001 +CS302,D,26021520,1012 EE101,C,26031519,1004 EE201,C,26031519,1005 -EE301,C,26031519,1004 +EE301,C,26031519,1010 EE101,D,26031520,1004 EE201,D,26031520,1005 -EE301,D,26031520,1004 +EE301,D,26031520,1010 BBA101,C,26041519,1007 BBA201,C,26041519,1008 -BBA301,C,26041519,1007 +BBA301,C,26041519,1011 BBA101,D,26041520,1007 BBA201,D,26041520,1008 -BBA301,D,26041520,1007 +BBA301,D,26041520,1011 GEN101,ALL,25021519|25021520|25031519|25031520|25041519|25041520,1002 GEN102,ALL,25021519|25021520|25031519|25031520|25041519|25041520,1006 GEN103,ALL,25021519|25021520|25031519|25031520|25041519|25041520,1006 diff --git a/data/dummy/courses/courses.csv b/data/dummy/courses/courses.csv index 0c32b96..a4667ce 100644 --- a/data/dummy/courses/courses.csv +++ b/data/dummy/courses/courses.csv @@ -1,8 +1,8 @@ course_id,course_name,credit_hours,lectures_per_week,labs_per_week,is_general,lecture_room_id,lab_room_id,lecture_duration_minutes CS101,Programming Fundamentals,4,2,1,no,A-101,A-L01,90 -CS201,Data Structures,4,2,1,no,A-102,A-L01,90 -CS301,Operating Systems,3,1,1,no,A-101,A-L02,120 -CS302,Database Systems,4,2,2,no,A-102,A-L02,90 +CS201,Data Structures,4,2,1,no,A-102,A-L02,90 +CS301,Operating Systems,3,1,1,no,A-101,A-L03,120 +CS302,Database Systems,4,2,1,no,A-102,A-L01,90 EE101,Basic Electronics,4,2,1,no,A-201,A-L02,90 EE201,Digital Logic Design,4,2,1,no,B-101,B-L01,90 EE301,Signals and Systems,3,1,0,no,B-102,,120 @@ -11,4 +11,4 @@ BBA201,Financial Accounting,3,2,0,no,B-102,,90 BBA301,Marketing Management,3,1,0,no,A-103,,120 GEN101,Functional English,3,2,0,yes,A-103,,90 GEN102,Islamic Studies,2,1,0,yes,A-103,,90 -GEN103,Pakistan Studies,2,1,0,yes,B-101,,120 +GEN103,Pakistan Studies,2,1,0,yes,A-202,,120 diff --git a/data/dummy/generate_dummy_data.py b/data/dummy/generate_dummy_data.py index 41e766e..76c313d 100644 --- a/data/dummy/generate_dummy_data.py +++ b/data/dummy/generate_dummy_data.py @@ -38,8 +38,9 @@ def main(): ], ) - # ---- rooms: deliberately tight relative to demand (see offerings - # below) so room contention is real, spread across both blocks ---- + # ---- rooms: tight enough to keep real contention, but with enough + # total capacity that a correct solver can always find a fit (room + # capacity/student-count is not a constraint here) ---- write_csv( "blocks/rooms.csv", ["room_id", "room_name", "block_id", "room_type", "capacity"], @@ -48,8 +49,10 @@ def main(): ["A-102", "Room 102", "A", "classroom", 60], ["A-103", "Room 103", "A", "classroom", 50], ["A-201", "Room 201", "A", "classroom", 60], + ["A-202", "Room 202", "A", "classroom", 60], ["A-L01", "Computer Lab 1", "A", "lab", 35], ["A-L02", "Computer Lab 2", "A", "lab", 35], + ["A-L03", "Computer Lab 3", "A", "lab", 35], ["B-101", "Room 101 (B)", "B", "classroom", 50], ["B-102", "Room 102 (B)", "B", "classroom", 50], ["B-L01", "Electronics Lab", "B", "lab", 30], @@ -97,15 +100,18 @@ def main(): # # Mixed lecture durations: most courses are 90-min x N/week, but a few # are the special "2 hours once a week" case (lecture_duration_minutes - # 120, lectures_per_week 1). Labs vary 0/1/2 per week. Deliberately - # more courses per department than the room/instructor pool can - # comfortably absorb without contention. + # 120, lectures_per_week 1). A course's lab, if it has one, is always + # exactly once a week (180 minutes) — never more. Deliberately more + # courses per department than the room/instructor pool can comfortably + # absorb without contention. courses = [ - # CS department courses + # CS department courses — lab rooms spread across A-L01/A-L02/A-L03 + # so no single lab room is asked for more sessions than exist + # weekly slots for it (5 days x 2 lab-slot-pairs = 10/week). ["CS101", "Programming Fundamentals", 4, 2, 1, "no", "A-101", "A-L01", 90], - ["CS201", "Data Structures", 4, 2, 1, "no", "A-102", "A-L01", 90], - ["CS301", "Operating Systems", 3, 1, 1, "no", "A-101", "A-L02", 120], - ["CS302", "Database Systems", 4, 2, 2, "no", "A-102", "A-L02", 90], + ["CS201", "Data Structures", 4, 2, 1, "no", "A-102", "A-L02", 90], + ["CS301", "Operating Systems", 3, 1, 1, "no", "A-101", "A-L03", 120], + ["CS302", "Database Systems", 4, 2, 1, "no", "A-102", "A-L01", 90], # EE department courses ["EE101", "Basic Electronics", 4, 2, 1, "no", "A-201", "A-L02", 90], ["EE201", "Digital Logic Design", 4, 2, 1, "no", "B-101", "B-L01", 90], @@ -117,7 +123,7 @@ def main(): # General (shared) courses ["GEN101", "Functional English", 3, 2, 0, "yes", "A-103", "", 90], ["GEN102", "Islamic Studies", 2, 1, 0, "yes", "A-103", "", 90], - ["GEN103", "Pakistan Studies", 2, 1, 0, "yes", "B-101", "", 120], + ["GEN103", "Pakistan Studies", 2, 1, 0, "yes", "A-202", "", 120], ] write_csv( "courses/courses.csv", @@ -139,27 +145,47 @@ def main(): "EE": ["EE101", "EE201", "EE301"], "BBA": ["BBA101", "BBA201", "BBA301"], } - # Small pools relative to (department batches x courses) demand. + # One instructor per course within a department (so no instructor ever + # teaches two different courses to the same section/batch, which would + # double their weekly slot demand against that batch's narrow shared + # availability) — still a tight pool overall since each instructor + # teaches their course across every section of the department. dept_instructors = { - "CS": ["1001", "1002", "1003"], - "EE": ["1004", "1005"], - "BBA": ["1007", "1008"], + "CS": ["1001", "1002", "1003", "1009"], + "EE": ["1004", "1005", "1010"], + "BBA": ["1007", "1008", "1011"], } + # CS302 additionally alternates between two instructors across its + # sections (instead of one instructor owning all 4) since it has the + # heaviest per-section load (2 lectures + 2 labs/week) — one person + # covering every section of it would need more slot-0 room than a + # single instructor realistically has once other batches' commitments + # are accounted for. + course_instructor_rotation = {"CS302": ["1009", "1012"]} + instructor_names_extra = {"1012": "Ms. Rabia Nasir"} offerings = [] section_letters = ["A", "B", "C", "D"] dept_section_counter = {"CS": 0, "EE": 0, "BBA": 0} for batch_code, department, program, session in all_batches: - section_id = section_letters[dept_section_counter[department] % len(section_letters)] + section_index = dept_section_counter[department] + section_id = section_letters[section_index % len(section_letters)] dept_section_counter[department] += 1 instr_pool = dept_instructors[department] + # One instructor per course, consistent across every section, so + # no instructor ever teaches two different courses to the same + # batch (which would silently double their contested slot-0 + # demand against that one batch). The pool is still tight overall + # since each instructor teaches their course to every section of + # the department -> real instructor contention across sections. for i, course_id in enumerate(dept_courses[department]): - # Deliberately narrow instructor rotation (2-3 instructors - # covering 3-4 courses per department) so the same instructor - # teaches multiple courses/sections -> instructor contention. - instr = instr_pool[i % len(instr_pool)] + if course_id in course_instructor_rotation: + rotation = course_instructor_rotation[course_id] + instr = rotation[section_index % len(rotation)] + else: + instr = instr_pool[i % len(instr_pool)] offerings.append([course_id, section_id, batch_code, instr]) # general courses: one offering per (course, session), section "ALL" @@ -190,6 +216,10 @@ def main(): "1006": "Ms. Hira Shah", "1007": "Dr. Nadia Farooq", "1008": "Mr. Kamran Sheikh", + "1009": "Ms. Ayesha Malik", + "1010": "Mr. Imran Qureshi", + "1011": "Dr. Saima Aziz", + **instructor_names_extra, } instructors = [] for course_id, section_id, batch_codes, instr_code in offerings: diff --git a/data/dummy/instructor/instructors.csv b/data/dummy/instructor/instructors.csv index 41e82d0..3832004 100644 --- a/data/dummy/instructor/instructors.csv +++ b/data/dummy/instructor/instructors.csv @@ -2,43 +2,43 @@ instructor_code,instructor_name,course_id,section_id 1001,Dr. Ahsan Raza,CS101,A 1002,Ms. Sana Tariq,CS201,A 1003,Mr. Bilal Khan,CS301,A -1001,Dr. Ahsan Raza,CS302,A +1009,Ms. Ayesha Malik,CS302,A 1001,Dr. Ahsan Raza,CS101,B 1002,Ms. Sana Tariq,CS201,B 1003,Mr. Bilal Khan,CS301,B -1001,Dr. Ahsan Raza,CS302,B +1012,Ms. Rabia Nasir,CS302,B 1004,Dr. Farah Iqbal,EE101,A 1005,Mr. Usman Ali,EE201,A -1004,Dr. Farah Iqbal,EE301,A +1010,Mr. Imran Qureshi,EE301,A 1004,Dr. Farah Iqbal,EE101,B 1005,Mr. Usman Ali,EE201,B -1004,Dr. Farah Iqbal,EE301,B +1010,Mr. Imran Qureshi,EE301,B 1007,Dr. Nadia Farooq,BBA101,A 1008,Mr. Kamran Sheikh,BBA201,A -1007,Dr. Nadia Farooq,BBA301,A +1011,Dr. Saima Aziz,BBA301,A 1007,Dr. Nadia Farooq,BBA101,B 1008,Mr. Kamran Sheikh,BBA201,B -1007,Dr. Nadia Farooq,BBA301,B +1011,Dr. Saima Aziz,BBA301,B 1001,Dr. Ahsan Raza,CS101,C 1002,Ms. Sana Tariq,CS201,C 1003,Mr. Bilal Khan,CS301,C -1001,Dr. Ahsan Raza,CS302,C +1009,Ms. Ayesha Malik,CS302,C 1001,Dr. Ahsan Raza,CS101,D 1002,Ms. Sana Tariq,CS201,D 1003,Mr. Bilal Khan,CS301,D -1001,Dr. Ahsan Raza,CS302,D +1012,Ms. Rabia Nasir,CS302,D 1004,Dr. Farah Iqbal,EE101,C 1005,Mr. Usman Ali,EE201,C -1004,Dr. Farah Iqbal,EE301,C +1010,Mr. Imran Qureshi,EE301,C 1004,Dr. Farah Iqbal,EE101,D 1005,Mr. Usman Ali,EE201,D -1004,Dr. Farah Iqbal,EE301,D +1010,Mr. Imran Qureshi,EE301,D 1007,Dr. Nadia Farooq,BBA101,C 1008,Mr. Kamran Sheikh,BBA201,C -1007,Dr. Nadia Farooq,BBA301,C +1011,Dr. Saima Aziz,BBA301,C 1007,Dr. Nadia Farooq,BBA101,D 1008,Mr. Kamran Sheikh,BBA201,D -1007,Dr. Nadia Farooq,BBA301,D +1011,Dr. Saima Aziz,BBA301,D 1002,Ms. Sana Tariq,GEN101,ALL 1006,Ms. Hira Shah,GEN102,ALL 1006,Ms. Hira Shah,GEN103,ALL diff --git a/logs/template_generator.log b/logs/template_generator.log index d186498..14570d0 100644 --- a/logs/template_generator.log +++ b/logs/template_generator.log @@ -1,12 +1,12 @@ -Timetable generation log - started 2026-09-09T18:19:44.655145 +Timetable generation log - started 2026-09-09T18:55:26.141293 ================================================================================ -[18:19:44] INFO: clear_all: schedule state, result templates, and log have been reset. Run phase_1 to start over. -[18:19:48] INFO: Phase 1/3: scheduling general courses (Tue/Thu preferred)... -[18:19:48] INFO: [Phase 1 (general courses)] No conflicts found — clash-free. -[18:19:48] INFO: phase_1 complete: 8 session(s) added this phase, 8 total so far. State saved to D:\projects\UORM\timetable\result\schedule_state.json. -[18:19:57] INFO: Phase 2/3: scheduling labs (on top of phase_1's fixed placements)... -[18:19:57] INFO: [Phase 2 (general courses + labs)] No conflicts found — clash-free. -[18:19:57] INFO: phase_2 complete: 23 session(s) added this phase, 31 total so far. State saved to D:\projects\UORM\timetable\result\schedule_state.json. -[18:20:05] INFO: Phase 3/3: scheduling remaining courses (batch by batch)... -[18:20:05] INFO: [Phase 3 (full schedule)] No conflicts found — clash-free. -[18:20:05] INFO: phase_3 complete: 51 session(s) added this phase, 82 total so far. State saved to D:\projects\UORM\timetable\result\schedule_state.json. +[18:55:26] INFO: clear_all: schedule state, result templates, and log have been reset. Run phase_1 to start over. +[18:55:26] INFO: Phase 1/3: scheduling general courses (Tue/Thu preferred)... +[18:55:26] INFO: [Phase 1 (general courses)] No conflicts found — clash-free. +[18:55:26] INFO: phase_1 complete: 8 session(s) added this phase, 8 total so far. State saved to D:\projects\UORM\timetable\result\schedule_state.json. +[18:55:29] INFO: Phase 2/3: scheduling labs (on top of phase_1's fixed placements)... +[18:55:29] INFO: [Phase 2 (general courses + labs)] No conflicts found — clash-free. +[18:55:29] INFO: phase_2 complete: 24 session(s) added this phase, 32 total so far. State saved to D:\projects\UORM\timetable\result\schedule_state.json. +[18:55:32] INFO: Phase 3/3: scheduling remaining courses (batch by batch)... +[18:55:32] INFO: [Phase 3 (full schedule)] No conflicts found — clash-free. +[18:55:33] INFO: phase_3 complete: 68 session(s) added this phase, 100 total so far. State saved to D:\projects\UORM\timetable\result\schedule_state.json. diff --git a/result/schedule_state.json b/result/schedule_state.json index 896a8bc..5df78ac 100644 --- a/result/schedule_state.json +++ b/result/schedule_state.json @@ -93,8 +93,8 @@ "section_id": "ALL", "instructor_code": "1006", "instructor_name": "Ms. Hira Shah", - "room_id": "B-101", - "room_name": "Room 101 (B)", + "room_id": "A-202", + "room_name": "Room 202", "batch_codes": [ "25021519", "25021520", @@ -197,8 +197,8 @@ "section_id": "ALL", "instructor_code": "1006", "instructor_name": "Ms. Hira Shah", - "room_id": "B-101", - "room_name": "Room 101 (B)", + "room_id": "A-202", + "room_name": "Room 202", "batch_codes": [ "26021519", "26021520", @@ -211,11 +211,11 @@ { "day": "Monday", "slot_indices": [ - 0, - 1 + 1, + 2 ], - "start": "09:00", - "end": "12:00", + "start": "10:30", + "end": "13:30", "duration_minutes": 180, "course_id": "CS101", "course_name": "Programming Fundamentals", @@ -233,11 +233,11 @@ { "day": "Monday", "slot_indices": [ - 2, - 3 + 3, + 4 ], - "start": "12:00", - "end": "15:00", + "start": "13:30", + "end": "16:30", "duration_minutes": 180, "course_id": "CS201", "course_name": "Data Structures", @@ -246,20 +246,20 @@ "section_id": "A", "instructor_code": "1002", "instructor_name": "Ms. Sana Tariq", - "room_id": "A-L01", - "room_name": "Computer Lab 1", + "room_id": "A-L02", + "room_name": "Computer Lab 2", "batch_codes": [ "25021519" ] }, { - "day": "Wednesday", + "day": "Tuesday", "slot_indices": [ - 0, - 1 + 3, + 4 ], - "start": "09:00", - "end": "12:00", + "start": "13:30", + "end": "16:30", "duration_minutes": 180, "course_id": "CS301", "course_name": "Operating Systems", @@ -268,8 +268,8 @@ "section_id": "A", "instructor_code": "1003", "instructor_name": "Mr. Bilal Khan", - "room_id": "A-L02", - "room_name": "Computer Lab 2", + "room_id": "A-L03", + "room_name": "Computer Lab 3", "batch_codes": [ "25021519" ] @@ -277,43 +277,21 @@ { "day": "Wednesday", "slot_indices": [ - 2, - 3 + 1, + 2 ], - "start": "12:00", - "end": "15:00", + "start": "10:30", + "end": "13:30", "duration_minutes": 180, "course_id": "CS302", "course_name": "Database Systems", "course_type": "lab", "is_general": false, "section_id": "A", - "instructor_code": "1001", - "instructor_name": "Dr. Ahsan Raza", - "room_id": "A-L02", - "room_name": "Computer Lab 2", - "batch_codes": [ - "25021519" - ] - }, - { - "day": "Thursday", - "slot_indices": [ - 2, - 3 - ], - "start": "12:00", - "end": "15:00", - "duration_minutes": 180, - "course_id": "CS302", - "course_name": "Database Systems", - "course_type": "lab", - "is_general": false, - "section_id": "A", - "instructor_code": "1001", - "instructor_name": "Dr. Ahsan Raza", - "room_id": "A-L02", - "room_name": "Computer Lab 2", + "instructor_code": "1009", + "instructor_name": "Ms. Ayesha Malik", + "room_id": "A-L01", + "room_name": "Computer Lab 1", "batch_codes": [ "25021519" ] @@ -321,11 +299,11 @@ { "day": "Monday", "slot_indices": [ - 2, - 3 + 3, + 4 ], - "start": "12:00", - "end": "15:00", + "start": "13:30", + "end": "16:30", "duration_minutes": 180, "course_id": "CS101", "course_name": "Programming Fundamentals", @@ -334,8 +312,8 @@ "section_id": "B", "instructor_code": "1001", "instructor_name": "Dr. Ahsan Raza", - "room_id": "A-L02", - "room_name": "Computer Lab 2", + "room_id": "A-L01", + "room_name": "Computer Lab 1", "batch_codes": [ "25021520" ] @@ -343,11 +321,11 @@ { "day": "Monday", "slot_indices": [ - 0, - 1 + 1, + 2 ], - "start": "09:00", - "end": "12:00", + "start": "10:30", + "end": "13:30", "duration_minutes": 180, "course_id": "CS201", "course_name": "Data Structures", @@ -365,11 +343,11 @@ { "day": "Wednesday", "slot_indices": [ - 2, - 3 + 1, + 2 ], - "start": "12:00", - "end": "15:00", + "start": "10:30", + "end": "13:30", "duration_minutes": 180, "course_id": "CS301", "course_name": "Operating Systems", @@ -378,64 +356,42 @@ "section_id": "B", "instructor_code": "1003", "instructor_name": "Mr. Bilal Khan", - "room_id": "A-L01", - "room_name": "Computer Lab 1", + "room_id": "A-L03", + "room_name": "Computer Lab 3", "batch_codes": [ "25021520" ] }, { - "day": "Wednesday", + "day": "Tuesday", "slot_indices": [ - 0, - 1 + 3, + 4 ], - "start": "09:00", - "end": "12:00", + "start": "13:30", + "end": "16:30", "duration_minutes": 180, "course_id": "CS302", "course_name": "Database Systems", "course_type": "lab", "is_general": false, "section_id": "B", - "instructor_code": "1001", - "instructor_name": "Dr. Ahsan Raza", + "instructor_code": "1012", + "instructor_name": "Ms. Rabia Nasir", "room_id": "A-L01", "room_name": "Computer Lab 1", "batch_codes": [ "25021520" ] }, - { - "day": "Friday", - "slot_indices": [ - 0, - 1 - ], - "start": "09:00", - "end": "12:00", - "duration_minutes": 180, - "course_id": "CS302", - "course_name": "Database Systems", - "course_type": "lab", - "is_general": false, - "section_id": "B", - "instructor_code": "1001", - "instructor_name": "Dr. Ahsan Raza", - "room_id": "A-L02", - "room_name": "Computer Lab 2", - "batch_codes": [ - "25021520" - ] - }, { "day": "Monday", "slot_indices": [ - 0, - 1 + 1, + 2 ], - "start": "09:00", - "end": "12:00", + "start": "10:30", + "end": "13:30", "duration_minutes": 180, "course_id": "EE101", "course_name": "Basic Electronics", @@ -444,8 +400,8 @@ "section_id": "A", "instructor_code": "1004", "instructor_name": "Dr. Farah Iqbal", - "room_id": "B-L01", - "room_name": "Electronics Lab", + "room_id": "A-L03", + "room_name": "Computer Lab 3", "batch_codes": [ "25031519" ] @@ -453,11 +409,11 @@ { "day": "Monday", "slot_indices": [ - 2, - 3 + 3, + 4 ], - "start": "12:00", - "end": "15:00", + "start": "13:30", + "end": "16:30", "duration_minutes": 180, "course_id": "EE201", "course_name": "Digital Logic Design", @@ -473,13 +429,13 @@ ] }, { - "day": "Wednesday", + "day": "Monday", "slot_indices": [ - 0, - 1 + 3, + 4 ], - "start": "09:00", - "end": "12:00", + "start": "13:30", + "end": "16:30", "duration_minutes": 180, "course_id": "EE101", "course_name": "Basic Electronics", @@ -488,20 +444,20 @@ "section_id": "B", "instructor_code": "1004", "instructor_name": "Dr. Farah Iqbal", - "room_id": "B-L01", - "room_name": "Electronics Lab", + "room_id": "A-L03", + "room_name": "Computer Lab 3", "batch_codes": [ "25031520" ] }, { - "day": "Wednesday", + "day": "Monday", "slot_indices": [ - 2, - 3 + 1, + 2 ], - "start": "12:00", - "end": "15:00", + "start": "10:30", + "end": "13:30", "duration_minutes": 180, "course_id": "EE201", "course_name": "Digital Logic Design", @@ -517,13 +473,13 @@ ] }, { - "day": "Thursday", + "day": "Wednesday", "slot_indices": [ - 0, - 1 + 1, + 2 ], - "start": "09:00", - "end": "12:00", + "start": "10:30", + "end": "13:30", "duration_minutes": 180, "course_id": "CS101", "course_name": "Programming Fundamentals", @@ -532,20 +488,20 @@ "section_id": "C", "instructor_code": "1001", "instructor_name": "Dr. Ahsan Raza", - "room_id": "A-L01", - "room_name": "Computer Lab 1", + "room_id": "A-L02", + "room_name": "Computer Lab 2", "batch_codes": [ "26021519" ] }, { - "day": "Thursday", + "day": "Wednesday", "slot_indices": [ - 2, - 3 + 3, + 4 ], - "start": "12:00", - "end": "15:00", + "start": "13:30", + "end": "16:30", "duration_minutes": 180, "course_id": "CS201", "course_name": "Data Structures", @@ -554,20 +510,20 @@ "section_id": "C", "instructor_code": "1002", "instructor_name": "Ms. Sana Tariq", - "room_id": "A-L01", - "room_name": "Computer Lab 1", + "room_id": "A-L02", + "room_name": "Computer Lab 2", "batch_codes": [ "26021519" ] }, { - "day": "Friday", + "day": "Thursday", "slot_indices": [ - 0, - 1 + 1, + 2 ], - "start": "09:00", - "end": "12:00", + "start": "10:30", + "end": "13:30", "duration_minutes": 180, "course_id": "CS301", "course_name": "Operating Systems", @@ -576,42 +532,64 @@ "section_id": "C", "instructor_code": "1003", "instructor_name": "Mr. Bilal Khan", - "room_id": "A-L01", - "room_name": "Computer Lab 1", + "room_id": "A-L03", + "room_name": "Computer Lab 3", "batch_codes": [ "26021519" ] }, { - "day": "Friday", + "day": "Thursday", "slot_indices": [ - 2, - 3 + 3, + 4 ], - "start": "12:00", - "end": "15:00", + "start": "13:30", + "end": "16:30", "duration_minutes": 180, "course_id": "CS302", "course_name": "Database Systems", "course_type": "lab", "is_general": false, "section_id": "C", - "instructor_code": "1001", - "instructor_name": "Dr. Ahsan Raza", - "room_id": "A-L02", - "room_name": "Computer Lab 2", + "instructor_code": "1009", + "instructor_name": "Ms. Ayesha Malik", + "room_id": "A-L01", + "room_name": "Computer Lab 1", "batch_codes": [ "26021519" ] }, { - "day": "Thursday", + "day": "Wednesday", "slot_indices": [ - 0, - 1 + 3, + 4 ], - "start": "09:00", - "end": "12:00", + "start": "13:30", + "end": "16:30", + "duration_minutes": 180, + "course_id": "CS101", + "course_name": "Programming Fundamentals", + "course_type": "lab", + "is_general": false, + "section_id": "D", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-L01", + "room_name": "Computer Lab 1", + "batch_codes": [ + "26021520" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 1, + 2 + ], + "start": "10:30", + "end": "13:30", "duration_minutes": 180, "course_id": "CS201", "course_name": "Data Structures", @@ -620,28 +598,6 @@ "section_id": "D", "instructor_code": "1002", "instructor_name": "Ms. Sana Tariq", - "room_id": "A-L02", - "room_name": "Computer Lab 2", - "batch_codes": [ - "26021520" - ] - }, - { - "day": "Thursday", - "slot_indices": [ - 2, - 3 - ], - "start": "12:00", - "end": "15:00", - "duration_minutes": 180, - "course_id": "CS301", - "course_name": "Operating Systems", - "course_type": "lab", - "is_general": false, - "section_id": "D", - "instructor_code": "1003", - "instructor_name": "Mr. Bilal Khan", "room_id": "B-L01", "room_name": "Electronics Lab", "batch_codes": [ @@ -651,11 +607,55 @@ { "day": "Thursday", "slot_indices": [ - 0, - 1 + 3, + 4 ], - "start": "09:00", - "end": "12:00", + "start": "13:30", + "end": "16:30", + "duration_minutes": 180, + "course_id": "CS301", + "course_name": "Operating Systems", + "course_type": "lab", + "is_general": false, + "section_id": "D", + "instructor_code": "1003", + "instructor_name": "Mr. Bilal Khan", + "room_id": "A-L03", + "room_name": "Computer Lab 3", + "batch_codes": [ + "26021520" + ] + }, + { + "day": "Thursday", + "slot_indices": [ + 1, + 2 + ], + "start": "10:30", + "end": "13:30", + "duration_minutes": 180, + "course_id": "CS302", + "course_name": "Database Systems", + "course_type": "lab", + "is_general": false, + "section_id": "D", + "instructor_code": "1012", + "instructor_name": "Ms. Rabia Nasir", + "room_id": "A-L01", + "room_name": "Computer Lab 1", + "batch_codes": [ + "26021520" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 3, + 4 + ], + "start": "13:30", + "end": "16:30", "duration_minutes": 180, "course_id": "EE101", "course_name": "Basic Electronics", @@ -664,20 +664,20 @@ "section_id": "C", "instructor_code": "1004", "instructor_name": "Dr. Farah Iqbal", - "room_id": "B-L01", - "room_name": "Electronics Lab", + "room_id": "A-L03", + "room_name": "Computer Lab 3", "batch_codes": [ "26031519" ] }, { - "day": "Friday", + "day": "Thursday", "slot_indices": [ - 0, - 1 + 1, + 2 ], - "start": "09:00", - "end": "12:00", + "start": "10:30", + "end": "13:30", "duration_minutes": 180, "course_id": "EE201", "course_name": "Digital Logic Design", @@ -693,13 +693,13 @@ ] }, { - "day": "Friday", + "day": "Thursday", "slot_indices": [ - 2, - 3 + 1, + 2 ], - "start": "12:00", - "end": "15:00", + "start": "10:30", + "end": "13:30", "duration_minutes": 180, "course_id": "EE101", "course_name": "Basic Electronics", @@ -708,8 +708,30 @@ "section_id": "D", "instructor_code": "1004", "instructor_name": "Dr. Farah Iqbal", - "room_id": "A-L01", - "room_name": "Computer Lab 1", + "room_id": "A-L02", + "room_name": "Computer Lab 2", + "batch_codes": [ + "26031520" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 3, + 4 + ], + "start": "13:30", + "end": "16:30", + "duration_minutes": 180, + "course_id": "EE201", + "course_name": "Digital Logic Design", + "course_type": "lab", + "is_general": false, + "section_id": "D", + "instructor_code": "1005", + "instructor_name": "Mr. Usman Ali", + "room_id": "B-L01", + "room_name": "Electronics Lab", "batch_codes": [ "26031520" ] @@ -717,10 +739,31 @@ { "day": "Monday", "slot_indices": [ - 4 + 0 ], - "start": "15:00", - "end": "16:30", + "start": "08:30", + "end": "10:30", + "duration_minutes": 120, + "course_id": "CS301", + "course_name": "Operating Systems", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1003", + "instructor_name": "Mr. Bilal Khan", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "25021519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 0 + ], + "start": "09:00", + "end": "10:30", "duration_minutes": 90, "course_id": "CS101", "course_name": "Programming Fundamentals", @@ -736,34 +779,55 @@ ] }, { - "day": "Tuesday", + "day": "Thursday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "CS101", + "course_name": "Programming Fundamentals", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "25021519" + ] + }, + { + "day": "Thursday", + "slot_indices": [ + 2 + ], + "start": "12:00", + "end": "13:30", + "duration_minutes": 90, + "course_id": "CS201", + "course_name": "Data Structures", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "25021519" + ] + }, + { + "day": "Thursday", "slot_indices": [ 3 ], "start": "13:30", "end": "15:00", "duration_minutes": 90, - "course_id": "CS101", - "course_name": "Programming Fundamentals", - "course_type": "theory", - "is_general": false, - "section_id": "A", - "instructor_code": "1001", - "instructor_name": "Dr. Ahsan Raza", - "room_id": "A-101", - "room_name": "Room 101", - "batch_codes": [ - "25021519" - ] - }, - { - "day": "Tuesday", - "slot_indices": [ - 4 - ], - "start": "15:00", - "end": "16:30", - "duration_minutes": 90, "course_id": "CS201", "course_name": "Data Structures", "course_type": "theory", @@ -780,87 +844,24 @@ { "day": "Wednesday", "slot_indices": [ - 4 + 3 ], - "start": "15:00", - "end": "16:30", - "duration_minutes": 90, - "course_id": "CS201", - "course_name": "Data Structures", - "course_type": "theory", - "is_general": false, - "section_id": "A", - "instructor_code": "1002", - "instructor_name": "Ms. Sana Tariq", - "room_id": "A-102", - "room_name": "Room 102", - "batch_codes": [ - "25021519" - ] - }, - { - "day": "Thursday", - "slot_indices": [ - 4 - ], - "start": "15:00", - "end": "16:30", + "start": "13:30", + "end": "15:00", "duration_minutes": 90, "course_id": "CS302", "course_name": "Database Systems", "course_type": "theory", "is_general": false, "section_id": "A", - "instructor_code": "1001", - "instructor_name": "Dr. Ahsan Raza", + "instructor_code": "1009", + "instructor_name": "Ms. Ayesha Malik", "room_id": "A-102", "room_name": "Room 102", "batch_codes": [ "25021519" ] }, - { - "day": "Friday", - "slot_indices": [ - 4 - ], - "start": "15:00", - "end": "16:30", - "duration_minutes": 90, - "course_id": "CS302", - "course_name": "Database Systems", - "course_type": "theory", - "is_general": false, - "section_id": "A", - "instructor_code": "1001", - "instructor_name": "Dr. Ahsan Raza", - "room_id": "A-102", - "room_name": "Room 102", - "batch_codes": [ - "25021519" - ] - }, - { - "day": "Tuesday", - "slot_indices": [ - 4 - ], - "start": "15:00", - "end": "16:30", - "duration_minutes": 90, - "course_id": "CS101", - "course_name": "Programming Fundamentals", - "course_type": "theory", - "is_general": false, - "section_id": "B", - "instructor_code": "1001", - "instructor_name": "Dr. Ahsan Raza", - "room_id": "A-101", - "room_name": "Room 101", - "batch_codes": [ - "25021520" - ] - }, { "day": "Wednesday", "slot_indices": [ @@ -869,15 +870,36 @@ "start": "15:00", "end": "16:30", "duration_minutes": 90, - "course_id": "CS101", - "course_name": "Programming Fundamentals", + "course_id": "CS302", + "course_name": "Database Systems", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1009", + "instructor_name": "Ms. Ayesha Malik", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "25021519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 0 + ], + "start": "08:30", + "end": "10:30", + "duration_minutes": 120, + "course_id": "CS301", + "course_name": "Operating Systems", "course_type": "theory", "is_general": false, "section_id": "B", - "instructor_code": "1001", - "instructor_name": "Dr. Ahsan Raza", - "room_id": "A-101", - "room_name": "Room 101", + "instructor_code": "1003", + "instructor_name": "Mr. Bilal Khan", + "room_id": "A-102", + "room_name": "Room 102", "batch_codes": [ "25021520" ] @@ -885,10 +907,52 @@ { "day": "Monday", "slot_indices": [ - 4 + 0 ], - "start": "15:00", - "end": "16:30", + "start": "09:00", + "end": "10:30", + "duration_minutes": 90, + "course_id": "CS101", + "course_name": "Programming Fundamentals", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "25021520" + ] + }, + { + "day": "Thursday", + "slot_indices": [ + 2 + ], + "start": "12:00", + "end": "13:30", + "duration_minutes": 90, + "course_id": "CS101", + "course_name": "Programming Fundamentals", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "25021520" + ] + }, + { + "day": "Thursday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", "duration_minutes": 90, "course_id": "CS201", "course_name": "Data Structures", @@ -918,6 +982,48 @@ "section_id": "B", "instructor_code": "1002", "instructor_name": "Ms. Sana Tariq", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "25021520" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 3 + ], + "start": "13:30", + "end": "15:00", + "duration_minutes": 90, + "course_id": "CS302", + "course_name": "Database Systems", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1012", + "instructor_name": "Ms. Rabia Nasir", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "25021520" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "CS302", + "course_name": "Database Systems", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1012", + "instructor_name": "Ms. Rabia Nasir", "room_id": "A-101", "room_name": "Room 101", "batch_codes": [ @@ -927,20 +1033,20 @@ { "day": "Monday", "slot_indices": [ - 4 + 0 ], - "start": "15:00", - "end": "16:30", - "duration_minutes": 90, - "course_id": "EE101", - "course_name": "Basic Electronics", + "start": "08:30", + "end": "10:30", + "duration_minutes": 120, + "course_id": "EE301", + "course_name": "Signals and Systems", "course_type": "theory", "is_general": false, "section_id": "A", - "instructor_code": "1004", - "instructor_name": "Dr. Farah Iqbal", - "room_id": "A-201", - "room_name": "Room 201", + "instructor_code": "1010", + "instructor_name": "Mr. Imran Qureshi", + "room_id": "B-102", + "room_name": "Room 102 (B)", "batch_codes": [ "25031519" ] @@ -974,15 +1080,15 @@ "start": "15:00", "end": "16:30", "duration_minutes": 90, - "course_id": "EE201", - "course_name": "Digital Logic Design", + "course_id": "EE101", + "course_name": "Basic Electronics", "course_type": "theory", "is_general": false, "section_id": "A", - "instructor_code": "1005", - "instructor_name": "Mr. Usman Ali", - "room_id": "B-101", - "room_name": "Room 101 (B)", + "instructor_code": "1004", + "instructor_name": "Dr. Farah Iqbal", + "room_id": "A-201", + "room_name": "Room 201", "batch_codes": [ "25031519" ] @@ -1008,6 +1114,741 @@ "25031519" ] }, + { + "day": "Wednesday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "EE201", + "course_name": "Digital Logic Design", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1005", + "instructor_name": "Mr. Usman Ali", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "25031519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 0 + ], + "start": "08:30", + "end": "10:30", + "duration_minutes": 120, + "course_id": "EE301", + "course_name": "Signals and Systems", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1010", + "instructor_name": "Mr. Imran Qureshi", + "room_id": "B-102", + "room_name": "Room 102 (B)", + "batch_codes": [ + "25031520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 0 + ], + "start": "09:00", + "end": "10:30", + "duration_minutes": 90, + "course_id": "EE101", + "course_name": "Basic Electronics", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1004", + "instructor_name": "Dr. Farah Iqbal", + "room_id": "A-201", + "room_name": "Room 201", + "batch_codes": [ + "25031520" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "EE101", + "course_name": "Basic Electronics", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1004", + "instructor_name": "Dr. Farah Iqbal", + "room_id": "A-201", + "room_name": "Room 201", + "batch_codes": [ + "25031520" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 3 + ], + "start": "13:30", + "end": "15:00", + "duration_minutes": 90, + "course_id": "EE201", + "course_name": "Digital Logic Design", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1005", + "instructor_name": "Mr. Usman Ali", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "25031520" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "EE201", + "course_name": "Digital Logic Design", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1005", + "instructor_name": "Mr. Usman Ali", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "25031520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 0 + ], + "start": "08:30", + "end": "10:30", + "duration_minutes": 120, + "course_id": "BBA301", + "course_name": "Marketing Management", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1011", + "instructor_name": "Dr. Saima Aziz", + "room_id": "A-103", + "room_name": "Room 103", + "batch_codes": [ + "25041519" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "BBA101", + "course_name": "Principles of Management", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1007", + "instructor_name": "Dr. Nadia Farooq", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "25041519" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 2 + ], + "start": "12:00", + "end": "13:30", + "duration_minutes": 90, + "course_id": "BBA101", + "course_name": "Principles of Management", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1007", + "instructor_name": "Dr. Nadia Farooq", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "25041519" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 3 + ], + "start": "13:30", + "end": "15:00", + "duration_minutes": 90, + "course_id": "BBA201", + "course_name": "Financial Accounting", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1008", + "instructor_name": "Mr. Kamran Sheikh", + "room_id": "B-102", + "room_name": "Room 102 (B)", + "batch_codes": [ + "25041519" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "BBA201", + "course_name": "Financial Accounting", + "course_type": "theory", + "is_general": false, + "section_id": "A", + "instructor_code": "1008", + "instructor_name": "Mr. Kamran Sheikh", + "room_id": "B-102", + "room_name": "Room 102 (B)", + "batch_codes": [ + "25041519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 0 + ], + "start": "08:30", + "end": "10:30", + "duration_minutes": 120, + "course_id": "BBA301", + "course_name": "Marketing Management", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1011", + "instructor_name": "Dr. Saima Aziz", + "room_id": "A-103", + "room_name": "Room 103", + "batch_codes": [ + "25041520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 0 + ], + "start": "09:00", + "end": "10:30", + "duration_minutes": 90, + "course_id": "BBA101", + "course_name": "Principles of Management", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1007", + "instructor_name": "Dr. Nadia Farooq", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "25041520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 3 + ], + "start": "13:30", + "end": "15:00", + "duration_minutes": 90, + "course_id": "BBA101", + "course_name": "Principles of Management", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1007", + "instructor_name": "Dr. Nadia Farooq", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "25041520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "BBA201", + "course_name": "Financial Accounting", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1008", + "instructor_name": "Mr. Kamran Sheikh", + "room_id": "B-102", + "room_name": "Room 102 (B)", + "batch_codes": [ + "25041520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 2 + ], + "start": "12:00", + "end": "13:30", + "duration_minutes": 90, + "course_id": "BBA201", + "course_name": "Financial Accounting", + "course_type": "theory", + "is_general": false, + "section_id": "B", + "instructor_code": "1008", + "instructor_name": "Mr. Kamran Sheikh", + "room_id": "B-102", + "room_name": "Room 102 (B)", + "batch_codes": [ + "25041520" + ] + }, + { + "day": "Thursday", + "slot_indices": [ + 0 + ], + "start": "08:30", + "end": "10:30", + "duration_minutes": 120, + "course_id": "CS301", + "course_name": "Operating Systems", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1003", + "instructor_name": "Mr. Bilal Khan", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "26021519" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "CS101", + "course_name": "Programming Fundamentals", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "26021519" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "CS101", + "course_name": "Programming Fundamentals", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "26021519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 0 + ], + "start": "09:00", + "end": "10:30", + "duration_minutes": 90, + "course_id": "CS201", + "course_name": "Data Structures", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-201", + "room_name": "Room 201", + "batch_codes": [ + "26021519" + ] + }, + { + "day": "Friday", + "slot_indices": [ + 0 + ], + "start": "09:00", + "end": "10:30", + "duration_minutes": 90, + "course_id": "CS201", + "course_name": "Data Structures", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "26021519" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "CS302", + "course_name": "Database Systems", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1009", + "instructor_name": "Ms. Ayesha Malik", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "26021519" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 2 + ], + "start": "12:00", + "end": "13:30", + "duration_minutes": 90, + "course_id": "CS302", + "course_name": "Database Systems", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1009", + "instructor_name": "Ms. Ayesha Malik", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "26021519" + ] + }, + { + "day": "Friday", + "slot_indices": [ + 0 + ], + "start": "08:30", + "end": "10:30", + "duration_minutes": 120, + "course_id": "CS301", + "course_name": "Operating Systems", + "course_type": "theory", + "is_general": false, + "section_id": "D", + "instructor_code": "1003", + "instructor_name": "Mr. Bilal Khan", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "26021520" + ] + }, + { + "day": "Thursday", + "slot_indices": [ + 0 + ], + "start": "09:00", + "end": "10:30", + "duration_minutes": 90, + "course_id": "CS101", + "course_name": "Programming Fundamentals", + "course_type": "theory", + "is_general": false, + "section_id": "D", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "26021520" + ] + }, + { + "day": "Friday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "CS101", + "course_name": "Programming Fundamentals", + "course_type": "theory", + "is_general": false, + "section_id": "D", + "instructor_code": "1001", + "instructor_name": "Dr. Ahsan Raza", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "26021520" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "CS201", + "course_name": "Data Structures", + "course_type": "theory", + "is_general": false, + "section_id": "D", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "26021520" + ] + }, + { + "day": "Friday", + "slot_indices": [ + 2 + ], + "start": "12:00", + "end": "13:30", + "duration_minutes": 90, + "course_id": "CS201", + "course_name": "Data Structures", + "course_type": "theory", + "is_general": false, + "section_id": "D", + "instructor_code": "1002", + "instructor_name": "Ms. Sana Tariq", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "26021520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "CS302", + "course_name": "Database Systems", + "course_type": "theory", + "is_general": false, + "section_id": "D", + "instructor_code": "1012", + "instructor_name": "Ms. Rabia Nasir", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "26021520" + ] + }, + { + "day": "Monday", + "slot_indices": [ + 2 + ], + "start": "12:00", + "end": "13:30", + "duration_minutes": 90, + "course_id": "CS302", + "course_name": "Database Systems", + "course_type": "theory", + "is_general": false, + "section_id": "D", + "instructor_code": "1012", + "instructor_name": "Ms. Rabia Nasir", + "room_id": "A-101", + "room_name": "Room 101", + "batch_codes": [ + "26021520" + ] + }, + { + "day": "Thursday", + "slot_indices": [ + 0 + ], + "start": "08:30", + "end": "10:30", + "duration_minutes": 120, + "course_id": "EE301", + "course_name": "Signals and Systems", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1010", + "instructor_name": "Mr. Imran Qureshi", + "room_id": "B-102", + "room_name": "Room 102 (B)", + "batch_codes": [ + "26031519" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "EE101", + "course_name": "Basic Electronics", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1004", + "instructor_name": "Dr. Farah Iqbal", + "room_id": "A-201", + "room_name": "Room 201", + "batch_codes": [ + "26031519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 0 + ], + "start": "09:00", + "end": "10:30", + "duration_minutes": 90, + "course_id": "EE101", + "course_name": "Basic Electronics", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1004", + "instructor_name": "Dr. Farah Iqbal", + "room_id": "A-202", + "room_name": "Room 202", + "batch_codes": [ + "26031519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 2 + ], + "start": "12:00", + "end": "13:30", + "duration_minutes": 90, + "course_id": "EE201", + "course_name": "Digital Logic Design", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1005", + "instructor_name": "Mr. Usman Ali", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "26031519" + ] + }, + { + "day": "Thursday", + "slot_indices": [ + 3 + ], + "start": "13:30", + "end": "15:00", + "duration_minutes": 90, + "course_id": "EE201", + "course_name": "Digital Logic Design", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1005", + "instructor_name": "Mr. Usman Ali", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "26031519" + ] + }, { "day": "Friday", "slot_indices": [ @@ -1020,496 +1861,13 @@ "course_name": "Signals and Systems", "course_type": "theory", "is_general": false, - "section_id": "A", - "instructor_code": "1004", - "instructor_name": "Dr. Farah Iqbal", - "room_id": "B-102", - "room_name": "Room 102 (B)", - "batch_codes": [ - "25031519" - ] - }, - { - "day": "Monday", - "slot_indices": [ - 2 - ], - "start": "12:00", - "end": "13:30", - "duration_minutes": 90, - "course_id": "EE101", - "course_name": "Basic Electronics", - "course_type": "theory", - "is_general": false, - "section_id": "B", - "instructor_code": "1004", - "instructor_name": "Dr. Farah Iqbal", - "room_id": "A-201", - "room_name": "Room 201", - "batch_codes": [ - "25031520" - ] - }, - { - "day": "Monday", - "slot_indices": [ - 3 - ], - "start": "13:30", - "end": "15:00", - "duration_minutes": 90, - "course_id": "EE101", - "course_name": "Basic Electronics", - "course_type": "theory", - "is_general": false, - "section_id": "B", - "instructor_code": "1004", - "instructor_name": "Dr. Farah Iqbal", - "room_id": "A-201", - "room_name": "Room 201", - "batch_codes": [ - "25031520" - ] - }, - { - "day": "Monday", - "slot_indices": [ - 0 - ], - "start": "09:00", - "end": "10:30", - "duration_minutes": 90, - "course_id": "EE201", - "course_name": "Digital Logic Design", - "course_type": "theory", - "is_general": false, - "section_id": "B", - "instructor_code": "1005", - "instructor_name": "Mr. Usman Ali", - "room_id": "A-101", - "room_name": "Room 101", - "batch_codes": [ - "25031520" - ] - }, - { - "day": "Monday", - "slot_indices": [ - 1 - ], - "start": "10:30", - "end": "12:00", - "duration_minutes": 90, - "course_id": "EE201", - "course_name": "Digital Logic Design", - "course_type": "theory", - "is_general": false, - "section_id": "B", - "instructor_code": "1005", - "instructor_name": "Mr. Usman Ali", - "room_id": "B-101", - "room_name": "Room 101 (B)", - "batch_codes": [ - "25031520" - ] - }, - { - "day": "Monday", - "slot_indices": [ - 0 - ], - "start": "09:00", - "end": "10:30", - "duration_minutes": 90, - "course_id": "BBA101", - "course_name": "Principles of Management", - "course_type": "theory", - "is_general": false, - "section_id": "A", - "instructor_code": "1007", - "instructor_name": "Dr. Nadia Farooq", - "room_id": "A-102", - "room_name": "Room 102", - "batch_codes": [ - "25041519" - ] - }, - { - "day": "Monday", - "slot_indices": [ - 1 - ], - "start": "10:30", - "end": "12:00", - "duration_minutes": 90, - "course_id": "BBA101", - "course_name": "Principles of Management", - "course_type": "theory", - "is_general": false, - "section_id": "A", - "instructor_code": "1007", - "instructor_name": "Dr. Nadia Farooq", - "room_id": "A-101", - "room_name": "Room 101", - "batch_codes": [ - "25041519" - ] - }, - { - "day": "Monday", - "slot_indices": [ - 2 - ], - "start": "12:00", - "end": "13:30", - "duration_minutes": 90, - "course_id": "BBA201", - "course_name": "Financial Accounting", - "course_type": "theory", - "is_general": false, - "section_id": "A", - "instructor_code": "1008", - "instructor_name": "Mr. Kamran Sheikh", - "room_id": "B-102", - "room_name": "Room 102 (B)", - "batch_codes": [ - "25041519" - ] - }, - { - "day": "Monday", - "slot_indices": [ - 3 - ], - "start": "13:30", - "end": "15:00", - "duration_minutes": 90, - "course_id": "BBA201", - "course_name": "Financial Accounting", - "course_type": "theory", - "is_general": false, - "section_id": "A", - "instructor_code": "1008", - "instructor_name": "Mr. Kamran Sheikh", - "room_id": "B-102", - "room_name": "Room 102 (B)", - "batch_codes": [ - "25041519" - ] - }, - { - "day": "Wednesday", - "slot_indices": [ - 0 - ], - "start": "08:30", - "end": "10:30", - "duration_minutes": 120, - "course_id": "BBA301", - "course_name": "Marketing Management", - "course_type": "theory", - "is_general": false, - "section_id": "A", - "instructor_code": "1007", - "instructor_name": "Dr. Nadia Farooq", - "room_id": "A-103", - "room_name": "Room 103", - "batch_codes": [ - "25041519" - ] - }, - { - "day": "Monday", - "slot_indices": [ - 2 - ], - "start": "12:00", - "end": "13:30", - "duration_minutes": 90, - "course_id": "BBA101", - "course_name": "Principles of Management", - "course_type": "theory", - "is_general": false, - "section_id": "B", - "instructor_code": "1007", - "instructor_name": "Dr. Nadia Farooq", - "room_id": "B-101", - "room_name": "Room 101 (B)", - "batch_codes": [ - "25041520" - ] - }, - { - "day": "Monday", - "slot_indices": [ - 3 - ], - "start": "13:30", - "end": "15:00", - "duration_minutes": 90, - "course_id": "BBA101", - "course_name": "Principles of Management", - "course_type": "theory", - "is_general": false, - "section_id": "B", - "instructor_code": "1007", - "instructor_name": "Dr. Nadia Farooq", - "room_id": "B-101", - "room_name": "Room 101 (B)", - "batch_codes": [ - "25041520" - ] - }, - { - "day": "Monday", - "slot_indices": [ - 0 - ], - "start": "09:00", - "end": "10:30", - "duration_minutes": 90, - "course_id": "BBA201", - "course_name": "Financial Accounting", - "course_type": "theory", - "is_general": false, - "section_id": "B", - "instructor_code": "1008", - "instructor_name": "Mr. Kamran Sheikh", - "room_id": "B-102", - "room_name": "Room 102 (B)", - "batch_codes": [ - "25041520" - ] - }, - { - "day": "Monday", - "slot_indices": [ - 1 - ], - "start": "10:30", - "end": "12:00", - "duration_minutes": 90, - "course_id": "BBA201", - "course_name": "Financial Accounting", - "course_type": "theory", - "is_general": false, - "section_id": "B", - "instructor_code": "1008", - "instructor_name": "Mr. Kamran Sheikh", - "room_id": "B-102", - "room_name": "Room 102 (B)", - "batch_codes": [ - "25041520" - ] - }, - { - "day": "Friday", - "slot_indices": [ - 0 - ], - "start": "08:30", - "end": "10:30", - "duration_minutes": 120, - "course_id": "BBA301", - "course_name": "Marketing Management", - "course_type": "theory", - "is_general": false, - "section_id": "B", - "instructor_code": "1007", - "instructor_name": "Dr. Nadia Farooq", - "room_id": "A-103", - "room_name": "Room 103", - "batch_codes": [ - "25041520" - ] - }, - { - "day": "Tuesday", - "slot_indices": [ - 1 - ], - "start": "10:30", - "end": "12:00", - "duration_minutes": 90, - "course_id": "CS101", - "course_name": "Programming Fundamentals", - "course_type": "theory", - "is_general": false, - "section_id": "C", - "instructor_code": "1001", - "instructor_name": "Dr. Ahsan Raza", - "room_id": "A-101", - "room_name": "Room 101", - "batch_codes": [ - "26021519" - ] - }, - { - "day": "Wednesday", - "slot_indices": [ - 0 - ], - "start": "09:00", - "end": "10:30", - "duration_minutes": 90, - "course_id": "CS201", - "course_name": "Data Structures", - "course_type": "theory", - "is_general": false, - "section_id": "C", - "instructor_code": "1002", - "instructor_name": "Ms. Sana Tariq", - "room_id": "A-102", - "room_name": "Room 102", - "batch_codes": [ - "26021519" - ] - }, - { - "day": "Wednesday", - "slot_indices": [ - 1 - ], - "start": "10:30", - "end": "12:00", - "duration_minutes": 90, - "course_id": "CS201", - "course_name": "Data Structures", - "course_type": "theory", - "is_general": false, - "section_id": "C", - "instructor_code": "1002", - "instructor_name": "Ms. Sana Tariq", - "room_id": "A-102", - "room_name": "Room 102", - "batch_codes": [ - "26021519" - ] - }, - { - "day": "Wednesday", - "slot_indices": [ - 2 - ], - "start": "12:00", - "end": "13:30", - "duration_minutes": 90, - "course_id": "CS201", - "course_name": "Data Structures", - "course_type": "theory", - "is_general": false, "section_id": "D", - "instructor_code": "1002", - "instructor_name": "Ms. Sana Tariq", - "room_id": "A-102", - "room_name": "Room 102", + "instructor_code": "1010", + "instructor_name": "Mr. Imran Qureshi", + "room_id": "B-102", + "room_name": "Room 102 (B)", "batch_codes": [ - "26021520" - ] - }, - { - "day": "Wednesday", - "slot_indices": [ - 3 - ], - "start": "13:30", - "end": "15:00", - "duration_minutes": 90, - "course_id": "CS201", - "course_name": "Data Structures", - "course_type": "theory", - "is_general": false, - "section_id": "D", - "instructor_code": "1002", - "instructor_name": "Ms. Sana Tariq", - "room_id": "A-102", - "room_name": "Room 102", - "batch_codes": [ - "26021520" - ] - }, - { - "day": "Tuesday", - "slot_indices": [ - 1 - ], - "start": "10:30", - "end": "12:00", - "duration_minutes": 90, - "course_id": "EE101", - "course_name": "Basic Electronics", - "course_type": "theory", - "is_general": false, - "section_id": "C", - "instructor_code": "1004", - "instructor_name": "Dr. Farah Iqbal", - "room_id": "A-201", - "room_name": "Room 201", - "batch_codes": [ - "26031519" - ] - }, - { - "day": "Tuesday", - "slot_indices": [ - 4 - ], - "start": "15:00", - "end": "16:30", - "duration_minutes": 90, - "course_id": "EE101", - "course_name": "Basic Electronics", - "course_type": "theory", - "is_general": false, - "section_id": "C", - "instructor_code": "1004", - "instructor_name": "Dr. Farah Iqbal", - "room_id": "A-201", - "room_name": "Room 201", - "batch_codes": [ - "26031519" - ] - }, - { - "day": "Monday", - "slot_indices": [ - 4 - ], - "start": "15:00", - "end": "16:30", - "duration_minutes": 90, - "course_id": "EE201", - "course_name": "Digital Logic Design", - "course_type": "theory", - "is_general": false, - "section_id": "C", - "instructor_code": "1005", - "instructor_name": "Mr. Usman Ali", - "room_id": "B-101", - "room_name": "Room 101 (B)", - "batch_codes": [ - "26031519" - ] - }, - { - "day": "Wednesday", - "slot_indices": [ - 1 - ], - "start": "10:30", - "end": "12:00", - "duration_minutes": 90, - "course_id": "EE201", - "course_name": "Digital Logic Design", - "course_type": "theory", - "is_general": false, - "section_id": "C", - "instructor_code": "1005", - "instructor_name": "Mr. Usman Ali", - "room_id": "B-101", - "room_name": "Room 101 (B)", - "batch_codes": [ - "26031519" + "26031520" ] }, { @@ -1534,12 +1892,12 @@ ] }, { - "day": "Wednesday", + "day": "Thursday", "slot_indices": [ - 3 + 0 ], - "start": "13:30", - "end": "15:00", + "start": "09:00", + "end": "10:30", "duration_minutes": 90, "course_id": "EE101", "course_name": "Basic Electronics", @@ -1576,7 +1934,7 @@ ] }, { - "day": "Wednesday", + "day": "Thursday", "slot_indices": [ 4 ], @@ -1596,90 +1954,6 @@ "26031520" ] }, - { - "day": "Monday", - "slot_indices": [ - 4 - ], - "start": "15:00", - "end": "16:30", - "duration_minutes": 90, - "course_id": "BBA101", - "course_name": "Principles of Management", - "course_type": "theory", - "is_general": false, - "section_id": "C", - "instructor_code": "1007", - "instructor_name": "Dr. Nadia Farooq", - "room_id": "A-103", - "room_name": "Room 103", - "batch_codes": [ - "26041519" - ] - }, - { - "day": "Tuesday", - "slot_indices": [ - 1 - ], - "start": "10:30", - "end": "12:00", - "duration_minutes": 90, - "course_id": "BBA101", - "course_name": "Principles of Management", - "course_type": "theory", - "is_general": false, - "section_id": "C", - "instructor_code": "1007", - "instructor_name": "Dr. Nadia Farooq", - "room_id": "A-102", - "room_name": "Room 102", - "batch_codes": [ - "26041519" - ] - }, - { - "day": "Tuesday", - "slot_indices": [ - 4 - ], - "start": "15:00", - "end": "16:30", - "duration_minutes": 90, - "course_id": "BBA201", - "course_name": "Financial Accounting", - "course_type": "theory", - "is_general": false, - "section_id": "C", - "instructor_code": "1008", - "instructor_name": "Mr. Kamran Sheikh", - "room_id": "B-102", - "room_name": "Room 102 (B)", - "batch_codes": [ - "26041519" - ] - }, - { - "day": "Wednesday", - "slot_indices": [ - 0 - ], - "start": "09:00", - "end": "10:30", - "duration_minutes": 90, - "course_id": "BBA201", - "course_name": "Financial Accounting", - "course_type": "theory", - "is_general": false, - "section_id": "C", - "instructor_code": "1008", - "instructor_name": "Mr. Kamran Sheikh", - "room_id": "B-102", - "room_name": "Room 102 (B)", - "batch_codes": [ - "26041519" - ] - }, { "day": "Thursday", "slot_indices": [ @@ -1693,14 +1967,119 @@ "course_type": "theory", "is_general": false, "section_id": "C", - "instructor_code": "1007", - "instructor_name": "Dr. Nadia Farooq", + "instructor_code": "1011", + "instructor_name": "Dr. Saima Aziz", "room_id": "A-103", "room_name": "Room 103", "batch_codes": [ "26041519" ] }, + { + "day": "Monday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "BBA101", + "course_name": "Principles of Management", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1007", + "instructor_name": "Dr. Nadia Farooq", + "room_id": "B-101", + "room_name": "Room 101 (B)", + "batch_codes": [ + "26041519" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "BBA101", + "course_name": "Principles of Management", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1007", + "instructor_name": "Dr. Nadia Farooq", + "room_id": "A-102", + "room_name": "Room 102", + "batch_codes": [ + "26041519" + ] + }, + { + "day": "Tuesday", + "slot_indices": [ + 4 + ], + "start": "15:00", + "end": "16:30", + "duration_minutes": 90, + "course_id": "BBA201", + "course_name": "Financial Accounting", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1008", + "instructor_name": "Mr. Kamran Sheikh", + "room_id": "B-102", + "room_name": "Room 102 (B)", + "batch_codes": [ + "26041519" + ] + }, + { + "day": "Wednesday", + "slot_indices": [ + 1 + ], + "start": "10:30", + "end": "12:00", + "duration_minutes": 90, + "course_id": "BBA201", + "course_name": "Financial Accounting", + "course_type": "theory", + "is_general": false, + "section_id": "C", + "instructor_code": "1008", + "instructor_name": "Mr. Kamran Sheikh", + "room_id": "B-102", + "room_name": "Room 102 (B)", + "batch_codes": [ + "26041519" + ] + }, + { + "day": "Friday", + "slot_indices": [ + 0 + ], + "start": "08:30", + "end": "10:30", + "duration_minutes": 120, + "course_id": "BBA301", + "course_name": "Marketing Management", + "course_type": "theory", + "is_general": false, + "section_id": "D", + "instructor_code": "1011", + "instructor_name": "Dr. Saima Aziz", + "room_id": "A-103", + "room_name": "Room 103", + "batch_codes": [ + "26041520" + ] + }, { "day": "Tuesday", "slot_indices": [ @@ -1744,12 +2123,12 @@ ] }, { - "day": "Monday", + "day": "Tuesday", "slot_indices": [ - 4 + 1 ], - "start": "15:00", - "end": "16:30", + "start": "10:30", + "end": "12:00", "duration_minutes": 90, "course_id": "BBA201", "course_name": "Financial Accounting", @@ -1765,12 +2144,12 @@ ] }, { - "day": "Tuesday", + "day": "Wednesday", "slot_indices": [ - 1 + 2 ], - "start": "10:30", - "end": "12:00", + "start": "12:00", + "end": "13:30", "duration_minutes": 90, "course_id": "BBA201", "course_name": "Financial Accounting", @@ -1804,142 +2183,157 @@ "A-103" ], "Thursday|0": [ + "A-101", + "A-102", "A-103", - "A-L01", - "A-L02", - "B-101", - "B-L01" + "A-201", + "A-202", + "B-102" ], "Tuesday|3": [ - "A-101", "A-103", - "A-201" + "A-201", + "A-L01", + "A-L03", + "B-101" ], "Monday|0": [ "A-101", "A-102", - "A-L01", - "A-L02", + "A-103", + "A-201", + "A-202", "B-101", - "B-102", - "B-L01" + "B-102" ], "Monday|1": [ "A-101", + "A-102", "A-L01", "A-L02", + "A-L03", "B-101", "B-102", "B-L01" ], "Monday|2": [ - "A-201", + "A-101", + "A-102", "A-L01", "A-L02", + "A-L03", "B-101", "B-102", "B-L01" ], "Monday|3": [ - "A-201", "A-L01", "A-L02", + "A-L03", "B-101", "B-102", "B-L01" ], - "Wednesday|0": [ - "A-102", - "A-103", - "A-L01", - "A-L02", - "B-101", - "B-102", - "B-L01" - ], - "Wednesday|1": [ - "A-101", - "A-102", - "A-L01", - "A-L02", - "B-101", - "B-L01" - ], - "Wednesday|2": [ - "A-102", - "A-201", - "A-L01", - "A-L02", - "B-L01" - ], - "Wednesday|3": [ - "A-102", - "A-201", - "A-L01", - "A-L02", - "B-L01" - ], - "Thursday|2": [ - "A-L01", - "A-L02", - "B-L01" - ], - "Thursday|3": [ - "A-L01", - "A-L02", - "B-L01" - ], - "Friday|0": [ - "A-103", - "A-L01", - "A-L02", - "B-102", - "B-L01" - ], - "Friday|1": [ - "A-L01", - "A-L02", - "B-L01" - ], - "Thursday|1": [ - "A-L01", - "A-L02", - "B-L01" - ], - "Friday|2": [ - "A-L01", - "A-L02" - ], - "Friday|3": [ - "A-L01", - "A-L02" - ], "Monday|4": [ - "A-101", - "A-102", - "A-103", - "A-201", + "A-L01", + "A-L02", + "A-L03", "B-101", - "B-102" + "B-102", + "B-L01" ], "Tuesday|4": [ "A-101", "A-102", "A-103", "A-201", + "A-L01", + "A-L03", "B-101", "B-102" ], + "Wednesday|1": [ + "A-101", + "A-201", + "A-L01", + "A-L02", + "A-L03", + "B-101", + "B-102", + "B-L01" + ], + "Wednesday|2": [ + "A-201", + "A-L01", + "A-L02", + "A-L03", + "B-101", + "B-102", + "B-L01" + ], + "Wednesday|3": [ + "A-101", + "A-102", + "A-L01", + "A-L02", + "A-L03", + "B-L01" + ], "Wednesday|4": [ "A-101", "A-102", + "A-L01", + "A-L02", + "A-L03", + "B-L01" + ], + "Thursday|1": [ + "A-101", + "A-102", + "A-L01", + "A-L02", + "A-L03", + "B-L01" + ], + "Thursday|2": [ + "A-101", + "A-102", + "A-L01", + "A-L02", + "A-L03", + "B-L01" + ], + "Thursday|3": [ + "A-102", + "A-L01", + "A-L03", "B-101" ], "Thursday|4": [ - "A-101", - "A-102" + "A-102", + "A-L01", + "A-L03", + "B-101" ], - "Friday|4": [ + "Wednesday|0": [ + "A-101", + "A-102", + "A-103", + "A-201", + "A-202", + "B-101", + "B-102" + ], + "Friday|0": [ + "A-101", + "A-102", + "A-103", + "B-102" + ], + "Friday|1": [ + "A-101" + ], + "Friday|2": [ "A-102" ] }, @@ -1962,24 +2356,27 @@ ], "Thursday|0": [ "1001", - "1002", + "1003", "1004", "1006", - "1007" + "1010", + "1011" ], "Tuesday|3": [ - "1001", "1002", - "1004" + "1003", + "1004", + "1005", + "1012" ], "Monday|0": [ "1001", - "1002", + "1003", "1004", - "1005", "1006", "1007", - "1008" + "1010", + "1011" ], "Monday|1": [ "1001", @@ -1987,7 +2384,9 @@ "1004", "1005", "1007", - "1008" + "1008", + "1009", + "1012" ], "Monday|2": [ "1001", @@ -1995,7 +2394,9 @@ "1004", "1005", "1007", - "1008" + "1008", + "1009", + "1012" ], "Monday|3": [ "1001", @@ -2005,72 +2406,6 @@ "1007", "1008" ], - "Wednesday|0": [ - "1001", - "1002", - "1003", - "1004", - "1005", - "1007", - "1008" - ], - "Wednesday|1": [ - "1001", - "1002", - "1003", - "1004", - "1005", - "1007" - ], - "Wednesday|2": [ - "1001", - "1002", - "1003", - "1004", - "1005" - ], - "Wednesday|3": [ - "1001", - "1002", - "1003", - "1004", - "1005" - ], - "Thursday|2": [ - "1001", - "1002", - "1003" - ], - "Thursday|3": [ - "1001", - "1002", - "1003" - ], - "Friday|0": [ - "1001", - "1003", - "1004", - "1005", - "1007" - ], - "Friday|1": [ - "1001", - "1003", - "1005" - ], - "Thursday|1": [ - "1001", - "1002", - "1004" - ], - "Friday|2": [ - "1001", - "1004" - ], - "Friday|3": [ - "1001", - "1004" - ], "Monday|4": [ "1001", "1002", @@ -2082,22 +2417,96 @@ "Tuesday|4": [ "1001", "1002", + "1003", "1004", "1005", "1007", - "1008" + "1008", + "1012" + ], + "Wednesday|1": [ + "1001", + "1002", + "1003", + "1004", + "1005", + "1007", + "1008", + "1009" + ], + "Wednesday|2": [ + "1001", + "1002", + "1003", + "1004", + "1005", + "1008", + "1009" + ], + "Wednesday|3": [ + "1001", + "1002", + "1004", + "1005", + "1009", + "1012" ], "Wednesday|4": [ "1001", "1002", - "1005" + "1004", + "1005", + "1009", + "1012" + ], + "Thursday|1": [ + "1001", + "1002", + "1003", + "1004", + "1005", + "1012" + ], + "Thursday|2": [ + "1001", + "1002", + "1003", + "1004", + "1005", + "1012" + ], + "Thursday|3": [ + "1002", + "1003", + "1005", + "1009" ], "Thursday|4": [ - "1001", - "1002" + "1002", + "1003", + "1005", + "1009" ], - "Friday|4": [ + "Wednesday|0": [ + "1001", + "1002", + "1003", + "1004", + "1005", + "1010", + "1011" + ], + "Friday|0": [ + "1002", + "1003", + "1010", + "1011" + ], + "Friday|1": [ "1001" + ], + "Friday|2": [ + "1002" ] }, "batch_busy": { @@ -2152,11 +2561,14 @@ "26021519", "26021520", "26031519", + "26031520", "26041519" ], "Tuesday|3": [ "25021519", + "25021520", "25031519", + "25031520", "26021519", "26021520", "26031519", @@ -2184,7 +2596,9 @@ "25031519", "25031520", "25041519", - "25041520" + "25041520", + "26021519", + "26021520" ], "Monday|2": [ "25021519", @@ -2192,7 +2606,9 @@ "25031519", "25031520", "25041519", - "25041520" + "25041520", + "26021519", + "26021520" ], "Monday|3": [ "25021519", @@ -2202,99 +2618,107 @@ "25041519", "25041520" ], - "Wednesday|0": [ + "Monday|4": [ "25021519", "25021520", "25031519", "25031520", "25041519", - "26021519", "26041519" ], - "Wednesday|1": [ - "25021519", - "25021520", - "25031520", - "26021519", - "26031519", - "26041520" - ], - "Wednesday|2": [ - "25021519", - "25021520", - "25031520", - "26021520", - "26031520" - ], - "Wednesday|3": [ - "25021519", - "25021520", - "25031520", - "26021520", - "26031520" - ], - "Thursday|2": [ - "25021519", - "26021519", - "26021520" - ], - "Thursday|3": [ - "25021519", - "26021519", - "26021520" - ], - "Friday|0": [ - "25021520", - "25031519", - "25041520", - "26021519", - "26031519" - ], - "Friday|1": [ - "25021520", - "26021519", - "26031519" - ], - "Thursday|1": [ - "26021519", - "26021520", - "26031519" - ], - "Friday|2": [ - "26021519", - "26031520" - ], - "Friday|3": [ - "26021519", - "26031520" - ], - "Monday|4": [ - "25021519", - "25021520", - "25031519", - "26031519", - "26041519", - "26041520" - ], "Tuesday|4": [ "25021519", "25021520", "25031519", - "26031519", + "25031520", + "26021519", + "26021520", "26041519", "26041520" ], + "Wednesday|1": [ + "25021519", + "25021520", + "25031519", + "25031520", + "26021519", + "26021520", + "26041519", + "26041520" + ], + "Wednesday|2": [ + "25021519", + "25021520", + "26021519", + "26021520", + "26031519", + "26031520", + "26041520" + ], + "Wednesday|3": [ + "25021519", + "25021520", + "26021519", + "26021520", + "26031519", + "26031520" + ], "Wednesday|4": [ "25021519", "25021520", + "26021519", + "26021520", + "26031519", "26031520" ], - "Thursday|4": [ + "Thursday|1": [ "25021519", - "25021520" + "25021520", + "26021519", + "26021520", + "26031519", + "26031520" ], - "Friday|4": [ - "25021519" + "Thursday|2": [ + "25021519", + "25021520", + "26021519", + "26021520", + "26031519", + "26031520" + ], + "Thursday|3": [ + "25021519", + "26021519", + "26021520", + "26031519" + ], + "Thursday|4": [ + "25021520", + "26021519", + "26021520", + "26031520" + ], + "Wednesday|0": [ + "25021519", + "25021520", + "25031519", + "25031520", + "25041520", + "26021519", + "26031519" + ], + "Friday|0": [ + "26021519", + "26021520", + "26031520", + "26041520" + ], + "Friday|1": [ + "26021520" + ], + "Friday|2": [ + "26021520" ] }, "phases_completed": [ diff --git a/result/templates/batch-wise/25021519.xlsx b/result/templates/batch-wise/25021519.xlsx index 3156bc8..ec826b9 100644 Binary files a/result/templates/batch-wise/25021519.xlsx and b/result/templates/batch-wise/25021519.xlsx differ diff --git a/result/templates/batch-wise/25021520.xlsx b/result/templates/batch-wise/25021520.xlsx index debb9dd..c2c782c 100644 Binary files a/result/templates/batch-wise/25021520.xlsx and b/result/templates/batch-wise/25021520.xlsx differ diff --git a/result/templates/batch-wise/25031519.xlsx b/result/templates/batch-wise/25031519.xlsx index 3964a56..9fc0b2c 100644 Binary files a/result/templates/batch-wise/25031519.xlsx and b/result/templates/batch-wise/25031519.xlsx differ diff --git a/result/templates/batch-wise/25031520.xlsx b/result/templates/batch-wise/25031520.xlsx index 6907be5..e6bebde 100644 Binary files a/result/templates/batch-wise/25031520.xlsx and b/result/templates/batch-wise/25031520.xlsx differ diff --git a/result/templates/batch-wise/25041519.xlsx b/result/templates/batch-wise/25041519.xlsx index 8f3c3cb..5a7bf21 100644 Binary files a/result/templates/batch-wise/25041519.xlsx and b/result/templates/batch-wise/25041519.xlsx differ diff --git a/result/templates/batch-wise/25041520.xlsx b/result/templates/batch-wise/25041520.xlsx index ef6eee9..f4d4d79 100644 Binary files a/result/templates/batch-wise/25041520.xlsx and b/result/templates/batch-wise/25041520.xlsx differ diff --git a/result/templates/batch-wise/26021519.xlsx b/result/templates/batch-wise/26021519.xlsx index 066949a..4a1e5ca 100644 Binary files a/result/templates/batch-wise/26021519.xlsx and b/result/templates/batch-wise/26021519.xlsx differ diff --git a/result/templates/batch-wise/26021520.xlsx b/result/templates/batch-wise/26021520.xlsx index d620cb6..738c1bf 100644 Binary files a/result/templates/batch-wise/26021520.xlsx and b/result/templates/batch-wise/26021520.xlsx differ diff --git a/result/templates/batch-wise/26031519.xlsx b/result/templates/batch-wise/26031519.xlsx index df6efb8..505eecd 100644 Binary files a/result/templates/batch-wise/26031519.xlsx and b/result/templates/batch-wise/26031519.xlsx differ diff --git a/result/templates/batch-wise/26031520.xlsx b/result/templates/batch-wise/26031520.xlsx index 812594a..db56dad 100644 Binary files a/result/templates/batch-wise/26031520.xlsx and b/result/templates/batch-wise/26031520.xlsx differ diff --git a/result/templates/batch-wise/26041519.xlsx b/result/templates/batch-wise/26041519.xlsx index 6a4daff..26009d4 100644 Binary files a/result/templates/batch-wise/26041519.xlsx and b/result/templates/batch-wise/26041519.xlsx differ diff --git a/result/templates/batch-wise/26041520.xlsx b/result/templates/batch-wise/26041520.xlsx index 54162ff..11fa96a 100644 Binary files a/result/templates/batch-wise/26041520.xlsx and b/result/templates/batch-wise/26041520.xlsx differ diff --git a/result/templates/department-wise/BBA.xlsx b/result/templates/department-wise/BBA.xlsx index 691c7ef..68dc687 100644 Binary files a/result/templates/department-wise/BBA.xlsx and b/result/templates/department-wise/BBA.xlsx differ diff --git a/result/templates/department-wise/CS.xlsx b/result/templates/department-wise/CS.xlsx index ed7c10e..3558e41 100644 Binary files a/result/templates/department-wise/CS.xlsx and b/result/templates/department-wise/CS.xlsx differ diff --git a/result/templates/department-wise/EE.xlsx b/result/templates/department-wise/EE.xlsx index 5c15157..eb6cae0 100644 Binary files a/result/templates/department-wise/EE.xlsx and b/result/templates/department-wise/EE.xlsx differ diff --git a/result/templates/room-wise/A-101.xlsx b/result/templates/room-wise/A-101.xlsx index 99868c6..614c54e 100644 Binary files a/result/templates/room-wise/A-101.xlsx and b/result/templates/room-wise/A-101.xlsx differ diff --git a/result/templates/room-wise/A-102.xlsx b/result/templates/room-wise/A-102.xlsx index 4b303a4..1acde58 100644 Binary files a/result/templates/room-wise/A-102.xlsx and b/result/templates/room-wise/A-102.xlsx differ diff --git a/result/templates/room-wise/A-103.xlsx b/result/templates/room-wise/A-103.xlsx index 000831a..66ce380 100644 Binary files a/result/templates/room-wise/A-103.xlsx and b/result/templates/room-wise/A-103.xlsx differ diff --git a/result/templates/room-wise/A-201.xlsx b/result/templates/room-wise/A-201.xlsx index b562aa8..a0b1cf9 100644 Binary files a/result/templates/room-wise/A-201.xlsx and b/result/templates/room-wise/A-201.xlsx differ diff --git a/result/templates/room-wise/A-202.xlsx b/result/templates/room-wise/A-202.xlsx new file mode 100644 index 0000000..c34b800 Binary files /dev/null and b/result/templates/room-wise/A-202.xlsx differ diff --git a/result/templates/room-wise/A-L01.xlsx b/result/templates/room-wise/A-L01.xlsx index 1c84013..6db1d2e 100644 Binary files a/result/templates/room-wise/A-L01.xlsx and b/result/templates/room-wise/A-L01.xlsx differ diff --git a/result/templates/room-wise/A-L02.xlsx b/result/templates/room-wise/A-L02.xlsx index f78614b..34969f1 100644 Binary files a/result/templates/room-wise/A-L02.xlsx and b/result/templates/room-wise/A-L02.xlsx differ diff --git a/result/templates/room-wise/A-L03.xlsx b/result/templates/room-wise/A-L03.xlsx new file mode 100644 index 0000000..20081fa Binary files /dev/null and b/result/templates/room-wise/A-L03.xlsx differ diff --git a/result/templates/room-wise/B-101.xlsx b/result/templates/room-wise/B-101.xlsx index a1ceb52..f7eaef3 100644 Binary files a/result/templates/room-wise/B-101.xlsx and b/result/templates/room-wise/B-101.xlsx differ diff --git a/result/templates/room-wise/B-102.xlsx b/result/templates/room-wise/B-102.xlsx index d92474f..e793eb5 100644 Binary files a/result/templates/room-wise/B-102.xlsx and b/result/templates/room-wise/B-102.xlsx differ diff --git a/result/templates/room-wise/B-L01.xlsx b/result/templates/room-wise/B-L01.xlsx index aa78c1c..8323017 100644 Binary files a/result/templates/room-wise/B-L01.xlsx and b/result/templates/room-wise/B-L01.xlsx differ diff --git a/result/templates/student-wise/25021519-001.xlsx b/result/templates/student-wise/25021519-001.xlsx index 5139658..fd64eb5 100644 Binary files a/result/templates/student-wise/25021519-001.xlsx and b/result/templates/student-wise/25021519-001.xlsx differ diff --git a/result/templates/student-wise/25021519-002.xlsx b/result/templates/student-wise/25021519-002.xlsx index 40bd2ec..ca04d6a 100644 Binary files a/result/templates/student-wise/25021519-002.xlsx and b/result/templates/student-wise/25021519-002.xlsx differ diff --git a/result/templates/student-wise/25021519-003.xlsx b/result/templates/student-wise/25021519-003.xlsx index 191947c..9d602ae 100644 Binary files a/result/templates/student-wise/25021519-003.xlsx and b/result/templates/student-wise/25021519-003.xlsx differ diff --git a/result/templates/student-wise/25021519-004.xlsx b/result/templates/student-wise/25021519-004.xlsx index caca024..6b13ea3 100644 Binary files a/result/templates/student-wise/25021519-004.xlsx and b/result/templates/student-wise/25021519-004.xlsx differ diff --git a/result/templates/student-wise/25021519-005.xlsx b/result/templates/student-wise/25021519-005.xlsx index a974649..a84b132 100644 Binary files a/result/templates/student-wise/25021519-005.xlsx and b/result/templates/student-wise/25021519-005.xlsx differ diff --git a/result/templates/student-wise/25021519-006.xlsx b/result/templates/student-wise/25021519-006.xlsx index 43a7629..8c25a26 100644 Binary files a/result/templates/student-wise/25021519-006.xlsx and b/result/templates/student-wise/25021519-006.xlsx differ diff --git a/result/templates/student-wise/25021519-007.xlsx b/result/templates/student-wise/25021519-007.xlsx index a09a058..be369da 100644 Binary files a/result/templates/student-wise/25021519-007.xlsx and b/result/templates/student-wise/25021519-007.xlsx differ diff --git a/result/templates/student-wise/25021519-008.xlsx b/result/templates/student-wise/25021519-008.xlsx index 216ce65..7f9c6f0 100644 Binary files a/result/templates/student-wise/25021519-008.xlsx and b/result/templates/student-wise/25021519-008.xlsx differ diff --git a/result/templates/student-wise/25021519-009.xlsx b/result/templates/student-wise/25021519-009.xlsx index 608f559..b0a2b3b 100644 Binary files a/result/templates/student-wise/25021519-009.xlsx and b/result/templates/student-wise/25021519-009.xlsx differ diff --git a/result/templates/student-wise/25021519-010.xlsx b/result/templates/student-wise/25021519-010.xlsx index 9e311b2..f6dc531 100644 Binary files a/result/templates/student-wise/25021519-010.xlsx and b/result/templates/student-wise/25021519-010.xlsx differ diff --git a/result/templates/student-wise/25021519-011.xlsx b/result/templates/student-wise/25021519-011.xlsx index 6b1b7b6..049358c 100644 Binary files a/result/templates/student-wise/25021519-011.xlsx and b/result/templates/student-wise/25021519-011.xlsx differ diff --git a/result/templates/student-wise/25021519-012.xlsx b/result/templates/student-wise/25021519-012.xlsx index 6b54962..a52b1d8 100644 Binary files a/result/templates/student-wise/25021519-012.xlsx and b/result/templates/student-wise/25021519-012.xlsx differ diff --git a/result/templates/student-wise/25021519-013.xlsx b/result/templates/student-wise/25021519-013.xlsx index 209132e..631bcc2 100644 Binary files a/result/templates/student-wise/25021519-013.xlsx and b/result/templates/student-wise/25021519-013.xlsx differ diff --git a/result/templates/student-wise/25021519-014.xlsx b/result/templates/student-wise/25021519-014.xlsx index a2fe4e5..a41463f 100644 Binary files a/result/templates/student-wise/25021519-014.xlsx and b/result/templates/student-wise/25021519-014.xlsx differ diff --git a/result/templates/student-wise/25021519-015.xlsx b/result/templates/student-wise/25021519-015.xlsx index 6240273..5d920ae 100644 Binary files a/result/templates/student-wise/25021519-015.xlsx and b/result/templates/student-wise/25021519-015.xlsx differ diff --git a/result/templates/student-wise/25021519-016.xlsx b/result/templates/student-wise/25021519-016.xlsx index 496c671..696e34f 100644 Binary files a/result/templates/student-wise/25021519-016.xlsx and b/result/templates/student-wise/25021519-016.xlsx differ diff --git a/result/templates/student-wise/25021519-017.xlsx b/result/templates/student-wise/25021519-017.xlsx index 2616d7b..a21159a 100644 Binary files a/result/templates/student-wise/25021519-017.xlsx and b/result/templates/student-wise/25021519-017.xlsx differ diff --git a/result/templates/student-wise/25021519-018.xlsx b/result/templates/student-wise/25021519-018.xlsx index 12eda8a..ce084d9 100644 Binary files a/result/templates/student-wise/25021519-018.xlsx and b/result/templates/student-wise/25021519-018.xlsx differ diff --git a/result/templates/student-wise/25021520-001.xlsx b/result/templates/student-wise/25021520-001.xlsx index 01f619d..d641fce 100644 Binary files a/result/templates/student-wise/25021520-001.xlsx and b/result/templates/student-wise/25021520-001.xlsx differ diff --git a/result/templates/student-wise/25021520-002.xlsx b/result/templates/student-wise/25021520-002.xlsx index 5759a17..103e3fc 100644 Binary files a/result/templates/student-wise/25021520-002.xlsx and b/result/templates/student-wise/25021520-002.xlsx differ diff --git a/result/templates/student-wise/25021520-003.xlsx b/result/templates/student-wise/25021520-003.xlsx index 80bbe69..042c0db 100644 Binary files a/result/templates/student-wise/25021520-003.xlsx and b/result/templates/student-wise/25021520-003.xlsx differ diff --git a/result/templates/student-wise/25021520-004.xlsx b/result/templates/student-wise/25021520-004.xlsx index 0b61f94..4f4feed 100644 Binary files a/result/templates/student-wise/25021520-004.xlsx and b/result/templates/student-wise/25021520-004.xlsx differ diff --git a/result/templates/student-wise/25021520-005.xlsx b/result/templates/student-wise/25021520-005.xlsx index 0cbe672..7613d05 100644 Binary files a/result/templates/student-wise/25021520-005.xlsx and b/result/templates/student-wise/25021520-005.xlsx differ diff --git a/result/templates/student-wise/25021520-006.xlsx b/result/templates/student-wise/25021520-006.xlsx index b454abc..97ff1a0 100644 Binary files a/result/templates/student-wise/25021520-006.xlsx and b/result/templates/student-wise/25021520-006.xlsx differ diff --git a/result/templates/student-wise/25021520-007.xlsx b/result/templates/student-wise/25021520-007.xlsx index e43ad23..246a326 100644 Binary files a/result/templates/student-wise/25021520-007.xlsx and b/result/templates/student-wise/25021520-007.xlsx differ diff --git a/result/templates/student-wise/25021520-008.xlsx b/result/templates/student-wise/25021520-008.xlsx index 8785730..b15f3a6 100644 Binary files a/result/templates/student-wise/25021520-008.xlsx and b/result/templates/student-wise/25021520-008.xlsx differ diff --git a/result/templates/student-wise/25021520-009.xlsx b/result/templates/student-wise/25021520-009.xlsx index a6bd57b..a041dd6 100644 Binary files a/result/templates/student-wise/25021520-009.xlsx and b/result/templates/student-wise/25021520-009.xlsx differ diff --git a/result/templates/student-wise/25021520-010.xlsx b/result/templates/student-wise/25021520-010.xlsx index 0d278fc..2aabbe7 100644 Binary files a/result/templates/student-wise/25021520-010.xlsx and b/result/templates/student-wise/25021520-010.xlsx differ diff --git a/result/templates/student-wise/25021520-011.xlsx b/result/templates/student-wise/25021520-011.xlsx index 9a50699..a6c7d66 100644 Binary files a/result/templates/student-wise/25021520-011.xlsx and b/result/templates/student-wise/25021520-011.xlsx differ diff --git a/result/templates/student-wise/25021520-012.xlsx b/result/templates/student-wise/25021520-012.xlsx index 94fcb19..9fd194f 100644 Binary files a/result/templates/student-wise/25021520-012.xlsx and b/result/templates/student-wise/25021520-012.xlsx differ diff --git a/result/templates/student-wise/25021520-013.xlsx b/result/templates/student-wise/25021520-013.xlsx index 0c5427a..fd3dc8c 100644 Binary files a/result/templates/student-wise/25021520-013.xlsx and b/result/templates/student-wise/25021520-013.xlsx differ diff --git a/result/templates/student-wise/25021520-014.xlsx b/result/templates/student-wise/25021520-014.xlsx index 5e4feb1..fe33dbc 100644 Binary files a/result/templates/student-wise/25021520-014.xlsx and b/result/templates/student-wise/25021520-014.xlsx differ diff --git a/result/templates/student-wise/25021520-015.xlsx b/result/templates/student-wise/25021520-015.xlsx index 69bcf27..909e38d 100644 Binary files a/result/templates/student-wise/25021520-015.xlsx and b/result/templates/student-wise/25021520-015.xlsx differ diff --git a/result/templates/student-wise/25021520-016.xlsx b/result/templates/student-wise/25021520-016.xlsx index b1c7959..97d79ea 100644 Binary files a/result/templates/student-wise/25021520-016.xlsx and b/result/templates/student-wise/25021520-016.xlsx differ diff --git a/result/templates/student-wise/25021520-017.xlsx b/result/templates/student-wise/25021520-017.xlsx index 06c192b..b7b6eb1 100644 Binary files a/result/templates/student-wise/25021520-017.xlsx and b/result/templates/student-wise/25021520-017.xlsx differ diff --git a/result/templates/student-wise/25021520-018.xlsx b/result/templates/student-wise/25021520-018.xlsx index 5a791de..673e6cb 100644 Binary files a/result/templates/student-wise/25021520-018.xlsx and b/result/templates/student-wise/25021520-018.xlsx differ diff --git a/result/templates/student-wise/25031519-001.xlsx b/result/templates/student-wise/25031519-001.xlsx index 709cd16..edacc70 100644 Binary files a/result/templates/student-wise/25031519-001.xlsx and b/result/templates/student-wise/25031519-001.xlsx differ diff --git a/result/templates/student-wise/25031519-002.xlsx b/result/templates/student-wise/25031519-002.xlsx index 6f034df..fd0922c 100644 Binary files a/result/templates/student-wise/25031519-002.xlsx and b/result/templates/student-wise/25031519-002.xlsx differ diff --git a/result/templates/student-wise/25031519-003.xlsx b/result/templates/student-wise/25031519-003.xlsx index 6d3504a..8f970b2 100644 Binary files a/result/templates/student-wise/25031519-003.xlsx and b/result/templates/student-wise/25031519-003.xlsx differ diff --git a/result/templates/student-wise/25031519-004.xlsx b/result/templates/student-wise/25031519-004.xlsx index 02b5a33..89cb647 100644 Binary files a/result/templates/student-wise/25031519-004.xlsx and b/result/templates/student-wise/25031519-004.xlsx differ diff --git a/result/templates/student-wise/25031519-005.xlsx b/result/templates/student-wise/25031519-005.xlsx index 975824b..cc72805 100644 Binary files a/result/templates/student-wise/25031519-005.xlsx and b/result/templates/student-wise/25031519-005.xlsx differ diff --git a/result/templates/student-wise/25031519-006.xlsx b/result/templates/student-wise/25031519-006.xlsx index 03f79f0..5cac2ae 100644 Binary files a/result/templates/student-wise/25031519-006.xlsx and b/result/templates/student-wise/25031519-006.xlsx differ diff --git a/result/templates/student-wise/25031519-007.xlsx b/result/templates/student-wise/25031519-007.xlsx index 413f793..7e11dee 100644 Binary files a/result/templates/student-wise/25031519-007.xlsx and b/result/templates/student-wise/25031519-007.xlsx differ diff --git a/result/templates/student-wise/25031519-008.xlsx b/result/templates/student-wise/25031519-008.xlsx index 2240bf0..65c8342 100644 Binary files a/result/templates/student-wise/25031519-008.xlsx and b/result/templates/student-wise/25031519-008.xlsx differ diff --git a/result/templates/student-wise/25031519-009.xlsx b/result/templates/student-wise/25031519-009.xlsx index d61f437..6248576 100644 Binary files a/result/templates/student-wise/25031519-009.xlsx and b/result/templates/student-wise/25031519-009.xlsx differ diff --git a/result/templates/student-wise/25031519-010.xlsx b/result/templates/student-wise/25031519-010.xlsx index ee6c513..6c4d202 100644 Binary files a/result/templates/student-wise/25031519-010.xlsx and b/result/templates/student-wise/25031519-010.xlsx differ diff --git a/result/templates/student-wise/25031519-011.xlsx b/result/templates/student-wise/25031519-011.xlsx index e476cc0..81b596e 100644 Binary files a/result/templates/student-wise/25031519-011.xlsx and b/result/templates/student-wise/25031519-011.xlsx differ diff --git a/result/templates/student-wise/25031519-012.xlsx b/result/templates/student-wise/25031519-012.xlsx index 29b1147..1bebe15 100644 Binary files a/result/templates/student-wise/25031519-012.xlsx and b/result/templates/student-wise/25031519-012.xlsx differ diff --git a/result/templates/student-wise/25031519-013.xlsx b/result/templates/student-wise/25031519-013.xlsx index 3076064..9fa755a 100644 Binary files a/result/templates/student-wise/25031519-013.xlsx and b/result/templates/student-wise/25031519-013.xlsx differ diff --git a/result/templates/student-wise/25031519-014.xlsx b/result/templates/student-wise/25031519-014.xlsx index 4647114..954f42f 100644 Binary files a/result/templates/student-wise/25031519-014.xlsx and b/result/templates/student-wise/25031519-014.xlsx differ diff --git a/result/templates/student-wise/25031519-015.xlsx b/result/templates/student-wise/25031519-015.xlsx index ebcde97..5396807 100644 Binary files a/result/templates/student-wise/25031519-015.xlsx and b/result/templates/student-wise/25031519-015.xlsx differ diff --git a/result/templates/student-wise/25031519-016.xlsx b/result/templates/student-wise/25031519-016.xlsx index 4c04e0d..3f8696a 100644 Binary files a/result/templates/student-wise/25031519-016.xlsx and b/result/templates/student-wise/25031519-016.xlsx differ diff --git a/result/templates/student-wise/25031519-017.xlsx b/result/templates/student-wise/25031519-017.xlsx index d61f003..c7531bf 100644 Binary files a/result/templates/student-wise/25031519-017.xlsx and b/result/templates/student-wise/25031519-017.xlsx differ diff --git a/result/templates/student-wise/25031519-018.xlsx b/result/templates/student-wise/25031519-018.xlsx index 68ee398..5b98acf 100644 Binary files a/result/templates/student-wise/25031519-018.xlsx and b/result/templates/student-wise/25031519-018.xlsx differ diff --git a/result/templates/student-wise/25031520-001.xlsx b/result/templates/student-wise/25031520-001.xlsx index 47ea409..6b1b9c9 100644 Binary files a/result/templates/student-wise/25031520-001.xlsx and b/result/templates/student-wise/25031520-001.xlsx differ diff --git a/result/templates/student-wise/25031520-002.xlsx b/result/templates/student-wise/25031520-002.xlsx index 3b04f20..715f4fa 100644 Binary files a/result/templates/student-wise/25031520-002.xlsx and b/result/templates/student-wise/25031520-002.xlsx differ diff --git a/result/templates/student-wise/25031520-003.xlsx b/result/templates/student-wise/25031520-003.xlsx index b9cf1d4..26dd7fa 100644 Binary files a/result/templates/student-wise/25031520-003.xlsx and b/result/templates/student-wise/25031520-003.xlsx differ diff --git a/result/templates/student-wise/25031520-004.xlsx b/result/templates/student-wise/25031520-004.xlsx index 003b8df..3d35b85 100644 Binary files a/result/templates/student-wise/25031520-004.xlsx and b/result/templates/student-wise/25031520-004.xlsx differ diff --git a/result/templates/student-wise/25031520-005.xlsx b/result/templates/student-wise/25031520-005.xlsx index 841c276..1f18fb8 100644 Binary files a/result/templates/student-wise/25031520-005.xlsx and b/result/templates/student-wise/25031520-005.xlsx differ diff --git a/result/templates/student-wise/25031520-006.xlsx b/result/templates/student-wise/25031520-006.xlsx index 79b8817..abfe837 100644 Binary files a/result/templates/student-wise/25031520-006.xlsx and b/result/templates/student-wise/25031520-006.xlsx differ diff --git a/result/templates/student-wise/25031520-007.xlsx b/result/templates/student-wise/25031520-007.xlsx index f6264ae..b5a3b3c 100644 Binary files a/result/templates/student-wise/25031520-007.xlsx and b/result/templates/student-wise/25031520-007.xlsx differ diff --git a/result/templates/student-wise/25031520-008.xlsx b/result/templates/student-wise/25031520-008.xlsx index 35924f1..72c70f9 100644 Binary files a/result/templates/student-wise/25031520-008.xlsx and b/result/templates/student-wise/25031520-008.xlsx differ diff --git a/result/templates/student-wise/25031520-009.xlsx b/result/templates/student-wise/25031520-009.xlsx index 47ca042..9dbb20e 100644 Binary files a/result/templates/student-wise/25031520-009.xlsx and b/result/templates/student-wise/25031520-009.xlsx differ diff --git a/result/templates/student-wise/25031520-010.xlsx b/result/templates/student-wise/25031520-010.xlsx index 76ea6e6..8e8f976 100644 Binary files a/result/templates/student-wise/25031520-010.xlsx and b/result/templates/student-wise/25031520-010.xlsx differ diff --git a/result/templates/student-wise/25031520-011.xlsx b/result/templates/student-wise/25031520-011.xlsx index 3ee5d30..a98fd09 100644 Binary files a/result/templates/student-wise/25031520-011.xlsx and b/result/templates/student-wise/25031520-011.xlsx differ diff --git a/result/templates/student-wise/25031520-012.xlsx b/result/templates/student-wise/25031520-012.xlsx index 2412e45..e06da09 100644 Binary files a/result/templates/student-wise/25031520-012.xlsx and b/result/templates/student-wise/25031520-012.xlsx differ diff --git a/result/templates/student-wise/25031520-013.xlsx b/result/templates/student-wise/25031520-013.xlsx index 97f3f01..d17f67f 100644 Binary files a/result/templates/student-wise/25031520-013.xlsx and b/result/templates/student-wise/25031520-013.xlsx differ diff --git a/result/templates/student-wise/25031520-014.xlsx b/result/templates/student-wise/25031520-014.xlsx index d4ef445..e63e8e1 100644 Binary files a/result/templates/student-wise/25031520-014.xlsx and b/result/templates/student-wise/25031520-014.xlsx differ diff --git a/result/templates/student-wise/25031520-015.xlsx b/result/templates/student-wise/25031520-015.xlsx index ddc8083..7d34b7f 100644 Binary files a/result/templates/student-wise/25031520-015.xlsx and b/result/templates/student-wise/25031520-015.xlsx differ diff --git a/result/templates/student-wise/25031520-016.xlsx b/result/templates/student-wise/25031520-016.xlsx index 4eafcb8..0d1be96 100644 Binary files a/result/templates/student-wise/25031520-016.xlsx and b/result/templates/student-wise/25031520-016.xlsx differ diff --git a/result/templates/student-wise/25031520-017.xlsx b/result/templates/student-wise/25031520-017.xlsx index 361aa16..ff5414a 100644 Binary files a/result/templates/student-wise/25031520-017.xlsx and b/result/templates/student-wise/25031520-017.xlsx differ diff --git a/result/templates/student-wise/25031520-018.xlsx b/result/templates/student-wise/25031520-018.xlsx index c953c9d..12b23f9 100644 Binary files a/result/templates/student-wise/25031520-018.xlsx and b/result/templates/student-wise/25031520-018.xlsx differ diff --git a/result/templates/student-wise/25041519-001.xlsx b/result/templates/student-wise/25041519-001.xlsx index 3f8b23a..207865c 100644 Binary files a/result/templates/student-wise/25041519-001.xlsx and b/result/templates/student-wise/25041519-001.xlsx differ diff --git a/result/templates/student-wise/25041519-002.xlsx b/result/templates/student-wise/25041519-002.xlsx index 6e6e903..6d59e5c 100644 Binary files a/result/templates/student-wise/25041519-002.xlsx and b/result/templates/student-wise/25041519-002.xlsx differ diff --git a/result/templates/student-wise/25041519-003.xlsx b/result/templates/student-wise/25041519-003.xlsx index 10302f6..6f837af 100644 Binary files a/result/templates/student-wise/25041519-003.xlsx and b/result/templates/student-wise/25041519-003.xlsx differ diff --git a/result/templates/student-wise/25041519-004.xlsx b/result/templates/student-wise/25041519-004.xlsx index 188db56..5033c3c 100644 Binary files a/result/templates/student-wise/25041519-004.xlsx and b/result/templates/student-wise/25041519-004.xlsx differ diff --git a/result/templates/student-wise/25041519-005.xlsx b/result/templates/student-wise/25041519-005.xlsx index 4e6b64b..04493fd 100644 Binary files a/result/templates/student-wise/25041519-005.xlsx and b/result/templates/student-wise/25041519-005.xlsx differ diff --git a/result/templates/student-wise/25041519-006.xlsx b/result/templates/student-wise/25041519-006.xlsx index 12dd4cc..3603c12 100644 Binary files a/result/templates/student-wise/25041519-006.xlsx and b/result/templates/student-wise/25041519-006.xlsx differ diff --git a/result/templates/student-wise/25041519-007.xlsx b/result/templates/student-wise/25041519-007.xlsx index d44c9cc..95df187 100644 Binary files a/result/templates/student-wise/25041519-007.xlsx and b/result/templates/student-wise/25041519-007.xlsx differ diff --git a/result/templates/student-wise/25041519-008.xlsx b/result/templates/student-wise/25041519-008.xlsx index c57d38a..a562aa6 100644 Binary files a/result/templates/student-wise/25041519-008.xlsx and b/result/templates/student-wise/25041519-008.xlsx differ diff --git a/result/templates/student-wise/25041519-009.xlsx b/result/templates/student-wise/25041519-009.xlsx index 5663362..b19c4b4 100644 Binary files a/result/templates/student-wise/25041519-009.xlsx and b/result/templates/student-wise/25041519-009.xlsx differ diff --git a/result/templates/student-wise/25041519-010.xlsx b/result/templates/student-wise/25041519-010.xlsx index 11f6f0f..98c3df0 100644 Binary files a/result/templates/student-wise/25041519-010.xlsx and b/result/templates/student-wise/25041519-010.xlsx differ diff --git a/result/templates/student-wise/25041519-011.xlsx b/result/templates/student-wise/25041519-011.xlsx index 91ec11e..657bdbf 100644 Binary files a/result/templates/student-wise/25041519-011.xlsx and b/result/templates/student-wise/25041519-011.xlsx differ diff --git a/result/templates/student-wise/25041519-012.xlsx b/result/templates/student-wise/25041519-012.xlsx index 60fffd4..55a2814 100644 Binary files a/result/templates/student-wise/25041519-012.xlsx and b/result/templates/student-wise/25041519-012.xlsx differ diff --git a/result/templates/student-wise/25041519-013.xlsx b/result/templates/student-wise/25041519-013.xlsx index 48cf742..3df0312 100644 Binary files a/result/templates/student-wise/25041519-013.xlsx and b/result/templates/student-wise/25041519-013.xlsx differ diff --git a/result/templates/student-wise/25041519-014.xlsx b/result/templates/student-wise/25041519-014.xlsx index dfcc2d2..d15eac9 100644 Binary files a/result/templates/student-wise/25041519-014.xlsx and b/result/templates/student-wise/25041519-014.xlsx differ diff --git a/result/templates/student-wise/25041519-015.xlsx b/result/templates/student-wise/25041519-015.xlsx index 164a46d..a47802d 100644 Binary files a/result/templates/student-wise/25041519-015.xlsx and b/result/templates/student-wise/25041519-015.xlsx differ diff --git a/result/templates/student-wise/25041519-016.xlsx b/result/templates/student-wise/25041519-016.xlsx index 7f6f866..1a7080a 100644 Binary files a/result/templates/student-wise/25041519-016.xlsx and b/result/templates/student-wise/25041519-016.xlsx differ diff --git a/result/templates/student-wise/25041519-017.xlsx b/result/templates/student-wise/25041519-017.xlsx index 6b9ae7e..7454ea9 100644 Binary files a/result/templates/student-wise/25041519-017.xlsx and b/result/templates/student-wise/25041519-017.xlsx differ diff --git a/result/templates/student-wise/25041519-018.xlsx b/result/templates/student-wise/25041519-018.xlsx index 1ab4aa6..d49d438 100644 Binary files a/result/templates/student-wise/25041519-018.xlsx and b/result/templates/student-wise/25041519-018.xlsx differ diff --git a/result/templates/student-wise/25041520-001.xlsx b/result/templates/student-wise/25041520-001.xlsx index 0d1e915..a8cae69 100644 Binary files a/result/templates/student-wise/25041520-001.xlsx and b/result/templates/student-wise/25041520-001.xlsx differ diff --git a/result/templates/student-wise/25041520-002.xlsx b/result/templates/student-wise/25041520-002.xlsx index eb75566..81d56df 100644 Binary files a/result/templates/student-wise/25041520-002.xlsx and b/result/templates/student-wise/25041520-002.xlsx differ diff --git a/result/templates/student-wise/25041520-003.xlsx b/result/templates/student-wise/25041520-003.xlsx index 6c81d17..eb6bd66 100644 Binary files a/result/templates/student-wise/25041520-003.xlsx and b/result/templates/student-wise/25041520-003.xlsx differ diff --git a/result/templates/student-wise/25041520-004.xlsx b/result/templates/student-wise/25041520-004.xlsx index c47f307..5d0b09e 100644 Binary files a/result/templates/student-wise/25041520-004.xlsx and b/result/templates/student-wise/25041520-004.xlsx differ diff --git a/result/templates/student-wise/25041520-005.xlsx b/result/templates/student-wise/25041520-005.xlsx index 53b9c41..7902c35 100644 Binary files a/result/templates/student-wise/25041520-005.xlsx and b/result/templates/student-wise/25041520-005.xlsx differ diff --git a/result/templates/student-wise/25041520-006.xlsx b/result/templates/student-wise/25041520-006.xlsx index ef04e03..74e4f40 100644 Binary files a/result/templates/student-wise/25041520-006.xlsx and b/result/templates/student-wise/25041520-006.xlsx differ diff --git a/result/templates/student-wise/25041520-007.xlsx b/result/templates/student-wise/25041520-007.xlsx index e59d01e..0263c17 100644 Binary files a/result/templates/student-wise/25041520-007.xlsx and b/result/templates/student-wise/25041520-007.xlsx differ diff --git a/result/templates/student-wise/25041520-008.xlsx b/result/templates/student-wise/25041520-008.xlsx index e6227cf..eee66f9 100644 Binary files a/result/templates/student-wise/25041520-008.xlsx and b/result/templates/student-wise/25041520-008.xlsx differ diff --git a/result/templates/student-wise/25041520-009.xlsx b/result/templates/student-wise/25041520-009.xlsx index d8cb78b..5d02565 100644 Binary files a/result/templates/student-wise/25041520-009.xlsx and b/result/templates/student-wise/25041520-009.xlsx differ diff --git a/result/templates/student-wise/25041520-010.xlsx b/result/templates/student-wise/25041520-010.xlsx index b819473..ccec4ad 100644 Binary files a/result/templates/student-wise/25041520-010.xlsx and b/result/templates/student-wise/25041520-010.xlsx differ diff --git a/result/templates/student-wise/25041520-011.xlsx b/result/templates/student-wise/25041520-011.xlsx index 7fcc11a..8445788 100644 Binary files a/result/templates/student-wise/25041520-011.xlsx and b/result/templates/student-wise/25041520-011.xlsx differ diff --git a/result/templates/student-wise/25041520-012.xlsx b/result/templates/student-wise/25041520-012.xlsx index 3fc45b1..0f23655 100644 Binary files a/result/templates/student-wise/25041520-012.xlsx and b/result/templates/student-wise/25041520-012.xlsx differ diff --git a/result/templates/student-wise/25041520-013.xlsx b/result/templates/student-wise/25041520-013.xlsx index 5facf39..6e64947 100644 Binary files a/result/templates/student-wise/25041520-013.xlsx and b/result/templates/student-wise/25041520-013.xlsx differ diff --git a/result/templates/student-wise/25041520-014.xlsx b/result/templates/student-wise/25041520-014.xlsx index 145c438..0e0899b 100644 Binary files a/result/templates/student-wise/25041520-014.xlsx and b/result/templates/student-wise/25041520-014.xlsx differ diff --git a/result/templates/student-wise/25041520-015.xlsx b/result/templates/student-wise/25041520-015.xlsx index 471b3be..0a356ce 100644 Binary files a/result/templates/student-wise/25041520-015.xlsx and b/result/templates/student-wise/25041520-015.xlsx differ diff --git a/result/templates/student-wise/25041520-016.xlsx b/result/templates/student-wise/25041520-016.xlsx index 0ccfe8c..034d3c9 100644 Binary files a/result/templates/student-wise/25041520-016.xlsx and b/result/templates/student-wise/25041520-016.xlsx differ diff --git a/result/templates/student-wise/25041520-017.xlsx b/result/templates/student-wise/25041520-017.xlsx index e4e347d..d91f1b1 100644 Binary files a/result/templates/student-wise/25041520-017.xlsx and b/result/templates/student-wise/25041520-017.xlsx differ diff --git a/result/templates/student-wise/25041520-018.xlsx b/result/templates/student-wise/25041520-018.xlsx index 5df1ef3..f8d4712 100644 Binary files a/result/templates/student-wise/25041520-018.xlsx and b/result/templates/student-wise/25041520-018.xlsx differ diff --git a/result/templates/student-wise/26021519-001.xlsx b/result/templates/student-wise/26021519-001.xlsx index 15bdcf1..e1190f7 100644 Binary files a/result/templates/student-wise/26021519-001.xlsx and b/result/templates/student-wise/26021519-001.xlsx differ diff --git a/result/templates/student-wise/26021519-002.xlsx b/result/templates/student-wise/26021519-002.xlsx index 95c028f..b67d2f9 100644 Binary files a/result/templates/student-wise/26021519-002.xlsx and b/result/templates/student-wise/26021519-002.xlsx differ diff --git a/result/templates/student-wise/26021519-003.xlsx b/result/templates/student-wise/26021519-003.xlsx index 03fb133..c7a462f 100644 Binary files a/result/templates/student-wise/26021519-003.xlsx and b/result/templates/student-wise/26021519-003.xlsx differ diff --git a/result/templates/student-wise/26021519-004.xlsx b/result/templates/student-wise/26021519-004.xlsx index 3ab985f..8b6e4a1 100644 Binary files a/result/templates/student-wise/26021519-004.xlsx and b/result/templates/student-wise/26021519-004.xlsx differ diff --git a/result/templates/student-wise/26021519-005.xlsx b/result/templates/student-wise/26021519-005.xlsx index 1ba1b9e..822b6db 100644 Binary files a/result/templates/student-wise/26021519-005.xlsx and b/result/templates/student-wise/26021519-005.xlsx differ diff --git a/result/templates/student-wise/26021519-006.xlsx b/result/templates/student-wise/26021519-006.xlsx index 38fb7f2..56a35eb 100644 Binary files a/result/templates/student-wise/26021519-006.xlsx and b/result/templates/student-wise/26021519-006.xlsx differ diff --git a/result/templates/student-wise/26021519-007.xlsx b/result/templates/student-wise/26021519-007.xlsx index 86a9863..b147920 100644 Binary files a/result/templates/student-wise/26021519-007.xlsx and b/result/templates/student-wise/26021519-007.xlsx differ diff --git a/result/templates/student-wise/26021519-008.xlsx b/result/templates/student-wise/26021519-008.xlsx index d96a442..df74e32 100644 Binary files a/result/templates/student-wise/26021519-008.xlsx and b/result/templates/student-wise/26021519-008.xlsx differ diff --git a/result/templates/student-wise/26021519-009.xlsx b/result/templates/student-wise/26021519-009.xlsx index 18af3b7..592b906 100644 Binary files a/result/templates/student-wise/26021519-009.xlsx and b/result/templates/student-wise/26021519-009.xlsx differ diff --git a/result/templates/student-wise/26021519-010.xlsx b/result/templates/student-wise/26021519-010.xlsx index 37ee231..1cd44bd 100644 Binary files a/result/templates/student-wise/26021519-010.xlsx and b/result/templates/student-wise/26021519-010.xlsx differ diff --git a/result/templates/student-wise/26021519-011.xlsx b/result/templates/student-wise/26021519-011.xlsx index 3258aee..b44ce2d 100644 Binary files a/result/templates/student-wise/26021519-011.xlsx and b/result/templates/student-wise/26021519-011.xlsx differ diff --git a/result/templates/student-wise/26021519-012.xlsx b/result/templates/student-wise/26021519-012.xlsx index e78289e..34139e2 100644 Binary files a/result/templates/student-wise/26021519-012.xlsx and b/result/templates/student-wise/26021519-012.xlsx differ diff --git a/result/templates/student-wise/26021519-013.xlsx b/result/templates/student-wise/26021519-013.xlsx index b903dae..c3eaaee 100644 Binary files a/result/templates/student-wise/26021519-013.xlsx and b/result/templates/student-wise/26021519-013.xlsx differ diff --git a/result/templates/student-wise/26021519-014.xlsx b/result/templates/student-wise/26021519-014.xlsx index f40ed47..1d7643f 100644 Binary files a/result/templates/student-wise/26021519-014.xlsx and b/result/templates/student-wise/26021519-014.xlsx differ diff --git a/result/templates/student-wise/26021519-015.xlsx b/result/templates/student-wise/26021519-015.xlsx index 07bea1d..be15c27 100644 Binary files a/result/templates/student-wise/26021519-015.xlsx and b/result/templates/student-wise/26021519-015.xlsx differ diff --git a/result/templates/student-wise/26021519-016.xlsx b/result/templates/student-wise/26021519-016.xlsx index 45961a7..d2dde54 100644 Binary files a/result/templates/student-wise/26021519-016.xlsx and b/result/templates/student-wise/26021519-016.xlsx differ diff --git a/result/templates/student-wise/26021519-017.xlsx b/result/templates/student-wise/26021519-017.xlsx index 7b18cd1..c8a5428 100644 Binary files a/result/templates/student-wise/26021519-017.xlsx and b/result/templates/student-wise/26021519-017.xlsx differ diff --git a/result/templates/student-wise/26021519-018.xlsx b/result/templates/student-wise/26021519-018.xlsx index be0ec2f..becd1d3 100644 Binary files a/result/templates/student-wise/26021519-018.xlsx and b/result/templates/student-wise/26021519-018.xlsx differ diff --git a/result/templates/student-wise/26021520-001.xlsx b/result/templates/student-wise/26021520-001.xlsx index f45419f..e25dc5d 100644 Binary files a/result/templates/student-wise/26021520-001.xlsx and b/result/templates/student-wise/26021520-001.xlsx differ diff --git a/result/templates/student-wise/26021520-002.xlsx b/result/templates/student-wise/26021520-002.xlsx index c74f14e..70294ed 100644 Binary files a/result/templates/student-wise/26021520-002.xlsx and b/result/templates/student-wise/26021520-002.xlsx differ diff --git a/result/templates/student-wise/26021520-003.xlsx b/result/templates/student-wise/26021520-003.xlsx index cb354a6..be24c1c 100644 Binary files a/result/templates/student-wise/26021520-003.xlsx and b/result/templates/student-wise/26021520-003.xlsx differ diff --git a/result/templates/student-wise/26021520-004.xlsx b/result/templates/student-wise/26021520-004.xlsx index 8d48b27..7fe3530 100644 Binary files a/result/templates/student-wise/26021520-004.xlsx and b/result/templates/student-wise/26021520-004.xlsx differ diff --git a/result/templates/student-wise/26021520-005.xlsx b/result/templates/student-wise/26021520-005.xlsx index 61d40c3..f30dba9 100644 Binary files a/result/templates/student-wise/26021520-005.xlsx and b/result/templates/student-wise/26021520-005.xlsx differ diff --git a/result/templates/student-wise/26021520-006.xlsx b/result/templates/student-wise/26021520-006.xlsx index c3319d1..aea66f9 100644 Binary files a/result/templates/student-wise/26021520-006.xlsx and b/result/templates/student-wise/26021520-006.xlsx differ diff --git a/result/templates/student-wise/26021520-007.xlsx b/result/templates/student-wise/26021520-007.xlsx index 125710e..51fc397 100644 Binary files a/result/templates/student-wise/26021520-007.xlsx and b/result/templates/student-wise/26021520-007.xlsx differ diff --git a/result/templates/student-wise/26021520-008.xlsx b/result/templates/student-wise/26021520-008.xlsx index af38168..e8227c1 100644 Binary files a/result/templates/student-wise/26021520-008.xlsx and b/result/templates/student-wise/26021520-008.xlsx differ diff --git a/result/templates/student-wise/26021520-009.xlsx b/result/templates/student-wise/26021520-009.xlsx index 72f6ae8..144839b 100644 Binary files a/result/templates/student-wise/26021520-009.xlsx and b/result/templates/student-wise/26021520-009.xlsx differ diff --git a/result/templates/student-wise/26021520-010.xlsx b/result/templates/student-wise/26021520-010.xlsx index 0307f45..126158e 100644 Binary files a/result/templates/student-wise/26021520-010.xlsx and b/result/templates/student-wise/26021520-010.xlsx differ diff --git a/result/templates/student-wise/26021520-011.xlsx b/result/templates/student-wise/26021520-011.xlsx index b795237..fb6c5d4 100644 Binary files a/result/templates/student-wise/26021520-011.xlsx and b/result/templates/student-wise/26021520-011.xlsx differ diff --git a/result/templates/student-wise/26021520-012.xlsx b/result/templates/student-wise/26021520-012.xlsx index 529f04d..8ceeb44 100644 Binary files a/result/templates/student-wise/26021520-012.xlsx and b/result/templates/student-wise/26021520-012.xlsx differ diff --git a/result/templates/student-wise/26021520-013.xlsx b/result/templates/student-wise/26021520-013.xlsx index d803546..17a1957 100644 Binary files a/result/templates/student-wise/26021520-013.xlsx and b/result/templates/student-wise/26021520-013.xlsx differ diff --git a/result/templates/student-wise/26021520-014.xlsx b/result/templates/student-wise/26021520-014.xlsx index 2482e96..35b4a07 100644 Binary files a/result/templates/student-wise/26021520-014.xlsx and b/result/templates/student-wise/26021520-014.xlsx differ diff --git a/result/templates/student-wise/26021520-015.xlsx b/result/templates/student-wise/26021520-015.xlsx index 031c9ea..82b5581 100644 Binary files a/result/templates/student-wise/26021520-015.xlsx and b/result/templates/student-wise/26021520-015.xlsx differ diff --git a/result/templates/student-wise/26021520-016.xlsx b/result/templates/student-wise/26021520-016.xlsx index c9b2d14..ed48cc8 100644 Binary files a/result/templates/student-wise/26021520-016.xlsx and b/result/templates/student-wise/26021520-016.xlsx differ diff --git a/result/templates/student-wise/26021520-017.xlsx b/result/templates/student-wise/26021520-017.xlsx index 0b65668..bce1e4e 100644 Binary files a/result/templates/student-wise/26021520-017.xlsx and b/result/templates/student-wise/26021520-017.xlsx differ diff --git a/result/templates/student-wise/26021520-018.xlsx b/result/templates/student-wise/26021520-018.xlsx index 7240a19..648be36 100644 Binary files a/result/templates/student-wise/26021520-018.xlsx and b/result/templates/student-wise/26021520-018.xlsx differ diff --git a/result/templates/student-wise/26031519-001.xlsx b/result/templates/student-wise/26031519-001.xlsx index 44460fb..83f6259 100644 Binary files a/result/templates/student-wise/26031519-001.xlsx and b/result/templates/student-wise/26031519-001.xlsx differ diff --git a/result/templates/student-wise/26031519-002.xlsx b/result/templates/student-wise/26031519-002.xlsx index 4fdbc93..a43fc6e 100644 Binary files a/result/templates/student-wise/26031519-002.xlsx and b/result/templates/student-wise/26031519-002.xlsx differ diff --git a/result/templates/student-wise/26031519-003.xlsx b/result/templates/student-wise/26031519-003.xlsx index d0f595e..119c7d4 100644 Binary files a/result/templates/student-wise/26031519-003.xlsx and b/result/templates/student-wise/26031519-003.xlsx differ diff --git a/result/templates/student-wise/26031519-004.xlsx b/result/templates/student-wise/26031519-004.xlsx index e8c2c53..138bf13 100644 Binary files a/result/templates/student-wise/26031519-004.xlsx and b/result/templates/student-wise/26031519-004.xlsx differ diff --git a/result/templates/student-wise/26031519-005.xlsx b/result/templates/student-wise/26031519-005.xlsx index 7b53f1f..43076a1 100644 Binary files a/result/templates/student-wise/26031519-005.xlsx and b/result/templates/student-wise/26031519-005.xlsx differ diff --git a/result/templates/student-wise/26031519-006.xlsx b/result/templates/student-wise/26031519-006.xlsx index 519c55e..490c5f6 100644 Binary files a/result/templates/student-wise/26031519-006.xlsx and b/result/templates/student-wise/26031519-006.xlsx differ diff --git a/result/templates/student-wise/26031519-007.xlsx b/result/templates/student-wise/26031519-007.xlsx index bbc3aec..bc7dc86 100644 Binary files a/result/templates/student-wise/26031519-007.xlsx and b/result/templates/student-wise/26031519-007.xlsx differ diff --git a/result/templates/student-wise/26031519-008.xlsx b/result/templates/student-wise/26031519-008.xlsx index 4b1a286..3c96ed4 100644 Binary files a/result/templates/student-wise/26031519-008.xlsx and b/result/templates/student-wise/26031519-008.xlsx differ diff --git a/result/templates/student-wise/26031519-009.xlsx b/result/templates/student-wise/26031519-009.xlsx index d817662..871e43c 100644 Binary files a/result/templates/student-wise/26031519-009.xlsx and b/result/templates/student-wise/26031519-009.xlsx differ diff --git a/result/templates/student-wise/26031519-010.xlsx b/result/templates/student-wise/26031519-010.xlsx index b7f3eac..6c9ba41 100644 Binary files a/result/templates/student-wise/26031519-010.xlsx and b/result/templates/student-wise/26031519-010.xlsx differ diff --git a/result/templates/student-wise/26031519-011.xlsx b/result/templates/student-wise/26031519-011.xlsx index 586072b..8536c58 100644 Binary files a/result/templates/student-wise/26031519-011.xlsx and b/result/templates/student-wise/26031519-011.xlsx differ diff --git a/result/templates/student-wise/26031519-012.xlsx b/result/templates/student-wise/26031519-012.xlsx index 3fc328f..cf964ec 100644 Binary files a/result/templates/student-wise/26031519-012.xlsx and b/result/templates/student-wise/26031519-012.xlsx differ diff --git a/result/templates/student-wise/26031519-013.xlsx b/result/templates/student-wise/26031519-013.xlsx index cfd694f..8e09301 100644 Binary files a/result/templates/student-wise/26031519-013.xlsx and b/result/templates/student-wise/26031519-013.xlsx differ diff --git a/result/templates/student-wise/26031519-014.xlsx b/result/templates/student-wise/26031519-014.xlsx index 641c4d1..6d8420a 100644 Binary files a/result/templates/student-wise/26031519-014.xlsx and b/result/templates/student-wise/26031519-014.xlsx differ diff --git a/result/templates/student-wise/26031519-015.xlsx b/result/templates/student-wise/26031519-015.xlsx index 7806654..03fe0d1 100644 Binary files a/result/templates/student-wise/26031519-015.xlsx and b/result/templates/student-wise/26031519-015.xlsx differ diff --git a/result/templates/student-wise/26031519-016.xlsx b/result/templates/student-wise/26031519-016.xlsx index 4fec3d2..2d22c81 100644 Binary files a/result/templates/student-wise/26031519-016.xlsx and b/result/templates/student-wise/26031519-016.xlsx differ diff --git a/result/templates/student-wise/26031519-017.xlsx b/result/templates/student-wise/26031519-017.xlsx index 7763a88..048f58e 100644 Binary files a/result/templates/student-wise/26031519-017.xlsx and b/result/templates/student-wise/26031519-017.xlsx differ diff --git a/result/templates/student-wise/26031519-018.xlsx b/result/templates/student-wise/26031519-018.xlsx index a3d9b32..921ee13 100644 Binary files a/result/templates/student-wise/26031519-018.xlsx and b/result/templates/student-wise/26031519-018.xlsx differ diff --git a/result/templates/student-wise/26031520-001.xlsx b/result/templates/student-wise/26031520-001.xlsx index 42577ed..7f240f6 100644 Binary files a/result/templates/student-wise/26031520-001.xlsx and b/result/templates/student-wise/26031520-001.xlsx differ diff --git a/result/templates/student-wise/26031520-002.xlsx b/result/templates/student-wise/26031520-002.xlsx index af799c3..7c70cf3 100644 Binary files a/result/templates/student-wise/26031520-002.xlsx and b/result/templates/student-wise/26031520-002.xlsx differ diff --git a/result/templates/student-wise/26031520-003.xlsx b/result/templates/student-wise/26031520-003.xlsx index 9467805..5244071 100644 Binary files a/result/templates/student-wise/26031520-003.xlsx and b/result/templates/student-wise/26031520-003.xlsx differ diff --git a/result/templates/student-wise/26031520-004.xlsx b/result/templates/student-wise/26031520-004.xlsx index 0426afa..5f9658e 100644 Binary files a/result/templates/student-wise/26031520-004.xlsx and b/result/templates/student-wise/26031520-004.xlsx differ diff --git a/result/templates/student-wise/26031520-005.xlsx b/result/templates/student-wise/26031520-005.xlsx index 82dc4cc..f817bd9 100644 Binary files a/result/templates/student-wise/26031520-005.xlsx and b/result/templates/student-wise/26031520-005.xlsx differ diff --git a/result/templates/student-wise/26031520-006.xlsx b/result/templates/student-wise/26031520-006.xlsx index 91049b1..dd08c0e 100644 Binary files a/result/templates/student-wise/26031520-006.xlsx and b/result/templates/student-wise/26031520-006.xlsx differ diff --git a/result/templates/student-wise/26031520-007.xlsx b/result/templates/student-wise/26031520-007.xlsx index 846d3c6..67db2a0 100644 Binary files a/result/templates/student-wise/26031520-007.xlsx and b/result/templates/student-wise/26031520-007.xlsx differ diff --git a/result/templates/student-wise/26031520-008.xlsx b/result/templates/student-wise/26031520-008.xlsx index a0657be..63a0d17 100644 Binary files a/result/templates/student-wise/26031520-008.xlsx and b/result/templates/student-wise/26031520-008.xlsx differ diff --git a/result/templates/student-wise/26031520-009.xlsx b/result/templates/student-wise/26031520-009.xlsx index 3bb83f7..445b45a 100644 Binary files a/result/templates/student-wise/26031520-009.xlsx and b/result/templates/student-wise/26031520-009.xlsx differ diff --git a/result/templates/student-wise/26031520-010.xlsx b/result/templates/student-wise/26031520-010.xlsx index 59eea05..ac33b42 100644 Binary files a/result/templates/student-wise/26031520-010.xlsx and b/result/templates/student-wise/26031520-010.xlsx differ diff --git a/result/templates/student-wise/26031520-011.xlsx b/result/templates/student-wise/26031520-011.xlsx index 36c7f66..1f5f0b9 100644 Binary files a/result/templates/student-wise/26031520-011.xlsx and b/result/templates/student-wise/26031520-011.xlsx differ diff --git a/result/templates/student-wise/26031520-012.xlsx b/result/templates/student-wise/26031520-012.xlsx index fc432d3..c225874 100644 Binary files a/result/templates/student-wise/26031520-012.xlsx and b/result/templates/student-wise/26031520-012.xlsx differ diff --git a/result/templates/student-wise/26031520-013.xlsx b/result/templates/student-wise/26031520-013.xlsx index 33ccbf9..fabadbe 100644 Binary files a/result/templates/student-wise/26031520-013.xlsx and b/result/templates/student-wise/26031520-013.xlsx differ diff --git a/result/templates/student-wise/26031520-014.xlsx b/result/templates/student-wise/26031520-014.xlsx index 310d9ca..8821fc9 100644 Binary files a/result/templates/student-wise/26031520-014.xlsx and b/result/templates/student-wise/26031520-014.xlsx differ diff --git a/result/templates/student-wise/26031520-015.xlsx b/result/templates/student-wise/26031520-015.xlsx index 9f71bd9..49ba0e3 100644 Binary files a/result/templates/student-wise/26031520-015.xlsx and b/result/templates/student-wise/26031520-015.xlsx differ diff --git a/result/templates/student-wise/26031520-016.xlsx b/result/templates/student-wise/26031520-016.xlsx index 4884765..28a2cbb 100644 Binary files a/result/templates/student-wise/26031520-016.xlsx and b/result/templates/student-wise/26031520-016.xlsx differ diff --git a/result/templates/student-wise/26031520-017.xlsx b/result/templates/student-wise/26031520-017.xlsx index aca12b8..5c3a9de 100644 Binary files a/result/templates/student-wise/26031520-017.xlsx and b/result/templates/student-wise/26031520-017.xlsx differ diff --git a/result/templates/student-wise/26031520-018.xlsx b/result/templates/student-wise/26031520-018.xlsx index c31f260..5a31727 100644 Binary files a/result/templates/student-wise/26031520-018.xlsx and b/result/templates/student-wise/26031520-018.xlsx differ diff --git a/result/templates/student-wise/26041519-001.xlsx b/result/templates/student-wise/26041519-001.xlsx index 5952af8..0778fbd 100644 Binary files a/result/templates/student-wise/26041519-001.xlsx and b/result/templates/student-wise/26041519-001.xlsx differ diff --git a/result/templates/student-wise/26041519-002.xlsx b/result/templates/student-wise/26041519-002.xlsx index 8ca3a67..8b8b76a 100644 Binary files a/result/templates/student-wise/26041519-002.xlsx and b/result/templates/student-wise/26041519-002.xlsx differ diff --git a/result/templates/student-wise/26041519-003.xlsx b/result/templates/student-wise/26041519-003.xlsx index 91cca5d..8fcc533 100644 Binary files a/result/templates/student-wise/26041519-003.xlsx and b/result/templates/student-wise/26041519-003.xlsx differ diff --git a/result/templates/student-wise/26041519-004.xlsx b/result/templates/student-wise/26041519-004.xlsx index 8f95515..4da5459 100644 Binary files a/result/templates/student-wise/26041519-004.xlsx and b/result/templates/student-wise/26041519-004.xlsx differ diff --git a/result/templates/student-wise/26041519-005.xlsx b/result/templates/student-wise/26041519-005.xlsx index 7b5c926..f671c37 100644 Binary files a/result/templates/student-wise/26041519-005.xlsx and b/result/templates/student-wise/26041519-005.xlsx differ diff --git a/result/templates/student-wise/26041519-006.xlsx b/result/templates/student-wise/26041519-006.xlsx index 1c0771b..f6aff0a 100644 Binary files a/result/templates/student-wise/26041519-006.xlsx and b/result/templates/student-wise/26041519-006.xlsx differ diff --git a/result/templates/student-wise/26041519-007.xlsx b/result/templates/student-wise/26041519-007.xlsx index 2a281f5..2a56c2c 100644 Binary files a/result/templates/student-wise/26041519-007.xlsx and b/result/templates/student-wise/26041519-007.xlsx differ diff --git a/result/templates/student-wise/26041519-008.xlsx b/result/templates/student-wise/26041519-008.xlsx index 09ee269..9277c45 100644 Binary files a/result/templates/student-wise/26041519-008.xlsx and b/result/templates/student-wise/26041519-008.xlsx differ diff --git a/result/templates/student-wise/26041519-009.xlsx b/result/templates/student-wise/26041519-009.xlsx index c86d136..30f23f4 100644 Binary files a/result/templates/student-wise/26041519-009.xlsx and b/result/templates/student-wise/26041519-009.xlsx differ diff --git a/result/templates/student-wise/26041519-010.xlsx b/result/templates/student-wise/26041519-010.xlsx index 92191cd..2539133 100644 Binary files a/result/templates/student-wise/26041519-010.xlsx and b/result/templates/student-wise/26041519-010.xlsx differ diff --git a/result/templates/student-wise/26041519-011.xlsx b/result/templates/student-wise/26041519-011.xlsx index d620505..7e67524 100644 Binary files a/result/templates/student-wise/26041519-011.xlsx and b/result/templates/student-wise/26041519-011.xlsx differ diff --git a/result/templates/student-wise/26041519-012.xlsx b/result/templates/student-wise/26041519-012.xlsx index 7a808c1..7461fdf 100644 Binary files a/result/templates/student-wise/26041519-012.xlsx and b/result/templates/student-wise/26041519-012.xlsx differ diff --git a/result/templates/student-wise/26041519-013.xlsx b/result/templates/student-wise/26041519-013.xlsx index 9451bd7..a62fea1 100644 Binary files a/result/templates/student-wise/26041519-013.xlsx and b/result/templates/student-wise/26041519-013.xlsx differ diff --git a/result/templates/student-wise/26041519-014.xlsx b/result/templates/student-wise/26041519-014.xlsx index bdc40c3..e9c34d9 100644 Binary files a/result/templates/student-wise/26041519-014.xlsx and b/result/templates/student-wise/26041519-014.xlsx differ diff --git a/result/templates/student-wise/26041519-015.xlsx b/result/templates/student-wise/26041519-015.xlsx index f5f5377..d0bc9b5 100644 Binary files a/result/templates/student-wise/26041519-015.xlsx and b/result/templates/student-wise/26041519-015.xlsx differ diff --git a/result/templates/student-wise/26041519-016.xlsx b/result/templates/student-wise/26041519-016.xlsx index 41d2f15..778ab0e 100644 Binary files a/result/templates/student-wise/26041519-016.xlsx and b/result/templates/student-wise/26041519-016.xlsx differ diff --git a/result/templates/student-wise/26041519-017.xlsx b/result/templates/student-wise/26041519-017.xlsx index 3108130..0f52fba 100644 Binary files a/result/templates/student-wise/26041519-017.xlsx and b/result/templates/student-wise/26041519-017.xlsx differ diff --git a/result/templates/student-wise/26041519-018.xlsx b/result/templates/student-wise/26041519-018.xlsx index a3a17ad..3f92069 100644 Binary files a/result/templates/student-wise/26041519-018.xlsx and b/result/templates/student-wise/26041519-018.xlsx differ diff --git a/result/templates/student-wise/26041520-001.xlsx b/result/templates/student-wise/26041520-001.xlsx index 8e7b03d..c7a3268 100644 Binary files a/result/templates/student-wise/26041520-001.xlsx and b/result/templates/student-wise/26041520-001.xlsx differ diff --git a/result/templates/student-wise/26041520-002.xlsx b/result/templates/student-wise/26041520-002.xlsx index 71f480a..dbe7886 100644 Binary files a/result/templates/student-wise/26041520-002.xlsx and b/result/templates/student-wise/26041520-002.xlsx differ diff --git a/result/templates/student-wise/26041520-003.xlsx b/result/templates/student-wise/26041520-003.xlsx index ffcfae7..36a0f6a 100644 Binary files a/result/templates/student-wise/26041520-003.xlsx and b/result/templates/student-wise/26041520-003.xlsx differ diff --git a/result/templates/student-wise/26041520-004.xlsx b/result/templates/student-wise/26041520-004.xlsx index ee449c8..3af23c2 100644 Binary files a/result/templates/student-wise/26041520-004.xlsx and b/result/templates/student-wise/26041520-004.xlsx differ diff --git a/result/templates/student-wise/26041520-005.xlsx b/result/templates/student-wise/26041520-005.xlsx index 4eaa6df..9d26925 100644 Binary files a/result/templates/student-wise/26041520-005.xlsx and b/result/templates/student-wise/26041520-005.xlsx differ diff --git a/result/templates/student-wise/26041520-006.xlsx b/result/templates/student-wise/26041520-006.xlsx index 7c96a71..342a0db 100644 Binary files a/result/templates/student-wise/26041520-006.xlsx and b/result/templates/student-wise/26041520-006.xlsx differ diff --git a/result/templates/student-wise/26041520-007.xlsx b/result/templates/student-wise/26041520-007.xlsx index 1c103b9..9c2138a 100644 Binary files a/result/templates/student-wise/26041520-007.xlsx and b/result/templates/student-wise/26041520-007.xlsx differ diff --git a/result/templates/student-wise/26041520-008.xlsx b/result/templates/student-wise/26041520-008.xlsx index 9880f00..1b234d2 100644 Binary files a/result/templates/student-wise/26041520-008.xlsx and b/result/templates/student-wise/26041520-008.xlsx differ diff --git a/result/templates/student-wise/26041520-009.xlsx b/result/templates/student-wise/26041520-009.xlsx index 30bee96..444e965 100644 Binary files a/result/templates/student-wise/26041520-009.xlsx and b/result/templates/student-wise/26041520-009.xlsx differ diff --git a/result/templates/student-wise/26041520-010.xlsx b/result/templates/student-wise/26041520-010.xlsx index d68397b..0ef4de0 100644 Binary files a/result/templates/student-wise/26041520-010.xlsx and b/result/templates/student-wise/26041520-010.xlsx differ diff --git a/result/templates/student-wise/26041520-011.xlsx b/result/templates/student-wise/26041520-011.xlsx index 942880b..a3d5663 100644 Binary files a/result/templates/student-wise/26041520-011.xlsx and b/result/templates/student-wise/26041520-011.xlsx differ diff --git a/result/templates/student-wise/26041520-012.xlsx b/result/templates/student-wise/26041520-012.xlsx index f405248..ed56a26 100644 Binary files a/result/templates/student-wise/26041520-012.xlsx and b/result/templates/student-wise/26041520-012.xlsx differ diff --git a/result/templates/student-wise/26041520-013.xlsx b/result/templates/student-wise/26041520-013.xlsx index e3cb434..9662d0c 100644 Binary files a/result/templates/student-wise/26041520-013.xlsx and b/result/templates/student-wise/26041520-013.xlsx differ diff --git a/result/templates/student-wise/26041520-014.xlsx b/result/templates/student-wise/26041520-014.xlsx index 34f9097..0e3b72f 100644 Binary files a/result/templates/student-wise/26041520-014.xlsx and b/result/templates/student-wise/26041520-014.xlsx differ diff --git a/result/templates/student-wise/26041520-015.xlsx b/result/templates/student-wise/26041520-015.xlsx index 96ad941..bd83063 100644 Binary files a/result/templates/student-wise/26041520-015.xlsx and b/result/templates/student-wise/26041520-015.xlsx differ diff --git a/result/templates/student-wise/26041520-016.xlsx b/result/templates/student-wise/26041520-016.xlsx index 53b0fd3..a6ea78c 100644 Binary files a/result/templates/student-wise/26041520-016.xlsx and b/result/templates/student-wise/26041520-016.xlsx differ diff --git a/result/templates/student-wise/26041520-017.xlsx b/result/templates/student-wise/26041520-017.xlsx index 8f73334..4aa9dba 100644 Binary files a/result/templates/student-wise/26041520-017.xlsx and b/result/templates/student-wise/26041520-017.xlsx differ diff --git a/result/templates/student-wise/26041520-018.xlsx b/result/templates/student-wise/26041520-018.xlsx index d5130e3..d4d5fbc 100644 Binary files a/result/templates/student-wise/26041520-018.xlsx and b/result/templates/student-wise/26041520-018.xlsx differ diff --git a/result/templates/teacher-wise/1001.xlsx b/result/templates/teacher-wise/1001.xlsx index 5935cb6..e85f6ff 100644 Binary files a/result/templates/teacher-wise/1001.xlsx and b/result/templates/teacher-wise/1001.xlsx differ diff --git a/result/templates/teacher-wise/1002.xlsx b/result/templates/teacher-wise/1002.xlsx index b98fefe..94e716a 100644 Binary files a/result/templates/teacher-wise/1002.xlsx and b/result/templates/teacher-wise/1002.xlsx differ diff --git a/result/templates/teacher-wise/1003.xlsx b/result/templates/teacher-wise/1003.xlsx index 8ec0bdf..11fd0ab 100644 Binary files a/result/templates/teacher-wise/1003.xlsx and b/result/templates/teacher-wise/1003.xlsx differ diff --git a/result/templates/teacher-wise/1004.xlsx b/result/templates/teacher-wise/1004.xlsx index 1aac2df..eb6675e 100644 Binary files a/result/templates/teacher-wise/1004.xlsx and b/result/templates/teacher-wise/1004.xlsx differ diff --git a/result/templates/teacher-wise/1005.xlsx b/result/templates/teacher-wise/1005.xlsx index 2ff94b4..8588945 100644 Binary files a/result/templates/teacher-wise/1005.xlsx and b/result/templates/teacher-wise/1005.xlsx differ diff --git a/result/templates/teacher-wise/1006.xlsx b/result/templates/teacher-wise/1006.xlsx index 66290e9..488acf4 100644 Binary files a/result/templates/teacher-wise/1006.xlsx and b/result/templates/teacher-wise/1006.xlsx differ diff --git a/result/templates/teacher-wise/1007.xlsx b/result/templates/teacher-wise/1007.xlsx index 631ac5a..38de173 100644 Binary files a/result/templates/teacher-wise/1007.xlsx and b/result/templates/teacher-wise/1007.xlsx differ diff --git a/result/templates/teacher-wise/1008.xlsx b/result/templates/teacher-wise/1008.xlsx index 0aede4e..b3a648a 100644 Binary files a/result/templates/teacher-wise/1008.xlsx and b/result/templates/teacher-wise/1008.xlsx differ diff --git a/result/templates/teacher-wise/1009.xlsx b/result/templates/teacher-wise/1009.xlsx new file mode 100644 index 0000000..a50ec98 Binary files /dev/null and b/result/templates/teacher-wise/1009.xlsx differ diff --git a/result/templates/teacher-wise/1010.xlsx b/result/templates/teacher-wise/1010.xlsx new file mode 100644 index 0000000..f2f4aa0 Binary files /dev/null and b/result/templates/teacher-wise/1010.xlsx differ diff --git a/result/templates/teacher-wise/1011.xlsx b/result/templates/teacher-wise/1011.xlsx new file mode 100644 index 0000000..5e59c4f Binary files /dev/null and b/result/templates/teacher-wise/1011.xlsx differ diff --git a/result/templates/teacher-wise/1012.xlsx b/result/templates/teacher-wise/1012.xlsx new file mode 100644 index 0000000..e350eba Binary files /dev/null and b/result/templates/teacher-wise/1012.xlsx differ