File: BirthDeath2.hs

package info (click to toggle)
bali-phy 4.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 15,392 kB
  • sloc: cpp: 120,442; xml: 13,966; haskell: 9,975; python: 2,936; yacc: 1,328; perl: 1,169; lex: 912; sh: 343; makefile: 26
file content (64 lines) | stat: -rw-r--r-- 2,424 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
{-# LANGUAGE RecursiveDo #-}
module Probability.Distribution.Tree.BirthDeath2 where

import Probability

type Time = Double
data Tree = Tree Int Time [Tree] (Maybe Tree)

nodeTime (Tree _ t _ _) = t
setParent p (Tree n t children _) = (Tree n t children (Just p))

sampleBirthDeathNode t b d s = do
  delta <- sample $ exponential (1/(b + d + s))
  u <- uniqueInt
  r <- sample $ uniform 0 (d + s + b)
  if delta > t
  then return (Tree u 0 [] Nothing) -- survives until present, and is observed.
  else do
      let nchildren = case () of _ | r > d + s -> 2
                                   | r > d     -> 1
                                   | otherwise -> 0
          t2 = t - delta

      children <- sequence $ replicate nchildren (sampleBirthDeathNode t2 b d s)
      let node = Tree u t2 (setParent node <$> children) Nothing
      return node

sampleBirthDeathTree1 t b d s = do
    u <- uniqueInt
    left <- sampleBirthDeathNode t b d s
    let node = Tree u t [setParent node left] Nothing
    return node

sampleBirthDeathTree2 t b d s = do
    u <- uniqueInt
    left <- sampleBirthDeathNode t b d s
    right <- sampleBirthDeathNode t b d s
    let node = Tree u t (setParent node <$> [left, right]) Nothing
    return node


instance Show Tree where
    show (Tree node t children Nothing) = "(Tree " ++ show node ++ " " ++ show t ++ " " ++ show children ++ " ROOT)"
    show (Tree node t children (Just p)) = "(Tree " ++ show node ++ " " ++ show t ++ " " ++ show children ++ " " ++ show (nodeTime p) ++ ")"

survivingTips (Tree node t [] _) | t <= 0  = [node]
                                 | otherwise = []
survivingTips (Tree node t children _) = concat [survivingTips child | child <- children]

allTips (Tree node t [] _) = [node]
allTips (Tree node t children _) = concat [allTips child | child <- children]

sampledNodes (Tree node t [] _) = [node]
sampledNodes (Tree node t [child] _) = [node] ++ sampledNodes child
sampledNodes (Tree node t children _) = concat [sampledNodes child | child <- children]

brLen t Nothing = ""
brLen t (Just p) = ":" ++ show (nodeTime p - t)

toNewickNode (Tree node t [] p) = show node ++ brLen t p
toNewickNode (Tree node t [child] p) = "(" ++ toNewickNode child  ++ ")" ++ show node ++ brLen t p
toNewickNode (Tree node t children p) = "(" ++ intercalate "," [toNewickNode child | child <- children] ++ ")" ++ brLen t p

toNewick tree = toNewickNode tree ++ ";"