@mark1russell7/highways 0.1.2 → 0.1.3
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.d.ts +147 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +965 -264
- package/build/index.js.map +1 -1
- package/package.json +2 -1
- package/src/bench/links.ts +191 -0
- package/src/bench/run.ts +28 -0
- package/src/cases.ts +111 -0
- package/src/grid.ts +61 -2
- package/src/index.ts +2 -0
- package/src/levels.ts +150 -14
- package/src/routers/sections.ts +33 -6
- package/src/visibility.ts +309 -92
package/build/index.d.ts
CHANGED
|
@@ -70,6 +70,11 @@ export declare class Grid<T> {
|
|
|
70
70
|
query(b: Box, visit: (item: T) => void): void;
|
|
71
71
|
/** This method gives each item whose buckets come within `margin` of the segment `ab` to `visit`, one time each. */
|
|
72
72
|
querySegment(a: Point, b: Point, margin: number, visit: (item: T) => void): void;
|
|
73
|
+
/**
|
|
74
|
+
* This method tells if `test` gives true for an item whose buckets come within `margin` of the segment `ab`.
|
|
75
|
+
* It gives the items in the order of `querySegment`, and it stops at the first item that passes the test.
|
|
76
|
+
*/
|
|
77
|
+
someSegment(a: Point, b: Point, margin: number, test: (item: T) => boolean): boolean;
|
|
73
78
|
}
|
|
74
79
|
/** This function gives the bounding box of the segment `ab`. */
|
|
75
80
|
export declare function segmentBounds(a: Point, b: Point): Box;
|
|
@@ -211,6 +216,36 @@ export declare const FIXTURES: readonly FixtureSpec[];
|
|
|
211
216
|
* Node boxes do not overlap, and a gap of 12 units stays between them.
|
|
212
217
|
*/
|
|
213
218
|
export declare function makeFixture(spec: FixtureSpec): Graph;
|
|
219
|
+
/**
|
|
220
|
+
* A board of made-up data that shows one known defect of the routes or of the zoom levels.
|
|
221
|
+
* The benchmark races the routers on each case, and the measures of `measureLinks` give a number for the defect.
|
|
222
|
+
*/
|
|
223
|
+
export interface CaseBoard {
|
|
224
|
+
readonly name: string;
|
|
225
|
+
/** The defect that the board shows, in a few words. */
|
|
226
|
+
readonly defect: string;
|
|
227
|
+
/** This function makes the graph. The same function always gives the same graph. */
|
|
228
|
+
readonly make: () => Graph;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* This function makes a dense board: 150 nodes in tight clusters. At the far view, the boxes of the groups overlap.
|
|
232
|
+
* Then a level link starts or ends in a group that another group covers.
|
|
233
|
+
*/
|
|
234
|
+
export declare function denseGroupsBoard(): Graph;
|
|
235
|
+
/**
|
|
236
|
+
* This function makes a board of three rows of 32 cards. Each card links to the next card of its row.
|
|
237
|
+
* Forty long links join cards far apart. The hub of a section is near the middle of its cards.
|
|
238
|
+
* So a long link climbs to hubs behind its source or past its target, and comes back.
|
|
239
|
+
*/
|
|
240
|
+
export declare function hubChainBoard(): Graph;
|
|
241
|
+
/**
|
|
242
|
+
* This function makes a board of 32 groups in 8 columns and 4 rows. Each group has 4 cards in a square.
|
|
243
|
+
* The cards of a group link in a chain, and 96 random links join cards of two groups.
|
|
244
|
+
* On a level with many groups, some level links go around the outer edge of the board.
|
|
245
|
+
*/
|
|
246
|
+
export declare function manyGroupsBoard(): Graph;
|
|
247
|
+
/** The case boards of the benchmark. Each board has a few hundred nodes at most, so the benchmark races them on each run. */
|
|
248
|
+
export declare const CASES: readonly CaseBoard[];
|
|
214
249
|
/** A plug: the point where a route leaves or enters a node, and the outward normal of its side. */
|
|
215
250
|
export interface Plug {
|
|
216
251
|
readonly point: Point;
|
|
@@ -268,11 +303,30 @@ export declare class Obstacles {
|
|
|
268
303
|
constructor(nodes: readonly Node[], cell: number);
|
|
269
304
|
/** This method tells if the segment `ab` stays out of each box, made larger by `pad`. The nodes in `skip` do not count. */
|
|
270
305
|
clear(a: Point, b: Point, pad: number, skip?: ReadonlySet<Node>): boolean;
|
|
306
|
+
/**
|
|
307
|
+
* This method gives a node whose box, made larger by `pad`, the segment `ab` goes into, or `undefined` when the segment is clear.
|
|
308
|
+
* The nodes in `skip` do not count. The test stops at the first such node.
|
|
309
|
+
*/
|
|
310
|
+
hit(a: Point, b: Point, pad: number, skip?: ReadonlySet<Node>): Node | undefined;
|
|
271
311
|
/** This method tells if the polyline stays out of each box, made larger by `pad`. The nodes in `skip` do not count. */
|
|
272
312
|
clearPath(p: readonly Point[], pad: number, skip?: ReadonlySet<Node>): boolean;
|
|
313
|
+
/** This method gives each node whose bucket the box touches to `visit`. A node can be outside the box. */
|
|
314
|
+
query(box: Box, visit: (n: Node) => void): void;
|
|
273
315
|
/** This method tells if the point is inside a box, made larger by `pad`. The node `skip` does not count. */
|
|
274
316
|
inside(p: Point, pad: number, skip?: Node): boolean;
|
|
275
317
|
}
|
|
318
|
+
/** A free point at an end of a search of `CornerGraph.pathAmong`, and the cost to reach it. */
|
|
319
|
+
export interface Terminal {
|
|
320
|
+
readonly point: Point;
|
|
321
|
+
readonly cost: number;
|
|
322
|
+
}
|
|
323
|
+
/** A path of `CornerGraph.pathAmong`: its points, the index of its first point in `from`, the index of its last point in `to`, and its cost. */
|
|
324
|
+
export interface Among {
|
|
325
|
+
readonly points: Point[];
|
|
326
|
+
readonly from: number;
|
|
327
|
+
readonly to: number;
|
|
328
|
+
readonly cost: number;
|
|
329
|
+
}
|
|
276
330
|
/** The options of the corner graph. */
|
|
277
331
|
export interface CornerGraphOptions {
|
|
278
332
|
/** The distance from a box to its corners. */
|
|
@@ -309,6 +363,11 @@ export declare class CornerGraph {
|
|
|
309
363
|
* It must give at least `floor` × `d`, so that the estimate of A* stays below the true cost.
|
|
310
364
|
*/
|
|
311
365
|
path(from: Point, to: Point, cost?: (i: number, j: number, d: number) => number, floor?: number): Point[] | undefined;
|
|
366
|
+
/**
|
|
367
|
+
* This method gives the shortest path from a point of `from` to a point of `to`, or `undefined` when the graph has none.
|
|
368
|
+
* The cost of a path includes the costs of its two points. One search finds the path, so this method is faster than a call of `path` for each pair.
|
|
369
|
+
*/
|
|
370
|
+
pathAmong(from: readonly Terminal[], to: readonly Terminal[]): Among | undefined;
|
|
312
371
|
/** This method removes the vertices that a later vertex makes needless: from each vertex, it goes to the farthest vertex in view. */
|
|
313
372
|
pull(p: readonly Point[], lookahead?: number): Point[];
|
|
314
373
|
}
|
|
@@ -498,6 +557,8 @@ interface SectionsOptions extends WayOptions, SectionOptions {
|
|
|
498
557
|
* Each way from hub to hub is found one time, so all the edges on it share its points.
|
|
499
558
|
* The edges in one section of the lowest level go straight around the nodes.
|
|
500
559
|
*
|
|
560
|
+
* An edge skips a hub that takes it away from its target. A way that still goes out and back gives way to the direct way.
|
|
561
|
+
*
|
|
501
562
|
* The result gives one zoom level for each depth of the tree.
|
|
502
563
|
* A link of a level goes from the boundary of one item to the boundary of the other, around the other items.
|
|
503
564
|
*/
|
|
@@ -605,6 +666,83 @@ export interface Stability {
|
|
|
605
666
|
}
|
|
606
667
|
/** This function measures how much the routes changed between two results. */
|
|
607
668
|
export declare function measureStability(before: Result, after: Result): Stability;
|
|
669
|
+
/**
|
|
670
|
+
* The faults of a set of links: the routes of the edges, or the links of one zoom level.
|
|
671
|
+
* Each value counts links, except `worstDetour`. Lower is better for each value.
|
|
672
|
+
*/
|
|
673
|
+
export interface LinkFaults {
|
|
674
|
+
/** The number of links that the measure examined. */
|
|
675
|
+
readonly links: number;
|
|
676
|
+
/**
|
|
677
|
+
* The number of links that go through the inside of a box that is not one of their two ends.
|
|
678
|
+
* A segment goes through a box when a part of it longer than `TOLERANCE` is inside the box made smaller by `TOLERANCE`.
|
|
679
|
+
*/
|
|
680
|
+
readonly through: number;
|
|
681
|
+
/**
|
|
682
|
+
* The number of links that go out and back. The distance from a point of the link to its last point grows after the nearest approach.
|
|
683
|
+
* A link goes out and back when this growth is more than `BACKTRACK_SHARE` of the distance between its ends, and more than `BACKTRACK_MIN` units.
|
|
684
|
+
*/
|
|
685
|
+
readonly backtrack: number;
|
|
686
|
+
/** The largest ratio of the length of a link to the distance between its ends. Links with ends nearer than 1 unit do not count. */
|
|
687
|
+
readonly worstDetour: number;
|
|
688
|
+
/**
|
|
689
|
+
* The number of links with a point outside the bounding box of all the boxes, made larger by `slack`.
|
|
690
|
+
* Both ends of a link are always in that bounding box, so such a link goes around the outer edge of the board.
|
|
691
|
+
*/
|
|
692
|
+
readonly outside: number;
|
|
693
|
+
}
|
|
694
|
+
/** The faults of the links of one zoom level. */
|
|
695
|
+
export interface LevelFaults extends LinkFaults {
|
|
696
|
+
readonly depth: number;
|
|
697
|
+
/** The number of items of the level. */
|
|
698
|
+
readonly items: number;
|
|
699
|
+
/** The number of items that hold more than one node. */
|
|
700
|
+
readonly groups: number;
|
|
701
|
+
/** The number of pairs of items whose boxes overlap by more than `TOLERANCE` on each axis. */
|
|
702
|
+
readonly overlaps: number;
|
|
703
|
+
}
|
|
704
|
+
/** The options of the link measures. */
|
|
705
|
+
export interface LinkFaultOptions {
|
|
706
|
+
/** A link that goes farther than this distance outside the bounding box of all the boxes counts in `outside`. The default is 24. */
|
|
707
|
+
readonly slack?: number;
|
|
708
|
+
}
|
|
709
|
+
/** A link goes out and back when its distance to its target grows by more than this share of the distance between its ends. */
|
|
710
|
+
export declare const BACKTRACK_SHARE = .25;
|
|
711
|
+
/** A link goes out and back only when its distance to its target grows by more than this number of units. */
|
|
712
|
+
export declare const BACKTRACK_MIN = 40;
|
|
713
|
+
/** The default `slack` of `LinkFaultOptions`. */
|
|
714
|
+
export declare const OUTSIDE_SLACK = 24;
|
|
715
|
+
/** A link from one box to another box, as `measureLinks` sees it. */
|
|
716
|
+
export interface MeasuredLink {
|
|
717
|
+
readonly source: string;
|
|
718
|
+
readonly target: string;
|
|
719
|
+
readonly points: readonly Point[];
|
|
720
|
+
}
|
|
721
|
+
/**
|
|
722
|
+
* This function gives the largest growth of the distance to the last point of a polyline.
|
|
723
|
+
* The growth at a vertex is its distance to the last point, less the nearest approach of the polyline before that vertex.
|
|
724
|
+
*/
|
|
725
|
+
export declare function backtrackOf(p: readonly Point[]): number;
|
|
726
|
+
/** This function tells if the polyline `p` goes out and back: `backtrackOf(p)` is more than `BACKTRACK_MIN` and more than `BACKTRACK_SHARE` of the span. */
|
|
727
|
+
export declare function goesOutAndBack(p: readonly Point[]): boolean;
|
|
728
|
+
/**
|
|
729
|
+
* This function measures the faults of links between boxes. The map `boxes` gives the box of each end.
|
|
730
|
+
* The bounding box of `outside` is the bounding box of all the boxes of the map.
|
|
731
|
+
*/
|
|
732
|
+
export declare function measureLinks(boxes: ReadonlyMap<string, Box>, links: readonly MeasuredLink[], options?: LinkFaultOptions): LinkFaults;
|
|
733
|
+
/** This function measures the faults of the routes of a result. The ends of a route are the nodes of its edge. */
|
|
734
|
+
export declare function measureRouteFaults(graph: Graph, result: Result, options?: LinkFaultOptions): LinkFaults;
|
|
735
|
+
/** This function counts the pairs of boxes that overlap by more than `TOLERANCE` on each axis. */
|
|
736
|
+
export declare function countOverlaps(boxes: readonly Box[]): number;
|
|
737
|
+
/** This function measures the faults of the links of one zoom level. The items of the level are the boxes. */
|
|
738
|
+
export declare function measureLevel(level: Level, options?: LinkFaultOptions): LevelFaults;
|
|
739
|
+
/**
|
|
740
|
+
* This function measures the faults of each zoom level of a result that has groups: the levels of the far view.
|
|
741
|
+
* A level of single nodes only is the near view. Its links are routes, and `measureRouteFaults` measures them.
|
|
742
|
+
*/
|
|
743
|
+
export declare function measureLevelFaults(result: Result, options?: LinkFaultOptions): LevelFaults[];
|
|
744
|
+
/** This function adds the faults of several levels: it sums the counts and keeps the largest `worstDetour`. */
|
|
745
|
+
export declare function sumFaults(list: readonly LinkFaults[]): LinkFaults;
|
|
608
746
|
/** One row of the benchmark: one router on one fixture. */
|
|
609
747
|
export interface BenchRow {
|
|
610
748
|
readonly router: string;
|
|
@@ -619,6 +757,10 @@ export interface BenchRow {
|
|
|
619
757
|
/** The first violations, for the report. */
|
|
620
758
|
readonly sample: readonly Violation[];
|
|
621
759
|
readonly quality: Quality;
|
|
760
|
+
/** The faults of the routes of the edges (`measureRouteFaults`). */
|
|
761
|
+
readonly faults: LinkFaults;
|
|
762
|
+
/** The faults of each zoom level with groups (`measureLevelFaults`). The list is empty for a router without levels. */
|
|
763
|
+
readonly levelFaults: readonly LevelFaults[];
|
|
622
764
|
}
|
|
623
765
|
/** The options of a benchmark run. */
|
|
624
766
|
export interface BenchOptions {
|
|
@@ -636,5 +778,10 @@ export declare function sameData(a: unknown, b: unknown): boolean;
|
|
|
636
778
|
export declare function benchOne(router: Router, fixture: string, graph: Graph, repeat?: number): BenchRow;
|
|
637
779
|
/** This function writes the rows as a Markdown table. */
|
|
638
780
|
export declare function formatTable(rows: readonly BenchRow[]): string;
|
|
781
|
+
/**
|
|
782
|
+
* This function writes the faults of the rows as a Markdown table: the routes first, then the sum of the levels with groups.
|
|
783
|
+
* A router without such levels gets a dash in the columns of the levels.
|
|
784
|
+
*/
|
|
785
|
+
export declare function formatFaults(rows: readonly BenchRow[]): string;
|
|
639
786
|
export type { CornersOptions, SectionsOptions, SharedOptions, TrunksOptions };
|
|
640
787
|
//# sourceMappingURL=index.d.ts.map
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/geom.ts","../src/grid.ts","../src/model.ts","../src/fixtures.ts","../src/plugs.ts","../src/curves.ts","../src/visibility.ts","../src/ways.ts","../src/segments.ts","../src/sections.ts","../src/routers/straight.ts","../src/routers/plugs.ts","../src/routers/corners.ts","../src/routers/shared.ts","../src/routers/sections.ts","../src/routers/trunks.ts","../src/routers/index.ts","../src/bench/properties.ts","../src/bench/quality.ts","../src/bench/run.ts"],"mappings":";iBACiB;WACN;WACA;;;iBAIM;WACN;WACA;WACA;WACA;;;wBAIK,KAAK,GAAG,OAAO,GAAG;;wBAOlB,OAAO,GAAG,MAAM;;wBAKhB,QAAQ,GAAG,KAAK,YAAY;;wBAK5B,eAAe,YAAY;;;;;wBAY3B,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG;;;;;wBAY/C,eAAe,GAAG,OAAO,GAAG,OAAO,KAAK,KAAK;;wBAK7C,gBAAgB,GAAG,OAAO,GAAG,OAAO,YAAY,YAAY,YAAY,YAAY;;wBA2BpF,iBAAiB,GAAG,OAAO,GAAG;;wBAO9B,qBAAqB,GAAG,OAAO,GAAG,OAAO,GAAG;;wBAS5C,mBAAmB,GAAG,OAAO,GAAG,OAAO,KAAK;;;;;wBAiB5C,MAAM,YAAY,SAAS;;wBAgB3B,UAAU,YAAY,SAAS;;;;;wBAQ/B,gBAAgB,YAAY,SAAS;;;;;wBAgBrC,QAAQ,YAAY,SAAS,YAAY;;;;;;qBC1J5C,KAAK;;;EAUhB,YAAY;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/geom.ts","../src/grid.ts","../src/model.ts","../src/fixtures.ts","../src/cases.ts","../src/plugs.ts","../src/curves.ts","../src/visibility.ts","../src/ways.ts","../src/segments.ts","../src/sections.ts","../src/routers/straight.ts","../src/routers/plugs.ts","../src/routers/corners.ts","../src/routers/shared.ts","../src/routers/sections.ts","../src/routers/trunks.ts","../src/routers/index.ts","../src/bench/properties.ts","../src/bench/quality.ts","../src/bench/links.ts","../src/bench/run.ts"],"mappings":"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"}
|