The following commit has been merged in the master branch:
commit cd03f45712951faf782a197cfa6449e3a24cd16f
Author: Andrei Zavada <[email protected]>
Date:   Mon Jan 21 02:04:56 2013 +0200

    separate dir for patterns

diff --git a/configure.ac b/configure.ac
index 2bdf1dd..ea9d174 100644
--- a/configure.ac
+++ b/configure.ac
@@ -196,6 +196,7 @@ AC_OUTPUT([
        src/Makefile
        src/sigproc/Makefile
        src/libsigfile/Makefile
+       src/patterns/Makefile
        src/metrics/Makefile
        src/ica/Makefile
        src/common/Makefile
diff --git a/src/Makefile.am b/src/Makefile.am
index 29cc54c..1e2726f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,7 +1,8 @@
 SUBDIRS := \
        common sigproc ica libsigfile \
        metrics \
-       expdesign model \
+       expdesign \
+       patterns model \
        ui \
        tools
 
@@ -24,6 +25,7 @@ aghermann_LDADD := \
        ui/mf/liba.a \
        ui/liba.a \
        model/liba.a \
+       patterns/liba.a \
        metrics/liba.a \
        libsigfile/liba.a \
        sigproc/liba.a \
diff --git a/src/patterns/Makefile.am b/src/patterns/Makefile.am
new file mode 100644
index 0000000..57659ac
--- /dev/null
+++ b/src/patterns/Makefile.am
@@ -0,0 +1,20 @@
+AM_CXXFLAGS := \
+       -Wall -std=c++11 -fno-rtti \
+       -I$(top_srcdir)/src
+
+noinst_LIBRARIES := liba.a
+
+liba_a_SOURCES := \
+       patterns.cc patterns.hh patterns.ii
+
+if DO_PCH
+BUILT_SOURCES := \
+       patterns.hh.gch
+%.hh.gch: %.hh
+       $(CXXCOMPILE) -c $<
+CLEANFILES := \
+       $(BUILT_SOURCES)
+endif
+
+EXTRA_DIST := \
+       patterns.ii
diff --git a/src/patterns/patterns.cc b/src/patterns/patterns.cc
new file mode 100644
index 0000000..48277e5
--- /dev/null
+++ b/src/patterns/patterns.cc
@@ -0,0 +1,180 @@
+// ;-*-C++-*-
+/*
+ *       File name:  patterns/patterns.cc
+ *         Project:  Aghermann
+ *          Author:  Andrei Zavada <[email protected]>
+ * Initial version:  2013-01-09
+ *
+ *         Purpose:  CPatternTool explicit pattern instantiations be
+ *                   here, also loading patterns
+ *
+ *         License:  GPL
+ */
+
+#include <cstring>
+#include <dirent.h>
+#include <sys/stat.h>
+#include "common/fs.hh"
+#include "patterns.hh"
+
+using namespace std;
+
+template pattern::CPatternTool<TFloat>::CPatternTool( const 
sigproc::SSignalRef<TFloat>&, size_t, size_t, const SPatternPPack<TFloat>&);
+template int pattern::CPatternTool<TFloat>::do_search( const 
valarray<TFloat>&, const valarray<TFloat>&, const valarray<TFloat>&, const 
valarray<TFloat>&, size_t);
+template int pattern::CPatternTool<TFloat>::do_search( const 
sigproc::SSignalRef<TFloat>&, size_t);
+template int pattern::CPatternTool<TFloat>::do_search( const 
valarray<TFloat>&, size_t);
+
+
+
+inline namespace {
+int
+scandir_filter( const struct dirent *e)
+{
+       return strcmp( e->d_name, ".") && strcmp( e->d_name, "..");
+}
+}
+
+
+namespace pattern {
+
+
+template <>
+SPattern<TFloat>
+load_pattern( const char* fname) throw(invalid_argument)
+{
+       SPattern<TFloat>
+               P;
+
+       DEF_UNIQUE_CHARP (buf);
+       FILE *fd = fopen( fname, "r");
+       if ( fd ) {
+               size_t  full_sample;
+               if ( fscanf( fd,
+                            (sizeof(TFloat) == sizeof(float))
+                            ? "%lg  %u %lg %lg  %lg %lg %u"
+                            " %g %g %g %g"
+                            " %zu %zu %zu %zu\n"
+                            "--DATA--\n"
+                            :
+                            "%lg  %u %lg %lg  %lg %lg %u"
+                            " %lg %lg %lg %lg"
+                            " %zu %zu %zu %zu\n"
+                            "--DATA--\n"
+                            ,
+                            &P.Pp.env_scope,
+                            &P.Pp.bwf_order, &P.Pp.bwf_ffrom, &P.Pp.bwf_fupto,
+                            &P.Pp.dzcdf_step, &P.Pp.dzcdf_sigma, 
&P.Pp.dzcdf_smooth,
+                            &get<0>(P.criteria), &get<1>(P.criteria), 
&get<2>(P.criteria), &get<3>(P.criteria),
+                            &P.samplerate, &P.context_before, &P.context_after,
+                            &full_sample) == 14 ) {
+
+                       P.thing.resize( full_sample);
+                       for ( size_t i = 0; i < full_sample; ++i ) {
+                               double d;
+                               if ( fscanf( fd, "%la", &d) != 1 ) {
+                                       ASPRINTF( &buf, "load_pattern(\"%s\"): 
short read at sample %zu; "
+                                                 "removing file", fname, i);
+                                       fprintf( stderr, "%s\n", buf);
+                                       P.thing.resize( 0);
+                                       fclose( fd);
+                                       unlink( fname);
+                                       throw invalid_argument (buf);
+                               } else
+                                       P.thing[i] = d;
+                       }
+
+               } else {
+                       P.thing.resize( 0);
+                       ASPRINTF( &buf, "load_pattern(\"%s\"): bad header, so 
removing file", fname);
+                       fprintf( stderr, "%s\n", buf);
+                       P.thing.resize( 0);
+                       fclose( fd);
+                       unlink( fname);
+                       throw invalid_argument (buf);
+               }
+
+               fclose( fd);
+
+       } else {
+               ASPRINTF( &buf, "Failed to open pattern %s", fname);
+               fprintf( stderr, "%s\n", buf);
+               throw invalid_argument (buf);
+       }
+
+       P.saved = true;
+       return P;
+}
+
+
+template <>
+int
+save_pattern( SPattern<TFloat>& P, const char* fname)
+{
+       if ( agh::fs::mkdir_with_parents( agh::fs::dirname(fname)) ) {
+               fprintf( stderr, "save_pattern(\"%s\"): mkdir failed\n", fname);
+               return -1;
+       }
+
+       FILE *fd = fopen( fname, "w");
+       try {
+               if ( !fd )
+                       throw -2;
+
+               if ( fprintf( fd,
+                             "%g  %u %g %g  %g %g %u  %g %g %g %g\n"
+                             "%zu  %zu %zu %zu\n"
+                             "--DATA--\n",
+                             P.Pp.env_scope,
+                             P.Pp.bwf_order, P.Pp.bwf_ffrom, P.Pp.bwf_fupto,
+                             P.Pp.dzcdf_step, P.Pp.dzcdf_sigma, 
P.Pp.dzcdf_smooth,
+                             get<0>(P.criteria), get<1>(P.criteria), 
get<2>(P.criteria), get<3>(P.criteria),
+                             P.samplerate, P.context_before, P.context_after,
+                             P.thing.size()) < 1 ) {
+                       fprintf( stderr, "save_pattern(\"%s\"): write 
failed\n", fname);
+                       throw -3;
+               }
+
+               for ( size_t i = 0; i < P.thing.size(); ++i )
+                       if ( fprintf( fd, "%a\n", (double)P.thing[i]) < 1 ) {
+                               fprintf( stderr, "save_pattern(\"%s\"): write 
failed\n", fname);
+                               throw -3;
+                       }
+               fclose( fd);
+
+               return 0;
+
+       } catch (int ret) {
+               if ( fd )
+                       fclose( fd);
+               return ret;
+       }
+}
+
+
+
+
+template <>
+list<pattern::SPattern<TFloat>>
+load_patterns_from_location<TFloat>( const string& loc, pattern::TOrigin 
origin)
+{
+       list<SPattern<TFloat>>
+               ret;
+
+       struct dirent **eps;
+       size_t  total = scandir( loc.c_str(), &eps, scandir_filter, alphasort);
+
+       for ( size_t i = 0; i < total; ++i ) {
+               ret.push_back(
+                       load_pattern<TFloat>( eps[i]->d_name));
+               ret.back().origin = origin;
+               free( eps[i]);
+       }
+       free( (void*)eps);
+
+       return ret;
+}
+
+
+} // namespace pattern
+
+// eof
diff --git a/src/sigproc/patterns.hh b/src/patterns/patterns.hh
similarity index 70%
rename from src/sigproc/patterns.hh
rename to src/patterns/patterns.hh
index 726c098..2674b35 100644
--- a/src/sigproc/patterns.hh
+++ b/src/patterns/patterns.hh
@@ -13,12 +13,13 @@
 #ifndef _SIGPROC_PATTERNS_H
 #define _SIGPROC_PATTERNS_H
 
+#include <stdexcept>
 #include <tuple>
 #include <vector>
 
 #include <gsl/gsl_math.h>
 
-#include "sigproc.hh"
+#include "sigproc/sigproc.hh"
 
 #if HAVE_CONFIG_H && !defined(VERSION)
 #  include "config.h"
@@ -70,9 +71,9 @@ struct SPatternPPack {
 
 
 template <typename T>
-class CPattern
+class CPatternTool
   : public SPatternPPack<T> {
-       DELETE_DEFAULT_METHODS (CPattern);
+       DELETE_DEFAULT_METHODS (CPatternTool);
 
     public:
       // the complete pattern signature is made of:
@@ -81,9 +82,9 @@ class CPattern
       // (c) target frequency (band-passed);
       // (d) instantaneous frequency at fine intervals;
 
-       CPattern (const sigproc::SSignalRef<T>& thing,
-                 size_t ctx_before_, size_t ctx_after_,
-                 const SPatternPPack<T>& Pp_)
+       CPatternTool (const sigproc::SSignalRef<T>& thing,
+                     size_t ctx_before_, size_t ctx_after_,
+                     const SPatternPPack<T>& Pp_)
              : SPatternPPack<T> (Pp_),
                penv (thing),
                ptarget_freq (thing),
@@ -134,9 +135,63 @@ class CPattern
        double  crit_dzcdf_unity;
 };
 
+
+
+enum TOrigin { subject, experiment, user, system };
+
+template <typename T>
+struct SPattern {
+       string  name;
+
+       TOrigin origin;
+
+       bool    saved;
+
+       valarray<T>
+               thing;
+       size_t  samplerate;
+       size_t  context_before,
+               context_after;
+       static const size_t
+               context_pad = 100;
+       size_t pattern_size_essential() const
+               {
+                       return thing.size() - context_before - context_after;
+               }
+
+       double pattern_length() const // in seconds
+               {
+                       return (double)thing.size() / samplerate;
+               }
+
+       double pattern_length_essential() const
+               {
+                       return (double)pattern_size_essential() / samplerate;
+               }
+
+       SPatternPPack<TFloat>
+               Pp;
+       CMatch<T>
+               criteria;
+};
+
+
+template <typename T>
+list<SPattern<T>>
+load_patterns_from_location( const string&, TOrigin);
+
+template <typename T>
+SPattern<T>
+load_pattern( const char*) throw(invalid_argument);
+
+template <typename T>
+int
+save_pattern( SPattern<T>&, const char*);
+
 #include "patterns.ii"
 
-} // namespace sigproc
+
+} // namespace pattern
 
 
 #endif
diff --git a/src/sigproc/patterns.ii b/src/patterns/patterns.ii
similarity index 85%
rename from src/sigproc/patterns.ii
rename to src/patterns/patterns.ii
index 2bb7ecd..a951d5f 100644
--- a/src/sigproc/patterns.ii
+++ b/src/patterns/patterns.ii
@@ -1,6 +1,6 @@
 // ;-*-C++-*-
 /*
- *       File name:  sigproc/patterns.ii
+ *       File name:  patterns/patterns.ii
  *         Project:  Aghermann
  *          Author:  Andrei Zavada <[email protected]>
  * Initial version:  2013-01-09
@@ -10,15 +10,15 @@
  *         License:  GPL
  */
 
-extern template CPattern<TFloat>::CPattern( const 
sigproc::SSignalRef<TFloat>&, size_t, size_t, const SPatternPPack&);
-extern template int CPattern<TFloat>::do_search( const valarray<TFloat>&, 
const valarray<TFloat>&, const valarray<TFloat>&, const valarray<TFloat>&, 
size_t);
-extern template int CPattern<TFloat>::do_search( const 
sigproc::SSignalRef<TFloat>&, size_t);
-extern template int CPattern<TFloat>::do_search( const valarray<TFloat>&, 
size_t);
+extern template CPatternTool<TFloat>::CPatternTool( const 
sigproc::SSignalRef<TFloat>&, size_t, size_t, const SPatternPPack&);
+extern template int CPatternTool<TFloat>::do_search( const valarray<TFloat>&, 
const valarray<TFloat>&, const valarray<TFloat>&, const valarray<TFloat>&, 
size_t);
+extern template int CPatternTool<TFloat>::do_search( const 
sigproc::SSignalRef<TFloat>&, size_t);
+extern template int CPatternTool<TFloat>::do_search( const valarray<TFloat>&, 
size_t);
 
 
 template <typename T>
 int
-CPattern<T>::
+CPatternTool<T>::
 do_search( const valarray<T>& fenv_l,
           const valarray<T>& fenv_u,
           const valarray<T>& ftarget_freq,
@@ -80,7 +80,7 @@ do_search( const valarray<T>& fenv_l,
 
 template <typename T>
 int
-CPattern<T>::
+CPatternTool<T>::
 do_search( const sigproc::SSignalRef<T>& signal,
           size_t inc)
 {
@@ -93,7 +93,7 @@ do_search( const sigproc::SSignalRef<T>& signal,
 
 template <typename T>
 int
-CPattern<T>::
+CPatternTool<T>::
 do_search( const valarray<T>& signal,
           size_t inc)
 {
diff --git a/src/sigproc/Makefile.am b/src/sigproc/Makefile.am
index ec567da..ef55ba0 100644
--- a/src/sigproc/Makefile.am
+++ b/src/sigproc/Makefile.am
@@ -8,7 +8,6 @@ liba_a_SOURCES := \
        exstrom.cc exstrom.hh \
        ext-filters.cc ext-filters.hh ext-filters.ii \
        sigproc.cc sigproc.hh sigproc.ii \
-       patterns.cc patterns.hh patterns.ii \
        winfun.cc winfun.hh
 
 if DO_PCH
@@ -16,8 +15,7 @@ BUILT_SOURCES := \
        ext-filters.hh.gch \
        exstrom.hh.gch \
        winfun.hh.gch \
-       sigproc.hh.gch \
-       patterns.hh.gch
+       sigproc.hh.gch
 %.hh.gch: %.hh
        $(CXXCOMPILE) -c $<
 CLEANFILES := \
@@ -25,4 +23,5 @@ CLEANFILES := \
 endif
 
 EXTRA_DIST := \
-       sigproc.ii
+       sigproc.ii \
+       ext-filters.ii
diff --git a/src/sigproc/patterns.cc b/src/sigproc/patterns.cc
deleted file mode 100644
index d541c3e..0000000
--- a/src/sigproc/patterns.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// ;-*-C++-*-
-/*
- *       File name:  sigproc/patterns.cc
- *         Project:  Aghermann
- *          Author:  Andrei Zavada <[email protected]>
- * Initial version:  2013-01-09
- *
- *         Purpose:  CPattern explicit pattern instantiations be here
- *
- *         License:  GPL
- */
-
-#include "patterns.hh"
-
-using namespace std;
-
-template pattern::CPattern<TFloat>::CPattern( const 
sigproc::SSignalRef<TFloat>&, size_t, size_t, const SPatternPPack<TFloat>&);
-template int pattern::CPattern<TFloat>::do_search( const valarray<TFloat>&, 
const valarray<TFloat>&, const valarray<TFloat>&, const valarray<TFloat>&, 
size_t);
-template int pattern::CPattern<TFloat>::do_search( const 
sigproc::SSignalRef<TFloat>&, size_t);
-template int pattern::CPattern<TFloat>::do_search( const valarray<TFloat>&, 
size_t);
-
-
-
-// eof

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