packages feed

ppad-eproc-0.1.0: lib/Numeric/Eproc/Common.hs

{-# OPTIONS_HADDOCK prune #-}

-- |
-- Module: Numeric.Eproc.Common
-- Copyright: (c) 2026 Jared Tobin
-- License: MIT
-- Maintainer: Jared Tobin <jared@ppad.tech>
--
-- Shared vocabulary for the eproc tests: the predictable bettor
-- strategies and the test verdict type. Re-exported from each test
-- module ("Numeric.Eproc.Bounded", "Numeric.Eproc.Paired",
-- "Numeric.Eproc.Bernoulli"); import this module directly only if
-- you need the types without picking a particular test.

module Numeric.Eproc.Common (
    Bettor(..)
  , Verdict(..)
  ) where

-- | A predictable bettor.
--
--   A bettor describes how, given the history of centred
--   observations @z_t@ (each test module specifies its own centring;
--   see the per-module documentation), the next predictable bet
--   @lambda_t@ is chosen. Predictability -- that is, @lambda_t@
--   depends only on data observed strictly before step @t@ -- is
--   what makes the resulting wealth process a nonnegative
--   supermartingale under @H_0@.
--
--   For 'Adaptive' and 'Newton', a safe-bet ceiling @lambda_max@
--   derived from the test's admissible-observation range is enforced
--   by clipping @lambda@ to @[0, lambda_max]@, so the wealth factor
--   stays nonnegative.
--
--   * 'Fixed' always bets the supplied constant @lambda@. The wager
--     does not respond to observed data; this strategy is useful
--     only as a baseline.
--
--   * 'Adaptive' is the aGRAPA (approximate growth-rate adaptive
--     predictable plug-in) bettor of Waudby-Smith & Ramdas (2024).
--     It tracks the empirical mean @mu@ and variance @sigma^2@ of
--     centred observations and bets the Kelly-optimal plug-in
--     @lambda* = mu \/ (sigma^2 + mu^2)@ clipped to
--     @[0, lambda_max]@. Fast to compute and competitive in
--     practice.
--
--   * 'Newton' is the online Newton step (ONS) bettor. The per-step
--     log-wealth loss @-log(1 + lambda * z)@ is convex in @lambda@;
--     ONS performs one Newton step per observation, accumulating
--     squared gradients to scale the update. Achieves logarithmic
--     regret against the best constant bet in hindsight and is in
--     practice the strongest of the three bettors under most signal
--     regimes.
data Bettor =
    Fixed {-# UNPACK #-} !Double
  | Adaptive
  | Newton
  deriving (Eq, Show)

-- | Test outcome at the current sample count.
--
--   'Reject' means the wealth process has crossed the rejection
--   threshold, so @H_0@ is rejected at level @alpha@. 'Continue'
--   means there is not yet enough evidence; collect more samples
--   (or stop and report no rejection -- the type-I error guarantee
--   holds for /any/ stopping rule).
data Verdict =
    Reject
  | Continue
  deriving (Eq, Show)