| 1 | module Fisher ( |
|---|
| 2 | fromMessages |
|---|
| 3 | ) where |
|---|
| 4 | |
|---|
| 5 | import Control.Monad.ST( unsafeIOToST ) |
|---|
| 6 | import Debug.Trace( putTraceMsg ) |
|---|
| 7 | |
|---|
| 8 | import Numeric.LinearAlgebra |
|---|
| 9 | |
|---|
| 10 | import History( History ) |
|---|
| 11 | import Model( Model ) |
|---|
| 12 | import Types |
|---|
| 13 | |
|---|
| 14 | import qualified Model as Model |
|---|
| 15 | import qualified Vars as Vars |
|---|
| 16 | import qualified GHC.ST |
|---|
| 17 | |
|---|
| 18 | |
|---|
| 19 | fromMessages :: Model -> [(Message, History)] -> Herm Matrix Double |
|---|
| 20 | fromMessages m mhs0 = runHermMatrix $ do |
|---|
| 21 | f <- newMatrix (p,p) 0 |
|---|
| 22 | go 0 f mhs0 |
|---|
| 23 | where |
|---|
| 24 | p = Vars.dim $ Model.vars m |
|---|
| 25 | |
|---|
| 26 | go :: Integer -> STMatrix s Double -> [(Message,History)] -> GHC.ST.ST s (Herm (STMatrix s) Double) |
|---|
| 27 | go n f [] = return $ Herm defaultCovUplo f |
|---|
| 28 | go n f ((msg,h):mhs) = let |
|---|
| 29 | (Herm _ f') = Model.covVars m h (messageFrom msg) |
|---|
| 30 | l = fromIntegral $ length $ messageTo msg |
|---|
| 31 | in do |
|---|
| 32 | unsafeIOToST $ putTraceMsg $ show n |
|---|
| 33 | addToMatrixWithScales 1 f l f' f |
|---|
| 34 | go (n+1) f mhs |
|---|