module BioInf.ViennaRNA.Bindings.FFI.PartFunc
( ffi_pf_fold
, ffi_pf_circ_fold
, ffi_pf_fold_constrained
, ffi_pf_circ_fold_constrained
) where
import qualified Foreign.C.Types as C2HSImp
import qualified Foreign.Ptr as C2HSImp
import Data.ByteString.Char8 (ByteString, packCString, useAsCString)
import qualified Data.ByteString.Char8 as BS
import Foreign.C.String
import Foreign.C.Types
import Foreign.Marshal.Alloc
import Foreign.Marshal.Array
import Foreign.Ptr
import GHC.Float
import qualified Data.Array.IArray as A
import Unsafe.Coerce
import BioInf.ViennaRNA.Bindings.FFI.Utils
ffi_pf_fold :: ByteString -> IO (Double,ByteString,A.Array (Int,Int) Double)
ffi_pf_fold i =
useAsCString i $ \ci ->
useAsCString i $ \cs -> do
let n = BS.length i
let z = n * (n+1) `div` 2 +1
e <- ffiwrap_pf_fold_constrained ci cs 0
s <- packCString cs
bp <- export_bppm
xs <- peekArray z (bp :: Ptr CDouble)
let ar = A.accumArray (const id) 0 ((1,1),(n,n)) $ zip [ (ii,jj) | ii <- [n,n1..1], jj <- [n,n1..ii]] (drop 1 $ map unsafeCoerce xs)
return (cf2d e, s, ar)
ffi_pf_circ_fold :: ByteString -> IO (Double,ByteString,A.Array (Int,Int) Double)
ffi_pf_circ_fold i =
useAsCString i $ \ci -> do
useAsCString i $ \cs -> do
let n = BS.length i
let z = n * (n+1) `div` 2 +1
e <- pf_circ_fold ci cs
s <- packCString cs
bp <- export_bppm
xs <- peekArray z (bp :: Ptr CDouble)
let ar = A.accumArray (const id) 0 ((1,1),(n,n)) $ zip [ (ii,jj) | ii <- [n,n1..1], jj <- [n,n1..ii]] (drop 1 $ map unsafeCoerce xs)
return (cf2d e, s, ar)
ffi_pf_fold_constrained :: ByteString -> ByteString -> IO (Double,ByteString,A.Array (Int,Int) Double)
ffi_pf_fold_constrained i s =
useAsCString i $ \ci ->
useAsCString s $ \cs -> do
let n = BS.length i
let z = n * (n+1) `div` 2 +1
e <- ffiwrap_pf_fold_constrained ci cs 1
s <- packCString cs
bp <- export_bppm
xs <- peekArray z (bp :: Ptr CDouble)
let ar = A.accumArray (const id) 0 ((1,1),(n,n)) $ zip [ (ii,jj) | ii <- [n,n1..1], jj <- [n,n1..ii]] (drop 1 $ map unsafeCoerce xs)
return (cf2d e, s, ar)
ffi_pf_circ_fold_constrained :: ByteString -> ByteString -> IO (Double,ByteString,A.Array (Int,Int) Double)
ffi_pf_circ_fold_constrained i s =
useAsCString i $ \ci -> do
useAsCString i $ \cs -> do
let n = BS.length i
let z = n * (n+1) `div` 2 +1
e <- ffiwrap_pf_circ_fold_constrained ci cs 1
s <- packCString cs
bp <- export_bppm
xs <- peekArray z (bp :: Ptr CDouble)
let ar = A.accumArray (const id) 0 ((1,1),(n,n)) $ zip [ (ii,jj) | ii <- [n,n1..1], jj <- [n,n1..ii]] (drop 1 $ map unsafeCoerce xs)
return (cf2d e, s, ar)
foreign import ccall safe "BioInf/ViennaRNA/Bindings/FFI/PartFunc.chs.h ffiwrap_pf_fold_constrained"
ffiwrap_pf_fold_constrained :: ((C2HSImp.Ptr C2HSImp.CChar) -> ((C2HSImp.Ptr C2HSImp.CChar) -> (C2HSImp.CInt -> (IO C2HSImp.CFloat))))
foreign import ccall safe "BioInf/ViennaRNA/Bindings/FFI/PartFunc.chs.h export_bppm"
export_bppm :: (IO (C2HSImp.Ptr C2HSImp.CDouble))
foreign import ccall safe "BioInf/ViennaRNA/Bindings/FFI/PartFunc.chs.h pf_circ_fold"
pf_circ_fold :: ((C2HSImp.Ptr C2HSImp.CChar) -> ((C2HSImp.Ptr C2HSImp.CChar) -> (IO C2HSImp.CFloat)))
foreign import ccall safe "BioInf/ViennaRNA/Bindings/FFI/PartFunc.chs.h ffiwrap_pf_circ_fold_constrained"
ffiwrap_pf_circ_fold_constrained :: ((C2HSImp.Ptr C2HSImp.CChar) -> ((C2HSImp.Ptr C2HSImp.CChar) -> (C2HSImp.CInt -> (IO C2HSImp.CFloat))))