Статус: консолидация математики, разбросанной по коду, README и 299 первоисточникам архива
docs/sources-archive/. История возникновения идей — в HISTORY.md; реализация — в MODULES.md.
Этот документ отвечает на вопрос «почему движок устроен так, а не иначе». Каждая формула здесь либо реализована в коде (указан файл), либо является утверждённой стратегией плана v2.0 (указан раздел PLAN_POLER_V2.md).
Базовая онтология POLER: текст — динамическая система, стремящаяся к состоянию когнитивного покоя. Информационная свободная энергия текста минимизируется, когда «внутренняя модель» (латентный вектор смысла p) согласована с «наблюдением» (реальными употреблениями слов o). Эта рамка — прямое применение принципа свободной энергии Фристона (FEP) к информационному поиску: поиск трактуется как минимизация удивления между запросом и корпусом.
Из онтологии следуют три инженерных решения:
- Ранжирование — не «скор похожести», а плотность энергии: как сильно концентрируется смысл вокруг запроса (ε-плотность, §2).
- Время в документе — не позиция, а резонанс: отклик прошлых вхождений на текущее (IIR-фильтр R(t), §3).
- Локальность смысла — сцена: отрезок, внутри которого лексический состав статистически однороден (§2.3).
Важно: движок не понимает контент. Он измеряет физические величины плотности/резонанса и отдаёт их агенту. Это тезис «инструмент, не ИИ» (research/dialogue_tool_vs_ai.md): интерпретация принадлежит наблюдателю.
Для запроса 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.
BM25 оценивает «насколько документ хорош под запрос» — скаляр релевантности. ε оценивает концентрацию: два документа с одинаковой массой, но разной длиной получают разную плотность, и короткий «резонансный» документ выигрывает. Практически это то, что нужно агенту: найти место, где смысл запроса сжат, а не размазан. Симметричное свойство: ε инвариантна к дублированию документа только до φ=1; при φ<1 (по умолчанию) документ-дубль теряет плотность — самодедупликация без SimHash.
Проход 2 (streaming.rs) разбивает документ на сцены: границы ставятся там,
где состав активной лексики меняется скачком (скользящее окно, порог
расхождения распределений). Сцена — атом контекста для -w/--window
и для последующего графа сущностей: связи считаются между сценами, а не
между целыми файлами (глава книги ≠ абзац). Выходной контракт несёт
SceneInfo с byte-диапазоном — агент цитирует сцену, а не «файл».
resonance::calculate_epsilon — generic по трейту TermFreqs. Один и тот же
результат (побитово) получается из: RAM HashMap, FSST-сжатого словаря
корпуса, per-файлового lz4-представления. Сжатие (компрессия 4.1×/26×)
не имеет права менять метрику — это тестируется дифференциалом
(compression/tests, «ε побитово совпадает между представлениями»).
Вхождение терма в момент 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]
CLI --resonance-mode выбирает, что считать «энергией» терма:
| Режим | Формула | Интерпретация |
|---|---|---|
hits |
Σ x(t) | классический tf (резонанс выключен) |
field |
Σ R(t)·x(t) | поле: вхождение в «нагретом» контексте весит больше |
psi |
поле + нелинейный потенциал Ψ | см. §5, внимание как волна |
poler |
канонический POLER-цикл | см. §6 — полный контур с диссипацией |
Практический смысл: field выделяет кластеры повторных упоминаний
(«персонаж активен в этой главе»), hits — точную фактику, psi/poler —
долгую связность повествования.
Скользящее окно — прямоугольная память: вхождение за границей исчезает
скачком, границы артефактны. Экспоненциальное затухание гладко, O(1) на
событие (никакой памяти истории, кроме одного аккумулятора) и имеет
физическую интерпретацию следа (trace). Для потоковых watcher-прогонов
(--watch) это единственно приемлемая сложность.
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) — в единое топографическое ранжирование через композицию резонансных полей. Это уникальная инновация проекта: ни один гибридный поисковик не строит слияние на физике затухающих колебаний.
Вектор v ∈ R^d центрируется и нормируется, затем подвергается рандомизированному ортогональному вращению Адамара (быстрое преобразование Уолша-Адамара, детерминированное по seed из заголовка PRBQ):
u = H·(v − μ)/‖v − μ‖ — вращение «разбеливает» координаты
b_i = sign(u_i) — 1 бит на координату
Скаляры на вектор: μ (центр), δ (масштаб), γ (норма). Восстановление невозможно (1 бит), но оценка скалярного произведения возможна.
- Symmetric (sym): обе стороны закодированы; оценка через popcount XOR кодов, поправка arcsin — несмещённая оценка угла (MLE).
- Asymmetric (ADC): запрос полный (f32), база закодирована; центрированная несмещённая оценка через γ и δ.
Плотность 768-d: 144 Б против 3072 Б fp32 = 21.3× (по кодам — 24×). Скорость скана кодов — 8.4 ГБ/с (AVX2 popcnt).
На гауссовой синтетике 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. Инвариант качества разделён по слоям: субстрат отвечает «не потерять ни одного кандидата относительно своей оценки», модель отвечает за саму оценку.
Полер-нативный HNSW (vectors/hnsw.rs) хранит граф указателей между слотами хранилища; детерминированная сборка (BTreeSet кандидатов) — побитово воспроизводимые индексы. mmap-хранилище (PRBQ, formats/PRBQ_FORMAT.md) подгружает страницы кодов по касанию: на 1B векторов RAM занимает только рабочий набор.
psi.rs. Ψ — фазовая надстройка над лексическим слоем: терм-частоты
порождают «волну внимания», которая распространяется по документу и
интерферирует с резонансом R(t). Параметры (CLI --psi-eta/--psi-gamma/ --psi-rho/--psi-depth) управляют: скоростью фазы, связностью волны,
затуханием и глубиной распространения. ResonanceMemory — кольцевой буфер
последних N состояний поля: режим Observer, в котором движок «помнит»,
какие зоны документа уже были в фокусе — фундамент для интерактивных
сессий чтения (reader/).
Философский исток — «замкнутая» версия цикла POLER с фазой Интенции Ψ и принципом ĤΨ = 0 (гамильтониан замкнутой системы равен нулю — «время возникает только у наблюдателя»). В движке эта философия прагматична: поле Ψ определено только относительно наблюдателя-запроса, у документа нет «истинного смысла» без того, кто смотрит.
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.
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
поверх всего этого даёт побитово ту же ε.
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).
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-декодеру.
Для полноты — алгебра, из которой выросли ε, 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. Ноль умножений как стиль вычислений.
Архив 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 против потолка).
Эта секция — принципиальная позиция проекта: документация обязана хранить провалы наравне с победами, иначе следующая итерация будет вслепую.