@mark1russell7/highways 0.5.1 → 0.7.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/build/index.js CHANGED
@@ -26872,19 +26872,6 @@ function formatActivation(report, candidates) {
26872
26872
  ].join("\n") + "\n";
26873
26873
  }
26874
26874
  // src/bench/exact/index.ts
26875
- /** This function gives the shortest distance from `start` to each node, with Dijkstra on an adjacency list. */
26876
- function distances(adj, start) {
26877
- const d = new Float64Array(adj.length).fill(Infinity);
26878
- d[start] = 0;
26879
- const done = new Uint8Array(adj.length);
26880
- for (;;) {
26881
- let u = -1;
26882
- for (let i = 0; i < adj.length; i++) if (!done[i] && d[i] < Infinity && (u < 0 || d[i] < d[u])) u = i;
26883
- if (u < 0) return d;
26884
- done[u] = 1;
26885
- for (const { to, len } of adj[u]) if (d[u] + len < d[to]) d[to] = d[u] + len;
26886
- }
26887
- }
26888
26875
  /** This function makes the network of the exact model for the edges of a graph. */
26889
26876
  function exactNetwork(graph, o) {
26890
26877
  const finder = new WayFinder(graph.nodes, {
@@ -26947,33 +26934,155 @@ function exactNetwork(graph, o) {
26947
26934
  margin: finder.margin
26948
26935
  };
26949
26936
  }
26937
+ /** A binary heap of node indexes by a key, smallest first. A node can be in the heap more than one time. The search skips an old entry. */
26938
+ var NodeHeap = class {
26939
+ #key = /* @__PURE__ */ new Float64Array(64);
26940
+ #node = /* @__PURE__ */ new Int32Array(64);
26941
+ size = 0;
26942
+ push(key, node) {
26943
+ if (this.size === this.#key.length) {
26944
+ const k = new Float64Array(2 * this.size);
26945
+ k.set(this.#key);
26946
+ this.#key = k;
26947
+ const n = new Int32Array(2 * this.size);
26948
+ n.set(this.#node);
26949
+ this.#node = n;
26950
+ }
26951
+ const keys = this.#key;
26952
+ const nodes = this.#node;
26953
+ let i = this.size++;
26954
+ while (i > 0) {
26955
+ const up = i - 1 >> 1;
26956
+ if (keys[up] <= key) break;
26957
+ keys[i] = keys[up];
26958
+ nodes[i] = nodes[up];
26959
+ i = up;
26960
+ }
26961
+ keys[i] = key;
26962
+ nodes[i] = node;
26963
+ }
26964
+ /** This method removes the node with the smallest key, and gives it. */
26965
+ pop() {
26966
+ const keys = this.#key;
26967
+ const nodes = this.#node;
26968
+ const top = nodes[0];
26969
+ const n = --this.size;
26970
+ const key = keys[n];
26971
+ const node = nodes[n];
26972
+ let i = 0;
26973
+ for (;;) {
26974
+ let c = 2 * i + 1;
26975
+ if (c >= n) break;
26976
+ if (c + 1 < n && keys[c + 1] < keys[c]) c++;
26977
+ if (keys[c] >= key) break;
26978
+ keys[i] = keys[c];
26979
+ nodes[i] = nodes[c];
26980
+ i = c;
26981
+ }
26982
+ keys[i] = key;
26983
+ nodes[i] = node;
26984
+ return top;
26985
+ }
26986
+ };
26950
26987
  /**
26951
- * This function gives the stretch of each route as the exact model counts it, by the edge id.
26952
- * The stretch of a route is its length without its two plug ends, divided by the shortest way in the network of the model.
26953
- * The function builds the network one time. The result function then measures each list of routes of the graph, so a portfolio pays for the network once.
26954
- * An edge without a route or without a way in the network has no value.
26988
+ * This function gives the shortest distance from `start` to each node of `targets` (A*). The search stops when it has each target.
26989
+ * The guide is the straight distance to the nearest target. Each link is a straight line, so the guide is not above the true distance at any time.
26990
+ * Thus the distances are the distances of Dijkstra. Only the order of the search changes.
26991
+ * A target that the search cannot reach gets `Infinity`.
26955
26992
  */
26956
- function exactStretches(graph, o = {}) {
26957
- const { adj, ends, margin } = exactNetwork(graph, o);
26958
- const best = /* @__PURE__ */ new Map();
26959
- const from = (a) => {
26960
- if (!best.has(a)) best.set(a, distances(adj, a));
26961
- return best.get(a);
26962
- };
26993
+ function distancesTo(points, adj, start, targets) {
26994
+ const d = new Float64Array(adj.length).fill(Infinity);
26995
+ const done = new Uint8Array(adj.length);
26996
+ const goal = new Set(targets);
26997
+ const ends = targets.map((t) => points[t]);
26998
+ const guide = (v) => {
26999
+ let h = Infinity;
27000
+ for (const t of ends) h = Math.min(h, dist(points[v], t));
27001
+ return h;
27002
+ };
27003
+ const heap = new NodeHeap();
27004
+ d[start] = 0;
27005
+ heap.push(guide(start), start);
27006
+ let left = goal.size;
27007
+ while (heap.size > 0 && left > 0) {
27008
+ const u = heap.pop();
27009
+ if (done[u]) continue;
27010
+ done[u] = 1;
27011
+ if (goal.has(u)) left--;
27012
+ for (const { to, len } of adj[u]) {
27013
+ const nd = d[u] + len;
27014
+ if (nd < d[to]) {
27015
+ d[to] = nd;
27016
+ done[to] = 0;
27017
+ heap.push(nd + guide(to), to);
27018
+ }
27019
+ }
27020
+ }
27021
+ return new Map(targets.map((t) => [t, d[t]]));
27022
+ }
27023
+ /**
27024
+ * This function gives the shortest distance in the network between the two end points of each edge, by the pair `a,b` of the end points.
27025
+ * The distance does not depend on the direction, so one search serves each edge between the same two points.
27026
+ * An end point of many edges starts one search to all its other end points. The function starts the searches from the end points with the most edges first.
27027
+ */
27028
+ function pairDistances(network) {
27029
+ const pairKey = (a, b) => a < b ? `${a},${b}` : `${b},${a}`;
27030
+ const partners = /* @__PURE__ */ new Map();
27031
+ const open = /* @__PURE__ */ new Set();
27032
+ for (const e of network.ends) {
27033
+ if (e.a === e.b) continue;
27034
+ const k = pairKey(e.a, e.b);
27035
+ if (open.has(k)) continue;
27036
+ open.add(k);
27037
+ for (const [u, v] of [[e.a, e.b], [e.b, e.a]]) {
27038
+ if (!partners.has(u)) partners.set(u, /* @__PURE__ */ new Set());
27039
+ partners.get(u).add(v);
27040
+ }
27041
+ }
27042
+ const out = /* @__PURE__ */ new Map();
27043
+ const order = [...partners.keys()].sort((u, v) => partners.get(v).size - partners.get(u).size || u - v);
27044
+ for (const u of order) {
27045
+ const targets = [...partners.get(u)].filter((v) => open.has(pairKey(u, v)));
27046
+ if (targets.length === 0) continue;
27047
+ for (const [v, len] of distancesTo(network.points, network.adj, u, targets)) {
27048
+ const k = pairKey(u, v);
27049
+ out.set(k, len);
27050
+ open.delete(k);
27051
+ }
27052
+ }
27053
+ return out;
27054
+ }
27055
+ /** This function gives the function of the stretch of each route of the graph, from the network and the shortest distance of each edge. */
27056
+ function stretchesOf(network, best) {
26963
27057
  return (routes) => {
26964
27058
  const byEdge = new Map(routes.map((r) => [r.edge, r]));
26965
27059
  const out = /* @__PURE__ */ new Map();
26966
- for (const e of ends) {
27060
+ for (const e of network.ends) {
26967
27061
  const r = byEdge.get(e.edge.id);
26968
27062
  if (!r || r.points.length < 2 || e.a === e.b) continue;
26969
- const b = from(e.a)[e.b];
27063
+ const b = best(e);
26970
27064
  if (!Number.isFinite(b) || b <= 1) continue;
26971
- out.set(e.edge.id, (polylineLength(r.points) - 2 * margin) / b);
27065
+ out.set(e.edge.id, (polylineLength(r.points) - 2 * network.margin) / b);
26972
27066
  }
26973
27067
  return out;
26974
27068
  };
26975
27069
  }
26976
27070
  /**
27071
+ * This function gives the stretch of each route as the exact model counts it, by the edge id.
27072
+ * The stretch of a route is its length without its two plug ends, divided by the shortest way in the network of the model.
27073
+ * The function builds the network one time. The result function then measures each list of routes of the graph, so a portfolio pays for the network once.
27074
+ * The first call finds the shortest ways with one A* search for each end point with edges (PORTFOLIO-SPEED). The later calls use them again.
27075
+ * An edge without a route or without a way in the network has no value.
27076
+ */
27077
+ function exactStretches(graph, o = {}) {
27078
+ const network = exactNetwork(graph, o);
27079
+ let best;
27080
+ return stretchesOf(network, (e) => {
27081
+ best ??= pairDistances(network);
27082
+ return best.get(e.a < e.b ? `${e.a},${e.b}` : `${e.b},${e.a}`) ?? Infinity;
27083
+ });
27084
+ }
27085
+ /**
26977
27086
  * This function gives the largest stretch of routes as the exact model counts it (`exactStretches`).
26978
27087
  * The cap of the model is a limit on this value.
26979
27088
  * An edge without a route or without a way in the network does not count. Without such an edge, the value is 1.
@@ -27774,7 +27883,10 @@ const PORTFOLIO_KS_API = [
27774
27883
  5,
27775
27884
  8
27776
27885
  ];
27777
- /** The size bands: up to 12 nodes, 13 to 24 nodes, and 25 to 40 nodes. An input above 40 nodes uses the band `n25-40`. */
27886
+ /**
27887
+ * The size bands: up to 12 nodes, 13 to 24 nodes, 25 to 40 nodes, 41 to 64 nodes and 65 to 128 nodes. An input above 128 nodes uses the band `n65-128`.
27888
+ * The two large bands come from PORTFOLIO-SPEED. Their boards have no optima, so their sets come from the B1 under the guard.
27889
+ */
27778
27890
  const PORTFOLIO_BANDS = [
27779
27891
  {
27780
27892
  id: "n1-12",
@@ -27787,6 +27899,14 @@ const PORTFOLIO_BANDS = [
27787
27899
  {
27788
27900
  id: "n25-40",
27789
27901
  maxNodes: 40
27902
+ },
27903
+ {
27904
+ id: "n41-64",
27905
+ maxNodes: 64
27906
+ },
27907
+ {
27908
+ id: "n65-128",
27909
+ maxNodes: 128
27790
27910
  }
27791
27911
  ];
27792
27912
  /** This function gives the band of a node count: the first band whose `maxNodes` is the count or more, else the last band. */
@@ -27796,7 +27916,7 @@ function portfolioBand(nodes, bands = PORTFOLIO_BANDS) {
27796
27916
  // src/portfolio/fit.ts
27797
27917
  /**
27798
27918
  * The fit of each rule, cap and size band, by the key `<rule>|<cap>|<band>`: the members of the default of the portfolio router, in their order.
27799
- * Each member has a node limit: it runs only on an input with that many nodes or fewer. The limits keep the model time at or below 40 ms.
27919
+ * Each member has a node limit: it runs only on an input with that many nodes or fewer. The limits keep the model time at or below 45 ms.
27800
27920
  * The base `shared` is not in a fit: the portfolio always runs it first.
27801
27921
  */
27802
27922
  const PORTFOLIO_FIT = {
@@ -27812,13 +27932,16 @@ const PORTFOLIO_FIT = {
27812
27932
  ],
27813
27933
  "collection|1.1|n13-24": [
27814
27934
  ["w3e:crossbars+stretch", 24],
27935
+ ["trunks-tree-bf08", 24],
27815
27936
  ["corners-side", 24],
27816
27937
  ["shared-p2", 24],
27817
27938
  ["w2c:zipper+stretch-b1.1", 18],
27818
- ["trunks-tree-bf08", 18],
27819
- ["hw:weiszfeld", 18]
27939
+ ["hw:weiszfeld", 18],
27940
+ ["trunks-gilbert-a07", 18]
27820
27941
  ],
27821
- "collection|1.1|n25-40": [["w2a:shared-ways+breakeven", 32], ["w2b:weiszfeld-a1", 32]],
27942
+ "collection|1.1|n25-40": [["w2a:shared-ways+breakeven", 40], ["w2b:weiszfeld-a1", 40]],
27943
+ "collection|1.1|n41-64": [],
27944
+ "collection|1.1|n65-128": [],
27822
27945
  "collection|1.25|n1-12": [
27823
27946
  ["corners-side", 12],
27824
27947
  ["trunks-tree-bf06", 12],
@@ -27834,16 +27957,19 @@ const PORTFOLIO_FIT = {
27834
27957
  ["shared-p3", 24],
27835
27958
  ["trunks-gilbert-a07", 24],
27836
27959
  ["w3e:crossbars+stretch", 24],
27837
- ["trunks-tree-bf06", 18],
27960
+ ["trunks-tree-bf06", 24],
27838
27961
  ["w3c:hdbscan+stretch", 18],
27839
27962
  ["shared-wind-p2-r1-e2", 18],
27840
27963
  ["hw:stubs", 18]
27841
27964
  ],
27842
27965
  "collection|1.25|n25-40": [
27843
- ["w2a:shared-ways+stretch", 32],
27844
- ["shared-p3", 32],
27845
- ["shared-order-shortest", 32]
27966
+ ["w2a:shared-ways+stretch", 40],
27967
+ ["shared-p3", 40],
27968
+ ["shared-order-shortest", 40],
27969
+ ["w2b:weiszfeld-a1", 32]
27846
27970
  ],
27971
+ "collection|1.25|n41-64": [],
27972
+ "collection|1.25|n65-128": [],
27847
27973
  "collection|1.5|n1-12": [
27848
27974
  ["trunks-gilbert-a03", 12],
27849
27975
  ["w3e:areas-keys", 12],
@@ -27860,15 +27986,18 @@ const PORTFOLIO_FIT = {
27860
27986
  ["w3e:crossbars+stretch", 24],
27861
27987
  ["shared-wind-p2-r1-e2", 24],
27862
27988
  ["trunks-tree-bf06", 24],
27863
- ["shared-flow-a06-p3", 18],
27864
- ["shared-wind-p3-r1", 18],
27865
- ["trunks-gilbert-a07", 18]
27989
+ ["shared-flow-a06-p3", 24],
27990
+ ["shared-wind-p3-r1", 24],
27991
+ ["trunks-gilbert-a07", 24]
27866
27992
  ],
27867
27993
  "collection|1.5|n25-40": [
27868
27994
  ["shared-p3", 40],
27869
- ["hw:lanes", 32],
27870
- ["shared-wind-p2-r1-e2", 32]
27995
+ ["hw:lanes", 40],
27996
+ ["shared-wind-p2-r1-e2", 40],
27997
+ ["hw:crossbars", 32]
27871
27998
  ],
27999
+ "collection|1.5|n41-64": [["shared-flow-a06-p3", 64]],
28000
+ "collection|1.5|n65-128": [],
27872
28001
  "all|1.1|n1-12": [
27873
28002
  ["w2b:zipper-p2", 12],
27874
28003
  ["hw:cubu", 12],
@@ -27877,39 +28006,51 @@ const PORTFOLIO_FIT = {
27877
28006
  ["w3d:kdeeb-routes", 12],
27878
28007
  ["hw:stubs", 12],
27879
28008
  ["hw:spiral", 12],
27880
- ["w3b:growth-s0.7", 12]
28009
+ ["w3b:growth-s0.7", 10]
27881
28010
  ],
27882
28011
  "all|1.1|n13-24": [
27883
28012
  ["w3e:frechet-e0.5", 24],
27884
28013
  ["w3a:diffusion-wide", 24],
27885
28014
  ["w2c:zipper+stretch-b1.1", 24],
27886
- ["w3d:cubu+stretch", 18]
28015
+ ["w3d:cubu+stretch", 18],
28016
+ ["w3a:spiral-a15", 18]
27887
28017
  ],
27888
- "all|1.1|n25-40": [["w2c:zipper+stretch-b1.1", 32], ["w3a:spiral-a15", 32]],
28018
+ "all|1.1|n25-40": [["w2c:zipper+stretch-b1.1", 40], ["w3a:spiral-a15", 32]],
28019
+ "all|1.1|n41-64": [["hw:diffusion", 64]],
28020
+ "all|1.1|n65-128": [],
27889
28021
  "all|1.25|n1-12": [
27890
28022
  ["w3d:kdeeb-routes", 12],
27891
28023
  ["w3e:mlseb+stretch", 12],
27892
28024
  ["hw:growth", 12],
27893
28025
  ["hw:level-links", 12],
27894
- ["w3b:growth-input", 12],
27895
- ["w3e:confluent+stretch", 12],
27896
- ["w3d:kdeeb-nomask", 10],
27897
- ["w3a:diffusion-g2", 10]
28026
+ ["w3b:growth-input", 10],
28027
+ ["w3e:confluent+stretch", 10],
28028
+ ["w3d:kdeeb-nomask", 10]
28029
+ ],
28030
+ "all|1.25|n13-24": [
28031
+ ["w3d:kdeeb-routes", 24],
28032
+ ["w3f:p-hub-a0.2", 24],
28033
+ ["w3d:kdeeb-nomask", 18],
28034
+ ["w3a:spiral-n3", 18]
27898
28035
  ],
27899
- "all|1.25|n13-24": [["w3d:kdeeb-routes", 24], ["w3e:mlseb+stretch", 18]],
27900
28036
  "all|1.25|n25-40": [["w3d:kdeeb-routes", 32]],
28037
+ "all|1.25|n41-64": [],
28038
+ "all|1.25|n65-128": [],
27901
28039
  "all|1.5|n1-12": [
27902
28040
  ["w3b:growth-s0.3", 12],
27903
28041
  ["w3e:mlseb-a0", 12],
27904
28042
  ["w3e:mlseb-routes", 10],
27905
- ["w3c:edge-paths-k1.5", 10]
28043
+ ["w3c:edge-paths-k1.5", 10],
28044
+ ["w3f:territories-r2", 10]
27906
28045
  ],
27907
28046
  "all|1.5|n13-24": [["hw:growth", 24], ["w3b:growth-input", 24]],
27908
28047
  "all|1.5|n25-40": [
27909
28048
  ["hw:growth", 40],
27910
- ["w3b:growth-s0.7", 32],
28049
+ ["w3b:growth-s0.7", 40],
27911
28050
  ["w3b:growth-s0.3", 32]
27912
- ]
28051
+ ],
28052
+ "all|1.5|n41-64": [],
28053
+ "all|1.5|n65-128": []
27913
28054
  };
27914
28055
  // src/portfolio/key.ts
27915
28056
  /** The id of the B1 level of the key of the portfolio router. */
@@ -28398,10 +28539,10 @@ const PORTFOLIO_SETS = {
28398
28539
  ],
28399
28540
  "collection|1.1|n13-24": [
28400
28541
  "w3e:crossbars+stretch",
28542
+ "trunks-tree-bf08",
28401
28543
  "corners-side",
28402
28544
  "shared-p2",
28403
28545
  "w2c:zipper+stretch-b1.1",
28404
- "trunks-tree-bf08",
28405
28546
  "hw:weiszfeld",
28406
28547
  "trunks-gilbert-a07",
28407
28548
  "hw:stubs"
@@ -28411,6 +28552,8 @@ const PORTFOLIO_SETS = {
28411
28552
  "w2b:weiszfeld-a1",
28412
28553
  "w2c:level-links+stretch-b1.1"
28413
28554
  ],
28555
+ "collection|1.1|n41-64": [],
28556
+ "collection|1.1|n65-128": [],
28414
28557
  "collection|1.25|n1-12": [
28415
28558
  "corners-side",
28416
28559
  "trunks-tree-bf06",
@@ -28441,6 +28584,13 @@ const PORTFOLIO_SETS = {
28441
28584
  "w2a:shared-ways+ambiguity",
28442
28585
  "w2b:weiszfeld-a0"
28443
28586
  ],
28587
+ "collection|1.25|n41-64": [
28588
+ "hw:lanes",
28589
+ "w3e:crossbars+stretch",
28590
+ "w2a:shared-ways+stretch",
28591
+ "shared-flow-a06-p3"
28592
+ ],
28593
+ "collection|1.25|n65-128": ["hw:lanes"],
28444
28594
  "collection|1.5|n1-12": [
28445
28595
  "trunks-gilbert-a03",
28446
28596
  "w3e:areas-keys",
@@ -28471,6 +28621,18 @@ const PORTFOLIO_SETS = {
28471
28621
  "shared-wind-p2-r1",
28472
28622
  "shared-wind-p2-r2"
28473
28623
  ],
28624
+ "collection|1.5|n41-64": [
28625
+ "shared-flow-a06-p3",
28626
+ "hw:lanes",
28627
+ "shared-p2",
28628
+ "trunks-tree-bf06"
28629
+ ],
28630
+ "collection|1.5|n65-128": [
28631
+ "shared-p2",
28632
+ "shared-p3",
28633
+ "shared-flow-a06-p3",
28634
+ "hw:lanes"
28635
+ ],
28474
28636
  "all|1.1|n1-12": [
28475
28637
  "w2b:zipper-p2",
28476
28638
  "hw:cubu",
@@ -28500,6 +28662,13 @@ const PORTFOLIO_SETS = {
28500
28662
  "w2c:road-classes-d0.3",
28501
28663
  "w3d:kdeeb-routes"
28502
28664
  ],
28665
+ "all|1.1|n41-64": [
28666
+ "hw:diffusion",
28667
+ "w3a:spiral-a15",
28668
+ "w2c:zipper+stretch-b1.1",
28669
+ "w3e:frechet-e0.5"
28670
+ ],
28671
+ "all|1.1|n65-128": ["hw:diffusion"],
28503
28672
  "all|1.25|n1-12": [
28504
28673
  "w3d:kdeeb-routes",
28505
28674
  "w3e:mlseb+stretch",
@@ -28512,13 +28681,13 @@ const PORTFOLIO_SETS = {
28512
28681
  ],
28513
28682
  "all|1.25|n13-24": [
28514
28683
  "w3d:kdeeb-routes",
28515
- "w3e:mlseb+stretch",
28516
28684
  "w3f:p-hub-a0.2",
28685
+ "w3d:kdeeb-nomask",
28517
28686
  "w3a:spiral-n3",
28518
- "w3a:diffusion-l3",
28519
- "trunks-tree-bf06",
28520
- "hw:cubu",
28521
- "w3a:spiral-a35"
28687
+ "w3b:growth-input",
28688
+ "w3d:cubu+stretch",
28689
+ "w3a:spiral-a35",
28690
+ "trunks-tree-bf06"
28522
28691
  ],
28523
28692
  "all|1.25|n25-40": [
28524
28693
  "w3d:kdeeb-routes",
@@ -28528,6 +28697,18 @@ const PORTFOLIO_SETS = {
28528
28697
  "w3e:frechet+stretch",
28529
28698
  "hw:cubu"
28530
28699
  ],
28700
+ "all|1.25|n41-64": [
28701
+ "w3e:frechet+stretch",
28702
+ "hw:cubu",
28703
+ "w3a:diffusion-wide",
28704
+ "w2a:shared-ways+stretch",
28705
+ "w3a:spiral-a35"
28706
+ ],
28707
+ "all|1.25|n65-128": [
28708
+ "hw:diffusion",
28709
+ "w3a:diffusion-wide",
28710
+ "w3a:diffusion-l3"
28711
+ ],
28531
28712
  "all|1.5|n1-12": [
28532
28713
  "w3b:growth-s0.3",
28533
28714
  "w3e:mlseb-a0",
@@ -28542,7 +28723,6 @@ const PORTFOLIO_SETS = {
28542
28723
  "hw:growth",
28543
28724
  "w3b:growth-input",
28544
28725
  "hw:mlseb",
28545
- "w3e:mlseb+stretch",
28546
28726
  "w3b:growth-s0.3"
28547
28727
  ],
28548
28728
  "all|1.5|n25-40": [
@@ -28551,9 +28731,25 @@ const PORTFOLIO_SETS = {
28551
28731
  "w3b:growth-s0.3",
28552
28732
  "w3b:growth-t1.2",
28553
28733
  "w3b:growth-input"
28734
+ ],
28735
+ "all|1.5|n41-64": [
28736
+ "hw:growth",
28737
+ "w3b:growth-s0.3",
28738
+ "w3a:diffusion-g2",
28739
+ "w3b:growth-s0.7",
28740
+ "w3a:diffusion-l3",
28741
+ "w3b:growth-input"
28742
+ ],
28743
+ "all|1.5|n65-128": [
28744
+ "hw:growth",
28745
+ "w3b:growth-s0.3",
28746
+ "hw:shared-ways-all",
28747
+ "w3a:diffusion-g2"
28554
28748
  ]
28555
28749
  };
28556
28750
  // src/portfolio/router.ts
28751
+ /** The values of the option `hashes`, in order. The default is `pick`. */
28752
+ const PORTFOLIO_HASHES = ["pick", "all"];
28557
28753
  /** The base member of each portfolio: the router `shared` with the rule `byCollection`. It is the fallback output above the cap. */
28558
28754
  const PORTFOLIO_BASE_MEMBER = "shared";
28559
28755
  /** This function checks the options of the portfolio router, and gives them with their defaults. It throws a `RangeError` for a bad value. */
@@ -28561,13 +28757,16 @@ function checked(o) {
28561
28757
  const rule = o.rule ?? "collection";
28562
28758
  const cap = o.cap ?? 1.5;
28563
28759
  const k = o.k;
28760
+ const hashes = o.hashes ?? "pick";
28564
28761
  if (!PORTFOLIO_RULES.includes(rule)) throw new RangeError(`The portfolio router has the rule "${String(rule)}". It must be ${PORTFOLIO_RULES.join(" or ")}.`);
28565
28762
  if (!PORTFOLIO_CAPS.includes(cap)) throw new RangeError(`The portfolio router has the cap ${String(cap)}. It must be ${PORTFOLIO_CAPS.join(", ")}.`);
28566
28763
  if (k !== void 0 && !PORTFOLIO_KS_API.includes(k)) throw new RangeError(`The portfolio router has the k ${String(k)}. It must be ${PORTFOLIO_KS_API.join(", ")}.`);
28764
+ if (!PORTFOLIO_HASHES.includes(hashes)) throw new RangeError(`The portfolio router has the hashes "${String(hashes)}". It must be ${PORTFOLIO_HASHES.join(" or ")}.`);
28567
28765
  return {
28568
28766
  rule,
28569
28767
  cap,
28570
- k
28768
+ k,
28769
+ hashes
28571
28770
  };
28572
28771
  }
28573
28772
  /** This function gives the name of the portfolio router with the options `options`: `portfolio-<rule>-<cap>-k<k>`, or `portfolio-<rule>-<cap>-fit` without `k`. */
@@ -28592,10 +28791,11 @@ function portfolioMembers(nodes, options = {}) {
28592
28791
  * The key is `portfolioKey`: a member wins only when it passes the guard against the base. Of those members, the winner has the most ink saved.
28593
28792
  * A tie within the `minEffect` of B1 goes to the first member (`selectBest`). A member that throws does not win.
28594
28793
  * The result carries the trace of the pick and the move count `move.pick`.
28794
+ * With the option `hashes` "pick" (the default), only the base and the winner get an `outputHash` in the trace. They get it only when the winner is not the base.
28595
28795
  */
28596
28796
  function routePortfolio(graph, options = {}) {
28597
28797
  const names = portfolioMembers(graph.nodes.length, options).filter((name) => name === "shared" || (portfolioMember(name)?.maxNodes ?? Infinity) >= graph.nodes.length);
28598
- const { rule, cap } = checked(options);
28798
+ const { rule, cap, hashes } = checked(options);
28599
28799
  let base;
28600
28800
  const members = names.map((name) => {
28601
28801
  const s = portfolioMember(name);
@@ -28614,6 +28814,7 @@ function routePortfolio(graph, options = {}) {
28614
28814
  };
28615
28815
  });
28616
28816
  const pick = portfolio(portfolioName(options), members, portfolioKey(graph, rule, cap, () => base), {
28817
+ hashes,
28617
28818
  ...options.budgetMs === void 0 ? {} : { budgetMs: options.budgetMs },
28618
28819
  ...options.maxMembers === void 0 ? {} : { maxMembers: options.maxMembers },
28619
28820
  ...options.now === void 0 ? {} : { now: options.now }
@@ -28652,6 +28853,6 @@ const portfolioStrategy = defineStrategy({
28652
28853
  maxNodes: 1e4,
28653
28854
  run: (graph, options) => routePortfolio(graph, options).result
28654
28855
  });
28655
- export { AMBIGUITY_GUARD_DEFAULTS, ARC_SOURCES, AREA_DEFAULTS, AREA_WIDTHS, BACKTRACK_MIN, BACKTRACK_SHARE, BREAK, BREAK_EVEN, BREAK_EVEN_DEFAULTS, BUILT_IN_STRATEGIES, BoundaryWalk, CANDIDATE_SOURCES, CAP_SWEEP, CASES, CHANNEL_REACH, CLEARANCE_CAP, COMPARE_STEPS, CONFLUENT_DEFAULTS, CONSENSUS_DEFAULTS, CONSENSUS_LINKAGES, CORRIDOR_DEFAULTS, CROSSBAR_DEFAULTS, CUBU_DEFAULTS, CURVE_TYPES, CUT_DEFAULTS, CornerGraph, DENSITY_KERNELS, DIFFUSION_DEFAULTS, DIVIDED_DEFAULTS, EDGE_DISTANCES, EDGE_PATH_DEFAULTS, EXACT_CLASSES, EXACT_EDGES_PER_NODE, EXACT_V1, EXACT_V1_BOUNDS, EXACT_V1_BOUNDS_SIZES, EXACT_V1_SEEDS, EXACT_V1_SIZES, FDEB_DEFAULTS, FIXTURES, FLOW_CLUSTER_DEFAULTS, FLOW_FIELD_DEFAULTS, FRECHET_DEFAULTS, FRONT_OBJECTIVES, GAP_BASELINES, GAP_BOOTSTRAP, GAP_CAPS, GAP_RULES, GAP_VIEWS, GROUP_SCOPES, GROUP_SPINES, GROWTH_DEFAULTS, GROWTH_SWEEP, Grid, HDBSCAN_DEFAULTS, HIERARCHY_DEFAULTS, HIERARCHY_GROUPS, HIGHWAY_BASES, HIGHWAY_BASE_ROUTERS, HOUGH_DEFAULTS, HUB_ALLOCATIONS, HUB_ARC_DEFAULTS, HUB_CANDIDATES, HYSTERESIS_DEFAULTS, KDEEB_DEFAULTS, KD_DEFAULTS, KENDALL_EXACT, LANES_DEFAULTS, LANE_ORDERS, LANE_TRACKS, LEVEL_HIGHWAY_DEFAULTS, LINKAGES, LINK_COMMUNITY_DEFAULTS, MEASURES, MEASURE_LANE_WIDTH, MEET_DEFAULTS, MEMBER_FORMS, MESH_DEFAULTS, MINGLE_DEFAULTS, MIN_EFFECTS, MLSEB_DEFAULTS, MLS_FITS, MODULE_RULES, MOVE_NAMES, NESTED_DEFAULTS, OD_CELL_DEFAULTS, OUTSIDE_SLACK, Obstacles, PICK, PLAN_CHANGERS, PORTFOLIO_B1, PORTFOLIO_BANDS, PORTFOLIO_BASE_MEMBER, PORTFOLIO_CAPS, PORTFOLIO_FIT, PORTFOLIO_KS_API, PORTFOLIO_RULES, PORTFOLIO_SETS, POWER_DEFAULTS, PROPOSED_RULES, P_HUB_DEFAULTS, QUICKBUNDLES_DEFAULTS, RECORD_EPS, RESISTANCE_DEFAULTS, RIDGE_DEFAULTS, ROAD_CLASS_DEFAULTS, ROOM_FAMILIES, ROUTERS, SAME_HIGHWAY, SBEB_DEFAULTS, SCALE_SPACE_DEFAULTS, SCREEN_RULES, SCREEN_SETS, SCREEN_STEPS, SCREEN_V1, SCREEN_WRAPS, SECTION_DEFAULTS, SELECT_DEFAULTS, SIDE_NORMAL, SKELETON_GROUPS, SKELETON_TARGETS, SLACK_SWEEP, SOFT_KEY_DEFAULTS, SPACING_LIMIT, SPECTRAL_DEFAULTS, SPIRAL_DEFAULTS, STABLE_ID_DEFAULTS, STEPS, STRATEGIES, STRETCH_DEFAULTS, STRETCH_SWEEP, STUB_DEFAULTS, SUITE_COLUMNS, SoftGraph, SplitTree, TERRITORY_DEFAULTS, TERRITORY_POINTS, TOLERANCE, TRACLUS_DEFAULTS, TRAFFIC_RULES, WEISZFELD_DEFAULTS, WSPD_DEFAULTS, WayFinder, ZIPPER_DEFAULTS, activationBase, activationReport, adjustedRandIndex, allSections, ambiguity, ambiguityGate, ambiguityPlan, arcCurve, areaPlan, asRouter, backtrackOf, balance, basePlan, benchBendRoom, benchCurveStrategies, benchCurves, benchHighways, benchLevelRoom, benchOne, benchRoom, benchRun, benchTracks, bendCount, bendingEnergy, bicliqueGroups, bigGroups, boardGaps, boardUnit, boardWins, bootstrapMedian, boundsFamilyName, boxExit, boxPush, boxUnit, boxesOverlap, breakEvenGate, breakEvenPlan, buildSections, bundleStretch, bundledShare, byCollection, byDataGroup, candidateArcs, candidatePlan, candidateScore, canonicalJson, capSettings, cellSteps, center, chainClusters, changeGraph, channelOverflows, channelWidth, characteristicPoints, checkLevels, checkOptions, checkPlan, checkProperties, checkSchema, checkSections, clampOptions, clothoidCurve, clusters1d, coAssociation, commonEdges, compareMeasure, compareSpec, compareStep, compatibility, compatibilityMatrix, confluentPlan, consensusGroups, consensusLabels, consensusPlan, controlChain, cornersRouter, corpusManifest, corridorPlan, countCrossings, countOverlaps, createRegistry, crossbarPlan, crossesItself, crossingAngle, crossingAngles, cubicAt, cubuPlan, curveFaults, curveJoints, curveOf, curveRuns, curveSpace, curveStrategies, curvesHash, cutGroups, cutShare, defineStrategy, denseGroupsBoard, densityPlan, densityRidges, detourSpread, diffusionPlan, dist, distinctPoints, divideHighway, dividedPlan, documentHash, dominates, drawnSegments, edgeBlocks, edgeEnds, edgeLengths, edgePathPlan, edgePaths, edgePlugs, edgeResistance, exactBoard, exactFamily, exactGenerator, exactSeed, exercised, familyOf, familySeed, farLevel, fdebLines, fdebPlan, fft, findStrategy, finderOf, firstLines, fixedPortPoint, fixtureGroupOptions, flowClusterPlan, flowClusters, flowDistance, flowFieldPlan, fnv1a32, follow, formatActivation, formatBendRoom, formatCurves, formatFaults, formatFronts, formatGap, formatHighways, formatInput, formatLevelRoom, formatLevels, formatMeasureTime, formatRoom, formatRules, formatScreen, formatSections, formatSummaries, formatTable, formatTracks, frechet, frechetBundles, frechetPlan, g1Defect, g2Defect, gapBaselines, gapCap, gapClosed, gapLaneCounts, gapLanes, gapNames, gapValues, gateStrategy, getStrategy, goesOutAndBack, graphInput, greedyBicliques, greedyCrossbars, groupEdges, groupRun, groupSettings, groupStability, groupStrategies, groupedPlan, growthPlan, growthSettings, guardBreaks, hasCusp, hdbscanClusters, hdbscanLabels, hdbscanPlan, hierarchyPlan, highwayChurn, highwayCurve, highwayCurves, highwayEdits, highwayIdKeep, highwayMoves, highwayRouter, highwayRouterStrategy, highwayStrategies, houghLines, houghPeaks, houghPlan, hubArcPlan, hubCandidates, hubChainBoard, hysteresisGate, hysteresisPlan, inflate, inflectionCount, inflectionCurve, inflectionSector, inkSaved, innerPoints, inputGraph, inputId, itemSizes, jaccard, jaccardIndex, jogPeaks, joinReports, jsonSafe, kMeans, kdGroups, kdeebLines, kdeebPlan, keepMembers, kendallTau, keyGroups, keyedSections, keysPlan, labelGroups, laneArea, laneCrossings, laneFidelity, laneOrder, laneRoutes, laneSeparation, laneSettings, lanesPlan, lanesThrough, leafGroups, lengthBetween, levelCut, levelGrouping, levelHighwayPlan, levelMeasures, levelPairs, levelRoom, lineDensity, linePoint, linkAgreement, linkCommunities, linkCommunityGroups, linkCommunityPlan, linkDensity, listOptions, listStrategies, makeFixture, makeRoom, manyGroupsBoard, matchHighways, maxStretch, mdf, meanLine, measureBoard, measureByKey, measureByName, measureHighways, measureJogs, measureLevel, measureLevelFaults, measureLinks, measureName, measureQuality, measureRouteFaults, measureStability, meetMember, meetPlan, meetingPoints, memberAt, memberStrategy, mergeAngle, meshPlan, meshWaypoints, minEffectOf, minHash, mingleBundles, minglePlan, mixedSegments, mixesCollections, mlsPoint, mlsebLines, mlsebPlan, modularity, modulesOf, mulberry32, namedObjectives, nearestCentre, nearestOnBoundary, nearestOnLine, nearestSide, nearestSkeleton, nestedGridBoard, nestedGroups, nestedPlan, nestingFaults, nestingViolations, nextRow, nodeAmbiguity, nodeIndex, nodeLinks, occupiedArea, odCellPlan, odGroups, offsetLine, offsetPolyline, openGaps, openLanes, optimaFile, optimumKey, optionDefaults, orderChanges, orderFragility, orderLanes, orderRows, orderStability, orderSuiteRows, orthogonality, outOfBoxes, outputGroups, outputHash, pHubPlan, pMedian, packedGridBoard, paretoFront, parseLines, partWithin, passSettings, pathPoints, peakCurvature, pickLevel, pickMoves, placePlug, planMoves, planOfResult, plugSpacing, plugsRouter, pointAt, pointBoxDistance, pointDensity, pointGroups, pointOnSide, pointSegmentDistance, polylineLength, portfolio, portfolioB1Spec, portfolioBand, portfolioFacts, portfolioKey, portfolioMember, portfolioMembers, portfolioName, portfolioRouter, portfolioStrategy, positionStability, powerPlan, pullApart, quadtreeGroups, quantile, quickBundles, quickBundlesPlan, randomInt, rayToBox, recordLines, recordMoves, rectScattered, regionBounds, register, repairResult, repairStrategy, representative, resample, resistanceClusters, resistancePlan, resultForm, resultHash, ridgeLines, ridgePlan, rng, roadClassPlan, roomDemand, roomLinks, roomOrderFaults, roomStrategies, round3, roundCorners, roundedCurve, routeCrossings, routeInStableOrder, routeMeasures, routePortfolio, routeSeparation, routeStability, routerStrategies, routersOf, ruleCounts, runBenchmark, runKey, runProfile, runSuite, sameData, sampleCurve, samplesOf, sbebLines, sbebPlan, scaleClusters, scaleSpaceGroups, scaleSpacePlan, screen, screenInputs, sectionsRouter, segmentBounds, segmentBoxDistance, segmentClusters, segmentDistance, segmentHitsBox, segmentHitsRect, segmentKey, segmentsCross, segmentsOf, selectBest, selectPlan, sha256Hex, shapeSkeleton, sharedRouter, sharedStretches, sharedWaysAll, sharedWaysPlan, shuffleEdges, sideAngle, sideToward, skeletonGroups, skeletonPath, slackSettings, smoothCurve, snapPlan, softDistance, softKeyClusters, softKeyPlan, spectralClusters, spectralLabels, spectralPlan, spinePart, spiralJoin, spiralPlan, spiralTree, splineCurve, splitPoint, stableIdGate, stableIdPlan, stableOrder, stableOrderStrategy, stepSeed, straightCurve, straightRouter, stretchGate, stretchPlan, stretchSettings, stubPlan, suiteFronts, sumFaults, summarize, summarizeGap, summarizeRows, sweepGrid, sweepOf, sweepRoom, sweepSections, sweepValues, symmetricEigen, territoryPlan, toSvgPath, totalTurn, tracePlan, traclusPlan, treeCost, treeDepth, trunksRouter, turns, unwrappedName, utf8, waypointWay, weberPoint, weiszfeldPlan, withBends, withRepair, withStableOrder, wspdGroups, wspdPlan, zipLegs, zipperPlan };
28856
+ export { AMBIGUITY_GUARD_DEFAULTS, ARC_SOURCES, AREA_DEFAULTS, AREA_WIDTHS, BACKTRACK_MIN, BACKTRACK_SHARE, BREAK, BREAK_EVEN, BREAK_EVEN_DEFAULTS, BUILT_IN_STRATEGIES, BoundaryWalk, CANDIDATE_SOURCES, CAP_SWEEP, CASES, CHANNEL_REACH, CLEARANCE_CAP, COMPARE_STEPS, CONFLUENT_DEFAULTS, CONSENSUS_DEFAULTS, CONSENSUS_LINKAGES, CORRIDOR_DEFAULTS, CROSSBAR_DEFAULTS, CUBU_DEFAULTS, CURVE_TYPES, CUT_DEFAULTS, CornerGraph, DENSITY_KERNELS, DIFFUSION_DEFAULTS, DIVIDED_DEFAULTS, EDGE_DISTANCES, EDGE_PATH_DEFAULTS, EXACT_CLASSES, EXACT_EDGES_PER_NODE, EXACT_V1, EXACT_V1_BOUNDS, EXACT_V1_BOUNDS_SIZES, EXACT_V1_SEEDS, EXACT_V1_SIZES, FDEB_DEFAULTS, FIXTURES, FLOW_CLUSTER_DEFAULTS, FLOW_FIELD_DEFAULTS, FRECHET_DEFAULTS, FRONT_OBJECTIVES, GAP_BASELINES, GAP_BOOTSTRAP, GAP_CAPS, GAP_RULES, GAP_VIEWS, GROUP_SCOPES, GROUP_SPINES, GROWTH_DEFAULTS, GROWTH_SWEEP, Grid, HDBSCAN_DEFAULTS, HIERARCHY_DEFAULTS, HIERARCHY_GROUPS, HIGHWAY_BASES, HIGHWAY_BASE_ROUTERS, HOUGH_DEFAULTS, HUB_ALLOCATIONS, HUB_ARC_DEFAULTS, HUB_CANDIDATES, HYSTERESIS_DEFAULTS, KDEEB_DEFAULTS, KD_DEFAULTS, KENDALL_EXACT, LANES_DEFAULTS, LANE_ORDERS, LANE_TRACKS, LEVEL_HIGHWAY_DEFAULTS, LINKAGES, LINK_COMMUNITY_DEFAULTS, MEASURES, MEASURE_LANE_WIDTH, MEET_DEFAULTS, MEMBER_FORMS, MESH_DEFAULTS, MINGLE_DEFAULTS, MIN_EFFECTS, MLSEB_DEFAULTS, MLS_FITS, MODULE_RULES, MOVE_NAMES, NESTED_DEFAULTS, OD_CELL_DEFAULTS, OUTSIDE_SLACK, Obstacles, PICK, PLAN_CHANGERS, PORTFOLIO_B1, PORTFOLIO_BANDS, PORTFOLIO_BASE_MEMBER, PORTFOLIO_CAPS, PORTFOLIO_FIT, PORTFOLIO_HASHES, PORTFOLIO_KS_API, PORTFOLIO_RULES, PORTFOLIO_SETS, POWER_DEFAULTS, PROPOSED_RULES, P_HUB_DEFAULTS, QUICKBUNDLES_DEFAULTS, RECORD_EPS, RESISTANCE_DEFAULTS, RIDGE_DEFAULTS, ROAD_CLASS_DEFAULTS, ROOM_FAMILIES, ROUTERS, SAME_HIGHWAY, SBEB_DEFAULTS, SCALE_SPACE_DEFAULTS, SCREEN_RULES, SCREEN_SETS, SCREEN_STEPS, SCREEN_V1, SCREEN_WRAPS, SECTION_DEFAULTS, SELECT_DEFAULTS, SIDE_NORMAL, SKELETON_GROUPS, SKELETON_TARGETS, SLACK_SWEEP, SOFT_KEY_DEFAULTS, SPACING_LIMIT, SPECTRAL_DEFAULTS, SPIRAL_DEFAULTS, STABLE_ID_DEFAULTS, STEPS, STRATEGIES, STRETCH_DEFAULTS, STRETCH_SWEEP, STUB_DEFAULTS, SUITE_COLUMNS, SoftGraph, SplitTree, TERRITORY_DEFAULTS, TERRITORY_POINTS, TOLERANCE, TRACLUS_DEFAULTS, TRAFFIC_RULES, WEISZFELD_DEFAULTS, WSPD_DEFAULTS, WayFinder, ZIPPER_DEFAULTS, activationBase, activationReport, adjustedRandIndex, allSections, ambiguity, ambiguityGate, ambiguityPlan, arcCurve, areaPlan, asRouter, backtrackOf, balance, basePlan, benchBendRoom, benchCurveStrategies, benchCurves, benchHighways, benchLevelRoom, benchOne, benchRoom, benchRun, benchTracks, bendCount, bendingEnergy, bicliqueGroups, bigGroups, boardGaps, boardUnit, boardWins, bootstrapMedian, boundsFamilyName, boxExit, boxPush, boxUnit, boxesOverlap, breakEvenGate, breakEvenPlan, buildSections, bundleStretch, bundledShare, byCollection, byDataGroup, candidateArcs, candidatePlan, candidateScore, canonicalJson, capSettings, cellSteps, center, chainClusters, changeGraph, channelOverflows, channelWidth, characteristicPoints, checkLevels, checkOptions, checkPlan, checkProperties, checkSchema, checkSections, clampOptions, clothoidCurve, clusters1d, coAssociation, commonEdges, compareMeasure, compareSpec, compareStep, compatibility, compatibilityMatrix, confluentPlan, consensusGroups, consensusLabels, consensusPlan, controlChain, cornersRouter, corpusManifest, corridorPlan, countCrossings, countOverlaps, createRegistry, crossbarPlan, crossesItself, crossingAngle, crossingAngles, cubicAt, cubuPlan, curveFaults, curveJoints, curveOf, curveRuns, curveSpace, curveStrategies, curvesHash, cutGroups, cutShare, defineStrategy, denseGroupsBoard, densityPlan, densityRidges, detourSpread, diffusionPlan, dist, distinctPoints, divideHighway, dividedPlan, documentHash, dominates, drawnSegments, edgeBlocks, edgeEnds, edgeLengths, edgePathPlan, edgePaths, edgePlugs, edgeResistance, exactBoard, exactFamily, exactGenerator, exactSeed, exactStretch, exactStretches, exercised, familyOf, familySeed, farLevel, fdebLines, fdebPlan, fft, findStrategy, finderOf, firstLines, fixedPortPoint, fixtureGroupOptions, flowClusterPlan, flowClusters, flowDistance, flowFieldPlan, fnv1a32, follow, formatActivation, formatBendRoom, formatCurves, formatFaults, formatFronts, formatGap, formatHighways, formatInput, formatLevelRoom, formatLevels, formatMeasureTime, formatRoom, formatRules, formatScreen, formatSections, formatSummaries, formatTable, formatTracks, frechet, frechetBundles, frechetPlan, g1Defect, g2Defect, gapBaselines, gapCap, gapClosed, gapLaneCounts, gapLanes, gapNames, gapValues, gateStrategy, getStrategy, goesOutAndBack, graphInput, greedyBicliques, greedyCrossbars, groupEdges, groupRun, groupSettings, groupStability, groupStrategies, groupedPlan, growthPlan, growthSettings, guardBreaks, hasCusp, hdbscanClusters, hdbscanLabels, hdbscanPlan, hierarchyPlan, highwayChurn, highwayCurve, highwayCurves, highwayEdits, highwayIdKeep, highwayMoves, highwayRouter, highwayRouterStrategy, highwayStrategies, houghLines, houghPeaks, houghPlan, hubArcPlan, hubCandidates, hubChainBoard, hysteresisGate, hysteresisPlan, inflate, inflectionCount, inflectionCurve, inflectionSector, inkSaved, innerPoints, inputGraph, inputId, itemSizes, jaccard, jaccardIndex, jogPeaks, joinReports, jsonSafe, kMeans, kdGroups, kdeebLines, kdeebPlan, keepMembers, kendallTau, keyGroups, keyedSections, keysPlan, labelGroups, laneArea, laneCrossings, laneFidelity, laneOrder, laneRoutes, laneSeparation, laneSettings, lanesPlan, lanesThrough, leafGroups, lengthBetween, levelCut, levelGrouping, levelHighwayPlan, levelMeasures, levelPairs, levelRoom, lineDensity, linePoint, linkAgreement, linkCommunities, linkCommunityGroups, linkCommunityPlan, linkDensity, listOptions, listStrategies, makeFixture, makeRoom, manyGroupsBoard, matchHighways, maxStretch, mdf, meanLine, measureBoard, measureByKey, measureByName, measureHighways, measureJogs, measureLevel, measureLevelFaults, measureLinks, measureName, measureQuality, measureRouteFaults, measureStability, meetMember, meetPlan, meetingPoints, memberAt, memberStrategy, mergeAngle, meshPlan, meshWaypoints, minEffectOf, minHash, mingleBundles, minglePlan, mixedSegments, mixesCollections, mlsPoint, mlsebLines, mlsebPlan, modularity, modulesOf, mulberry32, namedObjectives, nearestCentre, nearestOnBoundary, nearestOnLine, nearestSide, nearestSkeleton, nestedGridBoard, nestedGroups, nestedPlan, nestingFaults, nestingViolations, nextRow, nodeAmbiguity, nodeIndex, nodeLinks, occupiedArea, odCellPlan, odGroups, offsetLine, offsetPolyline, openGaps, openLanes, optimaFile, optimumKey, optionDefaults, orderChanges, orderFragility, orderLanes, orderRows, orderStability, orderSuiteRows, orthogonality, outOfBoxes, outputGroups, outputHash, pHubPlan, pMedian, packedGridBoard, paretoFront, parseLines, partWithin, passSettings, pathPoints, peakCurvature, pickLevel, pickMoves, placePlug, planMoves, planOfResult, plugSpacing, plugsRouter, pointAt, pointBoxDistance, pointDensity, pointGroups, pointOnSide, pointSegmentDistance, polylineLength, portfolio, portfolioB1Spec, portfolioBand, portfolioFacts, portfolioKey, portfolioMember, portfolioMembers, portfolioName, portfolioRouter, portfolioStrategy, positionStability, powerPlan, pullApart, quadtreeGroups, quantile, quickBundles, quickBundlesPlan, randomInt, rayToBox, recordLines, recordMoves, rectScattered, regionBounds, register, repairResult, repairStrategy, representative, resample, resistanceClusters, resistancePlan, resultForm, resultHash, ridgeLines, ridgePlan, rng, roadClassPlan, roomDemand, roomLinks, roomOrderFaults, roomStrategies, round3, roundCorners, roundedCurve, routeCrossings, routeInStableOrder, routeMeasures, routePortfolio, routeSeparation, routeStability, routerStrategies, routersOf, ruleCounts, runBenchmark, runKey, runProfile, runSuite, sameData, sampleCurve, samplesOf, sbebLines, sbebPlan, scaleClusters, scaleSpaceGroups, scaleSpacePlan, screen, screenInputs, sectionsRouter, segmentBounds, segmentBoxDistance, segmentClusters, segmentDistance, segmentHitsBox, segmentHitsRect, segmentKey, segmentsCross, segmentsOf, selectBest, selectPlan, sha256Hex, shapeSkeleton, sharedRouter, sharedStretches, sharedWaysAll, sharedWaysPlan, shuffleEdges, sideAngle, sideToward, skeletonGroups, skeletonPath, slackSettings, smoothCurve, snapPlan, softDistance, softKeyClusters, softKeyPlan, spectralClusters, spectralLabels, spectralPlan, spinePart, spiralJoin, spiralPlan, spiralTree, splineCurve, splitPoint, stableIdGate, stableIdPlan, stableOrder, stableOrderStrategy, stepSeed, straightCurve, straightRouter, stretchGate, stretchPlan, stretchSettings, stubPlan, suiteFronts, sumFaults, summarize, summarizeGap, summarizeRows, sweepGrid, sweepOf, sweepRoom, sweepSections, sweepValues, symmetricEigen, territoryPlan, toSvgPath, totalTurn, tracePlan, traclusPlan, treeCost, treeDepth, trunksRouter, turns, unwrappedName, utf8, waypointWay, weberPoint, weiszfeldPlan, withBends, withRepair, withStableOrder, wspdGroups, wspdPlan, zipLegs, zipperPlan };
28656
28857
 
28657
28858
  //# sourceMappingURL=index.js.map