| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -42,11 +42,9 @@ std::map< std::pair<std::string, std::string>, std::shared_ptr<bpo::options_desc | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 *	@param argv should be argv passed to main function | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 *	@param filename	either nullptr or name of config file | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					Settings::Settings(const int argc, const char* argv[], const char* filename) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					Settings::Settings(const int argc, const char* argv[], const char* filename) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Settings::binaryName = std::string(argv[0]); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						try | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						try { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// Initially fill description objects
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							this->initDescriptions(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -57,17 +55,15 @@ Settings::Settings(const int argc, const char* argv[], const char* filename) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// Check module triggers, add corresponding options
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							std::map< std::string, std::list< std::string > > options; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							for (auto it : Settings::modules) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							for (auto it : Settings::modules) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								options[it.first.first].push_back(it.first.second); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							for (auto it : options) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							for (auto it : options) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								std::stringstream str; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								str << "select " << it.first << " module (" << boost::algorithm::join(it.second, ", ") << ")"; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								Settings::desc->add_options() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									(it.first.c_str(), bpo::value<std::string>(), str.str().c_str()) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									(it.first.c_str(), bpo::value<std::string>()->default_value(it.second.front()), str.str().c_str()) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							 | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -77,13 +73,10 @@ Settings::Settings(const int argc, const char* argv[], const char* filename) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// Buffer for items to be deleted
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							std::list< std::pair< std::string, std::string > > deleteQueue; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// Check module triggers
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							for (auto it : Settings::modules) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							for (auto it : Settings::modules) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								std::pair< std::string, std::string > trigger = it.first; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if (this->vm.count(trigger.first)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									if (this->vm[trigger.first].as<std::string>().compare(trigger.second) == 0) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								if (this->vm.count(trigger.first)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									if (this->vm[trigger.first].as<std::string>().compare(trigger.second) == 0) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										Settings::desc->add(*it.second); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										deleteQueue.push_back(trigger); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									} | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -93,8 +86,7 @@ Settings::Settings(const int argc, const char* argv[], const char* filename) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							// Stop if help is set
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if (this->vm.count("help") > 0) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if (this->vm.count("help") > 0) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								return; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							 | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -105,25 +97,20 @@ Settings::Settings(const int argc, const char* argv[], const char* filename) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bpo::notify(this->vm); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							LOG4CPLUS_DEBUG(logger, "Finished loading config."); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						catch (bpo::reading_file e) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						catch (bpo::reading_file e) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							std::cerr << "Could not read config file " << filename << std::endl; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							LOG4CPLUS_ERROR(logger, "Could not read config file"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						catch (bpo::required_option e) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						catch (bpo::required_option e) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							throw mrmc::exceptions::InvalidSettings() << "Required option missing"; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						catch (bpo::validation_error e) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						catch (bpo::validation_error e) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							throw mrmc::exceptions::InvalidSettings() << "Validation failed: " << e.what(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						catch (bpo::invalid_command_line_syntax e) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						catch (bpo::invalid_command_line_syntax e) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							throw mrmc::exceptions::InvalidSettings() << e.what(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						catch (bpo::error e) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						catch (bpo::error e) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							throw mrmc::exceptions::InvalidSettings() << e.what(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -132,8 +119,7 @@ Settings::Settings(const int argc, const char* argv[], const char* filename) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 *	Initially fill options_description objects. | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 *	First puts some generic options, then calls all register Callbacks. | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void Settings::initDescriptions() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void Settings::initDescriptions() { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						LOG4CPLUS_DEBUG(logger, "Initializing descriptions."); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Settings::desc = std::unique_ptr<bpo::options_description>(new bpo::options_description("Generic Options")); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						Settings::desc->add_options() | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -143,7 +129,6 @@ void Settings::initDescriptions() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							("test-prctl", bpo::value<std::string>(), "name of prctl file") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							("trafile", bpo::value<std::string>()->required(), "name of the .tra file") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							("labfile", bpo::value<std::string>()->required(), "name of the .lab file") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							("matrixlib", bpo::value<std::string>()->default_value("gmm++"), "name of the matrix library") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -152,8 +137,7 @@ void Settings::initDescriptions() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 *	given), but allow for unregistered options, do not check requirements | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 *	from options_description objects, do not check positional arguments. | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void Settings::firstRun(const int argc, const char* argv[], const char* filename) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void Settings::firstRun(const int argc, const char* argv[], const char* filename) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						LOG4CPLUS_DEBUG(logger, "Performing first run."); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						// parse command line
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						bpo::store(bpo::command_line_parser(argc, argv).options(*(Settings::desc)).allow_unregistered().run(), this->vm); | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -161,12 +145,9 @@ void Settings::firstRun(const int argc, const char* argv[], const char* filename | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/*
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						 *	load config file if specified | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						 */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if (this->vm.count("configfile")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if (this->vm.count("configfile")) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bpo::store(bpo::parse_config_file<char>(this->vm["configfile"].as<std::string>().c_str(), *(Settings::desc)), this->vm, true); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						else if (filename != NULL) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} else if (filename != NULL) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bpo::store(bpo::parse_config_file<char>(filename, *(Settings::desc)), this->vm, true); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -176,20 +157,16 @@ void Settings::firstRun(const int argc, const char* argv[], const char* filename | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 *	given) and check for unregistered options, requirements from | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 *	options_description objects and positional arguments. | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void Settings::secondRun(const int argc, const char* argv[], const char* filename) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void Settings::secondRun(const int argc, const char* argv[], const char* filename) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						LOG4CPLUS_DEBUG(logger, "Performing second run."); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						// Parse command line
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						bpo::store(bpo::command_line_parser(argc, argv).options(*(Settings::desc)).positional(this->positional).run(), this->vm); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/*
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						 *	load config file if specified | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						 */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if (this->vm.count("configfile")) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if (this->vm.count("configfile")) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bpo::store(bpo::parse_config_file<char>(this->vm["configfile"].as<std::string>().c_str(), *(Settings::desc)), this->vm, true); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						else if (filename != NULL) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} else if (filename != NULL) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							bpo::store(bpo::parse_config_file<char>(filename, *(Settings::desc)), this->vm, true); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -202,12 +179,10 @@ void Settings::secondRun(const int argc, const char* argv[], const char* filenam | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 *	Use it like this: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 *	@code std::cout << mrmc::settings::help; @endcode | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					 */ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					std::ostream& help(std::ostream& os) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					std::ostream& help(std::ostream& os) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						os << "Usage: " << mrmc::settings::Settings::binaryName << " [options] <transition file> <label file>" << std::endl; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						os << *(mrmc::settings::Settings::desc) << std::endl; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for (auto it : Settings::modules) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for (auto it : Settings::modules) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							os << *(it.second) << std::endl; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						return os; | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |