Skip to content

Results

Two committed, fully reproducible benchmarks: a single deep block where all six methods (including the single-block-only topology optimizer) run head-to-head, and a settlement-scale region where the scalable methods are graded on the permeability-vs-displacement frontier.

One deep block, six methods

Block ZAF.9.3.1_1_40972 — the deepest block (by the depth proxy sqrt(n*A)/P) small enough for topology to run: 263 parcels, up to 7 rings deep, auto-picked with no hand tuning.

After, per method:

clearance_disp_depth clearance_disp_perm clearance_looped_disp_depth
clearance_disp_depth clearance_disp_perm clearance_looped_disp_depth
clearance_looped_disp_perm clearance_looped_perm_depth clearance_looped_perm_perm
clearance_looped_disp_perm clearance_looped_perm_depth clearance_looped_perm_perm
clearance_perm_depth clearance_perm_perm cycle_native_betweenness_contrast_disp_depth
clearance_perm_depth clearance_perm_perm cycle_native_betweenness_contrast_disp_depth
cycle_native_betweenness_contrast_disp_perm cycle_native_betweenness_contrast_perm_depth cycle_native_betweenness_contrast_perm_perm
cycle_native_betweenness_contrast_disp_perm cycle_native_betweenness_contrast_perm_depth cycle_native_betweenness_contrast_perm_perm
cycle_native_disp_depth cycle_native_disp_perm cycle_native_perm_depth
cycle_native_disp_depth cycle_native_disp_perm cycle_native_perm_depth
cycle_native_perm_perm euclidean_grid_disp_depth euclidean_grid_disp_perm
cycle_native_perm_perm euclidean_grid_disp_depth euclidean_grid_disp_perm
euclidean_grid_perm_depth euclidean_grid_perm_perm greedy_arterial_access_displacement_disp_depth
euclidean_grid_perm_depth euclidean_grid_perm_perm greedy_arterial_access_displacement_disp_depth
greedy_arterial_access_displacement_disp_perm greedy_arterial_access_displacement_perm_depth greedy_arterial_access_displacement_perm_perm
greedy_arterial_access_displacement_disp_perm greedy_arterial_access_displacement_perm_depth greedy_arterial_access_displacement_perm_perm
osm_footpaths_disp_depth osm_footpaths_disp_perm osm_footpaths_perm_depth
osm_footpaths_disp_depth osm_footpaths_disp_perm osm_footpaths_perm_depth
osm_footpaths_perm_perm resistance_lp_disp_depth resistance_lp_disp_perm
osm_footpaths_perm_perm resistance_lp_disp_depth resistance_lp_disp_perm
resistance_lp_perm_depth resistance_lp_perm_perm topology_disp_depth
resistance_lp_perm_depth resistance_lp_perm_perm topology_disp_depth
topology_disp_perm topology_perm_depth topology_perm_perm
topology_disp_perm topology_perm_depth topology_perm_perm

At each method's full build-out (terminal point of its permeability-vs-displacement frontier):

method homes displaced permeability
Topology 51.4% 97.7%
Least-Cost Tree 27.7% 94.8%
Looped Tree 67.2% 99.1%
Loop Network 19.9% 95.6%
Loop Network (desire-routed) 20.0% 96.4%
Direct Objective (LP) 20.0% 96.6%
Grid 37.4% 96.7%
Frontage (street-priced) 35.8% 98.8%
OSM Footpaths 25.7% 95.4%

Settlement scale: the multiblock_depth_density region

The depth_density metric tessellated and peeled the top 1,000 blocks of 83,192 by the cheap proxy, then grew the top-scoring block (ZAF.9.3.1_1_5810, peel depth 24) — growth added no neighbours, so the region is that single block of 6,619 parcels. Mean depth 24.0 rings, mean density 115 buildings/ha.

See the region on Google Maps

screen
The `depth_density` screen across the Cape Town metro: the 1,000 blocks the fine pass scored, of 83,192, coloured by true peel depth. The count is the pre-filter budget, not an estimate of how many blocks are informal.
region
The region grown from its seed block: the seed alone, 6,619 parcels.

The permeability-vs-displacement frontier

Each method's permeability (a flow measure of how easily every parcel reaches a street) as cumulative road grows, against the displacement it costs:

frontier_ZAF.9.3.1_1_5810
frontier_ZAF.9.3.1_1_5810

Lens A — matched displacement: permeability bought at an equal home-cost

method road (m) homes displaced permeability note
Looped Tree 7,997 10.1% 78.8%
Grid 7,330 9.4% 89.2% converged below budget
Loop Network 10,348 10.0% 92.5%
Loop Network (desire-routed) 14,663 10.0% 92.6%
Frontage (street-priced) 11,592 3.5% 82.1% converged below budget
OSM Footpaths 3,094 1.4% 24.1% converged below budget

Lens B — matched permeability: homes displaced to reach the standard

method road (m) homes displaced permeability note
Looped Tree 2,297 2.8% 60.8%
Grid 2,113 3.0% 65.6%
Loop Network 1,817 1.7% 66.9%
Loop Network (desire-routed) 1,762 0.7% 60.4%
Frontage (street-priced) 2,677 0.8% 60.5%
OSM Footpaths 3,094 1.4% 24.1% target unreached

Each method on the ground

Same region, same access-depth colour scale (blue = at a street, red = deep), displaced buildings marked.

Lens A — matched displacement:

Looped Tree Loop Network (desire-routed)
Looped Tree Loop Network (desire-routed)
Loop Network Grid
Loop Network Grid
Frontage (street-priced) OSM Footpaths
Frontage (street-priced) OSM Footpaths

Lens B — matched permeability:

Looped Tree Loop Network (desire-routed)
Looped Tree Loop Network (desire-routed)
Loop Network Grid
Loop Network Grid
Frontage (street-priced) OSM Footpaths
Frontage (street-priced) OSM Footpaths

Reproduce

The whole benchmark — data, maps, curves, tables — regenerates from one self-logging command:

uv run python -m scripts.gen_example depth_density