Метод link_twin_state()

In-Memory Twin Registry: Первичный маппинг математических моделей на идентификаторы СУБД

1. Функциональное назначение

Метод link_twin_state выполняется на этапе инициализации симуляционного полигона (Фаза 0: Однократная инициализация сессии). Он предназначен для динамического связывания чистой математической модели поведения (вектора признаков) с уникальными сквозными идентификаторами реальных пользователей (user_id), извлеченными из PostgreSQL базы данных приложения. Метод производит первичную аллокацию оперативной памяти хост-машины под In-Memory структуру сессии.

2. Математический базис и распределение начальных весов

Метод инициализирует для каждого импортированного user_id многомерный вектор начального состояния:

\[\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\]

Для того чтобы цифровой след не был однородным, метод использует генератор псевдослучайных чисел для распределения начальных психологических и поведенческих весов внутри заданных интервалов:

  • Коэффициент системной тревожности: \(H_{\text{anxiety}} \sim U(1.0, 2.5)\) (Равномерное распределение)
  • Склонность к импульсивным закупкам: \(P_{\text{impulse}} \sim U(0.1, 0.4)\)
  • Циркадный флаг «полуночника»: \(F_{\text{night\_owl}} \sim \text{Bernoulli}(p=0.2)\) (С вероятностью 20% агент становится ночным актором)
  • Начальный уровень метаболического истощения: \(M_{\text{hunger}} = 0.0\) (Константа на старте)

3. Спецификация метода (ИТ-контракт)

  • Тип вызова: Синхронный, блокирующий (вызывается оркестратором на Фазе 0).
  • Исполнитель: In-Memory Twin Registry Service.

3.1. Входные параметры (Аргументы вызова)

Параметр Тип данных Обязательный Описание
user_id UUIDv4 Да Реальный идентификатор пользователя, извлеченный из СУБД бэкенда.
initial_affinity_size Integer Да Размерность вектора номенклатурных позиций (SKU) для генерации стартовых весов приверженности.

3.2. Выходные данные (Возвращаемое значение)

  • void — метод производит запись объекта TwinStateVector непосредственно в RAM-структуру реестра (In-Memory Dictionary).

4. Схема инициализационного маппинга (Mermaid)

sequenceDiagram
    autonumber
    participant Core as 🧠 Core Orchestrator
    participant DB as 💾 PostgreSQL DB
    participant Registry as 👥 Twin Registry (RAM)
    
    Core->>DB: SELECT user_id FROM users WHERE is_active=TRUE
    DB-->>Core: Массив активных UUID
    
    loop Для каждого полученного user_id
        Core->>Registry: link_twin_state(user_id, initial_affinity_size=100)
        Note over Registry: Генерация случайных весов H_anxiety, P_impulse, A_matrix
        Registry->>Registry: Аллокация памяти: _states[user_id] = TwinStateVector
    end
    Note over Core, Registry: Фаза 0 завершена. RAM-структура готова к рантайм-циклу

5. Программная реализация метода на Python

import numpy as np
from uuid import UUID
from pydantic import BaseModel

class TwinStateVector(BaseModel):
    user_id: UUID
    h_anxiety: float
    p_impulse: float
    f_night_owl: int
    m_hunger: float
    a_matrix: list

class InMemoryTwinRegistryLinker:
    def __init__(self):
        # Изолированное RAM-хранилище векторов состояний
        self._states: dict[UUID, TwinStateVector] = {}

    def link_twin_state(self, user_id: UUID, initial_affinity_size: int) -> None:
        """
        Создает чистую математическую надстройку над 
        реальным user_id без дублирования его паспорта или ИИН.
        """
        if user_id in self._states:
            return  # Предотвращение коллизий повторной инициализации
            
        # Генерация стартовых стохастических параметров поведения
        initial_vector = TwinStateVector(
            user_id=user_id,
            h_anxiety=float(np.random.uniform(1.0, 2.5)),
            p_impulse=float(np.random.uniform(0.1, 0.4)),
            f_night_owl=int(np.random.choice([0, 1], p=[0.8, 0.2])),
            m_hunger=0.0,
            # Равномерное распределение приверженности к SKU из каталога
            a_matrix=list(np.random.uniform(0.5, 1.0, size=initial_affinity_size))
        )
        
        # Запись в оперативную память
        self._states[user_id] = initial_vector