What this is

A plan for 1,000 sites, with a proof that nothing beats it by more than 0.63%

500 new fast-charging sites in the United States bring population coverage within 10 km from 83.2% to 87.7%; the same budget in Mexico moves it from 66.0% to 85.9%, reaching 39,924,992 people in total. The sites are chosen rather than described, from five public registries — the US Department of Transportation's mirror of AFDC, US Census tract centres of population, Mexico's CFE charger registry, INEGI localities and Statistics Canada's geographic attribute file. What makes it checkable is the certificate: no arrangement of 500 sites anywhere in either country covers more than 0.63% more people. That bound is the Lagrangian of the relaxed problem and holds for any non-negative multipliers, so three lines of numpy verify it independently of the solver. Maximum coverage is NP-hard and any tool claiming outright optimality at this size would be wrong. Canada is excluded from the plan because the only charger registry obtainable without an API key contains 0 Canadian rows.

This is a real analysis on a real dataset, not an illustration. The code is published, it runs in under two minutes, and a verification script re-runs it from scratch and fails if any headline number moves.

Every figure below is read from results.json, which is written by the analysis itself. Where the result is unflattering it is published unchanged — the findings and the limitations both come straight out of the run.

Source figures are in the currency of the data: sterling for the UK retail and wholesale sets, euro for the Portuguese bank set. Dollar amounts are converted at 1.55 USD/GBP and 1.40 USD/EUR, roughly the averages for the periods the data covers — stated assumptions, not live rates.

How this is checked

verify.py --only 25 deletes this project's results, re-runs it and diffs every published number before the page ships.

The pipeline
Findings

What the analysis found, including the results that went against us

Each of these came out of the run. None has been softened.

THE PLAN. 500 new fast-charging sites in the United States bring 14,959,825 more people within 10 km of one, lifting coverage from 83.22% to 87.73%. The same budget in Mexico brings 24,965,167 people into range, lifting coverage from 66.04% to 85.85%. The sites are chosen, not described: each is a census tract or locality centre, and the full selection is reproducible from the published code.

Coverage gained per site budget

Percentage points of population newly brought within range, against the number of new sites, for the United States and Mexico. Mexico gains far more per site because it starts from a much thinner network.

run.py section 6: greedy plus local search at each budget.

AND A PROOF THAT ALMOST NOTHING BEATS IT. No arrangement of 500 sites anywhere in either country covers more than 0.63% more people than this plan does. That is not a solver's claim — the bound is the Lagrangian of the relaxed problem, valid for any non-negative multipliers, so three lines of numpy verify it independently of whether the solver converged. Maximum coverage is NP-hard and a tool asserting optimality at this size would be wrong; a certificate is what can honestly be offered instead. At 2,000 sites the Mexican plan is proven optimal outright, with a gap of exactly zero.

Certified optimality gap

The proven distance between the published plan and the best any plan of the same size could achieve, as a percentage. Under one per cent throughout.

run.py section 6: LP dual certificate against the greedy lower bound.

A WIDELY REPRODUCIBLE STATISTIC ABOUT THE MEXICAN REGISTRY IS WRONG. Measuring a station's coordinate against the median coordinate of its own state suggests 27% are badly placed — but that measures how large a state is, not how wrong a coordinate is, and a state with ten stations spread across it scores 100%. Judged against the nearest INEGI locality instead, 186 of 2,046 stations (9.09%) fall in a different state than the one they claim.

Coverage by radius

Existing population coverage at four travel radii, for the United States and Mexico. The radius is an assumption, so it is swept rather than chosen.

run.py section 7: baseline coverage at each radius.

AND MOST OF WHAT LOOKS LIKE ERROR IS VOCABULARY. Comparing the two registries' state names directly gives 23.95%. Four pairs differ by wording rather than by place — one registry writes the state of Mexico, Veracruz, Michoacan and Coahuila in their short forms and the other in their constitutional ones. Crosswalking those four takes the measured error to 9.09%. Without that step this project would have published an error rate about itself that was seventy per cent too high.

THE FILTER COSTS ALMOST NO COVERAGE AND NO GEOGRAPHY. Dropping the wrong-state stations and the 12 carrying the country's geographic centroid as a placeholder keeps 1,859 of 2,046 stations (90.9%), retains all 32 states, and shifts which states are represented by only 2.54 percentage points. The data supports siting, once it is cleaned in a way that can be checked.

CANADA'S CHARGER REGISTRY IS AN AMERICAN SYSTEM THAT EXCLUDES CANADA. Canada's demand side is complete and verified here — 56,686 dissemination areas totalling 36,991,981 people, with 0 missing coordinates. What is missing is the stations. The only registry obtainable without a key is the US Department of Transportation's mirror, and it contains 0 Canadian rows. Canada's own national locator is the same American service embedded in a Canadian page. So Canada gets a demand layer and no plan, and the reason is registry access rather than Canadian statistics.

SOME PEOPLE CANNOT BE REACHED BY ANY BUDGET. 4,247,037 people in the United States and 8,429,625 in Mexico live more than 10 km from any settlement of 2,500 or more. No number of new sites reaches them under this model, because the constraint is where settlements are rather than where chargers are. That is a fact about population geography, and it bounds what any siting exercise can promise.

THE SAME BUDGET BUYS FAR MORE IN MEXICO. 500 sites move Mexican coverage by 19.81 percentage points against 4.51 in the United States, because Mexico starts from 66.04% against 83.22%. The two figures are computed by one method but they are not a league table: a US tract and a Mexican locality are different objects, and a locality can be a single household.

The detail

Full results tables

The plan, at four budgets

The plan, at four budgets
New sitesUS newly coveredUS totalMexico newly coveredMexico totalWorst certified gap
2509,634,97686.12%18,278,86380.55%0.431%
50014,959,82587.73%24,965,16785.85%0.626%
100022,313,47589.95%31,623,41791.14%0.540%
200031,458,86792.71%34,361,23393.31%0.539%

Coverage radius is an assumption

Coverage radius is an assumption
RadiusUS covered nowUS gainMexico covered nowMexico gain
10 km83.22%+4.51pp66.04%+19.81pp
15 km89.47%+4.11pp72.86%+19.77pp
25 km95.37%+3.20pp81.18%+17.11pp
40 km98.45%+1.45pp88.61%+10.95pp

What the mexican coordinate filter does

What the mexican coordinate filter does
MeasureValue
Stations registered2,046
Coordinates landing in the wrong state186 (9.09%)
Same measure without the state-name crosswalk23.95%
Placeholder coordinates at the country centroid12
Stations kept1,859 (90.9%)
States still represented32 of 32
Shift in which states are represented2.54 pp

Limitations

Stated by the analysis, not added afterwards. A project without these is not finished.

  • Proximity is not demand, and this is the limitation that matters most. No station-level utilisation data is published for any of the three countries, so the model maximises the population living near a charger rather than the charging actually served. A plan that maximises covered population may put chargers where few people charge — near homes with driveways rather than on corridors, or in towns whose residents drive combustion cars.
  • There is no public dataset of charger installation costs, so the budget is denominated in sites and not in money. Every claim here is 'for this many sites', never 'for this many dollars'. A cost-aware plan would trade fast chargers against slow ones and would look different; that trade cannot be priced from anything published.
  • The certificate is specific to these instances. The maximum coverage problem's linear relaxation has a worst-case integrality gap of about 36.8%, so no bound of this kind can promise sub-one-per-cent performance in general. The gaps reported here are proven for these two countries at these budgets and radii, and nothing more.
  • The US station snapshot is a mirror rather than the source. The primary AFDC download is behind a form requiring a name, an email address and acceptance of terms, which no script can complete and therefore no reader could reproduce. The USDOT mirror is used instead, and it is a state of the world as at 2026-05-29 — reproducibility bought at the cost of currency.
  • The Mexican registry carries no per-row date, so the filing cutoff used elsewhere in this portfolio cannot be applied to it. A digest is the only protection, and the publisher warns that records may be revised retroactively. If the file is republished, the figures here become unreproducible rather than merely stale, and that is stated rather than engineered around.
  • Candidate sites are population centres, not parcels of land. Nothing here models grid capacity, land availability, permitting, interconnection queues or the cost of trenching to a substation — all of which decide whether a site on this list could actually be built. The urban threshold of 2,500 is INEGI's own definition rather than a tuned parameter, applied identically in both countries.
  • US and Mexican demand units are not comparable objects. A US census tract holds a few thousand people by design; an INEGI locality can be a single dwelling. Coverage percentages are computed per country by one shared method and should be read within a country, not across them.
  • Distances are haversine on a sphere, which differs from the WGS84 ellipsoid by roughly half a per cent, and they are straight lines rather than road distance. Real driving distance is longer and varies with the network, so the coverage reported here is an optimistic bound on coverage as a driver would experience it.

Data: Five public registries joined for one siting model: US AFDC alternative fuel stations (USDOT NTAD mirror); US Census 2020 tract centers of population; CFE Electrolineras Publicas en Mexico; INEGI ITER 2020 localities; Statistics Canada 2021 Geographic Attribute File, Five public registries joined for one siting model: US AFDC alternative fuel stations (USDOT NTAD mirror); US Census 2020 tract centers of population; CFE Electrolineras Publicas en Mexico; INEGI ITER 2020 localities; Statistics Canada 2021 Geographic Attribute File, Five public registries joined for one siting model: US AFDC alternative fuel stations (USDOT NTAD mirror); US Census 2020 tract centers of population; CFE Electrolineras Publicas en Mexico; INEGI ITER 2020 localities; Statistics Canada 2021 Geographic Attribute File, Five public registries joined for one siting model: US AFDC alternative fuel stations (USDOT NTAD mirror); US Census 2020 tract centers of population; CFE Electrolineras Publicas en Mexico; INEGI ITER 2020 localities; Statistics Canada 2021 Geographic Attribute File, Five public registries joined for one siting model: US AFDC alternative fuel stations (USDOT NTAD mirror); US Census 2020 tract centers of population; CFE Electrolineras Publicas en Mexico; INEGI ITER 2020 localities; Statistics Canada 2021 Geographic Attribute File, US Government work (17 USC 101) | INEGI Terminos de Libre Uso, which permits commercial exploitation | CC BY 4.0 | Statistics Canada Open Licence. 380,000 rows, US census 2020, Mexico census 2020, Canada census 2021, stations as at 2026-05-29.

Libraries and methods this analysis used

Read from this project's own run.py when the page was built — 721 lines of it. Not a list of everything we know; a list of what this analysis imports and calls.

16 names from NumPy appear in this analysis.

  • arcsin
  • argmax
  • bincount
  • clip
  • concatenate
  • cos
  • fromiter
  • int32
  • int8
  • maximum
  • ones
  • radians
  • repeat
  • sin
  • sort
  • sqrt
Verification

How every number on this page is checked

A script deletes each result file, re-runs the project and diffs the output. If a headline figure moves, the check fails, and the page does not ship. That is the only reason to believe anything on this page.

Running this method on your own data

The method above transfers; the result will not. Send us a extract and we will tell you what is forecastable in it and what is not, before anyone signs anything.