Метод calculate_intents_density()

Stochastic & Risk Generator: Расчет плотности сырых весов интентов с учетом циркадных ритмов

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

Метод calculate_intents_density является математическим базисом расчета поведения цифрового двойника. Он предназначен для вычисления сырых некоррелированных весов для каждого из базовых интентов вектора \(\mathbf{I}\) на текущем такте симуляции t. Метод преобразует физиологическое состояние агента (метаболическое истощение), его психологический профиль (коэффициент тревожности) и циркадные ритмы в многомерный массив числовых весов \(\mathbf{W}(t)\).

2. Математический базис и суточные синусоиды

В основе метода лежит нелинейная стохастическая функция, увязывающая внутренние драйверы двойника с астрономическим временем симуляции. Базовый вес для операции приготовления пищи (\(w_{\text{preparing}}\)) рассчитывается по формуле [3.3]:

\[w_{\text{preparing}}(t) = M_{\text{hunger}}(t) \cdot (1 + F_{\text{night\_owl}} \cdot \sin(\omega t)) \cdot \mathbf{A}_{\text{matrix}, i}\]

Где:

  • \(M_{\text{hunger}}(t) \in [0.0 \dots 1.0]\) — динамический уровень голода агента на такте t [3.3].
  • \(F_{\text{night\_owl}} \in \{0, 1\}\) — бинарный флаг циркадного сдвига («полуночник») [3.3].
  • \(\omega = \frac{2\pi}{24} \approx 0.2617\) — угловая частота моделируемых суток, привязанная к часу sim_hour [3.3].
  • \(\mathbf{A}_{\text{matrix}, i}\) — вектор весовых коэффициентов аффинити текущего агента для целевой группы номенклатур (SKU) [3.3].

Аналогичным образом вычисляются сырые веса для остальных интентов:

  • \(w_{\text{inventory}}\) масштабируется через коэффициент системной тревожности \(H_{\text{anxiety}}\) [3.3].
  • \(w_{\text{consume}}\) напрямую зависит от текущего пика голода и доступности любимых SKU.

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

  • Тип вызова: Синхронный, внутренний, расчетный.
  • Исполнитель: Stochastic & Risk Generator.

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

Параметр Тип данных Обязательный Описание
twin_metrics Dict Да Текущий снапшот вектора состояний двойника из RAM (\(M_{\text{hunger}}\), \(H_{\text{anxiety}}\), \(\mathbf{A}_{\text{matrix}}\)) [3.2, 3.3].
time_context Dict Да Данные виртуального времени: sim_hour (текущий час) и omega (угловая частота) [3.2, 3.3].

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

  • np.ndarray (Float) — плоский вектор сырых числовых весов \(\mathbf{W}(t) = \{w_1, w_2, w_3, w_4\}\) для каждого интента.

4. Схема распределения весов (Mermaid)

graph TD
    A[Входные метрики: Hunger, Anxiety, Time] --> B{Проверка флага F_night_owl}
    B -->|F = 1| C["Гармоника: 1 + sin(omega * t)"]
    B -->|F = 0| D["Гармоника: 1 (Ночная фаза подавлена)"]
    C --> E["w_preparing = Hunger * Гармоника * A_matrix"]
    D --> E
    E --> F[Сборка вектора сырых весов W]

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

import math
import numpy as np

def calculate_intents_density(twin_metrics: dict, time_context: dict) -> np.ndarray:
    """
    Рассчитывает сырые веса интентов на основе 
    метаболизма, привычек и циркадных синусоид.
    """
    m_hunger = twin_metrics["m_hunger"]
    h_anxiety = twin_metrics["h_anxiety"]
    f_night_owl = twin_metrics["f_night_owl"]
    # Берем среднее или пиковое значение вектора аффинити SKU для шага ядра
    a_sku_weight = np.mean(twin_metrics["a_matrix"])
    
    sim_hour = time_context["sim_hour"]
    omega = time_context["omega"]

    # 1. Расчет гармоники циркадного ритма
    circadian_harmonic = 1.0 + f_night_owl * math.sin(omega * sim_hour)
    
    # 2. Вычисление плотности каждого интента
    w_inventory = h_anxiety * 0.5  # Тревожность гонит проверять запасы
    w_preparing = m_hunger * circadian_harmonic * a_sku_weight
    w_consume = m_hunger * 1.2 * a_sku_weight
    w_waste = 0.1 * h_anxiety       # Базовый вес списания
    
    return np.array([w_inventory, w_preparing, w_consume, w_waste], dtype=float)