@mailwoman/corpus 4.16.2 → 5.1.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 +6 -6
- 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,473 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* `intersection` shard recipe — the REAL-pair intersection training shard (#487). The model scored
|
|
7
|
+
* 0.0 on intersection_a/b because the training mix had ZERO intersection-labeled rows. This is
|
|
8
|
+
* the missing data. Ported from scripts/build-intersection-shard.mjs.
|
|
9
|
+
*
|
|
10
|
+
* STREET PAIRS ARE REAL: the same TIGER 2023 EDGES extraction as the eval builder
|
|
11
|
+
* (scripts/eval/build-intersection-real.ts) — a node where two road edges (MTFCC S1*) with
|
|
12
|
+
* distinct FULLNAMEs meet is a real crossing. Real pairs avoid teaching fake street-street
|
|
13
|
+
* co-occurrences.
|
|
14
|
+
*
|
|
15
|
+
* LEAKAGE POLICY (mirrors the affix shard's VT discipline):
|
|
16
|
+
*
|
|
17
|
+
* - TRAIN counties: Cook IL (grid city) + Morris NJ (suburb).
|
|
18
|
+
* - GOLDEN (`--golden`) county: Washington VT (rural) ONLY — the corpus defaultHoldout state.
|
|
19
|
+
* - Every crossing in data/eval/external/intersection-real.jsonl is excluded from BOTH modes, by node
|
|
20
|
+
* id AND by order-insensitive name pair (the eval shares all three counties).
|
|
21
|
+
*
|
|
22
|
+
* RENDERING: junction-format variety — padded/TIGHT `&` and `/`, `and`, `at`, `@`, leading-phrase
|
|
23
|
+
* `corner of` / `intersection of` — crossed with tails (bare / `, ST` / `, ST ZIP` / `, City, ST
|
|
24
|
+
* [ZIP]`) and case variants. ZIPs are the crossing's own TIGER edge ZIPL (real); the locality
|
|
25
|
+
* tail comes from the OA Cook-county ZIP→city majority map.
|
|
26
|
+
*
|
|
27
|
+
* AUDIT: every emitted row is label-checked on the RAW SURFACE via the #519 char-offset span
|
|
28
|
+
* triple. Any violation FAILS the build (throws). A JSON audit report lands next to the output.
|
|
29
|
+
*
|
|
30
|
+
* External inputs (`--edges-dir`, opts.edgesDir; both already on disk — do not re-download):
|
|
31
|
+
*
|
|
32
|
+
* - <edges-dir>/tl_2023_{17031,34027,50023}_edges.shp (unzipped TIGER 2023 EDGES; default
|
|
33
|
+
* /tmp/tiger-edges)
|
|
34
|
+
* - /tmp/oa-cache/us__il__cook.zip (ZIP→city tails)
|
|
35
|
+
*/
|
|
36
|
+
import { spawnSync } from "node:child_process";
|
|
37
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
38
|
+
import { repoRootPathBuilder } from "@mailwoman/core/utils";
|
|
39
|
+
import { stableSourceID } from "../adapter.js";
|
|
40
|
+
import { alignRow } from "../align.js";
|
|
41
|
+
import { makeMulberry32 } from "./scaffold.js";
|
|
42
|
+
const TRAIN_COUNTIES = [
|
|
43
|
+
{ fips: "17031", state: "IL", regime: "grid-city" },
|
|
44
|
+
{ fips: "34027", state: "NJ", regime: "suburb" },
|
|
45
|
+
];
|
|
46
|
+
const GOLDEN_COUNTIES = [{ fips: "50023", state: "VT", regime: "rural" }];
|
|
47
|
+
const EVAL_GOLD_PATH = String(repoRootPathBuilder("data", "eval", "external", "intersection-real.jsonl"));
|
|
48
|
+
const OA_COOK = { zip: "/tmp/oa-cache/us__il__cook.zip", csv: "us/il/cook.csv" };
|
|
49
|
+
const FORMS = [
|
|
50
|
+
{ id: "amp", w: 0.2, render: (a, b) => `${a} & ${b}` },
|
|
51
|
+
{ id: "and", w: 0.2, render: (a, b) => `${a} and ${b}` },
|
|
52
|
+
{ id: "at", w: 0.12, render: (a, b) => `${a} at ${b}` },
|
|
53
|
+
{ id: "slash", w: 0.08, render: (a, b) => `${a} / ${b}` },
|
|
54
|
+
{ id: "slash-tight", w: 0.06, render: (a, b) => `${a}/${b}` },
|
|
55
|
+
{ id: "amp-tight", w: 0.05, render: (a, b) => `${a}&${b}` },
|
|
56
|
+
{ id: "at-sign", w: 0.06, render: (a, b) => `${a} @ ${b}` },
|
|
57
|
+
{ id: "corner-of", w: 0.115, render: (a, b) => `corner of ${a} and ${b}` },
|
|
58
|
+
{ id: "intersection-of", w: 0.115, render: (a, b) => `intersection of ${a} and ${b}` },
|
|
59
|
+
];
|
|
60
|
+
const TAILS = [
|
|
61
|
+
{ id: "bare", w: 0.55 },
|
|
62
|
+
{ id: "region", w: 0.16 },
|
|
63
|
+
{ id: "region-zip", w: 0.09 },
|
|
64
|
+
{ id: "city-region", w: 0.08 },
|
|
65
|
+
{ id: "city-region-zip", w: 0.12 },
|
|
66
|
+
];
|
|
67
|
+
const CASES = [
|
|
68
|
+
{ id: "as-is", w: 0.82, apply: (s) => s },
|
|
69
|
+
{ id: "upper", w: 0.12, apply: (s) => s.toUpperCase() },
|
|
70
|
+
{ id: "lower", w: 0.06, apply: (s) => s.toLowerCase() },
|
|
71
|
+
];
|
|
72
|
+
/**
|
|
73
|
+
* Words a connector may contribute as O tokens. The audit rejects any O token outside this set — an unlabeled
|
|
74
|
+
* street/locality token would surface here.
|
|
75
|
+
*/
|
|
76
|
+
const CONNECTOR_O_TOKENS = new Set(["and", "at", "of", "corner", "intersection"]);
|
|
77
|
+
/**
|
|
78
|
+
* Street names that would make the connector ambiguous or break verbatim alignment: embedded connector punctuation, or
|
|
79
|
+
* a standalone "and"/"at" word.
|
|
80
|
+
*/
|
|
81
|
+
const BAD_NAME = /[,&@/]|\b(and|at)\b/i;
|
|
82
|
+
/** Punctuation a connector form may leave between spans (besides whitespace): `, & @ /`. */
|
|
83
|
+
const CONNECTOR_PUNCT_RE = /^[\s,&@/]*$/;
|
|
84
|
+
function weightedPick(items, random) {
|
|
85
|
+
const total = items.reduce((s, x) => s + x.w, 0);
|
|
86
|
+
let r = random() * total;
|
|
87
|
+
for (const item of items) {
|
|
88
|
+
r -= item.w;
|
|
89
|
+
if (r <= 0)
|
|
90
|
+
return item;
|
|
91
|
+
}
|
|
92
|
+
return items[items.length - 1];
|
|
93
|
+
}
|
|
94
|
+
/** Minimal RFC-4180-ish splitter (handles quoted fields) — same as the affix builder. */
|
|
95
|
+
function splitCSV(line) {
|
|
96
|
+
const out = [];
|
|
97
|
+
let cur = "";
|
|
98
|
+
let inQ = false;
|
|
99
|
+
for (let i = 0; i < line.length; i++) {
|
|
100
|
+
const c = line[i];
|
|
101
|
+
if (inQ) {
|
|
102
|
+
if (c === '"') {
|
|
103
|
+
if (line[i + 1] === '"') {
|
|
104
|
+
cur += '"';
|
|
105
|
+
i++;
|
|
106
|
+
}
|
|
107
|
+
else
|
|
108
|
+
inQ = false;
|
|
109
|
+
}
|
|
110
|
+
else
|
|
111
|
+
cur += c;
|
|
112
|
+
}
|
|
113
|
+
else if (c === '"')
|
|
114
|
+
inQ = true;
|
|
115
|
+
else if (c === ",") {
|
|
116
|
+
out.push(cur);
|
|
117
|
+
cur = "";
|
|
118
|
+
}
|
|
119
|
+
else
|
|
120
|
+
cur += c;
|
|
121
|
+
}
|
|
122
|
+
out.push(cur);
|
|
123
|
+
return out;
|
|
124
|
+
}
|
|
125
|
+
/** Order-insensitive crossing key, for eval-leakage exclusion + pair dedup. */
|
|
126
|
+
const pairKey = (a, b) => [a.toLowerCase(), b.toLowerCase()].sort().join("\x1f");
|
|
127
|
+
/** Load the eval's crossings so neither train nor golden ever sees them. */
|
|
128
|
+
function readEvalExclusions() {
|
|
129
|
+
const nodes = new Set();
|
|
130
|
+
const pairs = new Set();
|
|
131
|
+
if (!existsSync(EVAL_GOLD_PATH)) {
|
|
132
|
+
console.error(` WARN: eval gold not found at ${EVAL_GOLD_PATH} — no eval-leakage exclusion applied`);
|
|
133
|
+
return { nodes, pairs };
|
|
134
|
+
}
|
|
135
|
+
for (const line of readFileSync(EVAL_GOLD_PATH, "utf8").split("\n")) {
|
|
136
|
+
if (!line)
|
|
137
|
+
continue;
|
|
138
|
+
const row = JSON.parse(line);
|
|
139
|
+
nodes.add(Number(row.node));
|
|
140
|
+
pairs.add(pairKey(row.components.intersection_a, row.components.intersection_b));
|
|
141
|
+
}
|
|
142
|
+
return { nodes, pairs };
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Extract real crossings from one county's TIGER EDGES shapefile. Same query shape as the eval builder (2 incident
|
|
146
|
+
* distinct S1* FULLNAMEs at a node, both names >=6 chars), plus the edge ZIPL so tails can carry the crossing's own
|
|
147
|
+
* ZIP. Hash-ordered for seed-stable determinism.
|
|
148
|
+
*/
|
|
149
|
+
async function extractCrossings(db, edgesDir, county, seed) {
|
|
150
|
+
const shp = `${edgesDir}/tl_2023_${county.fips}_edges.shp`;
|
|
151
|
+
const result = await db.runAndReadAll(`
|
|
152
|
+
WITH incidence AS (
|
|
153
|
+
SELECT TNIDF AS node, FULLNAME AS name, ZIPL AS zip
|
|
154
|
+
FROM ST_Read('${shp}') WHERE MTFCC LIKE 'S1%' AND FULLNAME IS NOT NULL
|
|
155
|
+
UNION ALL
|
|
156
|
+
SELECT TNIDT AS node, FULLNAME AS name, ZIPL AS zip
|
|
157
|
+
FROM ST_Read('${shp}') WHERE MTFCC LIKE 'S1%' AND FULLNAME IS NOT NULL
|
|
158
|
+
),
|
|
159
|
+
nodes AS (
|
|
160
|
+
SELECT node,
|
|
161
|
+
list_sort(list_distinct(list(name))) AS names,
|
|
162
|
+
max(zip) AS zip
|
|
163
|
+
FROM incidence GROUP BY node
|
|
164
|
+
HAVING len(list_distinct(list(name))) = 2
|
|
165
|
+
)
|
|
166
|
+
SELECT node, names[1] AS a, names[2] AS b, zip,
|
|
167
|
+
hash(node::VARCHAR || '${seed}') AS h
|
|
168
|
+
FROM nodes
|
|
169
|
+
WHERE len(names[1]) >= 6 AND len(names[2]) >= 6
|
|
170
|
+
ORDER BY h
|
|
171
|
+
`);
|
|
172
|
+
const out = [];
|
|
173
|
+
for (const r of result.getRowObjects()) {
|
|
174
|
+
out.push({
|
|
175
|
+
a: String(r.a),
|
|
176
|
+
b: String(r.b),
|
|
177
|
+
zip: r.zip == null ? null : String(r.zip),
|
|
178
|
+
node: Number(r.node),
|
|
179
|
+
fips: county.fips,
|
|
180
|
+
state: county.state,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
return out;
|
|
184
|
+
}
|
|
185
|
+
/** ZIP → majority city from the cached OA Cook-county CSV (real ZIP/city pairings). */
|
|
186
|
+
function buildZipCityMap() {
|
|
187
|
+
const r = spawnSync("unzip", ["-p", OA_COOK.zip, OA_COOK.csv], { maxBuffer: 1024 * 1024 * 1024, encoding: "buffer" });
|
|
188
|
+
if (r.status !== 0) {
|
|
189
|
+
console.error(` WARN: unzip failed for ${OA_COOK.zip} — city tails disabled`);
|
|
190
|
+
return new Map();
|
|
191
|
+
}
|
|
192
|
+
const lines = r.stdout.toString("utf8").split(/\r?\n/);
|
|
193
|
+
if (lines.length < 2)
|
|
194
|
+
return new Map();
|
|
195
|
+
const header = splitCSV(lines[0]).map((h) => h.trim().toLowerCase());
|
|
196
|
+
const iCity = header.indexOf("city");
|
|
197
|
+
const iPost = header.indexOf("postcode");
|
|
198
|
+
const counts = new Map();
|
|
199
|
+
// zip → Map(city → n)
|
|
200
|
+
for (let li = 1; li < lines.length; li++) {
|
|
201
|
+
if (!lines[li])
|
|
202
|
+
continue;
|
|
203
|
+
const cells = splitCSV(lines[li]);
|
|
204
|
+
const city = (cells[iCity] ?? "").trim();
|
|
205
|
+
const zip = (cells[iPost] ?? "").trim();
|
|
206
|
+
if (!city || !/^\d{5}$/.test(zip) || BAD_NAME.test(city))
|
|
207
|
+
continue;
|
|
208
|
+
let byCity = counts.get(zip);
|
|
209
|
+
if (!byCity)
|
|
210
|
+
counts.set(zip, (byCity = new Map()));
|
|
211
|
+
byCity.set(city, (byCity.get(city) ?? 0) + 1);
|
|
212
|
+
}
|
|
213
|
+
const map = new Map();
|
|
214
|
+
for (const [zip, byCity] of counts) {
|
|
215
|
+
let best = null;
|
|
216
|
+
for (const [city, n] of byCity)
|
|
217
|
+
if (!best || n > best.n)
|
|
218
|
+
best = { city, n };
|
|
219
|
+
if (best)
|
|
220
|
+
map.set(zip, best.city);
|
|
221
|
+
}
|
|
222
|
+
return map;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Render one crossing → { raw, components, formID, tailID, caseID }. Components are inserted in claim order (streets
|
|
226
|
+
* first) so alignment can't grab a region/postcode lookalike inside a street.
|
|
227
|
+
*/
|
|
228
|
+
function renderRow(random, crossing, zipCity) {
|
|
229
|
+
const form = weightedPick(FORMS, random);
|
|
230
|
+
const body = form.render(crossing.a, crossing.b);
|
|
231
|
+
let tail = weightedPick(TAILS, random);
|
|
232
|
+
const city = crossing.zip ? (zipCity.get(crossing.zip) ?? null) : null;
|
|
233
|
+
// Downgrade unsatisfiable tails (no ZIP on the edge / no city for the ZIP) to the region tail.
|
|
234
|
+
if ((tail.id === "region-zip" || tail.id === "city-region-zip") && !crossing.zip)
|
|
235
|
+
tail = TAILS[1];
|
|
236
|
+
if ((tail.id === "city-region" || tail.id === "city-region-zip") && !city)
|
|
237
|
+
tail = TAILS[1];
|
|
238
|
+
const components = { intersection_a: crossing.a, intersection_b: crossing.b };
|
|
239
|
+
let raw = body;
|
|
240
|
+
if (tail.id === "region") {
|
|
241
|
+
raw = `${body}, ${crossing.state}`;
|
|
242
|
+
components.region = crossing.state;
|
|
243
|
+
}
|
|
244
|
+
else if (tail.id === "region-zip") {
|
|
245
|
+
raw = `${body}, ${crossing.state} ${crossing.zip}`;
|
|
246
|
+
components.region = crossing.state;
|
|
247
|
+
components.postcode = crossing.zip;
|
|
248
|
+
}
|
|
249
|
+
else if (tail.id === "city-region") {
|
|
250
|
+
raw = `${body}, ${city}, ${crossing.state}`;
|
|
251
|
+
components.locality = city;
|
|
252
|
+
components.region = crossing.state;
|
|
253
|
+
}
|
|
254
|
+
else if (tail.id === "city-region-zip") {
|
|
255
|
+
raw = `${body}, ${city}, ${crossing.state} ${crossing.zip}`;
|
|
256
|
+
components.locality = city;
|
|
257
|
+
components.region = crossing.state;
|
|
258
|
+
components.postcode = crossing.zip;
|
|
259
|
+
}
|
|
260
|
+
const casing = weightedPick(CASES, random);
|
|
261
|
+
raw = casing.apply(raw);
|
|
262
|
+
// Components keep their original case; alignRow matches case-insensitively and labels the
|
|
263
|
+
// tokens of the (cased) raw — the parquet row carries tokens+labels only.
|
|
264
|
+
return { raw, components, formID: form.id, tailID: tail.id, caseID: casing.id };
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Label-correctness audit for one aligned row, on the RAW SURFACE via the #519 span triple. Returns a list of
|
|
268
|
+
* violations (empty = clean). Re-derives the span checks independent of `alignRow`'s own assertion, so a builder bug
|
|
269
|
+
* can't vouch for itself.
|
|
270
|
+
*/
|
|
271
|
+
function auditRow(row, components) {
|
|
272
|
+
const errors = [];
|
|
273
|
+
const { raw, tokens, labels, span_starts, span_ends, span_tags } = row;
|
|
274
|
+
if (tokens.length !== labels.length)
|
|
275
|
+
errors.push("tokens/labels length mismatch");
|
|
276
|
+
if (!span_starts || !span_ends || !span_tags) {
|
|
277
|
+
errors.push("missing the char-offset span triple (#519)");
|
|
278
|
+
return errors;
|
|
279
|
+
}
|
|
280
|
+
if (span_starts.length !== span_ends.length || span_starts.length !== span_tags.length) {
|
|
281
|
+
errors.push(`span triple not parallel: ${span_starts.length}/${span_ends.length}/${span_tags.length}`);
|
|
282
|
+
return errors;
|
|
283
|
+
}
|
|
284
|
+
for (let i = 0; i < span_starts.length; i++) {
|
|
285
|
+
if (!(span_starts[i] >= 0 && span_starts[i] < span_ends[i] && span_ends[i] <= raw.length)) {
|
|
286
|
+
errors.push(`span ${span_tags[i]}@[${span_starts[i]}, ${span_ends[i]}) out of bounds`);
|
|
287
|
+
}
|
|
288
|
+
if (i > 0 && span_starts[i] < span_ends[i - 1]) {
|
|
289
|
+
errors.push(`spans unsorted/overlapping at index ${i}`);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
if (errors.length > 0)
|
|
293
|
+
return errors;
|
|
294
|
+
const compCount = Object.keys(components).length;
|
|
295
|
+
if (span_tags.length !== compCount)
|
|
296
|
+
errors.push(`span count ${span_tags.length} != components ${compCount}`);
|
|
297
|
+
// Raw-surface reconstruction: each component's single span slices raw to the component verbatim.
|
|
298
|
+
for (const [tag, value] of Object.entries(components)) {
|
|
299
|
+
if (value == null)
|
|
300
|
+
continue;
|
|
301
|
+
const indices = span_tags.map((t, i) => (t === tag ? i : -1)).filter((i) => i >= 0);
|
|
302
|
+
if (indices.length !== 1) {
|
|
303
|
+
errors.push(`${tag}: expected 1 span, got ${indices.length}`);
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
const idx = indices[0];
|
|
307
|
+
const got = raw.slice(span_starts[idx], span_ends[idx]);
|
|
308
|
+
if (got.toLowerCase() !== value.toLowerCase())
|
|
309
|
+
errors.push(`${tag} span "${got}" != component "${value}"`);
|
|
310
|
+
}
|
|
311
|
+
// Negative space: every char outside the spans must be connector material.
|
|
312
|
+
let cursor = 0;
|
|
313
|
+
const uncovered = [];
|
|
314
|
+
for (let i = 0; i < span_starts.length; i++) {
|
|
315
|
+
if (span_starts[i] > cursor)
|
|
316
|
+
uncovered.push(raw.slice(cursor, span_starts[i]));
|
|
317
|
+
cursor = span_ends[i];
|
|
318
|
+
}
|
|
319
|
+
if (cursor < raw.length)
|
|
320
|
+
uncovered.push(raw.slice(cursor));
|
|
321
|
+
for (const segment of uncovered) {
|
|
322
|
+
const words = segment.match(/[\p{L}\p{N}]+/gu) ?? [];
|
|
323
|
+
for (const word of words) {
|
|
324
|
+
if (!CONNECTOR_O_TOKENS.has(word.toLowerCase()))
|
|
325
|
+
errors.push(`illegal uncovered word "${word}"`);
|
|
326
|
+
}
|
|
327
|
+
const punctOnly = segment.replace(/[\p{L}\p{N}]+/gu, "");
|
|
328
|
+
if (!CONNECTOR_PUNCT_RE.test(punctOnly))
|
|
329
|
+
errors.push(`illegal uncovered punctuation in "${segment}"`);
|
|
330
|
+
}
|
|
331
|
+
return errors;
|
|
332
|
+
}
|
|
333
|
+
export const intersectionRecipe = {
|
|
334
|
+
name: "intersection",
|
|
335
|
+
description: "Real-pair intersection rows (US): TIGER 2023 EDGES crossings → audited intersection_a/b labels",
|
|
336
|
+
mode: "generate",
|
|
337
|
+
options: [{ flag: "--edges-dir <dir>", description: "Unzipped TIGER 2023 EDGES dir. Default /tmp/tiger-edges" }],
|
|
338
|
+
async run(opts, write) {
|
|
339
|
+
// Legacy build-intersection-shard.mjs seeded `mulberry32(opts.seed)`.
|
|
340
|
+
const random = makeMulberry32(opts.seed);
|
|
341
|
+
const count = opts.count ?? 40000;
|
|
342
|
+
const source = opts.sourceName ?? "synth-intersection";
|
|
343
|
+
const edgesDir = opts.edgesDir ?? "/tmp/tiger-edges";
|
|
344
|
+
const counties = opts.golden ? GOLDEN_COUNTIES : TRAIN_COUNTIES;
|
|
345
|
+
const exclusions = readEvalExclusions();
|
|
346
|
+
console.error(` eval exclusions: ${exclusions.nodes.size} nodes, ${exclusions.pairs.size} pairs`);
|
|
347
|
+
const { DuckDBInstance } = await import("@duckdb/node-api");
|
|
348
|
+
const instance = await DuckDBInstance.create();
|
|
349
|
+
const db = await instance.connect();
|
|
350
|
+
await db.run("INSTALL spatial; LOAD spatial;");
|
|
351
|
+
// Pool real crossings: eval-excluded, connector-safe names, one crossing per distinct pair.
|
|
352
|
+
const pool = [];
|
|
353
|
+
const seenPairs = new Set();
|
|
354
|
+
const stats = { evalExcluded: 0, badName: 0, dupPair: 0 };
|
|
355
|
+
for (const county of counties) {
|
|
356
|
+
const crossings = await extractCrossings(db, edgesDir, county, opts.seed);
|
|
357
|
+
let kept = 0;
|
|
358
|
+
for (const c of crossings) {
|
|
359
|
+
const key = pairKey(c.a, c.b);
|
|
360
|
+
if (exclusions.nodes.has(c.node) || exclusions.pairs.has(key)) {
|
|
361
|
+
stats.evalExcluded++;
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
if (BAD_NAME.test(c.a) || BAD_NAME.test(c.b) || c.a.includes(c.b) || c.b.includes(c.a)) {
|
|
365
|
+
stats.badName++;
|
|
366
|
+
continue;
|
|
367
|
+
}
|
|
368
|
+
if (seenPairs.has(key)) {
|
|
369
|
+
stats.dupPair++;
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
seenPairs.add(key);
|
|
373
|
+
pool.push(c);
|
|
374
|
+
kept++;
|
|
375
|
+
}
|
|
376
|
+
console.error(` ${county.fips} (${county.state}, ${county.regime}): ${crossings.length} crossings, ${kept} kept`);
|
|
377
|
+
}
|
|
378
|
+
if (pool.length === 0) {
|
|
379
|
+
throw new Error(`No crossings found — are the TIGER EDGES shapefiles present in ${edgesDir}?`);
|
|
380
|
+
}
|
|
381
|
+
const zipCity = opts.golden ? new Map() : buildZipCityMap();
|
|
382
|
+
if (!opts.golden)
|
|
383
|
+
console.error(` zip→city map: ${zipCity.size} ZIPs (OA Cook)`);
|
|
384
|
+
let emitted = 0;
|
|
385
|
+
let skipped = 0;
|
|
386
|
+
let guard = 0;
|
|
387
|
+
const formCounts = {};
|
|
388
|
+
const tailCounts = {};
|
|
389
|
+
const caseCounts = {};
|
|
390
|
+
const countyCounts = {};
|
|
391
|
+
const usedCrossings = new Set();
|
|
392
|
+
const seenRaw = new Set();
|
|
393
|
+
const auditErrors = [];
|
|
394
|
+
const samples = [];
|
|
395
|
+
while (emitted < count && guard++ < count * 10) {
|
|
396
|
+
const crossing = pool[Math.floor(random() * pool.length)];
|
|
397
|
+
const { raw, components, formID, tailID, caseID } = renderRow(random, crossing, zipCity);
|
|
398
|
+
if (seenRaw.has(raw)) {
|
|
399
|
+
skipped++;
|
|
400
|
+
continue;
|
|
401
|
+
}
|
|
402
|
+
if (opts.golden) {
|
|
403
|
+
seenRaw.add(raw);
|
|
404
|
+
write(JSON.stringify({ raw, components, country: "US", form: formID }) + "\n");
|
|
405
|
+
formCounts[formID] = (formCounts[formID] ?? 0) + 1;
|
|
406
|
+
tailCounts[tailID] = (tailCounts[tailID] ?? 0) + 1;
|
|
407
|
+
caseCounts[caseID] = (caseCounts[caseID] ?? 0) + 1;
|
|
408
|
+
countyCounts[crossing.fips] = (countyCounts[crossing.fips] ?? 0) + 1;
|
|
409
|
+
usedCrossings.add(crossing.node);
|
|
410
|
+
emitted++;
|
|
411
|
+
continue;
|
|
412
|
+
}
|
|
413
|
+
const canonical = {
|
|
414
|
+
raw,
|
|
415
|
+
components,
|
|
416
|
+
country: "US",
|
|
417
|
+
locale: "en-US",
|
|
418
|
+
source,
|
|
419
|
+
source_id: stableSourceID(source, components),
|
|
420
|
+
corpus_version: "0.4.0",
|
|
421
|
+
license: "TIGER/Line 2023 EDGES (US Census, public domain) real street pairs; OA Cook IL zip-to-city tails",
|
|
422
|
+
};
|
|
423
|
+
// Verbatim-only alignment: raw is built from the component values, so a fuzzy fallback could
|
|
424
|
+
// only ever mislabel (e.g. claim a lookalike window for a near-duplicate street).
|
|
425
|
+
const aligned = alignRow(canonical, { maxEditDistance: 0 });
|
|
426
|
+
if (aligned.kind !== "labeled" || !aligned.row) {
|
|
427
|
+
skipped++;
|
|
428
|
+
continue;
|
|
429
|
+
}
|
|
430
|
+
const violations = auditRow(aligned.row, components);
|
|
431
|
+
if (violations.length > 0) {
|
|
432
|
+
auditErrors.push({ raw, violations });
|
|
433
|
+
continue;
|
|
434
|
+
}
|
|
435
|
+
seenRaw.add(raw);
|
|
436
|
+
write(JSON.stringify({ ...aligned.row, synth_method: "intersection", synth_base_id: null }) + "\n");
|
|
437
|
+
formCounts[formID] = (formCounts[formID] ?? 0) + 1;
|
|
438
|
+
tailCounts[tailID] = (tailCounts[tailID] ?? 0) + 1;
|
|
439
|
+
caseCounts[caseID] = (caseCounts[caseID] ?? 0) + 1;
|
|
440
|
+
countyCounts[crossing.fips] = (countyCounts[crossing.fips] ?? 0) + 1;
|
|
441
|
+
usedCrossings.add(crossing.node);
|
|
442
|
+
if (samples.length < FORMS.length && !samples.some((s) => s.form === formID)) {
|
|
443
|
+
samples.push({ form: formID, raw, tokens: aligned.row.tokens, labels: aligned.row.labels });
|
|
444
|
+
}
|
|
445
|
+
emitted++;
|
|
446
|
+
}
|
|
447
|
+
const report = {
|
|
448
|
+
mode: opts.golden ? "golden" : "train",
|
|
449
|
+
rows: emitted,
|
|
450
|
+
skipped,
|
|
451
|
+
pool: { crossings: pool.length, used: usedCrossings.size, ...stats },
|
|
452
|
+
per_county: countyCounts,
|
|
453
|
+
forms: formCounts,
|
|
454
|
+
tails: tailCounts,
|
|
455
|
+
cases: caseCounts,
|
|
456
|
+
audit: { errors: auditErrors.length, examples: auditErrors.slice(0, 10) },
|
|
457
|
+
seed: opts.seed,
|
|
458
|
+
source: "TIGER2023 EDGES via DuckDB ST_Read; node = 2 distinct S1* FULLNAMEs; eval crossings excluded",
|
|
459
|
+
samples,
|
|
460
|
+
};
|
|
461
|
+
writeFileSync(opts.output.replace(/\.jsonl$/, ".report.json"), JSON.stringify(report, null, "\t"));
|
|
462
|
+
console.error(`Done: emitted ${emitted} rows (skipped ${skipped}) from ${usedCrossings.size}/${pool.length} real crossings. → ${opts.output}\n` +
|
|
463
|
+
` forms: ${JSON.stringify(formCounts)}\n` +
|
|
464
|
+
` tails: ${JSON.stringify(tailCounts)}\n` +
|
|
465
|
+
` cases: ${JSON.stringify(caseCounts)}\n` +
|
|
466
|
+
` audit: ${auditErrors.length} violation(s)`);
|
|
467
|
+
if (auditErrors.length > 0) {
|
|
468
|
+
throw new Error(`AUDIT FAILED — first violation: ${JSON.stringify(auditErrors[0])}`);
|
|
469
|
+
}
|
|
470
|
+
return { emitted, skipped };
|
|
471
|
+
},
|
|
472
|
+
};
|
|
473
|
+
//# sourceMappingURL=intersection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intersection.js","sourceRoot":"","sources":["../../../src/shard-recipes/intersection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* `locale` shard recipe — the multi-locale generalization of the `german` recipe. Reads REAL
|
|
7
|
+
* OpenAddresses tuples for a `--country` (DE/FR/NL/IT/ES), renders each via
|
|
8
|
+
* {@link synthesizeLocaleRow} in BOTH orders (`--intl-fraction`, default 0.4 international / the
|
|
9
|
+
* rest country-native), aligns to BIO, and emits a labeled JSONL. Generate-mode: it STREAMS each
|
|
10
|
+
* source CSV (`unzip -p | readline`) and reservoir-samples to {@link RESERVOIR_CAP} (so FR/ES
|
|
11
|
+
* countrywide work in bounded memory), then draws `--count` rows from the pool with the passed
|
|
12
|
+
* `random`. Ported from scripts/build-locale-shard.mjs.
|
|
13
|
+
*
|
|
14
|
+
* The reservoir uses its OWN seeded PRNG ({@link mulberry32}, per part), independent of the emit
|
|
15
|
+
* `random`, so the input sample is reproducible WITHOUT perturbing the synth/order draws.
|
|
16
|
+
*/
|
|
17
|
+
import { type ShardRecipe } from "./scaffold.js";
|
|
18
|
+
export declare const localeRecipe: ShardRecipe;
|
|
19
|
+
//# sourceMappingURL=locale.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locale.d.ts","sourceRoot":"","sources":["../../../src/shard-recipes/locale.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAQH,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,eAAe,CAAA;AA6LhE,eAAO,MAAM,YAAY,EAAE,WA4F1B,CAAA"}
|