diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index 0b13cab63b9f..45729e415710 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -16,7 +16,8 @@ on: jobs: build: - runs-on: ubuntu-latest + # runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: # Allow all other matrix-jobs to continue running, even if one of the jobs fails fail-fast: false @@ -36,18 +37,11 @@ jobs: path: sumo fetch-depth: 0 - - name: Fetching SUMO tags - run: | - cd sumo - git fetch --tags --force - - name: Preparing Build System run: | sudo apt-get update sudo apt-get install libunwind-dev # to work around https://bugs.launchpad.net/ubuntu/+source/google-glog/+bug/1991919 - sudo apt-get install cmake libeigen3-dev libxerces-c-dev libfox-1.6-dev libgdal-dev libproj-dev libfmt-dev - sudo apt-get install libgtest-dev libgoogle-perftools-dev libgl2ps-dev python3-dev python3-setuptools swig - sudo apt-get install maven ccache libv8-dev gettext pipx + sudo apt-get install $(cat sumo/build_config/build_req_deb.txt) pipx install texttest - name: Validate CITATION.cff @@ -56,10 +50,6 @@ jobs: with: citation-path: sumo/CITATION.cff - - name: ccache - if: github.event_name != 'schedule' - uses: hendrikmuhs/ccache-action@v1.2 - - name: Cloning jupedsim if: matrix.build_type == 'full' && matrix.compiler == 'gcc' uses: actions/checkout@v4 @@ -68,11 +58,17 @@ jobs: ref: ${{ matrix.jps_version }} path: jupedsim + - name: ccache + # do a clean build once a day + if: github.event_name != 'schedule' + uses: hendrikmuhs/ccache-action@v1.2 + with: + key: ${{ matrix.build_type }}-${{ matrix.compiler }} + - name: Building libjupedsim if: matrix.build_type == 'full' && matrix.compiler == 'gcc' run: | - sudo apt-get install libgeos-dev - cmake -B jupedsim-build -DCMAKE_INSTALL_PREFIX=jupedsim-install jupedsim + cmake -B jupedsim-build -D CMAKE_INSTALL_PREFIX=jupedsim-install -D CMAKE_C_COMPILER_LAUNCHER=ccache -D CMAKE_CXX_COMPILER_LAUNCHER=ccache jupedsim cmake --build jupedsim-build -j4 --config Release cmake --install jupedsim-build --config Release @@ -113,8 +109,12 @@ jobs: - name: Building Examples and Tests if: matrix.build_type == 'full' && (github.repository == 'DLR-TS/sumo' || matrix.compiler == 'gcc') + # need to explicitly uninstall matplotlib below because pandas pulls it in but we need a newer version for test stability + # having both installed confuses matplotlib https://github.com/matplotlib/matplotlib/issues/26827 + # the pipdeptree below is also just for debugging but often comes handy so keep it enabled run: | - sudo apt-get install python3-pyproj python3-rtree python3-pandas python3-flake8 python3-autopep8 python3-scipy python3-pulp python3-ezdxf python3-pyperclip python3-polib + sudo apt-get install $(cat sumo/build_config/tools_req_deb.txt) + sudo apt-get -y remove python3-matplotlib python3 -m venv testenv --system-site-packages source testenv/bin/activate python3 -m pip install -r sumo/tools/req_ci.txt -r sumo/tools/requirements.txt @@ -126,10 +126,9 @@ jobs: - name: Extra tests if: matrix.build_type == 'full' && matrix.compiler == 'gcc' run: | - sudo apt-get install python2 + source testenv/bin/activate sumo/tests/runTests.sh -b ci -a sumo.meso.ci,sumo.extra.ci sumo/tests/runTests.sh -b ci -a netconvert.gdal.ci,polyconvert.gdal.ci - sumo/tests/runTests.sh -b ci -a tools.python2.ci - name: Compressing test results if: failure() diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index a46f00b89ebf..09c5636e3208 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -20,6 +20,7 @@ jobs: fail-fast: false matrix: os: [macos-13, macos-14] + jps_version: ['v1.2.1'] runs-on: ${{ matrix.os }} env: CCACHE_COMPILERTYPE: clang @@ -31,45 +32,55 @@ jobs: path: sumo fetch-depth: 0 - - name: Fetching SUMO tags - run: | - cd sumo - git fetch --tags --force - - name: Preparing Build System run: | brew update brew upgrade || brew link --overwrite python@3.12 brew install --cask xquartz - brew install xerces-c fox proj gdal gl2ps ccache googletest fmt -# python3 -m pip install texttest + brew install xerces-c fox proj gdal gl2ps ccache googletest fmt swig eigen + + - name: Cloning jupedsim + uses: actions/checkout@v4 + with: + repository: PedestrianDynamics/jupedsim + ref: ${{ matrix.jps_version }} + path: jupedsim - name: ccache if: github.event_name != 'schedule' uses: hendrikmuhs/ccache-action@v1.2 + with: + key: ${{ matrix.os }} + + - name: Building libjupedsim + run: | + cmake -B jupedsim-build -D CMAKE_INSTALL_PREFIX=jupedsim-install -D CMAKE_C_COMPILER_LAUNCHER=ccache -D CMAKE_CXX_COMPILER_LAUNCHER=ccache jupedsim + cmake --build jupedsim-build -j4 --config Release + cmake --install jupedsim-build --config Release - name: Building SUMO run: | - mkdir -p sumo/cmake-build - cd sumo/cmake-build - cmake .. - make -j4 + cmake -B sumo/cmake-build sumo + cmake --build sumo/cmake-build -j4 - name: Building Traas - run: | - cd sumo/cmake-build - make traas + run: cmake --build sumo/cmake-build --target traas - name: Installing SUMO - run: | - cd sumo/cmake-build - sudo make install + run: sudo cmake --install sumo/cmake-build - name: Building Examples and Tests run: | + export DYLD_FALLBACK_LIBRARY_PATH=$PWD/jupedsim-install/lib:$DYLD_FALLBACK_LIBRARY_PATH cd sumo/cmake-build make CTEST_OUTPUT_ON_FAILURE=1 examples test + - name: Running texttest + run: | + brew install texttest + export DYLD_FALLBACK_LIBRARY_PATH=$PWD/jupedsim-install/lib:$DYLD_FALLBACK_LIBRARY_PATH + sumo/tests/runTests.sh -b ci -v ci -ts meta + - name: Uploading artifacts (SUMO binaries and FMU) uses: actions/upload-artifact@v4 with: @@ -77,12 +88,15 @@ jobs: path: sumo/bin - name: Creating macOS installer dmg + if: matrix.os != 'macos-13' run: | cd sumo - python3 -m pip install dmgbuild - python3 tools/build_config/buildMacOSInstaller.py ./cmake-build + python3 -m venv dmgenv + dmgenv/bin/python3 -m pip install dmgbuild + dmgenv/bin/python3 tools/build_config/buildMacOSInstaller.py ./cmake-build --verbose - name: Uploading macOS installer dmg + if: matrix.os != 'macos-13' uses: actions/upload-artifact@v4 with: name: ${{ matrix.os }}-installer-unsigned diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 1dee8ac1618f..26169eb7665e 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -33,11 +33,6 @@ jobs: path: sumo fetch-depth: 0 - - name: Fetching SUMO tags - run: | - cd sumo - git fetch --tags --force - - name: Cloning SUMO Libraries uses: actions/checkout@v4 with: diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 4b0b51f74e76..c4cc081e8edc 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -61,7 +61,7 @@ jobs: uses: actions/checkout@v4 - name: Lychee Link Checker - uses: lycheeverse/lychee-action@v1 + uses: lycheeverse/lychee-action@v2 with: fail: true args: -c docs/web/lychee.toml -n docs/web/docs/ --cache --max-cache-age 2d diff --git a/.github/workflows/jupedsim-windows.yml b/.github/workflows/jupedsim-windows.yml index 1585f98f7212..a5555c1ffe87 100644 --- a/.github/workflows/jupedsim-windows.yml +++ b/.github/workflows/jupedsim-windows.yml @@ -51,11 +51,6 @@ jobs: path: sumo fetch-depth: 0 - - name: Fetching SUMO tags - run: | - cd sumo - git fetch --tags --force - - name: Cloning SUMO Libraries uses: actions/checkout@v4 with: diff --git a/.github/workflows/wheel-cibw.yml b/.github/workflows/wheel-cibw.yml index 6bbf53209dc6..bac62f9b6709 100644 --- a/.github/workflows/wheel-cibw.yml +++ b/.github/workflows/wheel-cibw.yml @@ -31,18 +31,13 @@ jobs: path: sumo fetch-depth: 0 - # - name: Fetching SUMO tags - # run: | - # cd sumo - # git fetch --tags --force - # - name: Preparing wheel eclipse-sumo # run: | # cp sumo/build_config/pyproject.toml sumo/ # python3 sumo/tools/build_config/version.py sumo/tools/build_config/setup-sumo.py sumo/setup.py # - name: Building wheel eclipse-sumo - # uses: pypa/cibuildwheel@v2.21.2 + # uses: pypa/cibuildwheel@v2.21.3 # with: # package-dir: sumo # output-dir: wheelhouse @@ -56,7 +51,7 @@ jobs: python3 sumo/tools/build_config/version.py sumo/tools/build_config/setup-libsumo.py sumo/tools/setup.py - name: Building wheel libsumo - uses: pypa/cibuildwheel@v2.21.2 + uses: pypa/cibuildwheel@v2.21.3 with: package-dir: sumo/tools output-dir: wheelhouse diff --git a/.github/workflows/wheel-linux.yml b/.github/workflows/wheel-linux.yml index 1c8a14e1911e..5e840f223795 100644 --- a/.github/workflows/wheel-linux.yml +++ b/.github/workflows/wheel-linux.yml @@ -20,7 +20,8 @@ on: jobs: build-manylinux-wheels: - runs-on: ubuntu-latest + # runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - name: Cloning SUMO @@ -28,19 +29,15 @@ jobs: with: fetch-depth: 0 - - name: Fetching SUMO tags - run: | - git fetch --tags --force - - name: Building sumolib / traci (pure Python) wheels and sdist run: | cd tools sudo apt-get update sudo apt-get install python3-build - python build_config/version.py build_config/setup-sumolib.py ./setup.py - python -m build -o ../wheelhouse - python build_config/version.py build_config/setup-traci.py ./setup.py - python -m build -o ../wheelhouse + python3 build_config/version.py build_config/setup-sumolib.py ./setup.py + python3 -m build -o ../wheelhouse + python3 build_config/version.py build_config/setup-traci.py ./setup.py + python3 -m build -o ../wheelhouse - name: Building SUMO / libsumo Python wheels (latest manylinux docker) # if: github.repository == 'DLR-TS/sumo' @@ -72,7 +69,8 @@ jobs: ################### test-wheels: needs: [build-manylinux-wheels] - runs-on: ubuntu-latest + # runs-on: ubuntu-latest + runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: @@ -96,7 +94,7 @@ jobs: sudo apt-get install pipx pipx install texttest python3 -m venv testenv --system-site-packages - testenv/bin/python -m pip install manylinux-wheels/eclipse_sumo* + testenv/bin/python -m pip install -f manylinux-wheels eclipse_sumo testenv/bin/python -c "import sumo; print('SUMO_HOME=' + sumo.SUMO_HOME)" >> $GITHUB_ENV - name: Running "sumo in the wheel" tests diff --git a/.github/workflows/wheel-macos.yml b/.github/workflows/wheel-macos.yml index e93415a6dcf2..a6705b1105bb 100644 --- a/.github/workflows/wheel-macos.yml +++ b/.github/workflows/wheel-macos.yml @@ -103,9 +103,6 @@ jobs: with: fetch-depth: 0 - - name: Fetching SUMO tags - run: git fetch --tags --force - - name: Downloading Wheels artifact uses: actions/download-artifact@v4 with: diff --git a/.github/workflows/wheel-windows.yml b/.github/workflows/wheel-windows.yml index 4ff7ff747d2f..cfbe3f85aa6a 100644 --- a/.github/workflows/wheel-windows.yml +++ b/.github/workflows/wheel-windows.yml @@ -42,9 +42,6 @@ jobs: with: fetch-depth: 0 - - name: Fetching SUMO tags - run: git fetch --tags --force - - name: Cloning SUMO Libraries uses: actions/checkout@v4 with: @@ -145,9 +142,6 @@ jobs: with: fetch-depth: 0 - - name: Fetching SUMO tags - run: git fetch --tags --force - - name: Downloading Wheels artifact uses: actions/download-artifact@v4 with: diff --git a/CMakeLists.txt b/CMakeLists.txt index 0adb5b9765f1..684040db8a81 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -395,6 +395,7 @@ if (SUMO_LIBRARIES AND WIN32) # "${FREETYPE_PATH}/bin/*.dll" "${GETTEXT_PATH}/bin/*.dll" "${SUMO_LIBRARIES}/3rdPartyLibs/bzip2-*/bin/*.dll" + "${SUMO_LIBRARIES}/3rdPartyLibs/geos-*/bin/*.dll" "${SUMO_LIBRARIES}/3rdPartyLibs/curl-*/bin/*.dll" "${SUMO_LIBRARIES}/3rdPartyLibs/libpng-*/bin/*.dll" "${SUMO_LIBRARIES}/3rdPartyLibs/libssh2-*/bin/*.dll" diff --git a/build_config/build_req_deb.txt b/build_config/build_req_deb.txt new file mode 100644 index 000000000000..ea62e07b2efb --- /dev/null +++ b/build_config/build_req_deb.txt @@ -0,0 +1,32 @@ +astyle +ccache +cmake +doxygen +g++ +gettext +git +graphviz +hugo +libeigen3-dev +libfmt-dev +libfox-1.6-dev +libgdal-dev +libgeos-dev +libgl2ps-dev +libgoogle-perftools-dev +libgtest-dev +libproj-dev +libv8-dev +libxerces-c-dev +maven +mkdocs +pipx +plantuml +pre-commit +python-is-python3 +python3-build +python3-dev +python3-pip +python3-setuptools +swig +xvfb diff --git a/build_config/docker/Dockerfile.ubuntu.git b/build_config/docker/Dockerfile.ubuntu.git index 675373e2e1bc..d891ad04dc61 100644 --- a/build_config/docker/Dockerfile.ubuntu.git +++ b/build_config/docker/Dockerfile.ubuntu.git @@ -10,28 +10,29 @@ FROM ubuntu:jammy ENV SUMO_HOME=/usr/share/sumo +ARG DEBIAN_FRONTEND=noninteractive +ARG JUPEDSIM_VERSION=v1.2.1 RUN apt-get -y update +RUN apt-get -y install git + +RUN cd /opt; git clone --shallow-submodules --single-branch --recursive https://github.com/eclipse-sumo/sumo + # basic build dependencies -RUN apt-get -y install git cmake g++ libxerces-c-dev libfox-1.6-dev libgl1-mesa-dev libglu1-mesa-dev \ - libgdal-dev libproj-dev libgl2ps-dev libeigen3-dev gettext -# libsumo dependencies -RUN apt-get -y install swig python3-dev python3-pip python3-setuptools python3-build openjdk-11-jdk maven +RUN apt-get -y install $(cat /opt/sumo/build_config/build_req_deb.txt) # 3D GUI, video recording RUN apt-get -y install libopenscenegraph-dev libavformat-dev libswscale-dev -# unit testing, GUI testing, code style -RUN apt-get -y install libgtest-dev scrot python3-pyperclip xvfb flake8 python3-autopep8 astyle -# python packages needed for the tools (also listed in tools/requirements.txt but we prefer the ubuntu packages) -RUN DEBIAN_FRONTEND=noninteractive apt-get -y install python3-ezdxf python3-pandas python3-psutil python3-pulp \ - python3-pyproj python3-rtree python-is-python3 -# packages needed for the docs (some are also listed in docs/web/requirements.txt but we prefer the ubuntu packages) -RUN apt-get -y install mkdocs hugo doxygen plantuml graphviz +# packages needed for the tools (some are also listed in tools/requirements.txt but we prefer the ubuntu packages) +RUN apt-get -y install $(cat /opt/sumo/build_config/tools_req_deb.txt) + +# JuPedSim +RUN cd /opt; git clone -b $JUPEDSIM_VERSION https://github.com/PedestrianDynamics/jupedsim +RUN cd /opt; cmake -B jupedsim-build -D CMAKE_INSTALL_PREFIX=jupedsim-install jupedsim; \ + cmake --build jupedsim-build -j4 --config Release; cmake --install jupedsim-build --config Release; rm -rf jupedsim-build -RUN cd /opt; git clone --shallow-submodules --single-branch --recursive https://github.com/eclipse/sumo # python packages needed for the tools (the ones where we do not have ubuntu packages) RUN pip3 install -r /opt/sumo/tools/requirements.txt # python packages needed for the docs (the ones where we do not have ubuntu packages) RUN pip3 install -r /opt/sumo/docs/web/requirements.txt -RUN cd /opt/sumo; mkdir build/cmake-build; cd build/cmake-build; \ - cmake ../.. -DCMAKE_INSTALL_PREFIX=/usr -DSUMO_UTILS=TRUE; \ - make -j8 all examples doc install; cd /opt/sumo; rm -rf build/cmake-build +RUN cd /opt/sumo; cmake -B cmake-build -DCMAKE_INSTALL_PREFIX=/usr -DSUMO_UTILS=TRUE; \ + cd cmake-build; make -j8 all examples doc install; cd ..; rm -rf cmake-build diff --git a/build_config/tools_req_deb.txt b/build_config/tools_req_deb.txt new file mode 100644 index 000000000000..2b14bbd1e11f --- /dev/null +++ b/build_config/tools_req_deb.txt @@ -0,0 +1,18 @@ +python3-autopep8 +python3-ezdxf +python3-flake8 +python3-git +python3-lark +python3-opencv +python3-pandas +python3-polib +python3-psutil +python3-pulp +python3-pyperclip +python3-pyproj +python3-rtree +python3-scipy +python3-shapely +python3-termcolor +python3-xmltodict +scrot diff --git a/data/po/de_sumo.po b/data/po/de_sumo.po index 26043244e9b5..86ab4ca2a266 100644 --- a/data/po/de_sumo.po +++ b/data/po/de_sumo.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: sumo\n" "Report-Msgid-Bugs-To: sumo-dev@eclipse.org\n" "POT-Creation-Date: 2024-07-22 10:12+0200\n" -"PO-Revision-Date: 2024-10-09 15:11+0000\n" +"PO-Revision-Date: 2024-10-22 16:23+0000\n" "Last-Translator: Mirko Barthauer \n" "Language-Team: German \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.8.2-dev\n" #: src/activitygen/AGActivityGen.cpp:46 msgid "Reading input" @@ -7362,7 +7362,7 @@ msgstr "Erstelle interne Kanten" #: src/netbuild/NBNetBuilder.cpp:629 msgid "stretching junctions to smooth geometries" -msgstr "Strecken von Knotenpunkten zu glatten Geometrien" +msgstr "Strecken von Knotenpunkten, um Geometrien zu glätten" #: src/netbuild/NBNetBuilder.cpp:658 msgid "Generating street signs" @@ -11927,7 +11927,7 @@ msgstr "Kein numerischer Eintrag in Zeile '%'." #: src/tools/emissionsMap_main.cpp:54 msgid "Writing map of '%' into '%'." -msgstr "Schreibe Karte von '%' in '%'." +msgstr "Schreibe Abbildung von '%' in '%'." #: src/tools/emissionsMap_main.cpp:58 src/utils/router/AStarLookupTable.h:292 #, c-format @@ -11936,18 +11936,20 @@ msgstr "Datei '%' kann nicht geöffnet werden zum Schreiben." #: src/tools/emissionsMap_main.cpp:83 msgid "Builds and writes an emissions map for SUMO's emission models." -msgstr "Baut und schreibt eine Emissionskarte für das SUMOs Emissionsmodelle." +msgstr "" +"Erstellt und schreibt eine Emissionskennfeld für die SUMO-Emissionsmodelle." #: src/tools/emissionsMap_main.cpp:89 msgid "If set, maps for all available emissions are written." msgstr "" -"Wenn angewendet, werden Karten für alle verfügbaren Emissionen geschrieben." +"Wenn angewendet, werden Kennfelder für alle verfügbaren Emissionen " +"geschrieben." #: src/tools/emissionsMap_main.cpp:92 msgid "Defines the name of the emission class to generate the map for." msgstr "" -"Definiert den Namen der Emissionsklasse, für die die Karte erstellt werden " -"soll." +"Definiert den Namen der Emissionsklasse, für die das Kennfeld erstellt " +"werden soll." #: src/tools/emissionsMap_main.cpp:95 msgid "Defines the minimum velocity boundary of the map to generate (in m/s)." diff --git a/data/po/it_sumo.po b/data/po/it_sumo.po index 1b8f7e88cab4..648ddc64ba9b 100644 --- a/data/po/it_sumo.po +++ b/data/po/it_sumo.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: sumo\n" "Report-Msgid-Bugs-To: sumo-dev@eclipse.org\n" "POT-Creation-Date: 2024-07-22 10:12+0200\n" -"PO-Revision-Date: 2024-10-09 08:52+0000\n" +"PO-Revision-Date: 2024-10-22 16:23+0000\n" "Last-Translator: Mirko Barthauer \n" "Language-Team: Italian \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.8-dev\n" +"X-Generator: Weblate 5.8.2-dev\n" #: src/activitygen/AGActivityGen.cpp:46 msgid "Reading input" @@ -3393,6 +3393,8 @@ msgid "" "Value of tau=% in vehicle type '%' lower than simulation step size may cause " "collisions." msgstr "" +"Il valore di tau=% nel tipo di veicolo '%' inferiore al passo di simulazione " +"può causare collisioni." #: src/microsim/MSVehicleType.cpp:468 #, c-format @@ -3401,6 +3403,9 @@ msgid "" "lanes-by-vclass to ensure default vehicle capacity. Set option --meso-lane-" "queue for multi-modal meso simulation" msgstr "" +"La classe di veicoli '%' del tipo di veicolo '%' viene ignorata dall'opzione " +"--meso-ignore-lanes-by-vclass per assicurare la capacità di veicoli. Imposta " +"l'opzione --meso-lane-queue per una simulazione mesoscopica multimodale" #: src/microsim/MSVehicleType.cpp:478 msgid "" @@ -3408,6 +3413,9 @@ msgid "" "emission class Energy/unknown will be used, please consider setting an " "explicit emission class!" msgstr "" +"L'attrezzo di batteria è attivato nel tipo di veicolo '%' ma nessuna classe " +"di emissioni è stata impostata. Quindi si usa la classe di emissioni Energy/" +"unknown. Considera di impostare una classe di emissioni esplicita!" #: src/microsim/cfmodels/MSCFModel_CC.cpp:66 msgid "" @@ -3485,6 +3493,8 @@ msgid "" "Anything else than semi implicit euler update is not yet implemented. " "Exiting!" msgstr "" +"Non è ancora stato implementato altro metodo di aggiornamento che quello " +"Euler semiimplicito. Uscita!" #: src/microsim/devices/MSDevice.cpp:172 #, c-format @@ -4760,25 +4770,32 @@ msgstr "Espressione vuota invalida" #: src/microsim/traffic_lights/MSActuatedTrafficLightLogic.cpp:1379 msgid "Error when retrieving conditions '%' for tlLogic '%' (%)" msgstr "" +"Errore mentre si cerca di ritrovare le condizioni '%' per la logica di " +"semaforo '%' (%)" #: src/microsim/traffic_lights/MSDelayBasedTrafficLightLogic.cpp:96 msgid "" "Unknown laneAreaDetector '%' given as custom detector for delay_based " "tlLogic '%', program '%." msgstr "" +"Rivelatore di corsie '%' sconosciusto dato come rivelatore personalizzato " +"della logica di semaforo '%', programma '%." #: src/microsim/traffic_lights/MSOffTrafficLightLogic.cpp:80 msgid "Invalid 'off'-state for link % at junction '%'" -msgstr "" +msgstr "Stato invalido 'off' del collegamento % nell'incrocio '%'" #: src/microsim/traffic_lights/MSOffTrafficLightLogic.cpp:84 msgid "Inconsistent 'off'-states for linkIndex % at tlLogic '%'" msgstr "" +"Stati 'off' inconsistenti per l'indice di collegamento % nella logica di " +"semaforo '%'" #: src/microsim/traffic_lights/MSRailSignal.cpp:106 #, c-format msgid "Rail signal at junction '%' does not control any links" msgstr "" +"Il segnale ferroviario nell'incrocio '%' non controlla nessun collegamento" #: src/microsim/traffic_lights/MSRailSignal.cpp:1215 msgid "Found circular block after railSignal % (% edges, length %)" @@ -5192,18 +5209,26 @@ msgstr "" #: src/microsim/trigger/MSChargingStation.cpp:66 msgid "Attribute % for chargingStation with ID='%' is invalid (%)." msgstr "" +"L'attributo % per la stazione di ricarica con il codice identificativo '%' è " +"invalido." #: src/microsim/trigger/MSChargingStation.cpp:71 msgid "ChargingStation with ID='%' doesn't have a valid position (% < %)." msgstr "" +"La stazione di ricarica con il codice identificativo '%' non si trova a una " +"posizione valida (% < %)." #: src/microsim/trigger/MSLaneSpeedTrigger.cpp:166 msgid "Invalid or unsorted time entry in vss '%'." msgstr "" +"Appunto temporale invalido oppure non ordinato correttamente nel sistema di " +"limiti dinamici di velocità '%'." #: src/microsim/trigger/MSLaneSpeedTrigger.cpp:182 msgid "Time % was set twice for vss '%'; replacing first entry." msgstr "" +"L'ora % è stata impostata due volte per il sistema di limiti dinamici di " +"velocità '%'; perciò il primo appunto è stato sostituito dal secondo." #: src/microsim/trigger/MSOverheadWire.cpp:354 #: src/microsim/trigger/MSOverheadWire.cpp:409 @@ -5257,19 +5282,25 @@ msgstr "Valore invalido '%' del parametro di tipo di veicolo '%'" #: src/microsim/trigger/MSTriggeredRerouter.cpp:130 msgid "MSTriggeredRerouter %: No destination edge id given." -msgstr "" +msgstr "MSTriggeredRerouter %: Nessun arco di destinazione è stato indicato." #: src/microsim/trigger/MSTriggeredRerouter.cpp:193 msgid "MSTriggeredRerouter %: No route id given." msgstr "" +"MSTriggeredRerouter %: Nessun codice identificativo di itinerario è stato " +"indicato." #: src/microsim/trigger/MSTriggeredRerouter.cpp:216 msgid "MSTriggeredRerouter %: No parking area id given." msgstr "" +"MSTriggeredRerouter %: Nessun codice identificativo di un parcheggio è stato " +"indicato." #: src/microsim/trigger/MSTriggeredRerouter.cpp:241 msgid "MSTriggeredRerouter %: No via edge id given." msgstr "" +"MSTriggeredRerouter %: Nessun codice identificativo di un'arco intermedio è " +"stato indicato." #: src/microsim/trigger/MSTriggeredRerouter.cpp:524 #, c-format @@ -6272,39 +6303,41 @@ msgid "" "Guess on-ramps and mark acceleration lanes if they exist but do not add new " "lanes" msgstr "" +"Indovina le rampe di accesso e segna le corsie di accelerazione se ci sono " +"ma non aggiungere altre corsie" #: src/netbuild/NBFrame.cpp:709 msgid "Treat edges with speed > FLOAT as no ramps" -msgstr "" +msgstr "Non considerare archi con un limite di velocità > FLOAT come rampe" #: src/netbuild/NBFrame.cpp:713 msgid "Treat edges with speed < FLOAT as no highways" -msgstr "" +msgstr "Non considerare archi con un limite di velocità < FLOAT come autostrade" #: src/netbuild/NBFrame.cpp:717 msgid "Use FLOAT as ramp-length" -msgstr "" +msgstr "Utilizza FLOAT come lunghezza di rampa" #: src/netbuild/NBFrame.cpp:721 msgid "Use FLOAT as minimum ramp-length" -msgstr "" +msgstr "Utilizza FLOAT come lunghezza minima di rampa" #: src/netbuild/NBFrame.cpp:725 msgid "Tries to handle the given edges as ramps" -msgstr "" +msgstr "Cerca di trattare gli archi dati come rampe" #: src/netbuild/NBFrame.cpp:728 msgid "Do not consider the given edges as ramps" -msgstr "" +msgstr "Non considerare gli archi dati come rampe" #: src/netbuild/NBFrame.cpp:732 msgid "Avoids edge splitting" -msgstr "" +msgstr "Evita di separare archi" #: src/netbuild/NBFrame.cpp:742 #, c-format msgid "unsupported value '%' for option '--tls.default-type'" -msgstr "" +msgstr "valore '%' non autorizzato per l'opzione '--tls.default-type'" #: src/netbuild/NBFrame.cpp:746 msgid "" @@ -6328,28 +6361,34 @@ msgstr "" #: src/netbuild/NBFrame.cpp:762 msgid "default.lanenumber must be at least 1" -msgstr "" +msgstr "default.lanenumber deve essere almeno 1" #: src/netbuild/NBFrame.cpp:770 msgid "" "only one of the options 'default.disallow' or 'default.allow' may be given" msgstr "" +"solamente una delle opzioni 'default.disallow' o 'default.allow' può essere " +"usata alla volta" #: src/netbuild/NBFrame.cpp:774 msgid "junctions.internal-link-detail must >= 2" -msgstr "" +msgstr "junctions.internal-link-detail deve essere almeno 2" #: src/netbuild/NBFrame.cpp:779 msgid "" "Option 'junctions.scurve-stretch' requires internal lanes to work. Option '--" "no-internal-links' will be disabled." msgstr "" +"L'opzione 'junctions.scurve-stretch' richiede l'uso di corsie interne. " +"L'opzione '--no-internal-links' verrà disattivata." #: src/netbuild/NBFrame.cpp:786 msgid "" "option 'default.junctions.radius' is smaller than option 'junctions.small-" "radius'" msgstr "" +"l'opzione 'default.junctions.radius' è inferiore all'opzione 'junctions." +"small-radius'" #: src/netbuild/NBFrame.cpp:794 msgid "tls.layout must be 'opposites', 'incoming' or 'alternateOneWay'" @@ -6667,11 +6706,11 @@ msgstr "Combinazione di nodi con semafori" #: src/netbuild/NBNetBuilder.cpp:586 msgid "Computing traffic light control information" -msgstr "" +msgstr "Calcolo dell'informazione del controllo con semafori" #: src/netbuild/NBNetBuilder.cpp:593 msgid "Computing node logics" -msgstr "" +msgstr "Calcolo delle logiche dei nodi" #: src/netbuild/NBNetBuilder.cpp:598 msgid "Computing traffic light logics" @@ -6687,7 +6726,7 @@ msgstr "Costruzione degli archi interni" #: src/netbuild/NBNetBuilder.cpp:629 msgid "stretching junctions to smooth geometries" -msgstr "" +msgstr "estensione degli incroci per appianare le geometrie" #: src/netbuild/NBNetBuilder.cpp:658 msgid "Generating street signs" @@ -6782,57 +6821,73 @@ msgid "" "Discarding invalid crossing '%' at junction '%' with edges [%] (no " "walkingarea found)." msgstr "" +"Il passaggio pedonale invalido '%' all'incrocio '%' con gli archi [%] va " +"essere omesso perché non è stata trovata nessun'area pedonale." #: src/netbuild/NBNode.cpp:3066 msgid "" "Discarding invalid crossing '%' at junction '%' with edges [%] (no vehicle " "lanes to cross)." msgstr "" +"Il passaggio pedonale invalido '%' all'incrocio '%' con gli archi [%] va " +"essere omesso perché non ci sono corsie di veicoli che lo incrociano." #: src/netbuild/NBNode.cpp:3085 msgid "" "Discarding invalid crossing '%' at junction '%' with edges [%] (invalid " "shape)." msgstr "" +"Il passaggio pedonale invalido '%' all'incrocio '%' con gli archi [%] va " +"essere omesso per causa di forma invalida." #: src/netbuild/NBNode.cpp:3126 #, c-format msgid "Ignoring additional sidewalk lane % on edge '%' for walkingareas." msgstr "" +"La corsia addizionale del marciapiede % su arco '%' va essere ignorata per " +"causa delle aree pedonali." #: src/netbuild/NBNode.cpp:3242 msgid "" "Invalid pedestrian topology at junction '%'; crossing '%' targets '%' and " "'%'." msgstr "" +"Topologia per pedoni invalida all'incrocio '%'; il passaggio pedonale " +"collega '%' a '%'." #: src/netbuild/NBNode.cpp:3268 msgid "" "Invalid pedestrian topology at junction '%'; crossing '%' is targeted by '%' " "and '%'." msgstr "" +"Topologia per pedoni invalida all'incrocio '%'; il passaggio pedonale " +"collega '%' a '%'." #: src/netbuild/NBNode.cpp:3273 msgid "" "Invalid pedestrian topology at junction '%'; crossing '%' starts and ends at " "walkingarea '%'." msgstr "" +"Topologia per pedoni invalida all'incrocio '%'; il passaggio pedonale inizia " +"e termina alla stessa area pedonale '%'." #: src/netbuild/NBNode.cpp:3533 msgid "Invalid pedestrian topology: crossing '%' across [%] has no target." msgstr "" +"Topologia per pedoni invalida all'incrocio '%'; il passaggio pedonale '%' " +"attraverso [%] non ha destinazione." #: src/netbuild/NBNode.cpp:3872 msgid "Request for unknown crossing '%'" -msgstr "" +msgstr "Richiesta del passaggio pedonale sconosciuto '%'" #: src/netbuild/NBNode.cpp:3888 msgid "Request for unknown crossing for the given Edges" -msgstr "" +msgstr "Richiesta di un passaggio pedonale sconosciuto per gli archi dati" #: src/netbuild/NBNode.cpp:3913 msgid "Request for unknown walkingarea '%'." -msgstr "" +msgstr "Richiesta dell'area pedonale sconosciuta '%'." #: src/netbuild/NBNodeCont.cpp:322 msgid "Removed a road without junctions: %." @@ -7419,39 +7474,39 @@ msgstr "" #: src/netgen/netgen_main.cpp:274 msgid " Removed % traffic lights at geometry-like nodes" -msgstr "" +msgstr " % semafori rimossi da nodi che sembrano esistere solo per la geometria" #: src/netimport/NIFrame.cpp:53 msgid "Read SUMO-net from FILE" -msgstr "" +msgstr "Carica rete di SUMO da FILE" #: src/netimport/NIFrame.cpp:60 msgid "Read XML-node defs from FILE" -msgstr "" +msgstr "Carica definizioni di nodi in XML da FILE" #: src/netimport/NIFrame.cpp:66 msgid "Read XML-edge defs from FILE" -msgstr "" +msgstr "Carica definizioni di archi in XML da FILE" #: src/netimport/NIFrame.cpp:72 msgid "Read XML-connection defs from FILE" -msgstr "" +msgstr "Carica definizioni di collegamenti in XML da FILE" #: src/netimport/NIFrame.cpp:75 msgid "Read XML-traffic light defs from FILE" -msgstr "" +msgstr "Carica definizioni di semafori in XML da FILE" #: src/netimport/NIFrame.cpp:81 msgid "Read XML-type defs from FILE" -msgstr "" +msgstr "Carica definizioni di tipi in XML da FILE" #: src/netimport/NIFrame.cpp:86 msgid "Reads public transport stops from FILE" -msgstr "" +msgstr "Carica fermate di trasporto pubblico da FILE" #: src/netimport/NIFrame.cpp:88 msgid "Reads public transport lines from FILE" -msgstr "" +msgstr "Carica linee di trasporto pubblico da FILE" #: src/netimport/NIFrame.cpp:90 msgid "Reads polygons from FILE for embedding in network where applicable" @@ -7657,39 +7712,39 @@ msgstr "Il numero di corsie verrà derivato dalla capacità" #: src/netimport/NIFrame.cpp:246 msgid "Read edge ids from column STR" -msgstr "" +msgstr "Leggi i codici identificativi degli archi dalla colonna STR" #: src/netimport/NIFrame.cpp:250 msgid "Read from-node ids from column STR" -msgstr "" +msgstr "Leggi i codici identificativi dei nodi iniziali dalla colonna STR" #: src/netimport/NIFrame.cpp:254 msgid "Read to-node ids from column STR" -msgstr "" +msgstr "Leggi i codici identificativi dei nodi terminali dalla colonna STR" #: src/netimport/NIFrame.cpp:258 msgid "Read type ids from column STR" -msgstr "" +msgstr "Leggi i codici identificativi dei tipi dalla colonna STR" #: src/netimport/NIFrame.cpp:261 msgid "Read lane number from column STR" -msgstr "" +msgstr "Leggi il numero di corsie dalla colonna STR" #: src/netimport/NIFrame.cpp:264 msgid "Read speed from column STR" -msgstr "" +msgstr "Leggi la velocità dalla colonna STR" #: src/netimport/NIFrame.cpp:267 msgid "Read custom edge length from column STR" -msgstr "" +msgstr "Leggi la lunghezza personalizzata di un arco dalla colonna STR" #: src/netimport/NIFrame.cpp:270 msgid "Read total edge width from column STR" -msgstr "" +msgstr "Leggi la larghezza totale di un arco dalla colonna STR" #: src/netimport/NIFrame.cpp:273 msgid "Read (non-unique) name from column STR" -msgstr "" +msgstr "Leggi il nome (non necessariamente unico) dalla colonna STR" #: src/netimport/NIFrame.cpp:276 msgid "" @@ -7699,7 +7754,7 @@ msgstr "" #: src/netimport/NIFrame.cpp:279 msgid "Add the list of field names as edge params" -msgstr "" +msgstr "Aggiungi l'elenco di nomi dei campi come parametri dell'arco" #: src/netimport/NIFrame.cpp:283 msgid "Uses edge type defaults on problems" @@ -8650,12 +8705,16 @@ msgid "" "Duplicate definition of stopOffset for edge %.\n" "Ignoring duplicate specification." msgstr "" +"Definizione raddoppiata di stopOffset dell'arco %.\n" +"La specificazione raddoppiata verrà ignorata." #: src/netimport/NIImporter_SUMO.cpp:718 msgid "" "Duplicate definition of lane's stopOffset on edge %.\n" "Ignoring duplicate specifications." msgstr "" +"Definizione raddoppiata di stopOffset di una corsia dell'arco %.\n" +"La specificazione raddoppiata verrà ignorata." #: src/netimport/NIImporter_SUMO.cpp:755 #, c-format @@ -9055,16 +9114,16 @@ msgstr "" #: src/netimport/NIXMLEdgesHandler.cpp:227 #, c-format msgid "Edge '%' changed its type; assuming type override is wished." -msgstr "" +msgstr "L'arco '%' ha cambiato tipo; si assume che è desiderato sovrascriverlo." #: src/netimport/NIXMLEdgesHandler.cpp:315 msgid "Ignoring self-looped edge '%' at junction '%'" -msgstr "" +msgstr "L'arco anello '%' all'incrocio '%' verrà ignorato" #: src/netimport/NIXMLEdgesHandler.cpp:393 #, c-format msgid "'%' is deprecated, please use '%' instead." -msgstr "" +msgstr "'%' è obsoleto, invece usa '%'." #: src/netimport/NIXMLEdgesHandler.cpp:403 msgid "Lane index is larger than number of lanes (edge '%')." @@ -9096,7 +9155,7 @@ msgstr "" #: src/netimport/NIXMLEdgesHandler.cpp:570 msgid "The to-node is not given for edge '%'." -msgstr "" +msgstr "Il nodo terminale dell'arco '%' non è stato definito." #: src/netimport/NIXMLEdgesHandler.cpp:616 msgid "Ignoring unknown spreadType '%' for edge '%'." @@ -9118,27 +9177,29 @@ msgstr "Arco '%' sconosciuto in una rotatoria." #: src/netimport/NIXMLNodesHandler.cpp:151 msgid "Missing position (at node ID='%')." -msgstr "" +msgstr "Posizione assente (nel nodo '%')." #: src/netimport/NIXMLNodesHandler.cpp:185 msgid "Could not insert node though checked this before (id='%')." msgstr "" +"Non ho potuto inserire il nodo benché controllato prima (codice " +"identificativo '%')." #: src/netimport/NIXMLNodesHandler.cpp:214 msgid "Unable to project node shape at node '%'." -msgstr "" +msgstr "La forma del nodo '%' non poteva essere proiettata." #: src/netimport/NIXMLNodesHandler.cpp:322 msgid "Unknown traffic light type '%' for node '%'." -msgstr "" +msgstr "Tipo di semaforo '%' sconosciuto nel nodo '%'." #: src/netimport/NIXMLNodesHandler.cpp:331 msgid "Unknown traffic light layout '%' for node '%'." -msgstr "" +msgstr "Disposizione di semafori '%' sconosciuta nel nodo '%'." #: src/netimport/NIXMLNodesHandler.cpp:342 msgid "Changing traffic light type '%' to '%' for tl '%'." -msgstr "" +msgstr "Cambio del tipo da '%' a '%' per semaforo '%'." #: src/netimport/NIXMLPTHandler.cpp:159 #, c-format @@ -9621,7 +9682,7 @@ msgstr "" #: src/netload/NLHandler.cpp:1679 msgid "At district '%': succeeding edge '%' does not exist." -msgstr "" +msgstr "Nel distretto '%': l'arco successivo '%' non esiste." #: src/netload/NLJunctionControlBuilder.cpp:116 msgid "Information about the number of nodes was missing." @@ -10059,7 +10120,7 @@ msgstr "Fine dell'archivio incontrato nella lettura di %." #: src/od/ODMatrix.cpp:469 msgid "Broken period definition '%'." -msgstr "" +msgstr "Definizione di intervallo invalida '%'." #: src/od/ODMatrix.cpp:483 msgid "Broken factor: '%'." @@ -10093,21 +10154,23 @@ msgstr "Non ho potuto aprile '%'." #: src/od/ODMatrix.cpp:666 /src/od/ODMatrix.cpp:672 #, c-format msgid "'%' does not contain the needed information about the time described." -msgstr "" +msgstr "'%' non contiene l'informazione necessaria relativa all'ora descritta." #: src/od/ODMatrix.cpp:682 /src/od/ODMatrix.cpp:695 #, c-format msgid "Could not access matrix file '%' to load." -msgstr "" +msgstr "Non ho potuto accedere al file di matrice '%' da caricare." #: src/od/ODMatrix.cpp:722 #, c-format msgid "Could not access route file '%' to load." -msgstr "" +msgstr "Non ho potuto accedere al file di itinerari '%' da caricare." #: src/od/ODMatrix.cpp:739 msgid "Assuming 24 entries for a day timeline, but got %." msgstr "" +"Sono stati trovati % appunti per la curva cronologica invece dei 24 " +"aspettati per un giorno intero." #: src/od/ODMatrix.cpp:749 msgid "Broken time line definition: missing a value in '%'." @@ -10456,39 +10519,42 @@ msgstr "" #: src/router/ROFrame.cpp:47 msgid "Write generated routes to FILE" -msgstr "" +msgstr "Scrivi itinerari generati in FILE" #: src/router/ROFrame.cpp:53 msgid "Write used vehicle types into separate FILE" -msgstr "" +msgstr "Scrivi i tipi di veicoli utilizzati in un FILE separato" #: src/router/ROFrame.cpp:56 msgid "Keep vTypeDistribution ids when writing vehicles and their types" msgstr "" +"Mantieni i codici identificativi delle distribuzioni di tipi di veicoli " +"nella scrittura dei veicoli e dei loro tipi" #: src/router/ROFrame.cpp:63 msgid "Use FILE as SUMO-network to route on" -msgstr "" +msgstr "Utilizza FILE come rete SUMO base degli itinerari" #: src/router/ROFrame.cpp:66 msgid "Write vehicles that reference routes by their id" -msgstr "" +msgstr "Scrivi veicoli con il loro itinerario indicato come referenza" #: src/router/ROFrame.cpp:73 msgid "Read additional network data (districts, bus stops) from FILE(s)" msgstr "" +"Carica dati addizionali (distretti, fermate di autobus) da uno o più FILE" #: src/router/ROFrame.cpp:87 msgid "Read sumo routes, alternatives, flows, and trips from FILE(s)" -msgstr "" +msgstr "Carica itinerari SUMO, alternative, flussi e corsie da uno o più FILE" #: src/router/ROFrame.cpp:101 msgid "Read network weights from FILE(s)" -msgstr "" +msgstr "Carica pesi di rete da uno o più FILE" #: src/router/ROFrame.cpp:104 msgid "Read lane-based network weights from FILE(s)" -msgstr "" +msgstr "Carica pesi di corsie da uno o più FILE" #: src/router/ROFrame.cpp:125 msgid "Continue if a route could not be build" @@ -10943,6 +11009,8 @@ msgstr "Attributo sconosciuto '%' da scrivere in uscita." msgid "" "Option --vtype requires option --additional-files for loading vehicle types" msgstr "" +"L'opzione --vtype richiede l'opzione --additional-files per caricare i tipi " +"di veicoli" #: src/tools/emissionsDrivingCycle_main.cpp:225 msgid "Vehicle type is not unique." @@ -10967,16 +11035,18 @@ msgstr "Voce non numerica in linea '%'." #: src/tools/emissionsMap_main.cpp:54 msgid "Writing map of '%' into '%'." -msgstr "" +msgstr "Scrittura della corrispondenza di '%' in '%'." #: src/tools/emissionsMap_main.cpp:58 src/utils/router/AStarLookupTable.h:292 #, c-format msgid "Could not open file '%' for writing." -msgstr "" +msgstr "Non ho potuto aprire il file '%' in modo scrittura." #: src/tools/emissionsMap_main.cpp:83 msgid "Builds and writes an emissions map for SUMO's emission models." msgstr "" +"Costruice e scrive corrispondenze di emissions per gli modelli di emissioni " +"di SUMO." #: src/tools/emissionsMap_main.cpp:89 msgid "If set, maps for all available emissions are written." @@ -11039,11 +11109,11 @@ msgstr "" #: src/traci-server/TraCIServer.cpp:314 msgid "Starting TraCI without using internal lanes!" -msgstr "" +msgstr "Avviamento di TraCI senza l'uso di corsie interne!" #: src/traci-server/TraCIServer.cpp:320 msgid "***Starting server on port % ***" -msgstr "" +msgstr "***Avviamento del server su porta % ***" #: src/traci-server/TraCIServer.cpp:323 #, c-format @@ -11094,15 +11164,15 @@ msgstr "" #: src/utils/common/MsgHandler.cpp:190 #, c-format msgid " done (%ms)." -msgstr "" +msgstr " concluso (%ms)." #: src/utils/common/MsgHandler.cpp:192 msgid " done." -msgstr "" +msgstr " concluso." #: src/utils/common/MsgHandler.cpp:195 msgid " failed." -msgstr "" +msgstr " fallito." #: src/utils/common/MsgHandler.cpp:290 msgid "Could not set locale to '%'." @@ -11391,7 +11461,7 @@ msgstr "Colonna invalida" #: src/utils/foxtools/MFXDecalsTable.cpp:340 #: src/utils/foxtools/MFXDecalsTable.cpp:797 msgid "Open decal" -msgstr "" +msgstr "Apri immagine di sfondo" #: src/utils/foxtools/MFXDecalsTable.cpp:345 msgid "All files (*)" @@ -11399,27 +11469,27 @@ msgstr "Tutti i file (*)" #: src/utils/foxtools/MFXDecalsTable.cpp:797 msgid "Open decal." -msgstr "" +msgstr "Apre l'immagine di sfondo." #: src/utils/foxtools/MFXDecalsTable.cpp:805 msgid "Remove decal" -msgstr "" +msgstr "Rimuovi immagine di sfondo" #: src/utils/foxtools/MFXDecalsTable.cpp:805 msgid "Remove decal." -msgstr "" +msgstr "Rimuove l'immagine di sfondo." #: src/utils/foxtools/MFXGroupBoxModule.cpp:73 msgid "Expand" -msgstr "" +msgstr "Estendi" #: src/utils/foxtools/MFXGroupBoxModule.cpp:74 msgid "Expand frame to show all contents" -msgstr "" +msgstr "Estendi il riquadro per mostrare tutti il contenuto" #: src/utils/foxtools/MFXTextFieldSearch.cpp:86 msgid "Type to search..." -msgstr "" +msgstr "Digita per cercare..." #: src/utils/geom/GeoConvHelper.cpp:87 msgid "Ignoring geoidgrids and vgridshift in projection" diff --git a/data/xsd/additional_file.xsd b/data/xsd/additional_file.xsd index eec2d1ca8236..acc343c86839 100644 --- a/data/xsd/additional_file.xsd +++ b/data/xsd/additional_file.xsd @@ -39,6 +39,7 @@ + @@ -614,6 +615,12 @@ + + + + + + diff --git a/data/xsd/state_file.xsd b/data/xsd/state_file.xsd index 60df487c4444..6d8b359fe24e 100644 --- a/data/xsd/state_file.xsd +++ b/data/xsd/state_file.xsd @@ -23,11 +23,14 @@ + + + @@ -232,4 +235,10 @@ + + + + + + diff --git a/docs/web/docs/ChangeLog.md b/docs/web/docs/ChangeLog.md index 2eca57ba3f68..2aecf6c84251 100644 --- a/docs/web/docs/ChangeLog.md +++ b/docs/web/docs/ChangeLog.md @@ -6,6 +6,37 @@ title: ChangeLog ### Bugfixes +- sumo + - Fixed rerouting error on the last route edge with a stop #15552 + - Fixed routing error on departure #15563 + - Fixed invalid warnings regarding inconsistent loaded stop times #15602 + +- netedit + - Loaded containers starting from stops are now drawn #15567 + - ESC aborts creation of edgeRel and tazRel datas #15601 + - Fixed invalid TAZ coloring during mouse hovering in create TAZRel mode #15544 + +- TraCI + - Fixed crash when calling `vehicle.getNextLinks` and `lane.getLinks` at junction type `allway_stop` or `priority_stop` #15603 (regression in 1.21.0) + +### Enhancements + +- sumo + - The new vType attribute `lcContRight` can be used to configure lane choice at a lane split where all lanes have equal strategic value. #15579 + - Added option **--insertion-checks** to set global defaults for vehicle attribute `insertionChecks` #15149 + - railways + - major rewrite of signal logic #7578 + - major improvement in railway simulation speed (simulation time reduced by ~50-75% depending on scenario size) #4379 + - Fixed various deadlocks #7493, #13262, #15474 + - The new option **--time-to-teleport.railsignal-deadlock** can be used to detect signal based deadlocks #15561 + - The new optioin **--time-to-teleport.remove-constraint** can be used to resolve detected deadlocks which are caused by a signal constraint by deactivating a responsible constraint #14543 + - The new option **--deadlock-output** can be use to log detected deadlocks and also their resolution + - Logged deadlocks can be loaded as additional file to prevent them in a subsequent simulation #15569 + + +### Miscellaneous + + ## Version 1.21.0 (10.10.2024) ### Bugfixes diff --git a/docs/web/docs/ChangeLog/Changes_in_2013_releases.md b/docs/web/docs/ChangeLog/Changes_in_2013_releases.md index 81e24da41c70..74347a149115 100644 --- a/docs/web/docs/ChangeLog/Changes_in_2013_releases.md +++ b/docs/web/docs/ChangeLog/Changes_in_2013_releases.md @@ -325,7 +325,7 @@ title: Changes in the 2013 releases (versions 0.17.0, 0.17.1, 0.18.0 and 0.19.0) railway element is unidirectional or bidirectional. - added option **--osm.railway.oneway-default** {{DT_BOOL}} for setting the default behavior when importing railways without "tracks" attribute. The appropriate value - depends on the mapping style of the regional *OSM* comunity. + depends on the mapping style of the regional *OSM* community. - added option **--geometry.max-angle** {{DT_FLOAT}} which warns about sharp turns on an edge. This is enabled by default for turns above 99 Degrees. - added option **--geometry.min-radius** {{DT_FLOAT}} which warns about sharp turns at the start and end diff --git a/docs/web/docs/ChangeLog/Changes_in_2014_releases.md b/docs/web/docs/ChangeLog/Changes_in_2014_releases.md index 4833cbeed532..a36c23e8bc31 100644 --- a/docs/web/docs/ChangeLog/Changes_in_2014_releases.md +++ b/docs/web/docs/ChangeLog/Changes_in_2014_releases.md @@ -134,7 +134,7 @@ title: Changes in the 2014 releases (versions 0.20.0, 0.21.0 and 0.22.0) are now scrollable to allow work on smaller screens. - The attributes which can be used to customize lane colors can now also be used to scale their width. This is done in the view - customization dialog unter 'Streets' -\> 'Scale width'. + customization dialog under 'Streets' -\> 'Scale width'. - Vehicle coloring *by time since lane change* now indicates the direction of the change by its color - Added new link state 'u' to encode red-yellow phase (shown as @@ -258,7 +258,7 @@ title: Changes in the 2014 releases (versions 0.20.0, 0.21.0 and 0.22.0) immediately. - netconvert - when loading traffic light programs from *tllogic-files*, the - node attribute *controlledInner* is now propperly preserved + node attribute *controlledInner* is now properly preserved - guessed traffic light programs no longer contain duplicate consecutive phases - Fixed bug where option **ramps.guess** would sometimes fail to add necessary diff --git a/docs/web/docs/ChangeLog/Changes_in_2018_releases.md b/docs/web/docs/ChangeLog/Changes_in_2018_releases.md index f807744acde1..a0eb4b89947e 100644 --- a/docs/web/docs/ChangeLog/Changes_in_2018_releases.md +++ b/docs/web/docs/ChangeLog/Changes_in_2018_releases.md @@ -465,7 +465,7 @@ title: Changes in the 2018 releases (versions 1.0.0, 1.0.1 and 1.1.0) Models](../Definition_of_Vehicles,_Vehicle_Types,_and_Routes.md#lane-changing_models), Issue #4025 - Implemented [SSM Device](../Simulation/Output/SSM_Device.md), which allows - output of saftey related quantities. Issue #2669, Issue #4119 + output of safety related quantities. Issue #2669, Issue #4119 - 'Smoothed' emergency braking Issue #4116 - Added an initial version of a [driver state device](../Driver_State.md) for modelling imperfect @@ -692,7 +692,7 @@ title: Changes in the 2018 releases (versions 1.0.0, 1.0.1 and 1.1.0) - `` is now deprecated in favour of FCD-output filtering - `` is now deprecated in favour of calibrators. - The default arrival position for person walks is now the middle - of the destination edge. This reduces the assymetry from + of the destination edge. This reduces the asymmetry from arriving in forward or backward direction. Issue #3843 - tripinfo-output attribute *waitSteps* which counts the number of simulation steps in which the vehicle was below a threshold diff --git a/docs/web/docs/ChangeLog/Changes_in_2019_releases.md b/docs/web/docs/ChangeLog/Changes_in_2019_releases.md index be415bb28655..d037627d26ae 100644 --- a/docs/web/docs/ChangeLog/Changes_in_2019_releases.md +++ b/docs/web/docs/ChangeLog/Changes_in_2019_releases.md @@ -631,7 +631,7 @@ title: Changes in the 2019 releases (versions 1.2.0, 1.3.0, 1.3.1 and 1.4.0) - TraCI - TraCI Version is now 20 - Function *trafficlight.setCompleteRedYellowGreeenDefinition* now - expectes the 5th component *next* to be a list of integers when + expects the 5th component *next* to be a list of integers when defining phases. Function '*'trafficlight.getCompleteRedYellowGreeenDefinition* now returns a list of integers as the 5th component (next) when diff --git a/docs/web/docs/ChangeLog/Changes_in_2020_releases.md b/docs/web/docs/ChangeLog/Changes_in_2020_releases.md index b5ddb740a443..4335b7f5cf8d 100644 --- a/docs/web/docs/ChangeLog/Changes_in_2020_releases.md +++ b/docs/web/docs/ChangeLog/Changes_in_2020_releases.md @@ -25,7 +25,7 @@ title: Changes in the 2020 releases (versions 1.5.0, 1.6.0, 1.7.0 and 1.8.0) - battery model now works correctly with subseconds and handles additional power intake better. Issue #7695 - crashing - Fixed crash on parallel intermodal routing. Issue #7627 - - Fixe crash when defining stops on internal edges. Issue #7690 + - Fixed crash when defining stops on internal edges. Issue #7690 - Fixed crash when using meanData attribute 'trackVehicles=True' in a pedestrian simulation. Issue #7664 - Fixed crash when vehicle with ssm device is teleported. Issue #7753 - Fixed crash on invalid route input. Issue #7801 diff --git a/docs/web/docs/ChangeLog/Changes_in_2021_releases.md b/docs/web/docs/ChangeLog/Changes_in_2021_releases.md index 2b611243844e..fcc8e2aa85f3 100644 --- a/docs/web/docs/ChangeLog/Changes_in_2021_releases.md +++ b/docs/web/docs/ChangeLog/Changes_in_2021_releases.md @@ -178,7 +178,7 @@ title: Changes in the 2021 releases (versions 1.9.0, 1.9.1, 1.9.2, 1.10.0 and 1. - Fixed bug where command 'traci.vehicle.changeLane' was ignored in sublane simulation. Issue #9147, #9493 - Function 'traci.vehicle.replaceStop' no longer fails while on junction. Issue #9467 - Fixed invalid stop duration reported after updating duration with setStop. Issue #9522 - - Added missing convenience functions in traci.vehicle (i.e. 'isAtBusstop' to libsumo and libtraci python bindings. Issue #9591 + - Added missing convenience functions in traci.vehicle (i.e. 'isAtBusstop') to libsumo and libtraci python bindings. Issue #9591 - Fixed missing vehicles when using subscriptionFilterLateralDistance. Issue #9603 - tools @@ -452,12 +452,12 @@ title: Changes in the 2021 releases (versions 1.9.0, 1.9.1, 1.9.2, 1.10.0 and 1. - Added option **--persontrip.walk-opposite-factor FLOAT** which can be used to discourage walking against traffic flow (for FLOAT < 1). Issue #7730 - Persons that walk against the flow of traffic now walk on the left side of the road rather than in the middle (left side of the lane instead of right side). Issue #7744 - Vehicle stops now support attribute 'posLat' to stop with a lateral offset. Issue #8752. - - Rail signals can now be switched into "moving block" mode where they only guard against flanking and oncoming trains. (option **--railsignal-moving-block** or ``. Issue #8518 - - Vehroute-outupt now includdes attribute "priorEdgesLength" if option **--vehroute-output.stop-edges** is set. Issue #8815 + - Rail signals can now be switched into "moving block" mode where they only guard against flanking and oncoming trains. (option **--railsignal-moving-block** or ``). Issue #8518 + - Vehroute-output now includes attribute "priorEdgesLength" if option **--vehroute-output.stop-edges** is set. Issue #8815 - Added option **--emission-output.step-scaled** to write emission output scaled by step length rather than per second. Issue #8866 - Each distinct collision now creates exactly one warning message (even if the situation persists due to **--collision.action warn**). Issue #8918 - Persons with different vClasses are now supported (i.e. 'ignoring' to walk on a forbidden road). Issue #8875 - - Element `` now supports attriubte 'departLane' (i.e. to place a person on the road lane instead of the sidewalk). Issue #8874 + - Element `` now supports attribute 'departLane' (i.e. to place a person on the road lane instead of the sidewalk). Issue #8874 - A warning is now issued if a person is configured to use a vType with the default vehicular vClass 'passenger'. Issue #8922 - Attribute 'latAlignment' now supports numerical values to configure a fixed offset from the center line. Issue #8873 @@ -821,9 +821,9 @@ title: Changes in the 2021 releases (versions 1.9.0, 1.9.1, 1.9.2, 1.10.0 and 1. - Lane changing restrictions are now imported from OSM. To achieve legacy behavior, set option **--ignore-change-restrictions all**. Issue #8221 - Added option **--tls.no-mixed** which prevents building phases where different connections from the same lane have green and red signals. Issue #7821 - Element `` is now supported in an edge `` to pre-configure speed, width and permissions for individual lanes. Issue #7791 - - Merging of overlapping geo-referenced networks with re-occuring ids now works without setting option **--ignore-errors**. Issue #8019 + - Merging of overlapping geo-referenced networks with re-occurring ids now works without setting option **--ignore-errors**. Issue #8019 - When using option **--junctions.join-same** to merge overlapping networks with different junction ids, the option **--edges.join** can now be used to automatically remove duplicate edges. Issue #8019 - - Added option **--railway.topology.repair.minimal**. This works similar to **--railway.topology.repair** but avoids creating bidirectional tracks that are not needed for public transport routes (only applies when using option **--ptline-outut**). Issue #7982 + - Added option **--railway.topology.repair.minimal**. This works similar to **--railway.topology.repair** but avoids creating bidirectional tracks that are not needed for public transport routes (only applies when using option **--ptline-output**). Issue #7982 - Public transport edges that are disconnected from the main road network (in particular railways) are now included in the output when using option **--keep.edges.components 1** as long as they have public transport stops that are written via option **--ptstop-output**. Issue #8061 - Edge types now support attribute 'spreadType'. Issue #7897 - The behavior of option **--geometry.remove** (merging subsequent edges with common attributes) no longer depends on written **--ptstop-output** (stops will be remapped onto merged edges). To enable legacy behavior, the option **--geometry.remove.keep-ptstops** may be set. Issue #8155 diff --git a/docs/web/docs/Contributed/Cadyts.md b/docs/web/docs/Contributed/Cadyts.md index cc1fb07097c6..22a58ff4f24c 100644 --- a/docs/web/docs/Contributed/Cadyts.md +++ b/docs/web/docs/Contributed/Cadyts.md @@ -9,7 +9,7 @@ which you should have, in form of induction loop data and the simulated traffic flows produced by SUMO. It adapts the flows by using the script cadytsIterate.py. -Cadyts is orginally designed to deal with people with different trip plans, +Cadyts is originally designed to deal with people with different trip plans, i.e. each person/agent has different trip plans, including different departure times, activities and duration for each activity etc. In this sense, each person's departure time can be adjusted by choosing different trip plan for @@ -19,12 +19,12 @@ In the SUMO-Cadyts coupling, each person has only one trip plan with single origin and destination as well as fixed departure time. So, departure time will not be adjusted. But, when the scale option is used, the whole demand will be scaled, i.e. the original trips -will be "cloned". Then the scaled trips with the depature times, which +will be "cloned". Then the scaled trips with the departure times, which can result in a better matching to traffic measurements for each given interval, would be selected. The un-selected cloned trips will be treated as "stay at home" and not be used. So, using the scale factor does not mean that the whole scaled demand will be considered in the simulation. The scale -factor should not be too large. Otherweise, the network could be overloaded, +factor should not be too large. Otherwise, the network could be overloaded, and the overall O-D matrix structure would be twisted. For further information please consult the [Cadyts home page](https://github.com/gunnarfloetteroed/java), [CaDyTS: Calibration of Dynamic Traffic Simulations diff --git a/docs/web/docs/Contributed/SUMOPy/GUI/Getting_Started.md b/docs/web/docs/Contributed/SUMOPy/GUI/Getting_Started.md index 5cbcdc7eb7d1..3af4377102e5 100644 --- a/docs/web/docs/Contributed/SUMOPy/GUI/Getting_Started.md +++ b/docs/web/docs/Contributed/SUMOPy/GUI/Getting_Started.md @@ -62,7 +62,7 @@ pressing the `Run` button, network, buildings and routes will be imported. In case the trip file `demo.trip.xml` exists, it will also be imported. -In the same way it is possible to crate an empty scenario under menu +In the same way it is possible to create an empty scenario under menu `Scenario>New...`. ### Browsing the scenario @@ -266,7 +266,7 @@ The SUMOPy internal net-editor provides currently some limited capability to edit the network - The geometry of edges and buildings can be manipulated: Activate the - Move| tool to move or the Stretch| to change vertexes. + Move| tool to move or the Stretch| to change vertices. - With the menu `Network>Clean nodes` all edges entering a node are “cut back” to a certain radius. This measure may facilitate the verification of connections between lanes at junctions. diff --git a/docs/web/docs/Demand/Shortest_or_Optimal_Path_Routing.md b/docs/web/docs/Demand/Shortest_or_Optimal_Path_Routing.md index 0e0b82a4889d..0c250772e021 100644 --- a/docs/web/docs/Demand/Shortest_or_Optimal_Path_Routing.md +++ b/docs/web/docs/Demand/Shortest_or_Optimal_Path_Routing.md @@ -58,7 +58,7 @@ Trips and flows may use the attributes `fromJunction`, `toJunction`, and `viaJun - When defining a `` with [stop](../Definition_of_Vehicles%2C_Vehicle_Types%2C_and_Routes.md#stops_and_waypoints)-elements, routing will performed for each stop (starting a the trip origin or the prior stop) and ending at the destination. - If at least one stop is provided, either one of the `from` or `to` attributes (or `fromJunction`, `fromTaz`, ...) may be omitted. -- If at least two stops are provied both of the `from` and `to` attributes may be omitted (the first stop serves as the origin while the last stop serves as the destination) +- If at least two stops are provided both of the `from` and `to` attributes may be omitted (the first stop serves as the origin while the last stop serves as the destination) - If a a stop with a [`jump`](../Definition_of_Vehicles%2C_Vehicle_Types%2C_and_Routes.md#jumps)-attribute is given, the subsequent part of the route (to the next stop or the destination) will be disconnected ## Mapmatching @@ -159,7 +159,7 @@ the *weight-attribute* must be defined: # Access restrictions -Acces to a network edge is typiclly restricte by the [vehicle class](../Simulation/VehiclePermissions.md) defined in a [vehicle type](../Definition_of_Vehicles%2C_Vehicle_Types%2C_and_Routes.md#vehicle_types) but can also be customized with [numerical restrictions](../Simulation/VehiclePermissions.md#custom_access_restrictions). +Access to a network edge is typiclly restricte by the [vehicle class](../Simulation/VehiclePermissions.md) defined in a [vehicle type](../Definition_of_Vehicles%2C_Vehicle_Types%2C_and_Routes.md#vehicle_types) but can also be customized with [numerical restrictions](../Simulation/VehiclePermissions.md#custom_access_restrictions). # Repair routes diff --git a/docs/web/docs/Developer/How_To/Lane-Changing_Model.md b/docs/web/docs/Developer/How_To/Lane-Changing_Model.md index 751d47bc8342..26fc8cf7087c 100644 --- a/docs/web/docs/Developer/How_To/Lane-Changing_Model.md +++ b/docs/web/docs/Developer/How_To/Lane-Changing_Model.md @@ -36,7 +36,7 @@ Add the files to the [{{SUMO}}/src/microsim/lcmodels/CMakeLists.txt]({{Source}}s ### Updating the XSD schema files so they permit the new model name -All permited models must be defined in [{{SUMO}}/data/xsd/routeTypes.xsd]({{Source}}data/xsd/routeTypes.xsd) in the list of permitted values for the `laneChangeModel` attribute. +All permitted models must be defined in [{{SUMO}}/data/xsd/routeTypes.xsd]({{Source}}data/xsd/routeTypes.xsd) in the list of permitted values for the `laneChangeModel` attribute. ### Registering the model name as possible value diff --git a/docs/web/docs/Developer/Implementation_Notes/Error_Handling.md b/docs/web/docs/Developer/Implementation_Notes/Error_Handling.md index 589ea10eb2ca..d66bd3e1ecea 100644 --- a/docs/web/docs/Developer/Implementation_Notes/Error_Handling.md +++ b/docs/web/docs/Developer/Implementation_Notes/Error_Handling.md @@ -46,13 +46,13 @@ direct feedback (for instance on one way socket connections) we ignore the data (with something like a log message), otherwise we try to give feedback. -*Programming bugs* should be catched in a way that allows to retrack +*Programming bugs* should be caught in a way that allows to retrack them. The user shall not be confronted with any segfaults-popups or things like that. Rather, an error message about an improper behavior shall be printed (currently: "Quitting (on unknown error).") and the application should quit correctly. -*System errors* should be catched and printed to the user. The +*System errors* should be caught and printed to the user. The application should then quit correctly. ### Implementation in command line applications @@ -157,7 +157,7 @@ settings. - There is no check for unused values - WAUT errors - How comes that a tls-switch - output is build though errors - occured? (see + occurred? (see tests/sumo/errors/wauts/cross3ltl_error_unknown_wautid) - The programs are checked in a lazy way, the error is reported too late (see diff --git a/docs/web/docs/FAQ.md b/docs/web/docs/FAQ.md index 446d170d9333..a6525f59f687 100644 --- a/docs/web/docs/FAQ.md +++ b/docs/web/docs/FAQ.md @@ -1057,6 +1057,9 @@ The tool [attributeStats.py](Tools/Output.md#attributestatspy) can be used to ge i.e. if simulations where run with the option `/`, the command `tools/output/attributeStats.py *.stats.xml` will generate statistics on each of the attributes in the statistic-output file over all runs. +The tool [attributeCompare.py](Tools/Output.md#attributecomparepy) can be used if the attribute of interest must be grouped. An example would be to obtain averaged traffic data for each individual edge and hour in an hourly [edgeData-output](Simulation/Output/Lane-_or_Edge-based_Traffic_Measures.md). The following command groups each of the traffic attributes by edge id and interval begin time: +`tools/output/attributeCompare.py *.ed.xml -o output.xml -i id,begin + ### How to simulate autonomous vehicles? All vehicles in SUMO are autonomous (in the sense of having their routes, speeds and lane changing decision controlled by a computer algorithm). diff --git a/docs/web/docs/Installing/index.md b/docs/web/docs/Installing/index.md index 58ca59f930ab..f26231f1e5fd 100644 --- a/docs/web/docs/Installing/index.md +++ b/docs/web/docs/Installing/index.md @@ -79,7 +79,7 @@ Send bug reports regarding SUMO packaged as Flatpak [here](https://github.com/fl # macOS -SUMO can be easily installed on macOS by using [Homebrew](https://brew.sh). If you did not already install homebrew, you can do so by invoking te following command in a macOS Terminal: +SUMO can be easily installed on macOS by using [Homebrew](https://brew.sh). If you did not already install homebrew, you can do so by invoking the following command in a macOS Terminal: ``` /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ``` @@ -98,7 +98,7 @@ brew tap dlr-ts/sumo brew install sumo ``` !!! note - It is possible to install older vesions of SUMO using Homebrew. Running `brew search sumo` will list all available versions (v1.0.1 or newer). To install a specific version (e.g. version 1.9.0), just run `brew install sumo@1.9.0`. + It is possible to install older versions of SUMO using Homebrew. Running `brew search sumo` will list all available versions (v1.0.1 or newer). To install a specific version (e.g. version 1.9.0), just run `brew install sumo@1.9.0`. If you need to compile SUMO with support for other libraries, such as GDAL, you need to provide further command line options [as described here](https://github.com/DLR-TS/homebrew-sumo#usage). To finalize your setup, please make sure to set the **SUMO_HOME** environment variable and have it point to the directory of your SUMO installation. Depending on your shell, you may set this variable either in `.bashrc` or `.zshrc`. To set this variable in `.bashrc` you can use the following commands. diff --git a/docs/web/docs/Netedit/editModesNetwork.md b/docs/web/docs/Netedit/editModesNetwork.md index 96218a7618f3..42396bfb8753 100644 --- a/docs/web/docs/Netedit/editModesNetwork.md +++ b/docs/web/docs/Netedit/editModesNetwork.md @@ -217,7 +217,7 @@ Creation of polygon. ![](../images/ModePolygon4ClosingShape.png) Polygon with shape closed. -The points of a shape can be edited in the Move mode by clicking on the outline to create a new point or above an already existing one in order to modify its position. If a point moves to the same position of an adjacent point, they fuse together, and if the final point moves to the position of the initial point, the polygon gets closed. If the polygon has the option “block shape” activated, it won’t be editable, but only moved as a set. +The points of a shape can be edited in the Move mode by clicking on the outline to create a new point or above an already existing one in order to modify its position. If a point moves to the same position of an adjacent point, they fuse together, and if the final point moves to the position of the initial point, the polygon gets closed. If the polygon has the option “block shape” activated, it won't be editable, but only moved as a set. ![](../images/ModePolygon5MovingVertex.png) Moving Polygon's shape point. diff --git a/docs/web/docs/Networks/Further_Outputs.md b/docs/web/docs/Networks/Further_Outputs.md index d21267fc6fb0..84ad17cc6e90 100644 --- a/docs/web/docs/Networks/Further_Outputs.md +++ b/docs/web/docs/Networks/Further_Outputs.md @@ -51,7 +51,7 @@ are optional and only serve to enhance human reader comprehension. The *train,subway,light_rail,monorail,trolleybus,aerialway,ferry*). The **line** attribute will be used in the simulation when distinguishing public transport lines. The optional **completeness** attribute serves to -inform the human reader that the stops only descibe 11% of the complete +inform the human reader that the stops only describe 11% of the complete line. Incomplete lines are typical when importing only a part of the complete public transport network. diff --git a/docs/web/docs/Networks/Import/ArcView.md b/docs/web/docs/Networks/Import/ArcView.md index 1da1c1739a17..d33d122c8ddf 100644 --- a/docs/web/docs/Networks/Import/ArcView.md +++ b/docs/web/docs/Networks/Import/ArcView.md @@ -19,6 +19,10 @@ network stored in "my_shape_files.shp", "my_shape_files.shx", netconvert --shapefile-prefix my_shape_files ``` +**netconvert** supports [virtual file systems](https://gdal.org/en/latest/user/virtual_file_systems.html) when +importing shape files. So if you have your shapes in myshapes.zip and the main file has the name arcview.shp +you can import them via `netconvert --shapefile /vsizip/myshapes.zip/arcview` (**--shapefile** is an alias to **--shapefile-prefix**). + Unfortunately, shape files describe how information is stored physically, but neither which is stored nor how the entries of the according database (\*.dbf) are named. Due to this, one has to examine @@ -67,7 +71,7 @@ to describe the edges' attributes. In this case, the column to retrieve an according street's type name from must be named using **--shapefile.type-id** {{DT_IDList}} and a [SUMO edge type file](../../SUMO_edge_type_file.md) must be given to [netconvert](../../netconvert.md) using **--type-files** {{DT_FILE}}. If something fails with the -types or the explicit values, it can be catched using **--shapefile.use-defaults-on-failure**. In these cases, +types or the explicit values, it can be caught using **--shapefile.use-defaults-on-failure**. In these cases, the default [netconvert](../../netconvert.md) values are used. Besides this, it is possible to load own [connection descriptions](../../Networks/PlainXML.md#connection_descriptions). @@ -240,7 +244,7 @@ reality, as the next picture shows: on-/off-ramps** Furthermore, all streets are unidirectional - even highways. This makes -the network not usable for traffic simulations when left in the orignal +the network not usable for traffic simulations when left in the original state. Trying to convert the network with **--arcview.all-bidi**, that means trying to insert edges bidirectional, makes the city usable, but the highways are even worse, now, because also the on-/off-ramps are bidirectional, then... diff --git a/docs/web/docs/Networks/Import/OpenStreetMap.md b/docs/web/docs/Networks/Import/OpenStreetMap.md index b95d24fc134b..09c571b6dfff 100644 --- a/docs/web/docs/Networks/Import/OpenStreetMap.md +++ b/docs/web/docs/Networks/Import/OpenStreetMap.md @@ -493,7 +493,7 @@ additional type maps from !!! caution The values in those type maps were set-up ad-hoc and are not yet verified. It would be a great help if someone would revisit and improve them. Please let us know. -## Explicite Road Attributes +## Explicit Road Attributes In case an edge contains the definition about the number of lanes (key="*lanes*") or the allowed speed (key="*maxspeed*"), this @@ -664,7 +664,7 @@ Python Example (Get OSM River Data from OSM in BBox) Caution: If the data volume is too large, the overpass API aborts. -More information about the query syntax and a GUI for testing the querys +More information about the query syntax and a GUI for testing the queries can be found on the website . # Importing other formats (pbf, o5m) diff --git a/docs/web/docs/Networks/Import/OpenStreetMapDownload.md b/docs/web/docs/Networks/Import/OpenStreetMapDownload.md index adfb477d2c15..948a9a0b16ca 100644 --- a/docs/web/docs/Networks/Import/OpenStreetMapDownload.md +++ b/docs/web/docs/Networks/Import/OpenStreetMapDownload.md @@ -79,7 +79,7 @@ NE-corner: 13.471 52.552 ## Download the area Construct an [URI (web -adress)](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier) from +address)](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier) from the geo-coordinates and download the data from that URI. The URI takes the following form: @@ -93,7 +93,7 @@ for the above example this becomes https://api.openstreetmap.org/api/0.6/map?bbox=13.278,52.473,13.471,52.552 ``` -you can download your data by entering the URI in a web-browers or by +you can download your data by entering the URI in a web-browser or by using another program such as [wget](http://wget.addictivecode.org/). ``` diff --git a/docs/web/docs/Networks/Import/VISUM.md b/docs/web/docs/Networks/Import/VISUM.md index 1bd9c769ef92..9ba734202903 100644 --- a/docs/web/docs/Networks/Import/VISUM.md +++ b/docs/web/docs/Networks/Import/VISUM.md @@ -22,7 +22,7 @@ netconvert --visum my_visum_net.net -o my_sumo_net.net.xml ``` !!! caution - If your network contains geo-coordiantes (lon/lat) you must add option **--proj.utm** in order to project your network into the cartesian plane + If your network contains geo-coordinates (lon/lat) you must add option **--proj.utm** in order to project your network into the cartesian plane # Import Coverage diff --git a/docs/web/docs/Networks/Import/Vissim.md b/docs/web/docs/Networks/Import/Vissim.md index 8c8d8794ebb4..f62f7d48499e 100644 --- a/docs/web/docs/Networks/Import/Vissim.md +++ b/docs/web/docs/Networks/Import/Vissim.md @@ -31,7 +31,7 @@ During import, different actions must be done which may yield in some loss of data and may be watched in part by setting the verbose option. As of **SVN revision \[18592\]** the import parser used by netconvert -was extended to accomodate for the new XML input file format (`*.inpx`) +was extended to accommodate for the new XML input file format (`*.inpx`) of VISSIM version \>= 6 (which makes a lot of things a lot easier)... # Advice on VISSIM network structure diff --git a/docs/web/docs/Simulation/Basic_Definition.md b/docs/web/docs/Simulation/Basic_Definition.md index 2b5a56e6f6aa..e3f3060e93c2 100644 --- a/docs/web/docs/Simulation/Basic_Definition.md +++ b/docs/web/docs/Simulation/Basic_Definition.md @@ -45,7 +45,7 @@ You may also give routes including vehicle definitions as {{AdditionalFile}} to ## Additional Files -One ore more {{AdditionalFile}}(s) are used to load additional entities: +One or more {{AdditionalFile}}(s) are used to load additional entities: - infrastructure related things: [traffic light programs](../Simulation/Traffic_Lights.md), [induction diff --git a/docs/web/docs/Simulation/Bicycles.md b/docs/web/docs/Simulation/Bicycles.md index 51fff4bc57fe..51463a414c79 100644 --- a/docs/web/docs/Simulation/Bicycles.md +++ b/docs/web/docs/Simulation/Bicycles.md @@ -139,7 +139,7 @@ A third option which can be used if no edge types are available is a heuristic b ### Permission-based generation -Option **--bikelanes.guess.from-permissons** {{DT_BOOL}} is suitable for networks which specify their edge permissions (such as [DlrNavteq](../Networks/Import/DlrNavteq.md)). It adds a bike lane for all edges which allow bicycles on any of their lanes. The option **--bikelanes.guess.exclude** {{DT_IDList}}[,{{DT_IDList}}\]* applies here as well. +Option **--bikelanes.guess.from-permissions** {{DT_BOOL}} is suitable for networks which specify their edge permissions (such as [DlrNavteq](../Networks/Import/DlrNavteq.md)). It adds a bike lane for all edges which allow bicycles on any of their lanes. The option **--bikelanes.guess.exclude** {{DT_IDList}}[,{{DT_IDList}}\]* applies here as well. ### Adding bike lanes with [netedit](../Netedit/index.md) diff --git a/docs/web/docs/Simulation/Distances.md b/docs/web/docs/Simulation/Distances.md index 8f5cf7a766e7..5cfcdd3e5a62 100644 --- a/docs/web/docs/Simulation/Distances.md +++ b/docs/web/docs/Simulation/Distances.md @@ -18,7 +18,7 @@ By default, the length of a straight edge corresponds to the euclidean distance between its start and end positions (x,y). However, lengths of edges and lanes can be different from the euclidean -distance (referred to as a **length-geometry-mismtach**) and there are several reasons why this occurs. +distance (referred to as a **length-geometry-mismatch**) and there are several reasons why this occurs. [sumo-gui](../sumo-gui.md#edgelane_visualisation_settings) and [netedit](../Netedit/index.md) can be configured to color lanes by ''by given length/geometrical length'' which highlights the mismatch between both distance values. @@ -32,7 +32,7 @@ The assigned length is set to the average length of all lanes of that edge. For curved edges, this introduces a mismatch between geometrical length and driving distance because outer lanes in a curve are longer than inner lanes. -The main architectural reason for enforcing the same length for all lanes is the great simplificaiton this brings to lane-changing computation. +The main architectural reason for enforcing the same length for all lanes is the great simplification this brings to lane-changing computation. !!! note since version 1.9.0 internal lanes for multi-lane turning connections (linkDir != 's') permit different lengths. Lane changing is forbidden while a vehicle is on such lanes. diff --git a/docs/web/docs/Simulation/Output/Amitran_Traffic_Measures.md b/docs/web/docs/Simulation/Output/Amitran_Traffic_Measures.md index 7dc4ebac4907..b387f7c50a4b 100644 --- a/docs/web/docs/Simulation/Output/Amitran_Traffic_Measures.md +++ b/docs/web/docs/Simulation/Output/Amitran_Traffic_Measures.md @@ -23,7 +23,7 @@ file="" \[vTypes=""\] \[excludeEmpty="true"\]/\> | period (alias freq) | int (time) | The aggregation period the values the detector collects shall be summed up. If not given, the whole time range between begin and end is aggregated | | begin | int (time) | The time to start writing (intervals starting before this time are discarded). If not given, the simulation's begin is used. | | end | int (time) | The time to end writing (intervals starting at or after this time are discarded). If not given the simulation's end is used. | -| vTypes | string | A space separated ist of vehicle types to collect data for. If not given, collect for all types. | +| vTypes | string | A space separated list of vehicle types to collect data for. If not given, collect for all types. | | excludeEmpty | string (true, false, defaults) | If set to true, edges/lanes which were not used by a vehicle during this period will not be written; *default: false*. If set to "defaults" default values for travel time and emissions depending on edge length and maximum speed get printed. | ## Generated Output diff --git a/docs/web/docs/Simulation/Output/Binary.md b/docs/web/docs/Simulation/Output/Binary.md index 519aaa7b6063..d67baf4267ef 100644 --- a/docs/web/docs/Simulation/Output/Binary.md +++ b/docs/web/docs/Simulation/Output/Binary.md @@ -23,7 +23,7 @@ the *.sbx* extension (for all other extensions, XML is assumed). The format is XML and TraCI inspired and aims to be self contained (can be read without additional information from a network etc.). -Every data item is preceeded by a single byte describing the type which +Every data item is preceded by a single byte describing the type which is one of the following: - Byte (single unsigned byte, also used for boolean values) @@ -35,7 +35,7 @@ is one of the following: having a possibly different type stated up front) - XML-Element-Start (two bytes referring to the element list) - XML-Element-End (no data, just an indicator) -- XML-Attribut (two bytes referring to the attribute list, see below) +- XML-Attribute (two bytes referring to the attribute list, see below) - Edge (32bit integer referring to the edge list, currently unused) - Lane (32bit integer referring to the edge list, followed by a single byte encoding the index, currently unused) @@ -45,7 +45,7 @@ is one of the following: - Node-Type (single byte referring to the respective list, see below) - Edge-Function (single byte referring to the respective list, see below) -- Route (32bit integer encoding length (n), followed by bineary +- Route (32bit integer encoding length (n), followed by binary encoded route, see below) - Scaled Integer (32bit int, fixed point float with two decimals) - Scaled Position2D (2 32bit int, analogue Position2D fixed point @@ -54,7 +54,7 @@ is one of the following: float with two decimals) The change from version 1 to version 2 consisted of an "upgrade" of -XML-Element-Start and XML-Attribut to two bytes (least significant +XML-Element-Start and XML-Attribute to two bytes (least significant first) whereas the explicit reference to the XML-element is now omitted from XML-Element-End. Please note that encoding shapes binary may increase file size because small nets only need 7 bytes per coordinate @@ -88,7 +88,7 @@ strings) - Simple = Byte | Integer | Double | String | List | Edge | Lane | Position2D | Position3D | Color | Node-Type | Edge-Function | Route - - XMLContent = XML-Element-Start (XML-Attribut Simple)\* + - XMLContent = XML-Element-Start (XML-Attribute Simple)\* XMLContent\* XML-ELement-End - no comments or whitespace, no character data diff --git a/docs/web/docs/Simulation/Output/EmissionOutput.md b/docs/web/docs/Simulation/Output/EmissionOutput.md index af4f26d553f1..d851fe07f8a2 100644 --- a/docs/web/docs/Simulation/Output/EmissionOutput.md +++ b/docs/web/docs/Simulation/Output/EmissionOutput.md @@ -75,8 +75,8 @@ The meanings of the written values are given in the following table. | pos | meters | The vehicle position measured from the start of the current lane | | speed | m/s | The speed of the vehicle | | angle | degree | The angle of the vehicle | -| pos_x | \--- | The absolut X coordinate of the vehicle. The value depends on the given geographic projection. | -| pos_y | \--- | The absolut Y coordinate of the vehicle. The value depends on the given geographic projection. | +| pos_x | \--- | The absolute X coordinate of the vehicle. The value depends on the given geographic projection. | +| pos_y | \--- | The absolute Y coordinate of the vehicle. The value depends on the given geographic projection. | !!! caution When running with sub-second resolution, the emissions written during every simulation step are extrapolated to those that would be generated in 1 second. To avoid scaling (and thus simplify aggregation), set option **--emission-output.step-scaled** diff --git a/docs/web/docs/Simulation/Output/FullOutput.md b/docs/web/docs/Simulation/Output/FullOutput.md index 9be453e61717..de583740c94a 100644 --- a/docs/web/docs/Simulation/Output/FullOutput.md +++ b/docs/web/docs/Simulation/Output/FullOutput.md @@ -94,8 +94,8 @@ The meanings of the written values are given in the following table. | pos | meters | The position of the vehicle on a specific lane (distance of the front bumper from the start of the lane) | | speed | m/s | The current speed of the vehicle | | angle | degree | The angle of the vehicle | -| pos_x | \--- | The absolut X coordinate of the vehicle (center of front bumper). The value depends on the given geographic projection. | -| pos_y | \--- | The absolut Y coordinate of the vehicle (center of front bumper). The value depends on the given geographic projection | +| pos_x | \--- | The absolute X coordinate of the vehicle (center of front bumper). The value depends on the given geographic projection. | +| pos_y | \--- | The absolute Y coordinate of the vehicle (center of front bumper). The value depends on the given geographic projection | | traveltime | seconds | The mean travel time on the specific lane | | fuel\@lane | l/km/h | The fuel consumption on the specific lane | | maxspeed | m/s | The maximum speed of the vehicles on the specific lane | diff --git a/docs/web/docs/Simulation/Output/Induction_Loops_Detectors_(E1).md b/docs/web/docs/Simulation/Output/Induction_Loops_Detectors_(E1).md index fda52f6e4b7f..dc794e060359 100644 --- a/docs/web/docs/Simulation/Output/Induction_Loops_Detectors_(E1).md +++ b/docs/web/docs/Simulation/Output/Induction_Loops_Detectors_(E1).md @@ -71,7 +71,7 @@ The values are described in the following table. | id | id | The id of the detector | | nVehContrib | \#vehicles | The number of vehicles that have completely passed the detector within the interval | | flow | \#vehicles/hour | The number of contributing vehicles extrapolated to an hour | -| occupancy | % | The percentage (0-100%) of the time a vehicle was at the detector. If multiple vehicles are on the detector simulataneously (due to its length or in sublane simulation), values above 100 are possible) | +| occupancy | % | The percentage (0-100%) of the time a vehicle was at the detector. If multiple vehicles are on the detector simultaneously (due to its length or in sublane simulation), values above 100 are possible) | | speed | m/s | The arithmetic mean of the velocities of all completely collected vehicles (-1 indicates that no vehicles were collected). This gives the time mean speed. | | harmonicMeanSpeed | m/s | The harmonic mean of the velocities of all completely collected vehicles (-1 indicates that no vehicles were collected). This gives the space mean speed. | | length | m | The mean length of all completely collected vehicles (-1 indicates that no vehicles were collected). | diff --git a/docs/web/docs/Simulation/Output/Lane-_or_Edge-based_Emissions_Measures.md b/docs/web/docs/Simulation/Output/Lane-_or_Edge-based_Emissions_Measures.md index 7294484e380a..2c9b60b86934 100644 --- a/docs/web/docs/Simulation/Output/Lane-_or_Edge-based_Emissions_Measures.md +++ b/docs/web/docs/Simulation/Output/Lane-_or_Edge-based_Emissions_Measures.md @@ -121,7 +121,7 @@ Notes: ## See Also -- [edge/lane-based network performace measures +- [edge/lane-based network performance measures output](../../Simulation/Output/Lane-_or_Edge-based_Traffic_Measures.md) and [edge/lane-based vehicular noise emission output](../../Simulation/Output/Lane-_or_Edge-based_Noise_Measures.md) diff --git a/docs/web/docs/Simulation/Output/Lane-_or_Edge-based_Traffic_Measures.md b/docs/web/docs/Simulation/Output/Lane-_or_Edge-based_Traffic_Measures.md index 6a0df309824f..1b0426d621e8 100644 --- a/docs/web/docs/Simulation/Output/Lane-_or_Edge-based_Traffic_Measures.md +++ b/docs/web/docs/Simulation/Output/Lane-_or_Edge-based_Traffic_Measures.md @@ -66,7 +66,7 @@ For additional attributes see the table below. ### Simplified definition -If none of the addional attributes listed above are needed, a meandata definition can be declared without defining an additional file by setting one of the following options: +If none of the additional attributes listed above are needed, a meandata definition can be declared without defining an additional file by setting one of the following options: - **--edgedata-output** FILENAME - **--lanedata-output** FILENAME diff --git a/docs/web/docs/Simulation/Output/SSM_Device.md b/docs/web/docs/Simulation/Output/SSM_Device.md index 9c05d83a8b55..5466c7d63eb9 100644 --- a/docs/web/docs/Simulation/Output/SSM_Device.md +++ b/docs/web/docs/Simulation/Output/SSM_Device.md @@ -17,6 +17,9 @@ For instance, a single vehicle can be equipped (with a device parametrized by de ``` +## Preparing the network file +The SSM device makes use of the [right-of-way information](../../Networks/SUMO_Road_Networks.md#junctions_and_right-of-way) of the intersections to derive some of the measures. It uses the foe matrix of the right-of-way definition to extract crossing and merging paths. If an intersection is set to **unregulated**, this information is not available and thus e.g. no PET measure can be computed for this intersection. + ## Output File The SSM device generates an output file (one for each vehicle named `ssm_.xml` per default, but several vehicles may write to the same file). @@ -36,8 +39,8 @@ The detail of information given for each conflict and the criteria to qualify an ... - - + + @@ -150,7 +153,7 @@ For crossing and merging situations, we consider "expected" entry and exit times For the calculation of those times for the approaching vehicles, we take into account the current deceleration of the vehicles, if the vehicle is not decelerating, the current speed is extrapolated as a constant (i.e., acceleration is only considered if it is negative). -For some reference to definitions of SSMs see for instance [Guido et al. (2011) "Safety performance measures: a comparison between microsimulation and observational data"] or [Mahmud et al. (2016) "Application of proximal surrogate indicators for safety evaluation: A review of recent developments and research needs"] +For some reference to definitions of SSMs see for instance [Guido et al. (2011) "Safety performance measures: a comparison between microsimulation and observational data"](https://doi.org/10.1016/j.sbspro.2011.08.027) or [Mahmud et al. (2016) "Application of proximal surrogate indicators for safety evaluation: A review of recent developments and research needs"](https://doi.org/10.1016/j.iatssr.2017.02.001). ### TTC The time-to-collision is defined for all follow-lead situations for which the follower is faster than the leader. It is given as @@ -295,17 +298,17 @@ Elements of type `` hold the following information in their child elem | | position | 2D-coordinate | Coordinate of the corresponding conflict point. | --device.ssm.measures "TTC" | | | type | integer (Encounter type code) | [Type code](#encounter_types) of the corresponding encounter type. (Defines the variant of [TTC-calculation](#ttc).) | --device.ssm.measures "TTC" | | | value | float >= 0 | The minimal measured TTC-value. | --device.ssm.measures "TTC" | -| | speed | float >= 0 | The speed of the reporting vehicle at the occurence of minTTC.| --device.ssm.measures "TTC" | +| | speed | float >= 0 | The speed of the reporting vehicle at the occurrence of minTTC.| --device.ssm.measures "TTC" | | maxDRAC | time | float | Time point of the maximal measured value for the DRAC. | --device.ssm.measures "DRAC" | | | position | 2D-coordinate | Coordinate of the corresponding conflict point. | --device.ssm.measures "DRAC" | | | type | integer (Encounter type code) | [Type code](#encounter_types) of the corresponding encounter type. (Defines the variant of [DRAC-calculation](#drac).) | --device.ssm.measures "DRAC" | | | value | float >= 0 | The maximal measured DRAC-value. | --device.ssm.measures "DRAC" | -| | speed | float >= 0 | The speed of the reporting vehicle at the occurence of maxDRAC.| --device.ssm.measures "DRAC" | +| | speed | float >= 0 | The speed of the reporting vehicle at the occurrence of maxDRAC.| --device.ssm.measures "DRAC" | | PET | time | float | Time point of the minimal measured value for the PET. (Usually the PET is only measured once, therefore no PETSpan is reported.) | --device.ssm.measures "PET" | | | position | 2D-coordinate | Coordinate of the corresponding encroachment point. | --device.ssm.measures "PET" | | | type | integer (Encounter type code) | [Type code](#encounter_types) of the corresponding encounter type. | --device.ssm.measures "PET" | | | value | float >= 0 | The measured PET-value. | --device.ssm.measures "PET" | -| | speed | float >= 0 | The speed of the reporting vehicle at the occurence of PET. | --device.ssm.measures "PET" | +| | speed | float >= 0 | The speed of the reporting vehicle at the occurrence of PET. | --device.ssm.measures "PET" | The `` element has the following structure: @@ -341,7 +344,7 @@ junction:junctionID1 junction:junctionID2 ... ``` -The edges adjoining the given junctions and the given edges are used to measure the conflicts. Only conflicts occuring at these edges are measured and outputed. +The edges adjoining the given junctions and the given edges are used to measure the conflicts. Only conflicts occurring at these edges are measured and outputted. ## TraCI diff --git a/docs/web/docs/Simulation/Output/TripInfo.md b/docs/web/docs/Simulation/Output/TripInfo.md index 191aed7bb0f2..22526b2e98fc 100644 --- a/docs/web/docs/Simulation/Output/TripInfo.md +++ b/docs/web/docs/Simulation/Output/TripInfo.md @@ -176,7 +176,7 @@ The attributes within the stages have the following meaning: | Name | Type | Description | | ----------- | -------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -| `depart` | (simulation) seconds | The departure time for this stage. For `,`, this is the time where the vehicle is entered. (-1 if the vehicl wasn't entered) | +| `depart` | (simulation) seconds | The departure time for this stage. For `,`, this is the time where the vehicle is entered. (-1 if the vehicle wasn't entered) | | `arrival` | (simulation) seconds | The arrival time for this stage N.B. In stop stages this is the time at which the stage ends i.e. after the duration time period (-1 if the stage did not start) | | `arrivalPos` | m | The arrival position on the destination edge for this stage | | `duration` | (simulation) seconds | For walking and stopping, this is time spent in that stage. For a riding stage, this **only** is the time spent inside the vehicle. (-1 if the stage did not start or the person did not enter the vehicle) | diff --git a/docs/web/docs/Simulation/Pedestrians.md b/docs/web/docs/Simulation/Pedestrians.md index c3fcb007bdbc..8da868b15056 100644 --- a/docs/web/docs/Simulation/Pedestrians.md +++ b/docs/web/docs/Simulation/Pedestrians.md @@ -238,7 +238,7 @@ demand by setting option **--persontrips**. ## From local counting data -The tools [routeSampler](../Tools/Turns.md#routesamplerpy) and [flowrouter](../Tools/Detector.md#flowrouterpy) both suppor option **--pedestrians** to generate pedestrians instead of vehicular traffic based on countint data. See also [Choosing the right tool](../Demand/Routes_from_Observation_Points.md#choosing_the_right_tool). +The tools [routeSampler](../Tools/Turns.md#routesamplerpy) and [flowrouter](../Tools/Detector.md#flowrouterpy) both support the option **--pedestrians** to generate pedestrians instead of vehicular traffic based on counting data. See also [Choosing the right tool](../Demand/Routes_from_Observation_Points.md#choosing_the_right_tool). # Pedestrian-related Attributes See [Person attributes](../Specification/Persons.md#available_vtype_attributes) diff --git a/docs/web/docs/Simulation/Rail_signals.md b/docs/web/docs/Simulation/Rail_signals.md index e847ba494f3d..377745d9ce00 100644 --- a/docs/web/docs/Simulation/Rail_signals.md +++ b/docs/web/docs/Simulation/Rail_signals.md @@ -27,7 +27,7 @@ If one uses a rail network (here, we mean a network consisting exclusively of [edges that allow only](../Networks/PlainXML.md#edge_descriptions) trains) within its simulation, it is not required to use rail signals. -Instead one could choose all junctions withing this network to be of the +Instead one could choose all junctions within this network to be of the type *priority*, which results, however, in an unrealistic behavior of the rail traffic. To achieve a more realistic behavior, one can make use of rail signals. For that, one can split a longer rail section diff --git a/docs/web/docs/Simulation/Railways.md b/docs/web/docs/Simulation/Railways.md index e3c32c757855..4c6159819a45 100644 --- a/docs/web/docs/Simulation/Railways.md +++ b/docs/web/docs/Simulation/Railways.md @@ -372,7 +372,7 @@ Rail signals perform the following safety functions automatically Functionality **a)** corresponds to the "classic" safety behavior of rail signals ([PZB](https://en.wikipedia.org/wiki/Punktf%C3%B6rmige_Zugbeeinflussung)). When option **--railsignal-moving-block** is set or individual signals are configured with parameter *moving-block* (see below), feature **a)** is disabled and trains will use their configured carFollowModel (i.e. 'Rail') for distance keeping. This is similar to the [LZB](https://en.wikipedia.org/wiki/Linienzugbeeinflussung) safety system when used with extremely short virtual blocks. -To switch a single signal into moving-block-mode, the following additional file may be loaded: +To switch a signal into moving-block-mode, the following additional file may be loaded: ```xml @@ -417,6 +417,39 @@ This constrain defines that a given vehicle id (or tripId) can only be inserted ### constraints generation Constraints can be generated using the tool [generateRailSignalConstraints.py](../Tools/Railways.md#generaterailsignalconstraintspy) by using a route file with [stops that define a schedule](Public_Transport.md#public_transport_schedules). +# Deadlocks + +If the graph of relationships between trains that wait for another train ever forms a circle, then no train can ever advance and the simulation is in a state of deadlock. +The default behavior of rail signals is to anticipate most such problems and prevent a train from passing a signal if that movement would form a deadlock. +However, the default logic only handles the most common cases that involve two or three trains (and a few situations with four trains). + +- Deadlocks may appear from an interplay of four or more trains. +- The signal logic does not prevent deadlocks that involve loaded [signal constraints](#schedule_constraints) + +The deal with deadlock problems, the simulation provides multiple strategies explained in the following. + +## Deadlock detection + +By setting option **--time-to-teleport.railsignal-deadlock TIME** deadlocks are detected if one of the vehicles involved has been waiting for the given TIME. +If option **--deadlock-output FILE** is also set, then any detected deadlocks will be written to the given file. + +## Deadlock resolution + +In case a deadlock is detected, the vehicle that has been waiting in this deadlock for the longest time will be teleported to the next available network edge to break the deadlock. +If option **--time-to-teleport.remove** is set, the vehicle will instead be removed from the simulation. + +By setting option **--time-to-teleport.remove-constraint**, a constraint involved in the deadlock will be deactivated to break the deadlock rather than teleporting or removing a vehicle. This option is highly recommended when working with constraints. But doesn't take effect otherwise. + +If option **--deadlock-output FILE** is set, then the deactivated constraint will also be included in the recorded deadlock. + +## Deadlock prevention + +The prevent complex deadlocks that happened without the use of constraints, the recorded deadlocks from a previous simulation can be loaded as an additional file. +This will selectively add additional checks to the rail signal logic to prevent any deadlock constelation among the list of signals that were part of the recorded deadlocks. + +!!! caution + The deadlock file must be loaded before any trains (which is only an issue if trains are loaded with option **--additional-files**). + # TraCI Rail signals and rail crossings can be controlled with function *traci.trafficlight.setRedYellowGreenState*. They can also be switched off with *traci.trafficlight.setProgram(tlsID, "off")*. In either case, normal operations can be resumed by reactivating the default program "0": *traci.trafficlight.setProgram(tlsID, "0")*. diff --git a/docs/web/docs/Simulation/Randomness.md b/docs/web/docs/Simulation/Randomness.md index ef6fc3b75bb7..2927ce96a9ee 100644 --- a/docs/web/docs/Simulation/Randomness.md +++ b/docs/web/docs/Simulation/Randomness.md @@ -52,7 +52,7 @@ makes vehicles drive with that factor of the current speed limit. The attribute also allows the specification of the parameters of a normal distribution with optional cutoffs. The random value is selected once for each vehicle at the time of its creation. Using a speed deviation is -the recommended way for getting a heterogenous mix of vehicle speeds. +the recommended way for getting a heterogeneous mix of vehicle speeds. By default, a speed distribution with a standard deviation of 10% is active. For details, see [speed distribution](../Definition_of_Vehicles,_Vehicle_Types,_and_Routes.md#speed_distributions) @@ -100,11 +100,11 @@ The number of vehicles inserted this way will follow the [Poisson distribution]( The following 2 sections describe attributes for random flows that apply to [duarouter](../duarouter.md) and [sumo](../sumo.md). They are quite similar to [flows with a random number of vehicles](#flows_with_a_random_number_of_vehicles) but substitute the `number` attribute for the `end` attribute. ## Bernoulli Process -By definining a `` with attributes `number` and `probability` (instead of `vehsPerHour,number`, or `period`), +By defining a `` with attributes `number` and `probability` (instead of `vehsPerHour,number`, or `period`), a vehicle will be emitted randomly with the given probability each second until the specified number is reached. ## Poisson Process -By definining a `` with attributes `number` and `period="exp(X)"` (instead of `vehsPerHour,number`, or `period`), +By defining a `` with attributes `number` and `period="exp(X)"` (instead of `vehsPerHour,number`, or `period`), vehicles will emitted with random time-gaps that follow an exponential distribution until the specified number is reached. ## Router options diff --git a/docs/web/docs/Simulation/Stationfinder.md b/docs/web/docs/Simulation/Stationfinder.md index 10a3235d5f92..e51cf97f9f87 100644 --- a/docs/web/docs/Simulation/Stationfinder.md +++ b/docs/web/docs/Simulation/Stationfinder.md @@ -87,7 +87,7 @@ element of the form ` value=`s) diff --git a/docs/web/docs/Specification/Persons.md b/docs/web/docs/Specification/Persons.md index b5bb878a586b..93b7034e17e6 100644 --- a/docs/web/docs/Specification/Persons.md +++ b/docs/web/docs/Specification/Persons.md @@ -24,7 +24,7 @@ below. Each person must have at least one stage in its plan. ``` -## Availabe Person Attributes +## Available Person Attributes | Attribute | Type | Range | Default | Remark | |---------------------|-----------|--------------------|-----------------|---------------------------| diff --git a/docs/web/docs/Specification/index.md b/docs/web/docs/Specification/index.md index a29ad156a104..2357d1478edc 100644 --- a/docs/web/docs/Specification/index.md +++ b/docs/web/docs/Specification/index.md @@ -79,7 +79,7 @@ created at time "begin". The id of the created vehicles is Types define physical parameters such as length, acceleration, deceleration and maximum speed and give a list of categories cars of -this type belong to. All theses parameters are identical among all +this type belong to. All these parameters are identical among all vehicles of a type. diff --git a/docs/web/docs/Tools/Drt.md b/docs/web/docs/Tools/Drt.md index abb455ab15eb..d1d45648bb53 100644 --- a/docs/web/docs/Tools/Drt.md +++ b/docs/web/docs/Tools/Drt.md @@ -100,7 +100,7 @@ Also [pre-booking](../Simulation/Taxi.md#prebooking) is possible. | **-i --interval** | int (seconds)| 30s | time interval for collecting requests, if there are new requests after this interval the solver starts | | **-n --nogui** | bool | false | if true, uses only the command line version of sumo, else uses sumo-gui | | **-v --verbose** | bool | false | prints more information about the dispatch calculation | -| **-t --time-limit** | int (seconds) | 10s | maximum time for the solver to calculate a singe dispatch problem | +| **-t --time-limit** | int (seconds) | 10s | maximum time for the solver to calculate a single dispatch problem | | **-d --cost-type** | str('distance' or 'time') | distance | defines if distance or time is used as costs for the dispatch | | **-f --drf** | float | 1.5 | direct route factor: factor for maximum allowed cost for the route of a request in relation to the minimum possible cost (of the direct route); use '-1' to ignore this constraint | | **-a --fix-allocation** | bool | false | if true: as soon as a solution was found and a request was assigned to a taxi, this assignment keeps up for all following calculations | diff --git a/docs/web/docs/Tools/Routes.md b/docs/web/docs/Tools/Routes.md index bc12218b3729..0236ea5af9a2 100644 --- a/docs/web/docs/Tools/Routes.md +++ b/docs/web/docs/Tools/Routes.md @@ -435,6 +435,9 @@ may be beneficial to increase the accepted **--delta** distance between trace po the edge reference line. The mapping algorithm is also available in the python library function sumolib.route.mapTrace. +!!! caution + Geographic coordinates have to be provided in the lon/lat form (first coordinate is the longitude, second the latitude)! + # tlsCycleAdaptation.py This script is to adapt the cycle lengths of the signalized diff --git a/docs/web/docs/Tools/Visualization.md b/docs/web/docs/Tools/Visualization.md index cf6a27c062be..0ae5ef4ee184 100644 --- a/docs/web/docs/Tools/Visualization.md +++ b/docs/web/docs/Tools/Visualization.md @@ -303,7 +303,7 @@ plotXMLAttributes.py tripinfos.xml tripinfos2.xml -x timeLoss -y @COUNT -i @NONE !!! caution - It is importent to set **-i @NONE** to ensure that the timeLoss values are aggregated by file rather than by vehicle id. + It is important to set **-i @NONE** to ensure that the timeLoss values are aggregated by file rather than by vehicle id. ## plot_trajectories.py @@ -473,7 +473,7 @@ Here the most important options are listed. Use **--help** to see all options. | **--min-width-value** {{DT_FLOAT}} | If set, defines the minimum edge width value | | **--max-width-value** {{DT_FLOAT}} | If set, defines the maximum edge width value | | **-v**
**--verbose** | If set, the progress is printed on the screen | -| **--internal** | If set, internal edges (of junctions) are included to the genrated shapes. | +| **--internal** | If set, internal edges (of junctions) are included to the generated shapes. | ## plot_net_selection.py @@ -655,7 +655,7 @@ the measure (vehicles) that fall into a bin. | **-i** {{DT_FILE}}[,{{DT_FILE}}]\*
**--tripinfos-inputs** {{DT_FILE}}[,{{DT_FILE}}]* | Defines the [summary-file](../Simulation/Output/Summary.md)(s) to read | | **-m** {{DT_STR}}
**--measure** {{DT_STR}} | Defines the measure to read from the summary file | | **-v**
**--verbose** | If set, the progress is printed on the screen | -| **--bins** {{DT_INT}} | The number of bins to devide the values into | +| **--bins** {{DT_INT}} | The number of bins to divide the values into | | **--norm** {{DT_FLOAT}} | Defines a number by which read values are divided; default: 1.0 | | **--minV** {{DT_FLOAT}} | The minimum value; if set, read values that are lower than this value are set to this value | | **--maxV** {{DT_FLOAT}} | The maximum value; if set, read values that are higher than this value are set to this value | diff --git a/docs/web/docs/TraCI/ChargingStation.md b/docs/web/docs/TraCI/ChargingStation.md index ac302bf6e834..5c5141145348 100644 --- a/docs/web/docs/TraCI/ChargingStation.md +++ b/docs/web/docs/TraCI/ChargingStation.md @@ -19,7 +19,7 @@ value is also shown in the table. | -------------------------------------------- | ------------------- | ----------------- | -------------------------------------------------------------- | | end pos | double | The end position of the stop along the lane measured in m. | [getEndPos](https://sumo.dlr.de/pydoc/traci._chargingstation.html#ChargingStationDomain-getEndPos) | | lane ID | string | Returns the lane of this calibrator (if it applies to a single lane) | [getLaneID](https://sumo.dlr.de/pydoc/traci._chargingstation.html#ChargingStationDomain-getLaneID) | -| name | sting | Returns the name of this stop | [getName](https://sumo.dlr.de/pydoc/traci._chargingstation.html#ChargingStationDomain-getName) | +| name | string | Returns the name of this stop | [getName](https://sumo.dlr.de/pydoc/traci._chargingstation.html#ChargingStationDomain-getName) | | start pos | double | The starting position of the stop along the lane measured in m. | [getStartPos](https://sumo.dlr.de/pydoc/traci._chargingstation.html#ChargingStationDomain-getStartPos) | | vehicle count | integer | Get the total number of vehicles stopped at the named charging station. | [getVehicleCount](https://sumo.dlr.de/pydoc/traci._chargingstation.html#ChargingStationDomain-getVehicleCount) | | vehicle ID | stringList | Get the IDs of vehicles stopped at the named charging station. | [getVehicleIDs](https://sumo.dlr.de/pydoc/traci._chargingstation.html#ChargingStationDomain-getVehicleIDs) | diff --git a/docs/web/docs/Tutorials/GTFS.md b/docs/web/docs/Tutorials/GTFS.md index 4e5ffd42e641..85487224fe80 100644 --- a/docs/web/docs/Tutorials/GTFS.md +++ b/docs/web/docs/Tutorials/GTFS.md @@ -120,15 +120,16 @@ which automatically generate the "osm_ptlines.xml" file with the public transpor The call is: ``` -python tools/import/gtfs/gtfs2pt.py -n osm.net.xml --gtfs GTFS_VBB_Juni-Dezember-2019.zip --date 20190904 --osm-routes osm_ptlines.xml --repair --modes bus +python tools/import/gtfs/gtfs2pt.py -n osm.net.xml --gtfs GTFS_VBB_Juni-Dezember-2019.zip --date 20190904 --osm-routes osm_ptlines.xml --repair --modes bus --vtype-output pt_vtypes.xml ``` The option **--repair** is not mandatory, but helpful. It takes the given ptLines and tries to repair them using duarouter before the mapping. If some routes of the ptLines are not valid, they won't be used for the mapping. -The script generates four output files: +The script generates the following output files: +- `pt_vtypes.xml` - `gtfs_publictransport.add.xml` (defining the stops) - `gtfs_publictransport.rou.xml` (defining the single public transport vehicles) - `gtfs_missing.xml` contains the elements (stops and ptLines) of the GTFS data that could not be imported @@ -137,7 +138,7 @@ The script generates four output files: To run the simulation call: ``` -sumo-gui -n osm.net.xml --additional gtfs_publictransport.add.xml --routes gtfs_publictransport.rou.xml +sumo-gui -n osm.net.xml --additional pt_vtypes.xml,gtfs_publictransport.add.xml --routes gtfs_publictransport.rou.xml ``` # Using the outputs in a simulation diff --git a/docs/web/docs/polyconvert.md b/docs/web/docs/polyconvert.md index f4f3c1a14ea6..a8ad1bdac37b 100644 --- a/docs/web/docs/polyconvert.md +++ b/docs/web/docs/polyconvert.md @@ -68,7 +68,9 @@ Files](Basics/Using_the_Command_Line_Applications.md#configuration_files). attributes to the imported shapes in dependence of their "type". Not all imported formats have a type information. When using shape files, for example, all instances of an artifact type are normally stored in a -distinct shape file. +distinct shape file. **polyconvert** supports [virtual file systems](https://gdal.org/en/latest/user/virtual_file_systems.html) when +importing shape files. So if you have your shapes in myshapes.zip and the main file has the name arcview.shp +you can import them via `polyconvert --shapefile /vsizip/myshapes.zip/arcview` (**--shapefile** is an alias to **--shapefile-prefixes**). | Option | Description | |--------|-------------| diff --git a/src/guisim/GUITrafficLightLogicWrapper.cpp b/src/guisim/GUITrafficLightLogicWrapper.cpp index b1233ad0cb53..02b102107cc8 100644 --- a/src/guisim/GUITrafficLightLogicWrapper.cpp +++ b/src/guisim/GUITrafficLightLogicWrapper.cpp @@ -252,7 +252,9 @@ GUITrafficLightLogicWrapper::getParameterWindow(GUIMainWindow& app, ret->mkItem(TL("cycle time"), true, new FunctionBinding(this, &GUITrafficLightLogicWrapper::getDefaultCycleTimeSeconds)); MSRailSignal* rs = dynamic_cast(&myTLLogic); if (rs != nullptr) { + ret->mkItem(TL("req driveway"), true, new FunctionBindingString(rs, &MSRailSignal::getRequestedDriveWay)); ret->mkItem(TL("blocking"), true, new FunctionBindingString(rs, &MSRailSignal::getBlockingVehicleIDs)); + ret->mkItem(TL("blocking driveways"), true, new FunctionBindingString(rs, &MSRailSignal::getBlockingDriveWayIDs)); ret->mkItem(TL("rival"), true, new FunctionBindingString(rs, &MSRailSignal::getRivalVehicleIDs)); ret->mkItem(TL("priority"), true, new FunctionBindingString(rs, &MSRailSignal::getPriorityVehicleIDs)); ret->mkItem(TL("constraint"), true, new FunctionBindingString(rs, &MSRailSignal::getConstraintInfo)); diff --git a/src/guisim/GUIVehicle.cpp b/src/guisim/GUIVehicle.cpp index 6a9def967e2f..d5b73691e157 100644 --- a/src/guisim/GUIVehicle.cpp +++ b/src/guisim/GUIVehicle.cpp @@ -59,6 +59,7 @@ #include #include #include +#include #include #include #include "GUIVehicle.h" @@ -193,6 +194,9 @@ GUIVehicle::getParameterWindow(GUIMainWindow& app, ret->mkItem(TL("leftmost edge sublane [#]"), true, new FunctionBinding(this, &GUIVehicle::getLeftSublaneOnEdge)); ret->mkItem(TL("lane change maneuver distance [m]"), true, new FunctionBinding(this, &GUIVehicle::getManeuverDist)); } + if (isRailway(getVClass())) { + ret->mkItem(TL("driveways"), true, new FunctionBindingString(this, &GUIVehicle::getDriveWays)); + } if (hasBattery || isElecHybrid) { ret->mkItem(TL("present state of charge [Wh]"), true, new FunctionBinding(this, &MSVehicle::getStateOfCharge)); @@ -950,6 +954,19 @@ GUIVehicle::getTargetLaneID() const { return Named::getIDSecure(getLaneChangeModel().getTargetLane(), ""); } + +std::string +GUIVehicle::getDriveWays() const { + std::vector result; + for (auto item : myMoveReminders) { + const MSDriveWay* dw = dynamic_cast(item.first); + if (dw) { + result.push_back(dw->getID()); + } + } + return joinToStringSorting(result, " "); +} + double GUIVehicle::getManeuverDist() const { return getLaneChangeModel().getManeuverDist(); diff --git a/src/guisim/GUIVehicle.h b/src/guisim/GUIVehicle.h index d3a9f29cb4d5..1d2ee2dfb13c 100644 --- a/src/guisim/GUIVehicle.h +++ b/src/guisim/GUIVehicle.h @@ -160,6 +160,8 @@ class GUIVehicle : public MSVehicle, public GUIBaseVehicle { std::string getShadowLaneID() const; std::string getTargetLaneID() const; + std::string getDriveWays() const; + /// @brief return the lane-change maneuver distance double getManeuverDist() const; /// @brief return the speed mode as bit string diff --git a/src/libsumo/Vehicle.cpp b/src/libsumo/Vehicle.cpp index 7bfc20b3df9c..30e1ba57d213 100644 --- a/src/libsumo/Vehicle.cpp +++ b/src/libsumo/Vehicle.cpp @@ -594,8 +594,9 @@ Vehicle::getNextLinks(const std::string& vehID) { const std::string approachedLane = link->getLane() != nullptr ? link->getLane()->getID() : ""; const bool hasPrio = link->havePriority(); const double speed = MIN2(lane->getSpeedLimit(), link->getLane()->getSpeedLimit()); - const bool isOpen = link->opened(currTime, speed, speed, SUMOVTypeParameter::getDefault().length, - SUMOVTypeParameter::getDefault().impatience, SUMOVTypeParameter::getDefaultDecel(), 0); + const bool isOpen = link->opened(currTime, speed, speed, veh->getLength(), + veh->getImpatience(), veh->getVehicleType().getCarFollowModel().getMaxDecel(), + veh->getWaitingTime(), veh->getLateralPositionOnLane(), nullptr, false, veh); const bool hasFoe = link->hasApproachingFoe(currTime, currTime, 0, SUMOVTypeParameter::getDefaultDecel()); const std::string approachedInternal = link->getViaLane() != nullptr ? link->getViaLane()->getID() : ""; const std::string state = SUMOXMLDefinitions::LinkStates.getString(link->getState()); @@ -621,8 +622,9 @@ Vehicle::getNextLinks(const std::string& vehID) { const std::string approachedLane = link->getLane() != nullptr ? link->getLane()->getID() : ""; const bool hasPrio = link->havePriority(); const double speed = MIN2(lane->getSpeedLimit(), link->getLane()->getSpeedLimit()); - const bool isOpen = link->opened(currTime, speed, speed, SUMOVTypeParameter::getDefault().length, - SUMOVTypeParameter::getDefault().impatience, SUMOVTypeParameter::getDefaultDecel(), 0); + const bool isOpen = link->opened(currTime, speed, speed, veh->getLength(), + veh->getImpatience(), veh->getVehicleType().getCarFollowModel().getMaxDecel(), + veh->getWaitingTime(), veh->getLateralPositionOnLane(), nullptr, false, veh); const bool hasFoe = link->hasApproachingFoe(currTime, currTime, 0, SUMOVTypeParameter::getDefaultDecel()); const std::string approachedInternal = link->getViaLane() != nullptr ? link->getViaLane()->getID() : ""; const std::string state = SUMOXMLDefinitions::LinkStates.getString(link->getState()); diff --git a/src/mesosim/MEVehicle.h b/src/mesosim/MEVehicle.h index 6e2c3301e765..14a4e1cde580 100644 --- a/src/mesosim/MEVehicle.h +++ b/src/mesosim/MEVehicle.h @@ -82,6 +82,10 @@ class MEVehicle : public MSBaseVehicle { return nullptr; } + const MSLane* getBackLane() const { + return nullptr; + } + /** @brief Return current position (x/y, cartesian) * * If the vehicle's myLane is 0, Position::INVALID. diff --git a/src/microsim/MSBaseVehicle.cpp b/src/microsim/MSBaseVehicle.cpp index 1e2a4c285492..c71feb1d5a55 100644 --- a/src/microsim/MSBaseVehicle.cpp +++ b/src/microsim/MSBaseVehicle.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include "MSGlobals.h" #include "MSVehicleControl.h" #include "MSVehicleType.h" @@ -277,7 +278,7 @@ MSBaseVehicle::reroute(SUMOTime t, const std::string& info, SUMOAbstractRouter jumps; - + bool stopAtSink = false; if (myParameter->via.size() == 0) { double firstPos = INVALID_DOUBLE; double lastPos = INVALID_DOUBLE; @@ -288,8 +289,7 @@ MSBaseVehicle::reroute(SUMOTime t, const std::string& info, SUMOAbstractRoutergetNumSuccessors() == 0 && jumps.size() == 0) - || sourcePos + getBrakeGap() <= firstPos + NUMERICAL_EPS); + const bool skipFirst = stops.front() == source && (source != getEdge() || sourcePos + getBrakeGap() <= firstPos + NUMERICAL_EPS); const bool skipLast = (stops.back() == sink && myArrivalPos >= lastPos && (stops.size() < 2 || stops.back() != stops[stops.size() - 2]) @@ -311,6 +311,7 @@ MSBaseVehicle::reroute(SUMOTime t, const std::string& info, SUMOAbstractRouter 0 && stops.back() == sink && jumps.size() == 0; } } else { std::set jumpEdges; @@ -359,12 +360,14 @@ MSBaseVehicle::reroute(SUMOTime t, const std::string& info, SUMOAbstractRoutergetID(), stopEdge->getID()); - if (MSGlobals::gCheckRoutes || silent) { - throw ProcessError(error); - } else { - WRITE_WARNING(error); - edges.push_back(source); + if ((source != sink || !stopAtSink)) { + std::string error = TLF("Vehicle '%' has no valid route from edge '%' to stop edge '%'.", getID(), source->getID(), stopEdge->getID()); + if (MSGlobals::gCheckRoutes || silent) { + throw ProcessError(error); + } else { + WRITE_WARNING(error); + edges.push_back(source); + } } source = stopEdge; } @@ -1411,19 +1414,23 @@ MSBaseVehicle::addStop(const SUMOVehicleParameter::Stop& stopPar, std::string& e + " earlier than previous stop arrival at " + time2string(iter2->pars.arrival) + "."; } } else { - if (stop.getUntil() >= 0 && getParameter().depart > stop.getUntil()) { + if (stop.getUntil() >= 0 && getParameter().depart > stop.getUntil() + && (!MSGlobals::gUseStopEnded || stop.pars.ended < 0)) { errorMsg = errorMsgStart + " for vehicle '" + myParameter->id + "' on lane '" + stop.lane->getID() + "' set to end at " + time2string(stop.getUntil()) + " earlier than departure at " + time2string(getParameter().depart) + "."; } } - if (stop.getUntil() >= 0 && stop.pars.arrival > stop.getUntil() && errorMsg == "") { + if (stop.getUntil() >= 0 && stop.getArrival() > stop.getUntil() && errorMsg == "") { errorMsg = errorMsgStart + " for vehicle '" + myParameter->id + "' on lane '" + stop.lane->getID() + "' set to end at " + time2string(stop.getUntil()) - + " earlier than arrival at " + time2string(stop.pars.arrival) + "."; + + " earlier than arrival at " + time2string(stop.getArrival()) + "."; } setSkips(stop, (int)myStops.size()); myStops.insert(iter, stop); + if (stopPar.tripId != "") { + MSRailSignalConstraint::storeTripId(stopPar.tripId, getID()); + } //std::cout << " added stop " << errorMsgStart << " totalStops=" << myStops.size() << " searchStart=" << (*searchStart - myRoute->begin()) // << " routeIndex=" << (stop.edge - myRoute->begin()) // << " stopIndex=" << std::distance(myStops.begin(), iter) @@ -1588,7 +1595,7 @@ MSBaseVehicle::getStopEdges(double& firstPos, double& lastPos, std::set& ju } prev = &stop; if (firstPos == INVALID_DOUBLE) { - if (stop.parkingarea != nullptr && stop.edge == myRoute->begin()) { + if (stop.parkingarea != nullptr) { firstPos = MAX2(0., stopPos); } else { firstPos = stopPos; diff --git a/src/microsim/MSFrame.cpp b/src/microsim/MSFrame.cpp index 83f0a28dbf58..e4a67df48846 100644 --- a/src/microsim/MSFrame.cpp +++ b/src/microsim/MSFrame.cpp @@ -282,6 +282,9 @@ MSFrame::fillOptions() { oc.doRegister("railsignal-block-output", new Option_FileName()); oc.addDescription("railsignal-block-output", "Output", TL("Save railsignal-blocks into FILE")); + oc.doRegister("railsignal-vehicle-output", new Option_FileName()); + oc.addDescription("railsignal-vehicle-output", "Output", TL("Record entry and exit times of vehicles for railsignal blocks into FILE")); + oc.doRegister("bt-output", new Option_FileName()); oc.addDescription("bt-output", "Output", TL("Save bluetooth visibilities into FILE (in conjunction with device.btreceiver and device.btsender)")); @@ -314,6 +317,9 @@ MSFrame::fillOptions() { oc.addSynonyme("statistic-output", "statistics-output"); oc.addDescription("statistic-output", "Output", TL("Write overall statistics into FILE")); + oc.doRegister("deadlock-output", new Option_FileName()); + oc.addDescription("deadlock-output", "Output", TL("Write reports on deadlocks FILE")); + #ifdef _DEBUG oc.doRegister("movereminder-output", new Option_FileName()); oc.addDescription("movereminder-output", "Output", TL("Save movereminder states of selected vehicles into FILE")); @@ -434,12 +440,18 @@ MSFrame::fillOptions() { oc.doRegister("time-to-teleport.remove", new Option_Bool(false)); oc.addDescription("time-to-teleport.remove", "Processing", TL("Whether vehicles shall be removed after waiting too long instead of being teleported")); + oc.doRegister("time-to-teleport.remove-constraint", new Option_Bool(false)); + oc.addDescription("time-to-teleport.remove-constraint", "Processing", TL("Whether rail-signal-constraint based deadlocks shall be cleared by removing a constraint")); + oc.doRegister("time-to-teleport.ride", new Option_String("-1", "TIME")); oc.addDescription("time-to-teleport.ride", "Processing", TL("The waiting time after which persons / containers waiting for a pickup are teleported. Negative values disable teleporting")); oc.doRegister("time-to-teleport.bidi", new Option_String("-1", "TIME")); oc.addDescription("time-to-teleport.bidi", "Processing", TL("The waiting time after which vehicles on bidirectional edges are teleported")); + oc.doRegister("time-to-teleport.railsignal-deadlock", new Option_String("-1", "TIME")); + oc.addDescription("time-to-teleport.railsignal-deadlock", "Processing", TL("The waiting time after which vehicles in a rail-signal based deadlock are teleported")); + oc.doRegister("waiting-time-memory", new Option_String("100", "TIME")); oc.addDescription("waiting-time-memory", "Processing", TL("Length of time interval, over which accumulated waiting time is taken into account (default is 100s.)")); @@ -458,6 +470,9 @@ MSFrame::fillOptions() { oc.doRegister("emergency-insert", new Option_Bool(false)); oc.addDescription("emergency-insert", "Processing", TL("Allow inserting a vehicle in a situation which requires emergency braking")); + oc.doRegister("insertion-checks", new Option_String("all")); + oc.addDescription("insertion-checks", "Processing", TL("Override default value for vehicle attribute insertionChecks")); + oc.doRegister("random-depart-offset", new Option_String("0", "TIME")); oc.addDescription("random-depart-offset", "Processing", TL("Each vehicle receives a random offset to its depart value drawn uniformly from [0, TIME]")); @@ -548,6 +563,9 @@ MSFrame::fillOptions() { oc.doRegister("pedestrian.striping.jamtime.narrow", new Option_String("1", "TIME")); oc.addDescription("pedestrian.striping.jamtime.narrow", "Processing", TL("Time in seconds after which pedestrians start squeezing through a jam while on a narrow lane when using model 'striping'")); + oc.doRegister("pedestrian.striping.jamfactor", new Option_Float(0.25)); + oc.addDescription("pedestrian.striping.jamfactor", "Processing", TL("Factor for reducing speed of pedestrian in jammed state")); + oc.doRegister("pedestrian.striping.reserve-oncoming", new Option_Float(0.0)); oc.addDescription("pedestrian.striping.reserve-oncoming", "Processing", TL("Fraction of stripes to reserve for oncoming pedestrians")); @@ -838,11 +856,13 @@ MSFrame::buildStreams() { //OutputDevice::createDeviceByOption("vtk-output", "vtk-export"); OutputDevice::createDeviceByOption("link-output", "link-output"); OutputDevice::createDeviceByOption("railsignal-block-output", "railsignal-block-output"); + OutputDevice::createDeviceByOption("railsignal-vehicle-output", "railsignal-vehicle-output"); OutputDevice::createDeviceByOption("bt-output", "bt-output"); OutputDevice::createDeviceByOption("lanechange-output", "lanechanges"); OutputDevice::createDeviceByOption("stop-output", "stops", "stopinfo_file.xsd"); OutputDevice::createDeviceByOption("collision-output", "collisions", "collision_file.xsd"); OutputDevice::createDeviceByOption("statistic-output", "statistics", "statistic_file.xsd"); + OutputDevice::createDeviceByOption("deadlock-output", "additional", "additional_file.xsd"); #ifdef _DEBUG OutputDevice::createDeviceByOption("movereminder-output", "movereminder-output"); @@ -1079,6 +1099,7 @@ MSFrame::setMSGlobals(OptionsCont& oc) { MSGlobals::gGridlockHighwaysSpeed = oc.getFloat("time-to-teleport.highways.min-speed"); MSGlobals::gTimeToTeleportDisconnected = string2time(oc.getString("time-to-teleport.disconnected")); MSGlobals::gTimeToTeleportBidi = string2time(oc.getString("time-to-teleport.bidi")); + MSGlobals::gTimeToTeleportRSDeadlock = string2time(oc.getString("time-to-teleport.railsignal-deadlock")); MSGlobals::gRemoveGridlocked = oc.getBool("time-to-teleport.remove"); MSGlobals::gCheck4Accidents = !oc.getBool("ignore-accidents"); MSGlobals::gCheckRoutes = !oc.getBool("ignore-route-errors"); @@ -1099,6 +1120,7 @@ MSFrame::setMSGlobals(OptionsCont& oc) { MSGlobals::gOverheadWireSolver = oc.getBool("overhead-wire.solver"); MSGlobals::gOverheadWireRecuperation = oc.getBool("overhead-wire.recuperation"); MSGlobals::gOverheadWireCurrentLimits = oc.getBool("overhead-wire.substation-current-limits"); + MSGlobals::gInsertionChecks = SUMOVehicleParameter::parseInsertionChecks(oc.getString("insertion-checks")); MSLane::initCollisionOptions(oc); diff --git a/src/microsim/MSGlobals.cpp b/src/microsim/MSGlobals.cpp index f203c6b893ef..7018f786ded0 100644 --- a/src/microsim/MSGlobals.cpp +++ b/src/microsim/MSGlobals.cpp @@ -37,6 +37,7 @@ SUMOTime MSGlobals::gTimeToGridlockHighways; double MSGlobals::gGridlockHighwaysSpeed; SUMOTime MSGlobals::gTimeToTeleportDisconnected; SUMOTime MSGlobals::gTimeToTeleportBidi; +SUMOTime MSGlobals::gTimeToTeleportRSDeadlock; bool MSGlobals::gRemoveGridlocked; SUMOTime MSGlobals::gTimeToImpatience; @@ -100,4 +101,6 @@ SUMOTime MSGlobals::gStartupWaitThreshold(0); bool MSGlobals::gHaveEmissions(false); +int MSGlobals::gInsertionChecks(0); + /****************************************************************************/ diff --git a/src/microsim/MSGlobals.h b/src/microsim/MSGlobals.h index 05192a79acae..ca47ab162515 100644 --- a/src/microsim/MSGlobals.h +++ b/src/microsim/MSGlobals.h @@ -68,6 +68,9 @@ class MSGlobals { /** The time to wait for teleport on bidi edges */ static SUMOTime gTimeToTeleportBidi; + /** The time to wait for teleport when rail signals cause deadlock */ + static SUMOTime gTimeToTeleportRSDeadlock; + /** Whether gridlocked vehicles shall be removed instead of teleporting */ static bool gRemoveGridlocked; @@ -178,4 +181,7 @@ class MSGlobals { /// @brief Whether emission output of some type is needed (files or GUI) static bool gHaveEmissions; + + /// @brief The default value for insertion checks + static int gInsertionChecks; }; diff --git a/src/microsim/MSInsertionControl.cpp b/src/microsim/MSInsertionControl.cpp index 62cd6af7af61..9a39a033129f 100644 --- a/src/microsim/MSInsertionControl.cpp +++ b/src/microsim/MSInsertionControl.cpp @@ -161,7 +161,7 @@ MSInsertionControl::tryInsert(SUMOTime time, SUMOVehicle* veh, return 1; } if ((myMaxVehicleNumber < 0 || (int)MSNet::getInstance()->getVehicleControl().getRunningVehicleNo() < myMaxVehicleNumber) - && edge.insertVehicle(*veh, time, false, myEagerInsertionCheck)) { + && edge.insertVehicle(*veh, time, false, myEagerInsertionCheck || veh->getParameter().departProcedure == DepartDefinition::SPLIT)) { // Successful insertion return 1; } diff --git a/src/microsim/MSLane.cpp b/src/microsim/MSLane.cpp index 3b6e534c0726..ee29328181f0 100644 --- a/src/microsim/MSLane.cpp +++ b/src/microsim/MSLane.cpp @@ -52,6 +52,8 @@ #include #include #include +#include +#include #include #include #include "MSNet.h" @@ -356,6 +358,18 @@ MSLane::addMoveReminder(MSMoveReminder* rem) { } +void +MSLane::removeMoveReminder(MSMoveReminder* rem) { + auto it = std::find(myMoveReminders.begin(), myMoveReminders.end(), rem); + if (it != myMoveReminders.end()) { + myMoveReminders.erase(it); + for (MSVehicle* const veh : myVehicles) { + veh->removeReminder(rem); + } + } +} + + double MSLane::setPartialOccupation(MSVehicle* v) { // multithreading: there are concurrent writes to myNeedsCollisionCheck but all of them should set it to true @@ -784,7 +798,7 @@ MSLane::checkFailure(const MSVehicle* aVehicle, double& speed, double& dist, con speed = MIN2(nspeed, speed); dist = aVehicle->getCarFollowModel().brakeGap(speed) + aVehicle->getVehicleType().getMinGap(); } else if (speed > 0) { - if ((aVehicle->getParameter().insertionChecks & (int)check) == 0) { + if ((getInsertionChecks(aVehicle) & (int)check) == 0) { return false; } if (MSGlobals::gEmergencyInsert) { @@ -813,6 +827,7 @@ bool MSLane::isInsertionSuccess(MSVehicle* aVehicle, double speed, double pos, double posLat, bool patchSpeed, MSMoveReminder::Notification notification) { + int insertionChecks = getInsertionChecks(aVehicle); if (pos < 0 || pos > myLength) { // we may not start there WRITE_WARNINGF(TL("Invalid departPos % given for vehicle '%'. Inserting at lane end instead."), @@ -841,9 +856,22 @@ MSLane::isInsertionSuccess(MSVehicle* aVehicle, double seen = getLength() - pos; // == distance from insertion position until the end of the currentLane double dist = cfModel.brakeGap(speed) + aVehicle->getVehicleType().getMinGap(); const bool isRail = isRailway(aVehicle->getVClass()); + if (isRail && insertionChecks != (int)InsertionCheck::NONE + && aVehicle->getParameter().departProcedure != DepartDefinition::SPLIT) { + const MSDriveWay* dw = MSDriveWay::getDepartureDriveway(aVehicle); + MSEdgeVector occupied; + if (dw->foeDriveWayOccupied(false, aVehicle, occupied)) { +#ifdef DEBUG_INSERTION + if (DEBUG_COND2(aVehicle) || DEBUG_COND) { + std::cout << " foe of driveway " + dw->getID() + " has occupied edges " + toString(occupied) << "\n"; + } +#endif + return false; + } + } // do not insert if the bidirectional edge is occupied if (getBidiLane() != nullptr && isRail && getBidiLane()->getVehicleNumberWithPartials() > 0) { - if ((aVehicle->getParameter().insertionChecks & (int)InsertionCheck::BIDI) != 0) { + if ((insertionChecks & (int)InsertionCheck::BIDI) != 0) { #ifdef DEBUG_INSERTION if (DEBUG_COND2(aVehicle) || DEBUG_COND) { std::cout << " bidi-lane occupied\n"; @@ -929,26 +957,6 @@ MSLane::isInsertionSuccess(MSVehicle* aVehicle, firstRailSignal = *link; firstRailSignalDist = seen; } - // allow guarding bidirectional tracks at the network border with railSignal - if (currentLane == this && (*link)->getJunction()->getType() == SumoXMLNodeType::RAIL_SIGNAL) { - /// the oncoming check differs depending on whether the train may brake - const double vSafe = cfModel.insertionStopSpeed(aVehicle, speed, seen); - bool brakeBeforeSignal = patchSpeed || speed <= vSafe; - if (MSRailSignal::hasOncomingRailTraffic(*link, aVehicle, brakeBeforeSignal)) { -#ifdef DEBUG_INSERTION - if (DEBUG_COND2(aVehicle) || DEBUG_COND) { - std::cout << " oncoming rail traffic at link " << (*link)->getDescription() << "\n"; - } -#endif - if ((aVehicle->getParameter().insertionChecks & (int)InsertionCheck::ONCOMING_TRAIN) != 0) { - setParameter("insertionFail:" + aVehicle->getID(), "oncoming rail traffic"); - return false; - } - } - if (brakeBeforeSignal) { - speed = MIN2(speed, vSafe); - } - } if (!(*link)->opened(arrivalTime, speed, speed, aVehicle->getVehicleType().getLength(), aVehicle->getImpatience(), cfModel.getMaxDecel(), 0, posLat, nullptr, false, aVehicle) || !(*link)->havePriority()) { @@ -1021,7 +1029,7 @@ MSLane::isInsertionSuccess(MSVehicle* aVehicle, // do not insert if the bidirectional edge is occupied before a railSignal has been encountered if (firstRailSignal == nullptr && nextLane->getBidiLane() != nullptr && nextLane->getBidiLane()->getVehicleNumberWithPartials() > 0) { - if ((aVehicle->getParameter().insertionChecks & (int)InsertionCheck::ONCOMING_TRAIN) != 0) { + if ((insertionChecks & (int)InsertionCheck::ONCOMING_TRAIN) != 0) { return false; } } @@ -1080,7 +1088,7 @@ MSLane::isInsertionSuccess(MSVehicle* aVehicle, speed = nspeed; dist = cfModel.brakeGap(speed) + aVehicle->getVehicleType().getMinGap(); } else { - if ((aVehicle->getParameter().insertionChecks & (int)InsertionCheck::SPEED_LIMIT) != 0) { + if ((insertionChecks & (int)InsertionCheck::SPEED_LIMIT) != 0) { if (!MSGlobals::gCheckRoutes) { WRITE_WARNINGF(TL("Vehicle '%' is inserted too fast and will violate the speed limit on a lane '%'."), aVehicle->getID(), nextLane->getID()); @@ -1148,8 +1156,8 @@ MSLane::isInsertionSuccess(MSVehicle* aVehicle, if (follower != nullptr) { const double backGapNeeded = follower->getCarFollowModel().getSecureGap(follower, aVehicle, follower->getSpeed(), speed, cfModel.getMaxDecel()); if (followers[i].second < backGapNeeded - && ((aVehicle->getParameter().insertionChecks & (int)InsertionCheck::FOLLOWER_GAP) != 0 - || (followers[i].second < 0 && (aVehicle->getParameter().insertionChecks & (int)InsertionCheck::COLLISION) != 0))) { + && ((insertionChecks & (int)InsertionCheck::FOLLOWER_GAP) != 0 + || (followers[i].second < 0 && (insertionChecks & (int)InsertionCheck::COLLISION) != 0))) { // too close to the follower on this lane #ifdef DEBUG_INSERTION if (DEBUG_COND2(aVehicle) || DEBUG_COND) { @@ -1187,8 +1195,8 @@ MSLane::isInsertionSuccess(MSVehicle* aVehicle, if (follower != nullptr) { const double backGapNeeded = follower->getCarFollowModel().getSecureGap(follower, aVehicle, follower->getSpeed(), speed, cfModel.getMaxDecel()); if (shadowFollowers[i].second < backGapNeeded - && ((aVehicle->getParameter().insertionChecks & (int)InsertionCheck::FOLLOWER_GAP) != 0 - || (shadowFollowers[i].second < 0 && (aVehicle->getParameter().insertionChecks & (int)InsertionCheck::COLLISION) != 0))) { + && ((insertionChecks & (int)InsertionCheck::FOLLOWER_GAP) != 0 + || (shadowFollowers[i].second < 0 && (insertionChecks & (int)InsertionCheck::COLLISION) != 0))) { // too close to the follower on this lane #ifdef DEBUG_INSERTION if (DEBUG_COND2(aVehicle) || DEBUG_COND) { @@ -1216,8 +1224,8 @@ MSLane::isInsertionSuccess(MSVehicle* aVehicle, const double gap = veh->getBackPositionOnLane(shadowLane) - aVehicle->getPositionOnLane() - aVehicle->getVehicleType().getMinGap(); const double gapNeeded = aVehicle->getCarFollowModel().getSecureGap(aVehicle, veh, speed, veh->getSpeed(), veh->getCarFollowModel().getMaxDecel()); if (gap < gapNeeded - && ((aVehicle->getParameter().insertionChecks & (int)InsertionCheck::LEADER_GAP) != 0 - || (gap < 0 && (aVehicle->getParameter().insertionChecks & (int)InsertionCheck::COLLISION) != 0))) { + && ((insertionChecks & (int)InsertionCheck::LEADER_GAP) != 0 + || (gap < 0 && (insertionChecks & (int)InsertionCheck::COLLISION) != 0))) { // too close to the shadow leader #ifdef DEBUG_INSERTION if (DEBUG_COND2(aVehicle) || DEBUG_COND) { @@ -1244,7 +1252,7 @@ MSLane::isInsertionSuccess(MSVehicle* aVehicle, const double backOffset = pos - aVehicle->getVehicleType().getLength(); const double missingRearGap = getMissingRearGap(aVehicle, backOffset, speed); if (missingRearGap > 0 - && (aVehicle->getParameter().insertionChecks & (int)InsertionCheck::LEADER_GAP) != 0) { + && (insertionChecks & (int)InsertionCheck::LEADER_GAP) != 0) { // too close to a follower #ifdef DEBUG_INSERTION if (DEBUG_COND2(aVehicle) || DEBUG_COND) { @@ -1262,7 +1270,7 @@ MSLane::isInsertionSuccess(MSVehicle* aVehicle, return false; } } - if (aVehicle->getParameter().insertionChecks == (int)InsertionCheck::NONE) { + if (insertionChecks == (int)InsertionCheck::NONE) { speed = MAX2(0.0, speed); } // may got negative while adaptation @@ -1346,6 +1354,14 @@ MSLane::forceVehicleInsertion(MSVehicle* veh, double pos, MSMoveReminder::Notifi }), notification); } +int +MSLane::getInsertionChecks(const MSVehicle* veh) { + if (veh->getParameter().wasSet(VEHPARS_INSERTION_CHECKS_SET)) { + return veh->getParameter().insertionChecks; + } else { + return MSGlobals::gInsertionChecks; + } +} double MSLane::safeInsertionSpeed(const MSVehicle* veh, double seen, const MSLeaderInfo& leaders, double speed) { @@ -1369,7 +1385,7 @@ MSLane::safeInsertionSpeed(const MSVehicle* veh, double seen, const MSLeaderInfo std::cout << " leader=" << leader->getID() << " bPos=" << leader->getBackPositionOnLane(this) << " gap=" << gap << "\n"; } #endif - if ((veh->getParameter().insertionChecks & (int)InsertionCheck::COLLISION) != 0) { + if ((getInsertionChecks(veh) & (int)InsertionCheck::COLLISION) != 0) { return INVALID_SPEED; } else { return 0; @@ -2281,7 +2297,7 @@ MSLane::executeMovements(const SUMOTime t) { if (firstNotStopped != nullptr) { const SUMOTime ttt = firstNotStopped->getVehicleType().getParameter().getTimeToTeleport(MSGlobals::gTimeToGridlock); const SUMOTime tttb = firstNotStopped->getVehicleType().getParameter().getTimeToTeleportBidi(MSGlobals::gTimeToTeleportBidi); - if (ttt > 0 || MSGlobals::gTimeToGridlockHighways > 0 || MSGlobals::gTimeToTeleportDisconnected >= 0 || tttb > 0) { + if (ttt > 0 || MSGlobals::gTimeToGridlockHighways > 0 || MSGlobals::gTimeToTeleportDisconnected >= 0 || tttb > 0 || MSGlobals::gTimeToTeleportRSDeadlock > 0) { const bool wrongLane = !appropriate(firstNotStopped); const bool disconnected = (MSGlobals::gTimeToTeleportDisconnected >= 0 && firstNotStopped->succEdge(1) != nullptr @@ -2295,7 +2311,9 @@ MSLane::executeMovements(const SUMOTime t) { const bool r3 = disconnected && firstNotStopped->getWaitingTime() > MSGlobals::gTimeToTeleportDisconnected; const bool r4 = !r1 && !r2 && !r3 && tttb > 0 && firstNotStopped->getWaitingTime() > tttb && getBidiLane() && !disconnected; - if (r1 || r2 || r3 || r4) { + const bool r5 = MSGlobals::gTimeToTeleportRSDeadlock > 0 && MSRailSignalControl::hasInstance() && !r1 && !r2 && !r3 && !r4 + && firstNotStopped->getWaitingTime() > MSGlobals::gTimeToTeleportRSDeadlock && MSRailSignalControl::getInstance().haveDeadlock(firstNotStopped); + if (r1 || r2 || r3 || r4 || r5) { const std::vector::const_iterator link = succLinkSec(*firstNotStopped, 1, *this, firstNotStopped->getBestLanesContinuation()); const bool minorLink = !wrongLane && (link != myLinks.end()) && !((*link)->havePriority()); std::string reason = (wrongLane ? " (wrong lane" : (minorLink ? " (yield" : " (jam")); @@ -2311,6 +2329,7 @@ MSLane::executeMovements(const SUMOTime t) { + (r2 ? ", highway" : "") + (r3 ? ", disconnected" : "") + (r4 ? ", bidi" : "") + + (r5 ? ", railSignal" : "") + "), lane='%', time=%.", firstNotStopped->getID(), getID(), time2string(t)); if (wrongLane) { MSNet::getInstance()->getVehicleControl().registerTeleportWrongLane(); @@ -4486,7 +4505,7 @@ MSLane::checkForPedestrians(const MSVehicle* aVehicle, double& speed, double& di if (leader.first != 0) { const double gap = leader.second - aVehicle->getVehicleType().getLengthWithGap(); const double stopSpeed = aVehicle->getCarFollowModel().stopSpeed(aVehicle, speed, gap, MSCFModel::CalcReason::FUTURE); - if ((gap < 0 && (aVehicle->getParameter().insertionChecks & ((int)InsertionCheck::COLLISION | (int)InsertionCheck::PEDESTRIAN)) != 0) + if ((gap < 0 && (getInsertionChecks(aVehicle) & ((int)InsertionCheck::COLLISION | (int)InsertionCheck::PEDESTRIAN)) != 0) || checkFailure(aVehicle, speed, dist, stopSpeed, patchSpeed, "", InsertionCheck::PEDESTRIAN)) { // we may not drive with the given velocity - we crash into the pedestrian #ifdef DEBUG_INSERTION diff --git a/src/microsim/MSLane.h b/src/microsim/MSLane.h index e473a0d4ce9e..0f4864de47cc 100644 --- a/src/microsim/MSLane.h +++ b/src/microsim/MSLane.h @@ -309,6 +309,14 @@ class MSLane : public Named, public Parameterised { virtual void addMoveReminder(MSMoveReminder* rem); + /** @brief Remove a move-reminder from move-reminder container + * + * The move reminder will not be deleted by the lane. + * @param[in] rem The move reminder to remvoe + */ + virtual void removeMoveReminder(MSMoveReminder* rem); + + /** @brief Return the list of this lane's move reminders * @return Previously added move reminder */ @@ -1615,6 +1623,8 @@ class MSLane : public Named, public Parameterised { static double myCollisionMinGapFactor; static bool myExtrapolateSubstepDepart; + static int getInsertionChecks(const MSVehicle* veh); + /** * @class vehicle_position_sorter * @brief Sorts vehicles by their position (descending) diff --git a/src/microsim/MSLink.cpp b/src/microsim/MSLink.cpp index c738c9a3f8d0..3b49be42dc48 100644 --- a/src/microsim/MSLink.cpp +++ b/src/microsim/MSLink.cpp @@ -853,9 +853,9 @@ MSLink::opened(SUMOTime arrivalTime, double arrivalSpeed, double leaveSpeed, dou // sublane model could have detected a conflict return collectFoes == nullptr || collectFoes->size() == 0; } - if (myState == LINKSTATE_ALLWAY_STOP && waitingTime < TIME2STEPS(ego->getVehicleType().getParameter().getJMParam(SUMO_ATTR_JM_ALLWAYSTOP_WAIT, TS))) { + if (myState == LINKSTATE_ALLWAY_STOP && waitingTime < TIME2STEPS(ego == nullptr ? TS : ego->getVehicleType().getParameter().getJMParam(SUMO_ATTR_JM_ALLWAYSTOP_WAIT, TS))) { return false; - } else if (myState == LINKSTATE_STOP && waitingTime < TIME2STEPS(ego->getVehicleType().getParameter().getJMParam(SUMO_ATTR_JM_STOPSIGN_WAIT, TS))) { + } else if (myState == LINKSTATE_STOP && waitingTime < TIME2STEPS(ego == nullptr ? TS : ego->getVehicleType().getParameter().getJMParam(SUMO_ATTR_JM_STOPSIGN_WAIT, TS))) { return false; } @@ -2193,4 +2193,33 @@ MSLink::updateDistToFoePedCrossing(double dist) { myDistToFoePedCrossing = MIN2(myDistToFoePedCrossing, dist); } + +std::pair +MSLink::getClosest() const { + assert(getApproaching().size() > 0); + double minDist = std::numeric_limits::max(); + auto closestIt = getApproaching().begin(); + for (auto apprIt = getApproaching().begin(); apprIt != getApproaching().end(); apprIt++) { + if (apprIt->second.dist < minDist) { + minDist = apprIt->second.dist; + closestIt = apprIt; + } + } + // maybe a parallel link has a closer vehicle + /* + for (MSLink* link2 : link->getLaneBefore()->getLinkCont()) { + if (link2 != link) { + for (auto apprIt2 = link2->getApproaching().begin(); apprIt2 != link2->getApproaching().end(); apprIt2++) { + if (apprIt2->second.dist < minDist) { + minDist = apprIt2->second.dist; + closestIt = apprIt2; + } + } + } + } + */ + return *closestIt; +} + + /****************************************************************************/ diff --git a/src/microsim/MSLink.h b/src/microsim/MSLink.h index d4eeabe1a56f..2c7e7f3934be 100644 --- a/src/microsim/MSLink.h +++ b/src/microsim/MSLink.h @@ -687,6 +687,10 @@ class MSLink { /// @brief get string description for this link std::string getDescription() const; + /// @brief get the closest vehicle approaching this link + std::pair getClosest() const; + + /// @brief post-processing for legacy networks static void recheckSetRequestInformation(); diff --git a/src/microsim/MSMoveReminder.h b/src/microsim/MSMoveReminder.h index 2e4c000e839e..e34b39197e68 100644 --- a/src/microsim/MSMoveReminder.h +++ b/src/microsim/MSMoveReminder.h @@ -212,6 +212,25 @@ class MSMoveReminder { return true; } + /** @brief Called if the vehicle's back leaves the reminder's lane + * + * Informs if vehicle back leaves reminder lane (due to lane change, removal + * from the network, or leaving to the next lane). + * The default is to do nothing. + * + * @param[in] veh The leaving vehicle. + * @param[in] reason how the vehicle leaves the lane + * @param[in] leftLane The lane that the vehicle's back left + * @see Notification + * + * @return True if the reminder wants to receive further info. + */ + virtual bool notifyLeaveBack(SUMOTrafficObject& veh, Notification reason, const MSLane* leftLane) { + UNUSED_PARAMETER(&veh); + UNUSED_PARAMETER(reason); + UNUSED_PARAMETER(leftLane); + return true; + } // TODO: Documentation void updateDetector(SUMOTrafficObject& veh, double entryPos, double leavePos, @@ -273,7 +292,7 @@ class MSMoveReminder { protected: /// @brief Lane on which the reminder works - MSLane* const myLane; + MSLane* myLane; /// @brief a description of this moveReminder std::string myDescription; diff --git a/src/microsim/MSNet.cpp b/src/microsim/MSNet.cpp index 77d10b6fc736..bd2c1f705ec7 100644 --- a/src/microsim/MSNet.cpp +++ b/src/microsim/MSNet.cpp @@ -95,6 +95,7 @@ #include #include #include +#include #include #include #include @@ -193,6 +194,7 @@ MSNet::initStatic() { if (!MSGlobals::gUseMesoSim) { MSVehicle::Influencer::init(); } + MSDriveWay::init(); } void @@ -696,9 +698,7 @@ MSNet::closeSimulation(SUMOTime start, const std::string& reason) { if (OptionsCont::getOptions().isSet("substations-output")) { writeSubstationOutput(); } - if (OptionsCont::getOptions().isSet("railsignal-block-output")) { - writeRailSignalBlocks(); - } + writeRailSignalBlocks(); const long now = SysUtils::getCurrentMillis(); if (myLogExecutionTime || OptionsCont::getOptions().getBool("duration-log.statistics")) { WRITE_MESSAGE(generateStatistics(start, now)); @@ -766,7 +766,7 @@ MSNet::simulationStep(const bool onlyMove) { } myBeginOfTimestepEvents->execute(myStep); if (MSRailSignalControl::hasInstance()) { - MSRailSignalControl::getInstance().recheckGreen(); + MSRailSignalControl::getInstance().updateSignals(myStep); } #ifdef HAVE_FOX MSRoutingEngine::waitForAll(); @@ -815,6 +815,10 @@ MSNet::simulationStep(const bool onlyMove) { if (myContainerControl != nullptr && myContainerControl->hasTransportables()) { myContainerControl->checkWaiting(this, myStep); } + if (MSRailSignalControl::hasInstance()) { + MSRailSignalControl::getInstance().resetWaitRelations(); + // preserve waitRelation from insertion for the next step + } // insert vehicles myInserter->determineCandidates(myStep); myInsertionEvents->execute(myStep); @@ -971,6 +975,7 @@ MSNet::clearAll() { MSStopOut::cleanup(); MSRailSignalConstraint::cleanup(); MSRailSignalControl::cleanup(); + MSDriveWay::cleanup(); TraCIServer* t = TraCIServer::getInstance(); if (t != nullptr) { t->cleanup(); @@ -1028,6 +1033,7 @@ MSNet::clearState(const SUMOTime step, bool quickReload) { myEndOfTimestepEvents->clearState(myStep, step); myInsertionEvents->clearState(myStep, step); MSRailSignalControl::clearState(); + MSDriveWay::clearState(); myStep = step; MSGlobals::gClearState = false; } @@ -1428,12 +1434,25 @@ MSNet::writeChargingStationOutput() const { void MSNet::writeRailSignalBlocks() const { - OutputDevice& output = OutputDevice::getDeviceByOption("railsignal-block-output"); - for (auto tls : myLogics->getAllLogics()) { - MSRailSignal* rs = dynamic_cast(tls); - if (rs != nullptr) { - rs->writeBlocks(output); + if (OptionsCont::getOptions().isSet("railsignal-block-output")) { + OutputDevice& output = OutputDevice::getDeviceByOption("railsignal-block-output"); + for (auto tls : myLogics->getAllLogics()) { + MSRailSignal* rs = dynamic_cast(tls); + if (rs != nullptr) { + rs->writeBlocks(output, false); + } + } + MSDriveWay::writeDepatureBlocks(output, false); + } + if (OptionsCont::getOptions().isSet("railsignal-vehicle-output")) { + OutputDevice& output = OutputDevice::getDeviceByOption("railsignal-vehicle-output"); + for (auto tls : myLogics->getAllLogics()) { + MSRailSignal* rs = dynamic_cast(tls); + if (rs != nullptr) { + rs->writeBlocks(output, true); + } } + MSDriveWay::writeDepatureBlocks(output, true); } } diff --git a/src/microsim/MSRoute.h b/src/microsim/MSRoute.h index 39c8fef6a576..3bc5baaf4c18 100644 --- a/src/microsim/MSRoute.h +++ b/src/microsim/MSRoute.h @@ -44,6 +44,7 @@ // class declarations // =========================================================================== class MSEdge; +class MSLane; class MSRoute; class OutputDevice; diff --git a/src/microsim/MSStateHandler.cpp b/src/microsim/MSStateHandler.cpp index 2fc77c6613d3..56086c8a3e9c 100644 --- a/src/microsim/MSStateHandler.cpp +++ b/src/microsim/MSStateHandler.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -135,6 +136,9 @@ MSStateHandler::saveState(const std::string& file, SUMOTime step, bool usePrefix if (OptionsCont::getOptions().getBool("save-state.constraints")) { out.writeAttr(SUMO_ATTR_CONSTRAINTS, true); } + if (MSDriveWay::haveDriveWays()) { + out.writeAttr(SUMO_ATTR_RAIL, true); + } if (OptionsCont::getOptions().getBool("save-state.rng")) { saveRNGs(out); if (!MSGlobals::gUseMesoSim) { @@ -188,6 +192,10 @@ MSStateHandler::myStartElement(int element, const SUMOSAXAttributes& attrs) { if (attrs.getOpt(SUMO_ATTR_CONSTRAINTS, nullptr, ok, false)) { MSRailSignalConstraint::clearAll(); } + if (attrs.getOpt(SUMO_ATTR_RAIL, nullptr, ok, false)) { + // init before loading any vehicles to ensure that driveways are built early + MSRailSignalControl::getInstance(); + } break; } case SUMO_TAG_RNGSTATE: { @@ -335,6 +343,11 @@ MSStateHandler::myStartElement(int element, const SUMOSAXAttributes& attrs) { MSRailSignalConstraint_Predecessor::loadState(attrs); break; } + case SUMO_TAG_DRIVEWAY: + case SUMO_TAG_SUBDRIVEWAY: { + MSDriveWay::loadState(attrs, element); + break; + } case SUMO_TAG_PARAM: { bool ok; const std::string key = attrs.get(SUMO_ATTR_KEY, nullptr, ok); diff --git a/src/microsim/MSStop.cpp b/src/microsim/MSStop.cpp index 1043188d394a..5e19902512fc 100644 --- a/src/microsim/MSStop.cpp +++ b/src/microsim/MSStop.cpp @@ -153,6 +153,12 @@ MSStop::getUntil() const { } +SUMOTime +MSStop::getArrival() const { + return MSGlobals::gUseStopStarted && pars.started >= 0 ? pars.started : pars.arrival; +} + + double MSStop::getSpeed() const { return skipOnDemand ? std::numeric_limits::max() : pars.speed; diff --git a/src/microsim/MSStop.h b/src/microsim/MSStop.h index 5f99475b4f2a..e624be7de361 100644 --- a/src/microsim/MSStop.h +++ b/src/microsim/MSStop.h @@ -116,6 +116,9 @@ class MSStop { /// @brief return until / ended time SUMOTime getUntil() const; + /// @brief return arrival / started time + SUMOTime getArrival() const; + /// @brief return speed for passing waypoint / skipping on-demand stop double getSpeed() const; diff --git a/src/microsim/MSVehicle.cpp b/src/microsim/MSVehicle.cpp index 0bfd2f6711ae..58afbb830f9e 100644 --- a/src/microsim/MSVehicle.cpp +++ b/src/microsim/MSVehicle.cpp @@ -64,6 +64,7 @@ #include #include #include +#include #include #include #include @@ -104,6 +105,7 @@ //#define DEBUG_REVERSE_BIDI //#define DEBUG_EXTRAPOLATE_DEPARTPOS //#define DEBUG_REMOTECONTROL +//#define DEBUG_MOVEREMINDERS //#define DEBUG_COND (getID() == "ego") //#define DEBUG_COND (true) #define DEBUG_COND (isSelected()) @@ -2276,6 +2278,7 @@ MSVehicle::planMoveInternal(const SUMOTime t, MSLeaderInfo ahead, DriveItemVecto assert(lane != 0); const MSLane* leaderLane = myLane; bool foundRailSignal = !isRailway(getVClass()); + bool planningToStop = false; #ifdef PARALLEL_STOPWATCH myLane->getStopWatch()[0].start(); #endif @@ -2572,10 +2575,13 @@ MSVehicle::planMoveInternal(const SUMOTime t, MSLeaderInfo ahead, DriveItemVecto newStopDist = stopDist; // if the vehicle is going to stop we don't need to look further // (except for trains that make use of further link-approach registration for safety purposes) - if (!isWaypoint && !isRailway(getVClass())) { - lfLinks.emplace_back(v, stopDist); - foundRealStop = true; - break; + if (!isWaypoint) { + planningToStop = true; + if (!isRailway(getVClass())) { + lfLinks.emplace_back(v, stopDist); + foundRealStop = true; + break; + } } } } @@ -2897,7 +2903,7 @@ MSVehicle::planMoveInternal(const SUMOTime t, MSLeaderInfo ahead, DriveItemVecto // if stopping is possible, arrivalTime can be arbitrarily large. A small value keeps fractional times (impatience) meaningful double arrivalSpeedBraking = 0; const double bGap = cfModel.brakeGap(v); - if (seen < bGap && !isStopped()) { // XXX: should this use the current speed (at least for the ballistic case)? (Leo) Refs. #2575 + if (seen < bGap && !isStopped() && !planningToStop) { // XXX: should this use the current speed (at least for the ballistic case)? (Leo) Refs. #2575 // vehicle cannot come to a complete stop in time if (MSGlobals::gSemiImplicitEulerUpdate) { arrivalSpeedBraking = cfModel.getMinimalArrivalSpeedEuler(seen, v); @@ -4647,6 +4653,14 @@ MSVehicle::executeMove() { } #endif myState.myBackPos = updateFurtherLanes(myFurtherLanes, myFurtherLanesPosLat, passedLanes); + if (passedLanes.size() > 1 && isRailway(getVClass())) { + for (auto pi = passedLanes.rbegin(); pi != passedLanes.rend(); ++pi) { + MSLane* pLane = *pi; + if (pLane != myLane && std::find(myFurtherLanes.begin(), myFurtherLanes.end(), pLane) == myFurtherLanes.end()) { + leaveLaneBack(MSMoveReminder::NOTIFICATION_JUNCTION, *pi); + } + } + } // bestLanes need to be updated before lane changing starts. NOTE: This call is also a presumption for updateDriveItems() updateBestLanes(); if (myLane != oldLane || oldBackLane != getBackLane()) { @@ -5328,6 +5342,13 @@ MSVehicle::setApproachingForAllLinks(const SUMOTime t) { dpi.mySetRequest, dpi.myArrivalSpeedBraking, getWaitingTime(), dpi.myDistance, getLateralPositionOnLane()); } } + if (isRailway(getVClass())) { + for (DriveProcessItem& dpi : myLFLinkLanes) { + if (dpi.myLink != nullptr && dpi.myLink->getTLLogic() != nullptr && dpi.myLink->getTLLogic()->getLogicType() == TrafficLightType::RAIL_SIGNAL) { + MSRailSignalControl::getInstance().notifyApproach(dpi.myLink); + } + } + } if (myLaneChangeModel->getShadowLane() != nullptr) { // register on all shadow links for (const DriveProcessItem& dpi : myLFLinkLanes) { @@ -5374,6 +5395,7 @@ MSVehicle::registerInsertionApproach(MSLink* link, double dist) { link->setApproaching(this, SUMOTime_MAX, 0, 0, false, arrivalSpeedBraking, 0, dpi.myDistance, 0); // ensure cleanup in the next step myLFLinkLanes.push_back(dpi); + MSRailSignalControl::getInstance().notifyApproach(link); } @@ -5770,6 +5792,37 @@ MSVehicle::leaveLane(const MSMoveReminder::Notification reason, const MSLane* ap } +void +MSVehicle::leaveLaneBack(const MSMoveReminder::Notification reason, const MSLane* leftLane) { + for (MoveReminderCont::iterator rem = myMoveReminders.begin(); rem != myMoveReminders.end();) { + if (rem->first->notifyLeaveBack(*this, reason, leftLane)) { +#ifdef _DEBUG + if (myTraceMoveReminders) { + traceMoveReminder("notifyLeaveBack", rem->first, rem->second, true); + } +#endif + ++rem; + } else { +#ifdef _DEBUG + if (myTraceMoveReminders) { + traceMoveReminder("notifyLeaveBack", rem->first, rem->second, false); + } +#endif + rem = myMoveReminders.erase(rem); + } + } +#ifdef DEBUG_MOVEREMINDERS + if (DEBUG_COND) { + std::cout << SIMTIME << " veh=" << getID() << " myReminders:"; + for (auto rem : myMoveReminders) { + std::cout << rem.first->getDescription() << " "; + } + std::cout << "\n"; + } +#endif +} + + MSAbstractLaneChangeModel& MSVehicle::getLaneChangeModel() { return *myLaneChangeModel; diff --git a/src/microsim/MSVehicle.h b/src/microsim/MSVehicle.h index b24f9d39c301..3494a00b370d 100644 --- a/src/microsim/MSVehicle.h +++ b/src/microsim/MSVehicle.h @@ -821,6 +821,10 @@ class MSVehicle : public MSBaseVehicle { /** @brief Update of members if vehicle leaves a new lane in the lane change step or at arrival. */ void leaveLane(const MSMoveReminder::Notification reason, const MSLane* approachedLane = 0); + /** @brief Update of reminders if vehicle back leaves a lane during (during + * forward movement */ + void leaveLaneBack(const MSMoveReminder::Notification reason, const MSLane* leftLane); + /** @brief Check whether the drive items (myLFLinkLanes) are up to date, * and update them if required. * @note This is the case if a lane change was completed. diff --git a/src/microsim/devices/MSDevice_StationFinder.cpp b/src/microsim/devices/MSDevice_StationFinder.cpp index 3e1aee259846..5bcef05609a9 100644 --- a/src/microsim/devices/MSDevice_StationFinder.cpp +++ b/src/microsim/devices/MSDevice_StationFinder.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include "MSRoutingEngine.h" #include "MSDevice_Battery.h" #include "MSDevice_StationFinder.h" @@ -281,6 +282,66 @@ MSDevice_StationFinder::notifyIdle(SUMOTrafficObject& /*veh*/) { } +void +MSDevice_StationFinder::saveState(OutputDevice& out) const { + out.openTag(SUMO_TAG_DEVICE); + out.writeAttr(SUMO_ATTR_ID, getID()); + std::vector internals; + internals.push_back(toString(myLastChargeCheck)); + internals.push_back(toString(myUpdateSoC)); + internals.push_back(toString(mySearchSoC)); + internals.push_back(toString(myTargetSoC)); + internals.push_back(toString(myWaitForCharge)); + internals.push_back(toString(myRepeatInterval)); + internals.push_back(toString(myRadius)); + internals.push_back(toString(myLastSearch)); + internals.push_back(toString(myReserveFactor)); + internals.push_back(toString(mySearchState)); + internals.push_back(toString(myArrivalAtChargingStation)); + internals.push_back((myChargingStation == nullptr) ? "NULL" : myChargingStation->getID()); + internals.push_back(toString(myChargeLimits.size())); + for (auto chargeLimit : myChargeLimits) { + internals.push_back(toString(chargeLimit.first)); + internals.push_back(toString(chargeLimit.second)); + } + out.writeAttr(SUMO_ATTR_STATE, toString(internals)); + out.closeTag(); +} + + +void +MSDevice_StationFinder::loadState(const SUMOSAXAttributes& attrs) { + std::istringstream bis(attrs.getString(SUMO_ATTR_STATE)); + bis >> myLastChargeCheck; + bis >> myUpdateSoC; + bis >> mySearchSoC; + bis >> myTargetSoC; + bis >> myWaitForCharge; + bis >> myRepeatInterval; + bis >> myRadius; + bis >> myLastSearch; + bis >> myReserveFactor; + int searchState; + bis >> searchState; + mySearchState = (SearchState)searchState; + bis >> myArrivalAtChargingStation; + std::string csID; + bis >> csID; + if (csID != "NULL") { + myChargingStation = dynamic_cast(MSNet::getInstance()->getStoppingPlace(csID, SUMO_TAG_CHARGING_STATION)); + } + int chargeLimitCount = 0; + bis >> chargeLimitCount; + for (int i = 0; i < chargeLimitCount; ++i) { + SUMOTime t = 0; + double limit = 0.; + bis >> t; + bis >> limit; + myChargeLimits.push_back({ t, limit }); + } +} + + void MSDevice_StationFinder::notifyMoveInternal(const SUMOTrafficObject& /*veh*/, const double /* frontOnLane */, @@ -358,6 +419,7 @@ MSDevice_StationFinder::rerouteToChargingStation(bool replace) { stopPar.edge = cs->getLane().getEdge().getID(); stopPar.lane = cs->getLane().getID(); stopPar.duration = TIME2STEPS(expectedConsumption / (cs->getChargingPower(false) * cs->getEfficency())); + stopPar.parametersSet = STOP_DURATION_SET; if (myReplacePlannedStop > 0) { // "reuse" a previously planned stop (stop at charging station instead of a different stop) // what if the charging station is skipped due to long waiting time? @@ -370,6 +432,7 @@ MSDevice_StationFinder::rerouteToChargingStation(bool replace) { if (timeToOriginalStop + myLastSearch < originalUntil) { const SUMOTime delta = originalUntil - (timeToOriginalStop + myLastSearch); stopPar.until = timeToOriginalStop + myLastSearch + (SUMOTime)((double)delta * MIN2(myReplacePlannedStop, 1.)); + stopPar.parametersSet |= STOP_UNTIL_SET; if (myReplacePlannedStop > 1.) { myHolder.abortNextStop(); } @@ -609,11 +672,49 @@ MSDevice_StationFinder::getParameter(const std::string& key) const { return (myChargingStation == nullptr) ? "" : myChargingStation->getID(); } else if (key == "batteryNeed") { return toString(estimateConsumption() * myReserveFactor); + } else if (key == "needToChargeLevel") { + return toString(myRadius); + } else if (key == "saturatedChargeLevel") { + return toString(myRadius); + } else if (key == "waitForCharge") { + return toString(myRadius); + } else if (key == "repeat") { + return toString(myRadius); + } else if (key == "radius") { + return toString(myRadius); + } else if (key == "reserveFactor") { + return toString(myRadius); } throw InvalidArgument(TLF("Parameter '%' is not supported for device of type '%'", key, deviceName())); } +void +MSDevice_StationFinder::setParameter(const std::string& key, const std::string& value) { + double doubleValue; + try { + doubleValue = StringUtils::toDouble(value); + } catch (NumberFormatException&) { + throw InvalidArgument(TLF("Setting parameter '%' requires a number for device of type '%'", key, deviceName())); + } + if (key == "needToChargeLevel") { + mySearchSoC = MAX2(0., MIN2(1., doubleValue)); + } else if (key == "saturatedChargeLevel") { + myTargetSoC = MAX2(0., MIN2(1., doubleValue)); + } else if (key == "waitForCharge") { + myWaitForCharge = TIME2STEPS(MAX2(0., doubleValue)); + } else if (key == "repeat") { + myRepeatInterval = TIME2STEPS(MAX2(0., doubleValue)); + } else if (key == "radius") { + myRadius = MAX2(0., doubleValue); + } else if (key == "reserveFactor") { + myReserveFactor = MAX2(1., doubleValue); + } else { + throw InvalidArgument(TLF("Setting parameter '%' is not supported for device of type '%'", key, deviceName())); + } +} + + bool MSDevice_StationFinder::evaluateCustomComponents(SUMOVehicle& /* veh */, double /* brakeGap */, bool /* newDestination */, MSStoppingPlace* alternative, double /* occupancy */, double /* prob */, diff --git a/src/microsim/devices/MSDevice_StationFinder.h b/src/microsim/devices/MSDevice_StationFinder.h index cebe48590c4d..fd36b8061876 100644 --- a/src/microsim/devices/MSDevice_StationFinder.h +++ b/src/microsim/devices/MSDevice_StationFinder.h @@ -101,7 +101,9 @@ class MSDevice_StationFinder : public MSVehicleDevice, MSStoppingPlaceRerouter { */ static void buildVehicleDevices(SUMOVehicle& v, std::vector& into); -public: + /** @brief Returns the search state corresponding to the / + + public: /** @brief Constructor * * @param[in] holder The vehicle that holds this device @@ -143,6 +145,18 @@ class MSDevice_StationFinder : public MSVehicleDevice, MSStoppingPlaceRerouter { /// @} + /** @brief Saves the state of the device + * + * @param[in] out The OutputDevice to write the information into + */ + void saveState(OutputDevice& out) const; + + /** @brief Loads the state of the device from the given description + * + * @param[in] attrs XML attributes describing the current state + */ + void loadState(const SUMOSAXAttributes& attrs); + /// @brief return the name for this type of device const std::string deviceName() const override { return "stationfinder"; @@ -173,6 +187,9 @@ class MSDevice_StationFinder : public MSVehicleDevice, MSStoppingPlaceRerouter { std::string getParameter(const std::string& key) const override; + /// @brief try to set the given parameter for this device. Throw exception for unsupported key + void setParameter(const std::string& key, const std::string& value); + /** @brief Compute some custom target function components * * @param[in] veh the concerned vehicle diff --git a/src/microsim/traffic_lights/CMakeLists.txt b/src/microsim/traffic_lights/CMakeLists.txt index 06f65f745f4b..6f619acaab68 100644 --- a/src/microsim/traffic_lights/CMakeLists.txt +++ b/src/microsim/traffic_lights/CMakeLists.txt @@ -11,6 +11,8 @@ set(microsim_traffic_lights_STAT_SRCS MSRailSignalConstraint.h MSRailSignalControl.cpp MSRailSignalControl.h + MSDriveWay.cpp + MSDriveWay.h MSPhaseDefinition.h MSPushButton.cpp MSPushButton.h diff --git a/src/microsim/traffic_lights/MSDriveWay.cpp b/src/microsim/traffic_lights/MSDriveWay.cpp new file mode 100644 index 000000000000..883d2a6e7195 --- /dev/null +++ b/src/microsim/traffic_lights/MSDriveWay.cpp @@ -0,0 +1,2016 @@ +/****************************************************************************/ +// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo +// Copyright (C) 2001-2024 German Aerospace Center (DLR) and others. +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0/ +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License 2.0 are satisfied: GNU General Public License, version 2 +// or later which is available at +// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later +/****************************************************************************/ +/// @file MSDriveWay.cpp +/// @author Jakob Erdmann +/// @date December 2021 +/// +// A sequende of rail tracks (lanes) that may be used as a "set route" (Fahrstraße) +/****************************************************************************/ +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "MSRailSignal.h" +#include "MSDriveWay.h" +#include "MSRailSignalControl.h" + +// typical block length in germany on main lines is 3-5km on branch lines up to 7km +// special branches that are used by one train exclusively could also be up to 20km in length +// minimum block size in germany is 37.5m (LZB) +// larger countries (USA, Russia) might see blocks beyond 20km) +#define MAX_BLOCK_LENGTH 20000 +#define MAX_SIGNAL_WARNINGS 10 + +#define DRIVEWAY_SANITY_CHECK +//#define SUBDRIVEWAY_WARN_NOCONFLICT + +//#define DEBUG_BUILD_DRIVEWAY +//#define DEBUG_BUILD_SUBDRIVEWAY +//#define DEBUG_ADD_FOES +//#define DEBUG_BUILD_SIDINGS +//#define DEBUG_DRIVEWAY_BUILDROUTE +//#define DEBUG_CHECK_FLANKS +//#define DEBUG_SIGNALSTATE_PRIORITY +//#define DEBUG_SIGNALSTATE +//#define DEBUG_FIND_PROTECTION +//#define DEBUG_MOVEREMINDER +//#define DEBUG_MATCH + +#define DEBUG_HELPER(obj) ((obj) != nullptr && (obj)->isSelected()) +//#define DEBUG_HELPER(obj) ((obj)->getID() == "") +//#define DEBUG_HELPER(obj) (true) + +//#define DEBUG_COND_DW (dw->myNumericalID == 5) +#define DEBUG_COND_DW (false) + +// =========================================================================== +// static value definitions +// =========================================================================== +int MSDriveWay::myGlobalDriveWayIndex(0); +int MSDriveWay::myNumWarnings(0); +bool MSDriveWay::myWriteVehicles(false); +std::map > MSDriveWay::mySwitchDriveWays; +std::map > MSDriveWay::myReversalDriveWays; +std::map, ComparatorNumericalIdLess> MSDriveWay::myDepartureDriveways; +std::map MSDriveWay::myDepartDrivewayIndex; +std::map > MSDriveWay::myDepartureDrivewaysEnds; +std::map, ComparatorNumericalIdLess> MSDriveWay::myEndingDriveways; +std::map MSDriveWay::myDriveWayRouteLookup; +std::map MSDriveWay::myDriveWayLookup; + +// --------------------------------------------------------------------------- +// static initialisation methods +// --------------------------------------------------------------------------- +void +MSDriveWay::init() { + myWriteVehicles = OptionsCont::getOptions().isSet("railsignal-vehicle-output"); +} + +// =========================================================================== +// MSDriveWay method definitions +// =========================================================================== + + +MSDriveWay::MSDriveWay(const MSLink* origin, const std::string& id, bool temporary) : + MSMoveReminder("DriveWay_" + (temporary ? "tmp" : id)), + Named(id), + myNumericalID(temporary ? -1 : myGlobalDriveWayIndex++), + myOrigin(origin), + myMaxFlankLength(0), + myActive(nullptr), + myCoreSize(0), + myFoundSignal(false), + myFoundJump(false), + myTerminateRoute(false), + myAbortedBuild(false), + myBidiEnded(false), + myIsSubDriveway(false) +{} + + +MSDriveWay::~MSDriveWay() { + for (const MSDriveWay* sub : mySubDriveWays) { + delete sub; + } + mySubDriveWays.clear(); +} + +void +MSDriveWay::cleanup() { + myGlobalDriveWayIndex = 0; + myNumWarnings = 0; + myWriteVehicles = false; + + for (auto item : myDepartureDriveways) { + for (MSDriveWay* dw : item.second) { + delete dw; + } + } + MSDriveWay::mySwitchDriveWays.clear(); + MSDriveWay::myReversalDriveWays.clear(); + MSDriveWay::myDepartureDriveways.clear(); + MSDriveWay::myDepartDrivewayIndex.clear(); + MSDriveWay::myDepartureDrivewaysEnds.clear(); + MSDriveWay::myEndingDriveways.clear(); +} + +void +MSDriveWay::clearState() { + for (auto item : myEndingDriveways) { + for (MSDriveWay* dw : item.second) { + dw->myTrains.clear(); + } + } +} + + +bool +MSDriveWay::notifyEnter(SUMOTrafficObject& veh, Notification reason, const MSLane* enteredLane) { + UNUSED_PARAMETER(reason); + UNUSED_PARAMETER(enteredLane); +#ifdef DEBUG_MOVEREMINDER + std::cout << SIMTIME << " notifyEnter " << getDescription() << " veh=" << veh.getID() << " lane=" << enteredLane->getID() << " reason=" << reason << "\n"; +#endif + if (veh.isVehicle() && enteredLane == myLane && (reason == NOTIFICATION_DEPARTED || reason == NOTIFICATION_JUNCTION || reason == NOTIFICATION_PARKING)) { + SUMOVehicle& sveh = dynamic_cast(veh); + MSRouteIterator firstIt = std::find(sveh.getCurrentRouteEdge(), sveh.getRoute().end(), myLane->getNextNormal()); + if (myTrains.count(&sveh) == 0 && match(firstIt, sveh.getRoute().end())) { + myTrains.insert(&sveh); + if (myOrigin != nullptr) { + MSRailSignalControl::getInstance().notifyApproach(myOrigin); + } + for (const MSDriveWay* foe : myFoes) { + if (foe->myOrigin != nullptr) { + MSRailSignalControl::getInstance().notifyApproach(foe->myOrigin); + } + } + if (myWriteVehicles) { + myVehicleEvents.push_back(VehicleEvent(SIMSTEP, true, veh.getID(), reason)); + } + return true; + } + } + return false; +} + + +bool +MSDriveWay::notifyLeave(SUMOTrafficObject& veh, double /*lastPos*/, Notification reason, const MSLane* enteredLane) { + UNUSED_PARAMETER(reason); + UNUSED_PARAMETER(enteredLane); +#ifdef DEBUG_MOVEREMINDER + std::cout << SIMTIME << " notifyLeave " << getDescription() << " veh=" << veh.getID() << " lane=" << Named::getIDSecure(enteredLane) << " reason=" << toString(reason) << "\n"; +#endif + if (veh.isVehicle()) { + // leaving network with departure, teleport etc + if (reason != MSMoveReminder::NOTIFICATION_JUNCTION && reason != MSMoveReminder::NOTIFICATION_SEGMENT) { + myTrains.erase(&dynamic_cast(veh)); + if (myWriteVehicles) { + myVehicleEvents.push_back(VehicleEvent(SIMSTEP, false, veh.getID(), reason)); + } + return false; + } else { + return true; + } + } else { + return false; + } +} + + +bool +MSDriveWay::notifyLeaveBack(SUMOTrafficObject& veh, Notification reason, const MSLane* leftLane) { + UNUSED_PARAMETER(reason); + UNUSED_PARAMETER(leftLane); +#ifdef DEBUG_MOVEREMINDER + std::cout << SIMTIME << " notifyLeaveBack " << getDescription() << " veh=" << veh.getID() << " lane=" << Named::getIDSecure(leftLane) << " reason=" << toString(reason) << "\n"; +#endif + if (veh.isVehicle()) { + if (leftLane == myForward.back() && veh.getBackLane() != leftLane->getBidiLane()) { + myTrains.erase(&dynamic_cast(veh)); + if (myWriteVehicles) { + myVehicleEvents.push_back(VehicleEvent(SIMSTEP, false, veh.getID(), reason)); + } + return false; + } else { + return true; + } + } else { + return false; + } +} + + +bool +MSDriveWay::reserve(const Approaching& closest, MSEdgeVector& occupied) { + if (foeDriveWayOccupied(true, closest.first, occupied)) { + return false; + } + for (MSLink* foeLink : myConflictLinks) { + if (hasLinkConflict(closest, foeLink)) { +#ifdef DEBUG_SIGNALSTATE + if (gDebugFlag4 || DEBUG_HELPER(closest.first)) { + std::cout << getID() << " linkConflict with " << getTLLinkID(foeLink) << "\n"; + } +#endif + return false; + } + } + myActive = closest.first; + return true; +} + + +bool +MSDriveWay::hasLinkConflict(const Approaching& veh, const MSLink* foeLink) const { +#ifdef DEBUG_SIGNALSTATE_PRIORITY + if (gDebugFlag4) { + std::cout << " checkLinkConflict foeLink=" << getTLLinkID(foeLink) << " ego=" << Named::getIDSecure(veh.first) << "\n"; + } +#endif + if (foeLink->getApproaching().size() > 0) { + Approaching foe = foeLink->getClosest(); +#ifdef DEBUG_SIGNALSTATE_PRIORITY + if (gDebugFlag4) { + std::cout << " approaching foe=" << foe.first->getID() << "\n"; + } +#endif + if (foe.first == veh.first) { + return false; + } + const MSTrafficLightLogic* foeTLL = foeLink->getTLLogic(); + assert(foeTLL != nullptr); + const MSRailSignal* constFoeRS = dynamic_cast(foeTLL); + MSRailSignal* foeRS = const_cast(constFoeRS); + if (foeRS != nullptr) { + const MSDriveWay& foeDriveWay = foeRS->retrieveDriveWayForVeh(foeLink->getTLIndex(), foe.first); + MSEdgeVector occupied; + if (foeDriveWay.foeDriveWayOccupied(false, foe.first, occupied) || + !foeRS->constraintsAllow(foe.first) || + !overlap(foeDriveWay) || + !isFoeOrSubFoe(&foeDriveWay) || + canUseSiding(veh.first, &foeDriveWay).first) { +#ifdef DEBUG_SIGNALSTATE_PRIORITY + if (gDebugFlag4) { + if (foeDriveWay.foeDriveWayOccupied(false, foe.first, occupied)) { + std::cout << " foe blocked\n"; + } else if (!foeRS->constraintsAllow(foe.first)) { + std::cout << " foe constrained\n"; + } else if (!overlap(foeDriveWay)) { + std::cout << " no overlap\n"; + } else if (!isFoeOrSubFoe(&foeDriveWay)) { + std::cout << " foeDW=" << foeDriveWay.getID() << " is not a foe to " << getID() << "\n"; + } else if (canUseSiding(veh.first, &foeDriveWay).first) { + std::cout << " use siding\n"; + } + } +#endif + return false; + } +#ifdef DEBUG_SIGNALSTATE_PRIORITY + if (gDebugFlag4) { + std::cout + << " aSB=" << veh.second.arrivalSpeedBraking << " foeASB=" << foe.second.arrivalSpeedBraking + << " aT=" << veh.second.arrivalTime << " foeAT=" << foe.second.arrivalTime + << " aS=" << veh.first->getSpeed() << " foeS=" << foe.first->getSpeed() + << " aD=" << veh.second.dist << " foeD=" << foe.second.dist + << " aW=" << veh.first->getWaitingTime() << " foeW=" << foe.first->getWaitingTime() + << " aN=" << veh.first->getNumericalID() << " foeN=" << foe.first->getNumericalID() + << "\n"; + } +#endif + const bool yield = mustYield(veh, foe); + if (MSRailSignal::storeVehicles()) { + MSRailSignal::rivalVehicles().push_back(foe.first); + if (yield) { + MSRailSignal::priorityVehicles().push_back(foe.first); + } + } + return yield; + } + } + return false; +} + + +bool +MSDriveWay::isFoeOrSubFoe(const MSDriveWay* foe) const { + if (std::find(myFoes.begin(), myFoes.end(), foe) != myFoes.end()) { + return true; + } + for (const MSDriveWay* sub : foe->mySubDriveWays) { + if (isFoeOrSubFoe(sub)) { + return true; + } + } + return false; +} + + +bool +MSDriveWay::mustYield(const Approaching& veh, const Approaching& foe) { + if (foe.second.arrivalSpeedBraking == veh.second.arrivalSpeedBraking) { + if (foe.second.arrivalTime == veh.second.arrivalTime) { + if (foe.first->getSpeed() == veh.first->getSpeed()) { + if (foe.second.dist == veh.second.dist) { + if (foe.first->getWaitingTime() == veh.first->getWaitingTime()) { + return foe.first->getNumericalID() < veh.first->getNumericalID(); + } else { + return foe.first->getWaitingTime() > veh.first->getWaitingTime(); + } + } else { + return foe.second.dist < veh.second.dist; + } + } else { + return foe.first->getSpeed() > veh.first->getSpeed(); + } + } else { + return foe.second.arrivalTime < veh.second.arrivalTime; + } + } else { + return foe.second.arrivalSpeedBraking > veh.second.arrivalSpeedBraking; + } +} + + +bool +MSDriveWay::conflictLaneOccupied(bool store, const SUMOVehicle* ego) const { + for (const MSLane* lane : myConflictLanes) { + if (!lane->isEmpty()) { + std::string joinVehicle = ""; + if (ego != nullptr && !MSGlobals::gUseMesoSim) { + const SUMOVehicleParameter::Stop* stop = ego->getNextStopParameter(); + if (stop != nullptr) { + joinVehicle = stop->join; + } + } +#ifdef DEBUG_SIGNALSTATE + if (gDebugFlag4) { + std::cout << SIMTIME << " conflictLane " << lane->getID() << " occupied ego=" << Named::getIDSecure(ego) << " vehNumber=" << lane->getVehicleNumber() << "\n"; + if (joinVehicle != "") { + std::cout << " joinVehicle=" << joinVehicle << " occupant=" << toString(lane->getVehiclesSecure()) << "\n"; + lane->releaseVehicles(); + } + } +#endif + if (lane->getVehicleNumberWithPartials() == 1) { + MSVehicle* foe = lane->getLastAnyVehicle(); + if (joinVehicle != "") { + if (foe->getID() == joinVehicle && foe->isStopped()) { +#ifdef DEBUG_SIGNALSTATE + if (gDebugFlag4) { + std::cout << " ignore join-target '" << joinVehicle << "\n"; + } +#endif + continue; + } + } + if (ego != nullptr) { + if (foe == ego && std::find(myForward.begin(), myForward.end(), lane) == myForward.end()) { +#ifdef DEBUG_SIGNALSTATE + if (gDebugFlag4) { + std::cout << " ignore ego as oncoming '" << ego->getID() << "\n"; + } +#endif + continue; + } + if (foe->isStopped() && foe->getNextStopParameter()->join == ego->getID()) { +#ifdef DEBUG_SIGNALSTATE + if (gDebugFlag4) { + std::cout << " ignore " << foe->getID() << " for which ego is join-target\n"; + } +#endif + continue; + } + } + } + if (MSRailSignal::storeVehicles() && store) { + MSRailSignal::blockingVehicles().push_back(lane->getLastAnyVehicle()); + } + return true; + } + } + return false; +} + + +bool +MSDriveWay::foeDriveWayApproached() const { + for (const MSDriveWay* foeDW : myFoes) { + if (foeDW->myOrigin != nullptr && foeDW->myOrigin->getApproaching().size() > 0) { +#ifdef DEBUG_SIGNALSTATE + if (gDebugFlag4) { + std::cout << SIMTIME << " foeLink=" << foeDW->myOrigin->getDescription() << " approachedBy=" << foeDW->myOrigin->getApproaching().begin()->first->getID() << "\n"; + } +#endif + return true; + } + } + return false; +} + + +bool +MSDriveWay::foeDriveWayOccupied(bool store, const SUMOVehicle* ego, MSEdgeVector& occupied) const { + for (const MSDriveWay* foeDW : myFoes) { + if (!foeDW->myTrains.empty()) { +#ifdef DEBUG_SIGNALSTATE + if (gDebugFlag4 || DEBUG_COND_DW || DEBUG_HELPER(ego)) { + std::cout << SIMTIME << " " << getID() << " foeDriveWay " << foeDW->getID() << " occupied ego=" << Named::getIDSecure(ego) << " foeVeh=" << toString(foeDW->myTrains) << "\n"; + } +#endif + if (foeDW->myTrains.size() == 1) { + SUMOVehicle* foe = *foeDW->myTrains.begin(); + if (foe == ego) { +#ifdef DEBUG_SIGNALSTATE + if (gDebugFlag4 || DEBUG_HELPER(ego)) { + std::cout << " ignore ego as foe '" << Named::getIDSecure(ego) << "\n"; + } +#endif + continue; + } + if (hasJoin(ego, foe)) { + continue; + } + } + std::pair useSiding = canUseSiding(ego, foeDW); +#ifdef DEBUG_SIGNALSTATE + if (gDebugFlag4 || DEBUG_COND_DW || DEBUG_HELPER(ego)) { + auto it = mySidings.find(foeDW); + int numSidings = 0; + if (it != mySidings.end()) { + numSidings = it->second.size(); + } + std::cout << " useSiding=" << useSiding.first << " sidingFoe=" << Named::getIDSecure(useSiding.second) << " numSidings=" << numSidings << "\n"; + } +#endif + if (useSiding.first) { + continue; + } else { + if (MSRailSignal::storeVehicles() && store) { + for (SUMOVehicle* foe : foeDW->myTrains) { + MSRailSignal::blockingVehicles().push_back(foe); + } + MSRailSignal::blockingDriveWays().push_back(foeDW); + } + for (const SUMOVehicle* foe : foeDW->myTrains) { + occupied.push_back(const_cast(foe->getEdge())); + MSEdge* bidi = const_cast(foe->getEdge()->getBidiEdge()); + if (bidi != nullptr) { + occupied.push_back(bidi); + } + /// @todo: if foe occupies more than one edge we should add all of them to the occupied vector + } + if (ego != nullptr && MSGlobals::gTimeToTeleportRSDeadlock > 0 + && (ego->getWaitingTime() > ego->getVehicleType().getCarFollowModel().getStartupDelay() || !ego->isOnRoad())) { + // if there is an occupied siding, it becomes part of the waitRelation + SUMOVehicle* foe = *(useSiding.second == nullptr ? foeDW : useSiding.second)->myTrains.begin(); + const MSRailSignal* rs = myOrigin != nullptr ? dynamic_cast(myOrigin->getTLLogic()) : nullptr; + MSRailSignalControl::getInstance().addWaitRelation(ego, rs, foe); + } + return true; + } + } else if (foeDW != this && isDepartDriveway() && !foeDW->isDepartDriveway()) { + if (foeDW->myOrigin->getApproaching().size() > 0) { + Approaching foeA = foeDW->myOrigin->getClosest(); + const SUMOVehicle* foe = foeA.first; + if (foeA.second.dist < foe->getBrakeGap(true)) { + MSRouteIterator firstIt = std::find(foe->getCurrentRouteEdge(), foe->getRoute().end(), foeDW->myRoute.front()); + if (firstIt != foe->getRoute().end()) { + if (foeDW->match(firstIt, foe->getRoute().end())) { + bool useSiding = canUseSiding(ego, foeDW).first; +#ifdef DEBUG_SIGNALSTATE + if (gDebugFlag4 || DEBUG_COND_DW || DEBUG_HELPER(ego)) { + std::cout << SIMTIME << " " << getID() << " blocked by " << foeDW->getID() << " (approached by " << foe->getID() << ") useSiding=" << useSiding << "\n"; + } +#endif + if (useSiding) { + //std::cout << SIMTIME << " " << getID() << " ego=" << ego->getID() << " foeDW=" << foeDW->getID() << " myFoes=" << toString(myFoes) << "\n"; + continue; + } else { + return true; + } + } + } + } + } + } + } + for (const std::set& dlFoes : myDeadlocks) { + bool allOccupied = true; + for (const MSDriveWay* dlFoe : dlFoes) { + if (dlFoe->myTrains.empty()) { + allOccupied = false; + //std::cout << SIMTIME << " " << getID() << " ego=" << Named::getIDSecure(ego) << " deadlockCheck clear " << dlFoe->getID() << "\n"; + break; + } + } + if (allOccupied) { +#ifdef DEBUG_SIGNALSTATE + if (gDebugFlag4 || DEBUG_COND_DW || DEBUG_HELPER(ego)) { + std::cout << SIMTIME << " " << getID() << " ego=" << Named::getIDSecure(ego) << " deadlockCheck " << joinNamedToString(dlFoes, " ") << "\n"; + } +#endif + for (const MSDriveWay* dlFoe : dlFoes) { + MSRailSignal::blockingDriveWays().push_back(dlFoe); + } + return true; + } + } + return false; +} + + +bool +MSDriveWay::hasJoin(const SUMOVehicle* ego, const SUMOVehicle* foe) { + if (ego != nullptr && !MSGlobals::gUseMesoSim) { + std::string joinVehicle = ""; + const SUMOVehicleParameter::Stop* stop = ego->getNextStopParameter(); + if (stop != nullptr) { + joinVehicle = stop->join; + } + if (joinVehicle == "" && !ego->hasDeparted() && ego->getStops().size() > 1) { + // check one more stop + auto it = ego->getStops().begin(); + std::advance(it, 1); + joinVehicle = it->pars.join; + } + if (joinVehicle != "") { +#ifdef DEBUG_SIGNALSTATE + if (gDebugFlag4 || DEBUG_COND_DW) { + std::cout << " joinVehicle=" << joinVehicle << "\n"; + } +#endif + if (foe->getID() == joinVehicle && foe->isStopped()) { +#ifdef DEBUG_SIGNALSTATE + if (gDebugFlag4 || DEBUG_COND_DW) { + std::cout << " ignore join-target '" << joinVehicle << "\n"; + } +#endif + return true; + } + } + + if (foe->isStopped() && foe->getNextStopParameter()->join == ego->getID()) { +#ifdef DEBUG_SIGNALSTATE + if (gDebugFlag4 || DEBUG_COND_DW) { + std::cout << " ignore " << foe->getID() << " for which ego is join-target\n"; + } +#endif + return true; + } + } + return false; +} + + +std::pair +MSDriveWay::canUseSiding(const SUMOVehicle* ego, const MSDriveWay* foe, bool recurse) const { + auto it = mySidings.find(foe); + if (it != mySidings.end()) { + for (auto siding : it->second) { + // assume siding is usuable when computing state for unapproached signal (ego == nullptr) + if (ego == nullptr || siding.length >= ego->getLength()) { + // if the siding is already "reserved" by another vehicle we cannot use it here + const MSEdge* sidingEnd = myRoute[siding.end]; + for (MSDriveWay* sidingApproach : myEndingDriveways[sidingEnd]) { + if (!sidingApproach->myTrains.empty()) { + // possibly the foe vehicle can use the other part of the siding + if (recurse) { + const SUMOVehicle* foeVeh = nullptr; + if (!foe->myTrains.empty()) { + foeVeh = *foe->myTrains.begin(); + } else if (foe->myOrigin != nullptr && foe->myOrigin->getApproaching().size() > 0) { + foeVeh = foe->myOrigin->getClosest().first; + } + if (foeVeh == nullptr) { + WRITE_WARNINGF("Invalid call to canUseSiding dw=% foe=% ego=% time=%", getID(), foe->getID(), Named::getIDSecure(ego), time2string(SIMSTEP)); + continue; + } + if (foe->canUseSiding(foeVeh, this, false).first) { + continue; + } + } + // possibly the foe vehicle + // @todo: in principle it might still be possible to continue if vehicle that approaches the siding can safely leave the situation +#ifdef DEBUG_SIGNALSTATE + if (gDebugFlag4 || DEBUG_COND_DW || DEBUG_HELPER(ego)) { + std::cout << SIMTIME << " " << getID() << " ego=" << Named::getIDSecure(ego) << " foe=" << foe->getID() + << " foeVeh=" << toString(foe->myTrains) + << " sidingEnd=" << sidingEnd->getID() << " sidingApproach=" << sidingApproach->getID() << " approaching=" << toString(sidingApproach->myTrains) << "\n"; + } +#endif + return std::make_pair(false, sidingApproach); + } + } + //std::cout << SIMTIME << " " << getID() << " ego=" << Named::getIDSecure(ego) << " foe=" << foe->getID() + // << " foeVeh=" << toString(foe->myTrains) + // << " sidingEnd=" << sidingEnd->getID() << "usable\n"; + return std::make_pair(true, nullptr); + } + } + } + return std::make_pair(false, nullptr); +} + +bool +MSDriveWay::overlap(const MSDriveWay& other) const { + for (int i = 0; i < myCoreSize; i++) { + for (int j = 0; j < other.myCoreSize; j++) { + const MSEdge* edge = myRoute[i]; + const MSEdge* edge2 = other.myRoute[j]; + if (edge->getToJunction() == edge2->getToJunction() + || edge->getToJunction() == edge2->getFromJunction()) { + // XXX might be rail_crossing with parallel tracks + return true; + } + } + } + return false; +} + + +bool +MSDriveWay::flankConflict(const MSDriveWay& other) const { + for (const MSLane* lane : myForward) { + for (const MSLane* lane2 : other.myForward) { + if (lane == lane2) { + return true; + } + } + for (const MSLane* lane2 : other.myBidi) { + if (lane == lane2) { + if (bidiBlockedBy(other)) { + // it's only a deadlock if both trains block symmetrically + return true; + } + } + } + for (const MSLane* lane2 : other.myBidiExtended) { + if (lane == lane2) { + if (bidiBlockedBy(other)) { + // it's only a deadlock if both trains block symmetrically + return true; + } + } + } + } + return false; +} + + +bool +MSDriveWay::crossingConflict(const MSDriveWay& other) const { + for (const MSLane* lane : myForward) { + for (const MSLane* lane2 : other.myForward) { + if (lane->isNormal() && lane2->isNormal() && lane->getEdge().getToJunction() == lane2->getEdge().getToJunction()) { + return true; + } + } + } + return false; +} + + +bool +MSDriveWay::bidiBlockedBy(const MSDriveWay& other) const { + for (const MSLane* lane : myBidi) { + for (const MSLane* lane2 : other.myForward) { + if (lane == lane2) { + return true; + } + } + } + for (const MSLane* lane : myBidiExtended) { + for (const MSLane* lane2 : other.myForward) { + if (lane == lane2) { + if (overlap(other)) { + return true; + } + } + } + } + return false; +} + + +bool +MSDriveWay::bidiBlockedByEnd(const MSDriveWay& other) const { + const MSLane* end = other.myForward.back(); + for (const MSLane* lane : myBidi) { + if (lane == end) { + return true; + } + } + for (const MSLane* lane : myBidiExtended) { + if (lane == end) { + if (overlap(other)) { + return true; + } + } + } + return false; +} + +bool +MSDriveWay::forwardRouteConflict(std::set forward, const MSDriveWay& other, bool secondCheck) { + int i = 0; + for (const MSEdge* edge2 : other.myRoute) { + if (i == other.myCoreSize) { + return false; + } + i++; + if (edge2 == myForward.front()->getNextNormal() && !secondCheck) { + // foe should not pass from behind through our own forward section + return false; + } + if (forward.count(edge2->getBidiEdge()) != 0) { + return true; + } + } + return false; +} + +void +MSDriveWay::writeBlocks(OutputDevice& od) const { + od.openTag(myIsSubDriveway ? SUMO_TAG_SUBDRIVEWAY : SUMO_TAG_DRIVEWAY); + od.writeAttr(SUMO_ATTR_ID, myID); + od.writeAttr(SUMO_ATTR_VEHICLE, myFirstVehicle); + od.writeAttr(SUMO_ATTR_EDGES, toString(myRoute)); + if (myCoreSize != (int)myRoute.size()) { + od.writeAttr("core", myCoreSize); + } + od.openTag("forward"); + od.writeAttr(SUMO_ATTR_LANES, toString(myForward)); + od.closeTag(); + if (!myIsSubDriveway) { + od.openTag("bidi"); + od.writeAttr(SUMO_ATTR_LANES, toString(myBidi)); + if (myBidiExtended.size() > 0) { + od.lf(); + od << " "; + od.writeAttr("deadlockCheck", toString(myBidiExtended)); + } + od.closeTag(); + od.openTag("flank"); + od.writeAttr(SUMO_ATTR_LANES, toString(myFlank)); + od.closeTag(); + + od.openTag("conflictLinks"); + + std::vector signals; + for (MSLink* link : myConflictLinks) { + signals.push_back(getTLLinkID(link)); + } + od.writeAttr("signals", joinToStringSorting(signals, " ")); + od.closeTag(); + + std::vector foes; + for (MSDriveWay* dw : myFoes) { + foes.push_back(dw->myID); + } + if (foes.size() > 0) { + od.openTag("foes"); + od.writeAttr("driveWays", joinToStringSorting(foes, " ")); + od.closeTag(); + } + for (auto item : mySidings) { + od.openTag("sidings"); + od.writeAttr("foe", item.first->getID()); + for (auto siding : item.second) { + od.openTag("siding"); + od.writeAttr("start", myRoute[siding.start]->getID()); + od.writeAttr("end", myRoute[siding.end]->getID()); + od.writeAttr("length", siding.length); + od.closeTag(); + } + od.closeTag(); + } + for (auto item : myDeadlocks) { + od.openTag("deadlock"); + od.writeAttr("foes", joinNamedToStringSorting(item, " ")); + od.closeTag(); + } + } + od.closeTag(); // driveWay + + for (const MSDriveWay* sub : mySubDriveWays) { + sub->writeBlocks(od); + } +#ifdef DRIVEWAY_SANITY_CHECK + std::set uFoes(myFoes.begin(), myFoes.end()); + if (uFoes.size() != myFoes.size()) { + WRITE_WARNINGF("Duplicate foes in driveway '%'", getID()); + + } +#endif +} + + +void +MSDriveWay::writeBlockVehicles(OutputDevice& od) const { + od.openTag(myIsSubDriveway ? "subDriveWay" : "driveWay"); + od.writeAttr(SUMO_ATTR_ID, myID); + for (const VehicleEvent& ve : myVehicleEvents) { + od.openTag(ve.isEntry ? "entry" : "exit"); + od.writeAttr(SUMO_ATTR_ID, ve.id); + od.writeAttr(SUMO_ATTR_TIME, time2string(ve.time)); + od.writeAttr("reason", ve.reason); + od.closeTag(); // event + } + od.closeTag(); // driveWay + + for (const MSDriveWay* sub : mySubDriveWays) { + sub->writeBlockVehicles(od); + } +} + + +void +MSDriveWay::buildRoute(const MSLink* origin, double length, + MSRouteIterator next, MSRouteIterator end, + LaneVisitedMap& visited, + std::set& flankSwitches) { + bool seekForwardSignal = true; + bool seekBidiSwitch = true; + bool foundUnsafeSwitch = false; + MSLane* toLane = origin ? origin->getViaLaneOrLane() : (*next)->getLanes()[0]; + const std::string warnID = origin ? "rail signal " + getClickableTLLinkID(origin) : "insertion lane '" + toLane->getID() + "'"; +#ifdef DEBUG_DRIVEWAY_BUILDROUTE + gDebugFlag4 = DEBUG_COND_DW; + if (gDebugFlag4) std::cout << "buildRoute origin=" << warnID << " vehRoute=" << toString(ConstMSEdgeVector(next, end)) + << " visited=" << formatVisitedMap(visited) << "\n"; +#endif + while ((seekForwardSignal || seekBidiSwitch)) { + if (length > MAX_BLOCK_LENGTH) { + if (myNumWarnings < MAX_SIGNAL_WARNINGS) { + WRITE_WARNING("Block after " + warnID + + " exceeds maximum length (stopped searching after edge '" + toLane->getEdge().getID() + "' (length=" + toString(length) + "m)."); + } + myNumWarnings++; + myAbortedBuild = true; + // length exceeded +#ifdef DEBUG_DRIVEWAY_BUILDROUTE + if (gDebugFlag4) { + std::cout << " abort: length=" << length << "\n"; + } +#endif + return; + } +#ifdef DEBUG_DRIVEWAY_BUILDROUTE + if (gDebugFlag4) { + std::cout << " toLane=" << toLane->getID() << " visited=" << formatVisitedMap(visited) << "\n"; + } +#endif + const MSEdge* current = &toLane->getEdge(); + if (current->isNormal()) { + myRoute.push_back(current); + if (next != end) { + next++; + } + } + appendMapIndex(visited, toLane); + length += toLane->getLength(); + MSLane* bidi = toLane->getBidiLane(); + if (seekForwardSignal) { + if (!foundUnsafeSwitch) { + myForward.push_back(toLane); + if (myForward.size() == 1) { + myLane = toLane; + toLane->addMoveReminder(this); + } + } + } else if (bidi == nullptr) { + if (toLane->isInternal() && toLane->getIncomingLanes().front().viaLink->isTurnaround()) { +#ifdef DEBUG_DRIVEWAY_BUILDROUTE + if (gDebugFlag4) { + std::cout << " continue bidiSearch beyond turnaround\n"; + } +#endif + } else { + seekBidiSwitch = false; +#ifdef DEBUG_DRIVEWAY_BUILDROUTE + if (gDebugFlag4) { + std::cout << " noBidi, abort search for bidiSwitch\n"; + } +#endif + } + } + if (bidi != nullptr) { + if (foundUnsafeSwitch) { + myBidiExtended.push_back(bidi); + } else { + myBidi.push_back(bidi); + } + if (!seekForwardSignal) { + // look for switch that could protect from oncoming vehicles + for (const auto& ili : bidi->getIncomingLanes()) { + if (ili.viaLink->getDirection() == LinkDirection::TURN) { + continue; + } + for (const MSLink* const link : ili.lane->getLinkCont()) { + if (link->getDirection() == LinkDirection::TURN) { + continue; + } + if (link->getViaLaneOrLane() != bidi) { + myCoreSize = (int)myRoute.size(); +#ifdef DEBUG_DRIVEWAY_BUILDROUTE + if (gDebugFlag4) { + const MSEdge* const bidiNext = bidi->getNextNormal(); + std::cout << " found unsafe switch " << ili.viaLink->getDescription() << " (used=" << bidiNext->getID() << ")\n"; + } +#endif + // trains along our route beyond this switch might create deadlock + foundUnsafeSwitch = true; + // the switch itself must still be guarded to ensure safety + for (const auto& ili2 : bidi->getIncomingLanes()) { + if (ili2.viaLink->getDirection() != LinkDirection::TURN) { + flankSwitches.insert(ili.viaLink); + } + } + } + } + } + } + } + const std::vector& links = toLane->getLinkCont(); + toLane = nullptr; + for (const MSLink* const link : links) { + if ((next != end && &link->getLane()->getEdge() == *next) + && isRailway(link->getViaLaneOrLane()->getPermissions())) { + toLane = link->getViaLaneOrLane(); + if (link->getTLLogic() != nullptr) { + if (link == origin) { + WRITE_WARNINGF(TL("Found circular block after % (% edges, length %)"), warnID, toString(myRoute.size()), toString(length)); + //std::cout << getClickableTLLinkID(origin) << " circularBlock2=" << toString(myRoute) << "\n"; + myAbortedBuild = true; +#ifdef DEBUG_DRIVEWAY_BUILDROUTE + if (gDebugFlag4) { + std::cout << " abort: found circle\n"; + } +#endif + return; + } + seekForwardSignal = false; + myFoundSignal = true; + seekBidiSwitch = bidi != nullptr; +#ifdef DEBUG_DRIVEWAY_BUILDROUTE + if (gDebugFlag4) { + std::cout << " found forwardSignal " << link->getTLLogic()->getID() << " seekBidiSwitch=" << seekBidiSwitch << "\n"; + } +#endif + } + //if (links.size() > 1 && !foundUnsafeSwitch) { + if (isSwitch(link)) { + // switch on driveway + //std::cout << "mySwitchDriveWays " << getID() << " link=" << link->getDescription() << "\n"; + mySwitchDriveWays[link].push_back(this); + } + if (link->getLane()->getBidiLane() != nullptr && &link->getLane()->getEdge() == current->getBidiEdge()) { + // reversal on driveway + myReversalDriveWays[current].push_back(this); + myReversals.push_back(current); + } + break; + } + } + if (toLane == nullptr) { + if (next != end) { + // no connection found, jump to next route edge + toLane = (*next)->getLanes()[0]; +#ifdef DEBUG_DRIVEWAY_BUILDROUTE + if (gDebugFlag4) { + std::cout << " abort: turn-around or jump\n"; + } +#endif + myFoundJump = true; + return; + } else { +#ifdef DEBUG_DRIVEWAY_BUILDROUTE + if (gDebugFlag4) { + std::cout << " abort: no next lane available\n"; + } +#endif + myTerminateRoute = true; + return; + } + } + } + myBidiEnded = !seekBidiSwitch; +#ifdef DEBUG_DRIVEWAY_BUILDROUTE + if (gDebugFlag4) { + std::cout << " normalEnd myBidiEnded=" << myBidiEnded << "\n"; + } +#endif +} + + +bool +MSDriveWay::isSwitch(const MSLink* link) { + for (const MSLink* other : link->getLaneBefore()->getNormalPredecessorLane()->getLinkCont()) { + if (other->getLane() != link->getLane() && !other->isTurnaround()) { + return true; + } + } + for (auto ili : link->getLane()->getIncomingLanes()) { + if (ili.viaLink != link && !ili.viaLink->isTurnaround()) { + return true; + } + } + const MSLane* bidi = link->getLane()->getBidiLane(); + if (bidi != nullptr) { + for (const MSLink* other : bidi->getLinkCont()) { + if (other->getLane() != link->getLaneBefore()->getNormalPredecessorLane()->getBidiLane() && !other->isTurnaround()) { + return true; + } + } + } + return false; +} + + +void +MSDriveWay::checkFlanks(const MSLink* originLink, const std::vector& lanes, const LaneVisitedMap& visited, bool allFoes, std::set& flankSwitches) const { +#ifdef DEBUG_CHECK_FLANKS + std::cout << " checkFlanks lanes=" << toString(lanes) << " allFoes=" << allFoes << "\n"; +#endif + const MSLink* reverseOriginLink = originLink != nullptr && originLink->getLane()->getBidiLane() != nullptr && originLink->getLaneBefore()->getBidiLane() != nullptr + ? originLink->getLane()->getBidiLane()->getLinkTo(originLink->getLaneBefore()->getBidiLane()) + : nullptr; + //std::cout << " originLink=" << originLink->getDescription() << "\n"; + if (reverseOriginLink != nullptr) { + reverseOriginLink = reverseOriginLink->getCorrespondingExitLink(); + //std::cout << " reverseOriginLink=" << reverseOriginLink->getDescription() << "\n"; + } + for (int i = 0; i < (int)lanes.size(); i++) { + const MSLane* lane = lanes[i]; + const MSLane* prev = i > 0 ? lanes[i - 1] : nullptr; + const MSLane* next = i + 1 < (int)lanes.size() ? lanes[i + 1] : nullptr; + if (lane->isInternal()) { + continue; + } + for (auto ili : lane->getIncomingLanes()) { + if (ili.viaLink == originLink + || ili.viaLink == reverseOriginLink + || ili.viaLink->getDirection() == LinkDirection::TURN + || ili.viaLink->getDirection() == LinkDirection::TURN_LEFTHAND) { + continue; + } + if (ili.lane != prev && ili.lane != next) { +#ifdef DEBUG_CHECK_FLANKS + std::cout << " add flankSwitch junction=" << ili.viaLink->getJunction()->getID() << " index=" << ili.viaLink->getIndex() << " iLane=" << ili.lane->getID() << " prev=" << Named::getIDSecure(prev) << " targetLane=" << lane->getID() << " next=" << Named::getIDSecure(next) << "\n"; +#endif + flankSwitches.insert(ili.viaLink); + } else if (allFoes) { + // link is part of the driveway, find foes that cross the driveway without entering + checkCrossingFlanks(ili.viaLink, visited, flankSwitches); + } + } + } +} + + +void +MSDriveWay::checkCrossingFlanks(MSLink* dwLink, const LaneVisitedMap& visited, std::set& flankSwitches) const { +#ifdef DEBUG_CHECK_FLANKS + std::cout << " checkCrossingFlanks dwLink=" << dwLink->getDescription() << " visited=" << formatVisitedMap(visited) << "\n"; +#endif + const MSJunction* junction = dwLink->getJunction(); + if (junction == nullptr) { + return; // unregulated junction; + } + const MSJunctionLogic* logic = junction->getLogic(); + if (logic == nullptr) { + return; // unregulated junction; + } + for (const MSEdge* in : junction->getIncoming()) { + if (in->isInternal()) { + continue; + } + for (MSLane* inLane : in->getLanes()) { + const MSLane* inBidi = inLane->getBidiLane(); + if (isRailway(inLane->getPermissions()) && visited.count(inLane) == 0 && (inBidi == nullptr || visited.count(inBidi) == 0)) { + for (MSLink* link : inLane->getLinkCont()) { + if (link->getIndex() >= 0 && logic->getFoesFor(dwLink->getIndex()).test(link->getIndex()) + && visited.count(link->getLane()) == 0) { +#ifdef DEBUG_CHECK_FLANKS + std::cout << " add crossing flankSwitch junction=" << junction->getID() << " index=" << link->getIndex() << "\n"; +#endif + if (link->getViaLane() == nullptr) { + flankSwitches.insert(link); + } else { + flankSwitches.insert(link->getViaLane()->getLinkCont().front()); + } + } + } + } + } + } +} + +void +MSDriveWay::findFlankProtection(MSLink* link, MSLink* origLink, std::vector& flank) { +#ifdef DEBUG_CHECK_FLANKS + std::cout << " findFlankProtection link=" << link->getDescription() << " origLink=" << origLink->getDescription() << "\n"; +#endif + if (link->getCorrespondingEntryLink()->getTLLogic() != nullptr) { + MSLink* entry = const_cast(link->getCorrespondingEntryLink()); + // guarded by signal +#ifdef DEBUG_CHECK_FLANKS + std::cout << " flank guarded by " << entry->getTLLogic()->getID() << "\n"; +#endif + // @note, technically it's enough to collect links from foe driveways + // but this also adds "unused" conflict links which may aid comprehension + myConflictLinks.push_back(entry); + addFoes(entry); + } else { + const MSLane* lane = link->getLaneBefore(); + std::vector predLinks; + for (auto ili : lane->getIncomingLanes()) { + if (!ili.viaLink->isTurnaround()) { + predLinks.push_back(ili.viaLink); + } + } + if (predLinks.size() > 1) { + // this is a switch +#ifdef DEBUG_ADD_FOES + std::cout << " predecessors of " << link->getDescription() << " isSwitch\n"; +#endif + for (MSLink* pred : predLinks) { + addSwitchFoes(pred); + } + } else if (predLinks.size() == 1) { + if (isSwitch(link)) { + addSwitchFoes(link); + } else { + // continue upstream via single predecessor + findFlankProtection(predLinks.front(), origLink, flank); + } + } + } +} + + +void +MSDriveWay::addSwitchFoes(MSLink* link) { + auto it = mySwitchDriveWays.find(link); + if (it != mySwitchDriveWays.end()) { +#ifdef DEBUG_ADD_FOES + std::cout << " driveway " << myID << " addSwitchFoes for link " << link->getDescription() << "\n"; +#endif + for (MSDriveWay* foe : it->second) { + if (foe != this && (flankConflict(*foe) || foe->flankConflict(*this) || crossingConflict(*foe) || foe->crossingConflict(*this))) { +#ifdef DEBUG_ADD_FOES + std::cout << " foe=" << foe->myID + << " fc1=" << flankConflict(*foe) << " fc2=" << foe->flankConflict(*this) + << " cc1=" << crossingConflict(*foe) << " cc2=" << foe->crossingConflict(*this) << "\n"; +#endif + myFoes.push_back(foe); + } else { +#ifdef DEBUG_ADD_FOES + std::cout << " cand=" << foe->myID << "\n"; +#endif + } + } + } +} + + +MSDriveWay* +MSDriveWay::buildDriveWay(const std::string& id, const MSLink* link, MSRouteIterator first, MSRouteIterator end) { + // collect lanes and links that are relevant for setting this signal for the current driveWay + // For each driveway we collect + // - conflictLanes (signal must be red if any conflict lane is occupied) + // - conflictLinks (signal must be red if any conflict link is approached by a vehicle + // - that cannot break in time (arrivalSpeedBraking > 0) + // - approached by a vehicle with higher switching priority (see #3941) + // These objects are construct in steps: + // + // forwardBlock + // - search forward recursive from outgoing lane until controlled railSignal link found + // -> add all found lanes to conflictLanes + // + // bidiBlock (if any forwardBlock edge has bidi edge) + // - search bidi backward recursive until first switch + // - from switch search backward recursive all other incoming until controlled rail signal link + // -> add final links to conflictLinks + // + // flanks + // - search backward recursive from flanking switches + // until controlled railSignal link or protecting switch is found + // -> add all found lanes to conflictLanes + // -> add final links to conflictLinks + MSDriveWay* dw = new MSDriveWay(link, id); + LaneVisitedMap visited; + std::vector before; + MSLane* fromBidi = nullptr; + if (link != nullptr) { + appendMapIndex(visited, link->getLaneBefore()); + fromBidi = link->getLaneBefore()->getBidiLane(); + } + std::set flankSwitches; // list of switches that threaten the driveway and for which protection must be found + + if (fromBidi != nullptr) { + before.push_back(fromBidi); + } + dw->buildRoute(link, 0., first, end, visited, flankSwitches); + dw->myCoreSize = (int)dw->myRoute.size(); + dw->checkFlanks(link, dw->myForward, visited, true, flankSwitches); + dw->checkFlanks(link, dw->myBidi, visited, false, flankSwitches); + dw->checkFlanks(link, before, visited, true, flankSwitches); + for (MSLink* fsLink : flankSwitches) { +#ifdef DEBUG_ADD_FOES + if (DEBUG_COND_DW) { + std::cout << " fsLink=" << fsLink->getDescription() << "\n"; + } +#endif + dw->findFlankProtection(fsLink, fsLink, dw->myFlank); + } + std::set flankSwitchesBidiExtended; + dw->checkFlanks(link, dw->myBidiExtended, visited, false, flankSwitchesBidiExtended); + for (MSLink* link : flankSwitchesBidiExtended) { +#ifdef DEBUG_ADD_FOES + if (DEBUG_COND_DW) { + std::cout << " fsLinkExtended=" << link->getDescription() << "\n"; + } +#endif + dw->findFlankProtection(link, link, dw->myBidiExtended); + } + MSRailSignal* rs = link ? const_cast(static_cast(link->getTLLogic())) : nullptr; + const bool movingBlock = (rs && rs->isMovingBlock()) || (!rs && OptionsCont::getOptions().getBool("railsignal-moving-block")); +#ifdef DEBUG_BUILD_DRIVEWAY + if (DEBUG_COND_DW) { + std::cout << SIMTIME << " buildDriveWay " << dw->myID << " link=" << (link == nullptr ? "NULL" : link->getDescription()) + << "\n route=" << toString(dw->myRoute) + << "\n forward=" << toString(dw->myForward) + << "\n bidi=" << toString(dw->myBidi) + << "\n bidiEx=" << toString(dw->myBidiExtended) + << "\n flank=" << toString(dw->myFlank) + << "\n flankSwitch=" << MSRailSignal::describeLinks(std::vector(flankSwitches.begin(), flankSwitches.end())) + << "\n coreSize=" << dw->myCoreSize + << "\n"; + } +#endif + if (!rs || !rs->isMovingBlock()) { + dw->myConflictLanes.insert(dw->myConflictLanes.end(), dw->myForward.begin(), dw->myForward.end()); + } + dw->myConflictLanes.insert(dw->myConflictLanes.end(), dw->myBidi.begin(), dw->myBidi.end()); + dw->myConflictLanes.insert(dw->myConflictLanes.end(), dw->myFlank.begin(), dw->myFlank.end()); + dw->addBidiFoes(rs, false); + dw->addBidiFoes(rs, true); + // add driveways that start on the same signal / lane + dw->addParallelFoes(link, *first); + // add driveways that reverse along this driveways route + dw->addReversalFoes(); + // make foes unique and symmetrical + std::set uniqueFoes(dw->myFoes.begin(), dw->myFoes.end()); + std::set uniqueCLink(dw->myConflictLinks.begin(), dw->myConflictLinks.end()); + dw->myFoes.clear(); + const MSEdge* lastEdge = &dw->myForward.back()->getEdge(); + for (MSDriveWay* foe : uniqueFoes) { + const MSEdge* foeLastEdge = &foe->myForward.back()->getEdge(); + const bool sameLast = foeLastEdge == lastEdge; + if (sameLast && !movingBlock) { + dw->myFoes.push_back(foe); + if (foe != dw) { + foe->myFoes.push_back(dw); + } + } else { + if (foe->bidiBlockedByEnd(*dw)) { +#ifdef DEBUG_ADD_FOES + if (DEBUG_COND_DW) { + std::cout << " setting " << dw->getID() << " as foe of " << foe->getID() << "\n"; + } +#endif + foe->myFoes.push_back(dw); + foe->addSidings(dw); + } else { + dw->buildSubFoe(foe, movingBlock); + } + if (dw->bidiBlockedByEnd(*foe)) { +#ifdef DEBUG_ADD_FOES + if (DEBUG_COND_DW) { + std::cout << " addFoeCheckSiding " << foe->getID() << "\n"; + } +#endif + dw->myFoes.push_back(foe); + dw->addSidings(foe); + } else { + foe->buildSubFoe(dw, movingBlock); + } + } + if (link) { + foe->addConflictLink(link); + } + // ignore links that have the same start junction + if (foe->myRoute.front()->getFromJunction() != dw->myRoute.front()->getFromJunction()) { + for (auto ili : foe->myForward.front()->getIncomingLanes()) { + if (ili.viaLink->getTLLogic() != nullptr) { + // ignore links that originate on myBidi + const MSLane* origin = ili.viaLink->getLaneBefore(); + if (std::find(dw->myBidi.begin(), dw->myBidi.end(), origin) == dw->myBidi.end()) { + uniqueCLink.insert(ili.viaLink); + } + } + } + } + } + dw->myConflictLinks.clear(); + dw->myConflictLinks.insert(dw->myConflictLinks.begin(), uniqueCLink.begin(), uniqueCLink.end()); + myEndingDriveways[lastEdge].push_back(dw); + if (!movingBlock) { + // every driveway is it's own foe (also all driveways that depart in the same block) + for (MSDriveWay* sameEnd : myEndingDriveways[lastEdge]) { + if (uniqueFoes.count(sameEnd) == 0) { + dw->myFoes.push_back(sameEnd); + if (sameEnd != dw) { + sameEnd->myFoes.push_back(dw); + } + } + } + } +#ifdef DEBUG_BUILD_DRIVEWAY + if (DEBUG_COND_DW) { + std::cout << dw->myID << " finalFoes " << toString(dw->myFoes) << "\n"; + } +#endif + return dw; +} + +std::string +MSDriveWay::getTLLinkID(const MSLink* link) { + return link->getTLLogic()->getID() + "_" + toString(link->getTLIndex()); +} + +std::string +MSDriveWay::getJunctionLinkID(const MSLink* link) { + return link->getJunction()->getID() + "_" + toString(link->getIndex()); +} + +std::string +MSDriveWay::getClickableTLLinkID(const MSLink* link) { + return "junction '" + link->getTLLogic()->getID() + "', link " + toString(link->getTLIndex()); +} + +std::string +MSDriveWay::formatVisitedMap(const LaneVisitedMap& visited) { + UNUSED_PARAMETER(visited); + /* + std::vector lanes(visited.size(), nullptr); + for (auto item : visited) { + lanes[item.second] = item.first; + } + for (auto it = lanes.begin(); it != lanes.end();) { + if (*it == nullptr) { + it = lanes.erase(it); + } else { + it++; + } + } + return toString(lanes); + */ + return "dummy"; +} + + +void +MSDriveWay::appendMapIndex(LaneVisitedMap& map, const MSLane* lane) { + // avoid undefined behavior from evaluation order + const int tmp = (int)map.size(); + map[lane] = tmp; +} + +bool +MSDriveWay::match(MSRouteIterator firstIt, MSRouteIterator endIt) const { + // @todo optimize: it is sufficient to check for specific edges (after each switch) + auto itRoute = firstIt; + auto itDwRoute = myRoute.begin(); + bool match = true; + while (itRoute != endIt && itDwRoute != myRoute.end()) { + if (*itRoute != *itDwRoute) { + match = false; +#ifdef DEBUG_MATCH + std::cout << " check dw=" << getID() << " match failed at vehEdge=" << (*itRoute)->getID() << " dwEdge=" << (*itDwRoute)->getID() << "\n"; +#endif + break; + } + itRoute++; + itDwRoute++; + } + // if the vehicle arrives before the end of this driveway, + // we'd rather build a new driveway to avoid superfluous restrictions + if (match && itDwRoute == myRoute.end() + && (itRoute == endIt || myAbortedBuild || myBidiEnded || myFoundJump || myIsSubDriveway)) { + //std::cout << " using dw=" << "\n"; + if (itRoute != endIt) { + // check whether the current route requires an extended driveway + const MSEdge* next = *itRoute; + const MSEdge* prev = myRoute.back(); + if (myFoundJump && prev->getBidiEdge() != next && prev->getBidiEdge() != nullptr + && prev->isConnectedTo(*next, (SUMOVehicleClass)(SVC_RAIL_CLASSES & prev->getPermissions()))) { +#ifdef DEBUG_MATCH + std::cout << " check dw=" << getID() << " prev=" << prev->getID() << " next=" << next->getID() << "\n"; +#endif + return false; + } + if (!myFoundJump && prev->getBidiEdge() == next && prev == &myForward.back()->getEdge()) { + assert(myIsSubDriveway); + // must not leave driveway via reversal +#ifdef DEBUG_MATCH + std::cout << getID() << " back=" << myForward.back()->getID() << " noMatch route " << toString(ConstMSEdgeVector(firstIt, endIt)) << "\n"; +#endif + return false; + } + } + return true; + } + return false; +} + +void +MSDriveWay::addFoes(const MSLink* link) { +#ifdef DEBUG_ADD_FOES + std::cout << "driveway " << myID << " addFoes for link " << link->getDescription() << "\n"; +#endif + const MSRailSignal* rs = dynamic_cast(link->getTLLogic()); + if (rs != nullptr) { + for (MSDriveWay* foe : rs->retrieveDriveWays(link->getTLIndex())) { +#ifdef DEBUG_ADD_FOES + std::cout << " cand foe=" << foe->myID << " fc1=" << flankConflict(*foe) << " fc2=" << foe->flankConflict(*this) << " cc1=" << crossingConflict(*foe) << " cc2=" << foe->crossingConflict(*this) << "\n"; +#endif + if (foe != this && (flankConflict(*foe) || foe->flankConflict(*this) || crossingConflict(*foe) || foe->crossingConflict(*this))) { +#ifdef DEBUG_ADD_FOES + std::cout << " foe=" << foe->myID << "\n"; +#endif + myFoes.push_back(foe); + } + } + } +} + + +void +MSDriveWay::addBidiFoes(const MSRailSignal* ownSignal, bool extended) { +#ifdef DEBUG_ADD_FOES + std::cout << "driveway " << myID << " addBidiFoes extended=" << extended << "\n"; +#endif + const std::vector& bidiLanes = extended ? myBidiExtended : myBidi; + for (const MSLane* bidi : bidiLanes) { + for (auto ili : bidi->getIncomingLanes()) { + const MSRailSignal* rs = dynamic_cast(ili.viaLink->getTLLogic()); + if (rs != nullptr && rs != ownSignal && + std::find(bidiLanes.begin(), bidiLanes.end(), ili.lane) != bidiLanes.end()) { + addFoes(ili.viaLink); + } + } + const MSEdge* bidiEdge = &bidi->getEdge(); + if (myDepartureDriveways.count(bidiEdge) != 0) { + for (MSDriveWay* foe : myDepartureDriveways[bidiEdge]) { + if (flankConflict(*foe)) { +#ifdef DEBUG_ADD_FOES + std::cout << " foe " << foe->getID() << " departs on bidi=" << bidiEdge->getID() << "\n"; +#endif + myFoes.push_back(foe); + } else { +#ifdef DEBUG_ADD_FOES + std::cout << " cand foe " << foe->getID() << " departs on bidi=" << bidiEdge->getID() << " rejected\n"; +#endif + } + } + } + if (myDepartureDrivewaysEnds.count(bidiEdge) != 0) { + for (MSDriveWay* foe : myDepartureDrivewaysEnds[bidiEdge]) { + if (flankConflict(*foe)) { +#ifdef DEBUG_ADD_FOES + std::cout << " foe " << foe->getID() << " ends on bidi=" << bidiEdge->getID() << "\n"; +#endif + myFoes.push_back(foe); + } else { +#ifdef DEBUG_ADD_FOES + std::cout << " cand foe " << foe->getID() << " ends on bidi=" << bidiEdge->getID() << " rejected\n"; +#endif + } + } + } + } +} + + +void +MSDriveWay::addParallelFoes(const MSLink* link, const MSEdge* first) { +#ifdef DEBUG_ADD_FOES + std::cout << "driveway " << myID << " addParallelFoes\n"; +#endif + if (link) { + addFoes(link); + } else { + auto it = myDepartureDriveways.find(first); + if (it != myDepartureDriveways.end()) { + for (MSDriveWay* foe : it->second) { +#ifdef DEBUG_ADD_FOES + std::cout << " foe " << foe->getID() << " departs on first=" << first->getID() << "\n"; +#endif + myFoes.push_back(foe); + } + } + } +} + + +void +MSDriveWay::addReversalFoes() { +#ifdef DEBUG_ADD_FOES + std::cout << "driveway " << myID << " addReversalFoes\n"; +#endif + std::set forward; + for (const MSLane* lane : myForward) { + if (lane->isNormal()) { + forward.insert(&lane->getEdge()); + } + } + int i = 0; + for (const MSEdge* e : myRoute) { + if (forward.count(e) != 0) { + // reversals in our own forward section must be ignored + continue; + } + if (i == myCoreSize) { + break; + } + i++; + auto it = myReversalDriveWays.find(e); + if (it != myReversalDriveWays.end()) { + for (MSDriveWay* foe : it->second) { + // check whether the foe reverses into our own forward section + // (it might reverse again or disappear via arrival) +#ifdef DEBUG_ADD_FOES + //std::cout << " candidate foe " << foe->getID() << " reverses on edge=" << e->getID() << " forward=" << joinNamedToString(forward, " ") << " foeRoute=" << toString(foe->myRoute) << "\n"; +#endif + if (forwardRouteConflict(forward, *foe)) { + std::set foeForward; + for (const MSLane* lane : foe->myForward) { + if (lane->isNormal()) { + foeForward.insert(&lane->getEdge()); + if (lane->getBidiLane() != nullptr) { + foeForward.insert(lane->getEdge().getBidiEdge()); + } + } + } +#ifdef DEBUG_ADD_FOES + std::cout << " reversal cand=" << foe->getID() << " foeForward " << toString(foeForward) << "\n"; +#endif + if (foe->forwardRouteConflict(foeForward, *this, true)) { +#ifdef DEBUG_ADD_FOES + std::cout << " foe " << foe->getID() << " reverses on edge=" << e->getID() << "\n"; +#endif + myFoes.push_back(foe); + } + } + } + } + } +} + + +bool +MSDriveWay::buildSubFoe(MSDriveWay* foe, bool movingBlock) { + // Subdriveways (Teilfahrstraße) model the resolution of a driving conflict + // before a vehicle has left the driveway. This is possible when the driveway diverges from the foe + // driveway at an earlier point (switch or crossing). + // + // We already know that the last edge of this driveway doesn't impact the foe (unless the driveway ends within the block). + // Remove further edges from the end of the driveway (myForward) until the point of conflict is found. + // + // For movingBlock the logic is changed: + // We remove the conflict-free part as before but then keep removing the the conflict part until the + // another non-conconflit part is found + if (myForward.size() < foe->myForward.size() && + myForward == std::vector(foe->myForward.begin(), foe->myForward.begin() + myForward.size())) { +#ifdef DEBUG_BUILD_SUBDRIVEWAY + std::cout << SIMTIME << " buildSubFoe dw=" << getID() << " is subpart of foe=" << foe->getID() << "\n"; +#endif + foe->myFoes.push_back(this); + return true; + } + int subLast = (int)myForward.size() - 2; +#ifdef DEBUG_BUILD_SUBDRIVEWAY + if (subLast < 0) { + std::cout << " " << getID() << " cannot build subDriveWay for foe " << foe->getID() << " because myForward has only a single lane\n"; + } +#endif + bool foundConflict = false; + while (subLast >= 0) { + const MSLane* lane = myForward[subLast]; + MSDriveWay tmp(myOrigin, "tmp", true); + tmp.myForward.push_back(lane); +#ifdef DEBUG_BUILD_SUBDRIVEWAY + std::cout << " subLast=" << subLast << " lane=" << lane->getID() << " fc=" << tmp.flankConflict(*foe) << " cc=" << tmp.crossingConflict(*foe) + << " bc=" << (std::find(foe->myBidi.begin(), foe->myBidi.end(), lane) != foe->myBidi.end()) << "\n"; +#endif + const bool bidiConflict = std::find(foe->myBidi.begin(), foe->myBidi.end(), lane) != foe->myBidi.end(); + if (tmp.flankConflict(*foe) || tmp.crossingConflict(*foe) || bidiConflict) { + foundConflict = true; + if (!movingBlock || bidiConflict) { + break; + } + } else if (foundConflict) { + break; + } + subLast--; + } + if (subLast < 0) { + if (foe->myTerminateRoute) { + if (bidiBlockedByEnd(*foe) && bidiBlockedBy(*this) && foe->forwardEndOnRoute(this)) { + foe->myFoes.push_back(this); + // foe will get the sidings + addSidings(foe, true); + } +#ifdef DEBUG_BUILD_SUBDRIVEWAY + std::cout << SIMTIME << " buildSubFoe dw=" << getID() << " foe=" << foe->getID() << " terminates\n"; +#endif + } else if (myTerminateRoute && myBidi.size() <= myForward.size()) { + foe->myFoes.push_back(this); +#ifdef DEBUG_BUILD_SUBDRIVEWAY + std::cout << SIMTIME << " buildSubFoe dw=" << getID() << " terminates, foe=" << foe->getID() << "\n"; +#endif + return true; + } else if (foe->myReversals.size() % 2 == 1) { +#ifdef DEBUG_BUILD_SUBDRIVEWAY + std::cout << SIMTIME << " buildSubFoe dw=" << getID() << " foe=" << foe->getID() << " has " << foe->myReversals.size() << " reversals\n"; +#endif + } else { +#ifdef DEBUG_BUILD_SUBDRIVEWAY + std::cout << SIMTIME << " buildSubFoe dw=" << getID() << " foe=" << foe->getID() << " failed\n"; +#endif +#ifdef SUBDRIVEWAY_WARN_NOCONFLICT + WRITE_WARNINGF("No point of conflict found between driveway '%' and driveway '%' when creating sub-driveway", getID(), foe->getID()); +#endif + } + return false; + } + int subSize = subLast + 1; + for (MSDriveWay* cand : mySubDriveWays) { + if ((int)cand->myForward.size() == subSize) { + // can re-use existing sub-driveway + foe->myFoes.push_back(cand); + cand->myFoes.push_back(foe); +#ifdef DEBUG_BUILD_SUBDRIVEWAY + std::cout << SIMTIME << " buildSubFoe dw=" << getID() << " foe=" << foe->getID() << " useExisting=" << cand->getID() << "\n"; +#endif + return true; + } + } + std::vector forward(myForward.begin(), myForward.begin() + subSize); + std::vector route; + for (const MSLane* lane : forward) { + if (lane->isNormal()) { + route.push_back(&lane->getEdge()); + } + } + if (myRoute.size() > route.size()) { + // route continues. make sure the subDriveway does not end with a reversal + const MSEdge* lastNormal = route.back(); + const MSEdge* nextNormal = myRoute[route.size()]; + if (lastNormal->getBidiEdge() == nextNormal) { +#ifdef DEBUG_BUILD_SUBDRIVEWAY + std::cout << SIMTIME << " abort subFoe dw=" << getID() << " foe=" << foe->getID() + << " lastNormal=" << lastNormal->getID() << " nextNormal=" << nextNormal->getID() << " endWithReversal\n"; +#endif + return false; + } + } + MSDriveWay* sub = new MSDriveWay(myOrigin, getID() + "." + toString(mySubDriveWays.size())); + sub->myLane = myLane; + sub->myIsSubDriveway = true; + sub->myForward = forward; + sub->myRoute = route; + sub->myCoreSize = (int)sub->myRoute.size(); + myLane->addMoveReminder(sub); + + // copy trains that are currently on this driveway (and associated entry events) + for (SUMOVehicle* veh : myTrains) { + if (std::find(sub->myRoute.begin(), sub->myRoute.end(), veh->getEdge()) != sub->myRoute.end()) { + sub->myTrains.insert(veh); + dynamic_cast(veh)->addReminder(sub); + for (const VehicleEvent& ve : myVehicleEvents) { + if (ve.id == veh->getID()) { + sub->myVehicleEvents.push_back(ve); + } + } + } + } + + foe->myFoes.push_back(sub); + sub->myFoes.push_back(foe); + mySubDriveWays.push_back(sub); +#ifdef DEBUG_BUILD_SUBDRIVEWAY + std::cout << SIMTIME << " buildSubFoe dw=" << getID() << " foe=" << foe->getID() << " sub=" << sub->getID() << " route=" << toString(sub->myRoute) << "\n"; +#endif + return true; +} + +void +MSDriveWay::addSidings(MSDriveWay* foe, bool addToFoe) { + const MSEdge* foeEndBidi = foe->myForward.back()->getEdge().getBidiEdge(); + int forwardNormals = 0; + for (auto lane : foe->myForward) { + if (lane->isNormal()) { + forwardNormals++; + } + } + if (forwardNormals == (int)foe->myRoute.size()) { +#ifdef DEBUG_BUILD_SIDINGS + std::cout << "checkSiding " << getID() << " foe=" << foe->getID() << " forwardNormals=" << forwardNormals << " frSize=" << foe->myRoute.size() << " aborted\n"; +#endif + return; + } + auto foeSearchBeg = foe->myRoute.begin() + forwardNormals; + auto foeSearchEnd = foe->myRoute.end(); + if (foeEndBidi == nullptr) { + throw ProcessError("checkSiding " + getID() + " foe=" + foe->getID() + " noBidi\n"); + } + int i; + std::vector start; + std::vector length; + for (i = 0; i < (int)myRoute.size(); i++) { + if (myRoute[i] == foeEndBidi) { + break; + } + } + if (i == (int)myRoute.size()) { + throw ProcessError("checkSiding " + getID() + " foe=" + foe->getID() + " foeEndBidi=" + foeEndBidi->getID() + " not on route\n"); + } + const MSEdge* next = myRoute[i]; +#ifdef DEBUG_BUILD_SIDINGS + std::cout << "checkSiding " << getID() << " foe=" << foe->getID() << " i=" << i << " next=" << next->getID() << " forwardNormals=" << forwardNormals << " frSize=" << foe->myRoute.size() << " foeSearchBeg=" << (*foeSearchBeg)->getID() << "\n"; +#endif + i--; + for (; i >= 0; i--) { + const MSEdge* cur = myRoute[i]; + if (hasRS(cur, next)) { + if (std::find(foeSearchBeg, foeSearchEnd, cur->getBidiEdge()) == foeSearchEnd) { + start.push_back(i); + length.push_back(0); + } + } + if (!start.empty()) { + auto itFind = std::find(foeSearchBeg, foeSearchEnd, cur->getBidiEdge()); + if (itFind != foeSearchEnd) { +#ifdef DEBUG_BUILD_SIDINGS + std::cout << "endSiding " << getID() << " foe=" << foe->getID() << " i=" << i << " curBidi=" << Named::getIDSecure(cur->getBidiEdge()) << " length=" << toString(length) << "\n"; +#endif + const int firstIndex = i + 1; + if (addToFoe) { + auto& foeSidings = foe->mySidings[this]; + // indices must be mapped onto foe route; + const MSEdge* first = myRoute[firstIndex]; + auto itFirst = std::find(foe->myRoute.begin(), foe->myRoute.end(), first); + if (itFirst != foe->myRoute.end()) { + for (int j = 0; j < (int)length.size(); j++) { + const MSEdge* last = myRoute[start[j]]; + auto itLast = std::find(itFirst, foe->myRoute.end(), last); + if (itLast != foe->myRoute.end()) { + foeSidings.insert(foeSidings.begin(), Siding((int)(itFirst - foe->myRoute.begin()), (int)(itLast - foe->myRoute.begin()), length[j])); + } + } + } + } else { + auto& foeSidings = mySidings[foe]; + for (int j = 0; j < (int)length.size(); j++) { + foeSidings.insert(foeSidings.begin(), Siding(firstIndex, start[j], length[j])); + } + } + start.clear(); + length.clear(); + foeSearchBeg = itFind; + } else { + for (int j = 0; j < (int)length.size(); j++) { + length[j] += cur->getLength(); + } + } + } + next = cur; + } +} + + +bool +MSDriveWay::hasRS(const MSEdge* cur, const MSEdge* next) { + if (cur->getToJunction()->getType() == SumoXMLNodeType::RAIL_SIGNAL) { + // check if there is a controlled link between cur and next + for (auto lane : cur->getLanes()) { + for (const MSLink* link : lane->getLinkCont()) { + if (&link->getLane()->getEdge() == next && link->getTLLogic() != nullptr) { + return true; + } + } + } + } + return false; +} + + +bool +MSDriveWay::forwardEndOnRoute(const MSDriveWay* foe) const { + const MSEdge* foeForwardEnd = &foe->myForward.back()->getNormalPredecessorLane()->getEdge(); + return std::find(myRoute.begin(), myRoute.end(), foeForwardEnd) != myRoute.end(); +} + +void +MSDriveWay::addConflictLink(const MSLink* link) { + if (link->getTLLogic() != nullptr) { + // ignore links that originate on myBidi + // and also links from the same junction as my own link + const MSLane* origin = link->getLaneBefore(); + if (std::find(myBidi.begin(), myBidi.end(), origin) == myBidi.end()) { + if (link->getJunction() != myRoute.front()->getFromJunction()) { + if (std::find(myConflictLinks.begin(), myConflictLinks.end(), link) == myConflictLinks.end()) { + myConflictLinks.push_back(const_cast(link)); + } + } + } + } +} + +void +MSDriveWay::addDWDeadlock(const std::vector& deadlockFoes) { + std::set filtered; + for (const MSDriveWay* foe : deadlockFoes) { + if (std::find(myFoes.begin(), myFoes.end(), foe) == myFoes.end()) { + filtered.insert(foe); + } + } + if (std::find(myDeadlocks.begin(), myDeadlocks.end(), filtered) == myDeadlocks.end()) { + myDeadlocks.push_back(filtered); + //std::cout << getID() << " deadlockFoes=" << toString(deadlockFoes) << "\n"; + } +} + +const MSDriveWay* +MSDriveWay::getDepartureDriveway(const SUMOVehicle* veh) { + const MSEdge* edge = veh->getEdge(); + if (edge->getFromJunction()->getType() == SumoXMLNodeType::RAIL_SIGNAL) { + for (const MSLane* lane : edge->getLanes()) { + for (auto ili : lane->getIncomingLanes()) { + const MSLink* entry = ili.viaLink->getCorrespondingEntryLink(); + const MSRailSignal* rs = dynamic_cast(entry->getTLLogic()); + if (rs != nullptr) { + const MSDriveWay* dw = &const_cast(rs)->retrieveDriveWayForVeh(entry->getTLIndex(), veh); + if (&dw->myForward.front()->getEdge() == edge) { + return dw; + } + } + } + } + } + for (MSDriveWay* dw : myDepartureDriveways[edge]) { + if (dw->match(veh->getCurrentRouteEdge(), veh->getRoute().end())) { + return dw; + } + } + const std::string id = edge->getFromJunction()->getID() + ".d" + toString(myDepartDrivewayIndex[edge->getFromJunction()]++); + MSDriveWay* dw = buildDriveWay(id, nullptr, veh->getCurrentRouteEdge(), veh->getRoute().end()); + myDepartureDriveways[edge].push_back(dw); + myDepartureDrivewaysEnds[&dw->myForward.back()->getEdge()].push_back(dw); + dw->setVehicle(veh->getID()); + return dw; +} + + +void +MSDriveWay::writeDepatureBlocks(OutputDevice& od, bool writeVehicles) { + for (auto item : myDepartureDriveways) { + const MSEdge* edge = item.first; + if (item.second.size() > 0) { + od.openTag("departJunction"); + od.writeAttr(SUMO_ATTR_ID, edge->getFromJunction()->getID()); + for (const MSDriveWay* dw : item.second) { + if (writeVehicles) { + dw->writeBlockVehicles(od); + } else { + dw->writeBlocks(od); + } + } + od.closeTag(); // departJunction + } + } +} + +void +MSDriveWay::saveState(OutputDevice& out) { + // all driveways are in myEndingDriveways which makes it convenient + for (auto item : myEndingDriveways) { + for (MSDriveWay* dw : item.second) { + dw->_saveState(out); + for (MSDriveWay* sub : dw->mySubDriveWays) { + sub->_saveState(out); + } + } + } +} + +void +MSDriveWay::_saveState(OutputDevice& out) const { + if (!myTrains.empty() || haveSubTrains()) { + out.openTag(myIsSubDriveway ? SUMO_TAG_SUBDRIVEWAY : SUMO_TAG_DRIVEWAY); + out.writeAttr(SUMO_ATTR_ID, getID()); + out.writeAttr(SUMO_ATTR_EDGES, toString(myRoute)); + if (!myTrains.empty()) { + out.writeAttr(SUMO_ATTR_VEHICLES, toString(myTrains)); + } + out.closeTag(); + } +} + + +bool +MSDriveWay::haveSubTrains() const { + for (MSDriveWay* sub : mySubDriveWays) { + if (!sub->myTrains.empty()) { + return true; + } + } + return false; +} + +void +MSDriveWay::loadState(const SUMOSAXAttributes& attrs, int tag) { + if ((int)myDriveWayRouteLookup.size() < myGlobalDriveWayIndex) { + for (auto item : myEndingDriveways) { + for (MSDriveWay* dw : item.second) { + myDriveWayRouteLookup[dw->myRoute] = dw; + } + } + } + MSVehicleControl& c = MSNet::getInstance()->getVehicleControl(); + bool ok; + const std::string id = attrs.get(SUMO_ATTR_ID, nullptr, ok); + const std::string edges = attrs.get(SUMO_ATTR_EDGES, id.c_str(), ok); + ConstMSEdgeVector route; + if (attrs.hasAttribute(SUMO_ATTR_EDGES)) { + MSEdge::parseEdgesList(edges, route, id); + } + MSDriveWay* dw = nullptr; + if (tag == SUMO_TAG_DRIVEWAY) { + auto it = myDriveWayRouteLookup.find(route); + if (it == myDriveWayRouteLookup.end()) { + //WRITE_WARNING(TLF("Unknown driveWay '%' with route '%'", id, edges)); + //return; + throw ProcessError(TLF("Unknown driveWay '%' with route '%'", id, edges)); + } + dw = it->second; + myDriveWayLookup[id] = dw; + } else { + std::string parentID = id.substr(0, id.rfind('.')); + auto it = myDriveWayLookup.find(parentID); + if (it == myDriveWayLookup.end()) { + //WRITE_WARNING(TLF("Unknown parent driveway '%' for subDriveWay '%'", parentID, id)); + //return; + throw ProcessError(TLF("Unknown parent driveway '%' for subDriveWay '%'", parentID, id)); + } + MSDriveWay* parent = it->second; + for (MSDriveWay* sub : parent->mySubDriveWays) { + if (sub->myRoute == route) { + dw = sub; + break; + } + } + if (dw == nullptr) { + // missing subdriveways can be ignored. They may have been created + // as foes for driveways that are not relevant at state loading time + return; + } + } + const std::string vehicles = attrs.getOpt(SUMO_ATTR_VEHICLES, id.c_str(), ok, ""); + for (const std::string& vehID : StringTokenizer(vehicles).getVector()) { + MSBaseVehicle* veh = dynamic_cast(c.getVehicle(vehID)); + if (veh == nullptr) { + throw ProcessError(TLF("Unknown vehicle '%' in driveway '%'", vehID, id)); + } + dw->myTrains.insert(veh); + veh->addReminder(dw); + } +} + + +/****************************************************************************/ diff --git a/src/microsim/traffic_lights/MSDriveWay.h b/src/microsim/traffic_lights/MSDriveWay.h new file mode 100644 index 000000000000..7d07b9989bdd --- /dev/null +++ b/src/microsim/traffic_lights/MSDriveWay.h @@ -0,0 +1,376 @@ +/****************************************************************************/ +// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo +// Copyright (C) 2002-2024 German Aerospace Center (DLR) and others. +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0/ +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License 2.0 are satisfied: GNU General Public License, version 2 +// or later which is available at +// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later +/****************************************************************************/ +/// @file MSDriveWay.h +/// @author Jakob Erdmann +/// @date December 2021 +/// +// A sequende of rail tracks (lanes) that may be used as a "set route" (Fahrstraße) +/****************************************************************************/ +#pragma once +#include + +#include +#include +#include + +// =========================================================================== +// class declarations +// =========================================================================== +class SUMOVehicle; +class MSLane; +class MSLink; +class MSRailSignal; + +// =========================================================================== +// class definitions +// =========================================================================== +/** + * @class MSDriveWay + */ +class MSDriveWay : public MSMoveReminder, public Named { +public: + typedef std::pair Approaching; + typedef std::set LaneSet; + typedef std::map LaneVisitedMap; + + struct VehicleEvent { + VehicleEvent(SUMOTime _time, bool _isEntry, const std::string& _id, Notification _reason): + time(_time), isEntry(_isEntry), id(_id), reason(_reason) {} + SUMOTime time; + bool isEntry; + std::string id; + Notification reason; + }; + + /* The driveways (Fahrstrassen) for each link index of MSRailSignal + * Each link index has at least one driveway + * A driveway describes one possible route that passes the signal up to + * the next secure point + * When a signal guards a switch (indirect guard) that signal stores two + * or more driveways + */ + MSDriveWay(const MSLink* origin, const std::string& id, bool temporary = false); + + /// @brief Destructor + virtual ~MSDriveWay(); + + static void cleanup(); + + static void clearState(); + + static bool haveDriveWays() { + return myGlobalDriveWayIndex > 0; + } + + bool notifyEnter(SUMOTrafficObject& veh, Notification reason, const MSLane* enteredLane); + bool notifyLeave(SUMOTrafficObject& veh, double lastPos, Notification reason, const MSLane* enteredLane = 0); + bool notifyLeaveBack(SUMOTrafficObject& veh, Notification reason, const MSLane* leftLane); + + /// @brief Wether there is a flank conflict with the given driveway + bool flankConflict(const MSDriveWay& other) const; + + /// @brief Wether there is a crossing conflict with the given driveway + bool crossingConflict(const MSDriveWay& other) const; + + /// @brief Wether there is a bidi conflict with the given driveway + bool bidiBlockedBy(const MSDriveWay& other) const; + + /// @brief Wether there is a bidi conflict with the end of the given driveway + bool bidiBlockedByEnd(const MSDriveWay& other) const; + + /// @brief Wether the route of other passes into the forward section of this driveway + bool forwardRouteConflict(std::set forward, const MSDriveWay& other, bool secondCheck = false); + + /// @brief whether any of myConflictLanes is occupied (vehicles that are the target of a join must be ignored) + bool conflictLaneOccupied(bool store = true, const SUMOVehicle* ego = nullptr) const; + + /// @brief whether any of myFoes is occupied (vehicles that are the target of a join must be ignored) + bool foeDriveWayOccupied(bool store, const SUMOVehicle* ego, MSEdgeVector& occupied) const; + + /// @brief whether any of my Foes is being approached + bool foeDriveWayApproached() const; + + /// @brief attempt reserve this driveway for the given vehicle + bool reserve(const Approaching& closest, MSEdgeVector& occupied); + + /// @brief Write block items for this driveway + void writeBlocks(OutputDevice& od) const; + void writeBlockVehicles(OutputDevice& od) const; + + const std::vector& getRoute() const { + return myRoute; + } + + const std::vector& getFlank() const { + return myFlank; + } + + const std::vector& getBidi() const { + return myBidi; + } + + const std::vector& getConflictLinks() const { + return myConflictLinks; + } + + int getNumericalID() const { + return myNumericalID; + } + + const std::vector& getEvents() const { + return myVehicleEvents; + } + + void setEvents(const std::vector& events) { + myVehicleEvents = events; + } + + void setVehicle(const std::string& vehID) { + myFirstVehicle = vehID; + } + + const std::vector& getFoes() const { + return myFoes; + } + + const std::vector& getForward() const { + return myForward; + } + + /// @brief whether the give route matches this driveway + bool match(MSRouteIterator firstIt, MSRouteIterator endIt) const; + + void addDWDeadlock(const std::vector& deadlockFoes); + + bool isDepartDriveway() const { + return myOrigin == nullptr; + }; + + const MSLink* getOrigin() const { + return myOrigin; + } + + static void init(); + + static bool hasRS(const MSEdge* cur, const MSEdge* next); + + /// @brief Whether veh must yield to the foe train + static bool mustYield(const Approaching& veh, const Approaching& foe); + + /// @brief construct a new driveway by searching along the given route until all block structures are found + static MSDriveWay* buildDriveWay(const std::string& id, const MSLink* link, MSRouteIterator first, MSRouteIterator end); + + /// @brief return logicID_linkIndex in a way that allows clicking in sumo-gui + static std::string getClickableTLLinkID(const MSLink* link); + + static const MSDriveWay* getDepartureDriveway(const SUMOVehicle* veh); + + static void writeDepatureBlocks(OutputDevice& od, bool writeVehicles); + + /** @brief Save driveway occupancy into the given stream */ + static void saveState(OutputDevice& out); + static void loadState(const SUMOSAXAttributes& attrs, int tag); + +protected: + + /// @brief global driveway index + int myNumericalID; + + /// @brief the link that enters this driveway or nullptr for a departure driveWay + const MSLink* myOrigin; + + /// @brief the maximum flank length searched while building this driveway + double myMaxFlankLength; + + /// @brief whether the current signal is switched green for a train approaching this block + const SUMOVehicle* myActive; + + /// @brief list of edges for matching against train routes + std::vector myRoute; + + /// @brief number of edges in myRoute where overlap with other driveways is forbidden + int myCoreSize; + + /// @brief whether this driveway ends its forward section with a rail signal (and thus comprises a full block) + bool myFoundSignal; + bool myFoundJump; + bool myTerminateRoute; + /// @brief whether driveway building was aborted due to MAX_BLOCK_LENGTH + bool myAbortedBuild; + /// @brief whether driveway building was aborted when no further bidi edge was found + bool myBidiEnded; + bool myIsSubDriveway; + + /* @brief the actual driveway part up to the next railsignal (halting position) + * This must be free of other trains */ + std::vector myForward; + + /* @brief the list of bidirectional edges that can enter the forward + * section and which must also be free of traffic + * (up to the first element that could give protection) */ + std::vector myBidi; + + /* @brief the list of bidirectional edges that can enter the forward + * section and which might contain deadlock-relevant traffic */ + std::vector myBidiExtended; + + /* @brief the list of edges that merge with the forward section + * (found via backward search, up to the first element that could give protection) */ + std::vector myFlank; + + /// @brief the lanes that must be clear of trains before this signal can switch to green + std::vector myConflictLanes; + + /* The conflict links for this block + * Conflict resolution must be performed if vehicles are approaching the + * current link and any of the conflict links */ + std::vector myConflictLinks; + + /// @brief Whether the approaching vehicle is prevent from driving by another vehicle approaching the given link + bool hasLinkConflict(const Approaching& closest, const MSLink* foeLink) const; + + /// @brief Wether this driveway (route) overlaps with the given one + bool overlap(const MSDriveWay& other) const; + + /* @brief determine route that identifies this driveway (a subset of the + * vehicle route) + * collects: + * myRoute + * myForward + * myBidi + * myProtectedBidi + * + * returns edge that is assumed to safe from oncoming-deadlock or nullptr + */ + void buildRoute(const MSLink* origin, double length, MSRouteIterator next, MSRouteIterator end, LaneVisitedMap& visited, std::set&); + + /* @brief find switches that threaten this driveway + * @param[out] flankSwitches collect the switches + */ + void checkFlanks(const MSLink* originLink, const std::vector& lanes, const LaneVisitedMap& visited, bool allFoes, std::set& flankSwitches) const; + + /* @brief find links that cross the driveway without entering it + * @param[out] flankSwitches collect the switches + */ + void checkCrossingFlanks(MSLink* dwLink, const LaneVisitedMap& visited, std::set& flankSwitches) const; + + /* @brief find upstream protection from the given link + * @param[out] flank: the stored flank lanes + */ + void findFlankProtection(MSLink* link, MSLink* origLink, std::vector& flank); + + /// @brief add all driveWays that start at the given link as foes + void addFoes(const MSLink* link); + + /// @brief add sidings for the given foe + void addSidings(MSDriveWay* foe, bool addToFoe = false); + + /// @brief derive foe driveways based on myBidi or myBidiExtended + void addBidiFoes(const MSRailSignal* ownSignal, bool extended); + + /// @brief derive foe driveways that start at the same signal + void addParallelFoes(const MSLink* link, const MSEdge* first); + + /// @brief derive foe driveways that enter the bidi section by reversing + void addReversalFoes(); + + /* @brief build shortened driveway that ends where the foe train leaves the conflict zone of this driveway + * @return whether the foe has received a new entry in myFoes + */ + bool buildSubFoe(MSDriveWay* foe, bool movingBlock); + + /// @brief add symmetical conflict link for foes when building a new driveway + void addConflictLink(const MSLink* link); + + /// @brief return whether a siding can be used. If a siding exist but is occupied, also return the occupied driveway in the siding + std::pair canUseSiding(const SUMOVehicle* ego, const MSDriveWay* foe, bool recurse = true) const; + + bool isFoeOrSubFoe(const MSDriveWay* foe) const; + + bool forwardEndOnRoute(const MSDriveWay* foe) const; + + void addSwitchFoes(MSLink* link); + + bool haveSubTrains() const; + + static bool hasJoin(const SUMOVehicle* ego, const SUMOVehicle* foe); + + static bool isSwitch(const MSLink* link); + + void _saveState(OutputDevice& out) const; + + /// @brief return logicID_linkIndex + static std::string getTLLinkID(const MSLink* link); + + /// @brief return junctionID_junctionLinkIndex + static std::string getJunctionLinkID(const MSLink* link); + + /// @brief print link descriptions + static std::string formatVisitedMap(const LaneVisitedMap& visited); + + /// @brief append to map by map index and avoid undefined behavior + static void appendMapIndex(LaneVisitedMap& map, const MSLane* lane); + +private: + + struct Siding { + Siding(int s, int e, double l) : start(s), end(e), length(l) {} + // indices along route + int start; + int end; + double length; + }; + + std::set myTrains; + + std::vector myVehicleEvents; + std::vector myFoes; + std::map, ComparatorIdLess> mySidings; + std::vector > myDeadlocks; + + /* @brief shortened versions of this driveway to be used as foes instead of the long original + * (ends as soon as the train has left a particular conflict section) + * they are never attached to a LinkInfo and thus never the target of the match() function */ + std::vector mySubDriveWays; + + /// @brief track own occurences in myReversalDriveWays for cleanup in destructor + std::vector myReversals; + + /// @brief the first vehicle using this driveway + std::string myFirstVehicle; + + static int myGlobalDriveWayIndex; + static int myNumWarnings; + static bool myWriteVehicles; + + /// @brief all driveways passing the given switch (used to look up flank foes) + static std::map > mySwitchDriveWays; + + /// @brief all driveways reversing on the given switch (used to look up flank foes) + static std::map > myReversalDriveWays; + + /// @brief all driveways that do not start at a rail signal (and are only used at departure) + static std::map, ComparatorNumericalIdLess > myDepartureDriveways; + static std::map myDepartDrivewayIndex; + /// @brief all driveways that do not start at a rail signal (and are only used at departure) by end edge + static std::map > myDepartureDrivewaysEnds; + + /// @brief all driveways that end on the given edge + static std::map, ComparatorNumericalIdLess> myEndingDriveways; + + /// @brief lookup table for state loading + static std::map myDriveWayRouteLookup; + static std::map myDriveWayLookup; + +}; diff --git a/src/microsim/traffic_lights/MSRailSignal.cpp b/src/microsim/traffic_lights/MSRailSignal.cpp index 54c49d90040b..506b24e89c8c 100644 --- a/src/microsim/traffic_lights/MSRailSignal.cpp +++ b/src/microsim/traffic_lights/MSRailSignal.cpp @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #include @@ -47,24 +46,12 @@ #include "MSTLLogicControl.h" #include "MSRailSignalConstraint.h" #include "MSRailSignalControl.h" +#include "MSDriveWay.h" #include "MSRailSignal.h" -// typical block length in germany on main lines is 3-5km on branch lines up to 7km -// special branches that are used by one train exclusively could also be up to 20km in length -// minimum block size in germany is 37.5m (LZB) -// larger countries (USA, Russia) might see blocks beyond 20km) -#define MAX_BLOCK_LENGTH 20000 -#define MAX_SIGNAL_WARNINGS 10 - //#define DEBUG_SELECT_DRIVEWAY -//#define DEBUG_BUILD_DRIVEWAY //#define DEBUG_DRIVEWAY_UPDATE -//#define DEBUG_DRIVEWAY_BUILDROUTE -//#define DEBUG_CHECK_FLANKS - //#define DEBUG_SIGNALSTATE -//#define DEBUG_SIGNALSTATE_PRIORITY -//#define DEBUG_FIND_PROTECTION //#define DEBUG_REROUTE #define DEBUG_COND DEBUG_HELPER(this) @@ -76,15 +63,15 @@ // =========================================================================== // static value definitions // =========================================================================== -int MSRailSignal::myNumWarnings(0); - -int MSRailSignal::myDriveWayIndex(0); bool MSRailSignal::myStoreVehicles(false); MSRailSignal::VehicleVector MSRailSignal::myBlockingVehicles; MSRailSignal::VehicleVector MSRailSignal::myRivalVehicles; MSRailSignal::VehicleVector MSRailSignal::myPriorityVehicles; std::string MSRailSignal::myConstraintInfo; +int MSRailSignal::myRSIndex(0); +std::vector MSRailSignal::myBlockingDriveWays; +std::string MSRailSignal::myRequestedDriveWay; // =========================================================================== // method definitions @@ -93,11 +80,14 @@ MSRailSignal::MSRailSignal(MSTLLogicControl& tlcontrol, const std::string& id, const std::string& programID, SUMOTime delay, const Parameterised::Map& parameters) : MSTrafficLightLogic(tlcontrol, id, programID, 0, TrafficLightType::RAIL_SIGNAL, delay, parameters), + myNumericalID(myRSIndex++), myCurrentPhase(DELTA_T, std::string(SUMO_MAX_CONNECTIONS, 'X')), // dummy phase - myPhaseIndex(0) { + myPhaseIndex(0), + myDriveWayIndex(0) { myDefaultCycleTime = DELTA_T; myMovingBlock = OptionsCont::getOptions().getBool("railsignal-moving-block"); MSRailSignalControl::getInstance().addSignal(this); + mySwitchCommand->deschedule(this); } void @@ -134,26 +124,29 @@ MSRailSignal::adaptLinkInformationFrom(const MSTrafficLightLogic& logic) { // ------------ Switching and setting current rows SUMOTime MSRailSignal::trySwitch() { - updateCurrentPhase(); - return DELTA_T; + // deschedule regular traffic light event, + // updateCurrentPhase is instead called from MSRailSignalControl::updateSignals + return SUMOTime_MAX; } -void +bool MSRailSignal::updateCurrentPhase() { #ifdef DEBUG_SIGNALSTATE gDebugFlag4 = DEBUG_COND; #endif + bool keepActive = false; // green by default so vehicles can be inserted at the borders of the network std::string state(myLinks.size(), 'G'); for (LinkInfo& li : myLinkInfos) { if (li.myLink->getApproaching().size() > 0) { - Approaching closest = getClosest(li.myLink); - DriveWay& driveway = li.getDriveWay(closest.first); + keepActive = true; + Approaching closest = li.myLink->getClosest(); + MSDriveWay& driveway = li.getDriveWay(closest.first); //std::cout << SIMTIME << " signal=" << getTLLinkID(li.myLink) << " veh=" << closest.first->getID() << " dw:\n"; //driveway.writeBlocks(*OutputDevice_COUT::getDevice()); - const bool mustWait = !constraintsAllow(closest.first); + const bool mustWait = !constraintsAllow(closest.first, true); MSEdgeVector occupied; if (mustWait || !driveway.reserve(closest, occupied)) { state[li.myLink->getTLIndex()] = 'r'; @@ -167,10 +160,6 @@ MSRailSignal::updateCurrentPhase() { #endif } else { state[li.myLink->getTLIndex()] = 'G'; - if (driveway.myFlank.size() > 0 && myCurrentPhase.getState()[li.myLink->getTLIndex()] != 'G') { - // schedule recheck - MSRailSignalControl::getInstance().addGreenFlankSwitch(li.myLink, driveway.myNumericalID); - } #ifdef DEBUG_SIGNALSTATE if (gDebugFlag4) { std::cout << SIMTIME << " rsl=" << li.getID() << " veh=" << closest.first->getID() << " reserved\n"; @@ -186,18 +175,20 @@ MSRailSignal::updateCurrentPhase() { #endif state[li.myLink->getTLIndex()] = 'r'; } else { - DriveWay& driveway = li.myDriveways.front(); - if (driveway.conflictLaneOccupied() || driveway.conflictLinkApproached()) { + const MSDriveWay& driveway = *li.myDriveways.front(); + MSEdgeVector occupied; + if (driveway.foeDriveWayOccupied(true, nullptr, occupied) || driveway.foeDriveWayApproached()) { + keepActive = true; #ifdef DEBUG_SIGNALSTATE if (gDebugFlag4) { - std::cout << SIMTIME << " rsl=" << li.getID() << " red for default driveway (" << toString(driveway.myRoute) << ")\n"; + std::cout << SIMTIME << " rsl=" << li.getID() << " red for default driveway " << driveway.getID() << "\n"; } #endif state[li.myLink->getTLIndex()] = 'r'; } else { #ifdef DEBUG_SIGNALSTATE if (gDebugFlag4) { - std::cout << SIMTIME << " rsl=" << li.getID() << " green for default driveway (" << toString(driveway.myRoute) << ")\n"; + std::cout << SIMTIME << " rsl=" << li.getID() << " green for default driveway " << driveway.getID() << "\n"; } #endif } @@ -207,15 +198,21 @@ MSRailSignal::updateCurrentPhase() { if (myCurrentPhase.getState() != state) { myCurrentPhase.setState(state); myPhaseIndex = 1 - myPhaseIndex; + // set link priorities + setTrafficLightSignals(SIMSTEP); + // execute switch actions (3D-gui) + //const MSTLLogicControl::TLSLogicVariants& vars = myTLControl.get(myTLLogic->getID()); + //vars.executeOnSwitchActions(); } #ifdef DEBUG_SIGNALSTATE gDebugFlag4 = false; #endif + return keepActive; } bool -MSRailSignal::constraintsAllow(const SUMOVehicle* veh) const { +MSRailSignal::constraintsAllow(const SUMOVehicle* veh, bool storeWaitRelation) const { if (myConstraints.size() == 0) { return true; } else { @@ -230,6 +227,13 @@ MSRailSignal::constraintsAllow(const SUMOVehicle* veh) const { std::cout << " constraint '" << c->getDescription() << "' not cleared\n"; } #endif + if (storeWaitRelation && MSGlobals::gTimeToTeleportRSDeadlock > 0 + && veh->getWaitingTime() > veh->getVehicleType().getCarFollowModel().getStartupDelay()) { + const SUMOVehicle* foe = c->getFoe(); + if (foe != nullptr) { + MSRailSignalControl::getInstance().addWaitRelation(veh, this, foe, c); + } + } if (myStoreVehicles) { myConstraintInfo = c->getDescription(); } @@ -325,21 +329,6 @@ MSRailSignal::addLink(MSLink* link, MSLane* lane, int pos) { } -std::string -MSRailSignal::getTLLinkID(MSLink* link) { - return link->getTLLogic()->getID() + "_" + toString(link->getTLIndex()); -} - -std::string -MSRailSignal::getJunctionLinkID(MSLink* link) { - return link->getJunction()->getID() + "_" + toString(link->getIndex()); -} - -std::string -MSRailSignal::getClickableTLLinkID(MSLink* link) { - return "junction '" + link->getTLLogic()->getID() + "', link " + toString(link->getTLIndex()); -} - std::string MSRailSignal::describeLinks(std::vector links) { std::string result; @@ -349,54 +338,9 @@ MSRailSignal::describeLinks(std::vector links) { return result; } -std::string -MSRailSignal::formatVisitedMap(const LaneVisitedMap& visited) { - std::vector lanes(visited.size(), nullptr); - for (auto item : visited) { - lanes[item.second] = item.first; - } - return toString(lanes); -} - - -void -MSRailSignal::appendMapIndex(LaneVisitedMap& map, const MSLane* lane) { - // avoid undefined behavior from evaluation order - const int tmp = (int)map.size(); - map[lane] = tmp; -} - - -MSRailSignal::Approaching -MSRailSignal::getClosest(MSLink* link) { - assert(link->getApproaching().size() > 0); - double minDist = std::numeric_limits::max(); - auto closestIt = link->getApproaching().begin(); - for (auto apprIt = link->getApproaching().begin(); apprIt != link->getApproaching().end(); apprIt++) { - if (apprIt->second.dist < minDist) { - minDist = apprIt->second.dist; - closestIt = apprIt; - } - } - // maybe a parallel link has a closer vehicle - /* - for (MSLink* link2 : link->getLaneBefore()->getLinkCont()) { - if (link2 != link) { - for (auto apprIt2 = link2->getApproaching().begin(); apprIt2 != link2->getApproaching().end(); apprIt2++) { - if (apprIt2->second.dist < minDist) { - minDist = apprIt2->second.dist; - closestIt = apprIt2; - } - } - } - } - */ - return *closestIt; -} - void -MSRailSignal::writeBlocks(OutputDevice& od) const { +MSRailSignal::writeBlocks(OutputDevice& od, bool writeVehicles) const { od.openTag("railSignal"); od.writeAttr(SUMO_ATTR_ID, getID()); for (const LinkInfo& li : myLinkInfos) { @@ -405,8 +349,12 @@ MSRailSignal::writeBlocks(OutputDevice& od) const { od.writeAttr(SUMO_ATTR_TLLINKINDEX, link->getTLIndex()); od.writeAttr(SUMO_ATTR_FROM, link->getLaneBefore()->getID()); od.writeAttr(SUMO_ATTR_TO, link->getViaLaneOrLane()->getID()); - for (const DriveWay& dw : li.myDriveways) { - dw.writeBlocks(od); + for (const MSDriveWay* dw : li.myDriveways) { + if (writeVehicles) { + dw->writeBlockVehicles(od); + } else { + dw->writeBlocks(od); + } } od.closeTag(); // link } @@ -421,7 +369,9 @@ MSRailSignal::initDriveWays(const SUMOVehicle* ego, bool update) { if (endIndex < 0) { endIndex = (int)edges.size() - 1; } - for (int i = ego->getParameter().departEdge; i <= endIndex - 1; i++) { + const int departIndex = ego->getParameter().departEdge; + MSDriveWay* prev = const_cast(MSDriveWay::getDepartureDriveway(ego)); + for (int i = departIndex; i <= endIndex - 1; i++) { const MSEdge* e = edges[i]; if (e->isNormal() && e->getToJunction()->getType() == SumoXMLNodeType::RAIL_SIGNAL) { const MSEdge* e2 = edges[i + 1]; @@ -431,17 +381,19 @@ MSRailSignal::initDriveWays(const SUMOVehicle* ego, bool update) { MSRailSignal* rs = const_cast(dynamic_cast(link->getTLLogic())); if (rs != nullptr) { LinkInfo& li = rs->myLinkInfos[link->getTLIndex()]; - if (li.myDriveways.empty()) { - // init driveway - li.getDriveWay(ego); - if (update && rs->isActive()) { - // vehicle may have rerouted its intial trip - // after the states have been set - // @note: This is a hack because it could lead to invalid tls-output - // (it's still an improvement over switching based on default driveways) - rs->trySwitch(); - rs->setTrafficLightSignals(SIMSTEP); - } + // init driveway + MSDriveWay* dw = &li.getDriveWay(ego); + MSRailSignalControl::getInstance().addDrivewayFollower(prev, dw); + MSRailSignalControl::getInstance().addDWDeadlockChecks(rs, prev); + MSRailSignalControl::getInstance().notifyApproach(link); + prev = dw; + if (update && rs->isActive()) { + // vehicle may have rerouted its intial trip + // after the states have been set + // @note: This is a hack because it could lead to invalid tls-output + // (it's still an improvement over switching based on default driveways) + rs->updateCurrentPhase(); + rs->setTrafficLightSignals(SIMSTEP); } } } @@ -449,119 +401,10 @@ MSRailSignal::initDriveWays(const SUMOVehicle* ego, bool update) { } } } + MSDriveWay::getDepartureDriveway(ego); } -bool -MSRailSignal::hasOncomingRailTraffic(MSLink* link, const MSVehicle* ego, bool& brakeBeforeSignal) { - // @note: this check is intended to prevent deadlock / collision by an inserted vehicle that - // waits at a red signal and thus checks different things than ::reverse() - bool hadOncoming = false; - if (link->getJunction()->getType() == SumoXMLNodeType::RAIL_SIGNAL) { - const MSEdge* bidi = link->getLaneBefore()->getEdge().getBidiEdge(); - if (bidi == nullptr) { - brakeBeforeSignal = false; - return false; - } - const MSRailSignal* rs = dynamic_cast(link->getTLLogic()); - if (rs != nullptr) { - const LinkInfo& li = rs->myLinkInfos[link->getTLIndex()]; - for (const DriveWay& dw : li.myDriveways) { - //std::cout << SIMTIME << " hasOncomingRailTraffic link=" << getTLLinkID(link) << " dwRoute=" << toString(dw.myRoute) << " bidi=" << toString(dw.myBidi) << "\n"; - for (const MSLane* lane : dw.myBidi) { - if (!lane->isEmpty()) { - MSVehicle* veh = lane->getFirstAnyVehicle(); - if (std::find(veh->getCurrentRouteEdge(), veh->getRoute().end(), bidi) != veh->getRoute().end()) { -#ifdef DEBUG_SIGNALSTATE - if (DEBUG_HELPER(rs)) { - std::cout << " oncoming vehicle on bidi-lane " << lane->getID() << "\n"; - } -#endif - return true; - } - } - } - for (const MSLane* lane : dw.myFlank) { - if (!lane->isEmpty()) { - MSVehicle* veh = lane->getFirstAnyVehicle(); - if (std::find(veh->getCurrentRouteEdge(), veh->getRoute().end(), bidi) != veh->getRoute().end()) { -#ifdef DEBUG_SIGNALSTATE - if (DEBUG_HELPER(rs)) { - std::cout << " oncoming vehicle on flank-lane " << lane->getID() << "\n"; - } -#endif - return true; - } - } - } - if (dw.myProtectingSwitchesBidi.size() > 0) { -#ifdef DEBUG_SIGNALSTATE - gDebugFlag4 = DEBUG_HELPER(rs); -#endif - // yield to all foeLinks beyond switch - Approaching approaching(ego, - MSLink::ApproachingVehicleInformation(SIMSTEP, 0, 0, 0, false, 0, 0, std::numeric_limits::max(), 0, 0)); - for (MSLink* const switchLink : dw.myProtectingSwitchesBidi) { - myBlockingVehicles.clear(); - myRivalVehicles.clear(); - myPriorityVehicles.clear(); - myConstraintInfo = ""; - myStoreVehicles = true; - const bool hasProtection = dw.findProtection(approaching, switchLink); - myStoreVehicles = false; - if (!hasProtection) { - for (const SUMOVehicle* veh : myBlockingVehicles) { - hadOncoming = true; - if (!brakeBeforeSignal || std::find(veh->getCurrentRouteEdge(), veh->getRoute().end(), bidi) != veh->getRoute().end()) { -#ifdef DEBUG_SIGNALSTATE - if (DEBUG_HELPER(rs)) { - std::cout << " no protection at bidi-switch " << switchLink->getDescription() << " from veh=" << veh->getID() << "\n"; - gDebugFlag4 = false; - } -#endif - return true; - } - } - for (const SUMOVehicle* veh : myRivalVehicles) { - hadOncoming = true; - if (!brakeBeforeSignal || std::find(veh->getCurrentRouteEdge(), veh->getRoute().end(), bidi) != veh->getRoute().end()) { -#ifdef DEBUG_SIGNALSTATE - if (DEBUG_HELPER(rs)) { - std::cout << " no protection at bidi-switch " << switchLink->getDescription() << " from linkRival veh=" << veh->getID() << "\n"; - gDebugFlag4 = false; - } -#endif - return true; - } - } - } - } -#ifdef DEBUG_SIGNALSTATE - gDebugFlag4 = false; -#endif - } - for (MSLink* foeLink : dw.myConflictLinks) { - if (foeLink->getApproaching().size() != 0) { - Approaching closest = getClosest(foeLink); - const SUMOVehicle* veh = closest.first; - if (veh->getSpeed() > 0 && closest.second.arrivalSpeedBraking > 0 - && std::find(veh->getCurrentRouteEdge(), veh->getRoute().end(), bidi) != veh->getRoute().end()) { -#ifdef DEBUG_SIGNALSTATE - if (DEBUG_HELPER(rs)) { - std::cout << " oncoming vehicle approaching foe link " << foeLink->getDescription() << "\n"; - } -#endif - return true; - } - } - } - } - } - } - brakeBeforeSignal = hadOncoming; - return false; -} - bool MSRailSignal::hasInsertionConstraint(MSLink* link, const MSVehicle* veh, std::string& info, bool& isInsertionOrder) { if (link->getJunction() != nullptr && link->getJunction()->getType() == SumoXMLNodeType::RAIL_SIGNAL) { @@ -579,6 +422,12 @@ MSRailSignal::hasInsertionConstraint(MSLink* link, const MSVehicle* veh, std::st #endif info = c->getDescription(); isInsertionOrder = c->getType() == MSRailSignalConstraint::ConstraintType::INSERTION_ORDER; + if (MSGlobals::gTimeToTeleportRSDeadlock > 0) { + const SUMOVehicle* foe = c->getFoe(); + if (foe != nullptr) { + MSRailSignalControl::getInstance().addWaitRelation(veh, rs, foe, c); + } + } return true; } } @@ -597,6 +446,12 @@ MSRailSignal::LinkInfo::LinkInfo(MSLink* link): reset(); } +MSRailSignal::LinkInfo::~LinkInfo() { + for (MSDriveWay* dw : myDriveways) { + delete dw; + } + myDriveways.clear(); +} void MSRailSignal::LinkInfo::reset() { @@ -612,7 +467,7 @@ MSRailSignal::LinkInfo::getID() const { } -MSRailSignal::DriveWay& +MSDriveWay& MSRailSignal::LinkInfo::getDriveWay(const SUMOVehicle* veh) { MSEdge* first = &myLink->getLane()->getEdge(); MSRouteIterator firstIt = std::find(veh->getCurrentRouteEdge(), veh->getRoute().end(), first); @@ -633,129 +488,43 @@ MSRailSignal::LinkInfo::getDriveWay(const SUMOVehicle* veh) { routeIndex--; } } + MSRailSignal* rs = const_cast(dynamic_cast(myLink->getTLLogic())); if (firstIt == veh->getRoute().end()) { - WRITE_WARNING("Invalid approach information to rail signal '" + getClickableTLLinkID(myLink) + "' after rerouting for vehicle '" + veh->getID() + WRITE_WARNING("Invalid approach information to rail signal '" + MSDriveWay::getClickableTLLinkID(myLink) + "' after rerouting for vehicle '" + veh->getID() + "' first driveway edge '" + first->getID() + "' time=" + time2string(MSNet::getInstance()->getCurrentTimeStep()) + "."); if (myDriveways.empty()) { ConstMSEdgeVector dummyRoute; dummyRoute.push_back(&myLink->getLane()->getEdge()); - DriveWay dw = buildDriveWay(dummyRoute.begin(), dummyRoute.end()); + MSDriveWay* dw = MSDriveWay::buildDriveWay(rs->getNewDrivewayID(), myLink, dummyRoute.begin(), dummyRoute.end()); myDriveways.push_back(dw); } - return myDriveways.front(); + return *myDriveways.front(); } //std::cout << SIMTIME << " veh=" << veh->getID() << " rsl=" << getID() << " dws=" << myDriveways.size() << "\n"; - for (DriveWay& dw : myDriveways) { - // @todo optimize: it is sufficient to check for specific edges (after each switch) - auto itRoute = firstIt; - auto itDwRoute = dw.myRoute.begin(); - bool match = true; - while (itRoute != veh->getRoute().end() && itDwRoute != dw.myRoute.end()) { - if (*itRoute != *itDwRoute) { - match = false; - //std::cout << " check dw=" << " match failed at vehEdge=" << (*itRoute)->getID() << " dwEdge=" << (*itDwRoute)->getID() << "\n"; - break; - } - itRoute++; - itDwRoute++; - } - // if the vehicle arrives before the end of this driveway, - // we'd rather build a new driveway to avoid superfluous restrictions - if (match && itDwRoute == dw.myRoute.end() - && (itRoute == veh->getRoute().end() || dw.myFoundSignal || dw.myFoundReversal)) { - //std::cout << " using dw=" << "\n"; - return dw; + return getDriveWay(firstIt, veh->getRoute().end(), veh->getID()); +} + + +MSDriveWay& +MSRailSignal::LinkInfo::getDriveWay(MSRouteIterator firstIt, MSRouteIterator endIt, const std::string& info) { + for (MSDriveWay* dw : myDriveways) { + if (dw->match(firstIt, endIt)) { + return *dw; } #ifdef DEBUG_SELECT_DRIVEWAY - std::cout << SIMTIME << " rs=" << getID() << " veh=" << veh->getID() << " other dwSignal=" << dw.myFoundSignal << " dwRoute=" << toString(dw.myRoute) << " route=" << toString(veh->getRoute().getEdges()) << "\n"; + std::cout << SIMTIME << " rs=" << getID() << " veh=" << info << " other dwSignal=" << dw->foundSignal() << " dwRoute=" << toString(dw->getRoute()) << "\n"; +#else + UNUSED_PARAMETER(info); #endif } - DriveWay dw = buildDriveWay(firstIt, veh->getRoute().end()); + MSRailSignal* rs = const_cast(dynamic_cast(myLink->getTLLogic())); + MSDriveWay* dw = MSDriveWay::buildDriveWay(rs->getNewDrivewayID(), myLink, firstIt, endIt); + dw->setVehicle(info); #ifdef DEBUG_SELECT_DRIVEWAY - std::cout << SIMTIME << " rs=" << getID() << " veh=" << veh->getID() << " new dwSignal=" << dw.myFoundSignal << " dwRoute=" << toString(dw.myRoute) << " route=" << toString(veh->getRoute().getEdges()) << "\n"; + std::cout << SIMTIME << " rs=" << getID() << " veh=" << info << " new dwSignal=" << dw->foundSignal() << " dwRoute=" << toString(dw->getRoute()) << "\n"; #endif myDriveways.push_back(dw); - return myDriveways.back(); -} - - -MSRailSignal::DriveWay -MSRailSignal::LinkInfo::buildDriveWay(MSRouteIterator first, MSRouteIterator end) { - // collect lanes and links that are relevant for setting this signal for the current driveWay - // For each driveway we collect - // - conflictLanes (signal must be red if any conflict lane is occupied) - // - conflictLinks (signal must be red if any conflict link is approached by a vehicle - // - that cannot break in time (arrivalSpeedBraking > 0) - // - approached by a vehicle with higher switching priority (see #3941) - // These objects are construct in steps: - // - // forwardBlock - // - search forward recursive from outgoing lane until controlled railSignal link found - // -> add all found lanes to conflictLanes - // - // bidiBlock (if any forwardBlock edge has bidi edge) - // - search bidi backward recursive until first switch - // - from switch search backward recursive all other incoming until controlled rail signal link - // -> add final links to conflictLinks - // - // flanks - // - search backward recursive from flanking switches - // until controlled railSignal link or protecting switch is found - // -> add all found lanes to conflictLanes - // -> add final links to conflictLinks - - DriveWay dw; - LaneVisitedMap visited; - std::vector before; - appendMapIndex(visited, myLink->getLaneBefore()); - MSLane* fromBidi = myLink->getLaneBefore()->getBidiLane(); - if (fromBidi != nullptr) { - // do not extend to forward block beyond the entering track (in case of a loop) - appendMapIndex(visited, fromBidi); - before.push_back(fromBidi); - } - dw.buildRoute(myLink, 0., first, end, visited); - if (dw.myProtectedBidi == nullptr) { - dw.myCoreSize = (int)dw.myRoute.size(); - } - dw.checkFlanks(myLink, dw.myForward, visited, true, dw.myFlankSwitches); - dw.checkFlanks(myLink, dw.myBidi, visited, false, dw.myFlankSwitches); - dw.checkFlanks(myLink, before, visited, true, dw.myFlankSwitches); - for (MSLink* link : dw.myFlankSwitches) { - //std::cout << getID() << " flankSwitch=" << link->getDescription() << "\n"; - dw.findFlankProtection(link, 0, visited, link, dw.myFlank); - } - std::vector flankSwitchesBidiExtended; - dw.checkFlanks(myLink, dw.myBidiExtended, visited, false, flankSwitchesBidiExtended); - for (MSLink* link : flankSwitchesBidiExtended) { - //std::cout << getID() << " flankSwitchBEx=" << link->getDescription() << "\n"; - dw.findFlankProtection(link, 0, visited, link, dw.myBidiExtended); - } - -#ifdef DEBUG_BUILD_DRIVEWAY - if (DEBUG_COND_LINKINFO) { - std::cout << " buildDriveWay railSignal=" << getID() - << "\n route=" << toString(dw.myRoute) - << "\n forward=" << toString(dw.myForward) - << "\n bidi=" << toString(dw.myBidi) - << "\n flank=" << toString(dw.myFlank) - << "\n flankSwitch=" << describeLinks(dw.myFlankSwitches) - << "\n protSwitch=" << describeLinks(dw.myProtectingSwitches) - << "\n coreSize=" << dw.myCoreSize - << "\n"; - } -#endif - MSRailSignal* rs = const_cast(static_cast(myLink->getTLLogic())); - if (!rs->myMovingBlock) { - dw.myConflictLanes.insert(dw.myConflictLanes.end(), dw.myForward.begin(), dw.myForward.end()); - } - dw.myConflictLanes.insert(dw.myConflictLanes.end(), dw.myBidi.begin(), dw.myBidi.end()); - dw.myConflictLanes.insert(dw.myConflictLanes.end(), dw.myFlank.begin(), dw.myFlank.end()); - if (dw.myProtectedBidi != nullptr) { - MSRailSignalControl::getInstance().registerProtectedDriveway(rs, dw.myNumericalID, dw.myProtectedBidi); - } - - return dw; + return *myDriveways.back(); } @@ -791,743 +560,27 @@ MSRailSignal::LinkInfo::reroute(SUMOVehicle* veh, const MSEdgeVector& occupied) } -// =========================================================================== -// DriveWay method definitions -// =========================================================================== - -bool -MSRailSignal::DriveWay::reserve(const Approaching& closest, MSEdgeVector& occupied) { - std::string joinVehicle = ""; - if (!MSGlobals::gUseMesoSim) { - const SUMOVehicleParameter::Stop* stop = closest.first->getNextStopParameter(); - if (stop != nullptr) { - joinVehicle = stop->join; - } - } - if (conflictLaneOccupied(joinVehicle, true, closest.first)) { - for (const MSLane* bidi : myBidi) { - if (!bidi->empty() && bidi->getBidiLane() != nullptr) { - occupied.push_back(&bidi->getBidiLane()->getEdge()); - } - } -#ifdef DEBUG_SIGNALSTATE - if (gDebugFlag4) { - std::cout << " conflictLaneOccupied by=" << toString(myBlockingVehicles) << " ego=" << Named::getIDSecure(closest.first) << "\n"; - } -#endif - return false; - } - for (MSLink* link : myProtectingSwitches) { - if (!findProtection(closest, link)) { -#ifdef DEBUG_SIGNALSTATE - if (gDebugFlag4) { - std::cout << " no protection at switch " << link->getDescription() << "\n"; - } -#endif - return false; - } - } - for (MSLink* foeLink : myConflictLinks) { - if (hasLinkConflict(closest, foeLink)) { -#ifdef DEBUG_SIGNALSTATE - if (gDebugFlag4) { - std::cout << " linkConflict with " << getTLLinkID(foeLink) << "\n"; - } -#endif - return false; - } - } - if (deadlockLaneOccupied()) { - return false; - } - myActive = closest.first; - return true; -} - - -bool -MSRailSignal::DriveWay::conflictLinkApproached() const { - for (MSLink* foeLink : myConflictLinks) { - if (foeLink->getApproaching().size() > 0) { -#ifdef DEBUG_SIGNALSTATE - if (gDebugFlag4) { - std::cout << SIMTIME << " foeLink=" << foeLink->getDescription() << " approachedBy=" << foeLink->getApproaching().begin()->first->getID() << "\n"; - } -#endif - return true; - } - } - return false; -} - - -bool -MSRailSignal::DriveWay::hasLinkConflict(const Approaching& veh, MSLink* foeLink) const { -#ifdef DEBUG_SIGNALSTATE_PRIORITY - if (gDebugFlag4) { - std::cout << " checkLinkConflict foeLink=" << getTLLinkID(foeLink) << "\n"; - } -#endif - if (foeLink->getApproaching().size() > 0) { - Approaching foe = getClosest(foeLink); -#ifdef DEBUG_SIGNALSTATE_PRIORITY - if (gDebugFlag4) { - std::cout << " approaching foe=" << foe.first->getID() << "\n"; - } -#endif - const MSTrafficLightLogic* foeTLL = foeLink->getTLLogic(); - assert(foeTLL != nullptr); - const MSRailSignal* constFoeRS = dynamic_cast(foeTLL); - MSRailSignal* foeRS = const_cast(constFoeRS); - if (foeRS != nullptr) { - const DriveWay& foeDriveWay = foeRS->myLinkInfos[foeLink->getTLIndex()].getDriveWay(foe.first); - if (foeDriveWay.conflictLaneOccupied("", false, foe.first) || - foeDriveWay.deadlockLaneOccupied(false) || - !foeRS->constraintsAllow(foe.first) || - !overlap(foeDriveWay)) { -#ifdef DEBUG_SIGNALSTATE_PRIORITY - if (gDebugFlag4) { - if (foeDriveWay.conflictLaneOccupied("", false, foe.first)) { - std::cout << " foe blocked\n"; - } else if (!foeRS->constraintsAllow(foe.first)) { - std::cout << " foe constrained\n"; - } else { - std::cout << " no overlap\n"; - } - } -#endif - return false; - } -#ifdef DEBUG_SIGNALSTATE_PRIORITY - if (gDebugFlag4) { - std::cout - << " aSB=" << veh.second.arrivalSpeedBraking << " foeASB=" << foe.second.arrivalSpeedBraking - << " aT=" << veh.second.arrivalTime << " foeAT=" << foe.second.arrivalTime - << " aS=" << veh.first->getSpeed() << " foeS=" << foe.first->getSpeed() - << " aD=" << veh.second.dist << " foeD=" << foe.second.dist - << " aW=" << veh.first->getWaitingTime() << " foeW=" << foe.first->getWaitingTime() - << " aN=" << veh.first->getNumericalID() << " foeN=" << foe.first->getNumericalID() - << "\n"; - } -#endif - const bool yield = mustYield(veh, foe); - if (myStoreVehicles) { - myRivalVehicles.push_back(foe.first); - if (yield) { - myPriorityVehicles.push_back(foe.first); - } - } - return yield; - } - } - return false; -} - - -bool -MSRailSignal::DriveWay::mustYield(const Approaching& veh, const Approaching& foe) { - if (foe.second.arrivalSpeedBraking == veh.second.arrivalSpeedBraking) { - if (foe.second.arrivalTime == veh.second.arrivalTime) { - if (foe.first->getSpeed() == veh.first->getSpeed()) { - if (foe.second.dist == veh.second.dist) { - if (foe.first->getWaitingTime() == veh.first->getWaitingTime()) { - return foe.first->getNumericalID() < veh.first->getNumericalID(); - } else { - return foe.first->getWaitingTime() > veh.first->getWaitingTime(); - } - } else { - return foe.second.dist < veh.second.dist; - } - } else { - return foe.first->getSpeed() > veh.first->getSpeed(); - } - } else { - return foe.second.arrivalTime < veh.second.arrivalTime; - } - } else { - return foe.second.arrivalSpeedBraking > veh.second.arrivalSpeedBraking; - } -} - - -bool -MSRailSignal::DriveWay::conflictLaneOccupied(const std::string& joinVehicle, bool store, const SUMOVehicle* ego) const { - for (const MSLane* lane : myConflictLanes) { - if (!lane->isEmpty()) { -#ifdef DEBUG_SIGNALSTATE - if (gDebugFlag4) { - std::cout << SIMTIME << " conflictLane " << lane->getID() << " occupied ego=" << Named::getIDSecure(ego) << " vehNumber=" << lane->getVehicleNumber() << "\n"; - if (joinVehicle != "") { - std::cout << " joinVehicle=" << joinVehicle << " occupant=" << toString(lane->getVehiclesSecure()) << "\n"; - lane->releaseVehicles(); - } - } -#endif - if (lane->getVehicleNumberWithPartials() == 1) { - MSVehicle* foe = lane->getLastAnyVehicle(); - if (joinVehicle != "") { - if (foe->getID() == joinVehicle && foe->isStopped()) { -#ifdef DEBUG_SIGNALSTATE - if (gDebugFlag4) { - std::cout << " ignore join-target '" << joinVehicle << "\n"; - } -#endif - continue; - } - } - if (ego != nullptr) { - if (foe == ego && std::find(myBidi.begin(), myBidi.end(), lane) != myBidi.end()) { -#ifdef DEBUG_SIGNALSTATE - if (gDebugFlag4) { - std::cout << " ignore ego as oncoming '" << ego->getID() << "\n"; - } -#endif - continue; - } - if (foe->isStopped() && foe->getNextStopParameter()->join == ego->getID()) { -#ifdef DEBUG_SIGNALSTATE - if (gDebugFlag4) { - std::cout << " ignore " << foe->getID() << " for which ego is join-target\n"; - } -#endif - continue; - } - } - } - if (myStoreVehicles && store) { - myBlockingVehicles.push_back(lane->getLastAnyVehicle()); - } - return true; - } - } - return false; -} - -bool -MSRailSignal::DriveWay::deadlockLaneOccupied(bool store) const { - for (const MSLane* lane : myBidiExtended) { - if (!lane->empty()) { - assert(myBidi.size() != 0); - const MSEdge* lastBidi = myBidi.back()->getNextNormal(); - MSVehicle* foe = lane->getVehiclesSecure().front(); -#ifdef DEBUG_SIGNALSTATE - if (gDebugFlag4) { - std::cout << " check for deadlock with " << foe->getID() << "\n"; - } -#endif - // check of foe will enter myBidi (need to check at most - // myBidiExtended.size edges) - const int minEdges = (int)myBidiExtended.size(); - auto foeIt = foe->getCurrentRouteEdge() + 1; - auto foeEnd = foe->getRoute().end(); - bool conflict = false; - for (int i = 0; i < minEdges && foeIt != foeEnd; i++) { - if ((*foeIt) == lastBidi) { -#ifdef DEBUG_SIGNALSTATE - if (gDebugFlag4) { - std::cout << " vehicle will enter " << lastBidi->getID() << "\n"; - } -#endif - conflict = true; - break; - } - foeIt++; - } - lane->releaseVehicles(); - if (conflict) { - if (myStoreVehicles && store) { - myBlockingVehicles.push_back(foe); - } - return true; - } - } - } - return false; -} - - -bool -MSRailSignal::DriveWay::findProtection(const Approaching& veh, MSLink* link) const { - double flankApproachingDist = std::numeric_limits::max(); - if (link->getApproaching().size() > 0) { - Approaching closest = getClosest(link); - flankApproachingDist = closest.second.dist; - } -#ifdef DEBUG_FIND_PROTECTION - if (gDebugFlag4) { - std::cout << SIMTIME << " findProtection for link=" << link->getDescription() << " flankApproachingDist=" << flankApproachingDist << "\n"; - } -#endif - for (MSLink* l2 : link->getLaneBefore()->getLinkCont()) { - if (l2->getLane() != link->getLane()) { -#ifdef DEBUG_FIND_PROTECTION - if (gDebugFlag4) { - std::cout << " protectionCandidate=" << l2->getDescription() << " l2Via=" << Named::getIDSecure(l2->getViaLane()) - << " occupied=" << (l2->getViaLane() != nullptr && !l2->getViaLane()->isEmpty()) << "\n"; - } -#endif - if (l2->getViaLane() != nullptr && !l2->getViaLane()->isEmpty()) { -#ifdef DEBUG_FIND_PROTECTION - if (gDebugFlag4) { - std::cout << " protection from internal=" << l2->getViaLane()->getID() << "\n"; - } -#endif - return true; - } - if (l2->getApproaching().size() > 0) { - Approaching closest2 = getClosest(l2); - if (closest2.second.dist < flankApproachingDist) { -#ifdef DEBUG_FIND_PROTECTION - if (gDebugFlag4) { - std::cout << " protection from veh=" << closest2.first->getID() << "\n"; - } -#endif - return true; - } - } - } - } - if (link->getApproaching().size() == 0) { - return true; - } else { - // find protection further upstream - DriveWay tmp(true); - const MSLane* before = link->getLaneBefore(); - tmp.myFlank.push_back(before); - LaneVisitedMap visited; - for (auto ili : before->getIncomingLanes()) { - tmp.findFlankProtection(ili.viaLink, myMaxFlankLength, visited, ili.viaLink, tmp.myFlank); - } - tmp.myConflictLanes = tmp.myFlank; - tmp.myRoute = myRoute; - tmp.myCoreSize = myCoreSize; - MSEdgeVector occupied; - if (gDebugFlag4) std::cout << SIMTIME << " tmpDW flank=" << toString(tmp.myFlank) - << " protSwitch=" << describeLinks(tmp.myProtectingSwitches) << " cLinks=" << describeLinks(tmp.myConflictLinks) << "\n"; - return tmp.reserve(veh, occupied); - } -} - - -bool -MSRailSignal::DriveWay::overlap(const DriveWay& other) const { - for (int i = 0; i < myCoreSize; i++) { - for (int j = 0; j < other.myCoreSize; j++) { - const MSEdge* edge = myRoute[i]; - const MSEdge* edge2 = other.myRoute[j]; - if (edge->getToJunction() == edge2->getToJunction() - || edge->getToJunction() == edge2->getFromJunction()) { - // XXX might be rail_crossing with parallel tracks - return true; - } - } - } - return false; -} - -bool -MSRailSignal::DriveWay::flankConflict(const DriveWay& other) const { - for (const MSLane* lane : myForward) { - for (const MSLane* lane2 : other.myForward) { - if (lane == lane2) { - return true; - } - } - for (const MSLane* lane2 : other.myBidi) { - if (lane == lane2) { - return true; - } - } - } - return false; -} - -void -MSRailSignal::DriveWay::writeBlocks(OutputDevice& od) const { - od.openTag("driveWay"); - od.writeAttr(SUMO_ATTR_EDGES, toString(myRoute)); - if (myCoreSize != (int)myRoute.size()) { - od.writeAttr("core", myCoreSize); - } - od.openTag("forward"); - od.writeAttr(SUMO_ATTR_LANES, toString(myForward)); - od.closeTag(); - od.openTag("bidi"); - od.writeAttr(SUMO_ATTR_LANES, toString(myBidi)); - if (myBidiExtended.size() > 0) { - od.lf(); - od << " "; - od.writeAttr("deadlockCheck", toString(myBidiExtended)); - } - od.closeTag(); - od.openTag("flank"); - od.writeAttr(SUMO_ATTR_LANES, toString(myFlank)); - od.closeTag(); - - od.openTag("protectingSwitches"); - std::vector links; - for (MSLink* link : myProtectingSwitches) { - links.push_back(getJunctionLinkID(link)); - } - od.writeAttr("links", joinToString(links, " ")); - od.closeTag(); - - od.openTag("conflictLinks"); - std::vector signals; - for (MSLink* link : myConflictLinks) { - signals.push_back(getTLLinkID(link)); - } - od.writeAttr("signals", joinToString(signals, " ")); - od.closeTag(); - od.closeTag(); // driveWay -} - - -void -MSRailSignal::DriveWay::buildRoute(MSLink* origin, double length, - MSRouteIterator next, MSRouteIterator end, - LaneVisitedMap& visited) { - bool seekForwardSignal = true; - bool seekBidiSwitch = true; - bool foundUnsafeSwitch = false; - MSLane* toLane = origin->getViaLaneOrLane(); -#ifdef DEBUG_DRIVEWAY_BUILDROUTE - gDebugFlag4 = DEBUG_HELPER(origin->getTLLogic()); - if (gDebugFlag4) std::cout << "buildRoute origin=" << getTLLinkID(origin) << " vehRoute=" << toString(ConstMSEdgeVector(next, end)) - << " visited=" << formatVisitedMap(visited) << "\n"; -#endif - while ((seekForwardSignal || seekBidiSwitch)) { - if (length > MAX_BLOCK_LENGTH) { - if (myNumWarnings < MAX_SIGNAL_WARNINGS) { - WRITE_WARNING("Block after rail signal " + getClickableTLLinkID(origin) + - " exceeds maximum length (stopped searching after edge '" + toLane->getEdge().getID() + "' (length=" + toString(length) + "m)."); - } - myNumWarnings++; - // length exceeded - return; - } -#ifdef DEBUG_DRIVEWAY_BUILDROUTE - if (gDebugFlag4) { - std::cout << " toLane=" << toLane->getID() << " visited=" << formatVisitedMap(visited) << "\n"; - } -#endif - if (visited.count(toLane) != 0) { - WRITE_WARNINGF(TL("Found circular block after railSignal % (% edges, length %)"), getClickableTLLinkID(origin), toString(myRoute.size()), toString(length)); - //std::cout << getClickableTLLinkID(origin) << " circularBlock1=" << toString(myRoute) << " visited=" << formatVisitedMap(visited) << "\n"; - return; - } - if (toLane->getEdge().isNormal()) { - myRoute.push_back(&toLane->getEdge()); - if (next != end) { - next++; - } - } - appendMapIndex(visited, toLane); - length += toLane->getLength(); - MSLane* bidi = toLane->getBidiLane(); - if (seekForwardSignal) { - if (!foundUnsafeSwitch) { - myForward.push_back(toLane); - } - } else if (bidi == nullptr) { - seekBidiSwitch = false; -#ifdef DEBUG_DRIVEWAY_BUILDROUTE - if (gDebugFlag4) { - std::cout << " noBidi, abort search for bidiSwitch\n"; - } -#endif - } - if (bidi != nullptr) { - if (foundUnsafeSwitch) { - myBidiExtended.push_back(bidi); - } else { - myBidi.push_back(bidi); - } - appendMapIndex(visited, bidi); - if (!seekForwardSignal) { - // look for switch that could protect from oncoming vehicles - for (const auto& ili : bidi->getIncomingLanes()) { - if (ili.viaLink->getDirection() == LinkDirection::TURN) { - continue; - } - for (const MSLink* const link : ili.lane->getLinkCont()) { - if (link->getDirection() == LinkDirection::TURN) { - continue; - } - if (link->getViaLaneOrLane() != bidi) { - // this switch is special beause it still lies on the current route - //myProtectingSwitches.push_back(ili.viaLink); - const MSEdge* const bidiNext = bidi->getNextNormal(); - myCoreSize = (int)myRoute.size(); - if (MSRailSignalControl::getInstance().getUsedEdges().count(bidiNext) == 0) { -#ifdef DEBUG_DRIVEWAY_BUILDROUTE - if (gDebugFlag4) { - std::cout << " abort: found protecting switch " << ili.viaLink->getDescription() << "\n"; - } -#endif - // if bidi is actually used by a train (rather than - // the other route) we must later adapt this driveway for additional checks (myBidiExtended) - myProtectedBidi = bidiNext; - std::set visitedEdges; - for (auto item : visited) { - visitedEdges.insert(&item.first->getEdge()); - } - while (next != end && visitedEdges.count(*next) == 0) { - // the driveway is route specific but only but stop recording if it loops back on itself - visitedEdges.insert(*next); - const MSEdge* nextBidi = (*next)->getBidiEdge(); - if (nextBidi != nullptr) { - visitedEdges.insert(nextBidi); - } - myRoute.push_back(*next); - next++; - } - return; - } else { -#ifdef DEBUG_DRIVEWAY_BUILDROUTE - if (gDebugFlag4) { - std::cout << " found unsafe switch " << ili.viaLink->getDescription() << " (used=" << bidiNext->getID() << ")\n"; - } -#endif - // trains along our route beyond this switch - // might create deadlock - foundUnsafeSwitch = true; - // the switch itself must still be guarded to ensure safety - for (const auto& ili2 : bidi->getIncomingLanes()) { - if (ili2.viaLink->getDirection() != LinkDirection::TURN) { - myFlankSwitches.push_back(ili.viaLink); - } - } - } - } - } - } - } - } - const std::vector& links = toLane->getLinkCont(); - const MSEdge* current = &toLane->getEdge(); - toLane = nullptr; - for (const MSLink* const link : links) { - if ((next != end && &link->getLane()->getEdge() == *next) - && isRailway(link->getViaLaneOrLane()->getPermissions())) { - toLane = link->getViaLaneOrLane(); - if (link->getLane()->getBidiLane() != nullptr && &link->getLane()->getEdge() == current->getBidiEdge()) { - // do not follow turn-arounds even if the route contains a reversal -#ifdef DEBUG_DRIVEWAY_BUILDROUTE - if (gDebugFlag4) { - std::cout << " abort: turn-around\n"; - } -#endif - myFoundReversal = true; - return; - } - if (link->getTLLogic() != nullptr) { - if (link->getTLLogic() == origin->getTLLogic()) { - WRITE_WARNINGF(TL("Found circular block at railSignal % (% edges, length %)"), getClickableTLLinkID(origin), toString(myRoute.size()), toString(length)); - //std::cout << getClickableTLLinkID(origin) << " circularBlock2=" << toString(myRoute) << "\n"; - return; - } - seekForwardSignal = false; - myFoundSignal = true; - seekBidiSwitch = bidi != nullptr; -#ifdef DEBUG_DRIVEWAY_BUILDROUTE - if (gDebugFlag4) { - std::cout << " found forwardSignal " << link->getTLLogic()->getID() << " seekBidiSwitch=" << seekBidiSwitch << "\n"; - } -#endif - } - break; - } - } - if (toLane == nullptr) { - if (next != end) { - // no connection found, jump to next route edge - toLane = (*next)->getLanes()[0]; -#ifdef DEBUG_DRIVEWAY_BUILDROUTE - if (gDebugFlag4) { - std::cout << " abort: turn-around or jump\n"; - } -#endif - myFoundReversal = true; - return; - } else { -#ifdef DEBUG_DRIVEWAY_BUILDROUTE - if (gDebugFlag4) { - std::cout << " abort: no next lane available\n"; - } -#endif - return; - } - } - } -} - - -void -MSRailSignal::DriveWay::checkFlanks(const MSLink* originLink, const std::vector& lanes, const LaneVisitedMap& visited, bool allFoes, std::vector& flankSwitches) const { -#ifdef DEBUG_CHECK_FLANKS - std::cout << " checkFlanks lanes=" << toString(lanes) << "\n visited=" << formatVisitedMap(visited) << " allFoes=" << allFoes << "\n"; -#endif - const MSLink* reverseOriginLink = originLink->getLane()->getBidiLane() != nullptr && originLink->getLaneBefore()->getBidiLane() != nullptr - ? originLink->getLane()->getBidiLane()->getLinkTo(originLink->getLaneBefore()->getBidiLane()) - : nullptr; - //std::cout << " originLink=" << originLink->getDescription() << "\n"; - if (reverseOriginLink != nullptr) { - reverseOriginLink = reverseOriginLink->getCorrespondingExitLink(); - //std::cout << " reverseOriginLink=" << reverseOriginLink->getDescription() << "\n"; - } - for (int i = 0; i < (int)lanes.size(); i++) { - const MSLane* lane = lanes[i]; - const MSLane* prev = i > 0 ? lanes[i - 1] : nullptr; - const MSLane* next = i + 1 < (int)lanes.size() ? lanes[i + 1] : nullptr; - if (lane->isInternal()) { - continue; - } - for (auto ili : lane->getIncomingLanes()) { - if (ili.viaLink == originLink - || ili.viaLink == reverseOriginLink - || ili.viaLink->getDirection() == LinkDirection::TURN - || ili.viaLink->getDirection() == LinkDirection::TURN_LEFTHAND) { - continue; - } - if (ili.lane != prev && ili.lane != next) { -#ifdef DEBUG_CHECK_FLANKS - std::cout << " add flankSwitch junction=" << ili.viaLink->getJunction()->getID() << " index=" << ili.viaLink->getIndex() << " iLane=" << ili.lane->getID() << " prev=" << Named::getIDSecure(prev) << " targetLane=" << lane->getID() << " next=" << Named::getIDSecure(next) << "\n"; -#endif - flankSwitches.push_back(ili.viaLink); - } else if (allFoes) { - // link is part of the driveway, find foes that cross the driveway without entering - checkCrossingFlanks(ili.viaLink, visited, flankSwitches); - } - } - } -} - - -void -MSRailSignal::DriveWay::checkCrossingFlanks(MSLink* dwLink, const LaneVisitedMap& visited, std::vector& flankSwitches) const { -#ifdef DEBUG_CHECK_FLANKS - std::cout << " checkCrossingFlanks dwLink=" << dwLink->getDescription() << " visited=" << formatVisitedMap(visited) << "\n"; -#endif - const MSJunction* junction = dwLink->getJunction(); - if (junction == nullptr) { - return; // unregulated junction; - } - const MSJunctionLogic* logic = junction->getLogic(); - if (logic == nullptr) { - return; // unregulated junction; - } - for (const MSEdge* in : junction->getIncoming()) { - if (in->isInternal()) { - continue; - } - for (MSLane* inLane : in->getLanes()) { - if (isRailway(inLane->getPermissions()) && visited.count(inLane) == 0) { - for (MSLink* link : inLane->getLinkCont()) { - if (link->getIndex() >= 0 && logic->getFoesFor(dwLink->getIndex()).test(link->getIndex()) - && visited.count(link->getLane()) == 0) { -#ifdef DEBUG_CHECK_FLANKS - std::cout << " add crossing flankSwitch junction=" << junction->getID() << " index=" << link->getIndex() << "\n"; -#endif - if (link->getViaLane() == nullptr) { - flankSwitches.push_back(link); - } else { - flankSwitches.push_back(link->getViaLane()->getLinkCont().front()); - } - } - } - } - } - } -} - -void -MSRailSignal::DriveWay::findFlankProtection(MSLink* link, double length, LaneVisitedMap& visited, MSLink* origLink, std::vector& flank) { -#ifdef DEBUG_CHECK_FLANKS - std::cout << " findFlankProtection link=" << link->getDescription() << " length=" << length << " origLink=" << origLink->getDescription() << "\n"; -#endif - if (link->getTLLogic() != nullptr) { - // guarded by signal -#ifdef DEBUG_CHECK_FLANKS - std::cout << " flank guarded by " << link->getTLLogic()->getID() << "\n"; -#endif - myConflictLinks.push_back(link); - } else if (length > MAX_BLOCK_LENGTH) { - // length exceeded - if (myNumWarnings < MAX_SIGNAL_WARNINGS) { - WRITE_WARNING("Incoming block at junction '" + origLink->getJunction()->getID() + "', link " + toString(origLink->getIndex()) + " exceeds maximum length (stopped searching after lane '" + link->getLane()->getID() + "' (length=" + toString(length) + "m)."); - } - myNumWarnings++; - } else { - // find normal lane before this link - const MSLane* lane = link->getLaneBefore(); - const bool isNew = visited.count(lane) == 0; - if (isNew || (visited[lane] > visited[origLink->getLane()] && std::find(myForward.begin(), myForward.end(), lane) == myForward.end())) { - if (isNew) { - appendMapIndex(visited, lane); - } - length += lane->getLength(); - if (lane->isInternal()) { - flank.push_back(lane); - findFlankProtection(lane->getIncomingLanes().front().viaLink, length, visited, origLink, flank); - } else { - bool foundPSwitch = false; - for (MSLink* l2 : lane->getLinkCont()) { -#ifdef DEBUG_CHECK_FLANKS - std::cout << " lane=" << lane->getID() << " visitedIndex=" << visited[lane] << " origIndex=" << visited[origLink->getLane()] << " cand=" << l2->getDescription() << "\n"; -#endif - if (l2->getDirection() != LinkDirection::TURN && l2->getLane() != link->getLane()) { - foundPSwitch = true; - // found potential protection -#ifdef DEBUG_CHECK_FLANKS - std::cout << " protectingSwitch=" << l2->getDescription() << " for flank=" << link->getDescription() << "\n"; -#endif - myProtectingSwitches.push_back(link); - if (std::find(myBidi.begin(), myBidi.end(), origLink->getLane()) != myBidi.end()) { -#ifdef DEBUG_CHECK_FLANKS - std::cout << " (is bidi-switch)\n"; -#endif - myProtectingSwitchesBidi.push_back(link); - } - } - } - if (!foundPSwitch) { - flank.push_back(lane); - // continue search for protection upstream recursively - for (auto ili : lane->getIncomingLanes()) { - if (ili.viaLink->getDirection() != LinkDirection::TURN) { - findFlankProtection(ili.viaLink, length, visited, origLink, flank); - } - } - } - } - } else { -#ifdef DEBUG_CHECK_FLANKS - std::cout << " laneBefore=" << lane->getID() << " already visited. index=" << visited[lane] << " origAfter=" << origLink->getLane()->getID() << " origIndex=" << visited[origLink->getLane()] << "\n"; -#endif - } - } - myMaxFlankLength = MAX2(myMaxFlankLength, length); -} - void MSRailSignal::storeTraCIVehicles(int linkIndex) { myBlockingVehicles.clear(); myRivalVehicles.clear(); myPriorityVehicles.clear(); myConstraintInfo = ""; + myBlockingDriveWays.clear(); + myRequestedDriveWay = ""; myStoreVehicles = true; LinkInfo& li = myLinkInfos[linkIndex]; if (li.myLink->getApproaching().size() > 0) { - Approaching closest = getClosest(li.myLink); - DriveWay& driveway = li.getDriveWay(closest.first); + Approaching closest = li.myLink->getClosest(); + MSDriveWay& driveway = li.getDriveWay(closest.first); MSEdgeVector occupied; + myRequestedDriveWay = driveway.getID(); // call for side effects driveway.reserve(closest, occupied); constraintsAllow(closest.first); } else if (li.myDriveways.size() > 0) { - li.myDriveways.front().conflictLaneOccupied(); - li.myDriveways.front().conflictLinkApproached(); + li.myDriveways.front()->conflictLaneOccupied(); + li.myDriveways.front()->foeDriveWayApproached(); } myStoreVehicles = false; } @@ -1556,40 +609,49 @@ MSRailSignal::getConstraintInfo(int linkIndex) { return myConstraintInfo; } -const MSRailSignal::DriveWay& + +std::string +MSRailSignal::getRequestedDriveWay(int linkIndex) { + storeTraCIVehicles(linkIndex); + return myRequestedDriveWay; +} + + +std::vector +MSRailSignal::getBlockingDriveWays(int linkIndex) { + storeTraCIVehicles(linkIndex); + return myBlockingDriveWays; +} + +const MSDriveWay& MSRailSignal::retrieveDriveWay(int numericalID) const { for (const LinkInfo& li : myLinkInfos) { - for (const DriveWay& dw : li.myDriveways) { - if (dw.myNumericalID == numericalID) { - return dw; + for (const MSDriveWay* dw : li.myDriveways) { + if (dw->getNumericalID() == numericalID) { + return *dw; } } } throw ProcessError("Invalid driveway id " + toString(numericalID) + " at railSignal '" + getID() + "'"); } +const MSDriveWay& +MSRailSignal::retrieveDriveWayForVeh(int tlIndex, const SUMOVehicle* veh) { + return myLinkInfos[tlIndex].getDriveWay(veh); +} -void -MSRailSignal::updateDriveway(int numericalID) { - for (LinkInfo& li : myLinkInfos) { - for (auto it = li.myDriveways.begin(); it != li.myDriveways.end(); it++) { - const DriveWay& dw = *it; - if (dw.myNumericalID == numericalID) { -#ifdef DEBUG_DRIVEWAY_UPDATE - std::cout << SIMTIME << " rail signal junction '" << getID() << "' requires update for driveway " << numericalID << "\n"; -#endif - std::vector route = dw.myRoute; - li.myDriveways.erase(it); - if (li.myDriveways.size() == 0) { - // rebuild default driveway - li.myDriveways.push_back(li.buildDriveWay(route.begin(), route.end())); - } - return; - } - } - } +const MSDriveWay& +MSRailSignal::retrieveDriveWayForRoute(int tlIndex, MSRouteIterator first, MSRouteIterator end) { + return myLinkInfos[tlIndex].getDriveWay(first, end); } + +const std::vector +MSRailSignal::retrieveDriveWays(int tlIndex) const { + return myLinkInfos[tlIndex].myDriveways; +} + + std::string MSRailSignal::getBlockingVehicleIDs() const { MSRailSignal* rs = const_cast(this); @@ -1642,6 +704,32 @@ MSRailSignal::getConstraintInfo() const { return result; } } +std::string +MSRailSignal::getRequestedDriveWay() const { + MSRailSignal* rs = const_cast(this); + if (myLinkInfos.size() == 1) { + return toString(rs->getRequestedDriveWay(0)); + } else { + std::string result; + for (int i = 0; i < (int)myLinkInfos.size(); i++) { + result += toString(i) + ": " + toString(rs->getRequestedDriveWay(i)) + ";"; + } + return result; + } +} +std::string +MSRailSignal::getBlockingDriveWayIDs() const { + MSRailSignal* rs = const_cast(this); + if (myLinkInfos.size() == 1) { + return toString(rs->getBlockingDriveWays(0)); + } else { + std::string result; + for (int i = 0; i < (int)myLinkInfos.size(); i++) { + result += toString(i) + ": " + toString(rs->getBlockingDriveWays(i)) + ";"; + } + return result; + } +} void MSRailSignal::setParameter(const std::string& key, const std::string& value) { @@ -1661,4 +749,9 @@ MSRailSignal::setParameter(const std::string& key, const std::string& value) { Parameterised::setParameter(key, value); } + +std::string +MSRailSignal::getNewDrivewayID() { + return getID() + "." + toString(myDriveWayIndex++); +} /****************************************************************************/ diff --git a/src/microsim/traffic_lights/MSRailSignal.h b/src/microsim/traffic_lights/MSRailSignal.h index 699228dcc5bf..37c062054d3b 100644 --- a/src/microsim/traffic_lights/MSRailSignal.h +++ b/src/microsim/traffic_lights/MSRailSignal.h @@ -34,6 +34,7 @@ class MSLink; class MSPhaseDefinition; class MSRailSignalConstraint; +class MSDriveWay; // =========================================================================== @@ -67,6 +68,10 @@ class MSRailSignal : public MSTrafficLightLogic { /// @brief Destructor ~MSRailSignal(); + inline int getNumericalID() const { + return myNumericalID; + } + /**@brief Sets a parameter and updates internal constants */ void setParameter(const std::string& key, const std::string& value) override; @@ -100,8 +105,8 @@ class MSRailSignal : public MSTrafficLightLogic { * @return The state actually required for this signal. */ - /// @brief updates the current phase of the signal - void updateCurrentPhase(); + /// @brief updates the current phase of the signal and return whether it should be kept active + bool updateCurrentPhase(); /** @brief Switches to the next phase * @return The time of the next switch (always the next step) @@ -219,8 +224,14 @@ class MSRailSignal : public MSTrafficLightLogic { std::string getConstraintInfo(int linkIndex); std::string getConstraintInfo() const; + std::vector getBlockingDriveWays(int linkIndex) override; + std::string getBlockingDriveWayIDs() const; + + std::string getRequestedDriveWay(int linkIndex) override; + std::string getRequestedDriveWay() const; + /// @brief write rail signal block output for all links and driveways - void writeBlocks(OutputDevice& od) const; + void writeBlocks(OutputDevice& od, bool writeVehicles) const; /// @brief register constraint for signal switching void addConstraint(const std::string& tripId, MSRailSignalConstraint* constraint); @@ -245,185 +256,78 @@ class MSRailSignal : public MSTrafficLightLogic { * @param[in] brakeBeforeSignal Whether the vehicle may brake before the signal, * Returns true if the vehicle has to brake before the signal */ - static bool hasOncomingRailTraffic(MSLink* link, const MSVehicle* ego, bool& brakeBeforeSignal); - static bool hasInsertionConstraint(MSLink* link, const MSVehicle* veh, std::string& info, bool& isInsertionOrder); static void initDriveWays(const SUMOVehicle* ego, bool update); typedef std::pair Approaching; - typedef std::set LaneSet; typedef std::map LaneVisitedMap; - /* The driveways (Fahrstrassen) for each link index - * Each link index has at least one driveway - * A driveway describes one possible route that passes the signal up - * the next secure point - * When a signal guards a switch (indirect guard) that signal stores two - * or more driveways - */ - struct DriveWay { + /* @brief retrieve driveway with the given numerical id + * @note: throws exception if the driveway does not exist at this rail signal */ + const MSDriveWay& retrieveDriveWay(int numericalID) const; - /// @brief Constructor - DriveWay(bool temporary = false) : - myNumericalID(temporary ? -1 : myDriveWayIndex++), - myMaxFlankLength(0), - myActive(nullptr), - myProtectedBidi(nullptr), - myCoreSize(0), - myFoundSignal(false), - myFoundReversal(false) - {} - - /// @brief global driveway index - int myNumericalID; - - /// @brief the maximum flank length searched while building this driveway - double myMaxFlankLength; + const MSDriveWay& retrieveDriveWayForVeh(int tlIndex, const SUMOVehicle* veh); + const MSDriveWay& retrieveDriveWayForRoute(int tlIndex, MSRouteIterator first, MSRouteIterator end); - /// @brief whether the current signal is switched green for a train approaching this block - const SUMOVehicle* myActive; - - /// @brief switch assumed safe from bidi-traffic - const MSEdge* myProtectedBidi; - - /// @brief list of edges for matching against train routes - std::vector myRoute; - - /// @brief number of edges in myRoute where overlap with other driveways is forbidden - int myCoreSize; - - /// @brief whether this driveway ends its forward section with a rail signal (and thus comprises a full block) - bool myFoundSignal; - bool myFoundReversal; - - /* @brief the actual driveway part up to the next railsignal (halting position) - * This must be free of other trains */ - std::vector myForward; - - /* @brief the list of bidirectional edges that can enter the forward - * section and which must also be free of traffic - * (up to the first element that could give protection) */ - std::vector myBidi; - - /* @brief the list of bidirectional edges that can enter the forward - * section and which might contain deadlock-relevant traffic */ - std::vector myBidiExtended; - - /* @brief the list of edges that merge with the forward section - * (found via backward search, up to the first element that could give protection) */ - std::vector myFlank; - - /// @brief the lanes that must be clear of trains before this signal can switch to green - std::vector myConflictLanes; - - /* @brief the list of switches that threaten the driveway and for which protection must be found - */ - std::vector myFlankSwitches; - - /* @brief the list of (first) switches that could give protection from oncoming/flanking vehicles - * if any of them fails to do so, upstream search must be performed - * until protection or conflict is found - */ - std::vector myProtectingSwitches; - /// @brief subset of myProtectingSwitches that protects from oncoming trains - std::vector myProtectingSwitchesBidi; - - /* The conflict links for this block - * Conflict resolution must be performed if vehicles are approaching the - * current link and any of the conflict links */ - std::vector myConflictLinks; - - /// @brief whether any of myConflictLanes is occupied (vehicles that are the target of a join must be ignored) - bool conflictLaneOccupied(const std::string& joinVehicle = "", bool store = true, const SUMOVehicle* ego = nullptr) const; - - /// @brief whether any of myBidiExtended is occupied by a vehicle that targets myBidi - bool deadlockLaneOccupied(bool store = true) const; - - /// @brief attempt reserve this driveway for the given vehicle - bool reserve(const Approaching& closest, MSEdgeVector& occupied); - - /// @brief Whether the approaching vehicle is prevent from driving by another vehicle approaching the given link - bool hasLinkConflict(const Approaching& closest, MSLink* foeLink) const; - - /// @brief Whether veh must yield to the foe train - static bool mustYield(const Approaching& veh, const Approaching& foe); - - /// @brief Whether any of the conflict links have approaching vehicles - bool conflictLinkApproached() const; - - /// @brief find protection for the given vehicle starting at a switch - bool findProtection(const Approaching& veh, MSLink* link) const; - - /// @brief Wether this driveway (route) overlaps with the given one - bool overlap(const DriveWay& other) const; - - /// @brief Wether there is a flank conflict with the given driveway - bool flankConflict(const DriveWay& other) const; - - /// @brief Write block items for this driveway - void writeBlocks(OutputDevice& od) const; - - /* @brief determine route that identifies this driveway (a subset of the - * vehicle route) - * collects: - * myRoute - * myForward - * myBidi - * myProtectedBidi - * - * returns edge that is assumed to safe from oncoming-deadlock or nullptr - */ - void buildRoute(MSLink* origin, double length, MSRouteIterator next, MSRouteIterator end, LaneVisitedMap& visited); + const std::vector retrieveDriveWays(int tlIndex) const; - /* @brief find switches that threaten this driveway - * @param[out] flankSwitches collect the switches - */ - void checkFlanks(const MSLink* originLink, const std::vector& lanes, const LaneVisitedMap& visited, bool allFoes, std::vector& flankSwitches) const; + /// @brief whether the given vehicle is free to drive + bool constraintsAllow(const SUMOVehicle* veh, bool storeWaitRelation = false) const; - /* @brief find links that cross the driveway without entering it - * @param[out] flankSwitches collect the switches - */ - void checkCrossingFlanks(MSLink* dwLink, const LaneVisitedMap& visited, std::vector& flankSwitches) const; - - /* @brief find upstream protection from the given link - * @param[out] flank: the stored flank lanes - */ - void findFlankProtection(MSLink* link, double length, LaneVisitedMap& visited, MSLink* origLink, std::vector& flank); - }; + bool isMovingBlock() const { + return myMovingBlock; + } - /* @brief retrieve driveway with the given numerical id - * @note: throws exception if the driveway does not exist at this rail signal */ - const DriveWay& retrieveDriveWay(int numericalID) const; + static bool storeVehicles() { + return myStoreVehicles; + } - /// @brief get the closest vehicle approaching the given link - static Approaching getClosest(MSLink* link); + static VehicleVector& blockingVehicles() { + return myBlockingVehicles; + } -protected: - /// @brief whether the given vehicle is free to drive - bool constraintsAllow(const SUMOVehicle* veh) const; + static std::vector& blockingDriveWays() { + return myBlockingDriveWays; + } + + static VehicleVector& rivalVehicles() { + return myRivalVehicles; + } + + static VehicleVector& priorityVehicles() { + return myPriorityVehicles; + } + + /// @brief print link descriptions + static std::string describeLinks(std::vector links); protected: + const int myNumericalID; + + std::string getNewDrivewayID(); + /* The driveways for each link */ struct LinkInfo { /// @brief constructor LinkInfo(MSLink* link); + /// @brief Destructor + ~LinkInfo(); + MSLink* myLink; /// @brief all driveways immediately following this link - std::vector myDriveways; + std::vector myDriveways; /// @brief return id for this railsignal-link std::string getID() const; /// @brief retrieve an existing Driveway or construct a new driveway based on the vehicles route - DriveWay& getDriveWay(const SUMOVehicle*); - - /// @brief construct a new driveway by searching along the given route until all block structures are found - DriveWay buildDriveWay(MSRouteIterator first, MSRouteIterator end); + MSDriveWay& getDriveWay(const SUMOVehicle*); + MSDriveWay& getDriveWay(MSRouteIterator firstIt, MSRouteIterator endIt, const std::string& info = ""); /// @brief try rerouting vehicle if reservation failed void reroute(SUMOVehicle* veh, const MSEdgeVector& occupied); @@ -438,24 +342,6 @@ class MSRailSignal : public MSTrafficLightLogic { /// @brief data storage for every link at this node (more than one when directly guarding a switch) std::vector myLinkInfos; - /// @brief return logicID_linkIndex - static std::string getTLLinkID(MSLink* link); - - /// @brief return junctionID_junctionLinkIndex - static std::string getJunctionLinkID(MSLink* link); - - /// @brief return logicID_linkIndex in a way that allows clicking in sumo-gui - static std::string getClickableTLLinkID(MSLink* link); - - /// @brief print link descriptions - static std::string describeLinks(std::vector links); - - /// @brief print link descriptions - static std::string formatVisitedMap(const LaneVisitedMap& visited); - - /// @brief append to map by map index and avoid undefined behavior - static void appendMapIndex(LaneVisitedMap& map, const MSLane* lane); - protected: /** @brief The list of phases this logic uses @@ -476,9 +362,10 @@ class MSRailSignal : public MSTrafficLightLogic { /// @brief map from tripId to constraint list std::map > myConstraints; - static int myNumWarnings; + /// @brief running number of driveways created for this signal + int myDriveWayIndex; - static int myDriveWayIndex; + static int myRSIndex; protected: /// @brief update vehicle lists for traci calls @@ -491,6 +378,8 @@ class MSRailSignal : public MSTrafficLightLogic { static VehicleVector myRivalVehicles; static VehicleVector myPriorityVehicles; static std::string myConstraintInfo; + static std::vector myBlockingDriveWays; + static std::string myRequestedDriveWay; //@} diff --git a/src/microsim/traffic_lights/MSRailSignalConstraint.cpp b/src/microsim/traffic_lights/MSRailSignalConstraint.cpp index 3d6bd86827aa..1aac5a75fbed 100644 --- a/src/microsim/traffic_lights/MSRailSignalConstraint.cpp +++ b/src/microsim/traffic_lights/MSRailSignalConstraint.cpp @@ -39,6 +39,7 @@ // static value definitions // =========================================================================== std::map MSRailSignalConstraint_Predecessor::myTrackerLookup; +std::map MSRailSignalConstraint::myTripIdLookup; // =========================================================================== // MSRailSignalConstraint method definitions @@ -70,6 +71,7 @@ MSRailSignalConstraint::saveState(OutputDevice& out) { void MSRailSignalConstraint::clearState() { MSRailSignalConstraint_Predecessor::clearState(); + myTripIdLookup.clear(); } void @@ -77,19 +79,27 @@ MSRailSignalConstraint::clearAll() { for (MSRailSignal* s : MSRailSignalControl::getInstance().getSignals()) { s->removeConstraints(); } + myTripIdLookup.clear(); } -std::string -MSRailSignalConstraint::getVehID(const std::string& tripID) { +const SUMOVehicle* +MSRailSignalConstraint::getVeh(const std::string& tripID, bool checkID) { MSVehicleControl& c = MSNet::getInstance()->getVehicleControl(); + const std::string& vehID = lookupVehId(tripID); + if (vehID != "") { + SUMOVehicle* veh = c.getVehicle(vehID); + if (veh != nullptr) { + return veh; + } + } for (MSVehicleControl::constVehIt i = c.loadedVehBegin(); i != c.loadedVehEnd(); ++i) { SUMOVehicle* veh = i->second; - if (veh->getParameter().getParameter("tripId") == tripID) { - return veh->getID(); + if (veh->getParameter().getParameter("tripId") == tripID || (checkID && veh->getID() == tripID)) { + return veh; } } - return ""; + return nullptr; } // =========================================================================== @@ -177,18 +187,19 @@ std::string MSRailSignalConstraint_Predecessor::getDescription() const { // try to retrieve vehicle id that belongs to myTripId // this may be slow so it should only be used for debugging - std::string vehID = getVehID(myTripId); - if (vehID != "") { - vehID = " (" + vehID + ")"; + const SUMOVehicle* veh = getVeh(myTripId); + std::string vehID; + if (veh != nullptr) { + vehID = " (" + veh->getID() + ")"; } std::vector passedIDs; for (const std::string& passedTripID : myTrackers.front()->myPassed) { if (passedTripID == "") { continue; } - const std::string passedID = getVehID(passedTripID); - if (passedID != "") { - passedIDs.push_back(passedID); + const SUMOVehicle* passedVeh = getVeh(passedTripID); + if (passedVeh != nullptr) { + passedIDs.push_back(passedVeh->getID()); } } std::string passedIDs2 = ""; @@ -203,6 +214,21 @@ MSRailSignalConstraint_Predecessor::getDescription() const { + " passed=" + StringUtils::prune(toString(myTrackers.front()->myPassed)) + passedIDs2 + params); } +const SUMOVehicle* +MSRailSignalConstraint_Predecessor::getFoe() const { + return getVeh(myTripId, true); +} + +void +MSRailSignalConstraint::storeTripId(const std::string& tripId, const std::string& vehID) { + myTripIdLookup[tripId] = vehID; +} + +const std::string& +MSRailSignalConstraint::lookupVehId(const std::string& tripId) { + return myTripIdLookup[tripId]; +} + // =========================================================================== // MSRailSignalConstraint_Predecessor::PassedTracker method definitions // =========================================================================== diff --git a/src/microsim/traffic_lights/MSRailSignalConstraint.h b/src/microsim/traffic_lights/MSRailSignalConstraint.h index d076c739f413..4e43bdaa8d38 100644 --- a/src/microsim/traffic_lights/MSRailSignalConstraint.h +++ b/src/microsim/traffic_lights/MSRailSignalConstraint.h @@ -27,6 +27,7 @@ // class declarations // =========================================================================== class MSRailSignal; +class SUMOVehicle; class SUMOSAXAttributes; @@ -66,6 +67,10 @@ class MSRailSignalConstraint : public Parameterised { return "RailSignalConstraint"; } + virtual const SUMOVehicle* getFoe() const { + return nullptr; + } + virtual void write(OutputDevice& out, const std::string& tripId) const = 0; ConstraintType getType() const { @@ -102,6 +107,10 @@ class MSRailSignalConstraint : public Parameterised { return myType == INSERTION_PREDECESSOR || myType == INSERTION_ORDER; } + static void storeTripId(const std::string& tripId, const std::string& vehID); + + static const std::string& lookupVehId(const std::string& tripId); + /// @brief clean up state static void cleanup(); @@ -115,9 +124,11 @@ class MSRailSignalConstraint : public Parameterised { static void clearAll(); protected: - static std::string getVehID(const std::string& tripID); + static const SUMOVehicle* getVeh(const std::string& tripID, bool checkID = false); ConstraintType myType; + + static std::map myTripIdLookup; }; @@ -156,6 +167,8 @@ class MSRailSignalConstraint_Predecessor : public MSRailSignalConstraint { std::string getDescription() const; + const SUMOVehicle* getFoe() const; + class PassedTracker : public MSMoveReminder { public: PassedTracker(MSLane* lane); diff --git a/src/microsim/traffic_lights/MSRailSignalControl.cpp b/src/microsim/traffic_lights/MSRailSignalControl.cpp index 7c7426cdf948..9413660b7712 100644 --- a/src/microsim/traffic_lights/MSRailSignalControl.cpp +++ b/src/microsim/traffic_lights/MSRailSignalControl.cpp @@ -26,13 +26,14 @@ #include #include #include +#include #include "MSRailSignal.h" +#include "MSRailSignalConstraint.h" +#include "MSDriveWay.h" #include "MSRailSignalControl.h" -//#define DEBUG_REGISTER_DRIVEWAY -//#define DEBUG_SIGNALSTATE -//#define DEBUG_RECHECKGREEN +//#define DEBUG_BUILD_DEADLOCK_CHECK // =========================================================================== // static value definitions @@ -63,9 +64,12 @@ MSRailSignalControl::cleanup() { void MSRailSignalControl::clearState() { if (myInstance != nullptr) { - myInstance->myUsedEdges.clear(); - myInstance->myProtectedDriveways.clear(); myInstance->myDriveWayCompatibility.clear(); + myInstance->myDriveWaySucc.clear(); + myInstance->myDriveWayPred.clear(); + myInstance->myWrittenDeadlocks.clear(); + myInstance->myDeadlockChecks.clear(); + //myInstance->myActiveSignals.clear(); } } @@ -76,113 +80,228 @@ MSRailSignalControl::~MSRailSignalControl() { void MSRailSignalControl::vehicleStateChanged(const SUMOVehicle* const vehicle, MSNet::VehicleState to, const std::string& /*info*/) { if (isRailway(vehicle->getVClass())) { - if (to == MSNet::VehicleState::NEWROUTE || to == MSNet::VehicleState::DEPARTED) { - for (const MSEdge* edge : vehicle->getRoute().getEdges()) { - myUsedEdges.insert(edge); - if (myProtectedDriveways.count(edge) != 0) { -#ifdef DEBUG_REGISTER_DRIVEWAY - std::cout << "MSRailSignalControl edge=" << edge->getID() << " used by vehicle " << vehicle->getID() << ". Updating " << myProtectedDriveways[edge].size() << " driveways\n"; -#endif - updateDriveways(edge); + std::string dummyMsg; + if ((to == MSNet::VehicleState::BUILT && (!vehicle->getParameter().wasSet(VEHPARS_FORCE_REROUTE) || vehicle->hasValidRoute(dummyMsg))) + || (!vehicle->hasDeparted() && to == MSNet::VehicleState::NEWROUTE)) { + // @note we could delay initialization until the departure time + if (vehicle->getEdge()->getFunction() != SumoXMLEdgeFunc::CONNECTOR) { + MSRailSignal::initDriveWays(vehicle, to == MSNet::VehicleState::NEWROUTE); + } + } + } +} + + +void +MSRailSignalControl::addSignal(MSRailSignal* signal) { + mySignals.push_back(signal); +} + + +void +MSRailSignalControl::addWaitRelation(const SUMOVehicle* waits, const MSRailSignal* rs, const SUMOVehicle* reason, MSRailSignalConstraint* constraint) { + //std::cout << time2string(SIMSTEP) << " addWaitRelation waits=" << waits->getID() << " foe=" << reason->getID() << "\n"; + myWaitRelations[waits] = WaitRelation(rs, reason, constraint); +} + + +bool +MSRailSignalControl::haveDeadlock(const SUMOVehicle* veh) const { + std::set seen; + std::vector list; + const SUMOVehicle* cur = veh; + std::vector constraints; + std::vector constraintBlocked; + std::vector constraintSignals; + //std::cout << time2string(SIMSTEP) << " haveDeadlock veh=" << veh->getID() << "\n"; + while (seen.count(cur) == 0) { + auto it = myWaitRelations.find(cur); + if (it != myWaitRelations.end()) { + if (it->second.constraint != nullptr) { + constraints.push_back(it->second.constraint); + constraintBlocked.push_back(cur); + constraintSignals.push_back(it->second.railSignal); + } + seen.insert(cur); + list.push_back(it->second); + cur = it->second.foe; + } else { + return false; + } + } + if (cur == veh) { + const bool newDeadlock = myWrittenDeadlocks.count(seen) == 0; + myWrittenDeadlocks.insert(seen); + const OptionsCont& oc = OptionsCont::getOptions(); + MSRailSignalConstraint* resolved = nullptr; + const SUMOVehicle* resolvedUnblocked = nullptr; + const MSRailSignal* resolvedSignal = nullptr; + if (!constraints.empty() && oc.getBool("time-to-teleport.remove-constraint")) { + resolved = constraints.front(); + if (newDeadlock) { + std::vector vehicles; + for (auto item : list) { + vehicles.push_back(item.foe->getID()); } + WRITE_WARNINGF("Deactivating constraint to resolve deadlock between vehicles % at time %.", toString(vehicles), time2string(SIMSTEP)); + resolved->setActive(false); + resolvedUnblocked = constraintBlocked.front(); + resolvedSignal = constraintSignals.front(); } } - if (to == MSNet::VehicleState::BUILT || (!vehicle->hasDeparted() && to == MSNet::VehicleState::NEWROUTE)) { - // @note we could delay initialization until the departure time - MSRailSignal::initDriveWays(vehicle, to == MSNet::VehicleState::NEWROUTE); + + if (oc.isSet("deadlock-output")) { + if (newDeadlock) { + myWrittenDeadlocks.insert(seen); + std::vector signals; + std::vector vehicles; + std::vector tripIDs; + for (auto item : list) { + signals.push_back(item.railSignal == nullptr ? "INSERTION" : item.railSignal->getID()); + vehicles.push_back(item.foe->getID()); + tripIDs.push_back(item.foe->getParameter().getParameter("tripId", item.foe->getID())); + } + OutputDevice& od = OutputDevice::getDeviceByOption("deadlock-output"); + if (constraints.empty()) { + od.openTag(SUMO_TAG_DEADLOCK); + } else { + od.openTag("constraintDeadlock"); + } + od.writeAttr(SUMO_ATTR_TIME, time2string(SIMSTEP)); + od.writeAttr(SUMO_ATTR_SIGNALS, signals); + od.writeAttr("vehicles", vehicles); + if (!constraints.empty()) { + od.writeAttr("tripIds", tripIDs); + } + if (resolved != nullptr) { + od.openTag("resolvedConstraint"); + od.writeAttr(SUMO_ATTR_ID, resolvedSignal->getID()); + resolved->write(od, resolvedUnblocked->getParameter().getParameter("tripId", resolvedUnblocked->getID())); + od.closeTag(); + } + od.closeTag(); + + } } + return resolved == nullptr; + } else { + // it's a deadlock but does not involve veh + return false; } } void -MSRailSignalControl::registerProtectedDriveway(MSRailSignal* rs, int driveWayID, const MSEdge* protectedBidi) { - myProtectedDriveways[protectedBidi].push_back(std::make_pair(rs, driveWayID)); -#ifdef DEBUG_REGISTER_DRIVEWAY - std::cout << "MSRailSignalControl edge=" << protectedBidi->getID() << " assumed secure by driveway " << driveWayID << " at signal " << rs->getID() << "\n"; -#endif +MSRailSignalControl::addDeadlockCheck(std::vector signals) { + if (MSDriveWay::haveDriveWays()) { + WRITE_WARNING("Deadlocks should be loaded before any vehicles"); + } + const int n = (int)signals.size(); + for (int i = 0; i < n; i++) { + std::vector others; + for (int j = 0; j < n; j++) { + others.push_back(signals[(i + j + 1) % n]); + } + myDeadlockChecks[signals[i]] = others; + } } void -MSRailSignalControl::updateDriveways(const MSEdge* used) { - for (auto item : myProtectedDriveways[used]) { - item.first->updateDriveway(item.second); - } - myProtectedDriveways.erase(used); +MSRailSignalControl::addDrivewayFollower(const MSDriveWay* dw, const MSDriveWay* dw2) { + //std::cout << " addDrivewayFollower " << dw->getID() << " " << dw2->getID() << "\n"; + myDriveWaySucc[dw].insert(dw2); + myDriveWayPred[dw2].insert(dw); } void -MSRailSignalControl::addSignal(MSRailSignal* signal) { - mySignals.push_back(signal); +MSRailSignalControl::addDWDeadlockChecks(const MSRailSignal* rs, MSDriveWay* dw) { + auto itDL = MSRailSignalControl::getInstance().getDeadlockChecks().find(rs); + if (itDL == MSRailSignalControl::getInstance().getDeadlockChecks().end()) { + return; + } + const std::vector& others = itDL->second; + // the driveway could be part of a deadlock. check whether it would be blocked by the next signal in the circle + std::vector deadlockFoes; + findDeadlockFoes(dw, others, deadlockFoes); } void -MSRailSignalControl::recheckGreen() { - if (mySwitchedGreenFlanks.size() > 0) { - for (const auto& item : mySwitchedGreenFlanks) { - for (const auto& item2 : mySwitchedGreenFlanks) { - if (item.second < item2.second) { - bool conflict = false; - std::pair code(item.second, item2.second); - auto it = myDriveWayCompatibility.find(code); - if (it != myDriveWayCompatibility.end()) { - conflict = it->second; - } else { - // new driveway pair - const MSRailSignal* rs = static_cast(item.first->getTLLogic()); - const MSRailSignal* rs2 = static_cast(item2.first->getTLLogic()); - const MSRailSignal::DriveWay& dw = rs->retrieveDriveWay(item.second); - const MSRailSignal::DriveWay& dw2 = rs2->retrieveDriveWay(item2.second); - // overlap may return true if the driveways are consecutive forward sections - conflict = dw.flankConflict(dw2) || dw2.flankConflict(dw); - myDriveWayCompatibility[code] = conflict; -#ifdef DEBUG_RECHECKGREEN - std::cout << SIMTIME << " new code " << code.first << "," << code.second << " conflict=" << conflict << " dw=" << toString(dw.myRoute) << " dw2=" << toString(dw2.myRoute) << "\n"; -#endif - } - if (conflict) { - MSRailSignal* rs = const_cast(static_cast(item.first->getTLLogic())); - MSRailSignal* rs2 = const_cast(static_cast(item2.first->getTLLogic())); - const MSRailSignal::Approaching& veh = rs->getClosest(item.first); - const MSRailSignal::Approaching& veh2 = rs2->getClosest(item2.first); - if (MSRailSignal::DriveWay::mustYield(veh, veh2)) { - std::string state = rs->getCurrentPhaseDef().getState(); - state[item.first->getTLIndex()] = 'r'; - const_cast(rs->getCurrentPhaseDef()).setState(state); - rs->setTrafficLightSignals(MSNet::getInstance()->getCurrentTimeStep()); -#ifdef DEBUG_RECHECKGREEN - std::cout << SIMTIME << " reset to red " << getClickableTLLinkID(item.first) - << " (" << veh.first->getID() << " yields to " << veh2.first->getID() << "\n"; +MSRailSignalControl::findDeadlockFoes(const MSDriveWay* dw, const std::vector& others, std::vector deadlockFoes) { +#ifdef DEBUG_BUILD_DEADLOCK_CHECK + //std::cout << " findDLfoes dw=" << dw->getID() << " dlFoes=" << toString(deadlockFoes) << "\n"; #endif -#ifdef DEBUG_SIGNALSTATE - if (DEBUG_HELPER(rs)) { - std::cout << SIMTIME << " reset to red " << getClickableTLLinkID(item.first) - << " (" << veh.first->getID() << " yields to " << veh2.first->getID() << "\n"; - } -#endif - } else { - std::string state = rs2->getCurrentPhaseDef().getState(); - state[item2.first->getTLIndex()] = 'r'; - const_cast(rs2->getCurrentPhaseDef()).setState(state); - rs2->setTrafficLightSignals(MSNet::getInstance()->getCurrentTimeStep()); -#ifdef DEBUG_RECHECKGREEN - std::cout << SIMTIME << " reset to red " << getClickableTLLinkID(item2.first) - << " (" << veh2.first->getID() << " yields to " << veh.first->getID() << "\n"; -#endif -#ifdef DEBUG_SIGNALSTATE - if (DEBUG_HELPER(rs2)) { - std::cout << SIMTIME << " reset to red " << getClickableTLLinkID(item2.first) - << " (" << veh2.first->getID() << " yields to " << veh.first->getID() << "\n"; - } + int circleIndex = (int)deadlockFoes.size(); + if (circleIndex < (int)others.size()) { + const MSRailSignal* other = others[circleIndex]; + deadlockFoes.push_back(dw); + for (const MSDriveWay* follower : myDriveWaySucc[dw]) { + for (MSDriveWay* foe : follower->getFoes()) { + if (foe->getForward().back()->getEdge().getToJunction()->getID() == other->getID()) { + findDeadlockFoes(foe, others, deadlockFoes); + } + } + } + } else { +#ifdef DEBUG_BUILD_DEADLOCK_CHECK + std::cout << " add deadlock check foes=" << toString(deadlockFoes) << "\n";; #endif + for (const MSDriveWay* dldw : deadlockFoes) { + if (dldw->isDepartDriveway()) { + const_cast(dldw)->addDWDeadlock(deadlockFoes); + } else { + for (const MSDriveWay* pred : myDriveWayPred[dldw]) { + if (!pred->isDepartDriveway()) { + const MSRailSignal* predRS = dynamic_cast(pred->getOrigin()->getTLLogic()); + if (std::find(others.begin(), others.end(), predRS) != others.end()) { + // driveways that participate in the deadlock don't need to + // do checking since they cannot prevent the deadlock + // (unless they are departDriveways) + continue; } + const_cast(pred)->addDWDeadlock(deadlockFoes); } } } } - mySwitchedGreenFlanks.clear(); + } +} + + +void +MSRailSignalControl::notifyApproach(const MSLink* link) { + const MSRailSignal* rs = dynamic_cast(link->getTLLogic()); + assert(rs != nullptr); + myActiveSignals.insert(const_cast(rs)); +} + + +void +MSRailSignalControl::updateSignals(SUMOTime t) { + UNUSED_PARAMETER(t); + // there are 4 states for a signal + // 1. approached and green + // 2. approached and red + // 3. not approached and trains could pass + // 4. not approached and trains coult not pass + // + // for understanding conflicts better in sumo-gui, we want to show (3) as green. This + // means we have to keep updating signals in state (4) until they change to (3) + + //std::cout << SIMTIME << " activeSignals=" << myActiveSignals.size() << "\n"; + for (auto it = myActiveSignals.begin(); it != myActiveSignals.end();) { + MSRailSignal* rs = *it; + //std::cout << SIMTIME << " update " << rs->getID() << "\n"; + const bool keepActive = rs->updateCurrentPhase(); + if (rs->isActive()) { + rs->setTrafficLightSignals(t); + } + if (!keepActive) { + it = myActiveSignals.erase(it); + } else { + it++; + } } } diff --git a/src/microsim/traffic_lights/MSRailSignalControl.h b/src/microsim/traffic_lights/MSRailSignalControl.h index b6b0218e261f..77e9ca89d60f 100644 --- a/src/microsim/traffic_lights/MSRailSignalControl.h +++ b/src/microsim/traffic_lights/MSRailSignalControl.h @@ -26,6 +26,7 @@ // class declarations // =========================================================================== class MSRailSignal; +class MSRailSignalConstraint; class MSEdge; // =========================================================================== @@ -50,6 +51,24 @@ class MSRailSignalControl : public MSNet::VehicleStateListener { /** @brief Perform resets events when quick-loading state */ static void clearState(); + /// @brief reset all waiting-for relationships at the start of the simulation step + void resetWaitRelations() { + myWaitRelations.clear(); + myWrittenDeadlocks.clear(); + } + + void addWaitRelation(const SUMOVehicle* waits, const MSRailSignal* rs, const SUMOVehicle* reason, MSRailSignalConstraint* constraint = nullptr); + + void addDrivewayFollower(const MSDriveWay* dw, const MSDriveWay* dw2); + + /// @brief check whether the given signal and driveway are part of a deadlock circle + void addDWDeadlockChecks(const MSRailSignal* rs, MSDriveWay* dw); + + /// @brief whether there is a circle in the waiting-for relationships that contains the given vehicle + bool haveDeadlock(const SUMOVehicle* veh) const; + + void addDeadlockCheck(std::vector signals); + /** @brief Called if a vehicle changes its state * @param[in] vehicle The vehicle which changed its state * @param[in] to The state the vehicle has changed to @@ -57,25 +76,27 @@ class MSRailSignalControl : public MSNet::VehicleStateListener { */ void vehicleStateChanged(const SUMOVehicle* const vehicle, MSNet::VehicleState to, const std::string& info = ""); - /// @brief mark driveway that must receive additional checks if protectedBidi is ever used by a train route - void registerProtectedDriveway(MSRailSignal* rs, int driveWayID, const MSEdge* protectedBidi); - - const std::set& getUsedEdges() const { - return myUsedEdges; - } - void addSignal(MSRailSignal* signal); const std::vector& getSignals() const { return mySignals; } - void addGreenFlankSwitch(MSLink* link, int dwID) { - mySwitchedGreenFlanks.emplace_back(link, dwID); + const std::map >& getDeadlockChecks() const { + return myDeadlockChecks; } - /// @brief final check for driveway compatibility of signals that switched green in this step - void recheckGreen(); + /// switch rail signal to active + void notifyApproach(const MSLink* link); + + /// @brief update active rail signals + void updateSignals(SUMOTime t); + + +protected: + + void findDeadlockFoes(const MSDriveWay* dw, const std::vector& others, std::vector deadlockFoes); + private: /** @brief Constructor */ @@ -87,8 +108,21 @@ class MSRailSignalControl : public MSNet::VehicleStateListener { /// @brief all rail edges that are part of a known route std::set myUsedEdges; - /// @brief map of driveways that must perform additional checks if the key edge is used by a train route - std::map > > myProtectedDriveways; + struct WaitRelation { + WaitRelation(const MSRailSignal* _railSignal = nullptr, const SUMOVehicle* _foe = nullptr, MSRailSignalConstraint* _constraint = nullptr) : + railSignal(_railSignal), foe(_foe), constraint(_constraint) {} + // indices along route + const MSRailSignal* railSignal; + const SUMOVehicle* foe; + MSRailSignalConstraint* constraint; + }; + std::map myWaitRelations; + + mutable std::set > myWrittenDeadlocks; + + std::map > myDeadlockChecks; + std::map> myDriveWaySucc; + std::map> myDriveWayPred; /// @brief list of all rail signals std::vector mySignals; @@ -96,6 +130,7 @@ class MSRailSignalControl : public MSNet::VehicleStateListener { /// @brief list of signals that switched green along with driveway index std::vector > mySwitchedGreenFlanks; std::map, bool> myDriveWayCompatibility; + std::set myActiveSignals; static MSRailSignalControl* myInstance; diff --git a/src/microsim/traffic_lights/MSTLLogicControl.cpp b/src/microsim/traffic_lights/MSTLLogicControl.cpp index a2eb7bbbe305..975dc771ba3f 100644 --- a/src/microsim/traffic_lights/MSTLLogicControl.cpp +++ b/src/microsim/traffic_lights/MSTLLogicControl.cpp @@ -34,6 +34,7 @@ #include "MSTLLogicControl.h" #include "MSOffTrafficLightLogic.h" #include "MSRailSignalConstraint.h" +#include "MSDriveWay.h" #include #include #include @@ -836,6 +837,7 @@ MSTLLogicControl::saveState(OutputDevice& out) { for (const auto& logic : myLogics) { logic.second->saveState(out); } + MSDriveWay::saveState(out); } diff --git a/src/microsim/traffic_lights/MSTrafficLightLogic.h b/src/microsim/traffic_lights/MSTrafficLightLogic.h index df1b8159b315..0facafa89431 100644 --- a/src/microsim/traffic_lights/MSTrafficLightLogic.h +++ b/src/microsim/traffic_lights/MSTrafficLightLogic.h @@ -42,6 +42,7 @@ class MSLink; class MSTLLogicControl; class MSDetectorFileOutput; class NLDetectorBuilder; +class MSDriveWay; // =========================================================================== @@ -411,6 +412,18 @@ class MSTrafficLightLogic : public Named, public Parameterised { return VehicleVector(); } + /// @brief return vehicles that approach the intersection/rail signal and have priority over vehicles that wish to pass the given linkIndex + virtual std::vector getBlockingDriveWays(int linkIndex) { + UNUSED_PARAMETER(linkIndex); + return std::vector(); + } + + /// @brief return vehicles that approach the intersection/rail signal and have priority over vehicles that wish to pass the given linkIndex + virtual std::string getRequestedDriveWay(int linkIndex) { + UNUSED_PARAMETER(linkIndex); + return ""; + } + /** @brief Saves the current tls states into the given stream */ virtual void saveState(OutputDevice& /*out*/) const {}; diff --git a/src/microsim/transportables/MSPModel_JuPedSim.cpp b/src/microsim/transportables/MSPModel_JuPedSim.cpp index 9d16e5bd2df2..91dfecdbcbc4 100644 --- a/src/microsim/transportables/MSPModel_JuPedSim.cpp +++ b/src/microsim/transportables/MSPModel_JuPedSim.cpp @@ -1081,6 +1081,7 @@ MSPModel_JuPedSim::dumpGeometry(const GEOSGeometry* polygon, const std::string& std::ofstream dumpFile; dumpFile.open(filename); GEOSWKTWriter* writer = GEOSWKTWriter_create(); + GEOSWKTWriter_setRoundingPrecision(writer, gPrecisionGeo); char* wkt = GEOSWKTWriter_write(writer, polygonGeoCoordinates == nullptr ? polygon : polygonGeoCoordinates); dumpFile << wkt << std::endl; dumpFile.close(); diff --git a/src/microsim/transportables/MSPModel_Striping.cpp b/src/microsim/transportables/MSPModel_Striping.cpp index c13971b3eb19..bf6813305ff2 100644 --- a/src/microsim/transportables/MSPModel_Striping.cpp +++ b/src/microsim/transportables/MSPModel_Striping.cpp @@ -89,6 +89,7 @@ int MSPModel_Striping::myWalkingAreaDetail; SUMOTime MSPModel_Striping::jamTime; SUMOTime MSPModel_Striping::jamTimeCrossing; SUMOTime MSPModel_Striping::jamTimeNarrow; +double MSPModel_Striping::jamFactor; bool MSPModel_Striping::myLegacyPosLat; const double MSPModel_Striping::LOOKAHEAD_SAMEDIR(4.0); // seconds const double MSPModel_Striping::LOOKAHEAD_ONCOMING(10.0); // seconds @@ -141,6 +142,7 @@ MSPModel_Striping::MSPModel_Striping(const OptionsCont& oc, MSNet* net) { if (jamTimeNarrow <= 0) { jamTimeNarrow = SUMOTime_MAX; } + jamFactor = oc.getFloat("pedestrian.striping.jamfactor"); myLegacyPosLat = oc.getBool("pedestrian.striping.legacy-departposlat"); } @@ -2039,7 +2041,7 @@ MSPModel_Striping::PState::walk(const Obstacles& obs, SUMOTime currentTime) { myPerson->getID(), myStage->getEdge()->getID(), time2string(SIMSTEP)); myAmJammed = true; } - xSpeed = vMax / 4; + xSpeed = vMax * jamFactor; } } else if (myAmJammed && stripe(myPosLat) >= 0 && stripe(myPosLat) <= sMax && xDist >= MIN_STARTUP_DIST) { myAmJammed = false; diff --git a/src/microsim/transportables/MSPModel_Striping.h b/src/microsim/transportables/MSPModel_Striping.h index 036294c90338..4f86140e551f 100644 --- a/src/microsim/transportables/MSPModel_Striping.h +++ b/src/microsim/transportables/MSPModel_Striping.h @@ -105,6 +105,8 @@ class MSPModel_Striping : public MSPModel_Interacting { static SUMOTime jamTime; static SUMOTime jamTimeCrossing; static SUMOTime jamTimeNarrow; + /// @brief the factor on speed when jammed + static double jamFactor; /// @brief use old style departPosLat interpretation static bool myLegacyPosLat; diff --git a/src/microsim/transportables/MSTransportable.h b/src/microsim/transportables/MSTransportable.h index c1e7fd9265ef..79006d8aa10e 100644 --- a/src/microsim/transportables/MSTransportable.h +++ b/src/microsim/transportables/MSTransportable.h @@ -187,6 +187,10 @@ class MSTransportable : public SUMOTrafficObject { return (*myStep)->getLane(); } + const MSLane* getBackLane() const { + return getLane(); + } + /// @brief Returns the departure edge const MSEdge* getFromEdge() const { return (*myStep)->getFromEdge(); diff --git a/src/netedit/GNEViewNet.cpp b/src/netedit/GNEViewNet.cpp index 05fcdb86df9d..dbaa831c4a8a 100644 --- a/src/netedit/GNEViewNet.cpp +++ b/src/netedit/GNEViewNet.cpp @@ -1653,7 +1653,7 @@ GNEViewNet::abortOperation(bool clearSelection) { } } else if (myEditModes.isCurrentSupermodeData()) { // abort operation depending of current mode - if (myEditModes.demandEditMode == DemandEditMode::DEMAND_SELECT) { + if (myEditModes.dataEditMode == DataEditMode::DATA_SELECT) { mySelectingArea.selectingUsingRectangle = false; // check if current selection has to be cleaned if (clearSelection) { diff --git a/src/netedit/GNEViewNetHelper.cpp b/src/netedit/GNEViewNetHelper.cpp index 8b6b98b13de9..ed3391fb70f8 100644 --- a/src/netedit/GNEViewNetHelper.cpp +++ b/src/netedit/GNEViewNetHelper.cpp @@ -2182,6 +2182,10 @@ GNEViewNetHelper::EditModes::setSupermode(Supermode supermode, const bool force) // compute all demand elements myViewNet->myNet->computeDemandElements(myViewNet->myViewParent->getGNEAppWindows()); } + // reset TAZ contours (due filling) + for (const auto &TAZ : myViewNet->getNet()->getAttributeCarriers()->getAdditionals().at(SUMO_TAG_TAZ)) { + TAZ.second->resetAdditionalContour(); + } } // update buttons networkButton->update(); diff --git a/src/netedit/changes/GNEChange_ToggleAttribute.cpp b/src/netedit/changes/GNEChange_ToggleAttribute.cpp index 695e7394d106..b255afb4c917 100644 --- a/src/netedit/changes/GNEChange_ToggleAttribute.cpp +++ b/src/netedit/changes/GNEChange_ToggleAttribute.cpp @@ -42,16 +42,6 @@ GNEChange_ToggleAttribute::GNEChange_ToggleAttribute(GNEAttributeCarrier* ac, co } -GNEChange_ToggleAttribute::GNEChange_ToggleAttribute(GNEAttributeCarrier* ac, const SumoXMLAttr key, const bool value, const int /* previousParameters */) : - GNEChange(ac->getTagProperty().getSupermode(), true, false), - myAC(ac), - myKey(key), - myOrigValue(ac->isAttributeEnabled(key)), - myNewValue(value) { - myAC->incRef("GNEChange_ToggleAttribute " + myAC->getTagProperty().getTagStr()); -} - - GNEChange_ToggleAttribute::~GNEChange_ToggleAttribute() { // decrease reference myAC->decRef("GNEChange_ToggleAttribute " + myAC->getTagProperty().getTagStr()); diff --git a/src/netedit/changes/GNEChange_ToggleAttribute.h b/src/netedit/changes/GNEChange_ToggleAttribute.h index 4c7f8ba0e94e..1d139843abb9 100644 --- a/src/netedit/changes/GNEChange_ToggleAttribute.h +++ b/src/netedit/changes/GNEChange_ToggleAttribute.h @@ -40,14 +40,6 @@ class GNEChange_ToggleAttribute : public GNEChange { */ GNEChange_ToggleAttribute(GNEAttributeCarrier* ac, const SumoXMLAttr key, const bool value); - /**@brief constructor - * @param[in] ac The attribute-carrier to be modified - * @param[in] key The attribute key - * @param[in] value The new value - * @param[in] previousParameters previous values (used by flows) - */ - GNEChange_ToggleAttribute(GNEAttributeCarrier* ac, const SumoXMLAttr key, const bool value, const int previousParameters); - /// @brief Destructor ~GNEChange_ToggleAttribute(); diff --git a/src/netedit/elements/GNEContour.cpp b/src/netedit/elements/GNEContour.cpp index 23a9e82cfe26..f9728ac2ba88 100644 --- a/src/netedit/elements/GNEContour.cpp +++ b/src/netedit/elements/GNEContour.cpp @@ -73,69 +73,70 @@ GNEContour::clearContour() const { void GNEContour::calculateContourClosedShape(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const GUIGlObject* glObject, const PositionVector& shape, const double scale) const { + const GUIGlObject* glObject, const PositionVector& shape, const double layer, + const double scale) const { // check if we're in drawForObjectUnderCursor if (s.drawForViewObjectsHandler) { // calculate closed shape contour buildContourClosedShape(s, d, shape, scale); // check if position or bondary is within closed shape - gViewObjectsHandler.checkShapeElement(glObject, *myCalculatedShape, *myContourBoundary); + gViewObjectsHandler.checkShapeElement(glObject, *myCalculatedShape, *myContourBoundary, layer); } } void GNEContour::calculateContourExtrudedShape(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const GUIGlObject* glObject, const PositionVector& shape, const double extrusionWidth, - const double scale, const bool closeFirstExtrem, const bool closeLastExtrem, - const double offset) const { + const GUIGlObject* glObject, const PositionVector& shape, const double layer, const double extrusionWidth, + const double scale, const bool closeFirstExtrem, const bool closeLastExtrem, const double offset) const { // check if we're in drawForObjectUnderCursor if (s.drawForViewObjectsHandler) { // calculate extruded shape buildContourExtrudedShape(s, d, shape, extrusionWidth, scale, closeFirstExtrem, closeLastExtrem, offset); // check if position or bondary is within extruded shape - gViewObjectsHandler.checkShapeElement(glObject, *myCalculatedShape, *myContourBoundary); + gViewObjectsHandler.checkShapeElement(glObject, *myCalculatedShape, *myContourBoundary, layer); } } void GNEContour::calculateContourRectangleShape(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const GUIGlObject* glObject, const Position& pos, const double width, const double height, + const GUIGlObject* glObject, const Position& pos, const double width, const double height, const double layer, const double offsetX, const double offsetY, const double rot, const double scale) const { // check if we're in drawForObjectUnderCursor if (s.drawForViewObjectsHandler) { // calculate rectangle shape buildContourRectangle(s, d, pos, width, height, offsetX, offsetY, rot, scale); // check if position or bondary is within rectangle shape - gViewObjectsHandler.checkShapeElement(glObject, *myCalculatedShape, *myContourBoundary); + gViewObjectsHandler.checkShapeElement(glObject, *myCalculatedShape, *myContourBoundary, layer); } } void GNEContour::calculateContourCircleShape(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const GUIGlObject* glObject, const Position& pos, double radius, const double scale) const { + const GUIGlObject* glObject, const Position& pos, double radius, const double layer, + const double scale) const { // check if we're in drawForObjectUnderCursor if (s.drawForViewObjectsHandler) { // calculate circle shape buildContourCircle(s, d, pos, radius, scale); // check if position or bondary is within circle shape - gViewObjectsHandler.checkCircleElement(d, glObject, pos, (radius * scale), *myContourBoundary); + gViewObjectsHandler.checkCircleElement(d, glObject, pos, (radius * scale), *myContourBoundary, layer); } } void GNEContour::calculateContourEdge(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const GNEEdge* edge, const GUIGlObject* elementToRegister, const bool closeFirstExtrem, - const bool closeLastExtrem) const { + const GNEEdge* edge, const GUIGlObject* elementToRegister, const double layer, + const bool closeFirstExtrem, const bool closeLastExtrem) const { // check if mouse is within two lines (only in rectangle selection mode) if (s.drawForViewObjectsHandler) { // calculate contour edge shape buildContourEdge(s, d, edge, closeFirstExtrem, closeLastExtrem); // check if position or bondary is within contour shape - gViewObjectsHandler.checkShapeElement(elementToRegister, *myCalculatedShape, *myContourBoundary); + gViewObjectsHandler.checkShapeElement(elementToRegister, *myCalculatedShape, *myContourBoundary, layer); } } @@ -150,57 +151,54 @@ GNEContour::calculateContourEdges(const GUIVisualizationSettings& s, const GUIVi void GNEContour::calculateContourFirstGeometryPoint(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const GUIGlObject* glObject, const PositionVector& shape, double radius, - const double scale) const { + const GUIGlObject* glObject, const PositionVector& shape, const double layer, double radius, const double scale) const { // check if we're in drawForObjectUnderCursor if (s.drawForViewObjectsHandler && (shape.size() > 0)) { // check position within geometry of first geometry point - gViewObjectsHandler.checkGeometryPoint(d, glObject, shape, 0, (radius * scale)); + gViewObjectsHandler.checkGeometryPoint(d, glObject, shape, 0, layer, (radius * scale)); } } void GNEContour::calculateContourLastGeometryPoint(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const GUIGlObject* glObject, const PositionVector& shape, double radius, - const double scale) const { + const GUIGlObject* glObject, const PositionVector& shape, const double layer, double radius, const double scale) const { // check if we're in drawForObjectUnderCursor if (s.drawForViewObjectsHandler && (shape.size() > 0)) { // check position within geometry of last geometry point - gViewObjectsHandler.checkGeometryPoint(d, glObject, shape, (int)shape.size() - 1, (radius * scale)); + gViewObjectsHandler.checkGeometryPoint(d, glObject, shape, (int)shape.size() - 1, layer, (radius * scale)); } } void GNEContour::calculateContourMiddleGeometryPoints(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const GUIGlObject* glObject, const PositionVector& shape, double radius, - const double scale) const { + const GUIGlObject* glObject, const PositionVector& shape, const double layer, double radius, const double scale) const { // check if we're in drawForObjectUnderCursor if (s.drawForViewObjectsHandler) { // check position within geometry of middle geometry points for (int i = 1; i < (int)shape.size() - 1; i++) { - gViewObjectsHandler.checkGeometryPoint(d, glObject, shape, i, (radius * scale)); + gViewObjectsHandler.checkGeometryPoint(d, glObject, shape, i, layer, (radius * scale)); } // also calculate position over shape - gViewObjectsHandler.checkPositionOverShape(d, glObject, shape, (radius * scale)); + gViewObjectsHandler.checkPositionOverShape(d, glObject, shape, layer, (radius * scale)); } } void GNEContour::calculateContourAllGeometryPoints(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const GUIGlObject* glObject, const PositionVector& shape, double radius, - const double scale, const bool calculatePosOverShape) const { + const GUIGlObject* glObject, const PositionVector& shape, const double layer, double radius, const double scale, + const bool calculatePosOverShape) const { // check if we're in drawForObjectUnderCursor if (s.drawForViewObjectsHandler) { // check position within geometry of middle geometry points for (int i = 0; i < (int)shape.size(); i++) { - gViewObjectsHandler.checkGeometryPoint(d, glObject, shape, i, (radius * scale)); + gViewObjectsHandler.checkGeometryPoint(d, glObject, shape, i, layer, (radius * scale)); } // check if calculate position over shape if (calculatePosOverShape) { - gViewObjectsHandler.checkPositionOverShape(d, glObject, shape, (radius * scale)); + gViewObjectsHandler.checkPositionOverShape(d, glObject, shape, layer, (radius * scale)); } } } @@ -208,8 +206,7 @@ GNEContour::calculateContourAllGeometryPoints(const GUIVisualizationSettings& s, void GNEContour::calculateContourEdgeGeometryPoints(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const GNEEdge* edge, const double radius, const bool calculatePosOverShape, - const bool firstExtrem, const bool lastExtrem) const { + const GNEEdge* edge, const double radius, const bool calculatePosOverShape, const bool firstExtrem, const bool lastExtrem) const { // first check if we're in drawForObjectUnderCursor if (s.drawForViewObjectsHandler && (gViewObjectsHandler.getSelectionPosition() != Position::INVALID)) { // get edge geometry @@ -226,35 +223,35 @@ GNEContour::calculateContourEdgeGeometryPoints(const GUIVisualizationSettings& s // check position within geometry of middle geometry points for (int i = 1; i < lastGeometryPointIndex; i++) { if (edgeGeometry[i].distanceSquaredTo(nearestPos) <= squaredRadius) { - gViewObjectsHandler.checkGeometryPoint(d, edge, edgeGeometry, i, radius); + gViewObjectsHandler.checkGeometryPoint(d, edge, edgeGeometry, i, edge->getType(), radius); } } // check extrems if (firstExtrem) { if (edgeGeometry[0].distanceSquaredTo(nearestPos) <= squaredRadius) { - gViewObjectsHandler.checkGeometryPoint(d, edge, edgeGeometry, 0, radius); + gViewObjectsHandler.checkGeometryPoint(d, edge, edgeGeometry, 0, edge->getType(), radius); } } if (lastExtrem) { if (edgeGeometry[lastGeometryPointIndex].distanceSquaredTo(nearestPos) <= squaredRadius) { - gViewObjectsHandler.checkGeometryPoint(d, edge, edgeGeometry, lastGeometryPointIndex, radius); + gViewObjectsHandler.checkGeometryPoint(d, edge, edgeGeometry, lastGeometryPointIndex, edge->getType(), radius); } } // if list of index is emprt, use nearestPos as pos over shape if (calculatePosOverShape && gViewObjectsHandler.getGeometryPoints(edge).empty()) { - gViewObjectsHandler.addPositionOverShape(edge, nearestPos, nearestOffset); + gViewObjectsHandler.addPositionOverShape(edge, nearestPos, edge->getType(), nearestOffset); } } else { // check position within geometry of middle geometry points for (int i = 1; i < lastGeometryPointIndex; i++) { - gViewObjectsHandler.checkGeometryPoint(d, edge, edgeGeometry, i, radius); + gViewObjectsHandler.checkGeometryPoint(d, edge, edgeGeometry, i, edge->getType(), radius); } // check extrems if (firstExtrem) { - gViewObjectsHandler.checkGeometryPoint(d, edge, edgeGeometry, 0, radius); + gViewObjectsHandler.checkGeometryPoint(d, edge, edgeGeometry, 0, edge->getType(), radius); } if (lastExtrem) { - gViewObjectsHandler.checkGeometryPoint(d, edge, edgeGeometry, lastGeometryPointIndex, radius); + gViewObjectsHandler.checkGeometryPoint(d, edge, edgeGeometry, lastGeometryPointIndex, edge->getType(), radius); } } } diff --git a/src/netedit/elements/GNEContour.h b/src/netedit/elements/GNEContour.h index c7914401eca2..0d6ed152a0cd 100644 --- a/src/netedit/elements/GNEContour.h +++ b/src/netedit/elements/GNEContour.h @@ -54,27 +54,30 @@ class GNEContour { /// @brief calculate contour (for closed shapes) void calculateContourClosedShape(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const GUIGlObject* glObject, const PositionVector& shape, const double scale) const; + const GUIGlObject* glObject, const PositionVector& shape, const double layer, + const double scale) const; /// @brief calculate contour extruded (used in elements formed by a central shape) void calculateContourExtrudedShape(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const GUIGlObject* glObject, const PositionVector& shape, const double extrusionWidth, - const double scale, const bool closeFirstExtrem, const bool closeLastExtrem, - const double offset) const; + const GUIGlObject* glObject, const PositionVector& shape, const double layer, + const double extrusionWidth, const double scale, const bool closeFirstExtrem, + const bool closeLastExtrem, const double offset) const; /// @brief calculate contour (for rectangled elements) void calculateContourRectangleShape(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, const GUIGlObject* glObject, const Position& pos, const double width, const double height, - const double offsetX, const double offsetY, const double rot, const double scale) const; + const double layer, const double offsetX, const double offsetY, const double rot, + const double scale) const; /// @brief calculate contour (circle elements) void calculateContourCircleShape(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const GUIGlObject* glObject, const Position& pos, double radius, const double scale) const; + const GUIGlObject* glObject, const Position& pos, double radius, const double layer, + const double scale) const; /// @brief calculate contour edge void calculateContourEdge(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const GNEEdge* edge, const GUIGlObject* elementToRegister, const bool closeFirstExtrem, - const bool closeLastExtrem) const; + const GNEEdge* edge, const GUIGlObject* elementToRegister, const double layer, + const bool closeFirstExtrem, const bool closeLastExtrem) const; /// @brief calculate contour between two consecutive edges void calculateContourEdges(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, @@ -82,23 +85,23 @@ class GNEContour { /// @brief calculate contour for first geometry point void calculateContourFirstGeometryPoint(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const GUIGlObject* glObject, const PositionVector& shape, const double radius, - const double scale) const; + const GUIGlObject* glObject, const PositionVector& shape, const double layer, + const double radius, const double scale) const; /// @brief calculate contour for last geometry point void calculateContourLastGeometryPoint(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const GUIGlObject* glObject, const PositionVector& shape, const double radius, - const double scale) const; + const GUIGlObject* glObject, const PositionVector& shape, const double layer, + const double radius, const double scale) const; /// @brief calculate contour for middle geometry point void calculateContourMiddleGeometryPoints(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const GUIGlObject* glObject, const PositionVector& shape, const double radius, - const double scale) const; + const GUIGlObject* glObject, const PositionVector& shape, const double layer, + const double radius, const double scale) const; /// @brief calculate contour for all geometry points void calculateContourAllGeometryPoints(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const GUIGlObject* glObject, const PositionVector& shape, const double radius, - const double scale, const bool calculatePosOverShape) const; + const GUIGlObject* glObject, const PositionVector& shape, const double layer, + const double radius, const double scale, const bool calculatePosOverShape) const; /// @brief calculate contour for edge geometry points void calculateContourEdgeGeometryPoints(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, diff --git a/src/netedit/elements/additional/GNEAccess.cpp b/src/netedit/elements/additional/GNEAccess.cpp index 4109bb63377e..37d2f9eb4d9b 100644 --- a/src/netedit/elements/additional/GNEAccess.cpp +++ b/src/netedit/elements/additional/GNEAccess.cpp @@ -256,7 +256,7 @@ GNEAccess::drawGL(const GUIVisualizationSettings& s) const { myAdditionalContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidthSmall, true); } // calculate contour - myAdditionalContour.calculateContourCircleShape(s, d, this, myAdditionalGeometry.getShape().front(), 1, accessExaggeration); + myAdditionalContour.calculateContourCircleShape(s, d, this, myAdditionalGeometry.getShape().front(), 1, getType(), accessExaggeration); } } diff --git a/src/netedit/elements/additional/GNEAdditional.cpp b/src/netedit/elements/additional/GNEAdditional.cpp index 970ddcb97249..01a22dc599ec 100644 --- a/src/netedit/elements/additional/GNEAdditional.cpp +++ b/src/netedit/elements/additional/GNEAdditional.cpp @@ -116,6 +116,12 @@ GNEAdditional::setSpecialColor(const RGBColor* color) { } +void +GNEAdditional::resetAdditionalContour() { + myAdditionalContour.clearContour(); +} + + bool GNEAdditional::isAdditionalValid() const { return true; @@ -220,13 +226,8 @@ GNEAdditional::checkDrawFromContour() const { } else if (modes.isCurrentSupermodeData()) { // get TAZRelDataFrame const auto& TAZRelDataFrame = viewParent->getTAZRelDataFrame(); - if (TAZRelDataFrame->shown()) { - // check first TAZ - if (TAZRelDataFrame->getFirstTAZ() == nullptr) { - return gViewObjectsHandler.isElementSelected(this); - } else if (TAZRelDataFrame->getFirstTAZ() == this) { - return true; - } + if (TAZRelDataFrame->shown() && (TAZRelDataFrame->getFirstTAZ() == this)) { + return true; } } // nothing to draw @@ -284,13 +285,8 @@ GNEAdditional::checkDrawToContour() const { } else if (modes.isCurrentSupermodeData()) { // get TAZRelDataFrame const auto& TAZRelDataFrame = viewParent->getTAZRelDataFrame(); - if (TAZRelDataFrame->shown()) { - // check first TAZ - if (TAZRelDataFrame->getFirstTAZ() == nullptr) { - return gViewObjectsHandler.isElementSelected(this); - } else if (TAZRelDataFrame->getFirstTAZ() == this) { - return true; - } + if (TAZRelDataFrame->shown() && (TAZRelDataFrame->getSecondTAZ() == this)) { + return true; } } // nothing to draw @@ -306,37 +302,54 @@ GNEAdditional::checkDrawRelatedContour() const { bool GNEAdditional::checkDrawOverContour() const { - // get modes and viewParent (for code legibility) const auto& modes = myNet->getViewNet()->getEditModes(); - const auto& viewParent = myNet->getViewNet()->getViewParent(); - if (modes.isCurrentSupermodeDemand()) { - // get current plan selector - GNEPlanSelector* planSelector = nullptr; - if (modes.demandEditMode == DemandEditMode::DEMAND_PERSON) { - planSelector = viewParent->getPersonFrame()->getPlanSelector(); - } else if (modes.demandEditMode == DemandEditMode::DEMAND_PERSONPLAN) { - planSelector = viewParent->getPersonPlanFrame()->getPlanSelector(); - } else if (modes.demandEditMode == DemandEditMode::DEMAND_CONTAINER) { - planSelector = viewParent->getContainerFrame()->getPlanSelector(); - } else if (modes.demandEditMode == DemandEditMode::DEMAND_CONTAINERPLAN) { - planSelector = viewParent->getContainerPlanFrame()->getPlanSelector(); - } - // continue depending of plan selector - if (planSelector) { - if ((myTagProperty.isStoppingPlace() && planSelector->markStoppingPlaces()) || - (myTagProperty.isTAZElement() && planSelector->markTAZs())) { - return myNet->getViewNet()->getViewObjectsSelector().getGUIGlObjectFront() == this; + if (myNet->getViewNet()->getViewObjectsSelector().getGUIGlObjectFront() != this) { + return false; + } else { + const auto& viewParent = myNet->getViewNet()->getViewParent(); + if (modes.isCurrentSupermodeDemand()) { + // get current plan selector + GNEPlanSelector* planSelector = nullptr; + if (modes.demandEditMode == DemandEditMode::DEMAND_PERSON) { + planSelector = viewParent->getPersonFrame()->getPlanSelector(); + } else if (modes.demandEditMode == DemandEditMode::DEMAND_PERSONPLAN) { + planSelector = viewParent->getPersonPlanFrame()->getPlanSelector(); + } else if (modes.demandEditMode == DemandEditMode::DEMAND_CONTAINER) { + planSelector = viewParent->getContainerFrame()->getPlanSelector(); + } else if (modes.demandEditMode == DemandEditMode::DEMAND_CONTAINERPLAN) { + planSelector = viewParent->getContainerPlanFrame()->getPlanSelector(); } - } else if (modes.demandEditMode == DemandEditMode::DEMAND_VEHICLE) { - // get current vehicle template - const auto& vehicleTemplate = viewParent->getVehicleFrame()->getVehicleTagSelector()->getCurrentTemplateAC(); - // check if vehicle can be placed over from-to TAZs - if (vehicleTemplate && vehicleTemplate->getTagProperty().vehicleTAZs()) { - return myNet->getViewNet()->getViewObjectsSelector().getGUIGlObjectFront() == this; + // continue depending of plan selector + if (planSelector) { + if ((myTagProperty.isStoppingPlace() && planSelector->markStoppingPlaces()) || + (myTagProperty.isTAZElement() && planSelector->markTAZs())) { + return true; + } + } else if (modes.demandEditMode == DemandEditMode::DEMAND_VEHICLE) { + // get current vehicle template + const auto& vehicleTemplate = viewParent->getVehicleFrame()->getVehicleTagSelector()->getCurrentTemplateAC(); + // check if vehicle can be placed over from-to TAZs + if (vehicleTemplate && vehicleTemplate->getTagProperty().vehicleTAZs()) { + return true; + } + } + } else if (modes.isCurrentSupermodeData()) { + // get TAZRelDataFrame + const auto& TAZRelDataFrame = viewParent->getTAZRelDataFrame(); + if (TAZRelDataFrame->shown()) { + if (TAZRelDataFrame->getFirstTAZ() && TAZRelDataFrame->getSecondTAZ()) { + return false; + } else if (TAZRelDataFrame->getFirstTAZ() == this) { + return false; + } else if (TAZRelDataFrame->getSecondTAZ() == this) { + return false; + } else { + return true; + } } } + return false; } - return false; } @@ -743,7 +756,7 @@ GNEAdditional::drawSquaredAdditional(const GUIVisualizationSettings& s, const Po myAdditionalContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // calculate contour - myAdditionalContour.calculateContourRectangleShape(s, d, this, pos, size, size, 0, 0, 0, exaggeration); + myAdditionalContour.calculateContourRectangleShape(s, d, this, pos, size, size, getType(), 0, 0, 0, exaggeration); } @@ -843,7 +856,7 @@ GNEAdditional::drawListedAdditional(const GUIVisualizationSettings& s, const Pos myAdditionalContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // calculate contour - myAdditionalContour.calculateContourRectangleShape(s, d, this, signPosition, 0.56, 2.75, 0, -2.3, 0, 1); + myAdditionalContour.calculateContourRectangleShape(s, d, this, signPosition, 0.56, 2.75, getType(), 0, -2.3, 0, 1); } } @@ -1015,13 +1028,13 @@ GNEAdditional::getJuPedSimIcon(SumoXMLTag tag) { void GNEAdditional::calculateContourPolygons(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const double exaggeration, const bool filledShape) const { + const double layer, const double exaggeration, const bool filledShape) const { // calculate contour depending of contoured shape if (filledShape) { - myAdditionalContour.calculateContourClosedShape(s, d, this, myAdditionalGeometry.getShape(), 1); + myAdditionalContour.calculateContourClosedShape(s, d, this, myAdditionalGeometry.getShape(), layer, 1); } else { - myAdditionalContour.calculateContourExtrudedShape(s, d, this, myAdditionalGeometry.getShape(), s.neteditSizeSettings.polylineWidth, - exaggeration, true, true, 0); + myAdditionalContour.calculateContourExtrudedShape(s, d, this, myAdditionalGeometry.getShape(), layer, + s.neteditSizeSettings.polylineWidth, exaggeration, true, true, 0); } // get edit modes const auto& editModes = myNet->getViewNet()->getEditModes(); @@ -1032,7 +1045,7 @@ GNEAdditional::calculateContourPolygons(const GUIVisualizationSettings& s, const // get geometry point radius (size depends if we're in move mode) const double geometryPointRaidus = s.neteditSizeSettings.polygonGeometryPointRadius * (moveMode ? 1 : 0.5); // calculate contour geometry points - myAdditionalContour.calculateContourAllGeometryPoints(s, d, this, myAdditionalGeometry.getShape(), geometryPointRaidus, exaggeration, moveMode); + myAdditionalContour.calculateContourAllGeometryPoints(s, d, this, myAdditionalGeometry.getShape(), layer, geometryPointRaidus, exaggeration, moveMode); } } diff --git a/src/netedit/elements/additional/GNEAdditional.h b/src/netedit/elements/additional/GNEAdditional.h index 491b832f109d..5c17af7eb59d 100644 --- a/src/netedit/elements/additional/GNEAdditional.h +++ b/src/netedit/elements/additional/GNEAdditional.h @@ -118,6 +118,9 @@ class GNEAdditional : public GNEPathManager::PathElement, public GNEHierarchical /// @brief set special color void setSpecialColor(const RGBColor* color); + /// @brief reset additional contour + void resetAdditionalContour(); + /// @name members and functions relative to write additionals into XML /// @{ @@ -459,7 +462,7 @@ class GNEAdditional : public GNEPathManager::PathElement, public GNEHierarchical /// @brief calculate contour for polygons void calculateContourPolygons(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const double exaggeration, const bool filledShape) const; + const double layer, const double exaggeration, const bool filledShape) const; /// @} diff --git a/src/netedit/elements/additional/GNECalibrator.cpp b/src/netedit/elements/additional/GNECalibrator.cpp index eb413a809627..da7109e018a4 100644 --- a/src/netedit/elements/additional/GNECalibrator.cpp +++ b/src/netedit/elements/additional/GNECalibrator.cpp @@ -526,10 +526,10 @@ GNECalibrator::drawCalibratorSymbol(const GUIVisualizationSettings& s, const GUI // calculate dotted contour if (symbolIndex == -1) { myAdditionalContour.calculateContourRectangleShape(s, d, this, pos, s.additionalSettings.calibratorWidth, - s.additionalSettings.calibratorHeight * 0.5, 0, s.additionalSettings.calibratorHeight * 0.5, rot, exaggeration); + s.additionalSettings.calibratorHeight * 0.5, getType(), 0, s.additionalSettings.calibratorHeight * 0.5, rot, exaggeration); } else if (symbolIndex < (int)myCalibratorContours->size()) { myCalibratorContours->at(symbolIndex)->calculateContourRectangleShape(s, d, this, pos, s.additionalSettings.calibratorWidth, - s.additionalSettings.calibratorHeight * 0.5, 0, s.additionalSettings.calibratorHeight * 0.5, rot, exaggeration); + s.additionalSettings.calibratorHeight * 0.5, getType(), 0, s.additionalSettings.calibratorHeight * 0.5, rot, exaggeration); } } diff --git a/src/netedit/elements/additional/GNECalibratorFlow.cpp b/src/netedit/elements/additional/GNECalibratorFlow.cpp index 7616ba5f902d..8171d794fad8 100644 --- a/src/netedit/elements/additional/GNECalibratorFlow.cpp +++ b/src/netedit/elements/additional/GNECalibratorFlow.cpp @@ -724,7 +724,7 @@ GNECalibratorFlow::setAttribute(SumoXMLAttr key, const std::string& value) { parseArrivalPosLat(value, myTagProperty.getTagStr(), id, arrivalPosLat, arrivalPosLatProcedure, error); break; case SUMO_ATTR_INSERTIONCHECKS: - parseInsertionChecks(value); + insertionChecks = parseInsertionChecks(value); break; case GNE_ATTR_SELECTED: if (parse(value)) { diff --git a/src/netedit/elements/additional/GNEEntryExitDetector.cpp b/src/netedit/elements/additional/GNEEntryExitDetector.cpp index f73e57166fa0..b72966ffee53 100644 --- a/src/netedit/elements/additional/GNEEntryExitDetector.cpp +++ b/src/netedit/elements/additional/GNEEntryExitDetector.cpp @@ -163,7 +163,7 @@ GNEEntryExitDetector::drawGL(const GUIVisualizationSettings& s) const { myAdditionalContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // calculate contour - myAdditionalContour.calculateContourRectangleShape(s, d, this, myAdditionalGeometry.getShape().front(), 2.7, 1.6, 2, 0, + myAdditionalContour.calculateContourRectangleShape(s, d, this, myAdditionalGeometry.getShape().front(), 2.7, 1.6, getType(), 2, 0, myAdditionalGeometry.getShapeRotations().front(), entryExitExaggeration); } } diff --git a/src/netedit/elements/additional/GNEInductionLoopDetector.cpp b/src/netedit/elements/additional/GNEInductionLoopDetector.cpp index 78599c155596..b94d13743aa9 100644 --- a/src/netedit/elements/additional/GNEInductionLoopDetector.cpp +++ b/src/netedit/elements/additional/GNEInductionLoopDetector.cpp @@ -186,7 +186,7 @@ GNEInductionLoopDetector::drawGL(const GUIVisualizationSettings& s) const { myAdditionalContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // calculate contour rectangle - myAdditionalContour.calculateContourRectangleShape(s, d, this, myAdditionalGeometry.getShape().front(), 2, 1, 0, 0, + myAdditionalContour.calculateContourRectangleShape(s, d, this, myAdditionalGeometry.getShape().front(), 2, 1, getType(), 0, 0, myAdditionalGeometry.getShapeRotations().front(), E1Exaggeration); } } diff --git a/src/netedit/elements/additional/GNEInstantInductionLoopDetector.cpp b/src/netedit/elements/additional/GNEInstantInductionLoopDetector.cpp index 3b7eed3db251..4f61cc71afa0 100644 --- a/src/netedit/elements/additional/GNEInstantInductionLoopDetector.cpp +++ b/src/netedit/elements/additional/GNEInstantInductionLoopDetector.cpp @@ -173,7 +173,7 @@ GNEInstantInductionLoopDetector::drawGL(const GUIVisualizationSettings& s) const myAdditionalContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // draw dotted contour - myAdditionalContour.calculateContourRectangleShape(s, d, this, myAdditionalGeometry.getShape().front(), 2, 1, 0, 0, + myAdditionalContour.calculateContourRectangleShape(s, d, this, myAdditionalGeometry.getShape().front(), 2, 1, getType(), 0, 0, myAdditionalGeometry.getShapeRotations().front(), E1InstantExaggeration); } } diff --git a/src/netedit/elements/additional/GNELaneAreaDetector.cpp b/src/netedit/elements/additional/GNELaneAreaDetector.cpp index bfb0eccfc3fa..4d76844c1477 100644 --- a/src/netedit/elements/additional/GNELaneAreaDetector.cpp +++ b/src/netedit/elements/additional/GNELaneAreaDetector.cpp @@ -283,7 +283,7 @@ GNELaneAreaDetector::drawGL(const GUIVisualizationSettings& s) const { myAdditionalContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // calculate contour and draw dotted geometry - myAdditionalContour.calculateContourExtrudedShape(s, d, this, myAdditionalGeometry.getShape(), s.detectorSettings.E2Width, E2Exaggeration, true, true, 0); + myAdditionalContour.calculateContourExtrudedShape(s, d, this, myAdditionalGeometry.getShape(), getType(), s.detectorSettings.E2Width, E2Exaggeration, true, true, 0); } } @@ -342,7 +342,7 @@ GNELaneAreaDetector::drawLanePartialGL(const GUIVisualizationSettings& s, const myAdditionalContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // calculate contour and draw dotted geometry - myAdditionalContour.calculateContourExtrudedShape(s, d, this, E2Geometry.getShape(), s.detectorSettings.E2Width, E2Exaggeration, + myAdditionalContour.calculateContourExtrudedShape(s, d, this, E2Geometry.getShape(), getType(), s.detectorSettings.E2Width, E2Exaggeration, segment->isFirstSegment(), segment->isLastSegment(), 0); } } @@ -372,7 +372,7 @@ GNELaneAreaDetector::drawJunctionPartialGL(const GUIVisualizationSettings& s, co myAdditionalContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // calculate contour - myAdditionalContour.calculateContourExtrudedShape(s, d, this, E2Geometry.getShape(), s.detectorSettings.E2Width, E2Exaggeration, false, false, 0); + myAdditionalContour.calculateContourExtrudedShape(s, d, this, E2Geometry.getShape(), getType(), s.detectorSettings.E2Width, E2Exaggeration, false, false, 0); } } diff --git a/src/netedit/elements/additional/GNEOverheadWire.cpp b/src/netedit/elements/additional/GNEOverheadWire.cpp index cbe6fd522706..49499a18d843 100644 --- a/src/netedit/elements/additional/GNEOverheadWire.cpp +++ b/src/netedit/elements/additional/GNEOverheadWire.cpp @@ -317,7 +317,7 @@ GNEOverheadWire::drawLanePartialGL(const GUIVisualizationSettings& s, const GNEP // declare trim geometry to draw const auto shape = (segment->isFirstSegment() || segment->isLastSegment()) ? overheadWireGeometry.getShape() : segment->getLane()->getLaneShape(); // calculate contour and draw dotted geometry - myAdditionalContour.calculateContourExtrudedShape(s, d, this, shape, overheadWireWidth, 1, true, true, 0); + myAdditionalContour.calculateContourExtrudedShape(s, d, this, shape, getType(), overheadWireWidth, 1, true, true, 0); } } @@ -369,7 +369,7 @@ GNEOverheadWire::drawJunctionPartialGL(const GUIVisualizationSettings& s, const // get shape const auto& shape = segment->getPreviousLane()->getLane2laneConnections().getLane2laneGeometry(segment->getNextLane()).getShape(); // calculate contour and draw dotted geometry - myAdditionalContour.calculateContourExtrudedShape(s, d, this, shape, overheadWireWidth, 1, true, true, 0); + myAdditionalContour.calculateContourExtrudedShape(s, d, this, shape, getType(), overheadWireWidth, 1, true, true, 0); } } } diff --git a/src/netedit/elements/additional/GNEPOI.cpp b/src/netedit/elements/additional/GNEPOI.cpp index caa96991ce35..8438bc4376f9 100644 --- a/src/netedit/elements/additional/GNEPOI.cpp +++ b/src/netedit/elements/additional/GNEPOI.cpp @@ -627,14 +627,14 @@ GNEPOI::calculatePOIContour(const GUIVisualizationSettings& s, const GUIVisualiz const double exaggeration, const bool movingGeometryPoints) const { // check if we're calculating the contour or the moving geometry points if (movingGeometryPoints) { - myMovingContourUp.calculateContourCircleShape(s, d, this, myShapeHeight.front(), s.neteditSizeSettings.additionalGeometryPointRadius, exaggeration); - myMovingContourDown.calculateContourCircleShape(s, d, this, myShapeHeight.back(), s.neteditSizeSettings.additionalGeometryPointRadius, exaggeration); - myMovingContourLeft.calculateContourCircleShape(s, d, this, myShapeWidth.front(), s.neteditSizeSettings.additionalGeometryPointRadius, exaggeration); - myMovingContourRight.calculateContourCircleShape(s, d, this, myShapeWidth.back(), s.neteditSizeSettings.additionalGeometryPointRadius, exaggeration); + myMovingContourUp.calculateContourCircleShape(s, d, this, myShapeHeight.front(), s.neteditSizeSettings.additionalGeometryPointRadius, getShapeLayer(), exaggeration); + myMovingContourDown.calculateContourCircleShape(s, d, this, myShapeHeight.back(), s.neteditSizeSettings.additionalGeometryPointRadius, getShapeLayer(), exaggeration); + myMovingContourLeft.calculateContourCircleShape(s, d, this, myShapeWidth.front(), s.neteditSizeSettings.additionalGeometryPointRadius, getShapeLayer(), exaggeration); + myMovingContourRight.calculateContourCircleShape(s, d, this, myShapeWidth.back(), s.neteditSizeSettings.additionalGeometryPointRadius, getShapeLayer(), exaggeration); } else if (getShapeImgFile().empty()) { - myAdditionalContour.calculateContourCircleShape(s, d, this, *this, 1.3, exaggeration); + myAdditionalContour.calculateContourCircleShape(s, d, this, *this, 1.3, getShapeLayer(), exaggeration); } else { - myAdditionalContour.calculateContourRectangleShape(s, d, this, *this, getHeight() * 0.5, getWidth() * 0.5, 0, 0, getShapeNaviDegree(), exaggeration); + myAdditionalContour.calculateContourRectangleShape(s, d, this, *this, getHeight() * 0.5, getWidth() * 0.5, getShapeLayer(), 0, 0, getShapeNaviDegree(), exaggeration); } } diff --git a/src/netedit/elements/additional/GNEParkingSpace.cpp b/src/netedit/elements/additional/GNEParkingSpace.cpp index a95f33e98925..85ed9f4a3f06 100644 --- a/src/netedit/elements/additional/GNEParkingSpace.cpp +++ b/src/netedit/elements/additional/GNEParkingSpace.cpp @@ -433,11 +433,11 @@ GNEParkingSpace::calculateSpaceContour(const GUIVisualizationSettings& s, const const double width, const double exaggeration, const bool movingGeometryPoints) const { // check if we're calculating the contour or the moving geometry points if (movingGeometryPoints) { - myMovingContourUp.calculateContourCircleShape(s, d, this, myShapeLength.back(), s.neteditSizeSettings.additionalGeometryPointRadius, exaggeration); - myMovingContourLeft.calculateContourCircleShape(s, d, this, myShapeWidth.front(), s.neteditSizeSettings.additionalGeometryPointRadius, exaggeration); - myMovingContourRight.calculateContourCircleShape(s, d, this, myShapeWidth.back(), s.neteditSizeSettings.additionalGeometryPointRadius, exaggeration); + myMovingContourUp.calculateContourCircleShape(s, d, this, myShapeLength.back(), s.neteditSizeSettings.additionalGeometryPointRadius, getType(), exaggeration); + myMovingContourLeft.calculateContourCircleShape(s, d, this, myShapeWidth.front(), s.neteditSizeSettings.additionalGeometryPointRadius, getType(), exaggeration); + myMovingContourRight.calculateContourCircleShape(s, d, this, myShapeWidth.back(), s.neteditSizeSettings.additionalGeometryPointRadius, getType(), exaggeration); } else { - myAdditionalContour.calculateContourExtrudedShape(s, d, this, myShapeLength, width, exaggeration, true, true, 0); + myAdditionalContour.calculateContourExtrudedShape(s, d, this, myShapeLength, getType(), width, exaggeration, true, true, 0); } } diff --git a/src/netedit/elements/additional/GNEPoly.cpp b/src/netedit/elements/additional/GNEPoly.cpp index 338e8f0371e1..924e448ffd75 100644 --- a/src/netedit/elements/additional/GNEPoly.cpp +++ b/src/netedit/elements/additional/GNEPoly.cpp @@ -341,7 +341,7 @@ GNEPoly::drawGL(const GUIVisualizationSettings& s) const { myAdditionalContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // calculate contour - calculateContourPolygons(s, d, polyExaggeration, getFill()); + calculateContourPolygons(s, d, getShapeLayer(), polyExaggeration, getFill()); } } diff --git a/src/netedit/elements/additional/GNERerouterSymbol.cpp b/src/netedit/elements/additional/GNERerouterSymbol.cpp index 969e09927ac0..3f6ee2cd104b 100644 --- a/src/netedit/elements/additional/GNERerouterSymbol.cpp +++ b/src/netedit/elements/additional/GNERerouterSymbol.cpp @@ -165,7 +165,7 @@ GNERerouterSymbol::drawGL(const GUIVisualizationSettings& s) const { } // calculate contour rectangle shape for (const auto& symbolGeometry : mySymbolGeometries) { - myAdditionalContour.calculateContourRectangleShape(s, d, this, symbolGeometry.getShape().front(), 1, 3, 0, 3, + myAdditionalContour.calculateContourRectangleShape(s, d, this, symbolGeometry.getShape().front(), 1, 3, getType(), 0, 3, symbolGeometry.getShapeRotations().front() + 90, rerouteExaggeration); } } diff --git a/src/netedit/elements/additional/GNERouteProbe.cpp b/src/netedit/elements/additional/GNERouteProbe.cpp index 297572641d6e..d3be8d6e8d5c 100644 --- a/src/netedit/elements/additional/GNERouteProbe.cpp +++ b/src/netedit/elements/additional/GNERouteProbe.cpp @@ -216,8 +216,8 @@ GNERouteProbe::drawGL(const GUIVisualizationSettings& s) const { } // calculate contour and draw dotted geometry myAdditionalContour.calculateContourRectangleShape(s, d, this, myAdditionalGeometry.getShape().front(), s.additionalSettings.routeProbeSize, - s.additionalSettings.routeProbeSize, 0, 0, 0, routeProbeExaggeration); - mySymbolBaseContour.calculateContourExtrudedShape(s, d, this, myAdditionalGeometry.getShape(), 0.3, routeProbeExaggeration, true, true, 0); + s.additionalSettings.routeProbeSize, getType(), 0, 0, 0, routeProbeExaggeration); + mySymbolBaseContour.calculateContourExtrudedShape(s, d, this, myAdditionalGeometry.getShape(), getType(), 0.3, routeProbeExaggeration, true, true, 0); } } diff --git a/src/netedit/elements/additional/GNEStoppingPlace.cpp b/src/netedit/elements/additional/GNEStoppingPlace.cpp index b8907aaa25ae..3cb7dd093f0b 100644 --- a/src/netedit/elements/additional/GNEStoppingPlace.cpp +++ b/src/netedit/elements/additional/GNEStoppingPlace.cpp @@ -359,16 +359,16 @@ GNEStoppingPlace::calculateStoppingPlaceContour(const GUIVisualizationSettings& if (movingGeometryPoints) { if (myStartPosition != INVALID_DOUBLE) { myAdditionalContour.calculateContourFirstGeometryPoint(s, d, this, myAdditionalGeometry.getShape(), - s.neteditSizeSettings.additionalGeometryPointRadius, 1); + getType(), s.neteditSizeSettings.additionalGeometryPointRadius, 1); } if (movingGeometryPoints && (myEndPosition != INVALID_DOUBLE)) { myAdditionalContour.calculateContourLastGeometryPoint(s, d, this, myAdditionalGeometry.getShape(), - s.neteditSizeSettings.additionalGeometryPointRadius, 1); + getType(), s.neteditSizeSettings.additionalGeometryPointRadius, 1); } } else { // don't exaggerate contour - myAdditionalContour.calculateContourExtrudedShape(s, d, this, myAdditionalGeometry.getShape(), width, 1, true, true, 0); - mySymbolContour.calculateContourCircleShape(s, d, this, mySymbolPosition, s.stoppingPlaceSettings.symbolExternalRadius, exaggeration); + myAdditionalContour.calculateContourExtrudedShape(s, d, this, myAdditionalGeometry.getShape(), getType(), width, 1, true, true, 0); + mySymbolContour.calculateContourCircleShape(s, d, this, mySymbolPosition, s.stoppingPlaceSettings.symbolExternalRadius, getType(), exaggeration); } } diff --git a/src/netedit/elements/additional/GNETAZ.cpp b/src/netedit/elements/additional/GNETAZ.cpp index 83e1d975ef33..d3c4584e8313 100644 --- a/src/netedit/elements/additional/GNETAZ.cpp +++ b/src/netedit/elements/additional/GNETAZ.cpp @@ -411,9 +411,13 @@ GNETAZ::drawGL(const GUIVisualizationSettings& s) const { // draw demand element children drawDemandElementChildren(s); // calculate contour - calculateContourPolygons(s, d, TAZExaggeration, getFill()); + if (myNet->getViewNet()->getEditModes().isCurrentSupermodeData()) { + calculateContourPolygons(s, d, getShapeLayer(), TAZExaggeration, true); + } else { + calculateContourPolygons(s, d, getShapeLayer(), TAZExaggeration, getFill()); + } // calculate contour for TAZ Center - myTAZCenterContour.calculateContourCircleShape(s, d, this, myTAZCenter, s.neteditSizeSettings.polygonGeometryPointRadius, TAZExaggeration); + myTAZCenterContour.calculateContourCircleShape(s, d, this, myTAZCenter, s.neteditSizeSettings.polygonGeometryPointRadius, getShapeLayer(), TAZExaggeration); } } @@ -711,7 +715,7 @@ GNETAZ::setAttribute(SumoXMLAttr key, const std::string& value) { break; case SUMO_ATTR_FILL: myFill = parse(value); - myAdditionalContour.clearContour(); + resetAdditionalContour(); break; case SUMO_ATTR_EDGES: break; diff --git a/src/netedit/elements/additional/GNEVaporizer.cpp b/src/netedit/elements/additional/GNEVaporizer.cpp index 1a8214e7e97a..5adbe36f2c06 100644 --- a/src/netedit/elements/additional/GNEVaporizer.cpp +++ b/src/netedit/elements/additional/GNEVaporizer.cpp @@ -203,8 +203,8 @@ GNEVaporizer::drawGL(const GUIVisualizationSettings& s) const { } // calculate contours myAdditionalContour.calculateContourRectangleShape(s, d, this, myAdditionalGeometry.getShape().front(), s.additionalSettings.vaporizerSize, - s.additionalSettings.vaporizerSize, 0, 0, 0, vaporizerExaggeration); - mySymbolBaseContour.calculateContourExtrudedShape(s, d, this, myAdditionalGeometry.getShape(), 0.3, vaporizerExaggeration, true, true, 0); + s.additionalSettings.vaporizerSize, getType(), 0, 0, 0, vaporizerExaggeration); + mySymbolBaseContour.calculateContourExtrudedShape(s, d, this, myAdditionalGeometry.getShape(), getType(), 0.3, vaporizerExaggeration, true, true, 0); } } diff --git a/src/netedit/elements/additional/GNEVariableSpeedSignSymbol.cpp b/src/netedit/elements/additional/GNEVariableSpeedSignSymbol.cpp index 29fb649ef8eb..2181529f0484 100644 --- a/src/netedit/elements/additional/GNEVariableSpeedSignSymbol.cpp +++ b/src/netedit/elements/additional/GNEVariableSpeedSignSymbol.cpp @@ -138,7 +138,7 @@ GNEVariableSpeedSignSymbol::drawGL(const GUIVisualizationSettings& s) const { myAdditionalContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // calculate contour circle - myAdditionalContour.calculateContourCircleShape(s, d, this, myAdditionalGeometry.getShape().front(), 1.3, VSSExaggeration); + myAdditionalContour.calculateContourCircleShape(s, d, this, myAdditionalGeometry.getShape().front(), 1.3, getType(), VSSExaggeration); } } diff --git a/src/netedit/elements/data/GNEEdgeData.cpp b/src/netedit/elements/data/GNEEdgeData.cpp index 7f1e511e55d9..26531946b5e3 100644 --- a/src/netedit/elements/data/GNEEdgeData.cpp +++ b/src/netedit/elements/data/GNEEdgeData.cpp @@ -237,7 +237,7 @@ GNEEdgeData::drawLanePartialGL(const GUIVisualizationSettings& s, const GNEPathM segment->getContour()->drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // calculate contour and draw dotted geometry - segment->getContour()->calculateContourEdge(s, d, segment->getLane()->getParentEdge(), this, true, true); + segment->getContour()->calculateContourEdge(s, d, segment->getLane()->getParentEdge(), this, getType(), true, true); } } diff --git a/src/netedit/elements/data/GNEEdgeRelData.cpp b/src/netedit/elements/data/GNEEdgeRelData.cpp index 82fa782ffa09..a373f106a3aa 100644 --- a/src/netedit/elements/data/GNEEdgeRelData.cpp +++ b/src/netedit/elements/data/GNEEdgeRelData.cpp @@ -202,10 +202,10 @@ GNEEdgeRelData::drawLanePartialGL(const GUIVisualizationSettings& s, const GNEPa } // draw dotted contour if (getParentEdges().front() == segment->getLane()->getParentEdge()) { - segment->getContour()->calculateContourEdge(s, d, getParentEdges().front(), this, true, false); + segment->getContour()->calculateContourEdge(s, d, getParentEdges().front(), this, getType(), true, false); } if (getParentEdges().back() == segment->getLane()->getParentEdge()) { - segment->getContour()->calculateContourEdge(s, d, getParentEdges().back(), this, false, true); + segment->getContour()->calculateContourEdge(s, d, getParentEdges().back(), this, getType(), false, true); } } } diff --git a/src/netedit/elements/data/GNETAZRelData.cpp b/src/netedit/elements/data/GNETAZRelData.cpp index f752378a58ae..961efc3e857c 100644 --- a/src/netedit/elements/data/GNETAZRelData.cpp +++ b/src/netedit/elements/data/GNETAZRelData.cpp @@ -297,10 +297,10 @@ GNETAZRelData::drawGL(const GUIVisualizationSettings& s) const { } if (myNet->getViewNet()->getDataViewOptions().TAZRelDrawing()) { // calculate contour and draw dotted geometry - myTAZRelDataContour.calculateContourExtrudedShape(s, d, this, myTAZRelGeometryCenter.getShape(), 0.5, 1, true, true, 0); + myTAZRelDataContour.calculateContourExtrudedShape(s, d, this, myTAZRelGeometryCenter.getShape(), getType(), 0.5, 1, true, true, 0); } else { // calculate contour and draw dotted geometry - myTAZRelDataContour.calculateContourExtrudedShape(s, d, this, myTAZRelGeometry.getShape(), 0.5, 1, true, true, 0); + myTAZRelDataContour.calculateContourExtrudedShape(s, d, this, myTAZRelGeometry.getShape(), getType(), 0.5, 1, true, true, 0); } } } diff --git a/src/netedit/elements/demand/GNEContainer.cpp b/src/netedit/elements/demand/GNEContainer.cpp index 4e0a0bcdcf7a..c2ce1180a1ea 100644 --- a/src/netedit/elements/demand/GNEContainer.cpp +++ b/src/netedit/elements/demand/GNEContainer.cpp @@ -422,7 +422,7 @@ GNEContainer::drawGL(const GUIVisualizationSettings& s) const { myContainerContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // calculate contour - myContainerContour.calculateContourRectangleShape(s, d, this, containerPosition, 0.5, 0.18, -5.5, 0, 0, exaggeration); + myContainerContour.calculateContourRectangleShape(s, d, this, containerPosition, 0.5, 0.18, getType(), -5.5, 0, 0, exaggeration); } } diff --git a/src/netedit/elements/demand/GNEDemandElementFlow.cpp b/src/netedit/elements/demand/GNEDemandElementFlow.cpp index cbe0d9f9af32..20432f0f8861 100644 --- a/src/netedit/elements/demand/GNEDemandElementFlow.cpp +++ b/src/netedit/elements/demand/GNEDemandElementFlow.cpp @@ -234,7 +234,7 @@ GNEDemandElementFlow::enableFlowAttribute(GNEDemandElement* flowElement, SumoXML case SUMO_ATTR_PERIOD: case GNE_ATTR_POISSON: case SUMO_ATTR_PROB: - undoList->add(new GNEChange_ToggleAttribute(flowElement, key, true, parametersSet), true); + undoList->add(new GNEChange_ToggleAttribute(flowElement, key, true), true); return; default: throw InvalidArgument(flowElement->getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'"); @@ -253,7 +253,7 @@ GNEDemandElementFlow::disableFlowAttribute(GNEDemandElement* flowElement, SumoXM case SUMO_ATTR_PERIOD: case GNE_ATTR_POISSON: case SUMO_ATTR_PROB: - undoList->add(new GNEChange_ToggleAttribute(flowElement, key, false, parametersSet), true); + undoList->add(new GNEChange_ToggleAttribute(flowElement, key, false), true); return; default: throw InvalidArgument(flowElement->getTagStr() + " doesn't have an attribute of type '" + toString(key) + "'"); diff --git a/src/netedit/elements/demand/GNEDemandElementPlan.cpp b/src/netedit/elements/demand/GNEDemandElementPlan.cpp index 0da542b4fad9..bd045b4ff341 100644 --- a/src/netedit/elements/demand/GNEDemandElementPlan.cpp +++ b/src/netedit/elements/demand/GNEDemandElementPlan.cpp @@ -1921,9 +1921,9 @@ GNEDemandElementPlan::drawPlanGL(const bool drawPlan, const GUIVisualizationSett myPlanContour.drawDottedContours(s, d, myPlanElement, s.dottedContourSettings.segmentWidth, true); } // calculate contour and draw dotted geometry - myPlanContour.calculateContourExtrudedShape(s, d, myPlanElement, planGeometry.getShape(), pathWidth * 2, 1, true, true, 0); + myPlanContour.calculateContourExtrudedShape(s, d, myPlanElement, planGeometry.getShape(), myPlanElement->getType(), pathWidth * 2, 1, true, true, 0); // calculate contour for end - myPlanContourEnd.calculateContourCircleShape(s, d, myPlanElement, planGeometry.getShape().back(), 1, 1); + myPlanContourEnd.calculateContourCircleShape(s, d, myPlanElement, planGeometry.getShape().back(), 1, myPlanElement->getType(), 1); } // check if draw plan parent if (planParent->getPreviousChildDemandElement(myPlanElement) == nullptr) { @@ -2024,13 +2024,13 @@ GNEDemandElementPlan::drawPlanLanePartial(const bool drawPlan, const GUIVisualiz const auto& shape = (segment->isFirstSegment() || segment->isLastSegment()) ? planGeometry.getShape() : segment->getLane()->getLaneShape(); // calculate contour and draw dotted geometry (always with double width) if (segment->isFirstSegment()) { - segment->getContour()->calculateContourExtrudedShape(s, d, myPlanElement, shape, drawingWidth, 1, true, false, 0); + segment->getContour()->calculateContourExtrudedShape(s, d, myPlanElement, shape, myPlanElement->getType(), drawingWidth, 1, true, false, 0); } else if (segment->isLastSegment()) { - segment->getContour()->calculateContourExtrudedShape(s, d, myPlanElement, shape, drawingWidth, 1, false, false, 0); + segment->getContour()->calculateContourExtrudedShape(s, d, myPlanElement, shape, myPlanElement->getType(), drawingWidth, 1, false, false, 0); // calculate contour for end - myPlanContourEnd.calculateContourCircleShape(s, d, myPlanElement, getPlanAttributePosition(GNE_ATTR_PLAN_GEOMETRY_ENDPOS), 2 * endPosRadius, 1); + myPlanContourEnd.calculateContourCircleShape(s, d, myPlanElement, getPlanAttributePosition(GNE_ATTR_PLAN_GEOMETRY_ENDPOS), 2 * endPosRadius, myPlanElement->getType(), 1); } else { - segment->getContour()->calculateContourExtrudedShape(s, d, myPlanElement, shape, drawingWidth, 1, false, false, 0); + segment->getContour()->calculateContourExtrudedShape(s, d, myPlanElement, shape, myPlanElement->getType(), drawingWidth, 1, false, false, 0); } } // check if draw plan parent @@ -2106,14 +2106,14 @@ GNEDemandElementPlan::drawPlanJunctionPartial(const bool drawPlan, const GUIVisu // get shape const auto& shape = segment->getPreviousLane()->getLane2laneConnections().getLane2laneGeometry(segment->getNextLane()).getShape(); // calculate contour and draw dotted geometry (always with double width) - segment->getContour()->calculateContourExtrudedShape(s, d, myPlanElement, shape, pathWidthDouble, 1, false, false, 0); + segment->getContour()->calculateContourExtrudedShape(s, d, myPlanElement, shape, myPlanElement->getType(), pathWidthDouble, 1, false, false, 0); } } else if (segment->getPreviousLane()) { segment->getContour()->calculateContourExtrudedShape(s, d, myPlanElement, {segment->getPreviousLane()->getLaneShape().back(), myPlanElement->getParentJunctions().back()->getPositionInView()}, - pathWidthDouble, 1, false, true, 0); + myPlanElement->getType(), pathWidthDouble, 1, false, true, 0); } else if (segment->getNextLane()) { segment->getContour()->calculateContourExtrudedShape(s, d, myPlanElement, {myPlanElement->getParentJunctions().front()->getPositionInView(), segment->getNextLane()->getLaneShape().front()}, - pathWidthDouble, 1, true, false, 0); + myPlanElement->getType(), pathWidthDouble, 1, true, false, 0); } } // check if draw plan parent diff --git a/src/netedit/elements/demand/GNEPerson.cpp b/src/netedit/elements/demand/GNEPerson.cpp index db3ffe395415..aeb1b6987f82 100644 --- a/src/netedit/elements/demand/GNEPerson.cpp +++ b/src/netedit/elements/demand/GNEPerson.cpp @@ -422,7 +422,7 @@ GNEPerson::drawGL(const GUIVisualizationSettings& s) const { myPersonContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // calculate contour - myPersonContour.calculateContourRectangleShape(s, d, this, personPosition, 0.1, 0.2, -1.1, 0, 0, exaggeration); + myPersonContour.calculateContourRectangleShape(s, d, this, personPosition, 0.1, 0.2, getType(), -1.1, 0, 0, exaggeration); } } diff --git a/src/netedit/elements/demand/GNERoute.cpp b/src/netedit/elements/demand/GNERoute.cpp index e192ca74b0a7..ab53a4a725ed 100644 --- a/src/netedit/elements/demand/GNERoute.cpp +++ b/src/netedit/elements/demand/GNERoute.cpp @@ -444,7 +444,7 @@ GNERoute::drawLanePartialGL(const GUIVisualizationSettings& s, const GNEPathMana segment->getContour()->drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // calculate contour - segment->getContour()->calculateContourExtrudedShape(s, d, this, routeGeometry.getShape(), routeWidth, exaggeration, + segment->getContour()->calculateContourExtrudedShape(s, d, this, routeGeometry.getShape(), getType(), routeWidth, exaggeration, segment->isFirstSegment(), segment->isLastSegment(), 0); } } @@ -475,7 +475,7 @@ GNERoute::drawJunctionPartialGL(const GUIVisualizationSettings& s, const GNEPath segment->getContour()->drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // calculate contour - segment->getContour()->calculateContourExtrudedShape(s, d, this, routeGeometry.getShape(), routeWidth, routeExaggeration, false, false, 0); + segment->getContour()->calculateContourExtrudedShape(s, d, this, routeGeometry.getShape(), getType(), routeWidth, routeExaggeration, false, false, 0); } } diff --git a/src/netedit/elements/demand/GNEStop.cpp b/src/netedit/elements/demand/GNEStop.cpp index edba2d24ce14..26e41eb8faf7 100644 --- a/src/netedit/elements/demand/GNEStop.cpp +++ b/src/netedit/elements/demand/GNEStop.cpp @@ -407,7 +407,7 @@ GNEStop::drawGL(const GUIVisualizationSettings& s) const { myStopContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // calculate contour and draw dotted geometry - myStopContour.calculateContourExtrudedShape(s, d, this, myDemandElementGeometry.getShape(), width, exaggeration, true, true, 0); + myStopContour.calculateContourExtrudedShape(s, d, this, myDemandElementGeometry.getShape(), getType(), width, exaggeration, true, true, 0); } } diff --git a/src/netedit/elements/demand/GNEStopPlan.cpp b/src/netedit/elements/demand/GNEStopPlan.cpp index 85965ae6037c..d72dbb8c0066 100644 --- a/src/netedit/elements/demand/GNEStopPlan.cpp +++ b/src/netedit/elements/demand/GNEStopPlan.cpp @@ -246,12 +246,12 @@ GNEStopPlan::drawGL(const GUIVisualizationSettings& s) const { myStopSignContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidthSmall, true); } // calculate contour and draw dotted geometry - myStopContour.calculateContourExtrudedShape(s, d, this, myDemandElementGeometry.getShape(), 0.3, exaggeration, false, true, 0); - myStopSignContour.calculateContourCircleShape(s, d, this, mySignPosition, s.additionalSettings.stopEdgeSize, exaggeration); - // check if draw plan parent - if (getParentDemandElements().at(0)->getPreviousChildDemandElement(this) == nullptr) { - getParentDemandElements().at(0)->drawGL(s); - } + myStopContour.calculateContourExtrudedShape(s, d, this, myDemandElementGeometry.getShape(), getType(), 0.3, exaggeration, false, true, 0); + myStopSignContour.calculateContourCircleShape(s, d, this, mySignPosition, s.additionalSettings.stopEdgeSize, getType(), exaggeration); + } + // check if draw plan parent + if (getParentDemandElements().at(0)->getPreviousChildDemandElement(this) == nullptr) { + getParentDemandElements().at(0)->drawGL(s); } } diff --git a/src/netedit/elements/demand/GNEVehicle.cpp b/src/netedit/elements/demand/GNEVehicle.cpp index 09306a8700f4..289d87169b73 100644 --- a/src/netedit/elements/demand/GNEVehicle.cpp +++ b/src/netedit/elements/demand/GNEVehicle.cpp @@ -966,7 +966,7 @@ GNEVehicle::drawGL(const GUIVisualizationSettings& s) const { myVehicleContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // draw squared shape - myVehicleContour.calculateContourRectangleShape(s, d, this, vehiclePosition, length * 0.5, width * 0.5, length * -0.5, 0, vehicleRotation, exaggeration); + myVehicleContour.calculateContourRectangleShape(s, d, this, vehiclePosition, length * 0.5, width * 0.5, getType(), length * -0.5, 0, vehicleRotation, exaggeration); } } } @@ -1159,9 +1159,9 @@ GNEVehicle::drawLanePartialGL(const GUIVisualizationSettings& s, const GNEPathMa } // calculate contour and draw dotted geometry if (segment->isFirstSegment() || segment->isLastSegment()) { - segment->getContour()->calculateContourExtrudedShape(s, d, this, vehicleGeometry.getShape(), width, 1, segment->isFirstSegment(), segment->isLastSegment(), 0); + segment->getContour()->calculateContourExtrudedShape(s, d, this, vehicleGeometry.getShape(), getType(), width, 1, segment->isFirstSegment(), segment->isLastSegment(), 0); } else { - segment->getContour()->calculateContourExtrudedShape(s, d, this, segment->getLane()->getLaneShape(), width, 1, segment->isFirstSegment(), segment->isLastSegment(), 0); + segment->getContour()->calculateContourExtrudedShape(s, d, this, segment->getLane()->getLaneShape(), getType(), width, 1, segment->isFirstSegment(), segment->isLastSegment(), 0); } } } @@ -1220,14 +1220,14 @@ GNEVehicle::drawJunctionPartialGL(const GUIVisualizationSettings& s, const GNEPa // continue depending if we're in the middle of two lanes or in the begin/end of a junction route if (segment->getPreviousLane() && segment->getNextLane()) { // calculate contour and draw dotted geometry - segment->getContour()->calculateContourExtrudedShape(s, d, this, segment->getPreviousLane()->getLane2laneConnections().getLane2laneGeometry(segment->getNextLane()).getShape(), 0, - width, 1, false, false); + segment->getContour()->calculateContourExtrudedShape(s, d, this, segment->getPreviousLane()->getLane2laneConnections().getLane2laneGeometry(segment->getNextLane()).getShape(), + getType(), 0, width, 1, false, false); } else if (segment->getPreviousLane() && myTagProperty.vehicleJunctions()) { - segment->getContour()->calculateContourExtrudedShape(s, d, this, {segment->getPreviousLane()->getLaneShape().back(), getParentJunctions().back()->getPositionInView()}, 0, - width, 1, true, true); + segment->getContour()->calculateContourExtrudedShape(s, d, this, {segment->getPreviousLane()->getLaneShape().back(), getParentJunctions().back()->getPositionInView()}, + getType(), 0, width, 1, true, true); } else if (segment->getNextLane() && myTagProperty.vehicleJunctions()) { - segment->getContour()->calculateContourExtrudedShape(s, d, this, {getParentJunctions().front()->getPositionInView(), segment->getNextLane()->getLaneShape().front()}, 0, - width, 1, true, true); + segment->getContour()->calculateContourExtrudedShape(s, d, this, {getParentJunctions().front()->getPositionInView(), segment->getNextLane()->getLaneShape().front()}, + getType(), 0, width, 1, true, true); } } } @@ -2114,7 +2114,7 @@ GNEVehicle::setAttribute(SumoXMLAttr key, const std::string& value) { parseArrivalPosLat(value, myTagProperty.getTagStr(), id, arrivalPosLat, arrivalPosLatProcedure, error); break; case SUMO_ATTR_INSERTIONCHECKS: - parseInsertionChecks(value); + insertionChecks = parseInsertionChecks(value); break; // Specific of vehicles over routes case SUMO_ATTR_ROUTE: diff --git a/src/netedit/elements/network/GNEConnection.cpp b/src/netedit/elements/network/GNEConnection.cpp index 812c18d22a52..ea38c0bd5bcb 100644 --- a/src/netedit/elements/network/GNEConnection.cpp +++ b/src/netedit/elements/network/GNEConnection.cpp @@ -796,14 +796,14 @@ void GNEConnection::calculateConnectionContour(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, const PositionVector& shape, const double exaggeration) const { // first check if junction parent was inserted with full boundary - if (!gViewObjectsHandler.checkBoundaryParentElement(this, myFromLane->getParentEdge()->getToJunction())) { + if (!gViewObjectsHandler.checkBoundaryParentElement(this, myFromLane->getParentEdge()->getToJunction(), getType())) { // calculate geometry points contour if we're editing shape if (myShapeEdited) { - myNetworkElementContour.calculateContourAllGeometryPoints(s, d, this, shape, s.neteditSizeSettings.connectionGeometryPointRadius, + myNetworkElementContour.calculateContourAllGeometryPoints(s, d, this, shape, getType(), s.neteditSizeSettings.connectionGeometryPointRadius, exaggeration, true); } else { // calculate connection shape contour - myNetworkElementContour.calculateContourExtrudedShape(s, d, this, shape, s.connectionSettings.connectionWidth, exaggeration, true, true, 0); + myNetworkElementContour.calculateContourExtrudedShape(s, d, this, shape, getType(), s.connectionSettings.connectionWidth, exaggeration, true, true, 0); } } } diff --git a/src/netedit/elements/network/GNECrossing.cpp b/src/netedit/elements/network/GNECrossing.cpp index 8e383b623d5f..f92c34b07c8e 100644 --- a/src/netedit/elements/network/GNECrossing.cpp +++ b/src/netedit/elements/network/GNECrossing.cpp @@ -628,15 +628,14 @@ void GNECrossing::calculateCrossingContour(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, const double width, const double exaggeration) const { // first check if junction parent was inserted with full boundary - if (!gViewObjectsHandler.checkBoundaryParentElement(this, myParentJunction)) { + if (!gViewObjectsHandler.checkBoundaryParentElement(this, myParentJunction, getType())) { // check if calculate contour for geometry points if (myShapeEdited) { myNetworkElementContour.calculateContourAllGeometryPoints(s, d, this, myCrossingGeometry.getShape(), - s.neteditSizeSettings.crossingGeometryPointRadius, - exaggeration, true); + getType(), s.neteditSizeSettings.crossingGeometryPointRadius, exaggeration, true); } else { // calculate contour - myNetworkElementContour.calculateContourExtrudedShape(s, d, this, myCrossingGeometry.getShape(), width, exaggeration, true, true, 0); + myNetworkElementContour.calculateContourExtrudedShape(s, d, this, myCrossingGeometry.getShape(), getType(), width, exaggeration, true, true, 0); } } } diff --git a/src/netedit/elements/network/GNEEdge.cpp b/src/netedit/elements/network/GNEEdge.cpp index 81405a56c991..7a993fa8048d 100644 --- a/src/netedit/elements/network/GNEEdge.cpp +++ b/src/netedit/elements/network/GNEEdge.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -238,13 +239,13 @@ GNEEdge::checkDrawFromContour() const { } } else if (modes.isCurrentSupermodeData()) { // get TAZRelDataFrame - const auto& getEdgeRelDataFrame = viewParent->getEdgeRelDataFrame(); - if (getEdgeRelDataFrame->shown()) { + const auto& edgeRelDataFrame = viewParent->getEdgeRelDataFrame(); + if (edgeRelDataFrame->shown()) { // check first Edge - if (getEdgeRelDataFrame->getPathCreator()->getSelectedEdges().empty()) { - return gViewObjectsHandler.isElementSelected(this); - } else if (getEdgeRelDataFrame->getPathCreator()->getSelectedEdges().front() == this) { - return true; + if (edgeRelDataFrame->getPathCreator()->getSelectedEdges().empty()) { + return false; + } else { + return edgeRelDataFrame->getPathCreator()->getSelectedEdges().front() == this; } } } @@ -292,13 +293,13 @@ GNEEdge::checkDrawToContour() const { } } else if (modes.isCurrentSupermodeData()) { // get TAZRelDataFrame - const auto& getEdgeRelDataFrame = viewParent->getEdgeRelDataFrame(); - if (getEdgeRelDataFrame->shown()) { - // check first Edge - if (getEdgeRelDataFrame->getPathCreator()->getSelectedEdges().empty()) { - return gViewObjectsHandler.isElementSelected(this); - } else if (getEdgeRelDataFrame->getPathCreator()->getSelectedEdges().back() == this) { - return true; + const auto& edgeRelDataFrame = viewParent->getEdgeRelDataFrame(); + if (edgeRelDataFrame->shown()) { + // check last Edge + if (edgeRelDataFrame->getPathCreator()->getSelectedEdges().empty()) { + return false; + } else { + return edgeRelDataFrame->getPathCreator()->getSelectedEdges().back() == this; } } } @@ -315,43 +316,61 @@ GNEEdge::checkDrawRelatedContour() const { bool GNEEdge::checkDrawOverContour() const { - // get modes and viewParent (for code legibility) - const auto& modes = myNet->getViewNet()->getEditModes(); - const auto& viewParent = myNet->getViewNet()->getViewParent(); const auto& viewObjectsSelector = myNet->getViewNet()->getViewObjectsSelector(); - if (modes.isCurrentSupermodeDemand()) { - // get current plan selector - GNEPlanSelector* planSelector = nullptr; - if (modes.demandEditMode == DemandEditMode::DEMAND_PERSON) { - planSelector = viewParent->getPersonFrame()->getPlanSelector(); - } else if (modes.demandEditMode == DemandEditMode::DEMAND_PERSONPLAN) { - planSelector = viewParent->getPersonPlanFrame()->getPlanSelector(); - } else if (modes.demandEditMode == DemandEditMode::DEMAND_CONTAINER) { - planSelector = viewParent->getContainerFrame()->getPlanSelector(); - } else if (modes.demandEditMode == DemandEditMode::DEMAND_CONTAINERPLAN) { - planSelector = viewParent->getContainerPlanFrame()->getPlanSelector(); - } - // continue depending of plan selector - if (planSelector && planSelector->markEdges() && (viewObjectsSelector.getEdgeFront() == this)) { - if (viewObjectsSelector.getAttributeCarrierFront()->getTagProperty().isStoppingPlace()) { - return false; - } else if (viewObjectsSelector.getAttributeCarrierFront()->getTagProperty().isTAZElement()) { - return false; - } else if (viewObjectsSelector.getAttributeCarrierFront()->getTagProperty().getTag() == SUMO_TAG_JUNCTION) { - return false; - } else { - return true; + // first check if this is the edge under cursor + if (viewObjectsSelector.getEdgeFront() != this) { + return false; + } else { + // get modes and viewParent (for code legibility) + const auto& modes = myNet->getViewNet()->getEditModes(); + const auto& viewParent = myNet->getViewNet()->getViewParent(); + if (modes.isCurrentSupermodeDemand()) { + // get current plan selector + GNEPlanSelector* planSelector = nullptr; + if (modes.demandEditMode == DemandEditMode::DEMAND_PERSON) { + planSelector = viewParent->getPersonFrame()->getPlanSelector(); + } else if (modes.demandEditMode == DemandEditMode::DEMAND_PERSONPLAN) { + planSelector = viewParent->getPersonPlanFrame()->getPlanSelector(); + } else if (modes.demandEditMode == DemandEditMode::DEMAND_CONTAINER) { + planSelector = viewParent->getContainerFrame()->getPlanSelector(); + } else if (modes.demandEditMode == DemandEditMode::DEMAND_CONTAINERPLAN) { + planSelector = viewParent->getContainerPlanFrame()->getPlanSelector(); + } + // continue depending of plan selector + if (planSelector && planSelector->markEdges()) { + return (viewObjectsSelector.getAttributeCarrierFront()->getTagProperty().getTag() == SUMO_TAG_LANE); + } else if (modes.demandEditMode == DemandEditMode::DEMAND_VEHICLE) { + // get current vehicle template + const auto& vehicleTemplate = viewParent->getVehicleFrame()->getVehicleTagSelector()->getCurrentTemplateAC(); + // check if vehicle can be placed over from-to TAZs + if (vehicleTemplate && vehicleTemplate->getTagProperty().vehicleEdges()) { + return (viewObjectsSelector.getAttributeCarrierFront()->getTagProperty().getTag() == SUMO_TAG_LANE); + } } - } else if (modes.demandEditMode == DemandEditMode::DEMAND_VEHICLE) { - // get current vehicle template - const auto& vehicleTemplate = viewParent->getVehicleFrame()->getVehicleTagSelector()->getCurrentTemplateAC(); - // check if vehicle can be placed over from-to TAZs - if (vehicleTemplate && vehicleTemplate->getTagProperty().vehicleEdges()) { - return myNet->getViewNet()->getViewObjectsSelector().getEdgeFront() == this; + } else if (modes.isCurrentSupermodeData()) { + // get frames + const auto& edgeDataFrame = viewParent->getEdgeDataFrame(); + const auto& edgeRelDataFrame = viewParent->getEdgeRelDataFrame(); + if (edgeDataFrame->shown()) { + return true; + } else if (edgeRelDataFrame->shown()) { + // check edges + if (edgeRelDataFrame->getPathCreator()->getSelectedEdges().empty()) { + return true; + } else if (edgeRelDataFrame->getPathCreator()->getSelectedEdges().size() == 2) { + return false; + } else if (edgeRelDataFrame->getPathCreator()->getSelectedEdges().front() == this) { + return false; + } else if (edgeRelDataFrame->getPathCreator()->getSelectedEdges().back() == this) { + return false; + } else { + return true; + } } } + // nothing to draw + return false; } - return false; } @@ -704,14 +723,21 @@ GNEEdge::drawGL(const GUIVisualizationSettings& s) const { GLHelper::drawBoundary(s, getCenteringBoundary()); // get detail level from the first lane const auto d = myLanes.front()->getDrawingConstants()->getDetail(); + // calculate layer + double layer = GLO_EDGE; + if (myNet->getViewNet()->getFrontAttributeCarrier() == this) { + layer = GLO_FRONTELEMENT; + } else if (myLanes.front()->getLaneShape().length2D() <= (s.neteditSizeSettings.junctionBubbleRadius * 2)) { + layer = GLO_JUNCTION + 1.8; + } // check if draw details if (!s.drawForViewObjectsHandler) { // draw geometry points - drawEdgeGeometryPoints(s, d); + drawEdgeGeometryPoints(s, d, layer); // draw edge shape (a red line only visible if lane shape is strange) - drawEdgeShape(s, d); + drawEdgeShape(s, d, layer); // draw edge stopOffset - drawLaneStopOffset(s, d); + drawLaneStopOffset(s, d, layer); // draw edge name drawEdgeName(s); // draw lock icon @@ -720,7 +746,7 @@ GNEEdge::drawGL(const GUIVisualizationSettings& s) const { myNetworkElementContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // calculate edge contour (always before children) - calculateEdgeContour(s, d); + calculateEdgeContour(s, d, layer); // draw lanes for (const auto& lane : myLanes) { lane->drawGL(s); @@ -2577,7 +2603,7 @@ GNEEdge::getContainersOverEdgeMap() const { void -GNEEdge::drawEdgeGeometryPoints(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d) const { +GNEEdge::drawEdgeGeometryPoints(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, const double layer) const { // first check conditions if (myNet->getViewNet()->getEditModes().isCurrentSupermodeNetwork() && (d <= GUIVisualizationSettings::Detail::GeometryPoint)) { // check if draw geometry points @@ -2616,8 +2642,8 @@ GNEEdge::drawEdgeGeometryPoints(const GUIVisualizationSettings& s, const GUIVisu } // draw start and end points if (bigGeometryPoints) { - drawStartGeometryPoint(s, d, geometryPointRadius, exaggeration); - drawEndGeometryPoint(s, d, geometryPointRadius, exaggeration); + drawStartGeometryPoint(s, d, geometryPointRadius, layer, exaggeration); + drawEndGeometryPoint(s, d, geometryPointRadius, layer, exaggeration); } // draw dotted contour geometry points myNetworkElementContour.drawDottedContourGeometryPoints(s, d, this, myNBEdge->getGeometry(), geometryPointRadius, @@ -2628,7 +2654,7 @@ GNEEdge::drawEdgeGeometryPoints(const GUIVisualizationSettings& s, const GUIVisu void GNEEdge::drawStartGeometryPoint(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const double geometryPointRadius, const double exaggeration) const { + const double geometryPointRadius, const double layer, const double exaggeration) const { // check detail level if (d <= GUIVisualizationSettings::Detail::GeometryPoint) { // get first geometry point @@ -2683,7 +2709,7 @@ GNEEdge::drawStartGeometryPoint(const GUIVisualizationSettings& s, const GUIVisu } } // draw dotted contour geometry points - myNetworkElementContour.calculateContourFirstGeometryPoint(s, d, this, myNBEdge->getInnerGeometry(), + myNetworkElementContour.calculateContourFirstGeometryPoint(s, d, this, myNBEdge->getInnerGeometry(), layer, geometryPointRadius, exaggeration); } } @@ -2692,7 +2718,7 @@ GNEEdge::drawStartGeometryPoint(const GUIVisualizationSettings& s, const GUIVisu void GNEEdge::drawEndGeometryPoint(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const double geometryPointRadius, const double exaggeration) const { + const double layer, const double geometryPointRadius, const double exaggeration) const { // check detail level if (d <= GUIVisualizationSettings::Detail::GeometryPoint) { // get first geometry point @@ -2747,7 +2773,7 @@ GNEEdge::drawEndGeometryPoint(const GUIVisualizationSettings& s, const GUIVisual } } // draw dotted contour geometry points - myNetworkElementContour.calculateContourFirstGeometryPoint(s, d, this, myNBEdge->getInnerGeometry(), + myNetworkElementContour.calculateContourFirstGeometryPoint(s, d, this, myNBEdge->getInnerGeometry(), layer, geometryPointRadius, exaggeration); } } @@ -2818,17 +2844,13 @@ GNEEdge::drawEdgeName(const GUIVisualizationSettings& s) const { void -GNEEdge::drawLaneStopOffset(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d) const { +GNEEdge::drawLaneStopOffset(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, const double layer) const { // draw geometry only if we'rent in drawForObjectUnderCursor mode if (d <= GUIVisualizationSettings::Detail::LaneDetails) { // Push stopOffset matrix GLHelper::pushMatrix(); // translate to front (note: Special case) - if (myNet->getViewNet()->getFrontAttributeCarrier() == this) { - glTranslated(0, 0, GLO_FRONTELEMENT); - } else { - myNet->getViewNet()->drawTranslateFrontAttributeCarrier(this, GLO_LANE); - } + myNet->getViewNet()->drawTranslateFrontAttributeCarrier(this, layer + 1); if (myNBEdge->myEdgeStopOffset.isDefined() && (myNBEdge->myEdgeStopOffset.getPermissions() & SVC_PASSENGER) != 0) { for (const auto& lane : getLanes()) { lane->drawLaneStopOffset(s); @@ -2867,11 +2889,11 @@ GNEEdge::drawChildrens(const GUIVisualizationSettings& s) const { void -GNEEdge::calculateEdgeContour(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d) const { +GNEEdge::calculateEdgeContour(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, const double layer) const { // if we're selecting using a boundary, first don't calculate contour bt check if edge boundary is within selection boundary if (gViewObjectsHandler.getSelectionBoundary().isInitialised() && gViewObjectsHandler.getSelectionBoundary().contains(myEdgeBoundary)) { // simply add object in ViewObjectsHandler with full boundary - gViewObjectsHandler.addElementUnderCursor(this, false, true); + gViewObjectsHandler.addElementUnderCursor(this, layer, false, true); } else { // get geometry point radius const auto geometryPointRadius = getGeometryPointRadius(); @@ -2882,7 +2904,7 @@ GNEEdge::calculateEdgeContour(const GUIVisualizationSettings& s, const GUIVisual // check if we're in move mode const bool moveMode = (myNet->getViewNet()->getEditModes().networkEditMode == NetworkEditMode::NETWORK_MOVE); // calculate contour - myNetworkElementContour.calculateContourEdge(s, d, this, this, true, true); + myNetworkElementContour.calculateContourEdge(s, d, this, this, layer, true, true); // calculate edge geometry points myNetworkElementContour.calculateContourEdgeGeometryPoints(s, d, this, geometryPointRadius, moveMode, firstExtrem, lastExtrem); } @@ -2951,7 +2973,7 @@ GNEEdge::drawTAZElements(const GUIVisualizationSettings& s) const { void -GNEEdge::drawEdgeShape(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d) const { +GNEEdge::drawEdgeShape(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, const double layer) const { // avoid draw for railways if ((d <= GUIVisualizationSettings::Detail::LaneDetails) && !myLanes.front()->getDrawingConstants()->drawAsRailway() && (gViewObjectsHandler.markedFirstGeometryPoint == this)) { @@ -2961,7 +2983,7 @@ GNEEdge::drawEdgeShape(const GUIVisualizationSettings& s, const GUIVisualization if (drawBigGeometryPoints()) { glTranslated(0, 0, GLO_GEOMETRYPOINT - 1); } else { - glTranslated(0, 0, GLO_EDGE); + glTranslated(0, 0, layer); } // obtain color RGBColor geometryPointColor = s.junctionColorer.getSchemes()[0].getColor(2); diff --git a/src/netedit/elements/network/GNEEdge.h b/src/netedit/elements/network/GNEEdge.h index d4f4d373cdb2..4188d2382619 100644 --- a/src/netedit/elements/network/GNEEdge.h +++ b/src/netedit/elements/network/GNEEdge.h @@ -475,30 +475,34 @@ class GNEEdge : public GNENetworkElement, public GNECandidateElement { const std::map > getContainersOverEdgeMap() const; /// @brief draw edge geometry points (note: This function is called by GNELane::drawGL(...) - void drawEdgeGeometryPoints(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d) const; + void drawEdgeGeometryPoints(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, + const double layer) const; /// @brief draw start extreme geometry point void drawStartGeometryPoint(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const double geometryPointRadius, const double exaggeration) const; + const double geometryPointRadius, const double layer, const double exaggeration) const; /// @brief draw end extreme geometry point void drawEndGeometryPoint(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, - const double geometryPointRadius, const double exaggeration) const; + const double geometryPointRadius, const double layer, const double exaggeration) const; /// @brief draw edge name void drawEdgeName(const GUIVisualizationSettings& s) const; /// @brief draw edgeStopOffset - void drawLaneStopOffset(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d) const; + void drawLaneStopOffset(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, + const double layer) const; /// @brief draw edge shape (only one line) - void drawEdgeShape(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d) const; + void drawEdgeShape(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, + const double layer) const; /// @brief draw children void drawChildrens(const GUIVisualizationSettings& s) const; /// @brief calculate contours - void calculateEdgeContour(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d) const; + void calculateEdgeContour(const GUIVisualizationSettings& s, const GUIVisualizationSettings::Detail d, + const double layer) const; /// @brief draw TAZElements void drawTAZElements(const GUIVisualizationSettings& s) const; diff --git a/src/netedit/elements/network/GNEInternalLane.cpp b/src/netedit/elements/network/GNEInternalLane.cpp index 9692275743d9..68142f1be476 100644 --- a/src/netedit/elements/network/GNEInternalLane.cpp +++ b/src/netedit/elements/network/GNEInternalLane.cpp @@ -213,7 +213,7 @@ GNEInternalLane::drawGL(const GUIVisualizationSettings& s) const { myNetworkElementContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // calculate contour - myNetworkElementContour.calculateContourExtrudedShape(s, d, this, myInternalLaneGeometry.getShape(), + myNetworkElementContour.calculateContourExtrudedShape(s, d, this, myInternalLaneGeometry.getShape(), getType(), s.connectionSettings.connectionWidth, 1, true, true, 0); } } diff --git a/src/netedit/elements/network/GNEJunction.cpp b/src/netedit/elements/network/GNEJunction.cpp index a425816cfcfa..343e9f3092bd 100644 --- a/src/netedit/elements/network/GNEJunction.cpp +++ b/src/netedit/elements/network/GNEJunction.cpp @@ -277,39 +277,35 @@ GNEJunction::checkDrawOverContour() const { const auto& modes = myNet->getViewNet()->getEditModes(); const auto& viewParent = myNet->getViewNet()->getViewParent(); const auto& viewObjectsSelector = myNet->getViewNet()->getViewObjectsSelector(); - if (modes.isCurrentSupermodeDemand()) { - // get current plan selector - GNEPlanSelector* planSelector = nullptr; - if (modes.demandEditMode == DemandEditMode::DEMAND_PERSON) { - planSelector = viewParent->getPersonFrame()->getPlanSelector(); - } else if (modes.demandEditMode == DemandEditMode::DEMAND_PERSONPLAN) { - planSelector = viewParent->getPersonPlanFrame()->getPlanSelector(); - } else if (modes.demandEditMode == DemandEditMode::DEMAND_CONTAINER) { - planSelector = viewParent->getContainerFrame()->getPlanSelector(); - } else if (modes.demandEditMode == DemandEditMode::DEMAND_CONTAINERPLAN) { - planSelector = viewParent->getContainerPlanFrame()->getPlanSelector(); - } - // continue depending of plan selector - if (planSelector && planSelector->markJunctions() && (viewObjectsSelector.getJunctionFront() == this)) { - if (viewObjectsSelector.getAttributeCarrierFront()->getTagProperty().isStoppingPlace()) { - return false; - } else if (viewObjectsSelector.getAttributeCarrierFront()->getTagProperty().isTAZElement()) { - return false; - } else if (viewObjectsSelector.getAttributeCarrierFront()->getTagProperty().getTag() == SUMO_TAG_EDGE) { - return false; - } else { - return true; + if (viewObjectsSelector.getJunctionFront() != this) { + return false; + } else { + if (modes.isCurrentSupermodeDemand()) { + // get current plan selector + GNEPlanSelector* planSelector = nullptr; + if (modes.demandEditMode == DemandEditMode::DEMAND_PERSON) { + planSelector = viewParent->getPersonFrame()->getPlanSelector(); + } else if (modes.demandEditMode == DemandEditMode::DEMAND_PERSONPLAN) { + planSelector = viewParent->getPersonPlanFrame()->getPlanSelector(); + } else if (modes.demandEditMode == DemandEditMode::DEMAND_CONTAINER) { + planSelector = viewParent->getContainerFrame()->getPlanSelector(); + } else if (modes.demandEditMode == DemandEditMode::DEMAND_CONTAINERPLAN) { + planSelector = viewParent->getContainerPlanFrame()->getPlanSelector(); } - } else if (modes.demandEditMode == DemandEditMode::DEMAND_VEHICLE) { - // get current vehicle template - const auto& vehicleTemplate = viewParent->getVehicleFrame()->getVehicleTagSelector()->getCurrentTemplateAC(); - // check if vehicle can be placed over from-to TAZs - if (vehicleTemplate && vehicleTemplate->getTagProperty().vehicleJunctions()) { - return myNet->getViewNet()->getViewObjectsSelector().getJunctionFront() == this; + // continue depending of plan selector + if (planSelector && planSelector->markJunctions()) { + return (viewObjectsSelector.getAttributeCarrierFront() == viewObjectsSelector.getJunctionFront()); + } else if (modes.demandEditMode == DemandEditMode::DEMAND_VEHICLE) { + // get current vehicle template + const auto& vehicleTemplate = viewParent->getVehicleFrame()->getVehicleTagSelector()->getCurrentTemplateAC(); + // check if vehicle can be placed over from-to TAZs + if (vehicleTemplate && vehicleTemplate->getTagProperty().vehicleJunctions()) { + return (viewObjectsSelector.getAttributeCarrierFront() == viewObjectsSelector.getJunctionFront()); + } } } + return false; } - return false; } @@ -1855,17 +1851,17 @@ GNEJunction::calculateJunctioncontour(const GUIVisualizationSettings& s, const G // if we're selecting using a boundary, first don't calculate contour bt check if edge boundary is within selection boundary if (gViewObjectsHandler.getSelectionBoundary().isInitialised() && gViewObjectsHandler.getSelectionBoundary().contains(myJunctionBoundary)) { // simply add object in ViewObjectsHandler with full boundary - gViewObjectsHandler.addElementUnderCursor(this, false, true); + gViewObjectsHandler.addElementUnderCursor(this, getType(), false, true); } else { // always calculate for shape - myNetworkElementContour.calculateContourClosedShape(s, d, this, myNBNode->getShape(), exaggeration); + myNetworkElementContour.calculateContourClosedShape(s, d, this, myNBNode->getShape(), getType(), exaggeration); // check if calculate contour for bubble if (drawBubble) { - myCircleContour.calculateContourCircleShape(s, d, this, myNBNode->getPosition(), s.neteditSizeSettings.junctionBubbleRadius, exaggeration); + myCircleContour.calculateContourCircleShape(s, d, this, myNBNode->getPosition(), s.neteditSizeSettings.junctionBubbleRadius, getType(), exaggeration); } // check geometry points if we're editing shape if (myShapeEdited) { - myNetworkElementContour.calculateContourAllGeometryPoints(s, d, this, myNBNode->getShape(), s.neteditSizeSettings.junctionGeometryPointRadius, + myNetworkElementContour.calculateContourAllGeometryPoints(s, d, this, myNBNode->getShape(), getType(), s.neteditSizeSettings.junctionGeometryPointRadius, exaggeration, true); } } diff --git a/src/netedit/elements/network/GNELane.cpp b/src/netedit/elements/network/GNELane.cpp index 2c75685c30a6..9a2d339c60db 100644 --- a/src/netedit/elements/network/GNELane.cpp +++ b/src/netedit/elements/network/GNELane.cpp @@ -451,17 +451,24 @@ void GNELane::drawGL(const GUIVisualizationSettings& s) const { // update lane drawing constan myDrawingConstants->update(s); + // calculate layer + double layer = GLO_LANE; + if (myNet->getViewNet()->getFrontAttributeCarrier() == myParentEdge) { + layer = GLO_FRONTELEMENT; + } else if (myLaneGeometry.getShape().length2D() <= (s.neteditSizeSettings.junctionBubbleRadius * 2)) { + layer = GLO_JUNCTION + 2; + } // check drawing conditions if (!s.drawForViewObjectsHandler) { // draw lane - drawLane(s); + drawLane(s, layer); // draw lock icon GNEViewNetHelper::LockIcon::drawLockIcon(myDrawingConstants->getDetail(), this, getType(), getPositionInView(), 1); // draw dotted contour myNetworkElementContour.drawDottedContours(s, myDrawingConstants->getDetail(), this, s.dottedContourSettings.segmentWidth, true); } // calculate contour (always before children) - calculateLaneContour(s); + calculateLaneContour(s, layer); // draw children drawChildren(s); } @@ -1008,17 +1015,11 @@ GNELane::commitMoveShape(const GNEMoveResult& moveResult, GNEUndoList* undoList) void -GNELane::drawLane(const GUIVisualizationSettings& s) const { +GNELane::drawLane(const GUIVisualizationSettings& s, const double layer) const { // Push layer matrix GLHelper::pushMatrix(); - // translate to front (note: Special case) - if (myNet->getViewNet()->getFrontAttributeCarrier() == myParentEdge) { - glTranslated(0, 0, GLO_FRONTELEMENT); - } else if (myLaneGeometry.getShape().length2D() <= (s.neteditSizeSettings.junctionBubbleRadius * 2)) { - myNet->getViewNet()->drawTranslateFrontAttributeCarrier(this, GLO_JUNCTION + 0.5); - } else { - myNet->getViewNet()->drawTranslateFrontAttributeCarrier(this, GLO_LANE); - } + // translate to layer + myNet->getViewNet()->drawTranslateFrontAttributeCarrier(this, layer); // set lane colors setLaneColor(s); // Check if lane has to be draw as railway and if isn't being drawn for selecting @@ -1417,16 +1418,16 @@ GNELane::drawLane2LaneConnections() const { void -GNELane::calculateLaneContour(const GUIVisualizationSettings& s) const { +GNELane::calculateLaneContour(const GUIVisualizationSettings& s, const double layer) const { // first check if edge parent was inserted with full boundary - if (!gViewObjectsHandler.checkBoundaryParentElement(this, myParentEdge)) { + if (!gViewObjectsHandler.checkBoundaryParentElement(this, myParentEdge, layer)) { // calculate contour myNetworkElementContour.calculateContourExtrudedShape(s, myDrawingConstants->getDetail(), this, myLaneGeometry.getShape(), - myDrawingConstants->getDrawingWidth(), 1, true, true, myDrawingConstants->getOffset()); + layer, myDrawingConstants->getDrawingWidth(), 1, true, true, myDrawingConstants->getOffset()); // calculate geometry points contour if we're editing shape if (myShapeEdited) { myNetworkElementContour.calculateContourAllGeometryPoints(s, myDrawingConstants->getDetail(), this, myLaneGeometry.getShape(), - s.neteditSizeSettings.laneGeometryPointRadius, myDrawingConstants->getExaggeration(), true); + layer, s.neteditSizeSettings.laneGeometryPointRadius, myDrawingConstants->getExaggeration(), true); } } } diff --git a/src/netedit/elements/network/GNELane.h b/src/netedit/elements/network/GNELane.h index b12055f6b80c..7a204bb683bb 100644 --- a/src/netedit/elements/network/GNELane.h +++ b/src/netedit/elements/network/GNELane.h @@ -375,7 +375,7 @@ class GNELane : public GNENetworkElement, public GNECandidateElement, public FXD void commitMoveShape(const GNEMoveResult& moveResult, GNEUndoList* undoList); /// @brief draw lane - void drawLane(const GUIVisualizationSettings& s) const; + void drawLane(const GUIVisualizationSettings& s, const double layer) const; /// @brief draw selected lane void drawSelectedLane(const GUIVisualizationSettings& s) const; @@ -402,7 +402,7 @@ class GNELane : public GNENetworkElement, public GNECandidateElement, public FXD void drawLane2LaneConnections() const; /// @brief calculate contour - void calculateLaneContour(const GUIVisualizationSettings& s) const; + void calculateLaneContour(const GUIVisualizationSettings& s, const double layer) const; /// @brief sets the color according to the current scheme index and some lane function bool setFunctionalColor(int activeScheme, RGBColor& col) const; diff --git a/src/netedit/elements/network/GNEWalkingArea.cpp b/src/netedit/elements/network/GNEWalkingArea.cpp index 4e625f1811ee..889779e95b01 100644 --- a/src/netedit/elements/network/GNEWalkingArea.cpp +++ b/src/netedit/elements/network/GNEWalkingArea.cpp @@ -175,8 +175,8 @@ GNEWalkingArea::drawGL(const GUIVisualizationSettings& s) const { myNetworkElementContour.drawDottedContours(s, d, this, s.dottedContourSettings.segmentWidth, true); } // draw dotted contour (except in contour mode) checking if junction parent was inserted with full boundary - if (!drawInContourMode() && !gViewObjectsHandler.checkBoundaryParentElement(this, myParentJunction)) { - myNetworkElementContour.calculateContourClosedShape(s, d, this, walkingAreaShape, walkingAreaExaggeration); + if (!drawInContourMode() && !gViewObjectsHandler.checkBoundaryParentElement(this, myParentJunction, getType())) { + myNetworkElementContour.calculateContourClosedShape(s, d, this, walkingAreaShape, getType(), walkingAreaExaggeration); } } } diff --git a/src/netedit/frames/demand/GNEContainerFrame.cpp b/src/netedit/frames/demand/GNEContainerFrame.cpp index 0122f096019e..a494fd28dcf2 100644 --- a/src/netedit/frames/demand/GNEContainerFrame.cpp +++ b/src/netedit/frames/demand/GNEContainerFrame.cpp @@ -127,13 +127,13 @@ GNEContainerFrame::addContainer(const GNEViewNetHelper::ViewObjectsSelector& vie return myPlanCreator->addRoute(o); } } - if (!viewObjects.getJunctions().empty()) { + if (viewObjects.getAttributeCarrierFront() == viewObjects.getJunctionFront()) { return myPlanCreator->addJunction(viewObjects.getJunctions().front()); } - if (!viewObjects.getLanes().empty()) { + if (viewObjects.getAttributeCarrierFront() == viewObjects.getLaneFront()) { return myPlanCreator->addEdge(viewObjects.getLanes().front()); } - if (!viewObjects.getTAZs().empty()) { + if (viewObjects.getAttributeCarrierFront() == viewObjects.getTAZFront()) { return myPlanCreator->addTAZ(viewObjects.getTAZs().front()); } return false; diff --git a/src/netedit/frames/demand/GNEPersonFrame.cpp b/src/netedit/frames/demand/GNEPersonFrame.cpp index a12c74b6145a..680bd3174be4 100644 --- a/src/netedit/frames/demand/GNEPersonFrame.cpp +++ b/src/netedit/frames/demand/GNEPersonFrame.cpp @@ -127,13 +127,13 @@ GNEPersonFrame::addPerson(const GNEViewNetHelper::ViewObjectsSelector& viewObjec return myPlanCreator->addRoute(o); } } - if (!viewObjects.getJunctions().empty()) { + if (viewObjects.getAttributeCarrierFront() == viewObjects.getJunctionFront()) { return myPlanCreator->addJunction(viewObjects.getJunctions().front()); } - if (!viewObjects.getLanes().empty()) { + if (viewObjects.getAttributeCarrierFront() == viewObjects.getLaneFront()) { return myPlanCreator->addEdge(viewObjects.getLanes().front()); } - if (!viewObjects.getTAZs().empty()) { + if (viewObjects.getAttributeCarrierFront() == viewObjects.getTAZFront()) { return myPlanCreator->addTAZ(viewObjects.getTAZs().front()); } return false; diff --git a/src/netimport/NIImporter_ArcView.cpp b/src/netimport/NIImporter_ArcView.cpp index 8c9c079c2308..a2641f78d9b7 100644 --- a/src/netimport/NIImporter_ArcView.cpp +++ b/src/netimport/NIImporter_ArcView.cpp @@ -74,27 +74,28 @@ NIImporter_ArcView::loadNetwork(const OptionsCont& oc, NBNetBuilder& nb) { return; } // check whether the correct set of entries is given - // and compute both file names - std::string dbf_file = oc.getString("shapefile-prefix") + ".dbf"; - std::string shp_file = oc.getString("shapefile-prefix") + ".shp"; - std::string shx_file = oc.getString("shapefile-prefix") + ".shx"; - // check whether the files do exist - if (!FileHelpers::isReadable(dbf_file)) { - WRITE_ERROR("File not accessible: " + dbf_file); - } - if (!FileHelpers::isReadable(shp_file)) { - WRITE_ERROR("File not accessible: " + shp_file); - } - if (!FileHelpers::isReadable(shx_file)) { - WRITE_ERROR("File not accessible: " + shx_file); + // and compute all file names + const std::string dbf_file = oc.getString("shapefile-prefix") + ".dbf"; + const std::string shp_file = oc.getString("shapefile-prefix") + ".shp"; + const std::string shx_file = oc.getString("shapefile-prefix") + ".shx"; + if (!StringUtils::startsWith(shp_file, "/vsi")) { + // if we are not using a virtual file system, check whether the files do exist + if (!FileHelpers::isReadable(dbf_file)) { + WRITE_ERROR("File not accessible: " + dbf_file); + } + if (!FileHelpers::isReadable(shp_file)) { + WRITE_ERROR("File not accessible: " + shp_file); + } + if (!FileHelpers::isReadable(shx_file)) { + WRITE_ERROR("File not accessible: " + shx_file); + } } if (MsgHandler::getErrorInstance()->wasInformed()) { return; } // load the arcview files - NIImporter_ArcView loader(oc, - nb.getNodeCont(), nb.getEdgeCont(), nb.getTypeCont(), - dbf_file, shp_file, oc.getBool("speed-in-kmh")); + NIImporter_ArcView loader(oc, nb.getNodeCont(), nb.getEdgeCont(), nb.getTypeCont(), + shp_file, oc.getBool("speed-in-kmh")); loader.load(); } @@ -107,7 +108,6 @@ NIImporter_ArcView::NIImporter_ArcView(const OptionsCont& oc, NBNodeCont& nc, NBEdgeCont& ec, NBTypeCont& tc, - const std::string& dbf_name, const std::string& shp_name, bool speedInKMH) : myOptions(oc), mySHPName(shp_name), @@ -116,7 +116,6 @@ NIImporter_ArcView::NIImporter_ArcView(const OptionsCont& oc, mySpeedInKMH(speedInKMH), myRunningEdgeID(0), myRunningNodeID(0) { - UNUSED_PARAMETER(dbf_name); } diff --git a/src/netimport/NIImporter_ArcView.h b/src/netimport/NIImporter_ArcView.h index 0d50d973db5f..5d1d34efb021 100644 --- a/src/netimport/NIImporter_ArcView.h +++ b/src/netimport/NIImporter_ArcView.h @@ -66,13 +66,12 @@ class NIImporter_ArcView { * @param[in] nc The node container to store nodes into * @param[in] ec The edge container to store edges into * @param[in] tc The type container to get edge types from - * @param[in] dbf_name The name of the according database file * @param[in] shp_name The name of the according shape file * @param[in] speedInKMH Whether the speed shall be assumed to be given in km/h */ NIImporter_ArcView(const OptionsCont& oc, NBNodeCont& nc, NBEdgeCont& ec, NBTypeCont& tc, - const std::string& dbf_name, const std::string& shp_name, + const std::string& shp_name, bool speedInKMH); /// @brief Destructor diff --git a/src/netload/NLHandler.cpp b/src/netload/NLHandler.cpp index 30ba041aec6c..f0ce98c2ecf3 100644 --- a/src/netload/NLHandler.cpp +++ b/src/netload/NLHandler.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -289,6 +290,9 @@ NLHandler::myStartElement(int element, case SUMO_TAG_BIDI_PREDECESSOR: myLastParameterised.push_back(addPredecessorConstraint(element, attrs, myConstrainedSignal)); break; + case SUMO_TAG_DEADLOCK: + addDeadlock(attrs); + break; default: break; } @@ -1722,6 +1726,23 @@ NLHandler::addMesoEdgeType(const SUMOSAXAttributes& attrs) { } } +void +NLHandler::addDeadlock(const SUMOSAXAttributes& attrs) { + bool ok = true; + std::vector signalIDs = attrs.get>(SUMO_ATTR_SIGNALS, nullptr, ok); + std::vector signals; + for (const std::string& id : signalIDs) { + const MSTrafficLightLogic* tll = myJunctionControlBuilder.getTLLogicControlToUse().getActive(id); + const MSRailSignal* rs = dynamic_cast(tll); + if (rs != nullptr) { + signals.push_back(rs); + } else { + throw InvalidArgument("Rail signal '" + toString(id) + "' in " + toString(SUMO_TAG_DEADLOCK) + " is not known"); + } + } + MSRailSignalControl::getInstance().addDeadlockCheck(signals); +} + // ---------------------------------- void NLHandler::endE3Detector() { diff --git a/src/netload/NLHandler.h b/src/netload/NLHandler.h index cc6daeb4c041..74daada7eff4 100644 --- a/src/netload/NLHandler.h +++ b/src/netload/NLHandler.h @@ -214,6 +214,11 @@ class NLHandler : public MSRouteHandler { */ virtual void addMesoEdgeType(const SUMOSAXAttributes& attrs); + /** @brief Loads deadlock information for preparing additional rail signal checks + * @param[in] attrs The attributes that hold the parameters + */ + virtual void addDeadlock(const SUMOSAXAttributes& attrs); + /// Closes the process of building an edge virtual void closeEdge(); diff --git a/src/polyconvert/PCLoaderArcView.cpp b/src/polyconvert/PCLoaderArcView.cpp index e531230d3355..9bc757190856 100644 --- a/src/polyconvert/PCLoaderArcView.cpp +++ b/src/polyconvert/PCLoaderArcView.cpp @@ -101,7 +101,7 @@ PCLoaderArcView::toShape(OGRLineString* geom, const std::string& tid) { Position pos(geom->getX(j), geom->getY(j)); #else for (const OGRPoint& p : *geom) { - Position pos(p.getX(), p.getY()); + Position pos(p.getX(), p.getY(), p.Is3D() ? p.getZ() : 0.0); #endif if (!geoConvHelper.x2cartesian(pos)) { WRITE_ERRORF(TL("Unable to project coordinates for polygon '%'."), tid); @@ -227,7 +227,8 @@ PCLoaderArcView::load(const std::string& file, OptionsCont& oc, PCPolyContainer& } OGRwkbGeometryType gtype = poGeometry->getGeometryType(); switch (gtype) { - case wkbPoint: { + case wkbPoint: + case wkbPoint25D: { OGRPoint* cgeom = (OGRPoint*) poGeometry; Position pos(cgeom->getX(), cgeom->getY()); if (!geoConvHelper.x2cartesian(pos)) { @@ -248,7 +249,8 @@ PCLoaderArcView::load(const std::string& file, OptionsCont& oc, PCPolyContainer& } } break; - case wkbPolygon: { + case wkbPolygon: + case wkbPolygon25D: { const bool fill = fillType < 0 || fillType == 1; const PositionVector shape = toShape(((OGRPolygon*) poGeometry)->getExteriorRing(), id); SUMOPolygon* poly = new SUMOPolygon(id, type, color, shape, false, fill, 1, layer, angle, imgFile); @@ -257,7 +259,8 @@ PCLoaderArcView::load(const std::string& file, OptionsCont& oc, PCPolyContainer& } } break; - case wkbMultiPoint: { + case wkbMultiPoint: + case wkbMultiPoint25D: { OGRMultiPoint* cgeom = (OGRMultiPoint*) poGeometry; for (int i = 0; i < cgeom->getNumGeometries(); ++i) { OGRPoint* cgeom2 = (OGRPoint*) cgeom->getGeometryRef(i); @@ -273,7 +276,8 @@ PCLoaderArcView::load(const std::string& file, OptionsCont& oc, PCPolyContainer& } } break; - case wkbMultiLineString: { + case wkbMultiLineString: + case wkbMultiLineString25D: { OGRMultiLineString* cgeom = (OGRMultiLineString*) poGeometry; for (int i = 0; i < cgeom->getNumGeometries(); ++i) { const std::string tid = id + "#" + toString(i); @@ -285,7 +289,8 @@ PCLoaderArcView::load(const std::string& file, OptionsCont& oc, PCPolyContainer& } } break; - case wkbMultiPolygon: { + case wkbMultiPolygon: + case wkbMultiPolygon25D: { const bool fill = fillType < 0 || fillType == 1; OGRMultiPolygon* cgeom = (OGRMultiPolygon*) poGeometry; for (int i = 0; i < cgeom->getNumGeometries(); ++i) { diff --git a/src/polyconvert/polyconvert_main.cpp b/src/polyconvert/polyconvert_main.cpp index 1af08aad2c4a..012d49369991 100644 --- a/src/polyconvert/polyconvert_main.cpp +++ b/src/polyconvert/polyconvert_main.cpp @@ -201,6 +201,9 @@ fillOptions() { oc.doRegister("poi-layer-offset", new Option_Float(0)); oc.addDescription("poi-layer-offset", "Processing", TL("Adds FLOAT to the layer value for each poi (i.e. to raise it above polygons)")); + oc.doRegister("flatten", new Option_Bool(false)); + oc.addDescription("flatten", "Processing", TL("Remove all z-data")); + // building defaults options oc.doRegister("color", new Option_String("0.2,0.5,1.")); oc.addDescription("color", "Building Defaults", TL("Sets STR as default color")); diff --git a/src/utils/geom/GeoConvHelper.cpp b/src/utils/geom/GeoConvHelper.cpp index b01b3cf52511..910ec10bf387 100644 --- a/src/utils/geom/GeoConvHelper.cpp +++ b/src/utils/geom/GeoConvHelper.cpp @@ -89,7 +89,6 @@ GeoConvHelper::GeoConvHelper(const std::string& proj, const Position& offset, } } if (myProjection == nullptr) { - // !!! check pj_errno throw ProcessError(TL("Could not build projection!")); } #endif @@ -102,6 +101,7 @@ void GeoConvHelper::initProj(const std::string& proj) { #ifdef PROJ_VERSION_MAJOR myProjection = proj_create(PJ_DEFAULT_CTX, proj.c_str()); + checkError(myProjection); #else myProjection = pj_init_plus(proj.c_str()); #endif @@ -338,10 +338,9 @@ GeoConvHelper::cartesian2geo(Position& cartesian) const { } #ifdef PROJ_API_FILE #ifdef PROJ_VERSION_MAJOR - PJ_COORD c; - c.xy.x = cartesian.x(); - c.xy.y = cartesian.y(); + PJ_COORD c = proj_coord(cartesian.x(), cartesian.y(), cartesian.z(), 0); c = proj_trans(myProjection, PJ_INV, c); + checkError(myProjection); cartesian.set(proj_todeg(c.lp.lam), proj_todeg(c.lp.phi)); #else projUV p; @@ -357,6 +356,27 @@ GeoConvHelper::cartesian2geo(Position& cartesian) const { } +#ifdef PROJ_API_FILE +bool +GeoConvHelper::checkError(projPJ projection) const { + const int err_no = proj_context_errno(PJ_DEFAULT_CTX); + if (projection == nullptr) { + if (err_no == 0) { + WRITE_WARNING(TL("Failed to create transformation, reason unknown.")); + } else { + WRITE_WARNINGF(TL("Failed to create transformation, %."), proj_context_errno_string(PJ_DEFAULT_CTX, err_no)); + } + return false; + } + if (err_no != 0) { + WRITE_WARNINGF(TL("Failed to transform, %."), proj_context_errno_string(PJ_DEFAULT_CTX, err_no)); + return false; + } + return true; +} +#endif + + bool GeoConvHelper::x2cartesian(Position& from, bool includeInBoundary) { if (includeInBoundary) { @@ -378,12 +398,13 @@ GeoConvHelper::x2cartesian(Position& from, bool includeInBoundary) { " +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs"; #ifdef PROJ_VERSION_MAJOR myInverseProjection = proj_create(PJ_DEFAULT_CTX, myProjString.c_str()); + checkError(myInverseProjection); myGeoProjection = proj_create(PJ_DEFAULT_CTX, "+proj=latlong +datum=WGS84"); + checkError(myGeoProjection); #else myInverseProjection = pj_init_plus(myProjString.c_str()); myGeoProjection = pj_init_plus("+proj=latlong +datum=WGS84"); #endif - //!!! check pj_errno x = ((x - 500000.) / 1000000.) * 3; // continues with UTM } FALLTHROUGH; @@ -393,10 +414,10 @@ GeoConvHelper::x2cartesian(Position& from, bool includeInBoundary) { " +ellps=WGS84 +datum=WGS84 +units=m +no_defs"; #ifdef PROJ_VERSION_MAJOR myProjection = proj_create(PJ_DEFAULT_CTX, myProjString.c_str()); + checkError(myProjection); #else myProjection = pj_init_plus(myProjString.c_str()); #endif - //!!! check pj_errno } break; case DHDN: { @@ -410,10 +431,10 @@ GeoConvHelper::x2cartesian(Position& from, bool includeInBoundary) { " +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs"; #ifdef PROJ_VERSION_MAJOR myProjection = proj_create(PJ_DEFAULT_CTX, myProjString.c_str()); + checkError(myProjection); #else myProjection = pj_init_plus(myProjString.c_str()); #endif - //!!! check pj_errno } break; default: @@ -422,10 +443,9 @@ GeoConvHelper::x2cartesian(Position& from, bool includeInBoundary) { } if (myInverseProjection != nullptr) { #ifdef PROJ_VERSION_MAJOR - PJ_COORD c; - c.xy.x = from.x(); - c.xy.y = from.y(); + PJ_COORD c = proj_coord(from.x(), from.y(), from.z(), 0); c = proj_trans(myInverseProjection, PJ_INV, c); + checkError(myInverseProjection); from.set(proj_todeg(c.lp.lam), proj_todeg(c.lp.phi)); #else double x = from.x(); @@ -450,8 +470,8 @@ GeoConvHelper::x2cartesian(Position& from, bool includeInBoundary) { bool GeoConvHelper::x2cartesian_const(Position& from) const { - double x2 = from.x() * myGeoScale; - double y2 = from.y() * myGeoScale; + const double x2 = from.x() * myGeoScale; + const double y2 = from.y() * myGeoScale; double x = x2 * myCos - y2 * mySin; double y = x2 * mySin + y2 * myCos; if (myProjectionMethod == NONE) { @@ -470,11 +490,9 @@ GeoConvHelper::x2cartesian_const(Position& from) const { #ifdef PROJ_API_FILE if (myProjection != nullptr) { #ifdef PROJ_VERSION_MAJOR - PJ_COORD c; - c.lp.lam = proj_torad(x); - c.lp.phi = proj_torad(y); + PJ_COORD c = proj_coord(proj_torad(x), proj_torad(y), from.z(), 0); c = proj_trans(myProjection, PJ_FWD, c); - //!!! check pj_errno + checkError(myProjection); x = c.xy.x; y = c.xy.y; #else diff --git a/src/utils/geom/GeoConvHelper.h b/src/utils/geom/GeoConvHelper.h index da4718019eba..730a70ed5096 100644 --- a/src/utils/geom/GeoConvHelper.h +++ b/src/utils/geom/GeoConvHelper.h @@ -184,6 +184,8 @@ class GeoConvHelper { #ifdef PROJ_API_FILE void initProj(const std::string& proj); + bool checkError(projPJ projection) const; + /// @brief The proj.4-projection to use projPJ myProjection; diff --git a/src/utils/gui/div/GUIViewObjectsHandler.cpp b/src/utils/gui/div/GUIViewObjectsHandler.cpp index fc8dd8665e6a..adaa08f0a8d7 100644 --- a/src/utils/gui/div/GUIViewObjectsHandler.cpp +++ b/src/utils/gui/div/GUIViewObjectsHandler.cpp @@ -89,7 +89,8 @@ GUIViewObjectsHandler::isElementSelected(const GUIGlObject* GLObject) const { bool -GUIViewObjectsHandler::checkBoundaryParentElement(const GUIGlObject* GLObject, const GUIGlObject* parent) { +GUIViewObjectsHandler::checkBoundaryParentElement(const GUIGlObject* GLObject, const GUIGlObject* parent, + const double layer) { // first check if we're selecting for boundary if (!mySelectionBoundary.isInitialised()) { return false; @@ -99,7 +100,7 @@ GUIViewObjectsHandler::checkBoundaryParentElement(const GUIGlObject* GLObject, c // if parent was found and was inserted with full boundary, insert it if (finder != mySelectedObjects.end() && finder->second && !isElementSelected(GLObject)) { // insert element with full boundary - return addElementUnderCursor(GLObject, false, true); + return addElementUnderCursor(GLObject, layer, false, true); } else { return false; } @@ -108,7 +109,7 @@ GUIViewObjectsHandler::checkBoundaryParentElement(const GUIGlObject* GLObject, c bool GUIViewObjectsHandler::checkCircleElement(const GUIVisualizationSettings::Detail d, const GUIGlObject* GLObject, - const Position& center, const double radius, const Boundary& circleBoundary) { + const Position& center, const double radius, const Boundary& circleBoundary, const double layer) { // first check that object doesn't exist if (isElementSelected(GLObject)) { return false; @@ -125,16 +126,16 @@ GUIViewObjectsHandler::checkCircleElement(const GUIVisualizationSettings::Detail } // check if selection boundary contains the centering boundary of object if (mySelectionBoundary.contains(GLObject->getCenteringBoundary())) { - return addElementUnderCursor(GLObject, false, true); + return addElementUnderCursor(GLObject, layer, false, true); } // check if boundary overlaps if (mySelectionBoundary.overlapsWith(circleBoundary)) { - return addElementUnderCursor(GLObject, false, false); + return addElementUnderCursor(GLObject, layer, false, false); } // check if the four boundary vertex are within circle for (const auto& vertex : mySelectionBoundaryShape) { if (vertex.distanceSquaredTo2D(center) <= squaredRadius) { - return addElementUnderCursor(GLObject, false, false); + return addElementUnderCursor(GLObject, layer, false, false); } } // no intersection, then return false @@ -142,7 +143,7 @@ GUIViewObjectsHandler::checkCircleElement(const GUIVisualizationSettings::Detail } else { // check if center is within mySelectionBoundary if (mySelectionBoundary.around2D(center)) { - return addElementUnderCursor(GLObject, false, false); + return addElementUnderCursor(GLObject, layer, false, false); } else { return false; } @@ -150,7 +151,7 @@ GUIViewObjectsHandler::checkCircleElement(const GUIVisualizationSettings::Detail } else if (mySelectionPosition != Position::INVALID) { // check distance between selection position and center if (mySelectionPosition.distanceSquaredTo2D(center) <= squaredRadius) { - return addElementUnderCursor(GLObject, false, false); + return addElementUnderCursor(GLObject, layer, false, false); } else { return false; } @@ -163,7 +164,7 @@ GUIViewObjectsHandler::checkCircleElement(const GUIVisualizationSettings::Detail bool GUIViewObjectsHandler::checkGeometryPoint(const GUIVisualizationSettings::Detail d, const GUIGlObject* GLObject, - const PositionVector& shape, const int index, const double radius) { + const PositionVector& shape, const int index, const double layer, const double radius) { // obtain geometry point pos const auto geometryPointPos = shape[index]; // declare squared radius @@ -178,14 +179,14 @@ GUIViewObjectsHandler::checkGeometryPoint(const GUIVisualizationSettings::Detail geometryPointBoundary.grow(radius); // check if boundary is whithin selection boundary if (mySelectionBoundary.contains(geometryPointBoundary)) { - return addGeometryPointUnderCursor(GLObject, index); + return addGeometryPointUnderCursor(GLObject, index, layer); } else if (mySelectionBoundary.overlapsWith(geometryPointBoundary)) { - return addGeometryPointUnderCursor(GLObject, index); + return addGeometryPointUnderCursor(GLObject, index, layer); } else { // check if the four boundary vertex are within circle for (const auto& vertex : mySelectionBoundaryShape) { if (vertex.distanceSquaredTo2D(geometryPointPos) <= squaredRadius) { - return addGeometryPointUnderCursor(GLObject, index); + return addGeometryPointUnderCursor(GLObject, index, layer); } } // no intersection, then return false @@ -194,7 +195,7 @@ GUIViewObjectsHandler::checkGeometryPoint(const GUIVisualizationSettings::Detail } else { // check if center is within mySelectionBoundary if (mySelectionBoundary.around2D(geometryPointPos)) { - return addGeometryPointUnderCursor(GLObject, index); + return addGeometryPointUnderCursor(GLObject, index, layer); } else { return false; } @@ -202,7 +203,7 @@ GUIViewObjectsHandler::checkGeometryPoint(const GUIVisualizationSettings::Detail } else if (mySelectionPosition != Position::INVALID) { // check distance between selection position and center if (mySelectionPosition.distanceSquaredTo2D(geometryPointPos) <= squaredRadius) { - return addGeometryPointUnderCursor(GLObject, index); + return addGeometryPointUnderCursor(GLObject, index, layer); } else { return false; } @@ -214,7 +215,7 @@ GUIViewObjectsHandler::checkGeometryPoint(const GUIVisualizationSettings::Detail bool GUIViewObjectsHandler::checkPositionOverShape(const GUIVisualizationSettings::Detail d, const GUIGlObject* GLObject, - const PositionVector& shape, const double distance) { + const PositionVector& shape, const double layer, const double distance) { // only process if we're selecting a precise position if ((mySelectionPosition != Position::INVALID) && (d <= GUIVisualizationSettings::Detail::PreciseSelection)) { // obtain nearest position over shape @@ -222,7 +223,7 @@ GUIViewObjectsHandler::checkPositionOverShape(const GUIVisualizationSettings::De const auto nearestPos = shape.positionAtOffset2D(nearestOffset); // check distance nearest position and pos if (mySelectionPosition.distanceSquaredTo2D(nearestPos) <= (distance * distance)) { - return addPositionOverShape(GLObject, nearestPos, nearestOffset); + return addPositionOverShape(GLObject, nearestPos, layer, nearestOffset); } else { return false; } @@ -234,7 +235,7 @@ GUIViewObjectsHandler::checkPositionOverShape(const GUIVisualizationSettings::De bool GUIViewObjectsHandler::checkShapeElement(const GUIGlObject* GLObject, const PositionVector& shape, - const Boundary& shapeBoundary) { + const Boundary& shapeBoundary, const double layer) { // first check that object doesn't exist if (isElementSelected(GLObject)) { return false; @@ -245,12 +246,12 @@ GUIViewObjectsHandler::checkShapeElement(const GUIGlObject* GLObject, const Posi } // check if selection boundary contains the centering boundary of object if (mySelectionBoundary.contains(shapeBoundary)) { - return addElementUnderCursor(GLObject, false, true); + return addElementUnderCursor(GLObject, layer, false, true); } // check if shape crosses to selection boundary for (int i = 1; i < (int)shape.size(); i++) { if (mySelectionBoundary.crosses(shape[i - 1], shape[i])) { - return addElementUnderCursor(GLObject, false, false); + return addElementUnderCursor(GLObject, layer, false, false); } } // no intersection, then return false @@ -258,7 +259,7 @@ GUIViewObjectsHandler::checkShapeElement(const GUIGlObject* GLObject, const Posi } else if (mySelectionPosition != Position::INVALID) { // check if selection position is around shape if (shape.around(mySelectionPosition)) { - return addElementUnderCursor(GLObject, false, false); + return addElementUnderCursor(GLObject, layer, false, false); } else { return false; } @@ -269,20 +270,14 @@ GUIViewObjectsHandler::checkShapeElement(const GUIGlObject* GLObject, const Posi bool -GUIViewObjectsHandler::addElementUnderCursor(const GUIGlObject* GLObject, const bool checkDuplicated, const bool fullBoundary) { +GUIViewObjectsHandler::addElementUnderCursor(const GUIGlObject* GLObject, const double layer, + const bool checkDuplicated, const bool fullBoundary) { // first check that object doesn't exist if (checkDuplicated && isElementSelected(GLObject)) { return false; } else { - // check if this is an element with an associated layer - const auto layer = dynamic_cast(GLObject); - if (layer) { - auto& layerContainer = mySortedSelectedObjects[layer->getShapeLayer() * -1]; - layerContainer.insert(layerContainer.begin(), ObjectContainer(GLObject)); - } else if (GLObject) { - auto& layerContainer = mySortedSelectedObjects[GLObject->getType() * -1]; - layerContainer.insert(layerContainer.begin(), ObjectContainer(GLObject)); - } + auto& layerContainer = mySortedSelectedObjects[layer * -1]; + layerContainer.insert(layerContainer.begin(), ObjectContainer(GLObject)); mySelectedObjects[GLObject] = fullBoundary; return true; } @@ -290,7 +285,8 @@ GUIViewObjectsHandler::addElementUnderCursor(const GUIGlObject* GLObject, const bool -GUIViewObjectsHandler::addGeometryPointUnderCursor(const GUIGlObject* GLObject, const int newIndex) { +GUIViewObjectsHandler::addGeometryPointUnderCursor(const GUIGlObject* GLObject, const int newIndex, + const double layer) { // avoid to insert duplicated elements for (auto& elementLayer : mySortedSelectedObjects) { for (auto& element : elementLayer.second) { @@ -308,23 +304,17 @@ GUIViewObjectsHandler::addGeometryPointUnderCursor(const GUIGlObject* GLObject, } } // no element found then add it - const auto layer = dynamic_cast(GLObject); - if (layer) { - auto& layerContainer = mySortedSelectedObjects[layer->getShapeLayer() * -1]; - auto it = layerContainer.insert(layerContainer.begin(), ObjectContainer(GLObject)); - it->geometryPoints.push_back(newIndex); - } else if (GLObject) { - auto& layerContainer = mySortedSelectedObjects[GLObject->getType() * -1]; - auto it = layerContainer.insert(layerContainer.begin(), ObjectContainer(GLObject)); - it->geometryPoints.push_back(newIndex); - } + auto& layerContainer = mySortedSelectedObjects[layer * -1]; + auto it = layerContainer.insert(layerContainer.begin(), ObjectContainer(GLObject)); + it->geometryPoints.push_back(newIndex); mySelectedObjects[GLObject] = false; return true; } bool -GUIViewObjectsHandler::addPositionOverShape(const GUIGlObject* GLObject, const Position& pos, const double offset) { +GUIViewObjectsHandler::addPositionOverShape(const GUIGlObject* GLObject, const Position& pos, const double layer, + const double offset) { // avoid to insert duplicated elements for (auto& elementLayer : mySortedSelectedObjects) { for (auto& element : elementLayer.second) { @@ -341,16 +331,9 @@ GUIViewObjectsHandler::addPositionOverShape(const GUIGlObject* GLObject, const P } } // no element found then add it - const auto layer = dynamic_cast(GLObject); - if (layer) { - auto& layerContainer = mySortedSelectedObjects[layer->getShapeLayer() * -1]; - auto it = layerContainer.insert(layerContainer.begin(), ObjectContainer(GLObject)); - it->posOverShape = pos; - } else if (GLObject) { - auto& layerContainer = mySortedSelectedObjects[GLObject->getType() * -1]; - auto it = layerContainer.insert(layerContainer.begin(), ObjectContainer(GLObject)); - it->posOverShape = pos; - } + auto& layerContainer = mySortedSelectedObjects[layer * -1]; + auto it = layerContainer.insert(layerContainer.begin(), ObjectContainer(GLObject)); + it->posOverShape = pos; mySelectedObjects[GLObject] = false; return true; } diff --git a/src/utils/gui/div/GUIViewObjectsHandler.h b/src/utils/gui/div/GUIViewObjectsHandler.h index 3d3381f32a7b..a7eb25a3683a 100644 --- a/src/utils/gui/div/GUIViewObjectsHandler.h +++ b/src/utils/gui/div/GUIViewObjectsHandler.h @@ -85,32 +85,34 @@ class GUIViewObjectsHandler { bool isElementSelected(const GUIGlObject* GLObject) const; /// @brief check boundary parent element - bool checkBoundaryParentElement(const GUIGlObject* GLObject, const GUIGlObject* parent); + bool checkBoundaryParentElement(const GUIGlObject* GLObject, const GUIGlObject* parent, const double layer); /// @brief check if mouse is within elements geometry (for circles) bool checkCircleElement(const GUIVisualizationSettings::Detail d, const GUIGlObject* GLObject, - const Position& center, const double radius, const Boundary& circleBoundary); + const Position& center, const double radius, const Boundary& circleBoundary, + const double layer); /// @brief check if mouse is within geometry point bool checkGeometryPoint(const GUIVisualizationSettings::Detail d, const GUIGlObject* GLObject, - const PositionVector& shape, const int index, const double radius); + const PositionVector& shape, const int index, const double layer, const double radius); /// @brief check if mouse is within geometry point bool checkPositionOverShape(const GUIVisualizationSettings::Detail d, const GUIGlObject* GLObject, - const PositionVector& shape, const double distance); + const PositionVector& shape, const double layer, const double distance); /// @brief check (closed) shape element bool checkShapeElement(const GUIGlObject* GLObject, const PositionVector& shape, - const Boundary& shapeBoundary); + const Boundary& shapeBoundary, const double layer); /// @brief add element into list of elements under cursor - bool addElementUnderCursor(const GUIGlObject* GLObject, const bool checkDuplicated, const bool fullBoundary); + bool addElementUnderCursor(const GUIGlObject* GLObject, const double layer, const bool checkDuplicated, + const bool fullBoundary); /// @brief add geometryPoint into list of elements under cursor - bool addGeometryPointUnderCursor(const GUIGlObject* GLObject, const int newIndex); + bool addGeometryPointUnderCursor(const GUIGlObject* GLObject, const int newIndex, const double layer); /// @brief add position over shape - bool addPositionOverShape(const GUIGlObject* GLObject, const Position& pos, const double offset); + bool addPositionOverShape(const GUIGlObject* GLObject, const Position& pos, const double layer, const double offset); /// @brief get all elements under cursor sorted by layer const GLObjectsSortedContainer& getSelectedObjects() const; diff --git a/src/utils/vehicle/SUMOTrafficObject.h b/src/utils/vehicle/SUMOTrafficObject.h index 3c7370467630..fc9a14834f04 100644 --- a/src/utils/vehicle/SUMOTrafficObject.h +++ b/src/utils/vehicle/SUMOTrafficObject.h @@ -145,6 +145,13 @@ class SUMOTrafficObject : public Named { */ virtual const MSLane* getLane() const = 0; + /** @brief Returns the lane the where the rear of the object is currently at + * + * @return The current back lane or nullptr if the object is not on a lane + */ + virtual const MSLane* getBackLane() const = 0; + + /// @brief return index of edge within route virtual int getRoutePosition() const = 0; diff --git a/src/utils/vehicle/SUMOVehicle.h b/src/utils/vehicle/SUMOVehicle.h index c8e8555f45e0..c697d5aa0b6b 100644 --- a/src/utils/vehicle/SUMOVehicle.h +++ b/src/utils/vehicle/SUMOVehicle.h @@ -296,6 +296,9 @@ class SUMOVehicle : public SUMOTrafficObject { /// @brief Returns the remaining stop duration for a stopped vehicle or 0 virtual SUMOTime remainingStopDuration() const = 0; + /** @brief Returns whether the vehicle is at a stop and waiting for a person or container to continue + */ + virtual bool isStopped() const = 0; /** @brief Returns whether the vehicle is at a stop and waiting for a person or container to continue */ virtual bool isStoppedTriggered() const = 0; diff --git a/src/utils/vehicle/SUMOVehicleParameter.cpp b/src/utils/vehicle/SUMOVehicleParameter.cpp index 43cc19bc21e8..712946ac676a 100644 --- a/src/utils/vehicle/SUMOVehicleParameter.cpp +++ b/src/utils/vehicle/SUMOVehicleParameter.cpp @@ -189,8 +189,8 @@ SUMOVehicleParameter::write(OutputDevice& dev, const OptionsCont& oc, const Sumo if (wasSet(VEHPARS_CALIBRATORSPEED_SET)) { dev.writeAttr(SUMO_ATTR_SPEED, calibratorSpeed); } - // speed (only used by calibrators) - if (insertionChecks != (int)InsertionCheck::ALL) { + // insertionChecks + if (wasSet(VEHPARS_INSERTION_CHECKS_SET) && insertionChecks != (int)InsertionCheck::ALL) { std::vector checks; if (insertionChecks == (int)InsertionCheck::NONE) { checks.push_back(toString(InsertionCheck::NONE)); @@ -1121,19 +1121,25 @@ SUMOVehicleParameter::areInsertionChecksValid(const std::string& value) const { } -void +int SUMOVehicleParameter::parseInsertionChecks(const std::string& value) { // first reset insertionChecks - insertionChecks = 0; + int result = 0; if (value.empty()) { - insertionChecks = (int)InsertionCheck::ALL; + return (int)InsertionCheck::ALL; } else { // split value in substrinsg StringTokenizer insertionCheckStrs(value, " "); while (insertionCheckStrs.hasNext()) { - insertionChecks |= (int)SUMOXMLDefinitions::InsertionChecks.get(insertionCheckStrs.next()); + std::string val = insertionCheckStrs.next(); + if (SUMOXMLDefinitions::InsertionChecks.hasString(val)) { + result |= (int)SUMOXMLDefinitions::InsertionChecks.get(val); + } else { + throw InvalidArgument("Unknown value '" + val + "' in " + toString(SUMO_ATTR_INSERTIONCHECKS) + "."); + } } } + return result; } /****************************************************************************/ diff --git a/src/utils/vehicle/SUMOVehicleParameter.h b/src/utils/vehicle/SUMOVehicleParameter.h index 893739ceccc4..99886c67de1c 100644 --- a/src/utils/vehicle/SUMOVehicleParameter.h +++ b/src/utils/vehicle/SUMOVehicleParameter.h @@ -40,38 +40,39 @@ class OptionsCont; // =========================================================================== // value definitions // =========================================================================== -const int VEHPARS_COLOR_SET = 1; -const int VEHPARS_VTYPE_SET = 2; -const int VEHPARS_DEPARTLANE_SET = 2 << 1; -const int VEHPARS_DEPARTPOS_SET = 2 << 2; -const int VEHPARS_DEPARTSPEED_SET = 2 << 3; -const int VEHPARS_END_SET = 2 << 4; -const int VEHPARS_NUMBER_SET = 2 << 5; -const int VEHPARS_PERIOD_SET = 2 << 6; -const int VEHPARS_VPH_SET = 2 << 7; -const int VEHPARS_PROB_SET = 2 << 8; -const int VEHPARS_POISSON_SET = 2 << 9; -const int VEHPARS_ROUTE_SET = 2 << 10; -const int VEHPARS_ARRIVALLANE_SET = 2 << 11; -const int VEHPARS_ARRIVALPOS_SET = 2 << 12; -const int VEHPARS_ARRIVALSPEED_SET = 2 << 13; -const int VEHPARS_LINE_SET = 2 << 14; -const int VEHPARS_FROM_TAZ_SET = 2 << 15; -const int VEHPARS_TO_TAZ_SET = 2 << 16; -const int VEHPARS_FORCE_REROUTE = 2 << 17; -const int VEHPARS_PERSON_CAPACITY_SET = 2 << 18; -const int VEHPARS_PERSON_NUMBER_SET = 2 << 19; -const int VEHPARS_CONTAINER_NUMBER_SET = 2 << 20; -const int VEHPARS_DEPARTPOSLAT_SET = 2 << 21; -const int VEHPARS_ARRIVALPOSLAT_SET = 2 << 22; -const int VEHPARS_VIA_SET = 2 << 23; -const int VEHPARS_SPEEDFACTOR_SET = 2 << 24; -const int VEHPARS_DEPARTEDGE_SET = 2 << 25; -const int VEHPARS_ARRIVALEDGE_SET = 2 << 26; -const int VEHPARS_CALIBRATORSPEED_SET = 2 << 27; -const int VEHPARS_JUNCTIONMODEL_PARAMS_SET = 2 << 28; -const int VEHPARS_CFMODEL_PARAMS_SET = 2 << 29; -const int VEHPARS_PARKING_BADGES_SET = 2 << 30; +const long long int VEHPARS_COLOR_SET = 1; +const long long int VEHPARS_VTYPE_SET = 2; +const long long int VEHPARS_DEPARTLANE_SET = 2 << 1; +const long long int VEHPARS_DEPARTPOS_SET = 2 << 2; +const long long int VEHPARS_DEPARTSPEED_SET = 2 << 3; +const long long int VEHPARS_END_SET = 2 << 4; +const long long int VEHPARS_NUMBER_SET = 2 << 5; +const long long int VEHPARS_PERIOD_SET = 2 << 6; +const long long int VEHPARS_VPH_SET = 2 << 7; +const long long int VEHPARS_PROB_SET = 2 << 8; +const long long int VEHPARS_POISSON_SET = 2 << 9; +const long long int VEHPARS_ROUTE_SET = 2 << 10; +const long long int VEHPARS_ARRIVALLANE_SET = 2 << 11; +const long long int VEHPARS_ARRIVALPOS_SET = 2 << 12; +const long long int VEHPARS_ARRIVALSPEED_SET = 2 << 13; +const long long int VEHPARS_LINE_SET = 2 << 14; +const long long int VEHPARS_FROM_TAZ_SET = 2 << 15; +const long long int VEHPARS_TO_TAZ_SET = 2 << 16; +const long long int VEHPARS_FORCE_REROUTE = 2 << 17; +const long long int VEHPARS_PERSON_CAPACITY_SET = 2 << 18; +const long long int VEHPARS_PERSON_NUMBER_SET = 2 << 19; +const long long int VEHPARS_CONTAINER_NUMBER_SET = 2 << 20; +const long long int VEHPARS_DEPARTPOSLAT_SET = 2 << 21; +const long long int VEHPARS_ARRIVALPOSLAT_SET = 2 << 22; +const long long int VEHPARS_VIA_SET = 2 << 23; +const long long int VEHPARS_SPEEDFACTOR_SET = 2 << 24; +const long long int VEHPARS_DEPARTEDGE_SET = 2 << 25; +const long long int VEHPARS_ARRIVALEDGE_SET = 2 << 26; +const long long int VEHPARS_CALIBRATORSPEED_SET = 2 << 27; +const long long int VEHPARS_JUNCTIONMODEL_PARAMS_SET = 2 << 28; +const long long int VEHPARS_CFMODEL_PARAMS_SET = 2 << 29; +const long long int VEHPARS_PARKING_BADGES_SET = 2 << 30; +const long long int VEHPARS_INSERTION_CHECKS_SET = (long long int)2 << 31; const int STOP_INDEX_END = -1; const int STOP_INDEX_FIT = -2; @@ -487,7 +488,7 @@ class SUMOVehicleParameter : public Parameterised { * @param[in] what The parameter which one asks for * @return Whether the given parameter was set */ - bool wasSet(int what) const { + bool wasSet(long long int what) const { return (parametersSet & what) != 0; } @@ -658,6 +659,9 @@ class SUMOVehicleParameter : public Parameterised { /// @brief parses parking type value static ParkingType parseParkingType(const std::string& value); + /// @brief parses insertion checks + static int parseInsertionChecks(const std::string& value); + /// @brief The vehicle tag SumoXMLTag tag; @@ -812,7 +816,7 @@ class SUMOVehicleParameter : public Parameterised { int insertionChecks; /// @brief Information for the router which parameter were set, TraCI may modify this (when changing color) - mutable int parametersSet; + mutable long long int parametersSet; public: /// @brief increment flow @@ -858,6 +862,4 @@ class SUMOVehicleParameter : public Parameterised { /// @brief check if given insertion checks are valid bool areInsertionChecksValid(const std::string& value) const; - /// @brief parses insertion checks - void parseInsertionChecks(const std::string& value); }; diff --git a/src/utils/vehicle/SUMOVehicleParserHelper.cpp b/src/utils/vehicle/SUMOVehicleParserHelper.cpp index 511e94cf6e1f..ecc889f210db 100644 --- a/src/utils/vehicle/SUMOVehicleParserHelper.cpp +++ b/src/utils/vehicle/SUMOVehicleParserHelper.cpp @@ -683,17 +683,16 @@ SUMOVehicleParserHelper::parseCommonAttributes(const SUMOSAXAttributes& attrs, S } // parse insertion checks if (attrs.hasAttribute(SUMO_ATTR_INSERTIONCHECKS)) { - ret->insertionChecks = 0; + ret->parametersSet |= VEHPARS_INSERTION_CHECKS_SET; bool ok = true; - std::vector checks = attrs.get >(SUMO_ATTR_INSERTIONCHECKS, ret->id.c_str(), ok); + std::string checks = attrs.get(SUMO_ATTR_INSERTIONCHECKS, ret->id.c_str(), ok); if (!ok) { handleVehicleError(true, ret); } else { - for (std::string check : checks) { - if (!SUMOXMLDefinitions::InsertionChecks.hasString(check)) { - handleVehicleError(true, ret, "Unknown value '" + check + "' in " + toString(SUMO_ATTR_INSERTIONCHECKS)); - } - ret->insertionChecks |= (int)SUMOXMLDefinitions::InsertionChecks.get(check); + try { + ret->insertionChecks = SUMOVehicleParameter::parseInsertionChecks(checks); + } catch (InvalidArgument& e) { + handleVehicleError(true, ret, e.what()); } } } diff --git a/src/utils/xml/SUMOXMLDefinitions.cpp b/src/utils/xml/SUMOXMLDefinitions.cpp index f12eebe3263f..f54ac98fd37d 100644 --- a/src/utils/xml/SUMOXMLDefinitions.cpp +++ b/src/utils/xml/SUMOXMLDefinitions.cpp @@ -160,6 +160,9 @@ SequentialStringBijection::Entry SUMOXMLDefinitions::tags[] = { { "insertionOrder", SUMO_TAG_INSERTION_ORDER }, { "bidiPredecessor", SUMO_TAG_BIDI_PREDECESSOR }, { "railSignalConstraintTracker", SUMO_TAG_RAILSIGNAL_CONSTRAINT_TRACKER }, + { "deadlock", SUMO_TAG_DEADLOCK }, + { "driveWay", SUMO_TAG_DRIVEWAY }, + { "subDriveWay", SUMO_TAG_SUBDRIVEWAY }, { "link", SUMO_TAG_LINK }, { "approaching", SUMO_TAG_APPROACHING }, // OSM @@ -1105,6 +1108,7 @@ SequentialStringBijection::Entry SUMOXMLDefinitions::attrs[] = { { "next", SUMO_ATTR_NEXT }, { "foes", SUMO_ATTR_FOES }, { "constraints", SUMO_ATTR_CONSTRAINTS }, + { "rail", SUMO_ATTR_RAIL }, { "detectors", SUMO_ATTR_DETECTORS }, { "conditions", SUMO_ATTR_CONDITIONS }, { "saveDetectors", SUMO_ATTR_SAVE_DETECTORS }, @@ -1282,6 +1286,7 @@ SequentialStringBijection::Entry SUMOXMLDefinitions::attrs[] = { { "arrivalTimeBraking", SUMO_ATTR_ARRIVALTIMEBRAKING }, { "arrivalSpeedBraking", SUMO_ATTR_ARRIVALSPEEDBRAKING }, { "optional", SUMO_ATTR_OPTIONAL }, + { "vehicles", SUMO_ATTR_VEHICLES }, #ifndef WIN32 { "commandPosix", SUMO_ATTR_COMMAND }, diff --git a/src/utils/xml/SUMOXMLDefinitions.h b/src/utils/xml/SUMOXMLDefinitions.h index 6b70d65052aa..5f2d16817403 100644 --- a/src/utils/xml/SUMOXMLDefinitions.h +++ b/src/utils/xml/SUMOXMLDefinitions.h @@ -282,6 +282,11 @@ enum SumoXMLTag { SUMO_TAG_BIDI_PREDECESSOR, /// @brief Saved state for constraint tracker SUMO_TAG_RAILSIGNAL_CONSTRAINT_TRACKER, + /// @brief Saved deadlock information, also for loading as an extra check + SUMO_TAG_DEADLOCK, + /// @brief Saved driveway information + SUMO_TAG_DRIVEWAY, + SUMO_TAG_SUBDRIVEWAY, /// @brief Link information for state-saving SUMO_TAG_LINK, /// @brief Link-approaching vehicle information for state-saving @@ -1474,6 +1479,7 @@ enum SumoXMLAttr { SUMO_ATTR_FOES, /// @} SUMO_ATTR_CONSTRAINTS, + SUMO_ATTR_RAIL, SUMO_ATTR_DETECTORS, SUMO_ATTR_CONDITIONS, @@ -1658,6 +1664,7 @@ enum SumoXMLAttr { SUMO_ATTR_ARRIVALTIMEBRAKING, SUMO_ATTR_ARRIVALSPEEDBRAKING, SUMO_ATTR_OPTIONAL, + SUMO_ATTR_VEHICLES, /// @name ActivityGen Tags /// @{ diff --git a/sumo.doxyconf b/sumo.doxyconf index 16fa2c880e73..fa859160bdb3 100644 --- a/sumo.doxyconf +++ b/sumo.doxyconf @@ -1,4 +1,4 @@ -# Doxyfile 1.9.1 +# Doxyfile 1.9.8 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -12,6 +12,16 @@ # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] #--------------------------------------------------------------------------- # Project related configuration options @@ -60,16 +70,28 @@ PROJECT_LOGO = data/logo/sumo-145x50.png OUTPUT_DIRECTORY = . -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes -# performance problems for the file system. +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. # The default value is: NO. CREATE_SUBDIRS = YES +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# number of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode @@ -81,26 +103,18 @@ ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English -# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all generated output in the proper direction. -# Possible values are: None, LTR, RTL and Context. -# The default value is: None. - -OUTPUT_TEXT_DIRECTION = None - # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. @@ -258,16 +272,16 @@ TAB_SIZE = 4 # the documentation. An alias has the form: # name=value # For example adding -# "sideeffect=@par Side Effects:\n" +# "sideeffect=@par Side Effects:^^" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines (in the resulting output). You can put ^^ in the value part of an -# alias to insert a newline as if a physical newline was in the original file. -# When you need a literal { or } or , in the value part of an alias you have to -# escape them by means of a backslash (\), this can lead to conflicts with the -# commands \{ and \} for these it is advised to use the version @{ and @} or use -# a double escape (\\{ and \\}) +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) ALIASES = @@ -312,8 +326,8 @@ OPTIMIZE_OUTPUT_SLICE = NO # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, JavaScript, -# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL, -# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the # default for Fortran type files). For instance to make doxygen treat .inc files @@ -349,6 +363,17 @@ MARKDOWN_SUPPORT = YES TOC_INCLUDE_HEADINGS = 0 +# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to +# generate identifiers for the Markdown headings. Note: Every identifier is +# unique. +# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a +# sequence number starting at 0 and GITHUB use the lower case version of title +# with any whitespace replaced by '-' and punctuation characters removed. +# The default value is: DOXYGEN. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +MARKDOWN_ID_STYLE = DOXYGEN + # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or @@ -460,19 +485,27 @@ TYPEDEF_HIDES_STRUCT = NO LOOKUP_CACHE_SIZE = 0 -# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use +# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use # during processing. When set to 0 doxygen will based this on the number of # cores available in the system. You can set it explicitly to a value larger # than 0 to get more control over the balance between CPU load and processing # speed. At this moment only the input processing can be done using multiple # threads. Since this is still an experimental feature the default is set to 1, -# which efficively disables parallel processing. Please report any issues you +# which effectively disables parallel processing. Please report any issues you # encounter. Generating dot graphs in parallel is controlled by the # DOT_NUM_THREADS setting. # Minimum value: 0, maximum value: 32, default value: 1. NUM_PROC_THREADS = 1 +# If the TIMESTAMP tag is set different from NO then each generated page will +# contain the date or date and time when the page was generated. Setting this to +# NO can help when comparing the output of multiple runs. +# Possible values are: YES, NO, DATETIME and DATE. +# The default value is: NO. + +TIMESTAMP = YES + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- @@ -554,7 +587,8 @@ HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. +# will also hide undocumented C++ concepts if enabled. This option has no effect +# if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO @@ -585,14 +619,15 @@ INTERNAL_DOCS = YES # filesystem is case sensitive (i.e. it supports files in the same directory # whose names only differ in casing), the option must be set to YES to properly # deal with such files in case they appear in the input. For filesystems that -# are not case sensitive the option should be be set to NO to properly deal with +# are not case sensitive the option should be set to NO to properly deal with # output files written for symbols that only differ in casing, such as for two # classes, one named CLASS and the other named Class, and to also support # references to files without having to specify the exact matching casing. On # Windows (including Cygwin) and MacOS, users should typically set this option # to NO, whereas on Linux or other Unix flavors it should typically be set to # YES. -# The default value is: system dependent. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. CASE_SENSE_NAMES = NO @@ -610,6 +645,12 @@ HIDE_SCOPE_NAMES = NO HIDE_COMPOUND_REFERENCE= NO +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. @@ -767,7 +808,8 @@ FILE_VERSION_FILTER = # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE @@ -813,27 +855,50 @@ WARNINGS = YES WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. If -# EXTRACT_ALL is set to YES then this flag will automatically be disabled. +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC # The default value is: NO. WARN_NO_PARAMDOC = YES +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about +# undocumented enumeration values. If set to NO, doxygen will accept +# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: NO. + +WARN_IF_UNDOC_ENUM_VAL = NO + # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when # a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS # then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but # at the end of the doxygen process doxygen will return with a non-zero status. -# Possible values are: NO, YES and FAIL_ON_WARNINGS. +# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then doxygen behaves +# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined doxygen will not +# write the warning messages in between other messages but write them at the end +# of a run, in case a WARN_LOGFILE is defined the warning messages will be +# besides being in the defined file also be shown at the end of a run, unless +# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case +# the behavior will remain as with the setting FAIL_ON_WARNINGS. +# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. # The default value is: NO. WARN_AS_ERROR = NO @@ -844,13 +909,27 @@ WARN_AS_ERROR = NO # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard -# error (stderr). +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). WARN_LOGFILE = ../sumo_doxygen_lastrun.log @@ -871,10 +950,21 @@ INPUT = ./src # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: # https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING # The default value is: UTF-8. INPUT_ENCODING = UTF-8 +# This tag can be used to specify the character encoding of the source files +# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING) if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding +# "INPUT_ENCODING" for further information on supported encodings. + +INPUT_FILE_ENCODING = + # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. @@ -886,12 +976,12 @@ INPUT_ENCODING = UTF-8 # Note the list of default checked file patterns might differ from the list of # default file extension mappings. # -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, -# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), -# *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, *.vhdl, -# *.ucf, *.qsf and *.ice. +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm, +# *.cpp, *.cppm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, +# *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d, *.php, +# *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be +# provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.c \ *.cc \ @@ -972,10 +1062,7 @@ EXCLUDE_PATTERNS = */.svn/* \ # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* +# ANamespace::AClass, ANamespace::*Test EXCLUDE_SYMBOLS = @@ -1020,6 +1107,11 @@ IMAGE_PATH = # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # +# Note that doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. @@ -1061,6 +1153,15 @@ FILTER_SOURCE_PATTERNS = USE_MDFILE_AS_MAINPAGE = +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 + #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- @@ -1158,9 +1259,11 @@ VERBATIM_HEADERS = YES CLANG_ASSISTED_PARSING = NO -# If clang assisted parsing is enabled and the CLANG_ADD_INC_PATHS tag is set to -# YES then doxygen will add the directory of each input to the include path. +# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS +# tag is set to YES then doxygen will add the directory of each input to the +# include path. # The default value is: YES. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. CLANG_ADD_INC_PATHS = YES @@ -1196,10 +1299,11 @@ CLANG_DATABASE_PATH = ALPHABETICAL_INDEX = YES -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. +# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) +# that should be ignored while generating the index headers. The IGNORE_PREFIX +# tag works for classes, function and member names. The entity will be placed in +# the alphabetical list under the first letter of the entity name that remains +# after removing the prefix. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = @@ -1278,7 +1382,12 @@ HTML_STYLESHEET = # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. +# list). +# Note: Since the styling of scrollbars can currently not be overruled in +# Webkit/Chromium, the styling will be left out of the default doxygen.css if +# one or more extra stylesheets have been specified. So if scrollbar +# customization is desired it has to be added explicitly. For an example see the +# documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = @@ -1293,9 +1402,22 @@ HTML_EXTRA_STYLESHEET = HTML_EXTRA_FILES = +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. +# Possible values are: LIGHT always generate light mode output, DARK always +# generate dark mode output, AUTO_LIGHT automatically set the mode according to +# the user preference, use light mode if no preference is set (the default), +# AUTO_DARK automatically set the mode according to the user preference, use +# dark mode if no preference is set and TOGGLE allow to user to switch between +# light and dark mode via a button. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = AUTO_LIGHT + # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see +# this color. Hue is specified as an angle on a color-wheel, see # https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. @@ -1305,7 +1427,7 @@ HTML_EXTRA_FILES = HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A +# in the HTML output. For a value of 0 the output will use gray-scales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1323,15 +1445,6 @@ HTML_COLORSTYLE_SAT = 100 HTML_COLORSTYLE_GAMMA = 80 -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = YES - # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that # are dynamically created via JavaScript. If disabled, the navigation index will @@ -1351,6 +1464,13 @@ HTML_DYNAMIC_MENUS = YES HTML_DYNAMIC_SECTIONS = NO +# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be +# dynamically folded and expanded in the generated HTML source code. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_CODE_FOLDING = YES + # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to @@ -1387,6 +1507,13 @@ GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. @@ -1412,8 +1539,12 @@ DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: -# https://www.microsoft.com/en-us/download/details.aspx?id=21138) on Windows. +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML @@ -1470,6 +1601,16 @@ BINARY_TOC = NO TOC_EXPAND = NO +# The SITEMAP_URL tag is used to specify the full URL of the place where the +# generated documentation will be placed on the server by the user during the +# deployment of the documentation. The generated sitemap is called sitemap.xml +# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL +# is specified no sitemap is generated. For information about the sitemap +# protocol see https://www.sitemaps.org +# This tag requires that the tag GENERATE_HTML is set to YES. + +SITEMAP_URL = + # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help @@ -1572,16 +1713,28 @@ DISABLE_INDEX = NO # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = YES +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # @@ -1606,6 +1759,13 @@ TREEVIEW_WIDTH = 250 EXT_LINKS_IN_WINDOW = NO +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + # If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg # tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see # https://inkscape.org) to generate formulas as SVG images instead of PNGs for @@ -1626,17 +1786,6 @@ HTML_FORMULA_FORMAT = png FORMULA_FONTSIZE = 10 -# Use the FORMULA_TRANSPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands # to create new LaTeX commands to be used in formulas as building blocks. See # the section "Including formulas" for details. @@ -1654,11 +1803,29 @@ FORMULA_MACROFILE = USE_MATHJAX = NO +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + # When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). # Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1671,15 +1838,21 @@ MATHJAX_FORMAT = HTML-CSS # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of -# MathJax from https://www.mathjax.org before deployment. -# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2. +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = @@ -1859,29 +2032,31 @@ PAPER_TYPE = a4 EXTRA_PACKAGES = -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the -# generated LaTeX document. The header should contain everything until the first -# chapter. If it is left blank doxygen will generate a standard header. See -# section "Doxygen usage" for information on how to let doxygen write the -# default header to a separate file. +# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for +# the generated LaTeX document. The header should contain everything until the +# first chapter. If it is left blank doxygen will generate a standard header. It +# is highly recommended to start with a default header using +# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty +# and then modify the file new_header.tex. See also section "Doxygen usage" for +# information on how to generate the default header that doxygen normally uses. # -# Note: Only use a user-defined header if you know what you are doing! The -# following commands have a special meaning inside the header: $title, -# $datetime, $date, $doxygenversion, $projectname, $projectnumber, -# $projectbrief, $projectlogo. Doxygen will replace $title with the empty -# string, for the replacement values of the other commands the user is referred -# to HTML_HEADER. +# Note: Only use a user-defined header if you know what you are doing! +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. The following +# commands have a special meaning inside the header (and footer): For a +# description of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HEADER = -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the -# generated LaTeX document. The footer should contain everything after the last -# chapter. If it is left blank doxygen will generate a standard footer. See +# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for +# the generated LaTeX document. The footer should contain everything after the +# last chapter. If it is left blank doxygen will generate a standard footer. See # LATEX_HEADER for more information on how to generate a default footer and what -# special commands can be used inside the footer. -# -# Note: Only use a user-defined footer if you know what you are doing! +# special commands can be used inside the footer. See also section "Doxygen +# usage" for information on how to generate the default footer that doxygen +# normally uses. Note: Only use a user-defined footer if you know what you are +# doing! # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_FOOTER = @@ -1924,10 +2099,16 @@ PDF_HYPERLINKS = YES USE_PDFLATEX = YES -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode -# command to the generated LaTeX files. This will instruct LaTeX to keep running -# if errors occur, instead of asking the user for help. This option is also used -# when generating formulas in HTML. +# The LATEX_BATCHMODE tag signals the behavior of LaTeX in case of an error. +# Possible values are: NO same as ERROR_STOP, YES same as BATCH, BATCH In batch +# mode nothing is printed on the terminal, errors are scrolled as if is +# hit at every error; missing files that TeX tries to input or request from +# keyboard input (\read on a not open input stream) cause the job to abort, +# NON_STOP In nonstop mode the diagnostic message will appear on the terminal, +# but there is no possibility of user interaction just like in batch mode, +# SCROLL In scroll mode, TeX will stop only for missing files to input or if +# keyboard input is necessary and ERROR_STOP In errorstop mode, TeX will stop at +# each error, asking for user intervention. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -1940,16 +2121,6 @@ LATEX_BATCHMODE = YES LATEX_HIDE_INDICES = NO -# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source -# code with syntax highlighting in the LaTeX output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_SOURCE_CODE = NO - # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. See # https://en.wikipedia.org/wiki/BibTeX and \cite for more info. @@ -1958,14 +2129,6 @@ LATEX_SOURCE_CODE = NO LATEX_BIB_STYLE = plain -# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated -# page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_TIMESTAMP = NO - # The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute) # path from which the emoji images will be read. If a relative path is entered, # it will be relative to the LATEX_OUTPUT directory. If left blank the @@ -2030,16 +2193,6 @@ RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = -# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code -# with syntax highlighting in the RTF output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_SOURCE_CODE = NO - #--------------------------------------------------------------------------- # Configuration options related to the man page output #--------------------------------------------------------------------------- @@ -2136,27 +2289,44 @@ GENERATE_DOCBOOK = NO DOCBOOK_OUTPUT = docbook -# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the -# program listings (including syntax highlighting and cross-referencing -# information) to the DOCBOOK output. Note that enabling this will significantly -# increase the size of the DOCBOOK output. -# The default value is: NO. -# This tag requires that the tag GENERATE_DOCBOOK is set to YES. - -DOCBOOK_PROGRAMLISTING = NO - #--------------------------------------------------------------------------- # Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an -# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures +# AutoGen Definitions (see https://autogen.sourceforge.net/) file that captures # the structure of the code including all documentation. Note that this feature # is still experimental and incomplete at the moment. # The default value is: NO. GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# Configuration options related to Sqlite3 output +#--------------------------------------------------------------------------- + +# If the GENERATE_SQLITE3 tag is set to YES doxygen will generate a Sqlite3 +# database with symbols found by doxygen stored in tables. +# The default value is: NO. + +GENERATE_SQLITE3 = NO + +# The SQLITE3_OUTPUT tag is used to specify where the Sqlite3 database will be +# put. If a relative path is entered the value of OUTPUT_DIRECTORY will be put +# in front of it. +# The default directory is: sqlite3. +# This tag requires that the tag GENERATE_SQLITE3 is set to YES. + +SQLITE3_OUTPUT = sqlite3 + +# The SQLITE3_OVERWRITE_DB tag is set to YES, the existing doxygen_sqlite3.db +# database file will be recreated with each doxygen run. If set to NO, doxygen +# will warn if an a database file is already found and not modify it. +# The default value is: YES. +# This tag requires that the tag GENERATE_SQLITE3 is set to YES. + +SQLITE3_RECREATE_DB = YES + #--------------------------------------------------------------------------- # Configuration options related to the Perl module output #--------------------------------------------------------------------------- @@ -2231,7 +2401,8 @@ SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by the -# preprocessor. +# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of +# RECURSIVE has no effect here. # This tag requires that the tag SEARCH_INCLUDES is set to YES. INCLUDE_PATH = @@ -2298,15 +2469,15 @@ TAGFILES = GENERATE_TAGFILE = -# If the ALLEXTERNALS tag is set to YES, all external class will be listed in -# the class index. If set to NO, only the inherited external classes will be -# listed. +# If the ALLEXTERNALS tag is set to YES, all external classes and namespaces +# will be listed in the class and namespace index. If set to NO, only the +# inherited external classes will be listed. # The default value is: NO. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will be +# in the topic index. If set to NO, only the current project's groups will be # listed. # The default value is: YES. @@ -2320,25 +2491,9 @@ EXTERNAL_GROUPS = YES EXTERNAL_PAGES = YES #--------------------------------------------------------------------------- -# Configuration options related to the dot tool +# Configuration options related to diagram generator tools #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram -# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to -# NO turns the diagrams off. Note that this option also works with HAVE_DOT -# disabled, but it is recommended to install and use dot, since it yields more -# powerful graphs. -# The default value is: YES. - -CLASS_DIAGRAMS = YES - -# You can include diagrams made with dia in doxygen documentation. Doxygen will -# then run dia to produce the diagram and insert it in the documentation. The -# DIA_PATH tag allows you to specify the directory where the dia binary resides. -# If left empty dia is assumed to be found in the default search path. - -DIA_PATH = - # If set to YES the inheritance and collaboration graphs will hide inheritance # and usage relations if the target is undocumented or is not a class. # The default value is: YES. @@ -2347,7 +2502,7 @@ HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz (see: -# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent +# https://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent # Bell Labs. The other options in this section have no effect if this option is # set to NO # The default value is: YES. @@ -2364,49 +2519,73 @@ HAVE_DOT = YES DOT_NUM_THREADS = 0 -# When you want a differently looking font in the dot files that doxygen -# generates you can specify the font name using DOT_FONTNAME. You need to make -# sure dot is able to find the font, which can be done by putting it in a -# standard location or by setting the DOTFONTPATH environment variable or by -# setting DOT_FONTPATH to the directory containing the font. -# The default value is: Helvetica. +# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of +# subgraphs. When you want a differently looking font in the dot files that +# doxygen generates you can specify fontname, fontcolor and fontsize attributes. +# For details please see Node, +# Edge and Graph Attributes specification You need to make sure dot is able +# to find the font, which can be done by putting it in a standard location or by +# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. Default graphviz fontsize is 14. +# The default value is: fontname=Helvetica,fontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTNAME = Helvetica +DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" -# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of -# dot graphs. -# Minimum value: 4, maximum value: 24, default value: 10. +# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can +# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. Complete documentation about +# arrows shapes. +# The default value is: labelfontname=Helvetica,labelfontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTSIZE = 10 +DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10" -# By default doxygen will tell dot to use the default font as specified with -# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set -# the path where dot can find it using this tag. +# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes +# around nodes set 'shape=plain' or 'shape=plaintext' Shapes specification +# The default value is: shape=box,height=0.2,width=0.4. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" + +# You can set the path where dot can find font specified with fontname in +# DOT_COMMON_ATTR and others dot attributes. # This tag requires that the tag HAVE_DOT is set to YES. DOT_FONTPATH = -# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for -# each documented class showing the direct and indirect inheritance relations. -# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. +# If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then doxygen will +# generate a graph for each documented class showing the direct and indirect +# inheritance relations. In case the CLASS_GRAPH tag is set to YES or GRAPH and +# HAVE_DOT is enabled as well, then dot will be used to draw the graph. In case +# the CLASS_GRAPH tag is set to YES and HAVE_DOT is disabled or if the +# CLASS_GRAPH tag is set to BUILTIN, then the built-in generator will be used. +# If the CLASS_GRAPH tag is set to TEXT the direct and indirect inheritance +# relations will be shown as texts / links. +# Possible values are: NO, YES, TEXT, GRAPH and BUILTIN. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a # graph for each documented class showing the direct and indirect implementation # dependencies (inheritance, containment, and class references variables) of the -# class with other documented classes. +# class with other documented classes. Explicit enabling a collaboration graph, +# when COLLABORATION_GRAPH is set to NO, can be accomplished by means of the +# command \collaborationgraph. Disabling a collaboration graph can be +# accomplished by means of the command \hidecollaborationgraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for -# groups, showing the direct groups dependencies. +# groups, showing the direct groups dependencies. Explicit enabling a group +# dependency graph, when GROUP_GRAPHS is set to NO, can be accomplished by means +# of the command \groupgraph. Disabling a directory graph can be accomplished by +# means of the command \hidegroupgraph. See also the chapter Grouping in the +# manual. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2466,7 +2645,9 @@ TEMPLATE_RELATIONS = NO # If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to # YES then doxygen will generate a graph for each documented file showing the # direct and indirect include dependencies of the file with other documented -# files. +# files. Explicit enabling an include graph, when INCLUDE_GRAPH is is set to NO, +# can be accomplished by means of the command \includegraph. Disabling an +# include graph can be accomplished by means of the command \hideincludegraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2475,7 +2656,10 @@ INCLUDE_GRAPH = YES # If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are # set to YES then doxygen will generate a graph for each documented file showing # the direct and indirect include dependencies of the file with other documented -# files. +# files. Explicit enabling an included by graph, when INCLUDED_BY_GRAPH is set +# to NO, can be accomplished by means of the command \includedbygraph. Disabling +# an included by graph can be accomplished by means of the command +# \hideincludedbygraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2515,23 +2699,32 @@ GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the # dependencies a directory has on other directories in a graphical way. The # dependency relations are determined by the #include relations between the -# files in the directories. +# files in the directories. Explicit enabling a directory graph, when +# DIRECTORY_GRAPH is set to NO, can be accomplished by means of the command +# \directorygraph. Disabling a directory graph can be accomplished by means of +# the command \hidedirectorygraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. DIRECTORY_GRAPH = YES +# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels +# of child directories generated in directory dependency graphs by dot. +# Minimum value: 1, maximum value: 25, default value: 1. +# This tag requires that the tag DIRECTORY_GRAPH is set to YES. + +DIR_GRAPH_MAX_DEPTH = 1 + # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. For an explanation of the image formats see the section # output formats in the documentation of the dot tool (Graphviz (see: -# http://www.graphviz.org/)). +# https://www.graphviz.org/)). # Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order # to make the SVG files visible in IE 9+ (other browsers do not have this # requirement). -# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd, -# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo, -# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo, -# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and +# Possible values are: png, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, +# gif, gif:cairo, gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, +# png:cairo, png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and # png:gdiplus:gdiplus. # The default value is: png. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2563,11 +2756,12 @@ DOT_PATH = DOTFILE_DIRS = -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the \mscfile -# command). +# You can include diagrams made with dia in doxygen documentation. Doxygen will +# then run dia to produce the diagram and insert it in the documentation. The +# DIA_PATH tag allows you to specify the directory where the dia binary resides. +# If left empty dia is assumed to be found in the default search path. -MSCFILE_DIRS = +DIA_PATH = # The DIAFILE_DIRS tag can be used to specify one or more directories that # contain dia files that are included in the documentation (see the \diafile @@ -2576,10 +2770,10 @@ MSCFILE_DIRS = DIAFILE_DIRS = # When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the -# path where java can find the plantuml.jar file. If left blank, it is assumed -# PlantUML is not used or called during a preprocessing step. Doxygen will -# generate a warning when it encounters a \startuml command in this case and -# will not generate output for the diagram. +# path where java can find the plantuml.jar file or to the filename of jar file +# to be used. If left blank, it is assumed PlantUML is not used or called during +# a preprocessing step. Doxygen will generate a warning when it encounters a +# \startuml command in this case and will not generate output for the diagram. PLANTUML_JAR_PATH = @@ -2617,18 +2811,6 @@ DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 2 -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not seem -# to support this out of the box. -# -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_TRANSPARENT = NO - # Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) support @@ -2641,6 +2823,8 @@ DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page # explaining the meaning of the various boxes and arrows in the dot generated # graphs. +# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal +# graphical representation for inheritance and collaboration diagrams is used. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2649,8 +2833,24 @@ GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate # files that are used to generate the various graphs. # -# Note: This setting is not only used for dot files but also for msc and -# plantuml temporary files. +# Note: This setting is not only used for dot files but also for msc temporary +# files. # The default value is: YES. DOT_CLEANUP = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. If the MSCGEN_TOOL tag is left empty (the default), then doxygen will +# use a built-in version of mscgen tool to produce the charts. Alternatively, +# the MSCGEN_TOOL tag can also specify the name an external tool. For instance, +# specifying prog as the value, doxygen will call the tool as prog -T +# -o . The external tool should support +# output file formats "png", "eps", "svg", and "ismap". + +MSCGEN_TOOL = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the \mscfile +# command). + +MSCFILE_DIRS = diff --git a/tests/complex/config.complex b/tests/complex/config.complex index 8500dd927873..2cb0927ef945 100644 --- a/tests/complex/config.complex +++ b/tests/complex/config.complex @@ -90,6 +90,10 @@ gtfs_additional:gtfs_pt_stops.add.xml vtypes:vtypes.xml cfg:config.sumocfg aggregated:aggregated.xml +railsignalblocks:railsignal_blocks.xml +railsignalvehs:railsignal_vehicles.xml +railsignalblocks2:railsignal_blocks2.xml +railsignalvehs2:railsignal_vehicles2.xml [run_dependent_text] output: @@ -143,8 +147,8 @@ ssm: summary: statistics: statistics2: -statistics:]}--> state: state2: @@ -156,8 +160,12 @@ detector: toc: toc2: tocs: +railsignalblocks: +railsignalvehs: +railsignalblocks2: +railsignalvehs2: errors:Die Adresse wird bereits verwendet{REPLACE Address already in use} -errors:Leaked object at +errors:Leaked object at errors:*** 9 leaks found errors:delete: freed errors:send failed: Connection reset by peer{REPLACE send failed: Software caused tcpip::Socket abort} @@ -176,6 +184,8 @@ errors:Matplotlib is building the font cache; this may take a moment. errors:matplotlib/projections/__init__.py:.*: UserWarning: Unable to import Axes3D.{LINES 2} errors:.*UserWarning: {REPLACE UserWarning: } errors:apport/report.py:13: DeprecationWarning: the imp{LINES 2} +errors:error: XDG_RUNTIME_DIR is invalid or not set in the environment. +errors:MESA: error: ZINK: {LINES 2} errors:\\{REPLACE /} ps:%%CreationDate gtfs_additional: @@ -189,7 +199,7 @@ output:[0-9] vehicle subscription results: output:[0-9] simulation subscription results: output:Process [0-9] output:Starting process -output:[0-9] stepping \(step +output:[0-9] stepping \(step output:^Loading configuration ... done. output:^Starting process [0-9] with steplength output:does not supply vehicle parameter diff --git a/tests/complex/jtrrouter/randomized_flow/runner.py b/tests/complex/jtrrouter/randomized_flow/runner.py index 6454830ae2cb..e94e276a0919 100755 --- a/tests/complex/jtrrouter/randomized_flow/runner.py +++ b/tests/complex/jtrrouter/randomized_flow/runner.py @@ -38,10 +38,7 @@ def get_depart_lines(route_file): output_file1 = 'output1.rou.xml' output_file2 = 'output2.rou.xml' -jtrrouter = checkBinary('jtrrouter') -assert(jtrrouter) - -args = [jtrrouter, +args = [checkBinary('jtrrouter'), '--net-file', 'input_net.net.xml', '--route-files', 'input_flows.flows.xml', '--turn-ratio-files', 'input_turns.turns.xml', diff --git a/tests/complex/netconvert/left_turn_noblocking_double_intersection/runner.py b/tests/complex/netconvert/left_turn_noblocking_double_intersection/runner.py index d5742a3e9734..acc73f9a9b9e 100755 --- a/tests/complex/netconvert/left_turn_noblocking_double_intersection/runner.py +++ b/tests/complex/netconvert/left_turn_noblocking_double_intersection/runner.py @@ -30,18 +30,13 @@ net_output = 'joined.net.xml' trips_output = 'trips.log' -netconvert = checkBinary('netconvert') -assert(netconvert) -sumo = checkBinary('sumo') -assert(sumo) - -args_netc = [netconvert, +args_netc = [checkBinary('netconvert'), '--node-files', 'input_nodes.nod.xml', '--edge-files', 'input_edges.edg.xml', '--output', net_output, '--offset.disable-normalization'] -args_sumo = [sumo, +args_sumo = [checkBinary('sumo'), '--net-file', net_output, '--route-files', 'input_routes.rou.xml', '--end', '50', diff --git a/tests/complex/netconvert/left_turn_noblocking_longveh/runner.py b/tests/complex/netconvert/left_turn_noblocking_longveh/runner.py index d5742a3e9734..acc73f9a9b9e 100755 --- a/tests/complex/netconvert/left_turn_noblocking_longveh/runner.py +++ b/tests/complex/netconvert/left_turn_noblocking_longveh/runner.py @@ -30,18 +30,13 @@ net_output = 'joined.net.xml' trips_output = 'trips.log' -netconvert = checkBinary('netconvert') -assert(netconvert) -sumo = checkBinary('sumo') -assert(sumo) - -args_netc = [netconvert, +args_netc = [checkBinary('netconvert'), '--node-files', 'input_nodes.nod.xml', '--edge-files', 'input_edges.edg.xml', '--output', net_output, '--offset.disable-normalization'] -args_sumo = [sumo, +args_sumo = [checkBinary('sumo'), '--net-file', net_output, '--route-files', 'input_routes.rou.xml', '--end', '50', diff --git a/tests/complex/osm_get/output.complex b/tests/complex/osm_get/output.complex index 992a7e84ef8b..e69de29bb2d1 100644 --- a/tests/complex/osm_get/output.complex +++ b/tests/complex/osm_get/output.complex @@ -1 +0,0 @@ -200 OK diff --git a/tests/complex/state/rail_furtherLane/errors.complex b/tests/complex/state/rail/rail_furtherLane/errors.complex similarity index 100% rename from tests/complex/state/rail_furtherLane/errors.complex rename to tests/complex/state/rail/rail_furtherLane/errors.complex diff --git a/tests/complex/state/rail_furtherLane/input_routes.rou.xml b/tests/complex/state/rail/rail_furtherLane/input_routes.rou.xml similarity index 100% rename from tests/complex/state/rail_furtherLane/input_routes.rou.xml rename to tests/complex/state/rail/rail_furtherLane/input_routes.rou.xml diff --git a/tests/complex/state/rail_furtherLane/net.net.xml b/tests/complex/state/rail/rail_furtherLane/net.net.xml similarity index 100% rename from tests/complex/state/rail_furtherLane/net.net.xml rename to tests/complex/state/rail/rail_furtherLane/net.net.xml diff --git a/tests/complex/state/rail_furtherLane/options.complex b/tests/complex/state/rail/rail_furtherLane/options.complex similarity index 100% rename from tests/complex/state/rail_furtherLane/options.complex rename to tests/complex/state/rail/rail_furtherLane/options.complex diff --git a/tests/complex/state/rail_furtherLane/output.complex b/tests/complex/state/rail/rail_furtherLane/output.complex similarity index 100% rename from tests/complex/state/rail_furtherLane/output.complex rename to tests/complex/state/rail/rail_furtherLane/output.complex diff --git a/tests/complex/state/rail_furtherLane/output.complex.meso b/tests/complex/state/rail/rail_furtherLane/output.complex.meso similarity index 100% rename from tests/complex/state/rail_furtherLane/output.complex.meso rename to tests/complex/state/rail/rail_furtherLane/output.complex.meso diff --git a/tests/complex/state/rail_furtherLane/state.complex b/tests/complex/state/rail/rail_furtherLane/state.complex similarity index 85% rename from tests/complex/state/rail_furtherLane/state.complex rename to tests/complex/state/rail/rail_furtherLane/state.complex index 2c4dd6543714..962dc4df317a 100644 --- a/tests/complex/state/rail_furtherLane/state.complex +++ b/tests/complex/state/rail/rail_furtherLane/state.complex @@ -1,6 +1,6 @@ - - + @@ -34,4 +34,5 @@ + diff --git a/tests/complex/state/rail_furtherLane/state.complex.meso b/tests/complex/state/rail/rail_furtherLane/state.complex.meso similarity index 100% rename from tests/complex/state/rail_furtherLane/state.complex.meso rename to tests/complex/state/rail/rail_furtherLane/state.complex.meso diff --git a/tests/complex/state/rail_furtherLane/tripinfo.complex b/tests/complex/state/rail/rail_furtherLane/tripinfo.complex similarity index 100% rename from tests/complex/state/rail_furtherLane/tripinfo.complex rename to tests/complex/state/rail/rail_furtherLane/tripinfo.complex diff --git a/tests/complex/state/rail_furtherLane/tripinfo.complex.meso b/tests/complex/state/rail/rail_furtherLane/tripinfo.complex.meso similarity index 100% rename from tests/complex/state/rail_furtherLane/tripinfo.complex.meso rename to tests/complex/state/rail/rail_furtherLane/tripinfo.complex.meso diff --git a/tests/complex/state/rail_furtherLane/tripinfo2.complex b/tests/complex/state/rail/rail_furtherLane/tripinfo2.complex similarity index 100% rename from tests/complex/state/rail_furtherLane/tripinfo2.complex rename to tests/complex/state/rail/rail_furtherLane/tripinfo2.complex diff --git a/tests/complex/state/rail_furtherLane/tripinfo2.complex.meso b/tests/complex/state/rail/rail_furtherLane/tripinfo2.complex.meso similarity index 100% rename from tests/complex/state/rail_furtherLane/tripinfo2.complex.meso rename to tests/complex/state/rail/rail_furtherLane/tripinfo2.complex.meso diff --git a/tests/complex/state/save_on_rail_signal/errors.complex b/tests/complex/state/rail/save_on_rail_signal/errors.complex similarity index 100% rename from tests/complex/state/save_on_rail_signal/errors.complex rename to tests/complex/state/rail/save_on_rail_signal/errors.complex diff --git a/tests/complex/state/save_on_rail_signal/input_routes.rou.xml b/tests/complex/state/rail/save_on_rail_signal/input_routes.rou.xml similarity index 100% rename from tests/complex/state/save_on_rail_signal/input_routes.rou.xml rename to tests/complex/state/rail/save_on_rail_signal/input_routes.rou.xml diff --git a/tests/complex/state/save_on_rail_signal/net.net.xml b/tests/complex/state/rail/save_on_rail_signal/net.net.xml similarity index 100% rename from tests/complex/state/save_on_rail_signal/net.net.xml rename to tests/complex/state/rail/save_on_rail_signal/net.net.xml diff --git a/tests/complex/state/save_on_rail_signal/options.complex b/tests/complex/state/rail/save_on_rail_signal/options.complex similarity index 100% rename from tests/complex/state/save_on_rail_signal/options.complex rename to tests/complex/state/rail/save_on_rail_signal/options.complex diff --git a/tests/complex/state/save_on_rail_signal/output.complex b/tests/complex/state/rail/save_on_rail_signal/output.complex similarity index 100% rename from tests/complex/state/save_on_rail_signal/output.complex rename to tests/complex/state/rail/save_on_rail_signal/output.complex diff --git a/tests/complex/state/save_on_rail_signal/output.complex.meso b/tests/complex/state/rail/save_on_rail_signal/output.complex.meso similarity index 100% rename from tests/complex/state/save_on_rail_signal/output.complex.meso rename to tests/complex/state/rail/save_on_rail_signal/output.complex.meso diff --git a/tests/complex/state/save_on_rail_signal/state.complex b/tests/complex/state/rail/save_on_rail_signal/state.complex similarity index 68% rename from tests/complex/state/save_on_rail_signal/state.complex rename to tests/complex/state/rail/save_on_rail_signal/state.complex index c146c37605c4..950d741e19d0 100644 --- a/tests/complex/state/save_on_rail_signal/state.complex +++ b/tests/complex/state/rail/save_on_rail_signal/state.complex @@ -1,7 +1,7 @@ - - + - + - + @@ -43,20 +43,18 @@ - - - + - + diff --git a/tests/complex/state/save_on_rail_signal/state.complex.meso b/tests/complex/state/rail/save_on_rail_signal/state.complex.meso similarity index 100% rename from tests/complex/state/save_on_rail_signal/state.complex.meso rename to tests/complex/state/rail/save_on_rail_signal/state.complex.meso diff --git a/tests/complex/state/save_rail_signal/errors.complex b/tests/complex/state/rail/save_rail_signal/errors.complex similarity index 100% rename from tests/complex/state/save_rail_signal/errors.complex rename to tests/complex/state/rail/save_rail_signal/errors.complex diff --git a/tests/complex/state/save_rail_signal/input_routes.rou.xml b/tests/complex/state/rail/save_rail_signal/input_routes.rou.xml similarity index 100% rename from tests/complex/state/save_rail_signal/input_routes.rou.xml rename to tests/complex/state/rail/save_rail_signal/input_routes.rou.xml diff --git a/tests/complex/state/save_rail_signal/net.net.xml b/tests/complex/state/rail/save_rail_signal/net.net.xml similarity index 100% rename from tests/complex/state/save_rail_signal/net.net.xml rename to tests/complex/state/rail/save_rail_signal/net.net.xml diff --git a/tests/complex/state/save_rail_signal/options.complex b/tests/complex/state/rail/save_rail_signal/options.complex similarity index 100% rename from tests/complex/state/save_rail_signal/options.complex rename to tests/complex/state/rail/save_rail_signal/options.complex diff --git a/tests/complex/state/save_rail_signal/output.complex b/tests/complex/state/rail/save_rail_signal/output.complex similarity index 100% rename from tests/complex/state/save_rail_signal/output.complex rename to tests/complex/state/rail/save_rail_signal/output.complex diff --git a/tests/complex/state/save_rail_signal/output.complex.meso b/tests/complex/state/rail/save_rail_signal/output.complex.meso similarity index 100% rename from tests/complex/state/save_rail_signal/output.complex.meso rename to tests/complex/state/rail/save_rail_signal/output.complex.meso diff --git a/tests/complex/state/save_rail_signal/state.complex b/tests/complex/state/rail/save_rail_signal/state.complex similarity index 88% rename from tests/complex/state/save_rail_signal/state.complex rename to tests/complex/state/rail/save_rail_signal/state.complex index 071ef088d865..2e68920d2d99 100644 --- a/tests/complex/state/save_rail_signal/state.complex +++ b/tests/complex/state/rail/save_rail_signal/state.complex @@ -1,6 +1,6 @@ - - + @@ -38,4 +38,5 @@ + diff --git a/tests/complex/state/save_rail_signal/state.complex.meso b/tests/complex/state/rail/save_rail_signal/state.complex.meso similarity index 100% rename from tests/complex/state/save_rail_signal/state.complex.meso rename to tests/complex/state/rail/save_rail_signal/state.complex.meso diff --git a/tests/complex/state/save_rail_signal_constraint/errors.complex b/tests/complex/state/rail/save_rail_signal2/errors.complex similarity index 100% rename from tests/complex/state/save_rail_signal_constraint/errors.complex rename to tests/complex/state/rail/save_rail_signal2/errors.complex diff --git a/tests/complex/state/rail/save_rail_signal2/input_routes.rou.xml b/tests/complex/state/rail/save_rail_signal2/input_routes.rou.xml new file mode 100644 index 000000000000..84d7cdab7792 --- /dev/null +++ b/tests/complex/state/rail/save_rail_signal2/input_routes.rou.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/tests/complex/state/rail/save_rail_signal2/net.net.xml b/tests/complex/state/rail/save_rail_signal2/net.net.xml new file mode 100644 index 000000000000..dfab3dc6b359 --- /dev/null +++ b/tests/complex/state/rail/save_rail_signal2/net.net.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/complex/state/rail/save_rail_signal2/options.complex b/tests/complex/state/rail/save_rail_signal2/options.complex new file mode 100644 index 000000000000..30d70cc6dfc1 --- /dev/null +++ b/tests/complex/state/rail/save_rail_signal2/options.complex @@ -0,0 +1,17 @@ +--no-step-log --no-duration-log -v --net-file=net.net.xml +-r=input_routes.rou.xml +--save-state.times 20 +--save-state.files state.xml +--default.speeddev 0 +--railsignal-block-output railsignal_blocks.xml +--railsignal-vehicle-output railsignal_vehicles.xml +: +--no-step-log --no-duration-log -v --net-file=net.net.xml +--load-state state.xml +--default.speeddev 0 +--collision.action warn +--railsignal-block-output railsignal_blocks2.xml +--railsignal-vehicle-output railsignal_vehicles2.xml + +--compare railsignal_blocks,railsignal_vehicles +tests/complex/state/runner.py diff --git a/tests/complex/state/rail/save_rail_signal2/output.complex b/tests/complex/state/rail/save_rail_signal2/output.complex new file mode 100644 index 000000000000..042641e95adc --- /dev/null +++ b/tests/complex/state/rail/save_rail_signal2/output.complex @@ -0,0 +1,71 @@ +Loading net-file from 'net.net.xml' ... done (7ms). +Loading done. +Simulation version v1_21_0+0407-08724d0e971 started with time: 0.00. +Simulation ended at time: 54.00. +Reason: All vehicles have left the simulation. +Loading net-file from 'net.net.xml' ... done (0ms). +Loading state from 'state.xml' ... done (15ms). +Loading done. +Simulation version v1_21_0+0407-08724d0e971 started with time: 20.00. +Simulation ended at time: 54.00. +Reason: All vehicles have left the simulation. +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +> +< +< +< +< +< +< diff --git a/tests/complex/state/rail/save_rail_signal2/output.complex.meso b/tests/complex/state/rail/save_rail_signal2/output.complex.meso new file mode 100644 index 000000000000..c48ee2f9c0ac --- /dev/null +++ b/tests/complex/state/rail/save_rail_signal2/output.complex.meso @@ -0,0 +1,11 @@ +Loading net-file from 'net.net.xml' ... done (2ms). +Loading done. +Simulation version v1_17_0+1317-06f42fb started with time: 0.00. +Simulation ended at time: 135.00 +Reason: All vehicles have left the simulation. +Loading net-file from 'net.net.xml' ... done (1ms). +Loading state from 'state.xml' ... done (11ms). +Loading done. +Simulation version v1_17_0+1317-06f42fb started with time: 30.00. +Simulation ended at time: 135.00 +Reason: All vehicles have left the simulation. diff --git a/tests/complex/state/rail/save_rail_signal2/railsignalblocks.complex b/tests/complex/state/rail/save_rail_signal2/railsignalblocks.complex new file mode 100644 index 000000000000..ff045d6d6619 --- /dev/null +++ b/tests/complex/state/rail/save_rail_signal2/railsignalblocks.complex @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/complex/state/rail/save_rail_signal2/railsignalblocks2.complex b/tests/complex/state/rail/save_rail_signal2/railsignalblocks2.complex new file mode 100644 index 000000000000..0c4eb1e4dd34 --- /dev/null +++ b/tests/complex/state/rail/save_rail_signal2/railsignalblocks2.complex @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/complex/state/rail/save_rail_signal2/railsignalvehs.complex b/tests/complex/state/rail/save_rail_signal2/railsignalvehs.complex new file mode 100644 index 000000000000..b91560ab64b2 --- /dev/null +++ b/tests/complex/state/rail/save_rail_signal2/railsignalvehs.complex @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/complex/state/rail/save_rail_signal2/railsignalvehs2.complex b/tests/complex/state/rail/save_rail_signal2/railsignalvehs2.complex new file mode 100644 index 000000000000..8f8706efac88 --- /dev/null +++ b/tests/complex/state/rail/save_rail_signal2/railsignalvehs2.complex @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/complex/state/rail/save_rail_signal2/state.complex b/tests/complex/state/rail/save_rail_signal2/state.complex new file mode 100644 index 000000000000..cbc33e23edb3 --- /dev/null +++ b/tests/complex/state/rail/save_rail_signal2/state.complex @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/complex/state/rail/save_rail_signal2/state.complex.meso b/tests/complex/state/rail/save_rail_signal2/state.complex.meso new file mode 100644 index 000000000000..8bbb770e179d --- /dev/null +++ b/tests/complex/state/rail/save_rail_signal2/state.complex.meso @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/complex/state/save_rail_signal_approach_steplength/errors.complex b/tests/complex/state/rail/save_rail_signal_approach_steplength/errors.complex similarity index 100% rename from tests/complex/state/save_rail_signal_approach_steplength/errors.complex rename to tests/complex/state/rail/save_rail_signal_approach_steplength/errors.complex diff --git a/tests/complex/state/save_rail_signal_approach_steplength/input_routes.rou.xml b/tests/complex/state/rail/save_rail_signal_approach_steplength/input_routes.rou.xml similarity index 100% rename from tests/complex/state/save_rail_signal_approach_steplength/input_routes.rou.xml rename to tests/complex/state/rail/save_rail_signal_approach_steplength/input_routes.rou.xml diff --git a/tests/complex/state/save_rail_signal_approach_steplength/net.net.xml b/tests/complex/state/rail/save_rail_signal_approach_steplength/net.net.xml similarity index 100% rename from tests/complex/state/save_rail_signal_approach_steplength/net.net.xml rename to tests/complex/state/rail/save_rail_signal_approach_steplength/net.net.xml diff --git a/tests/complex/state/save_rail_signal_approach_steplength/options.complex b/tests/complex/state/rail/save_rail_signal_approach_steplength/options.complex similarity index 100% rename from tests/complex/state/save_rail_signal_approach_steplength/options.complex rename to tests/complex/state/rail/save_rail_signal_approach_steplength/options.complex diff --git a/tests/complex/state/save_rail_signal_approach_steplength/output.complex b/tests/complex/state/rail/save_rail_signal_approach_steplength/output.complex similarity index 100% rename from tests/complex/state/save_rail_signal_approach_steplength/output.complex rename to tests/complex/state/rail/save_rail_signal_approach_steplength/output.complex diff --git a/tests/complex/state/save_rail_signal_approach_steplength/state.complex b/tests/complex/state/rail/save_rail_signal_approach_steplength/state.complex similarity index 89% rename from tests/complex/state/save_rail_signal_approach_steplength/state.complex rename to tests/complex/state/rail/save_rail_signal_approach_steplength/state.complex index 0bc033b8fc66..2db4120cd79c 100644 --- a/tests/complex/state/save_rail_signal_approach_steplength/state.complex +++ b/tests/complex/state/rail/save_rail_signal_approach_steplength/state.complex @@ -1,6 +1,6 @@ - - + @@ -47,4 +47,5 @@ + diff --git a/tests/complex/state/save_rail_signal_constraint2/errors.complex b/tests/complex/state/rail/save_rail_signal_constraint/errors.complex similarity index 100% rename from tests/complex/state/save_rail_signal_constraint2/errors.complex rename to tests/complex/state/rail/save_rail_signal_constraint/errors.complex diff --git a/tests/complex/state/save_rail_signal_constraint/input_additional.add.xml b/tests/complex/state/rail/save_rail_signal_constraint/input_additional.add.xml similarity index 100% rename from tests/complex/state/save_rail_signal_constraint/input_additional.add.xml rename to tests/complex/state/rail/save_rail_signal_constraint/input_additional.add.xml diff --git a/tests/complex/state/save_rail_signal_constraint/input_additional2.add.xml b/tests/complex/state/rail/save_rail_signal_constraint/input_additional2.add.xml similarity index 100% rename from tests/complex/state/save_rail_signal_constraint/input_additional2.add.xml rename to tests/complex/state/rail/save_rail_signal_constraint/input_additional2.add.xml diff --git a/tests/complex/state/save_rail_signal_constraint/input_routes.rou.xml b/tests/complex/state/rail/save_rail_signal_constraint/input_routes.rou.xml similarity index 100% rename from tests/complex/state/save_rail_signal_constraint/input_routes.rou.xml rename to tests/complex/state/rail/save_rail_signal_constraint/input_routes.rou.xml diff --git a/tests/complex/state/save_rail_signal_constraint/net.net.xml b/tests/complex/state/rail/save_rail_signal_constraint/net.net.xml similarity index 100% rename from tests/complex/state/save_rail_signal_constraint/net.net.xml rename to tests/complex/state/rail/save_rail_signal_constraint/net.net.xml diff --git a/tests/complex/state/save_rail_signal_constraint/options.complex b/tests/complex/state/rail/save_rail_signal_constraint/options.complex similarity index 100% rename from tests/complex/state/save_rail_signal_constraint/options.complex rename to tests/complex/state/rail/save_rail_signal_constraint/options.complex diff --git a/tests/complex/state/save_rail_signal_constraint/output.complex b/tests/complex/state/rail/save_rail_signal_constraint/output.complex similarity index 54% rename from tests/complex/state/save_rail_signal_constraint/output.complex rename to tests/complex/state/rail/save_rail_signal_constraint/output.complex index 68116c21db4b..366de0f76465 100644 --- a/tests/complex/state/save_rail_signal_constraint/output.complex +++ b/tests/complex/state/rail/save_rail_signal_constraint/output.complex @@ -1,17 +1,19 @@ Loading net-file from 'net.net.xml' ... done (0ms). -Loading additional-files from 'input_additional.add.xml' ... done (16ms). +Loading additional-files from 'input_additional.add.xml' ... done (23ms). Loading additional-files from 'input_additional2.add.xml' ... done (19ms). Loading done. -Simulation version v1_20_0+0782-2de3bc16e35 started with time: 0.00. -Simulation ended at time: 260.00. +Simulation version v1_21_0+0407-08724d0e971 started with time: 0.00. +Simulation ended at time: 269.00. Reason: All vehicles have left the simulation. -DijkstraRouter answered 5 queries and explored 2.00 edges on average. +DijkstraRouter answered 8 queries and explored 1.88 edges on average. DijkstraRouter spent 0.00s answering queries (0.00ms on average). Loading net-file from 'net.net.xml' ... done (0ms). -Loading additional-files from 'input_additional.add.xml' ... done (18ms). -Loading additional-files from 'input_additional2.add.xml' ... done (20ms). -Loading state from 'state.xml' ... done (17ms). +Loading additional-files from 'input_additional.add.xml' ... done (19ms). +Loading additional-files from 'input_additional2.add.xml' ... done (17ms). +Loading state from 'state.xml' ... done (39ms). Loading done. -Simulation version v1_20_0+0782-2de3bc16e35 started with time: 60.00. -Simulation ended at time: 260.00. +Simulation version v1_21_0+0407-08724d0e971 started with time: 60.00. +Simulation ended at time: 269.00. Reason: All vehicles have left the simulation. +DijkstraRouter answered 2 queries and explored 2.00 edges on average. +DijkstraRouter spent 0.00s answering queries (0.00ms on average). diff --git a/tests/complex/state/save_rail_signal_constraint/output.complex.meso b/tests/complex/state/rail/save_rail_signal_constraint/output.complex.meso similarity index 100% rename from tests/complex/state/save_rail_signal_constraint/output.complex.meso rename to tests/complex/state/rail/save_rail_signal_constraint/output.complex.meso diff --git a/tests/complex/state/save_rail_signal_constraint/state.complex b/tests/complex/state/rail/save_rail_signal_constraint/state.complex similarity index 70% rename from tests/complex/state/save_rail_signal_constraint/state.complex rename to tests/complex/state/rail/save_rail_signal_constraint/state.complex index 861e2d3bb8bb..b0f83bbab808 100644 --- a/tests/complex/state/save_rail_signal_constraint/state.complex +++ b/tests/complex/state/rail/save_rail_signal_constraint/state.complex @@ -1,7 +1,7 @@ - - + - + - + - + @@ -49,8 +49,11 @@ - + + + + diff --git a/tests/complex/state/save_rail_signal_constraint/state.complex.meso b/tests/complex/state/rail/save_rail_signal_constraint/state.complex.meso similarity index 100% rename from tests/complex/state/save_rail_signal_constraint/state.complex.meso rename to tests/complex/state/rail/save_rail_signal_constraint/state.complex.meso diff --git a/tests/complex/state/save_rail_signal_constraint2/state2.complex b/tests/complex/state/rail/save_rail_signal_constraint/state2.complex similarity index 86% rename from tests/complex/state/save_rail_signal_constraint2/state2.complex rename to tests/complex/state/rail/save_rail_signal_constraint/state2.complex index 411c3783faa1..4bd16f1d7a14 100644 --- a/tests/complex/state/save_rail_signal_constraint2/state2.complex +++ b/tests/complex/state/rail/save_rail_signal_constraint/state2.complex @@ -1,7 +1,7 @@ - - + @@ -59,4 +59,6 @@ + + diff --git a/tests/complex/state/save_rail_signal_constraint/state2.complex.meso b/tests/complex/state/rail/save_rail_signal_constraint/state2.complex.meso similarity index 100% rename from tests/complex/state/save_rail_signal_constraint/state2.complex.meso rename to tests/complex/state/rail/save_rail_signal_constraint/state2.complex.meso diff --git a/tests/complex/state/save_rail_signal_constraint/tripinfo.complex b/tests/complex/state/rail/save_rail_signal_constraint/tripinfo.complex similarity index 67% rename from tests/complex/state/save_rail_signal_constraint/tripinfo.complex rename to tests/complex/state/rail/save_rail_signal_constraint/tripinfo.complex index ab57916bae70..4feebd3c32b5 100644 --- a/tests/complex/state/save_rail_signal_constraint/tripinfo.complex +++ b/tests/complex/state/rail/save_rail_signal_constraint/tripinfo.complex @@ -1,11 +1,6 @@ - - - + + diff --git a/tests/complex/state/save_rail_signal_constraint/tripinfo2.complex.meso b/tests/complex/state/rail/save_rail_signal_constraint/tripinfo2.complex.meso similarity index 100% rename from tests/complex/state/save_rail_signal_constraint/tripinfo2.complex.meso rename to tests/complex/state/rail/save_rail_signal_constraint/tripinfo2.complex.meso diff --git a/tests/complex/state/save_rail_signal_constraint_include/errors.complex b/tests/complex/state/rail/save_rail_signal_constraint2/errors.complex similarity index 100% rename from tests/complex/state/save_rail_signal_constraint_include/errors.complex rename to tests/complex/state/rail/save_rail_signal_constraint2/errors.complex diff --git a/tests/complex/state/save_rail_signal_constraint2/input_additional.add.xml b/tests/complex/state/rail/save_rail_signal_constraint2/input_additional.add.xml similarity index 100% rename from tests/complex/state/save_rail_signal_constraint2/input_additional.add.xml rename to tests/complex/state/rail/save_rail_signal_constraint2/input_additional.add.xml diff --git a/tests/complex/state/save_rail_signal_constraint2/input_additional2.add.xml b/tests/complex/state/rail/save_rail_signal_constraint2/input_additional2.add.xml similarity index 100% rename from tests/complex/state/save_rail_signal_constraint2/input_additional2.add.xml rename to tests/complex/state/rail/save_rail_signal_constraint2/input_additional2.add.xml diff --git a/tests/complex/state/save_rail_signal_constraint2/input_routes.rou.xml b/tests/complex/state/rail/save_rail_signal_constraint2/input_routes.rou.xml similarity index 100% rename from tests/complex/state/save_rail_signal_constraint2/input_routes.rou.xml rename to tests/complex/state/rail/save_rail_signal_constraint2/input_routes.rou.xml diff --git a/tests/complex/state/save_rail_signal_constraint2/net.net.xml b/tests/complex/state/rail/save_rail_signal_constraint2/net.net.xml similarity index 100% rename from tests/complex/state/save_rail_signal_constraint2/net.net.xml rename to tests/complex/state/rail/save_rail_signal_constraint2/net.net.xml diff --git a/tests/complex/state/save_rail_signal_constraint2/options.complex b/tests/complex/state/rail/save_rail_signal_constraint2/options.complex similarity index 100% rename from tests/complex/state/save_rail_signal_constraint2/options.complex rename to tests/complex/state/rail/save_rail_signal_constraint2/options.complex diff --git a/tests/complex/state/save_rail_signal_constraint2/output.complex b/tests/complex/state/rail/save_rail_signal_constraint2/output.complex similarity index 61% rename from tests/complex/state/save_rail_signal_constraint2/output.complex rename to tests/complex/state/rail/save_rail_signal_constraint2/output.complex index 2823b0e02d26..53b6c2c2d67b 100644 --- a/tests/complex/state/save_rail_signal_constraint2/output.complex +++ b/tests/complex/state/rail/save_rail_signal_constraint2/output.complex @@ -1,17 +1,17 @@ Loading net-file from 'net.net.xml' ... done (0ms). -Loading additional-files from 'input_additional.add.xml' ... done (8ms). -Loading additional-files from 'input_additional2.add.xml' ... done (8ms). +Loading additional-files from 'input_additional.add.xml' ... done (27ms). +Loading additional-files from 'input_additional2.add.xml' ... done (52ms). Loading done. -Simulation version v1_20_0+1811-8a60ec17ca4 started with time: 0.00. -Simulation ended at time: 260.00. +Simulation version v1_21_0+0063-40d747df57b started with time: 0.00. +Simulation ended at time: 269.00. Reason: All vehicles have left the simulation. -DijkstraRouter answered 5 queries and explored 2.00 edges on average. +DijkstraRouter answered 8 queries and explored 1.88 edges on average. DijkstraRouter spent 0.00s answering queries (0.00ms on average). -Loading net-file from 'net.net.xml' ... done (0ms). -Loading additional-files from 'input_additional.add.xml' ... done (5ms). -Loading additional-files from 'input_additional2.add.xml' ... done (7ms). +Loading net-file from 'net.net.xml' ... done (1ms). +Loading additional-files from 'input_additional.add.xml' ... done (16ms). +Loading additional-files from 'input_additional2.add.xml' ... done (21ms). Loading state from 'state.xml' ... done (8ms). Loading done. -Simulation version v1_20_0+1811-8a60ec17ca4 started with time: 180.00. -Simulation ended at time: 260.00. +Simulation version v1_21_0+0063-40d747df57b started with time: 180.00. +Simulation ended at time: 269.00. Reason: All vehicles have left the simulation. diff --git a/tests/complex/state/save_rail_signal_constraint2/output.complex.meso b/tests/complex/state/rail/save_rail_signal_constraint2/output.complex.meso similarity index 100% rename from tests/complex/state/save_rail_signal_constraint2/output.complex.meso rename to tests/complex/state/rail/save_rail_signal_constraint2/output.complex.meso diff --git a/tests/complex/state/save_rail_signal_constraint2/state.complex b/tests/complex/state/rail/save_rail_signal_constraint2/state.complex similarity index 75% rename from tests/complex/state/save_rail_signal_constraint2/state.complex rename to tests/complex/state/rail/save_rail_signal_constraint2/state.complex index 8d298e194086..73efd518f15e 100644 --- a/tests/complex/state/save_rail_signal_constraint2/state.complex +++ b/tests/complex/state/rail/save_rail_signal_constraint2/state.complex @@ -1,6 +1,6 @@ - - + - + - + - + @@ -42,4 +42,5 @@ + diff --git a/tests/complex/state/save_rail_signal_constraint2/state.complex.meso b/tests/complex/state/rail/save_rail_signal_constraint2/state.complex.meso similarity index 100% rename from tests/complex/state/save_rail_signal_constraint2/state.complex.meso rename to tests/complex/state/rail/save_rail_signal_constraint2/state.complex.meso diff --git a/tests/complex/state/save_rail_signal_constraint/state2.complex b/tests/complex/state/rail/save_rail_signal_constraint2/state2.complex similarity index 85% rename from tests/complex/state/save_rail_signal_constraint/state2.complex rename to tests/complex/state/rail/save_rail_signal_constraint2/state2.complex index 411c3783faa1..f6f189ee7e42 100644 --- a/tests/complex/state/save_rail_signal_constraint/state2.complex +++ b/tests/complex/state/rail/save_rail_signal_constraint2/state2.complex @@ -1,7 +1,7 @@ - - + @@ -59,4 +59,6 @@ + + diff --git a/tests/complex/state/save_rail_signal_constraint2/state2.complex.meso b/tests/complex/state/rail/save_rail_signal_constraint2/state2.complex.meso similarity index 100% rename from tests/complex/state/save_rail_signal_constraint2/state2.complex.meso rename to tests/complex/state/rail/save_rail_signal_constraint2/state2.complex.meso diff --git a/tests/complex/state/save_rail_signal_constraint_include/tripinfo.complex b/tests/complex/state/rail/save_rail_signal_constraint2/tripinfo.complex similarity index 60% rename from tests/complex/state/save_rail_signal_constraint_include/tripinfo.complex rename to tests/complex/state/rail/save_rail_signal_constraint2/tripinfo.complex index ab57916bae70..64cdf0788806 100644 --- a/tests/complex/state/save_rail_signal_constraint_include/tripinfo.complex +++ b/tests/complex/state/rail/save_rail_signal_constraint2/tripinfo.complex @@ -1,12 +1,7 @@ - - - + + diff --git a/tests/complex/state/save_rail_signal_constraint2/tripinfo.complex.meso b/tests/complex/state/rail/save_rail_signal_constraint2/tripinfo.complex.meso similarity index 100% rename from tests/complex/state/save_rail_signal_constraint2/tripinfo.complex.meso rename to tests/complex/state/rail/save_rail_signal_constraint2/tripinfo.complex.meso diff --git a/tests/complex/state/save_rail_signal_constraint2/tripinfo2.complex b/tests/complex/state/rail/save_rail_signal_constraint2/tripinfo2.complex similarity index 78% rename from tests/complex/state/save_rail_signal_constraint2/tripinfo2.complex rename to tests/complex/state/rail/save_rail_signal_constraint2/tripinfo2.complex index ec91f8e14e01..eda798606c6a 100644 --- a/tests/complex/state/save_rail_signal_constraint2/tripinfo2.complex +++ b/tests/complex/state/rail/save_rail_signal_constraint2/tripinfo2.complex @@ -1,6 +1,6 @@ - - + diff --git a/tests/complex/state/save_rail_signal_constraint2/tripinfo2.complex.meso b/tests/complex/state/rail/save_rail_signal_constraint2/tripinfo2.complex.meso similarity index 100% rename from tests/complex/state/save_rail_signal_constraint2/tripinfo2.complex.meso rename to tests/complex/state/rail/save_rail_signal_constraint2/tripinfo2.complex.meso diff --git a/tests/complex/state/rail/save_rail_signal_constraint_include/errors.complex b/tests/complex/state/rail/save_rail_signal_constraint_include/errors.complex new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/complex/state/save_rail_signal_constraint_include/input_additional.add.xml b/tests/complex/state/rail/save_rail_signal_constraint_include/input_additional.add.xml similarity index 100% rename from tests/complex/state/save_rail_signal_constraint_include/input_additional.add.xml rename to tests/complex/state/rail/save_rail_signal_constraint_include/input_additional.add.xml diff --git a/tests/complex/state/save_rail_signal_constraint_include/input_additional2.add.xml b/tests/complex/state/rail/save_rail_signal_constraint_include/input_additional2.add.xml similarity index 100% rename from tests/complex/state/save_rail_signal_constraint_include/input_additional2.add.xml rename to tests/complex/state/rail/save_rail_signal_constraint_include/input_additional2.add.xml diff --git a/tests/complex/state/save_rail_signal_constraint_include/input_routes.rou.xml b/tests/complex/state/rail/save_rail_signal_constraint_include/input_routes.rou.xml similarity index 100% rename from tests/complex/state/save_rail_signal_constraint_include/input_routes.rou.xml rename to tests/complex/state/rail/save_rail_signal_constraint_include/input_routes.rou.xml diff --git a/tests/complex/state/save_rail_signal_constraint_include/net.net.xml b/tests/complex/state/rail/save_rail_signal_constraint_include/net.net.xml similarity index 100% rename from tests/complex/state/save_rail_signal_constraint_include/net.net.xml rename to tests/complex/state/rail/save_rail_signal_constraint_include/net.net.xml diff --git a/tests/complex/state/save_rail_signal_constraint_include/options.complex b/tests/complex/state/rail/save_rail_signal_constraint_include/options.complex similarity index 100% rename from tests/complex/state/save_rail_signal_constraint_include/options.complex rename to tests/complex/state/rail/save_rail_signal_constraint_include/options.complex diff --git a/tests/complex/state/rail/save_rail_signal_constraint_include/output.complex b/tests/complex/state/rail/save_rail_signal_constraint_include/output.complex new file mode 100644 index 000000000000..227ef7dfcb93 --- /dev/null +++ b/tests/complex/state/rail/save_rail_signal_constraint_include/output.complex @@ -0,0 +1,18 @@ +Loading net-file from 'net.net.xml' ... done (0ms). +Loading additional-files from 'input_additional.add.xml' ... done (9ms). +Loading additional-files from 'input_additional2.add.xml' ... done (8ms). +Loading done. +Simulation version v1_21_0+0407-08724d0e971 started with time: 0.00. +Simulation ended at time: 269.00. +Reason: All vehicles have left the simulation. +DijkstraRouter answered 8 queries and explored 1.88 edges on average. +DijkstraRouter spent 0.00s answering queries (0.00ms on average). +Loading net-file from 'net.net.xml' ... done (0ms). +Loading additional-files from 'input_additional.add.xml' ... done (22ms). +Loading state from 'state.xml' ... done (18ms). +Loading done. +Simulation version v1_21_0+0407-08724d0e971 started with time: 60.00. +Simulation ended at time: 269.00. +Reason: All vehicles have left the simulation. +DijkstraRouter answered 2 queries and explored 2.00 edges on average. +DijkstraRouter spent 0.00s answering queries (0.00ms on average). diff --git a/tests/complex/state/save_rail_signal_constraint_include/output.complex.meso b/tests/complex/state/rail/save_rail_signal_constraint_include/output.complex.meso similarity index 100% rename from tests/complex/state/save_rail_signal_constraint_include/output.complex.meso rename to tests/complex/state/rail/save_rail_signal_constraint_include/output.complex.meso diff --git a/tests/complex/state/save_rail_signal_constraint_include/state.complex b/tests/complex/state/rail/save_rail_signal_constraint_include/state.complex similarity index 74% rename from tests/complex/state/save_rail_signal_constraint_include/state.complex rename to tests/complex/state/rail/save_rail_signal_constraint_include/state.complex index 6cd21b65154f..bb465981a491 100644 --- a/tests/complex/state/save_rail_signal_constraint_include/state.complex +++ b/tests/complex/state/rail/save_rail_signal_constraint_include/state.complex @@ -1,7 +1,7 @@ - - + - + - + - + @@ -50,7 +50,7 @@ - + @@ -63,4 +63,7 @@ + + + diff --git a/tests/complex/state/save_rail_signal_constraint_include/state.complex.meso b/tests/complex/state/rail/save_rail_signal_constraint_include/state.complex.meso similarity index 100% rename from tests/complex/state/save_rail_signal_constraint_include/state.complex.meso rename to tests/complex/state/rail/save_rail_signal_constraint_include/state.complex.meso diff --git a/tests/complex/state/save_rail_signal_constraint_include/state2.complex b/tests/complex/state/rail/save_rail_signal_constraint_include/state2.complex similarity index 80% rename from tests/complex/state/save_rail_signal_constraint_include/state2.complex rename to tests/complex/state/rail/save_rail_signal_constraint_include/state2.complex index 45d420d9b310..2aacd207fc67 100644 --- a/tests/complex/state/save_rail_signal_constraint_include/state2.complex +++ b/tests/complex/state/rail/save_rail_signal_constraint_include/state2.complex @@ -1,6 +1,6 @@ - - + - + - + - + @@ -54,7 +54,7 @@ - + @@ -67,4 +67,6 @@ + + diff --git a/tests/complex/state/save_rail_signal_constraint_include/state2.complex.meso b/tests/complex/state/rail/save_rail_signal_constraint_include/state2.complex.meso similarity index 100% rename from tests/complex/state/save_rail_signal_constraint_include/state2.complex.meso rename to tests/complex/state/rail/save_rail_signal_constraint_include/state2.complex.meso diff --git a/tests/complex/state/save_rail_signal_constraint2/tripinfo.complex b/tests/complex/state/rail/save_rail_signal_constraint_include/tripinfo.complex similarity index 64% rename from tests/complex/state/save_rail_signal_constraint2/tripinfo.complex rename to tests/complex/state/rail/save_rail_signal_constraint_include/tripinfo.complex index ab57916bae70..ecdd8345ef56 100644 --- a/tests/complex/state/save_rail_signal_constraint2/tripinfo.complex +++ b/tests/complex/state/rail/save_rail_signal_constraint_include/tripinfo.complex @@ -1,11 +1,6 @@ - - - + + diff --git a/tests/complex/state/save_rail_signal_constraint_include/tripinfo2.complex.meso b/tests/complex/state/rail/save_rail_signal_constraint_include/tripinfo2.complex.meso similarity index 100% rename from tests/complex/state/save_rail_signal_constraint_include/tripinfo2.complex.meso rename to tests/complex/state/rail/save_rail_signal_constraint_include/tripinfo2.complex.meso diff --git a/tests/complex/state/rail/testsuite.complex b/tests/complex/state/rail/testsuite.complex new file mode 100644 index 000000000000..2f832e59d020 --- /dev/null +++ b/tests/complex/state/rail/testsuite.complex @@ -0,0 +1,16 @@ +save_on_rail_signal +save_rail_signal + +# Copy of save_rail_signal +save_rail_signal2 +save_rail_signal_constraint + +# with more trackers +save_rail_signal_constraint2 + +# include the actual constraints in the saved state +save_rail_signal_constraint_include +save_rail_signal_approach_steplength + +# restore further lanes according to previous route when loading state +rail_furtherLane diff --git a/tests/complex/state/save_rail_signal_constraint_include/output.complex b/tests/complex/state/save_rail_signal_constraint_include/output.complex deleted file mode 100644 index 6ba255198296..000000000000 --- a/tests/complex/state/save_rail_signal_constraint_include/output.complex +++ /dev/null @@ -1,16 +0,0 @@ -Loading net-file from 'net.net.xml' ... done (1ms). -Loading additional-files from 'input_additional.add.xml' ... done (38ms). -Loading additional-files from 'input_additional2.add.xml' ... done (49ms). -Loading done. -Simulation version v1_20_0+0782-2de3bc16e35 started with time: 0.00. -Simulation ended at time: 260.00. -Reason: All vehicles have left the simulation. -DijkstraRouter answered 5 queries and explored 2.00 edges on average. -DijkstraRouter spent 0.00s answering queries (0.00ms on average). -Loading net-file from 'net.net.xml' ... done (1ms). -Loading additional-files from 'input_additional.add.xml' ... done (15ms). -Loading state from 'state.xml' ... done (36ms). -Loading done. -Simulation version v1_20_0+0782-2de3bc16e35 started with time: 60.00. -Simulation ended at time: 260.00. -Reason: All vehicles have left the simulation. diff --git a/tests/complex/state/testsuite.complex b/tests/complex/state/testsuite.complex index 6d72ec0d51a8..8288bd24591a 100644 --- a/tests/complex/state/testsuite.complex +++ b/tests/complex/state/testsuite.complex @@ -1,6 +1,9 @@ # test state saving with persons persons +# railway specific tests +rail + # two vehicles saved and reloaded plain @@ -55,18 +58,9 @@ save_flow50 # save and load flow but do not load the original route file load_flow_state_only -save_on_rail_signal save_parking save_parking_busStop -save_rail_signal -save_rail_signal_constraint - -# with more trackers -save_rail_signal_constraint2 -# include the actual constraints in the saved state -save_rail_signal_constraint_include -save_rail_signal_approach_steplength save_rng save_routeDistribution @@ -81,9 +75,6 @@ save_stopped_started_ended # save stops in named routes named_route_stops -# restore further lanes according to previous route when loading state -rail_furtherLane - # test vehroute-output.exit-times after loading state exit_times diff --git a/tests/complex/state/testsuite.complex.meso b/tests/complex/state/testsuite.complex.meso index 084d904f0635..8316f9307dd5 100644 --- a/tests/complex/state/testsuite.complex.meso +++ b/tests/complex/state/testsuite.complex.meso @@ -43,14 +43,8 @@ save_flow50 # save and load flow but do not load the original route file load_flow_state_only -save_on_rail_signal save_parking save_parking_busStop -save_rail_signal -save_rail_signal_constraint - -# include the actual constraints in the saved state -save_rail_signal_constraint_include save_rng save_routeDistribution save_stopped @@ -62,9 +56,6 @@ save_stopped_started_ended # save stops in named routes named_route_stops -# restore further lanes according to previous route when loading state -rail_furtherLane - # test vehroute-output.exit-times after loading state exit_times diff --git a/tests/complex/sumo/envVarSubstitution/runner.py b/tests/complex/sumo/envVarSubstitution/runner.py index 8cc28784be2b..c31099127a14 100755 --- a/tests/complex/sumo/envVarSubstitution/runner.py +++ b/tests/complex/sumo/envVarSubstitution/runner.py @@ -42,7 +42,7 @@ files = list(sorted(os.listdir("."))) print("uncheck:", files, os.curdir) -assert(files[0].endswith(".trips.xml")) -assert(int(files[0][:-10]) > 0) -assert("collision.xml" in files) -assert(len(files) == 11) +assert files[0].endswith(".trips.xml") +assert int(files[0][:-10]) > 0 +assert "collision.xml" in files +assert len(files) == 11 diff --git a/tests/complex/sumo/output/runner.py b/tests/complex/sumo/output/runner.py index 83918699678a..1c76f004f8a0 100755 --- a/tests/complex/sumo/output/runner.py +++ b/tests/complex/sumo/output/runner.py @@ -68,7 +68,8 @@ def generateDetectorDef(out, freq, enableLoop, laneIDs): if enableLoop: print(' ' % (laneId, laneId, freq), file=out) - print(""" + print(""" + diff --git a/tests/complex/traas/runner.py b/tests/complex/traas/runner.py index 26b66e3afbe1..017335d86eff 100755 --- a/tests/complex/traas/runner.py +++ b/tests/complex/traas/runner.py @@ -34,7 +34,7 @@ java = os.path.join(os.environ['JAVA_HOME'], "bin", java) traasJar = os.path.join(os.environ['SUMO_HOME'], "bin", "TraaS.jar") -assert (os.path.exists(traasJar)) +assert os.path.exists(traasJar) for f in sys.argv[1:]: subprocess.check_call([javac, "-cp", traasJar, "-Xlint:unchecked", "data/%s.java" % f]) diff --git a/tests/complex/traci/bugs/testsuite.complex b/tests/complex/traci/bugs/testsuite.complex index 05fbd5f0759c..982211a23aeb 100644 --- a/tests/complex/traci/bugs/testsuite.complex +++ b/tests/complex/traci/bugs/testsuite.complex @@ -154,3 +154,6 @@ ticket15123 # setStopParameter expected ticket15486 + +# crash when calling MSLink::opened without ego vehicle at allway_stop or priority_stop +ticket15603 diff --git a/tests/complex/traci/bugs/ticket15603/errors.complex b/tests/complex/traci/bugs/ticket15603/errors.complex new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/complex/traci/bugs/ticket15603/input_routes.rou.xml b/tests/complex/traci/bugs/ticket15603/input_routes.rou.xml new file mode 100644 index 000000000000..c920fdc69361 --- /dev/null +++ b/tests/complex/traci/bugs/ticket15603/input_routes.rou.xml @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/tests/complex/traci/bugs/ticket15603/net.net.xml b/tests/complex/traci/bugs/ticket15603/net.net.xml new file mode 100644 index 000000000000..b29999af2067 --- /dev/null +++ b/tests/complex/traci/bugs/ticket15603/net.net.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/complex/traci/bugs/ticket15603/options.complex b/tests/complex/traci/bugs/ticket15603/options.complex new file mode 100644 index 000000000000..d8522fae75d8 --- /dev/null +++ b/tests/complex/traci/bugs/ticket15603/options.complex @@ -0,0 +1 @@ +tests/complex/traci/bugs/ticket15603/runner.py diff --git a/tests/complex/traci/bugs/ticket15603/output.complex b/tests/complex/traci/bugs/ticket15603/output.complex new file mode 100644 index 000000000000..83d14196e6df --- /dev/null +++ b/tests/complex/traci/bugs/ticket15603/output.complex @@ -0,0 +1,3 @@ + Retrying in 1 seconds +connections (('E1_0', False, False, False, ':J1_3_0', 'w', 's', 11.2), ('E2_0', False, False, False, ':J2_3_0', 's', 's', 11.2)) +links [('E4_0', False, False, False, ':J1_2_0', 'w', 'r', 9.03), ('E1_0', False, False, False, ':J1_3_0', 'w', 's', 11.2)] diff --git a/tests/complex/traci/bugs/ticket15603/runner.py b/tests/complex/traci/bugs/ticket15603/runner.py new file mode 100644 index 000000000000..4cbaaf5143ef --- /dev/null +++ b/tests/complex/traci/bugs/ticket15603/runner.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo +# Copyright (C) 2008-2024 German Aerospace Center (DLR) and others. +# This program and the accompanying materials are made available under the +# terms of the Eclipse Public License 2.0 which is available at +# https://www.eclipse.org/legal/epl-2.0/ +# This Source Code may also be made available under the following Secondary +# Licenses when the conditions for such availability set forth in the Eclipse +# Public License 2.0 are satisfied: GNU General Public License, version 2 +# or later which is available at +# https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html +# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later + +# @file runner.py +# @author Jakob Erdmann +# @date 2024-09-16 + +from __future__ import print_function +from __future__ import absolute_import +import os +import sys + +if "SUMO_HOME" in os.environ: + sys.path.append(os.path.join(os.environ["SUMO_HOME"], "tools")) +import traci # noqa +import sumolib # noqa + +traci.start([sumolib.checkBinary('sumo'), + "-n", "net.net.xml", + "-r", "input_routes.rou.xml", + "--no-step-log"]) + + +vehicle_id = "t_0" +check1 = True + + +traci.simulationStep() +print("connections", traci.vehicle.getNextLinks(vehicle_id)) +print("links", traci.lane.getLinks("E0_0")) + +traci.close() diff --git a/tests/complex/traci/person/person/runner.py b/tests/complex/traci/person/person/runner.py index 6392cb1f0d08..4e120d68c207 100755 --- a/tests/complex/traci/person/person/runner.py +++ b/tests/complex/traci/person/person/runner.py @@ -251,7 +251,7 @@ def check(personID): traci.simulationStep() remaining = traci.person.getRemainingStages("p3") -assert(remaining == 1) +assert remaining == 1 # replace current stage print_remaining_plan("p3", "(before replacement of current stage)") traci.person.replaceStage("p3", 0, stage2) diff --git a/tests/complex/traci/simulation/loadState/railSignal/input_state.xml b/tests/complex/traci/simulation/loadState/railSignal/input_state.xml index 5159a5672b3f..4a9bc9f14a7c 100644 --- a/tests/complex/traci/simulation/loadState/railSignal/input_state.xml +++ b/tests/complex/traci/simulation/loadState/railSignal/input_state.xml @@ -1,16 +1,16 @@ - - + - + @@ -31,7 +31,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -61,4 +61,7 @@ + + + diff --git a/tests/complex/traci/simulation/loadState/railSignal/tripinfo.complex b/tests/complex/traci/simulation/loadState/railSignal/tripinfo.complex index 43e906c05651..6d3b7c1e31c5 100644 --- a/tests/complex/traci/simulation/loadState/railSignal/tripinfo.complex +++ b/tests/complex/traci/simulation/loadState/railSignal/tripinfo.complex @@ -1,7 +1,7 @@ - - + diff --git a/tests/complex/traci/trafficlight/actuated/runner.py b/tests/complex/traci/trafficlight/actuated/runner.py index 67b2cad9c183..4636d5e0ad84 100755 --- a/tests/complex/traci/trafficlight/actuated/runner.py +++ b/tests/complex/traci/trafficlight/actuated/runner.py @@ -38,7 +38,7 @@ if cand.programID == programID: logic = cand -assert(logic) +assert logic numPhases = len(logic.phases) print("current program '%s' has %s phases" % (programID, numPhases)) diff --git a/tests/complex/traci/trafficlight/constraints/swap/5/tripinfo.complex b/tests/complex/traci/trafficlight/constraints/swap/5/tripinfo.complex index 883c46dcf406..150bd5418668 100644 --- a/tests/complex/traci/trafficlight/constraints/swap/5/tripinfo.complex +++ b/tests/complex/traci/trafficlight/constraints/swap/5/tripinfo.complex @@ -1,7 +1,7 @@ - - + diff --git a/tests/complex/traci/trafficlight/constraints/swap/6/tripinfo.complex b/tests/complex/traci/trafficlight/constraints/swap/6/tripinfo.complex index 90fb0489d404..fc09272a0815 100644 --- a/tests/complex/traci/trafficlight/constraints/swap/6/tripinfo.complex +++ b/tests/complex/traci/trafficlight/constraints/swap/6/tripinfo.complex @@ -1,7 +1,7 @@ - - + diff --git a/tests/complex/traci/trafficlight/constraints/swap/bidi/tripinfo.complex b/tests/complex/traci/trafficlight/constraints/swap/bidi/tripinfo.complex index accf5f12dfb5..b616eba80e4c 100644 --- a/tests/complex/traci/trafficlight/constraints/swap/bidi/tripinfo.complex +++ b/tests/complex/traci/trafficlight/constraints/swap/bidi/tripinfo.complex @@ -1,7 +1,7 @@ - - + diff --git a/tests/complex/traci/trafficlight/constraints/swap/insertion/tripinfo.complex b/tests/complex/traci/trafficlight/constraints/swap/insertion/tripinfo.complex index f46277ea2bf9..18e6dbb10c04 100644 --- a/tests/complex/traci/trafficlight/constraints/swap/insertion/tripinfo.complex +++ b/tests/complex/traci/trafficlight/constraints/swap/insertion/tripinfo.complex @@ -1,7 +1,7 @@ - - + diff --git a/tests/complex/traci/trafficlight/constraints/swap/insertion_tripId/tripinfo.complex b/tests/complex/traci/trafficlight/constraints/swap/insertion_tripId/tripinfo.complex index 58d8b5a3d881..5bf7cc42347d 100644 --- a/tests/complex/traci/trafficlight/constraints/swap/insertion_tripId/tripinfo.complex +++ b/tests/complex/traci/trafficlight/constraints/swap/insertion_tripId/tripinfo.complex @@ -1,7 +1,7 @@ - - + diff --git a/tests/complex/traci/trafficlight/constraints/swap/redundant_1/tripinfo.complex b/tests/complex/traci/trafficlight/constraints/swap/redundant_1/tripinfo.complex index 707358a051c5..14b8945954c2 100644 --- a/tests/complex/traci/trafficlight/constraints/swap/redundant_1/tripinfo.complex +++ b/tests/complex/traci/trafficlight/constraints/swap/redundant_1/tripinfo.complex @@ -1,7 +1,7 @@ - - + diff --git a/tests/complex/traci/trafficlight/constraints/swap/redundant_2/tripinfo.complex b/tests/complex/traci/trafficlight/constraints/swap/redundant_2/tripinfo.complex index 2fe1da611ea8..730ffc8c225f 100644 --- a/tests/complex/traci/trafficlight/constraints/swap/redundant_2/tripinfo.complex +++ b/tests/complex/traci/trafficlight/constraints/swap/redundant_2/tripinfo.complex @@ -1,7 +1,7 @@ - - + diff --git a/tests/complex/traci/trafficlight/constraints/swap/redundant_2_routes/tripinfo.complex b/tests/complex/traci/trafficlight/constraints/swap/redundant_2_routes/tripinfo.complex index 0b7861a1129d..33594bbda89c 100644 --- a/tests/complex/traci/trafficlight/constraints/swap/redundant_2_routes/tripinfo.complex +++ b/tests/complex/traci/trafficlight/constraints/swap/redundant_2_routes/tripinfo.complex @@ -1,7 +1,7 @@ - - + diff --git a/tests/complex/traci/trafficlight/constraints/updateConstraints/tripinfo.complex b/tests/complex/traci/trafficlight/constraints/updateConstraints/tripinfo.complex index 26500497cab4..e5a87164cbd3 100644 --- a/tests/complex/traci/trafficlight/constraints/updateConstraints/tripinfo.complex +++ b/tests/complex/traci/trafficlight/constraints/updateConstraints/tripinfo.complex @@ -1,7 +1,7 @@ - - + diff --git a/tests/complex/traci/trafficlight/railsignal_state/errors.complex b/tests/complex/traci/trafficlight/railsignal_state/errors.complex index e69de29bb2d1..e31e563c0891 100644 --- a/tests/complex/traci/trafficlight/railsignal_state/errors.complex +++ b/tests/complex/traci/trafficlight/railsignal_state/errors.complex @@ -0,0 +1 @@ +Warning: Vehicle 'rail3' performs emergency stop at the end of lane 'T12_1_0' because of a red traffic light (decel=-19.88, offset=2.90), time=39.00. diff --git a/tests/complex/traci/trafficlight/railsignal_state/output.complex b/tests/complex/traci/trafficlight/railsignal_state/output.complex index 5e8df1434a46..3c47e5751ee0 100644 --- a/tests/complex/traci/trafficlight/railsignal_state/output.complex +++ b/tests/complex/traci/trafficlight/railsignal_state/output.complex @@ -28,13 +28,13 @@ 14.0 N1_0 b=() r=() p=() 14.0 N2_0 b=() r=('rail3',) p=('rail3',) 15.0 N1_0 b=() r=() p=() -15.0 N2_0 b=() r=('rail3',) p=('rail3',) +15.0 N2_0 b=() r=() p=() 16.0 N1_0 b=() r=() p=() -16.0 N2_0 b=() r=('rail3',) p=('rail3',) +16.0 N2_0 b=() r=() p=() 17.0 N1_0 b=() r=() p=() -17.0 N2_0 b=() r=('rail3',) p=('rail3',) +17.0 N2_0 b=() r=() p=() 18.0 N1_0 b=() r=() p=() -18.0 N2_0 b=() r=('rail3',) p=('rail3',) +18.0 N2_0 b=() r=() p=() 19.0 N1_0 b=() r=() p=() 19.0 N2_0 b=() r=() p=() 20.0 N1_0 b=() r=() p=() @@ -127,8 +127,8 @@ 63.0 N2_0 b=() r=('rail2',) p=() 64.0 N1_0 b=() r=('rail1',) p=('rail1',) 64.0 N2_0 b=() r=('rail2',) p=() -65.0 N1_0 b=() r=('rail1',) p=('rail1',) -65.0 N2_0 b=() r=('rail2',) p=() +65.0 N1_0 b=('rail1',) r=() p=() +65.0 N2_0 b=() r=() p=() 66.0 N1_0 b=('rail1',) r=() p=() 66.0 N2_0 b=('rail1',) r=() p=() 67.0 N1_0 b=('rail1',) r=() p=() @@ -207,8 +207,8 @@ 103.0 N2_0 b=('rail1',) r=() p=() 104.0 N1_0 b=('rail1',) r=() p=() 104.0 N2_0 b=('rail1',) r=() p=() -105.0 N1_0 b=('rail1',) r=() p=() -105.0 N2_0 b=('rail1',) r=() p=() +105.0 N1_0 b=() r=() p=() +105.0 N2_0 b=() r=() p=() 106.0 N1_0 b=() r=() p=() 106.0 N2_0 b=() r=() p=() 107.0 N1_0 b=() r=() p=() @@ -236,31 +236,31 @@ 118.0 N1_0 b=() r=() p=() 118.0 N2_0 b=() r=() p=() 119.0 N1_0 b=('rail2',) r=() p=() -119.0 N2_0 b=('rail2',) r=() p=() +119.0 N2_0 b=() r=() p=() 120.0 N1_0 b=('rail2',) r=() p=() -120.0 N2_0 b=('rail2',) r=() p=() +120.0 N2_0 b=() r=() p=() 121.0 N1_0 b=('rail2',) r=() p=() -121.0 N2_0 b=('rail2',) r=() p=() +121.0 N2_0 b=() r=() p=() 122.0 N1_0 b=('rail2',) r=() p=() -122.0 N2_0 b=('rail2',) r=() p=() +122.0 N2_0 b=() r=() p=() 123.0 N1_0 b=('rail2',) r=() p=() -123.0 N2_0 b=('rail2',) r=() p=() +123.0 N2_0 b=() r=() p=() 124.0 N1_0 b=('rail2',) r=() p=() -124.0 N2_0 b=('rail2',) r=() p=() +124.0 N2_0 b=() r=() p=() 125.0 N1_0 b=('rail2',) r=() p=() -125.0 N2_0 b=('rail2',) r=() p=() +125.0 N2_0 b=() r=() p=() 126.0 N1_0 b=('rail2',) r=() p=() -126.0 N2_0 b=('rail2',) r=() p=() +126.0 N2_0 b=() r=() p=() 127.0 N1_0 b=('rail2',) r=() p=() -127.0 N2_0 b=('rail2',) r=() p=() +127.0 N2_0 b=() r=() p=() 128.0 N1_0 b=('rail2',) r=() p=() -128.0 N2_0 b=('rail2',) r=() p=() +128.0 N2_0 b=() r=() p=() 129.0 N1_0 b=('rail2',) r=() p=() -129.0 N2_0 b=('rail2',) r=() p=() +129.0 N2_0 b=() r=() p=() 130.0 N1_0 b=('rail2',) r=() p=() -130.0 N2_0 b=('rail2',) r=() p=() +130.0 N2_0 b=() r=() p=() 131.0 N1_0 b=('rail2',) r=() p=() -131.0 N2_0 b=('rail2',) r=() p=() +131.0 N2_0 b=() r=() p=() 132.0 N1_0 b=('rail2',) r=() p=() 132.0 N2_0 b=('rail2',) r=() p=() 133.0 N1_0 b=('rail2',) r=() p=() @@ -282,7 +282,7 @@ 141.0 N1_0 b=('rail2',) r=() p=() 141.0 N2_0 b=('rail2',) r=() p=() 142.0 N1_0 b=('rail2',) r=() p=() -142.0 N2_0 b=('rail2',) r=() p=() +142.0 N2_0 b=() r=() p=() 143.0 N1_0 b=('rail2',) r=() p=() 143.0 N2_0 b=() r=() p=() 144.0 N1_0 b=('rail2',) r=() p=() @@ -355,84 +355,84 @@ 177.0 N2_0 b=() r=() p=() 178.0 N1_0 b=('rail2',) r=() p=() 178.0 N2_0 b=() r=() p=() -179.0 N1_0 b=('rail2',) r=() p=() +179.0 N1_0 b=() r=() p=() 179.0 N2_0 b=() r=() p=() 180.0 N1_0 b=() r=() p=() -180.0 N2_0 b=() r=() p=() +180.0 N2_0 b=('rail3',) r=() p=() 181.0 N1_0 b=() r=() p=() -181.0 N2_0 b=() r=() p=() +181.0 N2_0 b=('rail3',) r=() p=() 182.0 N1_0 b=() r=() p=() -182.0 N2_0 b=() r=() p=() +182.0 N2_0 b=('rail3',) r=() p=() 183.0 N1_0 b=() r=() p=() -183.0 N2_0 b=() r=() p=() +183.0 N2_0 b=('rail3',) r=() p=() 184.0 N1_0 b=() r=() p=() -184.0 N2_0 b=() r=() p=() +184.0 N2_0 b=('rail3',) r=() p=() 185.0 N1_0 b=() r=() p=() -185.0 N2_0 b=() r=() p=() +185.0 N2_0 b=('rail3',) r=() p=() 186.0 N1_0 b=() r=() p=() -186.0 N2_0 b=() r=() p=() +186.0 N2_0 b=('rail3',) r=() p=() 187.0 N1_0 b=() r=() p=() -187.0 N2_0 b=() r=() p=() +187.0 N2_0 b=('rail3',) r=() p=() 188.0 N1_0 b=() r=() p=() -188.0 N2_0 b=() r=() p=() +188.0 N2_0 b=('rail3',) r=() p=() 189.0 N1_0 b=() r=() p=() -189.0 N2_0 b=() r=() p=() +189.0 N2_0 b=('rail3',) r=() p=() 190.0 N1_0 b=() r=() p=() -190.0 N2_0 b=() r=() p=() +190.0 N2_0 b=('rail3',) r=() p=() 191.0 N1_0 b=() r=() p=() -191.0 N2_0 b=() r=() p=() +191.0 N2_0 b=('rail3',) r=() p=() 192.0 N1_0 b=() r=() p=() -192.0 N2_0 b=() r=() p=() +192.0 N2_0 b=('rail3',) r=() p=() 193.0 N1_0 b=() r=() p=() -193.0 N2_0 b=() r=() p=() +193.0 N2_0 b=('rail3',) r=() p=() 194.0 N1_0 b=() r=() p=() -194.0 N2_0 b=() r=() p=() +194.0 N2_0 b=('rail3',) r=() p=() 195.0 N1_0 b=() r=() p=() -195.0 N2_0 b=() r=() p=() +195.0 N2_0 b=('rail3',) r=() p=() 196.0 N1_0 b=() r=() p=() -196.0 N2_0 b=() r=() p=() +196.0 N2_0 b=('rail3',) r=() p=() 197.0 N1_0 b=() r=() p=() -197.0 N2_0 b=() r=() p=() +197.0 N2_0 b=('rail3',) r=() p=() 198.0 N1_0 b=() r=() p=() -198.0 N2_0 b=() r=() p=() +198.0 N2_0 b=('rail3',) r=() p=() 199.0 N1_0 b=() r=() p=() -199.0 N2_0 b=() r=() p=() +199.0 N2_0 b=('rail3',) r=() p=() 200.0 N1_0 b=() r=() p=() -200.0 N2_0 b=() r=() p=() +200.0 N2_0 b=('rail3',) r=() p=() 201.0 N1_0 b=() r=() p=() -201.0 N2_0 b=() r=() p=() +201.0 N2_0 b=('rail3',) r=() p=() 202.0 N1_0 b=() r=() p=() -202.0 N2_0 b=() r=() p=() +202.0 N2_0 b=('rail3',) r=() p=() 203.0 N1_0 b=() r=() p=() -203.0 N2_0 b=() r=() p=() +203.0 N2_0 b=('rail3',) r=() p=() 204.0 N1_0 b=() r=() p=() -204.0 N2_0 b=() r=() p=() +204.0 N2_0 b=('rail3',) r=() p=() 205.0 N1_0 b=() r=() p=() -205.0 N2_0 b=() r=() p=() +205.0 N2_0 b=('rail3',) r=() p=() 206.0 N1_0 b=() r=() p=() -206.0 N2_0 b=() r=() p=() +206.0 N2_0 b=('rail3',) r=() p=() 207.0 N1_0 b=() r=() p=() -207.0 N2_0 b=() r=() p=() +207.0 N2_0 b=('rail3',) r=() p=() 208.0 N1_0 b=() r=() p=() -208.0 N2_0 b=() r=() p=() +208.0 N2_0 b=('rail3',) r=() p=() 209.0 N1_0 b=() r=() p=() -209.0 N2_0 b=() r=() p=() +209.0 N2_0 b=('rail3',) r=() p=() 210.0 N1_0 b=() r=() p=() -210.0 N2_0 b=() r=() p=() +210.0 N2_0 b=('rail3',) r=() p=() 211.0 N1_0 b=() r=() p=() -211.0 N2_0 b=() r=() p=() +211.0 N2_0 b=('rail3',) r=() p=() 212.0 N1_0 b=() r=() p=() -212.0 N2_0 b=() r=() p=() +212.0 N2_0 b=('rail3',) r=() p=() 213.0 N1_0 b=() r=() p=() -213.0 N2_0 b=() r=() p=() +213.0 N2_0 b=('rail3',) r=() p=() 214.0 N1_0 b=() r=() p=() -214.0 N2_0 b=() r=() p=() +214.0 N2_0 b=('rail3',) r=() p=() 215.0 N1_0 b=() r=() p=() -215.0 N2_0 b=() r=() p=() +215.0 N2_0 b=('rail3',) r=() p=() 216.0 N1_0 b=() r=() p=() -216.0 N2_0 b=() r=() p=() +216.0 N2_0 b=('rail3',) r=() p=() 217.0 N1_0 b=() r=() p=() -217.0 N2_0 b=() r=() p=() +217.0 N2_0 b=('rail3',) r=() p=() 218.0 N1_0 b=() r=() p=() 218.0 N2_0 b=() r=() p=() 219.0 N1_0 b=() r=() p=() @@ -601,11 +601,11 @@ 300.0 N2_0 b=() r=() p=() 301.0 N1_0 b=() r=() p=() 301.0 N2_0 b=('rail4',) r=() p=() -302.0 N1_0 b=('rail4',) r=() p=() +302.0 N1_0 b=() r=() p=() 302.0 N2_0 b=('rail4',) r=() p=() -303.0 N1_0 b=('rail4',) r=() p=() +303.0 N1_0 b=() r=() p=() 303.0 N2_0 b=('rail4',) r=() p=() -304.0 N1_0 b=('rail4',) r=() p=() +304.0 N1_0 b=() r=() p=() 304.0 N2_0 b=('rail4',) r=() p=() 305.0 N1_0 b=('rail4',) r=() p=() 305.0 N2_0 b=('rail4',) r=() p=() @@ -1024,11 +1024,11 @@ 512.0 N1_0 b=() r=() p=() 512.0 N2_0 b=() r=('rail6',) p=() 513.0 N1_0 b=() r=() p=() -513.0 N2_0 b=() r=('rail6',) p=() +513.0 N2_0 b=() r=() p=() 514.0 N1_0 b=() r=() p=() -514.0 N2_0 b=() r=('rail6',) p=() +514.0 N2_0 b=() r=() p=() 515.0 N1_0 b=() r=() p=() -515.0 N2_0 b=() r=('rail6',) p=() +515.0 N2_0 b=() r=() p=() 516.0 N1_0 b=() r=() p=() 516.0 N2_0 b=() r=() p=() 517.0 N1_0 b=() r=() p=() @@ -1064,59 +1064,59 @@ 532.0 N1_0 b=() r=() p=() 532.0 N2_0 b=() r=() p=() 533.0 N1_0 b=() r=() p=() -533.0 N2_0 b=() r=('rail6',) p=() +533.0 N2_0 b=() r=() p=() 534.0 N1_0 b=() r=() p=() -534.0 N2_0 b=() r=('rail6',) p=() +534.0 N2_0 b=() r=() p=() 535.0 N1_0 b=() r=() p=() -535.0 N2_0 b=() r=('rail6',) p=() +535.0 N2_0 b=() r=() p=() 536.0 N1_0 b=() r=() p=() -536.0 N2_0 b=() r=('rail6',) p=() +536.0 N2_0 b=() r=() p=() 537.0 N1_0 b=() r=() p=() -537.0 N2_0 b=() r=('rail6',) p=() +537.0 N2_0 b=() r=() p=() 538.0 N1_0 b=() r=() p=() -538.0 N2_0 b=() r=('rail6',) p=() +538.0 N2_0 b=() r=() p=() 539.0 N1_0 b=() r=() p=() -539.0 N2_0 b=() r=('rail6',) p=() +539.0 N2_0 b=() r=() p=() 540.0 N1_0 b=() r=() p=() -540.0 N2_0 b=() r=('rail6',) p=() +540.0 N2_0 b=() r=() p=() 541.0 N1_0 b=() r=() p=() -541.0 N2_0 b=() r=('rail6',) p=() +541.0 N2_0 b=() r=() p=() 542.0 N1_0 b=() r=() p=() -542.0 N2_0 b=() r=('rail6',) p=() +542.0 N2_0 b=() r=() p=() 543.0 N1_0 b=() r=() p=() -543.0 N2_0 b=() r=('rail6',) p=() +543.0 N2_0 b=() r=() p=() 544.0 N1_0 b=() r=() p=() -544.0 N2_0 b=() r=('rail6',) p=() +544.0 N2_0 b=() r=() p=() 545.0 N1_0 b=() r=() p=() -545.0 N2_0 b=() r=('rail6',) p=() +545.0 N2_0 b=() r=() p=() 546.0 N1_0 b=() r=() p=() -546.0 N2_0 b=() r=('rail6',) p=() +546.0 N2_0 b=() r=() p=() 547.0 N1_0 b=() r=() p=() -547.0 N2_0 b=() r=('rail6',) p=() +547.0 N2_0 b=() r=() p=() 548.0 N1_0 b=() r=() p=() -548.0 N2_0 b=() r=('rail6',) p=() +548.0 N2_0 b=() r=() p=() 549.0 N1_0 b=() r=() p=() -549.0 N2_0 b=() r=('rail6',) p=() +549.0 N2_0 b=() r=() p=() 550.0 N1_0 b=() r=() p=() -550.0 N2_0 b=() r=('rail6',) p=() +550.0 N2_0 b=() r=() p=() 551.0 N1_0 b=() r=() p=() -551.0 N2_0 b=() r=('rail6',) p=() +551.0 N2_0 b=() r=() p=() 552.0 N1_0 b=() r=() p=() -552.0 N2_0 b=() r=('rail6',) p=() +552.0 N2_0 b=() r=() p=() 553.0 N1_0 b=() r=() p=() -553.0 N2_0 b=() r=('rail6',) p=() +553.0 N2_0 b=() r=() p=() 554.0 N1_0 b=() r=() p=() -554.0 N2_0 b=() r=('rail6',) p=() +554.0 N2_0 b=() r=() p=() 555.0 N1_0 b=() r=() p=() -555.0 N2_0 b=() r=('rail6',) p=() +555.0 N2_0 b=() r=() p=() 556.0 N1_0 b=() r=() p=() -556.0 N2_0 b=() r=('rail6',) p=() +556.0 N2_0 b=() r=() p=() 557.0 N1_0 b=() r=() p=() -557.0 N2_0 b=() r=('rail6',) p=() +557.0 N2_0 b=() r=() p=() 558.0 N1_0 b=() r=() p=() -558.0 N2_0 b=() r=('rail6',) p=() +558.0 N2_0 b=() r=() p=() 559.0 N1_0 b=() r=() p=() -559.0 N2_0 b=('rail5',) r=() p=() +559.0 N2_0 b=() r=() p=() 560.0 N1_0 b=() r=() p=() 560.0 N2_0 b=('rail5',) r=() p=() 561.0 N1_0 b=() r=() p=() @@ -1127,17 +1127,17 @@ 563.0 N2_0 b=('rail5',) r=() p=() 564.0 N1_0 b=() r=() p=() 564.0 N2_0 b=('rail5',) r=() p=() -565.0 N1_0 b=('rail5',) r=() p=() +565.0 N1_0 b=() r=() p=() 565.0 N2_0 b=('rail5',) r=() p=() -566.0 N1_0 b=('rail5',) r=() p=() +566.0 N1_0 b=() r=() p=() 566.0 N2_0 b=('rail5',) r=() p=() -567.0 N1_0 b=('rail5',) r=() p=() +567.0 N1_0 b=() r=() p=() 567.0 N2_0 b=('rail5',) r=() p=() -568.0 N1_0 b=('rail5',) r=() p=() +568.0 N1_0 b=() r=() p=() 568.0 N2_0 b=('rail5',) r=() p=() -569.0 N1_0 b=('rail5',) r=() p=() +569.0 N1_0 b=() r=() p=() 569.0 N2_0 b=('rail5',) r=() p=() -570.0 N1_0 b=('rail5',) r=() p=() +570.0 N1_0 b=() r=() p=() 570.0 N2_0 b=('rail5',) r=() p=() 571.0 N1_0 b=('rail5',) r=() p=() 571.0 N2_0 b=('rail5',) r=() p=() @@ -1363,47 +1363,47 @@ 681.0 N2_0 b=('rail6',) r=() p=() 682.0 N1_0 b=('rail6',) r=() p=() 682.0 N2_0 b=('rail6',) r=() p=() -683.0 N1_0 b=('rail6',) r=() p=() -683.0 N2_0 b=() r=() p=() -684.0 N1_0 b=('rail6',) r=() p=() -684.0 N2_0 b=() r=() p=() -685.0 N1_0 b=('rail6',) r=() p=() -685.0 N2_0 b=() r=() p=() -686.0 N1_0 b=('rail6',) r=() p=() -686.0 N2_0 b=() r=() p=() -687.0 N1_0 b=('rail6',) r=() p=() -687.0 N2_0 b=() r=() p=() -688.0 N1_0 b=('rail6',) r=() p=() -688.0 N2_0 b=() r=() p=() -689.0 N1_0 b=('rail6',) r=() p=() -689.0 N2_0 b=() r=() p=() -690.0 N1_0 b=('rail6',) r=() p=() -690.0 N2_0 b=() r=() p=() -691.0 N1_0 b=('rail6',) r=() p=() -691.0 N2_0 b=() r=() p=() -692.0 N1_0 b=('rail6',) r=() p=() -692.0 N2_0 b=() r=() p=() -693.0 N1_0 b=('rail6',) r=() p=() -693.0 N2_0 b=() r=() p=() -694.0 N1_0 b=('rail6',) r=() p=() -694.0 N2_0 b=() r=() p=() -695.0 N1_0 b=('rail6',) r=() p=() -695.0 N2_0 b=() r=() p=() -696.0 N1_0 b=('rail6',) r=() p=() -696.0 N2_0 b=() r=() p=() -697.0 N1_0 b=('rail6',) r=() p=() -697.0 N2_0 b=() r=() p=() -698.0 N1_0 b=('rail6',) r=() p=() -698.0 N2_0 b=() r=() p=() -699.0 N1_0 b=('rail6',) r=() p=() +683.0 N1_0 b=() r=() p=() +683.0 N2_0 b=('rail6',) r=() p=() +684.0 N1_0 b=() r=() p=() +684.0 N2_0 b=('rail6',) r=() p=() +685.0 N1_0 b=() r=() p=() +685.0 N2_0 b=('rail6',) r=() p=() +686.0 N1_0 b=() r=() p=() +686.0 N2_0 b=('rail6',) r=() p=() +687.0 N1_0 b=() r=() p=() +687.0 N2_0 b=('rail6',) r=() p=() +688.0 N1_0 b=() r=() p=() +688.0 N2_0 b=('rail6',) r=() p=() +689.0 N1_0 b=() r=() p=() +689.0 N2_0 b=('rail6',) r=() p=() +690.0 N1_0 b=() r=() p=() +690.0 N2_0 b=('rail6',) r=() p=() +691.0 N1_0 b=() r=() p=() +691.0 N2_0 b=('rail6',) r=() p=() +692.0 N1_0 b=() r=() p=() +692.0 N2_0 b=('rail6',) r=() p=() +693.0 N1_0 b=() r=() p=() +693.0 N2_0 b=('rail6',) r=() p=() +694.0 N1_0 b=() r=() p=() +694.0 N2_0 b=('rail6',) r=() p=() +695.0 N1_0 b=() r=() p=() +695.0 N2_0 b=('rail6',) r=() p=() +696.0 N1_0 b=() r=() p=() +696.0 N2_0 b=('rail6',) r=() p=() +697.0 N1_0 b=() r=() p=() +697.0 N2_0 b=('rail6',) r=() p=() +698.0 N1_0 b=() r=() p=() +698.0 N2_0 b=('rail6',) r=() p=() +699.0 N1_0 b=() r=() p=() 699.0 N2_0 b=() r=() p=() -700.0 N1_0 b=('rail6',) r=() p=() +700.0 N1_0 b=() r=() p=() 700.0 N2_0 b=() r=() p=() -701.0 N1_0 b=('rail6',) r=() p=() +701.0 N1_0 b=() r=() p=() 701.0 N2_0 b=() r=() p=() -702.0 N1_0 b=('rail6',) r=() p=() +702.0 N1_0 b=() r=() p=() 702.0 N2_0 b=() r=() p=() -703.0 N1_0 b=('rail6',) r=() p=() +703.0 N1_0 b=() r=() p=() 703.0 N2_0 b=() r=() p=() 704.0 N1_0 b=() r=() p=() 704.0 N2_0 b=() r=() p=() @@ -1569,3 +1569,31 @@ 784.0 N2_0 b=() r=() p=() 785.0 N1_0 b=() r=() p=() 785.0 N2_0 b=() r=() p=() +786.0 N1_0 b=() r=() p=() +786.0 N2_0 b=() r=() p=() +787.0 N1_0 b=() r=() p=() +787.0 N2_0 b=() r=() p=() +788.0 N1_0 b=() r=() p=() +788.0 N2_0 b=() r=() p=() +789.0 N1_0 b=() r=() p=() +789.0 N2_0 b=() r=() p=() +790.0 N1_0 b=() r=() p=() +790.0 N2_0 b=() r=() p=() +791.0 N1_0 b=() r=() p=() +791.0 N2_0 b=() r=() p=() +792.0 N1_0 b=() r=() p=() +792.0 N2_0 b=() r=() p=() +793.0 N1_0 b=() r=() p=() +793.0 N2_0 b=() r=() p=() +794.0 N1_0 b=() r=() p=() +794.0 N2_0 b=() r=() p=() +795.0 N1_0 b=() r=() p=() +795.0 N2_0 b=() r=() p=() +796.0 N1_0 b=() r=() p=() +796.0 N2_0 b=() r=() p=() +797.0 N1_0 b=() r=() p=() +797.0 N2_0 b=() r=() p=() +798.0 N1_0 b=() r=() p=() +798.0 N2_0 b=() r=() p=() +799.0 N1_0 b=() r=() p=() +799.0 N2_0 b=() r=() p=() diff --git a/tests/complex/traci/vehicle/distance_after_reroute/runner.py b/tests/complex/traci/vehicle/distance_after_reroute/runner.py index 75c52ca44ba8..e30a97e27c34 100755 --- a/tests/complex/traci/vehicle/distance_after_reroute/runner.py +++ b/tests/complex/traci/vehicle/distance_after_reroute/runner.py @@ -39,10 +39,10 @@ def main(args): print(traci.vehicle.getDistance('Stapler_00')) traci.vehicle.setRoute('Stapler_00', ('ed1', 'ed5')) print(traci.vehicle.getRoute('Stapler_00')) - # assert(traci.vehicle.getRoute('Stapler_00') == ('ed0', 'ed1', 'ed5')) + # assert traci.vehicle.getRoute('Stapler_00') == ('ed0', 'ed1', 'ed5') print(traci.vehicle.getDistance('Stapler_00')) if step == 122: - # assert(traci.vehicle.getRoute('Stapler_00') == ('ed0', 'ed1', 'ed5')) + # assert traci.vehicle.getRoute('Stapler_00') == ('ed0', 'ed1', 'ed5') print(traci.vehicle.getDistance('Stapler_00')) traci.vehicle.setRouteID('Stapler_00', "short") print(traci.vehicle.getRoute('Stapler_00')) diff --git a/tests/complex/traci/vehicle/replaceStop/second_teleport_oncoming/runner.py b/tests/complex/traci/vehicle/replaceStop/second_teleport_oncoming/runner.py index 38d5d804fcaf..cb3201c06842 100755 --- a/tests/complex/traci/vehicle/replaceStop/second_teleport_oncoming/runner.py +++ b/tests/complex/traci/vehicle/replaceStop/second_teleport_oncoming/runner.py @@ -37,6 +37,7 @@ "-r", "input_routes.rou.xml", "--no-step-log", "--vehroute-output", "vehroutes.xml", + "--device.rerouting.railsignal", "false", "--time-to-teleport.disconnected", "1", ] + sys.argv[1:]) diff --git a/tests/complex/traci/vehicle/replaceStop/second_teleport_oncoming/vehroutes.complex b/tests/complex/traci/vehicle/replaceStop/second_teleport_oncoming/vehroutes.complex index b4af98e17de8..532778ff95d9 100644 --- a/tests/complex/traci/vehicle/replaceStop/second_teleport_oncoming/vehroutes.complex +++ b/tests/complex/traci/vehicle/replaceStop/second_teleport_oncoming/vehroutes.complex @@ -1,7 +1,7 @@ - @@ -33,11 +37,10 @@ - + - - + diff --git a/tests/complex/traci/vehicle/setStop/abort/runner.py b/tests/complex/traci/vehicle/setStop/abort/runner.py index 78b873667cae..f9161e6abaf7 100755 --- a/tests/complex/traci/vehicle/setStop/abort/runner.py +++ b/tests/complex/traci/vehicle/setStop/abort/runner.py @@ -47,7 +47,7 @@ while traci.simulation.getMinExpectedNumber() > 0: if traci.vehicle.isStopped(vehID): stop = traci.vehicle.getStops(vehID, 1)[0] - assert(stop.stoppingPlaceID != "") + assert stop.stoppingPlaceID != "" traci.vehicle.setBusStop(vehID, stop.stoppingPlaceID, duration=0) traci.simulationStep() traci.close() diff --git a/tests/complex/traci/vehicle/setStop/updateDuration_reached/runner.py b/tests/complex/traci/vehicle/setStop/updateDuration_reached/runner.py index 8d25bc6b6f82..b54597dc2cfd 100755 --- a/tests/complex/traci/vehicle/setStop/updateDuration_reached/runner.py +++ b/tests/complex/traci/vehicle/setStop/updateDuration_reached/runner.py @@ -48,7 +48,7 @@ # only update duration once if traci.vehicle.getParameter(vehID, "updated") != "1" and traci.vehicle.isStopped(vehID): stop = traci.vehicle.getStops(vehID, 1)[0] - assert(stop.stoppingPlaceID != "") + assert stop.stoppingPlaceID != "" traci.vehicle.setBusStop(vehID, stop.stoppingPlaceID, duration=60) traci.vehicle.setParameter(vehID, "updated", "1") stop2 = traci.vehicle.getStops(vehID, 1)[0] diff --git a/tests/complex/traci/vehicle/setStop/updateDuration_upcoming/runner.py b/tests/complex/traci/vehicle/setStop/updateDuration_upcoming/runner.py index 0df0f8c943ac..adf90e39f2fc 100755 --- a/tests/complex/traci/vehicle/setStop/updateDuration_upcoming/runner.py +++ b/tests/complex/traci/vehicle/setStop/updateDuration_upcoming/runner.py @@ -43,7 +43,7 @@ vehID = "ego" stop = traci.vehicle.getStops(vehID, 1)[0] -assert(stop.stoppingPlaceID != "") +assert stop.stoppingPlaceID != "" traci.vehicle.setBusStop(vehID, stop.stoppingPlaceID, duration=60) stop2 = traci.vehicle.getStops(vehID, 1)[0] print("new duration=%s" % stop2.duration) diff --git a/tests/complex/traci_java/runner.py b/tests/complex/traci_java/runner.py index 494a4283163f..369f08a541e4 100755 --- a/tests/complex/traci_java/runner.py +++ b/tests/complex/traci_java/runner.py @@ -42,7 +42,7 @@ traciJar = max(files, key=os.path.getmtime) # print("traciJar", traciJar) -assert(os.path.exists(traciJar)) +assert os.path.exists(traciJar) for f in sys.argv[1:]: fname = "data/%s.java" % f diff --git a/tests/netedit/config.netedit b/tests/netedit/config.netedit index cc8c777a71bf..e4fbca827bdd 100644 --- a/tests/netedit/config.netedit +++ b/tests/netedit/config.netedit @@ -118,6 +118,8 @@ errors:X connection to errors:Could not load{LINES 1} errors:Debug: Modules: errors:{INTERNAL writedir}{REPLACE } +errors:error: XDG_RUNTIME_DIR is invalid or not set in the environment. +errors:MESA: error: ZINK: {LINES 2} errors:\\{REPLACE /} log:{INTERNAL writedir}{REPLACE } log:\\{REPLACE /} diff --git a/tests/netedit/network/trafficlights/joined/phases/actuated/testsuite.netedit b/tests/netedit/network/trafficlights/joined/phases/actuated/testsuite.netedit index 6039f6fb08be..9259aea14edf 100644 --- a/tests/netedit/network/trafficlights/joined/phases/actuated/testsuite.netedit +++ b/tests/netedit/network/trafficlights/joined/phases/actuated/testsuite.netedit @@ -6,12 +6,6 @@ max state -vehext - -yellow - -red - next name diff --git a/tests/netedit/network/trafficlights/joined/phases/actuated/testsuite.neteditcheckoutput b/tests/netedit/network/trafficlights/joined/phases/actuated/testsuite.neteditcheckoutput index 6039f6fb08be..9259aea14edf 100644 --- a/tests/netedit/network/trafficlights/joined/phases/actuated/testsuite.neteditcheckoutput +++ b/tests/netedit/network/trafficlights/joined/phases/actuated/testsuite.neteditcheckoutput @@ -6,12 +6,6 @@ max state -vehext - -yellow - -red - next name diff --git a/tests/polyconvert/meta/help/output.polyconvert b/tests/polyconvert/meta/help/output.polyconvert index eb7ba89a46a9..f3d7d358f527 100644 --- a/tests/polyconvert/meta/help/output.polyconvert +++ b/tests/polyconvert/meta/help/output.polyconvert @@ -1,4 +1,4 @@ -Eclipse SUMO polyconvert Version v1_20_0+1699-94bb18538d6 +Eclipse SUMO polyconvert Version v1_21_0+0462-0373bcb962f Copyright (C) 2001-2024 German Aerospace Center (DLR) and others; https://sumo.dlr.de Importer of polygons and POIs for the microscopic, multi-modal traffic simulation SUMO. @@ -100,6 +100,7 @@ Processing Options: --ignore-errors Continue on broken input --poi-layer-offset FLOAT Adds FLOAT to the layer value for each poi (i.e. to raise it above polygons) + --flatten Remove all z-data Building Defaults Options: --color STR Sets STR as default color diff --git a/tests/polyconvert/meta/write_template_full/cfg.polyconvert b/tests/polyconvert/meta/write_template_full/cfg.polyconvert index 9090f85e6bd7..bf22f9989785 100644 --- a/tests/polyconvert/meta/write_template_full/cfg.polyconvert +++ b/tests/polyconvert/meta/write_template_full/cfg.polyconvert @@ -1,6 +1,6 @@ - @@ -73,6 +73,7 @@ + diff --git a/tests/runExtraTests.py b/tests/runExtraTests.py index f6e87d6f3b31..1849ac1f085c 100755 --- a/tests/runExtraTests.py +++ b/tests/runExtraTests.py @@ -44,12 +44,6 @@ def run(suffix, args, guiTests=False, chrouter=True): "complex.meso,complex.libsumo,complex.libtraci" if chrouter: apps += ",duarouter.chrouter,duarouter.chwrapper" - try: - if os.name == "posix": - subprocess.call(['python2', '-V'], stdout=open(os.devnull, "w")) - apps += ',complex.python2,tools.python2' - except Exception: - pass if guiTests: apps += ",sumo.meso.gui,sumo.gui.osg" if os.name == "posix": diff --git a/tests/runTests.sh b/tests/runTests.sh index f6812b7152e7..a3f73f70c27e 100755 --- a/tests/runTests.sh +++ b/tests/runTests.sh @@ -21,6 +21,14 @@ fi pushd `dirname $0` > /dev/null export TEXTTEST_HOME="$PWD" +for i in *env/bin/activate; do + if test x"$VIRTUAL_ENV" = x; then + echo "Activating virtual environment $i." + source $i + else + echo "Virtual environment $VIRTUAL_ENV already active, ignoring $i." + fi +done if test x"$SUMO_HOME" = x; then cd .. export SUMO_HOME="$PWD" diff --git a/tests/sumo/basic/personFlow/unboarding_curved/options.sumo b/tests/sumo/basic/personFlow/unboarding_curved/options.sumo index 910e200ffad5..ba23ed2cd74a 100644 --- a/tests/sumo/basic/personFlow/unboarding_curved/options.sumo +++ b/tests/sumo/basic/personFlow/unboarding_curved/options.sumo @@ -1 +1,2 @@ -e 600 --no-step-log --no-duration-log --net-file=net.net.xml --fcd-output fcd.xml --routes=input_routes.rou.xml --additional-files input_additional.add.xml +--railsignal-moving-block diff --git a/tests/sumo/basic/stops/long_rail_at_containerstop2/options.sumo b/tests/sumo/basic/stops/long_rail_at_containerstop2/options.sumo index f48515c9f0f3..2a16c75a4d8b 100644 --- a/tests/sumo/basic/stops/long_rail_at_containerstop2/options.sumo +++ b/tests/sumo/basic/stops/long_rail_at_containerstop2/options.sumo @@ -1 +1,2 @@ --no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml -a=input_additional.add.xml --tripinfo-output=tripinfos.xml -e 1000 +--railsignal-moving-block diff --git a/tests/sumo/basic/stops/two_rails_at_one_containerstop/options.sumo b/tests/sumo/basic/stops/two_rails_at_one_containerstop/options.sumo index f48515c9f0f3..2a16c75a4d8b 100644 --- a/tests/sumo/basic/stops/two_rails_at_one_containerstop/options.sumo +++ b/tests/sumo/basic/stops/two_rails_at_one_containerstop/options.sumo @@ -1 +1,2 @@ --no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml -a=input_additional.add.xml --tripinfo-output=tripinfos.xml -e 1000 +--railsignal-moving-block diff --git a/tests/sumo/bugs/15xxx/testsuite.sumo b/tests/sumo/bugs/15xxx/testsuite.sumo index c403db2a02bf..731c005c0a07 100644 --- a/tests/sumo/bugs/15xxx/testsuite.sumo +++ b/tests/sumo/bugs/15xxx/testsuite.sumo @@ -30,3 +30,6 @@ ticket15435 # collision most likely due to driving imprecision ticket15440 + +# rerouting on the last edge to the stop on the same edge +ticket15552 diff --git a/tests/sumo/bugs/15xxx/ticket15552/errors.sumo b/tests/sumo/bugs/15xxx/ticket15552/errors.sumo new file mode 100644 index 000000000000..1bb98c900a72 --- /dev/null +++ b/tests/sumo/bugs/15xxx/ticket15552/errors.sumo @@ -0,0 +1,11 @@ +Warning: ParkingArea 'pa_end' is targeted by rerouter 'pa_middle' but doesn't have its own rerouter. This may cause parking search to abort. +Warning: No connection between edge 'end' and edge 'end' found. +Warning: No connection between edge 'end' and edge 'end' found. +Warning: Teleporting vehicle 'veh1'; waited too long (jam), lane='end_0', time=486.50. +Warning: Vehicle 'veh1' teleports beyond arrival edge 'end', time=486.50. +Warning: Vehicle 'veh1' skips stop on lane 'end_0' time=486.50. +Warning: No connection between edge 'end' and edge 'end' found. +Warning: No connection between edge 'end' and edge 'end' found. +Warning: Teleporting vehicle 'veh2'; waited too long (jam), lane='end_0', time=790.00. +Warning: Vehicle 'veh2' teleports beyond arrival edge 'end', time=790.00. +Warning: Vehicle 'veh2' skips stop on lane 'end_0' time=790.00. diff --git a/tests/sumo/bugs/15xxx/ticket15552/errors.sumo.meso b/tests/sumo/bugs/15xxx/ticket15552/errors.sumo.meso new file mode 100644 index 000000000000..895edeeb0fa4 --- /dev/null +++ b/tests/sumo/bugs/15xxx/ticket15552/errors.sumo.meso @@ -0,0 +1 @@ +Warning: ParkingArea 'pa_end' is targeted by rerouter 'pa_middle' but doesn't have its own rerouter. This may cause parking search to abort. diff --git a/tests/sumo/bugs/15xxx/ticket15552/input_additional.add.xml b/tests/sumo/bugs/15xxx/ticket15552/input_additional.add.xml new file mode 100644 index 000000000000..654757b0bd6e --- /dev/null +++ b/tests/sumo/bugs/15xxx/ticket15552/input_additional.add.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/bugs/15xxx/ticket15552/input_routes.rou.xml b/tests/sumo/bugs/15xxx/ticket15552/input_routes.rou.xml new file mode 100644 index 000000000000..51c19a4963ff --- /dev/null +++ b/tests/sumo/bugs/15xxx/ticket15552/input_routes.rou.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/bugs/15xxx/ticket15552/options.sumo b/tests/sumo/bugs/15xxx/ticket15552/options.sumo new file mode 100644 index 000000000000..77201f421b8d --- /dev/null +++ b/tests/sumo/bugs/15xxx/ticket15552/options.sumo @@ -0,0 +1,6 @@ +--no-step-log --net-file=three_split.net.xml +-a=input_additional.add.xml +-r=input_routes.rou.xml +--step-length=0.5 +--device.rerouting.synchronize=true +--device.rerouting.period=150 diff --git a/tests/sumo/bugs/15xxx/ticket15552/output.sumo b/tests/sumo/bugs/15xxx/ticket15552/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/cf_model/rail/accel/Freight/errors.sumo b/tests/sumo/cf_model/rail/accel/Freight/errors.sumo index e69de29bb2d1..7cd189c07e9a 100644 --- a/tests/sumo/cf_model/rail/accel/Freight/errors.sumo +++ b/tests/sumo/cf_model/rail/accel/Freight/errors.sumo @@ -0,0 +1 @@ +Warning: Block after insertion lane 'e0_0' exceeds maximum length (stopped searching after edge 'e2' (length=21998.62m). diff --git a/tests/sumo/cf_model/rail/accel/Freight_custom/errors.sumo b/tests/sumo/cf_model/rail/accel/Freight_custom/errors.sumo index e69de29bb2d1..7cd189c07e9a 100644 --- a/tests/sumo/cf_model/rail/accel/Freight_custom/errors.sumo +++ b/tests/sumo/cf_model/rail/accel/Freight_custom/errors.sumo @@ -0,0 +1 @@ +Warning: Block after insertion lane 'e0_0' exceeds maximum length (stopped searching after edge 'e2' (length=21998.62m). diff --git a/tests/sumo/cf_model/rail/accel/Freight_heavier/errors.sumo b/tests/sumo/cf_model/rail/accel/Freight_heavier/errors.sumo index e69de29bb2d1..7cd189c07e9a 100644 --- a/tests/sumo/cf_model/rail/accel/Freight_heavier/errors.sumo +++ b/tests/sumo/cf_model/rail/accel/Freight_heavier/errors.sumo @@ -0,0 +1 @@ +Warning: Block after insertion lane 'e0_0' exceeds maximum length (stopped searching after edge 'e2' (length=21998.62m). diff --git a/tests/sumo/cf_model/rail/accel/ICE1/errors.sumo b/tests/sumo/cf_model/rail/accel/ICE1/errors.sumo index e69de29bb2d1..7cd189c07e9a 100644 --- a/tests/sumo/cf_model/rail/accel/ICE1/errors.sumo +++ b/tests/sumo/cf_model/rail/accel/ICE1/errors.sumo @@ -0,0 +1 @@ +Warning: Block after insertion lane 'e0_0' exceeds maximum length (stopped searching after edge 'e2' (length=21998.62m). diff --git a/tests/sumo/cf_model/rail/accel/ICE3/errors.sumo b/tests/sumo/cf_model/rail/accel/ICE3/errors.sumo index e69de29bb2d1..7cd189c07e9a 100644 --- a/tests/sumo/cf_model/rail/accel/ICE3/errors.sumo +++ b/tests/sumo/cf_model/rail/accel/ICE3/errors.sumo @@ -0,0 +1 @@ +Warning: Block after insertion lane 'e0_0' exceeds maximum length (stopped searching after edge 'e2' (length=21998.62m). diff --git a/tests/sumo/cf_model/rail/accel/MireoPlusB/errors.sumo b/tests/sumo/cf_model/rail/accel/MireoPlusB/errors.sumo index e69de29bb2d1..7cd189c07e9a 100644 --- a/tests/sumo/cf_model/rail/accel/MireoPlusB/errors.sumo +++ b/tests/sumo/cf_model/rail/accel/MireoPlusB/errors.sumo @@ -0,0 +1 @@ +Warning: Block after insertion lane 'e0_0' exceeds maximum length (stopped searching after edge 'e2' (length=21998.62m). diff --git a/tests/sumo/cf_model/rail/accel/MireoPlusH/errors.sumo b/tests/sumo/cf_model/rail/accel/MireoPlusH/errors.sumo index e69de29bb2d1..7cd189c07e9a 100644 --- a/tests/sumo/cf_model/rail/accel/MireoPlusH/errors.sumo +++ b/tests/sumo/cf_model/rail/accel/MireoPlusH/errors.sumo @@ -0,0 +1 @@ +Warning: Block after insertion lane 'e0_0' exceeds maximum length (stopped searching after edge 'e2' (length=21998.62m). diff --git a/tests/sumo/cf_model/rail/accel/NGRS3/vehroutes.sumo b/tests/sumo/cf_model/rail/accel/NGRS3/vehroutes.sumo index 7e3819f8e85e..8613f2448b28 100644 --- a/tests/sumo/cf_model/rail/accel/NGRS3/vehroutes.sumo +++ b/tests/sumo/cf_model/rail/accel/NGRS3/vehroutes.sumo @@ -1,12 +1,17 @@ - - - + + + + - + - - - - + + - + diff --git a/tests/sumo/cf_model/rail/accel/NGT400/errors.sumo b/tests/sumo/cf_model/rail/accel/NGT400/errors.sumo index e69de29bb2d1..7cd189c07e9a 100644 --- a/tests/sumo/cf_model/rail/accel/NGT400/errors.sumo +++ b/tests/sumo/cf_model/rail/accel/NGT400/errors.sumo @@ -0,0 +1 @@ +Warning: Block after insertion lane 'e0_0' exceeds maximum length (stopped searching after edge 'e2' (length=21998.62m). diff --git a/tests/sumo/cf_model/rail/accel/NGT400_16/errors.sumo b/tests/sumo/cf_model/rail/accel/NGT400_16/errors.sumo index e69de29bb2d1..7cd189c07e9a 100644 --- a/tests/sumo/cf_model/rail/accel/NGT400_16/errors.sumo +++ b/tests/sumo/cf_model/rail/accel/NGT400_16/errors.sumo @@ -0,0 +1 @@ +Warning: Block after insertion lane 'e0_0' exceeds maximum length (stopped searching after edge 'e2' (length=21998.62m). diff --git a/tests/sumo/cf_model/rail/accel/RB425/errors.sumo b/tests/sumo/cf_model/rail/accel/RB425/errors.sumo index e69de29bb2d1..7cd189c07e9a 100644 --- a/tests/sumo/cf_model/rail/accel/RB425/errors.sumo +++ b/tests/sumo/cf_model/rail/accel/RB425/errors.sumo @@ -0,0 +1 @@ +Warning: Block after insertion lane 'e0_0' exceeds maximum length (stopped searching after edge 'e2' (length=21998.62m). diff --git a/tests/sumo/cf_model/rail/accel/RB628/errors.sumo b/tests/sumo/cf_model/rail/accel/RB628/errors.sumo index e69de29bb2d1..7cd189c07e9a 100644 --- a/tests/sumo/cf_model/rail/accel/RB628/errors.sumo +++ b/tests/sumo/cf_model/rail/accel/RB628/errors.sumo @@ -0,0 +1 @@ +Warning: Block after insertion lane 'e0_0' exceeds maximum length (stopped searching after edge 'e2' (length=21998.62m). diff --git a/tests/sumo/cf_model/rail/accel/REDosto7/errors.sumo b/tests/sumo/cf_model/rail/accel/REDosto7/errors.sumo index e69de29bb2d1..7cd189c07e9a 100644 --- a/tests/sumo/cf_model/rail/accel/REDosto7/errors.sumo +++ b/tests/sumo/cf_model/rail/accel/REDosto7/errors.sumo @@ -0,0 +1 @@ +Warning: Block after insertion lane 'e0_0' exceeds maximum length (stopped searching after edge 'e2' (length=21998.62m). diff --git a/tests/sumo/cf_model/rail/accel/custom_curves/errors.sumo b/tests/sumo/cf_model/rail/accel/custom_curves/errors.sumo index e69de29bb2d1..7cd189c07e9a 100644 --- a/tests/sumo/cf_model/rail/accel/custom_curves/errors.sumo +++ b/tests/sumo/cf_model/rail/accel/custom_curves/errors.sumo @@ -0,0 +1 @@ +Warning: Block after insertion lane 'e0_0' exceeds maximum length (stopped searching after edge 'e2' (length=21998.62m). diff --git a/tests/sumo/cf_model/rail/accel/custom_tables/errors.sumo b/tests/sumo/cf_model/rail/accel/custom_tables/errors.sumo index e69de29bb2d1..7cd189c07e9a 100644 --- a/tests/sumo/cf_model/rail/accel/custom_tables/errors.sumo +++ b/tests/sumo/cf_model/rail/accel/custom_tables/errors.sumo @@ -0,0 +1 @@ +Warning: Block after insertion lane 'e0_0' exceeds maximum length (stopped searching after edge 'e2' (length=21998.62m). diff --git a/tests/sumo/config.sumo b/tests/sumo/config.sumo index ada9484ba405..b91ee480a686 100644 --- a/tests/sumo/config.sumo +++ b/tests/sumo/config.sumo @@ -93,12 +93,16 @@ binstate:state.sbx calibrator_log:calibrator.log.xml links:linkstate.xml railsignalblocks:railsignal_blocks.xml +railsignalvehs:railsignal_vehicles.xml +railsignalblocks2:railsignal_blocks2.xml +railsignalvehs2:railsignal_vehicles2.xml dispatchinfos:dispatchinfos.xml aggregated60Prefixed:pre_aggregated_60.xml tripinfosPrefix:pre_tripinfos.xml logPrefixed:pre_log.txt weights:weights.xml lanechanges:lanechanges.xml +deadlocks:deadlocks.xml ssm:ssm.xml ssm2:ssm_ego.xml png:out.png @@ -147,6 +151,9 @@ battery: chargingstations: links: railsignalblocks: +railsignalvehs: +railsignalblocks2: +railsignalvehs2: dispatchinfos: ssm: ssm2: @@ -200,6 +207,7 @@ cfg:JuPedSim cfg:^$ weights: lanechanges: +deadlocks: ps:%%CreationDate ps2:%%CreationDate statistic: + + + + + + diff --git a/tests/sumo/errors/invalid_insertionChecks/options.sumo b/tests/sumo/errors/invalid_insertionChecks/options.sumo new file mode 100644 index 000000000000..577b373fbc50 --- /dev/null +++ b/tests/sumo/errors/invalid_insertionChecks/options.sumo @@ -0,0 +1,3 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r input_routes.rou.xml --lateral-resolution 0.64 +--device.bluelight.reactiondist 250 +--collision.action warn diff --git a/tests/sumo/errors/invalid_insertionChecks/output.sumo b/tests/sumo/errors/invalid_insertionChecks/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/errors/routes/stops/until_order/errors.sumo b/tests/sumo/errors/routes/stops/until_order/errors.sumo index bbb863795ab6..5ba8169a21a6 100644 --- a/tests/sumo/errors/routes/stops/until_order/errors.sumo +++ b/tests/sumo/errors/routes/stops/until_order/errors.sumo @@ -1,5 +1,6 @@ Warning: stop for vehicle 'until_unordered' on lane 'end_0' set to end at 40.00 earlier than previous stop at 50.00. Warning: stop for vehicle 'arrival_unordered' on lane 'end_0' set to start at 40.00 earlier than previous stop arrival at 50.00. Warning: stop for vehicle 'until_before_arrival' on lane 'beg_0' set to end at 50.00 earlier than arrival at 60.00. +Warning: stop for vehicle 'ended_before_arrival' on lane 'beg_0' set to end at 50.00 earlier than arrival at 60.00. +Warning: stop for vehicle 'ended_before_started' on lane 'beg_0' set to end at 50.00 earlier than arrival at 55.00. Warning: stop for vehicle 'until_before_depart' on lane 'beg_0' set to end at 50.00 earlier than departure at 60.00. -Warning: stop for vehicle 'until_before_depart_with_ended' on lane 'beg_0' set to end at 55.00 earlier than departure at 60.00. diff --git a/tests/sumo/errors/routes/stops/until_order/input_routes.rou.xml b/tests/sumo/errors/routes/stops/until_order/input_routes.rou.xml index 93116771d604..335ccacbbdc3 100644 --- a/tests/sumo/errors/routes/stops/until_order/input_routes.rou.xml +++ b/tests/sumo/errors/routes/stops/until_order/input_routes.rou.xml @@ -25,6 +25,22 @@ + + + + + + + + + + + + + + + + diff --git a/tests/sumo/errors/routes/stops/until_order/options.sumo b/tests/sumo/errors/routes/stops/until_order/options.sumo index 7dc2f74658a3..5203eb164d4b 100644 --- a/tests/sumo/errors/routes/stops/until_order/options.sumo +++ b/tests/sumo/errors/routes/stops/until_order/options.sumo @@ -1,2 +1,3 @@ --no-step-log --no-duration-log --net-file=net.net.xml --routes=input_routes.rou.xml --vehroute-output vehroutes.xml --use-stop-ended +--use-stop-started diff --git a/tests/sumo/errors/routes/stops/until_order/vehroutes.sumo b/tests/sumo/errors/routes/stops/until_order/vehroutes.sumo index 1e568f0d374b..9fdaffafaaf3 100644 --- a/tests/sumo/errors/routes/stops/until_order/vehroutes.sumo +++ b/tests/sumo/errors/routes/stops/until_order/vehroutes.sumo @@ -1,6 +1,6 @@ - @@ -55,9 +56,9 @@ SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later - + - + @@ -66,9 +67,9 @@ SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later - + - + @@ -77,24 +78,44 @@ SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later - + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + diff --git a/tests/sumo/errors/testsuite.sumo b/tests/sumo/errors/testsuite.sumo index bb3ba6cc423c..bb94913aa2b9 100644 --- a/tests/sumo/errors/testsuite.sumo +++ b/tests/sumo/errors/testsuite.sumo @@ -66,6 +66,9 @@ invalid_color # test error on invalid color input invalid_color_name +# test error on invalid insertionChecks +invalid_insertionChecks + # test for #5875 empty_line parkingArea_noCapacity diff --git a/tests/sumo/meta/help/output.sumo b/tests/sumo/meta/help/output.sumo index 6308fffa8359..40f270652897 100644 --- a/tests/sumo/meta/help/output.sumo +++ b/tests/sumo/meta/help/output.sumo @@ -1,4 +1,4 @@ -Eclipse SUMO sumo Version v1_21_0+0019-a15f3a8f697 +Eclipse SUMO sumo Version v1_21_0+0440-4a8c48d6e2a Copyright (C) 2001-2024 German Aerospace Center (DLR) and others; https://sumo.dlr.de A microscopic, multi-modal traffic simulation. @@ -145,6 +145,8 @@ Output Options: separate FILE --link-output FILE Save links states into FILE --railsignal-block-output FILE Save railsignal-blocks into FILE + --railsignal-vehicle-output FILE Record entry and exit times of vehicles + for railsignal blocks into FILE --bt-output FILE Save bluetooth visibilities into FILE (in conjunction with device.btreceiver and device.btsender) @@ -165,6 +167,7 @@ Output Options: --lanedata-output FILE Write aggregated traffic statistics for all lanes into FILE --statistic-output FILE Write overall statistics into FILE + --deadlock-output FILE Write reports on deadlocks FILE --save-state.times STR[] Use TIME[] as times at which a network state written --save-state.period TIME save state repeatedly after TIME period @@ -265,12 +268,18 @@ Processing Options: --time-to-teleport.remove Whether vehicles shall be removed after waiting too long instead of being teleported + --time-to-teleport.remove-constraint Whether rail-signal-constraint based + deadlocks shall be cleared by removing a + constraint --time-to-teleport.ride TIME The waiting time after which persons / containers waiting for a pickup are teleported. Negative values disable teleporting --time-to-teleport.bidi TIME The waiting time after which vehicles on bidirectional edges are teleported + --time-to-teleport.railsignal-deadlock TIME The waiting time after which + vehicles in a rail-signal based deadlock + are teleported --waiting-time-memory TIME Length of time interval, over which accumulated waiting time is taken into account (default is 100s.) @@ -285,6 +294,8 @@ Processing Options: separately for insertion on an edge --emergency-insert Allow inserting a vehicle in a situation which requires emergency braking + --insertion-checks STR Override default value for vehicle + attribute insertionChecks --random-depart-offset TIME Each vehicle receives a random offset to its depart value drawn uniformly from [0, TIME] @@ -373,6 +384,8 @@ Processing Options: pedestrians start squeezing through a jam while on a narrow lane when using model 'striping' + --pedestrian.striping.jamfactor FLOAT Factor for reducing speed of + pedestrian in jammed state --pedestrian.striping.reserve-oncoming FLOAT Fraction of stripes to reserve for oncoming pedestrians --pedestrian.striping.reserve-oncoming.junctions FLOAT Fraction of stripes diff --git a/tests/sumo/meta/write_schema/cfg.sumo b/tests/sumo/meta/write_schema/cfg.sumo index d0afc1f538e8..706c156d6c20 100644 --- a/tests/sumo/meta/write_schema/cfg.sumo +++ b/tests/sumo/meta/write_schema/cfg.sumo @@ -1,7 +1,6 @@ - + @@ -246,6 +246,9 @@ + + + @@ -279,6 +282,9 @@ + + + @@ -414,12 +420,18 @@ + + + + + + @@ -438,6 +450,9 @@ + + + @@ -528,6 +543,9 @@ + + + diff --git a/tests/sumo/meta/write_template_full/cfg.sumo b/tests/sumo/meta/write_template_full/cfg.sumo index 2f8033e970e5..9b35802eba0b 100644 --- a/tests/sumo/meta/write_template_full/cfg.sumo +++ b/tests/sumo/meta/write_template_full/cfg.sumo @@ -1,6 +1,6 @@ - @@ -90,6 +90,7 @@ + @@ -101,6 +102,7 @@ + @@ -150,14 +152,17 @@ + + + @@ -188,6 +193,7 @@ + diff --git a/tests/sumo/pedestrian_model/jupedsim/geometry_generation/wkt.sumo b/tests/sumo/pedestrian_model/jupedsim/geometry_generation/wkt.sumo index f12abf11b55b..f864b707c760 100644 --- a/tests/sumo/pedestrian_model/jupedsim/geometry_generation/wkt.sumo +++ b/tests/sumo/pedestrian_model/jupedsim/geometry_generation/wkt.sumo @@ -1 +1 @@ -POLYGON ((762.8640811260911505 470.7117233377493903, 762.8639743779410765 470.7120879970586884, 757.5039743779409491 489.1520879970585156, 757.5037794134354954 489.1529126520115369, 757.5035093237856927 489.1537407272810469, 757.5025414950762297 489.1581487615460446, 757.5016414386470842 489.1619557929343500, 757.5015456570913557 489.1626843657452355, 757.5013837953752045 489.1634215746998962, 757.5008368087915187 489.1680762973635410, 757.5003197827495569 489.1720091121314908, 757.5003015718543793 489.1726310333935999, 757.5002270397965276 489.1732652830610277, 757.5001400040330282 489.1781487447663039, 757.5000229989855143 489.1821445904424763, 757.5000597320822635 489.1826526978618404, 757.5000504206318510 489.1831751510442245, 757.5004666600216297 489.1882814937771400, 757.5007541387669789 489.1922580189320797, 757.5008226445984292 489.1926486423478764, 757.5008556729294469 489.1930538273982165, 757.5018331678763843 489.1984106927643552, 757.5025056848071472 489.2022454153727722, 757.5025827227595983 489.2025184015622017, 757.5026348861581482 489.2028042672884567, 757.5042838857098104 489.2085465211632709, 757.5052596284101583 489.2120040933480141, 757.5053223618419906 489.2121627705357696, 757.5053705819182142 489.2123306856331055, 757.5080798047883945 489.2191374135645674, 757.5089876546289815 489.2214337180334951, 757.5090141150010368 489.2214848008873105, 757.5090358856434705 489.2215394980632936, 757.5135947906078400 489.2303402402646952, 757.5136258480886227 489.2303879443077221, 757.5136514333887590 489.2304373377985485, 757.5149813288448968 489.2324699519444948, 757.5190025116435208 489.2386464566698123, 757.5191106352081079 489.2387811897851861, 757.5192030135815457 489.2389223810253043, 757.5214588869898762 489.2417073537483247, 757.5252059250954062 489.2463765497684562, 757.5254079754124632 489.2465826732134246, 757.5255853160792867 489.2468016078921664, 757.5283276586612828 489.2495612142938626, 757.5321440906909629 489.2534545816940863, 760.8121440906909356 492.2834545816940590, 760.8195610654131542 492.2896689097829039, 760.8275439261788051 492.2951373027483442, 760.8360179299515949 492.2998085603614982, 760.8449037351526840 492.3036389459239217, 760.8529196476970355 492.3062084213916023, 760.8529037305850125 492.3062631685859287, 903.5805853101496723 533.8026817306702014, 909.0902001201202438 536.9667177719036317, 909.0919685550616123 536.9676204909462740, 909.0936213883542223 536.9685947198302074, 909.0962571570928503 536.9698096598151551, 909.0989798556570349 536.9711994942861111, 909.1009281674350859 536.9719627308152212, 909.1027621891705621 536.9728081108771676, 909.1054145355658420 536.9737202318881373, 909.1081581822611497 536.9747950349071743, 909.1102753303903228 536.9753918209000858, 909.1122802347185825 536.9760812916895247, 918.2361815708020458 539.6083565144638214, 893.6031491850962993 624.9449322123898583, 895.7168508149038644 625.5550677876096870, 920.3768508149037189 540.1250677876098507, 920.3739369456570785 540.1242266777464920, 920.3741132429897789 540.1238038088674784, 920.3770258158408524 540.1142072522277431, 921.6070258158408706 535.1842072522279068, 921.6084628590404009 535.1774661211945840, 922.5184628590404827 530.0474661211944749, 922.5193508204727095 530.0413760481458212, 923.1193508204726186 524.8013760481455847, 923.1198596852250375 524.7952955893676972, 923.3998596852250103 519.5152955893679518, 923.3999983485678058 519.5094252968472119, 923.3699983485678331 514.2894252968471847, 923.3697888433778189 514.2835048681824901, 923.2998940628690434 513.2096668767287611, 923.2997883635266589 513.2034975001208750, 923.0397883635266680 509.2134975001210933, 923.0386364482862973 509.2035424464313564, 923.0386359958397406 509.2035403790778219, 923.0386357528982444 509.2035382792448672, 923.0381844597948202 509.2014771862325233, 923.0364939271694311 509.1937526759566026, 923.0364914645874705 509.1937451367814447, 923.0364897701456357 509.1937373981247674, 923.0353523515937013 509.1902577512687458, 923.0333823175160433 509.1842265073642011, 923.0333767630611419 509.1842139335260526, 923.0333724971217180 509.1842008829542010, 923.0317045750618945 509.1804285357723074, 923.0315277246008918 509.1800281924272440, 909.3046741834491513 370.1918869476423879, 907.1153258165509214 370.4081130523575212, 920.8353637506634186 509.3272444143606208, 911.3801775988215468 510.2604835670097145, 911.3793929983944508 510.2605984445440299, 911.3786253315613521 510.2606490215553094, 911.3750352499466771 510.2612364857418470, 911.3708802489450136 510.2618448416046704, 911.3699906242241013 510.2620619647323110, 911.3691146707305961 510.2622053016705195, 911.3656728473663406 510.2631157677503779, 911.3617517145839884 510.2640727652276382, 911.3607702585397874 510.2644126503494135, 911.3597979817213854 510.2646698468902287, 911.3565414872027759 510.2658771035660266, 911.3528725950220633 510.2671476666980652, 911.3518153882223487 510.2676291760817548, 911.3507617929819844 510.2680197678300829, 911.3477210325256692 510.2694939679925028, 911.3443212873648918 510.2710423965475002, 911.3432070955527706 510.2716823832638511, 911.3420900278240424 510.2722239522072414, 911.3392894969620102 510.2739326341013566, 911.3361732943428706 510.2757225667326111, 911.3350233254627710 510.2765355441772499, 911.3338632249860893 510.2772433537952566, 911.3313219450024008 510.2791522574464125, 911.3285005576690310 510.2811468542604416, 911.3273381813182823 510.2821446947582444, 911.3261577906341699 510.2830313550637129, 910.0769813008307665 511.3191699938929560, 767.4261317628829602 469.8550832114251534, 767.4248073449257390 469.8538422161320796, 765.3738750857626201 468.1085777455941752, 714.7960646663489115 360.1732504092649378, 712.8039353336509976 361.1067495907348075, 763.3661196128616666 469.0087300394889098, 762.8640811260911505 470.7117233377493903), (761.5639499941235044 490.2218959289018585, 766.8680996431387484 471.9839336096188163, 909.4160621511950922 513.4181143890727981, 904.1118881805871297 531.6660561834776217, 761.5639499941235044 490.2218959289018585), (921.4603031451208608 515.8679258667038994, 921.7699275217023569 520.6820855283924629, 921.6801589512808732 524.6618254837542281, 921.1216331512141551 528.6014271092246872, 920.0131656239377662 533.2849520668148671, 919.3719973889990342 535.5675109831970531, 910.2778159258919004 532.9339465030996053, 910.2680741452609254 532.9316469356192556, 910.2581512792255580 532.9303327704458297, 910.2481467452785182 532.9300171742399925, 910.2381607791464830 532.9307033089696688, 908.0435318729498704 533.1923706016316373, 913.4760276461479407 514.4979050385286428, 913.4782283542335790 514.4887400753607380, 913.4795564049018139 514.4794086259894357, 913.4799999997944724 514.4699935906992323, 913.4795551980296295 514.4605786123488542, 913.4782259512110159 514.4512473332918034, 913.4760240683231132 514.4420826522991774, 913.4729691108200313 514.4331659880911047, 913.4690882188419891 514.4245765560142445, 913.4644158701039487 514.4163906642963866, 913.4589935735957624 514.4086810361261541, 913.4528695008184513 514.4015161635825280, 913.3455908920914226 514.2873674961685992, 921.2370179340157392 513.5106197035602236, 921.4603031451208608 515.8679258667038994)) +POLYGON ((762.863974 470.712088, 757.503974 489.152088, 757.503779 489.152913, 757.503509 489.153741, 757.502541 489.158149, 757.501641 489.161956, 757.501546 489.162684, 757.501384 489.163422, 757.500837 489.168076, 757.50032 489.172009, 757.500302 489.172631, 757.500227 489.173265, 757.50014 489.178149, 757.500023 489.182145, 757.50006 489.182653, 757.50005 489.183175, 757.500467 489.188281, 757.500754 489.192258, 757.500823 489.192649, 757.500856 489.193054, 757.501833 489.198411, 757.502506 489.202245, 757.502583 489.202518, 757.502635 489.202804, 757.504284 489.208547, 757.50526 489.212004, 757.505322 489.212163, 757.505371 489.212331, 757.50808 489.219137, 757.508988 489.221434, 757.509014 489.221485, 757.509036 489.221539, 757.513595 489.23034, 757.513626 489.230388, 757.513651 489.230437, 757.514981 489.23247, 757.519003 489.238646, 757.519111 489.238781, 757.519203 489.238922, 757.521459 489.241707, 757.525206 489.246377, 757.525408 489.246583, 757.525585 489.246802, 757.528328 489.249561, 757.532144 489.253455, 760.812144 492.283455, 760.819561 492.289669, 760.827544 492.295137, 760.836018 492.299809, 760.844904 492.303639, 760.85292 492.306208, 760.852904 492.306263, 903.580585 533.802682, 909.0902 536.966718, 909.091969 536.96762, 909.093621 536.968595, 909.096257 536.96981, 909.09898 536.971199, 909.100928 536.971963, 909.102762 536.972808, 909.105415 536.97372, 909.108158 536.974795, 909.110275 536.975392, 909.11228 536.976081, 918.236182 539.608357, 893.603149 624.944932, 895.716851 625.555068, 920.376851 540.125068, 920.373937 540.124227, 920.374113 540.123804, 920.377026 540.114207, 921.607026 535.184207, 921.608463 535.177466, 922.518463 530.047466, 922.519351 530.041376, 923.119351 524.801376, 923.11986 524.795296, 923.39986 519.515296, 923.399998 519.509425, 923.369998 514.289425, 923.369789 514.283505, 923.299894 513.209667, 923.299788 513.203498, 923.039788 509.213498, 923.038636 509.203542, 923.038636 509.20354, 923.038636 509.203538, 923.038184 509.201477, 923.036494 509.193753, 923.036491 509.193745, 923.03649 509.193737, 923.035352 509.190258, 923.033382 509.184227, 923.033377 509.184214, 923.033372 509.184201, 923.031705 509.180429, 923.031528 509.180028, 909.304674 370.191887, 907.115326 370.408113, 920.835364 509.327244, 911.380178 510.260484, 911.379393 510.260598, 911.378625 510.260649, 911.375035 510.261236, 911.37088 510.261845, 911.369991 510.262062, 911.369115 510.262205, 911.365673 510.263116, 911.361752 510.264073, 911.36077 510.264413, 911.359798 510.26467, 911.356541 510.265877, 911.352873 510.267148, 911.351815 510.267629, 911.350762 510.26802, 911.347721 510.269494, 911.344321 510.271042, 911.343207 510.271682, 911.34209 510.272224, 911.339289 510.273933, 911.336173 510.275723, 911.335023 510.276536, 911.333863 510.277243, 911.331322 510.279152, 911.328501 510.281147, 911.327338 510.282145, 911.326158 510.283031, 910.076981 511.31917, 767.426132 469.855083, 767.424807 469.853842, 765.373875 468.108578, 714.796065 360.17325, 712.803935 361.10675, 763.36612 469.00873, 762.864081 470.711723, 762.863974 470.712088), (766.8681 471.983934, 909.416062 513.418114, 904.111888 531.666056, 761.56395 490.221896, 766.8681 471.983934), (921.769928 520.682086, 921.680159 524.661825, 921.121633 528.601427, 920.013166 533.284952, 919.371997 535.567511, 910.277816 532.933947, 910.268074 532.931647, 910.258151 532.930333, 910.248147 532.930017, 910.238161 532.930703, 908.043532 533.192371, 913.476028 514.497905, 913.478228 514.48874, 913.479556 514.479409, 913.48 514.469994, 913.479555 514.460579, 913.478226 514.451247, 913.476024 514.442083, 913.472969 514.433166, 913.469088 514.424577, 913.464416 514.416391, 913.458994 514.408681, 913.45287 514.401516, 913.345591 514.287367, 921.237018 513.51062, 921.460303 515.867926, 921.769928 520.682086)) diff --git a/tests/sumo/pedestrian_model/jupedsim/larger_net/tripinfos.sumo b/tests/sumo/pedestrian_model/jupedsim/larger_net/tripinfos.sumo index 699af091d60b..c08e31bf2863 100644 --- a/tests/sumo/pedestrian_model/jupedsim/larger_net/tripinfos.sumo +++ b/tests/sumo/pedestrian_model/jupedsim/larger_net/tripinfos.sumo @@ -1,6 +1,6 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/pedestrian_model/striping/pedestrian_interactions/bidirectional_flow_jammed_jamFactor/errors.sumo b/tests/sumo/pedestrian_model/striping/pedestrian_interactions/bidirectional_flow_jammed_jamFactor/errors.sumo new file mode 100644 index 000000000000..98c7b0af142c --- /dev/null +++ b/tests/sumo/pedestrian_model/striping/pedestrian_interactions/bidirectional_flow_jammed_jamFactor/errors.sumo @@ -0,0 +1,4 @@ +Warning: Person 'jam8' is jammed on edge 'EC', time=196.00. +Warning: Person 'jam4' is jammed on edge 'EC', time=198.00. +Warning: Person 'jam2' is jammed on edge 'EC', time=199.00. +Warning: Person 'jam5' is jammed on edge 'EC', time=202.00. diff --git a/tests/sumo/pedestrian_model/striping/pedestrian_interactions/bidirectional_flow_jammed_jamFactor/input_routes.rou.xml b/tests/sumo/pedestrian_model/striping/pedestrian_interactions/bidirectional_flow_jammed_jamFactor/input_routes.rou.xml new file mode 100644 index 000000000000..23f9760d728f --- /dev/null +++ b/tests/sumo/pedestrian_model/striping/pedestrian_interactions/bidirectional_flow_jammed_jamFactor/input_routes.rou.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/pedestrian_model/striping/pedestrian_interactions/bidirectional_flow_jammed_jamFactor/options.sumo b/tests/sumo/pedestrian_model/striping/pedestrian_interactions/bidirectional_flow_jammed_jamFactor/options.sumo new file mode 100644 index 000000000000..29d42c2ce4da --- /dev/null +++ b/tests/sumo/pedestrian_model/striping/pedestrian_interactions/bidirectional_flow_jammed_jamFactor/options.sumo @@ -0,0 +1,4 @@ +--net-file net3.net.xml --additional-files input_routes.rou.xml --no-step-log +--pedestrian.striping.jamtime 180 +--pedestrian.striping.legacy-departposlat +--pedestrian.striping.jamfactor 0.8 diff --git a/tests/sumo/pedestrian_model/striping/pedestrian_interactions/bidirectional_flow_jammed_jamFactor/output.sumo b/tests/sumo/pedestrian_model/striping/pedestrian_interactions/bidirectional_flow_jammed_jamFactor/output.sumo new file mode 100644 index 000000000000..9ffeb7e0b913 --- /dev/null +++ b/tests/sumo/pedestrian_model/striping/pedestrian_interactions/bidirectional_flow_jammed_jamFactor/output.sumo @@ -0,0 +1,30 @@ +Loading net-file from 'net3.net.xml' ... done (3ms). +Loading additional-files from 'input_routes.rou.xml' ... done (2ms). +Loading done. +Simulation version v1_21_0+0431-637c6e020bf started with time: 0.00. +Simulation ended at time: 831.00. +Reason: All vehicles have left the simulation. +Performance: + Duration: 0.85s + Real time factor: 979.953 + UPS: 0.000000 + UPS-Persons: 19775.943396 +Vehicles: + Inserted: 0 + Running: 0 + Waiting: 0 +Persons: + Inserted: 30 + Running: 0 + Jammed: 4 +Statistics (avg of 0): + RouteLength: 0.00 + Speed: 0.00 + Duration: 0.00 + WaitingTime: 0.00 + TimeLoss: 0.00 + DepartDelay: 0.00 +Pedestrian Statistics (avg of 30 walks): + RouteLength: 74.45 + Duration: 559.00 + TimeLoss: 392.86 diff --git a/tests/sumo/pedestrian_model/striping/pedestrian_interactions/testsuite.sumo b/tests/sumo/pedestrian_model/striping/pedestrian_interactions/testsuite.sumo index 62a2376a1c74..f8f9444404ff 100644 --- a/tests/sumo/pedestrian_model/striping/pedestrian_interactions/testsuite.sumo +++ b/tests/sumo/pedestrian_model/striping/pedestrian_interactions/testsuite.sumo @@ -4,6 +4,9 @@ jam_trafficlight # test interaction with default pedestrian attributes jam_trafficlight_defaults bidirectional_flow_1stripe + +# Copy of bidirectional_flow_1stripe +bidirectional_flow_1stripe_jamFactor bidirectional_flow_2stripes bidirectional_flow_3stripes @@ -14,6 +17,9 @@ bidirectional_flow_5stripes # test dynamics when jammed bidirectional_flow_jammed +# test dynamics when jammed with custom jamfactor +bidirectional_flow_jammed_jamFactor + # orthogonal streams crossing on a wide plaza plaza diff --git a/tests/sumo/rail/alternativeRoute/errors.sumo b/tests/sumo/rail/alternativeRoute/errors.sumo index 5d4f80c59c03..e31e563c0891 100644 --- a/tests/sumo/rail/alternativeRoute/errors.sumo +++ b/tests/sumo/rail/alternativeRoute/errors.sumo @@ -1,7 +1 @@ -Warning: Invalid approach information to rail signal 'junction 'P2', link 0' after rerouting for vehicle 'rail3' first driveway edge 'T7_1' time=37.00. -Warning: Vehicle 'rail1' performs emergency stop at the end of lane 'T8_0_0' because of a red traffic light (decel=-20.73, offset=11.76), time=66.00. -Warning: Teleporting vehicle 'rail3'; frontal collision with vehicle 'rail1', lane='T8_0_0', gap=-1.00, time=73.00, stage=move. -Warning: Vehicle 'rail3' ends teleporting on edge 'T7_1', time=75.00. -Warning: Teleporting vehicle 'rail3'; collision with vehicle 'rail1', lane='T8_0_0', gap=-1.00, time=76.00, stage=move. -Warning: Vehicle 'rail3' ends teleporting on edge 'T14_1', time=76.00. -Warning: Vehicle 'rail3' ends teleporting on edge 'T18_1', time=77.00. +Warning: Vehicle 'rail3' performs emergency stop at the end of lane 'T12_1_0' because of a red traffic light (decel=-19.88, offset=2.90), time=39.00. diff --git a/tests/sumo/rail/alternativeRoute/railsignalblocks.sumo b/tests/sumo/rail/alternativeRoute/railsignalblocks.sumo index 03cecc771ac1..c350ad55a1de 100644 --- a/tests/sumo/rail/alternativeRoute/railsignalblocks.sumo +++ b/tests/sumo/rail/alternativeRoute/railsignalblocks.sumo @@ -1,6 +1,6 @@ - - - - + + + - + diff --git a/tests/sumo/rail/alternativeRoute/vehroutes.sumo b/tests/sumo/rail/alternativeRoute/vehroutes.sumo index 759f28295fbc..aeb740f71063 100644 --- a/tests/sumo/rail/alternativeRoute/vehroutes.sumo +++ b/tests/sumo/rail/alternativeRoute/vehroutes.sumo @@ -1,6 +1,6 @@ - - - - - - - + + - + - - + + + + + + @@ -70,13 +70,13 @@ SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later - - + + - + diff --git a/tests/sumo/rail/bidi_conflict_insertion/railsignalblocks.sumo b/tests/sumo/rail/bidi_conflict_insertion/railsignalblocks.sumo index 01d0b159fdec..38ab0354438d 100644 --- a/tests/sumo/rail/bidi_conflict_insertion/railsignalblocks.sumo +++ b/tests/sumo/rail/bidi_conflict_insertion/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/bidi_conflict_parkingInsertion/railsignalblocks.sumo b/tests/sumo/rail/bidi_conflict_parkingInsertion/railsignalblocks.sumo index 07791f00d446..e373a5b6fb23 100644 --- a/tests/sumo/rail/bidi_conflict_parkingInsertion/railsignalblocks.sumo +++ b/tests/sumo/rail/bidi_conflict_parkingInsertion/railsignalblocks.sumo @@ -1,6 +1,6 @@ - - - + + diff --git a/tests/sumo/rail/bugs/delayed_insertion_parallel_routing/railsignalblocks.sumo b/tests/sumo/rail/bugs/delayed_insertion_parallel_routing/railsignalblocks.sumo index bb45a53088cd..4233d3dc4ae1 100644 --- a/tests/sumo/rail/bugs/delayed_insertion_parallel_routing/railsignalblocks.sumo +++ b/tests/sumo/rail/bugs/delayed_insertion_parallel_routing/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/bugs/double_stop/railsignalblocks.sumo b/tests/sumo/rail/bugs/double_stop/railsignalblocks.sumo index bb45a53088cd..10f019ae4e49 100644 --- a/tests/sumo/rail/bugs/double_stop/railsignalblocks.sumo +++ b/tests/sumo/rail/bugs/double_stop/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/bugs/double_stop/vehroutes.sumo b/tests/sumo/rail/bugs/double_stop/vehroutes.sumo index a69c605950d9..50da333cd51d 100644 --- a/tests/sumo/rail/bugs/double_stop/vehroutes.sumo +++ b/tests/sumo/rail/bugs/double_stop/vehroutes.sumo @@ -1,11 +1,16 @@ - - + diff --git a/tests/sumo/rail/bugs/merge_check_flank_switch/railsignalblocks.sumo b/tests/sumo/rail/bugs/merge_check_flank_switch/railsignalblocks.sumo index 16d157cd2174..4ed39fc3c77c 100644 --- a/tests/sumo/rail/bugs/merge_check_flank_switch/railsignalblocks.sumo +++ b/tests/sumo/rail/bugs/merge_check_flank_switch/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/bugs/stopped_at_signal/railsignalblocks.sumo b/tests/sumo/rail/bugs/stopped_at_signal/railsignalblocks.sumo index 3e4efbbc7818..31dc7f1a6e6a 100644 --- a/tests/sumo/rail/bugs/stopped_at_signal/railsignalblocks.sumo +++ b/tests/sumo/rail/bugs/stopped_at_signal/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/bugs/ticket12858/railsignalblocks.sumo b/tests/sumo/rail/bugs/ticket12858/railsignalblocks.sumo index 0962406c51b3..91f753c16af7 100644 --- a/tests/sumo/rail/bugs/ticket12858/railsignalblocks.sumo +++ b/tests/sumo/rail/bugs/ticket12858/railsignalblocks.sumo @@ -1,6 +1,6 @@ - - - + + diff --git a/tests/sumo/rail/bugs/ticket12873/errors.sumo b/tests/sumo/rail/bugs/ticket12873/errors.sumo index e35ac1d234eb..e4f4e3aa383a 100644 --- a/tests/sumo/rail/bugs/ticket12873/errors.sumo +++ b/tests/sumo/rail/bugs/ticket12873/errors.sumo @@ -1,2 +1,8 @@ -Warning: Teleporting vehicle 'v_1'; frontal collision with vehicle 'v_0', lane='-E3.50_0', gap=-1.00, time=15.00, stage=move. -Warning: Vehicle 'v_1' teleports beyond arrival edge '-E0', time=19.00. +Warning: Invalid approach information to rail signal 'junction 'J7', link 0' after rerouting for vehicle 'v_1' first driveway edge '-E6' time=2.00. +Warning: Vehicle 'v_1' performs emergency braking on lane '-E5_0' with decel=5.00, wished=1.30, severity=1.00, time=2.00. +Warning: Vehicle 'v_1' performs emergency stop at the end of lane '-E5_0' because of a red traffic light (decel=-13.89, offset=7.88), time=2.00. +Warning: Invalid approach information to rail signal 'junction 'J7', link 0' after rerouting for vehicle 'v_1' first driveway edge '-E6' time=18.00. +Warning: Invalid approach information to rail signal 'junction 'J7', link 0' after rerouting for vehicle 'v_1' first driveway edge '-E6' time=20.00. +Warning: Invalid approach information to rail signal 'junction 'J7', link 0' after rerouting for vehicle 'v_1' first driveway edge '-E6' time=22.00. +Warning: Teleporting vehicle 'v_1'; frontal collision with vehicle 'v_0', lane='E3_0', gap=-1.00, time=42.00, stage=move. +Warning: Vehicle 'v_1' ends teleporting on edge '-E0', time=42.00. diff --git a/tests/sumo/rail/bugs/ticket12873/railsignalblocks.sumo b/tests/sumo/rail/bugs/ticket12873/railsignalblocks.sumo index c0bd9ee4b0fb..0b27379c8f17 100644 --- a/tests/sumo/rail/bugs/ticket12873/railsignalblocks.sumo +++ b/tests/sumo/rail/bugs/ticket12873/railsignalblocks.sumo @@ -1,6 +1,6 @@ - - - + + diff --git a/tests/sumo/rail/bugs/ticket13262/errors.sumo b/tests/sumo/rail/bugs/ticket13262/errors.sumo index e6a1eea3670e..e69de29bb2d1 100644 --- a/tests/sumo/rail/bugs/ticket13262/errors.sumo +++ b/tests/sumo/rail/bugs/ticket13262/errors.sumo @@ -1,2 +0,0 @@ -Warning: Teleporting vehicle 'v_1'; frontal collision with vehicle 'v_0', lane='E5_0', gap=-1.00, time=103.00, stage=move. -Warning: Vehicle 'v_1' ends teleporting on edge '-E4', time=104.00. diff --git a/tests/sumo/rail/bugs/ticket13262/railsignalblocks.sumo b/tests/sumo/rail/bugs/ticket13262/railsignalblocks.sumo index 31318b93262b..500709a0a822 100644 --- a/tests/sumo/rail/bugs/ticket13262/railsignalblocks.sumo +++ b/tests/sumo/rail/bugs/ticket13262/railsignalblocks.sumo @@ -1,6 +1,6 @@ - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/collision/frontal_collision/errors.sumo b/tests/sumo/rail/collision/frontal_collision/errors.sumo index f950b67832d4..e69de29bb2d1 100644 --- a/tests/sumo/rail/collision/frontal_collision/errors.sumo +++ b/tests/sumo/rail/collision/frontal_collision/errors.sumo @@ -1,2 +0,0 @@ -Warning: Vehicle 'RE2'; collision with vehicle 'RE1', lane='-c_0', gap=-1.00, time=106.00, stage=move. -Warning: Vehicle 'RE1'; collision with vehicle 'RE2', lane='d_0', gap=-1.00, time=106.00, stage=move. diff --git a/tests/sumo/rail/collision/frontal_collision/railsignalblocks.sumo b/tests/sumo/rail/collision/frontal_collision/railsignalblocks.sumo index 01d0b159fdec..b899c84214c5 100644 --- a/tests/sumo/rail/collision/frontal_collision/railsignalblocks.sumo +++ b/tests/sumo/rail/collision/frontal_collision/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/collision/frontal_collision_further/errors.sumo b/tests/sumo/rail/collision/frontal_collision_further/errors.sumo index 2ae303d852dd..e69de29bb2d1 100644 --- a/tests/sumo/rail/collision/frontal_collision_further/errors.sumo +++ b/tests/sumo/rail/collision/frontal_collision_further/errors.sumo @@ -1 +0,0 @@ -Warning: Vehicle 'RE1'; collision with vehicle 'RE2', lane='-c_0', gap=-1.00, time=110.00, stage=move. diff --git a/tests/sumo/rail/collision/frontal_collision_further/railsignalblocks.sumo b/tests/sumo/rail/collision/frontal_collision_further/railsignalblocks.sumo index 01d0b159fdec..b899c84214c5 100644 --- a/tests/sumo/rail/collision/frontal_collision_further/railsignalblocks.sumo +++ b/tests/sumo/rail/collision/frontal_collision_further/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/collision/frontal_collision_jump/railsignalblocks.sumo b/tests/sumo/rail/collision/frontal_collision_jump/railsignalblocks.sumo index 01d0b159fdec..defbed7f12c0 100644 --- a/tests/sumo/rail/collision/frontal_collision_jump/railsignalblocks.sumo +++ b/tests/sumo/rail/collision/frontal_collision_jump/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/collision/frontal_collision_jump_sameEdge/errors.sumo b/tests/sumo/rail/collision/frontal_collision_jump_sameEdge/errors.sumo index 839122e55431..e69de29bb2d1 100644 --- a/tests/sumo/rail/collision/frontal_collision_jump_sameEdge/errors.sumo +++ b/tests/sumo/rail/collision/frontal_collision_jump_sameEdge/errors.sumo @@ -1,2 +0,0 @@ -Warning: Vehicle 'RE2'; frontal collision with vehicle 'RE1', lane='-d_0', gap=-1.00, time=110.00, stage=move. -Warning: Vehicle 'RE1'; frontal collision with vehicle 'RE2', lane='d_0', gap=-1.00, time=110.00, stage=move. diff --git a/tests/sumo/rail/collision/frontal_collision_jump_sameEdge/railsignalblocks.sumo b/tests/sumo/rail/collision/frontal_collision_jump_sameEdge/railsignalblocks.sumo index 01d0b159fdec..b899c84214c5 100644 --- a/tests/sumo/rail/collision/frontal_collision_jump_sameEdge/railsignalblocks.sumo +++ b/tests/sumo/rail/collision/frontal_collision_jump_sameEdge/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/collision/frontal_collision_reverseRoles/errors.sumo b/tests/sumo/rail/collision/frontal_collision_reverseRoles/errors.sumo index 5a1694431043..e69de29bb2d1 100644 --- a/tests/sumo/rail/collision/frontal_collision_reverseRoles/errors.sumo +++ b/tests/sumo/rail/collision/frontal_collision_reverseRoles/errors.sumo @@ -1,2 +0,0 @@ -Warning: Teleporting vehicle 'RE1'; frontal collision with vehicle 'RE2', lane='-d_0', gap=-1.00, time=108.00, stage=move. -Warning: Vehicle 'RE1' ends teleporting on edge 'e', time=108.00. diff --git a/tests/sumo/rail/collision/frontal_collision_reverseRoles/railsignalblocks.sumo b/tests/sumo/rail/collision/frontal_collision_reverseRoles/railsignalblocks.sumo index 01d0b159fdec..defbed7f12c0 100644 --- a/tests/sumo/rail/collision/frontal_collision_reverseRoles/railsignalblocks.sumo +++ b/tests/sumo/rail/collision/frontal_collision_reverseRoles/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/errors.sumo b/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/errors.sumo new file mode 100644 index 000000000000..d0ae0656f816 --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/errors.sumo @@ -0,0 +1,3 @@ +Warning: Teleporting vehicle 'rail2'; junction collision with vehicle 'rail1', lane=':k1_1_0', gap=-1.00, time=101.00, stage=move. +Warning: Vehicle 'rail2' ends teleporting on edge 'T7_1', time=103.00. +Warning: Teleporting vehicle 'rail5'; junction collision with vehicle 'rail4', lane=':k1_1_0', gap=-1.00, time=501.00, stage=move. diff --git a/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/errors.sumo.meso b/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/errors.sumo.meso new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/input_routes.rou.xml b/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/input_routes.rou.xml new file mode 100755 index 000000000000..a0ed5b842a68 --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/input_routes.rou.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/net.net.xml b/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/net.net.xml new file mode 100755 index 000000000000..fbb1d9d10843 --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/net.net.xml @@ -0,0 +1,384 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/options.sumo b/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/options.sumo new file mode 100644 index 000000000000..936a3017aa11 --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml --routes=input_routes.rou.xml +--collision.check-junctions diff --git a/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/output.sumo b/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/railsignalblocks.sumo b/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/railsignalblocks.sumo new file mode 100644 index 000000000000..df3db5a55b6a --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/crossing_tracks_collision/railsignalblocks.sumo @@ -0,0 +1,36 @@ + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/errors.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/errors.sumo new file mode 100644 index 000000000000..f950b67832d4 --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/errors.sumo @@ -0,0 +1,2 @@ +Warning: Vehicle 'RE2'; collision with vehicle 'RE1', lane='-c_0', gap=-1.00, time=106.00, stage=move. +Warning: Vehicle 'RE1'; collision with vehicle 'RE2', lane='d_0', gap=-1.00, time=106.00, stage=move. diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/errors.sumo.meso b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/errors.sumo.meso new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/input_routes.rou.xml b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/input_routes.rou.xml new file mode 100644 index 000000000000..332efbd9b6d4 --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/input_routes.rou.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/net.net.xml b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/net.net.xml new file mode 100644 index 000000000000..c9fd8a0a4113 --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/net.net.xml @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/options.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/options.sumo new file mode 100644 index 000000000000..a6643cdddf5d --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml --routes=input_routes.rou.xml +--collision.action warn diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/output.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/railsignalblocks.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/railsignalblocks.sumo new file mode 100644 index 000000000000..01d0b159fdec --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision/railsignalblocks.sumo @@ -0,0 +1,35 @@ + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/errors.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/errors.sumo new file mode 100644 index 000000000000..2ae303d852dd --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/errors.sumo @@ -0,0 +1 @@ +Warning: Vehicle 'RE1'; collision with vehicle 'RE2', lane='-c_0', gap=-1.00, time=110.00, stage=move. diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/errors.sumo.meso b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/errors.sumo.meso new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/input_routes.rou.xml b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/input_routes.rou.xml new file mode 100644 index 000000000000..4615f0629134 --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/input_routes.rou.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/net.net.xml b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/net.net.xml new file mode 100644 index 000000000000..c9fd8a0a4113 --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/net.net.xml @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/options.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/options.sumo new file mode 100644 index 000000000000..a6643cdddf5d --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml --routes=input_routes.rou.xml +--collision.action warn diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/output.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/railsignalblocks.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/railsignalblocks.sumo new file mode 100644 index 000000000000..01d0b159fdec --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_further/railsignalblocks.sumo @@ -0,0 +1,35 @@ + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump/errors.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump/errors.sumo.meso b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump/errors.sumo.meso new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump/input_routes.rou.xml b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump/input_routes.rou.xml new file mode 100644 index 000000000000..e5d4dd757e08 --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump/input_routes.rou.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump/net.net.xml b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump/net.net.xml new file mode 100644 index 000000000000..c9fd8a0a4113 --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump/net.net.xml @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump/options.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump/options.sumo new file mode 100644 index 000000000000..768b2b2c086c --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump/options.sumo @@ -0,0 +1 @@ +--no-step-log --no-duration-log --net-file=net.net.xml --routes=input_routes.rou.xml diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump/output.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump/railsignalblocks.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump/railsignalblocks.sumo new file mode 100644 index 000000000000..01d0b159fdec --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump/railsignalblocks.sumo @@ -0,0 +1,35 @@ + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/errors.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/errors.sumo new file mode 100644 index 000000000000..839122e55431 --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/errors.sumo @@ -0,0 +1,2 @@ +Warning: Vehicle 'RE2'; frontal collision with vehicle 'RE1', lane='-d_0', gap=-1.00, time=110.00, stage=move. +Warning: Vehicle 'RE1'; frontal collision with vehicle 'RE2', lane='d_0', gap=-1.00, time=110.00, stage=move. diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/errors.sumo.meso b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/errors.sumo.meso new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/input_routes.rou.xml b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/input_routes.rou.xml new file mode 100644 index 000000000000..f1db6c23c6df --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/input_routes.rou.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/net.net.xml b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/net.net.xml new file mode 100644 index 000000000000..c9fd8a0a4113 --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/net.net.xml @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/options.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/options.sumo new file mode 100644 index 000000000000..a6643cdddf5d --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml --routes=input_routes.rou.xml +--collision.action warn diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/output.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/railsignalblocks.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/railsignalblocks.sumo new file mode 100644 index 000000000000..01d0b159fdec --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_jump_sameEdge/railsignalblocks.sumo @@ -0,0 +1,35 @@ + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/errors.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/errors.sumo new file mode 100644 index 000000000000..5a1694431043 --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/errors.sumo @@ -0,0 +1,2 @@ +Warning: Teleporting vehicle 'RE1'; frontal collision with vehicle 'RE2', lane='-d_0', gap=-1.00, time=108.00, stage=move. +Warning: Vehicle 'RE1' ends teleporting on edge 'e', time=108.00. diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/errors.sumo.meso b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/errors.sumo.meso new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/input_routes.rou.xml b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/input_routes.rou.xml new file mode 100644 index 000000000000..01936fbb31a9 --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/input_routes.rou.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/net.net.xml b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/net.net.xml new file mode 100644 index 000000000000..c9fd8a0a4113 --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/net.net.xml @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/options.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/options.sumo new file mode 100644 index 000000000000..768b2b2c086c --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/options.sumo @@ -0,0 +1 @@ +--no-step-log --no-duration-log --net-file=net.net.xml --routes=input_routes.rou.xml diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/output.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/railsignalblocks.sumo b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/railsignalblocks.sumo new file mode 100644 index 000000000000..01d0b159fdec --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/frontal_collision_reverseRoles/railsignalblocks.sumo @@ -0,0 +1,35 @@ + + + + + + diff --git a/tests/sumo/rail/collision_noInsertionChecks/options.sumo b/tests/sumo/rail/collision_noInsertionChecks/options.sumo new file mode 100644 index 000000000000..e0f02218f792 --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/options.sumo @@ -0,0 +1 @@ +--insertion-checks none diff --git a/tests/sumo/rail/collision_noInsertionChecks/testsuite.sumo b/tests/sumo/rail/collision_noInsertionChecks/testsuite.sumo new file mode 100644 index 000000000000..29c38dbbd99a --- /dev/null +++ b/tests/sumo/rail/collision_noInsertionChecks/testsuite.sumo @@ -0,0 +1,19 @@ +# as above but without rail signals +crossing_tracks_collision + +# unsafe train insertion with an oncoming train beyond the insertion lookahead-horizon. +frontal_collision + +# unsafe train insertion with an oncoming train beyond the insertion lookahead-horizon. Collision occurs between when only the back of one vehicle is still on the collision edge +frontal_collision_further + +# change train speeds to change assigned collider and victim roles +frontal_collision_reverseRoles + +# unsafe train insertion with an oncoming train beyond the insertion lookahead-horizon. (short vehicles make this hard to detect because each sim step by itself looks safe +# +# vehicles change edge while "jumping" through each other +frontal_collision_jump + +# unsafe train insertion with an oncoming train beyond the insertion lookahead-horizon. (short vehicles make this hard to detect because each sim step by itself looks safe +frontal_collision_jump_sameEdge diff --git a/tests/sumo/rail/crossing/space-gap/railsignalblocks.sumo b/tests/sumo/rail/crossing/space-gap/railsignalblocks.sumo index 7dd234787a17..90499fdbee34 100644 --- a/tests/sumo/rail/crossing/space-gap/railsignalblocks.sumo +++ b/tests/sumo/rail/crossing/space-gap/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/crossing/time-gap/railsignalblocks.sumo b/tests/sumo/rail/crossing/time-gap/railsignalblocks.sumo index 7dd234787a17..90499fdbee34 100644 --- a/tests/sumo/rail/crossing/time-gap/railsignalblocks.sumo +++ b/tests/sumo/rail/crossing/time-gap/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/crossing_tracks/railsignalblocks.sumo b/tests/sumo/rail/crossing_tracks/railsignalblocks.sumo index bc304769785d..6959bc11e57d 100644 --- a/tests/sumo/rail/crossing_tracks/railsignalblocks.sumo +++ b/tests/sumo/rail/crossing_tracks/railsignalblocks.sumo @@ -1,6 +1,6 @@ - + + + + diff --git a/tests/sumo/rail/deadlocks/circle_3veh/errors.sumo b/tests/sumo/rail/deadlocks/circle_3veh/errors.sumo new file mode 100644 index 000000000000..d1cefa5db6cf --- /dev/null +++ b/tests/sumo/rail/deadlocks/circle_3veh/errors.sumo @@ -0,0 +1,2 @@ +Warning: Teleporting vehicle 't2'; waited too long (yield, railSignal), lane='c_0', time=243.00. +Warning: Vehicle 't2' ends teleporting on edge 'a', time=283.00. diff --git a/tests/sumo/rail/deadlocks/circle_3veh/input_routes.rou.xml b/tests/sumo/rail/deadlocks/circle_3veh/input_routes.rou.xml new file mode 100644 index 000000000000..39684102432d --- /dev/null +++ b/tests/sumo/rail/deadlocks/circle_3veh/input_routes.rou.xml @@ -0,0 +1,38 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/circle_3veh/net.net.xml b/tests/sumo/rail/deadlocks/circle_3veh/net.net.xml new file mode 100644 index 000000000000..ebed5ce0e562 --- /dev/null +++ b/tests/sumo/rail/deadlocks/circle_3veh/net.net.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/circle_3veh/options.sumo b/tests/sumo/rail/deadlocks/circle_3veh/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/deadlocks/circle_3veh/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/deadlocks/circle_3veh/output.sumo b/tests/sumo/rail/deadlocks/circle_3veh/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/deadlocks/circle_3veh/railsignalblocks.sumo b/tests/sumo/rail/deadlocks/circle_3veh/railsignalblocks.sumo new file mode 100644 index 000000000000..98f6398c70e5 --- /dev/null +++ b/tests/sumo/rail/deadlocks/circle_3veh/railsignalblocks.sumo @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/circle_3veh/tripinfos.sumo b/tests/sumo/rail/deadlocks/circle_3veh/tripinfos.sumo new file mode 100644 index 000000000000..e1afbb7b37ee --- /dev/null +++ b/tests/sumo/rail/deadlocks/circle_3veh/tripinfos.sumo @@ -0,0 +1,46 @@ + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/loop_4veh/deadlocks.sumo b/tests/sumo/rail/deadlocks/loop_4veh/deadlocks.sumo new file mode 100644 index 000000000000..0e5fbdebf7f7 --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh/deadlocks.sumo @@ -0,0 +1,44 @@ + + + + + + + diff --git a/tests/sumo/rail/deadlocks/loop_4veh/errors.sumo b/tests/sumo/rail/deadlocks/loop_4veh/errors.sumo new file mode 100644 index 000000000000..7edc05b2ddb6 --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh/errors.sumo @@ -0,0 +1,2 @@ +Warning: Teleporting vehicle 't1'; waited too long (yield, railSignal), lane='a_0', time=272.00. +Warning: Vehicle 't1' ends teleporting on edge 'e', time=369.00. diff --git a/tests/sumo/rail/deadlocks/loop_4veh/input_routes.rou.xml b/tests/sumo/rail/deadlocks/loop_4veh/input_routes.rou.xml new file mode 100644 index 000000000000..31eccd652f1a --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh/input_routes.rou.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/loop_4veh/net.net.xml b/tests/sumo/rail/deadlocks/loop_4veh/net.net.xml new file mode 100644 index 000000000000..2f0045b4ec4b --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh/net.net.xml @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/loop_4veh/options.sumo b/tests/sumo/rail/deadlocks/loop_4veh/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/deadlocks/loop_4veh/output.sumo b/tests/sumo/rail/deadlocks/loop_4veh/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/deadlocks/loop_4veh/railsignalblocks.sumo b/tests/sumo/rail/deadlocks/loop_4veh/railsignalblocks.sumo new file mode 100644 index 000000000000..127c95969313 --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh/railsignalblocks.sumo @@ -0,0 +1,265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/loop_4veh/tripinfos.sumo b/tests/sumo/rail/deadlocks/loop_4veh/tripinfos.sumo new file mode 100644 index 000000000000..4ace36c9b8e8 --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh/tripinfos.sumo @@ -0,0 +1,47 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/loop_4veh2/deadlocks.sumo b/tests/sumo/rail/deadlocks/loop_4veh2/deadlocks.sumo new file mode 100644 index 000000000000..0e5fbdebf7f7 --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh2/deadlocks.sumo @@ -0,0 +1,44 @@ + + + + + + + diff --git a/tests/sumo/rail/deadlocks/loop_4veh2/errors.sumo b/tests/sumo/rail/deadlocks/loop_4veh2/errors.sumo new file mode 100644 index 000000000000..7edc05b2ddb6 --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh2/errors.sumo @@ -0,0 +1,2 @@ +Warning: Teleporting vehicle 't1'; waited too long (yield, railSignal), lane='a_0', time=272.00. +Warning: Vehicle 't1' ends teleporting on edge 'e', time=369.00. diff --git a/tests/sumo/rail/deadlocks/loop_4veh2/input_routes.rou.xml b/tests/sumo/rail/deadlocks/loop_4veh2/input_routes.rou.xml new file mode 100644 index 000000000000..1490871e263b --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh2/input_routes.rou.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/loop_4veh2/net.net.xml b/tests/sumo/rail/deadlocks/loop_4veh2/net.net.xml new file mode 100644 index 000000000000..2f0045b4ec4b --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh2/net.net.xml @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/loop_4veh2/options.sumo b/tests/sumo/rail/deadlocks/loop_4veh2/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh2/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/deadlocks/loop_4veh2/output.sumo b/tests/sumo/rail/deadlocks/loop_4veh2/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/deadlocks/loop_4veh2/railsignalblocks.sumo b/tests/sumo/rail/deadlocks/loop_4veh2/railsignalblocks.sumo new file mode 100644 index 000000000000..76a9c3930daf --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh2/railsignalblocks.sumo @@ -0,0 +1,265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/loop_4veh2/tripinfos.sumo b/tests/sumo/rail/deadlocks/loop_4veh2/tripinfos.sumo new file mode 100644 index 000000000000..e191f7bf94d0 --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh2/tripinfos.sumo @@ -0,0 +1,47 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/loop_4veh3/deadlocks.sumo b/tests/sumo/rail/deadlocks/loop_4veh3/deadlocks.sumo new file mode 100644 index 000000000000..e377cc676853 --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh3/deadlocks.sumo @@ -0,0 +1,44 @@ + + + + + + diff --git a/tests/sumo/rail/deadlocks/loop_4veh3/errors.sumo b/tests/sumo/rail/deadlocks/loop_4veh3/errors.sumo new file mode 100644 index 000000000000..bc355c332fe3 --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh3/errors.sumo @@ -0,0 +1 @@ +Warning: Vehicle 't1'; collision with vehicle 't3', lane='-i2_0', gap=-1.00, time=255.00, stage=move. diff --git a/tests/sumo/rail/deadlocks/loop_4veh3/input_routes.rou.xml b/tests/sumo/rail/deadlocks/loop_4veh3/input_routes.rou.xml new file mode 100644 index 000000000000..192936e07187 --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh3/input_routes.rou.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/loop_4veh3/net.net.xml b/tests/sumo/rail/deadlocks/loop_4veh3/net.net.xml new file mode 100644 index 000000000000..2f0045b4ec4b --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh3/net.net.xml @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/loop_4veh3/options.sumo b/tests/sumo/rail/deadlocks/loop_4veh3/options.sumo new file mode 100644 index 000000000000..acc06781c620 --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh3/options.sumo @@ -0,0 +1,3 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml +--collision.action warn diff --git a/tests/sumo/rail/deadlocks/loop_4veh3/output.sumo b/tests/sumo/rail/deadlocks/loop_4veh3/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/deadlocks/loop_4veh3/railsignalblocks.sumo b/tests/sumo/rail/deadlocks/loop_4veh3/railsignalblocks.sumo new file mode 100644 index 000000000000..f86e05e2ef27 --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh3/railsignalblocks.sumo @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/loop_4veh3/tripinfos.sumo b/tests/sumo/rail/deadlocks/loop_4veh3/tripinfos.sumo new file mode 100644 index 000000000000..93a6b4f6ed33 --- /dev/null +++ b/tests/sumo/rail/deadlocks/loop_4veh3/tripinfos.sumo @@ -0,0 +1,46 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/options.sumo b/tests/sumo/rail/deadlocks/options.sumo new file mode 100644 index 000000000000..d3973627d54d --- /dev/null +++ b/tests/sumo/rail/deadlocks/options.sumo @@ -0,0 +1 @@ +--deadlock-output deadlocks.xml diff --git a/tests/sumo/rail/deadlocks/siding_deadlock2/deadlocks.sumo b/tests/sumo/rail/deadlocks/siding_deadlock2/deadlocks.sumo new file mode 100644 index 000000000000..d73bbf64758f --- /dev/null +++ b/tests/sumo/rail/deadlocks/siding_deadlock2/deadlocks.sumo @@ -0,0 +1,45 @@ + + + + + + + diff --git a/tests/sumo/rail/deadlocks/siding_deadlock2/errors.sumo b/tests/sumo/rail/deadlocks/siding_deadlock2/errors.sumo new file mode 100644 index 000000000000..a5d9d0a7cfd1 --- /dev/null +++ b/tests/sumo/rail/deadlocks/siding_deadlock2/errors.sumo @@ -0,0 +1,6 @@ +Warning: Teleporting vehicle 't0'; waited too long (yield, railSignal), lane='d_0', time=230.00. +Warning: Teleporting vehicle 't3'; waited too long (yield, railSignal), lane='-g_0', time=230.00. +Warning: Teleporting vehicle 't2'; waited too long (yield, railSignal), lane='a_0', time=230.00. +Warning: Vehicle 't0' ends teleporting on edge 'e', time=230.00. +Warning: Vehicle 't2' ends teleporting on edge 'b', time=230.00. +Warning: Vehicle 't3' ends teleporting on edge '-d2', time=250.00. diff --git a/tests/sumo/rail/deadlocks/siding_deadlock2/input_routes.rou.xml b/tests/sumo/rail/deadlocks/siding_deadlock2/input_routes.rou.xml new file mode 100644 index 000000000000..e0ff9ebb3792 --- /dev/null +++ b/tests/sumo/rail/deadlocks/siding_deadlock2/input_routes.rou.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/siding_deadlock2/net.net.xml b/tests/sumo/rail/deadlocks/siding_deadlock2/net.net.xml new file mode 100644 index 000000000000..0ddc5c773058 --- /dev/null +++ b/tests/sumo/rail/deadlocks/siding_deadlock2/net.net.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/siding_deadlock2/options.sumo b/tests/sumo/rail/deadlocks/siding_deadlock2/options.sumo new file mode 100644 index 000000000000..acc06781c620 --- /dev/null +++ b/tests/sumo/rail/deadlocks/siding_deadlock2/options.sumo @@ -0,0 +1,3 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml +--collision.action warn diff --git a/tests/sumo/rail/deadlocks/siding_deadlock2/output.sumo b/tests/sumo/rail/deadlocks/siding_deadlock2/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/deadlocks/siding_deadlock2/railsignalblocks.sumo b/tests/sumo/rail/deadlocks/siding_deadlock2/railsignalblocks.sumo new file mode 100644 index 000000000000..c7ffa3c1b2ac --- /dev/null +++ b/tests/sumo/rail/deadlocks/siding_deadlock2/railsignalblocks.sumo @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/siding_deadlock2/tripinfos.sumo b/tests/sumo/rail/deadlocks/siding_deadlock2/tripinfos.sumo new file mode 100644 index 000000000000..740c287a0f41 --- /dev/null +++ b/tests/sumo/rail/deadlocks/siding_deadlock2/tripinfos.sumo @@ -0,0 +1,47 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/testsuite.sumo b/tests/sumo/rail/deadlocks/testsuite.sumo new file mode 100644 index 000000000000..ec31abe849f9 --- /dev/null +++ b/tests/sumo/rail/deadlocks/testsuite.sumo @@ -0,0 +1,17 @@ +# siding cannot be used because it is already occupied, vehicle routes start or end in the siding +siding_deadlock2 + +# a loop that reverses on itself can create a deadlock with 4 vehicles (2 from either direction) +loop_4veh + +# a loop that reverses on itself can create a deadlock with 4 vehicles (2 from either direction), this time with different driveway initialization order +loop_4veh2 + +# collision (caused by rail-signal triggered rerouting) +loop_4veh3 + +# deadlock +triangle_6veh + +# deadlock +circle_3veh diff --git a/tests/sumo/rail/deadlocks/triangle_6veh/deadlocks.sumo b/tests/sumo/rail/deadlocks/triangle_6veh/deadlocks.sumo new file mode 100644 index 000000000000..90e35439a91f --- /dev/null +++ b/tests/sumo/rail/deadlocks/triangle_6veh/deadlocks.sumo @@ -0,0 +1,45 @@ + + + + + + + diff --git a/tests/sumo/rail/deadlocks/triangle_6veh/errors.sumo b/tests/sumo/rail/deadlocks/triangle_6veh/errors.sumo new file mode 100644 index 000000000000..2e6f527c97b0 --- /dev/null +++ b/tests/sumo/rail/deadlocks/triangle_6veh/errors.sumo @@ -0,0 +1,9 @@ +Warning: Teleporting vehicle 't5'; waited too long (yield, railSignal), lane='-a2_0', time=218.00. +Warning: Teleporting vehicle 't3'; waited too long (yield, railSignal), lane='-f_0', time=218.00. +Warning: Teleporting vehicle 't1'; waited too long (yield, railSignal), lane='a_0', time=218.00. +Warning: Vehicle 't1' skips stop on lane 'c_0' time=234.00. +Warning: Vehicle 't3' skips stop on lane 'd2_0' time=234.00. +Warning: Vehicle 't5' skips stop on lane 'c3_0' time=234.00. +Warning: Vehicle 't1' ends teleporting on edge 'f', time=267.00. +Warning: Vehicle 't3' ends teleporting on edge 'a2', time=270.00. +Warning: Vehicle 't5' ends teleporting on edge '-a', time=270.00. diff --git a/tests/sumo/rail/deadlocks/triangle_6veh/input_routes.rou.xml b/tests/sumo/rail/deadlocks/triangle_6veh/input_routes.rou.xml new file mode 100644 index 000000000000..a5da10cb8cc9 --- /dev/null +++ b/tests/sumo/rail/deadlocks/triangle_6veh/input_routes.rou.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/triangle_6veh/net.net.xml b/tests/sumo/rail/deadlocks/triangle_6veh/net.net.xml new file mode 100644 index 000000000000..886a278f9152 --- /dev/null +++ b/tests/sumo/rail/deadlocks/triangle_6veh/net.net.xml @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/triangle_6veh/options.sumo b/tests/sumo/rail/deadlocks/triangle_6veh/options.sumo new file mode 100644 index 000000000000..acc06781c620 --- /dev/null +++ b/tests/sumo/rail/deadlocks/triangle_6veh/options.sumo @@ -0,0 +1,3 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml +--collision.action warn diff --git a/tests/sumo/rail/deadlocks/triangle_6veh/output.sumo b/tests/sumo/rail/deadlocks/triangle_6veh/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/deadlocks/triangle_6veh/railsignalblocks.sumo b/tests/sumo/rail/deadlocks/triangle_6veh/railsignalblocks.sumo new file mode 100644 index 000000000000..783b116a6328 --- /dev/null +++ b/tests/sumo/rail/deadlocks/triangle_6veh/railsignalblocks.sumo @@ -0,0 +1,356 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks/triangle_6veh/tripinfos.sumo b/tests/sumo/rail/deadlocks/triangle_6veh/tripinfos.sumo new file mode 100644 index 000000000000..9065a2b174d0 --- /dev/null +++ b/tests/sumo/rail/deadlocks/triangle_6veh/tripinfos.sumo @@ -0,0 +1,49 @@ + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/circle_3veh/deadlocks.sumo b/tests/sumo/rail/deadlocks_loadHints/circle_3veh/deadlocks.sumo new file mode 100644 index 000000000000..77608ed332e3 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/circle_3veh/deadlocks.sumo @@ -0,0 +1,44 @@ + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/circle_3veh/errors.sumo b/tests/sumo/rail/deadlocks_loadHints/circle_3veh/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/deadlocks_loadHints/circle_3veh/input_additional.add.xml b/tests/sumo/rail/deadlocks_loadHints/circle_3veh/input_additional.add.xml new file mode 100644 index 000000000000..46822fac95ed --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/circle_3veh/input_additional.add.xml @@ -0,0 +1,44 @@ + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/circle_3veh/input_routes.rou.xml b/tests/sumo/rail/deadlocks_loadHints/circle_3veh/input_routes.rou.xml new file mode 100644 index 000000000000..39684102432d --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/circle_3veh/input_routes.rou.xml @@ -0,0 +1,38 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/circle_3veh/net.net.xml b/tests/sumo/rail/deadlocks_loadHints/circle_3veh/net.net.xml new file mode 100644 index 000000000000..ebed5ce0e562 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/circle_3veh/net.net.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/circle_3veh/options.sumo b/tests/sumo/rail/deadlocks_loadHints/circle_3veh/options.sumo new file mode 100644 index 000000000000..07a9a6f47f76 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/circle_3veh/options.sumo @@ -0,0 +1,3 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +-a input_additional.add.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/deadlocks_loadHints/circle_3veh/output.sumo b/tests/sumo/rail/deadlocks_loadHints/circle_3veh/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/deadlocks_loadHints/circle_3veh/railsignalblocks.sumo b/tests/sumo/rail/deadlocks_loadHints/circle_3veh/railsignalblocks.sumo new file mode 100644 index 000000000000..9aa38f35c167 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/circle_3veh/railsignalblocks.sumo @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/circle_3veh/tripinfos.sumo b/tests/sumo/rail/deadlocks_loadHints/circle_3veh/tripinfos.sumo new file mode 100644 index 000000000000..5b1b5ad892d1 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/circle_3veh/tripinfos.sumo @@ -0,0 +1,47 @@ + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh/deadlocks.sumo b/tests/sumo/rail/deadlocks_loadHints/loop_4veh/deadlocks.sumo new file mode 100644 index 000000000000..da96522e77e6 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh/deadlocks.sumo @@ -0,0 +1,44 @@ + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh/errors.sumo b/tests/sumo/rail/deadlocks_loadHints/loop_4veh/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh/input_additional.add.xml b/tests/sumo/rail/deadlocks_loadHints/loop_4veh/input_additional.add.xml new file mode 100644 index 000000000000..0e5fbdebf7f7 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh/input_additional.add.xml @@ -0,0 +1,44 @@ + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh/input_routes.rou.xml b/tests/sumo/rail/deadlocks_loadHints/loop_4veh/input_routes.rou.xml new file mode 100644 index 000000000000..31eccd652f1a --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh/input_routes.rou.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh/net.net.xml b/tests/sumo/rail/deadlocks_loadHints/loop_4veh/net.net.xml new file mode 100644 index 000000000000..2f0045b4ec4b --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh/net.net.xml @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh/options.sumo b/tests/sumo/rail/deadlocks_loadHints/loop_4veh/options.sumo new file mode 100644 index 000000000000..07a9a6f47f76 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh/options.sumo @@ -0,0 +1,3 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +-a input_additional.add.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh/output.sumo b/tests/sumo/rail/deadlocks_loadHints/loop_4veh/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh/railsignalblocks.sumo b/tests/sumo/rail/deadlocks_loadHints/loop_4veh/railsignalblocks.sumo new file mode 100644 index 000000000000..cae76e407f0f --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh/railsignalblocks.sumo @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh/tripinfos.sumo b/tests/sumo/rail/deadlocks_loadHints/loop_4veh/tripinfos.sumo new file mode 100644 index 000000000000..3c3f0209d3df --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh/tripinfos.sumo @@ -0,0 +1,48 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/deadlocks.sumo b/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/deadlocks.sumo new file mode 100644 index 000000000000..da96522e77e6 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/deadlocks.sumo @@ -0,0 +1,44 @@ + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/errors.sumo b/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/input_additional.add.xml b/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/input_additional.add.xml new file mode 100644 index 000000000000..0e5fbdebf7f7 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/input_additional.add.xml @@ -0,0 +1,44 @@ + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/input_routes.rou.xml b/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/input_routes.rou.xml new file mode 100644 index 000000000000..1490871e263b --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/input_routes.rou.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/net.net.xml b/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/net.net.xml new file mode 100644 index 000000000000..2f0045b4ec4b --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/net.net.xml @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/options.sumo b/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/options.sumo new file mode 100644 index 000000000000..07a9a6f47f76 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/options.sumo @@ -0,0 +1,3 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +-a input_additional.add.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/output.sumo b/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/railsignalblocks.sumo b/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/railsignalblocks.sumo new file mode 100644 index 000000000000..c5868341d0b1 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/railsignalblocks.sumo @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/tripinfos.sumo b/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/tripinfos.sumo new file mode 100644 index 000000000000..c6d01a92aa44 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh2/tripinfos.sumo @@ -0,0 +1,48 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/deadlocks.sumo b/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/deadlocks.sumo new file mode 100644 index 000000000000..e377cc676853 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/deadlocks.sumo @@ -0,0 +1,44 @@ + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/errors.sumo b/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/errors.sumo new file mode 100644 index 000000000000..bc355c332fe3 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/errors.sumo @@ -0,0 +1 @@ +Warning: Vehicle 't1'; collision with vehicle 't3', lane='-i2_0', gap=-1.00, time=255.00, stage=move. diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/input_additional.add.xml b/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/input_additional.add.xml new file mode 100644 index 000000000000..e377cc676853 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/input_additional.add.xml @@ -0,0 +1,44 @@ + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/input_routes.rou.xml b/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/input_routes.rou.xml new file mode 100644 index 000000000000..192936e07187 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/input_routes.rou.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/net.net.xml b/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/net.net.xml new file mode 100644 index 000000000000..2f0045b4ec4b --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/net.net.xml @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/options.sumo b/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/options.sumo new file mode 100644 index 000000000000..856016eaed3d --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/options.sumo @@ -0,0 +1,4 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml +-a input_additional.add.xml +--collision.action warn diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/output.sumo b/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/railsignalblocks.sumo b/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/railsignalblocks.sumo new file mode 100644 index 000000000000..6a49cb835510 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/railsignalblocks.sumo @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/tripinfos.sumo b/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/tripinfos.sumo new file mode 100644 index 000000000000..93a6b4f6ed33 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/loop_4veh3/tripinfos.sumo @@ -0,0 +1,46 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/options.sumo b/tests/sumo/rail/deadlocks_loadHints/options.sumo new file mode 100644 index 000000000000..d3973627d54d --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/options.sumo @@ -0,0 +1 @@ +--deadlock-output deadlocks.xml diff --git a/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/deadlocks.sumo b/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/deadlocks.sumo new file mode 100644 index 000000000000..db34dac139e7 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/deadlocks.sumo @@ -0,0 +1,45 @@ + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/errors.sumo b/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/input_additional.add.xml b/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/input_additional.add.xml new file mode 100644 index 000000000000..d73bbf64758f --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/input_additional.add.xml @@ -0,0 +1,45 @@ + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/input_routes.rou.xml b/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/input_routes.rou.xml new file mode 100644 index 000000000000..e0ff9ebb3792 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/input_routes.rou.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/net.net.xml b/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/net.net.xml new file mode 100644 index 000000000000..0ddc5c773058 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/net.net.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/options.sumo b/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/options.sumo new file mode 100644 index 000000000000..856016eaed3d --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/options.sumo @@ -0,0 +1,4 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml +-a input_additional.add.xml +--collision.action warn diff --git a/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/output.sumo b/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/railsignalblocks.sumo b/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/railsignalblocks.sumo new file mode 100644 index 000000000000..f7e909dcaced --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/railsignalblocks.sumo @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/tripinfos.sumo b/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/tripinfos.sumo new file mode 100644 index 000000000000..ed50e4755dbf --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/siding_deadlock2/tripinfos.sumo @@ -0,0 +1,49 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/testsuite.sumo b/tests/sumo/rail/deadlocks_loadHints/testsuite.sumo new file mode 100644 index 000000000000..3c56221f4d5d --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/testsuite.sumo @@ -0,0 +1,17 @@ +# siding cannot be used because it is already occupied, vehicle routes start or end in the siding +siding_deadlock2 + +# a loop that reverses on itself can create a deadlock with 4 vehicles (2 from either direction) +loop_4veh + +# a loop that reverses on itself can create a deadlock with 4 vehicles (2 from either direction), this time with different driveway initialization order +loop_4veh2 + +# collision (caused by rail-signal triggered rerouting) +loop_4veh3 + +# deadlock +triangle_6veh + +# avoid deadlock by loading a deadlock file +circle_3veh diff --git a/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/deadlocks.sumo b/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/deadlocks.sumo new file mode 100644 index 000000000000..91c6cc5394df --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/deadlocks.sumo @@ -0,0 +1,45 @@ + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/errors.sumo b/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/input_additional.add.xml b/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/input_additional.add.xml new file mode 100644 index 000000000000..90e35439a91f --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/input_additional.add.xml @@ -0,0 +1,45 @@ + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/input_routes.rou.xml b/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/input_routes.rou.xml new file mode 100644 index 000000000000..a5da10cb8cc9 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/input_routes.rou.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/net.net.xml b/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/net.net.xml new file mode 100644 index 000000000000..886a278f9152 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/net.net.xml @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/options.sumo b/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/options.sumo new file mode 100644 index 000000000000..856016eaed3d --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/options.sumo @@ -0,0 +1,4 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml +-a input_additional.add.xml +--collision.action warn diff --git a/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/output.sumo b/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/railsignalblocks.sumo b/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/railsignalblocks.sumo new file mode 100644 index 000000000000..3f6187f12a89 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/railsignalblocks.sumo @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/tripinfos.sumo b/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/tripinfos.sumo new file mode 100644 index 000000000000..4eb3546d6075 --- /dev/null +++ b/tests/sumo/rail/deadlocks_loadHints/triangle_6veh/tripinfos.sumo @@ -0,0 +1,51 @@ + + + + + + + + + + + + diff --git a/tests/sumo/rail/default_rail_type/railsignalblocks.sumo b/tests/sumo/rail/default_rail_type/railsignalblocks.sumo index 86bbff8ebab1..bf2f1ebc17e7 100644 --- a/tests/sumo/rail/default_rail_type/railsignalblocks.sumo +++ b/tests/sumo/rail/default_rail_type/railsignalblocks.sumo @@ -1,6 +1,6 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/model_railroad/railsignalblocks.sumo b/tests/sumo/rail/model_railroad/railsignalblocks.sumo index 7d3ca714578e..8b7efdc6c88a 100644 --- a/tests/sumo/rail/model_railroad/railsignalblocks.sumo +++ b/tests/sumo/rail/model_railroad/railsignalblocks.sumo @@ -1,17 +1,22 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/options.sumo b/tests/sumo/rail/options.sumo index 82332c304f02..8c15a2cae28f 100644 --- a/tests/sumo/rail/options.sumo +++ b/tests/sumo/rail/options.sumo @@ -1 +1,2 @@ --railsignal-block-output railsignal_blocks.xml +--time-to-teleport.railsignal-deadlock 200 diff --git a/tests/sumo/rail/overlapping_driveways/errors.sumo b/tests/sumo/rail/overlapping_driveways/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/overlapping_driveways/input_routes.rou.xml b/tests/sumo/rail/overlapping_driveways/input_routes.rou.xml new file mode 100644 index 000000000000..bcb7e3ac2a59 --- /dev/null +++ b/tests/sumo/rail/overlapping_driveways/input_routes.rou.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/overlapping_driveways/net.net.xml b/tests/sumo/rail/overlapping_driveways/net.net.xml new file mode 100644 index 000000000000..68f2581445f0 --- /dev/null +++ b/tests/sumo/rail/overlapping_driveways/net.net.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/overlapping_driveways/options.sumo b/tests/sumo/rail/overlapping_driveways/options.sumo new file mode 100644 index 000000000000..aeb315cdf1d9 --- /dev/null +++ b/tests/sumo/rail/overlapping_driveways/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml --routes=input_routes.rou.xml +--railsignal-vehicle-output railsignal_vehicles.xml diff --git a/tests/sumo/rail/overlapping_driveways/output.sumo b/tests/sumo/rail/overlapping_driveways/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/overlapping_driveways/railsignalblocks.sumo b/tests/sumo/rail/overlapping_driveways/railsignalblocks.sumo new file mode 100644 index 000000000000..116006b7f452 --- /dev/null +++ b/tests/sumo/rail/overlapping_driveways/railsignalblocks.sumo @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/overlapping_driveways/railsignalblocks.sumo.meso b/tests/sumo/rail/overlapping_driveways/railsignalblocks.sumo.meso new file mode 100644 index 000000000000..1e31798e5563 --- /dev/null +++ b/tests/sumo/rail/overlapping_driveways/railsignalblocks.sumo.meso @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/overlapping_driveways/railsignalvehs.sumo b/tests/sumo/rail/overlapping_driveways/railsignalvehs.sumo new file mode 100644 index 000000000000..a8cae37d0c15 --- /dev/null +++ b/tests/sumo/rail/overlapping_driveways/railsignalvehs.sumo @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/join/railsignalblocks.sumo b/tests/sumo/rail/portion_working/join/railsignalblocks.sumo index f74b7aa099e2..4460d0172e3b 100644 --- a/tests/sumo/rail/portion_working/join/railsignalblocks.sumo +++ b/tests/sumo/rail/portion_working/join/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/join/stopinfos.sumo b/tests/sumo/rail/portion_working/join/stopinfos.sumo index 9c79981afb3b..5b21582e669f 100644 --- a/tests/sumo/rail/portion_working/join/stopinfos.sumo +++ b/tests/sumo/rail/portion_working/join/stopinfos.sumo @@ -1,6 +1,6 @@ - - - + + diff --git a/tests/sumo/rail/portion_working/join/tripinfos.sumo b/tests/sumo/rail/portion_working/join/tripinfos.sumo index d6b4f6436ce8..786031587794 100644 --- a/tests/sumo/rail/portion_working/join/tripinfos.sumo +++ b/tests/sumo/rail/portion_working/join/tripinfos.sumo @@ -1,6 +1,6 @@ - - - + + diff --git a/tests/sumo/rail/portion_working/join_RB425/railsignalblocks.sumo b/tests/sumo/rail/portion_working/join_RB425/railsignalblocks.sumo index f74b7aa099e2..4460d0172e3b 100644 --- a/tests/sumo/rail/portion_working/join_RB425/railsignalblocks.sumo +++ b/tests/sumo/rail/portion_working/join_RB425/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/join_RB425/stopinfos.sumo b/tests/sumo/rail/portion_working/join_RB425/stopinfos.sumo index 95985b97ef60..b40e4a436b34 100644 --- a/tests/sumo/rail/portion_working/join_RB425/stopinfos.sumo +++ b/tests/sumo/rail/portion_working/join_RB425/stopinfos.sumo @@ -1,6 +1,6 @@ - - + diff --git a/tests/sumo/rail/portion_working/join_RB425/tripinfos.sumo b/tests/sumo/rail/portion_working/join_RB425/tripinfos.sumo index 2766ce7cfd98..83d12340cabf 100644 --- a/tests/sumo/rail/portion_working/join_RB425/tripinfos.sumo +++ b/tests/sumo/rail/portion_working/join_RB425/tripinfos.sumo @@ -1,6 +1,6 @@ - - + diff --git a/tests/sumo/rail/portion_working/join_fail/railsignalblocks.sumo b/tests/sumo/rail/portion_working/join_fail/railsignalblocks.sumo index f74b7aa099e2..e9a832b1f38a 100644 --- a/tests/sumo/rail/portion_working/join_fail/railsignalblocks.sumo +++ b/tests/sumo/rail/portion_working/join_fail/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/join_fail_abort/railsignalblocks.sumo b/tests/sumo/rail/portion_working/join_fail_abort/railsignalblocks.sumo index f74b7aa099e2..25ccf50ce721 100644 --- a/tests/sumo/rail/portion_working/join_fail_abort/railsignalblocks.sumo +++ b/tests/sumo/rail/portion_working/join_fail_abort/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/join_front/railsignalblocks.sumo b/tests/sumo/rail/portion_working/join_front/railsignalblocks.sumo index f74b7aa099e2..84992147fd71 100644 --- a/tests/sumo/rail/portion_working/join_front/railsignalblocks.sumo +++ b/tests/sumo/rail/portion_working/join_front/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/join_front/stopinfos.sumo b/tests/sumo/rail/portion_working/join_front/stopinfos.sumo index 84ed4e5edf40..ca9a448f4c3f 100644 --- a/tests/sumo/rail/portion_working/join_front/stopinfos.sumo +++ b/tests/sumo/rail/portion_working/join_front/stopinfos.sumo @@ -1,6 +1,6 @@ - + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/join_front_further/stopinfos.sumo b/tests/sumo/rail/portion_working/join_front_further/stopinfos.sumo index ec8437a013db..84060c5a1c0c 100644 --- a/tests/sumo/rail/portion_working/join_front_further/stopinfos.sumo +++ b/tests/sumo/rail/portion_working/join_front_further/stopinfos.sumo @@ -1,6 +1,6 @@ - - - + + diff --git a/tests/sumo/rail/portion_working/join_front_further/tripinfos.sumo b/tests/sumo/rail/portion_working/join_front_further/tripinfos.sumo index f8463ca5334c..72e0210b96bf 100644 --- a/tests/sumo/rail/portion_working/join_front_further/tripinfos.sumo +++ b/tests/sumo/rail/portion_working/join_front_further/tripinfos.sumo @@ -1,6 +1,6 @@ - - - + + diff --git a/tests/sumo/rail/portion_working/join_front_further_late/railsignalblocks.sumo b/tests/sumo/rail/portion_working/join_front_further_late/railsignalblocks.sumo index f74b7aa099e2..2de0e9bc3561 100644 --- a/tests/sumo/rail/portion_working/join_front_further_late/railsignalblocks.sumo +++ b/tests/sumo/rail/portion_working/join_front_further_late/railsignalblocks.sumo @@ -1,26 +1,32 @@ - + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/join_front_late/railsignalblocks.sumo b/tests/sumo/rail/portion_working/join_front_late/railsignalblocks.sumo index f74b7aa099e2..25d15a915862 100644 --- a/tests/sumo/rail/portion_working/join_front_late/railsignalblocks.sumo +++ b/tests/sumo/rail/portion_working/join_front_late/railsignalblocks.sumo @@ -1,12 +1,17 @@ - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/join_front_route_invalid/errors.sumo b/tests/sumo/rail/portion_working/join_front_route_invalid/errors.sumo index 9a73e2132b07..60cfc01bbd86 100644 --- a/tests/sumo/rail/portion_working/join_front_route_invalid/errors.sumo +++ b/tests/sumo/rail/portion_working/join_front_route_invalid/errors.sumo @@ -1,3 +1,3 @@ -Warning: Cannot join vehicle 't0' to vehicle 't1' due to incompatible routes. time=124.00. +Warning: Cannot join vehicle 't0' to vehicle 't1' due to incompatible routes. time=131.00. Warning: Vehicle 't0' aborted waiting to be joined to vehicle 't1'. Warning: Vehicle 't1' aborted waiting for a joining vehicle that will never come. diff --git a/tests/sumo/rail/portion_working/join_front_route_invalid/input_routes.rou.xml b/tests/sumo/rail/portion_working/join_front_route_invalid/input_routes.rou.xml index 9c51bc21caa2..7793ccf0cc5b 100644 --- a/tests/sumo/rail/portion_working/join_front_route_invalid/input_routes.rou.xml +++ b/tests/sumo/rail/portion_working/join_front_route_invalid/input_routes.rou.xml @@ -50,6 +50,6 @@ - + diff --git a/tests/sumo/rail/portion_working/join_front_route_invalid/railsignalblocks.sumo b/tests/sumo/rail/portion_working/join_front_route_invalid/railsignalblocks.sumo index f74b7aa099e2..0264baee90d8 100644 --- a/tests/sumo/rail/portion_working/join_front_route_invalid/railsignalblocks.sumo +++ b/tests/sumo/rail/portion_working/join_front_route_invalid/railsignalblocks.sumo @@ -1,26 +1,32 @@ - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/join_front_route_problem/railsignalblocks.sumo b/tests/sumo/rail/portion_working/join_front_route_problem/railsignalblocks.sumo index f74b7aa099e2..fa365a6018ce 100644 --- a/tests/sumo/rail/portion_working/join_front_route_problem/railsignalblocks.sumo +++ b/tests/sumo/rail/portion_working/join_front_route_problem/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/join_front_route_problem/stopinfos.sumo b/tests/sumo/rail/portion_working/join_front_route_problem/stopinfos.sumo index 84ed4e5edf40..1ce02385b784 100644 --- a/tests/sumo/rail/portion_working/join_front_route_problem/stopinfos.sumo +++ b/tests/sumo/rail/portion_working/join_front_route_problem/stopinfos.sumo @@ -1,6 +1,6 @@ - - - + + diff --git a/tests/sumo/rail/portion_working/join_front_route_problem/tripinfos.sumo b/tests/sumo/rail/portion_working/join_front_route_problem/tripinfos.sumo index 693372032180..d7bf7ee4ea48 100644 --- a/tests/sumo/rail/portion_working/join_front_route_problem/tripinfos.sumo +++ b/tests/sumo/rail/portion_working/join_front_route_problem/tripinfos.sumo @@ -1,6 +1,6 @@ - - - + + diff --git a/tests/sumo/rail/portion_working/join_front_signal/railsignalblocks.sumo b/tests/sumo/rail/portion_working/join_front_signal/railsignalblocks.sumo index dbfa700f57ed..af29eae5afce 100644 --- a/tests/sumo/rail/portion_working/join_front_signal/railsignalblocks.sumo +++ b/tests/sumo/rail/portion_working/join_front_signal/railsignalblocks.sumo @@ -1,6 +1,6 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/split/railsignalblocks.sumo b/tests/sumo/rail/portion_working/split/railsignalblocks.sumo index f74b7aa099e2..d4439d811fc7 100644 --- a/tests/sumo/rail/portion_working/split/railsignalblocks.sumo +++ b/tests/sumo/rail/portion_working/split/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/splitFront/railsignalblocks.sumo b/tests/sumo/rail/portion_working/splitFront/railsignalblocks.sumo index f74b7aa099e2..d4439d811fc7 100644 --- a/tests/sumo/rail/portion_working/splitFront/railsignalblocks.sumo +++ b/tests/sumo/rail/portion_working/splitFront/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/split_departPosDefault/railsignalblocks.sumo b/tests/sumo/rail/portion_working/split_departPosDefault/railsignalblocks.sumo index f74b7aa099e2..64163c00ad29 100644 --- a/tests/sumo/rail/portion_working/split_departPosDefault/railsignalblocks.sumo +++ b/tests/sumo/rail/portion_working/split_departPosDefault/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/split_departPosDefault/tripinfos.sumo b/tests/sumo/rail/portion_working/split_departPosDefault/tripinfos.sumo index 3b065dfe667e..78199f2ba437 100644 --- a/tests/sumo/rail/portion_working/split_departPosDefault/tripinfos.sumo +++ b/tests/sumo/rail/portion_working/split_departPosDefault/tripinfos.sumo @@ -1,6 +1,6 @@ - + + + + + + diff --git a/tests/sumo/rail/portion_working/split_departPosDefault_legacy/net.net.xml b/tests/sumo/rail/portion_working/split_departPosDefault_legacy/net.net.xml new file mode 100644 index 000000000000..aa6b81443753 --- /dev/null +++ b/tests/sumo/rail/portion_working/split_departPosDefault_legacy/net.net.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/split_departPosDefault_legacy/options.sumo b/tests/sumo/rail/portion_working/split_departPosDefault_legacy/options.sumo new file mode 100644 index 000000000000..f49a7a360c1a --- /dev/null +++ b/tests/sumo/rail/portion_working/split_departPosDefault_legacy/options.sumo @@ -0,0 +1,4 @@ +--no-step-log --no-duration-log --net-file=net.net.xml --routes=input_routes.rou.xml +-a input_additional.add.xml +--tripinfo-output tripinfos.xml +--stop-output stopinfos.xml diff --git a/tests/sumo/rail/portion_working/split_departPosDefault_legacy/output.sumo b/tests/sumo/rail/portion_working/split_departPosDefault_legacy/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/portion_working/split_departPosDefault_legacy/railsignalblocks.sumo b/tests/sumo/rail/portion_working/split_departPosDefault_legacy/railsignalblocks.sumo new file mode 100644 index 000000000000..64163c00ad29 --- /dev/null +++ b/tests/sumo/rail/portion_working/split_departPosDefault_legacy/railsignalblocks.sumo @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/split_departPosDefault_legacy/stopinfos.sumo b/tests/sumo/rail/portion_working/split_departPosDefault_legacy/stopinfos.sumo new file mode 100644 index 000000000000..53b41d1f7465 --- /dev/null +++ b/tests/sumo/rail/portion_working/split_departPosDefault_legacy/stopinfos.sumo @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/tests/sumo/rail/portion_working/split_departPosDefault_legacy/stopinfos.sumo.meso b/tests/sumo/rail/portion_working/split_departPosDefault_legacy/stopinfos.sumo.meso new file mode 100644 index 000000000000..1a92ae3d7bca --- /dev/null +++ b/tests/sumo/rail/portion_working/split_departPosDefault_legacy/stopinfos.sumo.meso @@ -0,0 +1,48 @@ + + + + + + + diff --git a/tests/sumo/rail/portion_working/split_departPosDefault_legacy/tripinfos.sumo b/tests/sumo/rail/portion_working/split_departPosDefault_legacy/tripinfos.sumo new file mode 100644 index 000000000000..98bc8f8dc540 --- /dev/null +++ b/tests/sumo/rail/portion_working/split_departPosDefault_legacy/tripinfos.sumo @@ -0,0 +1,46 @@ + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/split_departPosDefault_legacy/tripinfos.sumo.meso b/tests/sumo/rail/portion_working/split_departPosDefault_legacy/tripinfos.sumo.meso new file mode 100644 index 000000000000..d23379c0709b --- /dev/null +++ b/tests/sumo/rail/portion_working/split_departPosDefault_legacy/tripinfos.sumo.meso @@ -0,0 +1,49 @@ + + + + + + + + diff --git a/tests/sumo/rail/portion_working/split_longTrain/railsignalblocks.sumo b/tests/sumo/rail/portion_working/split_longTrain/railsignalblocks.sumo index f74b7aa099e2..32e9d2ce2763 100644 --- a/tests/sumo/rail/portion_working/split_longTrain/railsignalblocks.sumo +++ b/tests/sumo/rail/portion_working/split_longTrain/railsignalblocks.sumo @@ -1,23 +1,28 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/testsuite.sumo b/tests/sumo/rail/portion_working/testsuite.sumo index 0505ef6391d6..38695c47719e 100644 --- a/tests/sumo/rail/portion_working/testsuite.sumo +++ b/tests/sumo/rail/portion_working/testsuite.sumo @@ -10,6 +10,9 @@ splitFront # split a train into two parts without specifing the departPos of the train that is created by splitting split_departPosDefault +# split a train into two parts without specifing the departPos of the train that is created by splitting +split_departPosDefault_legacy + # split a train into a long rear part and a short front part split_longTrain diff --git a/tests/sumo/rail/portion_working/transportables/join_containers/railsignalblocks.sumo b/tests/sumo/rail/portion_working/transportables/join_containers/railsignalblocks.sumo index f74b7aa099e2..4460d0172e3b 100644 --- a/tests/sumo/rail/portion_working/transportables/join_containers/railsignalblocks.sumo +++ b/tests/sumo/rail/portion_working/transportables/join_containers/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/transportables/join_containers/stopinfos.sumo b/tests/sumo/rail/portion_working/transportables/join_containers/stopinfos.sumo index c8d6a89231e8..bbd50b604e5b 100644 --- a/tests/sumo/rail/portion_working/transportables/join_containers/stopinfos.sumo +++ b/tests/sumo/rail/portion_working/transportables/join_containers/stopinfos.sumo @@ -1,6 +1,6 @@ - - - + + - + - + - - + + - + diff --git a/tests/sumo/rail/portion_working/transportables/join_persons/railsignalblocks.sumo b/tests/sumo/rail/portion_working/transportables/join_persons/railsignalblocks.sumo index f74b7aa099e2..4460d0172e3b 100644 --- a/tests/sumo/rail/portion_working/transportables/join_persons/railsignalblocks.sumo +++ b/tests/sumo/rail/portion_working/transportables/join_persons/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/transportables/join_persons/stopinfos.sumo b/tests/sumo/rail/portion_working/transportables/join_persons/stopinfos.sumo index 82a5173ab1d2..5b86c4ac4bdc 100644 --- a/tests/sumo/rail/portion_working/transportables/join_persons/stopinfos.sumo +++ b/tests/sumo/rail/portion_working/transportables/join_persons/stopinfos.sumo @@ -1,6 +1,6 @@ - - - + + - + - + - - + + - + diff --git a/tests/sumo/rail/portion_working/transportables/split_containers/railsignalblocks.sumo b/tests/sumo/rail/portion_working/transportables/split_containers/railsignalblocks.sumo index f74b7aa099e2..d4439d811fc7 100644 --- a/tests/sumo/rail/portion_working/transportables/split_containers/railsignalblocks.sumo +++ b/tests/sumo/rail/portion_working/transportables/split_containers/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/portion_working/transportables/split_containers_noStop/railsignalblocks.sumo b/tests/sumo/rail/portion_working/transportables/split_containers_noStop/railsignalblocks.sumo index f74b7aa099e2..d4439d811fc7 100644 --- a/tests/sumo/rail/portion_working/transportables/split_containers_noStop/railsignalblocks.sumo +++ b/tests/sumo/rail/portion_working/transportables/split_containers_noStop/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/circle/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/circle/railsignalblocks.sumo index aa2de5444234..a02b0cd88ddb 100644 --- a/tests/sumo/rail/rail_signal/circle/railsignalblocks.sumo +++ b/tests/sumo/rail/rail_signal/circle/railsignalblocks.sumo @@ -1,6 +1,6 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock/deadlocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock/deadlocks.sumo new file mode 100644 index 000000000000..f4cb57a003b0 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock/deadlocks.sumo @@ -0,0 +1,45 @@ + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock/errors.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock/errors.sumo new file mode 100644 index 000000000000..fc65b0cc7b39 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock/errors.sumo @@ -0,0 +1,2 @@ +Warning: Teleporting vehicle 't0'; waited too long (yield, railSignal), lane='a_0', time=231.00. +Warning: Vehicle 't0' ends teleporting on edge 'b', time=231.00. diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock/input_additional.add.xml b/tests/sumo/rail/rail_signal/constraints/deadlock/input_additional.add.xml new file mode 100644 index 000000000000..1eb3ea4da778 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock/input_additional.add.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock/input_routes.rou.xml b/tests/sumo/rail/rail_signal/constraints/deadlock/input_routes.rou.xml new file mode 100644 index 000000000000..f87b358d8afd --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock/input_routes.rou.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock/options.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock/options.sumo new file mode 100644 index 000000000000..d3973627d54d --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock/options.sumo @@ -0,0 +1 @@ +--deadlock-output deadlocks.xml diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock/output.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock/railsignalblocks.sumo new file mode 100644 index 000000000000..e6ae88974465 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock/railsignalblocks.sumo @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock/tripinfos.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock/tripinfos.sumo new file mode 100644 index 000000000000..4363233adb3d --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock/tripinfos.sumo @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock/tripinfos.sumo.meso b/tests/sumo/rail/rail_signal/constraints/deadlock/tripinfos.sumo.meso new file mode 100644 index 000000000000..5270000edde0 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock/tripinfos.sumo.meso @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/deadlocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/deadlocks.sumo new file mode 100644 index 000000000000..633c6cbbb85e --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/deadlocks.sumo @@ -0,0 +1,45 @@ + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/errors.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/errors.sumo new file mode 100644 index 000000000000..fc65b0cc7b39 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/errors.sumo @@ -0,0 +1,2 @@ +Warning: Teleporting vehicle 't0'; waited too long (yield, railSignal), lane='a_0', time=231.00. +Warning: Vehicle 't0' ends teleporting on edge 'b', time=231.00. diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/input_additional.add.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/input_additional.add.xml new file mode 100644 index 000000000000..da71e6733f50 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/input_additional.add.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/input_routes.rou.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/input_routes.rou.xml new file mode 100644 index 000000000000..f58cd2c4c2b8 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/input_routes.rou.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/options.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/options.sumo new file mode 100644 index 000000000000..d3973627d54d --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/options.sumo @@ -0,0 +1 @@ +--deadlock-output deadlocks.xml diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/output.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/railsignalblocks.sumo new file mode 100644 index 000000000000..36accdb87111 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/railsignalblocks.sumo @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/tripinfos.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/tripinfos.sumo new file mode 100644 index 000000000000..5c8c1199d32a --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/tripinfos.sumo @@ -0,0 +1,46 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/tripinfos.sumo.meso b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/tripinfos.sumo.meso new file mode 100644 index 000000000000..5270000edde0 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion/tripinfos.sumo.meso @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/deadlocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/deadlocks.sumo new file mode 100644 index 000000000000..dc150ac98eb0 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/deadlocks.sumo @@ -0,0 +1,45 @@ + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/errors.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/errors.sumo new file mode 100644 index 000000000000..3297cad54810 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/errors.sumo @@ -0,0 +1,2 @@ +Warning: Teleporting vehicle 't0'; waited too long (yield, railSignal), lane='a_0', time=262.00. +Warning: Vehicle 't0' ends teleporting on edge 'b', time=262.00. diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/input_additional.add.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/input_additional.add.xml new file mode 100644 index 000000000000..da71e6733f50 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/input_additional.add.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/input_routes.rou.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/input_routes.rou.xml new file mode 100644 index 000000000000..495562f37ed5 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/input_routes.rou.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/options.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/options.sumo new file mode 100644 index 000000000000..d3973627d54d --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/options.sumo @@ -0,0 +1 @@ +--deadlock-output deadlocks.xml diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/output.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/railsignalblocks.sumo new file mode 100644 index 000000000000..964b90e381f7 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/railsignalblocks.sumo @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/tripinfos.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/tripinfos.sumo new file mode 100644 index 000000000000..2f00a757017e --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/tripinfos.sumo @@ -0,0 +1,46 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/tripinfos.sumo.meso b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/tripinfos.sumo.meso new file mode 100644 index 000000000000..5270000edde0 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2/tripinfos.sumo.meso @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/deadlocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/deadlocks.sumo new file mode 100644 index 000000000000..df3cb2329276 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/deadlocks.sumo @@ -0,0 +1,50 @@ + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/errors.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/errors.sumo new file mode 100644 index 000000000000..369969b0e888 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/errors.sumo @@ -0,0 +1 @@ +Warning: Deactivating constraint to resolve deadlock between vehicles t1 t0 at time 262.00. diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/input_additional.add.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/input_additional.add.xml new file mode 100644 index 000000000000..da71e6733f50 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/input_additional.add.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/input_routes.rou.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/input_routes.rou.xml new file mode 100644 index 000000000000..495562f37ed5 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/input_routes.rou.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/options.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/options.sumo new file mode 100644 index 000000000000..ebc6c6223b00 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/options.sumo @@ -0,0 +1,2 @@ +--deadlock-output deadlocks.xml +--time-to-teleport.remove-constraint diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/output.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/railsignalblocks.sumo new file mode 100644 index 000000000000..964b90e381f7 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/railsignalblocks.sumo @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/tripinfos.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/tripinfos.sumo new file mode 100644 index 000000000000..8753828864af --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/tripinfos.sumo @@ -0,0 +1,47 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/tripinfos.sumo.meso b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/tripinfos.sumo.meso new file mode 100644 index 000000000000..5270000edde0 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion2_remove/tripinfos.sumo.meso @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/deadlocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/deadlocks.sumo new file mode 100644 index 000000000000..6708333630a4 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/deadlocks.sumo @@ -0,0 +1,45 @@ + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/errors.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/errors.sumo new file mode 100644 index 000000000000..fc65b0cc7b39 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/errors.sumo @@ -0,0 +1,2 @@ +Warning: Teleporting vehicle 't0'; waited too long (yield, railSignal), lane='a_0', time=231.00. +Warning: Vehicle 't0' ends teleporting on edge 'b', time=231.00. diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/input_additional.add.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/input_additional.add.xml new file mode 100644 index 000000000000..6b5513f01e67 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/input_additional.add.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/input_routes.rou.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/input_routes.rou.xml new file mode 100644 index 000000000000..f87b358d8afd --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/input_routes.rou.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/options.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/options.sumo new file mode 100644 index 000000000000..d3973627d54d --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/options.sumo @@ -0,0 +1 @@ +--deadlock-output deadlocks.xml diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/output.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/railsignalblocks.sumo new file mode 100644 index 000000000000..e6ae88974465 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/railsignalblocks.sumo @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/tripinfos.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/tripinfos.sumo new file mode 100644 index 000000000000..d656ff872219 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/tripinfos.sumo @@ -0,0 +1,46 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/tripinfos.sumo.meso b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/tripinfos.sumo.meso new file mode 100644 index 000000000000..5270000edde0 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3/tripinfos.sumo.meso @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/deadlocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/deadlocks.sumo new file mode 100644 index 000000000000..4bdb06c48df9 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/deadlocks.sumo @@ -0,0 +1,50 @@ + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/errors.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/errors.sumo new file mode 100644 index 000000000000..5f5c41c53557 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/errors.sumo @@ -0,0 +1 @@ +Warning: Deactivating constraint to resolve deadlock between vehicles t1 t0 at time 231.00. diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/input_additional.add.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/input_additional.add.xml new file mode 100644 index 000000000000..6b5513f01e67 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/input_additional.add.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/input_routes.rou.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/input_routes.rou.xml new file mode 100644 index 000000000000..f87b358d8afd --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/input_routes.rou.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/options.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/options.sumo new file mode 100644 index 000000000000..ebc6c6223b00 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/options.sumo @@ -0,0 +1,2 @@ +--deadlock-output deadlocks.xml +--time-to-teleport.remove-constraint diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/output.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/railsignalblocks.sumo new file mode 100644 index 000000000000..a8f201424311 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/railsignalblocks.sumo @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/tripinfos.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/tripinfos.sumo new file mode 100644 index 000000000000..328950019611 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/tripinfos.sumo @@ -0,0 +1,47 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/tripinfos.sumo.meso b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/tripinfos.sumo.meso new file mode 100644 index 000000000000..5270000edde0 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_remove/tripinfos.sumo.meso @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/deadlocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/deadlocks.sumo new file mode 100644 index 000000000000..56c966d3c11e --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/deadlocks.sumo @@ -0,0 +1,45 @@ + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/errors.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/errors.sumo new file mode 100644 index 000000000000..e267bda417f0 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/errors.sumo @@ -0,0 +1,2 @@ +Warning: Teleporting vehicle 't0'; waited too long (yield, railSignal), lane='a_0', time=232.00. +Warning: Vehicle 't0' ends teleporting on edge 'b', time=232.00. diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/input_additional.add.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/input_additional.add.xml new file mode 100644 index 000000000000..cffba7fe84d3 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/input_additional.add.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/input_routes.rou.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/input_routes.rou.xml new file mode 100644 index 000000000000..e1a14cfdf002 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/input_routes.rou.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/options.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/options.sumo new file mode 100644 index 000000000000..d3973627d54d --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/options.sumo @@ -0,0 +1 @@ +--deadlock-output deadlocks.xml diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/output.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/railsignalblocks.sumo new file mode 100644 index 000000000000..e6ae88974465 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/railsignalblocks.sumo @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/tripinfos.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/tripinfos.sumo new file mode 100644 index 000000000000..83b6650e23ba --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/tripinfos.sumo @@ -0,0 +1,46 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/tripinfos.sumo.meso b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/tripinfos.sumo.meso new file mode 100644 index 000000000000..5270000edde0 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId/tripinfos.sumo.meso @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/deadlocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/deadlocks.sumo new file mode 100644 index 000000000000..c6782f35bc43 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/deadlocks.sumo @@ -0,0 +1,50 @@ + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/errors.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/errors.sumo new file mode 100644 index 000000000000..94b11bdaeb37 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/errors.sumo @@ -0,0 +1 @@ +Warning: Deactivating constraint to resolve deadlock between vehicles t1 t0 at time 232.00. diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/input_additional.add.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/input_additional.add.xml new file mode 100644 index 000000000000..cffba7fe84d3 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/input_additional.add.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/input_routes.rou.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/input_routes.rou.xml new file mode 100644 index 000000000000..e1a14cfdf002 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/input_routes.rou.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/options.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/options.sumo new file mode 100644 index 000000000000..ebc6c6223b00 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/options.sumo @@ -0,0 +1,2 @@ +--deadlock-output deadlocks.xml +--time-to-teleport.remove-constraint diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/output.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/railsignalblocks.sumo new file mode 100644 index 000000000000..a8f201424311 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/railsignalblocks.sumo @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/tripinfos.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/tripinfos.sumo new file mode 100644 index 000000000000..0205270fc571 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/tripinfos.sumo @@ -0,0 +1,47 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/tripinfos.sumo.meso b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/tripinfos.sumo.meso new file mode 100644 index 000000000000..5270000edde0 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion3_tripId_remove/tripinfos.sumo.meso @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/deadlocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/deadlocks.sumo new file mode 100644 index 000000000000..f490293c6632 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/deadlocks.sumo @@ -0,0 +1,50 @@ + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/errors.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/errors.sumo new file mode 100644 index 000000000000..5f5c41c53557 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/errors.sumo @@ -0,0 +1 @@ +Warning: Deactivating constraint to resolve deadlock between vehicles t1 t0 at time 231.00. diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/input_additional.add.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/input_additional.add.xml new file mode 100644 index 000000000000..da71e6733f50 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/input_additional.add.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/input_routes.rou.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/input_routes.rou.xml new file mode 100644 index 000000000000..f58cd2c4c2b8 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/input_routes.rou.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/options.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/options.sumo new file mode 100644 index 000000000000..ebc6c6223b00 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/options.sumo @@ -0,0 +1,2 @@ +--deadlock-output deadlocks.xml +--time-to-teleport.remove-constraint diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/output.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/railsignalblocks.sumo new file mode 100644 index 000000000000..36accdb87111 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/railsignalblocks.sumo @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/tripinfos.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/tripinfos.sumo new file mode 100644 index 000000000000..415974d9958a --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/tripinfos.sumo @@ -0,0 +1,47 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/tripinfos.sumo.meso b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/tripinfos.sumo.meso new file mode 100644 index 000000000000..5270000edde0 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_insertion_remove/tripinfos.sumo.meso @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_remove/deadlocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_remove/deadlocks.sumo new file mode 100644 index 000000000000..5b2a9c92c4f9 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_remove/deadlocks.sumo @@ -0,0 +1,50 @@ + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_remove/errors.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_remove/errors.sumo new file mode 100644 index 000000000000..5f5c41c53557 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_remove/errors.sumo @@ -0,0 +1 @@ +Warning: Deactivating constraint to resolve deadlock between vehicles t1 t0 at time 231.00. diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_remove/input_additional.add.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_remove/input_additional.add.xml new file mode 100644 index 000000000000..1eb3ea4da778 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_remove/input_additional.add.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_remove/input_routes.rou.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_remove/input_routes.rou.xml new file mode 100644 index 000000000000..f87b358d8afd --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_remove/input_routes.rou.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_remove/options.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_remove/options.sumo new file mode 100644 index 000000000000..ebc6c6223b00 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_remove/options.sumo @@ -0,0 +1,2 @@ +--deadlock-output deadlocks.xml +--time-to-teleport.remove-constraint diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_remove/output.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_remove/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_remove/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_remove/railsignalblocks.sumo new file mode 100644 index 000000000000..a8f201424311 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_remove/railsignalblocks.sumo @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_remove/tripinfos.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_remove/tripinfos.sumo new file mode 100644 index 000000000000..9c299a5b453b --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_remove/tripinfos.sumo @@ -0,0 +1,47 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_remove/tripinfos.sumo.meso b/tests/sumo/rail/rail_signal/constraints/deadlock_remove/tripinfos.sumo.meso new file mode 100644 index 000000000000..5270000edde0 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_remove/tripinfos.sumo.meso @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/deadlocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/deadlocks.sumo new file mode 100644 index 000000000000..5b2a9c92c4f9 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/deadlocks.sumo @@ -0,0 +1,50 @@ + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/errors.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/errors.sumo new file mode 100644 index 000000000000..5f5c41c53557 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/errors.sumo @@ -0,0 +1 @@ +Warning: Deactivating constraint to resolve deadlock between vehicles t1 t0 at time 231.00. diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/input_additional.add.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/input_additional.add.xml new file mode 100644 index 000000000000..1eb3ea4da778 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/input_additional.add.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/input_routes.rou.xml b/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/input_routes.rou.xml new file mode 100644 index 000000000000..6e46d677256a --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/input_routes.rou.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/options.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/options.sumo new file mode 100644 index 000000000000..ebc6c6223b00 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/options.sumo @@ -0,0 +1,2 @@ +--deadlock-output deadlocks.xml +--time-to-teleport.remove-constraint diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/output.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/railsignalblocks.sumo new file mode 100644 index 000000000000..a8f201424311 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/railsignalblocks.sumo @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/tripinfos.sumo b/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/tripinfos.sumo new file mode 100644 index 000000000000..2bf587f87002 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/tripinfos.sumo @@ -0,0 +1,47 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/tripinfos.sumo.meso b/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/tripinfos.sumo.meso new file mode 100644 index 000000000000..5270000edde0 --- /dev/null +++ b/tests/sumo/rail/rail_signal/constraints/deadlock_remove2/tripinfos.sumo.meso @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/constraints/foeInsertion/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/constraints/foeInsertion/railsignalblocks.sumo index 6f430f820eff..85d3184906c2 100644 --- a/tests/sumo/rail/rail_signal/constraints/foeInsertion/railsignalblocks.sumo +++ b/tests/sumo/rail/rail_signal/constraints/foeInsertion/railsignalblocks.sumo @@ -1,17 +1,22 @@ - - - + + diff --git a/tests/sumo/rail/rail_signal/driveWayShort_badMatch/errors.sumo b/tests/sumo/rail/rail_signal/driveWayShort_badMatch/errors.sumo new file mode 100644 index 000000000000..dd71a6128102 --- /dev/null +++ b/tests/sumo/rail/rail_signal/driveWayShort_badMatch/errors.sumo @@ -0,0 +1 @@ +Warning: Teleporting vehicle 't_1'; waited too long (yield), lane='E1_0', time=438.00. diff --git a/tests/sumo/rail/rail_signal/driveWayShort_badMatch/input_routes.rou.xml b/tests/sumo/rail/rail_signal/driveWayShort_badMatch/input_routes.rou.xml new file mode 100644 index 000000000000..144085278d37 --- /dev/null +++ b/tests/sumo/rail/rail_signal/driveWayShort_badMatch/input_routes.rou.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/driveWayShort_badMatch/net.net.xml b/tests/sumo/rail/rail_signal/driveWayShort_badMatch/net.net.xml new file mode 100644 index 000000000000..ad28908a6639 --- /dev/null +++ b/tests/sumo/rail/rail_signal/driveWayShort_badMatch/net.net.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/driveWayShort_badMatch/options.sumo b/tests/sumo/rail/rail_signal/driveWayShort_badMatch/options.sumo new file mode 100644 index 000000000000..483e6bc2534c --- /dev/null +++ b/tests/sumo/rail/rail_signal/driveWayShort_badMatch/options.sumo @@ -0,0 +1,3 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml +--time-to-teleport.remove diff --git a/tests/sumo/rail/rail_signal/driveWayShort_badMatch/output.sumo b/tests/sumo/rail/rail_signal/driveWayShort_badMatch/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/driveWayShort_badMatch/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/driveWayShort_badMatch/railsignalblocks.sumo new file mode 100644 index 000000000000..d4147cfcd0b6 --- /dev/null +++ b/tests/sumo/rail/rail_signal/driveWayShort_badMatch/railsignalblocks.sumo @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/driveWayShort_badMatch/tripinfos.sumo b/tests/sumo/rail/rail_signal/driveWayShort_badMatch/tripinfos.sumo new file mode 100644 index 000000000000..9fde9c748a94 --- /dev/null +++ b/tests/sumo/rail/rail_signal/driveWayShort_badMatch/tripinfos.sumo @@ -0,0 +1,46 @@ + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/driveway_variants/errors.sumo b/tests/sumo/rail/rail_signal/driveway_variants/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/driveway_variants/input_routes.rou.xml b/tests/sumo/rail/rail_signal/driveway_variants/input_routes.rou.xml new file mode 100644 index 000000000000..b6777b623f51 --- /dev/null +++ b/tests/sumo/rail/rail_signal/driveway_variants/input_routes.rou.xml @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/driveway_variants/net.net.xml b/tests/sumo/rail/rail_signal/driveway_variants/net.net.xml new file mode 100644 index 000000000000..18b67e2f72e6 --- /dev/null +++ b/tests/sumo/rail/rail_signal/driveway_variants/net.net.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/driveway_variants/options.sumo b/tests/sumo/rail/rail_signal/driveway_variants/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/rail_signal/driveway_variants/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/rail_signal/driveway_variants/output.sumo b/tests/sumo/rail/rail_signal/driveway_variants/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/driveway_variants/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/driveway_variants/railsignalblocks.sumo new file mode 100644 index 000000000000..65da0a4847b6 --- /dev/null +++ b/tests/sumo/rail/rail_signal/driveway_variants/railsignalblocks.sumo @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/driveway_variants/tripinfos.sumo b/tests/sumo/rail/rail_signal/driveway_variants/tripinfos.sumo new file mode 100644 index 000000000000..75fb84a913bf --- /dev/null +++ b/tests/sumo/rail/rail_signal/driveway_variants/tripinfos.sumo @@ -0,0 +1,44 @@ + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/end_block_mode/end_after_bidi/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/end_block_mode/end_after_bidi/railsignalblocks.sumo index 76825d239bec..509bc20f7414 100644 --- a/tests/sumo/rail/rail_signal/end_block_mode/end_after_bidi/railsignalblocks.sumo +++ b/tests/sumo/rail/rail_signal/end_block_mode/end_after_bidi/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + diff --git a/tests/sumo/rail/rail_signal/end_depart_within/net.net.xml b/tests/sumo/rail/rail_signal/end_depart_within/net.net.xml new file mode 100644 index 000000000000..9cd23a5fd4a2 --- /dev/null +++ b/tests/sumo/rail/rail_signal/end_depart_within/net.net.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/end_depart_within/options.sumo b/tests/sumo/rail/rail_signal/end_depart_within/options.sumo new file mode 100644 index 000000000000..b8e33d6d2664 --- /dev/null +++ b/tests/sumo/rail/rail_signal/end_depart_within/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml --tripinfo-output=tripinfos.xml +--use-stop-ended diff --git a/tests/sumo/rail/rail_signal/end_depart_within/output.sumo b/tests/sumo/rail/rail_signal/end_depart_within/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/end_depart_within/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/end_depart_within/railsignalblocks.sumo new file mode 100644 index 000000000000..0f00b044f897 --- /dev/null +++ b/tests/sumo/rail/rail_signal/end_depart_within/railsignalblocks.sumo @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/end_depart_within/tripinfos.sumo b/tests/sumo/rail/rail_signal/end_depart_within/tripinfos.sumo new file mode 100644 index 000000000000..c2fbb1cbb1be --- /dev/null +++ b/tests/sumo/rail/rail_signal/end_depart_within/tripinfos.sumo @@ -0,0 +1,44 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/end_depart_within/tripinfos.sumo.meso b/tests/sumo/rail/rail_signal/end_depart_within/tripinfos.sumo.meso new file mode 100644 index 000000000000..e872986da5b1 --- /dev/null +++ b/tests/sumo/rail/rail_signal/end_depart_within/tripinfos.sumo.meso @@ -0,0 +1,49 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/end_within/errors.sumo b/tests/sumo/rail/rail_signal/end_within/errors.sumo new file mode 100644 index 000000000000..7c5032aa693c --- /dev/null +++ b/tests/sumo/rail/rail_signal/end_within/errors.sumo @@ -0,0 +1 @@ +Warning: Network contains internal links which are ignored. Vehicles will 'jump' across junctions and thus underestimate route lengths and travel times. diff --git a/tests/sumo/rail/rail_signal/end_within/input_routes.rou.xml b/tests/sumo/rail/rail_signal/end_within/input_routes.rou.xml new file mode 100644 index 000000000000..61a7287d6cab --- /dev/null +++ b/tests/sumo/rail/rail_signal/end_within/input_routes.rou.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/end_within/net.net.xml b/tests/sumo/rail/rail_signal/end_within/net.net.xml new file mode 100644 index 000000000000..56d96abff9c6 --- /dev/null +++ b/tests/sumo/rail/rail_signal/end_within/net.net.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/end_within/options.sumo b/tests/sumo/rail/rail_signal/end_within/options.sumo new file mode 100644 index 000000000000..aa17b0c2faa0 --- /dev/null +++ b/tests/sumo/rail/rail_signal/end_within/options.sumo @@ -0,0 +1,3 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml +--no-internal-links diff --git a/tests/sumo/rail/rail_signal/end_within/output.sumo b/tests/sumo/rail/rail_signal/end_within/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/end_within/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/end_within/railsignalblocks.sumo new file mode 100644 index 000000000000..e279a9125994 --- /dev/null +++ b/tests/sumo/rail/rail_signal/end_within/railsignalblocks.sumo @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/end_within/tripinfos.sumo b/tests/sumo/rail/rail_signal/end_within/tripinfos.sumo new file mode 100644 index 000000000000..7219bba3dbb0 --- /dev/null +++ b/tests/sumo/rail/rail_signal/end_within/tripinfos.sumo @@ -0,0 +1,44 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/fork_without_signal/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/fork_without_signal/railsignalblocks.sumo index 680125dd0714..32e83c86c30f 100644 --- a/tests/sumo/rail/rail_signal/fork_without_signal/railsignalblocks.sumo +++ b/tests/sumo/rail/rail_signal/fork_without_signal/railsignalblocks.sumo @@ -1,6 +1,6 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/indirect_guard_route_conflict2/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/indirect_guard_route_conflict2/railsignalblocks.sumo index aabd6a2f7a08..0f1321e0bd83 100644 --- a/tests/sumo/rail/rail_signal/indirect_guard_route_conflict2/railsignalblocks.sumo +++ b/tests/sumo/rail/rail_signal/indirect_guard_route_conflict2/railsignalblocks.sumo @@ -1,6 +1,6 @@ - - - + + diff --git a/tests/sumo/rail/rail_signal/indirect_guard_route_conflict_reroute/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/indirect_guard_route_conflict_reroute/railsignalblocks.sumo index dc0831efbd85..2df76a795a33 100644 --- a/tests/sumo/rail/rail_signal/indirect_guard_route_conflict_reroute/railsignalblocks.sumo +++ b/tests/sumo/rail/rail_signal/indirect_guard_route_conflict_reroute/railsignalblocks.sumo @@ -1,6 +1,6 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/large_step_size/tls_state.sumo b/tests/sumo/rail/rail_signal/large_step_size/tls_state.sumo index 078d7aa63609..0d08e46ed9d4 100644 --- a/tests/sumo/rail/rail_signal/large_step_size/tls_state.sumo +++ b/tests/sumo/rail/rail_signal/large_step_size/tls_state.sumo @@ -1,6 +1,6 @@ - - + diff --git a/tests/sumo/rail/rail_signal/moving_block/protect_bidi/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/moving_block/protect_bidi/railsignalblocks.sumo index 8a3ba82d5f06..b5cc29cc94ee 100644 --- a/tests/sumo/rail/rail_signal/moving_block/protect_bidi/railsignalblocks.sumo +++ b/tests/sumo/rail/rail_signal/moving_block/protect_bidi/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/parking_insertion/errors.sumo b/tests/sumo/rail/rail_signal/parking_insertion/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/parking_insertion/errors.sumo.meso b/tests/sumo/rail/rail_signal/parking_insertion/errors.sumo.meso new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/parking_insertion/input_routes.rou.xml b/tests/sumo/rail/rail_signal/parking_insertion/input_routes.rou.xml new file mode 100644 index 000000000000..aa3ad68e4703 --- /dev/null +++ b/tests/sumo/rail/rail_signal/parking_insertion/input_routes.rou.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/parking_insertion/net.net.xml b/tests/sumo/rail/rail_signal/parking_insertion/net.net.xml new file mode 100644 index 000000000000..05ba747495e3 --- /dev/null +++ b/tests/sumo/rail/rail_signal/parking_insertion/net.net.xml @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/parking_insertion/options.sumo b/tests/sumo/rail/rail_signal/parking_insertion/options.sumo new file mode 100644 index 000000000000..ac90e948d74d --- /dev/null +++ b/tests/sumo/rail/rail_signal/parking_insertion/options.sumo @@ -0,0 +1,3 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml --tripinfo-output=tripinfos.xml +--use-stop-ended +--railsignal-vehicle-output railsignal_vehicles.xml diff --git a/tests/sumo/rail/rail_signal/parking_insertion/output.sumo b/tests/sumo/rail/rail_signal/parking_insertion/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/parking_insertion/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/parking_insertion/railsignalblocks.sumo new file mode 100644 index 000000000000..ff49041ce18f --- /dev/null +++ b/tests/sumo/rail/rail_signal/parking_insertion/railsignalblocks.sumo @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/parking_insertion/railsignalvehs.sumo b/tests/sumo/rail/rail_signal/parking_insertion/railsignalvehs.sumo new file mode 100644 index 000000000000..f551f4c23a8e --- /dev/null +++ b/tests/sumo/rail/rail_signal/parking_insertion/railsignalvehs.sumo @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/parking_insertion/tripinfos.sumo b/tests/sumo/rail/rail_signal/parking_insertion/tripinfos.sumo new file mode 100644 index 000000000000..86479a5dac4f --- /dev/null +++ b/tests/sumo/rail/rail_signal/parking_insertion/tripinfos.sumo @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/parking_insertion/tripinfos.sumo.meso b/tests/sumo/rail/rail_signal/parking_insertion/tripinfos.sumo.meso new file mode 100644 index 000000000000..e872986da5b1 --- /dev/null +++ b/tests/sumo/rail/rail_signal/parking_insertion/tripinfos.sumo.meso @@ -0,0 +1,49 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/errors.sumo b/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/input_routes.rou.xml b/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/input_routes.rou.xml new file mode 100644 index 000000000000..5bce253a1f4a --- /dev/null +++ b/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/input_routes.rou.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/options.sumo b/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/options.sumo new file mode 100644 index 000000000000..33fe0509751a --- /dev/null +++ b/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/options.sumo @@ -0,0 +1,3 @@ +--no-step-log --no-duration-log --net-file=net.net.xml +-a input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/output.sumo b/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/railsignalblocks.sumo new file mode 100644 index 000000000000..6c3f3735a2f8 --- /dev/null +++ b/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/railsignalblocks.sumo @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/tripinfos.sumo b/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/tripinfos.sumo new file mode 100644 index 000000000000..ff8a66a41a14 --- /dev/null +++ b/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/tripinfos.sumo @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/tripinfos.sumo.meso b/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/tripinfos.sumo.meso new file mode 100644 index 000000000000..d74aa49fd7e9 --- /dev/null +++ b/tests/sumo/rail/rail_signal/priority/insertion_vs_fastApproach/tripinfos.sumo.meso @@ -0,0 +1,45 @@ + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/priority/stop_before_signal/errors.sumo b/tests/sumo/rail/rail_signal/priority/stop_before_signal/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/priority/stop_before_signal/input_additional.add.xml b/tests/sumo/rail/rail_signal/priority/stop_before_signal/input_additional.add.xml new file mode 100644 index 000000000000..16817f0b566d --- /dev/null +++ b/tests/sumo/rail/rail_signal/priority/stop_before_signal/input_additional.add.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/tests/sumo/rail/rail_signal/priority/stop_before_signal/input_routes.rou.xml b/tests/sumo/rail/rail_signal/priority/stop_before_signal/input_routes.rou.xml new file mode 100644 index 000000000000..7ea8c3486f96 --- /dev/null +++ b/tests/sumo/rail/rail_signal/priority/stop_before_signal/input_routes.rou.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/priority/stop_before_signal/net.net.xml b/tests/sumo/rail/rail_signal/priority/stop_before_signal/net.net.xml new file mode 100644 index 000000000000..2d82f4a40393 --- /dev/null +++ b/tests/sumo/rail/rail_signal/priority/stop_before_signal/net.net.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/priority/stop_before_signal/options.sumo b/tests/sumo/rail/rail_signal/priority/stop_before_signal/options.sumo new file mode 100644 index 000000000000..17dad2aecbd4 --- /dev/null +++ b/tests/sumo/rail/rail_signal/priority/stop_before_signal/options.sumo @@ -0,0 +1,4 @@ +--no-step-log --no-duration-log --net-file=net.net.xml +-r input_routes.rou.xml +--tripinfo-output tripinfos.xml +--additional-files input_additional.add.xml diff --git a/tests/sumo/rail/rail_signal/priority/stop_before_signal/output.sumo b/tests/sumo/rail/rail_signal/priority/stop_before_signal/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/priority/stop_before_signal/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/priority/stop_before_signal/railsignalblocks.sumo new file mode 100644 index 000000000000..a65c70c5519b --- /dev/null +++ b/tests/sumo/rail/rail_signal/priority/stop_before_signal/railsignalblocks.sumo @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/priority/stop_before_signal/tls_state_switch.sumo b/tests/sumo/rail/rail_signal/priority/stop_before_signal/tls_state_switch.sumo new file mode 100644 index 000000000000..a85817ce7aa4 --- /dev/null +++ b/tests/sumo/rail/rail_signal/priority/stop_before_signal/tls_state_switch.sumo @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/priority/stop_before_signal/tripinfos.sumo b/tests/sumo/rail/rail_signal/priority/stop_before_signal/tripinfos.sumo new file mode 100644 index 000000000000..ba0b2c3f2df0 --- /dev/null +++ b/tests/sumo/rail/rail_signal/priority/stop_before_signal/tripinfos.sumo @@ -0,0 +1,44 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/priority/stop_before_signal/tripinfos.sumo.meso b/tests/sumo/rail/rail_signal/priority/stop_before_signal/tripinfos.sumo.meso new file mode 100644 index 000000000000..d74aa49fd7e9 --- /dev/null +++ b/tests/sumo/rail/rail_signal/priority/stop_before_signal/tripinfos.sumo.meso @@ -0,0 +1,45 @@ + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/priority/testsuite.sumo b/tests/sumo/rail/rail_signal/priority/testsuite.sumo index 194a7f6885ea..53e10555c1a3 100644 --- a/tests/sumo/rail/rail_signal/priority/testsuite.sumo +++ b/tests/sumo/rail/rail_signal/priority/testsuite.sumo @@ -6,3 +6,9 @@ waiting_time_top # route files is loaded with option -a so that the vehicle with the later depart (lower waitingTime) can be defined first. # This way the later vehicle would be allowed to to first if the numerical-id tiebraker were used. waiting_time_bottom + +# insertion cannot happen if the driveway is approache by a fast train that cannot stop safely. +insertion_vs_fastApproach + +# ensure stable priority decision if one train wants to stop before a signal +stop_before_signal diff --git a/tests/sumo/rail/rail_signal/priority/waiting_time_bottom/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/priority/waiting_time_bottom/railsignalblocks.sumo index 6f430f820eff..54becd688cb7 100644 --- a/tests/sumo/rail/rail_signal/priority/waiting_time_bottom/railsignalblocks.sumo +++ b/tests/sumo/rail/rail_signal/priority/waiting_time_bottom/railsignalblocks.sumo @@ -1,17 +1,21 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/route_as_additional/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/route_as_additional/railsignalblocks.sumo index e1921f65b0b5..9ac4700e79c9 100644 --- a/tests/sumo/rail/rail_signal/route_as_additional/railsignalblocks.sumo +++ b/tests/sumo/rail/rail_signal/route_as_additional/railsignalblocks.sumo @@ -1,6 +1,6 @@ - + + + + + + diff --git a/tests/sumo/rail/rail_signal/siding_oneSide/net.net.xml b/tests/sumo/rail/rail_signal/siding_oneSide/net.net.xml new file mode 100644 index 000000000000..fc75ce39eddb --- /dev/null +++ b/tests/sumo/rail/rail_signal/siding_oneSide/net.net.xml @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/siding_oneSide/options.sumo b/tests/sumo/rail/rail_signal/siding_oneSide/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/rail_signal/siding_oneSide/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/rail_signal/siding_oneSide/output.sumo b/tests/sumo/rail/rail_signal/siding_oneSide/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/siding_oneSide/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/siding_oneSide/railsignalblocks.sumo new file mode 100644 index 000000000000..f09fcb9e77ed --- /dev/null +++ b/tests/sumo/rail/rail_signal/siding_oneSide/railsignalblocks.sumo @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/siding_oneSide/tripinfos.sumo b/tests/sumo/rail/rail_signal/siding_oneSide/tripinfos.sumo new file mode 100644 index 000000000000..7e5662828994 --- /dev/null +++ b/tests/sumo/rail/rail_signal/siding_oneSide/tripinfos.sumo @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/siding_oneSide_slow/errors.sumo b/tests/sumo/rail/rail_signal/siding_oneSide_slow/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/siding_oneSide_slow/input_routes.rou.xml b/tests/sumo/rail/rail_signal/siding_oneSide_slow/input_routes.rou.xml new file mode 100644 index 000000000000..7ae1e6c1b9ef --- /dev/null +++ b/tests/sumo/rail/rail_signal/siding_oneSide_slow/input_routes.rou.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/siding_oneSide_slow/net.net.xml b/tests/sumo/rail/rail_signal/siding_oneSide_slow/net.net.xml new file mode 100644 index 000000000000..fc75ce39eddb --- /dev/null +++ b/tests/sumo/rail/rail_signal/siding_oneSide_slow/net.net.xml @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/siding_oneSide_slow/options.sumo b/tests/sumo/rail/rail_signal/siding_oneSide_slow/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/rail_signal/siding_oneSide_slow/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/rail_signal/siding_oneSide_slow/output.sumo b/tests/sumo/rail/rail_signal/siding_oneSide_slow/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/siding_oneSide_slow/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/siding_oneSide_slow/railsignalblocks.sumo new file mode 100644 index 000000000000..f09fcb9e77ed --- /dev/null +++ b/tests/sumo/rail/rail_signal/siding_oneSide_slow/railsignalblocks.sumo @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/siding_oneSide_slow/tripinfos.sumo b/tests/sumo/rail/rail_signal/siding_oneSide_slow/tripinfos.sumo new file mode 100644 index 000000000000..3ed41a8ed71c --- /dev/null +++ b/tests/sumo/rail/rail_signal/siding_oneSide_slow/tripinfos.sumo @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/single_incoming_lane/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/single_incoming_lane/railsignalblocks.sumo index 2b99cc68355b..c2fa2a9be4cc 100644 --- a/tests/sumo/rail/rail_signal/single_incoming_lane/railsignalblocks.sumo +++ b/tests/sumo/rail/rail_signal/single_incoming_lane/railsignalblocks.sumo @@ -1,11 +1,16 @@ - - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/small_step_size/tls_state.sumo b/tests/sumo/rail/rail_signal/small_step_size/tls_state.sumo index e829d252955c..005b45246628 100644 --- a/tests/sumo/rail/rail_signal/small_step_size/tls_state.sumo +++ b/tests/sumo/rail/rail_signal/small_step_size/tls_state.sumo @@ -1,6 +1,6 @@ - + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/subDriveWay_short/net.net.xml b/tests/sumo/rail/rail_signal/subDriveWay_short/net.net.xml new file mode 100644 index 000000000000..ad28908a6639 --- /dev/null +++ b/tests/sumo/rail/rail_signal/subDriveWay_short/net.net.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/subDriveWay_short/options.sumo b/tests/sumo/rail/rail_signal/subDriveWay_short/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/rail_signal/subDriveWay_short/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/rail_signal/subDriveWay_short/output.sumo b/tests/sumo/rail/rail_signal/subDriveWay_short/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/subDriveWay_short/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/subDriveWay_short/railsignalblocks.sumo new file mode 100644 index 000000000000..a632b48d9300 --- /dev/null +++ b/tests/sumo/rail/rail_signal/subDriveWay_short/railsignalblocks.sumo @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/subDriveWay_short/tripinfos.sumo b/tests/sumo/rail/rail_signal/subDriveWay_short/tripinfos.sumo new file mode 100644 index 000000000000..5301ce5b2e84 --- /dev/null +++ b/tests/sumo/rail/rail_signal/subDriveWay_short/tripinfos.sumo @@ -0,0 +1,44 @@ + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/testsuite.sumo b/tests/sumo/rail/rail_signal/testsuite.sumo index 9542040050d6..9c9011eb2ef7 100644 --- a/tests/sumo/rail/rail_signal/testsuite.sumo +++ b/tests/sumo/rail/rail_signal/testsuite.sumo @@ -113,3 +113,26 @@ deadlock_insertion # see #14554 reversal_before_signal + +# driveways must register vehicle after it finishes parking +parking_insertion + +# one route ends within the block and another train starts within the block +end_depart_within + +# test flank search beyond route end +end_within + +# a driveway is updated after being used +update_driveways + +# reduce number of "parallel" driveways +driveway_variants + +# corner case that caused a crash +subDriveWay_short + +# corner case that causes a deadlock between 2 vehicles due to invalid driveway matching. +# +# Even after corrected matching, there is still a deadlock because train t4 which enters last never passes a switch or signal and therefore doesnt "see" any conflicts. +driveWayShort_badMatch diff --git a/tests/sumo/rail/rail_signal/two_following_trains/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/two_following_trains/railsignalblocks.sumo index e744801fa1ae..4349e5330805 100644 --- a/tests/sumo/rail/rail_signal/two_following_trains/railsignalblocks.sumo +++ b/tests/sumo/rail/rail_signal/two_following_trains/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + diff --git a/tests/sumo/rail/rail_signal/update_driveways/net.net.xml b/tests/sumo/rail/rail_signal/update_driveways/net.net.xml new file mode 100644 index 000000000000..e981136c4b56 --- /dev/null +++ b/tests/sumo/rail/rail_signal/update_driveways/net.net.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/update_driveways/options.sumo b/tests/sumo/rail/rail_signal/update_driveways/options.sumo new file mode 100644 index 000000000000..8e4a58f914af --- /dev/null +++ b/tests/sumo/rail/rail_signal/update_driveways/options.sumo @@ -0,0 +1,3 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--railsignal-vehicle-output railsignal_vehicles.xml +--use-stop-ended diff --git a/tests/sumo/rail/rail_signal/update_driveways/output.sumo b/tests/sumo/rail/rail_signal/update_driveways/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/rail_signal/update_driveways/railsignalblocks.sumo b/tests/sumo/rail/rail_signal/update_driveways/railsignalblocks.sumo new file mode 100644 index 000000000000..20d9863448c1 --- /dev/null +++ b/tests/sumo/rail/rail_signal/update_driveways/railsignalblocks.sumo @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/rail_signal/update_driveways/railsignalvehs.sumo b/tests/sumo/rail/rail_signal/update_driveways/railsignalvehs.sumo new file mode 100644 index 000000000000..a672faeeb3e9 --- /dev/null +++ b/tests/sumo/rail/rail_signal/update_driveways/railsignalvehs.sumo @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/anticipate_reversal/railsignalblocks.sumo b/tests/sumo/rail/reversal/anticipate_reversal/railsignalblocks.sumo index 601778f00b86..2989e3ca1479 100644 --- a/tests/sumo/rail/reversal/anticipate_reversal/railsignalblocks.sumo +++ b/tests/sumo/rail/reversal/anticipate_reversal/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/reversal/anticipate_reversal_unafe_insertion/railsignalblocks.sumo b/tests/sumo/rail/reversal/anticipate_reversal_unafe_insertion/railsignalblocks.sumo index 601778f00b86..2989e3ca1479 100644 --- a/tests/sumo/rail/reversal/anticipate_reversal_unafe_insertion/railsignalblocks.sumo +++ b/tests/sumo/rail/reversal/anticipate_reversal_unafe_insertion/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/reversal/bidiDepart_reversal/errors.sumo b/tests/sumo/rail/reversal/bidiDepart_reversal/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/bidiDepart_reversal/errors.sumo.meso b/tests/sumo/rail/reversal/bidiDepart_reversal/errors.sumo.meso new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/bidiDepart_reversal/input_routes.rou.xml b/tests/sumo/rail/reversal/bidiDepart_reversal/input_routes.rou.xml new file mode 100644 index 000000000000..9eafebd423eb --- /dev/null +++ b/tests/sumo/rail/reversal/bidiDepart_reversal/input_routes.rou.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/bidiDepart_reversal/net.net.xml b/tests/sumo/rail/reversal/bidiDepart_reversal/net.net.xml new file mode 100644 index 000000000000..3acbc5f9b7cd --- /dev/null +++ b/tests/sumo/rail/reversal/bidiDepart_reversal/net.net.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/bidiDepart_reversal/options.sumo b/tests/sumo/rail/reversal/bidiDepart_reversal/options.sumo new file mode 100644 index 000000000000..97ca7def9193 --- /dev/null +++ b/tests/sumo/rail/reversal/bidiDepart_reversal/options.sumo @@ -0,0 +1,4 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml --tripinfo-output=tripinfos.xml +--use-stop-ended +--railsignal-vehicle-output railsignal_vehicles.xml +--collision.action warn diff --git a/tests/sumo/rail/reversal/bidiDepart_reversal/output.sumo b/tests/sumo/rail/reversal/bidiDepart_reversal/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/bidiDepart_reversal/railsignalblocks.sumo b/tests/sumo/rail/reversal/bidiDepart_reversal/railsignalblocks.sumo new file mode 100644 index 000000000000..f45de68055a8 --- /dev/null +++ b/tests/sumo/rail/reversal/bidiDepart_reversal/railsignalblocks.sumo @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/bidiDepart_reversal/railsignalvehs.sumo b/tests/sumo/rail/reversal/bidiDepart_reversal/railsignalvehs.sumo new file mode 100644 index 000000000000..7329722a547c --- /dev/null +++ b/tests/sumo/rail/reversal/bidiDepart_reversal/railsignalvehs.sumo @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/bidiDepart_reversal/tripinfos.sumo b/tests/sumo/rail/reversal/bidiDepart_reversal/tripinfos.sumo new file mode 100644 index 000000000000..0ed030d0b752 --- /dev/null +++ b/tests/sumo/rail/reversal/bidiDepart_reversal/tripinfos.sumo @@ -0,0 +1,47 @@ + + + + + + + + + diff --git a/tests/sumo/rail/reversal/bidiDepart_reversal/tripinfos.sumo.meso b/tests/sumo/rail/reversal/bidiDepart_reversal/tripinfos.sumo.meso new file mode 100644 index 000000000000..e872986da5b1 --- /dev/null +++ b/tests/sumo/rail/reversal/bidiDepart_reversal/tripinfos.sumo.meso @@ -0,0 +1,49 @@ + + + + + + + + diff --git a/tests/sumo/rail/reversal/both_reverse/errors.sumo b/tests/sumo/rail/reversal/both_reverse/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/both_reverse/errors.sumo.meso b/tests/sumo/rail/reversal/both_reverse/errors.sumo.meso new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/both_reverse/input_routes.rou.xml b/tests/sumo/rail/reversal/both_reverse/input_routes.rou.xml new file mode 100644 index 000000000000..cc0b6e7f388b --- /dev/null +++ b/tests/sumo/rail/reversal/both_reverse/input_routes.rou.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/both_reverse/net.net.xml b/tests/sumo/rail/reversal/both_reverse/net.net.xml new file mode 100644 index 000000000000..7eb115e2df23 --- /dev/null +++ b/tests/sumo/rail/reversal/both_reverse/net.net.xml @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/both_reverse/options.sumo b/tests/sumo/rail/reversal/both_reverse/options.sumo new file mode 100644 index 000000000000..e4f87d6703ff --- /dev/null +++ b/tests/sumo/rail/reversal/both_reverse/options.sumo @@ -0,0 +1 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml --tripinfo-output=tripinfos.xml diff --git a/tests/sumo/rail/reversal/both_reverse/output.sumo b/tests/sumo/rail/reversal/both_reverse/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/both_reverse/railsignalblocks.sumo b/tests/sumo/rail/reversal/both_reverse/railsignalblocks.sumo new file mode 100644 index 000000000000..7beb53fad58b --- /dev/null +++ b/tests/sumo/rail/reversal/both_reverse/railsignalblocks.sumo @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/both_reverse/tripinfos.sumo b/tests/sumo/rail/reversal/both_reverse/tripinfos.sumo new file mode 100644 index 000000000000..65b566c162cb --- /dev/null +++ b/tests/sumo/rail/reversal/both_reverse/tripinfos.sumo @@ -0,0 +1,44 @@ + + + + + + + + diff --git a/tests/sumo/rail/reversal/both_reverse/tripinfos.sumo.meso b/tests/sumo/rail/reversal/both_reverse/tripinfos.sumo.meso new file mode 100644 index 000000000000..e872986da5b1 --- /dev/null +++ b/tests/sumo/rail/reversal/both_reverse/tripinfos.sumo.meso @@ -0,0 +1,49 @@ + + + + + + + + diff --git a/tests/sumo/rail/reversal/consecutive_before_reversal/errors.sumo b/tests/sumo/rail/reversal/consecutive_before_reversal/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/consecutive_before_reversal/errors.sumo.meso b/tests/sumo/rail/reversal/consecutive_before_reversal/errors.sumo.meso new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/consecutive_before_reversal/input_routes.rou.xml b/tests/sumo/rail/reversal/consecutive_before_reversal/input_routes.rou.xml new file mode 100644 index 000000000000..79164d17fe22 --- /dev/null +++ b/tests/sumo/rail/reversal/consecutive_before_reversal/input_routes.rou.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/tests/sumo/rail/reversal/consecutive_before_reversal/net.net.xml b/tests/sumo/rail/reversal/consecutive_before_reversal/net.net.xml new file mode 100644 index 000000000000..1abadedd432e --- /dev/null +++ b/tests/sumo/rail/reversal/consecutive_before_reversal/net.net.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/consecutive_before_reversal/options.sumo b/tests/sumo/rail/reversal/consecutive_before_reversal/options.sumo new file mode 100644 index 000000000000..a05c625502e9 --- /dev/null +++ b/tests/sumo/rail/reversal/consecutive_before_reversal/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml --tripinfo-output=tripinfos.xml +--railsignal-vehicle-output railsignal_vehicles.xml diff --git a/tests/sumo/rail/reversal/consecutive_before_reversal/output.sumo b/tests/sumo/rail/reversal/consecutive_before_reversal/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/consecutive_before_reversal/railsignalblocks.sumo b/tests/sumo/rail/reversal/consecutive_before_reversal/railsignalblocks.sumo new file mode 100644 index 000000000000..5953ca3e814b --- /dev/null +++ b/tests/sumo/rail/reversal/consecutive_before_reversal/railsignalblocks.sumo @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/consecutive_before_reversal/railsignalvehs.sumo b/tests/sumo/rail/reversal/consecutive_before_reversal/railsignalvehs.sumo new file mode 100644 index 000000000000..6db333a7c49c --- /dev/null +++ b/tests/sumo/rail/reversal/consecutive_before_reversal/railsignalvehs.sumo @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/consecutive_before_reversal/tripinfos.sumo b/tests/sumo/rail/reversal/consecutive_before_reversal/tripinfos.sumo new file mode 100644 index 000000000000..937c3dadb4a7 --- /dev/null +++ b/tests/sumo/rail/reversal/consecutive_before_reversal/tripinfos.sumo @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/tests/sumo/rail/reversal/consecutive_before_reversal/tripinfos.sumo.meso b/tests/sumo/rail/reversal/consecutive_before_reversal/tripinfos.sumo.meso new file mode 100644 index 000000000000..e872986da5b1 --- /dev/null +++ b/tests/sumo/rail/reversal/consecutive_before_reversal/tripinfos.sumo.meso @@ -0,0 +1,49 @@ + + + + + + + + diff --git a/tests/sumo/rail/reversal/double_reversal_dwEnd/errors.sumo b/tests/sumo/rail/reversal/double_reversal_dwEnd/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/double_reversal_dwEnd/errors.sumo.meso b/tests/sumo/rail/reversal/double_reversal_dwEnd/errors.sumo.meso new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/double_reversal_dwEnd/input_routes.rou.xml b/tests/sumo/rail/reversal/double_reversal_dwEnd/input_routes.rou.xml new file mode 100644 index 000000000000..2816b6cdb9ac --- /dev/null +++ b/tests/sumo/rail/reversal/double_reversal_dwEnd/input_routes.rou.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/double_reversal_dwEnd/net.net.xml b/tests/sumo/rail/reversal/double_reversal_dwEnd/net.net.xml new file mode 100644 index 000000000000..a50c6c53f2a1 --- /dev/null +++ b/tests/sumo/rail/reversal/double_reversal_dwEnd/net.net.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/double_reversal_dwEnd/options.sumo b/tests/sumo/rail/reversal/double_reversal_dwEnd/options.sumo new file mode 100644 index 000000000000..97ca7def9193 --- /dev/null +++ b/tests/sumo/rail/reversal/double_reversal_dwEnd/options.sumo @@ -0,0 +1,4 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml --tripinfo-output=tripinfos.xml +--use-stop-ended +--railsignal-vehicle-output railsignal_vehicles.xml +--collision.action warn diff --git a/tests/sumo/rail/reversal/double_reversal_dwEnd/output.sumo b/tests/sumo/rail/reversal/double_reversal_dwEnd/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/double_reversal_dwEnd/railsignalblocks.sumo b/tests/sumo/rail/reversal/double_reversal_dwEnd/railsignalblocks.sumo new file mode 100644 index 000000000000..c22ffa08c09b --- /dev/null +++ b/tests/sumo/rail/reversal/double_reversal_dwEnd/railsignalblocks.sumo @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/double_reversal_dwEnd/railsignalvehs.sumo b/tests/sumo/rail/reversal/double_reversal_dwEnd/railsignalvehs.sumo new file mode 100644 index 000000000000..5c223bc6557b --- /dev/null +++ b/tests/sumo/rail/reversal/double_reversal_dwEnd/railsignalvehs.sumo @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/double_reversal_dwEnd/tripinfos.sumo b/tests/sumo/rail/reversal/double_reversal_dwEnd/tripinfos.sumo new file mode 100644 index 000000000000..39cfeae0ac01 --- /dev/null +++ b/tests/sumo/rail/reversal/double_reversal_dwEnd/tripinfos.sumo @@ -0,0 +1,46 @@ + + + + + + + + diff --git a/tests/sumo/rail/reversal/double_reversal_dwEnd/tripinfos.sumo.meso b/tests/sumo/rail/reversal/double_reversal_dwEnd/tripinfos.sumo.meso new file mode 100644 index 000000000000..e872986da5b1 --- /dev/null +++ b/tests/sumo/rail/reversal/double_reversal_dwEnd/tripinfos.sumo.meso @@ -0,0 +1,49 @@ + + + + + + + + diff --git a/tests/sumo/rail/reversal/double_reversal_same_dir/errors.sumo b/tests/sumo/rail/reversal/double_reversal_same_dir/errors.sumo index 5ef542dbb4bb..e69de29bb2d1 100644 --- a/tests/sumo/rail/reversal/double_reversal_same_dir/errors.sumo +++ b/tests/sumo/rail/reversal/double_reversal_same_dir/errors.sumo @@ -1,2 +0,0 @@ -Warning: Vehicle 'v_1' performs emergency braking on lane 'E1_0' with decel=5.00, wished=1.30, severity=1.00, time=41.00. -Warning: Vehicle 'v_1' performs emergency stop at the end of lane 'E1_0' because of a red traffic light (decel=-15.86, offset=2.29), time=43.00. diff --git a/tests/sumo/rail/reversal/double_reversal_same_dir/railsignalblocks.sumo b/tests/sumo/rail/reversal/double_reversal_same_dir/railsignalblocks.sumo index 908447974b38..11e081249d2a 100644 --- a/tests/sumo/rail/reversal/double_reversal_same_dir/railsignalblocks.sumo +++ b/tests/sumo/rail/reversal/double_reversal_same_dir/railsignalblocks.sumo @@ -1,6 +1,6 @@ - + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/follower_ends_before_reversal/net.net.xml b/tests/sumo/rail/reversal/follower_ends_before_reversal/net.net.xml new file mode 100644 index 000000000000..89e723d469a7 --- /dev/null +++ b/tests/sumo/rail/reversal/follower_ends_before_reversal/net.net.xml @@ -0,0 +1,1295 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/follower_ends_before_reversal/options.sumo b/tests/sumo/rail/reversal/follower_ends_before_reversal/options.sumo new file mode 100644 index 000000000000..3909a2b2b852 --- /dev/null +++ b/tests/sumo/rail/reversal/follower_ends_before_reversal/options.sumo @@ -0,0 +1,4 @@ +--no-step-log --no-duration-log +--net-file=net.net.xml +--routes=input_routes.rou.xml +--time-to-teleport 1000 diff --git a/tests/sumo/rail/reversal/follower_ends_before_reversal/output.sumo b/tests/sumo/rail/reversal/follower_ends_before_reversal/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/follower_ends_before_reversal/railsignalblocks.sumo b/tests/sumo/rail/reversal/follower_ends_before_reversal/railsignalblocks.sumo new file mode 100644 index 000000000000..c7d2966675e9 --- /dev/null +++ b/tests/sumo/rail/reversal/follower_ends_before_reversal/railsignalblocks.sumo @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/follower_ends_before_reversal/railsignalblocks.sumo.meso b/tests/sumo/rail/reversal/follower_ends_before_reversal/railsignalblocks.sumo.meso new file mode 100644 index 000000000000..ef865be25246 --- /dev/null +++ b/tests/sumo/rail/reversal/follower_ends_before_reversal/railsignalblocks.sumo.meso @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/follower_ends_before_reversal/stopinfos.sumo b/tests/sumo/rail/reversal/follower_ends_before_reversal/stopinfos.sumo new file mode 100644 index 000000000000..c9c406034fdb --- /dev/null +++ b/tests/sumo/rail/reversal/follower_ends_before_reversal/stopinfos.sumo @@ -0,0 +1 @@ +Auto-generated by TextTest to simulate missing file for this version... diff --git a/tests/sumo/rail/reversal/follower_ends_before_reversal2/errors.sumo b/tests/sumo/rail/reversal/follower_ends_before_reversal2/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/follower_ends_before_reversal2/errors.sumo.meso b/tests/sumo/rail/reversal/follower_ends_before_reversal2/errors.sumo.meso new file mode 100644 index 000000000000..7c5032aa693c --- /dev/null +++ b/tests/sumo/rail/reversal/follower_ends_before_reversal2/errors.sumo.meso @@ -0,0 +1 @@ +Warning: Network contains internal links which are ignored. Vehicles will 'jump' across junctions and thus underestimate route lengths and travel times. diff --git a/tests/sumo/rail/reversal/follower_ends_before_reversal2/input_routes.rou.xml b/tests/sumo/rail/reversal/follower_ends_before_reversal2/input_routes.rou.xml new file mode 100644 index 000000000000..d5559d04c1a2 --- /dev/null +++ b/tests/sumo/rail/reversal/follower_ends_before_reversal2/input_routes.rou.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/follower_ends_before_reversal2/net.net.xml b/tests/sumo/rail/reversal/follower_ends_before_reversal2/net.net.xml new file mode 100644 index 000000000000..89e723d469a7 --- /dev/null +++ b/tests/sumo/rail/reversal/follower_ends_before_reversal2/net.net.xml @@ -0,0 +1,1295 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/follower_ends_before_reversal2/options.sumo b/tests/sumo/rail/reversal/follower_ends_before_reversal2/options.sumo new file mode 100644 index 000000000000..3909a2b2b852 --- /dev/null +++ b/tests/sumo/rail/reversal/follower_ends_before_reversal2/options.sumo @@ -0,0 +1,4 @@ +--no-step-log --no-duration-log +--net-file=net.net.xml +--routes=input_routes.rou.xml +--time-to-teleport 1000 diff --git a/tests/sumo/rail/reversal/follower_ends_before_reversal2/output.sumo b/tests/sumo/rail/reversal/follower_ends_before_reversal2/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/follower_ends_before_reversal2/railsignalblocks.sumo b/tests/sumo/rail/reversal/follower_ends_before_reversal2/railsignalblocks.sumo new file mode 100644 index 000000000000..3c85ca0a5dc5 --- /dev/null +++ b/tests/sumo/rail/reversal/follower_ends_before_reversal2/railsignalblocks.sumo @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/follower_ends_before_reversal2/railsignalblocks.sumo.meso b/tests/sumo/rail/reversal/follower_ends_before_reversal2/railsignalblocks.sumo.meso new file mode 100644 index 000000000000..ef865be25246 --- /dev/null +++ b/tests/sumo/rail/reversal/follower_ends_before_reversal2/railsignalblocks.sumo.meso @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/follower_ends_before_reversal2/stopinfos.sumo b/tests/sumo/rail/reversal/follower_ends_before_reversal2/stopinfos.sumo new file mode 100644 index 000000000000..c9c406034fdb --- /dev/null +++ b/tests/sumo/rail/reversal/follower_ends_before_reversal2/stopinfos.sumo @@ -0,0 +1 @@ +Auto-generated by TextTest to simulate missing file for this version... diff --git a/tests/sumo/rail/reversal/insertion_before_reversal/errors.sumo b/tests/sumo/rail/reversal/insertion_before_reversal/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/insertion_before_reversal/errors.sumo.meso b/tests/sumo/rail/reversal/insertion_before_reversal/errors.sumo.meso new file mode 100644 index 000000000000..7c5032aa693c --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal/errors.sumo.meso @@ -0,0 +1 @@ +Warning: Network contains internal links which are ignored. Vehicles will 'jump' across junctions and thus underestimate route lengths and travel times. diff --git a/tests/sumo/rail/reversal/insertion_before_reversal/input_routes.rou.xml b/tests/sumo/rail/reversal/insertion_before_reversal/input_routes.rou.xml new file mode 100644 index 000000000000..3c3f504bc29d --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal/input_routes.rou.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/insertion_before_reversal/net.net.xml b/tests/sumo/rail/reversal/insertion_before_reversal/net.net.xml new file mode 100644 index 000000000000..132877ecf379 --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal/net.net.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/insertion_before_reversal/options.sumo b/tests/sumo/rail/reversal/insertion_before_reversal/options.sumo new file mode 100644 index 000000000000..db1f2e389912 --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal/options.sumo @@ -0,0 +1,3 @@ +--no-step-log --no-duration-log +--net-file=net.net.xml +--routes=input_routes.rou.xml diff --git a/tests/sumo/rail/reversal/insertion_before_reversal/output.sumo b/tests/sumo/rail/reversal/insertion_before_reversal/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/insertion_before_reversal/railsignalblocks.sumo b/tests/sumo/rail/reversal/insertion_before_reversal/railsignalblocks.sumo new file mode 100644 index 000000000000..b66e0c857c05 --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal/railsignalblocks.sumo @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/insertion_before_reversal/railsignalblocks.sumo.meso b/tests/sumo/rail/reversal/insertion_before_reversal/railsignalblocks.sumo.meso new file mode 100644 index 000000000000..ef865be25246 --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal/railsignalblocks.sumo.meso @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/insertion_before_reversal/stopinfos.sumo b/tests/sumo/rail/reversal/insertion_before_reversal/stopinfos.sumo new file mode 100644 index 000000000000..c9c406034fdb --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal/stopinfos.sumo @@ -0,0 +1 @@ +Auto-generated by TextTest to simulate missing file for this version... diff --git a/tests/sumo/rail/reversal/insertion_before_reversal2/errors.sumo b/tests/sumo/rail/reversal/insertion_before_reversal2/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/insertion_before_reversal2/errors.sumo.meso b/tests/sumo/rail/reversal/insertion_before_reversal2/errors.sumo.meso new file mode 100644 index 000000000000..7c5032aa693c --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal2/errors.sumo.meso @@ -0,0 +1 @@ +Warning: Network contains internal links which are ignored. Vehicles will 'jump' across junctions and thus underestimate route lengths and travel times. diff --git a/tests/sumo/rail/reversal/insertion_before_reversal2/input_routes.rou.xml b/tests/sumo/rail/reversal/insertion_before_reversal2/input_routes.rou.xml new file mode 100644 index 000000000000..d81ae57744bf --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal2/input_routes.rou.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/insertion_before_reversal2/net.net.xml b/tests/sumo/rail/reversal/insertion_before_reversal2/net.net.xml new file mode 100644 index 000000000000..132877ecf379 --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal2/net.net.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/insertion_before_reversal2/options.sumo b/tests/sumo/rail/reversal/insertion_before_reversal2/options.sumo new file mode 100644 index 000000000000..db1f2e389912 --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal2/options.sumo @@ -0,0 +1,3 @@ +--no-step-log --no-duration-log +--net-file=net.net.xml +--routes=input_routes.rou.xml diff --git a/tests/sumo/rail/reversal/insertion_before_reversal2/output.sumo b/tests/sumo/rail/reversal/insertion_before_reversal2/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/insertion_before_reversal2/railsignalblocks.sumo b/tests/sumo/rail/reversal/insertion_before_reversal2/railsignalblocks.sumo new file mode 100644 index 000000000000..4c595579044b --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal2/railsignalblocks.sumo @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/insertion_before_reversal2/railsignalblocks.sumo.meso b/tests/sumo/rail/reversal/insertion_before_reversal2/railsignalblocks.sumo.meso new file mode 100644 index 000000000000..ef865be25246 --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal2/railsignalblocks.sumo.meso @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/insertion_before_reversal2/stopinfos.sumo b/tests/sumo/rail/reversal/insertion_before_reversal2/stopinfos.sumo new file mode 100644 index 000000000000..c9c406034fdb --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal2/stopinfos.sumo @@ -0,0 +1 @@ +Auto-generated by TextTest to simulate missing file for this version... diff --git a/tests/sumo/rail/reversal/insertion_before_reversal3/errors.sumo b/tests/sumo/rail/reversal/insertion_before_reversal3/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/insertion_before_reversal3/errors.sumo.meso b/tests/sumo/rail/reversal/insertion_before_reversal3/errors.sumo.meso new file mode 100644 index 000000000000..7c5032aa693c --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal3/errors.sumo.meso @@ -0,0 +1 @@ +Warning: Network contains internal links which are ignored. Vehicles will 'jump' across junctions and thus underestimate route lengths and travel times. diff --git a/tests/sumo/rail/reversal/insertion_before_reversal3/input_routes.rou.xml b/tests/sumo/rail/reversal/insertion_before_reversal3/input_routes.rou.xml new file mode 100644 index 000000000000..e764b5be9219 --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal3/input_routes.rou.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/insertion_before_reversal3/net.net.xml b/tests/sumo/rail/reversal/insertion_before_reversal3/net.net.xml new file mode 100644 index 000000000000..132877ecf379 --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal3/net.net.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/insertion_before_reversal3/options.sumo b/tests/sumo/rail/reversal/insertion_before_reversal3/options.sumo new file mode 100644 index 000000000000..db1f2e389912 --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal3/options.sumo @@ -0,0 +1,3 @@ +--no-step-log --no-duration-log +--net-file=net.net.xml +--routes=input_routes.rou.xml diff --git a/tests/sumo/rail/reversal/insertion_before_reversal3/output.sumo b/tests/sumo/rail/reversal/insertion_before_reversal3/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/insertion_before_reversal3/railsignalblocks.sumo b/tests/sumo/rail/reversal/insertion_before_reversal3/railsignalblocks.sumo new file mode 100644 index 000000000000..4c595579044b --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal3/railsignalblocks.sumo @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/insertion_before_reversal3/railsignalblocks.sumo.meso b/tests/sumo/rail/reversal/insertion_before_reversal3/railsignalblocks.sumo.meso new file mode 100644 index 000000000000..ef865be25246 --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal3/railsignalblocks.sumo.meso @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/insertion_before_reversal3/stopinfos.sumo b/tests/sumo/rail/reversal/insertion_before_reversal3/stopinfos.sumo new file mode 100644 index 000000000000..c9c406034fdb --- /dev/null +++ b/tests/sumo/rail/reversal/insertion_before_reversal3/stopinfos.sumo @@ -0,0 +1 @@ +Auto-generated by TextTest to simulate missing file for this version... diff --git a/tests/sumo/rail/reversal/reversal_after_common_block/errors.sumo b/tests/sumo/rail/reversal/reversal_after_common_block/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/reversal_after_common_block/errors.sumo.meso b/tests/sumo/rail/reversal/reversal_after_common_block/errors.sumo.meso new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/reversal_after_common_block/input_routes.rou.xml b/tests/sumo/rail/reversal/reversal_after_common_block/input_routes.rou.xml new file mode 100644 index 000000000000..011c255413e3 --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_after_common_block/input_routes.rou.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reversal_after_common_block/net.net.xml b/tests/sumo/rail/reversal/reversal_after_common_block/net.net.xml new file mode 100644 index 000000000000..a905cd90d884 --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_after_common_block/net.net.xml @@ -0,0 +1,295 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reversal_after_common_block/options.sumo b/tests/sumo/rail/reversal/reversal_after_common_block/options.sumo new file mode 100644 index 000000000000..a05c625502e9 --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_after_common_block/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml --tripinfo-output=tripinfos.xml +--railsignal-vehicle-output railsignal_vehicles.xml diff --git a/tests/sumo/rail/reversal/reversal_after_common_block/output.sumo b/tests/sumo/rail/reversal/reversal_after_common_block/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/reversal_after_common_block/railsignalblocks.sumo b/tests/sumo/rail/reversal/reversal_after_common_block/railsignalblocks.sumo new file mode 100644 index 000000000000..939ff9295309 --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_after_common_block/railsignalblocks.sumo @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reversal_after_common_block/railsignalvehs.sumo b/tests/sumo/rail/reversal/reversal_after_common_block/railsignalvehs.sumo new file mode 100644 index 000000000000..3e6c094356fc --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_after_common_block/railsignalvehs.sumo @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reversal_after_common_block/tripinfos.sumo b/tests/sumo/rail/reversal/reversal_after_common_block/tripinfos.sumo new file mode 100644 index 000000000000..dcfb651ad482 --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_after_common_block/tripinfos.sumo @@ -0,0 +1,44 @@ + + + + + + + + diff --git a/tests/sumo/rail/reversal/reversal_after_common_block/tripinfos.sumo.meso b/tests/sumo/rail/reversal/reversal_after_common_block/tripinfos.sumo.meso new file mode 100644 index 000000000000..e872986da5b1 --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_after_common_block/tripinfos.sumo.meso @@ -0,0 +1,49 @@ + + + + + + + + diff --git a/tests/sumo/rail/reversal/reversal_in_first_block/errors.sumo b/tests/sumo/rail/reversal/reversal_in_first_block/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/reversal_in_first_block/errors.sumo.meso b/tests/sumo/rail/reversal/reversal_in_first_block/errors.sumo.meso new file mode 100644 index 000000000000..7c5032aa693c --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_in_first_block/errors.sumo.meso @@ -0,0 +1 @@ +Warning: Network contains internal links which are ignored. Vehicles will 'jump' across junctions and thus underestimate route lengths and travel times. diff --git a/tests/sumo/rail/reversal/reversal_in_first_block/input_routes.rou.xml b/tests/sumo/rail/reversal/reversal_in_first_block/input_routes.rou.xml new file mode 100644 index 000000000000..d443257db0b1 --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_in_first_block/input_routes.rou.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reversal_in_first_block/net.net.xml b/tests/sumo/rail/reversal/reversal_in_first_block/net.net.xml new file mode 100644 index 000000000000..0d0ebaa2e8ea --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_in_first_block/net.net.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reversal_in_first_block/options.sumo b/tests/sumo/rail/reversal/reversal_in_first_block/options.sumo new file mode 100644 index 000000000000..3909a2b2b852 --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_in_first_block/options.sumo @@ -0,0 +1,4 @@ +--no-step-log --no-duration-log +--net-file=net.net.xml +--routes=input_routes.rou.xml +--time-to-teleport 1000 diff --git a/tests/sumo/rail/reversal/reversal_in_first_block/output.sumo b/tests/sumo/rail/reversal/reversal_in_first_block/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/reversal_in_first_block/railsignalblocks.sumo b/tests/sumo/rail/reversal/reversal_in_first_block/railsignalblocks.sumo new file mode 100644 index 000000000000..e337a59af37e --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_in_first_block/railsignalblocks.sumo @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reversal_in_first_block/railsignalblocks.sumo.meso b/tests/sumo/rail/reversal/reversal_in_first_block/railsignalblocks.sumo.meso new file mode 100644 index 000000000000..ef865be25246 --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_in_first_block/railsignalblocks.sumo.meso @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reversal_in_first_block/stopinfos.sumo b/tests/sumo/rail/reversal/reversal_in_first_block/stopinfos.sumo new file mode 100644 index 000000000000..c9c406034fdb --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_in_first_block/stopinfos.sumo @@ -0,0 +1 @@ +Auto-generated by TextTest to simulate missing file for this version... diff --git a/tests/sumo/rail/reversal/reversal_in_first_block2/errors.sumo b/tests/sumo/rail/reversal/reversal_in_first_block2/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/reversal_in_first_block2/errors.sumo.meso b/tests/sumo/rail/reversal/reversal_in_first_block2/errors.sumo.meso new file mode 100644 index 000000000000..7c5032aa693c --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_in_first_block2/errors.sumo.meso @@ -0,0 +1 @@ +Warning: Network contains internal links which are ignored. Vehicles will 'jump' across junctions and thus underestimate route lengths and travel times. diff --git a/tests/sumo/rail/reversal/reversal_in_first_block2/input_routes.rou.xml b/tests/sumo/rail/reversal/reversal_in_first_block2/input_routes.rou.xml new file mode 100644 index 000000000000..d443257db0b1 --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_in_first_block2/input_routes.rou.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reversal_in_first_block2/net.net.xml b/tests/sumo/rail/reversal/reversal_in_first_block2/net.net.xml new file mode 100644 index 000000000000..139cf227a73d --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_in_first_block2/net.net.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reversal_in_first_block2/options.sumo b/tests/sumo/rail/reversal/reversal_in_first_block2/options.sumo new file mode 100644 index 000000000000..3909a2b2b852 --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_in_first_block2/options.sumo @@ -0,0 +1,4 @@ +--no-step-log --no-duration-log +--net-file=net.net.xml +--routes=input_routes.rou.xml +--time-to-teleport 1000 diff --git a/tests/sumo/rail/reversal/reversal_in_first_block2/output.sumo b/tests/sumo/rail/reversal/reversal_in_first_block2/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/reversal_in_first_block2/railsignalblocks.sumo b/tests/sumo/rail/reversal/reversal_in_first_block2/railsignalblocks.sumo new file mode 100644 index 000000000000..70ed8358d107 --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_in_first_block2/railsignalblocks.sumo @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reversal_in_first_block2/railsignalblocks.sumo.meso b/tests/sumo/rail/reversal/reversal_in_first_block2/railsignalblocks.sumo.meso new file mode 100644 index 000000000000..ef865be25246 --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_in_first_block2/railsignalblocks.sumo.meso @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reversal_in_first_block2/stopinfos.sumo b/tests/sumo/rail/reversal/reversal_in_first_block2/stopinfos.sumo new file mode 100644 index 000000000000..c9c406034fdb --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_in_first_block2/stopinfos.sumo @@ -0,0 +1 @@ +Auto-generated by TextTest to simulate missing file for this version... diff --git a/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/errors.sumo b/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/errors.sumo.meso b/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/errors.sumo.meso new file mode 100644 index 000000000000..7c5032aa693c --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/errors.sumo.meso @@ -0,0 +1 @@ +Warning: Network contains internal links which are ignored. Vehicles will 'jump' across junctions and thus underestimate route lengths and travel times. diff --git a/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/input_routes.rou.xml b/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/input_routes.rou.xml new file mode 100644 index 000000000000..f43c68d78748 --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/input_routes.rou.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/net.net.xml b/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/net.net.xml new file mode 100644 index 000000000000..b3130db4d3a1 --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/net.net.xml @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/options.sumo b/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/options.sumo new file mode 100644 index 000000000000..3909a2b2b852 --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/options.sumo @@ -0,0 +1,4 @@ +--no-step-log --no-duration-log +--net-file=net.net.xml +--routes=input_routes.rou.xml +--time-to-teleport 1000 diff --git a/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/output.sumo b/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/railsignalblocks.sumo b/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/railsignalblocks.sumo new file mode 100644 index 000000000000..202a1a0c9f2a --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/railsignalblocks.sumo @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/railsignalblocks.sumo.meso b/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/railsignalblocks.sumo.meso new file mode 100644 index 000000000000..ef865be25246 --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/railsignalblocks.sumo.meso @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/stopinfos.sumo b/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/stopinfos.sumo new file mode 100644 index 000000000000..c9c406034fdb --- /dev/null +++ b/tests/sumo/rail/reversal/reversal_onRoute_beyond_core/stopinfos.sumo @@ -0,0 +1 @@ +Auto-generated by TextTest to simulate missing file for this version... diff --git a/tests/sumo/rail/reversal/reverse_at_route_end/railsignalblocks.sumo b/tests/sumo/rail/reversal/reverse_at_route_end/railsignalblocks.sumo index bb45a53088cd..23ebc1bf1d34 100644 --- a/tests/sumo/rail/reversal/reverse_at_route_end/railsignalblocks.sumo +++ b/tests/sumo/rail/reversal/reverse_at_route_end/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reverse_at_route_end_impossible/railsignalblocks.sumo b/tests/sumo/rail/reversal/reverse_at_route_end_impossible/railsignalblocks.sumo index bb45a53088cd..a54e8500a971 100644 --- a/tests/sumo/rail/reversal/reverse_at_route_end_impossible/railsignalblocks.sumo +++ b/tests/sumo/rail/reversal/reverse_at_route_end_impossible/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reverse_at_stop/railsignalblocks.sumo b/tests/sumo/rail/reversal/reverse_at_stop/railsignalblocks.sumo index bb45a53088cd..7c5776ea36f3 100644 --- a/tests/sumo/rail/reversal/reverse_at_stop/railsignalblocks.sumo +++ b/tests/sumo/rail/reversal/reverse_at_stop/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reverse_before_further_stop/railsignalblocks.sumo b/tests/sumo/rail/reversal/reverse_before_further_stop/railsignalblocks.sumo index bb45a53088cd..7c5776ea36f3 100644 --- a/tests/sumo/rail/reversal/reverse_before_further_stop/railsignalblocks.sumo +++ b/tests/sumo/rail/reversal/reverse_before_further_stop/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reverse_before_further_stop_tooLong/railsignalblocks.sumo b/tests/sumo/rail/reversal/reverse_before_further_stop_tooLong/railsignalblocks.sumo index bb45a53088cd..7c5776ea36f3 100644 --- a/tests/sumo/rail/reversal/reverse_before_further_stop_tooLong/railsignalblocks.sumo +++ b/tests/sumo/rail/reversal/reverse_before_further_stop_tooLong/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reverse_before_stop/railsignalblocks.sumo b/tests/sumo/rail/reversal/reverse_before_stop/railsignalblocks.sumo index bb45a53088cd..7c5776ea36f3 100644 --- a/tests/sumo/rail/reversal/reverse_before_stop/railsignalblocks.sumo +++ b/tests/sumo/rail/reversal/reverse_before_stop/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reverse_before_stop_bad_route/railsignalblocks.sumo b/tests/sumo/rail/reversal/reverse_before_stop_bad_route/railsignalblocks.sumo index 335a2511a646..64fab7c9c011 100644 --- a/tests/sumo/rail/reversal/reverse_before_stop_bad_route/railsignalblocks.sumo +++ b/tests/sumo/rail/reversal/reverse_before_stop_bad_route/railsignalblocks.sumo @@ -1,6 +1,6 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reverse_before_stop_no_internal_links/railsignalblocks.sumo b/tests/sumo/rail/reversal/reverse_before_stop_no_internal_links/railsignalblocks.sumo index bb45a53088cd..30978b771470 100644 --- a/tests/sumo/rail/reversal/reverse_before_stop_no_internal_links/railsignalblocks.sumo +++ b/tests/sumo/rail/reversal/reverse_before_stop_no_internal_links/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reverse_no_internal_links/railsignalblocks.sumo b/tests/sumo/rail/reversal/reverse_no_internal_links/railsignalblocks.sumo index bb45a53088cd..30978b771470 100644 --- a/tests/sumo/rail/reversal/reverse_no_internal_links/railsignalblocks.sumo +++ b/tests/sumo/rail/reversal/reverse_no_internal_links/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reverse_no_link/railsignalblocks.sumo b/tests/sumo/rail/reversal/reverse_no_link/railsignalblocks.sumo index 78744eb06d8a..4d60a21aafcb 100644 --- a/tests/sumo/rail/reversal/reverse_no_link/railsignalblocks.sumo +++ b/tests/sumo/rail/reversal/reverse_no_link/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reverse_no_stop/railsignalblocks.sumo b/tests/sumo/rail/reversal/reverse_no_stop/railsignalblocks.sumo index bb45a53088cd..7c5776ea36f3 100644 --- a/tests/sumo/rail/reversal/reverse_no_stop/railsignalblocks.sumo +++ b/tests/sumo/rail/reversal/reverse_no_stop/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/reversal/reverse_on_signal/railsignalblocks.sumo b/tests/sumo/rail/reversal/reverse_on_signal/railsignalblocks.sumo index 6305889f1d17..d8e6d0ec3160 100644 --- a/tests/sumo/rail/reversal/reverse_on_signal/railsignalblocks.sumo +++ b/tests/sumo/rail/reversal/reverse_on_signal/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/routes_cross_twice/net.net.xml b/tests/sumo/rail/reversal/routes_cross_twice/net.net.xml new file mode 100644 index 000000000000..2fb73c12c595 --- /dev/null +++ b/tests/sumo/rail/reversal/routes_cross_twice/net.net.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/routes_cross_twice/options.sumo b/tests/sumo/rail/reversal/routes_cross_twice/options.sumo new file mode 100644 index 000000000000..e4f87d6703ff --- /dev/null +++ b/tests/sumo/rail/reversal/routes_cross_twice/options.sumo @@ -0,0 +1 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml --tripinfo-output=tripinfos.xml diff --git a/tests/sumo/rail/reversal/routes_cross_twice/output.sumo b/tests/sumo/rail/reversal/routes_cross_twice/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/routes_cross_twice/railsignalblocks.sumo b/tests/sumo/rail/reversal/routes_cross_twice/railsignalblocks.sumo new file mode 100644 index 000000000000..678eebb34498 --- /dev/null +++ b/tests/sumo/rail/reversal/routes_cross_twice/railsignalblocks.sumo @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/routes_cross_twice/tripinfos.sumo b/tests/sumo/rail/reversal/routes_cross_twice/tripinfos.sumo new file mode 100644 index 000000000000..12780ebf3cb9 --- /dev/null +++ b/tests/sumo/rail/reversal/routes_cross_twice/tripinfos.sumo @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/tests/sumo/rail/reversal/routes_cross_twice/tripinfos.sumo.meso b/tests/sumo/rail/reversal/routes_cross_twice/tripinfos.sumo.meso new file mode 100644 index 000000000000..e872986da5b1 --- /dev/null +++ b/tests/sumo/rail/reversal/routes_cross_twice/tripinfos.sumo.meso @@ -0,0 +1,49 @@ + + + + + + + + diff --git a/tests/sumo/rail/reversal/subdriveway_reversal/errors.sumo b/tests/sumo/rail/reversal/subdriveway_reversal/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/subdriveway_reversal/errors.sumo.meso b/tests/sumo/rail/reversal/subdriveway_reversal/errors.sumo.meso new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/subdriveway_reversal/input_routes.rou.xml b/tests/sumo/rail/reversal/subdriveway_reversal/input_routes.rou.xml new file mode 100644 index 000000000000..991101a5ace7 --- /dev/null +++ b/tests/sumo/rail/reversal/subdriveway_reversal/input_routes.rou.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/subdriveway_reversal/net.net.xml b/tests/sumo/rail/reversal/subdriveway_reversal/net.net.xml new file mode 100644 index 000000000000..f9e46a84cd6f --- /dev/null +++ b/tests/sumo/rail/reversal/subdriveway_reversal/net.net.xml @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/subdriveway_reversal/options.sumo b/tests/sumo/rail/reversal/subdriveway_reversal/options.sumo new file mode 100644 index 000000000000..a05c625502e9 --- /dev/null +++ b/tests/sumo/rail/reversal/subdriveway_reversal/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml --tripinfo-output=tripinfos.xml +--railsignal-vehicle-output railsignal_vehicles.xml diff --git a/tests/sumo/rail/reversal/subdriveway_reversal/output.sumo b/tests/sumo/rail/reversal/subdriveway_reversal/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/subdriveway_reversal/railsignalblocks.sumo b/tests/sumo/rail/reversal/subdriveway_reversal/railsignalblocks.sumo new file mode 100644 index 000000000000..560210f60e9c --- /dev/null +++ b/tests/sumo/rail/reversal/subdriveway_reversal/railsignalblocks.sumo @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/subdriveway_reversal/railsignalvehs.sumo b/tests/sumo/rail/reversal/subdriveway_reversal/railsignalvehs.sumo new file mode 100644 index 000000000000..f47346c382d9 --- /dev/null +++ b/tests/sumo/rail/reversal/subdriveway_reversal/railsignalvehs.sumo @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/subdriveway_reversal/tripinfos.sumo b/tests/sumo/rail/reversal/subdriveway_reversal/tripinfos.sumo new file mode 100644 index 000000000000..c7cd1a410f8a --- /dev/null +++ b/tests/sumo/rail/reversal/subdriveway_reversal/tripinfos.sumo @@ -0,0 +1,46 @@ + + + + + + + + + diff --git a/tests/sumo/rail/reversal/subdriveway_reversal/tripinfos.sumo.meso b/tests/sumo/rail/reversal/subdriveway_reversal/tripinfos.sumo.meso new file mode 100644 index 000000000000..e872986da5b1 --- /dev/null +++ b/tests/sumo/rail/reversal/subdriveway_reversal/tripinfos.sumo.meso @@ -0,0 +1,49 @@ + + + + + + + + diff --git a/tests/sumo/rail/reversal/testsuite.sumo b/tests/sumo/rail/reversal/testsuite.sumo index d69a47ed9530..7fbe7680babe 100644 --- a/tests/sumo/rail/reversal/testsuite.sumo +++ b/tests/sumo/rail/reversal/testsuite.sumo @@ -64,3 +64,47 @@ reverse_at_route_end_impossible # see #13260 double_reversal_same_dir +insertion_before_reversal + +# second train ends before reversal +insertion_before_reversal2 +insertion_before_reversal3 + +# the leading train reverse and the follower train ends right before the reversal +follower_ends_before_reversal + +# the leading train reverse and the follower train ends right before the reversal +follower_ends_before_reversal2 + +# avoid spurious foe checks +reversal_onRoute_beyond_core + +# avoid spurious foe checks +reversal_in_first_block + +# avoid spurious foe checks, both driveways have a route that ends at the network boundary (terminateRoute) +reversal_in_first_block2 + +# train must not exit driveway by reversal +double_reversal_dwEnd + +# invalid conflict when a train reverses within the bidi section, causing emergency braking +bidiDepart_reversal + +# invalid conflict +routes_cross_twice + +# invalid subDriveway construction +two_double_reversals + +# invalid subDriveway construction +reversal_after_common_block + +# vehicle should not be assigned to a subDriveway if it would have to leave via reversal +subdriveway_reversal + +# consecutive signals for the same route should not be foes if the train branches of after reversal and before entering their section +consecutive_before_reversal + +# see #15608 +both_reverse diff --git a/tests/sumo/rail/reversal/two_double_reversals/errors.sumo b/tests/sumo/rail/reversal/two_double_reversals/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/two_double_reversals/errors.sumo.meso b/tests/sumo/rail/reversal/two_double_reversals/errors.sumo.meso new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/two_double_reversals/input_routes.rou.xml b/tests/sumo/rail/reversal/two_double_reversals/input_routes.rou.xml new file mode 100644 index 000000000000..e19837ec1d4f --- /dev/null +++ b/tests/sumo/rail/reversal/two_double_reversals/input_routes.rou.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/two_double_reversals/net.net.xml b/tests/sumo/rail/reversal/two_double_reversals/net.net.xml new file mode 100644 index 000000000000..14095d10ff52 --- /dev/null +++ b/tests/sumo/rail/reversal/two_double_reversals/net.net.xml @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/two_double_reversals/options.sumo b/tests/sumo/rail/reversal/two_double_reversals/options.sumo new file mode 100644 index 000000000000..a05c625502e9 --- /dev/null +++ b/tests/sumo/rail/reversal/two_double_reversals/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml --tripinfo-output=tripinfos.xml +--railsignal-vehicle-output railsignal_vehicles.xml diff --git a/tests/sumo/rail/reversal/two_double_reversals/output.sumo b/tests/sumo/rail/reversal/two_double_reversals/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/reversal/two_double_reversals/railsignalblocks.sumo b/tests/sumo/rail/reversal/two_double_reversals/railsignalblocks.sumo new file mode 100644 index 000000000000..132f7f3f62f9 --- /dev/null +++ b/tests/sumo/rail/reversal/two_double_reversals/railsignalblocks.sumo @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/two_double_reversals/railsignalvehs.sumo b/tests/sumo/rail/reversal/two_double_reversals/railsignalvehs.sumo new file mode 100644 index 000000000000..2470aafb9a66 --- /dev/null +++ b/tests/sumo/rail/reversal/two_double_reversals/railsignalvehs.sumo @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/reversal/two_double_reversals/tripinfos.sumo b/tests/sumo/rail/reversal/two_double_reversals/tripinfos.sumo new file mode 100644 index 000000000000..a93cff22e2d7 --- /dev/null +++ b/tests/sumo/rail/reversal/two_double_reversals/tripinfos.sumo @@ -0,0 +1,45 @@ + + + + + + + + + diff --git a/tests/sumo/rail/reversal/two_double_reversals/tripinfos.sumo.meso b/tests/sumo/rail/reversal/two_double_reversals/tripinfos.sumo.meso new file mode 100644 index 000000000000..e872986da5b1 --- /dev/null +++ b/tests/sumo/rail/reversal/two_double_reversals/tripinfos.sumo.meso @@ -0,0 +1,49 @@ + + + + + + + + diff --git a/tests/sumo/rail/routing/reversal_possible/railsignalblocks.sumo b/tests/sumo/rail/routing/reversal_possible/railsignalblocks.sumo index 601778f00b86..289201f82d15 100644 --- a/tests/sumo/rail/routing/reversal_possible/railsignalblocks.sumo +++ b/tests/sumo/rail/routing/reversal_possible/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/routing/reversal_possible_slack/railsignalblocks.sumo b/tests/sumo/rail/routing/reversal_possible_slack/railsignalblocks.sumo index 601778f00b86..578137e179f1 100644 --- a/tests/sumo/rail/routing/reversal_possible_slack/railsignalblocks.sumo +++ b/tests/sumo/rail/routing/reversal_possible_slack/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/routing/reverse_short_start/railsignalblocks.sumo b/tests/sumo/rail/routing/reverse_short_start/railsignalblocks.sumo index 601778f00b86..5443292c4a4a 100644 --- a/tests/sumo/rail/routing/reverse_short_start/railsignalblocks.sumo +++ b/tests/sumo/rail/routing/reverse_short_start/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/routing/reverse_short_start_stops/railsignalblocks.sumo b/tests/sumo/rail/routing/reverse_short_start_stops/railsignalblocks.sumo index 601778f00b86..05a3dfea6a8c 100644 --- a/tests/sumo/rail/routing/reverse_short_start_stops/railsignalblocks.sumo +++ b/tests/sumo/rail/routing/reverse_short_start_stops/railsignalblocks.sumo @@ -1,16 +1,22 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/routing/short_buffer/railsignalblocks.sumo b/tests/sumo/rail/routing/short_buffer/railsignalblocks.sumo index 601778f00b86..baff49fd13aa 100644 --- a/tests/sumo/rail/routing/short_buffer/railsignalblocks.sumo +++ b/tests/sumo/rail/routing/short_buffer/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + diff --git a/tests/sumo/rail/siding/long_siding_occupied_advance/errors.sumo b/tests/sumo/rail/siding/long_siding_occupied_advance/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/long_siding_occupied_advance/input_routes.rou.xml b/tests/sumo/rail/siding/long_siding_occupied_advance/input_routes.rou.xml new file mode 100644 index 000000000000..799baa020d72 --- /dev/null +++ b/tests/sumo/rail/siding/long_siding_occupied_advance/input_routes.rou.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/long_siding_occupied_advance/net.net.xml b/tests/sumo/rail/siding/long_siding_occupied_advance/net.net.xml new file mode 100644 index 000000000000..194f59318c78 --- /dev/null +++ b/tests/sumo/rail/siding/long_siding_occupied_advance/net.net.xml @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/long_siding_occupied_advance/options.sumo b/tests/sumo/rail/siding/long_siding_occupied_advance/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/siding/long_siding_occupied_advance/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/siding/long_siding_occupied_advance/output.sumo b/tests/sumo/rail/siding/long_siding_occupied_advance/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/long_siding_occupied_advance/railsignalblocks.sumo b/tests/sumo/rail/siding/long_siding_occupied_advance/railsignalblocks.sumo new file mode 100644 index 000000000000..5fd7aa767151 --- /dev/null +++ b/tests/sumo/rail/siding/long_siding_occupied_advance/railsignalblocks.sumo @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/long_siding_occupied_advance/tripinfos.sumo b/tests/sumo/rail/siding/long_siding_occupied_advance/tripinfos.sumo new file mode 100644 index 000000000000..d88c414deb0a --- /dev/null +++ b/tests/sumo/rail/siding/long_siding_occupied_advance/tripinfos.sumo @@ -0,0 +1,46 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/siding/long_siding_occupied_wait/errors.sumo b/tests/sumo/rail/siding/long_siding_occupied_wait/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/long_siding_occupied_wait/input_routes.rou.xml b/tests/sumo/rail/siding/long_siding_occupied_wait/input_routes.rou.xml new file mode 100644 index 000000000000..5ccd5e4ece11 --- /dev/null +++ b/tests/sumo/rail/siding/long_siding_occupied_wait/input_routes.rou.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/long_siding_occupied_wait/net.net.xml b/tests/sumo/rail/siding/long_siding_occupied_wait/net.net.xml new file mode 100644 index 000000000000..194f59318c78 --- /dev/null +++ b/tests/sumo/rail/siding/long_siding_occupied_wait/net.net.xml @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/long_siding_occupied_wait/options.sumo b/tests/sumo/rail/siding/long_siding_occupied_wait/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/siding/long_siding_occupied_wait/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/siding/long_siding_occupied_wait/output.sumo b/tests/sumo/rail/siding/long_siding_occupied_wait/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/long_siding_occupied_wait/railsignalblocks.sumo b/tests/sumo/rail/siding/long_siding_occupied_wait/railsignalblocks.sumo new file mode 100644 index 000000000000..13139eb8107e --- /dev/null +++ b/tests/sumo/rail/siding/long_siding_occupied_wait/railsignalblocks.sumo @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/long_siding_occupied_wait/tripinfos.sumo b/tests/sumo/rail/siding/long_siding_occupied_wait/tripinfos.sumo new file mode 100644 index 000000000000..e3a645f4af3b --- /dev/null +++ b/tests/sumo/rail/siding/long_siding_occupied_wait/tripinfos.sumo @@ -0,0 +1,46 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/siding/long_siding_occupied_wait2/errors.sumo b/tests/sumo/rail/siding/long_siding_occupied_wait2/errors.sumo new file mode 100644 index 000000000000..e78485199ae9 --- /dev/null +++ b/tests/sumo/rail/siding/long_siding_occupied_wait2/errors.sumo @@ -0,0 +1,4 @@ +Warning: Vehicle 't2' performs emergency braking on lane '-g_0' with decel=5.00, wished=1.30, severity=1.00, time=1.00. +Warning: Vehicle 't2' performs emergency stop at the end of lane '-g_0' because of a red traffic light (decel=-13.89, offset=8.89), time=1.00. +Warning: Vehicle 't3' performs emergency braking on lane 'E1_0' with decel=5.00, wished=1.30, severity=1.00, time=1.00. +Warning: Vehicle 't3' performs emergency stop at the end of lane 'E1_0' because of a red traffic light (decel=-13.89, offset=8.89), time=1.00. diff --git a/tests/sumo/rail/siding/long_siding_occupied_wait2/input_routes.rou.xml b/tests/sumo/rail/siding/long_siding_occupied_wait2/input_routes.rou.xml new file mode 100644 index 000000000000..b4ab49f4f0bd --- /dev/null +++ b/tests/sumo/rail/siding/long_siding_occupied_wait2/input_routes.rou.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/long_siding_occupied_wait2/net.net.xml b/tests/sumo/rail/siding/long_siding_occupied_wait2/net.net.xml new file mode 100644 index 000000000000..194f59318c78 --- /dev/null +++ b/tests/sumo/rail/siding/long_siding_occupied_wait2/net.net.xml @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/long_siding_occupied_wait2/options.sumo b/tests/sumo/rail/siding/long_siding_occupied_wait2/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/siding/long_siding_occupied_wait2/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/siding/long_siding_occupied_wait2/output.sumo b/tests/sumo/rail/siding/long_siding_occupied_wait2/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/long_siding_occupied_wait2/railsignalblocks.sumo b/tests/sumo/rail/siding/long_siding_occupied_wait2/railsignalblocks.sumo new file mode 100644 index 000000000000..13139eb8107e --- /dev/null +++ b/tests/sumo/rail/siding/long_siding_occupied_wait2/railsignalblocks.sumo @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/long_siding_occupied_wait2/tripinfos.sumo b/tests/sumo/rail/siding/long_siding_occupied_wait2/tripinfos.sumo new file mode 100644 index 000000000000..99a1ed568b1c --- /dev/null +++ b/tests/sumo/rail/siding/long_siding_occupied_wait2/tripinfos.sumo @@ -0,0 +1,46 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/siding/loop_3veh/errors.sumo b/tests/sumo/rail/siding/loop_3veh/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/loop_3veh/input_routes.rou.xml b/tests/sumo/rail/siding/loop_3veh/input_routes.rou.xml new file mode 100644 index 000000000000..8902f51ec624 --- /dev/null +++ b/tests/sumo/rail/siding/loop_3veh/input_routes.rou.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/loop_3veh/net.net.xml b/tests/sumo/rail/siding/loop_3veh/net.net.xml new file mode 100644 index 000000000000..9668c0590a07 --- /dev/null +++ b/tests/sumo/rail/siding/loop_3veh/net.net.xml @@ -0,0 +1,483 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/loop_3veh/options.sumo b/tests/sumo/rail/siding/loop_3veh/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/siding/loop_3veh/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/siding/loop_3veh/output.sumo b/tests/sumo/rail/siding/loop_3veh/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/loop_3veh/railsignalblocks.sumo b/tests/sumo/rail/siding/loop_3veh/railsignalblocks.sumo new file mode 100644 index 000000000000..dc15f2b9e3e8 --- /dev/null +++ b/tests/sumo/rail/siding/loop_3veh/railsignalblocks.sumo @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/loop_3veh/tripinfos.sumo b/tests/sumo/rail/siding/loop_3veh/tripinfos.sumo new file mode 100644 index 000000000000..c75dc5f72c9b --- /dev/null +++ b/tests/sumo/rail/siding/loop_3veh/tripinfos.sumo @@ -0,0 +1,45 @@ + + + + + + + + + diff --git a/tests/sumo/rail/siding/sidingShort_deadlock/errors.sumo b/tests/sumo/rail/siding/sidingShort_deadlock/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/sidingShort_deadlock/input_routes.rou.xml b/tests/sumo/rail/siding/sidingShort_deadlock/input_routes.rou.xml new file mode 100644 index 000000000000..cb0bc79de76b --- /dev/null +++ b/tests/sumo/rail/siding/sidingShort_deadlock/input_routes.rou.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/sidingShort_deadlock/net.net.xml b/tests/sumo/rail/siding/sidingShort_deadlock/net.net.xml new file mode 100644 index 000000000000..0ddc5c773058 --- /dev/null +++ b/tests/sumo/rail/siding/sidingShort_deadlock/net.net.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/sidingShort_deadlock/options.sumo b/tests/sumo/rail/siding/sidingShort_deadlock/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/siding/sidingShort_deadlock/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/siding/sidingShort_deadlock/output.sumo b/tests/sumo/rail/siding/sidingShort_deadlock/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/sidingShort_deadlock/railsignalblocks.sumo b/tests/sumo/rail/siding/sidingShort_deadlock/railsignalblocks.sumo new file mode 100644 index 000000000000..75a760bf0e6e --- /dev/null +++ b/tests/sumo/rail/siding/sidingShort_deadlock/railsignalblocks.sumo @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/sidingShort_deadlock/tripinfos.sumo b/tests/sumo/rail/siding/sidingShort_deadlock/tripinfos.sumo new file mode 100644 index 000000000000..679cbfd2eac7 --- /dev/null +++ b/tests/sumo/rail/siding/sidingShort_deadlock/tripinfos.sumo @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways/errors.sumo b/tests/sumo/rail/siding/siding_both_ways/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/siding_both_ways/input_routes.rou.xml b/tests/sumo/rail/siding/siding_both_ways/input_routes.rou.xml new file mode 100644 index 000000000000..67f36438774b --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways/input_routes.rou.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways/net.net.xml b/tests/sumo/rail/siding/siding_both_ways/net.net.xml new file mode 100644 index 000000000000..0ddc5c773058 --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways/net.net.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways/options.sumo b/tests/sumo/rail/siding/siding_both_ways/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/siding/siding_both_ways/output.sumo b/tests/sumo/rail/siding/siding_both_ways/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/siding_both_ways/railsignalblocks.sumo b/tests/sumo/rail/siding/siding_both_ways/railsignalblocks.sumo new file mode 100644 index 000000000000..7570f2543d0b --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways/railsignalblocks.sumo @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways/tripinfos.sumo b/tests/sumo/rail/siding/siding_both_ways/tripinfos.sumo new file mode 100644 index 000000000000..bda1e4fcdbd0 --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways/tripinfos.sumo @@ -0,0 +1,45 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways2/errors.sumo b/tests/sumo/rail/siding/siding_both_ways2/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/siding_both_ways2/input_routes.rou.xml b/tests/sumo/rail/siding/siding_both_ways2/input_routes.rou.xml new file mode 100644 index 000000000000..e8d1ea1a25d5 --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways2/input_routes.rou.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways2/net.net.xml b/tests/sumo/rail/siding/siding_both_ways2/net.net.xml new file mode 100644 index 000000000000..3c1369b6f82e --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways2/net.net.xml @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways2/options.sumo b/tests/sumo/rail/siding/siding_both_ways2/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways2/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/siding/siding_both_ways2/output.sumo b/tests/sumo/rail/siding/siding_both_ways2/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/siding_both_ways2/railsignalblocks.sumo b/tests/sumo/rail/siding/siding_both_ways2/railsignalblocks.sumo new file mode 100644 index 000000000000..7d60dbc79be4 --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways2/railsignalblocks.sumo @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways2/tripinfos.sumo b/tests/sumo/rail/siding/siding_both_ways2/tripinfos.sumo new file mode 100644 index 000000000000..3912bcd452fd --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways2/tripinfos.sumo @@ -0,0 +1,45 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways3/errors.sumo b/tests/sumo/rail/siding/siding_both_ways3/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/siding_both_ways3/input_routes.rou.xml b/tests/sumo/rail/siding/siding_both_ways3/input_routes.rou.xml new file mode 100644 index 000000000000..bd637663abc7 --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways3/input_routes.rou.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways3/net.net.xml b/tests/sumo/rail/siding/siding_both_ways3/net.net.xml new file mode 100644 index 000000000000..5d564d43e68f --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways3/net.net.xml @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways3/options.sumo b/tests/sumo/rail/siding/siding_both_ways3/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways3/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/siding/siding_both_ways3/output.sumo b/tests/sumo/rail/siding/siding_both_ways3/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/siding_both_ways3/railsignalblocks.sumo b/tests/sumo/rail/siding/siding_both_ways3/railsignalblocks.sumo new file mode 100644 index 000000000000..773bf47113b6 --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways3/railsignalblocks.sumo @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways3/tripinfos.sumo b/tests/sumo/rail/siding/siding_both_ways3/tripinfos.sumo new file mode 100644 index 000000000000..5fb02104d7c6 --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways3/tripinfos.sumo @@ -0,0 +1,45 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways4/errors.sumo b/tests/sumo/rail/siding/siding_both_ways4/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/siding_both_ways4/input_routes.rou.xml b/tests/sumo/rail/siding/siding_both_ways4/input_routes.rou.xml new file mode 100644 index 000000000000..6f02c39e0c35 --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways4/input_routes.rou.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways4/net.net.xml b/tests/sumo/rail/siding/siding_both_ways4/net.net.xml new file mode 100644 index 000000000000..5d564d43e68f --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways4/net.net.xml @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways4/options.sumo b/tests/sumo/rail/siding/siding_both_ways4/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways4/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/siding/siding_both_ways4/output.sumo b/tests/sumo/rail/siding/siding_both_ways4/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/siding_both_ways4/railsignalblocks.sumo b/tests/sumo/rail/siding/siding_both_ways4/railsignalblocks.sumo new file mode 100644 index 000000000000..06a2c111c2fd --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways4/railsignalblocks.sumo @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways4/tripinfos.sumo b/tests/sumo/rail/siding/siding_both_ways4/tripinfos.sumo new file mode 100644 index 000000000000..0e15e363b734 --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways4/tripinfos.sumo @@ -0,0 +1,45 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways_addTrain/errors.sumo b/tests/sumo/rail/siding/siding_both_ways_addTrain/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/siding_both_ways_addTrain/input_routes.rou.xml b/tests/sumo/rail/siding/siding_both_ways_addTrain/input_routes.rou.xml new file mode 100644 index 000000000000..54ede179f022 --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways_addTrain/input_routes.rou.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways_addTrain/net.net.xml b/tests/sumo/rail/siding/siding_both_ways_addTrain/net.net.xml new file mode 100644 index 000000000000..0ddc5c773058 --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways_addTrain/net.net.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways_addTrain/options.sumo b/tests/sumo/rail/siding/siding_both_ways_addTrain/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways_addTrain/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/siding/siding_both_ways_addTrain/output.sumo b/tests/sumo/rail/siding/siding_both_ways_addTrain/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/siding_both_ways_addTrain/railsignalblocks.sumo b/tests/sumo/rail/siding/siding_both_ways_addTrain/railsignalblocks.sumo new file mode 100644 index 000000000000..7570f2543d0b --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways_addTrain/railsignalblocks.sumo @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_both_ways_addTrain/tripinfos.sumo b/tests/sumo/rail/siding/siding_both_ways_addTrain/tripinfos.sumo new file mode 100644 index 000000000000..dd93a2d8fd70 --- /dev/null +++ b/tests/sumo/rail/siding/siding_both_ways_addTrain/tripinfos.sumo @@ -0,0 +1,46 @@ + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_deadlock/errors.sumo b/tests/sumo/rail/siding/siding_deadlock/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/siding_deadlock/input_routes.rou.xml b/tests/sumo/rail/siding/siding_deadlock/input_routes.rou.xml new file mode 100644 index 000000000000..05882aafcf5d --- /dev/null +++ b/tests/sumo/rail/siding/siding_deadlock/input_routes.rou.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_deadlock/net.net.xml b/tests/sumo/rail/siding/siding_deadlock/net.net.xml new file mode 100644 index 000000000000..0ddc5c773058 --- /dev/null +++ b/tests/sumo/rail/siding/siding_deadlock/net.net.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_deadlock/options.sumo b/tests/sumo/rail/siding/siding_deadlock/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/siding/siding_deadlock/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/siding/siding_deadlock/output.sumo b/tests/sumo/rail/siding/siding_deadlock/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/siding_deadlock/railsignalblocks.sumo b/tests/sumo/rail/siding/siding_deadlock/railsignalblocks.sumo new file mode 100644 index 000000000000..75a760bf0e6e --- /dev/null +++ b/tests/sumo/rail/siding/siding_deadlock/railsignalblocks.sumo @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_deadlock/tripinfos.sumo b/tests/sumo/rail/siding/siding_deadlock/tripinfos.sumo new file mode 100644 index 000000000000..5dce97467787 --- /dev/null +++ b/tests/sumo/rail/siding/siding_deadlock/tripinfos.sumo @@ -0,0 +1,45 @@ + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_noSignal/errors.sumo b/tests/sumo/rail/siding/siding_noSignal/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/siding_noSignal/input_routes.rou.xml b/tests/sumo/rail/siding/siding_noSignal/input_routes.rou.xml new file mode 100644 index 000000000000..7ae1e6c1b9ef --- /dev/null +++ b/tests/sumo/rail/siding/siding_noSignal/input_routes.rou.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_noSignal/net.net.xml b/tests/sumo/rail/siding/siding_noSignal/net.net.xml new file mode 100644 index 000000000000..33fe23abd26b --- /dev/null +++ b/tests/sumo/rail/siding/siding_noSignal/net.net.xml @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_noSignal/options.sumo b/tests/sumo/rail/siding/siding_noSignal/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/siding/siding_noSignal/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/siding/siding_noSignal/output.sumo b/tests/sumo/rail/siding/siding_noSignal/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/siding_noSignal/railsignalblocks.sumo b/tests/sumo/rail/siding/siding_noSignal/railsignalblocks.sumo new file mode 100644 index 000000000000..3b4bbbbc418d --- /dev/null +++ b/tests/sumo/rail/siding/siding_noSignal/railsignalblocks.sumo @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_noSignal/tripinfos.sumo b/tests/sumo/rail/siding/siding_noSignal/tripinfos.sumo new file mode 100644 index 000000000000..2b006cf85d08 --- /dev/null +++ b/tests/sumo/rail/siding/siding_noSignal/tripinfos.sumo @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_noSignal2/errors.sumo b/tests/sumo/rail/siding/siding_noSignal2/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/siding_noSignal2/input_routes.rou.xml b/tests/sumo/rail/siding/siding_noSignal2/input_routes.rou.xml new file mode 100644 index 000000000000..e259024af86d --- /dev/null +++ b/tests/sumo/rail/siding/siding_noSignal2/input_routes.rou.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_noSignal2/net.net.xml b/tests/sumo/rail/siding/siding_noSignal2/net.net.xml new file mode 100644 index 000000000000..faeb34819505 --- /dev/null +++ b/tests/sumo/rail/siding/siding_noSignal2/net.net.xml @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_noSignal2/options.sumo b/tests/sumo/rail/siding/siding_noSignal2/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/siding/siding_noSignal2/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/siding/siding_noSignal2/output.sumo b/tests/sumo/rail/siding/siding_noSignal2/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/siding_noSignal2/railsignalblocks.sumo b/tests/sumo/rail/siding/siding_noSignal2/railsignalblocks.sumo new file mode 100644 index 000000000000..960135b0233c --- /dev/null +++ b/tests/sumo/rail/siding/siding_noSignal2/railsignalblocks.sumo @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_noSignal2/tripinfos.sumo b/tests/sumo/rail/siding/siding_noSignal2/tripinfos.sumo new file mode 100644 index 000000000000..82a43c5067d9 --- /dev/null +++ b/tests/sumo/rail/siding/siding_noSignal2/tripinfos.sumo @@ -0,0 +1,43 @@ + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_occupied_advance/errors.sumo b/tests/sumo/rail/siding/siding_occupied_advance/errors.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/siding_occupied_advance/input_routes.rou.xml b/tests/sumo/rail/siding/siding_occupied_advance/input_routes.rou.xml new file mode 100644 index 000000000000..a602039df5b2 --- /dev/null +++ b/tests/sumo/rail/siding/siding_occupied_advance/input_routes.rou.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_occupied_advance/net.net.xml b/tests/sumo/rail/siding/siding_occupied_advance/net.net.xml new file mode 100644 index 000000000000..aeb39bf12beb --- /dev/null +++ b/tests/sumo/rail/siding/siding_occupied_advance/net.net.xml @@ -0,0 +1,302 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_occupied_advance/options.sumo b/tests/sumo/rail/siding/siding_occupied_advance/options.sumo new file mode 100644 index 000000000000..aca2e8d18e45 --- /dev/null +++ b/tests/sumo/rail/siding/siding_occupied_advance/options.sumo @@ -0,0 +1,2 @@ +--no-step-log --no-duration-log --net-file=net.net.xml -r=input_routes.rou.xml +--tripinfo-output tripinfos.xml diff --git a/tests/sumo/rail/siding/siding_occupied_advance/output.sumo b/tests/sumo/rail/siding/siding_occupied_advance/output.sumo new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/sumo/rail/siding/siding_occupied_advance/railsignalblocks.sumo b/tests/sumo/rail/siding/siding_occupied_advance/railsignalblocks.sumo new file mode 100644 index 000000000000..34ffc66edde8 --- /dev/null +++ b/tests/sumo/rail/siding/siding_occupied_advance/railsignalblocks.sumo @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/siding/siding_occupied_advance/tripinfos.sumo b/tests/sumo/rail/siding/siding_occupied_advance/tripinfos.sumo new file mode 100644 index 000000000000..c8478b58e71c --- /dev/null +++ b/tests/sumo/rail/siding/siding_occupied_advance/tripinfos.sumo @@ -0,0 +1,44 @@ + + + + + + + + + diff --git a/tests/sumo/rail/siding/testsuite.sumo b/tests/sumo/rail/siding/testsuite.sumo new file mode 100644 index 000000000000..768bf67d02c7 --- /dev/null +++ b/tests/sumo/rail/siding/testsuite.sumo @@ -0,0 +1,48 @@ +# both sides of a siding are used in both directions +siding_both_ways + +# both sides of a siding are used in both directions. +# Check that all other foes are checked even after a usable siding is found for one foe. +siding_both_ways_addTrain + +# both sides of a siding are used in both directions but the "wrong" way is only used by stumps +siding_both_ways2 + +# both sides of a siding are used in both directions but the "wrong" way is only used by stumps. +# +# One of the driveways doesn't have the terminateRoute flag. +siding_both_ways3 + +# both sides of a siding are used in both directions but the "wrong" way is only used by stumps. +# +# both driveways don't have the terminateRoute flag. +siding_both_ways4 + +# siding cannot be used because it is already occupied +siding_deadlock + +# driveway should be usable despite occupied siding if the other side is still usable +siding_occupied_advance + +# siding cannot be used because the trains are too long +sidingShort_deadlock + +# siding does not prevent deadlock because it doesn't have a signal +siding_noSignal + +# siding does not prevent deadlock because it doesn't have a signal. one more layer of signals outside the siding +siding_noSignal2 + +# no deadlock should be found because the sidings will clear up in time +# +long_siding_occupied_wait + +# no deadlock should be found because the sidings will clear up in time (even if the first siding is too short for the train) +# +long_siding_occupied_wait2 + +# no deadlock should be found because the sidings accomodate multiple vehicles +long_siding_occupied_advance + +# a loop that reverses on itself can create a deadlock with 3 vehicles +loop_3veh diff --git a/tests/sumo/rail/slow_fast_slow/railsignalblocks.sumo b/tests/sumo/rail/slow_fast_slow/railsignalblocks.sumo index ebad7c240405..47cda7fee7fc 100644 --- a/tests/sumo/rail/slow_fast_slow/railsignalblocks.sumo +++ b/tests/sumo/rail/slow_fast_slow/railsignalblocks.sumo @@ -1,11 +1,16 @@ - - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/tests/sumo/rail/tramwayLoop/basic/tripinfos.sumo b/tests/sumo/rail/tramwayLoop/basic/tripinfos.sumo index 7b509a5c1a8c..8fac68245e9b 100644 --- a/tests/sumo/rail/tramwayLoop/basic/tripinfos.sumo +++ b/tests/sumo/rail/tramwayLoop/basic/tripinfos.sumo @@ -1,6 +1,6 @@ - - - - - - + + + + + - - - + + + diff --git a/tests/sumo/rail/tramwayLoop/basic/vehroutes.sumo b/tests/sumo/rail/tramwayLoop/basic/vehroutes.sumo index a09abfab5a8b..8de7c798c43a 100644 --- a/tests/sumo/rail/tramwayLoop/basic/vehroutes.sumo +++ b/tests/sumo/rail/tramwayLoop/basic/vehroutes.sumo @@ -1,6 +1,6 @@ - - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/sumo/rail/tramwayLoop/track_closed/tripinfos.sumo b/tests/sumo/rail/tramwayLoop/track_closed/tripinfos.sumo index 99fa8d3c0968..4b7effdf27d9 100644 --- a/tests/sumo/rail/tramwayLoop/track_closed/tripinfos.sumo +++ b/tests/sumo/rail/tramwayLoop/track_closed/tripinfos.sumo @@ -1,11 +1,16 @@ - - - - - - - - - - + + + + + + + + + diff --git a/tests/sumo/rail/tramwayLoop/track_closed/vehroutes.sumo b/tests/sumo/rail/tramwayLoop/track_closed/vehroutes.sumo index cf6e66c0b564..6ccb52a7607e 100644 --- a/tests/sumo/rail/tramwayLoop/track_closed/vehroutes.sumo +++ b/tests/sumo/rail/tramwayLoop/track_closed/vehroutes.sumo @@ -1,6 +1,6 @@ - - - - + + + - + diff --git a/tests/sumo/rail/two_passing_loops2/errors.sumo b/tests/sumo/rail/two_passing_loops2/errors.sumo index e69de29bb2d1..1667c90b63e6 100644 --- a/tests/sumo/rail/two_passing_loops2/errors.sumo +++ b/tests/sumo/rail/two_passing_loops2/errors.sumo @@ -0,0 +1,3 @@ +Warning: Invalid approach information to rail signal 'junction 'w3', link 2' after rerouting for vehicle 'rail4' first driveway edge 'T4_0' time=350.00. +Warning: Invalid approach information to rail signal 'junction 'w3', link 2' after rerouting for vehicle 'rail5' first driveway edge 'T4_0' time=390.00. +Warning: Invalid approach information to rail signal 'junction 'w3', link 2' after rerouting for vehicle 'rail6' first driveway edge 'T4_0' time=440.00. diff --git a/tests/sumo/rail/two_passing_loops2/railsignalblocks.sumo b/tests/sumo/rail/two_passing_loops2/railsignalblocks.sumo index 9d80604bda73..78cb73b46cf6 100644 --- a/tests/sumo/rail/two_passing_loops2/railsignalblocks.sumo +++ b/tests/sumo/rail/two_passing_loops2/railsignalblocks.sumo @@ -1,6 +1,6 @@ - - - - + + + - - + + diff --git a/tests/sumo/rail/uncontrolled_links/railsignalblocks.sumo b/tests/sumo/rail/uncontrolled_links/railsignalblocks.sumo index b325effade00..d3e1c2e387ba 100644 --- a/tests/sumo/rail/uncontrolled_links/railsignalblocks.sumo +++ b/tests/sumo/rail/uncontrolled_links/railsignalblocks.sumo @@ -1,11 +1,16 @@ - + + + + + + + + + + + diff --git a/tests/sumo/spec/departure/insertionChecks/leaderGap_option/vehroutes.sumo.meso b/tests/sumo/spec/departure/insertionChecks/leaderGap_option/vehroutes.sumo.meso new file mode 100644 index 000000000000..2328a19c7fe5 --- /dev/null +++ b/tests/sumo/spec/departure/insertionChecks/leaderGap_option/vehroutes.sumo.meso @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + diff --git a/tests/sumo/spec/departure/insertionChecks/testsuite.sumo b/tests/sumo/spec/departure/insertionChecks/testsuite.sumo index 02dc2e91c20b..423185c6bdd7 100644 --- a/tests/sumo/spec/departure/insertionChecks/testsuite.sumo +++ b/tests/sumo/spec/departure/insertionChecks/testsuite.sumo @@ -4,5 +4,8 @@ stop # remove check on gap to leader leaderGap +# remove check on gap to leader with option +leaderGap_option + # remove check on gap to follower followerGap diff --git a/tests/tools/net/net2jpsgeometry/allow_junctions/dxf.tools b/tests/tools/net/net2jpsgeometry/allow_junctions/dxf.tools index 75467a9d806d..64326e81919d 100644 --- a/tests/tools/net/net2jpsgeometry/allow_junctions/dxf.tools +++ b/tests/tools/net/net2jpsgeometry/allow_junctions/dxf.tools @@ -25,19 +25,19 @@ $INSBASE 9 $EXTMIN 10 --100 +1e+20 20 --100 +1e+20 30 --100 +1e+20 9 $EXTMAX 10 -100 +-1e+20 20 -100 +-1e+20 30 -100 +-1e+20 9 $LIMMIN 10 @@ -445,19 +445,19 @@ $SKPOLY 9 $TDCREATE 40 -2459949.678310185 +2451545.0 9 $TDUCREATE 40 -2458532.153996898 +2451545.0 9 $TDUPDATE 40 -2459949.678310185 +2451545.0 9 $TDUUPDATE 40 -2458532.1544311 +2451545.0 9 $TDINDWG 40 @@ -505,7 +505,7 @@ $SPLINESEGS 9 $HANDSEED 5 -52 +56 9 $SURFTAB1 70 @@ -885,11 +885,11 @@ $PSTYLEMODE 9 $FINGERPRINTGUID 2 -CDA3736C-8C42-11ED-9D59-B55E2AE7DD63 +{00000000-0000-0000-0000-000000000000} 9 $VERSIONGUID 2 -CDA3736E-8C42-11ED-9D59-B55E2AE7DD63 +{00000000-0000-0000-0000-000000000000} 9 $EXTNAMES 290 @@ -1159,9 +1159,9 @@ AcDbViewportTableRecord 21 1.0 12 -70.0 +0.0 22 -50.0 +0.0 13 0.0 23 @@ -1187,7 +1187,7 @@ AcDbViewportTableRecord 37 0.0 40 -1.0 +1000.0 41 1.34 42 @@ -1365,7 +1365,7 @@ Continuous 0 LAYER 5 -2D +2F 330 1 100 @@ -1387,7 +1387,7 @@ SOLID 0 LAYER 5 -40 +42 330 1 100 @@ -1489,7 +1489,7 @@ APPID 100 AcDbSymbolTable 70 -2 +3 0 APPID 5 @@ -1507,7 +1507,7 @@ ACAD 0 APPID 5 -51 +53 330 3 100 @@ -1519,6 +1519,20 @@ HATCHBACKGROUNDCOLOR 70 0 0 +APPID + 5 +54 +330 +3 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +EZDXF + 70 +0 + 0 ENDTAB 0 TABLE @@ -1605,7 +1619,7 @@ Standard 78 8 79 -0 +3 170 0 171 @@ -1625,9 +1639,9 @@ Standard 178 0 179 -0 +2 271 -0 +2 272 2 273 @@ -1801,7 +1815,7 @@ ENTITIES 0 LWPOLYLINE 5 -2E +30 330 17 100 @@ -1829,7 +1843,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -2F +31 330 17 100 @@ -1853,7 +1867,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -30 +32 330 17 100 @@ -1877,7 +1891,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -31 +33 330 17 100 @@ -1901,7 +1915,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -32 +34 330 17 100 @@ -1925,7 +1939,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -33 +35 330 17 100 @@ -1953,7 +1967,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -34 +36 330 17 100 @@ -1977,7 +1991,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -35 +37 330 17 100 @@ -2001,7 +2015,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -36 +38 330 17 100 @@ -2025,7 +2039,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -37 +39 330 17 100 @@ -2049,7 +2063,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -38 +3A 330 17 100 @@ -2073,7 +2087,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -39 +3B 330 17 100 @@ -2097,7 +2111,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -3A +3C 330 17 100 @@ -2121,7 +2135,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -3B +3D 330 17 100 @@ -2145,7 +2159,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -3C +3E 330 17 100 @@ -2169,7 +2183,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -3D +3F 330 17 100 @@ -2193,7 +2207,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -3E +40 330 17 100 @@ -2217,7 +2231,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -3F +41 330 17 100 @@ -2241,7 +2255,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -41 +43 330 17 100 @@ -2267,7 +2281,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -42 +44 330 17 100 @@ -2293,7 +2307,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -43 +45 330 17 100 @@ -2319,7 +2333,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -44 +46 330 17 100 @@ -2345,7 +2359,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -45 +47 330 17 100 @@ -2371,7 +2385,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -46 +48 330 17 100 @@ -2397,7 +2411,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -47 +49 330 17 100 @@ -2423,7 +2437,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -48 +4A 330 17 100 @@ -2449,7 +2463,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -49 +4B 330 17 100 @@ -2475,7 +2489,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -4A +4C 330 17 100 @@ -2501,7 +2515,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -4B +4D 330 17 100 @@ -2527,7 +2541,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -4C +4E 330 17 100 @@ -2553,7 +2567,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -4D +4F 330 17 100 @@ -2579,7 +2593,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -4E +50 330 17 100 @@ -2605,7 +2619,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -4F +51 330 17 100 @@ -2631,7 +2645,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -50 +52 330 17 100 @@ -2668,6 +2682,8 @@ A 0 100 AcDbDictionary +280 +0 281 1 3 @@ -2714,6 +2730,10 @@ ACAD_TABLESTYLE ACAD_VISUALSTYLE 350 16 + 3 +EZDXF_META +350 +2D 0 DICTIONARY 5 @@ -2722,6 +2742,8 @@ B A 100 AcDbDictionary +280 +0 281 1 0 @@ -2732,6 +2754,8 @@ C A 100 AcDbDictionary +280 +0 281 1 0 @@ -2742,6 +2766,8 @@ D A 100 AcDbDictionary +280 +0 281 1 3 @@ -2760,6 +2786,8 @@ E A 100 AcDbDictionary +280 +0 281 1 3 @@ -2782,6 +2810,8 @@ F A 100 AcDbDictionary +280 +0 281 1 3 @@ -2796,6 +2826,8 @@ DICTIONARY A 100 AcDbDictionary +280 +0 281 1 3 @@ -2810,6 +2842,8 @@ DICTIONARY A 100 AcDbDictionary +280 +0 281 1 0 @@ -2820,6 +2854,8 @@ ACDBDICTIONARYWDFLT A 100 AcDbDictionary +280 +0 281 1 3 @@ -2844,6 +2880,8 @@ DICTIONARY A 100 AcDbDictionary +280 +0 281 1 0 @@ -2854,6 +2892,8 @@ DICTIONARY A 100 AcDbDictionary +280 +0 281 1 0 @@ -2864,6 +2904,8 @@ DICTIONARY A 100 AcDbDictionary +280 +0 281 1 0 @@ -2879,21 +2921,21 @@ AcDbPlotSettings 2 Adobe PDF 4 -A4 +A3 6 40 -3.175 +7.5 41 -3.175 +20.0 42 -3.175 +7.5 43 -3.175 +20.0 44 -209.91 +420.0 45 -297.03 +297.0 46 0.0 47 @@ -2913,9 +2955,9 @@ A4 70 1024 72 -0 - 73 1 + 73 +0 74 5 7 @@ -2943,13 +2985,13 @@ Model 71 0 10 --3.175 +0.0 20 --3.175 +0.0 11 -293.857 +420.0 21 -206.735 +297.0 12 0.0 22 @@ -2957,17 +2999,17 @@ Model 32 0.0 14 -29.068 +1e+20 24 -20.356 +1e+20 34 -0.0 +1e+20 15 -261.614 +-1e+20 25 -183.204 +-1e+20 35 -0.0 +-1e+20 146 0.0 13 @@ -3005,21 +3047,21 @@ AcDbPlotSettings 2 Adobe PDF 4 -A4 +A3 6 40 -3.175 +7.5 41 -3.175 +20.0 42 -3.175 +7.5 43 -3.175 +20.0 44 -209.91 +420.0 45 -297.03 +297.0 46 0.0 47 @@ -3039,9 +3081,9 @@ A4 70 0 72 -0 - 73 1 + 73 +0 74 5 7 @@ -3069,13 +3111,13 @@ Layout1 71 1 10 --3.175 +0.0 20 --3.175 +0.0 11 -293.857 +420.0 21 -206.735 +297.0 12 0.0 22 @@ -3083,17 +3125,17 @@ Layout1 32 0.0 14 -29.068 +1e+20 24 -20.356 +1e+20 34 -0.0 +1e+20 15 -261.614 +-1e+20 25 -183.204 +-1e+20 35 -0.0 +-1e+20 146 0.0 13 @@ -3603,7 +3645,7 @@ Standard 47 1.0 49 -0.0 +1.0 140 1.0 294 @@ -3624,9 +3666,51 @@ Standard 0 272 9 -272 +273 9 0 +DICTIONARY + 5 +2D +330 +A +100 +AcDbDictionary +281 +1 + 3 +CREATED_BY_EZDXF +350 +2E + 3 +WRITTEN_BY_EZDXF +350 +55 + 0 +DICTIONARYVAR + 5 +2E +330 +2D +100 +DictionaryVariables +280 +0 + 1 +0.0 @ 2000-01-01T00:00:00.000000+00:00 + 0 +DICTIONARYVAR + 5 +55 +330 +2D +100 +DictionaryVariables +280 +0 + 1 +0.0 @ 2000-01-01T00:00:00.000000+00:00 + 0 ENDSEC 0 EOF diff --git a/tests/tools/net/net2jpsgeometry/allow_junctions/options.tools b/tests/tools/net/net2jpsgeometry/allow_junctions/options.tools index 720727d52207..6e6c1a96586f 100644 --- a/tests/tools/net/net2jpsgeometry/allow_junctions/options.tools +++ b/tests/tools/net/net2jpsgeometry/allow_junctions/options.tools @@ -1 +1 @@ --n input_net.net.xml -s input_sel.txt -o output.dxf -a --allow-junctions tools/net/net2jpsgeometry.py +-n input_net.net.xml -s input_sel.txt -o output.dxf -a --allow-junctions --fixed-metadata tools/net/net2jpsgeometry.py diff --git a/tests/tools/net/net2jpsgeometry/sidewalk_lanes/dxf.tools b/tests/tools/net/net2jpsgeometry/sidewalk_lanes/dxf.tools index 8dc9128c6801..b7081ff12b53 100644 --- a/tests/tools/net/net2jpsgeometry/sidewalk_lanes/dxf.tools +++ b/tests/tools/net/net2jpsgeometry/sidewalk_lanes/dxf.tools @@ -25,19 +25,19 @@ $INSBASE 9 $EXTMIN 10 --100 +1e+20 20 --100 +1e+20 30 --100 +1e+20 9 $EXTMAX 10 -100 +-1e+20 20 -100 +-1e+20 30 -100 +-1e+20 9 $LIMMIN 10 @@ -445,19 +445,19 @@ $SKPOLY 9 $TDCREATE 40 -2459949.678310185 +2451545.0 9 $TDUCREATE 40 -2458532.153996898 +2451545.0 9 $TDUPDATE 40 -2459949.678310185 +2451545.0 9 $TDUUPDATE 40 -2458532.1544311 +2451545.0 9 $TDINDWG 40 @@ -505,7 +505,7 @@ $SPLINESEGS 9 $HANDSEED 5 -42 +46 9 $SURFTAB1 70 @@ -885,11 +885,11 @@ $PSTYLEMODE 9 $FINGERPRINTGUID 2 -CDA3740C-8C42-11ED-9D5A-B55E2AE7DD63 +{00000000-0000-0000-0000-000000000000} 9 $VERSIONGUID 2 -CDA3740E-8C42-11ED-9D5A-B55E2AE7DD63 +{00000000-0000-0000-0000-000000000000} 9 $EXTNAMES 290 @@ -1159,9 +1159,9 @@ AcDbViewportTableRecord 21 1.0 12 -70.0 +0.0 22 -50.0 +0.0 13 0.0 23 @@ -1187,7 +1187,7 @@ AcDbViewportTableRecord 37 0.0 40 -1.0 +1000.0 41 1.34 42 @@ -1365,7 +1365,7 @@ Continuous 0 LAYER 5 -2D +2F 330 1 100 @@ -1387,7 +1387,7 @@ SOLID 0 LAYER 5 -38 +3A 330 1 100 @@ -1489,7 +1489,7 @@ APPID 100 AcDbSymbolTable 70 -2 +3 0 APPID 5 @@ -1507,7 +1507,7 @@ ACAD 0 APPID 5 -41 +43 330 3 100 @@ -1519,6 +1519,20 @@ HATCHBACKGROUNDCOLOR 70 0 0 +APPID + 5 +44 +330 +3 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +EZDXF + 70 +0 + 0 ENDTAB 0 TABLE @@ -1605,7 +1619,7 @@ Standard 78 8 79 -0 +3 170 0 171 @@ -1625,9 +1639,9 @@ Standard 178 0 179 -0 +2 271 -0 +2 272 2 273 @@ -1801,7 +1815,7 @@ ENTITIES 0 LWPOLYLINE 5 -2E +30 330 17 100 @@ -1829,7 +1843,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -2F +31 330 17 100 @@ -1853,7 +1867,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -30 +32 330 17 100 @@ -1877,7 +1891,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -31 +33 330 17 100 @@ -1901,7 +1915,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -32 +34 330 17 100 @@ -1925,7 +1939,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -33 +35 330 17 100 @@ -1953,7 +1967,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -34 +36 330 17 100 @@ -1977,7 +1991,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -35 +37 330 17 100 @@ -2001,7 +2015,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -36 +38 330 17 100 @@ -2025,7 +2039,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -37 +39 330 17 100 @@ -2049,7 +2063,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -39 +3B 330 17 100 @@ -2075,7 +2089,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -3A +3C 330 17 100 @@ -2101,7 +2115,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -3B +3D 330 17 100 @@ -2127,7 +2141,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -3C +3E 330 17 100 @@ -2153,7 +2167,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -3D +3F 330 17 100 @@ -2179,7 +2193,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -3E +40 330 17 100 @@ -2205,7 +2219,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -3F +41 330 17 100 @@ -2231,7 +2245,7 @@ AcDbPolyline 0 LWPOLYLINE 5 -40 +42 330 17 100 @@ -2268,6 +2282,8 @@ A 0 100 AcDbDictionary +280 +0 281 1 3 @@ -2314,6 +2330,10 @@ ACAD_TABLESTYLE ACAD_VISUALSTYLE 350 16 + 3 +EZDXF_META +350 +2D 0 DICTIONARY 5 @@ -2322,6 +2342,8 @@ B A 100 AcDbDictionary +280 +0 281 1 0 @@ -2332,6 +2354,8 @@ C A 100 AcDbDictionary +280 +0 281 1 0 @@ -2342,6 +2366,8 @@ D A 100 AcDbDictionary +280 +0 281 1 3 @@ -2360,6 +2386,8 @@ E A 100 AcDbDictionary +280 +0 281 1 3 @@ -2382,6 +2410,8 @@ F A 100 AcDbDictionary +280 +0 281 1 3 @@ -2396,6 +2426,8 @@ DICTIONARY A 100 AcDbDictionary +280 +0 281 1 3 @@ -2410,6 +2442,8 @@ DICTIONARY A 100 AcDbDictionary +280 +0 281 1 0 @@ -2420,6 +2454,8 @@ ACDBDICTIONARYWDFLT A 100 AcDbDictionary +280 +0 281 1 3 @@ -2444,6 +2480,8 @@ DICTIONARY A 100 AcDbDictionary +280 +0 281 1 0 @@ -2454,6 +2492,8 @@ DICTIONARY A 100 AcDbDictionary +280 +0 281 1 0 @@ -2464,6 +2504,8 @@ DICTIONARY A 100 AcDbDictionary +280 +0 281 1 0 @@ -2479,21 +2521,21 @@ AcDbPlotSettings 2 Adobe PDF 4 -A4 +A3 6 40 -3.175 +7.5 41 -3.175 +20.0 42 -3.175 +7.5 43 -3.175 +20.0 44 -209.91 +420.0 45 -297.03 +297.0 46 0.0 47 @@ -2513,9 +2555,9 @@ A4 70 1024 72 -0 - 73 1 + 73 +0 74 5 7 @@ -2543,13 +2585,13 @@ Model 71 0 10 --3.175 +0.0 20 --3.175 +0.0 11 -293.857 +420.0 21 -206.735 +297.0 12 0.0 22 @@ -2557,17 +2599,17 @@ Model 32 0.0 14 -29.068 +1e+20 24 -20.356 +1e+20 34 -0.0 +1e+20 15 -261.614 +-1e+20 25 -183.204 +-1e+20 35 -0.0 +-1e+20 146 0.0 13 @@ -2605,21 +2647,21 @@ AcDbPlotSettings 2 Adobe PDF 4 -A4 +A3 6 40 -3.175 +7.5 41 -3.175 +20.0 42 -3.175 +7.5 43 -3.175 +20.0 44 -209.91 +420.0 45 -297.03 +297.0 46 0.0 47 @@ -2639,9 +2681,9 @@ A4 70 0 72 -0 - 73 1 + 73 +0 74 5 7 @@ -2669,13 +2711,13 @@ Layout1 71 1 10 --3.175 +0.0 20 --3.175 +0.0 11 -293.857 +420.0 21 -206.735 +297.0 12 0.0 22 @@ -2683,17 +2725,17 @@ Layout1 32 0.0 14 -29.068 +1e+20 24 -20.356 +1e+20 34 -0.0 +1e+20 15 -261.614 +-1e+20 25 -183.204 +-1e+20 35 -0.0 +-1e+20 146 0.0 13 @@ -3203,7 +3245,7 @@ Standard 47 1.0 49 -0.0 +1.0 140 1.0 294 @@ -3224,9 +3266,51 @@ Standard 0 272 9 -272 +273 9 0 +DICTIONARY + 5 +2D +330 +A +100 +AcDbDictionary +281 +1 + 3 +CREATED_BY_EZDXF +350 +2E + 3 +WRITTEN_BY_EZDXF +350 +45 + 0 +DICTIONARYVAR + 5 +2E +330 +2D +100 +DictionaryVariables +280 +0 + 1 +0.0 @ 2000-01-01T00:00:00.000000+00:00 + 0 +DICTIONARYVAR + 5 +45 +330 +2D +100 +DictionaryVariables +280 +0 + 1 +0.0 @ 2000-01-01T00:00:00.000000+00:00 + 0 ENDSEC 0 EOF diff --git a/tests/tools/net/net2jpsgeometry/sidewalk_lanes/options.tools b/tests/tools/net/net2jpsgeometry/sidewalk_lanes/options.tools index 46db55e4553f..46095808150f 100644 --- a/tests/tools/net/net2jpsgeometry/sidewalk_lanes/options.tools +++ b/tests/tools/net/net2jpsgeometry/sidewalk_lanes/options.tools @@ -1 +1 @@ --n input_net.net.xml -s input_sel.txt -o output.dxf -a tools/net/net2jpsgeometry.py +-n input_net.net.xml -s input_sel.txt -o output.dxf -a --fixed-metadata tools/net/net2jpsgeometry.py diff --git a/tests/tools/turndefs/routeSampler/min_count_optimize/output.tools b/tests/tools/turndefs/routeSampler/min_count_optimize/output.tools index f9a376ab8b72..43727c410cdd 100644 --- a/tests/tools/turndefs/routeSampler/min_count_optimize/output.tools +++ b/tests/tools/turndefs/routeSampler/min_count_optimize/output.tools @@ -1,3 +1,19 @@ +Running HiGHS 1.2.0 [date: 2021-07-09, git hash: n/a] +Copyright (c) 2022 ERGO-Code under MIT licence terms +Presolving model +107 rows, 192 cols, 799 nonzeros +107 rows, 192 cols, 799 nonzeros +Presolve : Reductions: rows 107(-31); columns 192(-31); elements 799(-58) +Solving the presolved LP +Using EKK dual simplex solver - serial + Iteration Objective Infeasibilities num(sum) + 0 0.0000000000e+00 Ph1: 0(0) 0s + 94 2.3000000000e+01 Pr: 0(0) 0s +Solving the original LP from the solution after postsolve +Model status : Optimal +Simplex iterations: 94 +Objective value : 2.3000000000e+01 +HiGHS run time : 0.00 Loaded 98 routes (98 distinct) input route edge count: count 98, min 2.00 (7), max 16.00 (39), mean 8.66, Q1 6.00, median 9.00, Q3 11.00 histogram: [(2, 2), (3, 3), (4, 8), (5, 6), (6, 10), (7, 8), (8, 12), (9, 10), (10, 12), (11, 7), (12, 3), (13, 7), (14, 4), (15, 4), (16, 2)] @@ -5,23 +21,11 @@ input route detector count: count 98, min 1.00 (7), max 15.00 (39), mean 7.66, Q histogram: [(1, 2), (2, 3), (3, 8), (4, 6), (5, 10), (6, 8), (7, 12), (8, 10), (9, 12), (10, 7), (11, 3), (12, 7), (13, 4), (14, 4), (15, 2)] Ignored 13 routes which pass fewer than 4 counting location Starting optimization for interval [0.0, 99.0] (mismatch 751) -Primal Feasibility Dual Feasibility Duality Gap Step Path Parameter Objective -1.0 1.0 1.0 - 1.0 139.0 -0.2530364874168 0.2530364874168 0.2530364874168 0.7557774493876 0.2530364874168 48.14587142316 -0.0789831936971 0.0789831936971 0.0789831936971 0.7017129866465 0.0789831936971 32.10400223723 -0.02016485547474 0.02016485547474 0.02016485547474 0.7530111173195 0.02016485547474 25.71737848317 -0.002368302573094 0.002368302573095 0.002368302573095 0.8954710687492 0.002368302573095 23.32298291189 -8.541601974607e-06 8.541601985382e-06 8.54160198558e-06 0.9966151190307 8.541601985852e-06 23.00106253171 -4.271971523193e-10 4.271978344538e-10 4.271977133567e-10 0.9999499862171 4.271979385405e-10 23.00000005314 -Optimization terminated successfully. - Current function value: 23.000000 - Iterations: 6 Optimization succeeded -Wrote 89 routes (74 distinct) achieving total count 741 (98.67%) at 138 locations. GEH<5 for 95.65% -result route edge count: count 89, min 5.00 (0), max 16.00 (41), mean 9.33, Q1 7.00, median 9.00, Q3 11.00 - histogram: [(5, 8), (6, 10), (7, 8), (8, 14), (9, 11), (10, 12), (11, 6), (12, 2), (13, 7), (14, 5), (15, 4), (16, 2)] -result route detector count: count 89, min 4.00 (0), max 15.00 (41), mean 8.33, Q1 6.00, median 8.00, Q3 10.00 - histogram: [(4, 8), (5, 10), (6, 8), (7, 14), (8, 11), (9, 12), (10, 6), (11, 2), (12, 7), (13, 5), (14, 4), (15, 2)] -GEH: count 138, min 0.00 ([-58.121.42 64] 36 36), max 12.06 ([-123.121.42 131] 72 0), mean 0.76, Q1 0.00, median 0.00, Q3 0.00 -Warning: underflow locations: count 18, min 1.00 (('-152.80.00', '-131')), max 2.00 (('-123.121.42', '131')), mean 1.06, Q1 1.00, median 1.00, Q3 1.00 (total 19) -Warning: overflow locations: count 9, min -1.00 (('-55.80.00', '-27')), max -1.00 (('-55.80.00', '-27')), mean -1.00, Q1 -1.00, median -1.00, Q3 -1.00 (total -9) +Wrote 88 routes (70 distinct) achieving total count 728 (96.94%) at 138 locations. GEH<5 for 95.65% +result route edge count: count 88, min 5.00 (0), max 16.00 (41), mean 9.27, Q1 7.00, median 9.00, Q3 11.00 + histogram: [(5, 8), (6, 10), (7, 8), (8, 14), (9, 11), (10, 11), (11, 6), (12, 3), (13, 7), (14, 5), (15, 4), (16, 1)] +result route detector count: count 88, min 4.00 (0), max 15.00 (41), mean 8.27, Q1 6.00, median 8.00, Q3 10.00 + histogram: [(4, 8), (5, 10), (6, 8), (7, 14), (8, 11), (9, 11), (10, 6), (11, 3), (12, 7), (13, 5), (14, 4), (15, 1)] +GEH: count 138, min 0.00 ([-58.121.42 64] 36 36), max 12.06 ([-123.121.42 131] 72 0), mean 0.74, Q1 0.00, median 0.00, Q3 0.00 +Warning: underflow locations: count 22, min 1.00 (('-152.80.00', '-131')), max 2.00 (('-123.121.42', '131')), mean 1.05, Q1 1.00, median 1.00, Q3 1.00 (total 23) diff --git a/tests/tools/turndefs/routeSampler/min_count_optimize/routes.tools b/tests/tools/turndefs/routeSampler/min_count_optimize/routes.tools index 388b6ff76096..5edefbe779e7 100644 --- a/tests/tools/turndefs/routeSampler/min_count_optimize/routes.tools +++ b/tests/tools/turndefs/routeSampler/min_count_optimize/routes.tools @@ -1,6 +1,6 @@ - - - - + + + - - - + + + diff --git a/tests/tools/turndefs/routeSampler/optimize_full/output.tools b/tests/tools/turndefs/routeSampler/optimize_full/output.tools index 0739a3d04676..10795c12bead 100644 --- a/tests/tools/turndefs/routeSampler/optimize_full/output.tools +++ b/tests/tools/turndefs/routeSampler/optimize_full/output.tools @@ -1,2 +1,2 @@ Optimization succeeded -Wrote 98 routes (98 distinct) achieving total count 751 (100.00%) at 138 locations. GEH<5 for 100.00% +Wrote 98 routes (96 distinct) achieving total count 751 (100.00%) at 138 locations. GEH<5 for 100.00% diff --git a/tests/tools/turndefs/routeSampler/optimize_full/routes.tools b/tests/tools/turndefs/routeSampler/optimize_full/routes.tools index aa91b591a0cf..b64d3ec813f9 100644 --- a/tests/tools/turndefs/routeSampler/optimize_full/routes.tools +++ b/tests/tools/turndefs/routeSampler/optimize_full/routes.tools @@ -1,6 +1,6 @@ - - + - + - + - + - + - + + + + - + - + - - - - + - - - - - + + - - + + - + - - - - + - + - - - - - + + - + - - + + - + - + - + + + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + + + + - + - + - + - + - + - + - + - - + + - + - + - + - - + + - + - + - + - - + + - + - + - + diff --git a/tests/tools/turndefs/routeSampler/small_input_optimize/output.tools b/tests/tools/turndefs/routeSampler/small_input_optimize/output.tools index 00daefc0aa7a..740e21f84139 100644 --- a/tests/tools/turndefs/routeSampler/small_input_optimize/output.tools +++ b/tests/tools/turndefs/routeSampler/small_input_optimize/output.tools @@ -1,4 +1,4 @@ Optimization succeeded -Wrote 51 routes (28 distinct) achieving total count 428 (56.99%) at 138 locations. GEH<5 for 43.48% -Warning: underflow locations: count 100, min 1.00 (('-58.121.42', '64')), max 14.00 (('11', '11.80.00')), mean 3.26, Q1 1.00, median 2.00, Q3 3.00 (total 326) +Wrote 51 routes (27 distinct) achieving total count 428 (56.99%) at 138 locations. GEH<5 for 42.75% +Warning: underflow locations: count 100, min 1.00 (('-58.121.42', '64')), max 14.00 (('23', '23.80.00')), mean 3.26, Q1 1.00, median 2.00, Q3 4.00 (total 326) Warning: overflow locations: count 3, min -1.00 (('-58.121.42', '-31')), max -1.00 (('-58.121.42', '-31')), mean -1.00, Q1 -1.00, median -1.00, Q3 -1.00 (total -3) diff --git a/tests/tools/turndefs/routeSampler/small_input_optimize/routes.tools b/tests/tools/turndefs/routeSampler/small_input_optimize/routes.tools index f54fd72e5048..560f516ac2d3 100644 --- a/tests/tools/turndefs/routeSampler/small_input_optimize/routes.tools +++ b/tests/tools/turndefs/routeSampler/small_input_optimize/routes.tools @@ -1,6 +1,6 @@ - - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - + - + - + - - + + diff --git a/tests/tools/turndefs/routeSampler/totalCount/lower_optimize/output.tools b/tests/tools/turndefs/routeSampler/totalCount/lower_optimize/output.tools index 2ccce3f5c9c1..70c695aa5b68 100644 --- a/tests/tools/turndefs/routeSampler/totalCount/lower_optimize/output.tools +++ b/tests/tools/turndefs/routeSampler/totalCount/lower_optimize/output.tools @@ -1,4 +1,3 @@ Optimization succeeded -Wrote 50 routes (31 distinct) achieving total count 578 (76.96%) at 138 locations. GEH<5 for 57.97% -Warning: underflow locations: count 88, min 1.00 (('-58.121.42', '64')), max 6.00 (('-23', '-23.80.00')), mean 2.01, Q1 1.00, median 2.00, Q3 2.00 (total 177) -Warning: overflow locations: count 4, min -1.00 (('-131', '-131.180.00')), max -1.00 (('-131', '-131.180.00')), mean -1.00, Q1 -1.00, median -1.00, Q3 -1.00 (total -4) +Wrote 50 routes (29 distinct) achieving total count 576 (76.70%) at 138 locations. GEH<5 for 60.14% +Warning: underflow locations: count 87, min 1.00 (('-58.121.42', '64')), max 8.00 (('120', '120.180.00')), mean 2.01, Q1 1.00, median 2.00, Q3 3.00 (total 175) diff --git a/tests/tools/turndefs/routeSampler/totalCount/lower_optimize/routes.tools b/tests/tools/turndefs/routeSampler/totalCount/lower_optimize/routes.tools index e30143a6ed1d..8b71bce13223 100644 --- a/tests/tools/turndefs/routeSampler/totalCount/lower_optimize/routes.tools +++ b/tests/tools/turndefs/routeSampler/totalCount/lower_optimize/routes.tools @@ -1,6 +1,6 @@ -