MESSAGE
DATE | 2016-11-02 |
FROM | Christopher League
|
SUBJECT | Re: [Learn] Fitch Algorithm - C++
|
From learn-bounces-at-nylxs.com Wed Nov 2 22:21:11 2016 Return-Path: X-Original-To: archive-at-mrbrklyn.com Delivered-To: archive-at-mrbrklyn.com Received: from www.mrbrklyn.com (www.mrbrklyn.com [96.57.23.82]) by mrbrklyn.com (Postfix) with ESMTP id 2C715161312; Wed, 2 Nov 2016 22:21:11 -0400 (EDT) X-Original-To: learn-at-nylxs.com Delivered-To: learn-at-nylxs.com Received: from liucs.net (contrapunctus.net [174.136.110.10]) by mrbrklyn.com (Postfix) with ESMTP id 21BBA160E77 for ; Wed, 2 Nov 2016 22:21:07 -0400 (EDT) Received: from localhost (pool-74-101-138-109.nycmny.fios.verizon.net [74.101.138.109]) by liucs.net (Postfix) with ESMTPSA id 24518E097 for ; Wed, 2 Nov 2016 22:21:01 -0400 (EDT) From: Christopher League To: learn-at-nylxs.com In-Reply-To: <20161102182751.GA10998-at-www.mrbrklyn.com> References: <20161102182751.GA10998-at-www.mrbrklyn.com> User-Agent: Notmuch/0.21 (http://notmuchmail.org) Emacs/25.1.1 (x86_64-unknown-linux-gnu) Date: Wed, 02 Nov 2016 22:20:59 -0400 Message-ID: <87k2cl7184.fsf-at-contrapunctus.net> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Subject: Re: [Learn] Fitch Algorithm - C++ X-BeenThere: learn-at-nylxs.com X-Mailman-Version: 2.1.17 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: learn-bounces-at-nylxs.com Sender: "Learn"
--=-=-= Content-Type: multipart/alternative; boundary="==-=-="
--==-=-= Content-Type: text/plain
Tonight I put together a small Haskell script for the Fitch algorithm. You specify a tree with its leaves labeled, and it figures out the labels for the interior nodes. There are no transition weights. It outputs the tree in GraphViz format, so we use `dot` to generate the image... see attached.
~~~~ {.haskell} {-# LANGUAGE TypeSynonymInstances, FlexibleInstances, TupleSections #-} import Data.List (intersperse) import Data.Set (Set) import Control.Monad.State import Control.Monad.Writer import qualified Data.Set as Set
data Tree a b = Leaf { leafValue :: b } | Branch { branchValue :: a , branchLeft :: Tree a b , branchRight :: Tree a b } deriving Show
value :: Tree a a -> a value (Leaf a) = a value (Branch a _ _) = a
-- Bottom up phase1 :: Ord b => Tree a b -> (Set b, Tree (Set b) b) phase1 (Leaf b) = (Set.singleton b, Leaf b) phase1 (Branch _ l r) = (s3, Branch s3 l' r') where (s1, l') = phase1 l (s2, r') = phase1 r s3 = if Set.null i then u else i where u = Set.union s1 s2 i = Set.intersection s1 s2
-- Top down phase2 :: Ord b => Tree (Set b) b -> Maybe b -> Tree b b phase2 (Leaf b) _ = Leaf b phase2 (Branch set left right) parentOpt = Branch b (phase2 left (Just b)) (phase2 right (Just b)) where b = case parentOpt of Just p | Set.member p set -> p _ -> Set.elemAt 0 set
-- Combine them together fitch :: Ord b => Tree a b -> Tree b b fitch t = phase2 t' Nothing where (_, t') = phase1 t
------------------------------------------------------------------ -- This part is about visualizing the trees using GraphViz (dot) class ToLabel a where toLabel :: a -> String
instance ToLabel Char where toLabel c = [c]
instance ToLabel String where toLabel = id
instance ToLabel a => ToLabel (Set a) where toLabel s = "{" ++ concat (intersperse "," (map toLabel (Set.toList s))) ++ "}"
next :: State Int Int next = get <* modify (+1)
numberTree :: Tree a b -> State Int (Tree (Int,a) (Int,b)) numberTree (Leaf b) = Leaf . (,b) <$> next numberTree (Branch a l r) = Branch . (,a) <$> next <*> numberTree l <*> numberTree r
graphViz' :: (ToLabel a, ToLabel b) => Tree (Int,a) (Int,b) -> Writer String String graphViz' (Leaf (i,b)) = do let n = "n" ++ show i tell $ n ++ " [shape=box, label=\"" ++ toLabel b ++ "\"]\n" return n graphViz' (Branch (i,a) l r) = do n1 <- graphViz' l n2 <- graphViz' r let np = "n" ++ show i tell $ np ++ " [shape=oval, label=\"" ++ toLabel a ++ "\"]\n" tell $ np ++ " -> " ++ n1 ++ "\n" tell $ np ++ " -> " ++ n2 ++ "\n" return np
graphViz :: (ToLabel a, ToLabel b) => Tree a b -> String graphViz t = "digraph{\n" ++ execWriter (graphViz' t') ++ "}\n" where t' = evalState (numberTree t) 0
-- Sample tree from http://www.cse.nd.edu/~cse/2013fa/40532/lectures/lecture23/lecture23.pdf t1 :: Tree () Char t1 = Branch () ( Branch () ( Branch () (Leaf 'C') (Leaf 'G') ) ( Branch () (Leaf 'T') (Leaf 'G') ) ) (Leaf 'A')
main :: IO () main = putStrLn $ graphViz $ fitch t1 ~~~~
--==-=-= Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable
1.0, user-scalable=3Dyes">
Tonight I put together a small Haskell script for the Fitch algorithm. Y= ou specify a tree with its leaves labeled, and it figures out the labels fo= r the interior nodes. There are no transition weights. It outputs the tree = in GraphViz format, so we use dot to generate the image=E2=80= =A6 see attached.
sourceCode haskell">{-# LANGUAGE TypeSynonymInstances, F= lexibleInstances, TupleSections #-} import Data.Listan> (intersperse) import Data.Setn> (Set) import Control.Monad= .State import Control.Monad= .Writer import qualified Data.Setn> as Set
data Tree a b =3D Leaf {ss=3D"ot"> leafValue :: b } | Branch {=3D"ot"> branchValue :: a , branchLeft :: Tr= ee a b , branchRight :: Tr= ee a b } deriving Show
value :: Tree a a class=3D"ot">-> a value (Leaf a) =3D a value (Branch a _ _) =3D> a
-- Bottom up phase1 :: Ord b lass=3D"ot">=3D> Tree a b =3D"ot">-> (Set b, T= ree (Set b) b) phase1 (Leaf b) =3D (Se= t.singleton b, Leaf b) phase1 (Branch _ l r) =3Dn> (s3, Branch s3 l' r') where (s1, l') =3D phase1 l (s2, r') =3D phase1 r s3 =3D if Set.null i then> u else i where u =3D Set.union s1 s2 i =3D Set.intersection s1 s2
-- Top down phase2 :: Ord b lass=3D"ot">=3D> Tree (t">Set b) b -> Maybe= b -> Tree b b phase2 (Leaf b) _ =3D <= span class=3D"dt">Leaf b phase2 (Branch set left right) parentOpt ass=3D"fu">=3D Branch b (phase2 left (Just<= /span> b)) (phase2 right (Just b)) where b =3D case parentOp= t of Just p | Set.m= ember p set -> p _ -> Set.elemAt 0<= /span> set
-- Combine them together fitch :: Ord b ass=3D"ot">=3D> Tree a b "ot">-> Tree b b fitch t =3D phase2 t' Nothing where (_, t') =3D= phase1 t
--------------------------------------------------------= ---------- -- This part is about visualizing the trees using GraphV= iz (dot) class ToLabel a lass=3D"kw">where toLabel :: a -> pan class=3D"dt">String
instance ToLabel class=3D"dt">Char where toLabel c =3D [c]
instance ToLabel class=3D"dt">String where toLabel =3D id
instance ToLabel a n class=3D"ot">=3D> ToLabel (s=3D"dt">Set a) where toLabel s =3D "{" ++ co= ncat (intersperse "," (map toLabel (Set= .toList s))) ++ "}"<= /span>
next :: State ss=3D"dt">Int Int next =3D get <* modi= fy (+1)
numberTree :: Tree a b = -> State =3D"dt">Int (Tree (Int<= /span>,a) (Int,b)) numberTree (Leaf b) =3D Leaf . (,b) ss=3D"fu"><$> next numberTree (Branch a l r) =3D<= /span> Branch . (,a) lass=3D"fu"><$> next <*> numbe= rTree l <*> numberTree r
graphViz' :: (ToLabeln> a, ToLabel b) =3D>> Tree (Int,a) (lass=3D"dt">Int,b) -> ">Writer String String<= /span> graphViz' (Leaf (i,b)) =3D= do let n =3D =3D"st">"n" ++ show i tell $ n ++ ss=3D"st">" [shape=3Dbox, label=3D\"" fu">++ toLabel b ++ &qu= ot;\"]\n" return n graphViz' (Branch (i,a) l r) u">=3D do n1 <- graphViz' l n2 <- graphViz' r let np =3D s=3D"st">"n" ++ show i tell $ np ++ ass=3D"st">" [shape=3Doval, label=3D\"" =3D"fu">++ toLabel a ++ >"\"]\n" tell $ np ++ ass=3D"st">" -> " ++ n1 class=3D"fu">++ "\n" tell $ np ++ ass=3D"st">" -> " ++ n2 class=3D"fu">++ "\n" return np
graphViz :: (ToLabel a,= ToLabel b) =3D> an class=3D"dt">Tree a b -> =3D"dt">String graphViz t =3D "digraph{\n" ++pan> execWriter (graphViz' t') ++ lass=3D"st">"}\n" where t' =3D eval= State (numberTree t) 0
-- Sample tree from http://www.cse.nd.edu/~cse/2013fa/40= 532/lectures/lecture23/lecture23.pdf t1 :: Tree () ss=3D"dt">Char t1 =3D Branch () ( Branch () ( Branch () (Leaf 'C'an>) (Leaf 'G'an>) ) ( Branch () (Leaf 'T'an>) (Leaf 'G'an>) ) ) (Leaf 'A')
main :: IO () main =3D putStrLn $ graphViz $= fitch t1
--==-=-=--
--=-=-= Content-Type: image/png Content-Disposition: inline; filename=fitch.png Content-Transfer-Encoding: base64
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 +/8AguxEsm4JSYwAAAAASUVORK5CYII= --=-=-= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline
_______________________________________________ Learn mailing list Learn-at-nylxs.com http://lists.mrbrklyn.com/mailman/listinfo/learn
--=-=-=--
|
|