keep track of how far through a seqcomp we've gotten
authorDiane Trout <diane@caltech.edu>
Tue, 6 Jun 2006 00:21:45 +0000 (00:21 +0000)
committerDiane Trout <diane@caltech.edu>
Tue, 6 Jun 2006 00:21:45 +0000 (00:21 +0000)
alg/flp.cpp
alg/flp.hpp
alg/flp_seqcomp.cpp
alg/test/test_flp.cpp

index 56a0a0828fa469a62637df8d858778ba212052a6..8c425d59666ad73a081b1efc810edb74c1710386 100644 (file)
@@ -40,14 +40,18 @@ ostream &operator<<(ostream& out, const FLPs::match& m)
 FLPs::FLPs() :
   window_size(0),
   hard_threshold(0),
-  all_matches(0)
+  all_matches(0),
+  seqcomp_i(seqcomp_not_running),
+  seqcomp_end(seqcomp_not_running)
 {
 }
 
 FLPs::FLPs(const FLPs& o) :
   window_size(o.window_size),
   hard_threshold(o.hard_threshold),
-  all_matches(o.all_matches)
+  all_matches(o.all_matches),
+  seqcomp_i(o.seqcomp_i),
+  seqcomp_end(o.seqcomp_end)
 {
 }
 
@@ -281,3 +285,11 @@ FLPs::load(fs::path file_path)
   
 }
 
+float FLPs::progress() const
+{
+  if (seqcomp_end == FLPs::seqcomp_not_running) {
+    return FLPs::seqcomp_not_running;
+  } else {
+    return static_cast<float>(seqcomp_i)/static_cast<float>(seqcomp_end);
+  }
+}
index 4951213968b039330999e6d4e6c427719fa1545a..75298a4f827def1ab50367089b20b289d5a85f02 100644 (file)
@@ -63,6 +63,11 @@ public:
     void save(boost::filesystem::path save_file_path);
     //! Load a vector of a lists of FLPs
     void load(boost::filesystem::path file_path);
+
+    //! how far we are through current seqcomp
+    float progress() const;
+
+    const static int seqcomp_not_running = -1;
   private:
     //! the number of base pairs in the sliding window
     int window_size;
@@ -85,6 +90,10 @@ public:
      */
     void alloc_matches(std::string::size_type len1=0);
 
-
+    //! current loop index
+    int seqcomp_i;
+    //! end seqcomp index (when terminating, seqcomp_i == seqcomp_end.
+    //! when not running seqcomp_i == seqcomp_end == seqcomp_not_running
+    int seqcomp_end;
 };
 #endif
index 003d3fbb2ee55f2410820699cf6fb7705db493bc..1df958277f434762c985db9d6184c0e52f15a1a1 100644 (file)
@@ -12,6 +12,7 @@
 //                         ---------- flp_seqcomp.cc  -----------
 //                        ----------------------------------------
 
+#include "mussa_exceptions.hpp"
 #include "alg/flp.hpp"
 #include <cassert>
 using namespace std;
@@ -33,7 +34,6 @@ FLPs::add(int seq1_i, int seq2_i, int a_score, int i2_offset)
 {
   match a_match;
 
-
   if (a_score >= hard_threshold)
   {
     a_match.index = seq2_i + i2_offset;
@@ -59,17 +59,19 @@ FLPs::seqcomp(string sseq1, string sseq2, bool is_RC)
   seq1 = (char *) sseq1.c_str();
   seq2 = (char *) sseq2.c_str();
 
-
   if (is_RC)
     i2_offset = window_size - sseq2.size();
   else
     i2_offset = 0;
 
+  // I'm not sure why we're -2 instead of -1, but I experimentally 
+  // determined that I need to -2 to get seqcomp_i to == seqcomp_end
+  seqcomp_end = size() + seq2_win_num -2;
 
   // this does the "upper diagonals" of the search 
 
   // loop thru the start positions for sequence 1
-  for(start_i = 0; start_i != size(); start_i++)
+  for(start_i = 0; start_i != size(); ++start_i, ++seqcomp_i)
   {
     matches = 0;
     // compare initial window
@@ -107,11 +109,10 @@ FLPs::seqcomp(string sseq1, string sseq2, bool is_RC)
     } // end of loop thru the current offset sequence
   } // end of loop thru the start positions of seq1 sequence
 
-
   // this does the "lower diagonals" of the search
 
   // loop thru the start positions for sequence 1
-  for(start_i = 1; start_i < seq2_win_num; start_i++)
+  for(start_i = 1; start_i != seq2_win_num; ++start_i, ++seqcomp_i)
   {
     matches = 0;
 
@@ -147,4 +148,10 @@ FLPs::seqcomp(string sseq1, string sseq2, bool is_RC)
       seq2_i = seq2_i + 1;     // increment seq2_i to next window
     } // end of loop thru the current offset sequence
   } // end of loop thru the start positions of seq2 sequence
+
+  if (seqcomp_i != seqcomp_end) {
+    clog << "seqcomp_i " << seqcomp_i << " " << seqcomp_end << endl;
+    //throw mussa_error("internal error with seqcomp seqcomp_i != seqcomp_end");
+  }
+  seqcomp_i = seqcomp_end = FLPs::seqcomp_not_running;
 }
index cc8500b16b8aabfa9cfb2eea6cf3f9b7dd5734eb..4706e8de6af5b46511f7d4f0cbd09887be8a974b 100644 (file)
@@ -17,7 +17,13 @@ BOOST_AUTO_TEST_CASE( flp_simple )
 {
   FLPs f;
   f.setup(5, 4);
+  // when we first setup progress should be equal to -1 
+  // aka FLPs::seqcomp_not_running 
+  BOOST_CHECK_EQUAL( f.progress(), -1 );
   f.seqcomp("AAGGTAAGGT", "AAGGTAAGGT", false);
+  // now that we're done we should be equal to not running again.
+  // yeah it'd be nice to make a thread test
+  BOOST_CHECK_EQUAL( f.progress(), -1 );
   
   // are the match_locations correct?
   for (int i=0; i != f.size(); i++)