graph LR
subgraph Бэкенд Приложения [PostgreSQL Business DB]
U1[User: user_id = 001 <br/> ИИН, ФИО, ЭЦП-Хэш]
U2[User: user_id = 002 <br/> ИИН, ФИО, ЭЦП-Хэш]
end
subgraph RAM Симулятора [In-Memory Twin Registry]
Vector1["DT_1: Математический вектор <br/> (user_id=001, h_anxiety, m_hunger)"]
Vector2["DT_2: Математический вектор <br/> (user_id=002, h_anxiety, m_hunger)"]
end
U1 -->|Маппинг при старте| Vector1
U2 -->|Маппинг при старте| Vector2
style U1 fill:#f5f5f5,stroke:#333
style Vector1 fill:#fff5e6,stroke:#fd7e14,stroke-width:2px
In-Memory Twin Registry Service (Реестр состояний)
Инвариант ядра: Высокоскоростное RAM-хранилище математических моделей поведения пользователей
1. Назначение сервиса
In-Memory Twin Registry Service функционирует строго в оперативной памяти хост-машины (In-Memory Topology). В рамках чистой архитектуры «черного ящика» этот сервис больше не дублирует учетные данные бэкенда (паспорта, ИИН, ЭЦП). Он выполняет роль легковесной, высокоскоростной RAM-матрицы, которая хранит исключительно текущие математические, психологические и метаболические состояния агентов, жестко привязанные к реальным user_id существующей базы данных приложения.
2. Математическое описание вектора состояния (Digital Twin)
Вместо дублирования профиля сотрудника, симулятор инициализирует в RAM только математическое расширение пользователя. Каждый цифровой двойник представляет собой вектор динамических признаков, привязанный к первичному ключу бэкенда:
\[\mathbf{DT}_i = \langle \text{user\_id}, \mathbf{A}_{\text{matrix}}, H_{\text{anxiety}}, P_{\text{impulse}}, F_{\text{night\_owl}}, M_{\text{hunger}} \rangle\]
Где:
user_id(UUIDv4) — сквозной идентификатор реального пользователя из PostgreSQL базы данных приложения.- \(\mathbf{A}_{\text{matrix}}\) — локальная матрица приверженности к конкретным номенклатурным позициям (SKU).
- \(H_{\text{anxiety}} \in [1.0 \dots 5.0]\) — коэффициент системной тревожности (драйвер панического поведения).
- \(P_{\text{impulse}} \in [0.0 \dots 1.0]\) — склонность к незапланированным импульсивным действиям.
- \(F_{\text{night\_owl}} \in \{0, 1\}\) — бинарный флаг циркадного сдвига активности в ночные часы.
- \(M_{\text{hunger}} \in [0.0 \dots 1.0]\) — динамический уровень метаболического истощения, непрерывно инкрементируемый макро-оркестратором.
3. Спецификация системных методов
3.1. link_twin_state
- Тип вызова: Синхронный, инициализационный.
- Назначение: Аллокация памяти в RAM для привязки математического вектора состояний к реальному пользователю. Симулятор вычитывает массив
user_idиз базы приложения и навешивает на них стартовые случайные веса (тревожность, голод, аффинити). - Входные параметры:
user_id(UUIDv4) — идентификатор из БД приложения.
3.2. fetch_twin_metrics
- Тип вызова: Высокочастотный, внутренний (RAM-Read).
- Назначение: Моментальное извлечение численных метрик состояния двойника для передачи в Стохастический процессор на такте t.
- Входные параметры:
user_id(UUIDv4). - Выходные данные: Текущие коэффициенты вектора состояний.
3.3. update_twin_runtime_state
- Тип вызова: Атомарный, внутренний (RAM-Write).
- Назначение: Запись мутировавших параметров на такт t+1 после обработки рекурсивной петли обратной связи (Feedback Loop).
- Входные параметры:
user_id(UUIDv4).mutated_fields(dict) — измененные коэффициенты тревожности или деградации аффинити.
3.4. increment_hunger_vector
- Тип вызова: Итеративный, массовый.
- Назначение: Линейный принудительный инкремент параметра \(M_{\text{hunger}}\) для всей матрицы состояний в RAM на каждом такте времени, выступающий базовым драйвером симуляции еды.
4. Схема сквозного маппинга сущностей (Mermaid)
5. Программный прототип реализации (Python)
import numpy as np
from uuid import UUID
from pydantic import BaseModel
class TwinStateVector(BaseModel):
user_id: UUID # Ссылка на реальный ID в БД приложения
h_anxiety: float # Психологическая метрика [1.0 ... 5.0]
p_impulse: float # Склонность к панике [0.0 ... 1.0]
f_night_owl: int # Циркадный флаг
m_hunger: float # Метаболическая метрика
a_matrix: list # Коэффициенты приверженности SKU
class InMemoryTwinRegistry:
def __init__(self):
self._states: dict[UUID, TwinStateVector] = {}
def link_twin_state(self, user_id: UUID, initial_affinity_size: int) -> None:
"""Привязывает чистую математическую модель к существующему юзеру приложения"""
self._states[user_id] = TwinStateVector(
user_id=user_id,
h_anxiety=np.random.uniform(1.0, 2.5),
p_impulse=np.random.uniform(0.1, 0.4),
f_night_owl=np.random.choice([0, 1], p=[0.8, 0.2]),
m_hunger=0.0,
a_matrix=list(np.random.uniform(0.5, 1.0, size=initial_affinity_size))
)
def fetch_twin_metrics(self, user_id: UUID) -> TwinStateVector:
if user_id in self._states:
return self._states[user_id]
raise KeyError(f"Вектор состояний для user_id {user_id} не инициализирован")
def update_twin_runtime_state(self, user_id: UUID, mutated_fields: dict) -> None:
if user_id in self._states:
current_state = self._states[user_id]
self._states[user_id] = current_state.copy(update=mutated_fields)