[med-svn] [SCM] aghermann branch, master, updated. 3b87b4f8039ed683022537a0599b7dea069974d2

andrei zavada andrei.zavada at strikead.com
Sun Sep 30 22:40:49 UTC 2012


The following commit has been merged in the master branch:
commit e052f8ad5cdccc2604b541ef83fcd1390cc38010
Author: andrei zavada <andrei.zavada at strikead.com>
Date:   Fri Sep 28 17:55:18 2012 +0300

    CExpDesign::for_each_* methods with functional, omp-enabled goodness

diff --git a/src/expdesign/primaries-tree-scanner.cc b/src/expdesign/primaries-tree-scanner.cc
index 28f4a28..b7aa241 100644
--- a/src/expdesign/primaries-tree-scanner.cc
+++ b/src/expdesign/primaries-tree-scanner.cc
@@ -348,28 +348,27 @@ void
 agh::CExpDesign::
 compute_profiles()
 {
-	vector<CRecording*> v;
-	for ( auto &G : groups )
-		for ( auto &J : G.second )
-			for ( auto &D : J.measurements )
-				for ( auto &E : D.second.episodes )
-					for ( auto &R : E.recordings )
-						if ( R.second.signal_type() == sigfile::SChannel::TType::eeg )
-							v.push_back( &R.second);
-	size_t global_i = 0;
-#pragma omp parallel for
-	for ( size_t i = 0; i < v.size(); ++i ) {
-#pragma omp critical
+	function<void(CRecording&)> F =
+		[&]( CRecording& R)
+		{
+			R.CBinnedPower::compute();
+			R.CBinnedMC::compute();
+		};
+	function<void(const CJGroup&, const CSubject&, const string&, const CSubject::SEpisode&, const CRecording&,
+		      size_t, size_t)> G =
+		[&]( const CJGroup&, const CSubject&, const string&, const CSubject::SEpisode&, const CRecording& R,
+		     size_t i, size_t total)
 		{
-			auto& R = *v[i];
 			only_progress_fun(
 				(string ("Compute ") + R.F().filename() + ":"+R.F().channel_by_id(R.h())).c_str(),
-				v.size(), ++global_i);
-		}
-
-		v[i]->CBinnedPower::compute();
-		v[i]->CBinnedMC::compute();
-	}
+				total, i);
+		};
+	function<bool(CRecording&)> filter =
+		[&]( CRecording& R)
+		{
+			return R.signal_type() == sigfile::SChannel::TType::eeg;
+		};
+	for_all_recordings( F, G, filter);
 }
 
 
diff --git a/src/expdesign/primaries.cc b/src/expdesign/primaries.cc
index 53bbeab..f3f2a58 100644
--- a/src/expdesign/primaries.cc
+++ b/src/expdesign/primaries.cc
@@ -115,6 +115,95 @@ log_message( const char* fmt, ...)
 
 
 
+void
+agh::CExpDesign::
+for_all_subjects( function<void(CSubject&)>& F,
+		  function<void(const CJGroup&, const CSubject&,
+				size_t, size_t)>& report,
+		  function<bool(CSubject&)>& filter)
+{
+	vector<tuple<CJGroup*,
+		     CSubject*>> v;
+	for ( auto& G : groups )
+		for ( auto& J : G.second )
+			if ( filter(J) )
+				v.emplace_back( make_tuple(&G.second, &J));
+	size_t global_i = 0;
+#pragma omp parallel for
+	for ( size_t i = 0; i < v.size(); ++i ) {
+		F( *get<1>(v[i]));
+#pragma omp critical
+		{
+			report( *get<0>(v[i]), *get<1>(v[i]),
+				++global_i, v.size());
+		}
+	}
+}
+
+
+void
+agh::CExpDesign::
+for_all_episodes( function<void(CSubject::SEpisode&)>& F,
+		  function<void(const CJGroup&, const CSubject&, const string&, const CSubject::SEpisode&,
+				size_t, size_t)>& report,
+		  function<bool(CSubject::SEpisode&)>& filter)
+{
+	vector<tuple<CJGroup*,
+		     CSubject*,
+		     const string*,
+		     CSubject::SEpisode*>> v;
+	for ( auto& G : groups )
+		for ( auto& J : G.second )
+			for ( auto& M : J.measurements )
+				for ( auto& E : M.second.episodes )
+					if ( filter(E) )
+						v.emplace_back( make_tuple(&G.second, &J, &M.first, &E));
+	size_t global_i = 0;
+#pragma omp parallel for
+	for ( size_t i = 0; i < v.size(); ++i ) {
+		F( *get<3>(v[i]));
+#pragma omp critical
+		{
+			report( *get<0>(v[i]), *get<1>(v[i]), *get<2>(v[i]), *get<3>(v[i]),
+				++global_i, v.size());
+		}
+	}
+}
+
+
+void
+agh::CExpDesign::
+for_all_recordings( function<void(CRecording&)>& F,
+		    function<void(const CJGroup&, const CSubject&, const string&, const CSubject::SEpisode&, const CRecording&,
+				  size_t, size_t)>& report,
+		    function<bool(CRecording&)>& filter)
+{
+	vector<tuple<CJGroup*,
+		     CSubject*,
+		     const string*,
+		     CSubject::SEpisode*,
+		     CRecording*>> v;
+	for ( auto& G : groups )
+		for ( auto& J : G.second )
+			for ( auto& M : J.measurements )
+				for ( auto& E : M.second.episodes )
+					for ( auto &R : E.recordings )
+						if ( filter(R.second) )
+							v.emplace_back( make_tuple (&G.second, &J, &M.first, &E, &R.second));
+	size_t global_i = 0;
+#pragma omp parallel for
+	for ( size_t i = 0; i < v.size(); ++i ) {
+		F( *get<4>(v[i]));
+#pragma omp critical
+		{
+			report( *get<0>(v[i]), *get<1>(v[i]), *get<2>(v[i]), *get<3>(v[i]), *get<4>(v[i]),
+				++global_i, v.size());
+		}
+	}
+}
+
+
+
 list<string>
 agh::CExpDesign::
 enumerate_groups() const
diff --git a/src/expdesign/primaries.hh b/src/expdesign/primaries.hh
index a0e068b..683380d 100644
--- a/src/expdesign/primaries.hh
+++ b/src/expdesign/primaries.hh
@@ -374,6 +374,23 @@ class CExpDesign {
 	list<sigfile::SChannel> enumerate_eeg_channels() const;
 	list<size_t> used_samplerates( sigfile::SChannel::TType type = sigfile::SChannel::other) const;
 
+      // omp-enabled lists:foreach
+	void
+	for_all_subjects( function<void(CSubject&)>&,
+			  function<void(const CJGroup&, const CSubject&,
+					size_t, size_t)>&,
+			  function<bool(CSubject&)>& filter);
+	void
+	for_all_episodes( function<void(CSubject::SEpisode&)>&,
+			  function<void(const CJGroup&, const CSubject&, const string&, const CSubject::SEpisode&,
+					size_t, size_t)>&,
+			  function<bool(CSubject::SEpisode&)>& filter);
+	void
+	for_all_recordings( function<void(CRecording&)>&,
+			    function<void(const CJGroup&, const CSubject&, const string&, const CSubject::SEpisode&, const CRecording&,
+					  size_t, size_t)>&,
+			    function<bool(CRecording&)>&);
+
       // inventory
 	sigfile::SFFTParamSet
 		fft_params;

-- 
Sleep experiment manager



More information about the debian-med-commit mailing list