"""
@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
