module BioInf.RNAfold.Library where
import Control.Exception (assert)
import Data.Array.Repa.Index
import Debug.Trace
import qualified Data.Vector.Unboxed as VU
import Data.Strict.Tuple hiding (fst,snd)
import Biobase.Primary
import Biobase.Secondary.Vienna
import Data.PrimitiveArray
import ADP.Fusion.Monadic
import ADP.Fusion.Monadic.Internal
base' :: Primary -> DIM2 -> (Scalar Nuc)
base' inp (Z:.i:.j) = Scalar $ index inp (Z:.i)
baseLr' :: Primary -> DIM2 -> (Scalar (Nuc :!: Nuc))
baseLr' inp (Z:.i:.j)
= assert (let (_,Z:.n) = bounds inp in (i+1==j || i+2==j) && i>=0 && i+1<=n)
. Scalar $ (index inp (Z:.i) :!: index inp (Z:.i+1))
baselR' :: Primary -> DIM2 -> (Scalar (Nuc :!: Nuc))
baselR' inp (Z:.i:.j)
= assert (let (_,Z:.n) = bounds inp in i+1==j && i>0 && i<=n)
. Scalar $ (index inp (Z:.i1) :!: index inp (Z:.i))
region' :: VU.Vector Nuc -> DIM2 -> (Scalar (VU.Vector Nuc))
region' inp (Z:.i:.j)
= assert (let n = VU.length inp 1 in i<=j && i>=0 && j<=n+1)
. Scalar $ VU.unsafeSlice i (ji) inp
primary' :: Primary -> DIM2 -> (Scalar (Primary :!: Int :!: Int))
primary' inp (Z:.i:.j)
= assert (let (_,Z:.u) = bounds inp in i>=0 && j1<=u && i<=j)
$ Scalar (inp :!: i :!: j1)
primaryPR' :: Primary -> DIM2 -> (Scalar (Primary :!: Int :!: Int))
primaryPR' inp (Z:.i:.j)
= assert (let (_,Z:.u) = bounds inp in i>=0 && j2<=u && i<=j)
$ Scalar (inp :!: i :!: j)
primaryPL' :: Primary -> DIM2 -> (Scalar (Primary :!: Int :!: Int))
primaryPL' inp (Z:.i:.j)
= assert (let (_,Z:.u) = bounds inp in i>0 && j1<=u && i<=j)
$ Scalar (inp :!: i1 :!: j1)
regionpl' :: VU.Vector Nuc -> DIM2 -> (Scalar (VU.Vector Nuc))
regionpl' inp (Z:.i:.j)
= assert (let n = VU.length inp 1 in i1<=j && i>0 && j<=n+1)
. Scalar $ VU.unsafeSlice (i1) (ji+1) inp
regionpr' :: VU.Vector Nuc -> DIM2 -> (Scalar (VU.Vector Nuc))
regionpr' inp (Z:.i:.j)
= assert (let n = VU.length inp 1 in i<=j && i>=0 && j+1<=n+1)
. Scalar $ VU.unsafeSlice i (ji+1) inp
basepairing' inp (Z:.i:.j) = tf
where p = mkViennaPair (inp!(Z:.i), inp!(Z:.j1))
Z:.n = snd . bounds $ inp
tf = i>=0 && j>0 && i<=j && j1<=n && i<=n && p /= vpNS
stackpairing' inp k (Z:.i:.j) = tf
where ps = [ mkViennaPair (inp!(Z:.i+l), inp!(Z:.j1l)) | l <-[0..k1] ]
Z:.n = snd . bounds $ inp
tf = i>=k1 && j>k1 && i+k1<=jk+1 && jk<=n && i+k1<=n && all (/=vpNS) ps
constrained cns ij = cns ij
reglen' :: Primary -> DIM2 -> Scalar Int
reglen' inp (Z:.i:.j)
= assert (let (Z:.o,Z:.n) = bounds inp in i>=0 && (j<=n+1 || n== 1) && i<=j)
. Scalar $ ji
reglenpl' :: Primary -> DIM2 -> Scalar (Nuc,Nuc,Int)
reglenpl' inp (Z:.i:.j)
= assert (let (_,Z:.n) = bounds inp in i>0 && j<=n && i<=j)
. Scalar $ (index inp (Z:.i1),index inp (Z:.i),ji)
reglenpr' :: Primary -> DIM2 -> Scalar (Int,Nuc,Nuc)
reglenpr' inp (Z:.i:.j)
= assert (let (_,Z:.n) = bounds inp in i>=0 && j<n && i<=j)
. Scalar $ (ji,index inp (Z:.j1), index inp (Z:.j))
empty :: DIM2 -> Scalar Bool
empty (Z:.i:.j) = Scalar $ i==j