LCOV - code coverage report
Current view: top level - src/duarouter - RODUAFrame.cpp (source / functions) Coverage Total Hit
Test: lcov.info Lines: 96.4 % 140 135
Test Date: 2024-12-21 15:45:41 Functions: 100.0 % 4 4

            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    RODUAFrame.cpp
      15              : /// @author  Daniel Krajzewicz
      16              : /// @author  Jakob Erdmann
      17              : /// @author  Michael Behrisch
      18              : /// @date    Sept 2002
      19              : ///
      20              : // Sets and checks options for dua-routing
      21              : /****************************************************************************/
      22              : #include <config.h>
      23              : 
      24              : #include <iostream>
      25              : #include <fstream>
      26              : #include <ctime>
      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/ToString.h>
      32              : #include "RODUAFrame.h"
      33              : #include <router/ROFrame.h>
      34              : #include <utils/common/RandHelper.h>
      35              : #include <utils/common/SystemFrame.h>
      36              : #include <utils/vehicle/SUMOVehicleParameter.h>
      37              : 
      38              : 
      39              : // ===========================================================================
      40              : // method definitions
      41              : // ===========================================================================
      42              : void
      43         9427 : RODUAFrame::fillOptions() {
      44         9427 :     OptionsCont& oc = OptionsCont::getOptions();
      45        18854 :     oc.addCallExample("-c <CONFIGURATION>", "run routing with options from file");
      46              : 
      47              :     // insert options sub-topics
      48         9427 :     SystemFrame::addConfigurationOptions(oc); // fill this subtopic, too
      49         9427 :     oc.addOptionSubTopic("Input");
      50         9427 :     oc.addOptionSubTopic("Output");
      51         9427 :     oc.addOptionSubTopic("Processing");
      52         9427 :     oc.addOptionSubTopic("Defaults");
      53         9427 :     oc.addOptionSubTopic("Time");
      54              : 
      55              :     // insert options
      56         9427 :     ROFrame::fillOptions(oc, true);
      57         9427 :     addImportOptions();
      58         9427 :     addDUAOptions();
      59              :     // add rand options
      60         9427 :     RandHelper::insertRandOptions(oc);
      61         9427 : }
      62              : 
      63              : 
      64              : void
      65         9427 : RODUAFrame::addImportOptions() {
      66         9427 :     OptionsCont& oc = OptionsCont::getOptions();
      67         9427 :     oc.doRegister("alternatives-output", new Option_FileName());
      68        18854 :     oc.addSynonyme("alternatives-output", "alternatives");
      69        18854 :     oc.addDescription("alternatives-output", "Output", TL("Write generated route alternatives to FILE"));
      70              : 
      71         9427 :     oc.doRegister("intermodal-network-output", new Option_FileName());
      72        18854 :     oc.addDescription("intermodal-network-output", "Output", TL("Write edge splits and connectivity to FILE"));
      73              : 
      74         9427 :     oc.doRegister("intermodal-weight-output", new Option_FileName());
      75        18854 :     oc.addDescription("intermodal-weight-output", "Output", TL("Write intermodal edges with lengths and travel times to FILE"));
      76              : 
      77         9427 :     oc.doRegister("write-trips", new Option_Bool(false));
      78        18854 :     oc.addDescription("write-trips", "Output", TL("Write trips instead of vehicles (for validating trip input)"));
      79              : 
      80         9427 :     oc.doRegister("write-trips.geo", new Option_Bool(false));
      81        18854 :     oc.addDescription("write-trips.geo", "Output", TL("Write trips with geo-coordinates"));
      82              : 
      83         9427 :     oc.doRegister("write-trips.junctions", new Option_Bool(false));
      84        18854 :     oc.addDescription("write-trips.junctions", "Output", TL("Write trips with fromJunction and toJunction"));
      85              : 
      86         9427 :     oc.doRegister("write-costs", new Option_Bool(false));
      87        18854 :     oc.addDescription("write-costs", "Output", TL("Include the cost attribute in route output"));
      88              : 
      89              :     // register further processing options
      90              :     // ! The subtopic "Processing" must be initialised earlier !
      91         9427 :     oc.doRegister("weights.random-factor", new Option_Float(1.));
      92        18854 :     oc.addDescription("weights.random-factor", "Processing", TL("Edge weights for routing are dynamically disturbed by a random factor drawn uniformly from [1,FLOAT)"));
      93              : 
      94        18854 :     oc.doRegister("weight-period", new Option_String("3600", "TIME"));
      95        18854 :     oc.addDescription("weight-period", "Processing", TL("Aggregation period for the given weight files; triggers rebuilding of Contraction Hierarchy"));
      96              : 
      97         9427 :     oc.doRegister("weights.priority-factor", new Option_Float(0));
      98        18854 :     oc.addDescription("weights.priority-factor", "Processing", TL("Consider edge priorities in addition to travel times, weighted by factor"));
      99              : 
     100         9427 :     oc.doRegister("astar.all-distances", new Option_FileName());
     101        18854 :     oc.addDescription("astar.all-distances", "Processing", TL("Initialize lookup table for astar from the given file (generated by marouter --all-pairs-output)"));
     102              : 
     103         9427 :     oc.doRegister("astar.landmark-distances", new Option_FileName());
     104        18854 :     oc.addDescription("astar.landmark-distances", "Processing", TL("Initialize lookup table for astar ALT-variant from the given file"));
     105              : 
     106         9427 :     oc.doRegister("astar.save-landmark-distances", new Option_FileName());
     107        18854 :     oc.addDescription("astar.save-landmark-distances", "Processing", TL("Save lookup table for astar ALT-variant to the given file"));
     108              : 
     109         9427 :     oc.doRegister("scale", new Option_Float(1.));
     110        18854 :     oc.addDescription("scale", "Processing", TL("Scale demand by the given factor (by discarding or duplicating vehicles)"));
     111              : 
     112        18854 :     oc.doRegister("scale-suffix", new Option_String("."));
     113        18854 :     oc.addDescription("scale-suffix", "Processing", TL("Suffix to be added when creating ids for cloned vehicles"));
     114              : 
     115         9427 : }
     116              : 
     117              : 
     118              : void
     119         9427 : RODUAFrame::addDUAOptions() {
     120         9427 :     OptionsCont& oc = OptionsCont::getOptions();
     121              :     // register Gawron's DUE-settings
     122         9427 :     oc.doRegister("gawron.beta", new Option_Float(double(0.9)));
     123        18854 :     oc.addSynonyme("gawron.beta", "gBeta", true);
     124        18854 :     oc.addDescription("gawron.beta", "Processing", TL("Use FLOAT as Gawron's beta"));
     125              : 
     126         9427 :     oc.doRegister("gawron.a", new Option_Float(double(0.5)));
     127        18854 :     oc.addSynonyme("gawron.a", "gA", true);
     128        18854 :     oc.addDescription("gawron.a", "Processing", TL("Use FLOAT as Gawron's a"));
     129              : 
     130         9427 :     oc.doRegister("exit-times", new Option_Bool(false));
     131        18854 :     oc.addDescription("exit-times", "Output", TL("Write exit times (weights) for each edge"));
     132              : 
     133         9427 :     oc.doRegister("route-length", new Option_Bool(false));
     134        18854 :     oc.addDescription("route-length", "Output", TL("Include total route length in the output"));
     135              : 
     136         9427 :     oc.doRegister("keep-all-routes", new Option_Bool(false));
     137        18854 :     oc.addDescription("keep-all-routes", "Processing", TL("Save routes with near zero probability"));
     138              : 
     139         9427 :     oc.doRegister("skip-new-routes", new Option_Bool(false));
     140        18854 :     oc.addDescription("skip-new-routes", "Processing", TL("Only reuse routes from input, do not calculate new ones"));
     141              : 
     142         9427 :     oc.doRegister("keep-route-probability", new Option_Float(0));
     143        18854 :     oc.addDescription("keep-route-probability", "Processing", TL("The probability of keeping the old route"));
     144              : 
     145         9427 :     oc.doRegister("ptline-routing", new Option_Bool(false));
     146        18854 :     oc.addDescription("ptline-routing", "Processing", TL("Route all public transport input"));
     147              : 
     148        18854 :     oc.doRegister("route-choice-method", new Option_String("gawron"));
     149        18854 :     oc.addDescription("route-choice-method", "Processing", TL("Choose a route choice method: gawron, logit, or lohse"));
     150              : 
     151         9427 :     oc.doRegister("logit", new Option_Bool(false)); // deprecated
     152        18854 :     oc.addDescription("logit", "Processing", TL("Use c-logit model (deprecated in favor of --route-choice-method logit)"));
     153              : 
     154         9427 :     oc.doRegister("logit.beta", new Option_Float(double(-1)));
     155        18854 :     oc.addSynonyme("logit.beta", "lBeta", true);
     156        18854 :     oc.addDescription("logit.beta", "Processing", TL("Use FLOAT as logit's beta"));
     157              : 
     158         9427 :     oc.doRegister("logit.gamma", new Option_Float(double(1)));
     159        18854 :     oc.addSynonyme("logit.gamma", "lGamma", true);
     160        18854 :     oc.addDescription("logit.gamma", "Processing", TL("Use FLOAT as logit's gamma"));
     161              : 
     162         9427 :     oc.doRegister("logit.theta", new Option_Float(double(-1)));
     163        18854 :     oc.addSynonyme("logit.theta", "lTheta", true);
     164        18854 :     oc.addDescription("logit.theta", "Processing", TL("Use FLOAT as logit's theta (negative values mean auto-estimation)"));
     165              : 
     166         9427 :     oc.doRegister("persontrip.walkfactor", new Option_Float(double(0.75)));
     167        18854 :     oc.addDescription("persontrip.walkfactor", "Processing", TL("Use FLOAT as a factor on pedestrian maximum speed during intermodal routing"));
     168              : 
     169         9427 :     oc.doRegister("persontrip.walk-opposite-factor", new Option_Float(1.0));
     170        18854 :     oc.addDescription("persontrip.walk-opposite-factor", "Processing", TL("Use FLOAT as a factor on walking speed against vehicle traffic direction"));
     171              : 
     172        37708 :     oc.doRegister("persontrip.transfer.car-walk", new Option_StringVector(StringVector({ "parkingAreas" })));
     173        18854 :     oc.addDescription("persontrip.transfer.car-walk", "Processing",
     174              :                       "Where are mode changes from car to walking allowed (possible values: 'parkingAreas', 'ptStops', 'allJunctions' and combinations)");
     175              : 
     176         9427 :     oc.doRegister("persontrip.transfer.taxi-walk", new Option_StringVector());
     177        18854 :     oc.addDescription("persontrip.transfer.taxi-walk", "Processing", TL("Where taxis can drop off customers ('allJunctions, 'ptStops')"));
     178              : 
     179         9427 :     oc.doRegister("persontrip.transfer.walk-taxi", new Option_StringVector());
     180        18854 :     oc.addDescription("persontrip.transfer.walk-taxi", "Processing", TL("Where taxis can pick up customers ('allJunctions, 'ptStops')"));
     181              : 
     182        18854 :     oc.doRegister("persontrip.taxi.waiting-time", new Option_String("300", "TIME"));
     183        18854 :     oc.addDescription("persontrip.taxi.waiting-time", "Processing", TL("Estimated time for taxi pickup"));
     184              : 
     185         9427 :     oc.doRegister("railway.max-train-length", new Option_Float(1000.0));
     186        18854 :     oc.addDescription("railway.max-train-length", "Processing", TL("Use FLOAT as a maximum train length when initializing the railway router"));
     187        28281 : }
     188              : 
     189              : 
     190              : bool
     191         9175 : RODUAFrame::checkOptions() {
     192         9175 :     OptionsCont& oc = OptionsCont::getOptions();
     193         9175 :     bool ok = ROFrame::checkOptions(oc);
     194              : 
     195         9175 :     SUMOVehicleParameter p;
     196              :     std::string error;
     197         9231 :     if (oc.isSet("departlane") && !SUMOVehicleParameter::parseDepartLane(oc.getString("departlane"), "option", "departlane", p.departLane, p.departLaneProcedure, error)) {
     198           12 :         WRITE_ERROR(error);
     199              :         ok = false;
     200              :     }
     201         9231 :     if (oc.isSet("departpos") && !SUMOVehicleParameter::parseDepartPos(oc.getString("departpos"), "option", "departpos", p.departPos, p.departPosProcedure, error)) {
     202           12 :         WRITE_ERROR(error);
     203              :         ok = false;
     204              :     }
     205         9231 :     if (oc.isSet("departspeed") && !SUMOVehicleParameter::parseDepartSpeed(oc.getString("departspeed"), "option", "departspeed", p.departSpeed, p.departSpeedProcedure, error)) {
     206           12 :         WRITE_ERROR(error);
     207              :         ok = false;
     208              :     }
     209         9231 :     if (oc.isSet("arrivallane") && !SUMOVehicleParameter::parseArrivalLane(oc.getString("arrivallane"), "option", "arrivallane", p.arrivalLane, p.arrivalLaneProcedure, error)) {
     210           12 :         WRITE_ERROR(error);
     211              :         ok = false;
     212              :     }
     213         9231 :     if (oc.isSet("arrivalpos") && !SUMOVehicleParameter::parseArrivalPos(oc.getString("arrivalpos"), "option", "arrivalpos", p.arrivalPos, p.arrivalPosProcedure, error)) {
     214           12 :         WRITE_ERROR(error);
     215              :         ok = false;
     216              :     }
     217         9231 :     if (oc.isSet("arrivalspeed") && !SUMOVehicleParameter::parseArrivalSpeed(oc.getString("arrivalspeed"), "option", "arrivalspeed", p.arrivalSpeed, p.arrivalSpeedProcedure, error)) {
     218           12 :         WRITE_ERROR(error);
     219              :         ok = false;
     220              :     }
     221              : 
     222        14344 :     if (oc.getString("routing-algorithm") != "dijkstra" && oc.getString("weight-attribute") != "traveltime") {
     223            9 :         WRITE_ERRORF(TL("Routing algorithm '%' does not support weight-attribute '%'."), oc.getString("routing-algorithm"), oc.getString("weight-attribute"));
     224            3 :         return false;
     225              :     }
     226         9222 :     if (oc.getBool("bulk-routing") && (oc.getString("routing-algorithm") == "CH" || oc.getString("routing-algorithm") == "CHWrapper")) {
     227           12 :         WRITE_ERRORF(TL("Routing algorithm '%' does not support bulk routing."), oc.getString("routing-algorithm"));
     228            6 :         return false;
     229              :     }
     230        30999 :     if (oc.isDefault("routing-algorithm") && (oc.isSet("astar.all-distances") || oc.isSet("astar.landmark-distances") || oc.isSet("astar.save-landmark-distances"))) {
     231           14 :         oc.setDefault("routing-algorithm", "astar");
     232              :     }
     233              : 
     234         9328 :     if (oc.getString("route-choice-method") != "gawron" && oc.getString("route-choice-method") != "logit") {
     235            0 :         WRITE_ERRORF(TL("Invalid route choice method '%'."), oc.getString("route-choice-method"));
     236            0 :         return false;
     237              :     }
     238        18332 :     if (oc.getBool("logit")) {
     239            0 :         WRITE_WARNING(TL("The --logit option is deprecated, please use --route-choice-method logit."));
     240            0 :         oc.set("route-choice-method", "logit");
     241              :     }
     242              : 
     243        18368 :     if (oc.isSet("output-file") && !oc.isSet("alternatives-output")) {
     244        18228 :         const std::string& filename = oc.getString("output-file");
     245         9114 :         const int len = (int)filename.length();
     246        18227 :         if (len > 4 && filename.substr(len - 4) == ".xml") {
     247        36428 :             oc.setDefault("alternatives-output", filename.substr(0, len - 4) + ".alt.xml");
     248           13 :         } else if (len > 4 && filename.substr(len - 3) == ".gz") {
     249           24 :             oc.setDefault("alternatives-output", filename.substr(0, len - 3) + ".alt.gz");
     250              :         } else {
     251            2 :             WRITE_WARNING(TL("Cannot derive file name for alternatives output, skipping it."));
     252              :         }
     253              :     }
     254        18332 :     if (oc.getBool("write-trips.junctions")) {
     255           30 :         if (oc.isDefault("write-trips")) {
     256            8 :             oc.setDefault("write-trips", "true");
     257           22 :         } else if (!oc.getBool("write-trips")) {
     258            0 :             WRITE_WARNING(TL("Option --write-trips.junctions takes no affect when --write-trips is disabled."));
     259              :         }
     260              :     }
     261              :     return ok;
     262         9175 : }
     263              : 
     264              : 
     265              : /****************************************************************************/
        

Generated by: LCOV version 2.0-1