""" @generated by mypy-protobuf. Do not edit manually! isort:skip_file Copyright 2010-2025 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. """ import builtins import collections.abc import google.protobuf.descriptor import google.protobuf.internal.containers import google.protobuf.internal.enum_type_wrapper import google.protobuf.message import sys import typing if sys.version_info >= (3, 10): import typing as typing_extensions else: import typing_extensions DESCRIPTOR: google.protobuf.descriptor.FileDescriptor class _CourseSchedulingResultStatus: ValueType = typing.NewType("ValueType", builtins.int) V: typing_extensions.TypeAlias = ValueType class _CourseSchedulingResultStatusEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_CourseSchedulingResultStatus.ValueType], builtins.type): DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor COURSE_SCHEDULING_RESULT_STATUS_UNSPECIFIED: _CourseSchedulingResultStatus.ValueType # 0 SOLVER_FEASIBLE: _CourseSchedulingResultStatus.ValueType # 1 """The solver had enough time to find some solution that satisfies all constraints, but it did not prove optimality (which means it may or may not have reached the optimal). This can happen for large LP models (linear programming), and is a frequent response for time-limited MIPs (mixed integer programming). This is also what the CP (constraint programming) solver will return if there is no objective specified. """ SOLVER_OPTIMAL: _CourseSchedulingResultStatus.ValueType # 2 """The solver found the proven optimal solution.""" SOLVER_INFEASIBLE: _CourseSchedulingResultStatus.ValueType # 3 """The model does not have any solution, according to the solver (which "proved" it, with the caveat that numerical proofs aren't actual proofs), or based on trivial considerations (eg. a variable whose lower bound is strictly greater than its upper bound). """ SOLVER_MODEL_INVALID: _CourseSchedulingResultStatus.ValueType # 4 """Model errors. These are always deterministic and repeatable. They should be accompanied with a string description of the error. """ SOLVER_NOT_SOLVED: _CourseSchedulingResultStatus.ValueType # 5 """The model has not been solved in the given time or the solver was not able to solve the model given. """ ABNORMAL: _CourseSchedulingResultStatus.ValueType # 6 """An error (either numerical or from a bug in the code) occurred.""" class CourseSchedulingResultStatus(_CourseSchedulingResultStatus, metaclass=_CourseSchedulingResultStatusEnumTypeWrapper): """Status returned by the solver.""" COURSE_SCHEDULING_RESULT_STATUS_UNSPECIFIED: CourseSchedulingResultStatus.ValueType # 0 SOLVER_FEASIBLE: CourseSchedulingResultStatus.ValueType # 1 """The solver had enough time to find some solution that satisfies all constraints, but it did not prove optimality (which means it may or may not have reached the optimal). This can happen for large LP models (linear programming), and is a frequent response for time-limited MIPs (mixed integer programming). This is also what the CP (constraint programming) solver will return if there is no objective specified. """ SOLVER_OPTIMAL: CourseSchedulingResultStatus.ValueType # 2 """The solver found the proven optimal solution.""" SOLVER_INFEASIBLE: CourseSchedulingResultStatus.ValueType # 3 """The model does not have any solution, according to the solver (which "proved" it, with the caveat that numerical proofs aren't actual proofs), or based on trivial considerations (eg. a variable whose lower bound is strictly greater than its upper bound). """ SOLVER_MODEL_INVALID: CourseSchedulingResultStatus.ValueType # 4 """Model errors. These are always deterministic and repeatable. They should be accompanied with a string description of the error. """ SOLVER_NOT_SOLVED: CourseSchedulingResultStatus.ValueType # 5 """The model has not been solved in the given time or the solver was not able to solve the model given. """ ABNORMAL: CourseSchedulingResultStatus.ValueType # 6 """An error (either numerical or from a bug in the code) occurred.""" Global___CourseSchedulingResultStatus: typing_extensions.TypeAlias = CourseSchedulingResultStatus @typing.final class CourseSchedulingModel(google.protobuf.message.Message): """Information required to create a schedule for a school system.""" DESCRIPTOR: google.protobuf.descriptor.Descriptor DISPLAY_NAME_FIELD_NUMBER: builtins.int DAYS_COUNT_FIELD_NUMBER: builtins.int DAILY_TIME_SLOT_COUNT_FIELD_NUMBER: builtins.int COURSES_FIELD_NUMBER: builtins.int TEACHERS_FIELD_NUMBER: builtins.int STUDENTS_FIELD_NUMBER: builtins.int ROOMS_FIELD_NUMBER: builtins.int display_name: builtins.str """Schedule name, used only for logging purposes.""" days_count: builtins.int """The number of days in a schedule rotation. If the school system uses a block schedule, this value should be 1. """ daily_time_slot_count: builtins.int """The number of time slots each day in a schedule rotation. If the school system uses a block schedule, this value is the number of blocks. """ @property def courses(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___Course]: """List of courses that need to be scheduled.""" @property def teachers(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___Teacher]: """List of teachers.""" @property def students(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___Student]: """List of students that need to be assigned to these courses.""" @property def rooms(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___Room]: """List of rooms that the courses can be assigned to.""" def __init__( self, *, display_name: builtins.str = ..., days_count: builtins.int = ..., daily_time_slot_count: builtins.int = ..., courses: collections.abc.Iterable[Global___Course] | None = ..., teachers: collections.abc.Iterable[Global___Teacher] | None = ..., students: collections.abc.Iterable[Global___Student] | None = ..., rooms: collections.abc.Iterable[Global___Room] | None = ..., ) -> None: ... _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["courses", b"courses", "daily_time_slot_count", b"daily_time_slot_count", "days_count", b"days_count", "display_name", b"display_name", "rooms", b"rooms", "students", b"students", "teachers", b"teachers"] def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___CourseSchedulingModel: typing_extensions.TypeAlias = CourseSchedulingModel @typing.final class CourseSchedulingResult(google.protobuf.message.Message): """Holds the solution to the course scheduling problem.""" DESCRIPTOR: google.protobuf.descriptor.Descriptor MESSAGE_FIELD_NUMBER: builtins.int SOLVER_STATUS_FIELD_NUMBER: builtins.int CLASS_ASSIGNMENTS_FIELD_NUMBER: builtins.int STUDENT_ASSIGNMENTS_FIELD_NUMBER: builtins.int message: builtins.str """Human readable message about the solver or given model.""" solver_status: Global___CourseSchedulingResultStatus.ValueType """Status of the solver.""" @property def class_assignments(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___ClassAssignment]: """List of the time slot and room assignments for each section of a course.""" @property def student_assignments(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___StudentAssignment]: """List of course and section assignments for each student.""" def __init__( self, *, message: builtins.str = ..., solver_status: Global___CourseSchedulingResultStatus.ValueType = ..., class_assignments: collections.abc.Iterable[Global___ClassAssignment] | None = ..., student_assignments: collections.abc.Iterable[Global___StudentAssignment] | None = ..., ) -> None: ... _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["class_assignments", b"class_assignments", "message", b"message", "solver_status", b"solver_status", "student_assignments", b"student_assignments"] def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___CourseSchedulingResult: typing_extensions.TypeAlias = CourseSchedulingResult @typing.final class ClassAssignment(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor COURSE_INDEX_FIELD_NUMBER: builtins.int SECTION_NUMBER_FIELD_NUMBER: builtins.int TIME_SLOTS_FIELD_NUMBER: builtins.int ROOM_INDICES_FIELD_NUMBER: builtins.int course_index: builtins.int """Index of the course in the CourseSchedulingModel.""" section_number: builtins.int """Specific section of the course in the CourseSchedulingModel.""" @property def time_slots(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: """Time slots that this class has been assigned to in the CourseSchedulingModel. """ @property def room_indices(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: """Indices of the rooms that the class is assigned to in the CourseSchedulingModel. If this is not empty, then the number of indices must match the number of time slots. """ def __init__( self, *, course_index: builtins.int = ..., section_number: builtins.int = ..., time_slots: collections.abc.Iterable[builtins.int] | None = ..., room_indices: collections.abc.Iterable[builtins.int] | None = ..., ) -> None: ... _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["course_index", b"course_index", "room_indices", b"room_indices", "section_number", b"section_number", "time_slots", b"time_slots"] def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___ClassAssignment: typing_extensions.TypeAlias = ClassAssignment @typing.final class StudentAssignment(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor STUDENT_INDEX_FIELD_NUMBER: builtins.int COURSE_INDICES_FIELD_NUMBER: builtins.int SECTION_INDICES_FIELD_NUMBER: builtins.int student_index: builtins.int """Index of the student in the CourseSchedulingModel.""" @property def course_indices(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: """Course indices in the CourseSchedulingModel that this student has been assigned to. The number of indices must match the number of section indices. """ @property def section_indices(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: """Section indices for each Course in the CourseSchedulingModel this this student has been assigned to. The number of indices must match the number of course indices. """ def __init__( self, *, student_index: builtins.int = ..., course_indices: collections.abc.Iterable[builtins.int] | None = ..., section_indices: collections.abc.Iterable[builtins.int] | None = ..., ) -> None: ... _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["course_indices", b"course_indices", "section_indices", b"section_indices", "student_index", b"student_index"] def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___StudentAssignment: typing_extensions.TypeAlias = StudentAssignment @typing.final class Course(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor DISPLAY_NAME_FIELD_NUMBER: builtins.int MEETINGS_COUNT_FIELD_NUMBER: builtins.int MAX_CAPACITY_FIELD_NUMBER: builtins.int MIN_CAPACITY_FIELD_NUMBER: builtins.int CONSECUTIVE_SLOTS_COUNT_FIELD_NUMBER: builtins.int TEACHER_INDICES_FIELD_NUMBER: builtins.int TEACHER_SECTION_COUNTS_FIELD_NUMBER: builtins.int ROOM_INDICES_FIELD_NUMBER: builtins.int display_name: builtins.str """Course name, used only for logging purposes.""" meetings_count: builtins.int """The number of times each section of this course needs to meet during a schedule rotation. Each section of the course meets no more than once a day. If the school system uses a block schedule, then this value should be 1. """ max_capacity: builtins.int """The maximum number of students for this course. This value can be equal to +Infinity to encode a course has no maximum capacity. """ min_capacity: builtins.int """The minimum number of students for this course.""" consecutive_slots_count: builtins.int """The number of consecutive time slots that each section of this course needs to be scheduled for. This value can only be 1 or 2. If the value is 2, then 2 consecutive time slots in a day counts as 1 meeting time for the section. """ @property def teacher_indices(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: """List of indices for the teachers of this course. We are assuming that each teacher teaches separately. Must have the same number of elements as the number of sections list. """ @property def teacher_section_counts(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: """The number of sections each teacher teaches of this course. Must have the same number of elements as the teacher index list. """ @property def room_indices(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: """List of the possible rooms that this course can be assigned to. This can be empty. """ def __init__( self, *, display_name: builtins.str = ..., meetings_count: builtins.int = ..., max_capacity: builtins.int = ..., min_capacity: builtins.int = ..., consecutive_slots_count: builtins.int = ..., teacher_indices: collections.abc.Iterable[builtins.int] | None = ..., teacher_section_counts: collections.abc.Iterable[builtins.int] | None = ..., room_indices: collections.abc.Iterable[builtins.int] | None = ..., ) -> None: ... _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["consecutive_slots_count", b"consecutive_slots_count", "display_name", b"display_name", "max_capacity", b"max_capacity", "meetings_count", b"meetings_count", "min_capacity", b"min_capacity", "room_indices", b"room_indices", "teacher_indices", b"teacher_indices", "teacher_section_counts", b"teacher_section_counts"] def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Course: typing_extensions.TypeAlias = Course @typing.final class Teacher(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor DISPLAY_NAME_FIELD_NUMBER: builtins.int RESTRICTED_TIME_SLOTS_FIELD_NUMBER: builtins.int display_name: builtins.str """Teacher name, used only for logging purposes.""" @property def restricted_time_slots(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: """List of time slots that the teacher cannot be scheduled for. These time slot values index to the accumulative number of time slots starting at 0. For example, if a schedule rotation has 5 days and 8 time slots per day, and a teacher cannot be scheduled for the last time slot of the fourth day, the number here would be 31. """ def __init__( self, *, display_name: builtins.str = ..., restricted_time_slots: collections.abc.Iterable[builtins.int] | None = ..., ) -> None: ... _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["display_name", b"display_name", "restricted_time_slots", b"restricted_time_slots"] def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Teacher: typing_extensions.TypeAlias = Teacher @typing.final class Student(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor DISPLAY_NAME_FIELD_NUMBER: builtins.int COURSE_INDICES_FIELD_NUMBER: builtins.int display_name: builtins.str """Student name, used only for logging purposes.""" @property def course_indices(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: """List of course indices that the student needs to be enrolled in.""" def __init__( self, *, display_name: builtins.str = ..., course_indices: collections.abc.Iterable[builtins.int] | None = ..., ) -> None: ... _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["course_indices", b"course_indices", "display_name", b"display_name"] def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Student: typing_extensions.TypeAlias = Student @typing.final class Room(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor DISPLAY_NAME_FIELD_NUMBER: builtins.int CAPACITY_FIELD_NUMBER: builtins.int display_name: builtins.str """Room name, used only for logging purposes.""" capacity: builtins.int """Maximum number of students that can fit into this room.""" def __init__( self, *, display_name: builtins.str = ..., capacity: builtins.int = ..., ) -> None: ... _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["capacity", b"capacity", "display_name", b"display_name"] def ClearField(self, field_name: _ClearFieldArgType) -> None: ... Global___Room: typing_extensions.TypeAlias = Room