Skip to content

Latest commit

 

History

History
310 lines (235 loc) · 22.4 KB

File metadata and controls

310 lines (235 loc) · 22.4 KB

Теория: математический аппарат POLER

Статус: консолидация математики, разбросанной по коду, README и 299 первоисточникам архива docs/sources-archive/. История возникновения идей — в HISTORY.md; реализация — в MODULES.md.

Этот документ отвечает на вопрос «почему движок устроен так, а не иначе». Каждая формула здесь либо реализована в коде (указан файл), либо является утверждённой стратегией плана v2.0 (указан раздел PLAN_POLER_V2.md).


1. Онтология: текст как физическая система

Базовая онтология POLER: текст — динамическая система, стремящаяся к состоянию когнитивного покоя. Информационная свободная энергия текста минимизируется, когда «внутренняя модель» (латентный вектор смысла p) согласована с «наблюдением» (реальными употреблениями слов o). Эта рамка — прямое применение принципа свободной энергии Фристона (FEP) к информационному поиску: поиск трактуется как минимизация удивления между запросом и корпусом.

Из онтологии следуют три инженерных решения:

  1. Ранжирование — не «скор похожести», а плотность энергии: как сильно концентрируется смысл вокруг запроса (ε-плотность, §2).
  2. Время в документе — не позиция, а резонанс: отклик прошлых вхождений на текущее (IIR-фильтр R(t), §3).
  3. Локальность смысла — сцена: отрезок, внутри которого лексический состав статистически однороден (§2.3).

Важно: движок не понимает контент. Он измеряет физические величины плотности/резонанса и отдаёт их агенту. Это тезис «инструмент, не ИИ» (research/dialogue_tool_vs_ai.md): интерпретация принадлежит наблюдателю.

2. ε-плотность — энергетическая функция ранжирования

2.1. Определение

Для запроса Q и документа d с терм-частотами tf(t, d):

n_t    — число вхождений терма t в d
L      — длина d в токенах
p(t|d) = n_t / L                    — эмпирическая вероятность
p(t|Q) — распределение запроса (нормированные веса термов)

        Σ_t p(t|Q) · log(1 + n_t)          — «масса» попадания
ε(Q,d)= ─────────────────────────────
          log(1 + L)^(φ)                    — «объём» прослушивания

Числитель — сколько смысловой массы запроса осело в документе (логарифм смягчает повторные вхождения: 10-е упоминание имени не в 10 раз важнее первого). Знаменатель — штраф объёма со показателем φ (CLI --phi, дефолт см. main.rs): длинный документ обязан иметь пропорционально более высокую массу, чтобы набрать ту же плотность. Это естественно порождает BM25-подобное насыщение без эмпирических k1/b.

2.2. Почему плотность, а не косинус/BM25

BM25 оценивает «насколько документ хорош под запрос» — скаляр релевантности. ε оценивает концентрацию: два документа с одинаковой массой, но разной длиной получают разную плотность, и короткий «резонансный» документ выигрывает. Практически это то, что нужно агенту: найти место, где смысл запроса сжат, а не размазан. Симметричное свойство: ε инвариантна к дублированию документа только до φ=1; при φ<1 (по умолчанию) документ-дубль теряет плотность — самодедупликация без SimHash.

2.3. Сцены — сегменты однородной плотности

Проход 2 (streaming.rs) разбивает документ на сцены: границы ставятся там, где состав активной лексики меняется скачком (скользящее окно, порог расхождения распределений). Сцена — атом контекста для -w/--window и для последующего графа сущностей: связи считаются между сценами, а не между целыми файлами (глава книги ≠ абзац). Выходной контракт несёт SceneInfo с byte-диапазоном — агент цитирует сцену, а не «файл».

2.4. Инвариант представлений

resonance::calculate_epsilon — generic по трейту TermFreqs. Один и тот же результат (побитово) получается из: RAM HashMap, FSST-сжатого словаря корпуса, per-файлового lz4-представления. Сжатие (компрессия 4.1×/26×) не имеет права менять метрику — это тестируется дифференциалом (compression/tests, «ε побитово совпадает между представлениями»).

3. Резонанс R(t) — темпоральная память вхождений

3.1. Формула

Вхождение терма в момент t — не событие, а импульс, отклик на который звонит (затухает) вперёд по документу:

R(t) = ρ · R(t−1) + α · x(t)

где x(t) ∈ {0,1} — вхождение терма, ρ ∈ (0,1) — коэффициент удержания (CLI --kappa связан с окном удержания), α — усиление свежего вхождения. Это БИХ-фильтр первого порядка — цифровой аналог RC-цепи; непрерывный предел — свёртка с экспонентой:

R(t) = α · Σ_{τ≤t} e^{−ρ(t−τ)} · x(τ)   ≈   интеграл Планка P[n]

3.2. Режимы резонанса

CLI --resonance-mode выбирает, что считать «энергией» терма:

Режим Формула Интерпретация
hits Σ x(t) классический tf (резонанс выключен)
field Σ R(t)·x(t) поле: вхождение в «нагретом» контексте весит больше
psi поле + нелинейный потенциал Ψ см. §5, внимание как волна
poler канонический POLER-цикл см. §6 — полный контур с диссипацией

Практический смысл: field выделяет кластеры повторных упоминаний («персонаж активен в этой главе»), hits — точную фактику, psi/poler — долгую связность повествования.

3.3. Почему IIR, а не окно

Скользящее окно — прямоугольная память: вхождение за границей исчезает скачком, границы артефактны. Экспоненциальное затухание гладко, O(1) на событие (никакой памяти истории, кроме одного аккумулятора) и имеет физическую интерпретацию следа (trace). Для потоковых watcher-прогонов (--watch) это единственно приемлемая сложность.

3.4. Наследие и будущее

R(t) — прямая материализация «эха R[n]» из теории POLER[Ψ] ( HISTORY.md §2) с ρ=0.9. Запланированное расширение — IIR-Resonance Fusion (PLAN v2.0 Шаг 5): слияние 4 сигналов — Lexical (ε), Dense (RaBitQ), Sparse (SPLADE, план), Graph (K-hop) — в единое топографическое ранжирование через композицию резонансных полей. Это уникальная инновация проекта: ни один гибридный поисковик не строит слияние на физике затухающих колебаний.

4. Векторный субстрат: RaBitQ

4.1. Кодирование

Вектор v ∈ R^d центрируется и нормируется, затем подвергается рандомизированному ортогональному вращению Адамара (быстрое преобразование Уолша-Адамара, детерминированное по seed из заголовка PRBQ):

u = H·(v − μ)/‖v − μ‖          — вращение «разбеливает» координаты
b_i = sign(u_i)                 — 1 бит на координату

Скаляры на вектор: μ (центр), δ (масштаб), γ (норма). Восстановление невозможно (1 бит), но оценка скалярного произведения возможна.

4.2. Оценки

  • Symmetric (sym): обе стороны закодированы; оценка через popcount XOR кодов, поправка arcsin — несмещённая оценка угла (MLE).
  • Asymmetric (ADC): запрос полный (f32), база закодирована; центрированная несмещённая оценка через γ и δ.

Плотность 768-d: 144 Б против 3072 Б fp32 = 21.3× (по кодам — 24×). Скорость скана кодов — 8.4 ГБ/с (AVX2 popcnt).

4.3. Честность о качестве

На гауссовой синтетике recall@10 против fp32: sym 0.611, ADC 0.633. Это физика 1-бита (вращение давит и сигнал, и шум одинаково внутри кластера), а не дефект графа: HNSW над кодами достигает 0.633 = 100% потолка оценщика ADC (gate-тест: HNSW vs brute-ADC ≥ 0.90). Реальные эмбеддинги BGE-M3 дают 0.85–0.98 по литературе; переранжирование fp32-сайдкаром — план Шага 5. Инвариант качества разделён по слоям: субстрат отвечает «не потерять ни одного кандидата относительно своей оценки», модель отвечает за саму оценку.

4.4. HNSW над кодами

Полер-нативный HNSW (vectors/hnsw.rs) хранит граф указателей между слотами хранилища; детерминированная сборка (BTreeSet кандидатов) — побитово воспроизводимые индексы. mmap-хранилище (PRBQ, formats/PRBQ_FORMAT.md) подгружает страницы кодов по касанию: на 1B векторов RAM занимает только рабочий набор.

5. POLER[Ψ] — поле внимания

psi.rs. Ψ — фазовая надстройка над лексическим слоем: терм-частоты порождают «волну внимания», которая распространяется по документу и интерферирует с резонансом R(t). Параметры (CLI --psi-eta/--psi-gamma/ --psi-rho/--psi-depth) управляют: скоростью фазы, связностью волны, затуханием и глубиной распространения. ResonanceMemory — кольцевой буфер последних N состояний поля: режим Observer, в котором движок «помнит», какие зоны документа уже были в фокусе — фундамент для интерактивных сессий чтения (reader/).

Философский исток — «замкнутая» версия цикла POLER с фазой Интенции Ψ и принципом ĤΨ = 0 (гамильтониан замкнутой системы равен нулю — «время возникает только у наблюдателя»). В движке эта философия прагматична: поле Ψ определено только относительно наблюдателя-запроса, у документа нет «истинного смысла» без того, кто смотрит.

6. Канонический POLER-цикл

poler.rs — порт продакшн-цикла P3_Engine (математика — HISTORY.md §2, каноническое уравнение). В движке цикл редуцирован до измеримого ядра:

dp/dt = −η · Π [ D·p + γ·J(p)·p + ∇F(p,o) ]
  • p — вектор состояния термов (частоты, нормированные резонансом);
  • D — диссипатор (диагональный, затухание шумовых термов — «гравитация»);
  • J = A − Aᵀ — кососимметричный оператор циркуляции (вращение без потери энергии: туннелирование через локальные максимумы ε);
  • Π — проектор на допустимое многообразие (idf-ограничение: частоты не могут выйти из корпуса);
  • F — свободная энергия рассогласования p с наблюдением o (запросом).

CORDIC-реализация cordic_inv_sqrt — итеративный обратный корень без FPU-деления (наследие embedded-происхождения цикла). Параметры CLI: --poler-eta/--poler-gamma/--poler-mix/--poler-dissipator.

7. Сжатие: FSST и словарь корпуса

FSST (Fast Static Symbol Table) — компрессия коротких строк (лексем) таблицей из 256 символьных пар. Порт на чистый Rust (compression/fsst.rs) с compress-probe лукапами (вероятностный выбор лучшей пары) и побитово-детерминированной сериализацией таблицы (BTreeSet вместо HashMap: одинаковый вход → одинаковые байты на любой платформе).

VocabArena — словарь корпуса: все уникальные термы лежат одной ареной байтов, терм = (offset, len). Плотность 4.1× против HashMap<String, u32>; пер-файловые словари как ID-пары дают 8×. Постинги паркованы lz4 (декод микросекунды), doc store — zstd (26×). Инвариант — §2.4: TermFreqs поверх всего этого даёт побитово ту же ε.

8. Точный слой: Teddy SIMD

Teddy — предфильтр множественного точного сопоставления (из движка ripgrep/Тeddy-семейства): строка сканируется 16-байтовыми кусками; для каждой позиции «якорного байта» pshufb-таблица даёт маску кандидатов; совпадение подтверждается memcmp. Наш порт (retrieval/teddy.rs):

  • адаптивные якоря (выбор позиций по дискриминативности на корпусе) — кириллица не вырождается в один якорь;
  • быстрый фолд кириллицы (Е→Е латинская и т.п.) до построения таблиц;
  • семантика LeftmostLongest, дифференциально проверена против aho-corasick (все совпадения, тот же порядок).

Скорость: ASCII 2.7× быстрее AC, кириллица 2.15×. Teddy — слой 0 для grep-режима: фильтр «где вообще может быть совпадение», затем точная проверка. Гарантия полноты — parity-тесты с GNU grep (exit-коды 0/1/2, флаги -A/-B/-c/-l/-L, byte-offsets в --grep-json).

9. Квантово-фазовое ядро и Trit5

src/quantum/ — мост к POLER-Quantum-RS (см. quantum-eri.md). Здесь — только математика носителя.

Trit5: 5 тритов в байте, B = t₀ + 3t₁ + 9t₂ + 27t₃ + 81t₄ (3⁵ = 243 ≤ 256). Весовой элемент ∈ {−1, 0, +1} → 1.6 бит/параметр. Скалярное произведение вектора тритов на вход — без умножений: только знаковые сложения и инверсии (AVX2/AVX-512). Порог тернаризации 1.2125·mean|w| даёт плотность ⅓ нулей (совпадает с теоретическим оптимумом для гауссовых весов).

Русла циркуляции J = A − Aᵀ: из весов модели (W_q, W_k, dense) строится кососимметричный оператор — «энергетическое эхо» (автокорреляция истории состояний). Анзац R_y(arccos p) переводит вероятности в фазы на сфере Блоха; Born-лотерея — сэмплирование из |ψ|². Это ядро L5-генератора (QuantumMind) — экспериментальная альтернатива softmax-декодеру.

10. Алгебра смысла (теоретический фундамент)

Для полноты — алгебра, из которой выросли ε, R(t), J и триты (полная версия: sources-archive файлы 29, 59–61, 144; краткая — algebra_of_sense_trit5.md).

Алгебра A = (O, ⊕, ⊗_ε): O — множество смысловых элементов, ⊕ — сложение (в GF(2ⁿ) — XOR), ⊗_ε — деформированное тензорное произведение:

a ⊗_ε b = (a·b) ⊕ (ε·((a∧b) ⊕ Φ(a⊕b))) mod q,   Φ(x) = x³ ⊕ x ⊕ 1

ε — расхождение (divergence) между элементами: при ε → 0 произведение вырождается в детерминированный проектор. Архетип — идемпотент: a ⊗_ε a = a. Идемпотентность = коллизионная стойкость (в криптоветке), фиксированная точка = детерминизм (в SCF-ветке — проектор занятых орбиталей, в генерации — устойчивый смысловой аттрактор).

Сквозная инвариантность проекта: одно каноническое уравнение материализовано шесть раз (Python-клетки → SAT-факторизация → SCF-поток → ERI-метакомпилятор → burn-слои → этот движок). Тернарные коэффициенты {−1, 0, +1} — «атомы» всего: криптоядра PND, R1CS-гейты, тернаризованные веса VectorGate8. Ноль умножений как стиль вычислений.

11. Границы применимости (честная секция)

Архив 299 источников сохраняет и критику (файлы 9, 69, 195):

  • Ранние заявления о «факторизации RSA дыханием» опровергнуты внутренним gap-анализом: breathing engine — trial division, аналитический градиент ломался (40% совпадений знаков). Проект честно развернулся к поиску.
  • Крипто-ветка: hardware-PND без φ() полностью линеен (Z3, δ=256, NL=0); усиления задокументированы, но не претендуют на NIST-уровень.
  • Формула времени T = ΔI/ΔΣ — интерпретационная рамка, не измеримая величина; в движке материализованы только ε, R(t) и сцены.
  • RaBitQ-качество на синтетике ограничено физикой 1 бита (§4.3) — это признано и обойдено архитектурно (переранжирование, gate против потолка).

Эта секция — принципиальная позиция проекта: документация обязана хранить провалы наравне с победами, иначе следующая итерация будет вслепую.