The following commit has been merged in the master branch:
commit e052f8ad5cdccc2604b541ef83fcd1390cc38010
Author: andrei zavada <[email protected]>
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

_______________________________________________
debian-med-commit mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit

Reply via email to