@knowvah/dot-engine 2.1.0 → 2.3.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.
@@ -0,0 +1,3 @@
1
+ /** libm `hypot(a, b)` of the native build host. */
2
+ export declare function libmHypot(a: number, b: number): number;
3
+ //# sourceMappingURL=libm-hypot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"libm-hypot.d.ts","sourceRoot":"","sources":["../../src/common/libm-hypot.ts"],"names":[],"mappings":"AAyBA,mDAAmD;AACnD,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAQtD"}
@@ -1 +1 @@
1
- {"version":3,"file":"poly-sizing.d.ts","sourceRoot":"","sources":["../../src/common/poly-sizing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"poly-sizing.d.ts","sourceRoot":"","sources":["../../src/common/poly-sizing.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -16909,6 +16909,24 @@ function RADIANS(deg) {
16909
16909
  return deg / 180 * Math.PI;
16910
16910
  }
16911
16911
 
16912
+ // src/common/libm-hypot.ts
16913
+ var BIG = 2 ** 500;
16914
+ var SMALL = 2 ** -500;
16915
+ var SCALE_UP = 2 ** 600;
16916
+ var SCALE_DOWN = 2 ** -600;
16917
+ function libmHypot(a, b) {
16918
+ if (a === Infinity || a === -Infinity || b === Infinity || b === -Infinity) return Infinity;
16919
+ let x = Math.abs(a);
16920
+ let y = Math.abs(b);
16921
+ if (x < y) [x, y] = [y, x];
16922
+ if (x > BIG) return core(x * SCALE_DOWN, y * SCALE_DOWN) * SCALE_UP;
16923
+ if (x < SMALL) return core(x * SCALE_UP, y * SCALE_UP) * SCALE_DOWN;
16924
+ return core(x, y);
16925
+ }
16926
+ function core(x, y) {
16927
+ return Math.sqrt(fma(y, y, x * x));
16928
+ }
16929
+
16912
16930
  // src/common/poly-sizing.ts
16913
16931
  var GAP = 4;
16914
16932
  var XPAD = 4 * GAP;
@@ -16996,16 +17014,16 @@ function ellipsePeripheryBB(bb, peripheries, penwidth, hasOutline) {
16996
17014
  return { bb: b, outline };
16997
17015
  }
16998
17016
  function transformUnitVertex(R2, g, c, bb) {
16999
- const D = { x: R2.x * (c.skewdist + R2.y * c.gdistortion) + R2.y * c.gskew, y: R2.y };
17017
+ const D = { x: fma(R2.x, fma(R2.y, c.gdistortion, c.skewdist), R2.y * c.gskew), y: R2.y };
17000
17018
  const alpha = RADIANS(g.orientation) + Math.atan2(D.y, D.x);
17001
- const r = Math.sqrt(D.x * D.x + D.y * D.y);
17019
+ const r = libmHypot(D.x, D.y);
17002
17020
  return { x: r * Math.cos(alpha) * bb.x, y: r * Math.sin(alpha) * bb.y };
17003
17021
  }
17004
17022
  function polygonVertices(bb, g, isBox3) {
17005
17023
  const sectorangle = 2 * Math.PI / g.sides;
17006
17024
  const sidelength = Math.sin(sectorangle / 2);
17007
17025
  const c = {
17008
- skewdist: Math.hypot(Math.abs(g.distortion) + Math.abs(g.skew), 1),
17026
+ skewdist: libmHypot(Math.abs(g.distortion) + Math.abs(g.skew), 1),
17009
17027
  gdistortion: g.distortion * SQRT2 / Math.cos(sectorangle / 2),
17010
17028
  gskew: g.skew / 2
17011
17029
  };
@@ -17430,13 +17448,13 @@ function evalBezier(sp, t, left2, right2) {
17430
17448
  return pt;
17431
17449
  }
17432
17450
  var HW = 2;
17433
- var SMALL = 1e-10;
17451
+ var SMALL2 = 1e-10;
17434
17452
  function ptToLine2(a, b, p) {
17435
17453
  const dx = b.x - a.x;
17436
17454
  const dy = b.y - a.y;
17437
17455
  let a2 = (p.y - a.y) * dx - (p.x - a.x) * dy;
17438
17456
  a2 *= a2;
17439
- if (a2 < SMALL) return 0;
17457
+ if (a2 < SMALL2) return 0;
17440
17458
  return a2 / (dx * dx + dy * dy);
17441
17459
  }
17442
17460
  function checkControlPoints(cp) {
@@ -19979,7 +19997,7 @@ function feasibleTree(ctx) {
19979
19997
 
19980
19998
  // src/util/bsd-qsort.ts
19981
19999
  var THRESH = 7;
19982
- var BIG = 40;
20000
+ var BIG2 = 40;
19983
20001
  function swap(arr, i, j) {
19984
20002
  const t = arr[i];
19985
20003
  arr[i] = arr[j];
@@ -20005,7 +20023,7 @@ function choosePivot(arr, lo, n, cmp) {
20005
20023
  let pm = lo + (n >> 1);
20006
20024
  let pl = lo;
20007
20025
  let pn = lo + (n - 1);
20008
- if (n > BIG) {
20026
+ if (n > BIG2) {
20009
20027
  const d = n >> 3;
20010
20028
  pl = med3(arr, pl, pl + d, pl + 2 * d, cmp);
20011
20029
  pm = med3(arr, pm - d, pm, pm + d, cmp);
@@ -35806,7 +35824,7 @@ function addLoop(sg, cp, dp, sp) {
35806
35824
  var MARGIN = 36;
35807
35825
  var delta = 1;
35808
35826
  var mu = 500;
35809
- var BIG2 = 16384;
35827
+ var BIG3 = 16384;
35810
35828
  function chanSz(w) {
35811
35829
  return (w - 3) / 2;
35812
35830
  }
@@ -35826,7 +35844,7 @@ function updateWt(ep, sz) {
35826
35844
  ep.cnt++;
35827
35845
  if (ep.cnt > sz) {
35828
35846
  ep.cnt = 0;
35829
- ep.weight += BIG2;
35847
+ ep.weight += BIG3;
35830
35848
  }
35831
35849
  }
35832
35850
  function updateWts(g, cp, ep) {
@@ -35884,12 +35902,12 @@ function createSEdges(cp, g) {
35884
35902
  let vwt = delta * (bb.UR.y - bb.LL.y);
35885
35903
  let wt = (hwt + vwt) / 2 + mu;
35886
35904
  if (isSmall(bb.UR.y - bb.LL.y) && !(cp.flags & MZ_SMALLV)) {
35887
- hwt = BIG2;
35888
- wt = BIG2;
35905
+ hwt = BIG3;
35906
+ wt = BIG3;
35889
35907
  }
35890
35908
  if (isSmall(bb.UR.x - bb.LL.x) && !(cp.flags & MZ_SMALLH)) {
35891
- vwt = BIG2;
35892
- wt = BIG2;
35909
+ vwt = BIG3;
35910
+ wt = BIG3;
35893
35911
  }
35894
35912
  const L2 = cp.sides[M_LEFT];
35895
35913
  const T2 = cp.sides[M_TOP];
@@ -41494,7 +41512,7 @@ function raySeg2(v, w, a, b) {
41494
41512
  }
41495
41513
  return wind(v, a, w) * wind(v, a, b) >= 0;
41496
41514
  }
41497
- var SMALL2 = 1e-10;
41515
+ var SMALL3 = 1e-10;
41498
41516
  function raySegIntersect(v, w, a, b) {
41499
41517
  if (!raySeg2(v, w, a, b)) return null;
41500
41518
  const mv = { x: w.x - v.x, y: w.y - v.y };
@@ -41502,7 +41520,7 @@ function raySegIntersect(v, w, a, b) {
41502
41520
  const ln = { x: -lv.y, y: lv.x };
41503
41521
  const lc = -(ln.x * a.x + ln.y * a.y);
41504
41522
  const dt = ln.x * mv.x + ln.y * mv.y;
41505
- if (Math.abs(dt) < SMALL2) return null;
41523
+ if (Math.abs(dt) < SMALL3) return null;
41506
41524
  const s = (ln.x * v.x + ln.y * v.y + lc) / dt;
41507
41525
  return { x: v.x - s * mv.x, y: v.y - s * mv.y };
41508
41526
  }
@@ -48218,7 +48236,10 @@ var fdpParms = {
48218
48236
  C: 0,
48219
48237
  Tfact: 1,
48220
48238
  K: -1,
48221
- T0: -1
48239
+ T0: -1,
48240
+ /** Distance beyond which repulsion is 0; HUGE_VAL unless `dot -Lm` (no library
48241
+ * equivalent). @see lib/fdpgen/fdp.h:fdpParms_s.Mlimit */
48242
+ Mlimit: Infinity
48222
48243
  };
48223
48244
  var parms = {
48224
48245
  useGrid: 0,
@@ -48546,8 +48567,8 @@ function placeByNeighbors(g, np, ctr) {
48546
48567
  np.info.pos[0] = p.x;
48547
48568
  np.info.pos[1] = p.y;
48548
48569
  } else if (cnt === 1) {
48549
- np.info.pos[0] = 0.98 * p.x + 0.1 * ctr.x;
48550
- np.info.pos[1] = 0.9 * p.y + 0.1 * ctr.y;
48570
+ np.info.pos[0] = fma(0.98, p.x, 0.1 * ctr.x);
48571
+ np.info.pos[1] = fma(0.9, p.y, 0.1 * ctr.y);
48551
48572
  } else {
48552
48573
  const angle = Math.PI * 2 * drand48();
48553
48574
  const radius = 0.9 * drand48();
@@ -48563,8 +48584,8 @@ function averagePlacedNeighbors(g, np, p) {
48563
48584
  const op = ep.head === np ? ep.tail : ep.head;
48564
48585
  if (!hasPos3(op)) continue;
48565
48586
  if (cnt) {
48566
- p.x = (p.x * cnt + op.info.pos[0]) / (cnt + 1);
48567
- p.y = (p.y * cnt + op.info.pos[1]) / (cnt + 1);
48587
+ p.x = fma(p.x, cnt, op.info.pos[0]) / (cnt + 1);
48588
+ p.y = fma(p.y, cnt, op.info.pos[1]) / (cnt + 1);
48568
48589
  } else {
48569
48590
  p.x = op.info.pos[0];
48570
48591
  p.y = op.info.pos[1];
@@ -48626,8 +48647,8 @@ function sizeBoundary(width, height) {
48626
48647
  function placeWithPorts(g, pp, ctr) {
48627
48648
  for (const port of pp) {
48628
48649
  const np = port.n;
48629
- np.info.pos[0] = parms.Wd * Math.cos(port.alpha) + ctr.x;
48630
- np.info.pos[1] = parms.Ht * Math.sin(port.alpha) + ctr.y;
48650
+ np.info.pos[0] = fma(parms.Wd, Math.cos(port.alpha), ctr.x);
48651
+ np.info.pos[1] = fma(parms.Ht, Math.sin(port.alpha), ctr.y);
48631
48652
  dndata(np).pinned = P_SET;
48632
48653
  }
48633
48654
  for (const np of g.nodes.values()) {
@@ -48689,19 +48710,20 @@ function coincidentDelta() {
48689
48710
  } while (xdelta === 0 && ydelta === 0);
48690
48711
  return { xdelta, ydelta };
48691
48712
  }
48692
- function doRep(p, q, xdelta, ydelta, dist22) {
48713
+ function doRep(p, q, xdelta, ydelta, dist4) {
48693
48714
  let force;
48694
- if (dist22 === 0) {
48715
+ if (!(dist4 > 0)) {
48695
48716
  const d = coincidentDelta();
48696
48717
  xdelta = d.xdelta;
48697
48718
  ydelta = d.ydelta;
48698
- dist22 = fma(xdelta, xdelta, ydelta * ydelta);
48719
+ dist4 = libmHypot(xdelta, ydelta);
48699
48720
  }
48700
- if (parms.useNew) {
48701
- const dist4 = Math.sqrt(dist22);
48702
- force = parms.K * parms.K / (dist4 * dist22);
48721
+ if (dist4 > fdpParms.Mlimit) {
48722
+ force = 0;
48723
+ } else if (parms.useNew) {
48724
+ force = parms.K * parms.K / (dist4 * dist4 * dist4);
48703
48725
  } else {
48704
- force = parms.K * parms.K / dist22;
48726
+ force = parms.K * parms.K / (dist4 * dist4);
48705
48727
  }
48706
48728
  if (isPort(p) && isPort(q)) force *= 10;
48707
48729
  const dq = disp(q);
@@ -48714,7 +48736,7 @@ function doRep(p, q, xdelta, ydelta, dist22) {
48714
48736
  function applyRep(p, q) {
48715
48737
  const xdelta = q.info.pos[0] - p.info.pos[0];
48716
48738
  const ydelta = q.info.pos[1] - p.info.pos[1];
48717
- doRep(p, q, xdelta, ydelta, fma(xdelta, xdelta, ydelta * ydelta));
48739
+ doRep(p, q, xdelta, ydelta, libmHypot(xdelta, ydelta));
48718
48740
  }
48719
48741
  function doNeighbor(grid2, i, j, nodes) {
48720
48742
  const cellp = grid2.find(i, j);
@@ -48723,8 +48745,8 @@ function doNeighbor(grid2, i, j, nodes) {
48723
48745
  for (const q of cellp.nodes) {
48724
48746
  const xdelta = q.info.pos[0] - p.info.pos[0];
48725
48747
  const ydelta = q.info.pos[1] - p.info.pos[1];
48726
- const dist22 = fma(xdelta, xdelta, ydelta * ydelta);
48727
- if (dist22 < parms.Cell * parms.Cell) doRep(p, q, xdelta, ydelta, dist22);
48748
+ const dist4 = libmHypot(xdelta, ydelta);
48749
+ if (dist4 < parms.Cell) doRep(p, q, xdelta, ydelta, dist4);
48728
48750
  }
48729
48751
  }
48730
48752
  }
@@ -48896,7 +48918,7 @@ function ht2(n) {
48896
48918
  return xMarg.doAdd ? n.info.height / 2 + xMarg.y : n.info.height * xMarg.y / 2;
48897
48919
  }
48898
48920
  function rad(n) {
48899
- return Math.hypot(wd2(n), ht2(n));
48921
+ return libmHypot(wd2(n), ht2(n));
48900
48922
  }
48901
48923
  function xinitParams(n, xpms) {
48902
48924
  xParams.K = xpms.K;
@@ -48931,37 +48953,38 @@ function cntOverlaps(g) {
48931
48953
  function applyRep2(p, q, rs) {
48932
48954
  let xdelta = q.info.pos[0] - p.info.pos[0];
48933
48955
  let ydelta = q.info.pos[1] - p.info.pos[1];
48934
- let dist22 = xdelta * xdelta + ydelta * ydelta;
48935
- if (dist22 === 0) {
48956
+ let dist4 = libmHypot(xdelta, ydelta);
48957
+ if (!(dist4 > 0)) {
48936
48958
  const d = coincidentDelta();
48937
48959
  xdelta = d.xdelta;
48938
48960
  ydelta = d.ydelta;
48939
- dist22 = xdelta * xdelta + ydelta * ydelta;
48961
+ dist4 = libmHypot(xdelta, ydelta);
48940
48962
  }
48941
48963
  const ov = overlap4(p, q) ? 1 : 0;
48942
- const force = ov ? rs.ov / dist22 : rs.nonov / dist22;
48964
+ let force = ov ? rs.ov / (dist4 * dist4) : rs.nonov / (dist4 * dist4);
48965
+ if (dist4 > fdpParms.Mlimit) force = 0;
48943
48966
  const dq = disp(q);
48944
48967
  const dp = disp(p);
48945
- dq[0] += xdelta * force;
48946
- dq[1] += ydelta * force;
48947
- dp[0] -= xdelta * force;
48948
- dp[1] -= ydelta * force;
48968
+ dq[0] = fma(xdelta, force, dq[0]);
48969
+ dq[1] = fma(ydelta, force, dq[1]);
48970
+ dp[0] = fms(xdelta, force, dp[0]);
48971
+ dp[1] = fms(ydelta, force, dp[1]);
48949
48972
  return ov;
48950
48973
  }
48951
48974
  function applyAttr2(p, q) {
48952
48975
  if (overlap4(p, q)) return;
48953
48976
  const xdelta = q.info.pos[0] - p.info.pos[0];
48954
48977
  const ydelta = q.info.pos[1] - p.info.pos[1];
48955
- const dist4 = Math.hypot(xdelta, ydelta);
48978
+ const dist4 = libmHypot(xdelta, ydelta);
48956
48979
  const din = rad(p) + rad(q);
48957
48980
  const dout = dist4 - din;
48958
48981
  const force = dout * dout / ((xParams.K + din) * dist4);
48959
48982
  const dq = disp(q);
48960
48983
  const dp = disp(p);
48961
- dq[0] -= xdelta * force;
48962
- dq[1] -= ydelta * force;
48963
- dp[0] += xdelta * force;
48964
- dp[1] += ydelta * force;
48984
+ dq[0] = fms(xdelta, force, dq[0]);
48985
+ dq[1] = fms(ydelta, force, dq[1]);
48986
+ dp[0] = fma(xdelta, force, dp[0]);
48987
+ dp[1] = fma(ydelta, force, dp[1]);
48965
48988
  }
48966
48989
  function accumForces(g, rs) {
48967
48990
  let overlaps2 = 0;
@@ -48983,7 +49006,7 @@ function moveNodes(g, temp) {
48983
49006
  if (dndata(n).pinned === P_PIN) continue;
48984
49007
  const dx = disp(n)[0];
48985
49008
  const dy = disp(n)[1];
48986
- const len2 = dx * dx + dy * dy;
49009
+ const len2 = fma(dx, dx, dy * dy);
48987
49010
  if (len2 < temp2) {
48988
49011
  n.info.pos[0] += dx;
48989
49012
  n.info.pos[1] += dy;
@@ -49237,7 +49260,7 @@ function deriveClusterNodes(g, dg, infop) {
49237
49260
  }
49238
49261
  }
49239
49262
  function deriveRealNodes(g, dg) {
49240
- for (const n of g.nodes.values()) {
49263
+ for (const n of nodesInSeq(g)) {
49241
49264
  if (getDnode(n) !== null) continue;
49242
49265
  const par = getParent(n);
49243
49266
  if (par !== null && par !== gdata(g).parent) {
@@ -49279,7 +49302,7 @@ function deriveEdge(dg, byPair, tl, hd) {
49279
49302
  return de;
49280
49303
  }
49281
49304
  function deriveEdges(g, dg, byPair) {
49282
- for (const n of g.nodes.values()) {
49305
+ for (const n of nodesInSeq(g)) {
49283
49306
  const tl = getDnode(n);
49284
49307
  for (const e of n.outEdges(g)) {
49285
49308
  const hd = getDnode(e.head);