|
| 1 | +\section{Взаимодействия и потоки выполнения} |
| 2 | +\label{sec:interactions} |
| 3 | + |
| 4 | +В этом разделе фиксируются ключевые сценарии взаимодействия компонентов вычислительной модели: |
| 5 | +поиск и вычисление характеристик, генерация выборки, политика кэширования и точки расширения. |
| 6 | + |
| 7 | +\subsection{Поток вычисления характеристики} |
| 8 | + |
| 9 | +Запрос целевой характеристики (см. UML на рис.~\ref{fig:uml-computation}) обрабатывается стратегией |
| 10 | +\texttt{ComputationStrategy} по следующему алгоритму: |
| 11 | +\begin{enumerate} |
| 12 | + \item \textbf{Аналитика.} Проверяется наличие \emph{аналитической} реализации \texttt{AnalyticalComputation} |
| 13 | + для требуемого \texttt{target} в экземпляре \texttt{Distribution}. |
| 14 | + \item \textbf{Кэш.} При включённом кэшировании выполняется lookup по ключу, зависящему от: |
| 15 | + (i) идентичности распределения, (ii) имени характеристики, (iii) входных данных и |
| 16 | + (iv) переданных \texttt{**options}. При попадании результат возвращается немедленно. |
| 17 | + \item \textbf{Маршрут.} Если ни аналитики, ни кэша нет, стратегия запрашивает в |
| 18 | + \texttt{DistributionTypeRegister} (рис.~\ref{fig:uml-register}) маршрут |
| 19 | + \texttt{find\_path(source, target)} в графе характеристик для типа данного распределения. |
| 20 | + \item \textbf{Пошаговое вычисление.} По рёбрам маршрута последовательно применяются назначенные |
| 21 | + \texttt{ComputationMethod}-ы. Если для пары узлов определено несколько методов, стратегия может |
| 22 | + выбрать конкретную реализацию на основании \texttt{**options} или внутренних эвристик. |
| 23 | + \item \textbf{Мемоизация.} Итоговое значение сохраняется в кэш согласно политике стратегии и возвращается |
| 24 | + вызывающей стороне. |
| 25 | +\end{enumerate} |
| 26 | + |
| 27 | +Инварианты реестра гарантируют существование маршрутов между \emph{definitive}-узлами |
| 28 | +и отсутствие обратных рёбер из \emph{indefinitive} в \emph{definitive}, что упрощает выбор валидных путей. |
| 29 | + |
| 30 | +\subsection{Опции вычислений (\texorpdfstring{\texttt{**options}}{**options})} |
| 31 | + |
| 32 | +И \texttt{GenericCharacteristic}, и \texttt{ComputationMethod} принимают дополнительные параметры, |
| 33 | +влияющие на вычисление. Пример: инверсия \texttt{cdf}\,$\to$\,\texttt{ppf} с выбором ветви |
| 34 | +\texttt{most\_left}/\texttt{most\_right}. Стратегия \emph{может} проигнорировать часть опций, |
| 35 | +но пользователь вправе подключить свою \texttt{ComputationStrategy}/\texttt{ComputationMethod}, |
| 36 | +которые их учитывают. Для предсказуемости результат должен рассматриваться как функция пары |
| 37 | +(входные данные, опции). |
| 38 | + |
| 39 | +\subsection{Поток генерации выборки} |
| 40 | + |
| 41 | +Генерация выборки делегируется \texttt{SamplingStrategy}: |
| 42 | +\begin{enumerate} |
| 43 | + \item вызывается \texttt{sampling\_strategy.sample(n, distr, **options)}; |
| 44 | + \item стратегия по умолчанию генерирует \texttt{n} равномерных вероятностей и применяет к ним \texttt{ppf} |
| 45 | + данного распределения (см. рис.~\ref{fig:uml-distributions}); |
| 46 | + \item результат помещается в \texttt{ArraySample} (\texttt{NumPy}-совместная обёртка). |
| 47 | +\end{enumerate} |
| 48 | +Стратегию можно переопределить для имитационного моделирования или специализированных процедур |
| 49 | +(например, стратифицированная или квазислучайная выборка). |
| 50 | + |
| 51 | +\subsection{Кэширование: политика и ключи} |
| 52 | + |
| 53 | +Кэширование реализовано внутри \texttt{DefaultComputationStrategy} и прозрачно для клиента. |
| 54 | +Рекомендуется формировать ключ кэша как хеш неизменяемого представления |
| 55 | +\{тип и параметры распределения, целевая характеристика, входные данные, опции, выбранный маршрут/метод\}. |
| 56 | +Такой ключ обеспечивает корректность при наличии альтернативных методов между теми же узлами. |
| 57 | +Иммутабельность экземпляров распределений упрощает инвалидацию: глобальная очистка выполняется только |
| 58 | +при смене стратегии или конфигурации. |
| 59 | + |
| 60 | +\subsection{Точки расширения и совместимость} |
| 61 | + |
| 62 | +Архитектура поддерживает расширение без модификации существующих интерфейсов: |
| 63 | +\begin{itemize} |
| 64 | + \item \textbf{Стратегии.} Замена \texttt{SamplingStrategy} и/или \texttt{ComputationStrategy} |
| 65 | + позволяет настроить маршрутизацию, кэш и интерпретацию \texttt{**options}. |
| 66 | + \item \textbf{Методы.} Добавление новых \texttt{ComputationMethod}/\texttt{FittedComputationMethod} |
| 67 | + вводит альтернативные рёбра графа. Во избежание конфликтов не рекомендуется использовать |
| 68 | + зарезервированное имя \texttt{DEFAULT\_COMPUTATION\_KEY}. |
| 69 | + \item \textbf{Аналитические якоря.} Расширение набора \texttt{AnalyticalComputation} для конкретного |
| 70 | + распределения упрощает и ускоряет вычисления, сокращая длину маршрутов. |
| 71 | + \item \textbf{Реестр.} Операции \texttt{register\_definitive}, \texttt{add\_bidirectional\_conversion}, |
| 72 | + \texttt{add\_conversion} позволяют безопасно наращивать граф с сохранением инвариантов. |
| 73 | +\end{itemize} |
| 74 | + |
| 75 | +\subsection{Ошибки и диагностика} |
| 76 | + |
| 77 | +При нарушении инвариантов реестра (например, попытка зарегистрировать второй исходный definitive-узел в |
| 78 | +пустом графе) выбрасывается исключение конфигурации. Для диагностики полезны: |
| 79 | +\begin{enumerate} |
| 80 | + \item трассировка выбранного маршрута (последовательность узлов и имён методов); |
| 81 | + \item отметка источника результата (аналитика/кэш/маршрут); |
| 82 | + \item контроль версий для пользовательских методов, добавленных в реестр. |
| 83 | +\end{enumerate} |
0 commit comments