Skip to content

Commit 8edd265

Browse files
feat: distributions module
* feat: add distributions and interaction description * feat: add diagrams for components and distributions module * fix: include interaction section --------- Co-authored-by: Desiment <Desiment@yandex.ru>
1 parent 9cf3074 commit 8edd265

File tree

10 files changed

+463
-34
lines changed

10 files changed

+463
-34
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 OPR/121.0.0.0" version="28.2.3">
2+
<diagram name="Components" id="onPuYLIH_O60XCcvVT8Z">
3+
<mxGraphModel dx="1240" dy="573" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
4+
<root>
5+
<mxCell id="0" />
6+
<mxCell id="1" parent="0" />
7+
<mxCell id="vET2vdVNwcwlAcNuBJL--1" value="Distributions" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;whiteSpace=wrap;html=1;" vertex="1" parent="1">
8+
<mxGeometry x="310" y="180" width="140" height="50" as="geometry" />
9+
</mxCell>
10+
<mxCell id="vET2vdVNwcwlAcNuBJL--2" value="ParametricFamilty" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;whiteSpace=wrap;html=1;" vertex="1" parent="1">
11+
<mxGeometry x="170" y="320" width="140" height="50" as="geometry" />
12+
</mxCell>
13+
<mxCell id="vET2vdVNwcwlAcNuBJL--3" value="Transformations" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;whiteSpace=wrap;html=1;" vertex="1" parent="1">
14+
<mxGeometry x="470" y="320" width="140" height="50" as="geometry" />
15+
</mxCell>
16+
<mxCell id="vET2vdVNwcwlAcNuBJL--4" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="vET2vdVNwcwlAcNuBJL--2" target="vET2vdVNwcwlAcNuBJL--1">
17+
<mxGeometry width="160" relative="1" as="geometry">
18+
<mxPoint x="340" y="230" as="sourcePoint" />
19+
<mxPoint x="500" y="230" as="targetPoint" />
20+
</mxGeometry>
21+
</mxCell>
22+
<mxCell id="vET2vdVNwcwlAcNuBJL--6" value="Imoports API" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="vET2vdVNwcwlAcNuBJL--4">
23+
<mxGeometry x="-0.0809" y="1" relative="1" as="geometry">
24+
<mxPoint as="offset" />
25+
</mxGeometry>
26+
</mxCell>
27+
<mxCell id="vET2vdVNwcwlAcNuBJL--7" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="vET2vdVNwcwlAcNuBJL--3" target="vET2vdVNwcwlAcNuBJL--1">
28+
<mxGeometry width="160" relative="1" as="geometry">
29+
<mxPoint x="560" y="360" as="sourcePoint" />
30+
<mxPoint x="700" y="270" as="targetPoint" />
31+
</mxGeometry>
32+
</mxCell>
33+
<mxCell id="vET2vdVNwcwlAcNuBJL--8" value="Imoports API" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="vET2vdVNwcwlAcNuBJL--7">
34+
<mxGeometry x="-0.0809" y="1" relative="1" as="geometry">
35+
<mxPoint as="offset" />
36+
</mxGeometry>
37+
</mxCell>
38+
</root>
39+
</mxGraphModel>
40+
</diagram>
41+
</mxfile>

assets/diagrams/Kernel-Distributions.drawio

Lines changed: 185 additions & 0 deletions
Large diffs are not rendered by default.

assets/images/Computation.png

623 KB
Loading

assets/images/Distrs.png

888 KB
Loading

assets/images/Register.png

391 KB
Loading

core-design-document.pdf

1.25 MB
Binary file not shown.

core-design-document.tex

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,33 @@
1-
\documentclass{designdoc}
2-
\setcounter{secnumdepth}{3}
3-
4-
\usetikzlibrary{babel}
5-
6-
\newmathcommand{\pmf}{f}
7-
\newmathcommand{\pdf}{f}
8-
\newmathcommand{\cdf}{F}
9-
\newmathcommand{\ppf}{\omega}
10-
\newmathcommand{\sdf}{S}
11-
\newmathcommand{\hrdf}{h}
12-
\newmathcommand{\chdf}{H}
13-
\newmathcommand{\MGF}{M}
14-
15-
16-
\title{Архитектурный документ. Ядро PySATL}
17-
\author{Михаил Михайлов, Леонид Елкин}
18-
\date{\today}
19-
20-
\begin{document}
21-
\maketitle
22-
\newpage
23-
\tableofcontents
24-
25-
\input{src/chapter-01}
26-
\input{src/chapter-02}
27-
\input{src/chapter-03}
28-
\input{src/chapter-04}
29-
\input{src/chapter-05}
30-
31-
32-
\printbibliography
33-
\end{document}
1+
\documentclass{designdoc}
2+
\setcounter{secnumdepth}{3}
3+
4+
\usetikzlibrary{babel}
5+
6+
\newmathcommand{\pmf}{f}
7+
\newmathcommand{\pdf}{f}
8+
\newmathcommand{\cdf}{F}
9+
\newmathcommand{\ppf}{\omega}
10+
\newmathcommand{\sdf}{S}
11+
\newmathcommand{\hrdf}{h}
12+
\newmathcommand{\chdf}{H}
13+
\newmathcommand{\MGF}{M}
14+
15+
16+
\title{Архитектурный документ. Ядро PySATL}
17+
\author{Михаил Михайлов, Леонид Елкин}
18+
\date{\today}
19+
20+
\begin{document}
21+
\maketitle
22+
\newpage
23+
\tableofcontents
24+
25+
\input{src/chapter-01}
26+
\input{src/chapter-02}
27+
\input{src/chapter-03}
28+
\input{src/chapter-04}
29+
\input{src/chapter-05}
30+
31+
32+
\printbibliography
33+
\end{document}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
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

Comments
 (0)