commit eda3420f1acc133bc1562fe7cb8f22f42c1e410d
parent 7c4926b8feb208527f946607f22f6e8bfcb52f82
Author: Fabian Wermelinger <fabianw@mavt.ethz.ch>
Date: Fri, 22 Sep 2017 18:20:46 +0200
added file option 'fscenes' for data input
Diffstat:
5 files changed, 39 insertions(+), 16 deletions(-)
diff --git a/apps/OrganizerMPI.cpp b/apps/OrganizerMPI.cpp
@@ -5,15 +5,18 @@
// Copyright 2016 ETH Zurich. All Rights Reserved.
#include <string>
#include <iostream>
+#include <fstream>
#include <cstdio>
#include <cstdlib>
#include "OrganizerMPI.h"
+#include "ArgumentParser.h"
using namespace std;
-OrganizerMPI::OrganizerMPI(const int argc, char ** const argv, const MPI_Comm comm) : m_nscenes(0), m_scenes(nullptr), m_argc(1), m_comm(comm)
+OrganizerMPI::OrganizerMPI(const int argc, char ** const argv, const MPI_Comm comm) : m_nscenes(0), m_argc(1), m_comm(comm)
{
m_isroot = (rank() == 0) ? true : false;
+ ArgumentParser p(argc, (const char**)argv);
// get scenes
bool bfoundScenes = false;
@@ -22,13 +25,29 @@ OrganizerMPI::OrganizerMPI(const int argc, char ** const argv, const MPI_Comm co
const string key(argv[i]);
if (key == "-scenes")
{
- m_scenes = (argv + (i+1));
+ char ** const scenes = (argv + (i+1));
m_nscenes = argc - (i+1);
bfoundScenes = true;
+ for (int i = 0; i < m_nscenes; ++i)
+ m_scenes.push_back(string(scenes[i]));
break;
}
++m_argc;
}
+ if (p.exist("fscenes"))
+ {
+ ifstream infile(p("fscenes").asString());
+ string line;
+ int count = 0;
+ while (infile >> line)
+ {
+ m_scenes.push_back(line);
+ ++count;
+ }
+ m_nscenes += count;
+ bfoundScenes = true;
+ }
+
if (!bfoundScenes)
{
// Define input scenes (=input files) at the end of the argument list
@@ -43,13 +62,13 @@ OrganizerMPI::OrganizerMPI(const int argc, char ** const argv, const MPI_Comm co
}
}
-vector<char*> OrganizerMPI::split_work() const
+vector<string> OrganizerMPI::split_work() const
{
const int myrank = rank();
const int nranks = size();
const int myshare = m_nscenes/nranks;
const int rem = m_nscenes - nranks * myshare;
- vector<char*> myscenes(0);
+ vector<string> myscenes(0);
if (m_nscenes <= nranks)
{
if (myrank < m_nscenes) myscenes.push_back(m_scenes[myrank]);
diff --git a/apps/OrganizerMPI.h b/apps/OrganizerMPI.h
@@ -7,8 +7,11 @@
#define ORGANIZERMPI_H_8HFBYG90
#include <vector>
+#include <string>
#include <mpi.h>
+#include "ArgumentParser.h"
+
#ifdef _FLOAT_PRECISION_
#define MPIReal MPI_FLOAT
#else
@@ -19,7 +22,7 @@ class OrganizerMPI
{
private:
int m_nscenes;
- char** m_scenes;
+ std::vector<std::string> m_scenes;
int m_argc;
const MPI_Comm m_comm;
bool m_isroot;
@@ -41,7 +44,7 @@ public:
return rank;
}
- std::vector<char*> split_work() const;
+ std::vector<std::string> split_work() const;
inline int argc() const { return m_argc; }
inline bool isroot() const { return m_isroot; }
inline void wait() const { MPI_Barrier(m_comm); }
diff --git a/apps/polaroidCamera/SceneProcessor.cpp b/apps/polaroidCamera/SceneProcessor.cpp
@@ -77,7 +77,7 @@ void SceneProcessor::_load_cam(Polaroid& cam, const char* const fname) const
}
}
-void SceneProcessor::process1212(const vector<char*>& scenes)
+void SceneProcessor::process1212(const vector<string>& scenes)
{
_prepare_cam();
Polaroid mycam(m_cartridge);
@@ -85,9 +85,9 @@ void SceneProcessor::process1212(const vector<char*>& scenes)
const auto start = chrono::high_resolution_clock::now();
for (size_t i=0; i<scenes.size(); ++i)
{
- _load_cam(mycam, scenes[i]);
+ _load_cam(mycam, scenes[i].c_str());
- std::string basename = _outpath(std::string(scenes[i]));
+ std::string basename = _outpath(scenes[i]);
m_photo->set_name(basename);
mycam.capture(*m_photo);
@@ -101,7 +101,7 @@ void SceneProcessor::process1212(const vector<char*>& scenes)
}
}
-void SceneProcessor::process1122(const vector<char*>& scenes)
+void SceneProcessor::process1122(const vector<string>& scenes)
{
_prepare_cam();
vector<Polaroid> mycams(scenes.size());
@@ -111,7 +111,7 @@ void SceneProcessor::process1122(const vector<char*>& scenes)
for (size_t i=0; i<scenes.size(); ++i)
{
Polaroid& cam = mycams[i];
- _load_cam(cam, scenes[i]);
+ _load_cam(cam, scenes[i].c_str());
cam.insertCartridge(m_cartridge);
cam.computeScene();
if (m_mpi.isroot())
@@ -136,7 +136,7 @@ void SceneProcessor::process1122(const vector<char*>& scenes)
{
Polaroid& cam = mycams[i];
- std::string basename = _outpath(std::string(scenes[i]));
+ std::string basename = _outpath(scenes[i]);
m_photo->set_name(basename);
cam.capture(*m_photo);
diff --git a/apps/polaroidCamera/SceneProcessor.h b/apps/polaroidCamera/SceneProcessor.h
@@ -78,8 +78,8 @@ public:
SceneProcessor(ArgumentParser& parser, OrganizerMPI& mpi) : m_parser(parser), m_mpi(mpi), m_cartridge(nullptr), m_photo(nullptr) {}
~SceneProcessor() { _dispose(); }
- void process1212(const std::vector<char*>& scenes);
- void process1122(const std::vector<char*>& scenes);
+ void process1212(const std::vector<std::string>& scenes);
+ void process1122(const std::vector<std::string>& scenes);
};
#endif /* SCENEPROCESSOR_H_UWGYBVIW */
diff --git a/apps/polaroidCamera/polaroidCameraMPI.cpp b/apps/polaroidCamera/polaroidCameraMPI.cpp
@@ -6,6 +6,7 @@
#include <iostream>
#include <cstdio>
#include <vector>
+#include <string>
#include "ArgumentParser.h"
#include "OrganizerMPI.h"
@@ -32,9 +33,9 @@ int main(int argc, char* argv[])
}
worker.wait();
- vector<char*> myscenes = worker.split_work();
+ vector<string> myscenes = worker.split_work();
if (myscenes.size() > 0)
- printf("[Worker %d/%d: Load = %d scene(s), start @ %s]\n", worker.rank(), worker.size(), myscenes.size(), myscenes.front());
+ printf("[Worker %d/%d: Load = %d scene(s), start @ %s]\n", worker.rank(), worker.size(), myscenes.size(), myscenes.front().c_str());
else
printf("[Worker %d/%d: Load = %d scene(s), start @ %s]\n", worker.rank(), worker.size(), myscenes.size(), "none");