BiobaseXNA 0.5.6.0 → 0.6.0.0
raw patch · 5 files changed
+180/−43 lines, 5 filesdep +repadep ~PrimitiveArrayPVP ok
version bump matches the API change (PVP)
Dependencies added: repa
Dependency ranges changed: PrimitiveArray
API changes (from Hackage documentation)
+ Biobase.Primary: instance [overlap ok] (Shape sh, Show sh) => Shape (sh :. Nuc)
+ Biobase.Secondary: instance [overlap ok] (Shape sh, Show sh) => Shape (sh :. CTisomerism)
+ Biobase.Secondary: instance [overlap ok] (Shape sh, Show sh) => Shape (sh :. Edge)
+ Biobase.Secondary.Vienna: instance (Shape sh, Show sh) => Shape (sh :. ViennaPair)
- Biobase.Secondary.Constraint: bonusTable :: Double -> Double -> Constraint -> PrimArray (Int, Int) Double
+ Biobase.Secondary.Constraint: bonusTable :: Double -> Double -> Constraint -> PrimArray DIM2 Double
Files
- Biobase/Primary.hs +43/−1
- Biobase/Secondary.hs +74/−6
- Biobase/Secondary/Constraint.hs +13/−11
- Biobase/Secondary/Vienna.hs +38/−2
- BiobaseXNA.cabal +12/−23
Biobase/Primary.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE TypeOperators #-} {-# LANGUAGE PatternGuards #-} {-# LANGUAGE OverlappingInstances #-} {-# LANGUAGE FlexibleInstances #-}@@ -18,10 +19,13 @@ module Biobase.Primary where +import Data.Array.Repa.Index+import Data.Array.Repa.Shape import Data.Char (toUpper) import Data.Ix (Ix(..)) import Data.Primitive.Types import Data.Tuple (swap)+import GHC.Base (remInt,quotInt) import qualified Data.ByteString.Char8 as BS import qualified Data.ByteString.Lazy.Char8 as BSL import qualified Data.Text as T@@ -55,7 +59,7 @@ newtype Nuc = Nuc {unNuc :: Int} deriving (Eq,Ord,Ix) -(nN : nA : nC : nG : nT : nIMI : _) = map Nuc [0 .. ]+(nN : nA : nC : nG : nT : nIMI : nUndefined : _) = map Nuc [0 .. ] nU = nT acgt = [nA..nT]@@ -114,6 +118,44 @@ deriving instance VGM.MVector VU.MVector Nuc deriving instance VG.Vector VU.Vector Nuc deriving instance VU.Unbox Nuc++-- Shape-based indexing. Nucleotide representations go from nN (0) to nU (4),+-- with additional symbols being available for specialized problems. This is a+-- bit of a problem for shape-based indexing. In particular, we need to be+-- careful with size operations. To include, say, all of nN to nU one needs a+-- size of (z:.nIMI), as nIMI is the first element not in the size anymore.++instance (Shape sh,Show sh) => Shape (sh :. Nuc) where+ rank (sh:._) = rank sh + 1+ zeroDim = zeroDim:.Nuc 0+ unitDim = unitDim:.Nuc 1 -- TODO does this one make sense?+ intersectDim (sh1:.n1) (sh2:.n2) = intersectDim sh1 sh2 :. min n1 n2+ addDim (sh1:.Nuc n1) (sh2:.Nuc n2) = addDim sh1 sh2 :. Nuc (n1+n2) -- TODO will not necessarily yield a valid Nuc+ size (sh1:.Nuc n) = size sh1 * n+ sizeIsValid (sh1:.Nuc n) = sizeIsValid (sh1:.n)+ toIndex (sh1:.Nuc sh2) (sh1':.Nuc sh2') = toIndex (sh1:.sh2) (sh1':.sh2')+ fromIndex (ds:.Nuc d) n = fromIndex ds (n `quotInt` d) :. Nuc r where+ r | rank ds == 0 = n+ | otherwise = n `remInt` d+ inShapeRange (sh1:.n1) (sh2:.n2) (idx:.i) = i>=n1 && i<n2 && inShapeRange sh1 sh2 idx+ listOfShape (sh:.Nuc n) = n : listOfShape sh+ shapeOfList xx = case xx of+ [] -> error "empty list in shapeOfList/Primary"+ x:xs -> shapeOfList xs :. Nuc x+ deepSeq (sh:.n) x = deepSeq sh (n `seq` x)+ {-# INLINE rank #-}+ {-# INLINE zeroDim #-}+ {-# INLINE unitDim #-}+ {-# INLINE intersectDim #-}+ {-# INLINE addDim #-}+ {-# INLINE size #-}+ {-# INLINE sizeIsValid #-}+ {-# INLINE toIndex #-}+ {-# INLINE fromIndex #-}+ {-# INLINE inShapeRange #-}+ {-# INLINE listOfShape #-}+ {-# INLINE shapeOfList #-}+ {-# INLINE deepSeq #-} -- | The bounded instance from GHC proper. Captures all defined symbols.
Biobase/Secondary.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE TypeOperators #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE PatternGuards #-} {-# LANGUAGE FlexibleInstances #-}@@ -15,14 +16,17 @@ module Biobase.Secondary where +import Data.Array.Repa.Index+import Data.Array.Repa.Shape+import Data.Char (toLower, toUpper)+import Data.Ix (Ix(..))+import Data.List as L import Data.Primitive.Types+import Data.Tuple (swap)+import GHC.Base (remInt,quotInt) import qualified Data.Vector.Generic as VG import qualified Data.Vector.Generic.Mutable as VGM import qualified Data.Vector.Unboxed as VU-import Data.Ix (Ix(..))-import Data.Tuple (swap)-import Data.List as L-import Data.Char (toLower, toUpper) import Biobase.Primary import Biobase.Primary.Bounds@@ -46,8 +50,40 @@ newtype Edge = Edge {unEdge :: Int} deriving (Eq,Ord,Ix) -(wc : sugar : hoogsteen : unknownEdge : _) = map Edge [0..]+instance (Shape sh,Show sh) => Shape (sh :. Edge) where+ rank (sh:._) = rank sh + 1+ zeroDim = zeroDim:.Edge 0+ unitDim = unitDim:.Edge 1 -- TODO does this one make sense?+ intersectDim (sh1:.n1) (sh2:.n2) = intersectDim sh1 sh2 :. min n1 n2+ addDim (sh1:.Edge n1) (sh2:.Edge n2) = addDim sh1 sh2 :. Edge (n1+n2) -- TODO will not necessarily yield a valid Edge+ size (sh1:.Edge n) = size sh1 * n+ sizeIsValid (sh1:.Edge n) = sizeIsValid (sh1:.n)+ toIndex (sh1:.Edge sh2) (sh1':.Edge sh2') = toIndex (sh1:.sh2) (sh1':.sh2')+ fromIndex (ds:.Edge d) n = fromIndex ds (n `quotInt` d) :. Edge r where+ r | rank ds == 0 = n+ | otherwise = n `remInt` d+ inShapeRange (sh1:.n1) (sh2:.n2) (idx:.i) = i>=n1 && i<n2 && inShapeRange sh1 sh2 idx+ listOfShape (sh:.Edge n) = n : listOfShape sh+ shapeOfList xx = case xx of+ [] -> error "empty list in shapeOfList/Primary"+ x:xs -> shapeOfList xs :. Edge x+ deepSeq (sh:.n) x = deepSeq sh (n `seq` x)+ {-# INLINE rank #-}+ {-# INLINE zeroDim #-}+ {-# INLINE unitDim #-}+ {-# INLINE intersectDim #-}+ {-# INLINE addDim #-}+ {-# INLINE size #-}+ {-# INLINE sizeIsValid #-}+ {-# INLINE toIndex #-}+ {-# INLINE fromIndex #-}+ {-# INLINE inShapeRange #-}+ {-# INLINE listOfShape #-}+ {-# INLINE shapeOfList #-}+ {-# INLINE deepSeq #-} +(wc : sugar : hoogsteen : unknownEdge : edgeUndefined : _) = map Edge [0..]+ charEdgeList = [ ('W',wc) , ('S',sugar)@@ -78,7 +114,39 @@ newtype CTisomerism = CT {unCT :: Int} deriving (Eq,Ord,Ix) -(cis : trans : unknownCT : _) = map CT [0..]+instance (Shape sh,Show sh) => Shape (sh :. CTisomerism) where+ rank (sh:._) = rank sh + 1+ zeroDim = zeroDim:.CT 0+ unitDim = unitDim:.CT 1 -- TODO does this one make sense?+ intersectDim (sh1:.n1) (sh2:.n2) = intersectDim sh1 sh2 :. min n1 n2+ addDim (sh1:.CT n1) (sh2:.CT n2) = addDim sh1 sh2 :. CT (n1+n2) -- TODO will not necessarily yield a valid CT+ size (sh1:.CT n) = size sh1 * n+ sizeIsValid (sh1:.CT n) = sizeIsValid (sh1:.n)+ toIndex (sh1:.CT sh2) (sh1':.CT sh2') = toIndex (sh1:.sh2) (sh1':.sh2')+ fromIndex (ds:.CT d) n = fromIndex ds (n `quotInt` d) :. CT r where+ r | rank ds == 0 = n+ | otherwise = n `remInt` d+ inShapeRange (sh1:.n1) (sh2:.n2) (idx:.i) = i>=n1 && i<n2 && inShapeRange sh1 sh2 idx+ listOfShape (sh:.CT n) = n : listOfShape sh+ shapeOfList xx = case xx of+ [] -> error "empty list in shapeOfList/Primary"+ x:xs -> shapeOfList xs :. CT x+ deepSeq (sh:.n) x = deepSeq sh (n `seq` x)+ {-# INLINE rank #-}+ {-# INLINE zeroDim #-}+ {-# INLINE unitDim #-}+ {-# INLINE intersectDim #-}+ {-# INLINE addDim #-}+ {-# INLINE size #-}+ {-# INLINE sizeIsValid #-}+ {-# INLINE toIndex #-}+ {-# INLINE fromIndex #-}+ {-# INLINE inShapeRange #-}+ {-# INLINE listOfShape #-}+ {-# INLINE shapeOfList #-}+ {-# INLINE deepSeq #-}++(cis : trans : unknownCT : undefinedCT : _) = map CT [0..] antiCT = undefined paraCT = undefined
Biobase/Secondary/Constraint.hs view
@@ -6,6 +6,8 @@ module Biobase.Secondary.Constraint where +import Data.Array.Repa.Index+import Data.Array.Repa.Shape import Data.Char (toLower) import Data.Primitive.Types import qualified Data.Vector.Generic as VG@@ -13,7 +15,7 @@ import qualified Data.Vector.Unboxed as VU import Data.PrimitiveArray-import Data.PrimitiveArray.Ix+import Data.PrimitiveArray.Unboxed import Biobase.Secondary.Diagrams @@ -48,49 +50,49 @@ -- TODO and again, we should parametrize over "Energy", "Score", etc (that is, -- Prim a) -bonusTable :: Double -> Double -> Constraint -> PrimArray (Int,Int) Double+bonusTable :: Double -> Double -> Constraint -> PrimArray DIM2 Double bonusTable bonus malus (Constraint constraint) = arr where- arr = fromAssocs (0,0) (n,n) 0 $ bonusBr ++ bonusAn ++ bonusBa ++ malusBr ++ malusAn ++ malusX+ arr = fromAssocs zeroDim (Z:.n:.n) 0 $ bonusBr ++ bonusAn ++ bonusBa ++ malusBr ++ malusAn ++ malusX n = VU.length constraint -1 infixl 1 `xor` xor a b = a && not b || not a && b -- "()" bonus energies- bonusBr = [ ((i,j),bonus)+ bonusBr = [ (Z:.i:.j,bonus) | (i,('(',j)) <- zip [0..] $ VU.toList constraint ]- malusBr = [ ((i,j),malus)+ malusBr = [ (Z:.i:.j,malus) | i <- [0..n] , j <- [i..n] , let bi = constraint VU.! i , let bj = constraint VU.! j , fst bi == '(' && snd bi /= j || fst bj == ')' && snd bj /= i ]- bonusAn = [ ((i,j),bonus)+ bonusAn = [ (Z:.i:.j,bonus) | i<-[0..n] , fst (constraint VU.! i) == '<' , j<-[i+1..n] ] ++- [ ((i,j),bonus)+ [ (Z:.i:.j,bonus) | j<-[0..n] , fst (constraint VU.! j) == '>' , i<-[0..j-1] ]- malusAn = [ ((i,j),malus)+ malusAn = [ (Z:.i:.j,malus) | i<-[0..n] , j<-[i+1..n] , fst (constraint VU.! j) == '<' ] ++- [ ((i,j),malus)+ [ (Z:.i:.j,malus) | i<-[0..n] , j<-[i+1..n] , fst (constraint VU.! i) == '>' ]- bonusBa = [ ((i,j),bonus)+ bonusBa = [ (Z:.i:.j,bonus) | i<-[0..n] , j<-[i+1..n] , fst (constraint VU.! i) == '|' || fst (constraint VU.! j) == '|' ]- malusX = [ ((i,j),malus)+ malusX = [ (Z:.i:.j,malus) | i<-[0..n] , j<-[i+1..n] , fst (constraint VU.! i) == 'x' || fst (constraint VU.! j) == 'x'
Biobase/Secondary/Vienna.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE TypeOperators #-} {-# LANGUAGE PatternGuards #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}@@ -8,12 +9,15 @@ module Biobase.Secondary.Vienna where +import Data.Array.Repa.Index+import Data.Array.Repa.Shape import Data.Ix import Data.Primitive.Types+import Data.Tuple (swap)+import GHC.Base (remInt,quotInt) import qualified Data.Vector.Generic as VG import qualified Data.Vector.Generic.Mutable as VGM import qualified Data.Vector.Unboxed as VU-import Data.Tuple (swap) import Biobase.Primary import Biobase.Primary.Bounds@@ -25,7 +29,39 @@ newtype ViennaPair = ViennaPair Int deriving (Eq,Ord,Ix) -(vpNP:vpCG:vpGC:vpGU:vpUG:vpAU:vpUA:vpNS:_) = map ViennaPair [0..]+instance (Shape sh,Show sh) => Shape (sh :. ViennaPair) where+ rank (sh:._) = rank sh + 1+ zeroDim = zeroDim:.ViennaPair 0+ unitDim = unitDim:.ViennaPair 1 -- TODO does this one make sense?+ intersectDim (sh1:.n1) (sh2:.n2) = intersectDim sh1 sh2 :. min n1 n2+ addDim (sh1:.ViennaPair n1) (sh2:.ViennaPair n2) = addDim sh1 sh2 :. ViennaPair (n1+n2) -- TODO will not necessarily yield a valid ViennaPair+ size (sh1:.ViennaPair n) = size sh1 * n+ sizeIsValid (sh1:.ViennaPair n) = sizeIsValid (sh1:.n)+ toIndex (sh1:.ViennaPair sh2) (sh1':.ViennaPair sh2') = toIndex (sh1:.sh2) (sh1':.sh2')+ fromIndex (ds:.ViennaPair d) n = fromIndex ds (n `quotInt` d) :. ViennaPair r where+ r | rank ds == 0 = n+ | otherwise = n `remInt` d+ inShapeRange (sh1:.n1) (sh2:.n2) (idx:.i) = i>=n1 && i<n2 && inShapeRange sh1 sh2 idx+ listOfShape (sh:.ViennaPair n) = n : listOfShape sh+ shapeOfList xx = case xx of+ [] -> error "empty list in shapeOfList/Primary"+ x:xs -> shapeOfList xs :. ViennaPair x+ deepSeq (sh:.n) x = deepSeq sh (n `seq` x)+ {-# INLINE rank #-}+ {-# INLINE zeroDim #-}+ {-# INLINE unitDim #-}+ {-# INLINE intersectDim #-}+ {-# INLINE addDim #-}+ {-# INLINE size #-}+ {-# INLINE sizeIsValid #-}+ {-# INLINE toIndex #-}+ {-# INLINE fromIndex #-}+ {-# INLINE inShapeRange #-}+ {-# INLINE listOfShape #-}+ {-# INLINE shapeOfList #-}+ {-# INLINE deepSeq #-}++(vpNP:vpCG:vpGC:vpGU:vpUG:vpAU:vpUA:vpNS:vpUndefined:_) = map ViennaPair [0..] class MkViennaPair a where mkViennaPair :: a -> ViennaPair
BiobaseXNA.cabal view
@@ -1,16 +1,16 @@ name: BiobaseXNA-version: 0.5.6.0+version: 0.6.0.0 author: Christian Hoener zu Siederdissen maintainer: choener@tbi.univie.ac.at homepage: http://www.tbi.univie.ac.at/~choener/-copyright: Christian Hoener zu Siederdissen, 2011+copyright: Christian Hoener zu Siederdissen, 2011-2012 category: Bioinformatics synopsis: Efficient RNA/DNA representations license: GPL-3 license-file: LICENSE build-type: Simple stability: experimental-cabal-version: >= 1.4.0+cabal-version: >= 1.6.0 description: This is a base library for bioinformatics with emphasis on RNA and DNA primary structure and related tools. Provided are@@ -30,25 +30,9 @@ . . .- Changes since 0.5.5.0- .- * isostericity for the 6 "missing" classes- .- Changes since 0.5.4.0- .- * tuple-like updating (updL, updR, updP, updT)- .- * baseP pair selection- .- * isostericity data, loaded from csv files- .- Changes since 0.5.3.0- .- * tuple-like (selN) selection of basepairing elements (baseL,baseR,baseT)- .- Changes since 0.5.1.0+ New in 0.6.0.0 .- * bonusTable for constrained folding+ * Updated to PrimitiveArrays >= 0.1 extra-source-files: sources/isostericity-matrices.csv@@ -65,7 +49,8 @@ text, tuple, vector >=0.9 && <0.10,- PrimitiveArray+ repa >= 2,+ PrimitiveArray >= 0.1.1.2 exposed-modules: Biobase.Primary@@ -79,5 +64,9 @@ Biobase.Secondary.Vienna ghc-options:- -O2+ -Odph -funbox-strict-fields++source-repository head+ type: git+ location: git://github.com/choener/BiobaseXNA