LCOV - code coverage report
Current view: top level - src/router - ROFrame.cpp (source / functions) Hit Total Coverage
Test: lcov.info Lines: 131 133 98.5 %
Date: 2024-05-08 15:29:52 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /****************************************************************************/
       2             : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3             : // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others.
       4             : // This program and the accompanying materials are made available under the
       5             : // terms of the Eclipse Public License 2.0 which is available at
       6             : // https://www.eclipse.org/legal/epl-2.0/
       7             : // This Source Code may also be made available under the following Secondary
       8             : // Licenses when the conditions for such availability set forth in the Eclipse
       9             : // Public License 2.0 are satisfied: GNU General Public License, version 2
      10             : // or later which is available at
      11             : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
      12             : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
      13             : /****************************************************************************/
      14             : /// @file    ROFrame.cpp
      15             : /// @author  Daniel Krajzewicz
      16             : /// @author  Jakob Erdmann
      17             : /// @author  Michael Behrisch
      18             : /// @date    Sept 2002
      19             : ///
      20             : // Sets and checks options for routing
      21             : /****************************************************************************/
      22             : #include <config.h>
      23             : 
      24             : #include <iostream>
      25             : #include <ctime>
      26             : #include <stdlib.h>
      27             : #include <utils/options/OptionsCont.h>
      28             : #include <utils/options/Option.h>
      29             : #include <utils/common/MsgHandler.h>
      30             : #include <utils/common/UtilExceptions.h>
      31             : #include <utils/common/RandHelper.h>
      32             : #include <utils/common/ToString.h>
      33             : #include <utils/common/SUMOTime.h>
      34             : #include <utils/common/SystemFrame.h>
      35             : #include "ROFrame.h"
      36             : 
      37             : 
      38             : // ===========================================================================
      39             : // method definitions
      40             : // ===========================================================================
      41             : void
      42        4876 : ROFrame::fillOptions(OptionsCont& oc, const bool isDUA, const bool isMA) {
      43             :     // register options
      44             :     // register I/O options
      45        9752 :     oc.doRegister("output-file", 'o', new Option_FileName());
      46        9752 :     oc.addSynonyme("output-file", "output");
      47        9752 :     oc.addDescription("output-file", "Output", TL("Write generated routes to FILE"));
      48             : 
      49        9752 :     oc.doRegister("vtype-output", new Option_FileName());
      50        4876 :     if (!isMA) {
      51        9554 :         oc.addSynonyme("vtype-output", "vtype");
      52             :     }
      53        9752 :     oc.addDescription("vtype-output", "Output", TL("Write used vehicle types into separate FILE"));
      54             : 
      55        4876 :     oc.doRegister("keep-vtype-distributions", new Option_Bool(false));
      56        9752 :     oc.addDescription("keep-vtype-distributions", "Output", TL("Keep vTypeDistribution ids when writing vehicles and their types"));
      57             : 
      58        4876 :     oc.doRegister("emissions.volumetric-fuel", new Option_Bool(false));
      59        9752 :     oc.addDescription("emissions.volumetric-fuel", "Output", TL("Return fuel consumption values in (legacy) unit l instead of mg"));
      60             : 
      61        9752 :     oc.doRegister("net-file", 'n', new Option_FileName());
      62        9752 :     oc.addSynonyme("net-file", "net");
      63        9752 :     oc.addDescription("net-file", "Input", TL("Use FILE as SUMO-network to route on"));
      64             : 
      65        4876 :     oc.doRegister("named-routes", new Option_Bool(false));
      66        9752 :     oc.addDescription("named-routes", "Output", TL("Write vehicles that reference routes by their id"));
      67             : 
      68        9752 :     oc.doRegister("additional-files", 'a', new Option_FileName());
      69        9752 :     oc.addSynonyme("additional-files", "d", true);
      70        9752 :     oc.addSynonyme("additional-files", "additional");
      71        9752 :     oc.addSynonyme("additional-files", "taz-files");
      72        9752 :     oc.addSynonyme("additional-files", "districts", true);
      73        9752 :     oc.addDescription("additional-files", "Input", TL("Read additional network data (districts, bus stops) from FILE(s)"));
      74             : 
      75        9752 :     oc.doRegister("route-files", 'r', new Option_FileName());
      76        9752 :     oc.addSynonyme("route-files", "flow-files", true);
      77        9752 :     oc.addSynonyme("route-files", "flows", true);
      78        9752 :     oc.addSynonyme("route-files", "f", true);
      79        9752 :     oc.addSynonyme("route-files", "alternative-files", true);
      80        9752 :     oc.addSynonyme("route-files", "alternatives-files", true);
      81        9752 :     oc.addSynonyme("route-files", "trip-files", true);
      82        9752 :     oc.addSynonyme("route-files", "trips", true);
      83        4876 :     if (isDUA) {
      84             :         // to make the transition from --trip-files easier, but has a conflict with jtrrouter
      85        8238 :         oc.addSynonyme("route-files", "t", true);
      86             :     }
      87        9752 :     oc.addDescription("route-files", "Input", TL("Read sumo routes, alternatives, flows, and trips from FILE(s)"));
      88             : 
      89       14628 :     oc.doRegister("phemlight-path", new Option_FileName(StringVector({ "./PHEMlight/" })));
      90        9752 :     oc.addDescription("phemlight-path", "Input", TL("Determines where to load PHEMlight definitions from"));
      91             : 
      92        4876 :     oc.doRegister("phemlight-year", new Option_Integer(0));
      93        9752 :     oc.addDescription("phemlight-year", "Input", TL("Enable fleet age modelling with the given reference year in PHEMlight5"));
      94             : 
      95        4876 :     oc.doRegister("phemlight-temperature", new Option_Float(INVALID_DOUBLE));
      96        9752 :     oc.addDescription("phemlight-temperature", "Input", TL("Set ambient temperature to correct NOx emissions in PHEMlight5"));
      97             : 
      98        4876 :     if (isDUA || isMA) {
      99        8436 :         oc.doRegister("weight-files", 'w', new Option_FileName());
     100        8436 :         oc.addSynonyme("weight-files", "weights");
     101        8436 :         oc.addDescription("weight-files", "Input", TL("Read network weights from FILE(s)"));
     102             : 
     103        8436 :         oc.doRegister("lane-weight-files", new Option_FileName());
     104        8436 :         oc.addDescription("lane-weight-files", "Input", TL("Read lane-based network weights from FILE(s)"));
     105             : 
     106        8436 :         oc.doRegister("weight-attribute", 'x', new Option_String("traveltime"));
     107        8436 :         oc.addSynonyme("weight-attribute", "measure", true);
     108       12654 :         oc.addDescription("weight-attribute", "Input", TL("Name of the xml attribute which gives the edge weight"));
     109             :     }
     110             : 
     111             :     // need to do this here to be able to check for network and route input options
     112        4876 :     SystemFrame::addReportOptions(oc);
     113             : 
     114             :     // register the time settings
     115        9752 :     oc.doRegister("begin", 'b', new Option_String("0", "TIME"));
     116        9752 :     oc.addDescription("begin", "Time", TL("Defines the begin time; Previous trips will be discarded"));
     117             : 
     118        9752 :     oc.doRegister("end", 'e', new Option_String("-1", "TIME"));
     119        9752 :     oc.addDescription("end", "Time", TL("Defines the end time; Later trips will be discarded; Defaults to the maximum time that SUMO can represent"));
     120             : 
     121             :     // register the processing options
     122        4876 :     oc.doRegister("ignore-errors", new Option_Bool(false));
     123        9752 :     oc.addSynonyme("ignore-errors", "continue-on-unbuild", true);
     124        9752 :     oc.addSynonyme("ignore-errors", "dismiss-loading-errors", true);
     125        9752 :     oc.addDescription("ignore-errors", "Report", TL("Continue if a route could not be build"));
     126             : 
     127        4876 :     oc.doRegister("max-alternatives", new Option_Integer(5));
     128        9752 :     oc.addDescription("max-alternatives", "Processing", TL("Prune the number of alternatives to INT"));
     129             : 
     130        4876 :     oc.doRegister("with-taz", new Option_Bool(false));
     131        9752 :     oc.addDescription("with-taz", "Processing", TL("Use origin and destination zones (districts) for in- and output"));
     132             : 
     133        4876 :     oc.doRegister("junction-taz", new Option_Bool(false));
     134        9752 :     oc.addDescription("junction-taz", "Input", TL("Initialize a TAZ for every junction to use attributes toJunction and fromJunction"));
     135             : 
     136        4876 :     if (!isMA) {
     137        4777 :         oc.doRegister("unsorted-input", new Option_Bool(false));
     138        9554 :         oc.addSynonyme("unsorted-input", "unsorted");
     139        9554 :         oc.addDescription("unsorted-input", "Processing", TL("Assume input is unsorted"));
     140             : 
     141        9554 :         oc.doRegister("route-steps", 's', new Option_String("200", "TIME"));
     142        9554 :         oc.addDescription("route-steps", "Processing", TL("Load routes for the next number of seconds ahead"));
     143             : 
     144        4777 :         oc.doRegister("no-internal-links", new Option_Bool(false));
     145        9554 :         oc.addDescription("no-internal-links", "Processing", TL("Disable (junction) internal links"));
     146             : 
     147        4777 :         oc.doRegister("randomize-flows", new Option_Bool(false));
     148        9554 :         oc.addDescription("randomize-flows", "Processing", TL("generate random departure times for flow input"));
     149             : 
     150        4777 :         oc.doRegister("remove-loops", new Option_Bool(false));
     151        9554 :         oc.addDescription("remove-loops", "Processing", TL("Remove loops within the route; Remove turnarounds at start and end of the route"));
     152             : 
     153        4777 :         oc.doRegister("repair", new Option_Bool(false));
     154        9554 :         oc.addDescription("repair", "Processing", TL("Tries to correct a false route"));
     155             : 
     156        4777 :         oc.doRegister("repair.from", new Option_Bool(false));
     157        9554 :         oc.addDescription("repair.from", "Processing", TL("Tries to correct an invalid starting edge by using the first usable edge instead"));
     158             : 
     159        4777 :         oc.doRegister("repair.to", new Option_Bool(false));
     160        9554 :         oc.addDescription("repair.to", "Processing", TL("Tries to correct an invalid destination edge by using the last usable edge instead"));
     161             : 
     162        4777 :         oc.doRegister("mapmatch.distance", new Option_Float(100));
     163        9554 :         oc.addDescription("mapmatch.distance", "Processing", TL("Maximum distance when mapping input coordinates (fromXY etc.) to the road network"));
     164             : 
     165        4777 :         oc.doRegister("mapmatch.junctions", new Option_Bool(false));
     166        9554 :         oc.addDescription("mapmatch.junctions", "Processing", TL("Match positions to junctions instead of edges"));
     167             : 
     168        4777 :         oc.doRegister("bulk-routing", new Option_Bool(false));
     169       14331 :         oc.addDescription("bulk-routing", "Processing", TL("Aggregate routing queries with the same origin"));
     170             :     }
     171             : 
     172        4876 :     oc.doRegister("routing-threads", new Option_Integer(0));
     173        9752 :     oc.addDescription("routing-threads", "Processing", TL("The number of parallel execution threads used for routing"));
     174             : 
     175        4876 :     if (isDUA || isMA) {
     176        8436 :         oc.doRegister("routing-algorithm", new Option_String("dijkstra"));
     177       12654 :         oc.addDescription("routing-algorithm", "Processing", TL("Select among routing algorithms ['dijkstra', 'astar', 'CH', 'CHWrapper']"));
     178             :     }
     179             : 
     180        9752 :     oc.doRegister("restriction-params", new Option_StringVector());
     181        9752 :     oc.addDescription("restriction-params", "Processing", TL("Comma separated list of param keys to compare for additional restrictions"));
     182             : 
     183        4876 :     if (isDUA || isMA) {
     184        4218 :         oc.doRegister("weights.interpolate", new Option_Bool(false));
     185        8436 :         oc.addSynonyme("weights.interpolate", "interpolate", true);
     186        8436 :         oc.addDescription("weights.interpolate", "Processing", TL("Interpolate edge weights at interval boundaries"));
     187             : 
     188        4218 :         oc.doRegister("weights.expand", new Option_Bool(false));
     189        8436 :         oc.addSynonyme("weights.expand", "expand-weights", true);
     190       12654 :         oc.addDescription("weights.expand", "Processing", TL("Expand the end of the last loaded weight interval to infinity"));
     191             :     }
     192             : 
     193        4876 :     oc.doRegister("weights.minor-penalty", new Option_Float(1.5));
     194        9752 :     oc.addDescription("weights.minor-penalty", "Processing", TL("Apply the given time penalty when computing routing costs for minor-link internal lanes"));
     195             : 
     196        4876 :     oc.doRegister("weights.tls-penalty", new Option_Float(0));
     197        9752 :     oc.addDescription("weights.tls-penalty", "Processing", TL("Apply the given time penalty when computing routing costs across a traffic light"));
     198             : 
     199        4876 :     if (!isMA) {
     200             :         // register defaults options
     201        9554 :         oc.doRegister("departlane", new Option_String());
     202        9554 :         oc.addDescription("departlane", "Defaults", TL("Assigns a default depart lane"));
     203             : 
     204        9554 :         oc.doRegister("departpos", new Option_String());
     205        9554 :         oc.addDescription("departpos", "Defaults", TL("Assigns a default depart position"));
     206             : 
     207        9554 :         oc.doRegister("departspeed", new Option_String());
     208        9554 :         oc.addDescription("departspeed", "Defaults", TL("Assigns a default depart speed"));
     209             : 
     210        9554 :         oc.doRegister("arrivallane", new Option_String());
     211        9554 :         oc.addDescription("arrivallane", "Defaults", TL("Assigns a default arrival lane"));
     212             : 
     213        9554 :         oc.doRegister("arrivalpos", new Option_String());
     214        9554 :         oc.addDescription("arrivalpos", "Defaults", TL("Assigns a default arrival position"));
     215             : 
     216        9554 :         oc.doRegister("arrivalspeed", new Option_String());
     217        9554 :         oc.addDescription("arrivalspeed", "Defaults", TL("Assigns a default arrival speed"));
     218             : 
     219        4777 :         oc.doRegister("defaults-override", new Option_Bool(false));
     220       14331 :         oc.addDescription("defaults-override", "Defaults", TL("Defaults will override given values"));
     221             :     }
     222             : 
     223             :     // register report options
     224        4876 :     oc.doRegister("stats-period", new Option_Integer(-1));
     225        9752 :     oc.addDescription("stats-period", "Report", TL("Defines how often statistics shall be printed"));
     226             : 
     227        4876 :     oc.doRegister("no-step-log", new Option_Bool(false));
     228        9752 :     oc.addDescription("no-step-log", "Report", TL("Disable console output of route parsing step"));
     229        4876 : }
     230             : 
     231             : 
     232             : bool
     233        4301 : ROFrame::checkOptions(OptionsCont& oc) {
     234             :     // check whether the output is valid and can be build
     235        8602 :     if (!oc.isSet("output-file")) {
     236          10 :         WRITE_ERROR(TL("No output specified."));
     237          10 :         return false;
     238             :     }
     239             :     //
     240        8582 :     if (oc.getInt("max-alternatives") < 1) {
     241           0 :         WRITE_ERROR(TL("A positive number of alternatives must be enabled."));
     242           0 :         return false;
     243             :     }
     244             : #ifndef HAVE_FOX
     245             :     if (oc.getInt("routing-threads") > 1) {
     246             :         WRITE_ERROR(TL("Parallel routing is only possible when compiled with Fox."));
     247             :         return false;
     248             :     }
     249             : #endif
     250             :     return true;
     251             : }
     252             : 
     253             : 
     254             : /****************************************************************************/

Generated by: LCOV version 1.14