From 47034c0b242082b8ae96e5a73ed467db13d0af95 Mon Sep 17 00:00:00 2001 From: Siarhei Fedartsou Date: Mon, 27 May 2024 13:04:02 +0200 Subject: [PATCH] wip --- .github/workflows/benchmarks.yml | 78 +++ .github/workflows/osrm-backend.yml | 624 +++++++++--------- include/util/geojson_debug_policies.hpp | 54 ++ include/util/geojson_debug_policy_toolkit.hpp | 111 ++++ src/util/geojson_debug_policies.cpp | 69 ++ 5 files changed, 624 insertions(+), 312 deletions(-) create mode 100644 .github/workflows/benchmarks.yml create mode 100644 include/util/geojson_debug_policies.hpp create mode 100644 include/util/geojson_debug_policy_toolkit.hpp create mode 100644 src/util/geojson_debug_policies.cpp diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml new file mode 100644 index 000000000..ab3c08b8f --- /dev/null +++ b/.github/workflows/benchmarks.yml @@ -0,0 +1,78 @@ +name: osrm-backend benchmarks +on: + pull_request: + branches: + - master + +# permissions: +# pull-requests: write + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number}} + cancel-in-progress: true + +jobs: + benchmarks: + runs-on: ubuntu-22.04 + env: + CCOMPILER: clang-13 + CXXCOMPILER: clang++-13 + CC: clang-13 + CXX: clang++-13 + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + GITHUB_REPOSITORY: ${{ github.repository }} + steps: + - name: Enable compiler cache + uses: actions/cache@v3 + with: + path: ~/.ccache + key: v1-ccache-benchmarks-${{ github.sha }} + restore-keys: | + v1-ccache-benchmarks- + - name: Enable Conan cache + uses: actions/cache@v3 + with: + path: ~/.conan + key: v1-conan-benchmarks-${{ github.sha }} + restore-keys: | + v1-conan-benchmarks- + - name: Checkout PR Branch + uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + path: pr + - run: python3 -m pip install "conan<2.0.0" "requests==2.31.0" + - name: Build PR Branch + run: | + mkdir -p pr/build + cd pr/build + cmake -DENABLE_CONAN=ON -DCMAKE_BUILD_TYPE=Release .. + make -j$(nproc) + make -j$(nproc) benchmarks + cd .. + make -C test/data + - name: Checkout Base Branch + uses: actions/checkout@v3 + with: + ref: master + path: master + - name: Build Base Branch + run: | + mkdir master/build + cd master/build + cmake -DENABLE_CONAN=ON -DCMAKE_BUILD_TYPE=Release .. + make -j$(nproc) + make -j$(nproc) benchmarks + cd .. + make -C test/data + - name: Run Benchmarks + run: | + ./pr/scripts/ci/run_benchmarks.sh base pr + - name: Compare Benchmarks + run: | + cat pr_results/match_mld.bench + cat master_results/match_mld.bench + - name: Post Benchmark Results + run: | + python3 pr/scripts/ci/post_benchmark_results.py master_results pr_results diff --git a/.github/workflows/osrm-backend.yml b/.github/workflows/osrm-backend.yml index 8e4495374..f4b604a34 100644 --- a/.github/workflows/osrm-backend.yml +++ b/.github/workflows/osrm-backend.yml @@ -24,226 +24,226 @@ concurrency: cancel-in-progress: true jobs: - windows-release-node: - needs: format-taginfo-docs - runs-on: windows-2022 - continue-on-error: false - env: - BUILD_TYPE: Release - steps: - - uses: actions/checkout@v4 - - run: pip install "conan<2.0.0" - - run: conan --version - - run: cmake --version - - uses: actions/setup-node@v4 - with: - node-version: 18 - - run: node --version - - run: npm --version - - name: Prepare environment - shell: bash - run: | - PACKAGE_JSON_VERSION=$(node -e "console.log(require('./package.json').version)") - echo PUBLISH=$([[ "${GITHUB_REF:-}" == "refs/tags/v${PACKAGE_JSON_VERSION}" ]] && echo "On" || echo "Off") >> $GITHUB_ENV - - run: npm install --ignore-scripts - - run: npm link --ignore-scripts - - uses: microsoft/setup-msbuild@v2 - - name: Build - run: | - .\scripts\ci\windows-build.bat - - name: Run node tests - shell: bash - run: | - ./lib/binding/osrm-datastore.exe test/data/ch/monaco.osrm - node test/nodejs/index.js - - name: Build Node package - shell: bash - run: ./scripts/ci/node_package.sh - - name: Publish Node package - if: ${{ env.PUBLISH == 'On' }} - uses: ncipollo/release-action@v1 - with: - allowUpdates: true - artifactErrorsFailBuild: true - artifacts: build/stage/**/*.tar.gz - omitBody: true - omitBodyDuringUpdate: true - omitName: true - omitNameDuringUpdate: true - replacesArtifacts: true - token: ${{ secrets.GITHUB_TOKEN }} + # windows-release-node: + # needs: format-taginfo-docs + # runs-on: windows-2022 + # continue-on-error: false + # env: + # BUILD_TYPE: Release + # steps: + # - uses: actions/checkout@v4 + # - run: pip install "conan<2.0.0" + # - run: conan --version + # - run: cmake --version + # - uses: actions/setup-node@v4 + # with: + # node-version: 18 + # - run: node --version + # - run: npm --version + # - name: Prepare environment + # shell: bash + # run: | + # PACKAGE_JSON_VERSION=$(node -e "console.log(require('./package.json').version)") + # echo PUBLISH=$([[ "${GITHUB_REF:-}" == "refs/tags/v${PACKAGE_JSON_VERSION}" ]] && echo "On" || echo "Off") >> $GITHUB_ENV + # - run: npm install --ignore-scripts + # - run: npm link --ignore-scripts + # - uses: microsoft/setup-msbuild@v2 + # - name: Build + # run: | + # .\scripts\ci\windows-build.bat + # - name: Run node tests + # shell: bash + # run: | + # ./lib/binding/osrm-datastore.exe test/data/ch/monaco.osrm + # node test/nodejs/index.js + # - name: Build Node package + # shell: bash + # run: ./scripts/ci/node_package.sh + # - name: Publish Node package + # if: ${{ env.PUBLISH == 'On' }} + # uses: ncipollo/release-action@v1 + # with: + # allowUpdates: true + # artifactErrorsFailBuild: true + # artifacts: build/stage/**/*.tar.gz + # omitBody: true + # omitBodyDuringUpdate: true + # omitName: true + # omitNameDuringUpdate: true + # replacesArtifacts: true + # token: ${{ secrets.GITHUB_TOKEN }} - format-taginfo-docs: - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v4 - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: 18 - - name: Enable Node.js cache - uses: actions/cache@v4 - with: - path: ~/.npm - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - name: Prepare environment - run: | - npm ci --ignore-scripts - clang-format-15 --version - - name: Run checks - run: | - ./scripts/check_taginfo.py taginfo.json profiles/car.lua - ./scripts/format.sh && ./scripts/error_on_dirty.sh - node ./scripts/validate_changelog.js - npm run docs && ./scripts/error_on_dirty.sh - npm audit --production + # format-taginfo-docs: + # runs-on: ubuntu-22.04 + # steps: + # - uses: actions/checkout@v4 + # - name: Use Node.js + # uses: actions/setup-node@v4 + # with: + # node-version: 18 + # - name: Enable Node.js cache + # uses: actions/cache@v4 + # with: + # path: ~/.npm + # key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + # restore-keys: | + # ${{ runner.os }}-node- + # - name: Prepare environment + # run: | + # npm ci --ignore-scripts + # clang-format-15 --version + # - name: Run checks + # run: | + # ./scripts/check_taginfo.py taginfo.json profiles/car.lua + # ./scripts/format.sh && ./scripts/error_on_dirty.sh + # node ./scripts/validate_changelog.js + # npm run docs && ./scripts/error_on_dirty.sh + # npm audit --production - docker-image: - needs: format-taginfo-docs - runs-on: ubuntu-22.04 - continue-on-error: false - steps: - - name: Check out the repo - uses: actions/checkout@v4 - - name: Enable osm.pbf cache - uses: actions/cache@v4 - with: - path: berlin-latest.osm.pbf - key: v1-berlin-osm-pbf - restore-keys: | - v1-berlin-osm-pbf - - name: Docker build - run: | - docker build -t osrm-backend-local -f docker/Dockerfile . - - name: Test Docker image - run: | - if [ ! -f "${PWD}/berlin-latest.osm.pbf" ]; then - wget http://download.geofabrik.de/europe/germany/berlin-latest.osm.pbf - fi - TAG=osrm-backend-local - # when `--memory-swap` value equals `--memory` it means container won't use swap - # see https://docs.docker.com/config/containers/resource_constraints/#--memory-swap-details - MEMORY_ARGS="--memory=1g --memory-swap=1g" - docker run $MEMORY_ARGS -t -v "${PWD}:/data" "${TAG}" osrm-extract --dump-nbg-graph -p /opt/car.lua /data/berlin-latest.osm.pbf - docker run $MEMORY_ARGS -t -v "${PWD}:/data" "${TAG}" osrm-components /data/berlin-latest.osrm.nbg /data/berlin-latest.geojson - if [ ! -s "${PWD}/berlin-latest.geojson" ] - then - >&2 echo "No berlin-latest.geojson found" - exit 1 - fi + # docker-image: + # needs: format-taginfo-docs + # runs-on: ubuntu-22.04 + # continue-on-error: false + # steps: + # - name: Check out the repo + # uses: actions/checkout@v4 + # - name: Enable osm.pbf cache + # uses: actions/cache@v4 + # with: + # path: berlin-latest.osm.pbf + # key: v1-berlin-osm-pbf + # restore-keys: | + # v1-berlin-osm-pbf + # - name: Docker build + # run: | + # docker build -t osrm-backend-local -f docker/Dockerfile . + # - name: Test Docker image + # run: | + # if [ ! -f "${PWD}/berlin-latest.osm.pbf" ]; then + # wget http://download.geofabrik.de/europe/germany/berlin-latest.osm.pbf + # fi + # TAG=osrm-backend-local + # # when `--memory-swap` value equals `--memory` it means container won't use swap + # # see https://docs.docker.com/config/containers/resource_constraints/#--memory-swap-details + # MEMORY_ARGS="--memory=1g --memory-swap=1g" + # docker run $MEMORY_ARGS -t -v "${PWD}:/data" "${TAG}" osrm-extract --dump-nbg-graph -p /opt/car.lua /data/berlin-latest.osm.pbf + # docker run $MEMORY_ARGS -t -v "${PWD}:/data" "${TAG}" osrm-components /data/berlin-latest.osrm.nbg /data/berlin-latest.geojson + # if [ ! -s "${PWD}/berlin-latest.geojson" ] + # then + # >&2 echo "No berlin-latest.geojson found" + # exit 1 + # fi - # removing `.osrm.nbg` to check that whole pipeline works without it - rm -rf "${PWD}/berlin-latest.osrm.nbg" + # # removing `.osrm.nbg` to check that whole pipeline works without it + # rm -rf "${PWD}/berlin-latest.osrm.nbg" - docker run $MEMORY_ARGS -t -v "${PWD}:/data" "${TAG}" osrm-partition /data/berlin-latest.osrm - docker run $MEMORY_ARGS -t -v "${PWD}:/data" "${TAG}" osrm-customize /data/berlin-latest.osrm - docker run $MEMORY_ARGS --name=osrm-container -t -p 5000:5000 -v "${PWD}:/data" "${TAG}" osrm-routed --algorithm mld /data/berlin-latest.osrm & - curl --retry-delay 3 --retry 10 --retry-all-errors "http://127.0.0.1:5000/route/v1/driving/13.388860,52.517037;13.385983,52.496891?steps=true" - docker stop osrm-container + # docker run $MEMORY_ARGS -t -v "${PWD}:/data" "${TAG}" osrm-partition /data/berlin-latest.osrm + # docker run $MEMORY_ARGS -t -v "${PWD}:/data" "${TAG}" osrm-customize /data/berlin-latest.osrm + # docker run $MEMORY_ARGS --name=osrm-container -t -p 5000:5000 -v "${PWD}:/data" "${TAG}" osrm-routed --algorithm mld /data/berlin-latest.osrm & + # curl --retry-delay 3 --retry 10 --retry-all-errors "http://127.0.0.1:5000/route/v1/driving/13.388860,52.517037;13.385983,52.496891?steps=true" + # docker stop osrm-container build-test-publish: - needs: format-taginfo-docs + # needs: format-taginfo-docs strategy: matrix: include: - - name: gcc-13-debug-cov - continue-on-error: false - node: 20 - runs-on: ubuntu-24.04 - BUILD_TOOLS: ON - BUILD_TYPE: Debug - CCOMPILER: gcc-13 - CUCUMBER_TIMEOUT: 20000 - CXXCOMPILER: g++-13 - ENABLE_COVERAGE: ON + # - name: gcc-13-debug-cov + # continue-on-error: false + # node: 20 + # runs-on: ubuntu-24.04 + # BUILD_TOOLS: ON + # BUILD_TYPE: Debug + # CCOMPILER: gcc-13 + # CUCUMBER_TIMEOUT: 20000 + # CXXCOMPILER: g++-13 + # ENABLE_COVERAGE: ON - - name: clang-15-debug-asan-ubsan - continue-on-error: false - node: 20 - runs-on: ubuntu-22.04 - BUILD_TOOLS: ON - BUILD_TYPE: Debug - CCOMPILER: clang-15 - CUCUMBER_TIMEOUT: 20000 - CXXCOMPILER: clang++-15 - ENABLE_SANITIZER: ON - TARGET_ARCH: x86_64-asan-ubsan - OSRM_CONNECTION_RETRIES: 10 - OSRM_CONNECTION_EXP_BACKOFF_COEF: 1.5 + # - name: clang-15-debug-asan-ubsan + # continue-on-error: false + # node: 20 + # runs-on: ubuntu-22.04 + # BUILD_TOOLS: ON + # BUILD_TYPE: Debug + # CCOMPILER: clang-15 + # CUCUMBER_TIMEOUT: 20000 + # CXXCOMPILER: clang++-15 + # ENABLE_SANITIZER: ON + # TARGET_ARCH: x86_64-asan-ubsan + # OSRM_CONNECTION_RETRIES: 10 + # OSRM_CONNECTION_EXP_BACKOFF_COEF: 1.5 - - name: clang-15-release - continue-on-error: false - node: 18 - runs-on: ubuntu-22.04 - BUILD_TOOLS: ON - BUILD_TYPE: Release - CCOMPILER: clang-15 - CXXCOMPILER: clang++-15 - CUCUMBER_TIMEOUT: 60000 + # - name: clang-15-release + # continue-on-error: false + # node: 18 + # runs-on: ubuntu-22.04 + # BUILD_TOOLS: ON + # BUILD_TYPE: Release + # CCOMPILER: clang-15 + # CXXCOMPILER: clang++-15 + # CUCUMBER_TIMEOUT: 60000 - - name: clang-15-debug - continue-on-error: false - node: 18 - runs-on: ubuntu-22.04 - BUILD_TOOLS: ON - BUILD_TYPE: Debug - CCOMPILER: clang-15 - CXXCOMPILER: clang++-15 - CUCUMBER_TIMEOUT: 60000 + # - name: clang-15-debug + # continue-on-error: false + # node: 18 + # runs-on: ubuntu-22.04 + # BUILD_TOOLS: ON + # BUILD_TYPE: Debug + # CCOMPILER: clang-15 + # CXXCOMPILER: clang++-15 + # CUCUMBER_TIMEOUT: 60000 - - name: clang-15-debug-clang-tidy - continue-on-error: false - node: 18 - runs-on: ubuntu-22.04 - BUILD_TOOLS: ON - BUILD_TYPE: Debug - CCOMPILER: clang-15 - CXXCOMPILER: clang++-15 - CUCUMBER_TIMEOUT: 60000 - ENABLE_CLANG_TIDY: ON + # - name: clang-15-debug-clang-tidy + # continue-on-error: false + # node: 18 + # runs-on: ubuntu-22.04 + # BUILD_TOOLS: ON + # BUILD_TYPE: Debug + # CCOMPILER: clang-15 + # CXXCOMPILER: clang++-15 + # CUCUMBER_TIMEOUT: 60000 + # ENABLE_CLANG_TIDY: ON - - name: clang-14-release - continue-on-error: false - node: 18 - runs-on: ubuntu-22.04 - BUILD_TOOLS: ON - BUILD_TYPE: Release - CCOMPILER: clang-14 - CXXCOMPILER: clang++-14 - CUCUMBER_TIMEOUT: 60000 + # - name: clang-14-release + # continue-on-error: false + # node: 18 + # runs-on: ubuntu-22.04 + # BUILD_TOOLS: ON + # BUILD_TYPE: Release + # CCOMPILER: clang-14 + # CXXCOMPILER: clang++-14 + # CUCUMBER_TIMEOUT: 60000 - - name: clang-13-release - continue-on-error: false - node: 18 - runs-on: ubuntu-22.04 - BUILD_TOOLS: ON - BUILD_TYPE: Release - CCOMPILER: clang-13 - CXXCOMPILER: clang++-13 - CUCUMBER_TIMEOUT: 60000 + # - name: clang-13-release + # continue-on-error: false + # node: 18 + # runs-on: ubuntu-22.04 + # BUILD_TOOLS: ON + # BUILD_TYPE: Release + # CCOMPILER: clang-13 + # CXXCOMPILER: clang++-13 + # CUCUMBER_TIMEOUT: 60000 - - name: conan-linux-debug-asan-ubsan - continue-on-error: false - node: 18 - runs-on: ubuntu-22.04 - BUILD_TOOLS: ON - BUILD_TYPE: Release - CCOMPILER: clang-15 - CXXCOMPILER: clang++-15 - ENABLE_CONAN: ON - ENABLE_SANITIZER: ON + # - name: conan-linux-debug-asan-ubsan + # continue-on-error: false + # node: 18 + # runs-on: ubuntu-22.04 + # BUILD_TOOLS: ON + # BUILD_TYPE: Release + # CCOMPILER: clang-15 + # CXXCOMPILER: clang++-15 + # ENABLE_CONAN: ON + # ENABLE_SANITIZER: ON - - name: conan-linux-release - continue-on-error: false - node: 18 - runs-on: ubuntu-22.04 - BUILD_TOOLS: ON - BUILD_TYPE: Release - CCOMPILER: clang-15 - CXXCOMPILER: clang++-15 - ENABLE_CONAN: ON + # - name: conan-linux-release + # continue-on-error: false + # node: 18 + # runs-on: ubuntu-22.04 + # BUILD_TOOLS: ON + # BUILD_TYPE: Release + # CCOMPILER: clang-15 + # CXXCOMPILER: clang++-15 + # ENABLE_CONAN: ON - name: gcc-14-release continue-on-error: false @@ -284,51 +284,51 @@ jobs: # CCOMPILER: gcc-11 # CXXCOMPILER: g++-11 - - name: conan-linux-release-node - build_node_package: true - continue-on-error: false - node: 20 - runs-on: ubuntu-22.04 - BUILD_TYPE: Release - CCOMPILER: clang-13 - CXXCOMPILER: clang++-13 - ENABLE_CONAN: ON - NODE_PACKAGE_TESTS_ONLY: ON + # - name: conan-linux-release-node + # build_node_package: true + # continue-on-error: false + # node: 20 + # runs-on: ubuntu-22.04 + # BUILD_TYPE: Release + # CCOMPILER: clang-13 + # CXXCOMPILER: clang++-13 + # ENABLE_CONAN: ON + # NODE_PACKAGE_TESTS_ONLY: ON - - name: conan-linux-debug-node - build_node_package: true - continue-on-error: false - node: 20 - runs-on: ubuntu-22.04 - BUILD_TYPE: Debug - CCOMPILER: clang-13 - CXXCOMPILER: clang++-13 - ENABLE_CONAN: ON - NODE_PACKAGE_TESTS_ONLY: ON + # - name: conan-linux-debug-node + # build_node_package: true + # continue-on-error: false + # node: 20 + # runs-on: ubuntu-22.04 + # BUILD_TYPE: Debug + # CCOMPILER: clang-13 + # CXXCOMPILER: clang++-13 + # ENABLE_CONAN: ON + # NODE_PACKAGE_TESTS_ONLY: ON - - name: conan-macos-x64-release-node - build_node_package: true - continue-on-error: true - node: 20 - runs-on: macos-13 # x86_64 - BUILD_TYPE: Release - CCOMPILER: clang - CXXCOMPILER: clang++ - CUCUMBER_TIMEOUT: 60000 - ENABLE_ASSERTIONS: ON - ENABLE_CONAN: ON + # - name: conan-macos-x64-release-node + # build_node_package: true + # continue-on-error: true + # node: 20 + # runs-on: macos-13 # x86_64 + # BUILD_TYPE: Release + # CCOMPILER: clang + # CXXCOMPILER: clang++ + # CUCUMBER_TIMEOUT: 60000 + # ENABLE_ASSERTIONS: ON + # ENABLE_CONAN: ON - - name: conan-macos-arm64-release-node - build_node_package: true - continue-on-error: true - node: 20 - runs-on: macos-14 # arm64 - BUILD_TYPE: Release - CCOMPILER: clang - CXXCOMPILER: clang++ - CUCUMBER_TIMEOUT: 60000 - ENABLE_ASSERTIONS: ON - ENABLE_CONAN: ON + # - name: conan-macos-arm64-release-node + # build_node_package: true + # continue-on-error: true + # node: 20 + # runs-on: macos-14 # arm64 + # BUILD_TYPE: Release + # CCOMPILER: clang + # CXXCOMPILER: clang++ + # CUCUMBER_TIMEOUT: 60000 + # ENABLE_ASSERTIONS: ON + # ENABLE_CONAN: ON name: ${{ matrix.name}} continue-on-error: ${{ matrix.continue-on-error }} @@ -620,71 +620,71 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} - benchmarks: - if: github.event_name == 'pull_request' - needs: [format-taginfo-docs] - runs-on: ubuntu-22.04 - env: - CCOMPILER: clang-13 - CXXCOMPILER: clang++-13 - CC: clang-13 - CXX: clang++-13 - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PR_NUMBER: ${{ github.event.pull_request.number }} - GITHUB_REPOSITORY: ${{ github.repository }} - steps: - - name: Enable compiler cache - uses: actions/cache@v4 - with: - path: ~/.ccache - key: v1-ccache-benchmarks-${{ github.sha }} - restore-keys: | - v1-ccache-benchmarks- - - name: Enable Conan cache - uses: actions/cache@v4 - with: - path: ~/.conan - key: v1-conan-benchmarks-${{ github.sha }} - restore-keys: | - v1-conan-benchmarks- - - name: Checkout PR Branch - uses: actions/checkout@v4 - with: - ref: ${{ github.head_ref }} - path: pr - - run: python3 -m pip install "conan<2.0.0" "requests==2.31.0" - - name: Build PR Branch - run: | - mkdir -p pr/build - cd pr/build - cmake -DENABLE_CONAN=ON -DCMAKE_BUILD_TYPE=Release .. - make -j$(nproc) - make -j$(nproc) benchmarks - cd .. - make -C test/data - - name: Checkout Base Branch - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.base.ref }} - path: base - - name: Build Base Branch - run: | - mkdir base/build - cd base/build - cmake -DENABLE_CONAN=ON -DCMAKE_BUILD_TYPE=Release .. - make -j$(nproc) - make -j$(nproc) benchmarks - cd .. - make -C test/data - - name: Run Benchmarks - run: | - ./pr/scripts/ci/run_benchmarks.sh base pr - - name: Post Benchmark Results - run: | - python3 pr/scripts/ci/post_benchmark_results.py base_results pr_results + # benchmarks: + # if: github.event_name == 'pull_request' + # needs: [format-taginfo-docs] + # runs-on: ubuntu-22.04 + # env: + # CCOMPILER: clang-13 + # CXXCOMPILER: clang++-13 + # CC: clang-13 + # CXX: clang++-13 + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # PR_NUMBER: ${{ github.event.pull_request.number }} + # GITHUB_REPOSITORY: ${{ github.repository }} + # steps: + # - name: Enable compiler cache + # uses: actions/cache@v4 + # with: + # path: ~/.ccache + # key: v1-ccache-benchmarks-${{ github.sha }} + # restore-keys: | + # v1-ccache-benchmarks- + # - name: Enable Conan cache + # uses: actions/cache@v4 + # with: + # path: ~/.conan + # key: v1-conan-benchmarks-${{ github.sha }} + # restore-keys: | + # v1-conan-benchmarks- + # - name: Checkout PR Branch + # uses: actions/checkout@v4 + # with: + # ref: ${{ github.head_ref }} + # path: pr + # - run: python3 -m pip install "conan<2.0.0" "requests==2.31.0" + # - name: Build PR Branch + # run: | + # mkdir -p pr/build + # cd pr/build + # cmake -DENABLE_CONAN=ON -DCMAKE_BUILD_TYPE=Release .. + # make -j$(nproc) + # make -j$(nproc) benchmarks + # cd .. + # make -C test/data + # - name: Checkout Base Branch + # uses: actions/checkout@v4 + # with: + # ref: ${{ github.event.pull_request.base.ref }} + # path: base + # - name: Build Base Branch + # run: | + # mkdir base/build + # cd base/build + # cmake -DENABLE_CONAN=ON -DCMAKE_BUILD_TYPE=Release .. + # make -j$(nproc) + # make -j$(nproc) benchmarks + # cd .. + # make -C test/data + # - name: Run Benchmarks + # run: | + # ./pr/scripts/ci/run_benchmarks.sh base pr + # - name: Post Benchmark Results + # run: | + # python3 pr/scripts/ci/post_benchmark_results.py base_results pr_results - ci-complete: - runs-on: ubuntu-22.04 - needs: [build-test-publish, docker-image, windows-release-node, benchmarks] - steps: - - run: echo "CI complete" + # ci-complete: + # runs-on: ubuntu-22.04 + # needs: [build-test-publish, docker-image, windows-release-node, benchmarks] + # steps: + # - run: echo "CI complete" diff --git a/include/util/geojson_debug_policies.hpp b/include/util/geojson_debug_policies.hpp new file mode 100644 index 000000000..8e81bb474 --- /dev/null +++ b/include/util/geojson_debug_policies.hpp @@ -0,0 +1,54 @@ +#ifndef OSRM_GEOJSON_DEBUG_POLICIES +#define OSRM_GEOJSON_DEBUG_POLICIES + +#include +#include + +#include "extractor/query_node.hpp" +#include "util/coordinate.hpp" +#include "util/json_container.hpp" +#include "util/node_based_graph.hpp" +#include "util/typedefs.hpp" + +namespace osrm::util +{ + +struct NodeIdVectorToLineString +{ + NodeIdVectorToLineString(const std::vector &node_coordinates); + + // converts a vector of node ids into a linestring geojson feature + util::json::Object operator()(const std::vector &node_ids, + const std::optional &properties = {}) const; + + const std::vector &node_coordinates; +}; + +struct CoordinateVectorToLineString +{ + // converts a vector of node ids into a linestring geojson feature + util::json::Object operator()(const std::vector &coordinates, + const std::optional &properties = {}) const; +}; + +struct NodeIdVectorToMultiPoint +{ + NodeIdVectorToMultiPoint(const std::vector &node_coordinates); + + // converts a vector of node ids into a linestring geojson feature + util::json::Object operator()(const std::vector &node_ids, + const std::optional &properties = {}) const; + + const std::vector &node_coordinates; +}; + +struct CoordinateVectorToMultiPoint +{ + // converts a vector of node ids into a linestring geojson feature + util::json::Object operator()(const std::vector &coordinates, + const std::optional &properties = {}) const; +}; + +} // namespace osrm::util + +#endif /* OSRM_GEOJSON_DEBUG_POLICIES */ \ No newline at end of file diff --git a/include/util/geojson_debug_policy_toolkit.hpp b/include/util/geojson_debug_policy_toolkit.hpp new file mode 100644 index 000000000..8d2bef58f --- /dev/null +++ b/include/util/geojson_debug_policy_toolkit.hpp @@ -0,0 +1,111 @@ +#ifndef OSRM_GEOJSON_DEBUG_POLICY_TOOLKIT_HPP +#define OSRM_GEOJSON_DEBUG_POLICY_TOOLKIT_HPP + +#include "extractor/query_node.hpp" +#include "util/coordinate.hpp" +#include "util/json_container.hpp" + +#include +#include +#include + +namespace osrm::util +{ + +enum GeojsonStyleSize +{ + tiny, + small, + medium, + large, + extra_large, + num_styles +}; + +enum GeojsonStyleColors +{ + red, + purple, + blue, + green, + yellow, + cyan, + brown, + pink, + num_colors +}; + +const constexpr char *geojson_debug_predifined_colors[GeojsonStyleColors::num_colors] = { + "#FF4848", "#800080", "#5757FF", "#1FCB4A", "#FFE920", "#29AFD6", "#B05F3C", "#FE67EB"}; + +const constexpr double geojson_predefined_sizes[GeojsonStyleSize::num_styles] = { + 2.0, 3.5, 5.0, 6.5, 8}; + +inline util::json::Object makeStyle(const GeojsonStyleSize size_type, + const GeojsonStyleColors predefined_color) +{ + util::json::Object style; + // style everything, since we don't know the feature type + style.values["stroke"] = geojson_debug_predifined_colors[predefined_color]; + style.values["circle-color"] = geojson_debug_predifined_colors[predefined_color]; + style.values["line-width"] = geojson_predefined_sizes[size_type]; + style.values["circle-radius"] = geojson_predefined_sizes[size_type]; + return style; +} + +struct CoordinateToJsonArray +{ + util::json::Value operator()(const util::Coordinate coordinate) + { + util::json::Array json_coordinate; + json_coordinate.values.push_back(static_cast(toFloating(coordinate.lon))); + json_coordinate.values.push_back(static_cast(toFloating(coordinate.lat))); + return util::json::Value{json_coordinate}; + } +}; + +struct NodeIdToCoordinate +{ + NodeIdToCoordinate(const std::vector &node_coordinates) + : node_coordinates(node_coordinates) + { + } + + const std::vector &node_coordinates; + + util::json::Value operator()(const NodeID nid) + { + auto coordinate = node_coordinates[nid]; + CoordinateToJsonArray converter; + return converter(coordinate); + } +}; + +inline util::json::Object makeFeature(std::string type, + util::json::Array coordinates, + const std::optional &properties = {}) +{ + util::json::Object result; + result.values["type"] = "Feature"; + result.values["properties"] = properties ? *properties : util::json::Object(); + util::json::Object geometry; + geometry.values["type"] = std::move(type); + geometry.values["properties"] = util::json::Object(); + geometry.values["coordinates"] = std::move(coordinates); + result.values["geometry"] = geometry; + + return result; +} + +inline util::json::Array makeJsonArray(const std::vector &input_coordinates) +{ + util::json::Array coordinates; + std::transform(input_coordinates.begin(), + input_coordinates.end(), + std::back_inserter(coordinates.values), + CoordinateToJsonArray()); + return coordinates; +} +} // namespace osrm::util + +#endif /* OSRM_GEOJSON_DEBUG_POLICY_TOOLKIT_HPP */ \ No newline at end of file diff --git a/src/util/geojson_debug_policies.cpp b/src/util/geojson_debug_policies.cpp new file mode 100644 index 000000000..fda25819c --- /dev/null +++ b/src/util/geojson_debug_policies.cpp @@ -0,0 +1,69 @@ +#include "util/geojson_debug_policies.hpp" +#include "util/coordinate.hpp" +#include "util/geojson_debug_policy_toolkit.hpp" + +#include + +namespace osrm::util +{ + +//---------------------------------------------------------------- +NodeIdVectorToLineString::NodeIdVectorToLineString( + const std::vector &node_coordinates) + : node_coordinates(node_coordinates) +{ +} + +// converts a vector of node ids into a linestring geojson feature +util::json::Object +NodeIdVectorToLineString::operator()(const std::vector &node_ids, + const std::optional &properties) const +{ + util::json::Array coordinates; + std::transform(node_ids.begin(), + node_ids.end(), + std::back_inserter(coordinates.values), + NodeIdToCoordinate(node_coordinates)); + + return makeFeature("LineString", std::move(coordinates), properties); +} + +//---------------------------------------------------------------- +NodeIdVectorToMultiPoint::NodeIdVectorToMultiPoint( + const std::vector &node_coordinates) + : node_coordinates(node_coordinates) +{ +} + +util::json::Object +NodeIdVectorToMultiPoint::operator()(const std::vector &node_ids, + const std::optional &properties) const +{ + util::json::Array coordinates; + std::transform(node_ids.begin(), + node_ids.end(), + std::back_inserter(coordinates.values), + NodeIdToCoordinate(node_coordinates)); + + return makeFeature("MultiPoint", std::move(coordinates), properties); +} + +//---------------------------------------------------------------- +util::json::Object +CoordinateVectorToMultiPoint::operator()(const std::vector &input_coordinates, + const std::optional &properties) const +{ + auto coordinates = makeJsonArray(input_coordinates); + return makeFeature("MultiPoint", std::move(coordinates), properties); +} + +//---------------------------------------------------------------- +util::json::Object +CoordinateVectorToLineString::operator()(const std::vector &input_coordinates, + const std::optional &properties) const +{ + auto coordinates = makeJsonArray(input_coordinates); + return makeFeature("LineString", std::move(coordinates), properties); +} + +} // namespace osrm::util \ No newline at end of file