The following commit has been merged in the master branch:
commit f1b040bce5bb746a021759f0ba4d593998cde68d
Author: Andrei Zavada <[email protected]>
Date:   Fri Jan 11 20:31:43 2013 +0200

    patterns overhaul WIP

diff --git a/src/sigproc/patterns.cc b/src/sigproc/patterns.cc
index 9e7f989..f4d3b62 100644
--- a/src/sigproc/patterns.cc
+++ b/src/sigproc/patterns.cc
@@ -14,16 +14,16 @@
 
 using namespace std;
 
-template sigproc::CPattern<TFloat>::CPattern( const SSignalRef<TFloat>&, 
size_t, size_t,
+template pattern::CPattern<TFloat>::CPattern( const 
sigproc::SSignalRef<TFloat>&, size_t, size_t,
                                              const SPatternPPack<TFloat>&);
-template size_t sigproc::CPattern<TFloat>::find( const valarray<TFloat>&,
+template size_t pattern::CPattern<TFloat>::find( const valarray<TFloat>&,
                                                 const valarray<TFloat>&,
                                                 const valarray<TFloat>&,
                                                 const valarray<TFloat>&,
                                                 ssize_t, int);
-template size_t sigproc::CPattern<TFloat>::find( const SSignalRef<TFloat>&,
+template size_t pattern::CPattern<TFloat>::find( const 
sigproc::SSignalRef<TFloat>&,
                                                 ssize_t, int);
-template size_t sigproc::CPattern<TFloat>::find( const valarray<TFloat>&,
+template size_t pattern::CPattern<TFloat>::find( const valarray<TFloat>&,
                                                 ssize_t, int);
 
 
diff --git a/src/sigproc/patterns.hh b/src/sigproc/patterns.hh
index 875d216..0dc56f8 100644
--- a/src/sigproc/patterns.hh
+++ b/src/sigproc/patterns.hh
@@ -13,6 +13,9 @@
 #ifndef _SIGPROC_PATTERNS_H
 #define _SIGPROC_PATTERNS_H
 
+#include <tuple>
+#include <vector>
+
 #include <gsl/gsl_math.h>
 
 #include "sigproc.hh"
@@ -23,31 +26,24 @@
 
 using namespace std;
 
-namespace sigproc {
+namespace pattern {
 
 template <typename T>
-struct TMatch : public valarray<T> {
-       TMatch (T _1, T _2, T _3, T _4)
-             : valarray<T> ({_1, _2, _3, _4})
-               {}
-       TMatch<T> ()
-             : valarray<T> (4)
+class CMatch
+  : public tuple<T, T, T, T> {
+    public:
+       CMatch ()
+             : tuple<T, T, T, T> (NAN, NAN, NAN, NAN)
                {}
 
-       bool operator==( const TMatch<T>& rv) const
-               {
-                       for ( size_t i = 0; i < 4; ++i )
-                               if ( (*this)[i] != rv[i] )
-                                       return false;
-                       return true;
-               }
-       bool good_enough( const TMatch<T>& rv) const
+       bool good_enough( const CMatch<T>& rv) const
                {
-                       for ( size_t i = 0; i < 4; ++i )
-                               if ( (*this)[i] > rv[i] )
-                                       return false;
-                       return true;
+                       return get<0>(*this) < get<0>(rv) &&
+                              get<1>(*this) < get<1>(rv) &&
+                              get<2>(*this) < get<2>(rv) &&
+                              get<3>(*this) < get<3>(rv);
                }
+
 };
 
 template <typename T>
@@ -70,7 +66,7 @@ struct SPatternPPack {
                                dzcdf_smooth == rv.dzcdf_smooth &&
                                criteria == rv.criteria;
                }
-       TMatch<T>
+       CMatch<T>
                criteria;
 }; // keep fields in order, or edit ctor by initializer_list
 
@@ -88,14 +84,10 @@ class CPattern
       // (c) target frequency (band-passed);
       // (d) instantaneous frequency at fine intervals;
 
-       TMatch<T>
-               match; // resulting
-
-       CPattern (const SSignalRef<T>& thing,
+       CPattern (const sigproc::SSignalRef<T>& thing,
                  size_t ctx_before_, size_t ctx_after_,
                  const SPatternPPack<T>& Pp_)
              : SPatternPPack<T> (Pp_),
-               match (NAN, NAN, NAN, NAN),
                penv (thing),
                ptarget_freq (thing),
                pdzcdf (thing),
@@ -103,10 +95,10 @@ class CPattern
                ctx_before (ctx_before_), ctx_after (ctx_after_)
                {
                        if ( ctx_before + ctx_after >= thing.signal.size() )
-                               throw invalid_argument ("pattern.size too 
small");
+                               throw invalid_argument ("pattern size too 
small");
                }
 
-       size_t find( const SSignalRef<T>& field,
+       size_t find( const sigproc::SSignalRef<T>& field,
                     ssize_t start,
                     int inc);
        size_t find( const valarray<T>& field,
@@ -119,6 +111,11 @@ class CPattern
                     ssize_t start,
                     int inc);
 
+       vector<size_t>
+               match_indices;
+       vector<CMatch<T>>
+               diff;
+
        size_t size_with_context() const
                {
                        return ptarget_freq.signal.size();
@@ -130,11 +127,11 @@ class CPattern
                }
 
     private:
-       SCachedEnvelope<T>
+       sigproc::SCachedEnvelope<T>
                penv;
-       SCachedBandPassCourse<T>
+       sigproc::SCachedBandPassCourse<T>
                ptarget_freq;
-       SCachedDzcdf<T>
+       sigproc::SCachedDzcdf<T>
                pdzcdf;
 
        size_t  samplerate;
diff --git a/src/sigproc/patterns.ii b/src/sigproc/patterns.ii
index 0bc05ac..58e7bb3 100644
--- a/src/sigproc/patterns.ii
+++ b/src/sigproc/patterns.ii
@@ -10,14 +10,14 @@
  *         License:  GPL
  */
 
-extern template CPattern<TFloat>::CPattern( const SSignalRef<TFloat>&, size_t, 
size_t,
+extern template CPattern<TFloat>::CPattern( const 
sigproc::SSignalRef<TFloat>&, size_t, size_t,
                                            const SPatternPPack&);
 extern template size_t CPattern<TFloat>::find( const valarray<TFloat>&,
                                               const valarray<TFloat>&,
                                               const valarray<TFloat>&,
                                               const valarray<TFloat>&,
                                               ssize_t, int);
-extern template size_t CPattern<TFloat>::find( const SSignalRef<TFloat>&,
+extern template size_t CPattern<TFloat>::find( const 
sigproc::SSignalRef<TFloat>&,
                                               ssize_t, int);
 extern template size_t CPattern<TFloat>::find( const valarray<TFloat>&,
                                               ssize_t, int);
@@ -48,59 +48,56 @@ find( const valarray<T>& fenv_u,
        printf( "field = %zu, thing = %zu(%zu), start = %zu, size_essential = 
%zu\n",
                ftarget_freq.size(), ptarget_freq.signal.size(),
                penv.centre(SPatternPPack<T>::env_tightness).size(),  start, 
size_essential());
-       printf( " %4g  %4g  %4g  %4g\n",
-               SPatternPPack<T>::criteria[0], SPatternPPack<T>::criteria[1], 
SPatternPPack<T>::criteria[2], SPatternPPack<T>::criteria[3]);
+       // printf( " %4g  %4g  %4g  %4g\n",
+       //      SPatternPPack<T>::criteria.get<0>(), 
SPatternPPack<T>::criteria[1], SPatternPPack<T>::criteria[2], 
SPatternPPack<T>::criteria[3]);
+
+       // here be all diffs
+       diff.resize( ftarget_freq.size());
+       match_indices.resize(0);
+
        ssize_t iz = (inc > 0) ? ftarget_freq.size() - size_with_context() : 0;
        size_t  essential_part = size_essential();
        for ( ssize_t i = start; (inc > 0) ? i+inc < iz : i+inc > iz; i += inc 
) {
-               TMatch<T>
-                       diff;
-               auto
-                 p0 = penv.centre( SPatternPPack<T>::env_tightness),
-                 p1 = penv.breadth( SPatternPPack<T>::env_tightness),
-                 p2 = ptarget_freq( SPatternPPack<T>::bwf_ffrom,
-                                    SPatternPPack<T>::bwf_fupto,
-                                    SPatternPPack<T>::bwf_order),
-                 p3 = pdzcdf( SPatternPPack<T>::dzcdf_step,
-                              SPatternPPack<T>::dzcdf_sigma,
-                              SPatternPPack<T>::dzcdf_smooth);
+               auto    p0 = penv.centre( SPatternPPack<T>::env_tightness),
+                       p1 = penv.breadth( SPatternPPack<T>::env_tightness),
+                       p2 = ptarget_freq( SPatternPPack<T>::bwf_ffrom,
+                                          SPatternPPack<T>::bwf_fupto,
+                                          SPatternPPack<T>::bwf_order),
+                       p3 = pdzcdf( SPatternPPack<T>::dzcdf_step,
+                                    SPatternPPack<T>::dzcdf_sigma,
+                                    SPatternPPack<T>::dzcdf_smooth);
 
                for ( size_t j = 0; j < essential_part; ++j ) {
-                       diff[0] += gsl_pow_2( p0[ctx_before + j]
+                       get<0>(diff[i]) += gsl_pow_2( p0[ctx_before + j]
                                              - (fenv_u[i+j] + fenv_l[i+j])/2);
-                       diff[1] += gsl_pow_2( p1[ctx_before + j]
+                       get<1>(diff[i]) += gsl_pow_2( p1[ctx_before + j]
                                              - (fenv_u[i+j] - fenv_l[i+j]));
-                       diff[2] += gsl_pow_2( p2[ctx_before + j]
+                       get<2>(diff[i]) += gsl_pow_2( p2[ctx_before + j]
                                              - ftarget_freq[i+j]);
-                       diff[3] += gsl_pow_2( p3[ctx_before + j]
+                       get<3>(diff[i]) += gsl_pow_2( p3[ctx_before + j]
                                              - fdzcdf[i+j]);
                }
 
-               diff[0] = sqrt(diff[0] / essential_part) / crit_linear_unity; 
// normalise
-               diff[1] = sqrt(diff[1] / essential_part) / crit_linear_unity;
-               diff[2] = sqrt(diff[2] / essential_part) / crit_linear_unity;
-               diff[3] = sqrt(diff[3] / essential_part) / crit_dzcdf_unity;
+               get<0>(diff[i]) = sqrt(get<0>(diff[i]) / essential_part) / 
crit_linear_unity; // normalise
+               get<1>(diff[i]) = sqrt(get<1>(diff[i]) / essential_part) / 
crit_linear_unity;
+               get<2>(diff[i]) = sqrt(get<2>(diff[i]) / essential_part) / 
crit_linear_unity;
+               get<3>(diff[i]) = sqrt(get<3>(diff[i]) / essential_part) / 
crit_dzcdf_unity;
 
                // if ( i % 250 == 0 ) printf( "at %zu diff_course = 
%g,\tdiff_breadth = %g\t diff_dzcdf = %g\n", i, diff_course, diff_breadth, 
diff_dzcd);
-               if ( diff.good_enough(SPatternPPack<T>::criteria) ) {
-                       // if ( !looking_further ) {
-                       //      looking_further = true;
-                       match = diff;
-                       return i;
-               }
+               if ( diff[i].good_enough(SPatternPPack<T>::criteria) )
+                       match_indices.push_back(i);
                // printf( " %17zu : %4g  %4g  %4g  %4g\n",
                //      i, diff[0], diff[1], diff[2], diff[3]);
        }
 
-       match = {1., 1., 1., 1.};
-       return (size_t)-1;
+       return match_indices.size();
 }
 
 
 template <typename T>
 size_t
 CPattern<T>::
-find( const SSignalRef<T>& signal,
+find( const sigproc::SSignalRef<T>& signal,
       ssize_t start,
       int inc)
 {
@@ -119,19 +116,22 @@ find( const valarray<T>& signal,
       int inc)
 {
        valarray<T> fenv_u, fenv_l;
-       envelope( {signal, samplerate}, SPatternPPack<T>::env_tightness,
-                 1./samplerate, &fenv_u, &fenv_l);
+       sigproc::envelope(
+               {signal, samplerate}, SPatternPPack<T>::env_tightness,
+               1./samplerate, &fenv_u, &fenv_l);
 
        auto ftarget_freq =
-               exstrom::band_pass( signal, samplerate,
-                                   SPatternPPack<T>::bwf_ffrom,
-                                   SPatternPPack<T>::bwf_fupto,
-                                   SPatternPPack<T>::bwf_order, true);
+               exstrom::band_pass(
+                       signal, samplerate,
+                       SPatternPPack<T>::bwf_ffrom,
+                       SPatternPPack<T>::bwf_fupto,
+                       SPatternPPack<T>::bwf_order, true);
        auto fdzcdf =
-               dzcdf( SSignalRef<T> {signal, samplerate},
-                      SPatternPPack<T>::dzcdf_step,
-                      SPatternPPack<T>::dzcdf_sigma,
-                      SPatternPPack<T>::dzcdf_smooth);
+               sigproc::dzcdf(
+                       sigproc::SSignalRef<T> {signal, samplerate},
+                       SPatternPPack<T>::dzcdf_step,
+                       SPatternPPack<T>::dzcdf_sigma,
+                       SPatternPPack<T>::dzcdf_smooth);
 
        return find( fenv_u, fenv_l, ftarget_freq, fdzcdf,
                     start, inc);
diff --git a/src/ui/sf/sf.hh b/src/ui/sf/sf.hh
index b1a8685..0cb184f 100644
--- a/src/ui/sf/sf.hh
+++ b/src/ui/sf/sf.hh
@@ -502,7 +502,7 @@ class SScoringFacility
                DELETE_DEFAULT_METHODS (SFindDialog);
 
              // own copies of parent's same
-               sigproc::SPatternPPack<TFloat>
+               pattern::SPatternPPack<TFloat>
                        Pp,
                        Pp2;
 

-- 
Sleep experiment manager

_______________________________________________
debian-med-commit mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit

Reply via email to