int main(int argc,char** argv) { //================================================================================================================================== // Scenario initialization //---------------------------------------------------------------------------------------------------------------------------------- #pragma region Scenario Initialization char* scenario_filename = "scenario_tester.json"; char* database_filename = "a"; if (argc >= 2) database_filename = argv[1]; else THROW_EXCEPTION("ERROR: specify a database filename as the first command line argument."); int checks = 3; if (argc >= 3) checks = std::max(atoi(argv[2]),checks); int threads = 1; if (argc >= 4) threads = std::max(atoi(argv[3]),threads); Simulation_Configuration cfg; cfg.Multi_Threaded_Setup(100, threads); INITIALIZE_SIMULATION(cfg); #pragma endregion write_scenario_file(database_filename, scenario_filename); //================================================================================================================================== // NETWORK MODEL STUFF //---------------------------------------------------------------------------------------------------------------------------------- #pragma region New network_model.cpp stuff Network_Components::Types::Network_IO_Maps network_io_maps; typedef Network_Components::Types::Network_Initialization_Type<Network_Components::Types::ODB_Network,Network_Components::Types::Network_IO_Maps&> Net_IO_Type; string output_dir_name = ""; GLOBALS::Normal_RNG.Initialize(); GLOBALS::Uniform_RNG.Initialize(); cout << "allocating data structures..." <<endl; typedef Scenario<typename MasterType::scenario_type> _Scenario_Interface; _Scenario_Interface* scenario=(_Scenario_Interface*)Allocate<typename MasterType::scenario_type>(); _global_scenario = scenario; typedef Network<typename MasterType::network_type> _Network_Interface; _Network_Interface* network=(_Network_Interface*)Allocate<typename MasterType::network_type>(); _global_network = network; network->scenario_reference<_Scenario_Interface*>(scenario); cout << "reading scenario data..." <<endl; scenario->read_scenario_data<Scenario_Components::Types::ODB_Scenario>(scenario_filename); typedef MasterType::network_type::link_dbid_dir_to_ptr_map_type link_dbid_dir_to_ptr_map_type; link_dbid_dir_to_ptr_map_type* link_dbid_dir_to_ptr_map = network->template link_dbid_dir_to_ptr_map<link_dbid_dir_to_ptr_map_type*>(); cout << "reading network data..." <<endl; network->read_network_data<Net_IO_Type>(network_io_maps); typedef Operation<MasterType::operation_type> _Operation_Interface; _Operation_Interface* operation = (_Operation_Interface*)Allocate<typename MasterType::operation_type>(); operation->network_reference<_Network_Interface*>(network); if (scenario->intersection_control_flag<int>() == 1) { cout <<"reading intersection control data..." << endl; operation->read_intersection_control_data<Net_IO_Type>(network_io_maps); } //cout << "initializing simulation..." <<endl; network->simulation_initialize<NULLTYPE>(); //define_component_interface(_Demand_Interface, MasterType::demand_type, Demand_Prototype, NULLTYPE); //typedef Demand<MasterType::demand_type> _Demand_Interface; //_Demand_Interface* demand = (_Demand_Interface*)Allocate<typename MasterType::demand_type>(); //demand->scenario_reference<_Scenario_Interface*>(scenario); //demand->network_reference<_Network_Interface*>(network); //cout << "reading demand data..." <<endl; //demand->read_demand_data<Net_IO_Type>(network_io_maps); //define_component_interface(_Operation_Interface, MasterType::operation_type, Operation_Components::Prototypes::Operation_Prototype, NULLTYPE); if (scenario->ramp_metering_flag<bool>() == true) { cout <<"reading ramp metering data..." << endl; operation->read_ramp_metering_data<Net_IO_Type>(network_io_maps); } #ifdef ANTARES network->set_network_bounds<NULLTYPE>(); Rectangle_XY<MasterType>* local_bounds=network->network_bounds<Rectangle_XY<MasterType>*>(); START_UI(MasterType,local_bounds->_xmin,local_bounds->_ymin,local_bounds->_xmax,local_bounds->_ymax); MasterType::vehicle_type::Initialize_Layer(); network->initialize_antares_layers<NULLTYPE>(); MasterType::link_type::configure_link_moes_layer(); #endif if(scenario->use_network_events<bool>()) { //define_component_interface(_Network_Event_Manager_Interface, typename MasterType::network_event_manager_type, Network_Event_Manager, NULLTYPE); typedef Network_Event_Manager<MasterType::network_event_manager_type> _Network_Event_Manager_Interface; _Network_Event_Manager_Interface* net_event_manager=(_Network_Event_Manager_Interface*)Allocate<typename MasterType::network_event_manager_type>(); network->network_event_manager<_Network_Event_Manager_Interface*>(net_event_manager); net_event_manager->Initialize<NT>(); if (scenario->use_tmc<bool>()) { typedef Traffic_Management_Center<MasterType::traffic_management_center_type> TMC_Interface; TMC_Interface* tmc = (TMC_Interface*) Allocate< MasterType::traffic_management_center_type >(); tmc->network_event_manager<_Network_Event_Manager_Interface*>(net_event_manager); tmc->Initialize<NT>(); } } ////initialize network agents cout << "initializing link agents..." <<endl; //define_container_and_value_interface(_Links_Container_Interface, _Link_Interface, _Network_Interface::get_type_of(links_container), Random_Access_Sequence_Prototype, Link_Prototype, NULLTYPE); typedef Link<remove_pointer<_Network_Interface::get_type_of(links_container)::value_type>::type> _Link_Interface; typedef Random_Access_Sequence<_Network_Interface::get_type_of(links_container),_Link_Interface*> _Links_Container_Interface; _Links_Container_Interface::iterator links_itr; for(links_itr=network->links_container<_Links_Container_Interface&>().begin(); links_itr!=network->links_container<_Links_Container_Interface&>().end(); links_itr++) { ((_Link_Interface*)(*links_itr))->Initialize<NULLTYPE>(); } cout << "initializing intersection agents..." <<endl; //define_container_and_value_interface(_Intersections_Container_Interface, _Intersection_Interface, _Network_Interface::get_type_of(intersections_container), Random_Access_Sequence_Prototype, Intersection_Prototype, NULLTYPE); // typedef Intersection<remove_pointer<_Network_Interface::get_type_of(intersections_container)::value_type>::type> _Intersection_Interface; typedef Random_Access_Sequence<_Network_Interface::get_type_of(intersections_container),_Intersection_Interface*> _Intersections_Container_Interface; _Intersections_Container_Interface::iterator intersections_itr; for(intersections_itr=network->intersections_container<typename MasterType::network_type::intersections_container_type&>().begin(); intersections_itr!=network->intersections_container<typename MasterType::network_type::intersections_container_type&>().end(); intersections_itr++) { ((_Intersection_Interface*)(*intersections_itr))->Initialize<NULLTYPE>(); } cout << "initializing ramp metering agents..." <<endl; //define_container_and_value_interface(_Ramp_Metering_Container_Interface, _Ramp_Metering_Interface, _Network_Interface::get_type_of(ramp_metering_container), Random_Access_Sequence_Prototype, Ramp_Metering_Prototype, NULLTYPE); typedef Ramp_Metering<remove_pointer<_Network_Interface::get_type_of(ramp_metering_container)::value_type>::type> _Ramp_Metering_Interface; typedef Random_Access_Sequence<_Network_Interface::get_type_of(ramp_metering_container),_Ramp_Metering_Interface*> _Ramp_Metering_Container_Interface; _Ramp_Metering_Container_Interface::iterator ramp_metering_itr; for(ramp_metering_itr=network->ramp_metering_container<_Ramp_Metering_Container_Interface&>().begin(); ramp_metering_itr!=network->ramp_metering_container<_Ramp_Metering_Container_Interface&>().end(); ramp_metering_itr++) { ((_Ramp_Metering_Interface*)(*ramp_metering_itr))->Initialize<NULLTYPE>(); } if (scenario->use_network_events<bool>()) { MasterType::link_type::subscribe_events<NT>(); } #pragma endregion //================================================================================================================================== // Initialize global randon number generators - if seed set to zero or left blank use system time //---------------------------------------------------------------------------------------------------------------------------------- #pragma region RNG initialization int seed = scenario->iseed<int>(); if (seed != 0) { GLOBALS::Normal_RNG.Set_Seed<int>(seed); GLOBALS::Uniform_RNG.Set_Seed<int>(seed); } else { GLOBALS::Normal_RNG.Set_Seed<int>(); GLOBALS::Uniform_RNG.Set_Seed<int>(); } #pragma endregion //================================================================================================================================== // Network Skimming stuff //---------------------------------------------------------------------------------------------------------------------------------- cout << "Initializing network validation..." <<endl; typedef Network_Components::Prototypes::Network_Validator<MasterType::network_validation_type> _network_validation_itf; typedef Random_Access_Sequence<typename _Network_Interface::get_type_of(activity_locations_container)> locations_itf; typedef Activity_Location_Components::Prototypes::Activity_Location<typename get_component_type(locations_itf)> location_itf; locations_itf* locations = network->activity_locations_container<locations_itf*>(); _network_validation_itf* validator = (_network_validation_itf*)Allocate<MasterType::network_validation_type>(); validator->network_reference<_Network_Interface*>(network); validator->Initialize<location_itf*>(checks); //================================================================================================================================== // Start Simulation //---------------------------------------------------------------------------------------------------------------------------------- cout <<"Starting simulation..."<<endl; try {START();} catch (std::exception ex){ cout << ex.what();} cout << "Finished! Press 'Any' key" << endl; }
//============================================================================================== // Main Batch_Router function // This routine expects 2 (or optionally 3) call line arguments: // argv[1] = database_filename: the filepath to the supply database containing the network information // argv[2] = historical_results_database_name: the filepath to the database containing the historical network MOE data // argv[3] = trips_filename: filepath to a delimited data file containing the list of trips to be routed in the following format: // argv[4] = num_threads: defaults to 1 if not present, more than 1 runs multithreaded mode // 1 2 3 4 5 // Trip_ID Mode ('Auto', 'Transit') Origin Location (location id code from supply database) Destination Location (same as origin) Departure time int main(int argc,char** argv) { //================================================================================================================================== // Scenario initialization //---------------------------------------------------------------------------------------------------------------------------------- #pragma region Scenario Initialization char* scenario_filename = "scenario_router.json"; char* database_filename = ""; char* results_database_filename = ""; if (argc < 3) THROW_EXCEPTION("ERROR: specify a database filename as the first command line argument, results database as the second argument."); database_filename = argv[1]; results_database_filename = argv[2]; File_IO::File_Info db(database_filename); File_IO::File_Info results_db(results_database_filename); File_IO::File_Info scenario_file(scenario_filename); int threads = 1; if (argc >= 5) threads = std::max(atoi(argv[4]),threads); Simulation_Configuration cfg; cfg.Multi_Threaded_Setup(100, threads); INITIALIZE_SIMULATION(cfg); write_scenario_file(scenario_file, db, results_db); #pragma endregion //================================================================================================================================== // NETWORK MODEL STUFF //---------------------------------------------------------------------------------------------------------------------------------- #pragma region New network_model.cpp stuff Network_Components::Types::Network_IO_Maps network_io_maps; typedef Network_Components::Types::Network_Initialization_Type<Network_Components::Types::ODB_Network,Network_Components::Types::Network_IO_Maps&> Net_IO_Type; string output_dir_name = ""; GLOBALS::Normal_RNG.Initialize(); GLOBALS::Uniform_RNG.Initialize(); cout << "allocating data structures..." <<endl; typedef Scenario<typename MasterType::scenario_type> _Scenario_Interface; _Scenario_Interface* scenario=(_Scenario_Interface*)Allocate<typename MasterType::scenario_type>(); _global_scenario = scenario; typedef Network<typename MasterType::network_type> _Network_Interface; _Network_Interface* network=(_Network_Interface*)Allocate<typename MasterType::network_type>(); _global_network = network; network->scenario_reference<_Scenario_Interface*>(scenario); cout << "reading scenario data..." <<endl; scenario->read_scenario_data<Scenario_Components::Types::ODB_Scenario>(scenario_filename); typedef MasterType::network_type::link_dbid_dir_to_ptr_map_type link_dbid_dir_to_ptr_map_type; link_dbid_dir_to_ptr_map_type* link_dbid_dir_to_ptr_map = network->template link_dbid_dir_to_ptr_map<link_dbid_dir_to_ptr_map_type*>(); cout << "reading network data..." <<endl; network->read_network_data<Net_IO_Type>(network_io_maps); typedef Operation<MasterType::operation_type> _Operation_Interface; _Operation_Interface* operation = (_Operation_Interface*)Allocate<typename MasterType::operation_type>(); operation->network_reference<_Network_Interface*>(network); if (scenario->intersection_control_flag<int>() == 1) { cout <<"reading intersection control data..." << endl; operation->read_intersection_control_data<Net_IO_Type>(network_io_maps); } //cout << "initializing simulation..." <<endl; network->simulation_initialize<NULLTYPE>(); //define_component_interface(_Demand_Interface, MasterType::demand_type, Demand_Prototype, NULLTYPE); //typedef Demand<MasterType::demand_type> _Demand_Interface; //_Demand_Interface* demand = (_Demand_Interface*)Allocate<typename MasterType::demand_type>(); //demand->scenario_reference<_Scenario_Interface*>(scenario); //demand->network_reference<_Network_Interface*>(network); //cout << "reading demand data..." <<endl; //demand->read_demand_data<Net_IO_Type>(network_io_maps); //define_component_interface(_Operation_Interface, MasterType::operation_type, Operation_Components::Prototypes::Operation_Prototype, NULLTYPE); if (scenario->ramp_metering_flag<bool>() == true) { cout <<"reading ramp metering data..." << endl; operation->read_ramp_metering_data<Net_IO_Type>(network_io_maps); } #ifdef ANTARES network->set_network_bounds<NULLTYPE>(); Rectangle_XY<MasterType>* local_bounds=network->network_bounds<Rectangle_XY<MasterType>*>(); START_UI(MasterType,local_bounds->_xmin,local_bounds->_ymin,local_bounds->_xmax,local_bounds->_ymax); MasterType::vehicle_type::Initialize_Layer(); network->initialize_antares_layers<NULLTYPE>(); MasterType::link_type::configure_link_moes_layer(); #endif if(scenario->use_network_events<bool>()) { //define_component_interface(_Network_Event_Manager_Interface, typename MasterType::network_event_manager_type, Network_Event_Manager, NULLTYPE); typedef Network_Event_Manager<MasterType::network_event_manager_type> _Network_Event_Manager_Interface; _Network_Event_Manager_Interface* net_event_manager=(_Network_Event_Manager_Interface*)Allocate<typename MasterType::network_event_manager_type>(); network->network_event_manager<_Network_Event_Manager_Interface*>(net_event_manager); net_event_manager->Initialize<NT>(); if (scenario->use_tmc<bool>()) { typedef Traffic_Management_Center<MasterType::traffic_management_center_type> TMC_Interface; TMC_Interface* tmc = (TMC_Interface*) Allocate< MasterType::traffic_management_center_type >(); tmc->network_event_manager<_Network_Event_Manager_Interface*>(net_event_manager); tmc->Initialize<NT>(); } } ////initialize network agents cout << "initializing link agents..." <<endl; //define_container_and_value_interface(_Links_Container_Interface, _Link_Interface, _Network_Interface::get_type_of(links_container), Random_Access_Sequence_Prototype, Link_Prototype, NULLTYPE); typedef Link<remove_pointer<_Network_Interface::get_type_of(links_container)::value_type>::type> _Link_Interface; typedef Random_Access_Sequence<_Network_Interface::get_type_of(links_container),_Link_Interface*> _Links_Container_Interface; _Links_Container_Interface::iterator links_itr; for(links_itr=network->links_container<_Links_Container_Interface&>().begin(); links_itr!=network->links_container<_Links_Container_Interface&>().end(); links_itr++) { ((_Link_Interface*)(*links_itr))->Initialize<NULLTYPE>(); } cout << "initializing intersection agents..." <<endl; //define_container_and_value_interface(_Intersections_Container_Interface, _Intersection_Interface, _Network_Interface::get_type_of(intersections_container), Random_Access_Sequence_Prototype, Intersection_Prototype, NULLTYPE); // typedef Intersection<remove_pointer<_Network_Interface::get_type_of(intersections_container)::value_type>::type> _Intersection_Interface; typedef Random_Access_Sequence<_Network_Interface::get_type_of(intersections_container),_Intersection_Interface*> _Intersections_Container_Interface; _Intersections_Container_Interface::iterator intersections_itr; for(intersections_itr=network->intersections_container<typename MasterType::network_type::intersections_container_type&>().begin(); intersections_itr!=network->intersections_container<typename MasterType::network_type::intersections_container_type&>().end(); intersections_itr++) { ((_Intersection_Interface*)(*intersections_itr))->Initialize<NULLTYPE>(); } cout << "initializing ramp metering agents..." <<endl; //define_container_and_value_interface(_Ramp_Metering_Container_Interface, _Ramp_Metering_Interface, _Network_Interface::get_type_of(ramp_metering_container), Random_Access_Sequence_Prototype, Ramp_Metering_Prototype, NULLTYPE); typedef Ramp_Metering<remove_pointer<_Network_Interface::get_type_of(ramp_metering_container)::value_type>::type> _Ramp_Metering_Interface; typedef Random_Access_Sequence<_Network_Interface::get_type_of(ramp_metering_container),_Ramp_Metering_Interface*> _Ramp_Metering_Container_Interface; _Ramp_Metering_Container_Interface::iterator ramp_metering_itr; for(ramp_metering_itr=network->ramp_metering_container<_Ramp_Metering_Container_Interface&>().begin(); ramp_metering_itr!=network->ramp_metering_container<_Ramp_Metering_Container_Interface&>().end(); ramp_metering_itr++) { ((_Ramp_Metering_Interface*)(*ramp_metering_itr))->Initialize<NULLTYPE>(); } if (scenario->use_network_events<bool>()) { MasterType::link_type::subscribe_events<NT>(); } #pragma endregion //================================================================================================================================== // Initialize global randon number generators - if seed set to zero or left blank use system time //---------------------------------------------------------------------------------------------------------------------------------- #pragma region RNG initialization int seed = scenario->iseed<int>(); if (seed != 0) { GLOBALS::Normal_RNG.Set_Seed<int>(seed); GLOBALS::Uniform_RNG.Set_Seed<int>(seed); } else { GLOBALS::Normal_RNG.Set_Seed<int>(); GLOBALS::Uniform_RNG.Set_Seed<int>(); } #pragma endregion //================================================================================================================================== // Batch Routing stuff //---------------------------------------------------------------------------------------------------------------------------------- typedef Trip_Components::Prototypes::Assignment_Analyzer<typename MasterType::assignment_analyzer_type> _Analyzer_Interface; _Analyzer_Interface* analyzer=(_Analyzer_Interface*)Allocate<typename MasterType::assignment_analyzer_type>(); analyzer->network_reference<_Network_Interface*>(network); analyzer->read_trip_data(); // activity location map - link the location id to the actual object pointer //typedef Random_Access_Sequence< _Network_Interface::get_type_of(activity_locations_container)> _Activity_Locations_Container_Interface; //typedef Activity_Location_Components::Prototypes::Activity_Location<typename get_component_type(_Activity_Locations_Container_Interface)> _Activity_Location_Interface; //typedef Batch_Router_Components::Prototypes::Routed_Trip<typename MasterType::trip_type> _Trip_Interface; //_Activity_Locations_Container_Interface& activity_locations = network->template activity_locations_container<_Activity_Locations_Container_Interface&>(); //dense_hash_map<int,_Activity_Location_Interface*> activity_id_to_ptr; //activity_id_to_ptr.set_empty_key(-1); //activity_id_to_ptr.set_deleted_key(-2); //for(_Activity_Locations_Container_Interface::iterator activity_locations_itr=activity_locations.begin();activity_locations_itr!=activity_locations.end();activity_locations_itr++) //{ // _Activity_Location_Interface& activity_location=(_Activity_Location_Interface&)**activity_locations_itr; // activity_id_to_ptr[activity_location.template uuid<int>()]=&activity_location; //} // Read the input data file //File_IO::File_Reader fr; //fr.Open(input_filename,true,",\t"); //while (fr.Read()) //{ // int trip_id = fr.Get_Int(0); // string mode = fr.Get_String(1); // int orig = fr.Get_Int(2); // int dest = fr.Get_Int(3); // int time = fr.Get_Int(4); // _Trip_Interface* trip=(_Trip_Interface*)Allocate<typename MasterType::trip_type>(); // trip->Initialize<_Network_Interface*,_Activity_Location_Interface*,Simulation_Timestep_Increment>(trip_id, network,activity_id_to_ptr[orig], activity_id_to_ptr[dest],time); //} //================================================================================================================================== // Start Simulation //---------------------------------------------------------------------------------------------------------------------------------- cout <<"Starting simulation..."<<endl; try {START();} catch (std::exception ex){ cout << ex.what();} cout << "Finished! Press 'Any' key" << endl; }