module HLearn.Models.Distributions.Multivariate.Internal.Ignore
( Ignore
, Ignore' (Ignore')
) where
import Control.DeepSeq
import HLearn.Algebra
import HLearn.Models.Distributions.Common
import HLearn.Models.Distributions.Multivariate.Internal.Unital
import HLearn.Models.Distributions.Multivariate.Internal.Marginalization
newtype Ignore' (label:: *) (basedist:: *) (prob :: *) = Ignore' { basedist :: basedist }
deriving (Show,Read,Eq,Ord,NFData)
type family Ignore (xs :: [*]) :: [* -> * -> *]
type instance Ignore '[] = '[]
type instance Ignore (x ': xs) = (Ignore' x) ': (Ignore xs)
instance (Abelian basedist) => Abelian (Ignore' label basedist prob)
instance (Monoid basedist) => Monoid (Ignore' label basedist prob) where
mempty = Ignore' mempty
mappend d1 d2 = Ignore' $ mappend (basedist d1) (basedist d2)
instance (Group basedist) => Group (Ignore' label basedist prob) where
inverse d = Ignore' $ inverse (basedist d)
instance (HasRing basedist) => HasRing (Ignore' label basedist prob) where
type Ring (Ignore' label basedist prob) = Ring basedist
instance (Module basedist) => Module (Ignore' label basedist prob) where
r .* d = Ignore' $ r .* basedist d
instance
( HomTrainer basedist
, Datapoint basedist ~ HList ys
) => HomTrainer (Ignore' label basedist prob)
where
type Datapoint (Ignore' label basedist prob) = label `HCons` (Datapoint basedist)
train1dp (dp:::basedp) = Ignore' $ train1dp basedp
instance (NumDP basedist) => NumDP (Ignore' label basedist prob) where
numdp (Ignore' basedist) = numdp basedist
instance Probabilistic (Ignore' label basedist prob) where
type Probability (Ignore' label basedist prob) = prob
instance
( Probability basedist ~ prob
, HomTrainer (Ignore' label basedist prob)
, Datapoint (Ignore' label basedist prob) ~ HList dpL
, Datapoint basedist ~ HList basedpL
, PDF basedist
) => PDF (Ignore' label basedist prob)
where
pdf dist (label:::basedp) = pdf (basedist dist) basedp
instance
( Marginalize' (Nat1Box n) basedist
) => Marginalize' (Nat1Box (Succ n)) (Ignore' label basedist prob)
where
type Margin' (Nat1Box (Succ n)) (Ignore' label basedist prob) = Margin' (Nat1Box n) basedist
getMargin' _ dist = getMargin' (undefined :: Nat1Box n) $ basedist dist
type MarginalizeOut' (Nat1Box (Succ n)) (Ignore' label basedist prob) =
Ignore' label (MarginalizeOut' (Nat1Box n) basedist) prob
marginalizeOut' _ dist = Ignore' $ marginalizeOut' (undefined :: Nat1Box n) $ basedist dist
condition' _ dist dp = Ignore' $ condition' (undefined :: Nat1Box n) (basedist dist) dp