From 1f7281e153c656da8161ffb90605bc0595cf64ec Mon Sep 17 00:00:00 2001 From: Samuel Fadel Date: Tue, 13 Oct 2015 13:04:29 -0300 Subject: Argument handling and file saving. --- main.cpp | 87 +++++++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 67 insertions(+), 20 deletions(-) (limited to 'main.cpp') diff --git a/main.cpp b/main.cpp index 5dbbe8b..e9492f7 100644 --- a/main.cpp +++ b/main.cpp @@ -1,10 +1,14 @@ #include -#include #include -#include +#include +#include + #include +#include #include +#include +#include "main.h" #include "mp.h" #include "continuouscolorscale.h" #include "scatterplot.h" @@ -15,12 +19,44 @@ #include "distortionobserver.h" #include "npdistortion.h" +static QObject *mainProvider(QQmlEngine *engine, QJSEngine *scriptEngine) +{ + Q_UNUSED(engine) + Q_UNUSED(scriptEngine) + + return Main::instance(); +} + int main(int argc, char **argv) { QApplication app(argc, argv); + app.setApplicationName("pm"); + app.setApplicationVersion("1.0"); qmlRegisterType("PM", 1, 0, "Scatterplot"); qmlRegisterType("PM", 1, 0, "HistoryGraph"); + qmlRegisterSingletonType
("PM", 1, 0, "Main", mainProvider); + + QCommandLineParser parser; + parser.setApplicationDescription("Interactive multidimensional projections."); + parser.addHelpOption(); + parser.addVersionOption(); + parser.addPositionalArgument("dataset", "Dataset filename (.tbl)"); + + QCommandLineOption indicesFileOutputOption(QStringList() << "i" << "indices", + "Filename to store the subsample indices.", + "indices_path"); + parser.addOption(indicesFileOutputOption); + QCommandLineOption subsampleFileOutputOption(QStringList() << "s" << "subsample", + "Filename to store subsample mapping.", + "subsample_path"); + parser.addOption(subsampleFileOutputOption); + + parser.process(app); + QStringList args = parser.positionalArguments(); + if (args.size() != 1) { + parser.showHelp(1); + } // Set up multisampling QSurfaceFormat fmt; @@ -28,19 +64,23 @@ int main(int argc, char **argv) QSurfaceFormat::setDefaultFormat(fmt); QQmlApplicationEngine engine(QUrl("qrc:///main_view.qml")); - arma::mat dataset; - if (argc > 1) { - dataset.load(argv[1], arma::raw_ascii); - } else { - dataset.load(std::cin, arma::raw_ascii); + Main *m = Main::instance(); + if (parser.isSet(indicesFileOutputOption)) { + m->setIndicesSavePath(parser.value(indicesFileOutputOption)); } + if (parser.isSet(subsampleFileOutputOption)) { + m->setSubsampleSavePath(parser.value(subsampleFileOutputOption)); + } + m->loadDataset(args[0].toStdString()); - arma::mat X = dataset.cols(0, dataset.n_cols - 2); - arma::vec labels = dataset.col(dataset.n_cols - 1); + arma::mat X = m->X(); + arma::vec labels = m->labels(); - arma::uword n = dataset.n_rows; + arma::uword n = X.n_rows; arma::uword subsampleSize = (arma::uword) n / 10.f; arma::uvec sampleIndices = arma::randi(subsampleSize, arma::distr_param(0, n-1)); + m->setSubsampleIndices(sampleIndices); + arma::mat Ys(subsampleSize, 2, arma::fill::randn); mp::forceScheme(mp::dist(X.rows(sampleIndices)), Ys); @@ -65,7 +105,13 @@ int main(int argc, char **argv) subsamplePlot->setColorScale(&colorScale); Scatterplot *plot = engine.rootObjects()[0]->findChild("plot"); - // connect both plots through interaction handler + // Keep track of the current subsample (in order to save them later, if requested) + QObject::connect(subsamplePlot, SIGNAL(xyChanged(const arma::mat &)), + m, SLOT(setSubsample(const arma::mat &))); + QObject::connect(subsamplePlot, SIGNAL(xyInteractivelyChanged(const arma::mat &)), + m, SLOT(setSubsample(const arma::mat &))); + + // Update LAMP projection as the subsample is modified InteractionHandler interactionHandler(X, sampleIndices); QObject::connect(subsamplePlot, SIGNAL(xyChanged(const arma::mat &)), &interactionHandler, SLOT(setSubsample(const arma::mat &))); @@ -74,20 +120,21 @@ int main(int argc, char **argv) QObject::connect(&interactionHandler, SIGNAL(subsampleChanged(const arma::mat &)), plot, SLOT(setXY(const arma::mat &))); - // linking between selections in subsample plot and full dataset plot + // Linking between selections in subsample plot and full dataset plot SelectionHandler selectionHandler(sampleIndices); QObject::connect(subsamplePlot, SIGNAL(selectionChanged(const QSet &)), &selectionHandler, SLOT(setSelection(const QSet &))); QObject::connect(&selectionHandler, SIGNAL(selectionChanged(const QSet &)), plot, SLOT(setSelection(const QSet &))); + // Connections between history graph and subsample plot HistoryGraph *history = engine.rootObjects()[0]->findChild("history"); - // connections between history graph and subsample plot QObject::connect(subsamplePlot, SIGNAL(xyInteractivelyChanged(const arma::mat &)), history, SLOT(addHistoryItem(const arma::mat &))); QObject::connect(history, SIGNAL(currentItemChanged(const arma::mat &)), subsamplePlot, SLOT(setXY(const arma::mat &))); + // Map distortion as the glyph color DistortionObserver distortionObs(X, sampleIndices); std::unique_ptr distortionMeasure(new NPDistortion()); distortionObs.setMeasure(distortionMeasure.get()); @@ -96,13 +143,13 @@ int main(int argc, char **argv) QObject::connect(&distortionObs, SIGNAL(mapChanged(const arma::vec &)), plot, SLOT(setColorData(const arma::vec &))); - EffectiveInteractionEnforcer enforcer(sampleIndices); - QObject::connect(subsamplePlot, SIGNAL(selectionChanged(const QSet &)), - &enforcer, SLOT(setSelection(const QSet &))); - QObject::connect(plot, SIGNAL(colorDataChanged(const arma::vec &)), - &enforcer, SLOT(setMeasureDifference(const arma::vec &))); - QObject::connect(&enforcer, SIGNAL(effectivenessChanged(const arma::vec &)), - subsamplePlot, SLOT(setColorData(const arma::vec &))); + //EffectiveInteractionEnforcer enforcer(sampleIndices); + //QObject::connect(subsamplePlot, SIGNAL(selectionChanged(const QSet &)), + // &enforcer, SLOT(setSelection(const QSet &))); + //QObject::connect(plot, SIGNAL(colorDataChanged(const arma::vec &)), + // &enforcer, SLOT(setMeasureDifference(const arma::vec &))); + //QObject::connect(&enforcer, SIGNAL(effectivenessChanged(const arma::vec &)), + // subsamplePlot, SLOT(setColorData(const arma::vec &))); /* ContinuousColorScale ccolorScale = ContinuousColorScale::builtin(ContinuousColorScale::RED_GRAY_BLUE); -- cgit v1.2.3