The following commit has been merged in the master branch:
commit a770c7a63bc9ef03293b82c65089ce94ac8e912b
Author: andrei zavada <[email protected]>
Date:   Fri Jan 11 22:59:26 2013 +0000

    patterns WIP
    
    on Kiev-Kharkov train

diff --git a/src/sigproc/patterns.hh b/src/sigproc/patterns.hh
index 0dc56f8..103f2f7 100644
--- a/src/sigproc/patterns.hh
+++ b/src/sigproc/patterns.hh
@@ -66,8 +66,6 @@ struct SPatternPPack {
                                dzcdf_smooth == rv.dzcdf_smooth &&
                                criteria == rv.criteria;
                }
-       CMatch<T>
-               criteria;
 }; // keep fields in order, or edit ctor by initializer_list
 
 
@@ -75,7 +73,7 @@ struct SPatternPPack {
 template <typename T>
 class CPattern
   : public SPatternPPack<T> {
-       CPattern () = delete;
+       DELETE_DEFAULT_METHODS (CPattern);
 
     public:
       // the complete pattern signature is made of:
@@ -98,21 +96,16 @@ class CPattern
                                throw invalid_argument ("pattern size too 
small");
                }
 
-       size_t find( const sigproc::SSignalRef<T>& field,
-                    ssize_t start,
-                    int inc);
-       size_t find( const valarray<T>& field,
-                    ssize_t start,
-                    int inc);
-       size_t find( const valarray<T>& env_u,  // broken-down field
-                    const valarray<T>& env_l,
-                    const valarray<T>& target_freq,
-                    const valarray<T>& dzcdf,
-                    ssize_t start,
-                    int inc);
-
-       vector<size_t>
-               match_indices;
+       int do_search( const sigproc::SSignalRef<T>& field,
+                      int inc);
+       int do_search( const valarray<T>& field,
+                      int inc);
+       int do_search( const valarray<T>& env_u,  // broken-down field
+                      const valarray<T>& env_l,
+                      const valarray<T>& target_freq,
+                      const valarray<T>& dzcdf,
+                      int inc);
+
        vector<CMatch<T>>
                diff;
 
diff --git a/src/sigproc/patterns.ii b/src/sigproc/patterns.ii
index 58e7bb3..26d1961 100644
--- a/src/sigproc/patterns.ii
+++ b/src/sigproc/patterns.ii
@@ -24,18 +24,18 @@ extern template size_t CPattern<TFloat>::find( const 
valarray<TFloat>&,
 
 
 template <typename T>
-size_t
+int
 CPattern<T>::
-find( const valarray<T>& fenv_u,
-      const valarray<T>& fenv_l,
-      const valarray<T>& ftarget_freq,
-      const valarray<T>& fdzcdf,
-      ssize_t start,
-      int inc)
+do_search( const valarray<T>& fenv_u,
+          const valarray<T>& fenv_l,
+          const valarray<T>& ftarget_freq,
+          const valarray<T>& fdzcdf,
+          size_t inc)
 {
-       if ( inc == 0 || inc > (ssize_t)ftarget_freq.size() ) {
-               fprintf( stderr, "CPattern::find(): bad search increment: 
%d\n", inc);
-               return (size_t)-1;
+       size_t fsize = ftarget_freq.size();
+       if ( inc == 0 || inc > (ssize_t)fsize ) {
+               fprintf( stderr, __FUNCTION__": bad search increment: %d\n", 
inc);
+               return -1;
        }
 
        // make it (each time) field-specific
@@ -45,19 +45,15 @@ find( const valarray<T>& fenv_u,
        crit_dzcdf_unity =
                fdzcdf.sum() / fdzcdf.size();
 
-       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.get<0>(), 
SPatternPPack<T>::criteria[1], SPatternPPack<T>::criteria[2], 
SPatternPPack<T>::criteria[3]);
+       printf( "field = %zu, thing = %zu(%zu), size_essential = %zu\n",
+               fsize, ptarget_freq.signal.size(),
+               penv.centre(SPatternPPack<T>::env_tightness).size(), 
size_essential());
 
        // here be all diffs
-       diff.resize( ftarget_freq.size());
-       match_indices.resize(0);
+       diff.resize( fsize);
 
-       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 
) {
+       for ( ssize_t i = 0; i+inc < fsize - essential_part; i += inc ) {
                auto    p0 = penv.centre( SPatternPPack<T>::env_tightness),
                        p1 = penv.breadth( SPatternPPack<T>::env_tightness),
                        p2 = ptarget_freq( SPatternPPack<T>::bwf_ffrom,
@@ -84,36 +80,34 @@ find( const valarray<T>& fenv_u,
                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[i].good_enough(SPatternPPack<T>::criteria) )
-                       match_indices.push_back(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]);
        }
 
-       return match_indices.size();
+       return 0;
 }
 
 
 template <typename T>
-size_t
+int
 CPattern<T>::
-find( const sigproc::SSignalRef<T>& signal,
-      ssize_t start,
-      int inc)
+do_search( const sigproc::SSignalRef<T>& signal,
+          int inc)
 {
        if ( signal.samplerate != samplerate )
                throw invalid_argument( "CPattern::find( SSignalRef&): not same 
samplerate");
 
        return find( signal.signal,
-                    start, inc);
+                    inc);
 }
 
 template <typename T>
-size_t
+int
 CPattern<T>::
-find( const valarray<T>& signal,
-      ssize_t start,
-      int inc)
+do_search( const valarray<T>& signal,
+          int inc)
 {
        valarray<T> fenv_u, fenv_l;
        sigproc::envelope(
@@ -134,7 +128,7 @@ find( const valarray<T>& signal,
                        SPatternPPack<T>::dzcdf_smooth);
 
        return find( fenv_u, fenv_l, ftarget_freq, fdzcdf,
-                    start, inc);
+                    inc);
 }
 
 
diff --git a/src/ui/sf/sf-patterns.cc b/src/ui/sf/sf-patterns.cc
index 8e47de6..e221157 100644
--- a/src/ui/sf/sf-patterns.cc
+++ b/src/ui/sf/sf-patterns.cc
@@ -21,12 +21,11 @@ using namespace std;
 
 aghui::SScoringFacility::SFindDialog::
 SFindDialog (SScoringFacility& parent)
-      : Pp {2,  0., 1.5, 1,  .1, .5, 3},
+      : Pp {2,  0., 1.5, 1,  .1, .5, 3,
+            {.2, .2, .2, .2}},
        Pp2 (Pp),
-       tolerance (.2, .4, .2, .2),
        cpattern (nullptr),
-       last_find ((size_t)-1),
-       increment (3),
+       increment (.05),
        draw_details (true),
        _p (parent)
 {
@@ -37,15 +36,17 @@ SFindDialog (SScoringFacility& parent)
        W_V.reg( _p.ePatternDZCDFStep,          &Pp.dzcdf_step);
        W_V.reg( _p.ePatternDZCDFSigma,         &Pp.dzcdf_sigma);
        W_V.reg( _p.ePatternDZCDFSmooth,        &Pp.dzcdf_smooth);
-       W_V.reg( _p.ePatternParameterA,         &tolerance[0]);
-       W_V.reg( _p.ePatternParameterB,         &tolerance[1]);
-       W_V.reg( _p.ePatternParameterC,         &tolerance[2]);
-       W_V.reg( _p.ePatternParameterD,         &tolerance[3]);
+       W_V.reg( _p.ePatternParameterA,         &get<0>(Pp.criteria);
+       W_V.reg( _p.ePatternParameterB,         &get<1>(Pp.criteria);
+       W_V.reg( _p.ePatternParameterC,         &get<2>(Pp.criteria);
+       W_V.reg( _p.ePatternParameterD,         &get<3>(Pp.criteria);
 }
 
 aghui::SScoringFacility::SFindDialog::
 ~SFindDialog ()
 {
+       if ( cpattern )
+               delete cpattern;
        // g_object_unref( mPatterns);
        gtk_widget_destroy( (GtkWidget*)_p.wPattern);
 }
@@ -283,30 +284,30 @@ load_pattern( const char *label, bool do_globally)
                             &Pp.env_tightness,
                             &Pp.bwf_order, &Pp.bwf_ffrom, &Pp.bwf_fupto,
                             &Pp.dzcdf_step, &Pp.dzcdf_sigma, &Pp.dzcdf_smooth,
-                            &tolerance[0], &tolerance[1], &tolerance[2], 
&tolerance[3],
+                            &get<0>(Pp.criteria), &get<1>(Pp.criteria), 
&get<2>(Pp.criteria), &get<3>(Pp.criteria),
                             &samplerate, &full_sample, &context_before, 
&context_after) == 14 ) {
 
-                       pattern.resize( full_sample);
+                       thing.resize( full_sample);
                        for ( size_t i = 0; i < full_sample; ++i ) {
-                               double tmp;
-                               if ( fscanf( fd, "%la", &tmp) != 1 ) {
+                               double d;
+                               if ( fscanf( fd, "%la", &d) != 1 ) {
                                        fprintf( stderr, "load_pattern(): short 
read at sample %zu from %s; "
                                                 "Removing file\n", i, __buf__);
-                                       pattern.resize( 0);
+                                       thing.resize( 0);
                                        fclose( fd);
                                        unlink( __buf__);
                                        enumerate_patterns_to_combo();
                                        return;
                                } else
-                                       pattern[i] = tmp;
+                                       thing[i] = d;
                        }
 
                        if ( samplerate != field_channel->samplerate() ) {
                                printf( "Loaded pattern has samplerate 
different from the current samplerate (%zu vs %zu); it will be resampled now.",
                                        samplerate, 
field_channel->samplerate());
                                double fac = 
(double)field_channel->samplerate() / samplerate;
-                               pattern =
-                                       sigproc::resample( pattern, 0, 
full_sample,
+                               thing =
+                                       sigproc::resample( thing, 0, 
full_sample,
                                                           fac * full_sample);
                                context_before *= fac;
                                context_after  *= fac;
@@ -318,10 +319,10 @@ load_pattern( const char *label, bool do_globally)
                        set_pattern_da_width( full_sample / 
field_channel->spp());
 
                } else {
-                       pattern.resize( 0);
+                       thing.resize( 0);
                        fprintf( stderr, "load_pattern(): corrupted %s; "
                                 "Removing file\n", __buf__);
-                       pattern.resize( 0);
+                       thing.resize( 0);
                        unlink( __buf__);
                        enumerate_patterns_to_combo();
                }
@@ -364,8 +365,8 @@ save_pattern( const char *label, bool do_globally)
                         Pp.dzcdf_step, Pp.dzcdf_sigma, Pp.dzcdf_smooth,
                         tolerance[0], tolerance[1], tolerance[2], tolerance[3],
                         samplerate, pattern.size(), context_before, 
context_after);
-               for ( size_t i = 0; i < pattern.size(); ++i )
-                       fprintf( fd, "%a\n", (double)pattern[i]);
+               for ( size_t i = 0; i < thing.size(); ++i )
+                       fprintf( fd, "%a\n", (double)thing[i]);
                fclose( fd);
        }
 }
@@ -390,7 +391,7 @@ discard_pattern( const char *label, bool do_globally)
 
 bool
 aghui::SScoringFacility::SFindDialog::
-search( ssize_t from)
+search()
 {
        if ( field_channel && pattern.size() > 0 ) {
                if ( !(Pp == Pp2) || field_channel != field_channel_saved) {
@@ -398,19 +399,23 @@ search( ssize_t from)
                        field_channel_saved = field_channel;
                }
                cpattern = new sigproc::CPattern<TFloat>
-                       ({pattern, field_channel->samplerate()},
+                       ({thing, field_channel->samplerate()},
                         context_before, context_after,
                         Pp);
-               last_find = cpattern->find(
+               auto found =
+                 (cpattern->find(
                        field_channel->signal_envelope( Pp.env_tightness).first,
                        field_channel->signal_envelope( 
Pp.env_tightness).second,
                        field_channel->signal_bandpass( Pp.bwf_ffrom, 
Pp.bwf_fupto, Pp.bwf_order),
                        field_channel->signal_dzcdf( Pp.dzcdf_step, 
Pp.dzcdf_sigma, Pp.dzcdf_smooth),
-                       from, increment);
-               match = cpattern->match;
+                       increment * samplerate),
+                  cpattern->diff);
 
                delete cpattern;
                cpattern = nullptr;
+
+               for ( size_t i = 0; i < found.size(); ++i )
+                       if 
                return last_find != (size_t)-1;
        } else
                return false;
@@ -440,10 +445,10 @@ scandir_filter( const struct dirent *e)
 {
        return strcmp( e->d_name, ".") && strcmp( e->d_name, "..");
 }
+const char
+       *globally_marker = "[global] ";
 }
 
-const char
-       *aghui::SScoringFacility::SFindDialog::globally_marker = "[global] ";
 
 void
 aghui::SScoringFacility::SFindDialog::
diff --git a/src/ui/sf/sf.hh b/src/ui/sf/sf.hh
index 0cb184f..55e9b4e 100644
--- a/src/ui/sf/sf.hh
+++ b/src/ui/sf/sf.hh
@@ -501,18 +501,13 @@ class SScoringFacility
        struct SFindDialog {
                DELETE_DEFAULT_METHODS (SFindDialog);
 
-             // own copies of parent's same
-               pattern::SPatternPPack<TFloat>
-                       Pp,
-                       Pp2;
-
-               sigproc::TMatch<TFloat>
-                       tolerance,
-                       match;
+             // ctor, dtor
+               SFindDialog (SScoringFacility& parent);
+              ~SFindDialog ();
 
              // loadable
                valarray<TFloat>
-                       pattern;
+                       thing;
                size_t  samplerate;
                size_t  context_before,
                        context_after;
@@ -522,48 +517,45 @@ class SScoringFacility
                double pattern_length() const; // in seconds
                double pattern_length_essential() const;
 
+               void load_pattern( SScoringFacility::SChannel&); // load 
selection on this channel
+               void load_pattern( const char* name, bool globally); // load 
named
+               void save_pattern( const char* name, bool globally);
+               void discard_pattern( const char *label, bool globally);
+
              // finding tool
-               sigproc::CPattern<TFloat>
+               pattern::SPatternPPack<TFloat>
+                       Pp,
+                       Pp2;
+               pattern::CPattern<TFloat>
                        *cpattern;
-               size_t  last_find;
-               int     increment;
+               double  increment; // in seconds
 
                SScoringFacility::SChannel
                        *field_channel,
                        *field_channel_saved;
+               size_t search();
 
-               bool search( ssize_t from);
-
-             // ctor, dtor
-               SFindDialog (SScoringFacility& parent);
-              ~SFindDialog ();
-
+             // draw
                bool    draw_details:1;
                void draw( cairo_t*);
+               float   display_scale;
+
+             // widgets
+               SUIVarCollection
+                       W_V;
 
                void enumerate_patterns_to_combo();
                void preselect_entry( const char*, bool globally);
                void preselect_channel( const char*);
                void enable_controls( bool);
-               SUIVarCollection
-                       W_V;
-
-               float   display_scale;
 
-               static const char
-                       *globally_marker;
-               void load_pattern( SScoringFacility::SChannel&); // load 
selection on this channel
-               void load_pattern( const char* name, bool globally); // load 
named
-               void save_pattern( const char* name, bool globally);
-               void discard_pattern( const char *label, bool globally);
-
-               SScoringFacility&
-                       _p;
-             // widgets
                static const int
                        da_ht = 280;
                int     da_wd;
                void set_pattern_da_width( int);
+
+               SScoringFacility&
+                       _p;
        };
        SFindDialog
                find_dialog;

-- 
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