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

andrei zavada jh at johnhommer.com
Thu Jan 24 00:43:40 UTC 2013


The following commit has been merged in the master branch:
commit a770c7a63bc9ef03293b82c65089ce94ac8e912b
Author: andrei zavada <jh at johnhommer.com>
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



More information about the debian-med-commit mailing list