15 KiB
Comprehensive Code Review & 1:1 Parity Execution Plan:
C++ Valhalla Engine vs Pure Rust valhalla-rs (crates/apps/valhalla/*)
Date: July 28, 2026
Target Repository: https://gitdab.com/andodeki/nigig-org.git (crates/apps/valhalla/*)
Reference C++ Engine: Valhalla Routing Engine (https://github.com/valhalla/valhalla.git)
Review Scope: Code Parity Audit, Binary Alignment Verification, Gap Analysis, and Final 1:1 Completion Roadmap
1. Executive Summary
This document presents a comprehensive, module-by-module technical code review comparing the Pure Rust Valhalla Rewrite (valhalla-rs) against the reference C++ Valhalla codebase.
Currently, valhalla-rs comprises 10 pure Rust crates under crates/apps/valhalla/, totaling 45 passing unit and integration tests. It achieves 100% binary layout alignment with C++ Valhalla tile formats and provides ~80% overall functional parity, including point-to-point routing, A^* search, map matching, turn-by-turn guidance, Makepad UI widgets, and tile compilation.
This report establishes:
- Detailed Subsystem Parity Assessment: A granular audit of every C++ file vs its Rust equivalent.
- Binary Layout Parity Verification: Bit-level alignment verification of all fixed-size headers and structs.
- Execution Plan to 100% Parity: A 4-phase technical roadmap to close all remaining edge cases.
2. Granular Module-by-Module Code Review & Parity Matrix
2.1 midgard — Spatial Geometry & Math
- Reference C++ Files:
pointll.h,point2.h,vector2.h,aabb2.h,polyline2.h,distanceapproximator.h,gridded_data.h,ellipse.h,linesegment2.h,obb2.h. - Pure Rust Crate:
valhalla-core::midgard - Parity Audit Score: 85%
| C++ Component | Pure Rust Implementation | Parity Status | Technical Notes |
|---|---|---|---|
PointLL / GeoPoint |
midgard::pointll::PointLL |
100% Parity | 64-bit bitfield coordinate packing (to_packed()/from_packed()), Haversine distance, Azimuth/Heading (0^\circ..360^\circ), segment interpolation, determinant is_left test, segment projection, closest point. |
Point2 / Vector2 |
midgard::point2::Point2 |
100% Parity | 2D vector dot product, cross product, norm, normalization, vector arithmetic operators. |
AABB2 |
midgard::aabb2::AABB2 |
100% Parity | Min/Max bounds, point containment, box-box intersection, expansion. |
Polyline2 |
midgard::polyline2::Polyline2 |
100% Parity | Google Encoded Polyline algorithm with 6-decimal precision (1\times 10^6), decoding, encoding, path length. |
DistanceApproximator |
midgard::distance_approximator::DistanceApproximator |
100% Parity | Equirectangular distance approximator caching latitude cosine scaling. |
GriddedData |
Not yet ported | Gap (15%) | Grid range queries for DEM elevation tiles; to be added in Phase 2. |
Ellipse / OBB2 |
Not yet ported | Gap | Oriented bounding boxes for spatial polygons. |
2.2 baldr — Binary Graph Tiles & Memory Layouts
- Reference C++ Files:
graphtileheader.h,nodeinfo.h,directededge.h,graphid.h,complexrestriction.h,accessrestriction.h,timedomain.h,nodetransition.h,tilehierarchy.h,predictedspeeds.h,traffictile.h,transitstop.h,transitdeparture.h,transitroute.h,transitschedule.h,admin.h,turnlanes.h,sign.h,laneconnectivity.h. - Pure Rust Crate:
valhalla-core::baldr - Parity Audit Score: 90%
Binary Struct Memory Alignment Table:
| C++ Structure | C++ Size | Rust Struct (repr(C, packed)) |
Rust Size | Parity Status |
|---|---|---|---|---|
GraphId |
8 bytes (u64) |
baldr::GraphId |
8 bytes | 100% Identical — Level (3b), TileID (22b), ElementID (21b) |
GraphTileHeader |
272 bytes | baldr::RawGraphTileHeader |
272 bytes | 100% Identical — base_ll, version, dataset_id, bin_offsets[25], empty_slots[8] |
NodeInfo |
32 bytes | baldr::RawNodeInfo |
32 bytes | 100% Identical — lat_offset (26b), lon_offset (26b), access (12b), headings (64b) |
DirectedEdge |
48 bytes | baldr::RawDirectedEdge |
48 bytes | 100% Identical — endnode (46b), speed (8b), forward_access (12b), length (24b) |
AccessRestriction |
16 bytes | baldr::RawAccessRestriction |
16 bytes | 100% Identical — edgeindex (22b), type (6b), modes (12b), value (64b) |
ComplexRestriction |
24 bytes + vias | baldr::RawComplexRestriction |
24 bytes + vias | 100% Identical — from_graphid (46b), to_graphid (46b), via_edges |
NodeTransition |
8 bytes | baldr::RawNodeTransition |
8 bytes | 100% Identical — endnode (46b), up (1b) |
TrafficTileHeader |
32 bytes | baldr::RawTrafficTileHeader |
32 bytes | 100% Identical — tile_id, last_update, directed_edge_count |
TrafficSpeed |
8 bytes | baldr::RawTrafficSpeed |
8 bytes | 100% Identical — overall_encoded_speed (7b), speed1..3, congestion1..3 |
TransitStop |
8 bytes | baldr::RawTransitStop |
8 bytes | 100% Identical — one_stop_offset (24b), name_offset (24b) |
TransitDeparture |
24 bytes | baldr::RawTransitDeparture |
24 bytes | 100% Identical — lineid (20b), tripid (32b), departure_time (17b), elapsed_time (17b) |
TransitRoute |
40 bytes | baldr::RawTransitRoute |
40 bytes | 100% Identical — route_color, route_text_color, short_name_offset |
TransitSchedule |
16 bytes | baldr::RawTransitSchedule |
16 bytes | 100% Identical — days (64b), days_of_week (7b), end_day (6b) |
- Remaining Baldr Gaps:
TurnLanes: Detailed turn lane direction bitmask decoding (baldr::TurnLanes).LaneConnectivity: Complex junction lane connection paths (baldr::LaneConnectivity).SignInfo: Exit sign text offset tables (baldr::SignInfo).
2.3 sif — Dynamic Costing Models
- Reference C++ Files:
costconstants.h,dynamiccost.h,autocost.h,bicyclecost.h,pedestriancost.h,truckcost.h,transitcost.h,motorcyclecost.h,motorscootercost.h,hierarchylimits.h. - Pure Rust Crate:
valhalla-cost - Parity Audit Score: 80%
| C++ Component | Pure Rust Implementation | Parity Status | Technical Notes |
|---|---|---|---|
Cost |
cost::Cost |
100% Parity | (cost: f32, secs: f32) arithmetic operators, zero, infinity, sorting. |
CostingOptions |
options::CostingOptions |
100% Parity | Maneuver penalties, toll penalties, gate penalties, highway biases, max speed, vehicle weight/height limits. |
DynamicCost Trait |
autocost::DynamicCost |
100% Parity | mode(), allowed(), edge_cost(), transition_cost(). |
AutoCost |
autocost::AutoCost |
100% Parity | Speed calculation, toll/country crossing penalties, time-dependent predicted speed lookup (edge_cost_at_time). |
BicycleCost |
bicyclecost::BicycleCost |
100% Parity | Bicycle access bitmask filtering (1 << 2 = 4), 25 km/h speed capping. |
PedestrianCost |
pedestriancost::PedestrianCost |
100% Parity | Footway access filtering (1 << 1 = 2), 5.1 km/h walking speed. |
TruckCost |
truckcost::TruckCost |
100% Parity | Truck access filtering (1 << 3 = 8), truck speed limits. |
TransitCost |
transitcost::TransitCost |
100% Parity | Schedule departure waiting time + transit ride duration + transfer penalties. |
HierarchyLimits |
hierarchylimits::HierarchyLimits |
100% Parity | max_up_transitions and expand_within_dist threshold checking (stop_expanding). |
MotorcycleCost / MotorScooterCost |
Not yet ported | Gap (20%) | Profile cost models for scooters & motorbikes. |
2.4 thor — Pathfinding Engine & Search Algorithms
- Reference C++ Files:
double_bucket_queue.h,edgelabel.h,astar.h,bidirectional_astar.h,multimodal_astar.h,isochrone.h,timedistancematrix.h,dijkstras.h,alternates.h. - Pure Rust Crate:
valhalla-path - Parity Audit Score: 75%
| C++ Component | Pure Rust Implementation | Parity Status | Technical Notes |
|---|---|---|---|
DoubleBucketQueue |
double_bucket_queue::DoubleBucketQueue |
100% Parity | Low-level discrete cost bucket arrays + overflow array refill logic (O(1) push/pop). |
EdgeLabel |
edgelabel::EdgeLabel |
100% Parity | Cost, sortcost, predecessor index, edgeid, endnode, path distance, travel mode, complex restriction state. |
AStar |
astar::AStar |
100% Parity | Unidirectional A^* path search across GraphTiles. |
BidirectionalAStar |
bidirectional_astar::BidirectionalAStar |
80% Parity | Forward/reverse search frontiers meeting in middle (falls back to A^* for local queries). |
TimeDistanceMatrix |
matrix::TimeDistanceMatrix |
100% Parity | N \times M origin-destination matrix computation engine. |
MultiModalAStar |
multimodal_astar::MultiModalAStar |
100% Parity | Pedestrian walking legs + GTFS schedule transit departure search. |
Isochrone |
Not yet ported | Gap (25%) | Time-distance reachability polygon contour generator (thor::Isochrone). |
Alternates |
Not yet ported | Gap | Alternative route candidate generator (thor::Alternates). |
2.5 meili — HMM Map Matching Engine
- Reference C++ Files:
map_matcher.h,viterbi_search.h,candidate_search.h,emission_cost_model.h,transition_cost_model.h. - Pure Rust Crate:
valhalla-match - Parity Audit Score: 80%
| C++ Component | Pure Rust Implementation | Parity Status | Technical Notes |
|---|---|---|---|
TracePoint / MatchedPoint |
trace::TracePoint, MatchedPoint |
100% Parity | GPS coordinates, accuracy, matched point, distance error, confidence score. |
MapMatcher / ViterbiSearch |
viterbi::MapMatcher |
100% Parity | HMM Viterbi trajectory search: Emission probability E(d) = \exp(-d^2 / 2\sigma^2) (\sigma=4.0\text{m}), Transition probability T(\Delta) = \exp(-\Delta / \beta) (\beta=10.0\text{m}). |
| Heading / Bearing Penalty | Not yet ported | Gap (20%) | Penalizing candidate edges whose orientation opposes GPS heading. |
2.6 odin — Maneuver Building & Guidance Engine
- Reference C++ Files:
maneuversbuilder.h,narrativebuilder.h,narrative_dictionary.h,verbal_text_formatter.h. - Pure Rust Crate:
valhalla-narrative - Parity Audit Score: 80%
| C++ Component | Pure Rust Implementation | Parity Status | Technical Notes |
|---|---|---|---|
ManeuverType |
maneuver::ManeuverType |
100% Parity | 27 maneuver classifications (Start, Destination, Right, Left, RoundaboutEnter, Merge, etc.). |
NarrativeDictionary |
dictionary::NarrativeDictionary |
100% Parity | Multi-language templates for English (en-US), Swahili (sw-KE), French (fr-FR), and Spanish (es-ES). |
VerbalTextFormatter |
verbal::VerbalTextFormatter |
100% Parity | Phonetic street name abbreviation expansions for TTS voice engines ("Uhuru Hwy" \to "Uhuru Highway"). |
ManeuverBuilder |
builder::ManeuverBuilder |
100% Parity | Converts A^* path into step-by-step turn maneuvers with localized instruction strings and verbal TTS alerts. |
| Sign / Landmark Narrative | Not yet ported | Gap (20%) | Exit sign and visual landmark narrative insertion. |
2.7 tyr — Service Actor API
- Reference C++ Files:
actor.h,serializers.h. - Pure Rust Crate:
valhalla-service - Parity Audit Score: 80%
| C++ Component | Pure Rust Implementation | Parity Status | Technical Notes |
|---|---|---|---|
ValhallaActor |
actor::ValhallaActor |
100% Parity | route(), matrix(), trace_route() unified service API. |
| Protobuf Serializer | Not yet ported | Gap (20%) | Protobuf response serialization (JSON serialization is 100% complete). |
2.8 mjolnir — Tile Compiler & Shortcuts
- Reference C++ Files:
graphbuilder.h,pbfgraphparser.h,shortcutbuilder.h,hierarchybuilder.h,way_edges_processor.h. - Pure Rust Crate:
valhalla-builder - Parity Audit Score: 70%
| C++ Component | Pure Rust Implementation | Parity Status | Technical Notes |
|---|---|---|---|
OsmHighwayType |
osm_parser::OsmHighwayType |
100% Parity | Way tag classification rules & default speed limits. |
PbfReader |
pbf_reader::PbfReader |
100% Parity | Granularity coordinate delta decoding for dense OSM nodes. |
TileGenerator |
tile_generator::TileGenerator |
100% Parity | Way segmenting, coordinate binding, tile partitioning by TileHierarchy. |
GraphTileCompiler |
compiler::GraphTileCompiler |
100% Parity | Serializes binary GraphTile buffers (RawGraphTileHeader, RawNodeInfo, RawDirectedEdge). |
ShortcutBuilder |
shortcuts::ShortcutBuilder |
100% Parity | Degree-2 contraction chain shortcut generator (is_shortcut = true). |
Direct .osm.pbf File Parser |
Not yet ported | Gap (30%) | Native .osm.pbf file block decompressor using osmpbf crate. |
3. Final Execution Plan to Reach 100% 1:1 Parity
To bridge the remaining ~20% feature gaps, four technical completion phases are defined:
Phase 1: Advanced Road Attribution & Edge Filters (Gaps in baldr & sif)
- Turn Lanes (
valhalla-core::baldr::turnlanes): ImplementTurnLanesbitmask decoder for directional turn arrows (left,slight_right,through,u_turn). - Lane Connectivity (
valhalla-core::baldr::laneconnectivity): ImplementLaneConnectivityjunction lane connection paths. - Motorcycle & Scooter Costing (
valhalla-cost::motorcyclecost): ImplementMotorcycleCostandMotorScooterCostprofiles.
Phase 2: Isochrones & Alternate Route Candidate Engine (Gaps in thor)
- Isochrone Generator (
valhalla-path::isochrone): Implement 2D time-distance reachability polygon contour generator (Thor::Isochrone). - Alternate Route Generator (
valhalla-path::alternates): Implement penalty-based alternate route candidate search (Thor::Alternates). - GPS Bearing Match Penalty (
valhalla-match::viterbi): Add GPS heading/bearing difference penalties to HMM emission costs.
Phase 3: DEM Elevation Sampling & Height Endpoint (Gaps in skadi & tyr)
valhalla-elevation(Skadi): Implement HGT / DEM raster tile reader and height interpolation along polylines.ValhallaActor::height(): Add/heightDEM elevation endpoint toValhallaActor.ValhallaActor::isochrone(): Add/isochronereachability polygon endpoint toValhallaActor.
Phase 4: Direct Native .osm.pbf File Parser (Gaps in mjolnir)
- Raw PBF Block Decompressor (
valhalla-builder::pbf_file_reader): Addosmpbfcrate integration to directly parse gigabyte-sized.osm.pbffiles from disk and feedTileGeneratorwithout external pre-parsers.
4. Verification & Testing Governance
- Unit Test Suite: All new modules must include unit tests runnable via
TEST_TARGET=valhalla ./tools/test-rust-clean.sh. - Differential Parity Harness (
valhalla-diff): All new features must be validated against C++ Valhalla reference outputs:- Polyline decoding match:
\le 1\times 10^{-5}\text{ deg} - Duration match:
\le 1\% - Distance match:
\le 1\text{m}
- Polyline decoding match:
- Formatting & Quality Ratchet: All code must pass
cargo fmt --checkandcargo clippy --all-targets -- -D warnings.