module BioInf.RNAFold.EnergyInt
( FoldFunctions (..)
, Fold (..)
) where
import Biobase.Types.Ring
import Biobase.RNA
import Biobase.Constants
import Biobase.Structure.DotBracket
import Biobase.Structure
import Data.PrimitiveArray
import BioInf.RNAFold
import BioInf.RNAFold.Functions
instance Ring Int where
(.+.) = min
(.*.) = (+)
neg = negate
one = 0
zero = eInf
isZero x = x>eMax
n .^. k = n * k
(.^^.) = error "write me"
instance FoldFunctions Int where
calcTermAU tAU p = if p/=vpCG && p/=vpGC then tAU else 0
calcNinio maxNno nno l = min maxNno (nno * l)
calcLargeLoop l = floor $ 108.856 * log (fromIntegral l / 30)
instance Fold Int where
backtrack trnr inp (weak,strong,mbr1,mbr,extern) delta = filter ((<=0) . snd) $ map f $ ext 0 n delta where
f (xs,z) = (Secondary (n+1) xs,optE+deltaz)
n = snd $ bounds inp
optE = extern!(0,n)
newD d here next = d (next here)
ext i j d = let ehere = extern!(i,j) in
[ (x,z)
| i<j
, let d' = newD d ehere (extern!(i+1,j))
, d'>=0
, (x,z) <- ext (i+1) j d'
] ++
[ (x,z)
| i<j
, (_,enext) <- externalLoopIdx trnr inp strong i j
, let d' = newD d ehere enext
, d'>=0
, (x,z) <- str i j d'
] ++
[ (x++y,z)
| i<j
, (k,enext) <- externalAddLoopIdx trnr inp strong extern i j
, let d' = newD d ehere enext
, d'>=0
, (x,z') <- str i k d'
, (y,z) <- ext (k+1) j z' ++ [([],z') | z'>=0 && extern!(k+1,j)==0]
]
str i j d = let ehere = strong!(i,j) in
[ ((i,j):x,z)
| i<j
, (_,enext) <- stackIdx trnr inp strong i j
, let d' = newD d ehere enext
, d'>=0
, (x,z) <- str (i+1) (j1) d'
] ++
[ ((i,j):x,z)
| i<j
, (_,enext) <- stackIdx trnr inp weak i j
, let d' = newD d ehere enext
, d'>=0
, (x,z) <- wea (i+1) (j1) d'
]
wea i j d = let ehere = weak!(i,j) in
[ ([(i,j)],d')
| i<j
, enext <- hairpinIdx trnr inp i j
, let d' = newD d ehere enext
, d'>=0
] ++
[ ((i,j):x,z)
| i<j
, ((k,l),enext) <- (
largeInteriorLoopIdx trnr inp strong i j ++
tabbedInteriorLoopIdx trnr inp strong i j ++
bulgeLIdx trnr inp strong i j ++
bulgeRIdx trnr inp strong i j ++
interior1xnLIdx trnr inp strong i j ++
interior1xnRIdx trnr inp strong i j
)
, let d' = newD d ehere enext
, d'>=0
, (x,z) <- str k l d'
] ++
[ ((i,j):x++y,z)
| i<j
, (k,enext) <- multibranchCloseIdx trnr inp mbr mbr1 i j
, let d' = newD d ehere enext
, d'>=0
, (x,z') <- mul (i+1) k d'
, (y,z) <- mul1 (k+1) (j1) z'
]
mul i j d = let ehere = mbr!(i,j) in
[ (x,z)
| i<j
, ((k,l),enext) <- multibranchUnpairedJIdx trnr inp mbr i j
, let d' = newD d ehere enext
, d'>=0
, (x,z) <- mul k l d'
] ++
[ (x,z)
| i<j
, (k,enext) <- multibranchKJHelixIdx trnr inp strong i j
, let d' = newD d ehere enext
, d'>=0
, (x,z) <- str k j d'
] ++
[ (x++y,z)
| i<j
, (k,enext) <- multibranchAddKJHelixIdx trnr inp mbr strong i j
, let d' = newD d ehere enext
, d'>=0
, (x,z') <- mul i k d'
, (y,z) <- str (k+1) j z'
]
mul1 i j d = let ehere = mbr1!(i,j) in
[ (x,z)
| i<j
, (_,enext) <- multibranchIJLoopIdx trnr inp strong i j
, let d' = newD d ehere enext
, d'>=0
, (x,z) <- str i j d'
] ++
[ (x,z)
| i<j
, ((k,l),enext) <- multibranchUnpairedJIdx trnr inp mbr1 i j
, let d' = newD d ehere enext
, d'>=0
, (x,z) <- mul1 k l d'
]