Munwar92 commited on
Commit
315a74e
·
verified ·
1 Parent(s): 2855970

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +55 -40
app.py CHANGED
@@ -2,28 +2,34 @@ import streamlit as st
2
  import pandas as pd
3
  from ortools.sat.python import cp_model
4
 
5
- # Initialize session state
6
  if "timetable" not in st.session_state:
7
  st.session_state.timetable = pd.DataFrame(columns=["Day", "Time", "Subject", "Teacher", "Room"])
8
- if "teachers" not in st.session_state:
9
- st.session_state.teachers = []
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
 
17
  # App title
18
- st.title("Professional Timetable Generator")
19
 
20
- # Sidebar inputs
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:
@@ -33,33 +39,25 @@ if st.sidebar.button("Add Teacher"):
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 with debugging
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:
@@ -69,7 +67,7 @@ def generate_timetable(teachers, subjects, rooms, time_slots, days):
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(
@@ -81,13 +79,33 @@ def generate_timetable(teachers, subjects, rooms, time_slots, days):
81
  ) == slots
82
  )
83
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  # Solve the model
85
  solver = cp_model.CpSolver()
86
  status = solver.Solve(model)
87
 
88
- # Debugging: Print solver status
89
- st.write("Solver Status:", status)
90
-
91
  if status == cp_model.OPTIMAL:
92
  result = []
93
  for key, var in schedule.items():
@@ -95,17 +113,19 @@ def generate_timetable(teachers, subjects, rooms, time_slots, days):
95
  result.append(key)
96
  return result
97
  else:
98
- st.write("No feasible solution found with the given constraints.")
99
  return []
100
 
 
 
 
 
101
  # Generate timetable button
102
  if st.button("Generate Timetable"):
103
- time_slots = [f"{hour}:00 - {hour+1}:00" for hour in range(8, 18)] # 8 AM to 6 PM
104
- days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
105
  timetable = generate_timetable(
106
- st.session_state.teachers, st.session_state.subjects, st.session_state.rooms, time_slots, days
107
  )
108
  if timetable:
 
109
  for entry in timetable:
110
  subject, teacher, room, day, time_slot = entry
111
  st.session_state.timetable = pd.concat(
@@ -117,7 +137,7 @@ if st.button("Generate Timetable"):
117
  else:
118
  st.error("Failed to generate timetable. Check constraints!")
119
 
120
- # Display timetable
121
  st.write("### Generated Timetable")
122
  if not st.session_state.timetable.empty:
123
  st.dataframe(st.session_state.timetable)
@@ -129,8 +149,3 @@ if not st.session_state.timetable.empty:
129
  )
130
  else:
131
  st.write("No timetable generated yet.")
132
-
133
- # Clear timetable
134
- if st.button("Clear Timetable"):
135
- st.session_state.timetable = pd.DataFrame(columns=["Day", "Time", "Subject", "Teacher", "Room"])
136
- st.success("Timetable cleared!")
 
2
  import pandas as pd
3
  from ortools.sat.python import cp_model
4
 
5
+ # Initialize session state to store timetable
6
  if "timetable" not in st.session_state:
7
  st.session_state.timetable = pd.DataFrame(columns=["Day", "Time", "Subject", "Teacher", "Room"])
 
 
 
 
 
 
 
 
8
 
9
  # App title
10
+ st.title("Subject Timetable Generator")
11
 
12
+ # Sidebar inputs to add data
13
  st.sidebar.header("Add Data")
14
 
15
+ # Add subjects with weekly slots
16
+ subject = st.sidebar.text_input("Enter Subject Name")
17
+ weekly_slots = st.sidebar.number_input("Number of Weekly Slots", min_value=1, max_value=10, step=1)
18
+ if st.sidebar.button("Add Subject"):
19
+ if subject and weekly_slots > 0:
20
+ if 'subjects' not in st.session_state:
21
+ st.session_state.subjects = {}
22
+ st.session_state.subjects[subject] = weekly_slots
23
+ st.success(f"Added Subject: {subject} with {weekly_slots} slots per week")
24
+ else:
25
+ st.error("Please provide a valid subject and weekly slots.")
26
+
27
  # Add teachers
28
  teacher = st.sidebar.text_input("Enter Teacher Name")
29
  if st.sidebar.button("Add Teacher"):
30
  if teacher:
31
+ if 'teachers' not in st.session_state:
32
+ st.session_state.teachers = []
33
  st.session_state.teachers.append(teacher)
34
  st.success(f"Added Teacher: {teacher}")
35
  else:
 
39
  room = st.sidebar.text_input("Enter Room Name")
40
  if st.sidebar.button("Add Room"):
41
  if room:
42
+ if 'rooms' not in st.session_state:
43
+ st.session_state.rooms = []
44
  st.session_state.rooms.append(room)
45
  st.success(f"Added Room: {room}")
46
  else:
47
  st.error("Room name cannot be empty!")
48
 
49
+ # Show current data
 
 
 
 
 
 
 
 
 
 
50
  st.write("### Current Data")
51
+ st.write("**Subjects:**", st.session_state.subjects)
52
  st.write("**Teachers:**", st.session_state.teachers)
53
  st.write("**Rooms:**", st.session_state.rooms)
 
54
 
55
+ # Timetable generation logic
56
+ def generate_timetable(subjects, teachers, rooms, time_slots, days):
57
  model = cp_model.CpModel()
58
  schedule = {}
59
 
60
+ # Create variables for each subject-teacher-room-time-slot combination
61
  for subject, slots in subjects.items():
62
  for teacher in teachers:
63
  for room in rooms:
 
67
  f"{subject}_{teacher}_{room}_{day}_{time_slot}"
68
  )
69
 
70
+ # Constraints: Each subject should have the required number of weekly slots
71
  for subject, slots in subjects.items():
72
  model.Add(
73
  sum(
 
79
  ) == slots
80
  )
81
 
82
+ # Constraints: No teacher or room should be double-booked
83
+ for teacher in teachers:
84
+ for day in days:
85
+ for time_slot in time_slots:
86
+ model.Add(
87
+ sum(
88
+ schedule[(subject, teacher, room, day, time_slot)]
89
+ for subject in subjects
90
+ for room in rooms
91
+ ) <= 1 # A teacher can only be in one class at a time
92
+ )
93
+
94
+ for room in rooms:
95
+ for day in days:
96
+ for time_slot in time_slots:
97
+ model.Add(
98
+ sum(
99
+ schedule[(subject, teacher, room, day, time_slot)]
100
+ for subject in subjects
101
+ for teacher in teachers
102
+ ) <= 1 # A room can only be used for one subject at a time
103
+ )
104
+
105
  # Solve the model
106
  solver = cp_model.CpSolver()
107
  status = solver.Solve(model)
108
 
 
 
 
109
  if status == cp_model.OPTIMAL:
110
  result = []
111
  for key, var in schedule.items():
 
113
  result.append(key)
114
  return result
115
  else:
 
116
  return []
117
 
118
+ # Time slots and days for timetable
119
+ time_slots = [f"{hour}:00 - {hour+1}:00" for hour in range(8, 18)] # 8 AM to 6 PM
120
+ days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
121
+
122
  # Generate timetable button
123
  if st.button("Generate Timetable"):
 
 
124
  timetable = generate_timetable(
125
+ st.session_state.subjects, st.session_state.teachers, st.session_state.rooms, time_slots, days
126
  )
127
  if timetable:
128
+ # Store the generated timetable
129
  for entry in timetable:
130
  subject, teacher, room, day, time_slot = entry
131
  st.session_state.timetable = pd.concat(
 
137
  else:
138
  st.error("Failed to generate timetable. Check constraints!")
139
 
140
+ # Display the generated timetable
141
  st.write("### Generated Timetable")
142
  if not st.session_state.timetable.empty:
143
  st.dataframe(st.session_state.timetable)
 
149
  )
150
  else:
151
  st.write("No timetable generated yet.")