@tscircuit/rectdiff 0.0.39 → 0.0.40

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.
Files changed (53) hide show
  1. package/.github/workflows/bun-test.yml +1 -1
  2. package/lib/RectDiffPipeline.ts +0 -27
  3. package/lib/solvers/OuterLayerContainmentMergeSolver/OuterLayerContainmentMergeSolver.ts +4 -108
  4. package/package.json +1 -1
  5. package/tests/solver/__snapshots__/rectDiffGridSolverPipeline.snap.svg +3 -3
  6. package/tests/solver/arduino-uno-inner2-ground-bottom-power/__snapshots__/arduino-uno-inner2-ground-bottom-power.snap.svg +3 -3
  7. package/tests/solver/arduino-uno-inner2-ground-inner1-power/__snapshots__/arduino-uno-inner2-ground-inner1-power.snap.svg +1 -1
  8. package/tests/solver/both-points-equivalent/__snapshots__/both-points-equivalent.snap.svg +1 -1
  9. package/tests/solver/bugreport02-bc4361/__snapshots__/bugreport02-bc4361.snap.svg +3 -3
  10. package/tests/solver/bugreport03-fe4a17/__snapshots__/bugreport03-fe4a17.snap.svg +1 -1
  11. package/tests/solver/bugreport08-e3ec95/__snapshots__/bugreport08-e3ec95.snap.svg +1 -1
  12. package/tests/solver/bugreport09-618e09/__snapshots__/bugreport09-618e09.snap.svg +1 -1
  13. package/tests/solver/bugreport10-71239a/__snapshots__/bugreport10-71239a.snap.svg +3 -3
  14. package/tests/solver/bugreport11-b2de3c/__snapshots__/bugreport11-b2de3c.snap.svg +3 -3
  15. package/tests/solver/bugreport13-b9a758/__snapshots__/bugreport13-b9a758.snap.svg +2 -2
  16. package/tests/solver/bugreport16-d95f38/__snapshots__/bugreport16-d95f38.snap.svg +1 -1
  17. package/tests/solver/bugreport18-1b2d06/__snapshots__/bugreport18-1b2d06.snap.svg +3 -3
  18. package/tests/solver/bugreport19/__snapshots__/bugreport19.snap.svg +1 -1
  19. package/tests/solver/bugreport22-2a75ce/__snapshots__/bugreport22-2a75ce.snap.svg +1 -1
  20. package/tests/solver/bugreport23-LGA15x4/__snapshots__/bugreport23-LGA15x4.snap.svg +2 -2
  21. package/tests/solver/bugreport24-05597c/__snapshots__/bugreport24-05597c.snap.svg +1 -1
  22. package/tests/solver/bugreport25-4b1d55/__snapshots__/bugreport25-4b1d55.snap.svg +3 -3
  23. package/tests/solver/bugreport36-bf8303/__snapshots__/bugreport36-bf8303.snap.svg +2 -2
  24. package/tests/solver/interaction/__snapshots__/interaction.snap.svg +3 -3
  25. package/tests/solver/multi-point/__snapshots__/multi-point.snap.svg +1 -1
  26. package/tests/solver/no-better-path/__snapshots__/no-better-path.snap.svg +1 -1
  27. package/tests/solver/offboardconnects01/__snapshots__/offboardconnects01.snap.svg +1 -1
  28. package/tests/solver/pcb_trace_id-should-return-root-connection-name/__snapshots__/pcb_trace_id-should-return-root-connection-name.snap.svg +3 -3
  29. package/tests/solver/repros/merge-single-layer-node/__snapshots__/merge-single-layer-node.snap.svg +3 -3
  30. package/tests/solver/transitivity/__snapshots__/transitivity.snap.svg +2 -2
  31. package/lib/math/layers/getUnionZ.ts +0 -6
  32. package/lib/math/layers/getZLayerName.ts +0 -6
  33. package/lib/math/layers/getZSpanMask.ts +0 -6
  34. package/lib/math/layers/hasContiguousZSpan.ts +0 -11
  35. package/lib/math/rects/intersectRects.ts +0 -28
  36. package/lib/math/rects/mergeRects.ts +0 -12
  37. package/lib/math/rects/rectArea.ts +0 -7
  38. package/lib/math/rects/rectContainsRect.ts +0 -18
  39. package/lib/math/rects/rectsTouchOrOverlap.ts +0 -12
  40. package/lib/math/rects/subtractRects.ts +0 -23
  41. package/lib/solvers/SparseMultilayerPromotionSolver/SparseMultilayerPromotionSolver.ts +0 -134
  42. package/lib/solvers/SparseMultilayerPromotionSolver/cloneNode.ts +0 -15
  43. package/lib/solvers/SparseMultilayerPromotionSolver/cloneNodeWithRect.ts +0 -34
  44. package/lib/solvers/SparseMultilayerPromotionSolver/createResidualNodes.ts +0 -42
  45. package/lib/solvers/SparseMultilayerPromotionSolver/findBestCoalesceCandidate.ts +0 -98
  46. package/lib/solvers/SparseMultilayerPromotionSolver/findBestPromotionCandidate.ts +0 -72
  47. package/lib/solvers/SparseMultilayerPromotionSolver/getUsableMultilayerVolumeShare.ts +0 -34
  48. package/lib/solvers/SparseMultilayerPromotionSolver/isFreeNode.ts +0 -8
  49. package/lib/solvers/SparseMultilayerPromotionSolver/nodeToRect.ts +0 -13
  50. package/lib/solvers/SparseMultilayerPromotionSolver/solvers/CoalesceMultilayerTilesSolver.ts +0 -104
  51. package/lib/solvers/SparseMultilayerPromotionSolver/solvers/PromoteSparseMultilayerCoverageSolver.ts +0 -148
  52. package/lib/solvers/SparseMultilayerPromotionSolver/solvers/TrimContainedSingleLayerCoverageSolver.ts +0 -137
  53. package/lib/solvers/SparseMultilayerPromotionSolver/types.ts +0 -23
@@ -28,4 +28,4 @@ jobs:
28
28
  run: bun install
29
29
 
30
30
  - name: Run tests
31
- run: bun test --timeout 999999
31
+ run: bun test --timeout 9999
@@ -16,20 +16,17 @@ import { computeInverseRects } from "./solvers/RectDiffSeedingSolver/computeInve
16
16
  import { buildZIndexMap } from "./solvers/RectDiffSeedingSolver/layers"
17
17
  import { buildObstacleClearanceGraphics } from "./utils/renderObstacleClearance"
18
18
  import { mergeGraphics } from "graphics-debug"
19
- import { SparseMultilayerPromotionSolver } from "./solvers/SparseMultilayerPromotionSolver/SparseMultilayerPromotionSolver"
20
19
 
21
20
  export interface RectDiffPipelineInput {
22
21
  simpleRouteJson: SimpleRouteJson
23
22
  gridOptions?: Partial<GridFill3DOptions>
24
23
  obstacleClearance?: number
25
- sparseMultilayerPromotionTargetShare?: number
26
24
  }
27
25
 
28
26
  export class RectDiffPipeline extends BasePipelineSolver<RectDiffPipelineInput> {
29
27
  rectDiffGridSolverPipeline?: RectDiffGridSolverPipeline
30
28
  gapFillSolver?: GapFillSolverPipeline
31
29
  outerLayerContainmentMergeSolver?: OuterLayerContainmentMergeSolver
32
- sparseMultilayerPromotionSolver?: SparseMultilayerPromotionSolver
33
30
  boardVoidRects: XYRect[] | undefined
34
31
  zIndexByName?: Map<string, number>
35
32
  layerNames?: string[]
@@ -90,25 +87,6 @@ export class RectDiffPipeline extends BasePipelineSolver<RectDiffPipelineInput>
90
87
  },
91
88
  ],
92
89
  ),
93
- definePipelineStep(
94
- "sparseMultilayerPromotionSolver",
95
- SparseMultilayerPromotionSolver,
96
- (rectDiffPipeline: RectDiffPipeline) => [
97
- {
98
- meshNodes:
99
- rectDiffPipeline.outerLayerContainmentMergeSolver?.getOutput()
100
- .outputNodes ??
101
- rectDiffPipeline.gapFillSolver?.getOutput().outputNodes ??
102
- rectDiffPipeline.rectDiffGridSolverPipeline?.getOutput()
103
- .meshNodes ??
104
- [],
105
- promotionTargetShare:
106
- rectDiffPipeline.inputProblem
107
- .sparseMultilayerPromotionTargetShare ?? 0.86,
108
- simpleRouteJson: rectDiffPipeline.inputProblem.simpleRouteJson,
109
- },
110
- ],
111
- ),
112
90
  ]
113
91
 
114
92
  override _setup(): void {
@@ -142,11 +120,6 @@ export class RectDiffPipeline extends BasePipelineSolver<RectDiffPipelineInput>
142
120
  override getOutput(): { meshNodes: CapacityMeshNode[] } {
143
121
  const outerLayerMergeOutput =
144
122
  this.outerLayerContainmentMergeSolver?.getOutput()
145
- const sparseMultilayerOutput =
146
- this.sparseMultilayerPromotionSolver?.getOutput()
147
- if (sparseMultilayerOutput) {
148
- return { meshNodes: sparseMultilayerOutput.outputNodes }
149
- }
150
123
  if (outerLayerMergeOutput) {
151
124
  return { meshNodes: outerLayerMergeOutput.outputNodes }
152
125
  }
@@ -29,22 +29,6 @@ const nodeToRect = (node: CapacityMeshNode): XYRect => ({
29
29
 
30
30
  const rectArea = (rect: XYRect) => rect.width * rect.height
31
31
 
32
- const intersectRects = (a: XYRect, b: XYRect): XYRect | null => {
33
- const x0 = Math.max(a.x, b.x)
34
- const y0 = Math.max(a.y, b.y)
35
- const x1 = Math.min(a.x + a.width, b.x + b.width)
36
- const y1 = Math.min(a.y + a.height, b.y + b.height)
37
-
38
- if (x1 <= x0 + EPS || y1 <= y0 + EPS) return null
39
-
40
- return {
41
- x: x0,
42
- y: y0,
43
- width: x1 - x0,
44
- height: y1 - y0,
45
- }
46
- }
47
-
48
32
  const cloneNode = (node: CapacityMeshNode): CapacityMeshNode => ({
49
33
  ...node,
50
34
  center: { ...node.center },
@@ -103,7 +87,6 @@ const isFullyCoveredByRects = (target: XYRect, coveringRects: XYRect[]) => {
103
87
  export class OuterLayerContainmentMergeSolver extends BaseSolver {
104
88
  private outputNodes: CapacityMeshNode[] = []
105
89
  private promotedNodeIds = new Set<string>()
106
- private fullyPromotedNodeIds = new Set<string>()
107
90
  private residualNodeIds = new Set<string>()
108
91
 
109
92
  constructor(private input: OuterLayerContainmentMergeSolverInput) {
@@ -113,7 +96,6 @@ export class OuterLayerContainmentMergeSolver extends BaseSolver {
113
96
  override _setup() {
114
97
  this.outputNodes = this.input.meshNodes.map(cloneNode)
115
98
  this.promotedNodeIds.clear()
116
- this.fullyPromotedNodeIds.clear()
117
99
  this.residualNodeIds.clear()
118
100
  }
119
101
 
@@ -134,8 +116,6 @@ export class OuterLayerContainmentMergeSolver extends BaseSolver {
134
116
  const viaMinSize = Math.max(srj.minViaDiameter ?? 0, srj.minTraceWidth || 0)
135
117
  const originalNodes = this.input.meshNodes.map(cloneNode)
136
118
  const obstaclesByLayer = this.buildObstaclesByLayer(layerCount)
137
- const shouldAllowPartialPromotion =
138
- this.getUsableMultilayerVolumeShare(originalNodes) < 0.5
139
119
  const mutableOuterNodes = originalNodes.filter(
140
120
  (node) =>
141
121
  isFreeNode(node) &&
@@ -186,51 +166,23 @@ export class OuterLayerContainmentMergeSolver extends BaseSolver {
186
166
  continue
187
167
  }
188
168
  if (!isFullyCoveredByRects(candidateRect, oppositeSupportRects)) {
189
- if (!shouldAllowPartialPromotion) {
190
- continue
191
- }
192
-
193
- const partialPromotionRects = this.getSupportedPromotionRects({
194
- candidateRect,
195
- supportRects: oppositeSupportRects,
196
- minRectSize: viaMinSize,
197
- })
198
-
199
- if (partialPromotionRects.length === 0) {
200
- continue
201
- }
202
-
203
- for (const partialRect of partialPromotionRects) {
204
- const promotedNode = cloneNodeWithRect(
205
- candidate,
206
- partialRect,
207
- `${candidate.capacityMeshNodeId}-outer-partial-${promotedNodes.length}`,
208
- )
209
- promotedNode.availableZ = [topZ, bottomZ]
210
- promotedNode.layer = `z${topZ},${bottomZ}`
211
- promotedNodes.push(promotedNode)
212
- promotedRects.push(partialRect)
213
- this.promotedNodeIds.add(promotedNode.capacityMeshNodeId)
214
- }
215
169
  continue
216
170
  }
217
171
 
218
- const promotedNode = {
172
+ promotedNodes.push({
219
173
  ...candidate,
220
174
  availableZ: [topZ, bottomZ],
221
175
  layer: `z${topZ},${bottomZ}`,
222
- }
223
- promotedNodes.push(promotedNode)
176
+ })
224
177
  promotedRects.push(candidateRect)
225
- this.promotedNodeIds.add(promotedNode.capacityMeshNodeId)
226
- this.fullyPromotedNodeIds.add(candidate.capacityMeshNodeId)
178
+ this.promotedNodeIds.add(candidate.capacityMeshNodeId)
227
179
  }
228
180
 
229
181
  let nextResidualId = 0
230
182
  const residualNodes: CapacityMeshNode[] = []
231
183
 
232
184
  for (const node of mutableOuterNodes) {
233
- if (this.fullyPromotedNodeIds.has(node.capacityMeshNodeId)) {
185
+ if (this.promotedNodeIds.has(node.capacityMeshNodeId)) {
234
186
  continue
235
187
  }
236
188
 
@@ -259,62 +211,6 @@ export class OuterLayerContainmentMergeSolver extends BaseSolver {
259
211
  return [...immutableNodes, ...promotedNodes, ...residualNodes]
260
212
  }
261
213
 
262
- private getUsableMultilayerVolumeShare(nodes: CapacityMeshNode[]) {
263
- let totalVolume = 0
264
- let obstacleVolume = 0
265
- let multilayerVolume = 0
266
-
267
- for (const node of nodes) {
268
- const volume = node.width * node.height * node.availableZ.length
269
- totalVolume += volume
270
- if (node._containsObstacle) {
271
- obstacleVolume += volume
272
- continue
273
- }
274
- if (node.availableZ.length > 1) {
275
- multilayerVolume += volume
276
- }
277
- }
278
-
279
- const usableVolume = totalVolume - obstacleVolume
280
- if (usableVolume <= EPS) return 0
281
- return multilayerVolume / usableVolume
282
- }
283
-
284
- private getSupportedPromotionRects(params: {
285
- candidateRect: XYRect
286
- supportRects: XYRect[]
287
- minRectSize: number
288
- }) {
289
- const { candidateRect, supportRects, minRectSize } = params
290
- const promotedPieces: XYRect[] = []
291
-
292
- for (const supportRect of supportRects) {
293
- const overlapRect = intersectRects(candidateRect, supportRect)
294
- if (!overlapRect) continue
295
-
296
- let remainingPieces = [overlapRect]
297
- for (const existingPiece of promotedPieces) {
298
- remainingPieces = remainingPieces.flatMap((piece) =>
299
- subtractRect2D(piece, existingPiece),
300
- )
301
- if (remainingPieces.length === 0) break
302
- }
303
-
304
- for (const piece of remainingPieces) {
305
- if (
306
- piece.width + EPS < minRectSize ||
307
- piece.height + EPS < minRectSize
308
- ) {
309
- continue
310
- }
311
- promotedPieces.push(piece)
312
- }
313
- }
314
-
315
- return promotedPieces
316
- }
317
-
318
214
  private buildObstaclesByLayer(layerCount: number): ObstacleWithRect[][] {
319
215
  const out = Array.from(
320
216
  { length: layerCount },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tscircuit/rectdiff",
3
- "version": "0.0.39",
3
+ "version": "0.0.40",
4
4
  "type": "module",
5
5
  "main": "lib/index.ts",
6
6
  "types": "lib/index.ts",