@tscircuit/schematic-trace-solver 0.0.43 → 0.0.44

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/dist/index.d.ts CHANGED
@@ -238,6 +238,7 @@ declare class TraceOverlapShiftSolver extends BaseSolver {
238
238
  */
239
239
  traceNetIslands: Record<ConnNetId, Array<SolvedTracePath>>;
240
240
  correctedTraceMap: Record<MspConnectionPairId, SolvedTracePath>;
241
+ cleanupPhase: "diagonals" | "done" | null;
241
242
  constructor(params: {
242
243
  inputProblem: InputProblem;
243
244
  inputTracePaths: Array<SolvedTracePath>;
@@ -248,6 +249,8 @@ declare class TraceOverlapShiftSolver extends BaseSolver {
248
249
  findNextOverlapIssue(): {
249
250
  overlappingTraceSegments: Array<OverlappingTraceSegmentLocator>;
250
251
  } | null;
252
+ private findNextDiagonalSegment;
253
+ private findAndFixNextDiagonalSegment;
251
254
  _step(): void;
252
255
  visualize(): graphics_debug.GraphicsObject;
253
256
  }
package/dist/index.js CHANGED
@@ -1188,6 +1188,7 @@ var TraceOverlapShiftSolver = class extends BaseSolver {
1188
1188
  */
1189
1189
  traceNetIslands = {};
1190
1190
  correctedTraceMap = {};
1191
+ cleanupPhase = null;
1191
1192
  constructor(params) {
1192
1193
  super();
1193
1194
  this.inputProblem = params.inputProblem;
@@ -1314,6 +1315,47 @@ var TraceOverlapShiftSolver = class extends BaseSolver {
1314
1315
  }
1315
1316
  return null;
1316
1317
  }
1318
+ findNextDiagonalSegment() {
1319
+ const EPS4 = 2e-3;
1320
+ for (const mspPairId in this.correctedTraceMap) {
1321
+ const tracePath = this.correctedTraceMap[mspPairId].tracePath;
1322
+ for (let i = 0; i < tracePath.length - 1; i++) {
1323
+ const p1 = tracePath[i];
1324
+ const p2 = tracePath[i + 1];
1325
+ const isHorizontal2 = Math.abs(p1.y - p2.y) < EPS4;
1326
+ const isVertical2 = Math.abs(p1.x - p2.x) < EPS4;
1327
+ if (!isHorizontal2 && !isVertical2) {
1328
+ return { mspPairId, tracePath, i, p1, p2 };
1329
+ }
1330
+ }
1331
+ }
1332
+ return null;
1333
+ }
1334
+ findAndFixNextDiagonalSegment() {
1335
+ const diagonalInfo = this.findNextDiagonalSegment();
1336
+ if (!diagonalInfo) {
1337
+ return false;
1338
+ }
1339
+ const { mspPairId, tracePath, i, p1, p2 } = diagonalInfo;
1340
+ const EPS4 = 2e-3;
1341
+ const p0 = i > 0 ? tracePath[i - 1] : null;
1342
+ const p3 = i + 2 < tracePath.length ? tracePath[i + 2] : null;
1343
+ const prevIsVertical = p0 ? Math.abs(p0.x - p1.x) < EPS4 : false;
1344
+ const prevIsHorizontal = p0 ? Math.abs(p0.y - p1.y) < EPS4 : false;
1345
+ const nextIsVertical = p3 ? Math.abs(p2.x - p3.x) < EPS4 : false;
1346
+ const nextIsHorizontal = p3 ? Math.abs(p2.y - p3.y) < EPS4 : false;
1347
+ const elbow1 = { x: p1.x, y: p2.y };
1348
+ const elbow2 = { x: p2.x, y: p1.y };
1349
+ let score1 = 0;
1350
+ if (prevIsVertical) score1++;
1351
+ if (nextIsHorizontal) score1++;
1352
+ let score2 = 0;
1353
+ if (prevIsHorizontal) score2++;
1354
+ if (nextIsVertical) score2++;
1355
+ const elbowPoint = score1 < score2 ? elbow1 : elbow2;
1356
+ tracePath.splice(i + 1, 0, elbowPoint);
1357
+ return true;
1358
+ }
1317
1359
  _step() {
1318
1360
  if (this.activeSubSolver?.solved) {
1319
1361
  for (const [mspPairId, newTrace] of Object.entries(
@@ -1330,6 +1372,17 @@ var TraceOverlapShiftSolver = class extends BaseSolver {
1330
1372
  }
1331
1373
  const overlapIssue = this.findNextOverlapIssue();
1332
1374
  if (overlapIssue === null) {
1375
+ if (this.cleanupPhase === null) {
1376
+ this.cleanupPhase = "diagonals";
1377
+ }
1378
+ if (this.cleanupPhase === "diagonals") {
1379
+ const fixedDiagonal = this.findAndFixNextDiagonalSegment();
1380
+ if (!fixedDiagonal) {
1381
+ this.cleanupPhase = "done";
1382
+ this.solved = true;
1383
+ }
1384
+ return;
1385
+ }
1333
1386
  this.solved = true;
1334
1387
  return;
1335
1388
  }
@@ -1344,12 +1397,23 @@ var TraceOverlapShiftSolver = class extends BaseSolver {
1344
1397
  return this.activeSubSolver.visualize();
1345
1398
  }
1346
1399
  const graphics = visualizeInputProblem(this.inputProblem);
1400
+ graphics.circles = graphics.circles || [];
1347
1401
  for (const trace of Object.values(this.correctedTraceMap)) {
1348
1402
  graphics.lines.push({
1349
1403
  points: trace.tracePath,
1350
1404
  strokeColor: "purple"
1351
1405
  });
1352
1406
  }
1407
+ if (this.cleanupPhase === "diagonals") {
1408
+ const diagonalInfo = this.findNextDiagonalSegment();
1409
+ if (diagonalInfo) {
1410
+ graphics.lines.push({
1411
+ points: [diagonalInfo.p1, diagonalInfo.p2],
1412
+ strokeColor: "red",
1413
+ strokeWidth: 0.05
1414
+ });
1415
+ }
1416
+ }
1353
1417
  return graphics;
1354
1418
  }
1355
1419
  };
@@ -42,6 +42,8 @@ export class TraceOverlapShiftSolver extends BaseSolver {
42
42
 
43
43
  correctedTraceMap: Record<MspConnectionPairId, SolvedTracePath> = {}
44
44
 
45
+ cleanupPhase: "diagonals" | "done" | null = null
46
+
45
47
  constructor(params: {
46
48
  inputProblem: InputProblem
47
49
  inputTracePaths: Array<SolvedTracePath>
@@ -211,6 +213,62 @@ export class TraceOverlapShiftSolver extends BaseSolver {
211
213
  return null
212
214
  }
213
215
 
216
+ private findNextDiagonalSegment() {
217
+ const EPS = 2e-3
218
+ for (const mspPairId in this.correctedTraceMap) {
219
+ const tracePath = this.correctedTraceMap[mspPairId]!.tracePath
220
+ for (let i = 0; i < tracePath.length - 1; i++) {
221
+ const p1 = tracePath[i]!
222
+ const p2 = tracePath[i + 1]!
223
+
224
+ const isHorizontal = Math.abs(p1.y - p2.y) < EPS
225
+ const isVertical = Math.abs(p1.x - p2.x) < EPS
226
+
227
+ if (!isHorizontal && !isVertical) {
228
+ return { mspPairId, tracePath, i, p1, p2 }
229
+ }
230
+ }
231
+ }
232
+ return null
233
+ }
234
+
235
+ private findAndFixNextDiagonalSegment(): boolean {
236
+ const diagonalInfo = this.findNextDiagonalSegment()
237
+
238
+ if (!diagonalInfo) {
239
+ return false // No diagonal segments found
240
+ }
241
+
242
+ const { mspPairId, tracePath, i, p1, p2 } = diagonalInfo
243
+ const EPS = 2e-3
244
+
245
+ const p0 = i > 0 ? tracePath[i - 1] : null
246
+ const p3 = i + 2 < tracePath.length ? tracePath[i + 2] : null
247
+
248
+ const prevIsVertical = p0 ? Math.abs(p0.x - p1.x) < EPS : false
249
+ const prevIsHorizontal = p0 ? Math.abs(p0.y - p1.y) < EPS : false
250
+
251
+ const nextIsVertical = p3 ? Math.abs(p2.x - p3.x) < EPS : false
252
+ const nextIsHorizontal = p3 ? Math.abs(p2.y - p3.y) < EPS : false
253
+
254
+ const elbow1 = { x: p1.x, y: p2.y } // vertical from p1
255
+ const elbow2 = { x: p2.x, y: p1.y } // horizontal from p1
256
+
257
+ let score1 = 0
258
+ if (prevIsVertical) score1++
259
+ if (nextIsHorizontal) score1++
260
+
261
+ let score2 = 0
262
+ if (prevIsHorizontal) score2++
263
+ if (nextIsVertical) score2++
264
+
265
+ const elbowPoint = score1 < score2 ? elbow1 : elbow2
266
+
267
+ // Replace [p1, p2] with [p1, elbowPoint, p2]
268
+ tracePath.splice(i + 1, 0, elbowPoint)
269
+ return true // Fixed one diagonal, return true to re-evaluate in next step
270
+ }
271
+
214
272
  override _step() {
215
273
  if (this.activeSubSolver?.solved) {
216
274
  for (const [mspPairId, newTrace] of Object.entries(
@@ -231,6 +289,19 @@ export class TraceOverlapShiftSolver extends BaseSolver {
231
289
  const overlapIssue = this.findNextOverlapIssue()
232
290
 
233
291
  if (overlapIssue === null) {
292
+ if (this.cleanupPhase === null) {
293
+ this.cleanupPhase = "diagonals"
294
+ }
295
+
296
+ if (this.cleanupPhase === "diagonals") {
297
+ const fixedDiagonal = this.findAndFixNextDiagonalSegment()
298
+ if (!fixedDiagonal) {
299
+ this.cleanupPhase = "done"
300
+ this.solved = true
301
+ }
302
+ return
303
+ }
304
+ // If cleanupPhase is "done", then the solver is truly solved.
234
305
  this.solved = true
235
306
  return
236
307
  }
@@ -249,6 +320,7 @@ export class TraceOverlapShiftSolver extends BaseSolver {
249
320
  }
250
321
 
251
322
  const graphics = visualizeInputProblem(this.inputProblem)
323
+ graphics.circles = graphics.circles || []
252
324
 
253
325
  // Draw current corrected traces
254
326
  for (const trace of Object.values(this.correctedTraceMap)) {
@@ -258,6 +330,17 @@ export class TraceOverlapShiftSolver extends BaseSolver {
258
330
  })
259
331
  }
260
332
 
333
+ if (this.cleanupPhase === "diagonals") {
334
+ const diagonalInfo = this.findNextDiagonalSegment()
335
+ if (diagonalInfo) {
336
+ graphics.lines!.push({
337
+ points: [diagonalInfo.p1, diagonalInfo.p2],
338
+ strokeColor: "red",
339
+ strokeWidth: 0.05,
340
+ })
341
+ }
342
+ }
343
+
261
344
  return graphics
262
345
  }
263
346
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tscircuit/schematic-trace-solver",
3
3
  "main": "dist/index.js",
4
- "version": "0.0.43",
4
+ "version": "0.0.44",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "start": "cosmos",
@@ -51,7 +51,7 @@ x-" data-x="1.6" data-y="1.7049999999999998" cx="353.6" cy="244.12000000000006"
51
51
  <circle data-type="point" data-label="" data-x="1.6" data-y="1.7049999999999998" cx="353.6" cy="244.12000000000006" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
52
52
  </g>
53
53
  <g>
54
- <circle data-type="point" data-label="" data-x="1.3" data-y="1.0025" cx="320" cy="322.80000000000007" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
54
+ <circle data-type="point" data-label="" data-x="1.3" data-y="0.09999999999999998" cx="320" cy="423.88000000000005" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
55
55
  </g>
56
56
  <g>
57
57
  <circle data-type="point" data-label="" data-x="0.9490000000000001" data-y="2.105" cx="280.68800000000005" cy="199.32000000000005" r="3" fill="hsl(40, 100%, 50%, 0.9)" />
@@ -66,10 +66,10 @@ x-" data-x="1.6" data-y="1.7049999999999998" cx="353.6" cy="244.12000000000006"
66
66
  <polyline data-points="1.2000000000000002,0.30000000000000004 1.6,2.105" data-type="line" data-label="" points="308.80000000000007,401.48 353.6,199.32000000000005" fill="none" stroke="hsl(190, 100%, 50%, 0.8)" stroke-width="1" stroke-dasharray="4 2" />
67
67
  </g>
68
68
  <g>
69
- <polyline data-points="1.2000000000000002,0.09999999999999998 1.4000000000000001,0.09999999999999998 1.3,1.0025 1.3,1.5049999999999997 1.049,1.5049999999999997 1.049,1.905 1.6,1.9049999999999998" data-type="line" data-label="" points="308.80000000000007,423.88000000000005 331.20000000000005,423.88000000000005 320,322.80000000000007 320,266.5200000000001 291.88800000000003,266.5200000000001 291.88800000000003,221.72000000000003 353.6,221.72000000000006" fill="none" stroke="purple" stroke-width="1" />
69
+ <polyline data-points="1.2000000000000002,0.09999999999999998 1.3,0.09999999999999998 1.3,1.5049999999999997 1.049,1.5049999999999997 1.049,1.905 1.6,1.9049999999999998" data-type="line" data-label="" points="308.80000000000007,423.88000000000005 320,423.88000000000005 320,266.5200000000001 291.88800000000003,266.5200000000001 291.88800000000003,221.72000000000003 353.6,221.72000000000006" fill="none" stroke="purple" stroke-width="1" />
70
70
  </g>
71
71
  <g>
72
- <polyline data-points="1.2000000000000002,0.30000000000000004 1.4000000000000001,0.30000000000000004 1.5000000000000002,1.2025000000000001 1.5000000000000002,1.4049999999999998 0.9490000000000001,1.4049999999999998 0.9490000000000001,2.105 1.6,2.105" data-type="line" data-label="" points="308.80000000000007,401.48 331.20000000000005,401.48 342.4000000000001,300.40000000000003 342.4000000000001,277.72 280.68800000000005,277.72 280.68800000000005,199.32000000000005 353.6,199.32000000000005" fill="none" stroke="purple" stroke-width="1" />
72
+ <polyline data-points="1.2000000000000002,0.30000000000000004 1.5000000000000002,0.30000000000000004 1.5000000000000002,1.4049999999999998 0.9490000000000001,1.4049999999999998 0.9490000000000001,2.105 1.6,2.105" data-type="line" data-label="" points="308.80000000000007,401.48 342.4000000000001,401.48 342.4000000000001,277.72 280.68800000000005,277.72 280.68800000000005,199.32000000000005 353.6,199.32000000000005" fill="none" stroke="purple" stroke-width="1" />
73
73
  </g>
74
74
  <g>
75
75
  <rect data-type="rect" data-label="schematic_component_0" data-x="0" data-y="0" x="40" y="379.08000000000004" width="268.80000000000007" height="112" fill="hsl(24, 100%, 50%, 0.8)" stroke="black" stroke-width="0.008928571428571428" />
@@ -84,7 +84,7 @@ x-" data-x="1.6" data-y="1.7049999999999998" cx="353.6" cy="244.12000000000006"
84
84
  <rect data-type="rect" data-label="" data-x="1.374" data-y="1.7049999999999998" x="303.088" y="232.92000000000004" width="50.400000000000034" height="22.400000000000034" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008928571428571428" />
85
85
  </g>
86
86
  <g>
87
- <rect data-type="rect" data-label="" data-x="1.075" data-y="1.0025" x="269.6" y="311.6" width="50.39999999999998" height="22.400000000000034" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008928571428571428" />
87
+ <rect data-type="rect" data-label="" data-x="1.5250000000000001" data-y="0.09999999999999998" x="320" y="412.68000000000006" width="50.40000000000009" height="22.399999999999977" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008928571428571428" />
88
88
  </g>
89
89
  <g>
90
90
  <rect data-type="rect" data-label="" data-x="0.9490000000000001" data-y="2.33" x="269.48800000000006" y="148.92000000000002" width="22.399999999999977" height="50.400000000000034" fill="hsl(40, 100%, 50%, 0.35)" stroke="black" stroke-width="0.008928571428571428" />
@@ -534,7 +534,7 @@ x+" data-x="-8.4" data-y="-17" cx="198.31710258539454" cy="399.68032912258366" r
534
534
  <circle data-type="point" data-label="" data-x="3.5999999999999996" data-y="0.7000000000000015" cx="413.0516274346982" cy="82.94690496986073" r="3" fill="hsl(80, 100%, 50%, 0.9)" />
535
535
  </g>
536
536
  <g>
537
- <circle data-type="point" data-label="" data-x="-5.750000000000001" data-y="-10.1" cx="245.73764348961578" cy="276.2079773342341" r="3" fill="hsl(80, 100%, 50%, 0.9)" />
537
+ <circle data-type="point" data-label="" data-x="-5.750000000000001" data-y="-10" cx="245.73764348961578" cy="274.4185229604899" r="3" fill="hsl(80, 100%, 50%, 0.9)" />
538
538
  </g>
539
539
  <g>
540
540
  <circle data-type="point" data-label="" data-x="-4" data-y="-11.775" cx="277.0530950301392" cy="306.1813380944494" r="3" fill="hsl(80, 100%, 50%, 0.9)" />
@@ -849,7 +849,7 @@ x+" data-x="-8.4" data-y="-17" cx="198.31710258539454" cy="399.68032912258366" r
849
849
  <polyline data-points="-4.449999999999999,-10 -4,-10 -4,-10.45" data-type="line" data-label="" points="269.00055034829035,274.4185229604899 277.0530950301392,274.4185229604899 277.0530950301392,282.47106764233877" fill="none" stroke="purple" stroke-width="1" />
850
850
  </g>
851
851
  <g>
852
- <polyline data-points="-5.550000000000001,-10 -5.750000000000001,-10.1 -7.075,-10.1 -7.075,-5 -8.4,-5" data-type="line" data-label="" points="249.31655223710416,274.4185229604899 245.73764348961578,276.2079773342341 222.02737303750516,276.2079773342341 222.02737303750516,184.94580427328003 198.31710258539454,184.94580427328003" fill="none" stroke="purple" stroke-width="1" />
852
+ <polyline data-points="-5.550000000000001,-10 -5.750000000000001,-10 -5.750000000000001,-10.1 -7.075,-10.1 -7.075,-5 -8.4,-5" data-type="line" data-label="" points="249.31655223710416,274.4185229604899 245.73764348961578,274.4185229604899 245.73764348961578,276.2079773342341 222.02737303750516,276.2079773342341 222.02737303750516,184.94580427328003 198.31710258539454,184.94580427328003" fill="none" stroke="purple" stroke-width="1" />
853
853
  </g>
854
854
  <g>
855
855
  <polyline data-points="-4,-11.55 -4,-12 -3,-12 -3,-12.45" data-type="line" data-label="" points="277.0530950301392,302.1550657535249 277.0530950301392,310.2076104353738 294.9476387675812,310.2076104353738 294.9476387675812,318.2601551172227" fill="none" stroke="purple" stroke-width="1" />
@@ -876,7 +876,7 @@ x+" data-x="-8.4" data-y="-17" cx="198.31710258539454" cy="399.68032912258366" r
876
876
  <polyline data-points="-3,-16.45 -3,-16 -4,-16 -4,-15.55" data-type="line" data-label="" points="294.9476387675812,389.8383300669906 294.9476387675812,381.7857853851417 277.0530950301392,381.7857853851417 277.0530950301392,373.73324070329284" fill="none" stroke="purple" stroke-width="1" />
877
877
  </g>
878
878
  <g>
879
- <polyline data-points="-5.550000000000001,-16 -6.875000000000001,-16 -6.875000000000001,-9.9 -8.200000000000001,-9.9 -8.4,-10" data-type="line" data-label="" points="249.31655223710416,381.7857853851417 225.60628178499354,381.7857853851417 225.60628178499354,272.6290685867457 201.89601133288292,272.6290685867457 198.31710258539454,274.4185229604899" fill="none" stroke="purple" stroke-width="1" />
879
+ <polyline data-points="-5.550000000000001,-16 -6.875000000000001,-16 -6.875000000000001,-9.9 -8.200000000000001,-9.9 -8.200000000000001,-10 -8.4,-10" data-type="line" data-label="" points="249.31655223710416,381.7857853851417 225.60628178499354,381.7857853851417 225.60628178499354,272.6290685867457 201.89601133288292,272.6290685867457 201.89601133288292,274.4185229604899 198.31710258539454,274.4185229604899" fill="none" stroke="purple" stroke-width="1" />
880
880
  </g>
881
881
  <g>
882
882
  <polyline data-points="-4,-18.45 -4,-18 -3,-18 -3,-17.55" data-type="line" data-label="" points="277.0530950301392,425.6274175418746 277.0530950301392,417.5748728600257 294.9476387675812,417.5748728600257 294.9476387675812,409.52232817817685" fill="none" stroke="purple" stroke-width="1" />
@@ -1056,7 +1056,7 @@ x+" data-x="-8.4" data-y="-17" cx="198.31710258539454" cy="399.68032912258366" r
1056
1056
  <rect data-type="rect" data-label="" data-x="3.3739999999999997" data-y="0.7000000000000015" x="404.9811882091119" y="81.15745059611653" width="8.052544681848872" height="3.5789087474883985" fill="hsl(80, 100%, 50%, 0.35)" stroke="black" stroke-width="0.05588295598214286" />
1057
1057
  </g>
1058
1058
  <g>
1059
- <rect data-type="rect" data-label="" data-x="-5.750000000000001" data-y="-9.875" x="243.94818911587157" y="268.15543265238523" width="3.5789087474883843" height="8.052544681848872" fill="hsl(80, 100%, 50%, 0.35)" stroke="black" stroke-width="0.05588295598214286" />
1059
+ <rect data-type="rect" data-label="" data-x="-5.750000000000001" data-y="-9.775" x="243.94818911587157" y="266.365978278641" width="3.5789087474883843" height="8.052544681848872" fill="hsl(80, 100%, 50%, 0.35)" stroke="black" stroke-width="0.05588295598214286" />
1060
1060
  </g>
1061
1061
  <g>
1062
1062
  <rect data-type="rect" data-label="" data-x="-3.775" data-y="-11.775" x="277.0530950301392" y="304.3918837207052" width="8.052544681848929" height="3.5789087474884127" fill="hsl(80, 100%, 50%, 0.35)" stroke="black" stroke-width="0.05588295598214286" />