Skip to content

Commit 281ee86

Browse files
committed
Enhance MGnCalc class with extensibility features for custom queueing systems. Introduce template method pattern for algorithm customization, including hooks for matrix building, iteration logic, and result calculations. Update documentation to reflect new extension points and usage examples.
1 parent 306e3f9 commit 281ee86

6 files changed

Lines changed: 554 additions & 200 deletions

File tree

.cursorrules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Python Virtual Environment
2+
Use `./.venv` for Python interpreter and package management.
3+

docs/calculation.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,93 @@ print_sojourn_moments(sim_results.v, calc_results.v)
295295
- **`EkDnCalc`** — E_k/D/c система
296296
- **`MGnCalc`** — M/G/c система (метод Такахаси-Таками)
297297

298+
## Расширение метода Такахаси-Таками
299+
300+
Класс `MGnCalc` реализует численный метод Такахаси-Таками для расчета многоканальных систем M/G/c. Этот класс спроектирован для легкого расширения, что позволяет создавать кастомные методы расчета для различных типов систем массового обслуживания.
301+
302+
### Архитектура расширяемости
303+
304+
`MGnCalc` использует паттерн Template Method, разделяя алгоритм на переопределяемые хуки:
305+
306+
- **Методы построения матриц** — определяют структуру переходных матриц
307+
- **Хуки итераций** — позволяют кастомизировать логику алгоритма
308+
- **Методы расчета результатов** — настраивают вычисление характеристик системы
309+
310+
### Базовое использование MGnCalc
311+
312+
```python
313+
from most_queue.theory.fifo.mgn_takahasi import MGnCalc
314+
from most_queue.random.distributions import H2Distribution
315+
316+
calc = MGnCalc(n=5) # 5 каналов
317+
calc.set_sources(l=2.0)
318+
319+
h2_params = H2Distribution.get_params_by_mean_and_cv(mean=2.0, cv=1.2)
320+
b = H2Distribution.calc_theory_moments(h2_params, 4)
321+
calc.set_servers(b)
322+
323+
results = calc.run()
324+
```
325+
326+
### Создание кастомного расширения
327+
328+
Для создания собственного калькулятора на основе метода Такахаси-Таками:
329+
330+
1. Наследуйтесь от `MGnCalc`
331+
2. Переопределите методы построения матриц (при необходимости)
332+
3. Переопределите хуки итераций (при необходимости)
333+
4. Переопределите методы расчета результатов (при необходимости)
334+
335+
**Пример:** Добавление отрицательных заявок
336+
337+
```python
338+
from most_queue.theory.fifo.mgn_takahasi import MGnCalc
339+
import numpy as np
340+
341+
class CustomNegativeQueueCalc(MGnCalc):
342+
def __init__(self, n, buffer=None, calc_params=None):
343+
super().__init__(n, buffer, calc_params)
344+
self.l_neg = None # интенсивность отрицательных заявок
345+
346+
def set_sources(self, l_pos, l_neg):
347+
self.l_pos = l_pos
348+
self.l_neg = l_neg
349+
self.l = l_pos # базовая интенсивность
350+
self.is_sources_set = True
351+
352+
def _build_big_d_matrix(self, num):
353+
# Переопределяем D-матрицу для учета отрицательных заявок
354+
base_matrix = super()._build_big_d_matrix(num)
355+
# Добавляем отрицательные заявки к диагональным элементам
356+
for i in range(base_matrix.shape[0]):
357+
base_matrix[i, i] += self.l_neg
358+
return base_matrix
359+
```
360+
361+
### Точки расширения
362+
363+
**Обязательные для переопределения (если меняется структура матриц):**
364+
- `fill_cols()` — определение структуры колонок для каждого уровня
365+
- `_build_big_a_matrix(num)` — матрица переходов вверх (поступления)
366+
- `_build_big_b_matrix(num)` — матрица переходов вниз (обслуживание)
367+
- `_build_big_d_matrix(num)` — диагональные элементы матрицы
368+
369+
**Опциональные для переопределения:**
370+
- `_pre_run_setup()` — подготовка перед основным циклом
371+
- `_update_level_j(j)` — обновление переменных для уровня j
372+
- `_update_level_0()` — обновление уровня 0
373+
- `_calculate_p()` — расчет вероятностей состояний
374+
- `get_results()` — формирование результатов
375+
376+
### Примеры существующих расширений
377+
378+
- **`MGnNegativeRCSCalc`** — система с отрицательными заявками и дисциплиной RCS
379+
- **`MGnNegativeDisasterCalc`** — система с отрицательными заявками (катастрофы)
380+
- **`MH2nH2Warm`** — система с периодами разогрева
381+
- **`MPhNPrty`** — система с приоритетами
382+
383+
Подробную документацию и примеры см. в `most_queue/theory/fifo/takahasi_base.py`.
384+
298385
### Системы с приоритетами
299386

300387
- **`MG1Preemptive`** — M/G/1 с прерываемым приоритетом

0 commit comments

Comments
 (0)