phases initial

This commit is contained in:
Talhadeveloperr
2026-09-09 18:01:05 +05:00
parent aa3faf674f
commit 1e300d1700
51 changed files with 177 additions and 77 deletions

View File

@@ -22,11 +22,11 @@ sys.path.insert(0, os.path.join(ROOT_DIR, "templates", "room-wise"))
sys.path.insert(0, os.path.join(ROOT_DIR, "templates", "student-wise"))
sys.path.insert(0, os.path.join(ROOT_DIR, "templates", "teacher-wise"))
from template_controller import build_schedule # noqa: E402
from template_controller import load_data, Scheduler # noqa: E402
from conflict_checker import check_all_conflicts # noqa: E402
from conflict_checker.student_conflict_checker import format_student_conflicts # noqa: E402
from conflict_checker.teacher_conflict_checker import format_teacher_conflicts # noqa: E402
from template_logger import reset_log, log_error, log_info # noqa: E402
from template_logger import reset_log, log_error, log_info, log_warning # noqa: E402
from batch_wise_template import generate_batch_wise_templates # noqa: E402
from department_wise_template import generate_department_wise_templates # noqa: E402
@@ -38,6 +38,23 @@ RESULT_DIR = os.path.join(ROOT_DIR, "result", "templates")
VIEW_NAMES = ["batch-wise", "department-wise", "room-wise", "student-wise", "teacher-wise"]
def _check_and_log(sessions, label):
"""Runs student + teacher conflict checks over `sessions` and logs the result."""
report = check_all_conflicts(sessions)
if report["has_conflicts"]:
for line in format_student_conflicts(report["student_conflicts"]):
log_error(f"[{label}] STUDENT CONFLICT: {line}")
for line in format_teacher_conflicts(report["teacher_conflicts"]):
log_error(f"[{label}] TEACHER CONFLICT: {line}")
log_warning(
f"[{label}] Found {len(report['student_conflicts'])} student conflict(s) and "
f"{len(report['teacher_conflicts'])} teacher conflict(s)."
)
else:
log_info(f"[{label}] No conflicts found — clash-free.")
return report
def clear_result_dir():
"""Removes every previous run's output so stale files never linger."""
for view_name in VIEW_NAMES:
@@ -59,23 +76,32 @@ def main():
generate_dummy_data()
print()
print("Loading data and building clash-free schedule...")
data, sessions = build_schedule()
print(f"Scheduled {len(sessions)} sessions.\n")
log_info("Loading data...")
data = load_data()
scheduler = Scheduler(data)
log_info("Running conflict checks (student/batch and teacher)...")
report = check_all_conflicts(sessions)
if report["has_conflicts"]:
for line in format_student_conflicts(report["student_conflicts"]):
log_error(f"STUDENT CONFLICT: {line}")
for line in format_teacher_conflicts(report["teacher_conflicts"]):
log_error(f"TEACHER CONFLICT: {line}")
log_error(
f"Found {len(report['student_conflicts'])} student conflict(s) and "
f"{len(report['teacher_conflicts'])} teacher conflict(s)."
)
else:
log_info("No conflicts found — schedule is clash-free for students and teachers.")
# --- Phase 1: general courses (Tue/Thu preferred), self-repaired until clash-free ---
log_info("Phase 1/3: scheduling general courses...")
phase1_sessions = scheduler.phase_1_general_courses()
_check_and_log(phase1_sessions, "Phase 1 (general courses)")
# --- Phase 2: labs, scheduled against Phase 1's fixed placements ---
log_info("Phase 2/3: scheduling labs...")
phase2_sessions = scheduler.phase_2_labs()
_check_and_log(phase1_sessions + phase2_sessions, "Phase 2 (general courses + labs)")
# --- Phase 3: remaining theory courses, batch by batch ---
log_info("Phase 3/3: scheduling remaining courses (batch by batch)...")
phase3_sessions = scheduler.phase_3_remaining_courses()
sessions = phase1_sessions + phase2_sessions + phase3_sessions
log_info(
f"Scheduling complete: {len(phase1_sessions)} general, {len(phase2_sessions)} lab, "
f"{len(phase3_sessions)} remaining = {len(sessions)} total session(s)."
)
log_info("Running final conflict check (student/batch and teacher) over the full schedule...")
_check_and_log(sessions, "Final (full schedule)")
generators = [
("batch-wise", generate_batch_wise_templates),