packages feed

adp-multi-0.1.0: tests/ADP/Tests/RIGExample.hs

{-# LANGUAGE ImplicitParams #-}

{- Models the RNA-RNA interaction grammar (RIG) from

"A grammatical approach to RNA–RNA interaction prediction" by Kato et al., 2009

Specifically, example 3 from page 5.

-}
module ADP.Tests.RIGExample where

import ADP.Multi.SimpleParsers
import ADP.Multi.Combinators
import ADP.Multi.Tabulation
import ADP.Multi.Helpers
import ADP.Multi.Rewriting
                                 
type RIG_Algebra alphabet answer = (
  (EPS,EPS) -> answer,                      -- nil
  alphabet -> answer,             -- base
  (alphabet,alphabet) -> answer,             -- basepair
  answer -> answer -> answer, -- sb1L
  answer -> answer -> answer, -- sb1R
  answer -> answer -> answer, -- sb2L
  answer -> answer -> answer, -- sb2R
  answer -> answer -> answer, -- ib1
  answer -> answer -> answer, -- ib2
  answer -> answer -> answer, -- eb
  answer -> answer -> answer -- w   
  )

  
   
rig :: YieldAnalysisAlgorithm Dim1 -> RangeConstructionAlgorithm Dim1
       -> YieldAnalysisAlgorithm Dim2 -> RangeConstructionAlgorithm Dim2 
       -> RIG_Algebra Char answer -> (String,String) -> [answer]
rig yieldAlg1 rangeAlg1 yieldAlg2 rangeAlg2 algebra (inp1,inp2) =
  -- These implicit parameters are used by >>>.
  -- They were introduced to allow for exchanging the algorithms and
  -- they were made implicit so that they don't ruin our nice syntax.
  let ?yieldAlg1 = yieldAlg1
      ?rangeAlg1 = rangeAlg1
      ?yieldAlg2 = yieldAlg2
      ?rangeAlg2 = rangeAlg2
  in let
  
  (nil,base,basepair,sb1L,sb1R,sb2L,sb2R,ib1,ib2,eb,w) = algebra
      
  rewriteSb1L [b,a1,a2] = ([b,a1],[a2])
  rewriteSb1R [b,a1,a2] = ([a1,b],[a2])
  rewriteSb2L [b,a1,a2] = ([a1],[b,a2])
  rewriteSb2R [b,a1,a2] = ([a1],[a2,b])      
  rewriteIb1 [p1,p2,a1,a2] = ([p1,a1,p2],[a2])
  rewriteIb2 [p1,p2,a1,a2] = ([a1],[p1,a2,p2])
  rewriteEb [p1,p2,a1,a2] = ([p1,a1],[a2,p2])
  rewriteW [a11,a12,a21,a22] = ([a11,a21],[a22,a12])
  a = tabulated2 $
      nil <<< (EPS,EPS) >>>|| id2 |||
      sb1L <<< b ~~~| a >>>|| rewriteSb1L |||
      sb1R <<< b ~~~| a >>>|| rewriteSb1R |||
      sb2L <<< b ~~~| a >>>|| rewriteSb2L |||
      sb2R <<< b ~~~| a >>>|| rewriteSb2R |||
      ib1 <<< p ~~~| a >>>|| rewriteIb1 |||
      ib2 <<< p ~~~| a >>>|| rewriteIb2 |||
      eb  <<< p ~~~| a >>>|| rewriteEb |||
      w   <<< a ~~~| a >>>|| rewriteW 
      -- FIXME Won't work due to recursion and min yield of aa = 0
      -- Is this grammar actually semantically unambigous??
      
  p = tabulated2 $
      basepair <<< ('a', 'u') >>>|| id2 |||
      basepair <<< ('u', 'a') >>>|| id2 |||
      basepair <<< ('c', 'g') >>>|| id2 |||
      basepair <<< ('g', 'c') >>>|| id2 |||
      basepair <<< ('g', 'u') >>>|| id2 |||
      basepair <<< ('u', 'g') >>>|| id2
      
  b = tabulated1 $
      base <<< 'a' >>>| id |||
      base <<< 'u' >>>| id |||
      base <<< 'c' >>>| id |||
      base <<< 'g' >>>| id
  
  z = mkTwoTrack inp1 inp2
  tabulated1 = table1 z
  tabulated2 = table2 z
  
  in axiomTwoTrack z inp1 inp2 a