From 9039a7f2206be4e85aee1a0e0670c51b90149bc8 Mon Sep 17 00:00:00 2001 From: martinahansen Date: Fri, 30 Nov 2012 11:21:41 +0000 Subject: [PATCH] added state to backtrack.rb git-svn-id: http://biopieces.googlecode.com/svn/trunk@2020 74ccb610-7750-0410-82ae-013aeee3265d --- code_ruby/lib/maasha/seq/backtrack.rb | 28 +++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/code_ruby/lib/maasha/seq/backtrack.rb b/code_ruby/lib/maasha/seq/backtrack.rb index 088b596..532bf64 100644 --- a/code_ruby/lib/maasha/seq/backtrack.rb +++ b/code_ruby/lib/maasha/seq/backtrack.rb @@ -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))); -- 2.39.5