packages feed

hanalyze-0.1.0.0: demo/bayesian/CDFTestDemo.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
-- | 全分布の CDF 動作確認 (Beta / Gamma / Cauchy / StudentT 含む)。
--
-- statistics パッケージの CDF (= 信頼できる reference) があれば比較したいが、
-- ここでは既知の数値 (例: 標準正規 0 で 0.5、対称性チェック) で検証する。
module Main where

import Text.Printf (printf)

import Hanalyze.Model.HBM (Distribution (..), distCDF)

-- distCDF Just から値を取り出す
cdfAt :: Distribution Double -> Double -> Double
cdfAt d x = case distCDF d x of
  Just v  -> v
  Nothing -> 0/0

main :: IO ()
main = do
  putStrLn "═══════════════════════════════════════════════════════════════"
  putStrLn "  CDF 動作確認 (全分布)"
  putStrLn "═══════════════════════════════════════════════════════════════"
  putStrLn ""

  -- Normal
  putStrLn "[Normal] N(0, 1)"
  printf "  F(0) = %.4f  (期待 0.5)\n"   (cdfAt (Normal 0 1) 0)
  printf "  F(1.96) = %.4f  (期待 ≈ 0.975)\n" (cdfAt (Normal 0 1) 1.96)
  printf "  F(-1.96) = %.4f  (期待 ≈ 0.025)\n" (cdfAt (Normal 0 1) (-1.96))
  putStrLn ""

  -- Cauchy (標準)
  putStrLn "[Cauchy] Cauchy(0, 1)"
  printf "  F(0) = %.4f  (期待 0.5)\n" (cdfAt (Cauchy 0 1) 0)
  printf "  F(1) = %.4f  (期待 0.75)\n" (cdfAt (Cauchy 0 1) 1)
  printf "  F(-1) = %.4f  (期待 0.25)\n" (cdfAt (Cauchy 0 1) (-1))
  putStrLn ""

  -- HalfCauchy
  putStrLn "[HalfCauchy] HalfCauchy(1)"
  printf "  F(0) = %.4f  (期待 0)\n" (cdfAt (HalfCauchy 1) 0)
  printf "  F(1) = %.4f  (期待 0.5)\n" (cdfAt (HalfCauchy 1) 1)
  putStrLn ""

  -- Exponential
  putStrLn "[Exponential] Exp(rate=1)"
  printf "  F(0) = %.4f  (期待 0)\n" (cdfAt (Exponential 1) 0)
  printf "  F(1) = %.4f  (期待 ≈ 0.6321)\n" (cdfAt (Exponential 1) 1)
  printf "  F(2) = %.4f  (期待 ≈ 0.8647)\n" (cdfAt (Exponential 1) 2)
  putStrLn ""

  -- Uniform
  putStrLn "[Uniform] U(0, 1)"
  printf "  F(0.3) = %.4f  (期待 0.3)\n" (cdfAt (Uniform 0 1) 0.3)
  printf "  F(0.5) = %.4f  (期待 0.5)\n" (cdfAt (Uniform 0 1) 0.5)
  putStrLn ""

  -- Gamma
  putStrLn "[Gamma] Gamma(shape=2, rate=1)"
  printf "  F(0) = %.4f  (期待 0)\n" (cdfAt (Gamma 2 1) 0)
  printf "  F(2) = %.4f  (期待 ≈ 0.5940)\n" (cdfAt (Gamma 2 1) 2)
  printf "  F(5) = %.4f  (期待 ≈ 0.9596)\n" (cdfAt (Gamma 2 1) 5)
  printf "  F(10) = %.4f  (期待 ≈ 0.9995)\n" (cdfAt (Gamma 2 1) 10)
  putStrLn ""
  putStrLn "[Gamma] Gamma(shape=0.5, rate=1)  ; これは ½χ²(1) と同じ"
  printf "  F(0.5) = %.4f  (期待 ≈ 0.6827)\n" (cdfAt (Gamma 0.5 1) 0.5)
  printf "  F(2) = %.4f  (期待 ≈ 0.9545)\n" (cdfAt (Gamma 0.5 1) 2)
  putStrLn ""

  -- Beta
  putStrLn "[Beta] Beta(2, 5)"
  printf "  F(0) = %.4f  (期待 0)\n" (cdfAt (Beta 2 5) 0)
  printf "  F(0.5) = %.4f  (期待 ≈ 0.8906)\n" (cdfAt (Beta 2 5) 0.5)
  printf "  F(1) = %.4f  (期待 1)\n" (cdfAt (Beta 2 5) 1)
  putStrLn ""
  putStrLn "[Beta] Beta(1, 1)  ; 一様分布と等価"
  printf "  F(0.3) = %.4f  (期待 0.3)\n" (cdfAt (Beta 1 1) 0.3)
  printf "  F(0.7) = %.4f  (期待 0.7)\n" (cdfAt (Beta 1 1) 0.7)
  putStrLn ""

  -- StudentT
  putStrLn "[StudentT] t(df=3, mu=0, sigma=1)"
  printf "  F(0) = %.4f  (期待 0.5)\n" (cdfAt (StudentT 3 0 1) 0)
  printf "  F(1) = %.4f  (期待 ≈ 0.8044)\n" (cdfAt (StudentT 3 0 1) 1)
  printf "  F(-1) = %.4f  (期待 ≈ 0.1956)\n" (cdfAt (StudentT 3 0 1) (-1))
  printf "  F(3.18) = %.4f  (期待 ≈ 0.975 — 95%% CI 上限)\n" (cdfAt (StudentT 3 0 1) 3.18)
  putStrLn ""
  putStrLn "[StudentT] t(df=30) ; df 大で標準正規に近づく"
  printf "  F(0) = %.4f  (期待 0.5)\n" (cdfAt (StudentT 30 0 1) 0)
  printf "  F(1.96) = %.4f  (期待 ≈ 0.9706 — 標準正規だと 0.975)\n" (cdfAt (StudentT 30 0 1) 1.96)
  putStrLn ""

  -- LogNormal
  putStrLn "[LogNormal] LN(0, 1)"
  printf "  F(1) = %.4f  (期待 0.5)\n" (cdfAt (LogNormal 0 1) 1)
  printf "  F(exp(1)) = %.4f  (期待 ≈ 0.8413)\n" (cdfAt (LogNormal 0 1) (exp 1))
  putStrLn ""

  -- HalfNormal
  putStrLn "[HalfNormal] HN(σ=1)"
  printf "  F(0) = %.4f  (期待 0)\n" (cdfAt (HalfNormal 1) 0)
  printf "  F(1) = %.4f  (期待 ≈ 0.6827)\n" (cdfAt (HalfNormal 1) 1)
  printf "  F(2) = %.4f  (期待 ≈ 0.9545)\n" (cdfAt (HalfNormal 1) 2)
  putStrLn ""

  putStrLn "═══════════════════════════════════════════════════════════════"
  putStrLn "  ✓ 全分布で CDF が動作 (Beta/Gamma/Cauchy/StudentT 含む)"
  putStrLn "═══════════════════════════════════════════════════════════════"