diff --git a/src/fmri/Options.cpp b/src/fmri/Options.cpp index 6944cbd..c778f9e 100644 --- a/src/fmri/Options.cpp +++ b/src/fmri/Options.cpp @@ -3,6 +3,7 @@ #include #include #include "Options.hpp" +#include "visualisations.hpp" using namespace fmri; @@ -92,6 +93,7 @@ Options::Options(int argc, char * const argv[]): ("layer-opacity", value_for(layerTransparancy_), "Opacity for layers") ("interaction-opacity", value_for(interactionTransparancy_), "Opacity for interactions") ("layer-distance", value_for(LAYER_X_OFFSET), "Distance between layers") + ("interaction-limit", value_for(INTERACTION_LIMIT), "Maximum number of interactions per layer") ("dump,d", value(&dumpPath), "dump convolutional images in this directory"); options_description composed = desc; diff --git a/src/fmri/visualisations.cpp b/src/fmri/visualisations.cpp index 77710d9..43d1632 100644 --- a/src/fmri/visualisations.cpp +++ b/src/fmri/visualisations.cpp @@ -14,8 +14,7 @@ using namespace fmri; using namespace std; -// Maximum number of interactions shown -static constexpr size_t INTERACTION_LIMIT = 10000; +std::size_t fmri::INTERACTION_LIMIT = 10000; typedef vector>> EntryList; diff --git a/src/fmri/visualisations.hpp b/src/fmri/visualisations.hpp index 40d5526..06305f9 100644 --- a/src/fmri/visualisations.hpp +++ b/src/fmri/visualisations.hpp @@ -6,6 +6,20 @@ #include "LayerInfo.hpp" namespace fmri { + /** + * Maximum number of interactions per layer. + * + * Controls the number of interactions per layer for performance + * reasons. Only the top INTERACTION_LIMIT interactions are shown + * to limit the amount of computations needed for animation. + * + * Note that this number currently applies only to InnerProduct + * type layers. + * + * This value is set from the options parser. + */ + extern std::size_t INTERACTION_LIMIT; + /** * Generate a static visualisation of a layer state. * diff --git a/src/tools/launcher.cpp b/src/tools/launcher.cpp index 03f1385..f00409d 100644 --- a/src/tools/launcher.cpp +++ b/src/tools/launcher.cpp @@ -75,6 +75,14 @@ void float_parameter(std::vector &argv, std::string_view flag, double va argv.push_back(wrap_string(buffer)); } +void int_parameter(std::vector &argv, std::string_view flag, int value) +{ + char buffer[100]; + argv.push_back(wrap_string(flag)); + std::sprintf(buffer, "%d", value); + argv.push_back(wrap_string(buffer)); +} + void set_default_path(Gtk::FileChooserButton& chooser, const char* path) { if (file_exists(path)) { @@ -101,6 +109,7 @@ private: Gtk::Scale layerDistance; Gtk::Scale layerTransparancy; Gtk::Scale interactionTransparancy; + Gtk::SpinButton interactionLimit; Gtk::Button startButton; void start(); @@ -125,6 +134,7 @@ Launcher::Launcher() layerDistance(Gtk::Adjustment::create(10, 0, 100, 0, 0.1, 0)), layerTransparancy(Gtk::Adjustment::create(1, 0, 1, 0.0, 1.f / 256)), interactionTransparancy(Gtk::Adjustment::create(1, 0, 1, 0.0, 1.f / 256)), + interactionLimit(Gtk::Adjustment::create(10000, 4096, std::numeric_limits::max()), 10000), startButton("Start FMRI") { set_default_size(400, -1); @@ -162,6 +172,7 @@ Launcher::Launcher() addRowWithLabel("Layer distance", layerDistance); addRowWithLabel("Layer transparancy", layerTransparancy); addRowWithLabel("Interaction transparancy", interactionTransparancy); + addRowWithLabel("Interaction limit", interactionLimit); startButton.signal_clicked().connect(sigc::mem_fun(*this, &Launcher::start)); grid.attach_next_to(startButton, Gtk::PositionType::POS_BOTTOM, 2, 1); @@ -201,6 +212,7 @@ void Launcher::start() float_parameter(argv, "--layer-opacity", layerTransparancy.get_value()); float_parameter(argv, "--interaction-opacity", interactionTransparancy.get_value()); float_parameter(argv, "--layer-distance", layerDistance.get_value()); + int_parameter(argv, "--interaction-limit", interactionLimit.get_value()); if (labelChooser.get_file()) { argv.push_back(wrap_string("-l"));