@mark1russell7/packing 0.1.7 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/build/index.d.ts +141 -233
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1906 -1496
- package/build/index.js.map +1 -1
- package/package.json +5 -2
- package/src/adapters.ts +30 -21
- package/src/check.ts +34 -27
- package/src/contract.ts +30 -192
- package/src/convert.ts +11 -15
- package/src/corpus.ts +3 -3
- package/src/frame.ts +37 -50
- package/src/generators.ts +11 -12
- package/src/index.ts +9 -4
- package/src/layout-input.ts +34 -43
- package/src/measures.ts +12 -15
- package/src/pack.ts +12 -1
- package/src/shelf.ts +107 -0
- package/src/skyline.ts +125 -2
- package/src/space.ts +379 -0
- package/src/strategy.ts +3 -3
package/README.md
CHANGED
|
@@ -105,7 +105,7 @@ checkHard(input, output); // { "no-overlap": 0, "in-container": 0, "locked-kept"
|
|
|
105
105
|
- `fixed` is `size`, `width`, `height` or `none`. A fixed height turns the axes. The value `none` uses the size search `logSweep`, which wraps `packFree`.
|
|
106
106
|
- Each strategy declares its cells in `supports`. `cellOf(input)` gives the cell of an input. A strategy throws `UnsupportedCell` for an input outside its cells.
|
|
107
107
|
- The strategies of this version do not turn items, read groups or pack shapes. A turnable item, a group or a shape gives `UnsupportedCell`.
|
|
108
|
-
- `checkHard` counts the breaks of the hard rules: `no-overlap`, `in-container`, `locked-kept` and `complete`.
|
|
108
|
+
- `checkHard` counts the breaks of the hard rules: `no-overlap`, `in-container`, `locked-kept` and `complete`. It reads the true shape of each obstacle, as `packHard` of `@mark1russell7/layout-contract` does.
|
|
109
109
|
- `fromRects` and `toRects` connect the interface to the `Rect` objects.
|
|
110
110
|
|
|
111
111
|
`docs/PACKER.md` in the repository gives the interface in full.
|
package/build/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DEFAULT_TOLERANCE, Direction, Direction as Direction$1, EPS, Item, Item as Item$1, LayoutContainer, LayoutContainer as LayoutContainer$1, LayoutEdge, LayoutEdge as LayoutEdge$1, LayoutGenerator, LayoutInput, LayoutInput as LayoutInput$1, Margin, MeasureSpec as MeasureSpec$1, Obstacle, PackHard, PackHard as PackHard$1, PackInput, PackOutput, Placement, Port, RECORD_EPS, Region, Side, Sides, Sides as Sides$1, StageTrace, Tolerance, checkInput, turnPoint, turnPort, turnRegion } from "@mark1russell7/layout-contract";
|
|
1
2
|
/** A mutable two-dimensional vector. */
|
|
2
3
|
export declare class Vector {
|
|
3
4
|
#private;
|
|
@@ -79,10 +80,77 @@ type SortOrder = "height-desc" | "height-asc" | "width-desc" | "area-desc" | "in
|
|
|
79
80
|
export declare const SORT_ORDERS: readonly SortOrder[];
|
|
80
81
|
/** This function gives the comparator of a sort order. The sort is stable, so `input` keeps the order. */
|
|
81
82
|
export declare function compareRects(order: SortOrder): <T>(a: Rect<T>, b: Rect<T>) => number;
|
|
83
|
+
/** This function gives the margin of an item on each side. A number is the same margin on each side. */
|
|
84
|
+
export declare function marginOf(item: Pick<Item$1, "margin">): Sides$1;
|
|
85
|
+
/**
|
|
86
|
+
* This function gives an item after a turn of 90 degrees clockwise, with the y axis down (decision 1 of
|
|
87
|
+
* `docs/PACKER.md`). The width and the height change places. The top-left corner, the id and the other fields stay.
|
|
88
|
+
* The ports, the shape and the margin turn with the item. The function does not change its argument.
|
|
89
|
+
* It is `turnBox` of the contract.
|
|
90
|
+
*/
|
|
91
|
+
export declare function turnItem(item: Item$1): Item$1;
|
|
92
|
+
/** A free interval on one axis, from `start` to `end`. A box fits when it starts at `start` or later and ends at `end` or earlier. */
|
|
93
|
+
interface FreeSpan {
|
|
94
|
+
readonly start: number;
|
|
95
|
+
readonly end: number;
|
|
96
|
+
}
|
|
97
|
+
/** A rectangle of the frame: its top-left corner and its size. */
|
|
98
|
+
interface SpaceRect {
|
|
99
|
+
readonly x: number;
|
|
100
|
+
readonly y: number;
|
|
101
|
+
readonly w: number;
|
|
102
|
+
readonly h: number;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* The free space of one input, in the coordinates of the frame of the adapters. A rectangle of the frame is an item with its
|
|
106
|
+
* margin, grown by half the gap on each side. Each method takes such a rectangle.
|
|
107
|
+
*
|
|
108
|
+
* - The outline of a container with a fixed size is exact. A free side uses the bounding box of the shape, and the holes stay.
|
|
109
|
+
* - The inset of the container counts as in `checkHard`: the item with its margin, grown by the inset, stays in the outline.
|
|
110
|
+
* - A rectangle obstacle and a locked item are holes with the exact rectangles of the frame.
|
|
111
|
+
* - Another obstacle blocks its range over the query, grown by half the gap on each axis.
|
|
112
|
+
*/
|
|
113
|
+
interface FreeSpace {
|
|
114
|
+
/** The width of the area of the frame. A free side has the width `Infinity`. */
|
|
115
|
+
readonly w: number;
|
|
116
|
+
/** The height of the area of the frame. A free side has the height `Infinity`. */
|
|
117
|
+
readonly h: number;
|
|
118
|
+
/**
|
|
119
|
+
* The value `true` tells that the container is a plain rectangle and that each obstacle is a rectangle. Then `band` does
|
|
120
|
+
* not test y, and `column` does not test x, because each strategy tests the fixed side itself. This is the fast path.
|
|
121
|
+
*/
|
|
122
|
+
readonly plain: boolean;
|
|
123
|
+
/** This method gives the free x-spans, from left to right, for a rectangle from `y0` to `y1`. */
|
|
124
|
+
band(y0: number, y1: number): FreeSpan[];
|
|
125
|
+
/**
|
|
126
|
+
* This method gives the first free y-span for a rectangle from `x0` to `x1` that ends after `from`. The span starts
|
|
127
|
+
* at `from` or later. The method gives `undefined` when no such span is free.
|
|
128
|
+
*/
|
|
129
|
+
column(x0: number, x1: number, from?: number): FreeSpan | undefined;
|
|
130
|
+
/** This method tells if a rectangle is in the free space. */
|
|
131
|
+
fits(rect: SpaceRect): boolean;
|
|
132
|
+
/** This method gives the first x from `x` where a rectangle of width `w` fits from `y0` to `y1`, or `Infinity`. */
|
|
133
|
+
fitX(x: number, w: number, y0: number, y1: number): number;
|
|
134
|
+
/**
|
|
135
|
+
* This method gives the next top edge after `y0` where the free spans of a rectangle of the height `y1 - y0` change, or
|
|
136
|
+
* `Infinity`. A row that has no place for a rectangle of width `w` steps down to this edge.
|
|
137
|
+
*/
|
|
138
|
+
nextY(y0: number, y1: number, w: number): number;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* This function gives the free space of an input, in the coordinates of the frame of the adapters. The origin of the
|
|
142
|
+
* frame is the corner of the container, moved in by the inset and out by half the gap. `FreeSpace` tells the methods.
|
|
143
|
+
*/
|
|
144
|
+
export declare function freeSpace(input: PackInput): FreeSpace;
|
|
82
145
|
/** The options of `pack` and `packRows` */
|
|
83
146
|
interface PackOptions {
|
|
84
147
|
/** The order of the rectangles before the packing. The default is `height-desc`. */
|
|
85
148
|
sortOrder?: SortOrder;
|
|
149
|
+
/**
|
|
150
|
+
* The free space of the container: `freeSpace` of the input. With a space that is not plain, each strategy packs into
|
|
151
|
+
* the outline of the container and around its holes. The rows of `packRows` also go around the locked rectangles.
|
|
152
|
+
*/
|
|
153
|
+
space?: FreeSpace;
|
|
86
154
|
}
|
|
87
155
|
/** The options of `pack` */
|
|
88
156
|
interface PackLayoutOptions extends PackOptions {
|
|
@@ -96,6 +164,9 @@ interface PackLayoutOptions extends PackOptions {
|
|
|
96
164
|
* This function packs rectangles into an outer rectangle of a given width with a guillotine row packing. It does
|
|
97
165
|
* not change the width. Without `fixedSize`, the height grows until all rectangles fit. A `locked` rectangle keeps
|
|
98
166
|
* its position, but the rows do not go around it. `pack` sets the width first and then uses this function.
|
|
167
|
+
*
|
|
168
|
+
* With `options.space`, the rows go around the locked rectangles and the holes of the space, inside its outline. A space
|
|
169
|
+
* that is plain, with no locked rectangle, gives the rows of 0.1.
|
|
99
170
|
*/
|
|
100
171
|
export declare function packRows<T>(rects: Rect<T>[], outer: Rect<T>, options?: PackOptions): Rect<T>;
|
|
101
172
|
/**
|
|
@@ -113,11 +184,24 @@ export declare function pack<T>(rects: Rect<T>[], outer?: Rect<T>, options?: Pac
|
|
|
113
184
|
* This function finds the lowest window of width `rw` on a skyline. For each `x` in `[0, width - rw]`, the height
|
|
114
185
|
* of the window is the largest value of `skyline[x, x + rw)`. The first `x` with the smallest height wins. A
|
|
115
186
|
* monotonic deque makes the search O(width) for one rectangle.
|
|
187
|
+
*
|
|
188
|
+
* With `limit`, a window is valid only when its height plus `rh` is not more than the smallest value of
|
|
189
|
+
* `limit[x, x + rw)`. A second deque keeps that smallest value. No valid window gives the height `Infinity`.
|
|
116
190
|
*/
|
|
117
|
-
export declare function lowestWindow(skyline: ArrayLike<number>, width: number, rw: number): {
|
|
191
|
+
export declare function lowestWindow(skyline: ArrayLike<number>, width: number, rw: number, limit?: ArrayLike<number>, rh?: number): {
|
|
118
192
|
x: number;
|
|
119
193
|
y: number;
|
|
120
194
|
};
|
|
195
|
+
/** The options of `packSkyline` */
|
|
196
|
+
interface SkylineOptions {
|
|
197
|
+
/** The order of the rectangles before the packing. The default is `height-desc`. */
|
|
198
|
+
sortOrder?: SortOrder;
|
|
199
|
+
/**
|
|
200
|
+
* The free space of the container: `freeSpace` of the input. Without it, or when it is plain, the skyline uses only the
|
|
201
|
+
* outer rectangle and the locked rectangles.
|
|
202
|
+
*/
|
|
203
|
+
space?: FreeSpace;
|
|
204
|
+
}
|
|
121
205
|
/**
|
|
122
206
|
* This function packs rectangles into an outer rectangle with a skyline. It puts each rectangle in the lowest place
|
|
123
207
|
* where it fits, and it does not change the width of the outer rectangle.
|
|
@@ -129,14 +213,19 @@ export declare function lowestWindow(skyline: ArrayLike<number>, width: number,
|
|
|
129
213
|
* - Without `fixedSize`, the height of the outer rectangle grows to the content. With `fixedSize`, a rectangle that
|
|
130
214
|
* does not fit is not packed: its `wasPacked` stays `false`.
|
|
131
215
|
* - The default sort order is `height-desc`. The order of the array of the caller stays.
|
|
216
|
+
* - With a space that is not plain, each cell gets its start and its limit from `column` of the space. The space holds
|
|
217
|
+
* the obstacles and the locked items, thus the locked rectangles only keep their positions.
|
|
132
218
|
*/
|
|
133
|
-
export declare function packSkyline<T>(rects: Rect<T>[], outer: Rect<T>, options?:
|
|
134
|
-
sortOrder?: SortOrder;
|
|
135
|
-
}): Rect<T>;
|
|
219
|
+
export declare function packSkyline<T>(rects: Rect<T>[], outer: Rect<T>, options?: SkylineOptions): Rect<T>;
|
|
136
220
|
/** The options of `packShelf` */
|
|
137
221
|
interface ShelfOptions {
|
|
138
222
|
/** The order of the rectangles before the packing. The default is `height-desc`. */
|
|
139
223
|
sortOrder?: SortOrder;
|
|
224
|
+
/**
|
|
225
|
+
* The free space of the container: `freeSpace` of the input. Without it, or when it is plain, the packer uses only the
|
|
226
|
+
* outer rectangle and the locked rectangles.
|
|
227
|
+
*/
|
|
228
|
+
space?: FreeSpace;
|
|
140
229
|
}
|
|
141
230
|
/**
|
|
142
231
|
* This function packs rectangles into shelves: rows that it fills left to right in the sort order, and does not fill
|
|
@@ -149,6 +238,7 @@ interface ShelfOptions {
|
|
|
149
238
|
* - A rectangle wider than the outer rectangle goes on its own row, at the left edge, and overflows.
|
|
150
239
|
* - It does not change the width. Without `fixedSize`, the height grows to the content. With `fixedSize`, a
|
|
151
240
|
* rectangle that does not fit is not packed: its `wasPacked` stays `false`.
|
|
241
|
+
* - With a space that is not plain, `packRowsInSpace` packs the rows into the outline of the space and around its holes.
|
|
152
242
|
*/
|
|
153
243
|
export declare function packShelf<T>(rects: Rect<T>[], outer: Rect<T>, options?: ShelfOptions): Rect<T>;
|
|
154
244
|
/** The options of `packFree` */
|
|
@@ -258,186 +348,21 @@ interface MetricsOptions {
|
|
|
258
348
|
* ```
|
|
259
349
|
*/
|
|
260
350
|
export declare function packingMetrics(rects: readonly Rect[], options?: MetricsOptions): PackingMetrics;
|
|
261
|
-
/** A region. The forms and the rules are those of `docs/FORMAT.md`. The y axis points down. */
|
|
262
|
-
type Region = {
|
|
263
|
-
kind: "rect";
|
|
264
|
-
x: number;
|
|
265
|
-
y: number;
|
|
266
|
-
w: number;
|
|
267
|
-
h: number;
|
|
268
|
-
} | {
|
|
269
|
-
kind: "polygon";
|
|
270
|
-
points: [number, number][];
|
|
271
|
-
holes?: [number, number][][];
|
|
272
|
-
} | {
|
|
273
|
-
kind: "circle";
|
|
274
|
-
cx: number;
|
|
275
|
-
cy: number;
|
|
276
|
-
r: number;
|
|
277
|
-
} | {
|
|
278
|
-
kind: "ellipse";
|
|
279
|
-
cx: number;
|
|
280
|
-
cy: number;
|
|
281
|
-
rx: number;
|
|
282
|
-
ry: number;
|
|
283
|
-
};
|
|
284
|
-
/** The container of a packing. */
|
|
285
|
-
interface Container {
|
|
286
|
-
/** The width. Without it, the packer searches the width. */
|
|
287
|
-
w?: number;
|
|
288
|
-
/** The height. Without it, the packer searches the height. */
|
|
289
|
-
h?: number;
|
|
290
|
-
/** The sides that stay: `size` keeps `w` and `h`, `width` keeps `w`, `height` keeps `h`, and `none` searches both. */
|
|
291
|
-
fixed: "size" | "width" | "height" | "none";
|
|
292
|
-
/** The target aspect (the width divided by the height) for the value `none` of `fixed`. The default is 1. */
|
|
293
|
-
aspect?: number;
|
|
294
|
-
/** The weight of the aspect error in the objective. The value 0 gives the least area. The default is 1. */
|
|
295
|
-
aspectWeight?: number;
|
|
296
|
-
/** The shape. Without it, the container is the rectangle from 0, 0 to `w`, `h`. */
|
|
297
|
-
shape?: Region;
|
|
298
|
-
/** The space between the border and the items with their margins. The default is 0. */
|
|
299
|
-
inset?: number;
|
|
300
|
-
}
|
|
301
|
-
/** An obstacle: an area that no item enters. */
|
|
302
|
-
interface Obstacle {
|
|
303
|
-
id: string;
|
|
304
|
-
region: Region;
|
|
305
|
-
/** Without it, the obstacle stays. With it, the packer can move the obstacle for `cost` times the distance. */
|
|
306
|
-
move?: {
|
|
307
|
-
cost: number;
|
|
308
|
-
};
|
|
309
|
-
}
|
|
310
|
-
/** The margin of an item on each side. */
|
|
311
|
-
interface Margin {
|
|
312
|
-
top: number;
|
|
313
|
-
right: number;
|
|
314
|
-
bottom: number;
|
|
315
|
-
left: number;
|
|
316
|
-
}
|
|
317
|
-
/** A port on the border of an item. */
|
|
318
|
-
interface Port {
|
|
319
|
-
id: string;
|
|
320
|
-
side: "top" | "right" | "bottom" | "left";
|
|
321
|
-
/** The point on the border of the item, relative to its top-left corner. Without it, the router chooses the point. */
|
|
322
|
-
x?: number;
|
|
323
|
-
y?: number;
|
|
324
|
-
}
|
|
325
|
-
/** An item to pack. The file format names it a box. */
|
|
326
|
-
interface Item {
|
|
327
|
-
id: string;
|
|
328
|
-
w: number;
|
|
329
|
-
h: number;
|
|
330
|
-
/** The reading order. Without it, the index in the array is the rank. */
|
|
331
|
-
rank?: number;
|
|
332
|
-
group?: string;
|
|
333
|
-
parent?: string;
|
|
334
|
-
/** A shape relative to the origin of the item. Without it, the item is the rectangle `w` by `h`. */
|
|
335
|
-
shape?: Region;
|
|
336
|
-
/** A locked item keeps `x` and `y`. The packer reads it as an obstacle. */
|
|
337
|
-
locked?: boolean;
|
|
338
|
-
x?: number;
|
|
339
|
-
y?: number;
|
|
340
|
-
/** The value `true` lets the packer turn the item by 90 degrees. The default is `false`. */
|
|
341
|
-
turnable?: boolean;
|
|
342
|
-
/** A ring around the item that no other item and no route enters. The default is 0. */
|
|
343
|
-
margin?: number | Margin;
|
|
344
|
-
/** The ports. The packer keeps them, and turns them with the item. */
|
|
345
|
-
ports?: Port[];
|
|
346
|
-
/** The free data of the item. The packer does not read it, and the turn and the converters keep it. */
|
|
347
|
-
data?: Readonly<Record<string, unknown>>;
|
|
348
|
-
}
|
|
349
|
-
/** The input of a packing: a `layout-input/1` file without `edges`, with `items` for `boxes`. */
|
|
350
|
-
interface PackInput {
|
|
351
|
-
container: Container;
|
|
352
|
-
items: Item[];
|
|
353
|
-
obstacles?: Obstacle[];
|
|
354
|
-
/** The free space between two items with their margins. Routes use this space. The default is 0. */
|
|
355
|
-
gap?: number;
|
|
356
|
-
}
|
|
357
|
-
/** The position of one item after the packing. */
|
|
358
|
-
interface Placement {
|
|
359
|
-
id: string;
|
|
360
|
-
x: number;
|
|
361
|
-
y: number;
|
|
362
|
-
/** The turn: 0 or 90, only for an item with `turnable` set to `true`. */
|
|
363
|
-
turn?: 0 | 90;
|
|
364
|
-
}
|
|
365
|
-
/** The facts of one stage of a packing. */
|
|
366
|
-
interface StageTrace {
|
|
367
|
-
/** The id of the stage, for example `skyline` or `log-sweep`. */
|
|
368
|
-
id: string;
|
|
369
|
-
/** The time of the stage in milliseconds. */
|
|
370
|
-
ms: number;
|
|
371
|
-
/** The measures of the stage, by the names of `docs/FORMAT.md`. */
|
|
372
|
-
measures: Record<string, number>;
|
|
373
|
-
}
|
|
374
|
-
/** The output of a packing. The output does not change the input. */
|
|
375
|
-
interface PackOutput {
|
|
376
|
-
placements: Placement[];
|
|
377
|
-
/** The ids of the items that the packer did not place. */
|
|
378
|
-
overflow: string[];
|
|
379
|
-
/** The size of the container after the packing. For a free size, the size that the search found. */
|
|
380
|
-
size: {
|
|
381
|
-
w: number;
|
|
382
|
-
h: number;
|
|
383
|
-
};
|
|
384
|
-
/** The new positions of the obstacles that moved. */
|
|
385
|
-
moved: {
|
|
386
|
-
id: string;
|
|
387
|
-
x: number;
|
|
388
|
-
y: number;
|
|
389
|
-
}[];
|
|
390
|
-
/** The facts of each stage, for the site and the records. */
|
|
391
|
-
trace: StageTrace[];
|
|
392
|
-
}
|
|
393
|
-
/** The tolerances of the hard rules. */
|
|
394
|
-
interface Tolerance {
|
|
395
|
-
/** The rule `no-overlap`: two boxes overlap only by more than this value. */
|
|
396
|
-
overlap: number;
|
|
397
|
-
/** The router rule that a route does not go through a box. */
|
|
398
|
-
through: number;
|
|
399
|
-
}
|
|
400
|
-
/** The tolerance for the comparison of two numbers in an engine. */
|
|
401
|
-
export declare const EPS = 1e-6;
|
|
402
|
-
/** The tolerance for the comparison of two numbers of a file. The files round to 3 decimals. */
|
|
403
|
-
export declare const RECORD_EPS = .001;
|
|
404
|
-
/** The default tolerances of the hard rules. Each record writes its tolerances in its top-level field `tolerance`. */
|
|
405
|
-
export declare const DEFAULT_TOLERANCE: Readonly<Tolerance>;
|
|
406
|
-
/** This function gives the margin of an item on each side. A number is the same margin on each side. */
|
|
407
|
-
export declare function marginOf(item: Pick<Item, "margin">): Margin;
|
|
408
|
-
/** This function gives the point `px`, `py` of an item of height `h` after a turn of 90 degrees clockwise. */
|
|
409
|
-
export declare function turnPoint(px: number, py: number, h: number): [number, number];
|
|
410
|
-
/** This function turns a port of an item of height `h` by 90 degrees clockwise. The side turns from top to right. */
|
|
411
|
-
export declare function turnPort(port: Port, h: number): Port;
|
|
412
|
-
/** This function turns a region relative to an item of height `h` by 90 degrees clockwise. */
|
|
413
|
-
export declare function turnRegion(region: Region, h: number): Region;
|
|
414
|
-
/**
|
|
415
|
-
* This function gives an item after a turn of 90 degrees clockwise, with the y axis down (decision 1 of
|
|
416
|
-
* `docs/PACKER.md`). The width and the height change places. The top-left corner, the id and the other fields stay.
|
|
417
|
-
* The ports, the shape and the margin turn with the item. The function does not change its argument.
|
|
418
|
-
*/
|
|
419
|
-
export declare function turnItem(item: Item): Item;
|
|
420
|
-
/** The direction of a measure: `lower` when a lower value is better, `higher` when a higher value is better. */
|
|
421
|
-
type Direction = "lower" | "higher";
|
|
422
351
|
/** The family of a measure. Each family has a section in `docs/MEASURES.md`. */
|
|
423
352
|
type MeasureFamily = "density" | "aspect" | "order" | "raggedness" | "overflow" | "stability" | "determinism" | "speed";
|
|
424
353
|
/** The id of a measure of the packer. The ids are those of `docs/FORMAT.md`, and `highways` uses the same ids. */
|
|
425
354
|
type MeasureId = "pack.area" | "pack.fill" | "pack.whitespace" | "pack.aspect" | "pack.aspectError" | "pack.order.inversions" | "pack.order.breaks" | "pack.raggedness" | "pack.overflow" | "pack.stability.moved" | "pack.stability.mean" | "pack.stability.q95" | "pack.deterministic" | "pack.search.widths" | "pack.search.ms";
|
|
426
|
-
/**
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
/** The lowest value. */
|
|
433
|
-
min: number;
|
|
434
|
-
/** The highest value. The value `Infinity` tells that the measure has no upper limit. */
|
|
435
|
-
max: number;
|
|
355
|
+
/**
|
|
356
|
+
* The facts of one measure: its family, its unit, its direction and its range.
|
|
357
|
+
* It is `MeasureSpec` of the contract for a packer measure id, with a family.
|
|
358
|
+
*/
|
|
359
|
+
interface MeasureSpec extends MeasureSpec$1<MeasureId> {
|
|
360
|
+
readonly family: MeasureFamily;
|
|
436
361
|
/**
|
|
437
362
|
* The floor is the best value of a guard measure. The floor rule of `docs/PROMOTION.md` of `highways` reads it. Each
|
|
438
363
|
* guard of the packer has the floor 0. A measure without a floor has no floor rule.
|
|
439
364
|
*/
|
|
440
|
-
floor?: number;
|
|
365
|
+
readonly floor?: number;
|
|
441
366
|
/**
|
|
442
367
|
* The tolerance is the absolute tolerance at the floor. A candidate within the tolerance ties with a default at the floor.
|
|
443
368
|
*
|
|
@@ -446,7 +371,7 @@ interface MeasureSpec {
|
|
|
446
371
|
* - `pack.stability.mean` has 0.005 container widths, and `pack.stability.q95` has 0.01. The default often moves no item.
|
|
447
372
|
* - `pack.stability.moved` has 0.02: 2% of the items that stay. On a small change, the default often moves no item.
|
|
448
373
|
*/
|
|
449
|
-
tol?: number;
|
|
374
|
+
readonly tol?: number;
|
|
450
375
|
}
|
|
451
376
|
/** The measures of one layout, by id. `measure` gives them. The values are not rounded. */
|
|
452
377
|
interface LayoutMeasures {
|
|
@@ -528,7 +453,7 @@ export declare function roundMeasures<T extends object>(measures: T): T;
|
|
|
528
453
|
* - When both values are 0, the ratio is 1. When only the divisor is 0, the ratio is `Infinity`.
|
|
529
454
|
* - The values are 0 or more. A negative value or `NaN` throws a `RangeError`.
|
|
530
455
|
*/
|
|
531
|
-
export declare function pairedRatio(candidate: number, current: number, direction: Direction): number;
|
|
456
|
+
export declare function pairedRatio(candidate: number, current: number, direction: Direction$1): number;
|
|
532
457
|
/**
|
|
533
458
|
* This function gives the quantile `q` of a list of numbers, with linear interpolation between the sorted values. The
|
|
534
459
|
* position in the sorted list is `(n - 1) * q`. An empty list or a `q` outside 0 to 1 throws a `RangeError`.
|
|
@@ -656,18 +581,19 @@ interface PushStrategyOptions {
|
|
|
656
581
|
maxShovesPerItem: number;
|
|
657
582
|
}
|
|
658
583
|
/**
|
|
659
|
-
* The strategy `rows` uses `packRows`: a guillotine row packing with a recursive gap fill.
|
|
660
|
-
*
|
|
584
|
+
* The strategy `rows` uses `packRows`: a guillotine row packing with a recursive gap fill. With obstacles, locked items or a
|
|
585
|
+
* container shape, the rows go around the holes of the free space and lose the gap fill. Turnable items, groups and item
|
|
586
|
+
* shapes throw `UnsupportedCell`.
|
|
661
587
|
*/
|
|
662
588
|
export declare const rows: Strategy<LayoutStrategyOptions>;
|
|
663
589
|
/**
|
|
664
590
|
* The strategy `skyline` uses `packSkyline`: each item goes to the lowest place where it fits. It packs around the
|
|
665
|
-
* locked items and the fixed obstacles. Turnable items, groups and shapes throw `UnsupportedCell`.
|
|
591
|
+
* locked items and the fixed obstacles, in each container shape. Turnable items, groups and item shapes throw `UnsupportedCell`.
|
|
666
592
|
*/
|
|
667
593
|
export declare const skyline: Strategy<LayoutStrategyOptions>;
|
|
668
594
|
/**
|
|
669
595
|
* The strategy `shelf` uses `packShelf`: rows filled left to right, around the locked items and the fixed obstacles.
|
|
670
|
-
* With the sort order `input`, the rows keep the rank order. Turnable items, groups and shapes throw `UnsupportedCell`.
|
|
596
|
+
* With the sort order `input`, the rows keep the rank order. Turnable items, groups and item shapes throw `UnsupportedCell`.
|
|
671
597
|
*/
|
|
672
598
|
export declare const shelf: Strategy<LayoutStrategyOptions>;
|
|
673
599
|
/**
|
|
@@ -703,13 +629,6 @@ export declare function strategy(id: string): Strategy;
|
|
|
703
629
|
* context gets `mulberry32` with the seed. The default seed is 0.
|
|
704
630
|
*/
|
|
705
631
|
export declare function packWith(id: string, input: PackInput, options?: unknown, seed?: number): PackOutput;
|
|
706
|
-
/** The count of the breaks of each hard rule of the packer (`docs/FORMAT.md`). A good run has 0 for each rule. */
|
|
707
|
-
interface HardBreaks {
|
|
708
|
-
"no-overlap": number;
|
|
709
|
-
"in-container": number;
|
|
710
|
-
"locked-kept": number;
|
|
711
|
-
complete: number;
|
|
712
|
-
}
|
|
713
632
|
/**
|
|
714
633
|
* This function counts the breaks of the 4 hard rules of the packer for an output.
|
|
715
634
|
*
|
|
@@ -720,52 +639,38 @@ interface HardBreaks {
|
|
|
720
639
|
* - `complete`: each item with no placement that is not in the overflow. A locked item breaks `locked-kept` in its place.
|
|
721
640
|
*
|
|
722
641
|
* A locked item with no placement stays at its input position for `no-overlap` and `in-container`. A locked item with no
|
|
723
|
-
* `x` or no `y` in the input is
|
|
642
|
+
* `x` or no `y` in the input is a bad input. The rules skip it, as `packHard` of the contract does. `checkInput` finds it.
|
|
724
643
|
*
|
|
725
|
-
* The
|
|
726
|
-
*
|
|
644
|
+
* The test of an obstacle is exact: a circle, an ellipse and a polygon with holes count only their insides, as in `packHard`.
|
|
645
|
+
* The rules read a shape of the container or of an item as its bounding box (decision 5). The bounding box of an item
|
|
646
|
+
* shape is relative to the position of the item. The result has no tolerance in it.
|
|
727
647
|
*/
|
|
728
|
-
export declare function checkHard(input: PackInput, output: PackOutput, tolerance?: Pick<Tolerance, "overlap">):
|
|
729
|
-
/** An edge between two boxes. The router reads it, and the packer ignores it. */
|
|
730
|
-
interface Edge {
|
|
731
|
-
id: string;
|
|
732
|
-
source: string;
|
|
733
|
-
target: string;
|
|
734
|
-
sourcePort?: string;
|
|
735
|
-
targetPort?: string;
|
|
736
|
-
/** The free data of the edge. The packer does not read it. */
|
|
737
|
-
data?: Readonly<Record<string, unknown>>;
|
|
738
|
-
}
|
|
648
|
+
export declare function checkHard(input: PackInput, output: PackOutput, tolerance?: Pick<Tolerance, "overlap">): PackHard$1;
|
|
739
649
|
/** The parameters of a generator: a name and a string or a number for each parameter. */
|
|
740
650
|
type GeneratorParams = Record<string, string | number>;
|
|
741
|
-
/**
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
651
|
+
/**
|
|
652
|
+
* The stamp of a generated input: the generator, its version, the full parameters and the seed.
|
|
653
|
+
* It is `LayoutGenerator` of the contract with a string or a number for each parameter.
|
|
654
|
+
*/
|
|
655
|
+
interface GeneratorStamp extends LayoutGenerator {
|
|
656
|
+
readonly params: Readonly<GeneratorParams>;
|
|
747
657
|
}
|
|
748
|
-
/**
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
658
|
+
/**
|
|
659
|
+
* A generated input file `layout-input/1`. It is a `LayoutInput` with each field that a generator writes.
|
|
660
|
+
* `docs/FORMAT.md` gives each field.
|
|
661
|
+
*/
|
|
662
|
+
interface GeneratedInput extends LayoutInput$1 {
|
|
663
|
+
readonly set: string;
|
|
664
|
+
readonly family: string;
|
|
665
|
+
readonly seed: number;
|
|
755
666
|
/** The origin: `made-up`, `published:<set>` or `known-best:<construction>`. */
|
|
756
|
-
source: string;
|
|
667
|
+
readonly source: string;
|
|
757
668
|
/** The generator of a generated input. A hand-made or published input has `null`. */
|
|
758
|
-
generator: GeneratorStamp | null;
|
|
759
|
-
container:
|
|
760
|
-
|
|
761
|
-
gap?: number;
|
|
762
|
-
boxes: Item[];
|
|
763
|
-
edges: Edge[];
|
|
764
|
-
base?: string;
|
|
765
|
-
change?: string;
|
|
766
|
-
step?: number;
|
|
669
|
+
readonly generator: GeneratorStamp | null;
|
|
670
|
+
readonly container: LayoutContainer$1;
|
|
671
|
+
readonly edges: readonly LayoutEdge$1[];
|
|
767
672
|
/** The first 16 hex characters of the SHA-256 of the canonical form of the other fields. */
|
|
768
|
-
hash: string;
|
|
673
|
+
readonly hash: string;
|
|
769
674
|
}
|
|
770
675
|
/** The layout of the obstacles (`docs/research/TAXONOMY.md`, dimension 3). */
|
|
771
676
|
type ObstacleLayout = "none" | "center" | "scattered" | "wall" | "corridors" | "touching" | "edge";
|
|
@@ -793,11 +698,14 @@ export declare function round3(x: number): number;
|
|
|
793
698
|
*/
|
|
794
699
|
export declare function canonicalJson(value: unknown): string;
|
|
795
700
|
/** This function gives the hash of an input file: the first 16 hex characters of the SHA-256 of its canonical form without `hash`. */
|
|
796
|
-
export declare function hashInput(file:
|
|
701
|
+
export declare function hashInput(file: LayoutInput$1): string;
|
|
797
702
|
/** This function gives the scale of a count: the nearest of 1, 10, 100, 1000 and 10000 on a log scale. The count 0 gives `1`. */
|
|
798
703
|
export declare function countCell(count: number): CountScale;
|
|
799
|
-
/**
|
|
800
|
-
|
|
704
|
+
/**
|
|
705
|
+
* This function gives the packing input of a file. The boxes become the items, and the edges go.
|
|
706
|
+
* A file without a container gets `{ fixed: "none" }`, so the packer picks the size. It is `toPackInput` of the contract.
|
|
707
|
+
*/
|
|
708
|
+
export declare function toPackInput(file: Pick<LayoutInput$1, "container" | "boxes" | "obstacles" | "gap">): PackInput;
|
|
801
709
|
/** A seeded generator of `layout-input/1` files. The same version, parameters and seed give the same file, byte for byte. */
|
|
802
710
|
interface CorpusGenerator<P extends GeneratorParams = GeneratorParams> {
|
|
803
711
|
/** The name. The file writes it in `generator.name`. */
|
|
@@ -815,7 +723,7 @@ interface CorpusGenerator<P extends GeneratorParams = GeneratorParams> {
|
|
|
815
723
|
/** This method gives the cell of each input of the parameters. The cell does not depend on the seed. */
|
|
816
724
|
cell(params?: Partial<P>): CorpusCell;
|
|
817
725
|
/** This method gives the input file of a seed. The `id` is `<set>/<family>/s<seed>`. */
|
|
818
|
-
generate(seed: number, params?: Partial<P>, set?: string):
|
|
726
|
+
generate(seed: number, params?: Partial<P>, set?: string): GeneratedInput;
|
|
819
727
|
}
|
|
820
728
|
/** The parameters of `rect-scattered`. */
|
|
821
729
|
type RectScatteredParams = {
|
|
@@ -903,12 +811,12 @@ interface CorpusManifest {
|
|
|
903
811
|
/** A corpus: the manifest and the input files, in the order of the specs and the seeds. */
|
|
904
812
|
interface Corpus {
|
|
905
813
|
manifest: CorpusManifest;
|
|
906
|
-
inputs:
|
|
814
|
+
inputs: GeneratedInput[];
|
|
907
815
|
}
|
|
908
816
|
/**
|
|
909
817
|
* This function generates a corpus from specs. Each input gets the name of the corpus as its set. The function throws a
|
|
910
818
|
* `RangeError` for an unknown generator, a different version or 2 inputs with the same id.
|
|
911
819
|
*/
|
|
912
820
|
export declare function corpus(name: string, specs: readonly CorpusSpec[]): Corpus;
|
|
913
|
-
export type
|
|
821
|
+
export { type Cell, type ChangeMeasures, type Corpus, type CorpusCell, type CorpusEntry, type CorpusGenerator, type CorpusManifest, type CorpusSpec, type CountScale, DEFAULT_TOLERANCE, type Dimension, type DimensionValue, type Direction, EPS, type EdgeCase, type EdgeCaseParams, type FreeSpace, type FreeSpan, type FreeWidthOptions, type FreeWidthResult, type FreeWidthTry, type GeneratedInput, type GeneratorParams, type GeneratorStamp, type Item, type LayoutContainer, type LayoutEdge, type LayoutInput, type LayoutMeasures, type LayoutStrategyOptions, type Margin, type MeasureFamily, type MeasureId, type MeasureOptions, type MeasureSpec, type MetricsOptions, type Obstacle, type ObstacleLayout, type PackContext, type PackHard, type PackInput, type PackLayoutOptions, type PackOptions, type PackOutput, type PackingMetrics, type Placement, type Port, type PushOptions, type PushStrategyOptions, RECORD_EPS, type RectGridParams, type RectScatteredParams, type Region, type ShelfOptions, type Side, type Sides, type SizeDistribution, type SizeSearch, type SkylineOptions, type SortOrder, type SpaceRect, type StageTrace, type Strategy, type Supports, type Tolerance, type UiParams, checkInput, turnPoint, turnPort, turnRegion };
|
|
914
822
|
//# sourceMappingURL=index.d.ts.map
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/vector.ts","../src/rect.ts","../src/order.ts","../src/
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["Item","Sides","ContractMeasureSpec","Direction","PackHard","LayoutContainer","LayoutEdge","LayoutInput"],"sources":["../src/vector.ts","../src/rect.ts","../src/order.ts","../src/contract.ts","../src/space.ts","../src/pack.ts","../src/skyline.ts","../src/shelf.ts","../src/free.ts","../src/push.ts","../src/metrics.ts","../src/measures.ts","../src/strategy.ts","../src/adapters.ts","../src/convert.ts","../src/registry.ts","../src/check.ts","../src/layout-input.ts","../src/generators.ts","../src/corpus.ts"],"mappings":"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"}
|