NextStatNextStat

История изменений

Формат: Keep a Changelog · Semantic Versioning

[Не выпущено]

Добавлено

  • Унифицированное Python API — объединены варианты по типу модели и устройству в единые функции с runtime-диспатчем: ranking(), hypotest()/hypotest_toys(), profile_scan(), fit_toys(), upper_limit(). Все принимают device="cpu"|"cuda"|"metal" и диспатчат по HistFactoryModel vs UnbinnedModel автоматически. Старые unbinned_*, *_gpu, *_batch_gpu варианты удалены.
  • TypedDict возвращаемые типы — ~25 структурированных TypedDict определений (RankingEntry, ProfileScanResult, HypotestToysMetaResult, PanelFeResult и др.) вместо непрозрачных Dict[str, Any]. Автодополнение IDE теперь работает для всех функций вывода.
  • profile_scan(return_curve=True) — объединяет бывший profile_curve() в profile_scan() с массивами для графиков (mu_values, q_mu_values, twice_delta_nll).
  • upper_limit(method="root") — объединяет бывший upper_limits_root() в upper_limit() с method="bisect"|"root".
  • LAPS Metal backend — GPU-ускоренный MAMS-сэмплер на Apple Silicon (M1–M4) через Metal Shading Language. Встроенные модели (StdNormal, EightSchools, NealFunnel, GlmLogistic) с f32 вычислениями, fused multi-step ядро и SIMD-group cooperative ядро для тяжёлых GLM. Автоматический fallback: CUDA (f64) > Metal (f32) > ошибка.
  • LAPS оконная адаптация масс — warmup фазы 2+3 теперь используют Stan-style удвоенные окна для оценки inv_mass. Каждое окно сбрасывает статистики Welford и dual averaging, улучшая сходимость на мультимасштабных моделях. Настраивается через n_mass_windows.
  • LAPS римановский MAMS для Neal Funnel — новая модель neal_funnel_riemannian с позиционно-зависимой метрикой Фишера. Использует эффективный потенциал, где члены лог-детерминанта сокращаются, давая масштабно-инвариантные натуральные градиенты. Доступно на Metal (f32) и CUDA (f64).
  • BCa доверительные интервалы — переиспользуемые bootstrap CI утилиты в ns-inference (percentile + bca) с диагностикой (z0, acceleration, скорректированные alphas, размеры выборок).
  • HEP toy-summary CI контрольnextstat unbinned-fit-toys теперь поддерживает opt-in CI для summary: --summary-ci-method percentile|bca, --summary-ci-level, --summary-ci-bootstrap. Вывод включает summary.mean_ci с запрошенным/эффективным методом и диагностикой fallback.
  • Churn bootstrap CI выбор методаnextstat churn bootstrap-hr теперь поддерживает --ci-method percentile|bca (по умолчанию percentile) и --n-jackknife для оценки BCa-ускорения. Вывод включает метаданные метода и покоэффициентную диагностику с причиной fallback.
  • Python churn паритет для CI методовnextstat.churn_bootstrap_hr() теперь принимает ci_method и n_jackknife и возвращает покоэффициентный эффективный метод/диагностику.
  • Рендерер отдельных визуализаций (nextstat viz render) — прямой рендеринг JSON viz артефактов в изображения (pulls, corr, ranking) без генерации полного отчёта. Поддерживает настройки title/DPI и фильтры корреляций (--corr-include, --corr-exclude, --corr-top-n).
  • Rootless HEP генератор датасетовbench_hep_dataset_bootstrap_ci.py теперь поддерживает --root-writer auto|uproot|root-cli и по умолчанию использует uproot без ROOT.

Исправлено

  • Порядок параметров panel_fe() — изменён с (entity_ids, x, y, p) на (y, x, entity_ids, p) для соответствия конвенции эконометрического модуля (y первым).
  • HS3/pyhf CLI уточнение scope — исправлена документация команд и добавлена fail-fast диагностика для pyhf-only команд при HS3 входных данных.
  • Arrow/Parquet from_arrow совместимость с большими offset — исправлено чтение Utf8/LargeUtf8 и List<Float64>/LargeList<Float64>, так что Arrow-таблицы из Polars/DuckDB принимаются без предварительной нормализации.

[0.9.5] — 2026-02-15

Исправлено

  • Покрытие PyPI wheelpip install nextstat теперь работает из коробки на всех основных платформах. Предсобранные wheels для Linux x86_64/aarch64, macOS arm64/x86_64, Windows x86_64 (Python 3.11–3.13).
  • Совместимость Linux x86_64 glibc — wheels теперь таргетируют manylinux_2_17 (glibc 2.17+) вместо manylinux_2_35, что исправляет установку на CentOS 7/8, RHEL 7+, Ubuntu 18.04+.
  • Поддержка macOS Intel — добавлен таргет x86_64-apple-darwin в матрицу релиза. Пользователям Intel Mac больше не нужна сборка из исходников.
  • Multi-interpreter wheel сборки — Linux wheels собираются внутри manylinux Docker-контейнера; macOS/Windows используют явный setup-python с 3.11/3.12/3.13.

Добавлено

  • HEP Full Workflow Tutorial — исчерпывающий туториал на 1200 строк: конструирование workspace, все типы модификаторов, MLE фит, CLs гипотезное тестирование, верхние лимиты (Brazil band), ранжирование NP, pulls, корреляционная матрица, профильные сканы, комбинация workspace, mass scans, GPU-ускорение, препроцессинг и автоматические отчёты.
  • Детальные гайды по установке и быстрому старту — переписаны с пошаговыми инструкциями, ожидаемыми выводами, секциями устранения неполадок и флагами GPU-ускорения.

[0.9.4] — 2026-02-15

Нативный ROOT I/O

  • LRU-кеш baskets — декомпрессированные payload baskets TTree кешируются per-RootFile с LRU-вытеснением по объёму (256 MiB по умолчанию). Убирает повторную декомпрессию при последовательных чтениях ветки. RootFile::basket_cache() для статистики, RootFile::set_cache_config() для настройки.
  • Lazy branch readerRootFile::lazy_branch_reader() декомпрессирует только baskets, необходимые для запрошенных записей. read_f64_at(entry) затрагивает один basket; read_f64_range(start, end) — только пересекающиеся.
  • ChainedSlice — zero-copy конкатенация нескольких декомпрессированных payload через Arc. O(log n) random access по несмежным сегментам.
  • Парсинг ROOT leaflistns-root теперь парсит составные leaf-list ветки (несколько скаляров в одной записи).

Производительность ns-zstd

  • Оптимизации hot-path энкодера — 20+ целевых улучшений pure-Rust Zstd-энкодера: ускорение FSE-переходов, упаковка бит последовательностей, снижение коллизий hash-chain через head-теги и u64-reject, сравнение common-prefix через u128, fast-path для depth-1, эвристика no-match skip.
  • zstd-shim — крейт прозрачного выбора бэкенда: нативный libzstd на десктопе для максимальной скорости, pure-Rust ns-zstd на WASM и embedded.

Ускорение на GPU

  • Многоканальные GPU batch toys (Metal + CUDA) — батч-фиттер тоев теперь поддерживает workspaces с несколькими каналами на обоих GPU-бэкендах.
  • Unbinned CUDA multi-GPU batch toys (--gpu-devices)nextstat unbinned-fit-toys и nextstat unbinned-hypotest-toys могут шардить хост-сэмплированные тои по нескольким CUDA-устройствам.
  • Unbinned CUDA device-resident shard orchestration (--gpu-shards) — шардированное выполнение --gpu-sample-toys с round-robin распределением по устройствам. Эмуляция на одном GPU через --gpu-shards N.
  • Unbinned CUDA host-toy shard orchestration — CUDA toy workflows поддерживают шардированное выполнение host-тоев (pipeline: cuda_host_sharded) с shard plan в метриках.
  • Unbinned CUDA sharded toy-path метрики/тесты — интеграционное покрытие для --gpu-sample-toys --gpu-shards с проверкой контрактов pipeline: cuda_device_sharded и device_shard_plan.
  • Metal --gpu-sample-toys — device-resident сэмплирование тоев на Apple Silicon (ранее только CUDA).
  • Parquet observed data для unbinned --gpu — unbinned GPU-путь теперь может загружать наблюдаемые данные напрямую из Parquet-файлов.
  • TensorRT execution provider для нейронных PDF--features neural-tensorrt включает TensorRT EP с FP16-инференсом, кэшированием движков (~/.cache/nextstat/tensorrt/) и динамическими профилями оптимизации батча. Цепочка fallback: TensorRT → CUDA EP → CPU. FlowGpuConfig для настройки TRT; конструктор FlowPdf::from_manifest_with_config(); FlowPdf::gpu_ep_kind() для интроспекции.
  • Аналитические якобиан-градиенты для flow PDF — если манифест включает ONNX-модель log_prob_grad, FlowPdf::log_prob_grad_batch() вычисляет точный ∂ log p / ∂ context за один forward pass вместо 2 × n_context конечно-разностных вычислений. Fused CUDA-ядро flow_nll_grad_reduce считает NLL + промежуточные градиенты за один запуск; GpuFlowSession::nll_grad_analytical() собирает полный градиент на CPU.
  • Multi-GPU батч-фиттинг тоев для flow PDFfit_flow_toys_batch_cuda() запускает lockstep L-BFGS-B по тысячам тоев через ядро flow_batch_nll_reduce (1 блок = 1 той). shard_flow_toys() равномерно распределяет тои по устройствам; fit_flow_toys_batch_multi_gpu() управляет всеми GPU и объединяет результаты.
  • CUDA EP f32 zero-copy NLLGpuFlowSession::nll_device_ptr_f32() принимает raw CUDA device pointer на float log-probs от ONNX Runtime CUDA EP, исключая host-to-device memcpy. До 57× быстрее f64 host-upload пути на типичных объёмах событий (~1K). Python: GpuFlowSession.nll_device_ptr_f32(ptr, params).
  • PF3.1-OPT2: Параллельный device-resident multi-GPU — пайплайн cuda_device_sharded запускает каждый шард в своём потоке с отдельным CUDA-контекстом через std::thread::scope. Валидировано на 4× A40: 2 GPU = 1.97× (почти линейно), 3 GPU = 2.9×. До фикса: 1.00×.
  • PF3.1 2× H100 бенчмарк-снапшот — полная unbinned toy матрица (10k/50k/100k) для CPU, 1-GPU/2-GPU host-toy и device-resident sharded путей.
  • PF3.1 single-GPU снапшот (RTX 4000 Ada) — 10k/20k валидационные артефакты для worker-per-device оркестрации.
  • CLI --gpu cuda для flow PDF (G2-R1)nextstat unbinned-fit-toys --gpu cuda поддерживает flow/conditional_flow/dcr_surrogate PDF. CPU сэмплинг → CPU logp → CUDA NLL редукция через ядро flow_batch_nll_reduce → lockstep L-BFGS-B.
  • Кэш сетки нормализацииQuadratureGrid::auto() выбирает Gauss-Legendre (1–3D), тензорное произведение (4–5D) или Halton квази-Монте-Карло (6D+). NormalizationCache исключает повторные вычисления при неизменённых параметрах.

Гибридное правдоподобие (Phase 4)

  • HybridLikelihood<A, B> — обобщённое комбинированное правдоподобие, суммирующее NLL двух LogDensityModel с общими параметрами. Реализует LogDensityModel, PoiModel и FixedParamModel.
  • SharedParameterMap — объединяет вектора параметров двух моделей по имени. Общие параметры получают пересечение границ.
  • CLI nextstat hybrid-fit--binned (pyhf/HS3 JSON) + --unbinned (YAML/JSON spec). MLE через HybridLikelihood.
  • WeightSummary диагностикаEventStore::weight_summary() возвращает ESS, sum/min/max/mean весов, n_zero.
  • HS3 unbinned расширениеHs3UnbinnedDist расширяет HS3 v0.2 схему event-level каналами.
  • Fused single-pass CPU NLL ядроfused_gauss_exp_nll вычисляет per-event log-likelihood инлайн для Gaussian+Exponential топологии, устраняя промежуточные аллокации. Адаптивный параллелизм: последовательно для N < 8k, rayon par_chunks(1024) для N ≥ 8k.
  • SIMD-векторизованное fused-ядро (wide::f64x4) — 4 события за итерацию (AVX2 на x86, NEON на ARM). 4–12× ускорение над generic-путём на x86; 2–5× на ARM. ~770 M events/s NLL на x86.
  • Unbinned бенчмарки — Criterion бенчмарки: ~770 M events/s NLL на x86 (fused+SIMD); полный 5-параметровый fit за 637 µs при 10k событиях.
  • Fused CrystalBall+Exponential ядроfused_cb_exp_nll расширяет fused single-pass путь на CB+Exp топологию. Scalar event loop с rayon адаптивным параллелизмом; аналитические градиенты для 5 shape-параметров. 2.7–5.8× ускорение над generic на M5.
  • Unbinned fused-vs-generic бенчмаркUnbinnedModel::nll_generic() / grad_nll_generic() форсируют generic multi-pass путь для честного сравнения с дефолтным fused-путём.

Кросс-вертикальные статистические фичи

  • Gamma GLM (GammaRegressionModel) — гамма-распределение с log-связкой, общий параметр формы α. Аналитический NLL и градиент. Для страховых выплат, стоимости госпитализации, строго положительных непрерывных откликов.
  • Tweedie GLM (TweedieRegressionModel) — составная Пуассон-Гамма со степенью p ∈ (1, 2), log-связка. Приближение NLL через седловую точку (Dunn & Smyth 2005). Обрабатывает точные нули. Для агрегатных страховых требований, осадков, zero-inflated данных.
  • GEV-распределение (GevModel) — обобщённое распределение экстремальных значений для блочных максимумов (Fréchet ξ>0, Gumbel ξ≈0, Weibull ξ<0). MLE через L-BFGS-B с аналитическим градиентом. return_level(T) для T-блочных уровней возврата. Для перестрахования, гидрологии, климатических экстремумов.
  • GPD-распределение (GpdModel) — обобщённое Парето для пиков над порогом. MLE с аналитическим градиентом. quantile(p) для квантилей превышения (VaR/ES). Для хвостового риска в финансах, тарификации перестрахования.
  • Мета-анализ (meta_fixed, meta_random) — фиксированные эффекты (inverse-variance) и случайные эффекты (DerSimonian–Laird). Гетерогенность: Q Кохрана, I², H², τ². Данные для forest plot с весами и ДИ по исследованиям. Для фармы, эпидемиологии, социальных наук.

WASM-песочница

  • Компактный бинарник 454 KB — убран Arrow/Parquet из WASM-сборки, кастомный [profile.release-wasm] с opt-level = "z", lto = "fat", strip = true, плюс wasm-opt -Oz. Уменьшение с 5.7 MB до 454 KB.
  • UI-полировка — стандартный хэдер сайта с логотипом, компактный layout на один экран, спиннер на Run, ⌘+Enter, автозагрузка примера, бейджи converged/failed в MLE Fit, fade-in анимации.
  • Управляемые примеры — 4 HistFactory + 3 GLM примера с описаниями. Dropdown фильтруется по активному табу — показываются только совместимые примеры.
  • Автозапуск при смене таба — переключение между workspace-операциями автоматически запускает вычисление. Переход GLM ↔ workspace очищает редактор.
  • GLM Regression табrun_glm() WASM endpoint: линейная, логистическая, пуассоновская регрессия через L-BFGS-B.
  • Mass Scan (Type B Brazil Band) — ATLAS/CMS exclusion plot: 95% CL верхний предел на μ vs позиция пика сигнала с ±1σ/±2σ полосами.

Сервер инференса (ns-server)

  • Аутентификация по API-ключу--api-keys <file> или переменная NS_API_KEYS. Валидация Bearer-токена на всех эндпоинтах кроме GET /v1/health.
  • Rate limiting по IP--rate-limit <N> (запросы/сек/IP). Token-bucket с ленивой очисткой.
  • POST /v1/unbinned/fit — эндпоинт unbinned MLE фита.
  • POST /v1/nlme/fit — эндпоинт NLME / PK популяционного фита. Поддерживает pk_1cpt и nlme_1cpt. Политики LLOQ: ignore, replace_half, censored.
  • Асинхронная система задачPOST /v1/jobs/submit, GET /v1/jobs/{id}, DELETE /v1/jobs/{id}. In-memory хранилище с TTL-очисткой и токенами отмены.
  • GET /v1/openapi.json — OpenAPI 3.1 спецификация для всех 16 эндпоинтов.

Анализ выживаемости (непараметрический)

  • Оценка Каплана-Мейераnextstat.kaplan_meier(times, events, conf_level): непараметрическая кривая выживаемости с дисперсией Гринвуда, log-log ДИ, медиана выживаемости, таблица at-risk.
  • Лог-ранк тестnextstat.log_rank_test(times, events, groups): хи-квадрат тест Мантеля-Кокса для 2+ групп.
  • CLI: nextstat survival km, nextstat survival log-rank-test.

Подписки / Отток (Churn)

  • Синтетический SaaS churn датасетnextstat.churn_generate_data(): детерминированные когортные данные с правоцензурированным временем оттока, ковариатами плана/региона/использования и назначением воздействия.
  • Когортный retentionnextstat.churn_retention(): стратифицированные KM-кривые по группам + лог-ранк сравнение.
  • Модель риска оттокаnextstat.churn_risk_model(): hazard ratios Кокса с ДИ.
  • Каузальный upliftnextstat.churn_uplift(): AIPW-оценка эффекта вмешательства с анализом чувствительности Розенбаума.
  • CLI: nextstat churn generate-data, nextstat churn retention, nextstat churn risk-model, nextstat churn uplift.
  • Диагностика (trust gate)nextstat.churn_diagnostics(): доля цензурирования по сегментам, баланс ковариат (SMD), перекрытие propensity, достаточность выборки.
  • Когортная матрица удержанияnextstat.churn_cohort_matrix(): life-table по когортам с периодами, кумулятивное удержание.
  • Сравнение сегментовnextstat.churn_compare(): попарный лог-ранк + HR proxy + коррекция Бенджамини-Хохберга / Бонферрони.
  • Survival-native upliftnextstat.churn_uplift_survival(): RMST, IPW-взвешенный КМ, ΔS(t) по горизонтам.
  • Бутстрап hazard ratiosnextstat.churn_bootstrap_hr(): параллельный бутстрап Cox PH с перцентильными ДИ.
  • Инъекция данныхnextstat.churn_ingest(): валидация и очистка массивов клиентов, цензурирование по observation_end.

CLI

  • nextstat mass-scan — батч асимптотических CLs верхних пределов по множеству workspace (Type B Brazil Band).
  • nextstat significance — significance открытия (p₀ и Z-значение).
  • nextstat goodness-of-fit — saturated-model тест качества подгонки (χ²/ndof и p-value).
  • nextstat combine — объединение нескольких pyhf JSON workspace в единый с автокорреляцией систематик.
  • nextstat fit --asimov — слепой фит на Asimov (ожидаемых) данных.
  • nextstat viz gammas — постфитовые γ параметры с prefit/postfit неопределённостями.
  • nextstat viz summary — мульти-фит μ summary из нескольких fit-результатов.
  • nextstat viz pie — круговая диаграмма состава выборок по каналам.
  • nextstat viz separation — сравнение форм сигнала и фона с метрикой разделения.
  • nextstat preprocess smooth — нативное Rust 353QH,twice сглаживание для HistoSys шаблонов.
  • nextstat preprocess prune — нативная Rust обрезка незначительных систематик.

pyhf-паритет

  • Workspace::prune() — удаление каналов, сэмплов, модификаторов или measurement POI по имени.
  • Workspace::rename() — переименование каналов, сэмплов, модификаторов.
  • Workspace::sorted() — отсортированный workspace.
  • Workspace::digest() — SHA-256 дайджест канонического workspace JSON.
  • Workspace::combine() — объединение двух workspace с настраиваемой семантикой каналов.
  • pyhf::simplemodelsuncorrelated_background() и correlated_background().
  • pyhf::xml_export — экспорт pyhf workspace в HistFactory XML формат.
  • HistoSys interpolation code2 — квадратичная интерполяция с линейной экстраполяцией.
  • Тест-статистики t_μ и t̃_μ — Eq. 8 и Eq. 11 arXiv:1007.1727.
  • OptimizerStrategy пресеты — Default, MinuitLike, HighPrecision.
  • docs/pyhf-parity.md — полная матрица совместимости.

Эконометрика и каузальный вывод (Phase 12)

  • Panel fixed-effects регрессия — entity-demeaned OLS с Liang–Zeger cluster-robust SE. panel_fe_fit() в Rust, nextstat.panel_fe() в Python.
  • Разность-в-разностях (DiD) — канонический 2×2 оценщик и multi-period event-study с leads/lags. Python: nextstat.did(), nextstat.event_study().
  • Инструментальные переменные / 2SLS — двухшаговый МНК с F-статистикой первого этапа, partial R², тест Стока–Його. Python: nextstat.iv_2sls().
  • AIPW (дважды робастный) — Augmented IPW для ATE. Influence-function SE, тримминг propensity score. Python: nextstat.aipw_ate().
  • Анализ чувствительности Розенбаума — границы Wilcoxon signed-rank для matched-pair чувствительности к ненаблюдаемым конфаундерам. Python: nextstat.rosenbaum_bounds().
  • docs/references/econometrics.md — справочная документация с примерами кода, таблицей assumptions и limitations.

Стабилизация API

  • ns-core ре-экспортыLogDensityModel, PoiModel, FixedParamModel, PreparedNll, PreparedModelRef из корня крейта.
  • Deprecated Model trait — заменён на LogDensityModel. Будет удалён в 1.0.
  • ns-inference ре-экспорты — добавлены scan, scan_metal, NegativeBinomialRegressionModel, QualityGates, compute_diagnostics, quality_summary в корень крейта.
  • nextstat.unbinned.UnbinnedAnalysis — высокоуровневая обёртка над UnbinnedModel: .from_config(), .fit(), .scan(), .hypotest(), .hypotest_toys(), .ranking(), .summary().
  • Python __all__ — добавлены volatility, UnbinnedModel, HybridModel и ещё 9 в nextstat.__all__.

Исправлено

  • L-BFGS steepest-descent fallback — оптимизатор теперь корректно переключается на steepest descent, когда L-BFGS update не даёт направления спуска.

[0.9.0] — 2026-02-09

Мажорный релиз

Нейронная оценка плотности

  • Flow PDF — ONNX-backed normalizing flow как unbinned PDF. Загружает предобученные потоки из flow_manifest.json + ONNX-модели. Поддерживает безусловные и условные потоки с мешающими параметрами как контекст. Спецификация YAML: type: flow / type: conditional_flow. Feature gate: --features neural.
  • DCR Surrogate — нейронный DCR (Direct Classifier Ratio) суррогат, заменяющий бинированный морфинг шаблонов. Drop-in замена для морфинг-гистограмм — гладкий, непрерывный, безбинный морфинг систематик по протоколу FAIR-HUC. Спецификация YAML: type: dcr_surrogate.
  • Unbinned-спецификация YAML поддерживает типы PDF flow, conditional_flow и dcr_surrogate с автоматическим feature gating.
  • Верификация нормировки — квадратура Гаусса–Лежандра (порядки 32–128) для проверки и коррекции нормировки нейронных PDF.
  • Скрипты обучения — Python-скрипты для обучения потоков (zuko NSF + ONNX-экспорт), дистилляции DCR из шаблонов HistFactory и валидации (нормировка, PIT/KS, closure checks).
  • Python-привязки FlowPdf / DcrSurrogate — классы nextstat.FlowPdf и nextstat.DcrSurrogate в ns-py за --features neural. Вычисление ONNX-flow из Python: from_manifest(), log_prob_batch(), update_normalization(), validate_nominal_normalization().

Документация

  • Справочник unbinned-спецификацииdocs/references/unbinned-spec.md: полный человекочитаемый справочник по nextstat_unbinned_spec_v0: все 13 типов PDF, yield-выражения, rate modifiers (NormSys + WeightSys), per-event систематики, нейронные PDF, ограничения GPU.

Ускорение на GPU

  • CUDA (NVIDIA, f64) - fused-ядро NLL+градиент, покрывающее все 7 типов модификаторов HistFactory за один запуск. Lockstep batch-оптимизатор фитит тысячи тоев параллельно. Динамическая загрузка через cudarc: бинарник работает без установленной CUDA.
  • Metal (Apple Silicon, f32) - то же fused-ядро на MSL. Unified memory без копирования. Паритет NLL относительно CPU f64: относительная разница 1.27e-6.
  • Apple Accelerate - векторизованный NLL на macOS через vDSP/vForce. Оверхед <5% относительно наивного суммирования.
  • GPU-resident toy pipeline (CUDA)--gpu-sample-toys теперь хранит сгенерированные события на GPU, исключая round-trip D2H+H2D для буфера obs_flat между сэмплером и батч-фиттером.
  • Unbinned GPU WeightSys — модификатор weightsys теперь lowered в CUDA/Metal ядра (интерполяция code0/code4p). В YAML-спецификации: type: weightsys, param, lo, hi, опциональный interp_code.
  • CPU batch toys — Rayon-параллельный фит с переиспользованием tape по потокам и воспроизводимостью через seed.
  • Reverse-mode tape — более быстрый градиент при меньшем числе аллокаций.
  • CLI: --gpu cuda, --gpu metal · Python: device="cuda", device="metal"

Дифференцируемый анализ (PyTorch)

  • Zero-copy CUDA-ядро читает сигнальную гистограмму из PyTorch-тензора и записывает dNLL/dsignal напрямую в буфер градиентов, без device-host roundtrip.
  • DifferentiableSession: NLL + градиент по сигналу при фиксированных мешающих параметрах.
  • ProfiledDifferentiableSession: профильные тестовые статистики с градиентами по теореме об огибающей. Это позволяет строить цепочку NN → сигнальная гистограмма → профильный CLs → loss.
  • Модуль nextstat.torch: NextStatNLLFunction, NextStatProfiledQ0Function (autograd), NextStatLayer(nn.Module).
  • profiled_zmu_loss() — обёртка Zμ loss (sqrt(qμ) с численной устойчивостью) для оптимизации силы сигнала.
  • SignificanceLoss(model) — ML-friendly класс, оборачивающий профилированную −Z₀. Инициализируется один раз и вызывается на каждом батче: loss_fn(signal_hist).backward().
  • SoftHistogram — дифференцируемое биннингование (Gaussian KDE / sigmoid): scores классификатора → soft histogram → SignificanceLoss.
  • batch_profiled_q0_loss() — профилированный q₀ для батча сигнальных гистограмм (ensemble training).
  • signal_jacobian(), signal_jacobian_numpy() — прямой ∂q₀/∂signal без autograd для моста SciPy и быстрого прунинга.
  • as_tensor() — DLPack array-API bridge: JAX, CuPy, Arrow, NumPy → torch.Tensor.
  • nextstat.mlops — извлечение метрик фита для W&B / MLflow / Neptune: metrics_dict(result), significance_metrics(z0), StepTimer.
  • nextstat.interpret — ranking impact систематик как аналог feature importance: rank_impact(model), rank_impact_df(), plot_rank_impact().
  • nextstat.tools — определения tools для LLM (OpenAI function calling, LangChain, MCP) для 7 операций: fit, hypotest, upper_limit, ranking, significance, scan, workspace_audit.
  • nextstat.distill — генератор набора данных для обучения суррогатов. generate_dataset(model, n_samples=100k, method="sobol") производит кортежи (params, NLL, gradient). Экспорт в PyTorch TensorDataset, .npz или Parquet. Встроенный train_mlp_surrogate() с loss Соболева.
  • Проверка сходимости фита: возвращает ошибку, если GPU profile fit не сошелся.

RL-окружение Gymnasium

  • nextstat.gym — опциональная обертка Gymnasium/Gym, которая рассматривает HistFactory workspace как RL/DOE-окружение.
  • Предлагаете обновления номинальных yields для сэмпла и получаете метрику NextStat как reward (NLL, q₀, Z₀, qμ, Zμ).
  • make_histfactory_env() - фабрика с настраиваемыми reward_metric, action_mode, action_scale.
  • Совместимо с gymnasium (предпочтительно) и устаревшим gym.

Детерминированная валидация

  • EvalMode - process-wide флаг: Parity (суммирование Кахана, один поток, bit-exact) против Fast (по умолчанию: SIMD/GPU, многопоточно).
  • CLI: --parity · Python: nextstat.set_eval_mode("parity")
  • 7-уровневый контракт допусков относительно pyhf (per-bin до ~1e-14 в худшем случае).

Нативный ROOT I/O

  • TTree reader - mmap-доступ к файлу, нативная бинарная десериализация, распаковка baskets (zlib/LZ4/ZSTD) с rayon-параллельным извлечением. 9 типов leaf + jagged-ветки.
  • Expression engine - компиляция в байткод и векторизация. Полная грамматика: арифметика, сравнения, булева логика, тернарный оператор, builtins. Динамическая адресация jagged (jet_pt[idx]) следует конвенции ROOT/TTreeFormula. Python-обертка: nextstat.analysis.expr_eval.
  • Histogram filler - один проход с selection cuts, весами и произвольным биннингом.
  • Unsplit vector branch decoding - best-effort декодирование веток std::vector<T> без таблиц смещений.
  • ~8.5× faster чем uproot+numpy на полном конвейере.

Пайплайн Ntuple → Workspace

  • NtupleWorkspaceBuilder: ROOT ntuples → HistFactory Workspace через fluent Rust API.
  • Модификаторы на уровне сэмпла: NormFactor, NormSys, WeightSys, TreeSys, HistoSys, StatError.
  • Создает тот же struct Workspace, что и путь pyhf JSON, без зависимости от ROOT C++.

Интероперабельность с TRExFitter

  • nextstat import trex-config — импортирует .config TRExFitter в pyhf JSON workspace.
  • nextstat build-hists — запускает NTUP-пайплайн и пишет workspace.json.
  • HIST mode — читает заранее собранные ROOT-гистограммы (ReadFrom: HIST) вместе с NTUP.
  • Analysis Spec v0 (YAML + JSON Schema) — nextstat run <spec.yaml> оркестрирует import/fit/scan/report.
  • Поддержка jagged-колонок и совместимость выражений в стиле TRExFitter.

Препроцессинг систематик

  • Smoothing: 353QH,twice algorithm (ROOT TH1::Smooth equivalent) + Gaussian kernel.
  • Pruning: shape, norm и overall прунинг с аудиторским следом.
  • nextstat preprocess CLI с декларативной YAML-конфигурацией и кешированием по хешу контента.

Расширения HistFactory

  • HS3 v0.2 ingestion - нативная загрузка HS3 JSON workspace (ROOT 6.37+). Формат (pyhf или HS3) автоопределяется при загрузке.
  • HS3 roundtrip export - экспорт HistFactoryModel обратно в HS3 JSON с точками bestfit параметров.
  • Python: HistFactoryModel.from_workspace() (auto-detect), HistFactoryModel.from_hs3(json_str). CLI: автоопределение в nextstat fit, nextstat scan.
  • HS3-входы используют дефолты ROOT HistFactory (NormSys Code1, HistoSys Code0). Для pyhf JSON NextStat по умолчанию использует гладкую интерполяцию (NormSys Code4, HistoSys Code4p). Для строгих pyhf-дефолтов используйте --interp-defaults pyhf (CLI) или from_workspace_with_settings(Code1, Code0) (Rust).
  • Поддержка HEPData patchset: nextstat import patchset, Python nextstat.apply_patchset().
  • Arrow / Polars ingestion - nextstat.from_arrow(table) создает HistFactoryModel из PyArrow Table, RecordBatch или любого Arrow-совместимого источника (Polars, DuckDB, Spark). nextstat.from_parquet(path) читает Parquet напрямую.
  • Arrow export - nextstat.to_arrow(model, what="yields"|"params") экспортирует ожидаемые yields или метаданные параметров как PyArrow Table.
  • Семантика ConstraintTerm - альфа-преобразование LogNormal, Gamma-ограничение для ShapeSys, обработка Uniform и NoConstraint. Парсится из метаданных <ConstraintTerm> в HistFactory XML.

Небинированное правдоподобие

  • Product PDF — совместное правдоподобие по независимым наблюдаемым: log p(x,y) = log p₁(x) + log p₂(y). Позволяет строить многомерные unbinned-фиты без ручной факторизации.
  • Spline PDF — монотонная кубическая Эрмитова (Fritsch–Carlson) интерполяция по узлам и значениям плотности. Аналитическая нормировка, inverse-CDF сэмплирование для тоев.
  • Многомерная KDE — 2-D/3-D гауссов KDE с шириной Silverman, усечённый на ограниченной поддержке наблюдаемых.
  • ARGUS PDF — форма фона ARGUS для спектроскопии B-мезонов. Нормировка Гаусса–Лежандра на ограниченной поддержке.
  • Voigtian PDF — pseudo-Voigt (Thompson–Cox–Hastings) линия резонанса. Свёртка Гаусса ⊗ Брейт–Вигнер для моделирования резонанса + детекторного разрешения.
  • Интегралы нормировки кешируются между итерациями оптимизатора, избегая повторной квадратуры при неизменных параметрах.
  • GPU flow NLL reduction — CUDA-ядро для extended unbinned likelihood по внешне вычисленным log-prob (flow PDF). Поддерживает многопроцессный logsumexp, гауссовы ограничения, host-upload и device-resident (ONNX CUDA EP) пути.
  • GPU flow session — оркестрация вычисления flow PDF (CPU или CUDA EP) с GPU NLL reduction. Градиент через центральные конечные разности, вычисление yields из вектора параметров.

Система отчетов

  • nextstat report — генерирует распределения, pulls, корреляции, yields (.json/.csv/.tex) и ранкинг неопределённостей.
  • Python-рендеринг: многостраничный PDF + SVG для каждого графика через matplotlib.
  • --blind маскирует наблюдаемые данные в незаблайнденных регионах.
  • --deterministic включает стабильный порядок ключей JSON.
  • nextstat validation-report — единый артефакт валидации, объединяющий результаты Apex2 и отпечатки workspace. Выводит validation_report.json (схема validation_report_v1) с SHA-256 набора данных, спецификацией модели, окружением, заметками для регуляторного обзора и сводкой pass/fail по наборам. Опциональный --pdf рендерит 7-страничный PDF для аудита через matplotlib.
  • --json-only для validation-pack: генерировать JSON-артефакты без рендера PDF (без зависимости от matplotlib).
  • Валидация pack manifestvalidation_pack_manifest.json с SHA-256 хешами и размерами всех файлов пакета. Удобный индекс для репликации и подписания.
  • Опциональный signing--sign-openssl-key / --sign-openssl-pub флаги создают Ed25519-подписи над дайджестом манифеста.

Анализ выживаемости

  • Параметрические модели: Exponential, Weibull, LogNormal AFT (с правым цензурированием).
  • Cox Proportional Hazards: Efron/Breslow ties, робастные sandwich SE, остатки Шенфельда.
  • Python: nextstat.survival.{exponential,weibull,lognormal_aft,cox_ph}.fit(...)
  • CLI: nextstat survival fit, nextstat survival predict

Линейные смешанные модели

  • Аналитическое маргинальное правдоподобие (random intercept, random intercept + slope).
  • Аппроксимация Лапласа для приближенных posterior.

Порядковые модели

  • Упорядоченный logit/probit со стабильной параметризацией cutpoints.

Эконометрика и каузальный вывод

  • Panel FE с кластерными SE (1-way).
  • DiD TWFE + хелперы event study.
  • IV / 2SLS с диагностикой слабых инструментов (first-stage F, partial R²).
  • AIPW для ATE/ATT + хелпер E-value. Propensity scores, IPW-веса, диагностика overlap. Python: nextstat.causal.aipw(), nextstat.causal.propensity_scores().
  • GARCH / Стохастическая волатильность — модели GARCH(1,1) и стохастической волатильности для финансовых временных рядов. CLI: nextstat volatility fit, nextstat volatility forecast. Python: nextstat.volatility.garch(), nextstat.volatility.sv().

Фармакометрика

  • Интегратор RK4 для линейных систем ОДУ.
  • 1-компартментная пероральная PK-модель с цензурированием LLOQ.
  • Расширение NLME со случайными эффектами на уровне субъекта.
  • Перечисление моделей ошибокErrorModel::Additive, Proportional, Combined(σ_add, σ_prop) с хелперами дисперсии, NLL и градиента.
  • 2-компартментные PK-моделиTwoCompartmentIvPkModel (IV болюс, 4 парам.) и TwoCompartmentOralPkModel (перорально, 5 парам.). Аналитические би/три-экспоненциальные решения.
  • Режим дозированияDosingRegimen: IV болюс, пероральное, IV инфузия. Одно-/многократные дозы и смешанные схемы. Замкнутые решения инфузий.
  • Чтение NONMEM-датасетовNonmemDataset::from_csv() парсит стандартный NONMEM CSV. Автоматическое преобразование записей дозирования в DosingRegimen по субъектам.
  • Оценка FOCE/FOCEIFoceEstimator: оптимизация ETA по субъектам (демпфированный Ньютон-Рафсон) + обновление популяционных параметров. Приближение Лапласа с ридж-регуляризованным гессианом.
  • Коррелированные случайные эффектыOmegaMatrix хранит полную Ω через факторизацию Холецкого (Ω = L·Lᵀ). FoceEstimator::fit_1cpt_oral_correlated() фитирует с полной Ω; FoceResult включает поля omega_matrix и correlation.
  • Пошаговое ковариатное моделирование (SCM)ScmEstimator: прямой отбор + обратное исключение по ΔOFV (LRT χ²(1)). Степенные, пропорциональные и экспоненциальные связи для CL/V/Ka. Полный аудит-трейс.
  • Диагностика VPC и GOFvpc_1cpt_oral(): визуальные предсказательные проверки с квантильными интервалами предсказания. gof_1cpt_oral(): PRED, IPRED, IWRES, CWRES.
  • Фарма-бенчмарк — Варфарин (32 субъекта), Теофиллин (12), Фенобарбитал (40 новорождённых). Восстановление параметров, GOF, VPC. Включает вариант с коррелированной Ω. cargo test --test pharma_benchmark.
  • Схема артефактов NLME (v2.0.0)NlmeArtifact оборачивает все результаты оценки в единую JSON-сериализуемую структуру. CSV-экспорт фиксированных эффектов, случайных эффектов, GOF, VPC, SCM-трейса.
  • Run bundle (провенанс)RunBundle фиксирует версию NextStat, git-ревизию, Rust toolchain, ОС/CPU, сиды, провенанс датасета.
  • Алгоритм SAEMSaemEstimator: стохастический аппроксимационный EM для NLME (класс Monolix). E-шаг Метрополиса-Гастингса с адаптивной дисперсией proposal, M-шаг в замкнутой форме. Возвращает SaemDiagnostics (acceptance rates, OFV trace). Поддерживает диагональную и коррелированную Ω.
  • PD-моделиEmaxModel, SigmoidEmaxModel (уравнение Хилла), IndirectResponseModel (типы I–IV). ODE-IDR через адаптивный RK45. PkPdLink для интерполяции концентрации PK→PD.
  • Адаптивные ОДУ-солверыrk45() (Дорманд-Принс 4(5) с PI-управлением шага) для нежёстких систем и esdirk4() (L-устойчивый SDIRK2) для жёстких. Обобщённый трейт OdeSystem.

API прикладной статистики

  • Парсинг формул + детерминированные design matrices (nextstat.formula).
  • from_formula обёртки для всех GLM и иерархических билдеров.
  • Сводки Вальда + робастная ковариация (HC0–HC3, 1-way cluster).
  • Адаптеры scikit-learn: NextStatLinearRegression, NextStatLogisticRegression, NextStatPoissonRegressor.
  • Политики пропусков: drop_rows, impute_mean.

WASM-песочница

  • Браузерный инференс через wasm-bindgen: fit_json(), hypotest_json(), upper_limit_json().
  • Перетащите workspace.json и получите асимптотические CLs Brazil bands. Без Python и без сервера.

Визуализация

  • plot_cls_curve(), plot_brazil_limits(), plot_profile_curve().
  • Подкоманды: nextstat viz distributions, viz pulls, viz corr, viz ranking.
  • Калман: plot_kalman_states(), plot_forecast_bands().

Pure-Rust Zstd кодек (ns-zstd)

  • Крейт ns-zstd — pure-Rust Zstd декомпрессор и компрессор для ROOT I/O. Без зависимости от C — работает на WASM и embedded. Уровни сжатия 1–19 с FSE (Finite State Entropy) и Huffman кодированием. Выход декодера совпадает с libzstd байт-в-байт (верифицировано fixture-тестами). Hash-chain match finder с настраиваемой глубиной поиска.

R-привязки

  • Пакет nextstat для R — нативный R-интерфейс через extendr (bindings/ns-r/). Предоставляет nextstat_fit(), nextstat_hypotest(), nextstat_upper_limit(), nextstat_scan(), nextstat_ranking() для HistFactory workspaces. Unbinned event Parquet I/O и нейронные PDF-привязки (FlowPdf, DcrSurrogate) также доступны. Установка: R CMD INSTALL bindings/ns-r.

CLI и инфраструктура

  • Структурированное логирование (--log-level) и воспроизводимые пакеты запуска (--bundle).
  • fit() поддерживает init_pars= для warm-start MLE.
  • CI: pyhf parity gate на push/PR, ночное обновление эталона TREx, тесты workspaces с HEPData.
  • Валидация Apex2: NLL parity, bias/pulls regression, SBC calibration, quality gates по NUTS.
  • nextstat-server — self-hosted REST API для общего GPU-инференса. POST /v1/fit, POST /v1/ranking, GET /v1/health. Флаги: --gpu cuda|metal, --port, --host, --threads.
  • nextstat.remote — pure-Python thin client (httpx). client = nextstat.remote.connect("http://gpu-server:3742"), затем client.fit(workspace), client.ranking(workspace), client.health().
  • Batch APIPOST /v1/batch/fit фитит до 100 workspaces одним запросом; POST /v1/batch/toys запускает GPU-ускоренный toy fitting. client.batch_fit(workspaces), client.batch_toys(workspace, n_toys=1000).
  • Model cachePOST /v1/models загружает workspace и возвращает model_id (SHA-256); дальнейшие вызовы /v1/fit и /v1/ranking принимают model_id=, чтобы пропустить повторный парсинг. Вытеснение LRU (64 модели).
  • Docker & Helm — многоступенчатый Dockerfile для CPU и CUDA сборок, Helm chart с health probes, GPU resource requests, настраиваемыми репликами.

Исправлено

  • End-to-end discovery скрипт (e2e_discovery.py): исправлена обработка флага --no-deterministic. Скрипт теперь корректно записывает summary.json и summary.md.
  • CUDA batch toys (--gpu cuda) крэш, когда некоторые тои сходятся раньше других.
  • GPU profiled session (ProfiledDifferentiableSession): сбой сходимости рядом с границами параметров.
  • Optimizer early-stop при отрицательном NLL (target_cost(0.0) удален).
  • kalman_simulate(): поддержка init="sample|mean" и x0=....
  • StatError: некорректное распространение sqrt(sumw2) при нулевых номинальных счетах.
  • Metal GPU: переиспользование scratch buffer (~40% меньше оверхеда аллокаций).
  • HistFactory XML: удаление деклараций <!DOCTYPE> перед парсингом.
  • CUDA/Metal race condition градиента сигнала: некорректная аккумуляция, когда несколько сэмплов вносят вклад в один бин.
  • 10 пропущенных Python re-export в __init__.py: has_metal, read_root_histogram, workspace_audit, cls_curve, profile_curve, kalman_filter/smooth/em/forecast/simulate.
  • Распаковка ROOT TTree: ограничение выходного буфера, чтобы предотвратить OOM на битых/слишком больших baskets.
  • HistFactory XML: fallback на абсолютный путь InputFile и экранирование спецсимволов в ROOT C macro.
  • Metal GPU: ранкинг теперь явно отклоняется с понятной ошибкой (Metal пока не поддерживает ранкинг).
  • StatError: неопределенности HistoName теперь считаются относительными и конвертируются в абсолютные (sigma_abs = rel * nominal), в соответствии с семантикой ROOT/HistFactory.

[0.1.0] — 2026-02-05

Первый публичный релиз

Ядро

  • Модель данных HistFactory workspace с полной совместимостью с pyhf JSON.
  • Пуассоновский NLL со всеми типами модификаторов + Barlow-Beeston.
  • SIMD-ускоренный NLL через wide::f64x4.
  • Автоматическое дифференцирование: forward-mode (dual numbers) и reverse-mode (tape AD).

Частотный вывод

  • MLE через L-BFGS-B с неопределенностями по гессиану.
  • Асимптотический CLs: проверка гипотез (тестовая статистика q-tilde).
  • Сканы профильного правдоподобия, верхние пределы CLs (bisection + linear scan), Brazil bands.
  • Batch MLE, toy studies, ranking мешающих параметров.

Байесовское семплирование

  • No-U-Turn Sampler (NUTS) с dual averaging.
  • Диагностика HMC: divergences (расхождения), tree depth, step size, E-BFMI.
  • Rank-normalized folded R-hat + улучшенный ESS.
  • Python: sample() возвращает ArviZ-совместимый dict.

Регрессия и GLM

  • Линейная, логистическая, Пуассона и отрицательная биномиальная регрессия.
  • Ridge regression (MAP/L2), детектирование separation, поддержка exposure/offset.
  • Кросс-валидация и метрики (RMSE, log-loss, Poisson deviance).

Иерархические модели

  • Random intercepts/slopes, коррелированные эффекты (LKJ + Cholesky), non-centered parameterization.
  • Posterior predictive checks.

Временные ряды

  • Линейно-гауссов фильтр Калмана + RTS smoother.
  • Оценка параметров через EM, многопериодный прогноз с prediction intervals.
  • Конструкторы local-level, local-trend, AR(1). Поддержка пропущенных наблюдений.

Распределения

  • Normal, StudentT, Bernoulli, Binomial, Poisson, NegativeBinomial, Gamma, Exponential, Weibull, Beta.
  • Bijector/transform слой: Identity, Exp, Softplus, Sigmoid, Affine.

Визуализация

  • Кривые профильного правдоподобия и графики CLs Brazil band.
  • CLI: viz profile, viz cls. Python: viz_profile_curve(), viz_cls_curve().

Python-привязки и CLI

  • nextstat Python-пакет (PyO3/maturin) с классами Model и FitResult.
  • nextstat CLI: fit, hypotest, upper-limit, scan, version.
  • CI-воркфлоу и GitHub release pipeline (multi-arch wheels + CLI binary).

Валидация (Apex2)

  • Агрегатор master report: NLL parity, GLM benchmarks, bias/pulls regression, SBC calibration, quality gates по NUTS.
  • Ночной медленный CI workflow.