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.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)

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

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)