Verified Commit 297365e3 authored by Mohcine Chraibi's avatar Mohcine Chraibi

Merge branch 'trajectories' into develop

parents e8bd8ffe 17630d03
...@@ -60,7 +60,9 @@ void GeoFileParser::LoadBuilding(Building* building) ...@@ -60,7 +60,9 @@ void GeoFileParser::LoadBuilding(Building* building)
bool GeoFileParser::LoadGeometry(Building* building) bool GeoFileParser::LoadGeometry(Building* building)
{ {
std::string geoFilenameWithPath = _configuration->GetProjectRootDir()+_configuration->GetGeometryFile(); fs::path rootDir(_configuration->GetProjectRootDir());
std::string geoFilenameWithPath = (rootDir/fs::path(_configuration->GetGeometryFile())).string();
std::cout << "\nLoadGeometry: file: " << geoFilenameWithPath << "\n"; std::cout << "\nLoadGeometry: file: " << geoFilenameWithPath << "\n";
TiXmlDocument docGeo(geoFilenameWithPath); TiXmlDocument docGeo(geoFilenameWithPath);
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#define _USE_MATH_DEFINES #define _USE_MATH_DEFINES
using namespace std; using namespace std;
namespace fs = std::filesystem;
IODispatcher::IODispatcher() IODispatcher::IODispatcher()
...@@ -466,6 +467,8 @@ void TrajectoriesFLAT::WriteHeader(long nPeds, double fps, Building* building, i ...@@ -466,6 +467,8 @@ void TrajectoriesFLAT::WriteHeader(long nPeds, double fps, Building* building, i
std::string eventFileName = getEventFileName(building->GetProjectFilename()); std::string eventFileName = getEventFileName(building->GetProjectFilename());
std::string trainTimeTableFileName = getTrainTimeTableFileName(building->GetProjectFilename()); std::string trainTimeTableFileName = getTrainTimeTableFileName(building->GetProjectFilename());
std::string trainTypeFileName = getTrainTypeFileName(building->GetProjectFilename()); std::string trainTypeFileName = getTrainTypeFileName(building->GetProjectFilename());
fs::path projRoot(building->GetProjectRootDir());
(void) seed; (void) nPeds; (void) seed; (void) nPeds;
char tmp[100] = ""; char tmp[100] = "";
sprintf(tmp, "#description: jpscore (%s)", JPSCORE_VERSION); sprintf(tmp, "#description: jpscore (%s)", JPSCORE_VERSION);
...@@ -474,31 +477,37 @@ void TrajectoriesFLAT::WriteHeader(long nPeds, double fps, Building* building, i ...@@ -474,31 +477,37 @@ void TrajectoriesFLAT::WriteHeader(long nPeds, double fps, Building* building, i
Write(tmp); Write(tmp);
sprintf(tmp, "#framerate: %0.2f",fps); sprintf(tmp, "#framerate: %0.2f",fps);
Write(tmp); Write(tmp);
sprintf(tmp,"#geometry: %s",building->GetGeometryFilename().c_str()); std::string tmpGeo= (projRoot/fs::path(building->GetGeometryFilename())).string();
sprintf(tmp,"#geometry: %s", tmpGeo.c_str());
Write(tmp); Write(tmp);
if(sourceFileName != "") if(sourceFileName != "")
{ {
sprintf(tmp,"#sources: %s", sourceFileName.c_str()); std::string tmpSource= (projRoot/fs::path(sourceFileName)).string();
sprintf(tmp,"#sources: %s", tmpSource.c_str());
Write(tmp); Write(tmp);
} }
if(goalFileName != "") if(goalFileName != "")
{ {
sprintf(tmp,"#goals: %s", goalFileName.c_str()); std::string tmpGoal= (projRoot/fs::path(goalFileName)).string();
sprintf(tmp,"#goals: %s", tmpGoal.c_str());
Write(tmp); Write(tmp);
} }
if( eventFileName != "") if( eventFileName != "")
{ {
sprintf(tmp,"#events: %s", eventFileName.c_str()); std::string tmpEvent= (projRoot/fs::path(eventFileName)).string();
sprintf(tmp,"#events: %s", tmpEvent.c_str());
Write(tmp); Write(tmp);
} }
if( trainTimeTableFileName != "") if( trainTimeTableFileName != "")
{ {
sprintf(tmp,"#trainTimeTable: %s", trainTimeTableFileName.c_str()); std::string tmpTTT= (projRoot/fs::path(trainTimeTableFileName)).string();
sprintf(tmp,"#trainTimeTable: %s", tmpTTT.c_str());
Write(tmp); Write(tmp);
} }
if( trainTypeFileName != "") if( trainTypeFileName != "")
{ {
sprintf(tmp,"#trainType: %s", trainTypeFileName.c_str()); std::string tmpTT= (projRoot/fs::path(trainTypeFileName)).string();
sprintf(tmp,"#trainType: %s", tmpTT.c_str());
Write(tmp); Write(tmp);
} }
Write("#ID: the agent ID"); Write("#ID: the agent ID");
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
#include <cstring> #include <cstring>
#include <vector> #include <vector>
#include <filesystem>
extern OutputHandler* Log; extern OutputHandler* Log;
class Trajectories; class Trajectories;
......
...@@ -47,6 +47,9 @@ ...@@ -47,6 +47,9 @@
#include "../routing/ff_router_trips/ffRouterTrips.h" #include "../routing/ff_router_trips/ffRouterTrips.h"
#include "../routing/trips_router/TripsRouter.h" #include "../routing/trips_router/TripsRouter.h"
namespace fs = std::filesystem;
/* https://stackoverflow.com/questions/38530981/output-compiler-version-in-a-c-program#38531037 */ /* https://stackoverflow.com/questions/38530981/output-compiler-version-in-a-c-program#38531037 */
std::string ver_string(int a, int b, int c) { std::string ver_string(int a, int b, int c) {
std::ostringstream ss; std::ostringstream ss;
...@@ -95,15 +98,9 @@ bool IniFileParser::Parse(std::string iniFile) ...@@ -95,15 +98,9 @@ bool IniFileParser::Parse(std::string iniFile)
// and as I just realized, I called it configuration. We should be consistent here anything else // and as I just realized, I called it configuration. We should be consistent here anything else
// is confusing [gl march '16] // is confusing [gl march '16]
fs::path root(iniFile);
fs::path q(iniFile);
//extract and set the project root dir _config->SetProjectRootDir(fs::absolute(q.parent_path()).string());
size_t found = iniFile.find_last_of("/\\");
if (found!=std::string::npos) {
_config->SetProjectRootDir(iniFile.substr(0, found)+"/");
} else {
_config->SetProjectRootDir("./");
}
TiXmlDocument doc(iniFile); TiXmlDocument doc(iniFile);
if (!doc.LoadFile()) { if (!doc.LoadFile()) {
...@@ -268,8 +265,19 @@ bool IniFileParser::Parse(std::string iniFile) ...@@ -268,8 +265,19 @@ bool IniFileParser::Parse(std::string iniFile)
std::string tmp; std::string tmp;
tmp = xTrajectories->FirstChildElement("file")->Attribute( tmp = xTrajectories->FirstChildElement("file")->Attribute(
"location"); "location");
if (tmp.c_str()) fs::path p(tmp);
_config->SetTrajectoriesFile(_config->GetProjectRootDir()+tmp); fs::path curr_abs_path = fs::current_path();
fs::path rel_path = fs::path(_config->GetProjectRootDir()) / fs::path(tmp);
fs::path combined = (curr_abs_path /= rel_path);
std::string traj = combined.string();
if (traj.c_str())
{
_config->SetTrajectoriesFile(traj);
_config->SetOriginalTrajectoriesFile(traj);
}
Log->Write("INFO: \toutput file <%s>", _config->GetTrajectoriesFile().c_str()); Log->Write("INFO: \toutput file <%s>", _config->GetTrajectoriesFile().c_str());
Log->Write("INFO: \tin format <%s> at <%.0f> frames per seconds",format.c_str(), _config->GetFps()); Log->Write("INFO: \tin format <%s> at <%.0f> frames per seconds",format.c_str(), _config->GetFps());
} }
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
#define JPSCORE_INIFILEPARSER_H #define JPSCORE_INIFILEPARSER_H
#include <string> #include <string>
#include <filesystem>
#include "../general/Configuration.h" #include "../general/Configuration.h"
#include "../routing/DirectionStrategy.h" #include "../routing/DirectionStrategy.h"
......
...@@ -152,18 +152,31 @@ bool Simulation::InitArgs() ...@@ -152,18 +152,31 @@ bool Simulation::InitArgs()
} }
if (!_config->GetTrajectoriesFile().empty()) { if (!_config->GetTrajectoriesFile().empty()) {
fs::path p(_config->GetTrajectoriesFile());
fs::path curr_abs_path = fs::current_path();
fs::path rel_path = _config->GetTrajectoriesFile();
fs::path combined = (curr_abs_path /= rel_path);
std::string traj = combined.string();
_config->SetTrajectoriesFile(combined);
if(!fs::exists(traj))
fs::create_directories(combined.parent_path());
switch (_config->GetFileFormat()) { switch (_config->GetFileFormat()) {
case FORMAT_XML_PLAIN: { case FORMAT_XML_PLAIN: {
OutputHandler* tofile = new FileHandler( OutputHandler* tofile = new FileHandler(
_config->GetTrajectoriesFile().c_str()); traj.c_str());
Trajectories* output = new TrajectoriesJPSV05(); Trajectories* output = new TrajectoriesJPSV05();
output->SetOutputHandler(tofile); output->SetOutputHandler(tofile);
_iod->AddIO(output); _iod->AddIO(output);
break; break;
} }
case FORMAT_PLAIN: { case FORMAT_PLAIN: {
OutputHandler* file = new FileHandler( OutputHandler* file = new FileHandler(
_config->GetTrajectoriesFile().c_str()); traj.c_str());
outputTXT = new TrajectoriesFLAT(); outputTXT = new TrajectoriesFLAT();
outputTXT->SetOutputHandler(file); outputTXT->SetOutputHandler(file);
_iod->AddIO(outputTXT); _iod->AddIO(outputTXT);
...@@ -172,7 +185,7 @@ bool Simulation::InitArgs() ...@@ -172,7 +185,7 @@ bool Simulation::InitArgs()
case FORMAT_VTK: { case FORMAT_VTK: {
Log->Write("INFO: \tFormat vtk not yet supported\n"); Log->Write("INFO: \tFormat vtk not yet supported\n");
OutputHandler* file = new FileHandler( OutputHandler* file = new FileHandler(
(_config->GetTrajectoriesFile()+".vtk").c_str()); (traj+".vtk").c_str());
Trajectories* output = new TrajectoriesVTK(); Trajectories* output = new TrajectoriesVTK();
output->SetOutputHandler(file); output->SetOutputHandler(file);
_iod->AddIO(output); _iod->AddIO(output);
...@@ -453,12 +466,14 @@ void Simulation::PrintStatistics(double simTime) ...@@ -453,12 +466,14 @@ void Simulation::PrintStatistics(double simTime)
goal->GetID(), goal->GetDoorUsage(), goal->GetID(), goal->GetDoorUsage(),
goal->GetLastPassingTime()); goal->GetLastPassingTime());
string statsfile = "flow_exit_id_"+to_string(goal->GetID())+".txt"; fs::path p(_config->GetOriginalTrajectoriesFile());
string statsfile = "flow_exit_id_"+to_string(goal->GetID())+"_"+p.stem().string()+".txt";
if(goal->GetOutflowRate() < (std::numeric_limits<double>::max)()) if(goal->GetOutflowRate() < (std::numeric_limits<double>::max)())
{ {
char tmp[50]; char tmp[50];
sprintf(tmp, "%.2f", goal->GetOutflowRate()); sprintf(tmp, "%.2f_", goal->GetOutflowRate());
statsfile = "flow_exit_id_"+to_string(goal->GetID())+"_rate_"+tmp+".txt"; statsfile = "flow_exit_id_"+to_string(goal->GetID())+"_rate_"+tmp+p.stem().string()+".txt";
} }
Log->Write("More Information in the file: %s", statsfile.c_str()); Log->Write("More Information in the file: %s", statsfile.c_str());
{ {
...@@ -708,6 +723,7 @@ bool Simulation::WriteTrajectories(std::string trajectoryName) ...@@ -708,6 +723,7 @@ bool Simulation::WriteTrajectories(std::string trajectoryName)
if(_config-> GetFileFormat() == FORMAT_PLAIN) if(_config-> GetFileFormat() == FORMAT_PLAIN)
{ {
fs::path p = _config->GetTrajectoriesFile(); fs::path p = _config->GetTrajectoriesFile();
fs::path parent = p.parent_path();
int sf = fs::file_size(p); int sf = fs::file_size(p);
if(sf>_maxFileSize*1024*1024) if(sf>_maxFileSize*1024*1024)
{ {
...@@ -715,7 +731,8 @@ bool Simulation::WriteTrajectories(std::string trajectoryName) ...@@ -715,7 +731,8 @@ bool Simulation::WriteTrajectories(std::string trajectoryName)
this->incrementCountTraj(); this->incrementCountTraj();
char tmp_traj_name[100]; char tmp_traj_name[100];
sprintf(tmp_traj_name,"%s_%.4d_%s", trajectoryName.c_str(), _countTraj, extention.c_str()); sprintf(tmp_traj_name,"%s_%.4d_%s", trajectoryName.c_str(), _countTraj, extention.c_str());
_config->SetTrajectoriesFile(tmp_traj_name); fs::path abs_traj_name = parent/ fs::path(tmp_traj_name);
_config->SetTrajectoriesFile(abs_traj_name.string());
Log->Write("INFO:\tNew trajectory file <%s>", tmp_traj_name); Log->Write("INFO:\tNew trajectory file <%s>", tmp_traj_name);
OutputHandler* file = new FileHandler(_config->GetTrajectoriesFile().c_str()); OutputHandler* file = new FileHandler(_config->GetTrajectoriesFile().c_str());
outputTXT->SetOutputHandler(file); outputTXT->SetOutputHandler(file);
...@@ -770,7 +787,6 @@ bool Simulation::correctGeometry(std::shared_ptr<Building> building, std::shared ...@@ -770,7 +787,6 @@ bool Simulation::correctGeometry(std::shared_ptr<Building> building, std::shared
std::cout<< KBLU << "Enter correctGeometry: Building Has " << building->GetAllTransitions().size() << " Transitions\n" << RESET; std::cout<< KBLU << "Enter correctGeometry: Building Has " << building->GetAllTransitions().size() << " Transitions\n" << RESET;
std::cout << "room: " << room_id << " subroom_id " << subroom_id << "\n" ; std::cout << "room: " << room_id << " subroom_id " << subroom_id << "\n" ;
if(mytrack.empty() || subroom == nullptr) if(mytrack.empty() || subroom == nullptr)
return false; return false;
...@@ -985,7 +1001,6 @@ bool Simulation::correctGeometry(std::shared_ptr<Building> building, std::shared ...@@ -985,7 +1001,6 @@ bool Simulation::correctGeometry(std::shared_ptr<Building> building, std::shared
} }
_routingEngine->setNeedUpdate(true); _routingEngine->setNeedUpdate(true);
return true; return true;
} }
void Simulation::RunFooter() void Simulation::RunFooter()
{ {
......
...@@ -15,7 +15,7 @@ def runtest(inifile, trajfile): ...@@ -15,7 +15,7 @@ def runtest(inifile, trajfile):
failure = 0 failure = 0
ids, outflow = get_outflow(inifile) ids, outflow = get_outflow(inifile)
for (i, o) in zip(ids, outflow): for (i, o) in zip(ids, outflow):
filename = "flow_exit_id_%d_rate_%.2f.txt"%(i, o) filename = "flow_exit_id_%d_rate_%.2f_%s.txt"%(i, o, os.path.basename(trajfile).split(".")[0])
if not os.path.exists(filename): if not os.path.exists(filename):
logging.info("ERROR: can not find statistics file %s"%filename) logging.info("ERROR: can not find statistics file %s"%filename)
exit(FAILURE) exit(FAILURE)
...@@ -31,7 +31,7 @@ def runtest(inifile, trajfile): ...@@ -31,7 +31,7 @@ def runtest(inifile, trajfile):
if abs(J-o) > tolerance: if abs(J-o) > tolerance:
failure = 1 failure = 1
logging.info("Plot to flow.png")
plt.savefig("flow.png") plt.savefig("flow.png")
if failure: if failure:
logging.info("flow from statistics files does not much expected flow from inifile") logging.info("flow from statistics files does not much expected flow from inifile")
......
...@@ -99,6 +99,7 @@ public: ...@@ -99,6 +99,7 @@ public:
_hostname = "localhost"; _hostname = "localhost";
_trajectoriesFile = "trajectories.xml"; _trajectoriesFile = "trajectories.xml";
_originalTrajectoriesFile = "trajectories.xml";
_errorLogFile = "log.txt"; _errorLogFile = "log.txt";
_projectFile = ""; _projectFile = "";
_geometryFile = ""; _geometryFile = "";
...@@ -125,7 +126,7 @@ public: ...@@ -125,7 +126,7 @@ public:
// _dirSubLocal = nullptr; // _dirSubLocal = nullptr;
// _dirLocal = nullptr; // _dirLocal = nullptr;
_dirStrategy = nullptr; _dirStrategy = nullptr;
//for random numbers //for random numbers
_rdGenerator=RandomNumberGenerator(); _rdGenerator=RandomNumberGenerator();
...@@ -315,6 +316,10 @@ public: ...@@ -315,6 +316,10 @@ public:
void SetTrajectoriesFile(std::string trajectoriesFile) { _trajectoriesFile = trajectoriesFile; }; void SetTrajectoriesFile(std::string trajectoriesFile) { _trajectoriesFile = trajectoriesFile; };
const std::string& GetOriginalTrajectoriesFile() const { return _originalTrajectoriesFile; };
void SetOriginalTrajectoriesFile(std::string trajectoriesFile) { _originalTrajectoriesFile = trajectoriesFile; };
const std::string& GetErrorLogFile() const { return _errorLogFile; }; const std::string& GetErrorLogFile() const { return _errorLogFile; };
void SetErrorLogFile(std::string errorLogFile) { _errorLogFile = errorLogFile; }; void SetErrorLogFile(std::string errorLogFile) { _errorLogFile = errorLogFile; };
...@@ -431,6 +436,7 @@ private: ...@@ -431,6 +436,7 @@ private:
std::string _hostname; std::string _hostname;
std::string _trajectoriesFile; std::string _trajectoriesFile;
std::string _originalTrajectoriesFile;
std::string _errorLogFile; std::string _errorLogFile;
std::string _projectFile; std::string _projectFile;
std::string _geometryFile; std::string _geometryFile;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment