@mailwoman/corpus 4.16.2 → 5.0.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/out/src/adapter.d.ts +23 -26
- package/out/src/adapter.d.ts.map +1 -1
- package/out/src/adapter.js +25 -28
- package/out/src/adapter.js.map +1 -1
- package/out/src/adapters/ban/adapter.d.ts.map +1 -1
- package/out/src/adapters/ban/adapter.js +10 -10
- package/out/src/adapters/ban/adapter.js.map +1 -1
- package/out/src/adapters/ban/street-decompose.d.ts +2 -2
- package/out/src/adapters/ban/street-decompose.d.ts.map +1 -1
- package/out/src/adapters/ban/street-decompose.js +2 -2
- package/out/src/adapters/ban/street-decompose.js.map +1 -1
- package/out/src/adapters/fcc-bdc/adapter.d.ts +2 -2
- package/out/src/adapters/fcc-bdc/adapter.d.ts.map +1 -1
- package/out/src/adapters/fcc-bdc/adapter.js +9 -9
- package/out/src/adapters/fcc-bdc/adapter.js.map +1 -1
- package/out/src/adapters/geonames/adapter.d.ts.map +1 -1
- package/out/src/adapters/geonames/adapter.js +5 -5
- package/out/src/adapters/geonames/adapter.js.map +1 -1
- package/out/src/adapters/geonames-postal/adapter.d.ts.map +1 -1
- package/out/src/adapters/geonames-postal/adapter.js +3 -3
- package/out/src/adapters/geonames-postal/adapter.js.map +1 -1
- package/out/src/adapters/gnaf/adapter.d.ts +3 -3
- package/out/src/adapters/gnaf/adapter.d.ts.map +1 -1
- package/out/src/adapters/gnaf/adapter.js +11 -10
- package/out/src/adapters/gnaf/adapter.js.map +1 -1
- package/out/src/adapters/gnaf/assemble.d.ts +4 -5
- package/out/src/adapters/gnaf/assemble.d.ts.map +1 -1
- package/out/src/adapters/gnaf/assemble.js +1 -1
- package/out/src/adapters/gnaf/assemble.js.map +1 -1
- package/out/src/adapters/index.d.ts +9 -10
- package/out/src/adapters/index.d.ts.map +1 -1
- package/out/src/adapters/index.js +13 -14
- package/out/src/adapters/index.js.map +1 -1
- package/out/src/adapters/openaddresses/adapter.d.ts +8 -10
- package/out/src/adapters/openaddresses/adapter.d.ts.map +1 -1
- package/out/src/adapters/openaddresses/adapter.js +8 -8
- package/out/src/adapters/openaddresses/adapter.js.map +1 -1
- package/out/src/adapters/overture/adapter.d.ts.map +1 -1
- package/out/src/adapters/overture/adapter.js +2 -2
- package/out/src/adapters/overture/adapter.js.map +1 -1
- package/out/src/adapters/state-hi-schools/adapter.d.ts +1 -1
- package/out/src/adapters/state-hi-schools/adapter.d.ts.map +1 -1
- package/out/src/adapters/state-hi-schools/adapter.js +6 -6
- package/out/src/adapters/state-hi-schools/adapter.js.map +1 -1
- package/out/src/adapters/state-ia-contractors/adapter.d.ts +1 -1
- package/out/src/adapters/state-ia-contractors/adapter.d.ts.map +1 -1
- package/out/src/adapters/state-ia-contractors/adapter.js +6 -6
- package/out/src/adapters/state-ia-contractors/adapter.js.map +1 -1
- package/out/src/adapters/state-ny-notaries/adapter.d.ts +1 -1
- package/out/src/adapters/state-ny-notaries/adapter.d.ts.map +1 -1
- package/out/src/adapters/state-ny-notaries/adapter.js +6 -6
- package/out/src/adapters/state-ny-notaries/adapter.js.map +1 -1
- package/out/src/adapters/state-tx-notaries/adapter.d.ts.map +1 -1
- package/out/src/adapters/state-tx-notaries/adapter.js +7 -7
- package/out/src/adapters/state-tx-notaries/adapter.js.map +1 -1
- package/out/src/adapters/synth-po-box/adapter.d.ts +9 -9
- package/out/src/adapters/synth-po-box/adapter.d.ts.map +1 -1
- package/out/src/adapters/synth-po-box/adapter.js +6 -6
- package/out/src/adapters/synth-po-box/adapter.js.map +1 -1
- package/out/src/adapters/tiger/adapter.d.ts.map +1 -1
- package/out/src/adapters/tiger/adapter.js +2 -2
- package/out/src/adapters/tiger/adapter.js.map +1 -1
- package/out/src/adapters/tiger/street-decompose.d.ts +2 -2
- package/out/src/adapters/tiger/street-decompose.d.ts.map +1 -1
- package/out/src/adapters/tiger/street-decompose.js +2 -2
- package/out/src/adapters/tiger/street-decompose.js.map +1 -1
- package/out/src/adapters/usgov-hrsa-fqhc/adapter.d.ts.map +1 -1
- package/out/src/adapters/usgov-hrsa-fqhc/adapter.js +15 -17
- package/out/src/adapters/usgov-hrsa-fqhc/adapter.js.map +1 -1
- package/out/src/adapters/usgov-imls-pls/adapter.d.ts +1 -1
- package/out/src/adapters/usgov-imls-pls/adapter.d.ts.map +1 -1
- package/out/src/adapters/usgov-imls-pls/adapter.js +6 -6
- package/out/src/adapters/usgov-imls-pls/adapter.js.map +1 -1
- package/out/src/adapters/usgov-irs-bmf/adapter.d.ts.map +1 -1
- package/out/src/adapters/usgov-irs-bmf/adapter.js +5 -5
- package/out/src/adapters/usgov-irs-bmf/adapter.js.map +1 -1
- package/out/src/adapters/usgov-nad/adapter.d.ts +2 -2
- package/out/src/adapters/usgov-nad/adapter.d.ts.map +1 -1
- package/out/src/adapters/usgov-nad/adapter.js +6 -6
- package/out/src/adapters/usgov-nad/adapter.js.map +1 -1
- package/out/src/adapters/usgov-nppes/adapter.d.ts +3 -3
- package/out/src/adapters/usgov-nppes/adapter.d.ts.map +1 -1
- package/out/src/adapters/usgov-nppes/adapter.js +7 -7
- package/out/src/adapters/usgov-nppes/adapter.js.map +1 -1
- package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.d.ts.map +1 -1
- package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js +12 -12
- package/out/src/adapters/usgov-samhsa-treatment-locator/adapter.js.map +1 -1
- package/out/src/adapters/wof-admin-jp/adapter.d.ts +3 -3
- package/out/src/adapters/wof-admin-jp/adapter.d.ts.map +1 -1
- package/out/src/adapters/wof-admin-jp/adapter.js +6 -6
- package/out/src/adapters/wof-admin-jp/adapter.js.map +1 -1
- package/out/src/adapters/wof-admin-json/adapter.d.ts +17 -19
- package/out/src/adapters/wof-admin-json/adapter.d.ts.map +1 -1
- package/out/src/adapters/wof-admin-json/adapter.js +25 -28
- package/out/src/adapters/wof-admin-json/adapter.js.map +1 -1
- package/out/src/adapters/wof-postalcode-json/adapter.d.ts +8 -8
- package/out/src/adapters/wof-postalcode-json/adapter.d.ts.map +1 -1
- package/out/src/adapters/wof-postalcode-json/adapter.js +11 -11
- package/out/src/adapters/wof-postalcode-json/adapter.js.map +1 -1
- package/out/src/align.d.ts +14 -16
- package/out/src/align.d.ts.map +1 -1
- package/out/src/align.js +15 -16
- package/out/src/align.js.map +1 -1
- package/out/src/build.d.ts +13 -15
- package/out/src/build.d.ts.map +1 -1
- package/out/src/build.js +4 -5
- package/out/src/build.js.map +1 -1
- package/out/src/codex/us-fips-state.d.ts +6 -8
- package/out/src/codex/us-fips-state.d.ts.map +1 -1
- package/out/src/codex/us-fips-state.js +6 -8
- package/out/src/codex/us-fips-state.js.map +1 -1
- package/out/src/golden.d.ts.map +1 -1
- package/out/src/golden.js +1 -1
- package/out/src/golden.js.map +1 -1
- package/out/src/index.d.ts +1 -0
- package/out/src/index.d.ts.map +1 -1
- package/out/src/index.js +1 -0
- package/out/src/index.js.map +1 -1
- package/out/src/license.d.ts +5 -6
- package/out/src/license.d.ts.map +1 -1
- package/out/src/license.js +5 -6
- package/out/src/license.js.map +1 -1
- package/out/src/parquet-wrapper/reader.d.ts.map +1 -1
- package/out/src/parquet-wrapper/reader.js.map +1 -1
- package/out/src/parquet-wrapper/writer.d.ts.map +1 -1
- package/out/src/parquet-wrapper/writer.js +2 -2
- package/out/src/parquet-wrapper/writer.js.map +1 -1
- package/out/src/parquet.d.ts +16 -18
- package/out/src/parquet.d.ts.map +1 -1
- package/out/src/parquet.js +22 -23
- package/out/src/parquet.js.map +1 -1
- package/out/src/runner.d.ts +10 -10
- package/out/src/runner.d.ts.map +1 -1
- package/out/src/runner.js +8 -8
- package/out/src/runner.js.map +1 -1
- package/out/src/shard-recipes/anchor-absorption.d.ts +16 -0
- package/out/src/shard-recipes/anchor-absorption.d.ts.map +1 -0
- package/out/src/shard-recipes/anchor-absorption.js +73 -0
- package/out/src/shard-recipes/anchor-absorption.js.map +1 -0
- package/out/src/shard-recipes/boundary-stress.d.ts +16 -0
- package/out/src/shard-recipes/boundary-stress.d.ts.map +1 -0
- package/out/src/shard-recipes/boundary-stress.js +77 -0
- package/out/src/shard-recipes/boundary-stress.js.map +1 -0
- package/out/src/shard-recipes/country-balanced.d.ts +28 -0
- package/out/src/shard-recipes/country-balanced.d.ts.map +1 -0
- package/out/src/shard-recipes/country-balanced.js +370 -0
- package/out/src/shard-recipes/country-balanced.js.map +1 -0
- package/out/src/shard-recipes/fr-admin-split.d.ts +34 -0
- package/out/src/shard-recipes/fr-admin-split.d.ts.map +1 -0
- package/out/src/shard-recipes/fr-admin-split.js +175 -0
- package/out/src/shard-recipes/fr-admin-split.js.map +1 -0
- package/out/src/shard-recipes/fr-bare-street.d.ts +24 -0
- package/out/src/shard-recipes/fr-bare-street.d.ts.map +1 -0
- package/out/src/shard-recipes/fr-bare-street.js +76 -0
- package/out/src/shard-recipes/fr-bare-street.js.map +1 -0
- package/out/src/shard-recipes/fr-order.d.ts +34 -0
- package/out/src/shard-recipes/fr-order.d.ts.map +1 -0
- package/out/src/shard-recipes/fr-order.js +238 -0
- package/out/src/shard-recipes/fr-order.js.map +1 -0
- package/out/src/shard-recipes/german.d.ts +19 -0
- package/out/src/shard-recipes/german.d.ts.map +1 -0
- package/out/src/shard-recipes/german.js +170 -0
- package/out/src/shard-recipes/german.js.map +1 -0
- package/out/src/shard-recipes/house-venue.d.ts +14 -0
- package/out/src/shard-recipes/house-venue.d.ts.map +1 -0
- package/out/src/shard-recipes/house-venue.js +66 -0
- package/out/src/shard-recipes/house-venue.js.map +1 -0
- package/out/src/shard-recipes/index.d.ts +18 -0
- package/out/src/shard-recipes/index.d.ts.map +1 -0
- package/out/src/shard-recipes/index.js +58 -0
- package/out/src/shard-recipes/index.js.map +1 -0
- package/out/src/shard-recipes/intersection.d.ts +38 -0
- package/out/src/shard-recipes/intersection.d.ts.map +1 -0
- package/out/src/shard-recipes/intersection.js +473 -0
- package/out/src/shard-recipes/intersection.js.map +1 -0
- package/out/src/shard-recipes/locale.d.ts +19 -0
- package/out/src/shard-recipes/locale.d.ts.map +1 -0
- package/out/src/shard-recipes/locale.js +257 -0
- package/out/src/shard-recipes/locale.js.map +1 -0
- package/out/src/shard-recipes/no-street.d.ts +14 -0
- package/out/src/shard-recipes/no-street.d.ts.map +1 -0
- package/out/src/shard-recipes/no-street.js +66 -0
- package/out/src/shard-recipes/no-street.js.map +1 -0
- package/out/src/shard-recipes/po-box-cedex.d.ts +34 -0
- package/out/src/shard-recipes/po-box-cedex.d.ts.map +1 -0
- package/out/src/shard-recipes/po-box-cedex.js +686 -0
- package/out/src/shard-recipes/po-box-cedex.js.map +1 -0
- package/out/src/shard-recipes/po-box.d.ts +13 -0
- package/out/src/shard-recipes/po-box.d.ts.map +1 -0
- package/out/src/shard-recipes/po-box.js +93 -0
- package/out/src/shard-recipes/po-box.js.map +1 -0
- package/out/src/shard-recipes/scaffold.d.ts +104 -0
- package/out/src/shard-recipes/scaffold.d.ts.map +1 -0
- package/out/src/shard-recipes/scaffold.js +76 -0
- package/out/src/shard-recipes/scaffold.js.map +1 -0
- package/out/src/shard-recipes/street-affix.d.ts +31 -0
- package/out/src/shard-recipes/street-affix.d.ts.map +1 -0
- package/out/src/shard-recipes/street-affix.js +408 -0
- package/out/src/shard-recipes/street-affix.js.map +1 -0
- package/out/src/shard-recipes/street-bare.d.ts +21 -0
- package/out/src/shard-recipes/street-bare.d.ts.map +1 -0
- package/out/src/shard-recipes/street-bare.js +82 -0
- package/out/src/shard-recipes/street-bare.js.map +1 -0
- package/out/src/shard-recipes/street.d.ts +11 -0
- package/out/src/shard-recipes/street.d.ts.map +1 -0
- package/out/src/shard-recipes/street.js +63 -0
- package/out/src/shard-recipes/street.js.map +1 -0
- package/out/src/shard-recipes/unit.d.ts +25 -0
- package/out/src/shard-recipes/unit.d.ts.map +1 -0
- package/out/src/shard-recipes/unit.js +255 -0
- package/out/src/shard-recipes/unit.js.map +1 -0
- package/out/src/split.d.ts +23 -29
- package/out/src/split.d.ts.map +1 -1
- package/out/src/split.js +22 -29
- package/out/src/split.js.map +1 -1
- package/out/src/synthesize-anchor-absorption.d.ts +2 -3
- package/out/src/synthesize-anchor-absorption.d.ts.map +1 -1
- package/out/src/synthesize-anchor-absorption.js +2 -2
- package/out/src/synthesize-anchor-absorption.js.map +1 -1
- package/out/src/synthesize-boundary-stress.d.ts +3 -4
- package/out/src/synthesize-boundary-stress.d.ts.map +1 -1
- package/out/src/synthesize-boundary-stress.js +3 -4
- package/out/src/synthesize-boundary-stress.js.map +1 -1
- package/out/src/synthesize-german.d.ts +15 -19
- package/out/src/synthesize-german.d.ts.map +1 -1
- package/out/src/synthesize-german.js +14 -17
- package/out/src/synthesize-german.js.map +1 -1
- package/out/src/synthesize-house-venue.d.ts +2 -3
- package/out/src/synthesize-house-venue.d.ts.map +1 -1
- package/out/src/synthesize-house-venue.js +2 -3
- package/out/src/synthesize-house-venue.js.map +1 -1
- package/out/src/synthesize-intersection.d.ts +2 -2
- package/out/src/synthesize-intersection.d.ts.map +1 -1
- package/out/src/synthesize-intersection.js +4 -4
- package/out/src/synthesize-intersection.js.map +1 -1
- package/out/src/synthesize-no-street.d.ts +5 -5
- package/out/src/synthesize-no-street.d.ts.map +1 -1
- package/out/src/synthesize-no-street.js +27 -23
- package/out/src/synthesize-no-street.js.map +1 -1
- package/out/src/synthesize-po-box.d.ts +15 -17
- package/out/src/synthesize-po-box.d.ts.map +1 -1
- package/out/src/synthesize-po-box.js +27 -27
- package/out/src/synthesize-po-box.js.map +1 -1
- package/out/src/synthesize-street.d.ts +8 -9
- package/out/src/synthesize-street.d.ts.map +1 -1
- package/out/src/synthesize-street.js +3 -3
- package/out/src/synthesize-street.js.map +1 -1
- package/out/src/synthesize.d.ts +57 -66
- package/out/src/synthesize.d.ts.map +1 -1
- package/out/src/synthesize.js +56 -65
- package/out/src/synthesize.js.map +1 -1
- package/out/src/tokenize.d.ts +5 -6
- package/out/src/tokenize.d.ts.map +1 -1
- package/out/src/tokenize.js +5 -6
- package/out/src/tokenize.js.map +1 -1
- package/out/src/types.d.ts +49 -51
- package/out/src/types.d.ts.map +1 -1
- package/out/src/wof-json.d.ts +32 -34
- package/out/src/wof-json.d.ts.map +1 -1
- package/out/src/wof-json.js +23 -25
- package/out/src/wof-json.js.map +1 -1
- package/package.json +14 -14
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* `street-affix` shard recipe — the US street-affix coverage shard (the v0-parity `street_prefix` /
|
|
7
|
+
* `street_suffix` gap — both ~0% F1 in the #15 assessment, collapsed into `street`). Raises
|
|
8
|
+
* PREVALENCE of affix-split streets with format diversity so the model learns to split "N Main
|
|
9
|
+
* St" → street_prefix="N" + street="Main" + street_suffix="St", and (negative space) sharpens
|
|
10
|
+
* `street` itself. Ported from scripts/build-street-affix-shard.mjs.
|
|
11
|
+
*
|
|
12
|
+
* Reads REAL US OpenAddresses tuples and SPLITS the OA `street` field via the codex:
|
|
13
|
+
* `matchLeadingDirectional` (USPS Pub-28 C1) for the prefix, `matchTrailingSuffix` (Pub-28 C2
|
|
14
|
+
* street suffixes) for the suffix. OA streets nearly all carry a suffix; only ~10-20% carry a
|
|
15
|
+
* directional, so we INJECT a directional prefix onto a fraction of prefix-less streets to give
|
|
16
|
+
* `street_prefix` real signal. Each row varies surface form per affix — abbreviated ("N", "St")
|
|
17
|
+
* vs expanded ("North", "Street") — and varies the layout (full address / bare / street-only /
|
|
18
|
+
* venue-prefixed).
|
|
19
|
+
*
|
|
20
|
+
* LEAKAGE-SAFE EVAL (`--golden`): held-out eval uses the VERMONT source only (the corpus
|
|
21
|
+
* defaultHoldout), a different seed, and emits {raw, components} for per-locale-f1. Train uses
|
|
22
|
+
* every NON-Vermont US source.
|
|
23
|
+
*
|
|
24
|
+
* Multi-locale BALANCE (`--multilocale-count`, opts.multilocaleCount > 0): appends NO-affix
|
|
25
|
+
* native-order rows (FR/DE/IT/NL) AFTER the US affix rows, riding the same source weight, purely
|
|
26
|
+
* to keep the postcode-ORDER distribution multi-locale so a US-heavy affix shard doesn't dilute
|
|
27
|
+
* FR/DE postcode (the v0.9.8 blemish).
|
|
28
|
+
*/
|
|
29
|
+
import { spawnSync } from "node:child_process";
|
|
30
|
+
import { DirectionalAbbreviation, lookupDirectional, matchCase, matchLeadingDirectional, matchTrailingSuffix, renderDirectional, US_STREET_SUFFIX_PREFERRED_ABBR, } from "@mailwoman/codex/us";
|
|
31
|
+
import { stableSourceID } from "../adapter.js";
|
|
32
|
+
import { alignRow } from "../align.js";
|
|
33
|
+
import { makeMulberry32 } from "./scaffold.js";
|
|
34
|
+
const TRAIN_SOURCES = [
|
|
35
|
+
{ zip: "/tmp/oa-cache/us__ca__berkeley.zip", csv: "us/ca/berkeley.csv", region: "CA" },
|
|
36
|
+
{ zip: "/tmp/oa-cache/us__ca__marin.zip", csv: "us/ca/marin.csv", region: "CA" },
|
|
37
|
+
{ zip: "/tmp/oa-cache/us__dc__statewide.zip", csv: "us/dc/statewide.csv", region: "DC" },
|
|
38
|
+
{ zip: "/tmp/oa-cache/us__ia__statewide.zip", csv: "us/ia/statewide.csv", region: "IA" },
|
|
39
|
+
{ zip: "/tmp/oa-cache/us__il__cook.zip", csv: "us/il/cook.csv", region: "IL" },
|
|
40
|
+
{ zip: "/tmp/oa-cache/us__mt__statewide.zip", csv: "us/mt/statewide.csv", region: "MT" },
|
|
41
|
+
{ zip: "/tmp/oa-cache/us__sd__statewide.zip", csv: "us/sd/statewide.csv", region: "SD" },
|
|
42
|
+
];
|
|
43
|
+
const EVAL_SOURCE = { zip: "/tmp/oa-cache/us__vt__statewide.zip", csv: "us/vt/statewide.csv", region: "VT" };
|
|
44
|
+
const MULTILOCALE_SOURCES = [
|
|
45
|
+
{ zip: "/tmp/oa-cache/de__sn__statewide.zip", csv: "de/sn/statewide.csv", iso2: "DE", region: "", order: "eu" },
|
|
46
|
+
{ zip: "/tmp/oa-cache/fr__countrywide.zip", csv: "fr/countrywide.csv", iso2: "FR", region: "", order: "fr" },
|
|
47
|
+
{ zip: "/tmp/oa-cache/it__countrywide.zip", csv: "it/countrywide.csv", iso2: "IT", region: "", order: "eu" },
|
|
48
|
+
{ zip: "/tmp/oa-cache/nl__countrywide.zip", csv: "nl/countrywide.csv", iso2: "NL", region: "", order: "eu" },
|
|
49
|
+
];
|
|
50
|
+
const MULTILOCALE_EVAL_SOURCES = [
|
|
51
|
+
{ zip: "/tmp/oa-cache/de__berlin.zip", csv: "de/berlin.csv", iso2: "DE", region: "", order: "eu" },
|
|
52
|
+
];
|
|
53
|
+
const DIRECTIONAL_ABBRS = Object.values(DirectionalAbbreviation); // ["N","E","S","W","NE","NW","SE","SW"]
|
|
54
|
+
const INJECT_PREFIX_PROB = 0.3; // fraction of prefix-less streets that get a synthetic directional
|
|
55
|
+
/** Minimal RFC-4180-ish splitter (handles quoted fields). */
|
|
56
|
+
function splitCSV(line) {
|
|
57
|
+
const out = [];
|
|
58
|
+
let cur = "";
|
|
59
|
+
let inQ = false;
|
|
60
|
+
for (let i = 0; i < line.length; i++) {
|
|
61
|
+
const c = line[i];
|
|
62
|
+
if (inQ) {
|
|
63
|
+
if (c === '"') {
|
|
64
|
+
if (line[i + 1] === '"') {
|
|
65
|
+
cur += '"';
|
|
66
|
+
i++;
|
|
67
|
+
}
|
|
68
|
+
else
|
|
69
|
+
inQ = false;
|
|
70
|
+
}
|
|
71
|
+
else
|
|
72
|
+
cur += c;
|
|
73
|
+
}
|
|
74
|
+
else if (c === '"')
|
|
75
|
+
inQ = true;
|
|
76
|
+
else if (c === ",") {
|
|
77
|
+
out.push(cur);
|
|
78
|
+
cur = "";
|
|
79
|
+
}
|
|
80
|
+
else
|
|
81
|
+
cur += c;
|
|
82
|
+
}
|
|
83
|
+
out.push(cur);
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
/** Stream real US tuples (number/street/city/postcode) out of a cached OA zip. */
|
|
87
|
+
function readTuples(source) {
|
|
88
|
+
const r = spawnSync("unzip", ["-p", source.zip, source.csv], { maxBuffer: 1024 * 1024 * 1024, encoding: "buffer" });
|
|
89
|
+
if (r.status !== 0) {
|
|
90
|
+
console.error(` WARN: unzip failed for ${source.zip} (status ${r.status})`);
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
const lines = r.stdout.toString("utf8").split(/\r?\n/);
|
|
94
|
+
if (lines.length < 2)
|
|
95
|
+
return [];
|
|
96
|
+
const header = splitCSV(lines[0]).map((h) => h.trim().toLowerCase());
|
|
97
|
+
const idx = (name) => header.indexOf(name);
|
|
98
|
+
const iNum = idx("number"), iStreet = idx("street"), iCity = idx("city"), iPost = idx("postcode");
|
|
99
|
+
const get = (cells, i) => (i >= 0 && i < cells.length ? (cells[i] ?? "").trim() : "");
|
|
100
|
+
const tuples = [];
|
|
101
|
+
const seen = new Set();
|
|
102
|
+
for (let li = 1; li < lines.length; li++) {
|
|
103
|
+
if (!lines[li])
|
|
104
|
+
continue;
|
|
105
|
+
const cells = splitCSV(lines[li]);
|
|
106
|
+
const street = get(cells, iStreet);
|
|
107
|
+
const locality = get(cells, iCity);
|
|
108
|
+
const house_number = get(cells, iNum);
|
|
109
|
+
if (!street || !locality || !house_number)
|
|
110
|
+
continue;
|
|
111
|
+
const key = `${house_number}|${street}|${locality}`.toLowerCase();
|
|
112
|
+
if (seen.has(key))
|
|
113
|
+
continue;
|
|
114
|
+
seen.add(key);
|
|
115
|
+
tuples.push({ house_number, street, locality, region: source.region, postcode: get(cells, iPost) });
|
|
116
|
+
}
|
|
117
|
+
return tuples;
|
|
118
|
+
}
|
|
119
|
+
const title = (s) => s
|
|
120
|
+
.toLowerCase()
|
|
121
|
+
.split(/\s+/)
|
|
122
|
+
.map((w) => (w ? w.charAt(0).toUpperCase() + w.slice(1) : w))
|
|
123
|
+
.join(" ");
|
|
124
|
+
const isSuffixOrDirectional = (word) => matchTrailingSuffix(word) !== null || matchLeadingDirectional(word) !== null;
|
|
125
|
+
/**
|
|
126
|
+
* Split an OA street into { prefix?, name, suffix } using the codex. Requires a trailing suffix and a non-empty name
|
|
127
|
+
* that isn't itself an affix token. Returns null when the street has no usable suffix.
|
|
128
|
+
*/
|
|
129
|
+
function parseStreet(street) {
|
|
130
|
+
let words = street.trim().split(/\s+/);
|
|
131
|
+
if (words.length < 2)
|
|
132
|
+
return null;
|
|
133
|
+
let prefix = null;
|
|
134
|
+
// Leading directional — only if it leaves ≥2 words behind (room for a name + suffix).
|
|
135
|
+
const lead = matchLeadingDirectional(street);
|
|
136
|
+
if (lead && words.length > 2) {
|
|
137
|
+
prefix = { canonical: lead.canonical, abbreviation: lead.abbreviation };
|
|
138
|
+
words = words.slice(1);
|
|
139
|
+
}
|
|
140
|
+
// Trailing USPS suffix — only if it leaves ≥1 word for the name.
|
|
141
|
+
const trail = matchTrailingSuffix(words.join(" "));
|
|
142
|
+
if (!trail || words.length < 2)
|
|
143
|
+
return null;
|
|
144
|
+
const suffix = trail.canonical;
|
|
145
|
+
const name = words.slice(0, -1).join(" ");
|
|
146
|
+
if (!name || isSuffixOrDirectional(name))
|
|
147
|
+
return null;
|
|
148
|
+
return { prefix, name, suffix };
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Render the affix-split street in random surface forms (abbrev vs expanded per affix), Title-cased.
|
|
152
|
+
*/
|
|
153
|
+
function renderStreet(random, parsed) {
|
|
154
|
+
const name = title(parsed.name);
|
|
155
|
+
const parts = [];
|
|
156
|
+
const components = { street: name };
|
|
157
|
+
// Prefix: natural (from parse) or injected onto a prefix-less street to boost street_prefix signal.
|
|
158
|
+
let prefix = parsed.prefix;
|
|
159
|
+
if (!prefix && random() < INJECT_PREFIX_PROB) {
|
|
160
|
+
const m = lookupDirectional(DIRECTIONAL_ABBRS[Math.floor(random() * DIRECTIONAL_ABBRS.length)]);
|
|
161
|
+
prefix = { canonical: m.directional, abbreviation: m.abbreviation };
|
|
162
|
+
}
|
|
163
|
+
if (prefix) {
|
|
164
|
+
const rendered = renderDirectional(prefix, random() < 0.5 ? "abbr" : "full", "Aa"); // "Aa" → Title-case
|
|
165
|
+
components.street_prefix = rendered;
|
|
166
|
+
parts.push(rendered);
|
|
167
|
+
}
|
|
168
|
+
parts.push(name);
|
|
169
|
+
// Suffix: abbreviated ("St") vs expanded ("Street"), Title-cased to match the name.
|
|
170
|
+
const full = title(parsed.suffix); // canonical is uppercase word → "Street"
|
|
171
|
+
const abbr = matchCase(US_STREET_SUFFIX_PREFERRED_ABBR[parsed.suffix], "Aa"); // "AVE" → "Ave"
|
|
172
|
+
const renderedSuffix = random() < 0.5 ? abbr : full;
|
|
173
|
+
components.street_suffix = renderedSuffix;
|
|
174
|
+
parts.push(renderedSuffix);
|
|
175
|
+
return { street: parts.join(" "), components };
|
|
176
|
+
}
|
|
177
|
+
/** Synthetic recipient/venue prefixes — the arena's "JOHN DOE, ACME INC, …" pattern. */
|
|
178
|
+
const VENUES = ["John Doe", "Jane Smith", "Acme Inc", "Wayne Enterprises", "Maria Garcia", "Riverside Clinic"];
|
|
179
|
+
const tail = (loc, reg, pc) => (pc ? `${loc}, ${reg} ${pc}` : `${loc}, ${reg}`);
|
|
180
|
+
/**
|
|
181
|
+
* Embed the rendered street in a RANDOM layout so the model recognizes affixes wherever the street sits: full address,
|
|
182
|
+
* bare house+street, street-only (pure affix parse), or venue-prefixed.
|
|
183
|
+
*/
|
|
184
|
+
function renderRow(random, base, street, streetComponents) {
|
|
185
|
+
const hn = base.house_number, loc = base.locality, reg = base.region, pc = base.postcode;
|
|
186
|
+
const road = `${hn} ${street}`;
|
|
187
|
+
const withRoad = { house_number: hn, ...streetComponents };
|
|
188
|
+
const r = random();
|
|
189
|
+
if (r < 0.4)
|
|
190
|
+
return {
|
|
191
|
+
fmt: "full",
|
|
192
|
+
raw: `${road}, ${tail(loc, reg, pc)}`,
|
|
193
|
+
components: { ...withRoad, locality: loc, region: reg, ...(pc ? { postcode: pc } : {}) },
|
|
194
|
+
};
|
|
195
|
+
if (r < 0.65)
|
|
196
|
+
return { fmt: "bare", raw: road, components: withRoad };
|
|
197
|
+
if (r < 0.85)
|
|
198
|
+
return { fmt: "street-only", raw: street, components: { ...streetComponents } };
|
|
199
|
+
const v = VENUES[Math.floor(random() * VENUES.length)];
|
|
200
|
+
return {
|
|
201
|
+
fmt: "venue",
|
|
202
|
+
raw: `${v}, ${road}, ${tail(loc, reg, pc)}`,
|
|
203
|
+
components: { venue: v, ...withRoad, locality: loc, region: reg, ...(pc ? { postcode: pc } : {}) },
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Capped reader for the multi-locale BALANCE sources. The FR/IT/NL countrywide extracts are GB-scale; reading the whole
|
|
208
|
+
* CSV blows V8's string limit, so cap the bytes with `head` (mirrors build-country-shard-balanced.mjs). Only keeps
|
|
209
|
+
* tuples that carry a POSTCODE.
|
|
210
|
+
*/
|
|
211
|
+
function readBalanceTuples(source, limit) {
|
|
212
|
+
const maxLines = Math.max(limit * 8, 20000) + 1;
|
|
213
|
+
const r = spawnSync("bash", ["-c", `unzip -p "${source.zip}" "${source.csv}" | head -n ${maxLines}`], {
|
|
214
|
+
maxBuffer: 1024 * 1024 * 1024,
|
|
215
|
+
encoding: "buffer",
|
|
216
|
+
});
|
|
217
|
+
if (r.status !== 0) {
|
|
218
|
+
console.error(` WARN: unzip failed for ${source.zip} (status ${r.status})`);
|
|
219
|
+
return [];
|
|
220
|
+
}
|
|
221
|
+
const lines = r.stdout.toString("utf8").split(/\r?\n/);
|
|
222
|
+
if (lines.length < 2)
|
|
223
|
+
return [];
|
|
224
|
+
const header = splitCSV(lines[0]).map((h) => h.trim().toLowerCase());
|
|
225
|
+
const idx = (n) => header.indexOf(n);
|
|
226
|
+
const iNum = idx("number"), iStreet = idx("street"), iCity = idx("city"), iRegion = idx("region"), iPost = idx("postcode");
|
|
227
|
+
const get = (cells, i) => (i >= 0 && i < cells.length ? (cells[i] ?? "").trim() : "");
|
|
228
|
+
const tuples = [];
|
|
229
|
+
const seen = new Set();
|
|
230
|
+
for (let li = 1; li < lines.length && tuples.length < limit; li++) {
|
|
231
|
+
if (!lines[li])
|
|
232
|
+
continue;
|
|
233
|
+
const cells = splitCSV(lines[li]);
|
|
234
|
+
const street = get(cells, iStreet), locality = get(cells, iCity), house_number = get(cells, iNum), postcode = get(cells, iPost);
|
|
235
|
+
if (!street || !locality || !house_number || !postcode)
|
|
236
|
+
continue; // postcode is required for balance
|
|
237
|
+
const key = `${house_number}|${street}|${locality}`.toLowerCase();
|
|
238
|
+
if (seen.has(key))
|
|
239
|
+
continue;
|
|
240
|
+
seen.add(key);
|
|
241
|
+
tuples.push({
|
|
242
|
+
house_number,
|
|
243
|
+
street,
|
|
244
|
+
locality,
|
|
245
|
+
region: get(cells, iRegion) || source.region,
|
|
246
|
+
postcode,
|
|
247
|
+
iso2: source.iso2,
|
|
248
|
+
order: source.order,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
return tuples;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Render a non-US BALANCE row in native order — NO affix split, NO country token. `street` is the OA value verbatim.
|
|
255
|
+
* The sole job is to put a postcode in its native position so the shard doesn't pull the model US-ward.
|
|
256
|
+
*/
|
|
257
|
+
function renderBalanceRow(t) {
|
|
258
|
+
const { house_number: hn, street, locality: loc, postcode: pc, order } = t;
|
|
259
|
+
// region is intentionally omitted — it isn't rendered in `raw`, so labeling it would fail alignment.
|
|
260
|
+
const components = { house_number: hn, street, locality: loc, postcode: pc };
|
|
261
|
+
const raw = order === "fr"
|
|
262
|
+
? `${hn} ${street}, ${pc} ${loc}` // French: number-street, postcode-city
|
|
263
|
+
: `${street} ${hn}, ${pc} ${loc}`;
|
|
264
|
+
// DE/IT/NL: street-number, postcode-city
|
|
265
|
+
return { raw, components };
|
|
266
|
+
}
|
|
267
|
+
export const streetAffixRecipe = {
|
|
268
|
+
name: "street-affix",
|
|
269
|
+
description: "US street-affix rows: OA streets split into street_prefix/street/street_suffix (+ multilocale balance)",
|
|
270
|
+
mode: "generate",
|
|
271
|
+
options: [
|
|
272
|
+
{
|
|
273
|
+
flag: "--multilocale-count <N>",
|
|
274
|
+
description: "Append N no-affix native-order balance rows (FR/DE/IT/NL). Default 0",
|
|
275
|
+
},
|
|
276
|
+
],
|
|
277
|
+
async run(opts, write) {
|
|
278
|
+
// Legacy build-street-affix-shard.mjs seeded `mulberry32(opts.seed)`.
|
|
279
|
+
const random = makeMulberry32(opts.seed);
|
|
280
|
+
const count = opts.count ?? 50000;
|
|
281
|
+
const source = opts.sourceName ?? "synth-affix";
|
|
282
|
+
const multilocaleCount = opts.multilocaleCount ?? 0;
|
|
283
|
+
const sources = opts.golden ? [EVAL_SOURCE] : TRAIN_SOURCES;
|
|
284
|
+
const pool = [];
|
|
285
|
+
for (const s of sources) {
|
|
286
|
+
const t = readTuples(s);
|
|
287
|
+
console.error(` ${s.csv}: ${t.length} unique tuples`);
|
|
288
|
+
for (const x of t)
|
|
289
|
+
pool.push(x);
|
|
290
|
+
}
|
|
291
|
+
if (pool.length === 0) {
|
|
292
|
+
throw new Error("No US tuples found — are the cached OA zips present in /tmp/oa-cache?");
|
|
293
|
+
}
|
|
294
|
+
let emitted = 0;
|
|
295
|
+
let skipped = 0;
|
|
296
|
+
let noAffix = 0;
|
|
297
|
+
let guard = 0;
|
|
298
|
+
const formatCounts = {};
|
|
299
|
+
const affixCounts = { prefix: 0, suffix: 0, both: 0 };
|
|
300
|
+
const N = pool.length;
|
|
301
|
+
while (emitted < count && guard++ < count * 10) {
|
|
302
|
+
const base = pool[Math.floor(random() * N)];
|
|
303
|
+
const parsed = parseStreet(base.street);
|
|
304
|
+
if (!parsed) {
|
|
305
|
+
noAffix++;
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
const { street, components: streetComponents } = renderStreet(random, parsed);
|
|
309
|
+
const { fmt, raw, components } = renderRow(random, base, street, streetComponents);
|
|
310
|
+
// Every affix surface form must survive verbatim in raw, else alignment can't label it.
|
|
311
|
+
const surfaces = [streetComponents.street_prefix, streetComponents.street, streetComponents.street_suffix].filter((s) => Boolean(s));
|
|
312
|
+
if (!surfaces.every((s) => raw.includes(s))) {
|
|
313
|
+
skipped++;
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
formatCounts[fmt] = (formatCounts[fmt] ?? 0) + 1;
|
|
317
|
+
const hasP = !!streetComponents.street_prefix;
|
|
318
|
+
if (hasP && streetComponents.street_suffix)
|
|
319
|
+
affixCounts.both++;
|
|
320
|
+
else if (hasP)
|
|
321
|
+
affixCounts.prefix++;
|
|
322
|
+
else
|
|
323
|
+
affixCounts.suffix++;
|
|
324
|
+
if (opts.golden) {
|
|
325
|
+
write(JSON.stringify({ raw, components, country: "US" }) + "\n");
|
|
326
|
+
emitted++;
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
const canonical = {
|
|
330
|
+
raw,
|
|
331
|
+
components,
|
|
332
|
+
country: "US",
|
|
333
|
+
locale: "en-US",
|
|
334
|
+
source,
|
|
335
|
+
source_id: stableSourceID(source, components),
|
|
336
|
+
corpus_version: "0.4.0",
|
|
337
|
+
license: "OpenAddresses US (non-VT) skeletons, street split via USPS Pub-28 C1/C2 (codex)",
|
|
338
|
+
};
|
|
339
|
+
const aligned = alignRow(canonical);
|
|
340
|
+
if (aligned.kind !== "labeled" || !aligned.row) {
|
|
341
|
+
skipped++;
|
|
342
|
+
continue;
|
|
343
|
+
}
|
|
344
|
+
write(JSON.stringify({ ...aligned.row, synth_method: "affix", synth_base_id: null }) + "\n");
|
|
345
|
+
emitted++;
|
|
346
|
+
}
|
|
347
|
+
// ── Multi-locale balance rows (--multilocale-count) ─────────────────────────────────────────────
|
|
348
|
+
// Appended AFTER the US affix rows so the US affix signal is unchanged (same `--count`), and the
|
|
349
|
+
// non-US rows ride the SAME source weight. Native-order postcodes, no affix labels.
|
|
350
|
+
let balanceEmitted = 0;
|
|
351
|
+
let balanceSkipped = 0;
|
|
352
|
+
const balanceISO = {};
|
|
353
|
+
if (multilocaleCount > 0) {
|
|
354
|
+
const mlSources = opts.golden ? MULTILOCALE_EVAL_SOURCES : MULTILOCALE_SOURCES;
|
|
355
|
+
const perSource = Math.ceil((multilocaleCount * 3) / mlSources.length); // over-read; balance locales
|
|
356
|
+
const mlPool = [];
|
|
357
|
+
for (const s of mlSources) {
|
|
358
|
+
const t = readBalanceTuples(s, perSource);
|
|
359
|
+
console.error(` balance ${s.csv} (${s.iso2}): ${t.length} tuples`);
|
|
360
|
+
for (const x of t)
|
|
361
|
+
mlPool.push(x);
|
|
362
|
+
}
|
|
363
|
+
const M = mlPool.length;
|
|
364
|
+
let mlGuard = 0;
|
|
365
|
+
while (M > 0 && balanceEmitted < multilocaleCount && mlGuard++ < multilocaleCount * 10) {
|
|
366
|
+
const t = mlPool[Math.floor(random() * M)];
|
|
367
|
+
const { raw, components } = renderBalanceRow(t);
|
|
368
|
+
// Every component surface must survive in raw, else alignment can't label it.
|
|
369
|
+
if (![components.street, components.locality, components.postcode].every((s) => !!s && raw.includes(s))) {
|
|
370
|
+
balanceSkipped++;
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
balanceISO[t.iso2] = (balanceISO[t.iso2] ?? 0) + 1;
|
|
374
|
+
const locale = `${t.iso2.toLowerCase()}-${t.iso2}`;
|
|
375
|
+
if (opts.golden) {
|
|
376
|
+
write(JSON.stringify({ raw, components, country: t.iso2 }) + "\n");
|
|
377
|
+
balanceEmitted++;
|
|
378
|
+
continue;
|
|
379
|
+
}
|
|
380
|
+
const canonical = {
|
|
381
|
+
raw,
|
|
382
|
+
components,
|
|
383
|
+
country: t.iso2,
|
|
384
|
+
locale,
|
|
385
|
+
source,
|
|
386
|
+
source_id: stableSourceID(source, components),
|
|
387
|
+
corpus_version: "0.4.0",
|
|
388
|
+
license: "OpenAddresses non-US skeletons (native-order postcode balance for the affix shard)",
|
|
389
|
+
};
|
|
390
|
+
const aligned = alignRow(canonical);
|
|
391
|
+
if (aligned.kind !== "labeled" || !aligned.row) {
|
|
392
|
+
balanceSkipped++;
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
write(JSON.stringify({ ...aligned.row, synth_method: "affix-balance", synth_base_id: null }) + "\n");
|
|
396
|
+
balanceEmitted++;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
console.error(`Done: emitted ${emitted} affix rows, skipped ${skipped}, no-affix ${noAffix} (pool ${pool.length}).\n` +
|
|
400
|
+
` formats: ${JSON.stringify(formatCounts)}\n` +
|
|
401
|
+
` affix mix: ${JSON.stringify(affixCounts)}` +
|
|
402
|
+
(multilocaleCount > 0
|
|
403
|
+
? `\n balance: emitted ${balanceEmitted}, skipped ${balanceSkipped}, iso ${JSON.stringify(balanceISO)}`
|
|
404
|
+
: ""));
|
|
405
|
+
return { emitted: emitted + balanceEmitted, skipped: skipped + balanceSkipped };
|
|
406
|
+
},
|
|
407
|
+
};
|
|
408
|
+
//# sourceMappingURL=street-affix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"street-affix.js","sourceRoot":"","sources":["../../../src/shard-recipes/street-affix.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* `street-bare` shard recipe — BARE-street rows (the v0.8.0 harness lever, 2026-06-05). The
|
|
7
|
+
* `functional.test.ts` cluster (bare street names — "10th Ave", "Main St", "1 Main Pl") was
|
|
8
|
+
* mislabeled `locality` because {@link synthesizeStreetRow} only ever emitted streets WITH a ",
|
|
9
|
+
* City, ST ZIP" tail. This recipe emits streets BARE (`--bare-prob`, default 0.6) — no tail, only
|
|
10
|
+
* `street_prefix`/`street`/`street_suffix` (+ optional `house_number` at `--hn-prob`, default
|
|
11
|
+
* 0.85) — over the built-in {@link DEFAULT_US_BASES} pool (round-robin). Generate-mode, US-only,
|
|
12
|
+
* in-distribution (no German-collapse risk). Ported from scripts/build-street-bare-shard.mjs.
|
|
13
|
+
*
|
|
14
|
+
* Byte-fidelity: the legacy script seeded its own mulberry32 from `--seed`
|
|
15
|
+
* (`mulberry32(opts.seed)`); this recipe re-creates the SAME generator
|
|
16
|
+
* (`makeMulberry32(opts.seed)`) and preserves the synthesis call order exactly, so `--seed N`
|
|
17
|
+
* reproduces the legacy run byte-for-byte.
|
|
18
|
+
*/
|
|
19
|
+
import { type ShardRecipe } from "./scaffold.js";
|
|
20
|
+
export declare const streetBareRecipe: ShardRecipe;
|
|
21
|
+
//# sourceMappingURL=street-bare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"street-bare.d.ts","sourceRoot":"","sources":["../../../src/shard-recipes/street-bare.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,EAAyD,KAAK,WAAW,EAAE,MAAM,eAAe,CAAA;AAEvG,eAAO,MAAM,gBAAgB,EAAE,WAiE9B,CAAA"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* `street-bare` shard recipe — BARE-street rows (the v0.8.0 harness lever, 2026-06-05). The
|
|
7
|
+
* `functional.test.ts` cluster (bare street names — "10th Ave", "Main St", "1 Main Pl") was
|
|
8
|
+
* mislabeled `locality` because {@link synthesizeStreetRow} only ever emitted streets WITH a ",
|
|
9
|
+
* City, ST ZIP" tail. This recipe emits streets BARE (`--bare-prob`, default 0.6) — no tail, only
|
|
10
|
+
* `street_prefix`/`street`/`street_suffix` (+ optional `house_number` at `--hn-prob`, default
|
|
11
|
+
* 0.85) — over the built-in {@link DEFAULT_US_BASES} pool (round-robin). Generate-mode, US-only,
|
|
12
|
+
* in-distribution (no German-collapse risk). Ported from scripts/build-street-bare-shard.mjs.
|
|
13
|
+
*
|
|
14
|
+
* Byte-fidelity: the legacy script seeded its own mulberry32 from `--seed`
|
|
15
|
+
* (`mulberry32(opts.seed)`); this recipe re-creates the SAME generator
|
|
16
|
+
* (`makeMulberry32(opts.seed)`) and preserves the synthesis call order exactly, so `--seed N`
|
|
17
|
+
* reproduces the legacy run byte-for-byte.
|
|
18
|
+
*/
|
|
19
|
+
import { alignRow } from "../align.js";
|
|
20
|
+
import { DEFAULT_US_BASES } from "../synthesize-intersection.js";
|
|
21
|
+
import { synthesizeStreetRow } from "../synthesize-street.js";
|
|
22
|
+
import { makeMulberry32, shardSourceID } from "./scaffold.js";
|
|
23
|
+
export const streetBareRecipe = {
|
|
24
|
+
name: "street-bare",
|
|
25
|
+
description: "Bare-street rows (US): DEFAULT_US_BASES → synthesizeStreetRow (bare) → aligned LabeledRow",
|
|
26
|
+
mode: "generate",
|
|
27
|
+
options: [
|
|
28
|
+
{ flag: "--bare-prob <p>", description: "P(emit the street BARE — no city/region/postcode tail). Default 0.6" },
|
|
29
|
+
{ flag: "--hn-prob <p>", description: "P(emit a house number). Default 0.85" },
|
|
30
|
+
],
|
|
31
|
+
async run(opts, write) {
|
|
32
|
+
const random = makeMulberry32(opts.seed);
|
|
33
|
+
const count = opts.count ?? 3000;
|
|
34
|
+
const bareProb = opts.bareProb ?? 0.6;
|
|
35
|
+
const hnProb = opts.hnProb ?? 0.85;
|
|
36
|
+
const source = opts.sourceName ?? "synth-street-bare";
|
|
37
|
+
let emitted = 0;
|
|
38
|
+
let skipped = 0;
|
|
39
|
+
let guard = 0;
|
|
40
|
+
while (emitted < count && guard++ < count * 5) {
|
|
41
|
+
const base = DEFAULT_US_BASES[emitted % DEFAULT_US_BASES.length];
|
|
42
|
+
const synth = synthesizeStreetRow(base, {
|
|
43
|
+
random,
|
|
44
|
+
bareProb,
|
|
45
|
+
includeHouseNumberProb: hnProb,
|
|
46
|
+
});
|
|
47
|
+
if (!synth) {
|
|
48
|
+
skipped++;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const isBare = synth.components.region === undefined;
|
|
52
|
+
const canonical = {
|
|
53
|
+
raw: synth.raw,
|
|
54
|
+
components: synth.components,
|
|
55
|
+
country: base.country,
|
|
56
|
+
locale: synth.locale,
|
|
57
|
+
source,
|
|
58
|
+
source_id: shardSourceID(source, {
|
|
59
|
+
street: synth.components.street,
|
|
60
|
+
street_suffix: synth.components.street_suffix,
|
|
61
|
+
house_number: synth.components.house_number,
|
|
62
|
+
bare: String(isBare),
|
|
63
|
+
n: String(emitted),
|
|
64
|
+
}),
|
|
65
|
+
corpus_version: "0.4.0",
|
|
66
|
+
license: "Synthetic — US street templates, public-domain street/city pools",
|
|
67
|
+
};
|
|
68
|
+
// Strict labeled-only check (matches the legacy builder): alignRow always returns a `row`
|
|
69
|
+
// (labeled OR quarantined), so the scaffold's `alignAndWrite` would write quarantined rows
|
|
70
|
+
// too — call alignRow directly and skip anything not "labeled".
|
|
71
|
+
const aligned = alignRow(canonical);
|
|
72
|
+
if (aligned.kind !== "labeled" || !aligned.row) {
|
|
73
|
+
skipped++;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
write(JSON.stringify({ ...aligned.row, synth_method: "street-bare", synth_base_id: null }) + "\n");
|
|
77
|
+
emitted++;
|
|
78
|
+
}
|
|
79
|
+
return { emitted, skipped };
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=street-bare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"street-bare.js","sourceRoot":"","sources":["../../../src/shard-recipes/street-bare.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAwB,MAAM,yBAAyB,CAAA;AACnF,OAAO,EAAE,cAAc,EAAE,aAAa,EAA4C,MAAM,eAAe,CAAA;AAEvG,MAAM,CAAC,MAAM,gBAAgB,GAAgB;IAC5C,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,2FAA2F;IACxG,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE;QACR,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,qEAAqE,EAAE;QAC/G,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,sCAAsC,EAAE;KAC9E;IACD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK;QACpB,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAA;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAA;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAA;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,mBAAmB,CAAA;QAErD,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,IAAI,KAAK,GAAG,CAAC,CAAA;QAEb,OAAO,OAAO,GAAG,KAAK,IAAI,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAE,CAAA;YACjE,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAuB,EAAE;gBAC1D,MAAM;gBACN,QAAQ;gBACR,sBAAsB,EAAE,MAAM;aAC9B,CAAC,CAAA;YAEF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACZ,OAAO,EAAE,CAAA;gBACT,SAAQ;YACT,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,SAAS,CAAA;YAEpD,MAAM,SAAS,GAAsB;gBACpC,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM;gBACN,SAAS,EAAE,aAAa,CAAC,MAAM,EAAE;oBAChC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM;oBAC/B,aAAa,EAAE,KAAK,CAAC,UAAU,CAAC,aAAa;oBAC7C,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,YAAY;oBAC3C,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;oBACpB,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;iBAClB,CAAC;gBACF,cAAc,EAAE,OAAO;gBACvB,OAAO,EAAE,kEAAkE;aAC3E,CAAA;YAED,0FAA0F;YAC1F,2FAA2F;YAC3F,gEAAgE;YAChE,MAAM,OAAO,GAAG,QAAQ,CAAC,SAA2C,CAAC,CAAA;YAErE,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBAChD,OAAO,EAAE,CAAA;gBACT,SAAQ;YACT,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;YAClG,OAAO,EAAE,CAAA;QACV,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAA;IAC5B,CAAC;CACD,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* `street` shard recipe — synthetic street-decomposition rows for Stage 3 (US-only): tuples →
|
|
7
|
+
* {@link synthesizeStreetRow} → aligned LabeledRow. Ported from scripts/build-street-shard.mjs.
|
|
8
|
+
*/
|
|
9
|
+
import { type ShardRecipe } from "./scaffold.js";
|
|
10
|
+
export declare const streetRecipe: ShardRecipe;
|
|
11
|
+
//# sourceMappingURL=street.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"street.d.ts","sourceRoot":"","sources":["../../../src/shard-recipes/street.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAsC,KAAK,WAAW,EAAE,MAAM,eAAe,CAAA;AAEpF,eAAO,MAAM,YAAY,EAAE,WAyD1B,CAAA"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* `street` shard recipe — synthetic street-decomposition rows for Stage 3 (US-only): tuples →
|
|
7
|
+
* {@link synthesizeStreetRow} → aligned LabeledRow. Ported from scripts/build-street-shard.mjs.
|
|
8
|
+
*/
|
|
9
|
+
import { stableSourceID } from "../adapter.js";
|
|
10
|
+
import { synthesizeStreetRow } from "../synthesize-street.js";
|
|
11
|
+
import { alignAndWrite, makeLcg, readTuples } from "./scaffold.js";
|
|
12
|
+
export const streetRecipe = {
|
|
13
|
+
name: "street",
|
|
14
|
+
description: "Street-decomposition rows (US): tuples → synthesizeStreetRow → aligned LabeledRow",
|
|
15
|
+
mode: "tuples",
|
|
16
|
+
options: [{ flag: "--house-number-prob <p>", description: "P(emit a house number). Default 0.85" }],
|
|
17
|
+
async run(opts, write) {
|
|
18
|
+
if (!opts.input)
|
|
19
|
+
throw new Error("street recipe requires --input <tuples.jsonl>");
|
|
20
|
+
const random = makeLcg(opts.seed);
|
|
21
|
+
const includeHouseNumberProb = opts.houseNumberProb ?? 0.85;
|
|
22
|
+
let read = 0;
|
|
23
|
+
let emitted = 0;
|
|
24
|
+
let skipped = 0;
|
|
25
|
+
for await (const tuple of readTuples(opts.input)) {
|
|
26
|
+
read++;
|
|
27
|
+
if (!tuple.locality || !tuple.region || !tuple.postcode || !tuple.country) {
|
|
28
|
+
skipped++;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (tuple.country !== "US") {
|
|
32
|
+
skipped++;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
for (let v = 0; v < opts.variants; v++) {
|
|
36
|
+
const synth = synthesizeStreetRow(tuple, { random, includeHouseNumberProb });
|
|
37
|
+
if (!synth)
|
|
38
|
+
continue;
|
|
39
|
+
const ok = alignAndWrite(write, {
|
|
40
|
+
raw: synth.raw,
|
|
41
|
+
components: synth.components,
|
|
42
|
+
country: tuple.country,
|
|
43
|
+
locale: synth.locale,
|
|
44
|
+
source: "synth-street",
|
|
45
|
+
source_id: stableSourceID("synth-street", {
|
|
46
|
+
locality: `${tuple.locality}#${v}`,
|
|
47
|
+
region: tuple.region,
|
|
48
|
+
postcode: tuple.postcode,
|
|
49
|
+
country: tuple.country,
|
|
50
|
+
}),
|
|
51
|
+
corpus_version: "0.4.0",
|
|
52
|
+
license: "Synthetic — public-domain street name + tuple combination",
|
|
53
|
+
}, "street-decomp");
|
|
54
|
+
if (ok)
|
|
55
|
+
emitted++;
|
|
56
|
+
else
|
|
57
|
+
skipped++;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return { read, emitted, skipped };
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=street.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"street.js","sourceRoot":"","sources":["../../../src/shard-recipes/street.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAwB,MAAM,yBAAyB,CAAA;AACnF,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAoB,MAAM,eAAe,CAAA;AAEpF,MAAM,CAAC,MAAM,YAAY,GAAgB;IACxC,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,mFAAmF;IAChG,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,WAAW,EAAE,sCAAsC,EAAE,CAAC;IACnG,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;QACjF,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjC,MAAM,sBAAsB,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAA;QAC3D,IAAI,IAAI,GAAG,CAAC,CAAA;QACZ,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,IAAI,OAAO,GAAG,CAAC,CAAA;QAEf,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,IAAI,EAAE,CAAA;YAEN,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC3E,OAAO,EAAE,CAAA;gBACT,SAAQ;YACT,CAAC;YAED,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC5B,OAAO,EAAE,CAAA;gBACT,SAAQ;YACT,CAAC;YAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAwB,EAAE,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC,CAAA;gBAE/F,IAAI,CAAC,KAAK;oBAAE,SAAQ;gBACpB,MAAM,EAAE,GAAG,aAAa,CACvB,KAAK,EACL;oBACC,GAAG,EAAE,KAAK,CAAC,GAAG;oBACd,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,MAAM,EAAE,cAAc;oBACtB,SAAS,EAAE,cAAc,CAAC,cAAc,EAAE;wBACzC,QAAQ,EAAE,GAAG,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE;wBAClC,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,OAAO,EAAE,KAAK,CAAC,OAAO;qBACtB,CAAC;oBACF,cAAc,EAAE,OAAO;oBACvB,OAAO,EAAE,2DAA2D;iBACpE,EACD,eAAe,CACf,CAAA;gBAED,IAAI,EAAE;oBAAE,OAAO,EAAE,CAAA;;oBACZ,OAAO,EAAE,CAAA;YACf,CAAC;QACF,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAA;IAClC,CAAC;CACD,CAAA"}
|