[med-svn] [SCM] aghermann branch, master, updated. 06bda7dfaa687aaf0708a024d192024e2cd58421

Andrei Zavada johnhommer at gmail.com
Thu Jan 24 00:43:54 UTC 2013


The following commit has been merged in the master branch:
commit cd03f45712951faf782a197cfa6449e3a24cd16f
Author: Andrei Zavada <johnhommer at gmail.com>
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 <johnhommer at gmail.com>
+ * 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 <johnhommer at gmail.com>
  * 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 <johnhommer at gmail.com>
- * 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



More information about the debian-med-commit mailing list