]> git.donarmstrong.com Git - biopieces.git/commitdiff
added state to backtrack.rb
authormartinahansen <martinahansen@74ccb610-7750-0410-82ae-013aeee3265d>
Fri, 30 Nov 2012 11:21:41 +0000 (11:21 +0000)
committermartinahansen <martinahansen@74ccb610-7750-0410-82ae-013aeee3265d>
Fri, 30 Nov 2012 11:21:41 +0000 (11:21 +0000)
git-svn-id: http://biopieces.googlecode.com/svn/trunk@2020 74ccb610-7750-0410-82ae-013aeee3265d

code_ruby/lib/maasha/seq/backtrack.rb

index 088b596a1e4e1e52784a5bdfeb67920d1fe2ea48..532bf641278947941c45a380f1369786f16ea960 100644 (file)
@@ -82,8 +82,6 @@ module BackTrack
   private
 
   inline do |builder|
-    builder.add_static "id_seq", 'rb_intern("@seq")', "ID"
-
     # Macro for matching nucleotides including ambiguity codes.
     builder.prefix %{
       #define MATCH(A,B) ((bitmap[A] & bitmap[B]) != 0)
@@ -118,12 +116,13 @@ module BackTrack
     # reporting the match endpoints.
     builder.prefix %{
       unsigned int backtrack(
-        char *ss,   // Sequence start
-        char *s,    // Sequence
-        char *p,    // Pattern
-        int   mis,  // Max mismatches
-        int   ins,  // Max insertions
-        int   del   // Max deletions
+        char         *ss,     // Sequence start
+        char         *s,      // Sequence
+        char         *p,      // Pattern
+        unsigned int  mis,    // Max mismatches
+        unsigned int  ins,    // Max insertions
+        unsigned int  del,    // Max deletions
+        int           state   // Last event: mis, ins or del
       )
       {
         unsigned int r = 0;
@@ -134,9 +133,9 @@ module BackTrack
           return (unsigned int) (s - ss);
         else
         {
-          if (mis && *s && *p && (r = backtrack(ss, s + 1, p + 1, mis - 1, ins, del))) return r;
-          if (ins && *p &&       (r = backtrack(ss, s, p + 1, mis, ins - 1, del)))     return r;
-          if (del && *s &&       (r = backtrack(ss, s + 1, p, mis, ins, del - 1)))     return r;
+          if (mis && *s && *p &&            (r = backtrack(ss, s + 1, p + 1, mis - 1, ins, del, 0))) return r;
+          if (ins && *p && (state != -1) && (r = backtrack(ss, s, p + 1, mis, ins - 1, del, 1)))     return r;
+          if (del && *s && (state != 1)  && (r = backtrack(ss, s + 1, p, mis, ins, del - 1, -1)))    return r;
         }
 
         return 0;
@@ -164,8 +163,9 @@ module BackTrack
         unsigned int  ins = FIX2UINT(_ins);
         unsigned int  del = FIX2UINT(_del);
 
-        char         *ss = s;
-        unsigned int  e  = 0;
+        char         *ss    = s;
+        int           state = 0;
+        unsigned int  e     = 0;
         VALUE         tuple;
 
         if (pos < len)
@@ -174,7 +174,7 @@ module BackTrack
 
           while (*s)
           {
-            if ((e = backtrack(ss, s, p, mis, ins, del)))
+            if ((e = backtrack(ss, s, p, mis, ins, del, state)))
             {
               tuple = rb_ary_new();
               rb_ary_push(tuple, INT2FIX((int) (s - ss)));