# smo_rejection
smo_rejection - это Python-библиотека для симуляции системы массового обслуживания (СМО) с отказами. Библиотека позволяет задавать различные параметры, такие как количество каналов обслуживания, время обслуживания заявок, интенсивность поступления заявок и общее время симуляции. После запуска симуляции библиотека предоставляет результаты, включая количество обслуженных и отклоненных заявок, а также подробную информацию о каждой заявке.


## Установка

Для установки библиотеки smo_rejection через pip, выполните следующую команду:
- `pip install smo_rejection`

## Использование

Для использования библиотеки smo_rejection необходимо импортировать функцию run_simulation из модуля simulation и предоставить необходимые параметры. Вот пример использования:
    ```python
from smo_rejection.simulation import run_simulation

    ### Параметры симуляции
    T = 100.0  # Общее время симуляции
    num_channels = 3  # Количество каналов обслуживания
    service_time = 2.0  # Время обслуживания одной заявки
    num_iterations = 10  # Количество итераций симуляции
    alfa = 5  # Параметр для расчета интервалов между заявками

    ### Запуск симуляции
    results = run_simulation(T, num_channels, service_time, num_iterations, alfa)

    ### Обработка результатов
    for result in results:
        print(f"Итерация {result.iteration}")
        print(f"Обслуженных заявок: {result.served_requests}")
        print(f"Отклоненных заявок: {result.rejected_requests}")
        # Другие операции с результатами```


## Модули и методы
### exception.py
Модуль exception.py содержит определения пользовательских исключений, которые используются в вашей библиотеке для обработки ошибок различных сценариев. Вот краткое описание каждого из них:

- `InvalidInputError`: Исключение, которое выбрасывается при обнаружении недопустимых входных значений.

- `SimulationError`: Исключение, которое возникает в случае ошибок во время симуляции.

- `NumIterationsNegative`: Исключение, выбрасываемое, если количество итераций отрицательно.

- `NumIterationsIsZero`: Исключение, выбрасываемое, если количество итераций равно нулю.

- `NumChannelsNegative`: Исключение, выбрасываемое, если количество каналов отрицательно.

- `NumChannelsIsZero`: Исключение, выбрасываемое, если количество каналов равно нулю.

- `AlphaIsZero`: Исключение, выбрасываемое, если параметр alpha равен нулю.

- `AlphaNegative`: Исключение, выбрасываемое, если параметр alpha отрицательный.

- `ServiceTimeNegative`: Исключение, выбрасываемое, если время обслуживания отрицательное.

- `MaxTimeNegative`: Исключение, выбрасываемое, если максимальное время симуляции отрицательное.

### models.py

Модуль `models.py` содержит определения двух классов, которые используются для организации параметров симуляции и хранения результатов:

1. `SimulationParameters`: Этот класс используется для хранения параметров симуляции. Он содержит следующие атрибуты:
   - `T (float)`: Общее время симуляции.
   - `num_channels (int)`: Количество каналов обслуживания (потоков).
   - `service_time (float)`: Время обслуживания одной заявки.
   - `num_iterations (int)`: Количество итераций симуляции.
   - `alfa (int)`: Параметр для расчета интервалов между заявками.

2. `SimulationResult`: Этот класс используется для хранения результатов симуляции. Он содержит следующие атрибуты:
   - `iteration (int)`: Номер итерации симуляции.
   - `served_requests (int)`: Количество обслуженных заявок.
   - `rejected_requests (int)`: Количество отклоненных заявок.
   - `request_times (list)`: Список, содержащий информацию о каждой заявке, включая время поступления, случайное значение, интервал между заявками, занятость серверов и статус обслуживания.


### pdf_export.py

Модуль `pdf_export.py` предоставляет функцию `export_to_pdf`, которая позволяет экспортировать результаты симуляции в PDF-файл. Для использования этой функции вам необходимо импортировать её из этого модуля.

```python
from pdf_export import export_to_pdf
```

#### Функция `export_to_pdf`

Эта функция принимает два аргумента:

1. `results (list)`: Список результатов симуляции.
2. `filename (str)`: Имя файла для сохранения результатов.

Пример вызова функции:

```python
export_to_pdf(results, "simulation_results.pdf")
```

### Примечание

Для корректной работы модуля требуется установка библиотеки ReportLab. Вы можете установить её с помощью следующей команды:

```bash
pip install reportlab
```
Этот модуль обеспечивает удобный способ сохранения результатов симуляции в формате PDF.


#### Функция `export_to_excel`

Эта функция принимает два аргумента:

1. `results (list)`: Список результатов симуляций, где каждый элемент содержит данные о заявках.
2. `filename (str)`: Имя файла для сохранения Excel-документа.

Пример вызова функции:

```python
export_to_excel(results, "simulation_results.xlsx")
```

### Описание

Функция создает новую рабочую книгу Excel и записывает в нее результаты симуляций. Каждая симуляция начинается с заголовка, содержащего номер симуляции, затем следуют заголовки столбцов и данные о заявках. По завершении каждой симуляции записываются итоговые значения, а также в конце добавляется среднее количество обслуженных заявок по всем симуляциям.

### Примечание

Для корректной работы модуля необходима установка библиотеки `openpyxl`. Вы можете установить ее с помощью следующей команды:

```bash
pip install openpyxl
```
Этот модуль предоставляет удобный способ сохранения результатов симуляции в формате Excel.

### processing.py

Модуль `processing.py` предоставляет функцию `process_iteration`, которая выполняет одну итерацию симуляции обслуживания заявок в системе массового обслуживания (СМО) с отказами.

#### Функция `process_iteration`

Эта функция принимает два аргумента:

1. `params (SimulationParameters)`: Параметры симуляции.
2. `iteration (int)`: Номер текущей итерации.

Возвращает:
`SimulationResult`: Объект, содержащий результаты текущей итерации симуляции.

Описание:
Функция моделирует процесс поступления и обслуживания заявок в системе с несколькими каналами обслуживания (потоками). На каждом шаге времени генерируется случайное значение, на основе которого рассчитывается интервал времени до следующей заявки. Если в момент поступления заявки есть свободный канал обслуживания, заявка обслуживается, иначе она отклоняется. Функция отслеживает время занятости каждого канала обслуживания и статистику обслуженных и отклоненных заявок. Результаты итерации сохраняются в объекте `SimulationResult`, который возвращается функцией.

Для использования этой функции в вашем проекте, вы можете импортировать ее следующим образом:

```python
from .processing import process_iteration
```

Этот модуль обеспечивает моделирование работы СМО с отказами, что позволяет анализировать и оценивать эффективность таких систем.

### simulation.py

Модуль `simulation.py` предоставляет функцию `run_simulation`, которая запускает симуляцию обслуживания заявок с заданными параметрами.

#### Функция `run_simulation`

Эта функция принимает следующие параметры:

- `T (float)`: Общее время симуляции.
- `num_channels (int)`: Количество каналов обслуживания (потоков).
- `service_time (float)`: Время обслуживания одной заявки.
- `num_iterations (int)`: Количество итераций симуляции.
- `alfa (int)`: Параметр для расчета интервалов между заявками.

Возвращает:
`list[SimulationResult]`: Список объектов `SimulationResult`, содержащих результаты каждой итерации симуляции.

Исключения:
- `MaxTimeNegative`: Если `T` меньше или равно нулю.
- `NumChannelsNegative`: Если `num_channels` меньше или равно нулю.
- `NumChannelsIsZero`: Если `num_channels` равно нулю.
- `ServiceTimeNegative`: Если `service_time` меньше или равно нулю.
- `NumIterationsNegative`: Если `num_iterations` меньше нуля.
- `NumIterationsIsZero`: Если `num_iterations` равно нулю.
- `AlphaNegative`: Если `alfa` меньше нуля.
- `AlphaIsZero`: Если `alfa` равно нулю.

Описание:
Функция выполняет следующие действия:
1. Проверяет корректность входных параметров и выбрасывает соответствующее исключение в случае некорректных значений.
2. Создает объект `SimulationParameters` с заданными параметрами.
3. Запускает цикл по количеству итераций, на каждой итерации вызывая функцию `process_iteration` и сохраняя ее результат.
4. Возвращает список объектов `SimulationResult`, содержащих результаты каждой итерации симуляции.

Для использования этой функции в вашем проекте, вы можете импортировать ее следующим образом:

```python
from .simulation import run_simulation
```

Этот модуль предоставляет удобный способ запуска симуляции обслуживания заявок с заданными параметрами.

### utils.py

Модуль `utils.py` содержит несколько вспомогательных функций, используемых в процессе симуляции.

#### Функция `round_value`

Эта функция округляет заданное число до 4 знаков после запятой.

**Параметры:**
- `number (float)`: Число, которое нужно округлить.

**Возвращаемое значение:**
- `float`: Округленное число с 4 знаками после запятой.

#### Функция `generate_random_number`

Эта функция генерирует случайное число в диапазоне (0, 1] с округлением до 4 знаков после запятой.

**Возвращаемое значение:**
- `float`: Случайное число в диапазоне (0, 1] с 4 знаками после запятой.

#### Функция `calculate_time`

Эта функция возвращает время между двумя последовательными заявками.

**Параметры:**
- `alfa (int)`: Параметр для расчета интервалов между заявками.
- `number (float)`: Случайное число, использованное для расчета интервала.

**Возвращаемое значение:**
- `float`: Время между двумя последовательными заявками с 4 знаками после запятой.

#### Функция `calculate_mean_served_requests`

Эта функция вычисляет среднее количество обслуженных заявок по результатам симуляции.

**Параметры:**
- `results (list[SimulationResult])`: Список объектов `SimulationResult`, содержащих результаты каждой итерации симуляции.

**Возвращаемое значение:**
- `float`: Среднее количество обслуженных заявок с 4 знаками после запятой.

Эти функции обеспечивают необходимые вычисления и операции для успешного проведения симуляции.