Munwar92 commited on
Commit
f17bddf
·
verified ·
1 Parent(s): 3d02e0c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -25
app.py CHANGED
@@ -10,7 +10,7 @@ if "teachers" not in st.session_state:
10
  if "rooms" not in st.session_state:
11
  st.session_state.rooms = []
12
  if "subjects" not in st.session_state:
13
- st.session_state.subjects = []
14
  if "availability" not in st.session_state:
15
  st.session_state.availability = {}
16
 
@@ -21,54 +21,67 @@ st.title("Professional Timetable Generator")
21
  st.sidebar.header("Add Data")
22
 
23
  # Add teachers
 
24
  if st.sidebar.button("Add Teacher"):
25
- teacher = st.sidebar.text_input("Enter Teacher Name")
26
  if teacher:
27
  st.session_state.teachers.append(teacher)
28
  st.success(f"Added Teacher: {teacher}")
 
 
29
 
30
  # Add rooms
 
31
  if st.sidebar.button("Add Room"):
32
- room = st.sidebar.text_input("Enter Room Name")
33
  if room:
34
  st.session_state.rooms.append(room)
35
  st.success(f"Added Room: {room}")
 
 
36
 
37
- # Add subjects
 
 
38
  if st.sidebar.button("Add Subject"):
39
- subject = st.sidebar.text_input("Enter Subject Name")
40
- if subject:
41
- st.session_state.subjects.append(subject)
42
- st.success(f"Added Subject: {subject}")
 
43
 
44
  # Show existing data
45
  st.write("### Current Data")
46
  st.write("**Teachers:**", st.session_state.teachers)
47
  st.write("**Rooms:**", st.session_state.rooms)
48
- st.write("**Subjects:**", st.session_state.subjects)
49
 
50
  # Timetable generation logic
51
- def generate_timetable(teachers, subjects, rooms, time_slots):
52
  model = cp_model.CpModel()
53
  schedule = {}
54
-
55
- for subject in subjects:
 
56
  for teacher in teachers:
57
  for room in rooms:
58
- for time_slot in time_slots:
59
- schedule[(subject, teacher, room, time_slot)] = model.NewBoolVar(
60
- f"{subject}_{teacher}_{room}_{time_slot}"
61
- )
 
62
 
63
- # Constraints
64
- for subject in subjects:
65
  model.Add(
66
- sum(schedule[(subject, teacher, room, time_slot)]
67
- for teacher in teachers
68
- for room in rooms
69
- for time_slot in time_slots) == 1
 
 
 
70
  )
71
 
 
72
  solver = cp_model.CpSolver()
73
  status = solver.Solve(model)
74
 
@@ -84,13 +97,13 @@ def generate_timetable(teachers, subjects, rooms, time_slots):
84
  # Generate timetable button
85
  if st.button("Generate Timetable"):
86
  time_slots = [f"{hour}:00 - {hour+1}:00" for hour in range(8, 18)] # 8 AM to 6 PM
 
87
  timetable = generate_timetable(
88
- st.session_state.teachers, st.session_state.subjects, st.session_state.rooms, time_slots
89
  )
90
  if timetable:
91
  for entry in timetable:
92
- subject, teacher, room, time_slot = entry
93
- day = "Monday" # Simplify for demo purposes
94
  st.session_state.timetable = pd.concat(
95
  [st.session_state.timetable, pd.DataFrame([[day, time_slot, subject, teacher, room]],
96
  columns=["Day", "Time", "Subject", "Teacher", "Room"])],
 
10
  if "rooms" not in st.session_state:
11
  st.session_state.rooms = []
12
  if "subjects" not in st.session_state:
13
+ st.session_state.subjects = {}
14
  if "availability" not in st.session_state:
15
  st.session_state.availability = {}
16
 
 
21
  st.sidebar.header("Add Data")
22
 
23
  # Add teachers
24
+ teacher = st.sidebar.text_input("Enter Teacher Name")
25
  if st.sidebar.button("Add Teacher"):
 
26
  if teacher:
27
  st.session_state.teachers.append(teacher)
28
  st.success(f"Added Teacher: {teacher}")
29
+ else:
30
+ st.error("Teacher name cannot be empty!")
31
 
32
  # Add rooms
33
+ room = st.sidebar.text_input("Enter Room Name")
34
  if st.sidebar.button("Add Room"):
 
35
  if room:
36
  st.session_state.rooms.append(room)
37
  st.success(f"Added Room: {room}")
38
+ else:
39
+ st.error("Room name cannot be empty!")
40
 
41
+ # Add subjects with weekly slots
42
+ subject = st.sidebar.text_input("Enter Subject Name")
43
+ slots = st.sidebar.number_input("Number of Weekly Slots", min_value=1, max_value=10, step=1)
44
  if st.sidebar.button("Add Subject"):
45
+ if subject and slots > 0:
46
+ st.session_state.subjects[subject] = slots
47
+ st.success(f"Added Subject: {subject} with {slots} slots per week")
48
+ else:
49
+ st.error("Subject name cannot be empty, and slots must be greater than 0!")
50
 
51
  # Show existing data
52
  st.write("### Current Data")
53
  st.write("**Teachers:**", st.session_state.teachers)
54
  st.write("**Rooms:**", st.session_state.rooms)
55
+ st.write("**Subjects and Weekly Slots:**", st.session_state.subjects)
56
 
57
  # Timetable generation logic
58
+ def generate_timetable(teachers, subjects, rooms, time_slots, days):
59
  model = cp_model.CpModel()
60
  schedule = {}
61
+
62
+ # Variables for each subject-teacher-room-time-slot combination
63
+ for subject, slots in subjects.items():
64
  for teacher in teachers:
65
  for room in rooms:
66
+ for day in days:
67
+ for time_slot in time_slots:
68
+ schedule[(subject, teacher, room, day, time_slot)] = model.NewBoolVar(
69
+ f"{subject}_{teacher}_{room}_{day}_{time_slot}"
70
+ )
71
 
72
+ # Constraints: Each subject should have the required number of slots per week
73
+ for subject, slots in subjects.items():
74
  model.Add(
75
+ sum(
76
+ schedule[(subject, teacher, room, day, time_slot)]
77
+ for teacher in teachers
78
+ for room in rooms
79
+ for day in days
80
+ for time_slot in time_slots
81
+ ) == slots
82
  )
83
 
84
+ # Solve the model
85
  solver = cp_model.CpSolver()
86
  status = solver.Solve(model)
87
 
 
97
  # Generate timetable button
98
  if st.button("Generate Timetable"):
99
  time_slots = [f"{hour}:00 - {hour+1}:00" for hour in range(8, 18)] # 8 AM to 6 PM
100
+ days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
101
  timetable = generate_timetable(
102
+ st.session_state.teachers, st.session_state.subjects, st.session_state.rooms, time_slots, days
103
  )
104
  if timetable:
105
  for entry in timetable:
106
+ subject, teacher, room, day, time_slot = entry
 
107
  st.session_state.timetable = pd.concat(
108
  [st.session_state.timetable, pd.DataFrame([[day, time_slot, subject, teacher, room]],
109
  columns=["Day", "Time", "Subject", "Teacher", "Room"])],