packages feed

loopy-0.0: Mlw.hs

module Mlw where


import System.Environment
import System.Random
import Control.Monad
import System.Directory
import System.Cmd
import Data.Char
import Data.Maybe
import Data.List
import Numeric
import System.FilePath
import Numeric.LinearAlgebra.LAPACK
import Data.Packed.Matrix hiding (Matrix)
import Data.Packed.Vector
import Data.Complex
import Types
import FeedingRates
import Stab
import Graph


--------------------------------------------------------------------------------

readLoopList :: FilePath -> IO [[String]]
readLoopList fp = do
	x<-readFile fp
	let z = map words (lines x)
	return(tail(z))
	

-- output table of LW vs LL for all points

writeTableLW :: FilePath -> IO ()
writeTableLW fp = do
	loops<-readLoopList fp
	let x = map createCoord loops
	writeFile (dropExtension fp ++ ".LWvsLL") (unlines x)
	return()
	
	
createCoord :: [String] -> String
createCoord l = concat $ intersperse "\t" [l!!1,l!!2,l!!3]


-- output table of LWo vs LL for all points

writeTableLWo :: FilePath -> IO ()
writeTableLWo fp = do
	loops<-readLoopList fp
	let loopsO = filter (/=[]) (map filterOmni loops)
	let x = map createCoordo loopsO
	writeFile (dropExtension fp ++ ".LWovsLL") (unlines x)
	return()
	
	
filterOmni :: [String] -> [String]
filterOmni [] = []
filterOmni l = if ((readAsInt (l!!4)) == 2-(readAsInt (l!!1))) then l else []
	
	
filterOmniNot :: [String] -> [String]
filterOmniNot [] = []
filterOmniNot l = if ((readAsInt (l!!4)) == 2-(readAsInt (l!!1))) then [] else l

	
readAsInt :: String -> Int
readAsInt i = read i :: Int

createCoordo :: [String] -> String
createCoordo l = concat $ intersperse "\t" [l!!1,l!!2,l!!3,l!!4]
				{- read first column as-}
-- read in loop row with props and det row number
--convert first to list
--if list contains
--if elem detRow loop then output else Nothing


writeSummaryTableDet :: FilePath -> IO ()
writeSummaryTableDet fp = do
	let lw =   ((dropExtension fp) ++ ".LWvsLL")
	    lwd =  ((dropExtension fp) ++ ".LWdvsLL")
	    lwnd =  ((dropExtension fp) ++ ".LWdNotvsLL")
	a<-findMLW3 lw
	b<-findMLWpos lw
	c<-findMLWneg lw  
	d<-findMLW3o lw
	a2<-findMLW3 lwd
	b2<-findMLWpos lwd
	c2<-findMLWneg lwd  
	d2<-findMLW3o lwd
	a3<-findMLW3 lwnd
	b3<-findMLWpos lwnd
	c3<-findMLWneg lwnd 
	d3<-findMLW3o lwnd
	
	let alll = show a ++ "\t" ++  show b ++ "\t" ++  show c ++ "\t" ++  show d ++ "\n" --("\tLW\tLWo\tLWd\tLWnd\nMLW\t") ++ 
	let det = show a2 ++ "\t" ++  show b2 ++ "\t" ++  show c2 ++ "\t" ++  show d2 ++ "\n" --("MLW3\t") ++ 
	let tro = show a3 ++ "\t" ++  show b3 ++ "\t" ++  show c3 ++ "\t" ++  show d3 ++ "\n" --("MLW3\t") ++ 

	writeFile ((dropExtension fp) ++ ".sumLWsDET")(alll ++ det ++ tro)--
	return()


writeSummaryTableTypes :: FilePath -> IO ()
writeSummaryTableTypes fp = do
	let lw =   ((dropExtension fp) ++ ".LWvsLL")
	    lwo =  ((dropExtension fp) ++ ".LWovsLL")
	    lwd =  ((dropExtension fp) ++ ".LWdvsLL")
	    lwnd =  ((dropExtension fp) ++ ".LWdNotvsLL")
	a<- findMLWn2 lw
	b<-findMLWn2 lwo
	c<-findMLWn2 lwd
	d<-findMLWn2 lwnd
	a2<- findMLW3 lw
	b2<-findMLW3 lwo
	c2<-findMLW3 lwd
	d2<-findMLW3 lwnd
	let mlws = show a ++ "\t" ++  show b ++ "\t" ++  show c ++ "\t" ++  show d ++ "\n" --("\tLW\tLWo\tLWd\tLWnd\nMLW\t") ++ 
	let mlw3s = show a2 ++ "\t" ++  show b2 ++ "\t" ++  show c2 ++ "\t" ++  show d2 ++ "\n" --("MLW3\t") ++ 
	writeFile ((dropExtension fp) ++ ".sumLWs")(mlws ++ mlw3s)--
	return()
{--}
--LWd vs LL [(findMLWn2 lw),(findMLWn2 lwo),(findMLWn2 lwd),(findMLWn2 lwnd)]
writeTableLWd :: FilePath -> IO ()
writeTableLWd fp = do
	loops<-readLoopList ((dropExtension fp) ++ ".loops")
	fw<-fileToFoodweb ((dropExtension fp)  ++ ".fw")
	--putStr("fw\n")
	let ds = map deathRate $ info fw
	--putStr(show ds ++ "\n")
	let detRow = findIndex (==0) ds
	--putStr(show detRow ++ "\n")
	
	let loopsD = filter (/= []) $ map (filterDetritus (fromJust detRow)) loops
	    loopsDV = filter (/=[]) $ map (filterDetrivoreNotStr fw) loopsD
	putStr(show (length (loopsDV)) ++ " loopsDV\n"++ show (length (loops)) ++ " loops\n" ++ show (length (loopsD)) ++ " loopsD\n")
	let x = map createCoord loopsDV
	--putStr(show x++"\n")
	writeFile ( (dropExtension fp)  ++ ".LWdvsLL") (unlines x)
	return()
filterDetrivoreNot :: Foodweb -> Loop -> Loop
filterDetrivoreNot fw l = if (groupElem de es) then []  else l -- if (length de) >=1 then () else l
			where
				e = getEdges fw
				de = getDetrEdges n e
				n = fromJust $ detRow fw
				es = loopToEdges l 
				

filterDetrivoreNotStr :: Foodweb ->  [String] -> [String]
filterDetrivoreNotStr fw  []= []
filterDetrivoreNotStr fw l =  if (groupElem de es) then [] else l -- [f (head (head (convertToList ll!!0))) detRow] ++ [filterDetritus f (tail ll) detRow]
				where 
					de = getDetrEdges n (getEdges fw)
					n = fromJust $ detRow fw
					es = loopToEdges $ (convertToLoop (head l))
--not working properly, i think it is still considering reverse end edges
writeTableLWdNot :: FilePath -> IO ()
writeTableLWdNot fp = do
	loops<-readLoopList ((dropExtension fp) ++ ".loops")
	fw<-fileToFoodweb ((dropExtension fp)  ++ ".fw")
	--putStr("fw\n")
	let ds = map deathRate $ info fw
	--putStr(show ds ++ "\n")
	let detRow = findIndex (==0) ds
	--putStr(show detRow ++ "\n")
	
	let loopsD = filter (/= []) $ map (filterDetritusNot (fromJust detRow)) loops
	    loopsDV =  filter (/=[]) $ map (filterDetrivoreStr fw) loops
	    loopsAll = loopsD -- ++ loopsDV
	--putStr(show loopsD ++ "loopsD\n")
	let x = map createCoord loopsAll
	--putStr(show x++"\n")
	writeFile ( (dropExtension fp)  ++ ".LWdNotvsLL") (unlines x)
	return()


filterDetrivore :: Foodweb -> Loop -> Loop
filterDetrivore fw l = if (length de) >=1 then (if (groupElem de es) then l  else []) else []
			where
				e = getEdges fw
				de = getDetrEdges n e
				n = fromJust $ detRow fw
				es = loopToEdges l 
				
filterDetrivoreStr :: Foodweb ->  [String] -> [String]
filterDetrivoreStr fw  []= []
filterDetrivoreStr fw l =  if (groupElem de es) then l else [] -- [f (head (head (convertToList ll!!0))) detRow] ++ [filterDetritus f (tail ll) detRow]
				where 
					de = getDetrEdges n (getEdges fw)
					n = fromJust $ detRow fw
					es = loopToEdges $ (convertToLoop (head l))

filterDV :: Foodweb -> [String] -> [String]
filterDV  fw  []= []
filterDV fw l = undefined

	
filterDetritus :: Int ->  [String] -> [String]
filterDetrius detRow  []= []
filterDetritus detRow l =  if (elem detRow (convertToList (head l))) then l else [] -- [f (head (head (convertToList ll!!0))) detRow] ++ [filterDetritus f (tail ll) detRow]

getEdges :: Foodweb -> Graph
getEdges fw =  edges
			where
				edges = graphFromMatrix n (wij fw)
				n = length (wij fw) --fromJust $ detRow fw
	 			
getDetrEdges :: Int ->Graph-> Graph
getDetrEdges a [] = []
getDetrEdges n e = if ((fst (head e)) == n) then [head e] ++ (getDetrEdges n (tail e))  else (getDetrEdges n (tail e))

getDetrEdgesFw :: Foodweb -> Graph
getDetrEdgesFw fw =getDetrEdges (fromJust (detRow fw)) (getEdges fw)


detRow :: Foodweb -> Maybe Int
detRow fw = findIndex (==0)$  map deathRate $ info fw

loopToEdges2 :: Loop -> Graph
loopToEdges2 [] = []
loopToEdges2 l = if ((length l) > 1) then [(head l ,head (tail l))] ++ loopToEdges2 ((tail l)) else []

loopToEdges :: Loop -> Graph
loopToEdges l = loopToEdges2 l ++  [(last l, head l)]

justLoops :: [String] -> [String]
justLoops ll =undefined -- ( map head ll )-- :: [Loop]


--if any of l1 are contained in l2 returns l2 else returns empty list
groupElem :: (Eq a) => [a] -> [a] -> Bool
groupElem _ [] = False
groupElem [] l2 = False
groupElem l1 l2 = if elem (head l1) l2 then True else (groupElem (tail l1) l2)

notGroupElem :: (Eq a) => [a] -> [a] -> Bool
notGroupElem [] _ = False
notGroupElem l1 l2 = if notElem (head l1) l2 then True else (notGroupElem (tail l1) l2)

--NOTE the below has not been updated	
writeTableLWdNotONot :: FilePath -> IO ()
writeTableLWdNotONot fp = do
	loops<-readLoopList ((dropExtension fp) ++ ".loops")
	fw<-fileToFoodweb ((dropExtension fp)  ++ ".fw")
	--putStr("fw\n")
	let ds = map deathRate $ info fw
	--putStr(show ds ++ "\n")
	let detRow = findIndex (==0) ds
	--putStr(show detRow ++ "\n")
	
	let loopsD = filter (/= []) $ map (filterNoDetritusNorOmni (fromJust detRow)) loops
	--putStr(show loopsD ++ "loopsD\n")
	let x = map createCoord loopsD
	--putStr(show x++"\n")
	writeFile ( (dropExtension fp)  ++ ".LWdNotOvsLL") (unlines x)
	return()

filterNoDetritusNorOmni :: Int -> [String] -> [String]
filterNoDetritusNorOmni detRow  []= []
filterNoDetritusNorOmni detRow l = filterOmniNot $ filterDetritusNot detRow l

filterDetritusNot :: Int ->  [String] -> [String]
filterDetritusNot detRow  []= []
filterDetritusNot detRow l =  if (notElem detRow (convertToList (head l))) then l else [] -- [f (head (head (convertToList ll!!0))) detRow] ++ [filterDetritus f (tail ll) detRow]



convertToList :: String -> [Int]
convertToList str = read str :: [Int]

convertToLoop :: String -> Loop
convertToLoop str = read str :: Loop
--test $ propEven p == 2 - propLength p

--output table of LWdet vs LL showing det vs non det

--take in table showing LL, LW, sign output 

findMLW :: FilePath -> IO (Double)
findMLW fp  =do
	ls<-readLoopList fp
	let ts = ((transpose ls)!!1) 
	let weights = map read ts:: [Double]
	let res = maximum (weights)
	return (res)

findMLWn2 :: FilePath -> IO (Double)
findMLWn2 fp =  do
	ls <-readLoopList fp -- 
	let lsn2 =  (map filterNot2s ls)
	    res = maximum (lsn2)
	return(res)
findMLW3 :: FilePath -> IO (Double)
findMLW3 fp =  do
	ls <-readLoopList fp -- 
	let lsn2 =  (map filter3s ls)
	    res = maximum (lsn2)
	return(res)
findMLW3o :: FilePath -> IO (Double)
findMLW3o fp = undefined
findMLWpos :: FilePath -> IO (Double)
findMLWpos fp = undefined
findMLWneg :: FilePath -> IO (Double)
findMLWneg fp = undefined


filteros :: [String] -> Double
filteros ls = undefined
filterpos :: [String] -> Double
filterpos ls = undefined
filterneg :: [String] -> Double
filterneg ls = undefined

filterNot2s :: [String] -> Double
filterNot2s ls = if ((ls!!0) /="2") then (read (ls!!1) :: Double) else 0

filter3s :: [String] -> Double
filter3s ls = if ((ls!!0) =="3") then (read (ls!!1) :: Double) else 0