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

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


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



More information about the debian-med-commit mailing list