@mailwoman/resolver-wof-sqlite 10.0.0 → 10.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -8
- package/lib/address/point/interpolation.ts +45 -39
- package/lib/address/point/schema.ts +17 -40
- package/lib/address/point.ts +316 -0
- package/lib/{address/index.ts → address.ts} +1 -1
- package/lib/ancestry/backfill.ts +20 -86
- package/lib/{ancestry/index.ts → ancestry.ts} +19 -15
- package/lib/build/candidate.ts +122 -174
- package/lib/build/population-corrections.ts +64 -0
- package/lib/build/slim.ts +44 -114
- package/lib/candidate/alias-bags.ts +16 -17
- package/lib/candidate/ancestors/schema.ts +77 -61
- package/lib/candidate/ancestors/sidecar.ts +15 -22
- package/lib/candidate/country-display-names.ts +6 -20
- package/lib/candidate/extract-fold.ts +10 -55
- package/lib/candidate/fts.ts +5 -23
- package/lib/candidate/importance.ts +65 -68
- package/lib/candidate/lookup.ts +124 -415
- package/lib/candidate/name-roles.ts +15 -33
- package/lib/candidate/own-name.ts +35 -32
- package/lib/candidate/place-attrs.ts +20 -13
- package/lib/candidate/schema.ts +29 -65
- package/lib/candidate/scoring.ts +54 -93
- package/lib/capital-schema.ts +21 -17
- package/lib/capitals.ts +29 -27
- package/lib/coincident-roles.ts +85 -55
- package/lib/convention/schema.ts +15 -16
- package/lib/convention.ts +144 -0
- package/lib/coverage-manifest-schema.ts +40 -45
- package/lib/currency-backfill.ts +34 -79
- package/lib/env.ts +1 -1
- package/lib/exact-match.ts +32 -21
- package/lib/extracts.ts +97 -74
- package/lib/fst/autocomplete.ts +54 -37
- package/lib/fst/builder.ts +37 -41
- package/lib/fst/deserialize-web.ts +16 -17
- package/lib/fst/format.ts +41 -23
- package/lib/fst/freshness.ts +43 -120
- package/lib/fst/matcher.ts +7 -5
- package/lib/fst/serialize.ts +54 -74
- package/lib/fst/types.ts +78 -75
- package/lib/{fst/index.ts → fst.ts} +1 -0
- package/lib/fts/query.ts +5 -36
- package/lib/fts.ts +280 -0
- package/lib/geonames/aliases.ts +73 -144
- package/lib/geonames/postal.ts +162 -71
- package/lib/index.ts +9 -8
- package/lib/interpolation.ts +48 -100
- package/lib/lookup.ts +155 -270
- package/lib/name-score.ts +9 -7
- package/lib/nsul/lookup.ts +37 -54
- package/lib/nsul/schema.ts +16 -43
- package/lib/paths.ts +159 -0
- package/lib/place-importance-schema.ts +62 -169
- package/lib/poi/lookup.ts +104 -121
- package/lib/poi/schema.ts +42 -26
- package/lib/polygon-schema.ts +10 -6
- package/lib/postal/city/alias/lookup.ts +22 -40
- package/lib/postal/city/alias/schema.ts +14 -10
- package/lib/postal/city/candidate-schema.ts +26 -20
- package/lib/postcode-point-lookup.ts +8 -27
- package/lib/primary-preference.ts +46 -126
- package/lib/proximity-rerank.ts +44 -33
- package/lib/ranking-weights.ts +105 -78
- package/lib/region-keys.ts +70 -42
- package/lib/reverse.ts +149 -86
- package/lib/schema.ts +73 -50
- package/lib/search-fetch.ts +90 -68
- package/lib/sqlite/convention-source.ts +15 -23
- package/lib/sqlite/utils.ts +19 -22
- package/lib/street/centroid/schema.ts +37 -42
- package/lib/street/{centroid/index.ts → centroid.ts} +16 -25
- package/lib/street/morphology/fst/builder.ts +60 -42
- package/lib/street/morphology/fst/loader.ts +40 -32
- package/lib/street/name-lookup.ts +45 -41
- package/lib/street/normalize.ts +88 -219
- package/lib/street/segment-schema.ts +116 -43
- package/lib/{street/index.ts → street.ts} +1 -1
- package/lib/types.ts +109 -150
- package/lib/unified-schema.ts +29 -29
- package/lib/uprn/existence.ts +30 -19
- package/lib/uprn/lookup.ts +29 -68
- package/lib/uprn/schema.ts +18 -40
- package/lib/weights-overlay-linker.ts +236 -252
- package/out/address/point/interpolation.d.ts +20 -23
- package/out/address/point/interpolation.d.ts.map +1 -1
- package/out/address/point/interpolation.js +42 -39
- package/out/address/point/interpolation.js.map +1 -1
- package/out/address/point/schema.d.ts +12 -35
- package/out/address/point/schema.d.ts.map +1 -1
- package/out/address/point/schema.js +3 -19
- package/out/address/point/schema.js.map +1 -1
- package/out/address/point.d.ts +57 -0
- package/out/address/point.d.ts.map +1 -0
- package/out/address/point.js +206 -0
- package/out/address/point.js.map +1 -0
- package/out/{address/index.js → address.d.ts} +2 -2
- package/out/address.d.ts.map +1 -0
- package/out/{address/index.d.ts → address.js} +2 -2
- package/out/address.js.map +1 -0
- package/out/ancestry/backfill.d.ts +11 -64
- package/out/ancestry/backfill.d.ts.map +1 -1
- package/out/ancestry/backfill.js +14 -74
- package/out/ancestry/backfill.js.map +1 -1
- package/out/ancestry.d.ts +49 -0
- package/out/ancestry.d.ts.map +1 -0
- package/out/ancestry.js +59 -0
- package/out/ancestry.js.map +1 -0
- package/out/build/candidate.d.ts +82 -112
- package/out/build/candidate.d.ts.map +1 -1
- package/out/build/candidate.js +17 -100
- package/out/build/candidate.js.map +1 -1
- package/out/build/population-corrections.d.ts +52 -0
- package/out/build/population-corrections.d.ts.map +1 -0
- package/out/build/population-corrections.js +40 -0
- package/out/build/population-corrections.js.map +1 -0
- package/out/build/slim.d.ts +8 -44
- package/out/build/slim.d.ts.map +1 -1
- package/out/build/slim.js +33 -94
- package/out/build/slim.js.map +1 -1
- package/out/candidate/alias-bags.d.ts +6 -6
- package/out/candidate/alias-bags.d.ts.map +1 -1
- package/out/candidate/alias-bags.js +16 -17
- package/out/candidate/alias-bags.js.map +1 -1
- package/out/candidate/ancestors/schema.d.ts +73 -57
- package/out/candidate/ancestors/schema.d.ts.map +1 -1
- package/out/candidate/ancestors/schema.js +56 -48
- package/out/candidate/ancestors/schema.js.map +1 -1
- package/out/candidate/ancestors/sidecar.d.ts +3 -8
- package/out/candidate/ancestors/sidecar.d.ts.map +1 -1
- package/out/candidate/ancestors/sidecar.js +15 -22
- package/out/candidate/ancestors/sidecar.js.map +1 -1
- package/out/candidate/country-display-names.d.ts +5 -15
- package/out/candidate/country-display-names.d.ts.map +1 -1
- package/out/candidate/country-display-names.js +6 -20
- package/out/candidate/country-display-names.js.map +1 -1
- package/out/candidate/extract-fold.d.ts +7 -15
- package/out/candidate/extract-fold.d.ts.map +1 -1
- package/out/candidate/extract-fold.js +5 -47
- package/out/candidate/extract-fold.js.map +1 -1
- package/out/candidate/fts.d.ts +5 -23
- package/out/candidate/fts.d.ts.map +1 -1
- package/out/candidate/fts.js +5 -23
- package/out/candidate/fts.js.map +1 -1
- package/out/candidate/importance.d.ts +60 -65
- package/out/candidate/importance.d.ts.map +1 -1
- package/out/candidate/importance.js +56 -63
- package/out/candidate/importance.js.map +1 -1
- package/out/candidate/lookup.d.ts +18 -55
- package/out/candidate/lookup.d.ts.map +1 -1
- package/out/candidate/lookup.js +82 -385
- package/out/candidate/lookup.js.map +1 -1
- package/out/candidate/name-roles.d.ts +9 -21
- package/out/candidate/name-roles.d.ts.map +1 -1
- package/out/candidate/name-roles.js +15 -33
- package/out/candidate/name-roles.js.map +1 -1
- package/out/candidate/own-name.d.ts +23 -25
- package/out/candidate/own-name.d.ts.map +1 -1
- package/out/candidate/own-name.js +35 -32
- package/out/candidate/own-name.js.map +1 -1
- package/out/candidate/place-attrs.d.ts +20 -13
- package/out/candidate/place-attrs.d.ts.map +1 -1
- package/out/candidate/place-attrs.js +4 -5
- package/out/candidate/place-attrs.js.map +1 -1
- package/out/candidate/schema.d.ts +27 -62
- package/out/candidate/schema.d.ts.map +1 -1
- package/out/candidate/schema.js +10 -22
- package/out/candidate/schema.js.map +1 -1
- package/out/candidate/scoring.d.ts +7 -8
- package/out/candidate/scoring.d.ts.map +1 -1
- package/out/candidate/scoring.js +52 -89
- package/out/candidate/scoring.js.map +1 -1
- package/out/capital-schema.d.ts +21 -17
- package/out/capital-schema.d.ts.map +1 -1
- package/out/capital-schema.js +17 -15
- package/out/capital-schema.js.map +1 -1
- package/out/capitals.d.ts +27 -25
- package/out/capitals.d.ts.map +1 -1
- package/out/capitals.js +23 -21
- package/out/capitals.js.map +1 -1
- package/out/coincident-roles.d.ts +60 -43
- package/out/coincident-roles.d.ts.map +1 -1
- package/out/coincident-roles.js +72 -50
- package/out/coincident-roles.js.map +1 -1
- package/out/convention/schema.d.ts +14 -14
- package/out/convention/schema.d.ts.map +1 -1
- package/out/convention/schema.js +6 -4
- package/out/convention/schema.js.map +1 -1
- package/out/convention.d.ts +97 -0
- package/out/convention.d.ts.map +1 -0
- package/out/convention.js +81 -0
- package/out/convention.js.map +1 -0
- package/out/coverage-manifest-schema.d.ts +34 -39
- package/out/coverage-manifest-schema.d.ts.map +1 -1
- package/out/coverage-manifest-schema.js +25 -34
- package/out/coverage-manifest-schema.js.map +1 -1
- package/out/currency-backfill.d.ts +16 -38
- package/out/currency-backfill.d.ts.map +1 -1
- package/out/currency-backfill.js +19 -46
- package/out/currency-backfill.js.map +1 -1
- package/out/env.d.ts +1 -1
- package/out/env.js +1 -1
- package/out/exact-match.d.ts +19 -10
- package/out/exact-match.d.ts.map +1 -1
- package/out/exact-match.js +32 -21
- package/out/exact-match.js.map +1 -1
- package/out/extracts.d.ts +66 -55
- package/out/extracts.d.ts.map +1 -1
- package/out/extracts.js +63 -55
- package/out/extracts.js.map +1 -1
- package/out/fst/autocomplete.d.ts +29 -21
- package/out/fst/autocomplete.d.ts.map +1 -1
- package/out/fst/autocomplete.js +39 -28
- package/out/fst/autocomplete.js.map +1 -1
- package/out/fst/builder.d.ts.map +1 -1
- package/out/fst/builder.js +37 -41
- package/out/fst/builder.js.map +1 -1
- package/out/fst/deserialize-web.d.ts +4 -4
- package/out/fst/deserialize-web.d.ts.map +1 -1
- package/out/fst/deserialize-web.js +15 -16
- package/out/fst/deserialize-web.js.map +1 -1
- package/out/fst/format.d.ts +41 -23
- package/out/fst/format.d.ts.map +1 -1
- package/out/fst/format.js +41 -23
- package/out/fst/format.js.map +1 -1
- package/out/fst/freshness.d.ts +19 -81
- package/out/fst/freshness.d.ts.map +1 -1
- package/out/fst/freshness.js +31 -94
- package/out/fst/freshness.js.map +1 -1
- package/out/fst/matcher.d.ts +5 -4
- package/out/fst/matcher.d.ts.map +1 -1
- package/out/fst/matcher.js +2 -2
- package/out/fst/matcher.js.map +1 -1
- package/out/fst/serialize.d.ts +28 -28
- package/out/fst/serialize.d.ts.map +1 -1
- package/out/fst/serialize.js +53 -71
- package/out/fst/serialize.js.map +1 -1
- package/out/fst/types.d.ts +78 -74
- package/out/fst/types.d.ts.map +1 -1
- package/out/fst/types.js +1 -4
- package/out/fst/types.js.map +1 -1
- package/out/{fst/index.js → fst.d.ts} +2 -1
- package/out/fst.d.ts.map +1 -0
- package/out/{fst/index.d.ts → fst.js} +2 -1
- package/out/fst.js.map +1 -0
- package/out/fts/query.d.ts +2 -27
- package/out/fts/query.d.ts.map +1 -1
- package/out/fts/query.js +5 -36
- package/out/fts/query.js.map +1 -1
- package/out/fts.d.ts +126 -0
- package/out/fts.d.ts.map +1 -0
- package/out/fts.js +188 -0
- package/out/fts.js.map +1 -0
- package/out/geonames/aliases.d.ts +26 -62
- package/out/geonames/aliases.d.ts.map +1 -1
- package/out/geonames/aliases.js +45 -117
- package/out/geonames/aliases.js.map +1 -1
- package/out/geonames/postal.d.ts +84 -44
- package/out/geonames/postal.d.ts.map +1 -1
- package/out/geonames/postal.js +115 -73
- package/out/geonames/postal.js.map +1 -1
- package/out/{geonames/index.js → geonames.d.ts} +1 -1
- package/out/geonames.d.ts.map +1 -0
- package/out/{geonames/index.d.ts → geonames.js} +1 -1
- package/out/geonames.js.map +1 -0
- package/out/index.d.ts +9 -8
- package/out/index.d.ts.map +1 -1
- package/out/index.js +6 -5
- package/out/index.js.map +1 -1
- package/out/interpolation.d.ts +18 -55
- package/out/interpolation.d.ts.map +1 -1
- package/out/interpolation.js +27 -69
- package/out/interpolation.js.map +1 -1
- package/out/lookup.d.ts +23 -51
- package/out/lookup.d.ts.map +1 -1
- package/out/lookup.js +136 -234
- package/out/lookup.js.map +1 -1
- package/out/name-score.d.ts +2 -2
- package/out/name-score.d.ts.map +1 -1
- package/out/name-score.js +9 -7
- package/out/name-score.js.map +1 -1
- package/out/nsul/lookup.d.ts +33 -34
- package/out/nsul/lookup.d.ts.map +1 -1
- package/out/nsul/lookup.js +26 -40
- package/out/nsul/lookup.js.map +1 -1
- package/out/nsul/schema.d.ts +16 -43
- package/out/nsul/schema.d.ts.map +1 -1
- package/out/nsul/schema.js +9 -35
- package/out/nsul/schema.js.map +1 -1
- package/out/{nsul/index.d.ts → nsul.d.ts} +1 -1
- package/out/nsul.d.ts.map +1 -0
- package/out/{nsul/index.js → nsul.js} +1 -1
- package/out/nsul.js.map +1 -0
- package/out/paths.d.ts +124 -0
- package/out/paths.d.ts.map +1 -0
- package/out/paths.js +104 -0
- package/out/paths.js.map +1 -0
- package/out/place-importance-schema.d.ts +51 -143
- package/out/place-importance-schema.d.ts.map +1 -1
- package/out/place-importance-schema.js +28 -143
- package/out/place-importance-schema.js.map +1 -1
- package/out/poi/lookup.d.ts +40 -47
- package/out/poi/lookup.d.ts.map +1 -1
- package/out/poi/lookup.js +69 -96
- package/out/poi/lookup.js.map +1 -1
- package/out/poi/schema.d.ts +41 -25
- package/out/poi/schema.d.ts.map +1 -1
- package/out/poi/schema.js +25 -17
- package/out/poi/schema.js.map +1 -1
- package/out/{poi/index.js → poi.d.ts} +1 -1
- package/out/poi.d.ts.map +1 -0
- package/out/{poi/index.d.ts → poi.js} +1 -1
- package/out/poi.js.map +1 -0
- package/out/polygon-schema.d.ts +10 -6
- package/out/polygon-schema.d.ts.map +1 -1
- package/out/polygon-schema.js +2 -2
- package/out/polygon-schema.js.map +1 -1
- package/out/postal/city/alias/lookup.d.ts +20 -23
- package/out/postal/city/alias/lookup.d.ts.map +1 -1
- package/out/postal/city/alias/lookup.js +17 -30
- package/out/postal/city/alias/lookup.js.map +1 -1
- package/out/postal/city/alias/schema.d.ts +14 -10
- package/out/postal/city/alias/schema.d.ts.map +1 -1
- package/out/postal/city/alias/schema.js +10 -8
- package/out/postal/city/alias/schema.js.map +1 -1
- package/out/postal/city/candidate-schema.d.ts +25 -19
- package/out/postal/city/candidate-schema.d.ts.map +1 -1
- package/out/postal/city/candidate-schema.js +21 -17
- package/out/postal/city/candidate-schema.js.map +1 -1
- package/out/{postal/index.d.ts → postal.d.ts} +1 -1
- package/out/postal.d.ts.map +1 -0
- package/out/{postal/index.js → postal.js} +1 -1
- package/out/postal.js.map +1 -0
- package/out/postcode-point-lookup.d.ts +6 -24
- package/out/postcode-point-lookup.d.ts.map +1 -1
- package/out/postcode-point-lookup.js +5 -17
- package/out/postcode-point-lookup.js.map +1 -1
- package/out/primary-preference.d.ts +38 -92
- package/out/primary-preference.d.ts.map +1 -1
- package/out/primary-preference.js +15 -99
- package/out/primary-preference.js.map +1 -1
- package/out/proximity-rerank.d.ts +41 -30
- package/out/proximity-rerank.d.ts.map +1 -1
- package/out/proximity-rerank.js +38 -29
- package/out/proximity-rerank.js.map +1 -1
- package/out/ranking-weights.d.ts +98 -64
- package/out/ranking-weights.d.ts.map +1 -1
- package/out/ranking-weights.js +26 -25
- package/out/ranking-weights.js.map +1 -1
- package/out/region-keys.d.ts +50 -31
- package/out/region-keys.d.ts.map +1 -1
- package/out/region-keys.js +68 -40
- package/out/region-keys.js.map +1 -1
- package/out/reverse.d.ts +78 -50
- package/out/reverse.d.ts.map +1 -1
- package/out/reverse.js +98 -61
- package/out/reverse.js.map +1 -1
- package/out/schema.d.ts +72 -49
- package/out/schema.d.ts.map +1 -1
- package/out/schema.js +4 -5
- package/out/schema.js.map +1 -1
- package/out/search-fetch.d.ts +16 -12
- package/out/search-fetch.d.ts.map +1 -1
- package/out/search-fetch.js +83 -63
- package/out/search-fetch.js.map +1 -1
- package/out/sqlite/convention-source.d.ts +12 -16
- package/out/sqlite/convention-source.d.ts.map +1 -1
- package/out/sqlite/convention-source.js +13 -22
- package/out/sqlite/convention-source.js.map +1 -1
- package/out/sqlite/utils.d.ts +19 -19
- package/out/sqlite/utils.d.ts.map +1 -1
- package/out/sqlite/utils.js +14 -15
- package/out/sqlite/utils.js.map +1 -1
- package/out/street/centroid/schema.d.ts +37 -42
- package/out/street/centroid/schema.d.ts.map +1 -1
- package/out/street/centroid/schema.js +9 -21
- package/out/street/centroid/schema.js.map +1 -1
- package/out/street/centroid.d.ts +30 -0
- package/out/street/centroid.d.ts.map +1 -0
- package/out/street/{centroid/index.js → centroid.js} +13 -24
- package/out/street/centroid.js.map +1 -0
- package/out/street/morphology/fst/builder.d.ts +20 -10
- package/out/street/morphology/fst/builder.d.ts.map +1 -1
- package/out/street/morphology/fst/builder.js +44 -34
- package/out/street/morphology/fst/builder.js.map +1 -1
- package/out/street/morphology/fst/loader.d.ts +33 -26
- package/out/street/morphology/fst/loader.d.ts.map +1 -1
- package/out/street/morphology/fst/loader.js +23 -22
- package/out/street/morphology/fst/loader.js.map +1 -1
- package/out/street/name-lookup.d.ts +24 -18
- package/out/street/name-lookup.d.ts.map +1 -1
- package/out/street/name-lookup.js +34 -35
- package/out/street/name-lookup.js.map +1 -1
- package/out/street/normalize.d.ts +35 -136
- package/out/street/normalize.d.ts.map +1 -1
- package/out/street/normalize.js +77 -194
- package/out/street/normalize.js.map +1 -1
- package/out/street/segment-schema.d.ts +79 -39
- package/out/street/segment-schema.d.ts.map +1 -1
- package/out/street/segment-schema.js +71 -21
- package/out/street/segment-schema.js.map +1 -1
- package/out/{street/index.js → street.d.ts} +2 -2
- package/out/street.d.ts.map +1 -0
- package/out/{street/index.d.ts → street.js} +2 -2
- package/out/street.js.map +1 -0
- package/out/types.d.ts +84 -149
- package/out/types.d.ts.map +1 -1
- package/out/types.js +0 -6
- package/out/types.js.map +1 -1
- package/out/unified-schema.d.ts +8 -12
- package/out/unified-schema.d.ts.map +1 -1
- package/out/unified-schema.js +29 -29
- package/out/unified-schema.js.map +1 -1
- package/out/uprn/existence.d.ts +28 -17
- package/out/uprn/existence.d.ts.map +1 -1
- package/out/uprn/existence.js +26 -16
- package/out/uprn/existence.js.map +1 -1
- package/out/uprn/lookup.d.ts +14 -44
- package/out/uprn/lookup.d.ts.map +1 -1
- package/out/uprn/lookup.js +21 -57
- package/out/uprn/lookup.js.map +1 -1
- package/out/uprn/schema.d.ts +18 -40
- package/out/uprn/schema.d.ts.map +1 -1
- package/out/uprn/schema.js +10 -32
- package/out/uprn/schema.js.map +1 -1
- package/out/{uprn/index.d.ts → uprn.d.ts} +1 -1
- package/out/uprn.d.ts.map +1 -0
- package/out/{uprn/index.js → uprn.js} +1 -1
- package/out/uprn.js.map +1 -0
- package/out/weights-overlay-linker.d.ts +138 -144
- package/out/weights-overlay-linker.d.ts.map +1 -1
- package/out/weights-overlay-linker.js +105 -159
- package/out/weights-overlay-linker.js.map +1 -1
- package/package.json +91 -596
- package/lib/address/point/index.ts +0 -328
- package/lib/convention/index.ts +0 -154
- package/lib/fts/index.ts +0 -361
- package/out/address/index.d.ts.map +0 -1
- package/out/address/index.js.map +0 -1
- package/out/address/point/index.d.ts +0 -53
- package/out/address/point/index.d.ts.map +0 -1
- package/out/address/point/index.js +0 -222
- package/out/address/point/index.js.map +0 -1
- package/out/ancestry/index.d.ts +0 -45
- package/out/ancestry/index.d.ts.map +0 -1
- package/out/ancestry/index.js +0 -55
- package/out/ancestry/index.js.map +0 -1
- package/out/convention/index.d.ts +0 -106
- package/out/convention/index.d.ts.map +0 -1
- package/out/convention/index.js +0 -93
- package/out/convention/index.js.map +0 -1
- package/out/fst/index.d.ts.map +0 -1
- package/out/fst/index.js.map +0 -1
- package/out/fts/index.d.ts +0 -184
- package/out/fts/index.d.ts.map +0 -1
- package/out/fts/index.js +0 -277
- package/out/fts/index.js.map +0 -1
- package/out/geonames/index.d.ts.map +0 -1
- package/out/geonames/index.js.map +0 -1
- package/out/nsul/index.d.ts.map +0 -1
- package/out/nsul/index.js.map +0 -1
- package/out/poi/index.d.ts.map +0 -1
- package/out/poi/index.js.map +0 -1
- package/out/postal/index.d.ts.map +0 -1
- package/out/postal/index.js.map +0 -1
- package/out/street/centroid/index.d.ts +0 -40
- package/out/street/centroid/index.d.ts.map +0 -1
- package/out/street/centroid/index.js.map +0 -1
- package/out/street/index.d.ts.map +0 -1
- package/out/street/index.js.map +0 -1
- package/out/uprn/index.d.ts.map +0 -1
- package/out/uprn/index.js.map +0 -1
- /package/lib/{geonames/index.ts → geonames.ts} +0 -0
- /package/lib/{nsul/index.ts → nsul.ts} +0 -0
- /package/lib/{poi/index.ts → poi.ts} +0 -0
- /package/lib/{postal/index.ts → postal.ts} +0 -0
- /package/lib/{uprn/index.ts → uprn.ts} +0 -0
package/lib/interpolation.ts
CHANGED
|
@@ -3,27 +3,7 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* misses, estimate the coordinate from TIGER street-segment ranges — parity-aware range match,
|
|
8
|
-
* then linear interpolation along the segment polyline. Design:
|
|
9
|
-
* `docs/articles/plan/2026-06-11-interpolation-design.md`.
|
|
10
|
-
*
|
|
11
|
-
* Reads the per-state extract built by `scripts/build-interpolation-extract.ts` (`street_segment`: one
|
|
12
|
-
* row per TIGER edge SIDE — independent left/right ranges, ZIPs, parity). Query-side
|
|
13
|
-
* normalization is THE shared normalizer (`street-normalize.ts`) — identical to build-side, by
|
|
14
|
-
* construction.
|
|
15
|
-
*
|
|
16
|
-
* Every answer is honest about being an estimate: `interpolated: true`, `parityMatched` (false when
|
|
17
|
-
* only the opposite side's range contained the number — usually the right block, wrong side of
|
|
18
|
-
* the street), and `uncertaintyM` (half the matched segment's length — the #483 issue's honest
|
|
19
|
-
* default). Scoping is postcode-first (a given ZIP that scopes to nothing is a MISS — the
|
|
20
|
-
* statewide retry was measured and rejected, see `find()`); without a postcode the statewide name
|
|
21
|
-
* match must agree on a single postcode or the lookup ABSTAINS (a common street name spanning
|
|
22
|
-
* towns is ambiguity, not an answer).
|
|
23
|
-
*
|
|
24
|
-
* Standalone in this slice — core tier wiring (`resolution_tier: "interpolated"` after the
|
|
25
|
-
* exact-point fall-through) is a noted follow-up on #483, so the `find()` shape mirrors
|
|
26
|
-
* `AddressPointLookup.find()` to keep that wiring mechanical.
|
|
6
|
+
* House-number interpolation: when the exact address-point tier misses, estimate the coordinate from tiger street-segment ranges by parity-aware range match and linear interpolation along the segment polyline.
|
|
27
7
|
*/
|
|
28
8
|
|
|
29
9
|
import { parseJSONStrict } from "@mailwoman/core/json"
|
|
@@ -36,51 +16,38 @@ import { canonicalizeRouteKey, type RouteKey, streetKeyVariants } from "#street/
|
|
|
36
16
|
import type { StreetSegmentDatabase } from "#street/segment-schema"
|
|
37
17
|
|
|
38
18
|
/**
|
|
39
|
-
* How an interpolated answer was computed
|
|
40
|
-
*
|
|
41
|
-
* - `address_point` — bracketed/extrapolated between REAL neighbor points from the #476 extract
|
|
42
|
-
* (`AddressPointInterpolator`), replacing TIGER's uniform-spacing assumption with occupancy.
|
|
43
|
-
* - `tiger_range` — linear position within a TIGER segment's theoretical house-number range (`StreetInterpolator`), the
|
|
44
|
-
* fallback for streets too sparse to bracket.
|
|
19
|
+
* How an interpolated answer was computed, `address_point` for bracketed neighbor points
|
|
20
|
+
* and `tiger_range` for linear position within a tiger segment.
|
|
45
21
|
*/
|
|
46
22
|
export type InterpolationMethod = "address_point" | "tiger_range"
|
|
47
23
|
|
|
48
24
|
/**
|
|
49
|
-
* One interpolated coordinate estimate
|
|
25
|
+
* One interpolated coordinate estimate, never an exact situs point.
|
|
50
26
|
*/
|
|
51
27
|
export interface InterpolatedHit {
|
|
52
28
|
lat: number
|
|
53
29
|
lon: number
|
|
54
|
-
|
|
55
|
-
* Always true — the tier's honesty flag, mirrored into `resolution_tier` when wired.
|
|
56
|
-
*/
|
|
30
|
+
|
|
57
31
|
interpolated: true
|
|
58
|
-
|
|
59
|
-
* Which rung answered — see {@link InterpolationMethod}.
|
|
60
|
-
*/
|
|
32
|
+
|
|
61
33
|
method: InterpolationMethod
|
|
62
34
|
/**
|
|
63
|
-
*
|
|
64
|
-
* `mixed`)
|
|
35
|
+
* True when the matched segment side's parity agrees with the house number
|
|
36
|
+
* (or the side is `mixed`); false is an opposite-side fallback.
|
|
65
37
|
*/
|
|
66
|
-
parityMatched
|
|
38
|
+
parityMatched: boolean | null
|
|
67
39
|
/**
|
|
68
|
-
* `
|
|
69
|
-
* on one side only (extrapolated, larger `uncertaintyM`).
|
|
40
|
+
* `both` sits between two known neighbor numbers; `single` is extrapolated from one side only.
|
|
70
41
|
*/
|
|
71
|
-
bracket
|
|
42
|
+
bracket: "both" | "single" | null
|
|
72
43
|
/**
|
|
73
|
-
*
|
|
74
|
-
* span
|
|
44
|
+
* Uncertainty radius in meters: half the matched segment length for `tiger_range`, half the
|
|
45
|
+
* bracket span for `address_point`/`both`, or a larger extrapolation penalty for `single`.
|
|
75
46
|
*/
|
|
76
47
|
uncertaintyM: number
|
|
77
|
-
|
|
78
|
-
* Provenance, e.g. `"tiger:edges"`.
|
|
79
|
-
*/
|
|
48
|
+
|
|
80
49
|
source: string
|
|
81
|
-
|
|
82
|
-
* Pinned data vintage, e.g. `"TIGER2023"`.
|
|
83
|
-
*/
|
|
50
|
+
|
|
84
51
|
release: string
|
|
85
52
|
}
|
|
86
53
|
|
|
@@ -88,28 +55,23 @@ export interface InterpolationQuery {
|
|
|
88
55
|
street: string
|
|
89
56
|
number: string
|
|
90
57
|
/**
|
|
91
|
-
* ZIP scope
|
|
58
|
+
* ZIP scope.
|
|
59
|
+
* Without it common street names abstain.
|
|
92
60
|
*/
|
|
93
61
|
postcode?: string
|
|
94
62
|
/**
|
|
95
|
-
* The resolved locality's coordinate
|
|
96
|
-
*
|
|
63
|
+
* The resolved locality's coordinate, tie-breaking when no postcode was given
|
|
64
|
+
* and several postcodes survive parity.
|
|
97
65
|
*/
|
|
98
66
|
near?: { lat: number; lon: number }
|
|
99
67
|
}
|
|
100
68
|
|
|
101
69
|
/**
|
|
102
|
-
* Acceptance geometry for the `near` tie-break: the winning
|
|
103
|
-
*
|
|
104
|
-
* the two live failures: Brooklyn's `st pauls place` 11226 segment is ~2 km from the Brooklyn centroid with Great
|
|
105
|
-
* Neck's 11021 at ~24 km (12×); Fraser's `east 13 mile road` 48026 is ~2 km with Mecosta's namesake ~190 km away. A
|
|
106
|
-
* near-tie between groups is genuine ambiguity and stays an abstention.
|
|
70
|
+
* Acceptance geometry for the `near` tie-break: the winning group must be within this
|
|
71
|
+
* many kilometers and the runner-up at least {@link NEAR_DOMINANCE} times farther.
|
|
107
72
|
*/
|
|
108
73
|
const NEAR_MAX_KM = 25
|
|
109
74
|
|
|
110
|
-
/**
|
|
111
|
-
* See {@link NEAR_MAX_KM}.
|
|
112
|
-
*/
|
|
113
75
|
const NEAR_DOMINANCE = 2
|
|
114
76
|
|
|
115
77
|
interface SegmentRow {
|
|
@@ -125,9 +87,7 @@ interface SegmentRow {
|
|
|
125
87
|
}
|
|
126
88
|
|
|
127
89
|
/**
|
|
128
|
-
* The postcode group nearest `near`,
|
|
129
|
-
* (out of range, or the runner-up is too close to call). A group's distance is its closest segment's first polyline
|
|
130
|
-
* vertex; a segment whose geometry fails to parse prices as unreachable rather than aborting the tie-break.
|
|
90
|
+
* The postcode group nearest `near`, or null when no group qualifies within the dominance geometry.
|
|
131
91
|
*/
|
|
132
92
|
function nearestPostcodeGroup(pool: readonly SegmentRow[], near: { lat: number; lon: number }): SegmentRow[] | null {
|
|
133
93
|
const groups = new Map<string, { rows: SegmentRow[]; km: number }>()
|
|
@@ -171,27 +131,29 @@ export class StreetInterpolator<
|
|
|
171
131
|
> implements InterpolationLookup {
|
|
172
132
|
readonly #db: DatabaseClient<DB>
|
|
173
133
|
/**
|
|
174
|
-
* Resources this instance opened.
|
|
175
|
-
*
|
|
134
|
+
* Resources this instance opened.
|
|
135
|
+
*
|
|
136
|
+
* A caller-supplied connection is not in here, so disposal cannot reach it.
|
|
176
137
|
*/
|
|
177
|
-
readonly #resources
|
|
138
|
+
readonly #resources: DisposableStack
|
|
178
139
|
readonly #byPostcode:
|
|
179
140
|
| PreparedAll<[postcode: string, street: RouteKey, minNumber: number, maxNumber: number], SegmentRow>
|
|
180
141
|
| undefined
|
|
181
142
|
readonly #byStreet: PreparedAll<[street: RouteKey, minNumber: number, maxNumber: number], SegmentRow> | undefined
|
|
182
|
-
readonly #radiusCalibration: number |
|
|
143
|
+
readonly #radiusCalibration: number | null = null
|
|
183
144
|
|
|
184
145
|
constructor(opts: { dbPath?: string; database?: DatabaseClient<DB> }) {
|
|
146
|
+
using resources = new DisposableStack()
|
|
147
|
+
|
|
185
148
|
if (opts.database) {
|
|
186
149
|
this.#db = opts.database
|
|
187
150
|
} else if (opts.dbPath) {
|
|
188
|
-
this.#db =
|
|
151
|
+
this.#db = resources.use(new DatabaseClient<DB>(opts.dbPath, { readOnly: true }))
|
|
189
152
|
} else {
|
|
190
153
|
throw new Error("StreetInterpolator: one of dbPath or database is required")
|
|
191
154
|
}
|
|
192
155
|
|
|
193
|
-
//
|
|
194
|
-
// `street_segment` table this interpolator is a no-op miss, not a crash that loses the state (#568).
|
|
156
|
+
// A tableless extract degrades to a no-op miss rather than a crash.
|
|
195
157
|
if (hasTable(this.#db, "street_segment")) {
|
|
196
158
|
const columns = `from_hn, to_hn, min_hn, max_hn, parity, postcode, geometry, source, release`
|
|
197
159
|
|
|
@@ -208,11 +170,9 @@ export class StreetInterpolator<
|
|
|
208
170
|
)
|
|
209
171
|
}
|
|
210
172
|
|
|
211
|
-
//
|
|
212
|
-
//
|
|
213
|
-
//
|
|
214
|
-
// (AGENTS.md). Extracts predating the table (the pre-2026-07 fleet) yield `undefined`; callers then fall
|
|
215
|
-
// back to their in-code table, byte-identically.
|
|
173
|
+
// The conformal radius multiplier ships in the extract's `interp_calibration` table
|
|
174
|
+
// and is read once at open time.
|
|
175
|
+
// Extracts without that table leave it null.
|
|
216
176
|
if (hasTable(this.#db, "interp_calibration")) {
|
|
217
177
|
const row = this.#db.prepare("SELECT radius_multiplier FROM interp_calibration LIMIT 1").get() as
|
|
218
178
|
| { radius_multiplier: unknown }
|
|
@@ -224,14 +184,15 @@ export class StreetInterpolator<
|
|
|
224
184
|
this.#radiusCalibration = value
|
|
225
185
|
}
|
|
226
186
|
}
|
|
187
|
+
|
|
188
|
+
this.#resources = resources.move()
|
|
227
189
|
}
|
|
228
190
|
|
|
229
191
|
/**
|
|
230
|
-
* The artifact's own conformal radius multiplier
|
|
231
|
-
*
|
|
232
|
-
* no artifact default and callers may supply a legacy fallback.
|
|
192
|
+
* The artifact's own conformal radius multiplier, read from the extract at construction;
|
|
193
|
+
* `null` when the extract predates the table or contains no valid row.
|
|
233
194
|
*/
|
|
234
|
-
get radiusCalibration(): number |
|
|
195
|
+
get radiusCalibration(): number | null {
|
|
235
196
|
return this.#radiusCalibration
|
|
236
197
|
}
|
|
237
198
|
|
|
@@ -239,22 +200,16 @@ export class StreetInterpolator<
|
|
|
239
200
|
if (!this.#byPostcode || !this.#byStreet) return null
|
|
240
201
|
const numberRaw = query.number.trim()
|
|
241
202
|
|
|
242
|
-
// Strictly-numeric house numbers only
|
|
243
|
-
//
|
|
203
|
+
// Strictly-numeric house numbers only.
|
|
204
|
+
// The ranges do not model hyphenated or alphanumeric schemes.
|
|
244
205
|
if (!/^\d+$/.test(numberRaw)) return null
|
|
245
206
|
const n = Number(numberRaw)
|
|
246
207
|
|
|
247
|
-
//
|
|
248
|
-
// collapse and the saint↔st register swap. A variant advances the ladder when it produces no
|
|
249
|
-
// ANSWER, not merely no rows — a wrong-register key can cover the number in far-away towns and
|
|
250
|
-
// then fail the ambiguity check ("saint pauls place" reaches Nassau's rows; the Brooklyn answer
|
|
251
|
-
// lives under "st pauls place"), and stopping at rows would eclipse the right variant.
|
|
208
|
+
// A variant advances the ladder when it produces no answer rather than merely no rows.
|
|
252
209
|
for (const variant of streetKeyVariants(query.street)) {
|
|
253
210
|
const streetNorm = canonicalizeRouteKey(variant)
|
|
254
211
|
|
|
255
|
-
// A
|
|
256
|
-
// measured (2026-06-11 VT eval) at +2.3pp coverage for a poisoned tail (p99 1.0 → 20.8
|
|
257
|
-
// km, max 204 km — a unique name statewide can live in a far-away town).
|
|
212
|
+
// A ZIP that scopes to no candidate is a miss rather than a statewide guess.
|
|
258
213
|
const rows = query.postcode
|
|
259
214
|
? this.#byPostcode(query.postcode.trim(), streetNorm, n, n)
|
|
260
215
|
: this.#byStreet(streetNorm, n, n)
|
|
@@ -268,14 +223,12 @@ export class StreetInterpolator<
|
|
|
268
223
|
}
|
|
269
224
|
|
|
270
225
|
/**
|
|
271
|
-
* Resolve one key variant's covering rows to an answer, or null when they cannot
|
|
272
|
-
* parity/ambiguity/tightest-range pipeline the module doc describes.
|
|
226
|
+
* Resolve one key variant's covering rows to an answer, or null when they cannot give one honestly.
|
|
273
227
|
*/
|
|
274
228
|
#answerFromRows(rows: SegmentRow[], n: number, query: InterpolationQuery): InterpolatedHit | null {
|
|
275
229
|
if (!rows.length) return null
|
|
276
230
|
|
|
277
|
-
// Parity preference: exact side first, then
|
|
278
|
-
// opposite side as a flagged fallback.
|
|
231
|
+
// Parity preference: exact side first, then `mixed`, then the opposite side as a flagged fallback.
|
|
279
232
|
const wantOdd = n % 2 === 1
|
|
280
233
|
const exact = rows.filter((r) => r.parity === (wantOdd ? "odd" : "even"))
|
|
281
234
|
const mixed = rows.filter((r) => r.parity === "mixed")
|
|
@@ -283,13 +236,8 @@ export class StreetInterpolator<
|
|
|
283
236
|
let pool = preferred.length ? preferred : rows
|
|
284
237
|
const parityMatched = preferred.length > 0
|
|
285
238
|
|
|
286
|
-
//
|
|
287
|
-
//
|
|
288
|
-
// rows: a section-line boundary road carries a different ZIP per side ("east 13 mile road"
|
|
289
|
-
// is Fraser 48026 odd / Roseville 48066 even), and the opposite side can never hold the
|
|
290
|
-
// number it would otherwise veto. When several postcodes survive parity, the caller's
|
|
291
|
-
// resolved-locality coordinate breaks the tie by segment proximity under the dominance
|
|
292
|
-
// geometry of {@link NEAR_MAX_KM} — a near-tie stays an abstention.
|
|
239
|
+
// Without a postcode the covering ranges must agree on one postcode
|
|
240
|
+
// or the lookup abstains, counted over the parity pool.
|
|
293
241
|
if (!query.postcode) {
|
|
294
242
|
const postcodes = new Set(pool.map((r) => r.postcode ?? ""))
|
|
295
243
|
|
|
@@ -301,7 +249,6 @@ export class StreetInterpolator<
|
|
|
301
249
|
}
|
|
302
250
|
}
|
|
303
251
|
|
|
304
|
-
// Tightest range wins — the most specific claim about where this number lives.
|
|
305
252
|
let best = pool[0]!
|
|
306
253
|
|
|
307
254
|
for (const candidate of pool) {
|
|
@@ -321,6 +268,7 @@ export class StreetInterpolator<
|
|
|
321
268
|
interpolated: true,
|
|
322
269
|
method: "tiger_range",
|
|
323
270
|
parityMatched,
|
|
271
|
+
bracket: null,
|
|
324
272
|
uncertaintyM: Math.round((lengthKm * 1000) / 2),
|
|
325
273
|
source: best.source,
|
|
326
274
|
release: best.release,
|