the impossible happened: splitTyConApp
Frederik Eaton
frederik at a5.repetae.net
Sun Jun 11 12:35:53 EDT 2006
Attaching the file, sorry.
When I comment out line 32:
myXlogyx :: Dom a => FVector a -> FVector a -> FVector a
then the error goes away.
On Sun, Jun 11, 2006 at 05:32:49PM +0100, Frederik Eaton wrote:
> Hi,
>
> $ ghc -O3 --make LearnBinFactors.hs -package GSL -o lbf
> Chasing modules from: LearnBinFactors.hs
> Compiling Main ( LearnBinFactors.hs, LearnBinFactors.o )
> ghc-6.4.2: panic! (the `impossible' happened, GHC version 6.4.2):
> splitTyConApp a{tv a8EX}
>
> I've attached the program LearnBinFactors.hs.
>
> The version of the GSL package which it uses can be downloaded from:
>
> http://ofb.net/~frederik/GSLHaskell2.tar.gz
>
> Frederik
>
> --
> http://ofb.net/~frederik/
>
--
http://ofb.net/~frederik/
-------------- next part --------------
{-# OPTIONS -fglasgow-exts #-}
module Main where
import Control.Exception
import Debug.Trace
import Random
import Vector
defaults = P {pY=undefined, pNumFactors=8, pMaxSteps=30, pIters=20}
data Params v n d = P {
pY :: v (n, d),
pMaxSteps :: Int,
pIters :: Int,
pNumFactors :: Int
}
showParams p = show (pY p, pMaxSteps p, pIters p, pNumFactors p)
data State v d k = S {
sMu :: v (d, k),
sSigma2 :: R,
sPie :: v k
}
showState s = show (sMu s, sSigma2 s, sPie s)
seqState s = vseq (sMu s) . vseq (sPie s) . seq (sSigma2 s)
but = flip assert
myXlogyx :: Dom a => FVector a -> FVector a -> FVector a
myXlogyx x y = x * log (y/(x +. 1.0e-20))
--mstep :: (Dom n, Dom d, Dom k) => Params FVector n d -> FVector (n,k) -> FVector (k,k) -> State FVector d k
--mstep :: (Dom n, Dom d, Dom k, Vector v R, Num (v (n,k)), Num (v (d,k)), Num (v (n,d)), FracVector v R) => Params v n d -> v (n,k) -> v (k,k) -> State v d k
mstep (p::Params v n d) (es::v(n,k)) (ess::v(k,k)) = (s::State v d k)
`but` (sigma2 > 0.0)
where
s = S {sMu = (mu::v(d,k)), sSigma2 = sigma2, sPie = pie}
(y::v(n,d)) = pY p
(mu::v(d,k)) = trans (pinv ess *> (trans es *> y))
-- (mu::v(d,k)) = trans (pinv ess * (trans es *> y))
sigma2 = (vsumSq y + vsum (mu * (mu *> ess)) - 2 * vsum (es * (y *> mu))) /
(fromIntegral $ vlen y)
pie = fromRow $ unif *> es
--meanFieldStep :: (Dom n, Dom d, Dom k) => Params FVector n d -> State FVector d k -> FVector (n,k) -> (FVector (n,k), R, R)
meanFieldStep (p::Params v n d) (s::State v d k) (lambda0::(v (n,k))) =
-- trace ("(d,pieExpr,yExpr,lambda,f)"++show (d,pieExpr,yExpr,lambda,f)) $
(lambda::v(n,k), f::R, dist::R)
where
(mu,sigma2,pie) = (sMu s, sSigma2 s, sPie s)
y = pY p
d = fromIntegral $ cols y
pieExpr = log (pie / (1-pie))
lambda = byRow $ \ (p::n) ->
let y_p = getRow y p in
vectorUpdate (fromRow $ getRow lambda0 p) domain $ \lambda_p' (i::k) ->
sigm $ (pieExpr ! i) + (1/sigma2) *
let mu_i = getCol mu i
mu_ss = vsumSq mu_i / 2
lambda_p = toRow lambda_p' in
fromS ((y_p - lambda_p *> trans mu +
(lambda_p ! (0,i)) .* (trans mu_i)) *> mu_i) - mu_ss
f = sum $ foreach $ \p ->
let lp = getRow lambda p
yp = getRow y p
f_ = vsum (myXlogyx lp (toRow pie) + myXlogyx (1-lp) (toRow $ 1-pie))
- d * log sigma2 / 2
- (1/(2*sigma2)) * vsumSq (yp - lp*>(trans mu))
- (1/(2*sigma2))*(vsum ((lp-lp**2)*(sumCols (mu*mu))))
- (d/2)*log(2*pi)
in f_
dist = sqrt $ vsumSq (lambda-lambda0)
--initState :: (Dom k, Dom d) => IO (State FVector d k)
initState () = do -- :: IO (State v d k) = do
(mu0::v(d,k)) <- randIO
putStrLn $ "size of mu0: "++(show (rows mu0, cols mu0))
(sigma2_0::R) <- randomIO >>= (return.(+0.1))
(pie0::v k) <- randIO
return $ S {sMu = mu0, sSigma2 = sigma2_0, sPie = pie0}
--learnBinFactors :: (Dom k, Dom d, Dom n) => Params FVector n d -> IO (State FVector d k)
learnBinFactors (p::Params v n d) = do
s <- initState ()
doIters p 1 s
--doIters :: (Dom n, Dom d, Dom k) => Params FVector n d -> Int -> State FVector d k -> IO (State FVector d k)
doIters p n s | n >= (pIters p) = return s
doIters (p::Params v n d) (n::Int) (s::State v d k) =
seqState s $ trace ("EM iteration: "++show n) $
-- trace ("s="++showState s) $
do
let (mu,sigma2,pie) = (sMu s, sSigma2 s, sPie s)
(lambda0::v(n,k)) <- randIO
let (lambda::v(n,k), f) = meanField p s lambda0
let es = lambda
let ess = (trans lambda) *> lambda +
diag (fromRow $ sumCols lambda - sumCols (lambda * lambda))
let s' = mstep p es ess
doIters p (n+1) s'
--meanField :: (Dom n, Dom d, Dom k) => Params FVector n d -> State FVector d k -> FVector (n,k) -> (FVector (n,k), R)
meanField (p::Params v n d) (s::State v d k) (lambda0::v(n,k)) =
let {(lambda, f, n) =
loopUntil (lambda0, minBound, 0) (\ (lambda, f, n) ->
let (lambda', f', dist) = meanFieldStep p s lambda
in
(if f' < f then
trace ("F decreased in MeanField step "++show n++" from "++show f++" to "++show f')
else id) $
trace ("f="++show f) $
trace ("dist="++show dist) $
((lambda', f', n+1), n+1 < (pMaxSteps p) {- && dist > 1.0e-4 -}))}
in trace ("meanField took "++show n++" steps") $
(lambda, f)
loopUntil :: a -> (a -> (a,Bool)) -> a
loopUntil x0 f = let (x,cont) = f x0 in
if cont then loopUntil x f else x
main = do
readMatrixFile "data.txt" doLearn
doLearn :: forall d n . (Dom n, Dom d) => FVector (n,d) -> IO ()
doLearn y = do
let p = defaults {pY = y}
putStrLn $ "(n,d)="++show (rows y, cols y)
reifyIntegral (pNumFactors p) (\ (_::k_) -> do
(s :: State v d (L k_)) <-
learnBinFactors p
putStrLn $ "mu="++show (sMu s)
putStrLn $ "pi="++show (sPie s)
putStrLn $ "sigma2="++show (sSigma2 s)
)
More information about the Glasgow-haskell-bugs
mailing list