hanalyze-0.2.0.0: test/SpecHelper.hs
{-# OPTIONS_GHC -Wno-unused-imports #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}
-- 全 Spec ファイル共通の helper / orphan Arbitrary instance。
module SpecHelper where
import qualified Data.Vector as V
import qualified Data.Text as T
import qualified Numeric.AD.Mode.Reverse.Double as RevD
import qualified Numeric.LinearAlgebra as LA
-- (DataFrame の直接 import は未使用のため削除 = upstream decomp PR#2 移植の副産物調査で判明)
import qualified Hanalyze.Design.Orthogonal as OA
import qualified Hanalyze.Design.Quality as Quality
import qualified Hanalyze.Design.Taguchi as TG
import qualified Hanalyze.Model.LM as LM
import qualified Hanalyze.Model.LM.Diagnostics as LMD
import qualified Hanalyze.DataIO.Preprocess as Pp
import qualified Hanalyze.DataIO.Log as Log
import qualified Hanalyze.DataIO.CSV as CSV
import qualified Hanalyze.DataIO.Convert as Conv
import qualified Hanalyze.DataIO.Health as Health
import qualified Hanalyze.DataIO.Clean as Clean
import qualified Hanalyze.DataIO.Convert as Conv2
import qualified Hanalyze.Stat.Standardize as Std
import qualified Hanalyze.Stat.NumberFormat as NF
import qualified Hanalyze.Stat.Interpolate as Interp
import qualified Hanalyze.Stat.AdaptiveGrid as AG
import qualified Hanalyze.Stat.KernelDist as KD
import qualified Hanalyze.Stat.Cholesky as Chol
import qualified Hanalyze.Stat.QuasiRandom as QR
import qualified Hanalyze.Stat.Test as ST
import qualified Hanalyze.Model.HierarchicalCluster as HC
import qualified Hanalyze.Model.AFT as AFT
import qualified Hanalyze.Model.RandomForestClassifier as RFC
import qualified Hanalyze.Model.RandomForest as RF
import qualified Hanalyze.Model.FitYByX as FXY
import qualified Hanalyze.Model.Weibull as WB
import qualified Data.Vector.Unboxed as VU
import qualified Hanalyze.Stat.ClassMetrics as CM
import qualified Hanalyze.Stat.CV as CV
import qualified Hanalyze.Stat.MultipleTesting as MT
import qualified Hanalyze.Stat.Bootstrap as Boot
import qualified Hanalyze.Stat.Effect as Eff
import qualified Hanalyze.Stat.Interpret as Interp
import qualified Hanalyze.Stat.SPC as SPC
import qualified Hanalyze.Model.Weibull as Wei
import qualified Hanalyze.Model.Reliability as Rel
import qualified Hanalyze.Optim.NSGA as NSGAP3
import qualified Hanalyze.Stat.GroupComparison as GC
import qualified Hanalyze.Design.Optimal as OPT
import qualified Hanalyze.Design.Diagnostics as DDiag
import qualified Hanalyze.Design.Constraint as DCons
import qualified Hanalyze.Design.Custom.Factor as CF
import qualified Hanalyze.Design.Custom.Model as CM
import qualified Hanalyze.Design.Custom.Constraint as CC
import qualified Hanalyze.Design.Custom.RegionMoment as RM
import qualified Hanalyze.Design.Custom.Coordinate as CX
import qualified Hanalyze.Design.Custom.Compare as CCMP
import qualified Hanalyze.Design.Custom.Power as CPW
import qualified Hanalyze.Design.Custom.Augment as CAUG
import qualified Hanalyze.Design.Custom.SplitPlot as CSP
import qualified Hanalyze.Design.Custom.Bayesian as CB
import qualified Data.Vector.Storable as VS
import qualified Data.Map.Strict as M
import qualified Data.Set as Set
import qualified Hanalyze.Model.StateSpace as SS
import qualified Hanalyze.Model.NeuralNetwork as NN
import qualified Hanalyze.Model.GradientBoosting as GB
import qualified Hanalyze.Stat.MDS as MDS
import qualified Hanalyze.Model.KNN as KNN
import qualified Hanalyze.Model.NaiveBayes as NB
import qualified Hanalyze.Model.GARCH as GARCH
import qualified Hanalyze.Model.VAR as VAR
import qualified Hanalyze.Model.CompetingRisks as CR
import qualified Hanalyze.Model.ReliabilityBlockDiagram as RBD
import qualified System.Random.MWC.Distributions as MWCD
import qualified Hanalyze.Design.SpaceFilling as SF
import qualified Hanalyze.Design.DSD as DSD
import qualified Hanalyze.Design.Mixture as Mix
import qualified Hanalyze.Design.Sequential as Seq
import qualified Hanalyze.Design.RSM as RSMd
import qualified Hanalyze.Model.PCA as PCA
import qualified Hanalyze.Model.Cluster as Cl
import qualified Hanalyze.Model.DecisionTree as DT
import qualified Hanalyze.Model.TimeSeries as TS
import qualified Hanalyze.Model.Survival as Surv
import qualified Hanalyze.DataIO.Reshape as Reshape
import qualified Hanalyze.Optim.NSGA as NSGA
import qualified System.Random.MWC as MWC
import qualified Hanalyze.Model.KernelRegression as Kn
import qualified Hanalyze.Model.GP as GP
import qualified Hanalyze.Model.GPRobust as GPR
import qualified Hanalyze.Viz.ReportBuilder as RB
import qualified Hanalyze.Viz.ModelGraph as VMG
import qualified Hanalyze.Viz.ModelGraphDot as VMGD
import qualified Data.ByteString as BS
import qualified Hanalyze.Model.GP as GP
import qualified Hanalyze.Model.GPRobust as GPR
import qualified Hanalyze.Model.RFF as RFF
import qualified Hanalyze.Model.Regularized as Reg
import qualified Hanalyze.Model.Spline as Sp
import qualified Hanalyze.Model.KernelRegression as K
import qualified Hanalyze.Model.Core as Core
import qualified Hanalyze.Model.GLM as GLM
import qualified Hanalyze.Optim.NelderMead as NM
import qualified Hanalyze.Optim.LBFGS as LBFGS
import qualified Hanalyze.Optim.LineSearch as LS
import qualified Hanalyze.Optim.DifferentialEvolution as DE
import qualified Hanalyze.Optim.CMAES as CMAES
import qualified Hanalyze.Optim.CMAESFull as CMAESF
import qualified Hanalyze.Optim.SimulatedAnnealing as SA
import qualified Hanalyze.Optim.ParticleSwarm as PSO
import qualified Hanalyze.Optim.Constrained as Con
import qualified Hanalyze.Optim.BayesOpt as BO
import qualified Hanalyze.Optim.Common as OC
import qualified System.Random.MWC as MWC
import qualified Hanalyze.MCMC.NUTS as NUTS
import qualified Hanalyze.MCMC.SMC as SMC
import qualified Hanalyze.MCMC.MH as MH
import qualified Hanalyze.MCMC.Slice as Slice
import qualified Hanalyze.MCMC.HMC as HMC
import qualified Hanalyze.MCMC.Gibbs as Gibbs
import qualified Hanalyze.Stat.BridgeSampling as BS
import qualified Hanalyze.Stat.BayesFactor as BF
import qualified Hanalyze.Stat.BayesianModelAveraging as BMA
import qualified Hanalyze.Stat.Causal.PropensityScore as PS
import qualified Hanalyze.Stat.Causal.IPW as CIPW
import qualified Hanalyze.Stat.Causal.DoublyRobust as CDR
import qualified Hanalyze.Stat.Causal.CATE as CCATE
import qualified Hanalyze.Model.RegularizedAdvanced as RegA
import qualified Hanalyze.Model.Robust as Rob
import qualified Hanalyze.Stat.CorrelationNetwork as CN
import qualified Hanalyze.Model.LatentClassAnalysis as LCA
import qualified Hanalyze.Model.FDA as FDA
import qualified Hanalyze.Model.LiNGAM.Direct as LNG
import qualified Hanalyze.Model.LiNGAM.Pairwise as LNGP
import qualified Hanalyze.Model.LiNGAM.MultiGroup as LNGM
import qualified Hanalyze.Model.LiNGAM.VAR as LNGV
import qualified Hanalyze.Model.LiNGAM.Parce as LNGPa
import qualified Hanalyze.Model.LiNGAM.Bootstrap as LNGB
import qualified Hanalyze.Model.LiNGAM.ICA as LNGI
import qualified Hanalyze.Math.Hungarian as Hung
import qualified Hanalyze.Math.HSIC as HSIC
import qualified Hanalyze.Model.DAG as DAG
import qualified Hanalyze.MCMC.Core as Core
import qualified Hanalyze.MCMC.BayesianTest as BAB
import qualified Hanalyze.Model.PLS as PLS
import qualified Hanalyze.Model.Discriminant as LDA
import qualified Hanalyze.Design.GaugeRR as GRR
import qualified Hanalyze.Model.HBM as HBM
import qualified Hanalyze.Model.HBM.Interp as HI
import qualified Hanalyze.Stat.VI as VI
import qualified Data.Map.Strict as M
import Test.Hspec
import Test.Hspec.QuickCheck (prop)
import Test.QuickCheck
import Hanalyze.Model.Formula
import Hanalyze.Model.Formula.Frame
import Hanalyze.Model.Formula.Design
import Hanalyze.Model.Formula.RFormula
import Hanalyze.Model.Formula.Nonlinear
import Hanalyze.Model.Formula.Mixed
import Hanalyze.Model.GLMM
import Hanalyze.Model.GLM (Family (..), LinkFn (..))
import Hanalyze.Stat.Distribution (Transform)
import Data.List (sort, nub)
import Control.Monad (forM, forM_)
import System.IO.Temp (withSystemTempFile)
import System.IO (hPutStr, hClose)
import Hanalyze.Model.HBM.Ast (Expr (..), Lit (..), DoStmt (..), Err)
import Data.IORef (newIORef, readIORef, modifyIORef')
isLeftE :: Either a b -> Bool
isLeftE = either (const True) (const False)
isRightE :: Either a b -> Bool
isRightE = either (const False) (const True)
genName :: Gen T.Text
genName = elements ["a", "b", "c", "x", "y", "z", "g", "t", "b0", "b1", "bg"]
genTerm :: Int -> Gen Term
genTerm n
| n <= 1 = oneof
[ Lit . fromIntegral <$> (choose (0, 9) :: Gen Int)
, Ref <$> genName
]
| otherwise = oneof
[ Lit . fromIntegral <$> (choose (0, 9) :: Gen Int)
, Ref <$> genName
, App <$> genName <*> (choose (1, 2) >>= \k -> vectorOf k (genTerm (n `div` 2)))
, Index <$> genTerm (n `div` 2) <*> genTerm (n `div` 2)
, Neg <$> genTerm (n - 1)
, Bin <$> elements [Add, Sub, Mul, Div, Pow]
<*> genTerm (n `div` 2) <*> genTerm (n `div` 2)
]
instance Arbitrary Formula where
arbitrary = do
nd <- choose (0, 2) :: Gen Int
vars <- vectorOf (nd + 1) genName
rhs <- sized genTerm
pure (Formula (head vars) (tail vars) rhs)