This is an automated email from the git hooks/post-receive script. hmmr-guest pushed a commit to branch WIP in repository aghermann.
commit 3417f14234f27e7772979fc3b1d1209f3f569f20 Author: Andrei Zavada <[email protected]> Date: Fri Oct 25 02:02:59 2013 +0300 lua WIP --- upstream/configure.ac | 6 ++ upstream/data/sf-rk1968.glade | 37 +++++------- upstream/src/aghermann/Makefile.am | 4 +- upstream/src/aghermann/globals.cc | 32 +++++++++-- upstream/src/aghermann/globals.hh | 6 ++ upstream/src/aghermann/rk1968/rk1968.cc | 91 +++++++++++++++++------------- upstream/src/aghermann/rk1968/rk1968.hh | 49 ++++++---------- upstream/src/aghermann/ui/sf/d/rk1968.cc | 11 ++-- upstream/src/aghermann/ui/sf/d/rk1968.hh | 6 +- upstream/src/aghermann/ui/ui++.hh | 17 ++++++ 10 files changed, 153 insertions(+), 106 deletions(-) diff --git a/upstream/configure.ac b/upstream/configure.ac index 8ee68fc..c919898 100644 --- a/upstream/configure.ac +++ b/upstream/configure.ac @@ -81,7 +81,13 @@ AC_CHECK_LIB( [-lpthread -lfftw3_omp -lfftw3]) AC_SUBST(LIBFFTW3_LDADD, $LIBFFTW3_LDADD) +dnl lua! +AX_PROG_LUA([5.1]) +AX_LUA_LIBS +AX_LUA_HEADERS + +dnl this is needed to compile all our glade files into a nice gresource AC_PATH_PROGS([glib_compile_resources], [glib-compile-resources], [:]) test x$glib_compile_resources = x":" && \ AC_MSG_ERROR([Huh. Isn't glib-compile-resources not part of glib?]) diff --git a/upstream/data/sf-rk1968.glade b/upstream/data/sf-rk1968.glade index 75413aa..70be5d1 100644 --- a/upstream/data/sf-rk1968.glade +++ b/upstream/data/sf-rk1968.glade @@ -8,6 +8,9 @@ <property name="step_increment">0.01</property> <property name="page_increment">1</property> </object> + <object class="GtkTextBuffer" id="tSFRKScript"> + <property name="text" translatable="yes">fafa</property> + </object> <object class="GtkDialog" id="wSFRK"> <property name="can_focus">False</property> <property name="border_width">10</property> @@ -196,7 +199,6 @@ <property name="visible">True</property> <property name="can_focus">False</property> <property name="n_rows">2</property> - <property name="n_columns">2</property> <property name="column_spacing">5</property> <child> <placeholder/> @@ -211,36 +213,23 @@ <placeholder/> </child> <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <object class="GtkSpinButton" id="eSFRKNremThetaDeltaRatio"> + <object class="GtkLabel" id="label1"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">•</property> + <property name="can_focus">False</property> <property name="xalign">1</property> - <property name="adjustment">jSFRKNremThetaDeltaRatio</property> - <property name="digits">2</property> + <property name="label" translatable="yes">Script:</property> </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="x_options">GTK_FILL</property> - </packing> </child> <child> - <object class="GtkLabel" id="label1"> + <object class="GtkTextView" id="eSFRKScript"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">NREM Delta/Theta power ratio:</property> + <property name="can_focus">True</property> + <property name="buffer">tSFRKScript</property> </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> </child> </object> <packing> diff --git a/upstream/src/aghermann/Makefile.am b/upstream/src/aghermann/Makefile.am index 3215a04..dbfce26 100644 --- a/upstream/src/aghermann/Makefile.am +++ b/upstream/src/aghermann/Makefile.am @@ -2,6 +2,7 @@ AM_CXXFLAGS := \ -Wall -Wdeprecated-declarations -std=c++0x -fno-rtti \ $(GTK_CFLAGS) $(VTE_CFLAGS) $(CAIRO_CFLAGS) $(LIBCONFIGXX_CFLAGS) $(UNIQUE_CFLAGS) \ $(OPENMP_CXXFLAGS) \ + $(LUA_INCLUDE) \ -I$(top_srcdir)/src \ -DPACKAGE_DATADIR=\"$(datadir)\" \ -DBUILT_BY=\"@user@\" @@ -138,7 +139,8 @@ aghermann_LDADD := \ $(FFTW3_LIBS) $(ITPP_LIBS) $(SAMPLERATE_LIBS) $(GSL_LIBS) \ $(GTK_LIBS) $(CAIRO_LIBS) $(UNIQUE_LIBS) $(VTE_LIBS) \ $(LIBCONFIGXX_LIBS) \ - $(LIBFFTW3_LDADD) $(OPENMP_CXXFLAGS) + $(LIBFFTW3_LDADD) $(OPENMP_CXXFLAGS) \ + $(LUA_LIB) aghermann_LDFLAGS := \ -shared diff --git a/upstream/src/aghermann/globals.cc b/upstream/src/aghermann/globals.cc index 5a2013c..c727cb9 100644 --- a/upstream/src/aghermann/globals.cc +++ b/upstream/src/aghermann/globals.cc @@ -9,6 +9,7 @@ * License: GPL */ +#include "globals.hh" #include <cstdarg> #include <cassert> @@ -19,8 +20,13 @@ #include <omp.h> #endif -#include "globals.hh" +extern "C" { +#include <lua.h> +#include <lualib.h> +#include <lauxlib.h> +} +#include "common/string.hh" #if HAVE_CONFIG_H && !defined(VERSION) # include "config.h" @@ -34,11 +40,19 @@ gsl_rng *agh::global::rng = nullptr; int agh::global::num_procs = 1; +lua_State* agh::global::lua_state = nullptr; + void agh::global:: init( const string& lf_fname) { + // 0. log facility + { + default_log_facility = + lf_fname.empty() ? nullptr : new agh::log::CLogFacility (lf_fname); + } + // 1. init rng { const gsl_rng_type *T; @@ -59,10 +73,16 @@ init( const string& lf_fname) } #endif - // 3. log facility + // 3. lua { - default_log_facility = - lf_fname.empty() ? nullptr : new agh::log::CLogFacility (lf_fname); + lua_state = lua_open(); + + // lua_baselibopen ( lua_state); + // luaopen_table ( lua_state); + // luaopen_io ( lua_state); + // luaopen_string ( lua_state); + // luaopen_math ( lua_state); + luaL_openlibs( lua_state); } } @@ -73,6 +93,10 @@ fini() { gsl_rng_free( rng); rng = nullptr; + + lua_close( lua_state); + lua_state = nullptr; + if ( default_log_facility ) delete default_log_facility; default_log_facility = nullptr; diff --git a/upstream/src/aghermann/globals.hh b/upstream/src/aghermann/globals.hh index e3ec71f..22bcbf8 100644 --- a/upstream/src/aghermann/globals.hh +++ b/upstream/src/aghermann/globals.hh @@ -13,6 +13,9 @@ #define AGH_AGHERMANN_GLOBALS_H_ #include <gsl/gsl_rng.h> +extern "C" { +#include <lua.h> +} #include "common/log-facility.hh" #if HAVE_CONFIG_H && !defined(VERSION) @@ -36,6 +39,9 @@ void log( agh::log::TLevel, const char* issuer, const char* fmt, ...) __attribut #define APPLOG_WARN(...) do agh::global::log( agh::log::TLevel::warning, LOG_SOURCE_ISSUER, __VA_ARGS__); while (0) #define APPLOG_ERROR(...) do agh::global::log( agh::log::TLevel::error, LOG_SOURCE_ISSUER, __VA_ARGS__); while (0) + +extern lua_State* lua_state; + void init( const string& lf_fname); void fini(); diff --git a/upstream/src/aghermann/rk1968/rk1968.cc b/upstream/src/aghermann/rk1968/rk1968.cc index abc7542..4afd8e1 100644 --- a/upstream/src/aghermann/rk1968/rk1968.cc +++ b/upstream/src/aghermann/rk1968/rk1968.cc @@ -10,45 +10,75 @@ */ +#include "rk1968.hh" + #include <forward_list> +#include <sstream> +#include <fstream> + +extern "C" { +#include <lua.h> +#include <lauxlib.h> +} +#include "libmetrics/bands.hh" +#include "aghermann/globals.hh" #include "libsigfile/page.hh" #include "libsigfile/typed-source.hh" #include "aghermann/expdesign/recording.hh" #include "aghermann/expdesign/subject.hh" #include "aghermann/expdesign/expdesign.hh" -#include "libmetrics/bands.hh" - -#include "rk1968.hh" using namespace std; using namespace agh::rk1968; +using agh::global::lua_state; - +int CScoreAssistant:: -CScoreAssistant (const string& name_, - TExpDirLevel level_, CExpDesign& ED_, const SExpDirLevelId& level_id_) - : CStorablePPack (common_subdir, name_, level_, ED_, level_id_) +load() { - config ("nrem3_delta_theta_ratio", &Pp.nrem3_delta_theta_ratio); - - load(); + string full_path = path(); + ostringstream acc; + ifstream oleg (full_path); + while ( oleg.good() ) + acc << oleg; + script_contents = acc.str(); + + // there is luaL_loadfile, but we would like to keep the contents, too + int ret1 = luaL_loadbuffer( + lua_state, + script_contents.c_str(), + script_contents.size(), + full_path.c_str()); + return ret1; } - +int +CScoreAssistant:: +save() +{ + + return 0; +} int CScoreAssistant:: score( agh::SEpisode& E, size_t* n_pages_scored_p) { + // make various signal metrics available for lua + // and execute a script + size_t n_pages_scored = 0; sigfile::CHypnogram& F1 = E.sources.front(); - // 1. delta/theta-based NREM3 detection + // 1. prepare input vectors + forward_list<valarray<TFloat>> + courses_delta, + courses_theta; { forward_list<agh::CRecording*> HH; for ( auto &R : E.recordings ) @@ -57,9 +87,6 @@ score( agh::SEpisode& E, size_t* n_pages_scored_p) if ( HH.empty() ) return -1; - forward_list<valarray<TFloat>> - courses_delta, - courses_theta; for ( auto &H : HH ) { courses_delta.emplace_front( H->psd_profile.course( @@ -70,32 +97,18 @@ score( agh::SEpisode& E, size_t* n_pages_scored_p) agh::CExpDesign::freq_bands[metrics::TBand::theta][0], agh::CExpDesign::freq_bands[metrics::TBand::theta][1])); } - - for ( size_t p = 0; p < F1.n_pages(); ++p ) { - auto Di = courses_delta.begin(), - Ti = courses_theta.begin(); - int decision = 0; - for ( ; Di != courses_delta.end(); ++Di, ++Ti ) { - decision += - ( (*Di)[p] > (*Ti)[p] * Pp.nrem3_delta_theta_ratio ); - } - if ( decision > 0 ) { - F1[p].mark( sigfile::SPage::TScore::nrem3); - ++n_pages_scored; - } - } - } - - // 2. detect REM by EMG amplitude histogram peak shift - { - // (a) get a whole-episode EMG amplitude distribution - - // (b) } - // 3. detect Wake where EMG is too wild - { - + // 2. + for ( size_t p = 0; p < F1.n_pages(); ++p ) { + // luaL_put... + lua_pcall( + agh::global::lua_state, + 2, // nargsin + 1, // nargsout + 0); + int score; // = luaL_get... + F1[p].mark( (sigfile::SPage::TScore) score); } if ( n_pages_scored_p ) diff --git a/upstream/src/aghermann/rk1968/rk1968.hh b/upstream/src/aghermann/rk1968/rk1968.hh index e1c234c..280f7f6 100644 --- a/upstream/src/aghermann/rk1968/rk1968.hh +++ b/upstream/src/aghermann/rk1968/rk1968.hh @@ -14,6 +14,7 @@ #include <float.h> #include <string> + #include "aghermann/expdesign/dirlevel.hh" #include "libsigproc/sigproc.hh" @@ -22,27 +23,6 @@ using namespace std; namespace agh { namespace rk1968 { -struct SScoreAssistantPPack { - double nrem3_delta_theta_ratio; - - SScoreAssistantPPack () - : nrem3_delta_theta_ratio (1.5) - {} - explicit SScoreAssistantPPack (const SScoreAssistantPPack& rv) - : nrem3_delta_theta_ratio (rv.nrem3_delta_theta_ratio) - {} - SScoreAssistantPPack& operator=( const SScoreAssistantPPack& rv) - { - nrem3_delta_theta_ratio = rv.nrem3_delta_theta_ratio; - return *this; - } - - bool operator==( const SScoreAssistantPPack& rv) - { - return nrem3_delta_theta_ratio == rv.nrem3_delta_theta_ratio; - } -}; - class CScoreAssistant : public CStorablePPack { @@ -50,13 +30,15 @@ class CScoreAssistant static constexpr const char* common_subdir = ".rk1968/"; CScoreAssistant (const string& name_, - TExpDirLevel, CExpDesign&, const SExpDirLevelId&); - explicit CScoreAssistant (const CScoreAssistant& rv) - : CStorablePPack (common_subdir, rv.name + " (dup)", TExpDirLevel::transient, rv.ED, rv.level_id), - Pp (rv.Pp) + TExpDirLevel level_, CExpDesign& ED_, const SExpDirLevelId& level_id_) + : CStorablePPack (common_subdir, name_, level_, ED_, level_id_) { - // assign_keys(); + load(); } + explicit CScoreAssistant (const CScoreAssistant& rv) + : CStorablePPack (common_subdir, rv.name + " (dup)", TExpDirLevel::transient, rv.ED, rv.level_id), + script_contents (rv.script_contents) + {} explicit CScoreAssistant (CExpDesign& ED_, const SExpDirLevelId& level_id_) : CStorablePPack (common_subdir, "(unnamed)", TExpDirLevel::transient, ED_, level_id_) {} @@ -69,26 +51,29 @@ class CScoreAssistant CScoreAssistant& operator=( CScoreAssistant&& rv) { - Pp = move(rv.Pp); + script_contents = move(rv.script_contents); return *this; } CScoreAssistant& operator=( const CScoreAssistant& rv) { - Pp = rv.Pp; + script_contents = rv.script_contents; return *this; } bool operator==( const CScoreAssistant& rv) { - return Pp == rv.Pp; + return script_contents == rv.script_contents; } - int score( agh::SEpisode&, size_t* pages_scored_successfuly); + // this one is not libconfig-based, so override these + int load(); + int save(); - SScoreAssistantPPack - Pp; + string script_contents; + + int score( agh::SEpisode&, size_t* pages_scored_successfuly); }; diff --git a/upstream/src/aghermann/ui/sf/d/rk1968.cc b/upstream/src/aghermann/ui/sf/d/rk1968.cc index 30846cf..f16cac3 100644 --- a/upstream/src/aghermann/ui/sf/d/rk1968.cc +++ b/upstream/src/aghermann/ui/sf/d/rk1968.cc @@ -47,7 +47,10 @@ SRK1968Dialog (SScoringFacility& p_) AGH_GBGETOBJ (bSFRKProfileSave); AGH_GBGETOBJ (bSFRKProfileDiscard); AGH_GBGETOBJ (eSFRKProfileList); - AGH_GBGETOBJ (eSFRKNremThetaDeltaRatio); + + AGH_GBGETOBJ (eSFRKScript); + AGH_GBGETOBJ (tSFRKScript); + AGH_GBGETOBJ (lSFRKTopInfo); AGH_GBGETOBJ (lSFRKBottomInfo); AGH_GBGETOBJ (bSFRKPreview); @@ -75,9 +78,9 @@ SRK1968Dialog (SScoringFacility& p_) G_CONNECT_1 (bSFRKProfileRevert, clicked); G_CONNECT_1 (bSFRKProfileDiscard, clicked); - for ( auto& W : {eSFRKNremThetaDeltaRatio} ) + for ( auto& W : {tSFRKScript} ) g_signal_connect( - W, "value-changed", + W, "changed", (GCallback)eSFRK_any_profile_value_changed_cb, this); @@ -94,7 +97,7 @@ SRK1968Dialog (SScoringFacility& p_) this); // 2. dialog - W_V.reg( eSFRKNremThetaDeltaRatio, &Pp2.Pp.nrem3_delta_theta_ratio); + W_V.reg( tSFRKScript, &Pp2.script_contents); } SScoringFacility::SRK1968Dialog:: diff --git a/upstream/src/aghermann/ui/sf/d/rk1968.hh b/upstream/src/aghermann/ui/sf/d/rk1968.hh index cf64dc6..06a23bc 100644 --- a/upstream/src/aghermann/ui/sf/d/rk1968.hh +++ b/upstream/src/aghermann/ui/sf/d/rk1968.hh @@ -62,8 +62,10 @@ struct SScoringFacility::SRK1968Dialog *eSFRKProfileList; gulong eSFRKProfileList_changed_cb_handler_id; - GtkSpinButton - *eSFRKNremThetaDeltaRatio; + GtkTextView + *eSFRKScript; + GtkTextBuffer + *tSFRKScript; GtkToggleButton *bSFRKPreview; diff --git a/upstream/src/aghermann/ui/ui++.hh b/upstream/src/aghermann/ui/ui++.hh index 67c236a..e6f258f 100644 --- a/upstream/src/aghermann/ui/ui++.hh +++ b/upstream/src/aghermann/ui/ui++.hh @@ -242,6 +242,20 @@ SUIVar_<GtkEntry, string>::up() const { gtk_entry_set_text( w, v->c_str template <> inline void SUIVar_<GtkEntry, string>::down() const { v->assign( gtk_entry_get_text( w)); } +template <> inline void +SUIVar_<GtkTextBuffer, string>::up() const +{ + gtk_text_buffer_set_text( w, v->c_str(), -1); +} +template <> inline void +SUIVar_<GtkTextBuffer, string>::down() const +{ + GtkTextIter a, z; + gtk_text_buffer_get_start_iter( w, &a); + gtk_text_buffer_get_end_iter( w, &z); + v->assign( gtk_text_buffer_get_text( w, &a, &z, FALSE /* include_hidden_chars */ )); +} + class SUIVarCollection { @@ -276,6 +290,9 @@ class SUIVarCollection { void reg( GtkEntry *w, string* v) { c.push_back( new SUIVar_<GtkEntry, string> (w, v)); } + void reg( GtkTextBuffer *w, string* v) + { c.push_back( new SUIVar_<GtkTextBuffer, string> (w, v)); } + // odd one out void reg( GtkListStore *m, list<string> *l) { c.push_back( new SUIVar_<GtkListStore, list<string>> (m, l)); } -- Alioth's /git/debian-med/git-commit-notice on /srv/git.debian.org/git/debian-med/aghermann.git _______________________________________________ debian-med-commit mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit
