SPB Git

spb/metrika

Public

Stata-class statistics, GPU-accelerated by Apple Silicon. Native Swift — no Electron, no Python runtime, no compromises.

History of MetrikaKit/Sources/ZQParser/KnownVerbs.swift Clear filter
page 1
  1. Wed, Aug 5, 2026 8

    1. feat: v1.0 features — sample datasets, docs site, Metal 2M-point renderer
      …
      - sysuse command with bundled samples (sales: 200-firm x 5-year panel;
        mtcars) shipped as ZQEngine resources, generated by
        scripts/make_samples.R
      - metrika-cli docs: static documentation site rendered from the shared
        command registry (docs/index.html, 38 commands, light/dark); CLI
        restructured with a default 'run' subcommand
      - Metal point-sprite renderer (CLAUDE.md §7 pane 4): packed 12-byte
        vertices, unified-memory buffer written once, scroll-pan /
        pinch-zoom / double-click-reset touching only a 24-byte uniform;
        takes over scatter plots past 100k points (METRIKA_METAL_THRESHOLD
        override for tests); verified rendering 2,000,000 points in-app
      - METRIKA_AUTORUN debug hook for headless app driving
      - MARKETING_VERSION 1.0.0
      - 116 kit tests + 4 UI tests green
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher · 1 file +2 −1
    2. feat(stats): gradient-boosted regression trees (boost command)
      …
      - ZQGradientBoosting: exact-greedy trees cloning xgboost's algorithm —
        gain 1/2[GL2/(HL+l) + GR2/(HR+l) - G2/(H+l)] - gamma, leaf -G/(H+l),
        midpoint splits between consecutive distinct values, missing rows
        default left, pre-sorted feature indices; squared loss, deterministic
        (no subsampling)
      - engine: 'boost y x…, rounds(#) [eta() maxdepth() lambda()]' reporting
        training R2/RMSE with an in-sample caveat; model stored in the
        estimation state (Kind.boost) so predict routes through the trees
        (missing features follow the default direction); margins and GLM
        statistics refused after boost
      - validation: per-observation prediction parity with R xgboost 3.2
        (exact method, base_score = mean) at 1e-4 (xgboost is float32
        internally); a stump finds the exact midpoint split with lambda 0;
        training loss decreases monotonically in rounds
      - manual entry + coverage test
      - 115 tests green (swift test and xcodebuild with GPU suites)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher · 1 file +1
    3. feat(stats): Bayesian linear regression via Gibbs sampling (bayes prefix)
      …
      - PhiloxStream in ZQGPU: sequential variate stream over a dedicated
        counter block (bit 62 + per-stream 2^48 words, disjoint from bootstrap
        and permutation streams); Box-Muller normals, Marsaglia-Tsang gammas
        (moments verified against theory at 200k draws)
      - ZQBayesianRegression: semi-conjugate Gibbs with Stata bayes default
        priors (coefficients N(0, 10000), variance InvGamma(.01, .01)); exact
        full conditionals via dense Cholesky; posterior mean/sd and
        equal-tailed 95% credible intervals; ZQStats now depends on ZQGPU for
        the shared RNG
      - engine: 'bayes [, mcmcsize() burnin() seed() normalprior()]: reg …'
        with reproducible chains; manual entry included
      - validation: with diffuse priors the posterior reproduces OLS (mean
        within 5% of a posterior SD, sd ratio in [0.9, 1.15], CrI brackets the
        estimate, sigma recovers the DGP); tight priors shrink toward zero;
        chains bit-reproducible per seed
      - 111 tests green (swift test and xcodebuild with GPU suites)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher · 1 file +2 −1
    4. feat(stats): elastic net and lasso via coordinate descent
      …
      - ZQElasticNet: cyclic coordinate descent with residual updates,
        glmnet-convention objective ((1/2n)RSS + lambda(alpha*l1 +
        (1-alpha)/2*l2)), internal predictor standardization (1/n variance),
        unpenalized intercept, coefficients reported on the original scale;
        lambdaMax helper
      - matched glmnet's gaussian y-standardization quirk deliberately: the L1
        penalty is invariant to it but the effective ridge penalty scales by
        1/sd(y) — without this, alpha<1 fits diverge from glmnet by ~10%
      - engine: 'elasticnet y x…, lambda(#) [alpha(#)]' and 'lasso' (alpha
        fixed at 1); missing lambda() errors with the data's lambda_max as a
        hint; predict works afterwards, margins refuses (no VCE)
      - fixtures: glmnet 5.0 at thresh 1e-15 over deliberately correlated
        regressors; coefficients match at 1e-6 (documented tolerance for
        penalized iterative solvers) and the selection pattern (which
        coefficients are exactly zero) matches exactly
      - ZQCoefficient gains a public initializer
      - 104 tests green (swift test and xcodebuild with GPU suites)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher · 1 file +2
    5. feat(engine): margins dydx() with delta-method standard errors
      …
      - ZQOLSResult/ZQGLMResult expose the full covariance matrix (column-major
        k x k aligned with coefficients); IV passes it through
      - EstimationState carries vce, inference df, and the estimation-sample
        design (GLMs only — AMEs need it)
      - margins, dydx(varlist): OLS/IV effects are the coefficients with their
        SEs; GLM average marginal effects with analytic delta gradients
        (logit p(1-p)(1-2p), probit -xb*phi, poisson exp) over the estimation
        sample; t or z inference per model kind
      - factor/interaction dydx rejected with a clear message (discrete-change
        margins later); continuous terms of factor models work
      - R fixtures mirror the exact formulas at the converged coefficients;
        logit/poisson AME and delta SE match at 1e-10
      - 98 tests green (swift test and xcodebuild with GPU suites)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher · 1 file +1
    6. feat(stats): permutation tests and single-variable graphics
      …
      - ZQResampling.permutationIndices: permutation as argsort of 64-bit
        Philox keys — order-free and counter-addressable so a future GPU
        argsort path reproduces it exactly; dedicated stream offset (bit 63,
        applied after word expansion) keeps permutations disjoint from
        bootstrap draws under the same seed
      - engine: 'permute, reps(#) [seed(#)]: reg …' — permutes the response
        within the estimation sample, parallel chunked refits, empirical
        two-sided p per coefficient (c, reps, p, SE(p)); degenerate _cons row
        omitted
      - planner: GPU heuristic restricted to bootstrap until the permute
        argsort path lands
      - graphics: standalone histogram/scatter/kdensity verbs; single-variable
        histogram (Sturges default, bins() option) and Epanechnikov kdensity
        with Silverman bandwidth (density integrates to 1 in tests)
      - 81 tests green (swift test and xcodebuild with GPU suites)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher · 1 file +1
    7. feat(stats): xtreg fixed effects and ivregress 2sls
      …
      - parser: (endog = instruments) varlist groups -> ZQIVSpec; digit-led
        sub-commands (2sls) reassembled from number+identifier tokens via
        column adjacency
      - ZQFixedEffects: within estimator with Stata conventions (add-back
        means, reported _cons, df = N-K-G), within R-squared, panel-clustered
        VCE with G/(G-1) and t on G-1 df; v0.2 restriction: cluster variable
        must equal the panel variable
      - ZQIV: 2SLS via thin-Q projection of the instrument matrix (Z'Z never
        formed), residuals from original regressors, Stata 'small' inference,
        classical/HC1/cluster VCE built on projected regressors
      - engine: xtreg (requires xtset + fe), ivregress 2sls with dedicated
        listwise deletion across depvar/exog/endog/instruments; shared
        coefficient-table renderer extracted
      - fixtures: z1/z2 instrument columns (drawn after existing draws, earlier
        golden values bit-identical), manual within/2SLS algebra in R
      - 75 tests green (swift test and xcodebuild with GPU suites)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher · 1 file +1 −1
    8. feat: bootstrap Metrika v0.1 skeleton with working ZQL vertical slice
      …
      - MetrikaKit SPM package: ZQParser, ZQPlanner, ZQEngine, ZQData, ZQStats,
        ZQGPU, ZQGraphics, ZQPlugins (Swift 6, strict concurrency)
      - ZQL parser: lexer, Pratt expressions, factor variables, prefix commands,
        column-cited errors with Levenshtein verb suggestions
      - ZQData: DuckDB-backed load/save (parquet, csv, json, arrow)
      - ZQStats: OLS via LAPACK QR, HC0-HC3 and cluster-robust SE, summarize,
        t/F distributions accurate in the far tails
      - ZQGPU: Philox4x32-10 reference RNG, counter-addressable bootstrap
      - ZQEngine: session actor with use/save/gen/replace/drop/keep/summarize/
        regress/count/list/graph/bootstrap/set seed/xtset/log
      - SwiftUI app (xcodegen): console with history, variables sidebar,
        Swift Charts plots; sandboxed + hardened runtime entitlements
      - Tests: 44 green (parser golden, R fixtures at 1e-10, Philox KAT,
        end-to-end engine); Tests/Fixtures/generate.R; Tests/Bench harness
      - scripts: check_headers.sh + pre-commit hook, make_icns.sh, release.sh
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      simon-pierre boucher · 1 file +109
Menu

Theme