[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