wgblas 2.2.1 → 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.
@@ -1,4 +1,4 @@
1
- var wgblas=(()=>{var ka=Object.create;var pe=Object.defineProperty;var Da=Object.getOwnPropertyDescriptor;var Na=Object.getOwnPropertyNames;var Pa=Object.getPrototypeOf,Ma=Object.prototype.hasOwnProperty;var ge=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(t,e)=>(typeof require<"u"?require:t)[e]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var O=(r,t,e)=>()=>{if(e)throw e[0];try{return r&&(t=r(r=0)),t}catch(o){throw e=[o],o}};var qe=(r,t)=>{for(var e in t)pe(r,e,{get:t[e],enumerable:!0})},Te=(r,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of Na(t))!Ma.call(r,a)&&a!==e&&pe(r,a,{get:()=>t[a],enumerable:!(o=Da(t,a))||o.enumerable});return r};var we=(r,t,e)=>(e=r!=null?ka(Pa(r)):{},Te(t||!r||!r.__esModule?pe(e,"default",{value:r,enumerable:!0}):e,r)),Ia=r=>Te(pe({},"__esModule",{value:!0}),r);var ke,$e=O(()=>{ke=`// sscal: x = alpha * x
1
+ var wgblas=(()=>{var oi=Object.create;var pe=Object.defineProperty;var ai=Object.getOwnPropertyDescriptor;var ii=Object.getOwnPropertyNames;var si=Object.getPrototypeOf,ni=Object.prototype.hasOwnProperty;var we=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(o,e)=>(typeof require<"u"?require:o)[e]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var Z=(r,o,e)=>()=>{if(e)throw e[0];try{return r&&(o=r(r=0)),o}catch(a){throw e=[a],a}};var Fe=(r,o)=>{for(var e in o)pe(r,e,{get:o[e],enumerable:!0})},qe=(r,o,e,a)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of ii(o))!ni.call(r,t)&&t!==e&&pe(r,t,{get:()=>o[t],enumerable:!(a=ai(o,t))||a.enumerable});return r};var ge=(r,o,e)=>(e=r!=null?oi(si(r)):{},qe(o||!r||!r.__esModule?pe(e,"default",{value:r,enumerable:!0}):e,r)),li=r=>qe(pe({},"__esModule",{value:!0}),r);var ke,$e=Z(()=>{ke=`// sscal: x = alpha * x
2
2
 
3
3
  @group(0) @binding(0) var<storage, read_write> x: array<f32>;
4
4
 
@@ -21,7 +21,7 @@ fn main(
21
21
  x[id * params.x_inc] = params.alpha * x[id * params.x_inc];
22
22
  }
23
23
  }
24
- `});var Qe,Ze=O(()=>{Qe=`// cscal: x := alpha * x, complex. x is one interleaved f32 array
24
+ `});var Qe,Je=Z(()=>{Qe=`// cscal: x := alpha * x, complex. x is one interleaved f32 array
25
25
  // (re0, im0, re1, im1, ...), matching Complex32Array/GpuVector's storage
26
26
  // (and cuBLAS's cuComplex / stdlib's Complex64Array) \u2014 no repacking needed
27
27
  // between JS and GPU.
@@ -54,7 +54,7 @@ fn main(
54
54
  x[base + 1u] = params.alphaRe * im + params.alphaIm * re;
55
55
  }
56
56
  }
57
- `});var rt,Je=O(()=>{rt=`// sswap: x <-> y
57
+ `});var et,rt=Z(()=>{et=`// sswap: x <-> y
58
58
 
59
59
  @group(0) @binding(0) var<storage, read_write> x: array<f32>;
60
60
  @group(0) @binding(1) var<storage, read_write> y: array<f32>;
@@ -80,7 +80,7 @@ fn main(
80
80
  y[id * params.y_inc] = temp;
81
81
  }
82
82
  }
83
- `});var tt,et=O(()=>{tt=`// dswap: x <-> y, double-double (Dekker) f64 emulation of sswap. A swap is
83
+ `});var ot,tt=Z(()=>{ot=`// dswap: x <-> y, double-double (Dekker) f64 emulation of sswap. A swap is
84
84
  // pure data movement \u2014 hi and lo are exchanged verbatim, with no arithmetic
85
85
  // at all \u2014 so (unlike dscal/daxpy/ddot) this needs no
86
86
  // ddMulProtected/ddAddProtected renormalizing barrier, and so no
@@ -118,7 +118,7 @@ fn main(
118
118
  yLo[iy] = tempLo;
119
119
  }
120
120
  }
121
- `});var at,ot=O(()=>{at=`// saxpy: y = alpha * x + y
121
+ `});var it,at=Z(()=>{it=`// saxpy: y = alpha * x + y
122
122
 
123
123
  @group(0) @binding(0) var<storage, read> x: array<f32>;
124
124
  @group(0) @binding(1) var<storage, read_write> y: array<f32>;
@@ -143,7 +143,7 @@ fn main(
143
143
  y[id * params.y_inc] = params.alpha * x[id * params.x_inc] + y[id * params.y_inc];
144
144
  }
145
145
  }
146
- `});var st,it=O(()=>{st=`// scopy: y = x
146
+ `});var nt,st=Z(()=>{nt=`// scopy: y = x
147
147
 
148
148
  @group(0) @binding(0) var<storage, read> x: array<f32>;
149
149
  @group(0) @binding(1) var<storage, read_write> y: array<f32>;
@@ -167,7 +167,7 @@ fn main(
167
167
  y[id * params.y_inc] = x[id * params.x_inc];
168
168
  }
169
169
  }
170
- `});var lt,nt=O(()=>{lt=`// dcopy: y = x, double-double (Dekker) f64 emulation of scopy. A copy is
170
+ `});var ut,lt=Z(()=>{ut=`// dcopy: y = x, double-double (Dekker) f64 emulation of scopy. A copy is
171
171
  // pure data movement \u2014 hi and lo are transferred verbatim, with no
172
172
  // arithmetic at all \u2014 so (unlike dscal/daxpy/ddot) this needs no
173
173
  // ddMulProtected/ddAddProtected renormalizing barrier, and so no
@@ -201,7 +201,7 @@ fn main(
201
201
  yLo[iy] = xLo[ix];
202
202
  }
203
203
  }
204
- `});var ft,ut=O(()=>{ft=`// sdot: result = sum(x[i] * y[i])
204
+ `});var ft,dt=Z(()=>{ft=`// sdot: result = sum(x[i] * y[i])
205
205
  // pass 1 dispatches exactly 2 * WGS workgroups; pass 2 uses reduction/sum.wgsl.
206
206
 
207
207
  @group(0) @binding(0) var<storage, read> x: array<f32>;
@@ -254,7 +254,7 @@ fn main(
254
254
 
255
255
  if (lid.x == 0u) { partials[wgid.x] = tile[0]; }
256
256
  }
257
- `});var De,mt=O(()=>{De=`// sum reduction: collapses 2*WGS partials into one scalar.
257
+ `});var De,mt=Z(()=>{De=`// sum reduction: collapses 2*WGS partials into one scalar.
258
258
  // dispatch: 1 workgroup of WGS threads.
259
259
  // partials must have exactly 2*WGS entries.
260
260
 
@@ -280,7 +280,7 @@ fn reduce(
280
280
 
281
281
  if (i == 0u) { result[0] = tile[0]; }
282
282
  }
283
- `});var ct,dt=O(()=>{ct=`// sasum: result = sum(|x[i]|)
283
+ `});var pt,ct=Z(()=>{pt=`// sasum: result = sum(|x[i]|)
284
284
  // pass 1 dispatches exactly 2 * WGS workgroups; pass 2 uses reduction/abssum.wgsl.
285
285
 
286
286
  @group(0) @binding(0) var<storage, read> x: array<f32>;
@@ -331,7 +331,7 @@ fn main(
331
331
 
332
332
  if (lid.x == 0u) { partials[wgid.x] = tile[0]; }
333
333
  }
334
- `});var gt,pt=O(()=>{gt=`// snrm2: result = sqrt(sum(x[i] * x[i])), computed via scaled accumulation
334
+ `});var gt,wt=Z(()=>{gt=`// snrm2: result = sqrt(sum(x[i] * x[i])), computed via scaled accumulation
335
335
  // (Blue's algorithm / reference BLAS's SLASSQ) rather than naive squaring \u2014
336
336
  // naive \`sum += x_i * x_i\` overflows to inf for |x_i| \u2273 1.8e19 (f32's
337
337
  // squaring range is only sqrt(f32_max)) and loses precision on tiny
@@ -436,7 +436,7 @@ fn main(
436
436
  partialsSsq[wgid.x] = tileSsq[0];
437
437
  }
438
438
  }
439
- `});var ht,wt=O(()=>{ht=`// scaledSum reduction: collapses 2*WGS (scale, ssq) partials from
439
+ `});var bt,ht=Z(()=>{bt=`// scaledSum reduction: collapses 2*WGS (scale, ssq) partials from
440
440
  // snrm2.wgsl into the final norm \u2014 sqrt(scale\xB2 \xB7 ssq) == scale \xB7 sqrt(ssq).
441
441
  // Mirrors reduction/sum.wgsl's shape exactly, merging via ssqMerge (see
442
442
  // snrm2.wgsl for the derivation) instead of plain \`+\`, and taking the final
@@ -501,7 +501,7 @@ fn reduce_scaled(
501
501
  result[0] = tileScale[0] * sqrt(tileSsq[0]);
502
502
  }
503
503
  }
504
- `});var yt,bt=O(()=>{yt=`// isamax: returns index of element with largest absolute value
504
+ `});var xt,yt=Z(()=>{xt=`// isamax: returns index of element with largest absolute value
505
505
  // pass 1 dispatches exactly 2 * WGS workgroups; pass 2 uses reduction/argmax.wgsl.
506
506
 
507
507
  @group(0) @binding(0) var<storage, read> x: array<f32>;
@@ -583,7 +583,7 @@ fn main(
583
583
  partials_idx[wgid.x] = tile_idx[0];
584
584
  }
585
585
  }
586
- `});var vt,xt=O(()=>{vt=`// amax reduction: collapses 2*WGS (value, index) pairs into one index.
586
+ `});var _t,vt=Z(()=>{_t=`// amax reduction: collapses 2*WGS (value, index) pairs into one index.
587
587
  // dispatch: 1 workgroup of WGS threads.
588
588
  // partials_val and partials_idx must have exactly 2*WGS entries.
589
589
 
@@ -626,7 +626,7 @@ fn reduce(
626
626
 
627
627
  if (i == 0u) { result[0] = tile_idx[0]; }
628
628
  }
629
- `});var Kr,_t=O(()=>{Kr=`// Double-double arithmetic via Dekker's algorithm \u2014 an alternative to
629
+ `});var Pr,Bt=Z(()=>{Pr=`// Double-double arithmetic via Dekker's algorithm \u2014 an alternative to
630
630
  // f64add.wgsl's bit-exact IEEE-754 emulation. Doesn't touch that path.
631
631
  //
632
632
  // A double-double number is a pair (hi, lo) of f32 with hi+lo approximating
@@ -644,7 +644,7 @@ struct DD {
644
644
  hi: f32,
645
645
  lo: f32,
646
646
  }
647
- `});var ye,Bt=O(()=>{ye=`// Requires f64/dekker.wgsl concatenated first for the DD struct.
647
+ `});var ye,At=Z(()=>{ye=`// Requires f64/dekker.wgsl concatenated first for the DD struct.
648
648
 
649
649
  // |a| for a double-double pair. Negation is exact (no rounding), so this is
650
650
  // just a sign flip on both components \u2014 hi alone determines the pair's sign.
@@ -654,7 +654,7 @@ fn ddAbs(a: DD) -> DD {
654
654
  }
655
655
  return a;
656
656
  }
657
- `});var zr,St=O(()=>{zr=`// Requires f64/dekker.wgsl concatenated first for the DD struct.
657
+ `});var Ir,St=Z(()=>{Ir=`// Requires f64/dekker.wgsl concatenated first for the DD struct.
658
658
 
659
659
  // \u2500\u2500 A real compiler bug \u2014 read before touching anything below \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
660
660
  //
@@ -737,7 +737,7 @@ fn ddAddProtected(a: DD, b: DD, threadSlot: u32) -> DD {
737
737
  fn ddSubProtected(a: DD, b: DD, threadSlot: u32) -> DD {
738
738
  return ddAddProtected(a, DD(negf(b.hi), negf(b.lo)), threadSlot);
739
739
  }
740
- `});var Gt,At=O(()=>{Gt=`// dasum: sum(|x[i]|), double-double (Dekker). Same ILP=4 shape as sasum.wgsl;
740
+ `});var Et,Gt=Z(()=>{Et=`// dasum: sum(|x[i]|), double-double (Dekker). Same ILP=4 shape as sasum.wgsl;
741
741
  // see f64/utils/add.wgsl for ddAddProtected and why plain ddAdd isn't safe.
742
742
  // GpuVector input isn't pre-abs'd, so ddAbs() (f64/utils/abs.wgsl) applies
743
743
  // unconditionally below.
@@ -822,7 +822,7 @@ fn dasum_main(
822
822
  partialsLo[wgid.x] = tile[0].lo;
823
823
  }
824
824
  }
825
- `});var Ne,Et=O(()=>{Ne=`// sum reduction (f64, double-double): collapses 2*WGS partial (hi, lo) pairs
825
+ `});var Le,kt=Z(()=>{Le=`// sum reduction (f64, double-double): collapses 2*WGS partial (hi, lo) pairs
826
826
  // into one, using ddAddProtected instead of plain f32 \`+\` (see
827
827
  // reduction/sum.wgsl for the f32 original this mirrors).
828
828
  // dispatch: 1 workgroup of WGS threads. partialsHi/partialsLo must have
@@ -862,7 +862,7 @@ fn reduce_f64(
862
862
  resultLo[0] = tile[0].lo;
863
863
  }
864
864
  }
865
- `});var $r,kt=O(()=>{$r=`// Requires f64/dekker.wgsl concatenated first for the DD struct, and
865
+ `});var Cr,Dt=Z(()=>{Cr=`// Requires f64/dekker.wgsl concatenated first for the DD struct, and
866
866
  // f64/utils/add.wgsl for fsub/negf (bitcast-based subtraction/negation) and,
867
867
  // for ddMulProtected at the bottom, fastTwoSumProtected.
868
868
  //
@@ -961,7 +961,7 @@ fn ddMulProtected(a: DD, b: DD, threadSlot: u32) -> DD {
961
961
  let rawHi = dekkerScratch[threadSlot];
962
962
  return fastTwoSumProtected(rawHi, raw.lo, threadSlot);
963
963
  }
964
- `});var Nt,Dt=O(()=>{Nt=`// ddot: sum(x[i] * y[i]), double-double (Dekker). Same ILP=4 shape as
964
+ `});var Pt,Lt=Z(()=>{Pt=`// ddot: sum(x[i] * y[i]), double-double (Dekker). Same ILP=4 shape as
965
965
  // dasum.wgsl, which this mirrors closely \u2014 the only structural difference is
966
966
  // a second input vector and a product where dasum takes an absolute value.
967
967
  //
@@ -1067,7 +1067,7 @@ fn ddot_main(
1067
1067
  partialsLo[wgid.x] = tile[0].lo;
1068
1068
  }
1069
1069
  }
1070
- `});var Mt,Pt=O(()=>{Mt=`// dscal: x := alpha * x, double-double (Dekker) f64 emulation of sscal.
1070
+ `});var Mt,Nt=Z(()=>{Mt=`// dscal: x := alpha * x, double-double (Dekker) f64 emulation of sscal.
1071
1071
  // alpha and x are each an f32 (hi, lo) pair. See f64/utils/multiply.wgsl for
1072
1072
  // ddMulProtected and why plain ddMulRaw isn't safe without a renormalizing
1073
1073
  // barrier \u2014 that barrier needs a provably uniform loop trip count across
@@ -1127,7 +1127,7 @@ fn dscal_main(
1127
1127
  }
1128
1128
  }
1129
1129
  }
1130
- `});var Lt,It=O(()=>{Lt=`// daxpy: y := alpha * x + y, double-double (Dekker) f64 emulation of saxpy.
1130
+ `});var Rt,It=Z(()=>{Rt=`// daxpy: y := alpha * x + y, double-double (Dekker) f64 emulation of saxpy.
1131
1131
  // Each element costs one ddMulProtected (alpha*x[i]) then one ddAddProtected
1132
1132
  // (+ y[i]) \u2014 the same two-protected-op shape ddot spends per term, applied
1133
1133
  // straight to the output instead of folded into a reduction. See dscal.wgsl
@@ -1193,7 +1193,7 @@ fn daxpy_main(
1193
1193
  }
1194
1194
  }
1195
1195
  }
1196
- `});var Pe,Rt=O(()=>{Pe=`// Requires f64/dekker.wgsl concatenated first for the DD struct.
1196
+ `});var Pe,jt=Z(()=>{Pe=`// Requires f64/dekker.wgsl concatenated first for the DD struct.
1197
1197
 
1198
1198
  // a > b for double-double pairs. hi dominates (|lo| <= ulp(hi)/2 always), so
1199
1199
  // comparing hi alone is correct except on an exact hi tie, when lo breaks it.
@@ -1205,14 +1205,14 @@ fn ddGreater(a: DD, b: DD) -> bool {
1205
1205
  }
1206
1206
  return a.lo > b.lo;
1207
1207
  }
1208
- `});var Tt,qt=O(()=>{Tt=`// Requires f64/dekker.wgsl concatenated first for the DD struct.
1208
+ `});var qt,Ft=Z(()=>{qt=`// Requires f64/dekker.wgsl concatenated first for the DD struct.
1209
1209
 
1210
1210
  // a == b for double-double pairs \u2014 exact field equality, no rounding
1211
1211
  // involved, so (like ddGreater) this needs no protection.
1212
1212
  fn ddEqual(a: DD, b: DD) -> bool {
1213
1213
  return a.hi == b.hi && a.lo == b.lo;
1214
1214
  }
1215
- `});var Ft,Ct=O(()=>{Ft=`// idamax: returns index of element with largest absolute value (f64, double-double)
1215
+ `});var Tt,Ht=Z(()=>{Tt=`// idamax: returns index of element with largest absolute value (f64, double-double)
1216
1216
  // pass 1 dispatches exactly 2 * WGS workgroups; pass 2 uses reduction/argmaxF64.wgsl.
1217
1217
  // Concatenated after f64/dekker.wgsl (DD struct), f64/utils/abs.wgsl (ddAbs),
1218
1218
  // f64/utils/greater.wgsl (ddGreater), and f64/utils/equal.wgsl (ddEqual).
@@ -1308,7 +1308,7 @@ fn idamax_main(
1308
1308
  partialsIdx[wgid.x] = tile_idx[0];
1309
1309
  }
1310
1310
  }
1311
- `});var Wt,jt=O(()=>{Wt=`// amax reduction (f64, double-double): collapses 2*WGS (value, index) pairs
1311
+ `});var Wt,Ct=Z(()=>{Wt=`// amax reduction (f64, double-double): collapses 2*WGS (value, index) pairs
1312
1312
  // into one index, using ddGreater/ddEqual instead of plain f32 \`>\`/\`==\` (see
1313
1313
  // reduction/argmax.wgsl for the f32 original this mirrors).
1314
1314
  // dispatch: 1 workgroup of WGS threads. partialsValHi/partialsValLo/
@@ -1358,7 +1358,7 @@ fn reduce_f64(
1358
1358
 
1359
1359
  if (i == 0u) { result[0] = tile_idx[0]; }
1360
1360
  }
1361
- `});var Ot,Ht=O(()=>{Ot=`// srot: x = c*x + s*y, y = -s*x + c*y
1361
+ `});var Ot,Vt=Z(()=>{Ot=`// srot: x = c*x + s*y, y = -s*x + c*y
1362
1362
 
1363
1363
  @group(0) @binding(0) var<storage, read_write> x: array<f32>;
1364
1364
  @group(0) @binding(1) var<storage, read_write> y: array<f32>;
@@ -1387,7 +1387,7 @@ fn main(
1387
1387
  y[id * params.y_inc] = -params.s * xi + params.c * yi;
1388
1388
  }
1389
1389
  }
1390
- `});var Kt,Vt=O(()=>{Kt=`// drot: x = c*x + s*y, y = -s*x + c*y \u2014 double-double (Dekker) f64 emulation
1390
+ `});var Ut,Kt=Z(()=>{Ut=`// drot: x = c*x + s*y, y = -s*x + c*y \u2014 double-double (Dekker) f64 emulation
1391
1391
  // of srot. c, s, x, and y are each split into an f32 (hi, lo) pair. Each
1392
1392
  // element costs four ddMulProtected (c*x, s*y, -s*x, c*y) then two
1393
1393
  // ddAddProtected (the two sums) \u2014 negS is computed once outside the loop
@@ -1468,7 +1468,7 @@ fn drot_main(
1468
1468
  }
1469
1469
  }
1470
1470
  }
1471
- `});var Ut,zt=O(()=>{Ut=`// srotm: applies modified Givens rotation H to vectors x and y.
1471
+ `});var Yt,zt=Z(()=>{Yt=`// srotm: applies modified Givens rotation H to vectors x and y.
1472
1472
  // param[0] = flag: -1 (full H), 0 (unit diagonal), 1 (unit off-diagonal)
1473
1473
  // param = [ flag, h11, h21, h12, h22 ]
1474
1474
  // flag == -2 (identity/no-op) is handled in JS before dispatch reaches here.
@@ -1518,7 +1518,7 @@ fn main(
1518
1518
  y[id * params.y_inc] = h21 * xi + h22 * yi;
1519
1519
  }
1520
1520
  }
1521
- `});var Xt,Yt=O(()=>{Xt=`// drotm: applies a modified Givens rotation H to vectors x and y \u2014 double-
1521
+ `});var Xt,Zt=Z(()=>{Xt=`// drotm: applies a modified Givens rotation H to vectors x and y \u2014 double-
1522
1522
  // double (Dekker) f64 emulation of srotm. paramHi/paramLo[0] = flag: -1
1523
1523
  // (full H), 0 (unit diagonal), 1 (unit off-diagonal). param = [ flag, h11,
1524
1524
  // h21, h12, h22 ], each entry an f32 (hi, lo) pair.
@@ -1617,7 +1617,7 @@ fn drotm_main(
1617
1617
  }
1618
1618
  }
1619
1619
  }
1620
- `});var Zt,$t=O(()=>{Zt=`// Requires f64/dekker.wgsl concatenated first for the DD struct, and
1620
+ `});var Ne,$t=Z(()=>{Ne=`// Requires f64/dekker.wgsl concatenated first for the DD struct, and
1621
1621
  // f64/utils/add.wgsl (ddSubProtected/ddAddProtected/negf) and
1622
1622
  // f64/utils/multiply.wgsl (ddMulProtected).
1623
1623
  //
@@ -1662,7 +1662,7 @@ fn ddDivProtected(a: DD, b: DD, threadSlot: u32) -> DD {
1662
1662
  let refined = ddAddProtected(DD(q1, 0.0), DD(q2, 0.0), threadSlot);
1663
1663
  return DD(select(refined.hi, q1, bIsZero), select(refined.lo, 0.0, bIsZero));
1664
1664
  }
1665
- `});var Jt,Qt=O(()=>{Jt=`// Requires f64/dekker.wgsl concatenated first for the DD struct, and
1665
+ `});var Qt,Jt=Z(()=>{Qt=`// Requires f64/dekker.wgsl concatenated first for the DD struct, and
1666
1666
  // f64/utils/add.wgsl (ddSubProtected/ddAddProtected) and
1667
1667
  // f64/utils/multiply.wgsl (twoProdBit \u2014 squaring a plain f32 needs no
1668
1668
  // barrier, per multiply.wgsl's own note that twoProdBit is universally safe
@@ -1707,7 +1707,7 @@ fn ddSqrtProtected(a: DD, threadSlot: u32) -> DD {
1707
1707
  let result = ddAddProtected(DD(x0, 0.0), DD(correction, 0.0), threadSlot);
1708
1708
  return DD(select(result.hi, 0.0, isZero), select(result.lo, 0.0, isZero));
1709
1709
  }
1710
- `});var eo,ro=O(()=>{eo=`// dnrm2: result = sqrt(sum(x[i] * x[i])), double-double (Dekker) f64
1710
+ `});var eo,ro=Z(()=>{eo=`// dnrm2: result = sqrt(sum(x[i] * x[i])), double-double (Dekker) f64
1711
1711
  // emulation of snrm2 \u2014 same scaled accumulation (Blue's algorithm), just
1712
1712
  // with \`scale\`/\`ssq\` as DD pairs (via ddDivProtected/ddMulProtected/
1713
1713
  // ddAddProtected/ddSqrtProtected) instead of plain f32. Squaring still
@@ -1874,7 +1874,7 @@ fn dnrm2_main(
1874
1874
  partialsSsqLo[wgid.x] = tileSsqLo[0];
1875
1875
  }
1876
1876
  }
1877
- `});var oo,to=O(()=>{oo=`// scaledSum reduction (f64, double-double): collapses 2*WGS (scale, ssq) DD
1877
+ `});var oo,to=Z(()=>{oo=`// scaledSum reduction (f64, double-double): collapses 2*WGS (scale, ssq) DD
1878
1878
  // partials from dnrm2.wgsl into the final norm \u2014 sqrt(scale\xB2 \xB7 ssq) ==
1879
1879
  // scale \xB7 sqrt(ssq), via ddMulProtected/ddSqrtProtected. Mirrors
1880
1880
  // reduction/scaledSum.wgsl's shape exactly; ssqMergeProtected is duplicated
@@ -1967,7 +1967,7 @@ fn reduce_scaled_f64(
1967
1967
  resultLo[0] = result.lo;
1968
1968
  }
1969
1969
  }
1970
- `});var io,ao=O(()=>{io=`// sgemv_n: y = alpha * A * x + beta * y (A is m\xD7n row-major, no-transpose)
1970
+ `});var io,ao=Z(()=>{io=`// sgemv_n: y = alpha * A * x + beta * y (A is m\xD7n row-major, no-transpose)
1971
1971
  //
1972
1972
  // One workgroup per output row, with a grid-stride outer loop so the shader
1973
1973
  // still covers all rows when m exceeds maxComputeWorkgroupsPerDimension.
@@ -2044,7 +2044,7 @@ fn main(
2044
2044
  workgroupBarrier();
2045
2045
  }
2046
2046
  }
2047
- `});var no,so=O(()=>{no=`// sgemv_t: y = alpha * A^T * x + beta * y (A is m\xD7n row-major, transposed)
2047
+ `});var no,so=Z(()=>{no=`// sgemv_t: y = alpha * A^T * x + beta * y (A is m\xD7n row-major, transposed)
2048
2048
  // each thread owns one column of A \u2192 one element of y (length n)
2049
2049
  // tiles over x (length m) using shared memory; four independent accumulators
2050
2050
  // let the GPU pipeline A reads across j within each tile (ILP=4)
@@ -2111,7 +2111,7 @@ fn main(
2111
2111
  y[yi] = select(acc, acc + params.beta * y[yi], params.beta != 0.0);
2112
2112
  }
2113
2113
  }
2114
- `});var uo,lo=O(()=>{uo=`// ssymv: y = alpha * A * x + beta * y
2114
+ `});var uo,lo=Z(()=>{uo=`// ssymv: y = alpha * A * x + beta * y
2115
2115
  // A is n\xD7n symmetric, lower (uplo=0) or upper (uplo=1) triangle stored.
2116
2116
  // The logical matrix is fully dense (symmetric), so each row's dot product
2117
2117
  // sums over all n columns; entries on the unstored side of the diagonal are
@@ -2182,7 +2182,7 @@ fn main(
2182
2182
  }
2183
2183
  }
2184
2184
  }
2185
- `});var mo,fo=O(()=>{mo=`// strmv: y = op(A) * x
2185
+ `});var mo,fo=Z(()=>{mo=`// strmv: y = op(A) * x
2186
2186
  // A is n\xD7n triangular, lower (uplo=0) or upper (uplo=1) triangle stored.
2187
2187
  // op(A) is A (trans=0) or A^T (trans=1).
2188
2188
  // diag=1 (unit) treats the diagonal as 1 without reading A's diagonal values.
@@ -2285,7 +2285,7 @@ fn main(
2285
2285
  }
2286
2286
  }
2287
2287
  }
2288
- `});var Me,co=O(()=>{Me=`// strsv_invert_block: computes ONE column (workgroup_id.x) of ONE block's
2288
+ `});var Me,co=Z(()=>{Me=`// strsv_invert_block: computes ONE column (workgroup_id.x) of ONE block's
2289
2289
  // (workgroup_id.y) explicit inverse, via the same one-row-at-a-time
2290
2290
  // substitution as strsv_block.wgsl, but solving against a unit basis vector
2291
2291
  // e_col instead of the real right-hand side, and writing to a dense
@@ -2394,7 +2394,7 @@ fn strsv_invert_block_main(
2394
2394
  workgroupBarrier();
2395
2395
  }
2396
2396
  }
2397
- `});var go,po=O(()=>{go=`// strsv_apply_inverse: given a precomputed block inverse (from
2397
+ `});var wo,po=Z(()=>{wo=`// strsv_apply_inverse: given a precomputed block inverse (from
2398
2398
  // strsv_invert_block.wgsl), computes this block's solution as a dense
2399
2399
  // matrix-vector multiply against the block's current remainder in x \u2014
2400
2400
  // replacing what the old strsv_block.wgsl did via a genuinely sequential,
@@ -2441,7 +2441,7 @@ fn strsv_apply_inverse_main(@builtin(local_invocation_id) lid: vec3u) {
2441
2441
  }
2442
2442
  x[(params.blockStart + lid.x) * params.incx] = acc;
2443
2443
  }
2444
- `});var ho,wo=O(()=>{ho=`// strsv_update: subtracts a solved block's contribution from every
2444
+ `});var ho,go=Z(()=>{ho=`// strsv_update: subtracts a solved block's contribution from every
2445
2445
  // remaining row in parallel (one workgroup per row, like strmv.wgsl) \u2014
2446
2446
  // this is what turns strsv's O(n) sequential stages into O(n/blockSize).
2447
2447
  // No diag/masking needed: this region never touches the diagonal.
@@ -2516,7 +2516,7 @@ fn strsv_update_main(
2516
2516
  workgroupBarrier();
2517
2517
  }
2518
2518
  }
2519
- `});var yo,bo=O(()=>{yo=`// sger: A := alpha * x * y^T + A (rank-1 update, A is m\xD7n general/dense)
2519
+ `});var yo,bo=Z(()=>{yo=`// sger: A := alpha * x * y^T + A (rank-1 update, A is m\xD7n general/dense)
2520
2520
 
2521
2521
  @group(0) @binding(0) var<storage, read> x: array<f32>;
2522
2522
  @group(0) @binding(1) var<storage, read> y: array<f32>;
@@ -2564,7 +2564,84 @@ fn main(
2564
2564
  }
2565
2565
  }
2566
2566
  }
2567
- `});var vo,xo=O(()=>{vo=`// ssyr: A := alpha * x * x^T + A (symmetric rank-1 update)
2567
+ `});var vo,xo=Z(()=>{vo=`// dger: A := alpha * x * y^T + A, double-double (Dekker) f64 emulation of
2568
+ // sger (rank-1 update). x, y, A, and alpha are each split into an f32
2569
+ // (hi, lo) pair; WGSL has no f64 type. One workgroup per row of A
2570
+ // (grid-stride over rows); within a row, ddMulProtected/ddAddProtected each
2571
+ // carry a workgroupBarrier(), so the column loop uses the same
2572
+ // uniform-main + ragged-tail split dscal.wgsl uses, rather than sger.wgsl's
2573
+ // 4-way ILP unroll \u2014 unrolling would pay the barrier round-trip four times
2574
+ // over per iteration for no benefit here.
2575
+
2576
+ @group(0) @binding(0) var<storage, read> xHi: array<f32>;
2577
+ @group(0) @binding(1) var<storage, read> xLo: array<f32>;
2578
+ @group(0) @binding(2) var<storage, read> yHi: array<f32>;
2579
+ @group(0) @binding(3) var<storage, read> yLo: array<f32>;
2580
+ @group(0) @binding(4) var<storage, read_write> AHi: array<f32>;
2581
+ @group(0) @binding(5) var<storage, read_write> ALo: array<f32>;
2582
+
2583
+ struct Params {
2584
+ m: u32,
2585
+ n: u32,
2586
+ alphaHi: f32,
2587
+ alphaLo: f32,
2588
+ x_inc: u32,
2589
+ y_inc: u32,
2590
+ lda: u32,
2591
+ }
2592
+
2593
+ @group(0) @binding(6) var<uniform> params: Params;
2594
+
2595
+ const WGS: u32 = 64u;
2596
+
2597
+ @compute @workgroup_size(64)
2598
+ fn dger_main(
2599
+ @builtin(workgroup_id) wgid: vec3u,
2600
+ @builtin(local_invocation_id) lid: vec3u,
2601
+ @builtin(num_workgroups) nwg: vec3u,
2602
+ ) {
2603
+ let alpha = DD(params.alphaHi, params.alphaLo);
2604
+
2605
+ // Column loop's trip count depends only on n and WGS, not on row \u2014 the
2606
+ // same main/tail split applies uniformly to every row, so every thread
2607
+ // reaches each protected call the same number of times overall.
2608
+ let n_floor = (params.n / WGS) * WGS;
2609
+ let mainIters = n_floor / WGS;
2610
+ let hasTail = select(0u, 1u, n_floor < params.n);
2611
+
2612
+ for (var row = wgid.x; row < params.m; row += nwg.x) {
2613
+ // Every thread in the workgroup redundantly computes the same alpha*x[row]
2614
+ // \u2014 wasteful but harmless, and keeps the per-row protected-call count
2615
+ // trivially identical across threads.
2616
+ let ix = row * params.x_inc;
2617
+ let xi = ddMulProtected(alpha, DD(xHi[ix], xLo[ix]), lid.x);
2618
+ let row_base = row * params.lda;
2619
+
2620
+ for (var iter = 0u; iter < mainIters; iter++) {
2621
+ let col = lid.x + iter * WGS;
2622
+ let idx = row_base + col;
2623
+ let iy = col * params.y_inc;
2624
+ let prod = ddMulProtected(xi, DD(yHi[iy], yLo[iy]), lid.x);
2625
+ let result = ddAddProtected(prod, DD(AHi[idx], ALo[idx]), lid.x);
2626
+ AHi[idx] = result.hi;
2627
+ ALo[idx] = result.lo;
2628
+ }
2629
+
2630
+ for (var iter = 0u; iter < hasTail; iter++) {
2631
+ let col = n_floor + lid.x;
2632
+ let valid = col < params.n;
2633
+ let idx = select(0u, row_base + col, valid);
2634
+ let iy = select(0u, col * params.y_inc, valid);
2635
+ let prod = ddMulProtected(xi, DD(yHi[iy], yLo[iy]), lid.x);
2636
+ let result = ddAddProtected(prod, DD(AHi[idx], ALo[idx]), lid.x);
2637
+ if (valid) {
2638
+ AHi[idx] = result.hi;
2639
+ ALo[idx] = result.lo;
2640
+ }
2641
+ }
2642
+ }
2643
+ }
2644
+ `});var Bo,_o=Z(()=>{Bo=`// ssyr: A := alpha * x * x^T + A (symmetric rank-1 update)
2568
2645
  // A is n\xD7n symmetric; only the triangle specified by uplo is referenced/updated,
2569
2646
  // the other triangle is implied by symmetry (not touched).
2570
2647
 
@@ -2624,7 +2701,91 @@ fn main(
2624
2701
  }
2625
2702
  }
2626
2703
  }
2627
- `});var Bo,_o=O(()=>{Bo=`// ssyr2: A := alpha * x * y^T + alpha * y * x^T + A (symmetric rank-2 update)
2704
+ `});var So,Ao=Z(()=>{So=`// dsyr: A := alpha * x * x^T + A, double-double (Dekker) f64 emulation of
2705
+ // ssyr (symmetric rank-1 update). x, A, and alpha are each split into an f32
2706
+ // (hi, lo) pair; WGSL has no f64 type. Only the triangle specified by uplo
2707
+ // is referenced/updated. One workgroup per row of A (grid-stride over
2708
+ // rows); within a row, ddMulProtected/ddAddProtected each carry a
2709
+ // workgroupBarrier(), so the column loop uses the same uniform-main +
2710
+ // ragged-tail split dger.wgsl uses over its *stored* range, rather than
2711
+ // ssyr.wgsl's 4-way ILP unroll.
2712
+
2713
+ @group(0) @binding(0) var<storage, read> xHi: array<f32>;
2714
+ @group(0) @binding(1) var<storage, read> xLo: array<f32>;
2715
+ @group(0) @binding(2) var<storage, read_write> AHi: array<f32>;
2716
+ @group(0) @binding(3) var<storage, read_write> ALo: array<f32>;
2717
+
2718
+ struct Params {
2719
+ n: u32,
2720
+ alphaHi: f32,
2721
+ alphaLo: f32,
2722
+ incx: u32,
2723
+ lda: u32,
2724
+ uplo: u32, // 0 = lower, 1 = upper
2725
+ }
2726
+
2727
+ @group(0) @binding(4) var<uniform> params: Params;
2728
+
2729
+ const WGS: u32 = 64u;
2730
+
2731
+ @compute @workgroup_size(64)
2732
+ fn dsyr_main(
2733
+ @builtin(workgroup_id) wgid: vec3u,
2734
+ @builtin(local_invocation_id) lid: vec3u,
2735
+ @builtin(num_workgroups) nwg: vec3u,
2736
+ ) {
2737
+ let alpha = DD(params.alphaHi, params.alphaLo);
2738
+
2739
+ for (var row = wgid.x; row < params.n; row += nwg.x) {
2740
+ let ix = row * params.incx;
2741
+ let xi = ddMulProtected(alpha, DD(xHi[ix], xLo[ix]), lid.x);
2742
+ let row_base = row * params.lda;
2743
+
2744
+ // Stored-triangle column range for this row: lower [0,row], upper [row,n).
2745
+ var colStart: u32;
2746
+ var colEnd: u32;
2747
+ if params.uplo == 1u {
2748
+ colStart = row;
2749
+ colEnd = params.n;
2750
+ } else {
2751
+ colStart = 0u;
2752
+ colEnd = row + 1u;
2753
+ }
2754
+
2755
+ // Range length varies per row, but every thread in the workgroup runs
2756
+ // the SAME row at the same time (the outer loop is shared), so the
2757
+ // main/tail split computed from colStart/colEnd is already uniform
2758
+ // across threads for this row \u2014 just not the same across different rows.
2759
+ let rangeLen = colEnd - colStart;
2760
+ let range_floor = colStart + (rangeLen / WGS) * WGS;
2761
+ let mainIters = (range_floor - colStart) / WGS;
2762
+ let hasTail = select(0u, 1u, range_floor < colEnd);
2763
+
2764
+ for (var iter = 0u; iter < mainIters; iter++) {
2765
+ let col = colStart + lid.x + iter * WGS;
2766
+ let idx = row_base + col;
2767
+ let ic = col * params.incx;
2768
+ let prod = ddMulProtected(xi, DD(xHi[ic], xLo[ic]), lid.x);
2769
+ let result = ddAddProtected(prod, DD(AHi[idx], ALo[idx]), lid.x);
2770
+ AHi[idx] = result.hi;
2771
+ ALo[idx] = result.lo;
2772
+ }
2773
+
2774
+ for (var iter = 0u; iter < hasTail; iter++) {
2775
+ let col = range_floor + lid.x;
2776
+ let valid = col < colEnd;
2777
+ let idx = select(0u, row_base + col, valid);
2778
+ let ic = select(0u, col * params.incx, valid);
2779
+ let prod = ddMulProtected(xi, DD(xHi[ic], xLo[ic]), lid.x);
2780
+ let result = ddAddProtected(prod, DD(AHi[idx], ALo[idx]), lid.x);
2781
+ if (valid) {
2782
+ AHi[idx] = result.hi;
2783
+ ALo[idx] = result.lo;
2784
+ }
2785
+ }
2786
+ }
2787
+ }
2788
+ `});var Eo,Go=Z(()=>{Eo=`// ssyr2: A := alpha * x * y^T + alpha * y * x^T + A (symmetric rank-2 update)
2628
2789
  // A is n\xD7n symmetric; only the triangle specified by uplo is referenced/updated,
2629
2790
  // the other triangle is implied by symmetry (not touched).
2630
2791
 
@@ -2687,7 +2848,871 @@ fn main(
2687
2848
  }
2688
2849
  }
2689
2850
  }
2690
- `});var ue,So=O(()=>{ue=`// sgemm_small: C = alpha * op(A) * op(B) + beta * C \u2014 small-tile half of
2851
+ `});var Do,ko=Z(()=>{Do=`// dsyr2: A := alpha * x * y^T + alpha * y * x^T + A, double-double (Dekker)
2852
+ // f64 emulation of ssyr2 (symmetric rank-2 update). x, y, A, and alpha are
2853
+ // each split into an f32 (hi, lo) pair; WGSL has no f64 type. Only the
2854
+ // triangle specified by uplo is referenced/updated. One workgroup per row
2855
+ // of A (grid-stride over rows); within a row, ddMulProtected/ddAddProtected
2856
+ // each carry a workgroupBarrier(), so the column loop uses the same
2857
+ // uniform-main + ragged-tail split dsyr.wgsl uses over its *stored* range,
2858
+ // rather than ssyr2.wgsl's 4-way ILP unroll.
2859
+
2860
+ @group(0) @binding(0) var<storage, read> xHi: array<f32>;
2861
+ @group(0) @binding(1) var<storage, read> xLo: array<f32>;
2862
+ @group(0) @binding(2) var<storage, read> yHi: array<f32>;
2863
+ @group(0) @binding(3) var<storage, read> yLo: array<f32>;
2864
+ @group(0) @binding(4) var<storage, read_write> AHi: array<f32>;
2865
+ @group(0) @binding(5) var<storage, read_write> ALo: array<f32>;
2866
+
2867
+ struct Params {
2868
+ n: u32,
2869
+ alphaHi: f32,
2870
+ alphaLo: f32,
2871
+ incx: u32,
2872
+ incy: u32,
2873
+ lda: u32,
2874
+ uplo: u32, // 0 = lower, 1 = upper
2875
+ }
2876
+
2877
+ @group(0) @binding(6) var<uniform> params: Params;
2878
+
2879
+ const WGS: u32 = 64u;
2880
+
2881
+ @compute @workgroup_size(64)
2882
+ fn dsyr2_main(
2883
+ @builtin(workgroup_id) wgid: vec3u,
2884
+ @builtin(local_invocation_id) lid: vec3u,
2885
+ @builtin(num_workgroups) nwg: vec3u,
2886
+ ) {
2887
+ let alpha = DD(params.alphaHi, params.alphaLo);
2888
+
2889
+ for (var row = wgid.x; row < params.n; row += nwg.x) {
2890
+ let ix = row * params.incx;
2891
+ let iy = row * params.incy;
2892
+ let xi = ddMulProtected(alpha, DD(xHi[ix], xLo[ix]), lid.x);
2893
+ let yi = ddMulProtected(alpha, DD(yHi[iy], yLo[iy]), lid.x);
2894
+ let row_base = row * params.lda;
2895
+
2896
+ // Stored-triangle column range for this row: lower [0,row], upper [row,n).
2897
+ var colStart: u32;
2898
+ var colEnd: u32;
2899
+ if params.uplo == 1u {
2900
+ colStart = row;
2901
+ colEnd = params.n;
2902
+ } else {
2903
+ colStart = 0u;
2904
+ colEnd = row + 1u;
2905
+ }
2906
+
2907
+ // Range length varies per row, but every thread in the workgroup runs
2908
+ // the SAME row at the same time (the outer loop is shared), so the
2909
+ // main/tail split computed from colStart/colEnd is already uniform
2910
+ // across threads for this row \u2014 just not the same across different rows.
2911
+ let rangeLen = colEnd - colStart;
2912
+ let range_floor = colStart + (rangeLen / WGS) * WGS;
2913
+ let mainIters = (range_floor - colStart) / WGS;
2914
+ let hasTail = select(0u, 1u, range_floor < colEnd);
2915
+
2916
+ for (var iter = 0u; iter < mainIters; iter++) {
2917
+ let col = colStart + lid.x + iter * WGS;
2918
+ let idx = row_base + col;
2919
+ let jc_x = col * params.incx;
2920
+ let jc_y = col * params.incy;
2921
+ let prod1 = ddMulProtected(xi, DD(yHi[jc_y], yLo[jc_y]), lid.x);
2922
+ let prod2 = ddMulProtected(yi, DD(xHi[jc_x], xLo[jc_x]), lid.x);
2923
+ let sum1 = ddAddProtected(prod1, prod2, lid.x);
2924
+ let result = ddAddProtected(sum1, DD(AHi[idx], ALo[idx]), lid.x);
2925
+ AHi[idx] = result.hi;
2926
+ ALo[idx] = result.lo;
2927
+ }
2928
+
2929
+ for (var iter = 0u; iter < hasTail; iter++) {
2930
+ let col = range_floor + lid.x;
2931
+ let valid = col < colEnd;
2932
+ let idx = select(0u, row_base + col, valid);
2933
+ let jc_x = select(0u, col * params.incx, valid);
2934
+ let jc_y = select(0u, col * params.incy, valid);
2935
+ let prod1 = ddMulProtected(xi, DD(yHi[jc_y], yLo[jc_y]), lid.x);
2936
+ let prod2 = ddMulProtected(yi, DD(xHi[jc_x], xLo[jc_x]), lid.x);
2937
+ let sum1 = ddAddProtected(prod1, prod2, lid.x);
2938
+ let result = ddAddProtected(sum1, DD(AHi[idx], ALo[idx]), lid.x);
2939
+ if (valid) {
2940
+ AHi[idx] = result.hi;
2941
+ ALo[idx] = result.lo;
2942
+ }
2943
+ }
2944
+ }
2945
+ }
2946
+ `});var Po,Lo=Z(()=>{Po=`// dgemv_n: y := alpha * A * x + beta * y, double-double (Dekker) f64
2947
+ // emulation of sgemv_n (matrix-vector product, no transpose). A, x, y,
2948
+ // alpha, and beta are each split into an f32 (hi, lo) pair; WGSL has no f64
2949
+ // type. Same one-workgroup-per-output-row shape as sgemv_n.wgsl (grid-stride
2950
+ // over rows), but the per-row dot product is reduced via a full
2951
+ // within-workgroup DD tree reduction \u2014 the same reduction ddot.wgsl uses to
2952
+ // combine 64 lanes down to one \u2014 rather than sgemv_n.wgsl's 4-way ILP
2953
+ // unroll + shared-memory tree (ddMulProtected/ddAddProtected each carry a
2954
+ // workgroupBarrier(), so unrolling would pay that barrier four times over
2955
+ // per iteration for no benefit). Since each row is handled by exactly one
2956
+ // workgroup, no separate cross-workgroup reduction pass (ddot's reduce_f64)
2957
+ // is needed here \u2014 the tree reduction alone finishes the row.
2958
+
2959
+ @group(0) @binding(0) var<storage, read> AHi: array<f32>;
2960
+ @group(0) @binding(1) var<storage, read> ALo: array<f32>;
2961
+ @group(0) @binding(2) var<storage, read> xHi: array<f32>;
2962
+ @group(0) @binding(3) var<storage, read> xLo: array<f32>;
2963
+ @group(0) @binding(4) var<storage, read_write> yHi: array<f32>;
2964
+ @group(0) @binding(5) var<storage, read_write> yLo: array<f32>;
2965
+
2966
+ struct Params {
2967
+ m: u32,
2968
+ n: u32,
2969
+ alphaHi: f32,
2970
+ alphaLo: f32,
2971
+ betaHi: f32,
2972
+ betaLo: f32,
2973
+ incx: u32,
2974
+ incy: u32,
2975
+ lda: u32,
2976
+ }
2977
+
2978
+ @group(0) @binding(6) var<uniform> params: Params;
2979
+
2980
+ const WGS: u32 = 64u;
2981
+ var<workgroup> tile: array<DD, 64>;
2982
+
2983
+ @compute @workgroup_size(64)
2984
+ fn dgemv_n_main(
2985
+ @builtin(workgroup_id) wgid: vec3u,
2986
+ @builtin(local_invocation_id) lid: vec3u,
2987
+ @builtin(num_workgroups) nwg: vec3u,
2988
+ ) {
2989
+ let alpha = DD(params.alphaHi, params.alphaLo);
2990
+ let beta = DD(params.betaHi, params.betaLo);
2991
+ let isBetaNonzero = params.betaHi != 0.0 || params.betaLo != 0.0;
2992
+
2993
+ // Column loop's trip count depends only on n and WGS, not on row \u2014 same
2994
+ // main/tail split applies uniformly to every row (see dger.wgsl).
2995
+ let n_floor = (params.n / WGS) * WGS;
2996
+ let mainIters = n_floor / WGS;
2997
+ let hasTail = select(0u, 1u, n_floor < params.n);
2998
+
2999
+ for (var row = wgid.x; row < params.m; row += nwg.x) {
3000
+ let row_base = row * params.lda;
3001
+ var acc = DD(0.0, 0.0);
3002
+
3003
+ for (var iter = 0u; iter < mainIters; iter++) {
3004
+ let j = lid.x + iter * WGS;
3005
+ let ia = row_base + j;
3006
+ let ix = j * params.incx;
3007
+ let prod = ddMulProtected(DD(AHi[ia], ALo[ia]), DD(xHi[ix], xLo[ix]), lid.x);
3008
+ acc = ddAddProtected(acc, prod, lid.x);
3009
+ }
3010
+
3011
+ for (var iter = 0u; iter < hasTail; iter++) {
3012
+ let j = n_floor + lid.x;
3013
+ let valid = j < params.n;
3014
+ let ia = select(0u, row_base + j, valid);
3015
+ let ix = select(0u, j * params.incx, valid);
3016
+ let prod = ddMulProtected(DD(AHi[ia], ALo[ia]), DD(xHi[ix], xLo[ix]), lid.x);
3017
+ let contribution = DD(select(0.0, prod.hi, valid), select(0.0, prod.lo, valid));
3018
+ acc = ddAddProtected(acc, contribution, lid.x);
3019
+ }
3020
+
3021
+ tile[lid.x] = acc;
3022
+ workgroupBarrier();
3023
+
3024
+ // Inactive threads combine against a throwaway partner and discard it
3025
+ // (ddAddProtected must be called unconditionally by every thread).
3026
+ for (var s = WGS / 2u; s > 0u; s >>= 1u) {
3027
+ let partner = select(lid.x, lid.x + s, lid.x < s);
3028
+ let combined = ddAddProtected(tile[lid.x], tile[partner], lid.x);
3029
+ workgroupBarrier(); // all threads must read tile[] above before any write below
3030
+ if (lid.x < s) { tile[lid.x] = combined; }
3031
+ workgroupBarrier();
3032
+ }
3033
+
3034
+ // tile[0] now holds the full row dot product, visible to every lane \u2014
3035
+ // every thread redundantly finishes the O(1) alpha/beta combine so the
3036
+ // protected ops below stay uniformly called (only the write is gated).
3037
+ let dot = tile[0];
3038
+ let scaled = ddMulProtected(alpha, dot, lid.x);
3039
+ let iy = row * params.incy;
3040
+ let yVal = DD(yHi[iy], yLo[iy]);
3041
+ let betaTimesY = ddMulProtected(beta, yVal, lid.x);
3042
+ let withBeta = ddAddProtected(scaled, betaTimesY, lid.x);
3043
+ // BLAS beta==0 semantics: y is written, not accumulated \u2014 the result
3044
+ // must not depend on y's prior value (though it is still read above).
3045
+ let result = DD(
3046
+ select(scaled.hi, withBeta.hi, isBetaNonzero),
3047
+ select(scaled.lo, withBeta.lo, isBetaNonzero),
3048
+ );
3049
+
3050
+ if (lid.x == 0u) {
3051
+ yHi[iy] = result.hi;
3052
+ yLo[iy] = result.lo;
3053
+ }
3054
+ // All 64 threads must agree before the next row reuses tile[].
3055
+ workgroupBarrier();
3056
+ }
3057
+ }
3058
+ `});var Mo,No=Z(()=>{Mo=`// dgemv_t: y := alpha * A^T * x + beta * y, double-double (Dekker) f64
3059
+ // emulation of sgemv_t (matrix-vector product, transposed). A, x, y, alpha,
3060
+ // and beta are each split into an f32 (hi, lo) pair; WGSL has no f64 type.
3061
+ // Same one-thread-per-output-column shape as sgemv_t.wgsl, tiling over x
3062
+ // (length m) via shared memory. Because ddMulProtected/ddAddProtected each
3063
+ // carry a workgroupBarrier(), every thread in the workgroup \u2014 including ones
3064
+ // whose column is out of range (n not a multiple of WGS) \u2014 must call them
3065
+ // the same number of times: unlike sgemv_t.wgsl's \`if (col < n)\` guard
3066
+ // around the whole accumulation, out-of-range threads here compute against
3067
+ // a clamped dummy column unconditionally and simply never write their
3068
+ // result (same technique dger.wgsl/ddot.wgsl use for their ragged tails).
3069
+
3070
+ @group(0) @binding(0) var<storage, read> AHi: array<f32>;
3071
+ @group(0) @binding(1) var<storage, read> ALo: array<f32>;
3072
+ @group(0) @binding(2) var<storage, read> xHi: array<f32>;
3073
+ @group(0) @binding(3) var<storage, read> xLo: array<f32>;
3074
+ @group(0) @binding(4) var<storage, read_write> yHi: array<f32>;
3075
+ @group(0) @binding(5) var<storage, read_write> yLo: array<f32>;
3076
+
3077
+ struct Params {
3078
+ m: u32,
3079
+ n: u32,
3080
+ alphaHi: f32,
3081
+ alphaLo: f32,
3082
+ betaHi: f32,
3083
+ betaLo: f32,
3084
+ incx: u32,
3085
+ incy: u32,
3086
+ lda: u32,
3087
+ }
3088
+
3089
+ @group(0) @binding(6) var<uniform> params: Params;
3090
+
3091
+ const WGS: u32 = 64u;
3092
+ var<workgroup> xTile: array<DD, 64>;
3093
+
3094
+ @compute @workgroup_size(64)
3095
+ fn dgemv_t_main(
3096
+ @builtin(global_invocation_id) gid: vec3u,
3097
+ @builtin(local_invocation_id) lid: vec3u,
3098
+ ) {
3099
+ let col = gid.x;
3100
+ let colValid = col < params.n;
3101
+ // Clamp so out-of-range threads still index safely \u2014 their contribution
3102
+ // is computed but never written back.
3103
+ let safeCol = select(0u, col, colValid);
3104
+
3105
+ var acc = DD(0.0, 0.0);
3106
+
3107
+ let m_floor = (params.m / WGS) * WGS;
3108
+ let mainIters = m_floor / WGS;
3109
+
3110
+ for (var iter = 0u; iter < mainIters; iter++) {
3111
+ let base = iter * WGS;
3112
+ // Cooperative load: all 64 threads fill xTile with x[base..base+WGS),
3113
+ // independent of col \u2014 safe regardless of whether this thread's column
3114
+ // is in range.
3115
+ let ix = (base + lid.x) * params.incx;
3116
+ xTile[lid.x] = DD(xHi[ix], xLo[ix]);
3117
+ workgroupBarrier();
3118
+
3119
+ for (var j = 0u; j < WGS; j++) {
3120
+ let ia = (base + j) * params.lda + safeCol;
3121
+ let prod = ddMulProtected(DD(AHi[ia], ALo[ia]), xTile[j], lid.x);
3122
+ acc = ddAddProtected(acc, prod, lid.x);
3123
+ }
3124
+ workgroupBarrier();
3125
+ }
3126
+
3127
+ // Remainder rows (m not a multiple of WGS): the count is the same for
3128
+ // every thread regardless of col, so this loop is already barrier-safe
3129
+ // without needing a second tiling pass.
3130
+ let remCount = params.m - m_floor;
3131
+ for (var k = 0u; k < remCount; k++) {
3132
+ let row = m_floor + k;
3133
+ let ia = row * params.lda + safeCol;
3134
+ let ix = row * params.incx;
3135
+ let prod = ddMulProtected(DD(AHi[ia], ALo[ia]), DD(xHi[ix], xLo[ix]), lid.x);
3136
+ acc = ddAddProtected(acc, prod, lid.x);
3137
+ }
3138
+
3139
+ let alpha = DD(params.alphaHi, params.alphaLo);
3140
+ let beta = DD(params.betaHi, params.betaLo);
3141
+ let scaled = ddMulProtected(alpha, acc, lid.x);
3142
+
3143
+ let iy = safeCol * params.incy;
3144
+ let yVal = DD(yHi[iy], yLo[iy]);
3145
+ let betaTimesY = ddMulProtected(beta, yVal, lid.x);
3146
+ let withBeta = ddAddProtected(scaled, betaTimesY, lid.x);
3147
+ let isBetaNonzero = params.betaHi != 0.0 || params.betaLo != 0.0;
3148
+ // BLAS beta==0 semantics: y is written, not accumulated \u2014 the result
3149
+ // must not depend on y's prior value (though it is still read above).
3150
+ let result = DD(
3151
+ select(scaled.hi, withBeta.hi, isBetaNonzero),
3152
+ select(scaled.lo, withBeta.lo, isBetaNonzero),
3153
+ );
3154
+
3155
+ if (colValid) {
3156
+ yHi[iy] = result.hi;
3157
+ yLo[iy] = result.lo;
3158
+ }
3159
+ }
3160
+ `});var Ro,Io=Z(()=>{Ro=`// dsymv: y := alpha * A * x + beta * y, double-double (Dekker) f64 emulation
3161
+ // of ssymv (symmetric matrix-vector product). A, x, y, alpha, and beta are
3162
+ // each split into an f32 (hi, lo) pair; WGSL has no f64 type. A is n\xD7n
3163
+ // symmetric \u2014 only the triangle specified by uplo is physically stored, so
3164
+ // entries on the unstored side of the diagonal are fetched from their
3165
+ // mirror position (A[i,j] == A[j,i]), same as ssymv.wgsl. Same
3166
+ // one-workgroup-per-row + full within-workgroup DD tree reduction shape as
3167
+ // dgemv_n.wgsl (every row sums over all n columns here, unlike dsyr's
3168
+ // triangle-restricted range, since the logical matrix is fully dense).
3169
+
3170
+ @group(0) @binding(0) var<storage, read> AHi: array<f32>;
3171
+ @group(0) @binding(1) var<storage, read> ALo: array<f32>;
3172
+ @group(0) @binding(2) var<storage, read> xHi: array<f32>;
3173
+ @group(0) @binding(3) var<storage, read> xLo: array<f32>;
3174
+ @group(0) @binding(4) var<storage, read_write> yHi: array<f32>;
3175
+ @group(0) @binding(5) var<storage, read_write> yLo: array<f32>;
3176
+
3177
+ struct Params {
3178
+ n: u32,
3179
+ alphaHi: f32,
3180
+ alphaLo: f32,
3181
+ betaHi: f32,
3182
+ betaLo: f32,
3183
+ incx: u32,
3184
+ incy: u32,
3185
+ lda: u32,
3186
+ uplo: u32, // 0 = lower, 1 = upper
3187
+ }
3188
+
3189
+ @group(0) @binding(6) var<uniform> params: Params;
3190
+
3191
+ const WGS: u32 = 64u;
3192
+ var<workgroup> tile: array<DD, 64>;
3193
+
3194
+ // A[i,j] flat index for the symmetric matrix \u2014 stored position if (i,j) is
3195
+ // on the uplo side of the diagonal, mirrored from (j,i) otherwise. Pure
3196
+ // addressing (no protected op inside), so branching here is safe.
3197
+ fn symIdx(i: u32, j: u32) -> u32 {
3198
+ var row: u32;
3199
+ var col: u32;
3200
+ if params.uplo == 0u {
3201
+ // Lower: stored at (i,j) for j <= i, mirrored from (j,i) otherwise.
3202
+ if j <= i { row = i; col = j; } else { row = j; col = i; }
3203
+ } else {
3204
+ // Upper: stored at (i,j) for j >= i, mirrored from (j,i) otherwise.
3205
+ if j >= i { row = i; col = j; } else { row = j; col = i; }
3206
+ }
3207
+ return row * params.lda + col;
3208
+ }
3209
+
3210
+ @compute @workgroup_size(64)
3211
+ fn dsymv_main(
3212
+ @builtin(workgroup_id) wgid: vec3u,
3213
+ @builtin(local_invocation_id) lid: vec3u,
3214
+ @builtin(num_workgroups) nwg: vec3u,
3215
+ ) {
3216
+ let alpha = DD(params.alphaHi, params.alphaLo);
3217
+ let beta = DD(params.betaHi, params.betaLo);
3218
+ let isBetaNonzero = params.betaHi != 0.0 || params.betaLo != 0.0;
3219
+
3220
+ // Column loop's trip count depends only on n and WGS, not on row \u2014 same
3221
+ // main/tail split applies uniformly to every row (see dger.wgsl).
3222
+ let n_floor = (params.n / WGS) * WGS;
3223
+ let mainIters = n_floor / WGS;
3224
+ let hasTail = select(0u, 1u, n_floor < params.n);
3225
+
3226
+ for (var i = wgid.x; i < params.n; i += nwg.x) {
3227
+ var acc = DD(0.0, 0.0);
3228
+
3229
+ for (var iter = 0u; iter < mainIters; iter++) {
3230
+ let j = lid.x + iter * WGS;
3231
+ let idx = symIdx(i, j);
3232
+ let ix = j * params.incx;
3233
+ let prod = ddMulProtected(DD(AHi[idx], ALo[idx]), DD(xHi[ix], xLo[ix]), lid.x);
3234
+ acc = ddAddProtected(acc, prod, lid.x);
3235
+ }
3236
+
3237
+ for (var iter = 0u; iter < hasTail; iter++) {
3238
+ let j = n_floor + lid.x;
3239
+ let valid = j < params.n;
3240
+ let safeJ = select(0u, j, valid);
3241
+ let idx = symIdx(i, safeJ);
3242
+ let ix = safeJ * params.incx;
3243
+ let prod = ddMulProtected(DD(AHi[idx], ALo[idx]), DD(xHi[ix], xLo[ix]), lid.x);
3244
+ let contribution = DD(select(0.0, prod.hi, valid), select(0.0, prod.lo, valid));
3245
+ acc = ddAddProtected(acc, contribution, lid.x);
3246
+ }
3247
+
3248
+ tile[lid.x] = acc;
3249
+ workgroupBarrier();
3250
+
3251
+ // Inactive threads combine against a throwaway partner and discard it
3252
+ // (ddAddProtected must be called unconditionally by every thread).
3253
+ for (var s = WGS / 2u; s > 0u; s >>= 1u) {
3254
+ let partner = select(lid.x, lid.x + s, lid.x < s);
3255
+ let combined = ddAddProtected(tile[lid.x], tile[partner], lid.x);
3256
+ workgroupBarrier(); // all threads must read tile[] above before any write below
3257
+ if (lid.x < s) { tile[lid.x] = combined; }
3258
+ workgroupBarrier();
3259
+ }
3260
+
3261
+ // tile[0] now holds the full row dot product, visible to every lane \u2014
3262
+ // every thread redundantly finishes the O(1) alpha/beta combine so the
3263
+ // protected ops below stay uniformly called (only the write is gated).
3264
+ let dot = tile[0];
3265
+ let scaled = ddMulProtected(alpha, dot, lid.x);
3266
+ let iy = i * params.incy;
3267
+ let yVal = DD(yHi[iy], yLo[iy]);
3268
+ let betaTimesY = ddMulProtected(beta, yVal, lid.x);
3269
+ let withBeta = ddAddProtected(scaled, betaTimesY, lid.x);
3270
+ // BLAS beta==0 semantics: y is written, not accumulated \u2014 the result
3271
+ // must not depend on y's prior value (though it is still read above).
3272
+ let result = DD(
3273
+ select(scaled.hi, withBeta.hi, isBetaNonzero),
3274
+ select(scaled.lo, withBeta.lo, isBetaNonzero),
3275
+ );
3276
+
3277
+ if (lid.x == 0u) {
3278
+ yHi[iy] = result.hi;
3279
+ yLo[iy] = result.lo;
3280
+ }
3281
+ // All 64 threads must agree before the next row reuses tile[].
3282
+ workgroupBarrier();
3283
+ }
3284
+ }
3285
+ `});var Fo,jo=Z(()=>{Fo=`// dtrmv: y := op(A) * x, double-double (Dekker) f64 emulation of strmv
3286
+ // (triangular matrix-vector product). A, x, and y are each split into an f32
3287
+ // (hi, lo) pair; WGSL has no f64 type. A is n\xD7n triangular \u2014 only the
3288
+ // triangle specified by uplo is referenced. Like strmv.wgsl, wgblas's trmv
3289
+ // takes a separate output vector y rather than overwriting x in place (the
3290
+ // standard BLAS signature is in-place), so there is no aliasing/read-write-
3291
+ // ordering concern the way real in-place trmv would have \u2014 this is
3292
+ // structurally just dsymv.wgsl's per-row DD tree reduction with a triangular
3293
+ // (not full-n, not mirrored) column range per row, same shape as dsyr.wgsl's
3294
+ // per-row-varying range (main/tail split computed inside the row loop, since
3295
+ // range length depends on i).
3296
+
3297
+ @group(0) @binding(0) var<storage, read> AHi: array<f32>;
3298
+ @group(0) @binding(1) var<storage, read> ALo: array<f32>;
3299
+ @group(0) @binding(2) var<storage, read> xHi: array<f32>;
3300
+ @group(0) @binding(3) var<storage, read> xLo: array<f32>;
3301
+ @group(0) @binding(4) var<storage, read_write> yHi: array<f32>;
3302
+ @group(0) @binding(5) var<storage, read_write> yLo: array<f32>;
3303
+
3304
+ struct Params {
3305
+ n: u32,
3306
+ incx: u32,
3307
+ incy: u32,
3308
+ lda: u32,
3309
+ trans: u32, // 0 = no-transpose, 1 = transpose
3310
+ uplo: u32, // 0 = lower, 1 = upper
3311
+ diag: u32, // 0 = non-unit, 1 = unit
3312
+ }
3313
+
3314
+ @group(0) @binding(6) var<uniform> params: Params;
3315
+
3316
+ const WGS: u32 = 64u;
3317
+ var<workgroup> tile: array<DD, 64>;
3318
+
3319
+ @compute @workgroup_size(64)
3320
+ fn dtrmv_main(
3321
+ @builtin(workgroup_id) wgid: vec3u,
3322
+ @builtin(local_invocation_id) lid: vec3u,
3323
+ @builtin(num_workgroups) nwg: vec3u,
3324
+ ) {
3325
+ // Effective "upper" range for row i: op(A)[i,j] is stored at A[i,j] for
3326
+ // no-transpose+upper or transpose+lower (range [i, n)); at A[j,i] for
3327
+ // no-transpose+lower or transpose+upper (range [0, i]).
3328
+ let isUpperRange = (params.trans == 0u) == (params.uplo == 1u);
3329
+
3330
+ for (var i = wgid.x; i < params.n; i += nwg.x) {
3331
+ let rangeStart = select(0u, i, isUpperRange);
3332
+ let rangeEnd = select(i + 1u, params.n, isUpperRange);
3333
+
3334
+ // Range length varies per row, but every thread in the workgroup runs
3335
+ // the SAME row at the same time, so the main/tail split computed from
3336
+ // rangeStart/rangeEnd is already uniform across threads for this row \u2014
3337
+ // just not the same across different rows (see dsyr.wgsl).
3338
+ let rangeLen = rangeEnd - rangeStart;
3339
+ let range_floor = rangeStart + (rangeLen / WGS) * WGS;
3340
+ let mainIters = (range_floor - rangeStart) / WGS;
3341
+ let hasTail = select(0u, 1u, range_floor < rangeEnd);
3342
+
3343
+ var acc = DD(0.0, 0.0);
3344
+
3345
+ for (var iter = 0u; iter < mainIters; iter++) {
3346
+ let j = rangeStart + lid.x + iter * WGS;
3347
+ let addr = select(j * params.lda + i, i * params.lda + j, params.trans == 0u);
3348
+ let isUnitDiag = params.diag == 1u && j == i;
3349
+ let aVal = DD(
3350
+ select(AHi[addr], 1.0, isUnitDiag),
3351
+ select(ALo[addr], 0.0, isUnitDiag),
3352
+ );
3353
+ let ix = j * params.incx;
3354
+ let prod = ddMulProtected(aVal, DD(xHi[ix], xLo[ix]), lid.x);
3355
+ acc = ddAddProtected(acc, prod, lid.x);
3356
+ }
3357
+
3358
+ for (var iter = 0u; iter < hasTail; iter++) {
3359
+ let j = range_floor + lid.x;
3360
+ let valid = j < rangeEnd;
3361
+ let safeJ = select(rangeStart, j, valid); // rangeLen is always >= 1, so rangeStart is a safe in-range fallback
3362
+ let addr = select(safeJ * params.lda + i, i * params.lda + safeJ, params.trans == 0u);
3363
+ let isUnitDiag = params.diag == 1u && safeJ == i;
3364
+ let aVal = DD(
3365
+ select(AHi[addr], 1.0, isUnitDiag),
3366
+ select(ALo[addr], 0.0, isUnitDiag),
3367
+ );
3368
+ let ix = safeJ * params.incx;
3369
+ let prod = ddMulProtected(aVal, DD(xHi[ix], xLo[ix]), lid.x);
3370
+ let contribution = DD(select(0.0, prod.hi, valid), select(0.0, prod.lo, valid));
3371
+ acc = ddAddProtected(acc, contribution, lid.x);
3372
+ }
3373
+
3374
+ tile[lid.x] = acc;
3375
+ workgroupBarrier();
3376
+
3377
+ // Inactive threads combine against a throwaway partner and discard it
3378
+ // (ddAddProtected must be called unconditionally by every thread).
3379
+ for (var s = WGS / 2u; s > 0u; s >>= 1u) {
3380
+ let partner = select(lid.x, lid.x + s, lid.x < s);
3381
+ let combined = ddAddProtected(tile[lid.x], tile[partner], lid.x);
3382
+ workgroupBarrier(); // all threads must read tile[] above before any write below
3383
+ if (lid.x < s) { tile[lid.x] = combined; }
3384
+ workgroupBarrier();
3385
+ }
3386
+
3387
+ if (lid.x == 0u) {
3388
+ let iy = i * params.incy;
3389
+ yHi[iy] = tile[0].hi;
3390
+ yLo[iy] = tile[0].lo;
3391
+ }
3392
+ // All 64 threads must agree before the next row reuses tile[].
3393
+ workgroupBarrier();
3394
+ }
3395
+ }
3396
+ `});var Ho,qo=Z(()=>{Ho=`// dtrsv_invert_block: double-double (Dekker) f64 emulation of
3397
+ // strsv_invert_block.wgsl \u2014 computes ONE column (workgroup_id.x) of ONE
3398
+ // block's (workgroup_id.y) explicit inverse, via the same one-row-at-a-time
3399
+ // substitution, solving against a unit basis vector e_col. A, Ainv, and the
3400
+ // running accumulation are each split into an f32 (hi, lo) pair; WGSL has no
3401
+ // f64 type.
3402
+ //
3403
+ // This is the first routine in the f64 port order to use ddDivProtected (the
3404
+ // non-unit-diagonal division) \u2014 deliberately last per TODO.md, since
3405
+ // division is where dnrm2 found real double-double edge-case bugs during
3406
+ // the L1 port. The division only runs once per (column, step) \u2014 same
3407
+ // barrier-uniformity requirement as every other protected op here \u2014 so
3408
+ // every thread in the workgroup computes it redundantly from the
3409
+ // already-shared \`tile[0]\` reduction result (same pattern dgemv_n uses for
3410
+ // its O(1) alpha/beta combine after the per-row reduction), with only
3411
+ // \`lid.x==0\` writing the result. \`params.diag\` is uniform across the whole
3412
+ // dispatch (not per-thread), so branching on it to skip the division
3413
+ // entirely for a unit diagonal is safe \u2014 unlike dtrmv.wgsl's per-element
3414
+ // diag check, which varies per thread and needed select() instead.
3415
+
3416
+ @group(0) @binding(0) var<storage, read> AHi: array<f32>;
3417
+ @group(0) @binding(1) var<storage, read> ALo: array<f32>;
3418
+ @group(0) @binding(2) var<storage, read_write> AinvHi: array<f32>;
3419
+ @group(0) @binding(3) var<storage, read_write> AinvLo: array<f32>;
3420
+
3421
+ struct Params {
3422
+ n: u32,
3423
+ lda: u32,
3424
+ trans: u32, // 0 = no-transpose, 1 = transpose
3425
+ uplo: u32, // 0 = lower, 1 = upper
3426
+ diag: u32, // 0 = non-unit, 1 = unit
3427
+ }
3428
+
3429
+ @group(0) @binding(4) var<uniform> params: Params;
3430
+
3431
+ const WGS: u32 = 64u;
3432
+ const BLOCK_SIZE: u32 = 64u;
3433
+ var<workgroup> tile: array<DD, 64>;
3434
+
3435
+ fn readA(i: u32, j: u32) -> DD {
3436
+ let idx = select(j * params.lda + i, i * params.lda + j, params.trans == 0u);
3437
+ return DD(AHi[idx], ALo[idx]);
3438
+ }
3439
+
3440
+ @compute @workgroup_size(64)
3441
+ fn dtrsv_invert_block_main(
3442
+ @builtin(workgroup_id) wgid: vec3u,
3443
+ @builtin(local_invocation_id) lid: vec3u,
3444
+ ) {
3445
+ let col = wgid.x;
3446
+ let blockIndex = wgid.y;
3447
+ let blockStart = blockIndex * BLOCK_SIZE;
3448
+ var blockEnd = blockStart + BLOCK_SIZE;
3449
+ if (blockEnd > params.n) { blockEnd = params.n; }
3450
+ let blockLen = blockEnd - blockStart;
3451
+
3452
+ if (col >= blockLen) { return; }
3453
+
3454
+ let ainvBase = blockIndex * BLOCK_SIZE * BLOCK_SIZE;
3455
+ let forward = (params.trans == 0u) == (params.uplo == 0u);
3456
+
3457
+ if forward {
3458
+ for (var r = lid.x; r < col; r += WGS) {
3459
+ AinvHi[ainvBase + r * BLOCK_SIZE + col] = 0.0;
3460
+ AinvLo[ainvBase + r * BLOCK_SIZE + col] = 0.0;
3461
+ }
3462
+ } else {
3463
+ for (var r = col + 1u + lid.x; r < blockLen; r += WGS) {
3464
+ AinvHi[ainvBase + r * BLOCK_SIZE + col] = 0.0;
3465
+ AinvLo[ainvBase + r * BLOCK_SIZE + col] = 0.0;
3466
+ }
3467
+ }
3468
+ storageBarrier();
3469
+ workgroupBarrier();
3470
+
3471
+ let numSteps = select(col + 1u, blockLen - col, forward);
3472
+ for (var step = 0u; step < numSteps; step++) {
3473
+ let localRow = select(col - step, col + step, forward);
3474
+ let i = blockStart + localRow;
3475
+
3476
+ // Accumulation range over lj: [col, localRow) forward, [localRow+1, col+1) backward.
3477
+ // Range length varies per step, but every thread runs the SAME step at
3478
+ // the same time, so the main/tail split is already uniform for this
3479
+ // step \u2014 just not the same across different steps (see dsyr.wgsl).
3480
+ let ljStart = select(localRow + 1u, col, forward);
3481
+ let ljEnd = select(col + 1u, localRow, forward);
3482
+ let rangeLen = ljEnd - ljStart;
3483
+ let range_floor = ljStart + (rangeLen / WGS) * WGS;
3484
+ let mainIters = (range_floor - ljStart) / WGS;
3485
+ let hasTail = select(0u, 1u, range_floor < ljEnd);
3486
+
3487
+ var acc = DD(0.0, 0.0);
3488
+
3489
+ for (var iter = 0u; iter < mainIters; iter++) {
3490
+ let lj = ljStart + lid.x + iter * WGS;
3491
+ let aij = readA(i, blockStart + lj);
3492
+ let aidx = ainvBase + lj * BLOCK_SIZE + col;
3493
+ let ainv = DD(AinvHi[aidx], AinvLo[aidx]);
3494
+ let prod = ddMulProtected(aij, ainv, lid.x);
3495
+ acc = ddAddProtected(acc, prod, lid.x);
3496
+ }
3497
+
3498
+ for (var iter = 0u; iter < hasTail; iter++) {
3499
+ let lj = range_floor + lid.x;
3500
+ let valid = lj < ljEnd;
3501
+ let safeLj = select(ljStart, lj, valid); // ljStart is always in-range when rangeLen > 0, the only case hasTail can be 1
3502
+ let aij = readA(i, blockStart + safeLj);
3503
+ let aidx = ainvBase + safeLj * BLOCK_SIZE + col;
3504
+ let ainv = DD(AinvHi[aidx], AinvLo[aidx]);
3505
+ let prod = ddMulProtected(aij, ainv, lid.x);
3506
+ let contribution = DD(select(0.0, prod.hi, valid), select(0.0, prod.lo, valid));
3507
+ acc = ddAddProtected(acc, contribution, lid.x);
3508
+ }
3509
+
3510
+ tile[lid.x] = acc;
3511
+ workgroupBarrier();
3512
+
3513
+ // Inactive threads combine against a throwaway partner and discard it
3514
+ // (ddAddProtected must be called unconditionally by every thread).
3515
+ for (var s = WGS / 2u; s > 0u; s >>= 1u) {
3516
+ let partner = select(lid.x, lid.x + s, lid.x < s);
3517
+ let combined = ddAddProtected(tile[lid.x], tile[partner], lid.x);
3518
+ workgroupBarrier(); // all threads must read tile[] above before any write below
3519
+ if (lid.x < s) { tile[lid.x] = combined; }
3520
+ workgroupBarrier();
3521
+ }
3522
+
3523
+ // tile[0] now holds the full accumulation, visible to every lane \u2014 every
3524
+ // thread redundantly finishes the O(1) rhs/division so the protected
3525
+ // ops below stay uniformly called (only the write is gated).
3526
+ let e = DD(select(0.0, 1.0, localRow == col), 0.0);
3527
+ let rhs = ddSubProtected(e, tile[0], lid.x);
3528
+
3529
+ var val: DD;
3530
+ if params.diag == 1u {
3531
+ val = rhs;
3532
+ } else {
3533
+ val = ddDivProtected(rhs, readA(i, i), lid.x);
3534
+ }
3535
+
3536
+ if (lid.x == 0u) {
3537
+ AinvHi[ainvBase + localRow * BLOCK_SIZE + col] = val.hi;
3538
+ AinvLo[ainvBase + localRow * BLOCK_SIZE + col] = val.lo;
3539
+ }
3540
+ storageBarrier();
3541
+ workgroupBarrier();
3542
+ }
3543
+ }
3544
+ `});var Co,To=Z(()=>{Co=`// dtrsv_apply_inverse: double-double (Dekker) f64 emulation of
3545
+ // strsv_apply_inverse.wgsl \u2014 given a precomputed block inverse (from
3546
+ // dtrsv_invert_block.wgsl), computes this block's solution as a dense
3547
+ // matrix-vector multiply against the block's current remainder in x.
3548
+ // Ainv, x, and the per-row accumulation are each split into an f32 (hi, lo)
3549
+ // pair; WGSL has no f64 type.
3550
+ //
3551
+ // Unlike dsymv/dtrmv's per-row reduction across 64 threads, each thread here
3552
+ // owns one whole row's dot product independently (blockLen <= WGS, so one
3553
+ // thread per row already covers it, no tree reduction needed) \u2014 same shape
3554
+ // as dgemv_t.wgsl's per-thread accumulation. The f32 original early-returns
3555
+ // threads with \`lid.x >= blockLen\` (the last, possibly-short block); DD
3556
+ // can't do that, since every thread must call ddMulProtected/ddAddProtected
3557
+ // the same number of times. Instead every thread runs the identical
3558
+ // \`blockLen\`-iteration loop (reading past-blockLen rows of Ainv, which the
3559
+ // zero-initialized, never-written buffer backing them makes safe garbage \u2014
3560
+ // see dgemv_t.wgsl's clamped-dummy-index technique) and only the final
3561
+ // write is gated.
3562
+
3563
+ @group(0) @binding(0) var<storage, read> AinvHi: array<f32>;
3564
+ @group(0) @binding(1) var<storage, read> AinvLo: array<f32>;
3565
+ @group(0) @binding(2) var<storage, read_write> xHi: array<f32>;
3566
+ @group(0) @binding(3) var<storage, read_write> xLo: array<f32>;
3567
+
3568
+ struct Params {
3569
+ incx: u32,
3570
+ blockIndex: u32,
3571
+ blockStart: u32,
3572
+ blockEnd: u32,
3573
+ }
3574
+
3575
+ @group(0) @binding(4) var<uniform> params: Params;
3576
+
3577
+ const BLOCK_SIZE: u32 = 64u;
3578
+ var<workgroup> xLocal: array<DD, 64>;
3579
+
3580
+ @compute @workgroup_size(64)
3581
+ fn dtrsv_apply_inverse_main(@builtin(local_invocation_id) lid: vec3u) {
3582
+ let blockLen = params.blockEnd - params.blockStart;
3583
+
3584
+ if (lid.x < blockLen) {
3585
+ let ix = (params.blockStart + lid.x) * params.incx;
3586
+ xLocal[lid.x] = DD(xHi[ix], xLo[ix]);
3587
+ }
3588
+ workgroupBarrier();
3589
+
3590
+ let ainvBase = params.blockIndex * BLOCK_SIZE * BLOCK_SIZE;
3591
+ var acc = DD(0.0, 0.0);
3592
+ for (var j = 0u; j < blockLen; j++) {
3593
+ let aidx = ainvBase + lid.x * BLOCK_SIZE + j;
3594
+ let prod = ddMulProtected(DD(AinvHi[aidx], AinvLo[aidx]), xLocal[j], lid.x);
3595
+ acc = ddAddProtected(acc, prod, lid.x);
3596
+ }
3597
+
3598
+ if (lid.x < blockLen) {
3599
+ let ix = (params.blockStart + lid.x) * params.incx;
3600
+ xHi[ix] = acc.hi;
3601
+ xLo[ix] = acc.lo;
3602
+ }
3603
+ }
3604
+ `});var Vo,Wo=Z(()=>{Vo=`// dtrsv_update: double-double (Dekker) f64 emulation of strsv_update.wgsl \u2014
3605
+ // subtracts a solved block's contribution from every remaining row in
3606
+ // parallel (one workgroup per row, like dtrmv.wgsl). A, x, and the per-row
3607
+ // accumulation are each split into an f32 (hi, lo) pair; WGSL has no f64
3608
+ // type. No diag/masking needed: this region never touches the diagonal.
3609
+ //
3610
+ // The column range [blockStart, blockEnd) is the same fixed width for every
3611
+ // row in a dispatch (not per-row-varying the way dtrmv's triangular range
3612
+ // is), so the main/tail split is computed once, outside the row loop \u2014 same
3613
+ // shape as dger.wgsl's column loop.
3614
+
3615
+ @group(0) @binding(0) var<storage, read> AHi: array<f32>;
3616
+ @group(0) @binding(1) var<storage, read> ALo: array<f32>;
3617
+ @group(0) @binding(2) var<storage, read_write> xHi: array<f32>;
3618
+ @group(0) @binding(3) var<storage, read_write> xLo: array<f32>;
3619
+
3620
+ struct Params {
3621
+ n: u32,
3622
+ incx: u32,
3623
+ lda: u32,
3624
+ trans: u32, // 0 = no-transpose, 1 = transpose
3625
+ uplo: u32, // 0 = lower, 1 = upper
3626
+ blockStart: u32,
3627
+ blockEnd: u32, // exclusive
3628
+ }
3629
+
3630
+ @group(0) @binding(4) var<uniform> params: Params;
3631
+
3632
+ const WGS: u32 = 64u;
3633
+ var<workgroup> tile: array<DD, 64>;
3634
+
3635
+ @compute @workgroup_size(64)
3636
+ fn dtrsv_update_main(
3637
+ @builtin(workgroup_id) wgid: vec3u,
3638
+ @builtin(local_invocation_id) lid: vec3u,
3639
+ @builtin(num_workgroups) nwg: vec3u,
3640
+ ) {
3641
+ // forward: remaining rows are [blockEnd,n); backward: [0,blockStart).
3642
+ // Uniform across the whole dispatch (derived from params only), so an
3643
+ // early return here is safe \u2014 never a partial-workgroup divergence.
3644
+ let forward = (params.trans == 0u) == (params.uplo == 0u);
3645
+
3646
+ var rangeStart: u32;
3647
+ var rangeEnd: u32;
3648
+ if forward {
3649
+ rangeStart = params.blockEnd;
3650
+ rangeEnd = params.n;
3651
+ } else {
3652
+ rangeStart = 0u;
3653
+ rangeEnd = params.blockStart;
3654
+ }
3655
+
3656
+ if (rangeStart >= rangeEnd) { return; }
3657
+ let count = rangeEnd - rangeStart;
3658
+
3659
+ let colCount = params.blockEnd - params.blockStart;
3660
+ let col_floor = (colCount / WGS) * WGS;
3661
+ let mainIters = col_floor / WGS;
3662
+ let hasTail = select(0u, 1u, col_floor < colCount);
3663
+
3664
+ for (var idx = wgid.x; idx < count; idx += nwg.x) {
3665
+ let i = rangeStart + idx;
3666
+ var acc = DD(0.0, 0.0);
3667
+
3668
+ for (var iter = 0u; iter < mainIters; iter++) {
3669
+ let j = params.blockStart + lid.x + iter * WGS;
3670
+ let aidx = select(j * params.lda + i, i * params.lda + j, params.trans == 0u);
3671
+ let ix = j * params.incx;
3672
+ let prod = ddMulProtected(DD(AHi[aidx], ALo[aidx]), DD(xHi[ix], xLo[ix]), lid.x);
3673
+ acc = ddAddProtected(acc, prod, lid.x);
3674
+ }
3675
+
3676
+ for (var iter = 0u; iter < hasTail; iter++) {
3677
+ let j = params.blockStart + col_floor + lid.x;
3678
+ let valid = j < params.blockEnd;
3679
+ let safeJ = select(params.blockStart, j, valid);
3680
+ let aidx = select(safeJ * params.lda + i, i * params.lda + safeJ, params.trans == 0u);
3681
+ let ix = safeJ * params.incx;
3682
+ let prod = ddMulProtected(DD(AHi[aidx], ALo[aidx]), DD(xHi[ix], xLo[ix]), lid.x);
3683
+ let contribution = DD(select(0.0, prod.hi, valid), select(0.0, prod.lo, valid));
3684
+ acc = ddAddProtected(acc, contribution, lid.x);
3685
+ }
3686
+
3687
+ tile[lid.x] = acc;
3688
+ workgroupBarrier();
3689
+
3690
+ // Inactive threads combine against a throwaway partner and discard it
3691
+ // (ddAddProtected must be called unconditionally by every thread).
3692
+ for (var s = WGS / 2u; s > 0u; s >>= 1u) {
3693
+ let partner = select(lid.x, lid.x + s, lid.x < s);
3694
+ let combined = ddAddProtected(tile[lid.x], tile[partner], lid.x);
3695
+ workgroupBarrier(); // all threads must read tile[] above before any write below
3696
+ if (lid.x < s) { tile[lid.x] = combined; }
3697
+ workgroupBarrier();
3698
+ }
3699
+
3700
+ let ix_i = i * params.incx;
3701
+ let xVal = DD(xHi[ix_i], xLo[ix_i]);
3702
+ // tile[0] now holds the full subtracted term, visible to every lane \u2014
3703
+ // every thread redundantly finishes the O(1) subtraction so the
3704
+ // protected op below stays uniformly called (only the write is gated).
3705
+ let result = ddSubProtected(xVal, tile[0], lid.x);
3706
+
3707
+ if (lid.x == 0u) {
3708
+ xHi[ix_i] = result.hi;
3709
+ xLo[ix_i] = result.lo;
3710
+ }
3711
+ // All 64 threads must agree before the next row (grid-stride) reuses tile[].
3712
+ workgroupBarrier();
3713
+ }
3714
+ }
3715
+ `});var ue,Oo=Z(()=>{ue=`// sgemm_small: C = alpha * op(A) * op(B) + beta * C \u2014 small-tile half of
2691
3716
  // the two-tier autotuned dispatch (see sgemm.mjs and sgemm_large.wgsl).
2692
3717
  // BM=BN=32, BK=8, TM=TN=2 \u2014 wins over the large tile below a 6x6=36
2693
3718
  // workgroup grid of 64-tiles, where the large tile doesn't have enough
@@ -2899,7 +3924,7 @@ fn main(
2899
3924
  }
2900
3925
  }
2901
3926
  }
2902
- `});var fe,Ao=O(()=>{fe=`// sgemm_large: C = alpha * op(A) * op(B) + beta * C \u2014 large-tile half of
3927
+ `});var de,Ko=Z(()=>{de=`// sgemm_large: C = alpha * op(A) * op(B) + beta * C \u2014 large-tile half of
2903
3928
  // the two-tier autotuned dispatch (see sgemm.mjs and sgemm_small.wgsl).
2904
3929
  // BM=BN=64, BK=8, TM=8, TN=4 (128 threads/workgroup) \u2014 the kernel 9
2905
3930
  // autotuning winner (temp/autotune_sweep.mjs, temp/gen_sweep_kernel.mjs,
@@ -3105,7 +4130,7 @@ fn main(
3105
4130
  }
3106
4131
  }
3107
4132
  }
3108
- `});var xe,Go=O(()=>{xe=`// sgemmtr_small: C := uplo(alpha * op(A) * op(B) + beta * C) \u2014 small-tile
4133
+ `});var xe,Uo=Z(()=>{xe=`// sgemmtr_small: C := uplo(alpha * op(A) * op(B) + beta * C) \u2014 small-tile
3109
4134
  // half of a two-tier dispatch, identical to sgemm_small.wgsl except the
3110
4135
  // final output write is gated to one triangle of C by \`uplo\` \u2014 see
3111
4136
  // sgemmtr_large.wgsl for the full rationale (shared by both tiers).
@@ -3218,7 +4243,7 @@ fn main(
3218
4243
  }
3219
4244
  }
3220
4245
  }
3221
- `});var ve,Eo=O(()=>{ve=`// sgemmtr_large: C := uplo(alpha * op(A) * op(B) + beta * C) \u2014 large-tile
4246
+ `});var ve,zo=Z(()=>{ve=`// sgemmtr_large: C := uplo(alpha * op(A) * op(B) + beta * C) \u2014 large-tile
3222
4247
  // half of a two-tier dispatch, identical to sgemm_large.wgsl (see that file
3223
4248
  // for the BM/BN/BK/TM/TN autotuning rationale) except the final output write
3224
4249
  // is gated to one triangle of C by \`uplo\`, the same convention ssyr/ssyr2
@@ -3338,7 +4363,7 @@ fn main(
3338
4363
  }
3339
4364
  }
3340
4365
  }
3341
- `});var Do,ko=O(()=>{Do=`// symmetrize: Adense := full dense expansion of a symmetric matrix stored
4366
+ `});var Zo,Yo=Z(()=>{Zo=`// symmetrize: Adense := full dense expansion of a symmetric matrix stored
3342
4367
  // with only its \`uplo\` triangle meaningful (the other triangle is implied
3343
4368
  // by symmetry: A[i,j] = A[j,i]). A plain element-wise pass, no tiling or
3344
4369
  // shared memory needed \u2014 used to materialize a dense operand for routines
@@ -3369,7 +4394,7 @@ fn main(@builtin(global_invocation_id) gid: vec3u) {
3369
4394
  let srcIdx = select(col * params.lda + row, row * params.lda + col, isStored);
3370
4395
  Adense[row * params.ldd + col] = A[srcIdx];
3371
4396
  }
3372
- `});var Po,No=O(()=>{Po=`// triangularize: Adense := dense expansion of op(A) (A or A^T per \`trans\`),
4397
+ `});var $o,Xo=Z(()=>{$o=`// triangularize: Adense := dense expansion of op(A) (A or A^T per \`trans\`),
3373
4398
  // zero-filling the unstored triangle (exact for a matmul) so strmm can reuse
3374
4399
  // sgemm's kernel unchanged. \`diag=1\` substitutes 1.0 on the diagonal.
3375
4400
 
@@ -3413,7 +4438,7 @@ fn main(@builtin(global_invocation_id) gid: vec3u) {
3413
4438
 
3414
4439
  Adense[row * params.ldd + col] = select(0.0, A[srcRow * params.lda + srcCol], isMeaningful);
3415
4440
  }
3416
- `});var Io,Mo=O(()=>{Io=`// block_transfer: gather/scatter/scatter-subtract between a tight (blockLen
4441
+ `});var Qo,Jo=Z(()=>{Qo=`// block_transfer: gather/scatter/scatter-subtract between a tight (blockLen
3417
4442
  // x otherLen) block and a sub-range of a strided (any ld, row/col-major)
3418
4443
  // buffer \u2014 needed since block offsets aren't 256-byte-aligned and block
3419
4444
  // rows/cols aren't always one contiguous range for copyBufferToBuffer.
@@ -3455,8 +4480,8 @@ fn main(@builtin(global_invocation_id) gid: vec3u) {
3455
4480
  strided[stridedIdx] = block[blockIdx];
3456
4481
  }
3457
4482
  }
3458
- `});var Lo={};qe(Lo,{routineShaders:()=>or,shaderSources:()=>Ii});var or,Ii,Ro=O(()=>{$e();Ze();Je();et();ot();it();nt();ut();mt();dt();pt();wt();bt();xt();_t();Bt();St();At();Et();kt();Dt();Pt();It();Rt();qt();Ct();jt();Ht();Vt();zt();Yt();$t();Qt();ro();to();ao();so();lo();fo();co();po();wo();bo();xo();_o();So();Ao();Go();Eo();ko();No();Mo();or={};or.sscal={sscal:ke};or.cscal={cscal:Qe};or.sswap={sswap:rt};or.dswap={dswap:tt};or.saxpy={saxpy:at};or.scopy={scopy:st};or.dcopy={dcopy:lt};or.sdot={sdot:ft,"reduction/sum":De};or.sasum={sasum:ct,"reduction/sum":De};or.snrm2={snrm2:gt,"reduction/scaledSum":ht};or.isamax={isamax:yt,"reduction/argmax":vt};or.dasum={"f64/dekker":Kr,"f64/utils/abs":ye,"f64/utils/add":zr,dasum:Gt,"reduction/sumF64":Ne};or.ddot={"f64/dekker":Kr,"f64/utils/add":zr,"f64/utils/multiply":$r,ddot:Nt,"reduction/sumF64":Ne};or.dscal={"f64/dekker":Kr,"f64/utils/add":zr,"f64/utils/multiply":$r,dscal:Mt};or.daxpy={"f64/dekker":Kr,"f64/utils/add":zr,"f64/utils/multiply":$r,daxpy:Lt};or.idamax={"f64/dekker":Kr,"f64/utils/abs":ye,"f64/utils/greater":Pe,"f64/utils/equal":Tt,idamax:Ft,"reduction/argmaxF64":Wt};or.srot={srot:Ot};or.drot={"f64/dekker":Kr,"f64/utils/add":zr,"f64/utils/multiply":$r,drot:Kt};or.srotm={srotm:Ut};or.drotm={"f64/dekker":Kr,"f64/utils/add":zr,"f64/utils/multiply":$r,drotm:Xt};or.dnrm2={"f64/dekker":Kr,"f64/utils/abs":ye,"f64/utils/greater":Pe,"f64/utils/add":zr,"f64/utils/multiply":$r,"f64/utils/divide":Zt,"f64/utils/sqrt":Jt,dnrm2:eo,"reduction/scaledSumF64":oo};or.sgemv={sgemv_n:io,sgemv_t:no};or.ssymv={ssymv:uo};or.strmv={strmv:mo};or.strsv={strsv_invert_block:Me,strsv_apply_inverse:go,strsv_update:ho};or.sger={sger:yo};or.ssyr={ssyr:vo};or.ssyr2={ssyr2:Bo};or.sgemm={sgemm_small:ue,sgemm_large:fe};or.sgemmtr={sgemmtr_small:xe,sgemmtr_large:ve};or.ssyrk={sgemmtr_small:xe,sgemmtr_large:ve};or.ssyr2k={sgemmtr_small:xe,sgemmtr_large:ve};or.ssymm={sgemm_small:ue,sgemm_large:fe,symmetrize:Do};or.strmm={sgemm_small:ue,sgemm_large:fe,triangularize:Po};or.strsm={strsv_invert_block:Me,block_transfer:Io,sscal:ke,sgemm_small:ue,sgemm_large:fe};Ii=Object.assign({},...Object.values(or))});var Ti={};qe(Ti,{Complex32:()=>Wr,Complex32Array:()=>_r,Complex64:()=>jr,Complex64Array:()=>Gr,GpuMatrix:()=>X,GpuVector:()=>N,cleanup:()=>Oe,cscal:()=>To,dasum:()=>Uo,daxpy:()=>Ho,dcopy:()=>Vo,ddot:()=>Yo,dnrm2:()=>$o,drot:()=>ra,drotm:()=>ta,dscal:()=>Co,dswap:()=>jo,gpuName:()=>Ve,idamax:()=>Qo,init:()=>He,isamax:()=>Zo,randomFloat32Array:()=>Ue,randomFloat64Array:()=>Ye,randomTriangularFloat32Array:()=>Xe,sasum:()=>zo,saxpy:()=>Wo,scopy:()=>Oo,sdot:()=>Ko,sgemm:()=>da,sgemmtr:()=>ca,sgemv:()=>oa,sger:()=>ua,snrm2:()=>Xo,srot:()=>Jo,srotm:()=>ea,sscal:()=>qo,sswap:()=>Fo,ssymm:()=>wa,ssymv:()=>aa,ssyr:()=>fa,ssyr2:()=>ma,ssyr2k:()=>ga,ssyrk:()=>pa,strmm:()=>ha,strmv:()=>ia,strsm:()=>ba,strsv:()=>la});function Ce(r,t){return t?r.features.has("timestamp-query")?{requiredFeatures:["timestamp-query"]}:(console.warn("timestamp-query not supported on this device \u2014 benchmark mode disabled."),{}):{}}function Fe(r){if(!je(r))return{querySet:null,passDescriptor:void 0};let t=r.createQuerySet({type:"timestamp",count:2});return{querySet:t,passDescriptor:{timestampWrites:{querySet:t,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1}}}}function Lr(r,t,e){if(!e)return null;let o=r.createBuffer({label:"timestamp-resolve",size:16,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC});t.resolveQuerySet(e,0,2,o,0);let a=r.createBuffer({label:"timestamp-readback",size:16,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});return t.copyBufferToBuffer(o,0,a,0,16),{tsReadBuffer:a,resolveBuffer:o,querySet:e}}async function P(r){if(!r)return;let{tsReadBuffer:t,resolveBuffer:e,querySet:o}=r;await t.mapAsync(GPUMapMode.READ);let a=new BigInt64Array(t.getMappedRange().slice());return t.unmap(),t.destroy(),e.destroy(),o.destroy(),Math.max(0,Number(a[1]-a[0]))/1e6}var Qr=null,Ae=!1,Jr=new Map,le=new WeakMap,Vr=null,We=({powerPreference:r,benchmark:t})=>`${r}::${t}`;async function He({powerPreference:r="high-performance",benchmark:t=!1,dumpShaders:e=!1}={}){let o={powerPreference:r,benchmark:t,dumpShaders:e},a=We(o),i=Jr.get(a);if(i)return i;if(Qr)e!==Ae&&typeof window>"u"&&console.warn(`dumpShaders: ${e} was requested, but the WebGPU instance was already created with dumpShaders: ${Ae}. The first init() call fixes this for the process.`);else if(typeof window>"u"){let{create:m,globals:p}=await import("webgpu");Object.assign(globalThis,p),Qr=m(e?["enable-dawn-features=dump_shaders,disable_symbol_renaming"]:[]),Ae=e}else e&&console.warn("dumpShaders has no effect in the browser \u2014 see init()'s docs."),Qr=navigator.gpu;if(!Qr)throw new Error("WebGPU not supported in this environment.");let s=await Qr.requestAdapter({powerPreference:r})??await Qr.requestAdapter();if(!s)throw new Error("No WebGPU adapter found.");let n=[...Ce(s,t).requiredFeatures??[]],f=await s.requestDevice({requiredFeatures:n});f.addEventListener("uncapturederror",m=>{console.error("Uncaptured GPU error:",m.error.message)});let l=n.includes("timestamp-query");return le.set(f,{adapter:s,benchmark:l,options:o}),Jr.set(a,f),Vr||(Vr=f),f}function Oe(r){if(r===void 0){for(let e of Jr.values())e.destroy();Jr.clear(),Vr=null;return}let t=le.get(r);t&&(Jr.delete(We(t.options)),le.delete(r),r.destroy(),Vr===r&&(Vr=Jr.values().next().value??null))}function Ve(r=Vr){let t=r&&le.get(r);if(!t)throw new Error("WebGPU adapter not initialized \u2014 call init() first.");let{device:e,description:o}=t.adapter.info;return{description:o||"unknown",device:e||"unknown"}}function je(r=Vr){return le.get(r)?.benchmark??!1}function re(){if(!Vr)throw new Error("WebGPU device not initialized \u2014 call init() first.");return Vr}function d(...r){r.flat().forEach(t=>t.destroy())}function Ge(r,t,e){let o=r.limits.maxStorageBufferBindingSize;if(t>o)throw new Error(`Buffer "${e}" needs ${t} bytes, exceeding this device's maxStorageBufferBindingSize (${o} bytes). The operands are too large for this device.`)}function x(r,t,e="blas-input",o=!1){let a=t.byteLength;Ge(r,a,e);let i=o?GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC:GPUBufferUsage.STORAGE,s=r.createBuffer({label:e,size:a,usage:i,mappedAtCreation:!0}),u=t.constructor;return new u(s.getMappedRange()).set(t),s.unmap(),s}function tr(r,t,e="blas-storage",o=0){return Ge(r,t,e),r.createBuffer({label:e,size:t,usage:GPUBufferUsage.STORAGE|o})}function Br(r,t,e="blas-result"){return Ge(r,t,e),r.createBuffer({label:e,size:t,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC})}function G(r,t,e){let o=r.createBuffer({label:"blas-readback",size:e.size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});return t.copyBufferToBuffer(e,0,o,0,e.size),o}var ee=16,Ke=new WeakMap;function La(r){let t=Ke.get(r);return t||(t=r.createBuffer({label:"blas-vec4-fallback",size:ee,usage:GPUBufferUsage.STORAGE}),Ke.set(r,t)),t}function Ar(r,t){let e=t instanceof GPUBuffer?t:t.buffer,o=t instanceof GPUBuffer?0:t.offset??0,a=t instanceof GPUBuffer?t.size:t.size??e.size-o,i=Math.floor(a/ee)*ee;return i<ee?{buffer:La(r),offset:0,size:ee}:{buffer:e,offset:o,size:i}}function Ee(r,t,e,o){if(t%4!==0)return!1;let a=r instanceof GPUBuffer?r:r.buffer,i=r instanceof GPUBuffer?0:r.offset??0,s=r instanceof GPUBuffer?a.size:r.size??a.size-i,u=Math.floor(s/ee)*4;if(u<=0)return!1;let n=(Math.max(e,1)-1)*t+(Math.max(o,1)-1);return Math.floor(n/4)*4+4<=u}function I(r,t,e="blas-params"){let o=t.length*4,a=Math.ceil(o/16)*16,i=new ArrayBuffer(a),s=new DataView(i);t.forEach(({value:n,type:f},l)=>{let m=l*4;if(f==="u32")s.setUint32(m,n,!0);else if(f==="i32")s.setInt32(m,n,!0);else if(f==="f32")s.setFloat32(m,n,!0);else throw new Error(`Unknown param type "${f}". Use "f32", "u32", or "i32".`)});let u=r.createBuffer({label:e,size:a,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return r.queue.writeBuffer(u,0,i),u}async function A(r,t=Float32Array){try{await r.mapAsync(GPUMapMode.READ);let e=new t(r.getMappedRange().slice());return r.unmap(),e}finally{r.destroy()}}function rr(r){let t=r.length,e=new Float32Array(t),o=new Float32Array(t);for(let a=0;a<t;a++){let i=Math.fround(r[a]);e[a]=i,o[a]=Math.fround(r[a]-i)}return{hi:e,lo:o}}function dr(r,t){let e=r.length,o=new Float64Array(e);for(let a=0;a<e;a++)o[a]=r[a]+t[a];return o}var jr=class{constructor(t,e){this.re=t,this.im=e}},Gr=class extends Array{constructor(t){if(t===void 0){super();return}if(typeof t=="number"){super(t);for(let o=0;o<t;o++)this[o]=new jr(0,0);return}let e=Array.from(t);if(super(),e.length!==0){if(e[0]instanceof jr){for(let o of e){if(!(o instanceof jr))throw new Error("Complex64Array expects every element to be a Complex64.");this.push(o)}return}if(e.length%2!==0)throw new Error("Complex64Array expects an even number of interleaved [re, im, ...] values.");for(let o=0;o<e.length;o+=2){if(typeof e[o]!="number"||typeof e[o+1]!="number")throw new Error("Complex64Array expects interleaved [re, im, ...] values to be numbers.");this.push(new jr(e[o],e[o+1]))}}}};function te(r,t=r.length){let e=new Float32Array(t*2);for(let o=0;o<t;o++)e[o*2]=r[o].re,e[o*2+1]=r[o].im;return e}function he(r,t=r.length){let e=new Float64Array(t),o=new Float64Array(t);for(let l=0;l<t;l++)e[l]=r[l].re,o[l]=r[l].im;let{hi:a,lo:i}=rr(e),{hi:s,lo:u}=rr(o),n=new Float32Array(t*2),f=new Float32Array(t*2);for(let l=0;l<t;l++)n[l*2]=a[l],n[l*2+1]=s[l],f[l*2]=i[l],f[l*2+1]=u[l];return{hi:n,lo:f}}function be(r,t){let e=r.length/2,o=new Float32Array(e),a=new Float32Array(e),i=new Float32Array(e),s=new Float32Array(e);for(let l=0;l<e;l++)o[l]=r[l*2],i[l]=r[l*2+1],a[l]=t[l*2],s[l]=t[l*2+1];let u=dr(o,a),n=dr(i,s),f=new Gr(e);for(let l=0;l<e;l++)f[l]=new jr(u[l],n[l]);return f}var Wr=class{constructor(t,e){this.re=Math.fround(t),this.im=Math.fround(e)}},_r=class extends Array{constructor(t){if(t===void 0){super();return}if(typeof t=="number"){super(t);for(let o=0;o<t;o++)this[o]=new Wr(0,0);return}let e=Array.from(t);if(super(),e.length!==0){if(e[0]instanceof Wr){for(let o of e){if(!(o instanceof Wr))throw new Error("Complex32Array expects every element to be a Complex32.");this.push(o)}return}if(e.length%2!==0)throw new Error("Complex32Array expects an even number of interleaved [re, im, ...] values.");for(let o=0;o<e.length;o+=2){if(typeof e[o]!="number"||typeof e[o+1]!="number")throw new Error("Complex32Array expects interleaved [re, im, ...] values to be numbers.");this.push(new Wr(e[o],e[o+1]))}}}};var N=class r{constructor(t,e,o=Float32Array,a=null,i=null){this._buf=t,this._loBuf=a,this.length=e,this.dtype=o,this.device=i??re()}static from(t,e){let o=t instanceof GPUDevice,a=o?t:re(),i=o?e:t;if(i instanceof Float64Array){let{hi:u,lo:n}=rr(i),f=x(a,u,"gpu-vector-f64-hi",!0),l=x(a,n,"gpu-vector-f64-lo",!0);return new r(f,i.length,Float64Array,l,a)}if(i instanceof _r){let u=x(a,te(i),"gpu-vector-complex32",!0);return new r(u,i.length,_r,null,a)}if(i instanceof Gr){let{hi:u,lo:n}=he(i),f=x(a,u,"gpu-vector-complex64-hi",!0),l=x(a,n,"gpu-vector-complex64-lo",!0);return new r(f,i.length,Gr,l,a)}if(!(i instanceof Float32Array))throw new Error("GpuVector.from expects a Float32Array, Float64Array, Complex32Array, or Complex64Array.");let s=x(a,i,"gpu-vector",!0);return new r(s,i.length,i.constructor,null,a)}async read(){let t=this.device,e=t.createCommandEncoder(),o=G(t,e,this._buf);if(t.queue.submit([e.finish()]),this.dtype===_r)return new _r(await A(o,Float32Array));if(!this._loBuf)return A(o,this.dtype);let a=t.createCommandEncoder(),i=G(t,a,this._loBuf);t.queue.submit([a.finish()]);let[s,u]=await Promise.all([A(o,Float32Array),A(i,Float32Array)]);return this.dtype===Gr?be(s,u):dr(s,u)}destroy(){this._buf.destroy(),this._loBuf&&this._loBuf.destroy()}};var X=class r{constructor(t,e,o,a,i=null,s="row-major",u=null,n=Float32Array){this._buf=t,this._loBuf=i,this.rows=e,this.cols=o,this.lda=a,this.layout=s,this.dtype=n,this.device=u??re()}static from(t,...e){let o=t instanceof GPUDevice,a=o?t:re(),i=o?e.shift():t,[s,u,n,f="row-major"]=e;if(f!=="row-major"&&f!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");let l=f==="row-major";if(n===void 0&&(n=l?u:s),!(i instanceof Float32Array)&&!(i instanceof Float64Array)&&!(i instanceof _r)&&!(i instanceof Gr))throw new Error("GpuMatrix.from expects a Float32Array, Float64Array, Complex32Array, or Complex64Array.");if(!Number.isInteger(s)||s<=0)throw new Error("rows must be a positive integer.");if(!Number.isInteger(u)||u<=0)throw new Error("cols must be a positive integer.");let m=l?u:s;if(!Number.isInteger(n)||n<m)throw new Error(`lda must be an integer >= ${l?"cols":"rows"}.`);let p=l?s:u;if(i.length<p*n)throw new Error("data does not have enough elements for the given rows, cols, and lda.");if(i instanceof Float64Array){let g=p*n,{hi:w,lo:h}=rr(i.subarray(0,g)),b=x(a,w,"gpu-matrix-f64-hi",!0),y=x(a,h,"gpu-matrix-f64-lo",!0);return new r(b,s,u,n,y,f,a,Float64Array)}if(i instanceof _r){let g=x(a,te(i,p*n),"gpu-matrix-complex32",!0);return new r(g,s,u,n,null,f,a,_r)}if(i instanceof Gr){let{hi:g,lo:w}=he(i,p*n),h=x(a,g,"gpu-matrix-complex64-hi",!0),b=x(a,w,"gpu-matrix-complex64-lo",!0);return new r(h,s,u,n,b,f,a,Gr)}let c=x(a,i.subarray(0,p*n),"gpu-matrix",!0);return new r(c,s,u,n,null,f,a)}async read(){let t=this.device,e=t.createCommandEncoder(),o=G(t,e,this._buf);t.queue.submit([e.finish()]);let a=this.layout!=="column-major",i=a?this.rows:this.cols,s=a?this.cols:this.rows;if(this.dtype===_r){let f=new _r(await A(o,Float32Array));if(this.lda===s)return f;let l=new _r(i*s);for(let m=0;m<i;m++)for(let p=0;p<s;p++)l[m*s+p]=f[m*this.lda+p];return l}if(this._loBuf){let f=t.createCommandEncoder(),l=G(t,f,this._loBuf);t.queue.submit([f.finish()]);let[m,p]=await Promise.all([A(o,Float32Array),A(l,Float32Array)]);if(this.dtype===Gr){let w=be(m,p);if(this.lda===s)return w;let h=new Gr(i*s);for(let b=0;b<i;b++)for(let y=0;y<s;y++)h[b*s+y]=w[b*this.lda+y];return h}let c=dr(m,p);if(this.lda===s)return c;let g=new Float64Array(i*s);for(let w=0;w<i;w++)g.set(c.subarray(w*this.lda,w*this.lda+s),w*s);return g}let u=await A(o,Float32Array);if(this.lda===s)return u;let n=new Float32Array(i*s);for(let f=0;f<i;f++)n.set(u.subarray(f*this.lda,f*this.lda+s),f*s);return n}destroy(){this._buf.destroy(),this._loBuf&&this._loBuf.destroy()}};function ze(r){let t=r>>>0;return function(){t=t+1831565813|0;let e=Math.imul(t^t>>>15,1|t);return e=e+Math.imul(e^e>>>7,61|e)^e,((e^e>>>14)>>>0)/4294967296}}function Ue(r,t=-1,e=1,o){let a=new Float32Array(r),i=o===void 0?Math.random:ze(o);for(let s=0;s<r;s++)a[s]=t+i()*(e-t);return a}function Ye(r,t=-1,e=1,o){let a=new Float64Array(r),i=o===void 0?Math.random:ze(o);for(let s=0;s<r;s++)a[s]=t+i()*(e-t);return a}function Xe(r,t,e="lower",o=-1,a=1,i=5,s=15,u="row-major"){if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(u!=="row-major"&&u!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(t<r)throw new Error("lda must be >= n.");let n=u==="column-major",f=(m,p)=>n?p*t+m:m*t+p,l=new Float32Array(r*t);for(let m=0;m<r;m++){for(let p=0;p<r;p++){if(m===p)continue;(e==="lower"?p<m:p>m)&&(l[f(m,p)]=o+Math.random()*(a-o))}l[f(m,m)]=i+Math.random()*(s-i)}return l}function E(r,t,e,o=0){let a=e.map((i,s)=>({binding:o+s,resource:i instanceof GPUBuffer?{buffer:i}:i}));return r.createBindGroup({layout:t,entries:a})}function M(r,t){r.queue.submit([t.finish()])}function qr(r){let{querySet:t,passDescriptor:e}=Fe(r);return{commandEncoder:r.createCommandEncoder(),querySet:t,passDescriptor:e}}function gr(r,t,e,o,a){let i=r.beginComputePass(a);i.setPipeline(t),i.setBindGroup(0,e),typeof o=="number"?i.dispatchWorkgroups(o):i.dispatchWorkgroups(o.x,o.y,o.z??1),i.end()}function j(r,t,e,o){let{commandEncoder:a,querySet:i,passDescriptor:s}=qr(r);gr(a,t,e,o,s);let u=Lr(r,a,i);return{commandEncoder:a,ts:u}}var qi={},Ie=new WeakMap;async function D(r,t,e="main"){Ie.has(r)||Ie.set(r,new Map);let o=Ie.get(r),a=Array.isArray(t)?t:[t],i=`${a.join("+")}::${e}`;if(!o.has(i)){let s=Ri(r,a,e).catch(u=>{throw o.delete(i),u});o.set(i,s)}return o.get(i)}async function Li(r){if(typeof process>"u"||!process.versions?.node){let{shaderSources:t}=await Promise.resolve().then(()=>(Ro(),Lo)),e=t[r];if(!e)throw new Error(`Shader "${r}" not found in browser bundle.`);return e}else{let{readFileSync:t}=await import("fs"),{fileURLToPath:e}=await import("url"),{dirname:o,join:a}=await import("path"),i=o(e(qi.url));return t(a(i,`../shaders/${r}.wgsl`),"utf8")}}async function Ri(r,t,e="main"){let o=t.join("+"),a=await Promise.all(t.map(Li)),i=0,s=a.map((g,w)=>{let h=g.split(`
3459
- `).length,b={name:t[w],startLine:i+1,endLine:i+h};return i+=h,b}),u=g=>{let w=g&&s.find(h=>g>=h.startLine&&g<=h.endLine);return w?`${w.name}.wgsl:${g-w.startLine+1}`:`line ${g}`},n=a.join(`
3460
- `),f=r.createShaderModule({label:o,code:n}),m=(await f.getCompilationInfo()).messages.filter(g=>g.type==="error");if(m.length>0)throw new Error(`Shader "${o}" compilation failed:
3461
- ${m.map(g=>` ${u(g.lineNum)}: ${g.message}`).join(`
3462
- `)}`);let p=e==="main"?{module:f}:{module:f,entryPoint:e},c=r.createComputePipeline({label:o,layout:"auto",compute:p});return c._shaderModule=f,c}function cr(r,t,e){let o=r.limits.maxComputeWorkgroupsPerDimension;return e===void 0?Math.min(Math.ceil(t/64),o):{x:Math.min(Math.ceil(e/8),o),y:Math.min(Math.ceil(t/8),o)}}function U(r,t,e,o="x"){let a=r.limits.maxComputeWorkgroupsPerDimension;if(t>a)throw new Error(`${e}: this problem needs ${t} workgroups in ${o}, but the device allows ${a} (maxComputeWorkgroupsPerDimension). The operands are too large for this device \u2014 split the operation into smaller blocks.`);return t}function Zr(r,t,e,o){return o===void 0?U(r,Math.ceil(e/64),t):{x:U(r,Math.ceil(o/8),t,"x"),y:U(r,Math.ceil(e/8),t,"y")}}function q(r){if(!(r instanceof GPUDevice))throw new Error("device must be a GPUDevice.")}function T(r,t,e){for(let[o,a]of Object.entries(e))if(!(!(a instanceof N)&&!(a instanceof X))&&a.device!==r)throw new Error(`${t}: ${o} belongs to a different GPUDevice than the one passed in. GPU buffers cannot be shared across devices \u2014 recreate the operand on this device, or call the routine with the device that owns it.`)}async function qo(r,t,e,o,a){let i=o instanceof N;if(q(r),T(r,"sscal",{x:o}),!Number.isInteger(t)||!Number.isInteger(a))throw new Error("n and incx must be integers.");if(typeof e!="number")throw new Error("alpha must be a number.");if(Number.isNaN(e))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e))throw new Error("alpha must be finite.");if(a<=0)throw new Error("incx must be positive.");if(!(o instanceof Float32Array)&&!(o instanceof N))throw new Error("x must be a Float32Array or GpuVector.");if(t<=0)return i?{}:{x:o};if(o.length<(t-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");let s=await D(r,"sscal"),u=null,n=null,f=null;try{u=i?o._buf:x(r,o,"sscal-x",!0),n=I(r,[{value:t,type:"u32"},{value:e,type:"f32"},{value:a,type:"u32"}],"sscal-params");let l=E(r,s.getBindGroupLayout(0),[u,n]),{commandEncoder:m,ts:p}=j(r,s,l,cr(r,t));f=i?null:G(r,m,u),M(r,m);let c=await P(p);if(i)return c!==void 0?{gpuTimeMs:c}:{};let g=await A(f,Float32Array);return f=null,c!==void 0?{x:g,gpuTimeMs:c}:{x:g}}finally{!i&&u&&d(u),n&&d(n),f&&d(f)}}async function To(r,t,e,o,a){let i=o instanceof N;if(q(r),T(r,"cscal",{x:o}),!Number.isInteger(t)||!Number.isInteger(a))throw new Error("n and incx must be integers.");if(!(e instanceof Wr))throw new Error("alpha must be a Complex32.");if(Number.isNaN(e.re)||Number.isNaN(e.im))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e.re)||!Number.isFinite(e.im))throw new Error("alpha must be finite.");if(a<=0)throw new Error("incx must be positive.");if(!(o instanceof _r)&&!i)throw new Error("x must be a Complex32Array or GpuVector.");if(i&&o.dtype!==_r)throw new Error("x must be a Complex32Array-backed GpuVector.");if(t<=0)return i?{}:{x:o};if(o.length<(t-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");let s=await D(r,"cscal"),u=null,n=null,f=null;try{u=i?o._buf:x(r,te(o),"cscal-x",!0),n=I(r,[{value:t,type:"u32"},{value:e.re,type:"f32"},{value:e.im,type:"f32"},{value:a,type:"u32"}],"cscal-params");let l=E(r,s.getBindGroupLayout(0),[u,n]),{commandEncoder:m,ts:p}=j(r,s,l,cr(r,t));f=i?null:G(r,m,u),M(r,m);let c=await P(p);if(i)return c!==void 0?{gpuTimeMs:c}:{};let g=await A(f,Float32Array);f=null;let w=new _r(g);return c!==void 0?{x:w,gpuTimeMs:c}:{x:w}}finally{!i&&u&&d(u),n&&d(n),f&&d(f)}}async function Co(r,t,e,o,a){let i=o instanceof N;if(q(r),!Number.isInteger(t)||!Number.isInteger(a))throw new Error("n and incx must be integers.");if(typeof e!="number")throw new Error("alpha must be a number.");if(Number.isNaN(e))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e))throw new Error("alpha must be finite.");if(!(o instanceof Float64Array)&&!i)throw new Error("x must be a Float64Array or GpuVector.");if(i&&o.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(a<=0)throw new Error("incx must be positive.");if(T(r,"dscal",{x:o}),t<=0)return i?{}:{x:o};if(o.length<(t-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");let u=await D(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"dscal"]),{hi:n,lo:f}=rr(new Float64Array([e])),l=null,m=null,p=null,c=null,g=null;try{if(i)l=o._buf,m=o._loBuf;else{let{hi:k,lo:B}=rr(o);l=x(r,k,"dscal-xHi",!0),m=x(r,B,"dscal-xLo",!0)}p=I(r,[{value:t,type:"u32"},{value:n[0],type:"f32"},{value:f[0],type:"f32"},{value:a,type:"u32"}],"dscal-params");let w=E(r,u.getBindGroupLayout(0),[l,m,p]),{commandEncoder:h,ts:b}=j(r,u,w,cr(r,t));c=i?null:G(r,h,l),g=i?null:G(r,h,m),M(r,h);let y=await P(b);if(i)return y!==void 0?{gpuTimeMs:y}:{};let v=await A(c,Float32Array);c=null;let _=await A(g,Float32Array);g=null;let S=dr(v,_);return y!==void 0?{x:S,gpuTimeMs:y}:{x:S}}finally{!i&&l&&d(l),!i&&m&&d(m),p&&d(p),c&&d(c),g&&d(g)}}async function Fo(r,t,e,o,a,i){let s=e instanceof N,u=a instanceof N;if(q(r),T(r,"sswap",{x:e,y:a}),!Number.isInteger(t)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!(e instanceof Float32Array)&&!(e instanceof N))throw new Error("x must be a Float32Array or GpuVector.");if(!(a instanceof Float32Array)&&!(a instanceof N))throw new Error("y must be a Float32Array or GpuVector.");if(e.constructor!==a.constructor)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(t<=0)return s?{}:{x:e,y:a};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await D(r,"sswap"),f=null,l=null,m=null,p=null,c=null;try{f=s?e._buf:x(r,e,"sswap-x",!0),l=u?a._buf:x(r,a,"sswap-y",!0),m=I(r,[{value:t,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"sswap-params");let g=E(r,n.getBindGroupLayout(0),[f,l,m]),{commandEncoder:w,ts:h}=j(r,n,g,cr(r,t));p=s?null:G(r,w,f),c=u?null:G(r,w,l),M(r,w);let b=await P(h);if(s)return b!==void 0?{gpuTimeMs:b}:{};let y=await A(p,Float32Array);p=null;let v=await A(c,Float32Array);return c=null,b!==void 0?{x:y,y:v,gpuTimeMs:b}:{x:y,y:v}}finally{!s&&f&&d(f),!u&&l&&d(l),m&&d(m),p&&d(p),c&&d(c)}}async function jo(r,t,e,o,a,i){let s=e instanceof N,u=a instanceof N;if(q(r),T(r,"dswap",{x:e,y:a}),!Number.isInteger(t)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!(e instanceof Float64Array)&&!s)throw new Error("x must be a Float64Array or GpuVector.");if(!(a instanceof Float64Array)&&!u)throw new Error("y must be a Float64Array or GpuVector.");if(s&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(u&&a.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(s!==u)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(t<=0)return s?{}:{x:e,y:a};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await D(r,"dswap"),f=null,l=null,m=null,p=null,c=null,g=null,w=null,h=null,b=null;try{if(s)f=e._buf,l=e._loBuf,m=a._buf,p=a._loBuf;else{let W=rr(e),V=rr(a);f=x(r,W.hi,"dswap-xHi",!0),l=x(r,W.lo,"dswap-xLo",!0),m=x(r,V.hi,"dswap-yHi",!0),p=x(r,V.lo,"dswap-yLo",!0)}c=I(r,[{value:t,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"dswap-params");let y=E(r,n.getBindGroupLayout(0),[f,l,m,p,c]),{commandEncoder:v,ts:_}=j(r,n,y,cr(r,t));g=s?null:G(r,v,f),w=s?null:G(r,v,l),h=u?null:G(r,v,m),b=u?null:G(r,v,p),M(r,v);let S=await P(_);if(s)return S!==void 0?{gpuTimeMs:S}:{};let k=await A(g,Float32Array);g=null;let B=await A(w,Float32Array);w=null;let L=await A(h,Float32Array);h=null;let C=await A(b,Float32Array);b=null;let R=dr(k,B),F=dr(L,C);return S!==void 0?{x:R,y:F,gpuTimeMs:S}:{x:R,y:F}}finally{!s&&f&&d(f),!s&&l&&d(l),!u&&m&&d(m),!u&&p&&d(p),c&&d(c),g&&d(g),w&&d(w),h&&d(h),b&&d(b)}}async function Wo(r,t,e,o,a,i,s){let u=o instanceof N,n=i instanceof N;if(q(r),T(r,"saxpy",{x:o,y:i}),!Number.isInteger(t)||!Number.isInteger(a)||!Number.isInteger(s))throw new Error("n, incx, and incy must be integers.");if(typeof e!="number")throw new Error("alpha must be a number.");if(Number.isNaN(e))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e))throw new Error("alpha must be finite.");if(a<=0||s<=0)throw new Error("incx and incy must be positive.");if(!u&&!(o instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!n&&!(i instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(u!==n)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(t<=0)return n?{}:{y:i};if(o.length<(t-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(i.length<(t-1)*s+1)throw new Error("y does not have enough elements for the given n and incy.");let f=await D(r,"saxpy"),l=null,m=null,p=null,c=null;try{l=u?o._buf:x(r,o,"saxpy-x",!1),m=n?i._buf:x(r,i,"saxpy-y",!0),p=I(r,[{value:t,type:"u32"},{value:e,type:"f32"},{value:a,type:"u32"},{value:s,type:"u32"}],"saxpy-params");let g=E(r,f.getBindGroupLayout(0),[l,m,p]),{commandEncoder:w,ts:h}=j(r,f,g,cr(r,t));c=n?null:G(r,w,m),M(r,w);let b=await P(h);if(n)return b!==void 0?{gpuTimeMs:b}:{};let y=await A(c,Float32Array);return c=null,b!==void 0?{y,gpuTimeMs:b}:{y}}finally{!u&&l&&d(l),!n&&m&&d(m),p&&d(p),c&&d(c)}}async function Ho(r,t,e,o,a,i,s){let u=o instanceof N,n=i instanceof N;if(q(r),!Number.isInteger(t)||!Number.isInteger(a)||!Number.isInteger(s))throw new Error("n, incx, and incy must be integers.");if(typeof e!="number")throw new Error("alpha must be a number.");if(Number.isNaN(e))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e))throw new Error("alpha must be finite.");if(!(o instanceof Float64Array)&&!u)throw new Error("x must be a Float64Array or GpuVector.");if(!(i instanceof Float64Array)&&!n)throw new Error("y must be a Float64Array or GpuVector.");if(u&&o.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(n&&i.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(u!==n)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(a<=0||s<=0)throw new Error("incx and incy must be positive.");if(T(r,"daxpy",{x:o,y:i}),t<=0)return n?{}:{y:i};if(o.length<(t-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(i.length<(t-1)*s+1)throw new Error("y does not have enough elements for the given n and incy.");let l=await D(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"daxpy"]),{hi:m,lo:p}=rr(new Float64Array([e])),c=null,g=null,w=null,h=null,b=null,y=null,v=null;try{if(u)c=o._buf,g=o._loBuf,w=i._buf,h=i._loBuf;else{let F=rr(o),W=rr(i);c=x(r,F.hi,"daxpy-xHi",!1),g=x(r,F.lo,"daxpy-xLo",!1),w=x(r,W.hi,"daxpy-yHi",!0),h=x(r,W.lo,"daxpy-yLo",!0)}b=I(r,[{value:t,type:"u32"},{value:m[0],type:"f32"},{value:p[0],type:"f32"},{value:a,type:"u32"},{value:s,type:"u32"}],"daxpy-params");let _=E(r,l.getBindGroupLayout(0),[c,g,w,h,b]),{commandEncoder:S,ts:k}=j(r,l,_,cr(r,t));y=n?null:G(r,S,w),v=n?null:G(r,S,h),M(r,S);let B=await P(k);if(n)return B!==void 0?{gpuTimeMs:B}:{};let L=await A(y,Float32Array);y=null;let C=await A(v,Float32Array);v=null;let R=dr(L,C);return B!==void 0?{y:R,gpuTimeMs:B}:{y:R}}finally{!u&&c&&d(c),!u&&g&&d(g),!n&&w&&d(w),!n&&h&&d(h),b&&d(b),y&&d(y),v&&d(v)}}async function Oo(r,t,e,o,a,i){let s=e instanceof N,u=a instanceof N;if(q(r),T(r,"scopy",{x:e,y:a}),!Number.isInteger(t)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!s&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!u&&!(a instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(s!==u)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(t<=0)return u?{}:{y:a};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await D(r,"scopy"),f=null,l=null,m=null,p=null;try{f=s?e._buf:x(r,e,"scopy-x",!1),l=u?a._buf:x(r,a,"scopy-y",!0),m=I(r,[{value:t,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"scopy-params");let c=E(r,n.getBindGroupLayout(0),[f,l,m]),{commandEncoder:g,ts:w}=j(r,n,c,cr(r,t));p=u?null:G(r,g,l),M(r,g);let h=await P(w);if(u)return h!==void 0?{gpuTimeMs:h}:{};let b=await A(p,Float32Array);return p=null,h!==void 0?{y:b,gpuTimeMs:h}:{y:b}}finally{!s&&f&&d(f),!u&&l&&d(l),m&&d(m),p&&d(p)}}async function Vo(r,t,e,o,a,i){let s=e instanceof N,u=a instanceof N;if(q(r),T(r,"dcopy",{x:e,y:a}),!Number.isInteger(t)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!(e instanceof Float64Array)&&!s)throw new Error("x must be a Float64Array or GpuVector.");if(!(a instanceof Float64Array)&&!u)throw new Error("y must be a Float64Array or GpuVector.");if(s&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(u&&a.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(s!==u)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(t<=0)return u?{}:{y:a};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await D(r,"dcopy"),f=null,l=null,m=null,p=null,c=null,g=null,w=null;try{if(s)f=e._buf,l=e._loBuf,m=a._buf,p=a._loBuf;else{let B=rr(e),L=rr(a);f=x(r,B.hi,"dcopy-xHi",!1),l=x(r,B.lo,"dcopy-xLo",!1),m=x(r,L.hi,"dcopy-yHi",!0),p=x(r,L.lo,"dcopy-yLo",!0)}c=I(r,[{value:t,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"dcopy-params");let h=E(r,n.getBindGroupLayout(0),[f,l,m,p,c]),{commandEncoder:b,ts:y}=j(r,n,h,cr(r,t));g=u?null:G(r,b,m),w=u?null:G(r,b,p),M(r,b);let v=await P(y);if(u)return v!==void 0?{gpuTimeMs:v}:{};let _=await A(g,Float32Array);g=null;let S=await A(w,Float32Array);w=null;let k=dr(_,S);return v!==void 0?{y:k,gpuTimeMs:v}:{y:k}}finally{!s&&f&&d(f),!s&&l&&d(l),!u&&m&&d(m),!u&&p&&d(p),c&&d(c),g&&d(g),w&&d(w)}}async function Ko(r,t,e,o,a,i){let s=e instanceof N,u=a instanceof N;if(q(r),T(r,"sdot",{x:e,y:a}),!Number.isInteger(t)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!s&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!u&&!(a instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(s!==u)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(t<=0)return{dot:0};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await D(r,"sdot"),f=await D(r,"reduction/sum"),l=null,m=null,p=null,c=null,g=null,w=null;try{l=s?e._buf:x(r,e,"sdot-x",!1),m=u?a._buf:x(r,a,"sdot-y",!1),p=tr(r,512,"sdot-partials"),c=Br(r,4,"sdot-result"),g=I(r,[{value:t,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"sdot-params");let h=E(r,n.getBindGroupLayout(0),[l,m,p,g]),{commandEncoder:b,ts:y}=j(r,n,h,128);M(r,b);let v=E(r,f.getBindGroupLayout(0),[p,c]),{commandEncoder:_,ts:S}=j(r,f,v,1);w=G(r,_,c),M(r,_);let k=A(w,Float32Array);w=null;let[B,L,C]=await Promise.all([P(y),P(S),k]);return B!==void 0&&L!==void 0?{dot:C[0],gpuTimeMs:B+L}:{dot:C[0]}}finally{!s&&l&&d(l),!u&&m&&d(m),p&&d(p),c&&d(c),g&&d(g),w&&d(w)}}async function zo(r,t,e,o){let a=e instanceof N;if(q(r),T(r,"sasum",{x:e}),!Number.isInteger(t)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!a&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(t<=0)return{asum:0};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await D(r,"sasum"),s=await D(r,"reduction/sum"),u=null,n=null,f=null,l=null,m=null;try{u=a?e._buf:x(r,e,"sasum-x",!1),n=tr(r,512,"sasum-partials"),f=Br(r,4,"sasum-result"),l=I(r,[{value:t,type:"u32"},{value:o,type:"u32"}],"sasum-params");let p=E(r,i.getBindGroupLayout(0),[u,n,l]),{commandEncoder:c,ts:g}=j(r,i,p,128);M(r,c);let w=E(r,s.getBindGroupLayout(0),[n,f]),{commandEncoder:h,ts:b}=j(r,s,w,1);m=G(r,h,f),M(r,h);let y=A(m,Float32Array);m=null;let[v,_,S]=await Promise.all([P(g),P(b),y]);return v!==void 0&&_!==void 0?{asum:S[0],gpuTimeMs:v+_}:{asum:S[0]}}finally{!a&&u&&d(u),n&&d(n),f&&d(f),l&&d(l),m&&d(m)}}async function Uo(r,t,e,o){let a=e instanceof N;if(q(r),T(r,"dasum",{x:e}),!Number.isInteger(t)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!a&&!(e instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(a&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(t<=0)return{asum:0};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=["f64/dekker","f64/utils/abs","f64/utils/add"],s=await D(r,[...i,"dasum"]),u=await D(r,[...i,"reduction/sumF64"]),n=null,f=null,l=null,m=null,p=null,c=null,g=null,w=null,h=null;try{if(a)n=e._buf,f=e._loBuf;else{let{hi:z,lo:H}=rr(e.map(Math.abs));n=x(r,z,"dasum-xHi",!1),f=x(r,H,"dasum-xLo",!1)}l=tr(r,512,"dasum-partialsHi"),m=tr(r,512,"dasum-partialsLo"),p=Br(r,4,"dasum-result-hi"),c=Br(r,4,"dasum-result-lo"),g=I(r,[{value:t,type:"u32"},{value:o,type:"u32"}],"dasum-params");let b=E(r,s.getBindGroupLayout(0),[n,f,l,m,g]),{commandEncoder:y,ts:v}=j(r,s,b,128);M(r,y);let _=E(r,u.getBindGroupLayout(0),[l,m,p,c]),{commandEncoder:S,ts:k}=j(r,u,_,1);w=G(r,S,p),h=G(r,S,c),M(r,S);let B=A(w,Float32Array),L=A(h,Float32Array);w=null,h=null;let[C,R,F,W]=await Promise.all([P(v),P(k),B,L]),V=dr(F,W)[0];return C!==void 0&&R!==void 0?{asum:V,gpuTimeMs:C+R}:{asum:V}}finally{!a&&n&&d(n),!a&&f&&d(f),l&&d(l),m&&d(m),p&&d(p),c&&d(c),g&&d(g),w&&d(w),h&&d(h)}}async function Yo(r,t,e,o,a,i){let s=e instanceof N,u=a instanceof N;if(q(r),T(r,"ddot",{x:e,y:a}),!Number.isInteger(t)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!s&&!(e instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(!u&&!(a instanceof Float64Array))throw new Error("y must be a Float64Array or GpuVector.");if(s&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(u&&a.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(s!==u)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(t<=0)return{dot:0};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=["f64/dekker","f64/utils/add"],f=await D(r,[...n,"f64/utils/multiply","ddot"]),l=await D(r,[...n,"reduction/sumF64"]),m=null,p=null,c=null,g=null,w=null,h=null,b=null,y=null,v=null,_=null,S=null;try{if(s)m=e._buf,p=e._loBuf,c=a._buf,g=a._loBuf;else{let ir=rr(e),lr=rr(a);m=x(r,ir.hi,"ddot-xHi",!1),p=x(r,ir.lo,"ddot-xLo",!1),c=x(r,lr.hi,"ddot-yHi",!1),g=x(r,lr.lo,"ddot-yLo",!1)}w=tr(r,512,"ddot-partialsHi"),h=tr(r,512,"ddot-partialsLo"),b=Br(r,4,"ddot-result-hi"),y=Br(r,4,"ddot-result-lo"),v=I(r,[{value:t,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"ddot-params");let k=E(r,f.getBindGroupLayout(0),[m,p,c,g,w,h,v]),{commandEncoder:B,ts:L}=j(r,f,k,128);M(r,B);let C=E(r,l.getBindGroupLayout(0),[w,h,b,y]),{commandEncoder:R,ts:F}=j(r,l,C,1);_=G(r,R,b),S=G(r,R,y),M(r,R);let W=A(_,Float32Array),V=A(S,Float32Array);_=null,S=null;let[z,H,$,K]=await Promise.all([P(L),P(F),W,V]),Y=dr($,K)[0];return z!==void 0&&H!==void 0?{dot:Y,gpuTimeMs:z+H}:{dot:Y}}finally{!s&&m&&d(m),!s&&p&&d(p),!u&&c&&d(c),!u&&g&&d(g),w&&d(w),h&&d(h),b&&d(b),y&&d(y),v&&d(v),_&&d(_),S&&d(S)}}async function Xo(r,t,e,o){let a=e instanceof N;if(q(r),T(r,"snrm2",{x:e}),!Number.isInteger(t)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!a&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(t<=0)return{nrm2:0};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await D(r,"snrm2"),s=await D(r,"reduction/scaledSum"),u=null,n=null,f=null,l=null,m=null,p=null;try{u=a?e._buf:x(r,e,"snrm2-x",!1),n=tr(r,512,"snrm2-partials-scale"),f=tr(r,512,"snrm2-partials-ssq"),l=Br(r,4,"snrm2-result"),m=I(r,[{value:t,type:"u32"},{value:o,type:"u32"}],"snrm2-params");let c=E(r,i.getBindGroupLayout(0),[u,n,f,m]),{commandEncoder:g,ts:w}=j(r,i,c,128);M(r,g);let h=E(r,s.getBindGroupLayout(0),[n,f,l]),{commandEncoder:b,ts:y}=j(r,s,h,1);p=G(r,b,l),M(r,b);let v=A(p,Float32Array);p=null;let[_,S,k]=await Promise.all([P(w),P(y),v]),B=k[0];return _!==void 0&&S!==void 0?{nrm2:B,gpuTimeMs:_+S}:{nrm2:B}}finally{!a&&u&&d(u),n&&d(n),f&&d(f),l&&d(l),m&&d(m),p&&d(p)}}async function $o(r,t,e,o){let a=e instanceof N;if(q(r),T(r,"dnrm2",{x:e}),!Number.isInteger(t)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!a&&!(e instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(a&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(t<=0)return{nrm2:0};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=["f64/dekker","f64/utils/abs","f64/utils/greater","f64/utils/add","f64/utils/multiply","f64/utils/divide","f64/utils/sqrt"],s=await D(r,[...i,"dnrm2"]),u=await D(r,[...i,"reduction/scaledSumF64"]),n=null,f=null,l=null,m=null,p=null,c=null,g=null,w=null,h=null,b=null,y=null;try{if(a)n=e._buf,f=e._loBuf;else{let{hi:$,lo:K}=rr(e);n=x(r,$,"dnrm2-xHi",!1),f=x(r,K,"dnrm2-xLo",!1)}l=tr(r,512,"dnrm2-partials-scaleHi"),m=tr(r,512,"dnrm2-partials-scaleLo"),p=tr(r,512,"dnrm2-partials-ssqHi"),c=tr(r,512,"dnrm2-partials-ssqLo"),g=Br(r,4,"dnrm2-result-hi"),w=Br(r,4,"dnrm2-result-lo"),h=I(r,[{value:t,type:"u32"},{value:o,type:"u32"}],"dnrm2-params");let v=E(r,s.getBindGroupLayout(0),[n,f,l,m,p,c,h]),{commandEncoder:_,ts:S}=j(r,s,v,128);M(r,_);let k=E(r,u.getBindGroupLayout(0),[l,m,p,c,g,w]),{commandEncoder:B,ts:L}=j(r,u,k,1);b=G(r,B,g),y=G(r,B,w),M(r,B);let C=A(b,Float32Array),R=A(y,Float32Array);b=null,y=null;let[F,W,V,z]=await Promise.all([P(S),P(L),C,R]),H=dr(V,z)[0];return F!==void 0&&W!==void 0?{nrm2:H,gpuTimeMs:F+W}:{nrm2:H}}finally{!a&&n&&d(n),!a&&f&&d(f),l&&d(l),m&&d(m),p&&d(p),c&&d(c),g&&d(g),w&&d(w),h&&d(h),b&&d(b),y&&d(y)}}async function Zo(r,t,e,o){let a=e instanceof N;if(q(r),T(r,"isamax",{x:e}),!Number.isInteger(t)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!a&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(t<=0)return{index:0};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await D(r,"isamax"),s=await D(r,"reduction/argmax"),u=null,n=null,f=null,l=null,m=null,p=null;try{u=a?e._buf:x(r,e,"isamax-x",!1),n=tr(r,512,"isamax-partials-val"),f=tr(r,512,"isamax-partials-idx"),l=Br(r,4,"isamax-result"),m=I(r,[{value:t,type:"u32"},{value:o,type:"u32"}],"isamax-params");let c=E(r,i.getBindGroupLayout(0),[u,n,f,m]),{commandEncoder:g,ts:w}=j(r,i,c,128);M(r,g);let h=E(r,s.getBindGroupLayout(0),[n,f,l]),{commandEncoder:b,ts:y}=j(r,s,h,1);p=G(r,b,l),M(r,b);let v=A(p,Uint32Array);p=null;let[_,S,k]=await Promise.all([P(w),P(y),v]),B=k[0];return _!==void 0&&S!==void 0?{index:B,gpuTimeMs:_+S}:{index:B}}finally{!a&&u&&d(u),n&&d(n),f&&d(f),l&&d(l),m&&d(m),p&&d(p)}}async function Qo(r,t,e,o){let a=e instanceof N;if(q(r),T(r,"idamax",{x:e}),!Number.isInteger(t)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!a&&!(e instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(a&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(t<=0)return{index:0};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=["f64/dekker","f64/utils/abs","f64/utils/greater","f64/utils/equal"],s=await D(r,[...i,"idamax"],"idamax_main"),u=await D(r,[...i,"reduction/argmaxF64"],"reduce_f64"),n=null,f=null,l=null,m=null,p=null,c=null,g=null,w=null;try{if(a)n=e._buf,f=e._loBuf;else{let{hi:F,lo:W}=rr(e);n=x(r,F,"idamax-xHi",!1),f=x(r,W,"idamax-xLo",!1)}l=tr(r,512,"idamax-partials-val-hi"),m=tr(r,512,"idamax-partials-val-lo"),p=tr(r,512,"idamax-partials-idx"),c=Br(r,4,"idamax-result"),g=I(r,[{value:t,type:"u32"},{value:o,type:"u32"}],"idamax-params");let h=E(r,s.getBindGroupLayout(0),[n,f,l,m,p,g]),{commandEncoder:b,ts:y}=j(r,s,h,128);M(r,b);let v=E(r,u.getBindGroupLayout(0),[l,m,p,c]),{commandEncoder:_,ts:S}=j(r,u,v,1);w=G(r,_,c),M(r,_);let k=A(w,Uint32Array);w=null;let[B,L,C]=await Promise.all([P(y),P(S),k]),R=C[0];return B!==void 0&&L!==void 0?{index:R,gpuTimeMs:B+L}:{index:R}}finally{!a&&n&&d(n),!a&&f&&d(f),l&&d(l),m&&d(m),p&&d(p),c&&d(c),g&&d(g),w&&d(w)}}async function Jo(r,t,e,o,a,i,s,u){let n=e instanceof N,f=a instanceof N;if(q(r),T(r,"srot",{x:e,y:a}),!Number.isInteger(t)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(typeof s!="number")throw new Error("c must be a number.");if(typeof u!="number")throw new Error("s must be a number.");if(Number.isNaN(s)||Number.isNaN(u))throw new Error("c and s must not be NaN.");if(!Number.isFinite(s))throw new Error("c must be finite.");if(!Number.isFinite(u))throw new Error("s must be finite.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!n&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!f&&!(a instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(n!==f)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(t<=0)return n?{}:{x:e,y:a};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let l=await D(r,"srot"),m=null,p=null,c=null,g=null,w=null;try{m=n?e._buf:x(r,e,"srot-x",!0),p=f?a._buf:x(r,a,"srot-y",!0),c=I(r,[{value:t,type:"u32"},{value:s,type:"f32"},{value:u,type:"f32"},{value:o,type:"u32"},{value:i,type:"u32"}],"srot-params");let h=E(r,l.getBindGroupLayout(0),[m,p,c]),{commandEncoder:b,ts:y}=j(r,l,h,cr(r,t));g=n?null:G(r,b,m),w=f?null:G(r,b,p),M(r,b);let v=await P(y);if(n)return v!==void 0?{gpuTimeMs:v}:{};let _=A(g,Float32Array),S=A(w,Float32Array);g=null,w=null;let[k,B]=await Promise.all([_,S]);return v!==void 0?{x:k,y:B,gpuTimeMs:v}:{x:k,y:B}}finally{!n&&m&&d(m),!f&&p&&d(p),c&&d(c),g&&d(g),w&&d(w)}}async function ra(r,t,e,o,a,i,s,u){let n=e instanceof N,f=a instanceof N;if(q(r),T(r,"drot",{x:e,y:a}),!Number.isInteger(t)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(typeof s!="number")throw new Error("c must be a number.");if(typeof u!="number")throw new Error("s must be a number.");if(Number.isNaN(s)||Number.isNaN(u))throw new Error("c and s must not be NaN.");if(!Number.isFinite(s))throw new Error("c must be finite.");if(!Number.isFinite(u))throw new Error("s must be finite.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!(e instanceof Float64Array)&&!n)throw new Error("x must be a Float64Array or GpuVector.");if(!(a instanceof Float64Array)&&!f)throw new Error("y must be a Float64Array or GpuVector.");if(n&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(f&&a.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(n!==f)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(t<=0)return n?{}:{x:e,y:a};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let m=await D(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"drot"]),{hi:p,lo:c}=rr(new Float64Array([s])),{hi:g,lo:w}=rr(new Float64Array([u])),h=null,b=null,y=null,v=null,_=null,S=null,k=null,B=null,L=null;try{if(n)h=e._buf,b=e._loBuf,y=a._buf,v=a._loBuf;else{let ir=rr(e),lr=rr(a);h=x(r,ir.hi,"drot-xHi",!0),b=x(r,ir.lo,"drot-xLo",!0),y=x(r,lr.hi,"drot-yHi",!0),v=x(r,lr.lo,"drot-yLo",!0)}_=I(r,[{value:t,type:"u32"},{value:p[0],type:"f32"},{value:c[0],type:"f32"},{value:g[0],type:"f32"},{value:w[0],type:"f32"},{value:o,type:"u32"},{value:i,type:"u32"}],"drot-params");let C=E(r,m.getBindGroupLayout(0),[h,b,y,v,_]),{commandEncoder:R,ts:F}=j(r,m,C,cr(r,t));S=n?null:G(r,R,h),k=n?null:G(r,R,b),B=f?null:G(r,R,y),L=f?null:G(r,R,v),M(r,R);let W=await P(F);if(n)return W!==void 0?{gpuTimeMs:W}:{};let V=await A(S,Float32Array);S=null;let z=await A(k,Float32Array);k=null;let H=await A(B,Float32Array);B=null;let $=await A(L,Float32Array);L=null;let K=dr(V,z),Y=dr(H,$);return W!==void 0?{x:K,y:Y,gpuTimeMs:W}:{x:K,y:Y}}finally{!n&&h&&d(h),!n&&b&&d(b),!f&&y&&d(y),!f&&v&&d(v),_&&d(_),S&&d(S),k&&d(k),B&&d(B),L&&d(L)}}async function ea(r,t,e,o,a,i,s){let u=e instanceof N,n=a instanceof N;if(q(r),T(r,"srotm",{x:e,y:a}),!Number.isInteger(t)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(!(s instanceof Float32Array)||s.length!==5)throw new Error("param must be a Float32Array of length 5.");if(s[0]!==-2&&s[0]!==-1&&s[0]!==0&&s[0]!==1)throw new Error("param[0] (flag) must be one of -2, -1, 0, or 1.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!u&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!n&&!(a instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(u!==n)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(t<=0||s[0]===-2)return u?{}:{x:e,y:a};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let f=await D(r,"srotm"),l=null,m=null,p=null,c=null,g=null,w=null;try{l=u?e._buf:x(r,e,"srotm-x",!0),m=n?a._buf:x(r,a,"srotm-y",!0),p=x(r,s,"srotm-param",!1),c=I(r,[{value:t,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"srotm-params");let h=E(r,f.getBindGroupLayout(0),[l,m,p,c]),{commandEncoder:b,ts:y}=j(r,f,h,cr(r,t));g=u?null:G(r,b,l),w=n?null:G(r,b,m),M(r,b);let v=await P(y);if(u)return v!==void 0?{gpuTimeMs:v}:{};let _=A(g,Float32Array),S=A(w,Float32Array);g=null,w=null;let[k,B]=await Promise.all([_,S]);return v!==void 0?{x:k,y:B,gpuTimeMs:v}:{x:k,y:B}}finally{!u&&l&&d(l),!n&&m&&d(m),p&&d(p),c&&d(c),g&&d(g),w&&d(w)}}async function ta(r,t,e,o,a,i,s){let u=e instanceof N,n=a instanceof N;if(q(r),T(r,"drotm",{x:e,y:a}),!Number.isInteger(t)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(!(s instanceof Float64Array)||s.length!==5)throw new Error("param must be a Float64Array of length 5.");if(s[0]!==-2&&s[0]!==-1&&s[0]!==0&&s[0]!==1)throw new Error("param[0] (flag) must be one of -2, -1, 0, or 1.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!(e instanceof Float64Array)&&!u)throw new Error("x must be a Float64Array or GpuVector.");if(!(a instanceof Float64Array)&&!n)throw new Error("y must be a Float64Array or GpuVector.");if(u&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(n&&a.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(u!==n)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(t<=0||s[0]===-2)return u?{}:{x:e,y:a};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let l=await D(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"drotm"]),{hi:m,lo:p}=rr(s),c=null,g=null,w=null,h=null,b=null,y=null,v=null,_=null,S=null,k=null,B=null;try{if(u)c=e._buf,g=e._loBuf,w=a._buf,h=a._loBuf;else{let Y=rr(e),ir=rr(a);c=x(r,Y.hi,"drotm-xHi",!0),g=x(r,Y.lo,"drotm-xLo",!0),w=x(r,ir.hi,"drotm-yHi",!0),h=x(r,ir.lo,"drotm-yLo",!0)}b=x(r,m,"drotm-paramHi",!1),y=x(r,p,"drotm-paramLo",!1),v=I(r,[{value:t,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"drotm-params");let L=E(r,l.getBindGroupLayout(0),[c,g,w,h,b,y,v]),{commandEncoder:C,ts:R}=j(r,l,L,cr(r,t));_=u?null:G(r,C,c),S=u?null:G(r,C,g),k=n?null:G(r,C,w),B=n?null:G(r,C,h),M(r,C);let F=await P(R);if(u)return F!==void 0?{gpuTimeMs:F}:{};let W=await A(_,Float32Array);_=null;let V=await A(S,Float32Array);S=null;let z=await A(k,Float32Array);k=null;let H=await A(B,Float32Array);B=null;let $=dr(W,V),K=dr(z,H);return F!==void 0?{x:$,y:K,gpuTimeMs:F}:{x:$,y:K}}finally{!u&&c&&d(c),!u&&g&&d(g),!n&&w&&d(w),!n&&h&&d(h),b&&d(b),y&&d(y),v&&d(v),_&&d(_),S&&d(S),k&&d(k),B&&d(B)}}async function oa(r,t,e,o,a,i,s,u,n,f,l,m,p="row-major"){let c=i instanceof X,g=u instanceof N,w=l instanceof N;if(q(r),T(r,"sgemv",{A:i,x:u,y:l}),t!=="no-transpose"&&t!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(p!=="row-major"&&p!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof a!="number")throw new Error("alpha must be a number.");if(Number.isNaN(a))throw new Error("alpha must not be NaN.");if(!Number.isFinite(a))throw new Error("alpha must be finite.");if(typeof f!="number")throw new Error("beta must be a number.");if(Number.isNaN(f))throw new Error("beta must not be NaN.");if(!Number.isFinite(f))throw new Error("beta must be finite.");if(!Number.isInteger(e)||!Number.isInteger(o)||!Number.isInteger(n)||!Number.isInteger(m)||!Number.isInteger(s))throw new Error("m, n, incx, incy, and lda must be integers.");if(n<=0||m<=0)throw new Error("incx and incy must be positive.");if(!c&&!(i instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!g&&!(u instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!w&&!(l instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(g!==w)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(g&&!c)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(c&&!g)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(g&&u._buf===l._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(c&&w&&i._buf===l._buf)throw new Error("A and y must not reference the same GPU buffer.");if(c&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(i.rows<e||i.cols<o))throw new Error("A is too small for the given m and n.");if(e<0||o<0)throw new Error("m and n must be non-negative.");if(e===0||o===0)return w?{}:{y:l};(c?i.layout:p)==="column-major"&&([e,o]=[o,e],t=t==="no-transpose"?"transpose":"no-transpose");let b=t==="no-transpose",y=b?o:e,v=b?e:o;if(s<o)throw new Error("lda must be >= n.");if(!c&&i.length<(e-1)*s+o)throw new Error("A does not have enough elements for the given m, n, and lda.");if(u.length<(y-1)*n+1)throw new Error("x does not have enough elements for the given dimensions and incx.");if(l.length<(v-1)*m+1)throw new Error("y does not have enough elements for the given dimensions and incy.");let S=await D(r,b?"sgemv_n":"sgemv_t"),k=null,B=null,L=null,C=null;try{k=c?i._buf:x(r,i,"sgemv-A",!1),B=g?u._buf:x(r,u,"sgemv-x",!1),L=w?l._buf:x(r,l,"sgemv-y",!0),C=I(r,[{value:e,type:"u32"},{value:o,type:"u32"},{value:a,type:"f32"},{value:f,type:"f32"},{value:n,type:"u32"},{value:m,type:"u32"},{value:s,type:"u32"}],"sgemv-params");let R=E(r,S.getBindGroupLayout(0),[k,B,L,C]),F=b?Math.min(e,r.limits.maxComputeWorkgroupsPerDimension):Zr(r,"sgemv",v),{commandEncoder:W,ts:V}=j(r,S,R,F),z=w?null:G(r,W,L);M(r,W);let H=await P(V);if(w)return H!==void 0?{gpuTimeMs:H}:{};let $=await A(z,Float32Array);return H!==void 0?{y:$,gpuTimeMs:H}:{y:$}}finally{!c&&k&&d(k),!g&&B&&d(B),!w&&L&&d(L),C&&d(C)}}async function aa(r,t,e,o,a,i,s,u,n,f,l,m="row-major"){let p=s instanceof N,c=f instanceof N,g=a instanceof X;if(q(r),T(r,"ssymv",{A:a,x:s,y:f}),t!=="lower"&&t!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(m!=="row-major"&&m!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(e)||!Number.isInteger(u)||!Number.isInteger(l)||!Number.isInteger(i))throw new Error("n, incx, incy, and lda must be integers.");if(typeof o!="number")throw new Error("alpha must be a number.");if(Number.isNaN(o))throw new Error("alpha must not be NaN.");if(!Number.isFinite(o))throw new Error("alpha must be finite.");if(typeof n!="number")throw new Error("beta must be a number.");if(Number.isNaN(n))throw new Error("beta must not be NaN.");if(!Number.isFinite(n))throw new Error("beta must be finite.");if(u<=0||l<=0)throw new Error("incx and incy must be positive.");if(i<e)throw new Error("lda must be >= n.");if(!g&&!(a instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!p&&!(s instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!c&&!(f instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(p!==c)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(p&&!g)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(g&&!p)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(p&&s._buf===f._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(g&&i!==a.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(g&&(a.rows<e||a.cols<e))throw new Error("A is too small for the given n.");if(e<0)throw new Error("n must be non-negative.");if(e===0)return c?{}:{y:f};if(!g&&a.length<(e-1)*i+e)throw new Error("A does not have enough elements for the given n and lda.");if(s.length<(e-1)*u+1)throw new Error("x does not have enough elements for the given n and incx.");if(f.length<(e-1)*l+1)throw new Error("y does not have enough elements for the given n and incy.");let h=(g?a.layout:m)==="column-major"?t==="upper":t==="lower",b=await D(r,"ssymv"),y=null,v=null,_=null,S=null;try{y=g?a._buf:x(r,a,"ssymv-A",!1),v=p?s._buf:x(r,s,"ssymv-x",!1),_=c?f._buf:x(r,f,"ssymv-y",!0),S=I(r,[{value:e,type:"u32"},{value:o,type:"f32"},{value:n,type:"f32"},{value:u,type:"u32"},{value:l,type:"u32"},{value:i,type:"u32"},{value:h?0:1,type:"u32"}],"ssymv-params");let k=E(r,b.getBindGroupLayout(0),[y,v,_,S]),B=Math.min(e,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:L,ts:C}=j(r,b,k,B),R=c?null:G(r,L,_);M(r,L);let F=await P(C);if(c)return F!==void 0?{gpuTimeMs:F}:{};let W=await A(R,Float32Array);return F!==void 0?{y:W,gpuTimeMs:F}:{y:W}}finally{!g&&y&&d(y),!p&&v&&d(v),!c&&_&&d(_),S&&d(S)}}async function ia(r,t,e,o,a,i,s,u,n,f,l,m="row-major"){let p=u instanceof N,c=f instanceof N,g=i instanceof X,w=o==="unit";if(q(r),T(r,"strmv",{A:i,x:u,y:f}),t!=="lower"&&t!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(!w&&o!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(m!=="row-major"&&m!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(a)||!Number.isInteger(n)||!Number.isInteger(l)||!Number.isInteger(s))throw new Error("n, incx, incy, and lda must be integers.");if(n<=0||l<=0)throw new Error("incx and incy must be positive.");if(s<a)throw new Error("lda must be >= n.");if(!g&&!(i instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!p&&!(u instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!c&&!(f instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(p!==c)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(p&&u._buf===f._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(p&&!g)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(g&&!p)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(g&&c&&i._buf===f._buf)throw new Error("A and y must not reference the same GPU buffer.");if(g&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(g&&(i.rows<a||i.cols<a))throw new Error("A is too small for the given n.");if(a<0)throw new Error("n must be non-negative.");if(a===0)return c?{}:{y:f};if(!g&&i.length<(a-1)*s+a)throw new Error("A does not have enough elements for the given n and lda.");if(u.length<(a-1)*n+1)throw new Error("x does not have enough elements for the given n and incx.");if(f.length<(a-1)*l+1)throw new Error("y does not have enough elements for the given n and incy.");let b=(g?i.layout:m)==="column-major",y=b?t==="upper":t==="lower",v=b?e==="transpose":e==="no-transpose",_=await D(r,"strmv"),S=null,k=null,B=null,L=null;try{S=g?i._buf:x(r,i,"strmv-A",!1),k=p?u._buf:x(r,u,"strmv-x",!1),B=c?f._buf:x(r,f,"strmv-y",!0),L=I(r,[{value:a,type:"u32"},{value:n,type:"u32"},{value:l,type:"u32"},{value:s,type:"u32"},{value:v?0:1,type:"u32"},{value:y?0:1,type:"u32"},{value:w?1:0,type:"u32"}],"strmv-params");let C=E(r,_.getBindGroupLayout(0),[S,k,B,L]),R=Math.min(a,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:F,ts:W}=j(r,_,C,R),V=c?null:G(r,F,B);M(r,F);let z=await P(W);if(c)return z!==void 0?{gpuTimeMs:z}:{};let H=await A(V,Float32Array);return z!==void 0?{y:H,gpuTimeMs:z}:{y:H}}finally{!g&&S&&d(S),!p&&k&&d(k),!c&&B&&d(B),L&&d(L)}}function sa(r,t,e){let o=new ArrayBuffer(r*t),a=new DataView(o);for(let i=0;i<r;i++){let s=e(i),u=i*t;s.forEach((n,f)=>a.setUint32(u+f*4,n,!0))}return o}function na(r,t,e){let o=r.createBuffer({label:e,size:t.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return r.queue.writeBuffer(o,0,t),o}async function la(r,t,e,o,a,i,s,u,n,f="row-major"){let l=u instanceof N,m=i instanceof X,p=o==="unit";if(q(r),T(r,"strsv",{A:i,x:u}),t!=="lower"&&t!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(!p&&o!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(f!=="row-major"&&f!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(a)||!Number.isInteger(n)||!Number.isInteger(s))throw new Error("n, incx, and lda must be integers.");if(n<=0)throw new Error("incx must be positive.");if(s<a)throw new Error("lda must be >= n.");if(!m&&!(i instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!l&&!(u instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(l&&!m)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(m&&!l)throw new Error("x must be a GpuVector when A is a GpuMatrix.");if(m&&l&&i._buf===u._buf)throw new Error("A and x must not reference the same GPU buffer.");if(m&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(m&&(i.rows<a||i.cols<a))throw new Error("A is too small for the given n.");if(a<0)throw new Error("n must be non-negative.");if(a===0)return l?{}:{x:u};if(!m&&i.length<(a-1)*s+a)throw new Error("A does not have enough elements for the given n and lda.");if(u.length<(a-1)*n+1)throw new Error("x does not have enough elements for the given n and incx.");let g=(m?i.layout:f)==="column-major",w=g?t==="upper":t==="lower",h=g?e==="transpose":e==="no-transpose",b=await D(r,"strsv_invert_block"),y=await D(r,"strsv_apply_inverse"),v=await D(r,"strsv_update"),_=h===w,S=[];for(let H=0;H<a;H+=64)S.push(H);_||S.reverse();let k=S.length,B=r.limits.maxComputeWorkgroupsPerDimension,L=r.limits.minUniformBufferOffsetAlignment,C=null,R=null,F=null,W=null,V=null,z=null;try{C=m?i._buf:x(r,i,"strsv-A",!1),R=l?u._buf:x(r,u,"strsv-x",!0),F=tr(r,k*64*64*4,"strsv-Ainv");let H=sa(k,L,er=>{let Z=er*64,J=Math.min(Z+64,a);return[n,er,Z,J]});W=na(r,H,"strsv-apply-params");let $=sa(k,L,er=>{let Z=er*64,J=Math.min(Z+64,a);return[a,n,s,h?0:1,w?0:1,Z,J]});V=na(r,$,"strsv-update-params");let{commandEncoder:K,querySet:Y}=qr(r);z=I(r,[{value:a,type:"u32"},{value:s,type:"u32"},{value:h?0:1,type:"u32"},{value:w?0:1,type:"u32"},{value:p?1:0,type:"u32"}],"strsv-invert-params");let ir=E(r,b.getBindGroupLayout(0),[C,F,z]);gr(K,b,ir,{x:64,y:k},Y?{timestampWrites:{querySet:Y,beginningOfPassWriteIndex:0}}:void 0);for(let er=0;er<S.length;er++){let Z=S[er],J=Math.min(Z+64,a),sr=Z/64,pr=er===S.length-1,br=sr*L,fr=E(r,y.getBindGroupLayout(0),[F,R,{buffer:W,offset:br,size:16}]);gr(K,y,fr,1,pr&&Y?{timestampWrites:{querySet:Y,endOfPassWriteIndex:1}}:void 0);let yr=_?a-J:Z;if(yr===0)continue;let Cr=E(r,v.getBindGroupLayout(0),[C,R,{buffer:V,offset:br,size:32}]),Rr=Math.min(yr,B);gr(K,v,Cr,Rr)}let hr=Lr(r,K,Y),nr=l?null:G(r,K,R);M(r,K);let mr=await P(hr);if(l)return mr!==void 0?{gpuTimeMs:mr}:{};let Q=await A(nr,Float32Array);return mr!==void 0?{x:Q,gpuTimeMs:mr}:{x:Q}}finally{!m&&C&&d(C),!l&&R&&d(R),F&&d(F),W&&d(W),V&&d(V),z&&d(z)}}async function ua(r,t,e,o,a,i,s,u,n,f,l="row-major"){let m=n instanceof X;if(q(r),T(r,"sger",{A:n,x:a,y:s}),l!=="row-major"&&l!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof o!="number")throw new Error("alpha must be a number.");if(Number.isNaN(o))throw new Error("alpha must not be NaN.");if(!Number.isFinite(o))throw new Error("alpha must be finite.");if(!Number.isInteger(t)||!Number.isInteger(e)||!Number.isInteger(i)||!Number.isInteger(u)||!Number.isInteger(f))throw new Error("m, n, incx, incy, and lda must be integers.");if(i<=0||u<=0)throw new Error("incx and incy must be positive.");if(!m&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(m&&f!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(m&&(n.rows<t||n.cols<e))throw new Error("A is too small for the given m and n.");(m?n.layout:l)==="column-major"&&([t,e]=[e,t],[a,s]=[s,a],[i,u]=[u,i]);let c=a instanceof N,g=s instanceof N;if(f<e)throw new Error("lda must be >= n.");if(!c&&!(a instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!g&&!(s instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(c!==g)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(c&&!m)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(m&&!c)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(m&&c&&n._buf===a._buf)throw new Error("A and x must not reference the same GPU buffer.");if(m&&g&&n._buf===s._buf)throw new Error("A and y must not reference the same GPU buffer.");if(t<0||e<0)throw new Error("m and n must be non-negative.");if(t===0||e===0)return m?{}:{A:n};if(!m&&n.length<(t-1)*f+e)throw new Error("A does not have enough elements for the given m, n, and lda.");if(a.length<(t-1)*i+1)throw new Error("x does not have enough elements for the given m and incx.");if(s.length<(e-1)*u+1)throw new Error("y does not have enough elements for the given n and incy.");let w=await D(r,"sger"),h=null,b=null,y=null,v=null;try{h=c?a._buf:x(r,a,"sger-x",!1),b=g?s._buf:x(r,s,"sger-y",!1),y=m?n._buf:x(r,n,"sger-A",!0),v=I(r,[{value:t,type:"u32"},{value:e,type:"u32"},{value:o,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:f,type:"u32"}],"sger-params");let _=E(r,w.getBindGroupLayout(0),[h,b,y,v]),S=Math.min(t,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:k,ts:B}=j(r,w,_,S),L=m?null:G(r,k,y);M(r,k);let C=await P(B);if(m)return C!==void 0?{gpuTimeMs:C}:{};let R=await A(L,Float32Array);return C!==void 0?{A:R,gpuTimeMs:C}:{A:R}}finally{!c&&h&&d(h),!g&&b&&d(b),!m&&y&&d(y),v&&d(v)}}async function fa(r,t,e,o,a,i,s,u,n="row-major"){let f=a instanceof N,l=s instanceof X;if(q(r),T(r,"ssyr",{A:s,x:a}),t!=="lower"&&t!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(n!=="row-major"&&n!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(e)||!Number.isInteger(i)||!Number.isInteger(u))throw new Error("n, incx, and lda must be integers.");if(typeof o!="number")throw new Error("alpha must be a number.");if(Number.isNaN(o))throw new Error("alpha must not be NaN.");if(!Number.isFinite(o))throw new Error("alpha must be finite.");if(i<=0)throw new Error("incx must be positive.");if(u<e)throw new Error("lda must be >= n.");if(!l&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!f&&!(a instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(f&&!l)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(l&&!f)throw new Error("x must be a GpuVector when A is a GpuMatrix.");if(l&&f&&s._buf===a._buf)throw new Error("A and x must not reference the same GPU buffer.");if(l&&u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(l&&(s.rows<e||s.cols<e))throw new Error("A is too small for the given n.");if(e<0)throw new Error("n must be non-negative.");if(e===0)return l?{}:{A:s};if(!l&&s.length<(e-1)*u+e)throw new Error("A does not have enough elements for the given n and lda.");if(a.length<(e-1)*i+1)throw new Error("x does not have enough elements for the given n and incx.");let p=(l?s.layout:n)==="column-major"?t==="upper":t==="lower",c=await D(r,"ssyr"),g=null,w=null,h=null;try{g=f?a._buf:x(r,a,"ssyr-x",!1),w=l?s._buf:x(r,s,"ssyr-A",!0),h=I(r,[{value:e,type:"u32"},{value:o,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:p?0:1,type:"u32"}],"ssyr-params");let b=E(r,c.getBindGroupLayout(0),[g,w,h]),y=Math.min(e,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:v,ts:_}=j(r,c,b,y),S=l?null:G(r,v,w);M(r,v);let k=await P(_);if(l)return k!==void 0?{gpuTimeMs:k}:{};let B=await A(S,Float32Array);return k!==void 0?{A:B,gpuTimeMs:k}:{A:B}}finally{!f&&g&&d(g),!l&&w&&d(w),h&&d(h)}}async function ma(r,t,e,o,a,i,s,u,n,f,l="row-major"){let m=a instanceof N,p=s instanceof N,c=n instanceof X;if(q(r),T(r,"ssyr2",{A:n,x:a,y:s}),t!=="lower"&&t!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(l!=="row-major"&&l!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(e)||!Number.isInteger(i)||!Number.isInteger(u)||!Number.isInteger(f))throw new Error("n, incx, incy, and lda must be integers.");if(typeof o!="number")throw new Error("alpha must be a number.");if(Number.isNaN(o))throw new Error("alpha must not be NaN.");if(!Number.isFinite(o))throw new Error("alpha must be finite.");if(i<=0||u<=0)throw new Error("incx and incy must be positive.");if(f<e)throw new Error("lda must be >= n.");if(!c&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!m&&!(a instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!p&&!(s instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(m!==p)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(m&&!c)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(c&&!m)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(c&&m&&n._buf===a._buf)throw new Error("A and x must not reference the same GPU buffer.");if(c&&p&&n._buf===s._buf)throw new Error("A and y must not reference the same GPU buffer.");if(m&&a._buf===s._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(c&&f!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(n.rows<e||n.cols<e))throw new Error("A is too small for the given n.");if(e<0)throw new Error("n must be non-negative.");if(e===0)return c?{}:{A:n};if(!c&&n.length<(e-1)*f+e)throw new Error("A does not have enough elements for the given n and lda.");if(a.length<(e-1)*i+1)throw new Error("x does not have enough elements for the given n and incx.");if(s.length<(e-1)*u+1)throw new Error("y does not have enough elements for the given n and incy.");let w=(c?n.layout:l)==="column-major"?t==="upper":t==="lower",h=await D(r,"ssyr2"),b=null,y=null,v=null,_=null;try{b=m?a._buf:x(r,a,"ssyr2-x",!1),y=p?s._buf:x(r,s,"ssyr2-y",!1),v=c?n._buf:x(r,n,"ssyr2-A",!0),_=I(r,[{value:e,type:"u32"},{value:o,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:f,type:"u32"},{value:w?0:1,type:"u32"}],"ssyr2-params");let S=E(r,h.getBindGroupLayout(0),[b,y,v,_]),k=Math.min(e,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:B,ts:L}=j(r,h,S,k),C=c?null:G(r,B,v);M(r,B);let R=await P(L);if(c)return R!==void 0?{gpuTimeMs:R}:{};let F=await A(C,Float32Array);return R!==void 0?{A:F,gpuTimeMs:R}:{A:F}}finally{!m&&b&&d(b),!p&&y&&d(y),!c&&v&&d(v),_&&d(_)}}async function da(r,t,e,o,a,i,s,u,n,f,l,m,p,c,g="row-major"){let w=u instanceof X,h=f instanceof X,b=p instanceof X;if(q(r),T(r,"sgemm",{A:u,B:f,C:p}),t!=="no-transpose"&&t!=="transpose")throw new Error("transA must be 'no-transpose' or 'transpose'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("transB must be 'no-transpose' or 'transpose'.");if(g!=="row-major"&&g!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof s!="number")throw new Error("alpha must be a number.");if(Number.isNaN(s))throw new Error("alpha must not be NaN.");if(!Number.isFinite(s))throw new Error("alpha must be finite.");if(typeof m!="number")throw new Error("beta must be a number.");if(Number.isNaN(m))throw new Error("beta must not be NaN.");if(!Number.isFinite(m))throw new Error("beta must be finite.");if(!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(i)||!Number.isInteger(n)||!Number.isInteger(l)||!Number.isInteger(c))throw new Error("m, n, k, lda, ldb, and ldc must be integers.");if(!w&&!(u instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!h&&!(f instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(!b&&!(p instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if((w||h)&&!b)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(b&&(!w||!h))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(o<0||a<0||i<0)throw new Error("m, n, and k must be non-negative.");if(n<=0||l<=0||c<=0)throw new Error("lda, ldb, and ldc must be positive.");if(o===0||a===0)return b?{}:{C:p};let y=w?u.layout:g,v=h?f.layout:g,_=b?p.layout:g,S=y==="column-major"?i:o,k=y==="column-major"?o:i,B=t==="no-transpose"?S:k,L=t==="no-transpose"?k:S;if(n<L)throw new Error(`lda must be >= ${y==="column-major"?"rows":"cols"} of A as stored.`);if(w){if(n!==u.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[J,sr]=t==="no-transpose"?[o,i]:[i,o];if(u.rows<J||u.cols<sr)throw new Error("A is too small for the given m, k, and transA.")}else if(u.length<(B-1)*n+L)throw new Error("A does not have enough elements for the given dimensions and lda.");let C=v==="column-major"?a:i,R=v==="column-major"?i:a,F=e==="no-transpose"?C:R,W=e==="no-transpose"?R:C;if(l<W)throw new Error(`ldb must be >= ${v==="column-major"?"rows":"cols"} of B as stored.`);if(h){if(l!==f.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");let[J,sr]=e==="no-transpose"?[i,a]:[a,i];if(f.rows<J||f.cols<sr)throw new Error("B is too small for the given n, k, and transB.")}else if(f.length<(F-1)*l+W)throw new Error("B does not have enough elements for the given dimensions and ldb.");let V=_==="column-major"?a:o,z=_==="column-major"?o:a;if(c<z)throw new Error(`ldc must be >= ${_==="column-major"?"rows":"cols"} of C as stored.`);if(b){if(c!==p.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(p.rows<o||p.cols<a)throw new Error("C is too small for the given m and n.")}else if(p.length<(V-1)*c+z)throw new Error("C does not have enough elements for the given dimensions and ldc.");y==="column-major"&&(t=t==="no-transpose"?"transpose":"no-transpose"),v==="column-major"&&(e=e==="no-transpose"?"transpose":"no-transpose"),_==="column-major"&&([u,f]=[f,u],[w,h]=[h,w],[n,l]=[l,n],[t,e]=[e==="no-transpose"?"transpose":"no-transpose",t==="no-transpose"?"transpose":"no-transpose"],[o,a]=[a,o]);let H=Math.ceil(a/64),$=Math.ceil(o/64),K=H*$>=36,Y=await D(r,K?"sgemm_large":"sgemm_small"),ir=w?u._buf:x(r,u,"sgemm-A",!1),lr=h?f._buf:x(r,f,"sgemm-B",!1),hr=b?p._buf:x(r,p,"sgemm-C",!0),nr=t==="no-transpose",mr=e==="no-transpose",Q=nr&&Ee(ir,n,o,i),er=Ee(lr,l,mr?i:a,mr?a:i),Z=I(r,[{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"u32"},{value:s,type:"f32"},{value:m,type:"f32"},{value:n,type:"u32"},{value:l,type:"u32"},{value:c,type:"u32"},{value:t==="transpose"?1:0,type:"u32"},{value:e==="transpose"?1:0,type:"u32"},{value:Q?1:0,type:"u32"},{value:er?1:0,type:"u32"}],"sgemm-params");try{let J=E(r,Y.getBindGroupLayout(0),[ir,Ar(r,ir),lr,Ar(r,lr),hr,Z]),sr=K?{x:U(r,H,"sgemm","x"),y:U(r,$,"sgemm","y")}:{x:U(r,Math.ceil(a/32),"sgemm","x"),y:U(r,Math.ceil(o/32),"sgemm","y")},{commandEncoder:pr,ts:br}=j(r,Y,J,sr),fr=b?null:G(r,pr,hr);M(r,pr);let ur=await P(br);if(b)return ur!==void 0?{gpuTimeMs:ur}:{};let yr=await A(fr,Float32Array);return ur!==void 0?{C:yr,gpuTimeMs:ur}:{C:yr}}finally{w||d(ir),h||d(lr),b||d(hr),d(Z)}}async function ca(r,t,e,o,a,i,s,u,n,f,l,m,p,c,g,w="row-major"){let h=n instanceof X,b=l instanceof X,y=c instanceof X;if(q(r),T(r,"sgemmtr",{A:n,B:l,C:c}),t!=="lower"&&t!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("transA must be 'no-transpose' or 'transpose'.");if(o!=="no-transpose"&&o!=="transpose")throw new Error("transB must be 'no-transpose' or 'transpose'.");if(w!=="row-major"&&w!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof u!="number")throw new Error("alpha must be a number.");if(Number.isNaN(u))throw new Error("alpha must not be NaN.");if(!Number.isFinite(u))throw new Error("alpha must be finite.");if(typeof p!="number")throw new Error("beta must be a number.");if(Number.isNaN(p))throw new Error("beta must not be NaN.");if(!Number.isFinite(p))throw new Error("beta must be finite.");if(!Number.isInteger(a)||!Number.isInteger(i)||!Number.isInteger(s)||!Number.isInteger(f)||!Number.isInteger(m)||!Number.isInteger(g))throw new Error("m, n, k, lda, ldb, and ldc must be integers.");if(!h&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!b&&!(l instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(!y&&!(c instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if((h||b)&&!y)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(y&&(!h||!b))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(a<0||i<0||s<0)throw new Error("m, n, and k must be non-negative.");if(f<=0||m<=0||g<=0)throw new Error("lda, ldb, and ldc must be positive.");if(a===0||i===0)return y?{}:{C:c};let v=h?n.layout:w,_=b?l.layout:w,S=y?c.layout:w,k=v==="column-major"?s:a,B=v==="column-major"?a:s,L=e==="no-transpose"?k:B,C=e==="no-transpose"?B:k;if(f<C)throw new Error(`lda must be >= ${v==="column-major"?"rows":"cols"} of A as stored.`);if(h){if(f!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[Q,er]=e==="no-transpose"?[a,s]:[s,a];if(n.rows<Q||n.cols<er)throw new Error("A is too small for the given m, k, and transA.")}else if(n.length<(L-1)*f+C)throw new Error("A does not have enough elements for the given dimensions and lda.");let R=_==="column-major"?i:s,F=_==="column-major"?s:i,W=o==="no-transpose"?R:F,V=o==="no-transpose"?F:R;if(m<V)throw new Error(`ldb must be >= ${_==="column-major"?"rows":"cols"} of B as stored.`);if(b){if(m!==l.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");let[Q,er]=o==="no-transpose"?[s,i]:[i,s];if(l.rows<Q||l.cols<er)throw new Error("B is too small for the given n, k, and transB.")}else if(l.length<(W-1)*m+V)throw new Error("B does not have enough elements for the given dimensions and ldb.");let z=S==="column-major"?i:a,H=S==="column-major"?a:i;if(g<H)throw new Error(`ldc must be >= ${S==="column-major"?"rows":"cols"} of C as stored.`);if(y){if(g!==c.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(c.rows<a||c.cols<i)throw new Error("C is too small for the given m and n.")}else if(c.length<(z-1)*g+H)throw new Error("C does not have enough elements for the given dimensions and ldc.");v==="column-major"&&(e=e==="no-transpose"?"transpose":"no-transpose"),_==="column-major"&&(o=o==="no-transpose"?"transpose":"no-transpose"),S==="column-major"&&([n,l]=[l,n],[h,b]=[b,h],[f,m]=[m,f],[e,o]=[o==="no-transpose"?"transpose":"no-transpose",e==="no-transpose"?"transpose":"no-transpose"],[a,i]=[i,a],t=t==="lower"?"upper":"lower");let $=Math.ceil(i/64),K=Math.ceil(a/64),Y=$*K>=36,ir=await D(r,Y?"sgemmtr_large":"sgemmtr_small"),lr=h?n._buf:x(r,n,"sgemmtr-A",!1),hr=b?l._buf:x(r,l,"sgemmtr-B",!1),nr=y?c._buf:x(r,c,"sgemmtr-C",!0),mr=I(r,[{value:a,type:"u32"},{value:i,type:"u32"},{value:s,type:"u32"},{value:u,type:"f32"},{value:p,type:"f32"},{value:f,type:"u32"},{value:m,type:"u32"},{value:g,type:"u32"},{value:e==="transpose"?1:0,type:"u32"},{value:o==="transpose"?1:0,type:"u32"},{value:t==="upper"?1:0,type:"u32"}],"sgemmtr-params");try{let Q=E(r,ir.getBindGroupLayout(0),[lr,hr,nr,mr]),er=Y?{x:U(r,$,"sgemmtr","x"),y:U(r,K,"sgemmtr","y")}:{x:U(r,Math.ceil(i/32),"sgemmtr","x"),y:U(r,Math.ceil(a/32),"sgemmtr","y")},{commandEncoder:Z,ts:J}=j(r,ir,Q,er),sr=y?null:G(r,Z,nr);M(r,Z);let pr=await P(J);if(y)return pr!==void 0?{gpuTimeMs:pr}:{};let br=await A(sr,Float32Array);return pr!==void 0?{C:br,gpuTimeMs:pr}:{C:br}}finally{h||d(lr),b||d(hr),y||d(nr),d(mr)}}async function pa(r,t,e,o,a,i,s,u,n,f,l,m="row-major"){let p=s instanceof X,c=f instanceof X;if(q(r),T(r,"ssyrk",{A:s,C:f}),t!=="lower"&&t!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(m!=="row-major"&&m!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof i!="number")throw new Error("alpha must be a number.");if(Number.isNaN(i))throw new Error("alpha must not be NaN.");if(!Number.isFinite(i))throw new Error("alpha must be finite.");if(typeof n!="number")throw new Error("beta must be a number.");if(Number.isNaN(n))throw new Error("beta must not be NaN.");if(!Number.isFinite(n))throw new Error("beta must be finite.");if(!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(u)||!Number.isInteger(l))throw new Error("n, k, lda, and ldc must be integers.");if(!p&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!c&&!(f instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if(p&&!c)throw new Error("C must be a GpuMatrix when A is a GpuMatrix.");if(c&&!p)throw new Error("A must be a GpuMatrix when C is a GpuMatrix.");if(o<0||a<0)throw new Error("n and k must be non-negative.");if(u<=0||l<=0)throw new Error("lda and ldc must be positive.");if(o===0)return c?{}:{C:f};let g=p?s.layout:m,w=c?f.layout:m,h=g==="column-major"?a:o,b=g==="column-major"?o:a,y=e==="no-transpose"?h:b,v=e==="no-transpose"?b:h;if(u<v)throw new Error(`lda must be >= ${g==="column-major"?"rows":"cols"} of A as stored.`);if(p){if(u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[H,$]=e==="no-transpose"?[o,a]:[a,o];if(s.rows<H||s.cols<$)throw new Error("A is too small for the given n, k, and trans.")}else if(s.length<(y-1)*u+v)throw new Error("A does not have enough elements for the given dimensions and lda.");if(l<o)throw new Error("ldc must be >= n.");if(c){if(l!==f.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(f.rows<o||f.cols<o)throw new Error("C is too small for the given n.")}else if(f.length<(o-1)*l+o)throw new Error("C does not have enough elements for the given dimensions and ldc.");let _=e;g==="column-major"&&(_=_==="no-transpose"?"transpose":"no-transpose");let S=_==="no-transpose"?"transpose":"no-transpose",k=t;w==="column-major"&&([_,S]=[S==="no-transpose"?"transpose":"no-transpose",_==="no-transpose"?"transpose":"no-transpose"],k=k==="lower"?"upper":"lower");let B=Math.ceil(o/64),L=Math.ceil(o/64),C=B*L>=36,R=await D(r,C?"sgemmtr_large":"sgemmtr_small"),F=p?s._buf:x(r,s,"ssyrk-A",!1),W=c?f._buf:x(r,f,"ssyrk-C",!0),V=p?tr(r,F.size,"ssyrk-B",GPUBufferUsage.COPY_DST):x(r,s,"ssyrk-B",!1),z=I(r,[{value:o,type:"u32"},{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"f32"},{value:n,type:"f32"},{value:u,type:"u32"},{value:u,type:"u32"},{value:l,type:"u32"},{value:_==="transpose"?1:0,type:"u32"},{value:S==="transpose"?1:0,type:"u32"},{value:k==="upper"?1:0,type:"u32"}],"ssyrk-params");try{let H=E(r,R.getBindGroupLayout(0),[F,V,W,z]),$=C?{x:U(r,B,"ssyrk","x"),y:U(r,L,"ssyrk","y")}:{x:U(r,Math.ceil(o/32),"ssyrk","x"),y:U(r,Math.ceil(o/32),"ssyrk","y")},{commandEncoder:K,querySet:Y,passDescriptor:ir}=qr(r);p&&K.copyBufferToBuffer(F,0,V,0,F.size),gr(K,R,H,$,ir);let lr=Lr(r,K,Y),hr=c?null:G(r,K,W);M(r,K);let nr=await P(lr);if(c)return nr!==void 0?{gpuTimeMs:nr}:{};let mr=await A(hr,Float32Array);return nr!==void 0?{C:mr,gpuTimeMs:nr}:{C:mr}}finally{p||d(F),d(V),c||d(W),d(z)}}async function ga(r,t,e,o,a,i,s,u,n,f,l,m,p,c="row-major"){let g=s instanceof X,w=n instanceof X,h=m instanceof X;if(q(r),T(r,"ssyr2k",{A:s,B:n,C:m}),t!=="lower"&&t!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(c!=="row-major"&&c!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof i!="number")throw new Error("alpha must be a number.");if(Number.isNaN(i))throw new Error("alpha must not be NaN.");if(!Number.isFinite(i))throw new Error("alpha must be finite.");if(typeof l!="number")throw new Error("beta must be a number.");if(Number.isNaN(l))throw new Error("beta must not be NaN.");if(!Number.isFinite(l))throw new Error("beta must be finite.");if(!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(u)||!Number.isInteger(f)||!Number.isInteger(p))throw new Error("n, k, lda, ldb, and ldc must be integers.");if(!g&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!w&&!(n instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(!h&&!(m instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if((g||w)&&!h)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(h&&(!g||!w))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(o<0||a<0)throw new Error("n and k must be non-negative.");if(u<=0||f<=0||p<=0)throw new Error("lda, ldb, and ldc must be positive.");if(o===0)return h?{}:{C:m};let b=g?s.layout:c,y=w?n.layout:c,v=h?m.layout:c,_=b==="column-major"?a:o,S=b==="column-major"?o:a,k=e==="no-transpose"?_:S,B=e==="no-transpose"?S:_;if(u<B)throw new Error(`lda must be >= ${b==="column-major"?"rows":"cols"} of A as stored.`);if(g){if(u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[J,sr]=e==="no-transpose"?[o,a]:[a,o];if(s.rows<J||s.cols<sr)throw new Error("A is too small for the given n, k, and trans.")}else if(s.length<(k-1)*u+B)throw new Error("A does not have enough elements for the given dimensions and lda.");let L=y==="column-major"?a:o,C=y==="column-major"?o:a,R=e==="no-transpose"?L:C,F=e==="no-transpose"?C:L;if(f<F)throw new Error(`ldb must be >= ${y==="column-major"?"rows":"cols"} of B as stored.`);if(w){if(f!==n.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");let[J,sr]=e==="no-transpose"?[o,a]:[a,o];if(n.rows<J||n.cols<sr)throw new Error("B is too small for the given n, k, and trans.")}else if(n.length<(R-1)*f+F)throw new Error("B does not have enough elements for the given dimensions and ldb.");if(p<o)throw new Error("ldc must be >= n.");if(h){if(p!==m.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(m.rows<o||m.cols<o)throw new Error("C is too small for the given n.")}else if(m.length<(o-1)*p+o)throw new Error("C does not have enough elements for the given dimensions and ldc.");let W=e;b==="column-major"&&(W=W==="no-transpose"?"transpose":"no-transpose");let V=e;y==="column-major"&&(V=V==="no-transpose"?"transpose":"no-transpose");let z=v==="column-major"?t==="lower"?"upper":"lower":t,H=J=>J==="no-transpose"?"transpose":"no-transpose";function $(J,sr,pr,br,fr,ur){let yr=J,Cr=H(br);return v!=="column-major"?{transX:yr,X:sr,ldX:pr,transY:Cr,Y:fr,ldY:ur}:{transX:H(Cr),X:fr,ldX:ur,transY:H(yr),Y:sr,ldY:pr}}let K=Math.ceil(o/64),Y=Math.ceil(o/64),ir=K*Y>=36,lr=await D(r,ir?"sgemmtr_large":"sgemmtr_small"),hr=ir?{x:U(r,K,"ssyr2k","x"),y:U(r,Y,"ssyr2k","y")}:{x:U(r,Math.ceil(o/32),"ssyr2k","x"),y:U(r,Math.ceil(o/32),"ssyr2k","y")},nr=g?s._buf:x(r,s,"ssyr2k-A",!1),mr=w?n._buf:x(r,n,"ssyr2k-B",!1),Q=h?m._buf:x(r,m,"ssyr2k-C",!0),er=null,Z=null;try{let J=$(W,nr,u,V,mr,f),sr=$(V,mr,f,W,nr,u),pr=(Ir,Sr)=>I(r,[{value:o,type:"u32"},{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"f32"},{value:Sr,type:"f32"},{value:Ir.ldX,type:"u32"},{value:Ir.ldY,type:"u32"},{value:p,type:"u32"},{value:Ir.transX==="transpose"?1:0,type:"u32"},{value:Ir.transY==="transpose"?1:0,type:"u32"},{value:z==="upper"?1:0,type:"u32"}],"ssyr2k-params");er=pr(J,l),Z=pr(sr,1);let br=E(r,lr.getBindGroupLayout(0),[J.X,J.Y,Q,er]),fr=E(r,lr.getBindGroupLayout(0),[sr.X,sr.Y,Q,Z]),{commandEncoder:ur,querySet:yr}=qr(r),Cr=yr?{timestampWrites:{querySet:yr,beginningOfPassWriteIndex:0}}:void 0,Rr=yr?{timestampWrites:{querySet:yr,endOfPassWriteIndex:1}}:void 0;gr(ur,lr,br,hr,Cr),gr(ur,lr,fr,hr,Rr);let Tr=Lr(r,ur,yr),Er=h?null:G(r,ur,Q);M(r,ur);let vr=await P(Tr);if(h)return vr!==void 0?{gpuTimeMs:vr}:{};let xr=await A(Er,Float32Array);return vr!==void 0?{C:xr,gpuTimeMs:vr}:{C:xr}}finally{g||d(nr),w||d(mr),h||d(Q),er&&d(er),Z&&d(Z)}}async function wa(r,t,e,o,a,i,s,u,n,f,l,m,p,c="row-major"){let g=s instanceof X,w=n instanceof X,h=m instanceof X;if(q(r),T(r,"ssymm",{A:s,B:n,C:m}),t!=="left"&&t!=="right")throw new Error("side must be 'left' or 'right'.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(c!=="row-major"&&c!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof i!="number")throw new Error("alpha must be a number.");if(Number.isNaN(i))throw new Error("alpha must not be NaN.");if(!Number.isFinite(i))throw new Error("alpha must be finite.");if(typeof l!="number")throw new Error("beta must be a number.");if(Number.isNaN(l))throw new Error("beta must not be NaN.");if(!Number.isFinite(l))throw new Error("beta must be finite.");if(!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(u)||!Number.isInteger(f)||!Number.isInteger(p))throw new Error("m, n, lda, ldb, and ldc must be integers.");if(!g&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!w&&!(n instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(!h&&!(m instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if((g||w)&&!h)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(h&&(!g||!w))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(o<0||a<0)throw new Error("m and n must be non-negative.");if(o===0||a===0)return h?{}:{C:m};let b=g?s.layout:c,y=w?n.layout:c,v=h?m.layout:c,_=t==="left"?o:a;if(u<_)throw new Error("lda must be >= "+(t==="left"?"m":"n")+".");if(g){if(u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(s.rows<_||s.cols<_)throw new Error("A is too small for the given m/n and side.")}else if(s.length<(_-1)*u+_)throw new Error("A does not have enough elements for the given dimensions and lda.");let S=y==="column-major"?a:o,k=y==="column-major"?o:a;if(f<k)throw new Error(`ldb must be >= ${y==="column-major"?"rows":"cols"} of B as stored.`);if(w){if(f!==n.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");if(n.rows<o||n.cols<a)throw new Error("B is too small for the given m and n.")}else if(n.length<(S-1)*f+k)throw new Error("B does not have enough elements for the given dimensions and ldb.");let B=v==="column-major"?a:o,L=v==="column-major"?o:a;if(p<L)throw new Error(`ldc must be >= ${v==="column-major"?"rows":"cols"} of C as stored.`);if(h){if(p!==m.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(m.rows<o||m.cols<a)throw new Error("C is too small for the given m and n.")}else if(m.length<(B-1)*p+L)throw new Error("C does not have enough elements for the given dimensions and ldc.");let C=b==="column-major"?e==="lower"?"upper":"lower":e,R=y==="column-major"?"transpose":"no-transpose",F="no-transpose",W=o,V=a,z=_,H=t==="left"?F:R,$=t==="left"?R:F,K=ur=>ur==="no-transpose"?"transpose":"no-transpose",Y=t==="right";v==="column-major"&&([H,$]=[K($),K(H)],Y=!Y,[W,V]=[V,W]);let ir=_,lr=Math.ceil(V/64),hr=Math.ceil(W/64),nr=lr*hr>=36,mr=await D(r,nr?"sgemm_large":"sgemm_small"),Q=await D(r,"symmetrize"),er=nr?{x:U(r,lr,"ssymm","x"),y:U(r,hr,"ssymm","y")}:{x:U(r,Math.ceil(V/32),"ssymm","x"),y:U(r,Math.ceil(W/32),"ssymm","y")},Z=g?s._buf:x(r,s,"ssymm-A",!1),J=w?n._buf:x(r,n,"ssymm-B",!1),sr=h?m._buf:x(r,m,"ssymm-C",!0),pr=tr(r,_*ir*4,"ssymm-Adense"),br=null,fr=null;try{br=I(r,[{value:_,type:"u32"},{value:u,type:"u32"},{value:ir,type:"u32"},{value:C==="upper"?1:0,type:"u32"}],"ssymm-sym-params");let ur=E(r,Q.getBindGroupLayout(0),[Z,pr,br]),yr=Y?J:pr,Cr=Y?f:ir,Rr=Y?pr:J;fr=I(r,[{value:W,type:"u32"},{value:V,type:"u32"},{value:z,type:"u32"},{value:i,type:"f32"},{value:l,type:"f32"},{value:Cr,type:"u32"},{value:Y?ir:f,type:"u32"},{value:p,type:"u32"},{value:H==="transpose"?1:0,type:"u32"},{value:$==="transpose"?1:0,type:"u32"}],"ssymm-gemm-params");let Er=E(r,mr.getBindGroupLayout(0),[yr,Ar(r,yr),Rr,Ar(r,Rr),sr,fr]),{commandEncoder:vr,querySet:xr}=qr(r),Ir=xr?{timestampWrites:{querySet:xr,beginningOfPassWriteIndex:0}}:void 0,Sr=xr?{timestampWrites:{querySet:xr,endOfPassWriteIndex:1}}:void 0;gr(vr,Q,ur,{x:Math.ceil(_/8),y:Math.ceil(_/8)},Ir),gr(vr,mr,Er,er,Sr);let Fr=Lr(r,vr,xr),Or=h?null:G(r,vr,sr);M(r,vr);let Ur=await P(Fr);if(h)return Ur!==void 0?{gpuTimeMs:Ur}:{};let me=await A(Or,Float32Array);return Ur!==void 0?{C:me,gpuTimeMs:Ur}:{C:me}}finally{g||d(Z),w||d(J),h||d(sr),d(pr),br&&d(br),fr&&d(fr)}}async function ha(r,t,e,o,a,i,s,u,n,f,l,m,p="row-major"){let c=n instanceof X,g=l instanceof X,w=a==="unit";if(q(r),T(r,"strmm",{A:n,B:l}),t!=="left"&&t!=="right")throw new Error("side must be 'left' or 'right'.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(o!=="no-transpose"&&o!=="transpose")throw new Error("transA must be 'no-transpose' or 'transpose'.");if(!w&&a!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(p!=="row-major"&&p!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof u!="number")throw new Error("alpha must be a number.");if(Number.isNaN(u))throw new Error("alpha must not be NaN.");if(!Number.isFinite(u))throw new Error("alpha must be finite.");if(!Number.isInteger(i)||!Number.isInteger(s)||!Number.isInteger(f)||!Number.isInteger(m))throw new Error("m, n, lda, and ldb must be integers.");if(!c&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!g&&!(l instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(c!==g)throw new Error("A and B must both be GpuMatrix or both be Float32Array.");if(i<0||s<0)throw new Error("m and n must be non-negative.");if(i===0||s===0)return g?{}:{B:l};let h=c?n.layout:p,b=g?l.layout:p,y=t==="left"?i:s;if(f<y)throw new Error("lda must be >= "+(t==="left"?"m":"n")+".");if(c){if(f!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(n.rows<y||n.cols<y)throw new Error("A is too small for the given m/n and side.")}else if(n.length<(y-1)*f+y)throw new Error("A does not have enough elements for the given dimensions and lda.");let v=b==="column-major"?s:i,_=b==="column-major"?i:s;if(m<_)throw new Error(`ldb must be >= ${b==="column-major"?"rows":"cols"} of B as stored.`);if(g){if(m!==l.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");if(l.rows<i||l.cols<s)throw new Error("B is too small for the given m and n.")}else if(l.length<(v-1)*m+_)throw new Error("B does not have enough elements for the given dimensions and ldb.");let S=h==="column-major"?e==="lower"?"upper":"lower":e,k=h==="column-major"?o==="no-transpose"?"transpose":"no-transpose":o,B=b==="column-major"?"transpose":"no-transpose",L="no-transpose",C=i,R=s,F=y,W=t==="left"?L:B,V=t==="left"?B:L,z=br=>br==="no-transpose"?"transpose":"no-transpose",H=t==="right";b==="column-major"&&([W,V]=[z(V),z(W)],H=!H,[C,R]=[R,C]);let $=y,K=Math.ceil(R/64),Y=Math.ceil(C/64),ir=K*Y>=36,lr=await D(r,ir?"sgemm_large":"sgemm_small"),hr=await D(r,"triangularize"),nr=ir?{x:U(r,K,"strmm","x"),y:U(r,Y,"strmm","y")}:{x:U(r,Math.ceil(R/32),"strmm","x"),y:U(r,Math.ceil(C/32),"strmm","y")},mr=null,Q=null,er=null,Z=null,J=null,sr=null,pr=!1;try{mr=c?n._buf:x(r,n,"strmm-A",!1),Q=g?l._buf:x(r,l,"strmm-B",!0),er=tr(r,y*$*4,"strmm-Adense"),Z=tr(r,v*m*4,"strmm-out",GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST),J=I(r,[{value:y,type:"u32"},{value:f,type:"u32"},{value:$,type:"u32"},{value:S==="upper"?1:0,type:"u32"},{value:k==="transpose"?1:0,type:"u32"},{value:w?1:0,type:"u32"}],"strmm-tri-params");let br=E(r,hr.getBindGroupLayout(0),[mr,er,J]),fr=H?Q:er,ur=H?m:$,yr=H?er:Q;sr=I(r,[{value:C,type:"u32"},{value:R,type:"u32"},{value:F,type:"u32"},{value:u,type:"f32"},{value:0,type:"f32"},{value:ur,type:"u32"},{value:H?$:m,type:"u32"},{value:m,type:"u32"},{value:W==="transpose"?1:0,type:"u32"},{value:V==="transpose"?1:0,type:"u32"}],"strmm-gemm-params");let Rr=E(r,lr.getBindGroupLayout(0),[fr,Ar(r,fr),yr,Ar(r,yr),Z,sr]),{commandEncoder:Tr,querySet:Er}=qr(r);Tr.copyBufferToBuffer(Q,0,Z,0,Math.min(Q.size,Z.size));let vr=Er?{timestampWrites:{querySet:Er,beginningOfPassWriteIndex:0}}:void 0,xr=Er?{timestampWrites:{querySet:Er,endOfPassWriteIndex:1}}:void 0;gr(Tr,hr,br,{x:Math.ceil(y/8),y:Math.ceil(y/8)},vr),gr(Tr,lr,Rr,nr,xr);let Ir=Lr(r,Tr,Er),Sr=g?null:G(r,Tr,Z);M(r,Tr);let Fr=await P(Ir);if(g)return d(l._buf),l._buf=Z,pr=!0,Fr!==void 0?{gpuTimeMs:Fr}:{};let Or=await A(Sr,Float32Array);return Fr!==void 0?{B:Or,gpuTimeMs:Fr}:{B:Or}}finally{!c&&mr&&d(mr),!g&&Q&&d(Q),er&&d(er),Z&&!pr&&d(Z),J&&d(J),sr&&d(sr)}}async function ba(r,t,e,o,a,i,s,u,n,f,l,m,p="row-major"){let c=n instanceof X,g=l instanceof X,w=a==="unit";if(q(r),T(r,"strsm",{A:n,B:l}),t!=="left"&&t!=="right")throw new Error("side must be 'left' or 'right'.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(o!=="no-transpose"&&o!=="transpose")throw new Error("transA must be 'no-transpose' or 'transpose'.");if(!w&&a!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(p!=="row-major"&&p!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof u!="number")throw new Error("alpha must be a number.");if(Number.isNaN(u))throw new Error("alpha must not be NaN.");if(!Number.isFinite(u))throw new Error("alpha must be finite.");if(!Number.isInteger(i)||!Number.isInteger(s)||!Number.isInteger(f)||!Number.isInteger(m))throw new Error("m, n, lda, and ldb must be integers.");if(!c&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!g&&!(l instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(c!==g)throw new Error("A and B must both be GpuMatrix or both be Float32Array.");if(i<0||s<0)throw new Error("m and n must be non-negative.");if(i===0||s===0)return g?{}:{B:l};let h=c?n.layout:p,b=g?l.layout:p,y=t==="left"?i:s;if(f<y)throw new Error("lda must be >= "+(t==="left"?"m":"n")+".");if(c){if(f!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(n.rows<y||n.cols<y)throw new Error("A is too small for the given m/n and side.")}else if(n.length<(y-1)*f+y)throw new Error("A does not have enough elements for the given dimensions and lda.");let v=b==="column-major"?s:i,_=b==="column-major"?i:s;if(m<_)throw new Error(`ldb must be >= ${b==="column-major"?"rows":"cols"} of B as stored.`);if(g){if(m!==l.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");if(l.rows<i||l.cols<s)throw new Error("B is too small for the given m and n.")}else if(l.length<(v-1)*m+_)throw new Error("B does not have enough elements for the given dimensions and ldb.");let S=h==="column-major"?e==="lower"?"upper":"lower":e,k=h==="column-major"?o==="no-transpose"?"transpose":"no-transpose":o,B=t==="left"?s:i,L=t==="left",C=k==="no-transpose"==(S==="lower"),R=t==="left"?C:!C,F=[];for(let Q=0;Q<y;Q+=64)F.push(Q);R||F.reverse();let W=F.length,V=await D(r,"strsv_invert_block"),z=await D(r,"block_transfer"),H=await D(r,"sscal"),$=null,K=null,Y=null,ir=[],lr=[];function hr(Q,er){let Z=tr(r,Q,er);return lr.push(Z),Z}function nr(Q,er){let Z=I(r,Q,er);return ir.push(Z),Z}let mr=(v-1)*m+_;try{$=c?n._buf:x(r,n,"strsm-A",!1),K=g?l._buf:x(r,l,"strsm-B",!0),Y=tr(r,W*64*64*4,"strsm-Ainv");let Q=null;if(u!==1&&u!==0){let Er=nr([{value:mr,type:"u32"},{value:u,type:"f32"},{value:1,type:"u32"}],"strsm-scale-params");Q=E(r,H.getBindGroupLayout(0),[K,Er])}let er=nr([{value:y,type:"u32"},{value:f,type:"u32"},{value:k==="transpose"?1:0,type:"u32"},{value:S==="upper"?1:0,type:"u32"},{value:w?1:0,type:"u32"}],"strsm-invert-params"),Z=E(r,V.getBindGroupLayout(0),[$,Y,er]),J=hr(64*B*4,"strsm-Bblock"),sr=hr(64*B*4,"strsm-Xblock"),pr=hr(y*64*4,"strsm-Aoff"),br=hr(y*B*4,"strsm-delta"),{commandEncoder:fr,querySet:ur}=qr(r);if(u===0){let Er=Math.ceil(_/64),vr=Math.ceil(v/64),xr=Er*vr>=36,Ir=await D(r,xr?"sgemm_large":"sgemm_small"),Sr=nr([{value:v,type:"u32"},{value:_,type:"u32"},{value:0,type:"u32"},{value:0,type:"f32"},{value:0,type:"f32"},{value:1,type:"u32"},{value:1,type:"u32"},{value:m,type:"u32"},{value:0,type:"u32"},{value:0,type:"u32"}],"strsm-zero-params"),Fr=E(r,Ir.getBindGroupLayout(0),[Y,Ar(r,Y),Y,Ar(r,Y),K,Sr]),Or=xr?{x:U(r,Er,"strsm","x"),y:U(r,vr,"strsm","y")}:{x:U(r,Math.ceil(_/32),"strsm","x"),y:U(r,Math.ceil(v/32),"strsm","y")};gr(fr,Ir,Fr,Or,ur?{timestampWrites:{querySet:ur,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1}}:void 0)}else{Q&&gr(fr,H,Q,cr(r,mr)),gr(fr,V,Z,{x:64,y:W},ur?{timestampWrites:{querySet:ur,beginningOfPassWriteIndex:0}}:void 0);for(let vr=0;vr<F.length;vr++){let xr=F[vr],Ir=Math.min(xr+64,y),Sr=Ir-xr,Fr=xr/64,Or=vr===F.length-1,Ur=nr([{value:xr,type:"u32"},{value:Sr,type:"u32"},{value:0,type:"u32"},{value:B,type:"u32"},{value:m,type:"u32"},{value:b==="column-major"?1:0,type:"u32"},{value:L?1:0,type:"u32"},{value:2,type:"u32"}],"strsm-gather-B-params"),me=E(r,z.getBindGroupLayout(0),[J,K,Ur]);gr(fr,z,me,Zr(r,"strsm",Sr,B));{let Yr=Sr,Xr=B,_e=Sr,ae=Math.ceil(Xr/64),ie=Math.ceil(Yr/64),se=ae*ie>=36,ne=await D(r,se?"sgemm_large":"sgemm_small"),Be=nr([{value:Yr,type:"u32"},{value:Xr,type:"u32"},{value:_e,type:"u32"},{value:1,type:"f32"},{value:0,type:"f32"},{value:64,type:"u32"},{value:B,type:"u32"},{value:B,type:"u32"},{value:t==="right"?1:0,type:"u32"},{value:0,type:"u32"}],"strsm-apply-params"),ce={buffer:Y,offset:Fr*64*64*4,size:4096*4},Se=E(r,ne.getBindGroupLayout(0),[ce,Ar(r,ce),J,Ar(r,J),sr,Be]),Ea=se?{x:U(r,ae,"strsm","x"),y:U(r,ie,"strsm","y")}:{x:U(r,Math.ceil(Xr/32),"strsm","x"),y:U(r,Math.ceil(Yr/32),"strsm","y")};gr(fr,ne,Se,Ea)}let de=R?Ir:0,Le=R?y:xr,Re=de<Le,ya=nr([{value:xr,type:"u32"},{value:Sr,type:"u32"},{value:0,type:"u32"},{value:B,type:"u32"},{value:m,type:"u32"},{value:b==="column-major"?1:0,type:"u32"},{value:L?1:0,type:"u32"},{value:0,type:"u32"}],"strsm-scatter-params"),xa=E(r,z.getBindGroupLayout(0),[sr,K,ya]),va=Or&&!Re&&ur?{timestampWrites:{querySet:ur,endOfPassWriteIndex:1}}:void 0;if(gr(fr,z,xa,Zr(r,"strsm",Sr,B),va),!Re)continue;let oe=Le-de,_a=nr([{value:de,type:"u32"},{value:oe,type:"u32"},{value:xr,type:"u32"},{value:Sr,type:"u32"},{value:f,type:"u32"},{value:k==="transpose"?1:0,type:"u32"},{value:L?1:0,type:"u32"},{value:2,type:"u32"}],"strsm-gather-A-params"),Ba=E(r,z.getBindGroupLayout(0),[pr,$,_a]);gr(fr,z,Ba,Zr(r,"strsm",oe,Sr));{let Yr=oe,Xr=B,_e=Sr,ae=Math.ceil(Xr/64),ie=Math.ceil(Yr/64),se=ae*ie>=36,ne=await D(r,se?"sgemm_large":"sgemm_small"),Be=nr([{value:Yr,type:"u32"},{value:Xr,type:"u32"},{value:_e,type:"u32"},{value:1,type:"f32"},{value:0,type:"f32"},{value:Sr,type:"u32"},{value:B,type:"u32"},{value:B,type:"u32"},{value:0,type:"u32"},{value:0,type:"u32"}],"strsm-update-params"),ce=E(r,ne.getBindGroupLayout(0),[pr,Ar(r,pr),sr,Ar(r,sr),br,Be]),Se=se?{x:U(r,ae,"strsm","x"),y:U(r,ie,"strsm","y")}:{x:U(r,Math.ceil(Xr/32),"strsm","x"),y:U(r,Math.ceil(Yr/32),"strsm","y")};gr(fr,ne,ce,Se)}let Sa=nr([{value:de,type:"u32"},{value:oe,type:"u32"},{value:0,type:"u32"},{value:B,type:"u32"},{value:m,type:"u32"},{value:b==="column-major"?1:0,type:"u32"},{value:L?1:0,type:"u32"},{value:1,type:"u32"}],"strsm-scatter-sub-params"),Aa=E(r,z.getBindGroupLayout(0),[br,K,Sa]),Ga=Or&&ur?{timestampWrites:{querySet:ur,endOfPassWriteIndex:1}}:void 0;gr(fr,z,Aa,Zr(r,"strsm",oe,B),Ga)}}let yr=Lr(r,fr,ur),Cr=g?null:G(r,fr,K);M(r,fr);let Rr=await P(yr);if(g)return Rr!==void 0?{gpuTimeMs:Rr}:{};let Tr=await A(Cr,Float32Array);return Rr!==void 0?{B:Tr,gpuTimeMs:Rr}:{B:Tr}}finally{!c&&$&&d($),!g&&K&&d(K),Y&&d(Y),d(lr),d(ir)}}return Ia(Ti);})();
4483
+ `});var ra={};Fe(ra,{routineShaders:()=>ir,shaderSources:()=>bs});var ir,bs,ea=Z(()=>{$e();Je();rt();tt();at();st();lt();dt();mt();ct();wt();ht();yt();vt();Bt();At();St();Gt();kt();Dt();Lt();Nt();It();jt();Ft();Ht();Ct();Vt();Kt();zt();Zt();$t();Jt();ro();to();ao();so();lo();fo();co();po();go();bo();xo();_o();Ao();Go();ko();Lo();No();Io();jo();qo();To();Wo();Oo();Ko();Uo();zo();Yo();Xo();Jo();ir={};ir.sscal={sscal:ke};ir.cscal={cscal:Qe};ir.sswap={sswap:et};ir.dswap={dswap:ot};ir.saxpy={saxpy:it};ir.scopy={scopy:nt};ir.dcopy={dcopy:ut};ir.sdot={sdot:ft,"reduction/sum":De};ir.sasum={sasum:pt,"reduction/sum":De};ir.snrm2={snrm2:gt,"reduction/scaledSum":bt};ir.isamax={isamax:xt,"reduction/argmax":_t};ir.dasum={"f64/dekker":Pr,"f64/utils/abs":ye,"f64/utils/add":Ir,dasum:Et,"reduction/sumF64":Le};ir.ddot={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,ddot:Pt,"reduction/sumF64":Le};ir.dscal={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,dscal:Mt};ir.daxpy={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,daxpy:Rt};ir.idamax={"f64/dekker":Pr,"f64/utils/abs":ye,"f64/utils/greater":Pe,"f64/utils/equal":qt,idamax:Tt,"reduction/argmaxF64":Wt};ir.srot={srot:Ot};ir.drot={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,drot:Ut};ir.srotm={srotm:Yt};ir.drotm={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,drotm:Xt};ir.dnrm2={"f64/dekker":Pr,"f64/utils/abs":ye,"f64/utils/greater":Pe,"f64/utils/add":Ir,"f64/utils/multiply":Cr,"f64/utils/divide":Ne,"f64/utils/sqrt":Qt,dnrm2:eo,"reduction/scaledSumF64":oo};ir.sgemv={sgemv_n:io,sgemv_t:no};ir.ssymv={ssymv:uo};ir.strmv={strmv:mo};ir.strsv={strsv_invert_block:Me,strsv_apply_inverse:wo,strsv_update:ho};ir.sger={sger:yo};ir.dger={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,dger:vo};ir.ssyr={ssyr:Bo};ir.dsyr={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,dsyr:So};ir.ssyr2={ssyr2:Eo};ir.dsyr2={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,dsyr2:Do};ir.dgemv={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,dgemv_n:Po,dgemv_t:Mo};ir.dsymv={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,dsymv:Ro};ir.dtrmv={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,dtrmv:Fo};ir.dtrsv={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,"f64/utils/divide":Ne,dtrsv_invert_block:Ho,dtrsv_apply_inverse:Co,dtrsv_update:Vo};ir.sgemm={sgemm_small:ue,sgemm_large:de};ir.sgemmtr={sgemmtr_small:xe,sgemmtr_large:ve};ir.ssyrk={sgemmtr_small:xe,sgemmtr_large:ve};ir.ssyr2k={sgemmtr_small:xe,sgemmtr_large:ve};ir.ssymm={sgemm_small:ue,sgemm_large:de,symmetrize:Zo};ir.strmm={sgemm_small:ue,sgemm_large:de,triangularize:$o};ir.strsm={strsv_invert_block:Me,block_transfer:Qo,sscal:ke,sgemm_small:ue,sgemm_large:de};bs=Object.assign({},...Object.values(ir))});var _s={};Fe(_s,{Complex32:()=>Or,Complex32Array:()=>Br,Complex64:()=>Vr,Complex64Array:()=>Lr,GpuMatrix:()=>X,GpuVector:()=>M,cleanup:()=>Oe,cscal:()=>oa,dasum:()=>ca,daxpy:()=>la,dcopy:()=>da,ddot:()=>pa,dgemv:()=>Ra,dger:()=>La,dnrm2:()=>ga,drot:()=>xa,drotm:()=>_a,dscal:()=>aa,dswap:()=>sa,dsymv:()=>ja,dsyr:()=>Na,dsyr2:()=>Ia,dtrmv:()=>Fa,dtrsv:()=>Ta,gpuName:()=>Ke,idamax:()=>ba,init:()=>Ve,isamax:()=>ha,randomFloat32Array:()=>Ye,randomFloat64Array:()=>Ze,randomTriangularFloat32Array:()=>Xe,sasum:()=>ma,saxpy:()=>na,scopy:()=>ua,sdot:()=>fa,sgemm:()=>Ca,sgemmtr:()=>Wa,sgemv:()=>Ba,sger:()=>Da,snrm2:()=>wa,srot:()=>ya,srotm:()=>va,sscal:()=>ta,sswap:()=>ia,ssymm:()=>Ka,ssymv:()=>Aa,ssyr:()=>Pa,ssyr2:()=>Ma,ssyr2k:()=>Oa,ssyrk:()=>Va,strmm:()=>Ua,strmv:()=>Sa,strsm:()=>za,strsv:()=>ka});function He(r,o){return o?r.features.has("timestamp-query")?{requiredFeatures:["timestamp-query"]}:(console.warn("timestamp-query not supported on this device \u2014 benchmark mode disabled."),{}):{}}function Te(r){if(!Ce(r))return{querySet:null,passDescriptor:void 0};let o=r.createQuerySet({type:"timestamp",count:2});return{querySet:o,passDescriptor:{timestampWrites:{querySet:o,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1}}}}function kr(r,o,e){if(!e)return null;let a=r.createBuffer({label:"timestamp-resolve",size:16,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC});o.resolveQuerySet(e,0,2,a,0);let t=r.createBuffer({label:"timestamp-readback",size:16,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});return o.copyBufferToBuffer(a,0,t,0,16),{tsReadBuffer:t,resolveBuffer:a,querySet:e}}async function j(r){if(!r)return;let{tsReadBuffer:o,resolveBuffer:e,querySet:a}=r;await o.mapAsync(GPUMapMode.READ);let t=new BigInt64Array(o.getMappedRange().slice());return o.unmap(),o.destroy(),e.destroy(),a.destroy(),Math.max(0,Number(t[1]-t[0]))/1e6}var Jr=null,Se=!1,Qr=new Map,le=new WeakMap,zr=null,We=({powerPreference:r,benchmark:o})=>`${r}::${o}`;async function Ve({powerPreference:r="high-performance",benchmark:o=!1,dumpShaders:e=!1}={}){let a={powerPreference:r,benchmark:o,dumpShaders:e},t=We(a),i=Qr.get(t);if(i)return i;if(Jr)e!==Se&&typeof window>"u"&&console.warn(`dumpShaders: ${e} was requested, but the WebGPU instance was already created with dumpShaders: ${Se}. The first init() call fixes this for the process.`);else if(typeof window>"u"){let{create:m,globals:w}=await import("webgpu");Object.assign(globalThis,w),Jr=m(e?["enable-dawn-features=dump_shaders,disable_symbol_renaming"]:[]),Se=e}else e&&console.warn("dumpShaders has no effect in the browser \u2014 see init()'s docs."),Jr=navigator.gpu;if(!Jr)throw new Error("WebGPU not supported in this environment.");let s=await Jr.requestAdapter({powerPreference:r})??await Jr.requestAdapter();if(!s)throw new Error("No WebGPU adapter found.");let n=[...He(s,o).requiredFeatures??[]],d=await s.requestDevice({requiredFeatures:n});d.addEventListener("uncapturederror",m=>{console.error("Uncaptured GPU error:",m.error.message)});let l=n.includes("timestamp-query");return le.set(d,{adapter:s,benchmark:l,options:a}),Qr.set(t,d),zr||(zr=d),d}function Oe(r){if(r===void 0){for(let e of Qr.values())e.destroy();Qr.clear(),zr=null;return}let o=le.get(r);o&&(Qr.delete(We(o.options)),le.delete(r),r.destroy(),zr===r&&(zr=Qr.values().next().value??null))}function Ke(r=zr){let o=r&&le.get(r);if(!o)throw new Error("WebGPU adapter not initialized \u2014 call init() first.");let{device:e,description:a}=o.adapter.info;return{description:a||"unknown",device:e||"unknown"}}function Ce(r=zr){return le.get(r)?.benchmark??!1}function re(){if(!zr)throw new Error("WebGPU device not initialized \u2014 call init() first.");return zr}function f(...r){r.flat().forEach(o=>o.destroy())}function Ge(r,o,e){let a=r.limits.maxStorageBufferBindingSize;if(o>a)throw new Error(`Buffer "${e}" needs ${o} bytes, exceeding this device's maxStorageBufferBindingSize (${a} bytes). The operands are too large for this device.`)}function h(r,o,e="blas-input",a=!1){let t=o.byteLength;Ge(r,t,e);let i=a?GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC:GPUBufferUsage.STORAGE,s=r.createBuffer({label:e,size:t,usage:i,mappedAtCreation:!0}),u=o.constructor;return new u(s.getMappedRange()).set(o),s.unmap(),s}function fr(r,o,e="blas-storage",a=0){return Ge(r,o,e),r.createBuffer({label:e,size:o,usage:GPUBufferUsage.STORAGE|a})}function Ar(r,o,e="blas-result"){return Ge(r,o,e),r.createBuffer({label:e,size:o,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC})}function E(r,o,e){let a=r.createBuffer({label:"blas-readback",size:e.size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});return o.copyBufferToBuffer(e,0,a,0,e.size),a}var ee=16,Ue=new WeakMap;function ui(r){let o=Ue.get(r);return o||(o=r.createBuffer({label:"blas-vec4-fallback",size:ee,usage:GPUBufferUsage.STORAGE}),Ue.set(r,o)),o}function Dr(r,o){let e=o instanceof GPUBuffer?o:o.buffer,a=o instanceof GPUBuffer?0:o.offset??0,t=o instanceof GPUBuffer?o.size:o.size??e.size-a,i=Math.floor(t/ee)*ee;return i<ee?{buffer:ui(r),offset:0,size:ee}:{buffer:e,offset:a,size:i}}function Ee(r,o,e,a){if(o%4!==0)return!1;let t=r instanceof GPUBuffer?r:r.buffer,i=r instanceof GPUBuffer?0:r.offset??0,s=r instanceof GPUBuffer?t.size:r.size??t.size-i,u=Math.floor(s/ee)*4;if(u<=0)return!1;let n=(Math.max(e,1)-1)*o+(Math.max(a,1)-1);return Math.floor(n/4)*4+4<=u}function q(r,o,e="blas-params"){let a=o.length*4,t=Math.ceil(a/16)*16,i=new ArrayBuffer(t),s=new DataView(i);o.forEach(({value:n,type:d},l)=>{let m=l*4;if(d==="u32")s.setUint32(m,n,!0);else if(d==="i32")s.setInt32(m,n,!0);else if(d==="f32")s.setFloat32(m,n,!0);else throw new Error(`Unknown param type "${d}". Use "f32", "u32", or "i32".`)});let u=r.createBuffer({label:e,size:t,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return r.queue.writeBuffer(u,0,i),u}async function G(r,o=Float32Array){try{await r.mapAsync(GPUMapMode.READ);let e=new o(r.getMappedRange().slice());return r.unmap(),e}finally{r.destroy()}}function U(r){let o=r.length,e=new Float32Array(o),a=new Float32Array(o);for(let t=0;t<o;t++){let i=Math.fround(r[t]);e[t]=i,a[t]=Math.fround(r[t]-i)}return{hi:e,lo:a}}function dr(r,o){let e=r.length,a=new Float64Array(e);for(let t=0;t<e;t++)a[t]=r[t]+o[t];return a}var Vr=class{constructor(o,e){this.re=o,this.im=e}},Lr=class extends Array{constructor(o){if(o===void 0){super();return}if(typeof o=="number"){super(o);for(let a=0;a<o;a++)this[a]=new Vr(0,0);return}let e=Array.from(o);if(super(),e.length!==0){if(e[0]instanceof Vr){for(let a of e){if(!(a instanceof Vr))throw new Error("Complex64Array expects every element to be a Complex64.");this.push(a)}return}if(e.length%2!==0)throw new Error("Complex64Array expects an even number of interleaved [re, im, ...] values.");for(let a=0;a<e.length;a+=2){if(typeof e[a]!="number"||typeof e[a+1]!="number")throw new Error("Complex64Array expects interleaved [re, im, ...] values to be numbers.");this.push(new Vr(e[a],e[a+1]))}}}};function te(r,o=r.length){let e=new Float32Array(o*2);for(let a=0;a<o;a++)e[a*2]=r[a].re,e[a*2+1]=r[a].im;return e}function he(r,o=r.length){let e=new Float64Array(o),a=new Float64Array(o);for(let l=0;l<o;l++)e[l]=r[l].re,a[l]=r[l].im;let{hi:t,lo:i}=U(e),{hi:s,lo:u}=U(a),n=new Float32Array(o*2),d=new Float32Array(o*2);for(let l=0;l<o;l++)n[l*2]=t[l],n[l*2+1]=s[l],d[l*2]=i[l],d[l*2+1]=u[l];return{hi:n,lo:d}}function be(r,o){let e=r.length/2,a=new Float32Array(e),t=new Float32Array(e),i=new Float32Array(e),s=new Float32Array(e);for(let l=0;l<e;l++)a[l]=r[l*2],i[l]=r[l*2+1],t[l]=o[l*2],s[l]=o[l*2+1];let u=dr(a,t),n=dr(i,s),d=new Lr(e);for(let l=0;l<e;l++)d[l]=new Vr(u[l],n[l]);return d}var Or=class{constructor(o,e){this.re=Math.fround(o),this.im=Math.fround(e)}},Br=class extends Array{constructor(o){if(o===void 0){super();return}if(typeof o=="number"){super(o);for(let a=0;a<o;a++)this[a]=new Or(0,0);return}let e=Array.from(o);if(super(),e.length!==0){if(e[0]instanceof Or){for(let a of e){if(!(a instanceof Or))throw new Error("Complex32Array expects every element to be a Complex32.");this.push(a)}return}if(e.length%2!==0)throw new Error("Complex32Array expects an even number of interleaved [re, im, ...] values.");for(let a=0;a<e.length;a+=2){if(typeof e[a]!="number"||typeof e[a+1]!="number")throw new Error("Complex32Array expects interleaved [re, im, ...] values to be numbers.");this.push(new Or(e[a],e[a+1]))}}}};var M=class r{constructor(o,e,a=Float32Array,t=null,i=null){this._buf=o,this._loBuf=t,this.length=e,this.dtype=a,this.device=i??re()}static from(o,e){let a=o instanceof GPUDevice,t=a?o:re(),i=a?e:o;if(i instanceof Float64Array){let{hi:u,lo:n}=U(i),d=h(t,u,"gpu-vector-f64-hi",!0),l=h(t,n,"gpu-vector-f64-lo",!0);return new r(d,i.length,Float64Array,l,t)}if(i instanceof Br){let u=h(t,te(i),"gpu-vector-complex32",!0);return new r(u,i.length,Br,null,t)}if(i instanceof Lr){let{hi:u,lo:n}=he(i),d=h(t,u,"gpu-vector-complex64-hi",!0),l=h(t,n,"gpu-vector-complex64-lo",!0);return new r(d,i.length,Lr,l,t)}if(!(i instanceof Float32Array))throw new Error("GpuVector.from expects a Float32Array, Float64Array, Complex32Array, or Complex64Array.");let s=h(t,i,"gpu-vector",!0);return new r(s,i.length,i.constructor,null,t)}async read(){let o=this.device,e=o.createCommandEncoder(),a=E(o,e,this._buf);if(o.queue.submit([e.finish()]),this.dtype===Br)return new Br(await G(a,Float32Array));if(!this._loBuf)return G(a,this.dtype);let t=o.createCommandEncoder(),i=E(o,t,this._loBuf);o.queue.submit([t.finish()]);let[s,u]=await Promise.all([G(a,Float32Array),G(i,Float32Array)]);return this.dtype===Lr?be(s,u):dr(s,u)}destroy(){this._buf.destroy(),this._loBuf&&this._loBuf.destroy()}};var X=class r{constructor(o,e,a,t,i=null,s="row-major",u=null,n=Float32Array){this._buf=o,this._loBuf=i,this.rows=e,this.cols=a,this.lda=t,this.layout=s,this.dtype=n,this.device=u??re()}static from(o,...e){let a=o instanceof GPUDevice,t=a?o:re(),i=a?e.shift():o,[s,u,n,d="row-major"]=e;if(d!=="row-major"&&d!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");let l=d==="row-major";if(n===void 0&&(n=l?u:s),!(i instanceof Float32Array)&&!(i instanceof Float64Array)&&!(i instanceof Br)&&!(i instanceof Lr))throw new Error("GpuMatrix.from expects a Float32Array, Float64Array, Complex32Array, or Complex64Array.");if(!Number.isInteger(s)||s<=0)throw new Error("rows must be a positive integer.");if(!Number.isInteger(u)||u<=0)throw new Error("cols must be a positive integer.");let m=l?u:s;if(!Number.isInteger(n)||n<m)throw new Error(`lda must be an integer >= ${l?"cols":"rows"}.`);let w=l?s:u;if(i.length<w*n)throw new Error("data does not have enough elements for the given rows, cols, and lda.");if(i instanceof Float64Array){let p=w*n,{hi:g,lo:y}=U(i.subarray(0,p)),b=h(t,g,"gpu-matrix-f64-hi",!0),x=h(t,y,"gpu-matrix-f64-lo",!0);return new r(b,s,u,n,x,d,t,Float64Array)}if(i instanceof Br){let p=h(t,te(i,w*n),"gpu-matrix-complex32",!0);return new r(p,s,u,n,null,d,t,Br)}if(i instanceof Lr){let{hi:p,lo:g}=he(i,w*n),y=h(t,p,"gpu-matrix-complex64-hi",!0),b=h(t,g,"gpu-matrix-complex64-lo",!0);return new r(y,s,u,n,b,d,t,Lr)}let c=h(t,i.subarray(0,w*n),"gpu-matrix",!0);return new r(c,s,u,n,null,d,t)}async read(){let o=this.device,e=o.createCommandEncoder(),a=E(o,e,this._buf);o.queue.submit([e.finish()]);let t=this.layout!=="column-major",i=t?this.rows:this.cols,s=t?this.cols:this.rows;if(this.dtype===Br){let d=new Br(await G(a,Float32Array));if(this.lda===s)return d;let l=new Br(i*s);for(let m=0;m<i;m++)for(let w=0;w<s;w++)l[m*s+w]=d[m*this.lda+w];return l}if(this._loBuf){let d=o.createCommandEncoder(),l=E(o,d,this._loBuf);o.queue.submit([d.finish()]);let[m,w]=await Promise.all([G(a,Float32Array),G(l,Float32Array)]);if(this.dtype===Lr){let g=be(m,w);if(this.lda===s)return g;let y=new Lr(i*s);for(let b=0;b<i;b++)for(let x=0;x<s;x++)y[b*s+x]=g[b*this.lda+x];return y}let c=dr(m,w);if(this.lda===s)return c;let p=new Float64Array(i*s);for(let g=0;g<i;g++)p.set(c.subarray(g*this.lda,g*this.lda+s),g*s);return p}let u=await G(a,Float32Array);if(this.lda===s)return u;let n=new Float32Array(i*s);for(let d=0;d<i;d++)n.set(u.subarray(d*this.lda,d*this.lda+s),d*s);return n}destroy(){this._buf.destroy(),this._loBuf&&this._loBuf.destroy()}};function ze(r){let o=r>>>0;return function(){o=o+1831565813|0;let e=Math.imul(o^o>>>15,1|o);return e=e+Math.imul(e^e>>>7,61|e)^e,((e^e>>>14)>>>0)/4294967296}}function Ye(r,o=-1,e=1,a){let t=new Float32Array(r),i=a===void 0?Math.random:ze(a);for(let s=0;s<r;s++)t[s]=o+i()*(e-o);return t}function Ze(r,o=-1,e=1,a){let t=new Float64Array(r),i=a===void 0?Math.random:ze(a);for(let s=0;s<r;s++)t[s]=o+i()*(e-o);return t}function Xe(r,o,e="lower",a=-1,t=1,i=5,s=15,u="row-major"){if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(u!=="row-major"&&u!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(o<r)throw new Error("lda must be >= n.");let n=u==="column-major",d=(m,w)=>n?w*o+m:m*o+w,l=new Float32Array(r*o);for(let m=0;m<r;m++){for(let w=0;w<r;w++){if(m===w)continue;(e==="lower"?w<m:w>m)&&(l[d(m,w)]=a+Math.random()*(t-a))}l[d(m,m)]=i+Math.random()*(s-i)}return l}function D(r,o,e,a=0){let t=e.map((i,s)=>({binding:a+s,resource:i instanceof GPUBuffer?{buffer:i}:i}));return r.createBindGroup({layout:o,entries:t})}function F(r,o){r.queue.submit([o.finish()])}function Mr(r){let{querySet:o,passDescriptor:e}=Te(r);return{commandEncoder:r.createCommandEncoder(),querySet:o,passDescriptor:e}}function hr(r,o,e,a,t){let i=r.beginComputePass(t);i.setPipeline(o),i.setBindGroup(0,e),typeof a=="number"?i.dispatchWorkgroups(a):i.dispatchWorkgroups(a.x,a.y,a.z??1),i.end()}function O(r,o,e,a){let{commandEncoder:t,querySet:i,passDescriptor:s}=Mr(r);hr(t,o,e,a,s);let u=kr(r,t,i);return{commandEncoder:t,ts:u}}var vs={},Ie=new WeakMap;async function P(r,o,e="main"){Ie.has(r)||Ie.set(r,new Map);let a=Ie.get(r),t=Array.isArray(o)?o:[o],i=`${t.join("+")}::${e}`;if(!a.has(i)){let s=xs(r,t,e).catch(u=>{throw a.delete(i),u});a.set(i,s)}return a.get(i)}async function ys(r){if(typeof process>"u"||!process.versions?.node){let{shaderSources:o}=await Promise.resolve().then(()=>(ea(),ra)),e=o[r];if(!e)throw new Error(`Shader "${r}" not found in browser bundle.`);return e}else{let{readFileSync:o}=await import("fs"),{fileURLToPath:e}=await import("url"),{dirname:a,join:t}=await import("path"),i=a(e(vs.url));return o(t(i,`../shaders/${r}.wgsl`),"utf8")}}async function xs(r,o,e="main"){let a=o.join("+"),t=await Promise.all(o.map(ys)),i=0,s=t.map((p,g)=>{let y=p.split(`
4484
+ `).length,b={name:o[g],startLine:i+1,endLine:i+y};return i+=y,b}),u=p=>{let g=p&&s.find(y=>p>=y.startLine&&p<=y.endLine);return g?`${g.name}.wgsl:${p-g.startLine+1}`:`line ${p}`},n=t.join(`
4485
+ `),d=r.createShaderModule({label:a,code:n}),m=(await d.getCompilationInfo()).messages.filter(p=>p.type==="error");if(m.length>0)throw new Error(`Shader "${a}" compilation failed:
4486
+ ${m.map(p=>` ${u(p.lineNum)}: ${p.message}`).join(`
4487
+ `)}`);let w=e==="main"?{module:d}:{module:d,entryPoint:e},c=r.createComputePipeline({label:a,layout:"auto",compute:w});return c._shaderModule=d,c}function br(r,o,e){let a=r.limits.maxComputeWorkgroupsPerDimension;return e===void 0?Math.min(Math.ceil(o/64),a):{x:Math.min(Math.ceil(e/8),a),y:Math.min(Math.ceil(o/8),a)}}function or(r,o,e,a="x"){let t=r.limits.maxComputeWorkgroupsPerDimension;if(o>t)throw new Error(`${e}: this problem needs ${o} workgroups in ${a}, but the device allows ${t} (maxComputeWorkgroupsPerDimension). The operands are too large for this device \u2014 split the operation into smaller blocks.`);return o}function Yr(r,o,e,a){return a===void 0?or(r,Math.ceil(e/64),o):{x:or(r,Math.ceil(a/8),o,"x"),y:or(r,Math.ceil(e/8),o,"y")}}function H(r){if(!(r instanceof GPUDevice))throw new Error("device must be a GPUDevice.")}function T(r,o,e){for(let[a,t]of Object.entries(e))if(!(!(t instanceof M)&&!(t instanceof X))&&t.device!==r)throw new Error(`${o}: ${a} belongs to a different GPUDevice than the one passed in. GPU buffers cannot be shared across devices \u2014 recreate the operand on this device, or call the routine with the device that owns it.`)}async function ta(r,o,e,a,t){let i=a instanceof M;if(H(r),T(r,"sscal",{x:a}),!Number.isInteger(o)||!Number.isInteger(t))throw new Error("n and incx must be integers.");if(typeof e!="number")throw new Error("alpha must be a number.");if(Number.isNaN(e))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e))throw new Error("alpha must be finite.");if(t<=0)throw new Error("incx must be positive.");if(!(a instanceof Float32Array)&&!(a instanceof M))throw new Error("x must be a Float32Array or GpuVector.");if(o<=0)return i?{}:{x:a};if(a.length<(o-1)*t+1)throw new Error("x does not have enough elements for the given n and incx.");let s=await P(r,"sscal"),u=null,n=null,d=null;try{u=i?a._buf:h(r,a,"sscal-x",!0),n=q(r,[{value:o,type:"u32"},{value:e,type:"f32"},{value:t,type:"u32"}],"sscal-params");let l=D(r,s.getBindGroupLayout(0),[u,n]),{commandEncoder:m,ts:w}=O(r,s,l,br(r,o));d=i?null:E(r,m,u),F(r,m);let c=await j(w);if(i)return c!==void 0?{gpuTimeMs:c}:{};let p=await G(d,Float32Array);return d=null,c!==void 0?{x:p,gpuTimeMs:c}:{x:p}}finally{!i&&u&&f(u),n&&f(n),d&&f(d)}}async function oa(r,o,e,a,t){let i=a instanceof M;if(H(r),T(r,"cscal",{x:a}),!Number.isInteger(o)||!Number.isInteger(t))throw new Error("n and incx must be integers.");if(!(e instanceof Or))throw new Error("alpha must be a Complex32.");if(Number.isNaN(e.re)||Number.isNaN(e.im))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e.re)||!Number.isFinite(e.im))throw new Error("alpha must be finite.");if(t<=0)throw new Error("incx must be positive.");if(!(a instanceof Br)&&!i)throw new Error("x must be a Complex32Array or GpuVector.");if(i&&a.dtype!==Br)throw new Error("x must be a Complex32Array-backed GpuVector.");if(o<=0)return i?{}:{x:a};if(a.length<(o-1)*t+1)throw new Error("x does not have enough elements for the given n and incx.");let s=await P(r,"cscal"),u=null,n=null,d=null;try{u=i?a._buf:h(r,te(a),"cscal-x",!0),n=q(r,[{value:o,type:"u32"},{value:e.re,type:"f32"},{value:e.im,type:"f32"},{value:t,type:"u32"}],"cscal-params");let l=D(r,s.getBindGroupLayout(0),[u,n]),{commandEncoder:m,ts:w}=O(r,s,l,br(r,o));d=i?null:E(r,m,u),F(r,m);let c=await j(w);if(i)return c!==void 0?{gpuTimeMs:c}:{};let p=await G(d,Float32Array);d=null;let g=new Br(p);return c!==void 0?{x:g,gpuTimeMs:c}:{x:g}}finally{!i&&u&&f(u),n&&f(n),d&&f(d)}}async function aa(r,o,e,a,t){let i=a instanceof M;if(H(r),!Number.isInteger(o)||!Number.isInteger(t))throw new Error("n and incx must be integers.");if(typeof e!="number")throw new Error("alpha must be a number.");if(Number.isNaN(e))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e))throw new Error("alpha must be finite.");if(!(a instanceof Float64Array)&&!i)throw new Error("x must be a Float64Array or GpuVector.");if(i&&a.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(t<=0)throw new Error("incx must be positive.");if(T(r,"dscal",{x:a}),o<=0)return i?{}:{x:a};if(a.length<(o-1)*t+1)throw new Error("x does not have enough elements for the given n and incx.");let u=await P(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"dscal"]),{hi:n,lo:d}=U(new Float64Array([e])),l=null,m=null,w=null,c=null,p=null;try{if(i)l=a._buf,m=a._loBuf;else{let{hi:S,lo:_}=U(a);l=h(r,S,"dscal-xHi",!0),m=h(r,_,"dscal-xLo",!0)}w=q(r,[{value:o,type:"u32"},{value:n[0],type:"f32"},{value:d[0],type:"f32"},{value:t,type:"u32"}],"dscal-params");let g=D(r,u.getBindGroupLayout(0),[l,m,w]),{commandEncoder:y,ts:b}=O(r,u,g,br(r,o));c=i?null:E(r,y,l),p=i?null:E(r,y,m),F(r,y);let x=await j(b);if(i)return x!==void 0?{gpuTimeMs:x}:{};let v=await G(c,Float32Array);c=null;let B=await G(p,Float32Array);p=null;let A=dr(v,B);return x!==void 0?{x:A,gpuTimeMs:x}:{x:A}}finally{!i&&l&&f(l),!i&&m&&f(m),w&&f(w),c&&f(c),p&&f(p)}}async function ia(r,o,e,a,t,i){let s=e instanceof M,u=t instanceof M;if(H(r),T(r,"sswap",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!(e instanceof Float32Array)&&!(e instanceof M))throw new Error("x must be a Float32Array or GpuVector.");if(!(t instanceof Float32Array)&&!(t instanceof M))throw new Error("y must be a Float32Array or GpuVector.");if(e.constructor!==t.constructor)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(o<=0)return s?{}:{x:e,y:t};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await P(r,"sswap"),d=null,l=null,m=null,w=null,c=null;try{d=s?e._buf:h(r,e,"sswap-x",!0),l=u?t._buf:h(r,t,"sswap-y",!0),m=q(r,[{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"u32"}],"sswap-params");let p=D(r,n.getBindGroupLayout(0),[d,l,m]),{commandEncoder:g,ts:y}=O(r,n,p,br(r,o));w=s?null:E(r,g,d),c=u?null:E(r,g,l),F(r,g);let b=await j(y);if(s)return b!==void 0?{gpuTimeMs:b}:{};let x=await G(w,Float32Array);w=null;let v=await G(c,Float32Array);return c=null,b!==void 0?{x,y:v,gpuTimeMs:b}:{x,y:v}}finally{!s&&d&&f(d),!u&&l&&f(l),m&&f(m),w&&f(w),c&&f(c)}}async function sa(r,o,e,a,t,i){let s=e instanceof M,u=t instanceof M;if(H(r),T(r,"dswap",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!(e instanceof Float64Array)&&!s)throw new Error("x must be a Float64Array or GpuVector.");if(!(t instanceof Float64Array)&&!u)throw new Error("y must be a Float64Array or GpuVector.");if(s&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(u&&t.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(s!==u)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(o<=0)return s?{}:{x:e,y:t};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await P(r,"dswap"),d=null,l=null,m=null,w=null,c=null,p=null,g=null,y=null,b=null;try{if(s)d=e._buf,l=e._loBuf,m=t._buf,w=t._loBuf;else{let R=U(e),W=U(t);d=h(r,R.hi,"dswap-xHi",!0),l=h(r,R.lo,"dswap-xLo",!0),m=h(r,W.hi,"dswap-yHi",!0),w=h(r,W.lo,"dswap-yLo",!0)}c=q(r,[{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"u32"}],"dswap-params");let x=D(r,n.getBindGroupLayout(0),[d,l,m,w,c]),{commandEncoder:v,ts:B}=O(r,n,x,br(r,o));p=s?null:E(r,v,d),g=s?null:E(r,v,l),y=u?null:E(r,v,m),b=u?null:E(r,v,w),F(r,v);let A=await j(B);if(s)return A!==void 0?{gpuTimeMs:A}:{};let S=await G(p,Float32Array);p=null;let _=await G(g,Float32Array);g=null;let N=await G(y,Float32Array);y=null;let I=await G(b,Float32Array);b=null;let k=dr(S,_),L=dr(N,I);return A!==void 0?{x:k,y:L,gpuTimeMs:A}:{x:k,y:L}}finally{!s&&d&&f(d),!s&&l&&f(l),!u&&m&&f(m),!u&&w&&f(w),c&&f(c),p&&f(p),g&&f(g),y&&f(y),b&&f(b)}}async function na(r,o,e,a,t,i,s){let u=a instanceof M,n=i instanceof M;if(H(r),T(r,"saxpy",{x:a,y:i}),!Number.isInteger(o)||!Number.isInteger(t)||!Number.isInteger(s))throw new Error("n, incx, and incy must be integers.");if(typeof e!="number")throw new Error("alpha must be a number.");if(Number.isNaN(e))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e))throw new Error("alpha must be finite.");if(t<=0||s<=0)throw new Error("incx and incy must be positive.");if(!u&&!(a instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!n&&!(i instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(u!==n)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(o<=0)return n?{}:{y:i};if(a.length<(o-1)*t+1)throw new Error("x does not have enough elements for the given n and incx.");if(i.length<(o-1)*s+1)throw new Error("y does not have enough elements for the given n and incy.");let d=await P(r,"saxpy"),l=null,m=null,w=null,c=null;try{l=u?a._buf:h(r,a,"saxpy-x",!1),m=n?i._buf:h(r,i,"saxpy-y",!0),w=q(r,[{value:o,type:"u32"},{value:e,type:"f32"},{value:t,type:"u32"},{value:s,type:"u32"}],"saxpy-params");let p=D(r,d.getBindGroupLayout(0),[l,m,w]),{commandEncoder:g,ts:y}=O(r,d,p,br(r,o));c=n?null:E(r,g,m),F(r,g);let b=await j(y);if(n)return b!==void 0?{gpuTimeMs:b}:{};let x=await G(c,Float32Array);return c=null,b!==void 0?{y:x,gpuTimeMs:b}:{y:x}}finally{!u&&l&&f(l),!n&&m&&f(m),w&&f(w),c&&f(c)}}async function la(r,o,e,a,t,i,s){let u=a instanceof M,n=i instanceof M;if(H(r),!Number.isInteger(o)||!Number.isInteger(t)||!Number.isInteger(s))throw new Error("n, incx, and incy must be integers.");if(typeof e!="number")throw new Error("alpha must be a number.");if(Number.isNaN(e))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e))throw new Error("alpha must be finite.");if(!(a instanceof Float64Array)&&!u)throw new Error("x must be a Float64Array or GpuVector.");if(!(i instanceof Float64Array)&&!n)throw new Error("y must be a Float64Array or GpuVector.");if(u&&a.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(n&&i.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(u!==n)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(t<=0||s<=0)throw new Error("incx and incy must be positive.");if(T(r,"daxpy",{x:a,y:i}),o<=0)return n?{}:{y:i};if(a.length<(o-1)*t+1)throw new Error("x does not have enough elements for the given n and incx.");if(i.length<(o-1)*s+1)throw new Error("y does not have enough elements for the given n and incy.");let l=await P(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"daxpy"]),{hi:m,lo:w}=U(new Float64Array([e])),c=null,p=null,g=null,y=null,b=null,x=null,v=null;try{if(u)c=a._buf,p=a._loBuf,g=i._buf,y=i._loBuf;else{let L=U(a),R=U(i);c=h(r,L.hi,"daxpy-xHi",!1),p=h(r,L.lo,"daxpy-xLo",!1),g=h(r,R.hi,"daxpy-yHi",!0),y=h(r,R.lo,"daxpy-yLo",!0)}b=q(r,[{value:o,type:"u32"},{value:m[0],type:"f32"},{value:w[0],type:"f32"},{value:t,type:"u32"},{value:s,type:"u32"}],"daxpy-params");let B=D(r,l.getBindGroupLayout(0),[c,p,g,y,b]),{commandEncoder:A,ts:S}=O(r,l,B,br(r,o));x=n?null:E(r,A,g),v=n?null:E(r,A,y),F(r,A);let _=await j(S);if(n)return _!==void 0?{gpuTimeMs:_}:{};let N=await G(x,Float32Array);x=null;let I=await G(v,Float32Array);v=null;let k=dr(N,I);return _!==void 0?{y:k,gpuTimeMs:_}:{y:k}}finally{!u&&c&&f(c),!u&&p&&f(p),!n&&g&&f(g),!n&&y&&f(y),b&&f(b),x&&f(x),v&&f(v)}}async function ua(r,o,e,a,t,i){let s=e instanceof M,u=t instanceof M;if(H(r),T(r,"scopy",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!s&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!u&&!(t instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(s!==u)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(o<=0)return u?{}:{y:t};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await P(r,"scopy"),d=null,l=null,m=null,w=null;try{d=s?e._buf:h(r,e,"scopy-x",!1),l=u?t._buf:h(r,t,"scopy-y",!0),m=q(r,[{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"u32"}],"scopy-params");let c=D(r,n.getBindGroupLayout(0),[d,l,m]),{commandEncoder:p,ts:g}=O(r,n,c,br(r,o));w=u?null:E(r,p,l),F(r,p);let y=await j(g);if(u)return y!==void 0?{gpuTimeMs:y}:{};let b=await G(w,Float32Array);return w=null,y!==void 0?{y:b,gpuTimeMs:y}:{y:b}}finally{!s&&d&&f(d),!u&&l&&f(l),m&&f(m),w&&f(w)}}async function da(r,o,e,a,t,i){let s=e instanceof M,u=t instanceof M;if(H(r),T(r,"dcopy",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!(e instanceof Float64Array)&&!s)throw new Error("x must be a Float64Array or GpuVector.");if(!(t instanceof Float64Array)&&!u)throw new Error("y must be a Float64Array or GpuVector.");if(s&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(u&&t.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(s!==u)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(o<=0)return u?{}:{y:t};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await P(r,"dcopy"),d=null,l=null,m=null,w=null,c=null,p=null,g=null;try{if(s)d=e._buf,l=e._loBuf,m=t._buf,w=t._loBuf;else{let _=U(e),N=U(t);d=h(r,_.hi,"dcopy-xHi",!1),l=h(r,_.lo,"dcopy-xLo",!1),m=h(r,N.hi,"dcopy-yHi",!0),w=h(r,N.lo,"dcopy-yLo",!0)}c=q(r,[{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"u32"}],"dcopy-params");let y=D(r,n.getBindGroupLayout(0),[d,l,m,w,c]),{commandEncoder:b,ts:x}=O(r,n,y,br(r,o));p=u?null:E(r,b,m),g=u?null:E(r,b,w),F(r,b);let v=await j(x);if(u)return v!==void 0?{gpuTimeMs:v}:{};let B=await G(p,Float32Array);p=null;let A=await G(g,Float32Array);g=null;let S=dr(B,A);return v!==void 0?{y:S,gpuTimeMs:v}:{y:S}}finally{!s&&d&&f(d),!s&&l&&f(l),!u&&m&&f(m),!u&&w&&f(w),c&&f(c),p&&f(p),g&&f(g)}}async function fa(r,o,e,a,t,i){let s=e instanceof M,u=t instanceof M;if(H(r),T(r,"sdot",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!s&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!u&&!(t instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(s!==u)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(o<=0)return{dot:0};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await P(r,"sdot"),d=await P(r,"reduction/sum"),l=null,m=null,w=null,c=null,p=null,g=null;try{l=s?e._buf:h(r,e,"sdot-x",!1),m=u?t._buf:h(r,t,"sdot-y",!1),w=fr(r,512,"sdot-partials"),c=Ar(r,4,"sdot-result"),p=q(r,[{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"u32"}],"sdot-params");let y=D(r,n.getBindGroupLayout(0),[l,m,w,p]),{commandEncoder:b,ts:x}=O(r,n,y,128);F(r,b);let v=D(r,d.getBindGroupLayout(0),[w,c]),{commandEncoder:B,ts:A}=O(r,d,v,1);g=E(r,B,c),F(r,B);let S=G(g,Float32Array);g=null;let[_,N,I]=await Promise.all([j(x),j(A),S]);return _!==void 0&&N!==void 0?{dot:I[0],gpuTimeMs:_+N}:{dot:I[0]}}finally{!s&&l&&f(l),!u&&m&&f(m),w&&f(w),c&&f(c),p&&f(p),g&&f(g)}}async function ma(r,o,e,a){let t=e instanceof M;if(H(r),T(r,"sasum",{x:e}),!Number.isInteger(o)||!Number.isInteger(a))throw new Error("n and incx must be integers.");if(a<=0)throw new Error("incx must be positive.");if(!t&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(o<=0)return{asum:0};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await P(r,"sasum"),s=await P(r,"reduction/sum"),u=null,n=null,d=null,l=null,m=null;try{u=t?e._buf:h(r,e,"sasum-x",!1),n=fr(r,512,"sasum-partials"),d=Ar(r,4,"sasum-result"),l=q(r,[{value:o,type:"u32"},{value:a,type:"u32"}],"sasum-params");let w=D(r,i.getBindGroupLayout(0),[u,n,l]),{commandEncoder:c,ts:p}=O(r,i,w,128);F(r,c);let g=D(r,s.getBindGroupLayout(0),[n,d]),{commandEncoder:y,ts:b}=O(r,s,g,1);m=E(r,y,d),F(r,y);let x=G(m,Float32Array);m=null;let[v,B,A]=await Promise.all([j(p),j(b),x]);return v!==void 0&&B!==void 0?{asum:A[0],gpuTimeMs:v+B}:{asum:A[0]}}finally{!t&&u&&f(u),n&&f(n),d&&f(d),l&&f(l),m&&f(m)}}async function ca(r,o,e,a){let t=e instanceof M;if(H(r),T(r,"dasum",{x:e}),!Number.isInteger(o)||!Number.isInteger(a))throw new Error("n and incx must be integers.");if(a<=0)throw new Error("incx must be positive.");if(!t&&!(e instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(t&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(o<=0)return{asum:0};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");let i=["f64/dekker","f64/utils/abs","f64/utils/add"],s=await P(r,[...i,"dasum"]),u=await P(r,[...i,"reduction/sumF64"]),n=null,d=null,l=null,m=null,w=null,c=null,p=null,g=null,y=null;try{if(t)n=e._buf,d=e._loBuf;else{let{hi:V,lo:C}=U(e.map(Math.abs));n=h(r,V,"dasum-xHi",!1),d=h(r,C,"dasum-xLo",!1)}l=fr(r,512,"dasum-partialsHi"),m=fr(r,512,"dasum-partialsLo"),w=Ar(r,4,"dasum-result-hi"),c=Ar(r,4,"dasum-result-lo"),p=q(r,[{value:o,type:"u32"},{value:a,type:"u32"}],"dasum-params");let b=D(r,s.getBindGroupLayout(0),[n,d,l,m,p]),{commandEncoder:x,ts:v}=O(r,s,b,128);F(r,x);let B=D(r,u.getBindGroupLayout(0),[l,m,w,c]),{commandEncoder:A,ts:S}=O(r,u,B,1);g=E(r,A,w),y=E(r,A,c),F(r,A);let _=G(g,Float32Array),N=G(y,Float32Array);g=null,y=null;let[I,k,L,R]=await Promise.all([j(v),j(S),_,N]),W=dr(L,R)[0];return I!==void 0&&k!==void 0?{asum:W,gpuTimeMs:I+k}:{asum:W}}finally{!t&&n&&f(n),!t&&d&&f(d),l&&f(l),m&&f(m),w&&f(w),c&&f(c),p&&f(p),g&&f(g),y&&f(y)}}async function pa(r,o,e,a,t,i){let s=e instanceof M,u=t instanceof M;if(H(r),T(r,"ddot",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!s&&!(e instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(!u&&!(t instanceof Float64Array))throw new Error("y must be a Float64Array or GpuVector.");if(s&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(u&&t.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(s!==u)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(o<=0)return{dot:0};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=["f64/dekker","f64/utils/add"],d=await P(r,[...n,"f64/utils/multiply","ddot"]),l=await P(r,[...n,"reduction/sumF64"]),m=null,w=null,c=null,p=null,g=null,y=null,b=null,x=null,v=null,B=null,A=null;try{if(s)m=e._buf,w=e._loBuf,c=t._buf,p=t._loBuf;else{let $=U(e),J=U(t);m=h(r,$.hi,"ddot-xHi",!1),w=h(r,$.lo,"ddot-xLo",!1),c=h(r,J.hi,"ddot-yHi",!1),p=h(r,J.lo,"ddot-yLo",!1)}g=fr(r,512,"ddot-partialsHi"),y=fr(r,512,"ddot-partialsLo"),b=Ar(r,4,"ddot-result-hi"),x=Ar(r,4,"ddot-result-lo"),v=q(r,[{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"u32"}],"ddot-params");let S=D(r,d.getBindGroupLayout(0),[m,w,c,p,g,y,v]),{commandEncoder:_,ts:N}=O(r,d,S,128);F(r,_);let I=D(r,l.getBindGroupLayout(0),[g,y,b,x]),{commandEncoder:k,ts:L}=O(r,l,I,1);B=E(r,k,b),A=E(r,k,x),F(r,k);let R=G(B,Float32Array),W=G(A,Float32Array);B=null,A=null;let[V,C,z,K]=await Promise.all([j(N),j(L),R,W]),Y=dr(z,K)[0];return V!==void 0&&C!==void 0?{dot:Y,gpuTimeMs:V+C}:{dot:Y}}finally{!s&&m&&f(m),!s&&w&&f(w),!u&&c&&f(c),!u&&p&&f(p),g&&f(g),y&&f(y),b&&f(b),x&&f(x),v&&f(v),B&&f(B),A&&f(A)}}async function wa(r,o,e,a){let t=e instanceof M;if(H(r),T(r,"snrm2",{x:e}),!Number.isInteger(o)||!Number.isInteger(a))throw new Error("n and incx must be integers.");if(a<=0)throw new Error("incx must be positive.");if(!t&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(o<=0)return{nrm2:0};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await P(r,"snrm2"),s=await P(r,"reduction/scaledSum"),u=null,n=null,d=null,l=null,m=null,w=null;try{u=t?e._buf:h(r,e,"snrm2-x",!1),n=fr(r,512,"snrm2-partials-scale"),d=fr(r,512,"snrm2-partials-ssq"),l=Ar(r,4,"snrm2-result"),m=q(r,[{value:o,type:"u32"},{value:a,type:"u32"}],"snrm2-params");let c=D(r,i.getBindGroupLayout(0),[u,n,d,m]),{commandEncoder:p,ts:g}=O(r,i,c,128);F(r,p);let y=D(r,s.getBindGroupLayout(0),[n,d,l]),{commandEncoder:b,ts:x}=O(r,s,y,1);w=E(r,b,l),F(r,b);let v=G(w,Float32Array);w=null;let[B,A,S]=await Promise.all([j(g),j(x),v]),_=S[0];return B!==void 0&&A!==void 0?{nrm2:_,gpuTimeMs:B+A}:{nrm2:_}}finally{!t&&u&&f(u),n&&f(n),d&&f(d),l&&f(l),m&&f(m),w&&f(w)}}async function ga(r,o,e,a){let t=e instanceof M;if(H(r),T(r,"dnrm2",{x:e}),!Number.isInteger(o)||!Number.isInteger(a))throw new Error("n and incx must be integers.");if(a<=0)throw new Error("incx must be positive.");if(!t&&!(e instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(t&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(o<=0)return{nrm2:0};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");let i=["f64/dekker","f64/utils/abs","f64/utils/greater","f64/utils/add","f64/utils/multiply","f64/utils/divide","f64/utils/sqrt"],s=await P(r,[...i,"dnrm2"]),u=await P(r,[...i,"reduction/scaledSumF64"]),n=null,d=null,l=null,m=null,w=null,c=null,p=null,g=null,y=null,b=null,x=null;try{if(t)n=e._buf,d=e._loBuf;else{let{hi:z,lo:K}=U(e);n=h(r,z,"dnrm2-xHi",!1),d=h(r,K,"dnrm2-xLo",!1)}l=fr(r,512,"dnrm2-partials-scaleHi"),m=fr(r,512,"dnrm2-partials-scaleLo"),w=fr(r,512,"dnrm2-partials-ssqHi"),c=fr(r,512,"dnrm2-partials-ssqLo"),p=Ar(r,4,"dnrm2-result-hi"),g=Ar(r,4,"dnrm2-result-lo"),y=q(r,[{value:o,type:"u32"},{value:a,type:"u32"}],"dnrm2-params");let v=D(r,s.getBindGroupLayout(0),[n,d,l,m,w,c,y]),{commandEncoder:B,ts:A}=O(r,s,v,128);F(r,B);let S=D(r,u.getBindGroupLayout(0),[l,m,w,c,p,g]),{commandEncoder:_,ts:N}=O(r,u,S,1);b=E(r,_,p),x=E(r,_,g),F(r,_);let I=G(b,Float32Array),k=G(x,Float32Array);b=null,x=null;let[L,R,W,V]=await Promise.all([j(A),j(N),I,k]),C=dr(W,V)[0];return L!==void 0&&R!==void 0?{nrm2:C,gpuTimeMs:L+R}:{nrm2:C}}finally{!t&&n&&f(n),!t&&d&&f(d),l&&f(l),m&&f(m),w&&f(w),c&&f(c),p&&f(p),g&&f(g),y&&f(y),b&&f(b),x&&f(x)}}async function ha(r,o,e,a){let t=e instanceof M;if(H(r),T(r,"isamax",{x:e}),!Number.isInteger(o)||!Number.isInteger(a))throw new Error("n and incx must be integers.");if(a<=0)throw new Error("incx must be positive.");if(!t&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(o<=0)return{index:0};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await P(r,"isamax"),s=await P(r,"reduction/argmax"),u=null,n=null,d=null,l=null,m=null,w=null;try{u=t?e._buf:h(r,e,"isamax-x",!1),n=fr(r,512,"isamax-partials-val"),d=fr(r,512,"isamax-partials-idx"),l=Ar(r,4,"isamax-result"),m=q(r,[{value:o,type:"u32"},{value:a,type:"u32"}],"isamax-params");let c=D(r,i.getBindGroupLayout(0),[u,n,d,m]),{commandEncoder:p,ts:g}=O(r,i,c,128);F(r,p);let y=D(r,s.getBindGroupLayout(0),[n,d,l]),{commandEncoder:b,ts:x}=O(r,s,y,1);w=E(r,b,l),F(r,b);let v=G(w,Uint32Array);w=null;let[B,A,S]=await Promise.all([j(g),j(x),v]),_=S[0];return B!==void 0&&A!==void 0?{index:_,gpuTimeMs:B+A}:{index:_}}finally{!t&&u&&f(u),n&&f(n),d&&f(d),l&&f(l),m&&f(m),w&&f(w)}}async function ba(r,o,e,a){let t=e instanceof M;if(H(r),T(r,"idamax",{x:e}),!Number.isInteger(o)||!Number.isInteger(a))throw new Error("n and incx must be integers.");if(a<=0)throw new Error("incx must be positive.");if(!t&&!(e instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(t&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(o<=0)return{index:0};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");let i=["f64/dekker","f64/utils/abs","f64/utils/greater","f64/utils/equal"],s=await P(r,[...i,"idamax"],"idamax_main"),u=await P(r,[...i,"reduction/argmaxF64"],"reduce_f64"),n=null,d=null,l=null,m=null,w=null,c=null,p=null,g=null;try{if(t)n=e._buf,d=e._loBuf;else{let{hi:L,lo:R}=U(e);n=h(r,L,"idamax-xHi",!1),d=h(r,R,"idamax-xLo",!1)}l=fr(r,512,"idamax-partials-val-hi"),m=fr(r,512,"idamax-partials-val-lo"),w=fr(r,512,"idamax-partials-idx"),c=Ar(r,4,"idamax-result"),p=q(r,[{value:o,type:"u32"},{value:a,type:"u32"}],"idamax-params");let y=D(r,s.getBindGroupLayout(0),[n,d,l,m,w,p]),{commandEncoder:b,ts:x}=O(r,s,y,128);F(r,b);let v=D(r,u.getBindGroupLayout(0),[l,m,w,c]),{commandEncoder:B,ts:A}=O(r,u,v,1);g=E(r,B,c),F(r,B);let S=G(g,Uint32Array);g=null;let[_,N,I]=await Promise.all([j(x),j(A),S]),k=I[0];return _!==void 0&&N!==void 0?{index:k,gpuTimeMs:_+N}:{index:k}}finally{!t&&n&&f(n),!t&&d&&f(d),l&&f(l),m&&f(m),w&&f(w),c&&f(c),p&&f(p),g&&f(g)}}async function ya(r,o,e,a,t,i,s,u){let n=e instanceof M,d=t instanceof M;if(H(r),T(r,"srot",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(typeof s!="number")throw new Error("c must be a number.");if(typeof u!="number")throw new Error("s must be a number.");if(Number.isNaN(s)||Number.isNaN(u))throw new Error("c and s must not be NaN.");if(!Number.isFinite(s))throw new Error("c must be finite.");if(!Number.isFinite(u))throw new Error("s must be finite.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!n&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!d&&!(t instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(n!==d)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(o<=0)return n?{}:{x:e,y:t};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let l=await P(r,"srot"),m=null,w=null,c=null,p=null,g=null;try{m=n?e._buf:h(r,e,"srot-x",!0),w=d?t._buf:h(r,t,"srot-y",!0),c=q(r,[{value:o,type:"u32"},{value:s,type:"f32"},{value:u,type:"f32"},{value:a,type:"u32"},{value:i,type:"u32"}],"srot-params");let y=D(r,l.getBindGroupLayout(0),[m,w,c]),{commandEncoder:b,ts:x}=O(r,l,y,br(r,o));p=n?null:E(r,b,m),g=d?null:E(r,b,w),F(r,b);let v=await j(x);if(n)return v!==void 0?{gpuTimeMs:v}:{};let B=G(p,Float32Array),A=G(g,Float32Array);p=null,g=null;let[S,_]=await Promise.all([B,A]);return v!==void 0?{x:S,y:_,gpuTimeMs:v}:{x:S,y:_}}finally{!n&&m&&f(m),!d&&w&&f(w),c&&f(c),p&&f(p),g&&f(g)}}async function xa(r,o,e,a,t,i,s,u){let n=e instanceof M,d=t instanceof M;if(H(r),T(r,"drot",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(typeof s!="number")throw new Error("c must be a number.");if(typeof u!="number")throw new Error("s must be a number.");if(Number.isNaN(s)||Number.isNaN(u))throw new Error("c and s must not be NaN.");if(!Number.isFinite(s))throw new Error("c must be finite.");if(!Number.isFinite(u))throw new Error("s must be finite.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!(e instanceof Float64Array)&&!n)throw new Error("x must be a Float64Array or GpuVector.");if(!(t instanceof Float64Array)&&!d)throw new Error("y must be a Float64Array or GpuVector.");if(n&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(d&&t.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(n!==d)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(o<=0)return n?{}:{x:e,y:t};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let m=await P(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"drot"]),{hi:w,lo:c}=U(new Float64Array([s])),{hi:p,lo:g}=U(new Float64Array([u])),y=null,b=null,x=null,v=null,B=null,A=null,S=null,_=null,N=null;try{if(n)y=e._buf,b=e._loBuf,x=t._buf,v=t._loBuf;else{let $=U(e),J=U(t);y=h(r,$.hi,"drot-xHi",!0),b=h(r,$.lo,"drot-xLo",!0),x=h(r,J.hi,"drot-yHi",!0),v=h(r,J.lo,"drot-yLo",!0)}B=q(r,[{value:o,type:"u32"},{value:w[0],type:"f32"},{value:c[0],type:"f32"},{value:p[0],type:"f32"},{value:g[0],type:"f32"},{value:a,type:"u32"},{value:i,type:"u32"}],"drot-params");let I=D(r,m.getBindGroupLayout(0),[y,b,x,v,B]),{commandEncoder:k,ts:L}=O(r,m,I,br(r,o));A=n?null:E(r,k,y),S=n?null:E(r,k,b),_=d?null:E(r,k,x),N=d?null:E(r,k,v),F(r,k);let R=await j(L);if(n)return R!==void 0?{gpuTimeMs:R}:{};let W=await G(A,Float32Array);A=null;let V=await G(S,Float32Array);S=null;let C=await G(_,Float32Array);_=null;let z=await G(N,Float32Array);N=null;let K=dr(W,V),Y=dr(C,z);return R!==void 0?{x:K,y:Y,gpuTimeMs:R}:{x:K,y:Y}}finally{!n&&y&&f(y),!n&&b&&f(b),!d&&x&&f(x),!d&&v&&f(v),B&&f(B),A&&f(A),S&&f(S),_&&f(_),N&&f(N)}}async function va(r,o,e,a,t,i,s){let u=e instanceof M,n=t instanceof M;if(H(r),T(r,"srotm",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(!(s instanceof Float32Array)||s.length!==5)throw new Error("param must be a Float32Array of length 5.");if(s[0]!==-2&&s[0]!==-1&&s[0]!==0&&s[0]!==1)throw new Error("param[0] (flag) must be one of -2, -1, 0, or 1.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!u&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!n&&!(t instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(u!==n)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(o<=0||s[0]===-2)return u?{}:{x:e,y:t};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let d=await P(r,"srotm"),l=null,m=null,w=null,c=null,p=null,g=null;try{l=u?e._buf:h(r,e,"srotm-x",!0),m=n?t._buf:h(r,t,"srotm-y",!0),w=h(r,s,"srotm-param",!1),c=q(r,[{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"u32"}],"srotm-params");let y=D(r,d.getBindGroupLayout(0),[l,m,w,c]),{commandEncoder:b,ts:x}=O(r,d,y,br(r,o));p=u?null:E(r,b,l),g=n?null:E(r,b,m),F(r,b);let v=await j(x);if(u)return v!==void 0?{gpuTimeMs:v}:{};let B=G(p,Float32Array),A=G(g,Float32Array);p=null,g=null;let[S,_]=await Promise.all([B,A]);return v!==void 0?{x:S,y:_,gpuTimeMs:v}:{x:S,y:_}}finally{!u&&l&&f(l),!n&&m&&f(m),w&&f(w),c&&f(c),p&&f(p),g&&f(g)}}async function _a(r,o,e,a,t,i,s){let u=e instanceof M,n=t instanceof M;if(H(r),T(r,"drotm",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(!(s instanceof Float64Array)||s.length!==5)throw new Error("param must be a Float64Array of length 5.");if(s[0]!==-2&&s[0]!==-1&&s[0]!==0&&s[0]!==1)throw new Error("param[0] (flag) must be one of -2, -1, 0, or 1.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!(e instanceof Float64Array)&&!u)throw new Error("x must be a Float64Array or GpuVector.");if(!(t instanceof Float64Array)&&!n)throw new Error("y must be a Float64Array or GpuVector.");if(u&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(n&&t.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(u!==n)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(o<=0||s[0]===-2)return u?{}:{x:e,y:t};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let l=await P(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"drotm"]),{hi:m,lo:w}=U(s),c=null,p=null,g=null,y=null,b=null,x=null,v=null,B=null,A=null,S=null,_=null;try{if(u)c=e._buf,p=e._loBuf,g=t._buf,y=t._loBuf;else{let Y=U(e),$=U(t);c=h(r,Y.hi,"drotm-xHi",!0),p=h(r,Y.lo,"drotm-xLo",!0),g=h(r,$.hi,"drotm-yHi",!0),y=h(r,$.lo,"drotm-yLo",!0)}b=h(r,m,"drotm-paramHi",!1),x=h(r,w,"drotm-paramLo",!1),v=q(r,[{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"u32"}],"drotm-params");let N=D(r,l.getBindGroupLayout(0),[c,p,g,y,b,x,v]),{commandEncoder:I,ts:k}=O(r,l,N,br(r,o));B=u?null:E(r,I,c),A=u?null:E(r,I,p),S=n?null:E(r,I,g),_=n?null:E(r,I,y),F(r,I);let L=await j(k);if(u)return L!==void 0?{gpuTimeMs:L}:{};let R=await G(B,Float32Array);B=null;let W=await G(A,Float32Array);A=null;let V=await G(S,Float32Array);S=null;let C=await G(_,Float32Array);_=null;let z=dr(R,W),K=dr(V,C);return L!==void 0?{x:z,y:K,gpuTimeMs:L}:{x:z,y:K}}finally{!u&&c&&f(c),!u&&p&&f(p),!n&&g&&f(g),!n&&y&&f(y),b&&f(b),x&&f(x),v&&f(v),B&&f(B),A&&f(A),S&&f(S),_&&f(_)}}async function Ba(r,o,e,a,t,i,s,u,n,d,l,m,w="row-major"){let c=i instanceof X,p=u instanceof M,g=l instanceof M;if(H(r),T(r,"sgemv",{A:i,x:u,y:l}),o!=="no-transpose"&&o!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(w!=="row-major"&&w!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof t!="number")throw new Error("alpha must be a number.");if(Number.isNaN(t))throw new Error("alpha must not be NaN.");if(!Number.isFinite(t))throw new Error("alpha must be finite.");if(typeof d!="number")throw new Error("beta must be a number.");if(Number.isNaN(d))throw new Error("beta must not be NaN.");if(!Number.isFinite(d))throw new Error("beta must be finite.");if(!Number.isInteger(e)||!Number.isInteger(a)||!Number.isInteger(n)||!Number.isInteger(m)||!Number.isInteger(s))throw new Error("m, n, incx, incy, and lda must be integers.");if(n<=0||m<=0)throw new Error("incx and incy must be positive.");if(!c&&!(i instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!p&&!(u instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!g&&!(l instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(p!==g)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(p&&!c)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(c&&!p)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(p&&u._buf===l._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(c&&g&&i._buf===l._buf)throw new Error("A and y must not reference the same GPU buffer.");if(c&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(i.rows<e||i.cols<a))throw new Error("A is too small for the given m and n.");if(e<0||a<0)throw new Error("m and n must be non-negative.");if(e===0||a===0)return g?{}:{y:l};(c?i.layout:w)==="column-major"&&([e,a]=[a,e],o=o==="no-transpose"?"transpose":"no-transpose");let b=o==="no-transpose",x=b?a:e,v=b?e:a;if(s<a)throw new Error("lda must be >= n.");if(!c&&i.length<(e-1)*s+a)throw new Error("A does not have enough elements for the given m, n, and lda.");if(u.length<(x-1)*n+1)throw new Error("x does not have enough elements for the given dimensions and incx.");if(l.length<(v-1)*m+1)throw new Error("y does not have enough elements for the given dimensions and incy.");let A=await P(r,b?"sgemv_n":"sgemv_t"),S=null,_=null,N=null,I=null;try{S=c?i._buf:h(r,i,"sgemv-A",!1),_=p?u._buf:h(r,u,"sgemv-x",!1),N=g?l._buf:h(r,l,"sgemv-y",!0),I=q(r,[{value:e,type:"u32"},{value:a,type:"u32"},{value:t,type:"f32"},{value:d,type:"f32"},{value:n,type:"u32"},{value:m,type:"u32"},{value:s,type:"u32"}],"sgemv-params");let k=D(r,A.getBindGroupLayout(0),[S,_,N,I]),L=b?Math.min(e,r.limits.maxComputeWorkgroupsPerDimension):Yr(r,"sgemv",v),{commandEncoder:R,ts:W}=O(r,A,k,L),V=g?null:E(r,R,N);F(r,R);let C=await j(W);if(g)return C!==void 0?{gpuTimeMs:C}:{};let z=await G(V,Float32Array);return C!==void 0?{y:z,gpuTimeMs:C}:{y:z}}finally{!c&&S&&f(S),!p&&_&&f(_),!g&&N&&f(N),I&&f(I)}}async function Aa(r,o,e,a,t,i,s,u,n,d,l,m="row-major"){let w=s instanceof M,c=d instanceof M,p=t instanceof X;if(H(r),T(r,"ssymv",{A:t,x:s,y:d}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(m!=="row-major"&&m!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(e)||!Number.isInteger(u)||!Number.isInteger(l)||!Number.isInteger(i))throw new Error("n, incx, incy, and lda must be integers.");if(typeof a!="number")throw new Error("alpha must be a number.");if(Number.isNaN(a))throw new Error("alpha must not be NaN.");if(!Number.isFinite(a))throw new Error("alpha must be finite.");if(typeof n!="number")throw new Error("beta must be a number.");if(Number.isNaN(n))throw new Error("beta must not be NaN.");if(!Number.isFinite(n))throw new Error("beta must be finite.");if(u<=0||l<=0)throw new Error("incx and incy must be positive.");if(i<e)throw new Error("lda must be >= n.");if(!p&&!(t instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!w&&!(s instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!c&&!(d instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(w!==c)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(w&&!p)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(p&&!w)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(w&&s._buf===d._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(p&&i!==t.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(p&&(t.rows<e||t.cols<e))throw new Error("A is too small for the given n.");if(e<0)throw new Error("n must be non-negative.");if(e===0)return c?{}:{y:d};if(!p&&t.length<(e-1)*i+e)throw new Error("A does not have enough elements for the given n and lda.");if(s.length<(e-1)*u+1)throw new Error("x does not have enough elements for the given n and incx.");if(d.length<(e-1)*l+1)throw new Error("y does not have enough elements for the given n and incy.");let y=(p?t.layout:m)==="column-major"?o==="upper":o==="lower",b=await P(r,"ssymv"),x=null,v=null,B=null,A=null;try{x=p?t._buf:h(r,t,"ssymv-A",!1),v=w?s._buf:h(r,s,"ssymv-x",!1),B=c?d._buf:h(r,d,"ssymv-y",!0),A=q(r,[{value:e,type:"u32"},{value:a,type:"f32"},{value:n,type:"f32"},{value:u,type:"u32"},{value:l,type:"u32"},{value:i,type:"u32"},{value:y?0:1,type:"u32"}],"ssymv-params");let S=D(r,b.getBindGroupLayout(0),[x,v,B,A]),_=Math.min(e,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:N,ts:I}=O(r,b,S,_),k=c?null:E(r,N,B);F(r,N);let L=await j(I);if(c)return L!==void 0?{gpuTimeMs:L}:{};let R=await G(k,Float32Array);return L!==void 0?{y:R,gpuTimeMs:L}:{y:R}}finally{!p&&x&&f(x),!w&&v&&f(v),!c&&B&&f(B),A&&f(A)}}async function Sa(r,o,e,a,t,i,s,u,n,d,l,m="row-major"){let w=u instanceof M,c=d instanceof M,p=i instanceof X,g=a==="unit";if(H(r),T(r,"strmv",{A:i,x:u,y:d}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(!g&&a!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(m!=="row-major"&&m!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(t)||!Number.isInteger(n)||!Number.isInteger(l)||!Number.isInteger(s))throw new Error("n, incx, incy, and lda must be integers.");if(n<=0||l<=0)throw new Error("incx and incy must be positive.");if(s<t)throw new Error("lda must be >= n.");if(!p&&!(i instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!w&&!(u instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!c&&!(d instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(w!==c)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(w&&u._buf===d._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(w&&!p)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(p&&!w)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(p&&c&&i._buf===d._buf)throw new Error("A and y must not reference the same GPU buffer.");if(p&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(p&&(i.rows<t||i.cols<t))throw new Error("A is too small for the given n.");if(t<0)throw new Error("n must be non-negative.");if(t===0)return c?{}:{y:d};if(!p&&i.length<(t-1)*s+t)throw new Error("A does not have enough elements for the given n and lda.");if(u.length<(t-1)*n+1)throw new Error("x does not have enough elements for the given n and incx.");if(d.length<(t-1)*l+1)throw new Error("y does not have enough elements for the given n and incy.");let b=(p?i.layout:m)==="column-major",x=b?o==="upper":o==="lower",v=b?e==="transpose":e==="no-transpose",B=await P(r,"strmv"),A=null,S=null,_=null,N=null;try{A=p?i._buf:h(r,i,"strmv-A",!1),S=w?u._buf:h(r,u,"strmv-x",!1),_=c?d._buf:h(r,d,"strmv-y",!0),N=q(r,[{value:t,type:"u32"},{value:n,type:"u32"},{value:l,type:"u32"},{value:s,type:"u32"},{value:v?0:1,type:"u32"},{value:x?0:1,type:"u32"},{value:g?1:0,type:"u32"}],"strmv-params");let I=D(r,B.getBindGroupLayout(0),[A,S,_,N]),k=Math.min(t,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:L,ts:R}=O(r,B,I,k),W=c?null:E(r,L,_);F(r,L);let V=await j(R);if(c)return V!==void 0?{gpuTimeMs:V}:{};let C=await G(W,Float32Array);return V!==void 0?{y:C,gpuTimeMs:V}:{y:C}}finally{!p&&A&&f(A),!w&&S&&f(S),!c&&_&&f(_),N&&f(N)}}function Ga(r,o,e){let a=new ArrayBuffer(r*o),t=new DataView(a);for(let i=0;i<r;i++){let s=e(i),u=i*o;s.forEach((n,d)=>t.setUint32(u+d*4,n,!0))}return a}function Ea(r,o,e){let a=r.createBuffer({label:e,size:o.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return r.queue.writeBuffer(a,0,o),a}async function ka(r,o,e,a,t,i,s,u,n,d="row-major"){let l=u instanceof M,m=i instanceof X,w=a==="unit";if(H(r),T(r,"strsv",{A:i,x:u}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(!w&&a!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(d!=="row-major"&&d!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(t)||!Number.isInteger(n)||!Number.isInteger(s))throw new Error("n, incx, and lda must be integers.");if(n<=0)throw new Error("incx must be positive.");if(s<t)throw new Error("lda must be >= n.");if(!m&&!(i instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!l&&!(u instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(l&&!m)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(m&&!l)throw new Error("x must be a GpuVector when A is a GpuMatrix.");if(m&&l&&i._buf===u._buf)throw new Error("A and x must not reference the same GPU buffer.");if(m&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(m&&(i.rows<t||i.cols<t))throw new Error("A is too small for the given n.");if(t<0)throw new Error("n must be non-negative.");if(t===0)return l?{}:{x:u};if(!m&&i.length<(t-1)*s+t)throw new Error("A does not have enough elements for the given n and lda.");if(u.length<(t-1)*n+1)throw new Error("x does not have enough elements for the given n and incx.");let p=(m?i.layout:d)==="column-major",g=p?o==="upper":o==="lower",y=p?e==="transpose":e==="no-transpose",b=await P(r,"strsv_invert_block"),x=await P(r,"strsv_apply_inverse"),v=await P(r,"strsv_update"),B=y===g,A=[];for(let C=0;C<t;C+=64)A.push(C);B||A.reverse();let S=A.length,_=r.limits.maxComputeWorkgroupsPerDimension,N=r.limits.minUniformBufferOffsetAlignment,I=null,k=null,L=null,R=null,W=null,V=null;try{I=m?i._buf:h(r,i,"strsv-A",!1),k=l?u._buf:h(r,u,"strsv-x",!0),L=fr(r,S*64*64*4,"strsv-Ainv");let C=Ga(S,N,ar=>{let sr=ar*64,lr=Math.min(sr+64,t);return[n,ar,sr,lr]});R=Ea(r,C,"strsv-apply-params");let z=Ga(S,N,ar=>{let sr=ar*64,lr=Math.min(sr+64,t);return[t,n,s,y?0:1,g?0:1,sr,lr]});W=Ea(r,z,"strsv-update-params");let{commandEncoder:K,querySet:Y}=Mr(r);V=q(r,[{value:t,type:"u32"},{value:s,type:"u32"},{value:y?0:1,type:"u32"},{value:g?0:1,type:"u32"},{value:w?1:0,type:"u32"}],"strsv-invert-params");let $=D(r,b.getBindGroupLayout(0),[I,L,V]);hr(K,b,$,{x:64,y:S},Y?{timestampWrites:{querySet:Y,beginningOfPassWriteIndex:0}}:void 0);for(let ar=0;ar<A.length;ar++){let sr=A[ar],lr=Math.min(sr+64,t),ur=sr/64,mr=ar===A.length-1,yr=ur*N,wr=D(r,x.getBindGroupLayout(0),[L,k,{buffer:R,offset:yr,size:16}]);hr(K,x,wr,1,mr&&Y?{timestampWrites:{querySet:Y,endOfPassWriteIndex:1}}:void 0);let gr=B?t-lr:sr;if(gr===0)continue;let Gr=D(r,v.getBindGroupLayout(0),[I,k,{buffer:W,offset:yr,size:32}]),Nr=Math.min(gr,_);hr(K,v,Gr,Nr)}let nr=kr(r,K,Y),er=l?null:E(r,K,k);F(r,K);let Q=await j(nr);if(l)return Q!==void 0?{gpuTimeMs:Q}:{};let rr=await G(er,Float32Array);return Q!==void 0?{x:rr,gpuTimeMs:Q}:{x:rr}}finally{!m&&I&&f(I),!l&&k&&f(k),L&&f(L),R&&f(R),W&&f(W),V&&f(V)}}async function Da(r,o,e,a,t,i,s,u,n,d,l="row-major"){let m=n instanceof X;if(H(r),T(r,"sger",{A:n,x:t,y:s}),l!=="row-major"&&l!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof a!="number")throw new Error("alpha must be a number.");if(Number.isNaN(a))throw new Error("alpha must not be NaN.");if(!Number.isFinite(a))throw new Error("alpha must be finite.");if(!Number.isInteger(o)||!Number.isInteger(e)||!Number.isInteger(i)||!Number.isInteger(u)||!Number.isInteger(d))throw new Error("m, n, incx, incy, and lda must be integers.");if(i<=0||u<=0)throw new Error("incx and incy must be positive.");if(!m&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(m&&d!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(m&&(n.rows<o||n.cols<e))throw new Error("A is too small for the given m and n.");(m?n.layout:l)==="column-major"&&([o,e]=[e,o],[t,s]=[s,t],[i,u]=[u,i]);let c=t instanceof M,p=s instanceof M;if(d<e)throw new Error("lda must be >= n.");if(!c&&!(t instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!p&&!(s instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(c!==p)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(c&&!m)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(m&&!c)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(m&&c&&n._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(m&&p&&n._buf===s._buf)throw new Error("A and y must not reference the same GPU buffer.");if(o<0||e<0)throw new Error("m and n must be non-negative.");if(o===0||e===0)return m?{}:{A:n};if(!m&&n.length<(o-1)*d+e)throw new Error("A does not have enough elements for the given m, n, and lda.");if(t.length<(o-1)*i+1)throw new Error("x does not have enough elements for the given m and incx.");if(s.length<(e-1)*u+1)throw new Error("y does not have enough elements for the given n and incy.");let g=await P(r,"sger"),y=null,b=null,x=null,v=null;try{y=c?t._buf:h(r,t,"sger-x",!1),b=p?s._buf:h(r,s,"sger-y",!1),x=m?n._buf:h(r,n,"sger-A",!0),v=q(r,[{value:o,type:"u32"},{value:e,type:"u32"},{value:a,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:d,type:"u32"}],"sger-params");let B=D(r,g.getBindGroupLayout(0),[y,b,x,v]),A=Math.min(o,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:S,ts:_}=O(r,g,B,A),N=m?null:E(r,S,x);F(r,S);let I=await j(_);if(m)return I!==void 0?{gpuTimeMs:I}:{};let k=await G(N,Float32Array);return I!==void 0?{A:k,gpuTimeMs:I}:{A:k}}finally{!c&&y&&f(y),!p&&b&&f(b),!m&&x&&f(x),v&&f(v)}}async function La(r,o,e,a,t,i,s,u,n,d,l="row-major"){let m=n instanceof X;if(H(r),T(r,"dger",{A:n,x:t,y:s}),l!=="row-major"&&l!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof a!="number")throw new Error("alpha must be a number.");if(Number.isNaN(a))throw new Error("alpha must not be NaN.");if(!Number.isFinite(a))throw new Error("alpha must be finite.");if(!Number.isInteger(o)||!Number.isInteger(e)||!Number.isInteger(i)||!Number.isInteger(u)||!Number.isInteger(d))throw new Error("m, n, incx, incy, and lda must be integers.");if(i<=0||u<=0)throw new Error("incx and incy must be positive.");if(!m&&!(n instanceof Float64Array))throw new Error("A must be a Float64Array or GpuMatrix.");if(m&&n.dtype!==Float64Array)throw new Error("A must be a Float64Array-backed GpuMatrix.");if(m&&d!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(m&&(n.rows<o||n.cols<e))throw new Error("A is too small for the given m and n.");(m?n.layout:l)==="column-major"&&([o,e]=[e,o],[t,s]=[s,t],[i,u]=[u,i]);let c=t instanceof M,p=s instanceof M;if(d<e)throw new Error("lda must be >= n.");if(!c&&!(t instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(!p&&!(s instanceof Float64Array))throw new Error("y must be a Float64Array or GpuVector.");if(c&&t.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(p&&s.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(c!==p)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(c&&!m)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(m&&!c)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(m&&c&&n._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(m&&p&&n._buf===s._buf)throw new Error("A and y must not reference the same GPU buffer.");if(o<0||e<0)throw new Error("m and n must be non-negative.");if(o===0||e===0)return m?{}:{A:n};if(!m&&n.length<(o-1)*d+e)throw new Error("A does not have enough elements for the given m, n, and lda.");if(t.length<(o-1)*i+1)throw new Error("x does not have enough elements for the given m and incx.");if(s.length<(e-1)*u+1)throw new Error("y does not have enough elements for the given n and incy.");let y=await P(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"dger"],"dger_main"),{hi:b,lo:x}=U(new Float64Array([a])),v=null,B=null,A=null,S=null,_=null,N=null,I=null,k=null,L=null;try{if(c)v=t._buf,B=t._loBuf,A=s._buf,S=s._loBuf,_=n._buf,N=n._loBuf;else{let J=U(t),nr=U(s),er=U(n);v=h(r,J.hi,"dger-xHi",!1),B=h(r,J.lo,"dger-xLo",!1),A=h(r,nr.hi,"dger-yHi",!1),S=h(r,nr.lo,"dger-yLo",!1),_=h(r,er.hi,"dger-AHi",!0),N=h(r,er.lo,"dger-ALo",!0)}I=q(r,[{value:o,type:"u32"},{value:e,type:"u32"},{value:b[0],type:"f32"},{value:x[0],type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:d,type:"u32"}],"dger-params");let R=D(r,y.getBindGroupLayout(0),[v,B,A,S,_,N,I]),W=Math.min(o,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:V,ts:C}=O(r,y,R,W);k=m?null:E(r,V,_),L=m?null:E(r,V,N),F(r,V);let z=await j(C);if(m)return z!==void 0?{gpuTimeMs:z}:{};let K=await G(k,Float32Array);k=null;let Y=await G(L,Float32Array);L=null;let $=dr(K,Y);return z!==void 0?{A:$,gpuTimeMs:z}:{A:$}}finally{!c&&v&&f(v),!c&&B&&f(B),!p&&A&&f(A),!p&&S&&f(S),!m&&_&&f(_),!m&&N&&f(N),I&&f(I),k&&f(k),L&&f(L)}}async function Pa(r,o,e,a,t,i,s,u,n="row-major"){let d=t instanceof M,l=s instanceof X;if(H(r),T(r,"ssyr",{A:s,x:t}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(n!=="row-major"&&n!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(e)||!Number.isInteger(i)||!Number.isInteger(u))throw new Error("n, incx, and lda must be integers.");if(typeof a!="number")throw new Error("alpha must be a number.");if(Number.isNaN(a))throw new Error("alpha must not be NaN.");if(!Number.isFinite(a))throw new Error("alpha must be finite.");if(i<=0)throw new Error("incx must be positive.");if(u<e)throw new Error("lda must be >= n.");if(!l&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!d&&!(t instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(d&&!l)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(l&&!d)throw new Error("x must be a GpuVector when A is a GpuMatrix.");if(l&&d&&s._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(l&&u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(l&&(s.rows<e||s.cols<e))throw new Error("A is too small for the given n.");if(e<0)throw new Error("n must be non-negative.");if(e===0)return l?{}:{A:s};if(!l&&s.length<(e-1)*u+e)throw new Error("A does not have enough elements for the given n and lda.");if(t.length<(e-1)*i+1)throw new Error("x does not have enough elements for the given n and incx.");let w=(l?s.layout:n)==="column-major"?o==="upper":o==="lower",c=await P(r,"ssyr"),p=null,g=null,y=null;try{p=d?t._buf:h(r,t,"ssyr-x",!1),g=l?s._buf:h(r,s,"ssyr-A",!0),y=q(r,[{value:e,type:"u32"},{value:a,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:w?0:1,type:"u32"}],"ssyr-params");let b=D(r,c.getBindGroupLayout(0),[p,g,y]),x=Math.min(e,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:v,ts:B}=O(r,c,b,x),A=l?null:E(r,v,g);F(r,v);let S=await j(B);if(l)return S!==void 0?{gpuTimeMs:S}:{};let _=await G(A,Float32Array);return S!==void 0?{A:_,gpuTimeMs:S}:{A:_}}finally{!d&&p&&f(p),!l&&g&&f(g),y&&f(y)}}async function Na(r,o,e,a,t,i,s,u,n="row-major"){let d=t instanceof M,l=s instanceof X;if(H(r),T(r,"dsyr",{A:s,x:t}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(n!=="row-major"&&n!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(e)||!Number.isInteger(i)||!Number.isInteger(u))throw new Error("n, incx, and lda must be integers.");if(typeof a!="number")throw new Error("alpha must be a number.");if(Number.isNaN(a))throw new Error("alpha must not be NaN.");if(!Number.isFinite(a))throw new Error("alpha must be finite.");if(i<=0)throw new Error("incx must be positive.");if(u<e)throw new Error("lda must be >= n.");if(!l&&!(s instanceof Float64Array))throw new Error("A must be a Float64Array or GpuMatrix.");if(l&&s.dtype!==Float64Array)throw new Error("A must be a Float64Array-backed GpuMatrix.");if(!d&&!(t instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(d&&t.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(d&&!l)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(l&&!d)throw new Error("x must be a GpuVector when A is a GpuMatrix.");if(l&&d&&s._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(l&&u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(l&&(s.rows<e||s.cols<e))throw new Error("A is too small for the given n.");if(e<0)throw new Error("n must be non-negative.");if(e===0)return l?{}:{A:s};if(!l&&s.length<(e-1)*u+e)throw new Error("A does not have enough elements for the given n and lda.");if(t.length<(e-1)*i+1)throw new Error("x does not have enough elements for the given n and incx.");let w=(l?s.layout:n)==="column-major"?o==="upper":o==="lower",p=await P(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"dsyr"],"dsyr_main"),{hi:g,lo:y}=U(new Float64Array([a])),b=null,x=null,v=null,B=null,A=null,S=null,_=null;try{if(d)b=t._buf,x=t._loBuf,v=s._buf,B=s._loBuf;else{let z=U(t),K=U(s);b=h(r,z.hi,"dsyr-xHi",!1),x=h(r,z.lo,"dsyr-xLo",!1),v=h(r,K.hi,"dsyr-AHi",!0),B=h(r,K.lo,"dsyr-ALo",!0)}A=q(r,[{value:e,type:"u32"},{value:g[0],type:"f32"},{value:y[0],type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:w?0:1,type:"u32"}],"dsyr-params");let N=D(r,p.getBindGroupLayout(0),[b,x,v,B,A]),I=Math.min(e,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:k,ts:L}=O(r,p,N,I);S=l?null:E(r,k,v),_=l?null:E(r,k,B),F(r,k);let R=await j(L);if(l)return R!==void 0?{gpuTimeMs:R}:{};let W=await G(S,Float32Array);S=null;let V=await G(_,Float32Array);_=null;let C=dr(W,V);return R!==void 0?{A:C,gpuTimeMs:R}:{A:C}}finally{!d&&b&&f(b),!d&&x&&f(x),!l&&v&&f(v),!l&&B&&f(B),A&&f(A),S&&f(S),_&&f(_)}}async function Ma(r,o,e,a,t,i,s,u,n,d,l="row-major"){let m=t instanceof M,w=s instanceof M,c=n instanceof X;if(H(r),T(r,"ssyr2",{A:n,x:t,y:s}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(l!=="row-major"&&l!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(e)||!Number.isInteger(i)||!Number.isInteger(u)||!Number.isInteger(d))throw new Error("n, incx, incy, and lda must be integers.");if(typeof a!="number")throw new Error("alpha must be a number.");if(Number.isNaN(a))throw new Error("alpha must not be NaN.");if(!Number.isFinite(a))throw new Error("alpha must be finite.");if(i<=0||u<=0)throw new Error("incx and incy must be positive.");if(d<e)throw new Error("lda must be >= n.");if(!c&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!m&&!(t instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!w&&!(s instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(m!==w)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(m&&!c)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(c&&!m)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(c&&m&&n._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(c&&w&&n._buf===s._buf)throw new Error("A and y must not reference the same GPU buffer.");if(m&&t._buf===s._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(c&&d!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(n.rows<e||n.cols<e))throw new Error("A is too small for the given n.");if(e<0)throw new Error("n must be non-negative.");if(e===0)return c?{}:{A:n};if(!c&&n.length<(e-1)*d+e)throw new Error("A does not have enough elements for the given n and lda.");if(t.length<(e-1)*i+1)throw new Error("x does not have enough elements for the given n and incx.");if(s.length<(e-1)*u+1)throw new Error("y does not have enough elements for the given n and incy.");let g=(c?n.layout:l)==="column-major"?o==="upper":o==="lower",y=await P(r,"ssyr2"),b=null,x=null,v=null,B=null;try{b=m?t._buf:h(r,t,"ssyr2-x",!1),x=w?s._buf:h(r,s,"ssyr2-y",!1),v=c?n._buf:h(r,n,"ssyr2-A",!0),B=q(r,[{value:e,type:"u32"},{value:a,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:d,type:"u32"},{value:g?0:1,type:"u32"}],"ssyr2-params");let A=D(r,y.getBindGroupLayout(0),[b,x,v,B]),S=Math.min(e,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:_,ts:N}=O(r,y,A,S),I=c?null:E(r,_,v);F(r,_);let k=await j(N);if(c)return k!==void 0?{gpuTimeMs:k}:{};let L=await G(I,Float32Array);return k!==void 0?{A:L,gpuTimeMs:k}:{A:L}}finally{!m&&b&&f(b),!w&&x&&f(x),!c&&v&&f(v),B&&f(B)}}async function Ia(r,o,e,a,t,i,s,u,n,d,l="row-major"){let m=t instanceof M,w=s instanceof M,c=n instanceof X;if(H(r),T(r,"dsyr2",{A:n,x:t,y:s}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(l!=="row-major"&&l!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(e)||!Number.isInteger(i)||!Number.isInteger(u)||!Number.isInteger(d))throw new Error("n, incx, incy, and lda must be integers.");if(typeof a!="number")throw new Error("alpha must be a number.");if(Number.isNaN(a))throw new Error("alpha must not be NaN.");if(!Number.isFinite(a))throw new Error("alpha must be finite.");if(i<=0||u<=0)throw new Error("incx and incy must be positive.");if(d<e)throw new Error("lda must be >= n.");if(!c&&!(n instanceof Float64Array))throw new Error("A must be a Float64Array or GpuMatrix.");if(c&&n.dtype!==Float64Array)throw new Error("A must be a Float64Array-backed GpuMatrix.");if(!m&&!(t instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(!w&&!(s instanceof Float64Array))throw new Error("y must be a Float64Array or GpuVector.");if(m&&t.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(w&&s.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(m!==w)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(m&&!c)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(c&&!m)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(c&&m&&n._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(c&&w&&n._buf===s._buf)throw new Error("A and y must not reference the same GPU buffer.");if(m&&t._buf===s._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(c&&d!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(n.rows<e||n.cols<e))throw new Error("A is too small for the given n.");if(e<0)throw new Error("n must be non-negative.");if(e===0)return c?{}:{A:n};if(!c&&n.length<(e-1)*d+e)throw new Error("A does not have enough elements for the given n and lda.");if(t.length<(e-1)*i+1)throw new Error("x does not have enough elements for the given n and incx.");if(s.length<(e-1)*u+1)throw new Error("y does not have enough elements for the given n and incy.");let g=(c?n.layout:l)==="column-major"?o==="upper":o==="lower",b=await P(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"dsyr2"],"dsyr2_main"),{hi:x,lo:v}=U(new Float64Array([a])),B=null,A=null,S=null,_=null,N=null,I=null,k=null,L=null,R=null;try{if(m)B=t._buf,A=t._loBuf,S=s._buf,_=s._loBuf,N=n._buf,I=n._loBuf;else{let nr=U(t),er=U(s),Q=U(n);B=h(r,nr.hi,"dsyr2-xHi",!1),A=h(r,nr.lo,"dsyr2-xLo",!1),S=h(r,er.hi,"dsyr2-yHi",!1),_=h(r,er.lo,"dsyr2-yLo",!1),N=h(r,Q.hi,"dsyr2-AHi",!0),I=h(r,Q.lo,"dsyr2-ALo",!0)}k=q(r,[{value:e,type:"u32"},{value:x[0],type:"f32"},{value:v[0],type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:d,type:"u32"},{value:g?0:1,type:"u32"}],"dsyr2-params");let W=D(r,b.getBindGroupLayout(0),[B,A,S,_,N,I,k]),V=Math.min(e,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:C,ts:z}=O(r,b,W,V);L=c?null:E(r,C,N),R=c?null:E(r,C,I),F(r,C);let K=await j(z);if(c)return K!==void 0?{gpuTimeMs:K}:{};let Y=await G(L,Float32Array);L=null;let $=await G(R,Float32Array);R=null;let J=dr(Y,$);return K!==void 0?{A:J,gpuTimeMs:K}:{A:J}}finally{!m&&B&&f(B),!m&&A&&f(A),!w&&S&&f(S),!w&&_&&f(_),!c&&N&&f(N),!c&&I&&f(I),k&&f(k),L&&f(L),R&&f(R)}}async function Ra(r,o,e,a,t,i,s,u,n,d,l,m,w="row-major"){let c=i instanceof X,p=u instanceof M,g=l instanceof M;if(H(r),T(r,"dgemv",{A:i,x:u,y:l}),o!=="no-transpose"&&o!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(w!=="row-major"&&w!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof t!="number")throw new Error("alpha must be a number.");if(Number.isNaN(t))throw new Error("alpha must not be NaN.");if(!Number.isFinite(t))throw new Error("alpha must be finite.");if(typeof d!="number")throw new Error("beta must be a number.");if(Number.isNaN(d))throw new Error("beta must not be NaN.");if(!Number.isFinite(d))throw new Error("beta must be finite.");if(!Number.isInteger(e)||!Number.isInteger(a)||!Number.isInteger(n)||!Number.isInteger(m)||!Number.isInteger(s))throw new Error("m, n, incx, incy, and lda must be integers.");if(n<=0||m<=0)throw new Error("incx and incy must be positive.");if(!c&&!(i instanceof Float64Array))throw new Error("A must be a Float64Array or GpuMatrix.");if(c&&i.dtype!==Float64Array)throw new Error("A must be a Float64Array-backed GpuMatrix.");if(!p&&!(u instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(!g&&!(l instanceof Float64Array))throw new Error("y must be a Float64Array or GpuVector.");if(p&&u.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(g&&l.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(p!==g)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(p&&!c)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(c&&!p)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(p&&u._buf===l._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(c&&g&&i._buf===l._buf)throw new Error("A and y must not reference the same GPU buffer.");if(c&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(i.rows<e||i.cols<a))throw new Error("A is too small for the given m and n.");if(e<0||a<0)throw new Error("m and n must be non-negative.");if(e===0||a===0)return g?{}:{y:l};(c?i.layout:w)==="column-major"&&([e,a]=[a,e],o=o==="no-transpose"?"transpose":"no-transpose");let b=o==="no-transpose",x=b?a:e,v=b?e:a;if(s<a)throw new Error("lda must be >= n.");if(!c&&i.length<(e-1)*s+a)throw new Error("A does not have enough elements for the given m, n, and lda.");if(u.length<(x-1)*n+1)throw new Error("x does not have enough elements for the given dimensions and incx.");if(l.length<(v-1)*m+1)throw new Error("y does not have enough elements for the given dimensions and incy.");let B=["f64/dekker","f64/utils/add","f64/utils/multiply"],A=b?"dgemv_n":"dgemv_t",S=b?"dgemv_n_main":"dgemv_t_main",_=await P(r,[...B,A],S),{hi:N,lo:I}=U(new Float64Array([t])),{hi:k,lo:L}=U(new Float64Array([d])),R=null,W=null,V=null,C=null,z=null,K=null,Y=null,$=null,J=null;try{if(c)R=i._buf,W=i._loBuf;else{let mr=U(i);R=h(r,mr.hi,"dgemv-AHi",!1),W=h(r,mr.lo,"dgemv-ALo",!1)}if(p)V=u._buf,C=u._loBuf;else{let mr=U(u);V=h(r,mr.hi,"dgemv-xHi",!1),C=h(r,mr.lo,"dgemv-xLo",!1)}if(g)z=l._buf,K=l._loBuf;else{let mr=U(l);z=h(r,mr.hi,"dgemv-yHi",!0),K=h(r,mr.lo,"dgemv-yLo",!0)}Y=q(r,[{value:e,type:"u32"},{value:a,type:"u32"},{value:N[0],type:"f32"},{value:I[0],type:"f32"},{value:k[0],type:"f32"},{value:L[0],type:"f32"},{value:n,type:"u32"},{value:m,type:"u32"},{value:s,type:"u32"}],"dgemv-params");let nr=D(r,_.getBindGroupLayout(0),[R,W,V,C,z,K,Y]),er=b?Math.min(e,r.limits.maxComputeWorkgroupsPerDimension):Yr(r,"dgemv",v),{commandEncoder:Q,ts:rr}=O(r,_,nr,er);$=g?null:E(r,Q,z),J=g?null:E(r,Q,K),F(r,Q);let ar=await j(rr);if(g)return ar!==void 0?{gpuTimeMs:ar}:{};let sr=await G($,Float32Array);$=null;let lr=await G(J,Float32Array);J=null;let ur=dr(sr,lr);return ar!==void 0?{y:ur,gpuTimeMs:ar}:{y:ur}}finally{!c&&R&&f(R),!c&&W&&f(W),!p&&V&&f(V),!p&&C&&f(C),!g&&z&&f(z),!g&&K&&f(K),Y&&f(Y),$&&f($),J&&f(J)}}async function ja(r,o,e,a,t,i,s,u,n,d,l,m="row-major"){let w=s instanceof M,c=d instanceof M,p=t instanceof X;if(H(r),T(r,"dsymv",{A:t,x:s,y:d}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(m!=="row-major"&&m!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(e)||!Number.isInteger(u)||!Number.isInteger(l)||!Number.isInteger(i))throw new Error("n, incx, incy, and lda must be integers.");if(typeof a!="number")throw new Error("alpha must be a number.");if(Number.isNaN(a))throw new Error("alpha must not be NaN.");if(!Number.isFinite(a))throw new Error("alpha must be finite.");if(typeof n!="number")throw new Error("beta must be a number.");if(Number.isNaN(n))throw new Error("beta must not be NaN.");if(!Number.isFinite(n))throw new Error("beta must be finite.");if(u<=0||l<=0)throw new Error("incx and incy must be positive.");if(i<e)throw new Error("lda must be >= n.");if(!p&&!(t instanceof Float64Array))throw new Error("A must be a Float64Array or GpuMatrix.");if(p&&t.dtype!==Float64Array)throw new Error("A must be a Float64Array-backed GpuMatrix.");if(!w&&!(s instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(!c&&!(d instanceof Float64Array))throw new Error("y must be a Float64Array or GpuVector.");if(w&&s.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(c&&d.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(w!==c)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(w&&!p)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(p&&!w)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(w&&s._buf===d._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(p&&c&&t._buf===d._buf)throw new Error("A and y must not reference the same GPU buffer.");if(p&&i!==t.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(p&&(t.rows<e||t.cols<e))throw new Error("A is too small for the given n.");if(e<0)throw new Error("n must be non-negative.");if(e===0)return c?{}:{y:d};if(!p&&t.length<(e-1)*i+e)throw new Error("A does not have enough elements for the given n and lda.");if(s.length<(e-1)*u+1)throw new Error("x does not have enough elements for the given n and incx.");if(d.length<(e-1)*l+1)throw new Error("y does not have enough elements for the given n and incy.");let y=(p?t.layout:m)==="column-major"?o==="upper":o==="lower",x=await P(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"dsymv"],"dsymv_main"),{hi:v,lo:B}=U(new Float64Array([a])),{hi:A,lo:S}=U(new Float64Array([n])),_=null,N=null,I=null,k=null,L=null,R=null,W=null,V=null,C=null;try{if(p)_=t._buf,N=t._loBuf;else{let rr=U(t);_=h(r,rr.hi,"dsymv-AHi",!1),N=h(r,rr.lo,"dsymv-ALo",!1)}if(w)I=s._buf,k=s._loBuf;else{let rr=U(s);I=h(r,rr.hi,"dsymv-xHi",!1),k=h(r,rr.lo,"dsymv-xLo",!1)}if(c)L=d._buf,R=d._loBuf;else{let rr=U(d);L=h(r,rr.hi,"dsymv-yHi",!0),R=h(r,rr.lo,"dsymv-yLo",!0)}W=q(r,[{value:e,type:"u32"},{value:v[0],type:"f32"},{value:B[0],type:"f32"},{value:A[0],type:"f32"},{value:S[0],type:"f32"},{value:u,type:"u32"},{value:l,type:"u32"},{value:i,type:"u32"},{value:y?0:1,type:"u32"}],"dsymv-params");let z=D(r,x.getBindGroupLayout(0),[_,N,I,k,L,R,W]),K=Math.min(e,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:Y,ts:$}=O(r,x,z,K);V=c?null:E(r,Y,L),C=c?null:E(r,Y,R),F(r,Y);let J=await j($);if(c)return J!==void 0?{gpuTimeMs:J}:{};let nr=await G(V,Float32Array);V=null;let er=await G(C,Float32Array);C=null;let Q=dr(nr,er);return J!==void 0?{y:Q,gpuTimeMs:J}:{y:Q}}finally{!p&&_&&f(_),!p&&N&&f(N),!w&&I&&f(I),!w&&k&&f(k),!c&&L&&f(L),!c&&R&&f(R),W&&f(W),V&&f(V),C&&f(C)}}async function Fa(r,o,e,a,t,i,s,u,n,d,l,m="row-major"){let w=u instanceof M,c=d instanceof M,p=i instanceof X,g=a==="unit";if(H(r),T(r,"dtrmv",{A:i,x:u,y:d}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(!g&&a!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(m!=="row-major"&&m!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(t)||!Number.isInteger(n)||!Number.isInteger(l)||!Number.isInteger(s))throw new Error("n, incx, incy, and lda must be integers.");if(n<=0||l<=0)throw new Error("incx and incy must be positive.");if(s<t)throw new Error("lda must be >= n.");if(!p&&!(i instanceof Float64Array))throw new Error("A must be a Float64Array or GpuMatrix.");if(p&&i.dtype!==Float64Array)throw new Error("A must be a Float64Array-backed GpuMatrix.");if(!w&&!(u instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(!c&&!(d instanceof Float64Array))throw new Error("y must be a Float64Array or GpuVector.");if(w&&u.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(c&&d.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(w!==c)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(w&&u._buf===d._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(w&&!p)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(p&&!w)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(p&&c&&i._buf===d._buf)throw new Error("A and y must not reference the same GPU buffer.");if(p&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(p&&(i.rows<t||i.cols<t))throw new Error("A is too small for the given n.");if(t<0)throw new Error("n must be non-negative.");if(t===0)return c?{}:{y:d};if(!p&&i.length<(t-1)*s+t)throw new Error("A does not have enough elements for the given n and lda.");if(u.length<(t-1)*n+1)throw new Error("x does not have enough elements for the given n and incx.");if(d.length<(t-1)*l+1)throw new Error("y does not have enough elements for the given n and incy.");let b=(p?i.layout:m)==="column-major",x=b?o==="upper":o==="lower",v=b?e==="transpose":e==="no-transpose",A=await P(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"dtrmv"],"dtrmv_main"),S=null,_=null,N=null,I=null,k=null,L=null,R=null,W=null,V=null;try{if(p)S=i._buf,_=i._loBuf;else{let Q=U(i);S=h(r,Q.hi,"dtrmv-AHi",!1),_=h(r,Q.lo,"dtrmv-ALo",!1)}if(w)N=u._buf,I=u._loBuf;else{let Q=U(u);N=h(r,Q.hi,"dtrmv-xHi",!1),I=h(r,Q.lo,"dtrmv-xLo",!1)}if(c)k=d._buf,L=d._loBuf;else{let Q=U(d);k=h(r,Q.hi,"dtrmv-yHi",!0),L=h(r,Q.lo,"dtrmv-yLo",!0)}R=q(r,[{value:t,type:"u32"},{value:n,type:"u32"},{value:l,type:"u32"},{value:s,type:"u32"},{value:v?0:1,type:"u32"},{value:x?0:1,type:"u32"},{value:g?1:0,type:"u32"}],"dtrmv-params");let C=D(r,A.getBindGroupLayout(0),[S,_,N,I,k,L,R]),z=Math.min(t,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:K,ts:Y}=O(r,A,C,z);W=c?null:E(r,K,k),V=c?null:E(r,K,L),F(r,K);let $=await j(Y);if(c)return $!==void 0?{gpuTimeMs:$}:{};let J=await G(W,Float32Array);W=null;let nr=await G(V,Float32Array);V=null;let er=dr(J,nr);return $!==void 0?{y:er,gpuTimeMs:$}:{y:er}}finally{!p&&S&&f(S),!p&&_&&f(_),!w&&N&&f(N),!w&&I&&f(I),!c&&k&&f(k),!c&&L&&f(L),R&&f(R),W&&f(W),V&&f(V)}}function qa(r,o,e){let a=new ArrayBuffer(r*o),t=new DataView(a);for(let i=0;i<r;i++){let s=e(i),u=i*o;s.forEach((n,d)=>t.setUint32(u+d*4,n,!0))}return a}function Ha(r,o,e){let a=r.createBuffer({label:e,size:o.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return r.queue.writeBuffer(a,0,o),a}async function Ta(r,o,e,a,t,i,s,u,n,d="row-major"){let l=u instanceof M,m=i instanceof X,w=a==="unit";if(H(r),T(r,"dtrsv",{A:i,x:u}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(!w&&a!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(d!=="row-major"&&d!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(t)||!Number.isInteger(n)||!Number.isInteger(s))throw new Error("n, incx, and lda must be integers.");if(n<=0)throw new Error("incx must be positive.");if(s<t)throw new Error("lda must be >= n.");if(!m&&!(i instanceof Float64Array))throw new Error("A must be a Float64Array or GpuMatrix.");if(m&&i.dtype!==Float64Array)throw new Error("A must be a Float64Array-backed GpuMatrix.");if(!l&&!(u instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(l&&u.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(l&&!m)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(m&&!l)throw new Error("x must be a GpuVector when A is a GpuMatrix.");if(m&&l&&i._buf===u._buf)throw new Error("A and x must not reference the same GPU buffer.");if(m&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(m&&(i.rows<t||i.cols<t))throw new Error("A is too small for the given n.");if(t<0)throw new Error("n must be non-negative.");if(t===0)return l?{}:{x:u};if(!m&&i.length<(t-1)*s+t)throw new Error("A does not have enough elements for the given n and lda.");if(u.length<(t-1)*n+1)throw new Error("x does not have enough elements for the given n and incx.");let p=(m?i.layout:d)==="column-major",g=p?o==="upper":o==="lower",y=p?e==="transpose":e==="no-transpose",b=["f64/dekker","f64/utils/add","f64/utils/multiply","f64/utils/divide"],x=await P(r,[...b,"dtrsv_invert_block"],"dtrsv_invert_block_main"),v=await P(r,[...b,"dtrsv_apply_inverse"],"dtrsv_apply_inverse_main"),B=await P(r,[...b,"dtrsv_update"],"dtrsv_update_main"),A=y===g,S=[];for(let nr=0;nr<t;nr+=64)S.push(nr);A||S.reverse();let _=S.length,N=r.limits.maxComputeWorkgroupsPerDimension,I=r.limits.minUniformBufferOffsetAlignment,k=null,L=null,R=null,W=null,V=null,C=null,z=null,K=null,Y=null,$=null,J=null;try{if(m)k=i._buf,L=i._loBuf;else{let tr=U(i);k=h(r,tr.hi,"dtrsv-AHi",!1),L=h(r,tr.lo,"dtrsv-ALo",!1)}if(l)R=u._buf,W=u._loBuf;else{let tr=U(u);R=h(r,tr.hi,"dtrsv-xHi",!0),W=h(r,tr.lo,"dtrsv-xLo",!0)}V=fr(r,_*64*64*4,"dtrsv-AinvHi"),C=fr(r,_*64*64*4,"dtrsv-AinvLo");let nr=qa(_,I,tr=>{let gr=tr*64,Gr=Math.min(gr+64,t);return[n,tr,gr,Gr]});z=Ha(r,nr,"dtrsv-apply-params");let er=qa(_,I,tr=>{let gr=tr*64,Gr=Math.min(gr+64,t);return[t,n,s,y?0:1,g?0:1,gr,Gr]});K=Ha(r,er,"dtrsv-update-params");let{commandEncoder:Q,querySet:rr}=Mr(r);Y=q(r,[{value:t,type:"u32"},{value:s,type:"u32"},{value:y?0:1,type:"u32"},{value:g?0:1,type:"u32"},{value:w?1:0,type:"u32"}],"dtrsv-invert-params");let ar=D(r,x.getBindGroupLayout(0),[k,L,V,C,Y]);hr(Q,x,ar,{x:64,y:_},rr?{timestampWrites:{querySet:rr,beginningOfPassWriteIndex:0}}:void 0);for(let tr=0;tr<S.length;tr++){let gr=S[tr],Gr=Math.min(gr+64,t),Nr=gr/64,Tr=tr===S.length-1,Sr=Nr*I,xr=D(r,v.getBindGroupLayout(0),[V,C,R,W,{buffer:z,offset:Sr,size:16}]);hr(Q,v,xr,1,Tr&&rr?{timestampWrites:{querySet:rr,endOfPassWriteIndex:1}}:void 0);let Er=A?t-Gr:gr;if(Er===0)continue;let _r=D(r,B.getBindGroupLayout(0),[k,L,R,W,{buffer:K,offset:Sr,size:32}]),Wr=Math.min(Er,N);hr(Q,B,_r,Wr)}let lr=kr(r,Q,rr);$=l?null:E(r,Q,R),J=l?null:E(r,Q,W),F(r,Q);let ur=await j(lr);if(l)return ur!==void 0?{gpuTimeMs:ur}:{};let mr=await G($,Float32Array);$=null;let yr=await G(J,Float32Array);J=null;let wr=dr(mr,yr);return ur!==void 0?{x:wr,gpuTimeMs:ur}:{x:wr}}finally{!m&&k&&f(k),!m&&L&&f(L),!l&&R&&f(R),!l&&W&&f(W),V&&f(V),C&&f(C),z&&f(z),K&&f(K),Y&&f(Y),$&&f($),J&&f(J)}}async function Ca(r,o,e,a,t,i,s,u,n,d,l,m,w,c,p="row-major"){let g=u instanceof X,y=d instanceof X,b=w instanceof X;if(H(r),T(r,"sgemm",{A:u,B:d,C:w}),o!=="no-transpose"&&o!=="transpose")throw new Error("transA must be 'no-transpose' or 'transpose'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("transB must be 'no-transpose' or 'transpose'.");if(p!=="row-major"&&p!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof s!="number")throw new Error("alpha must be a number.");if(Number.isNaN(s))throw new Error("alpha must not be NaN.");if(!Number.isFinite(s))throw new Error("alpha must be finite.");if(typeof m!="number")throw new Error("beta must be a number.");if(Number.isNaN(m))throw new Error("beta must not be NaN.");if(!Number.isFinite(m))throw new Error("beta must be finite.");if(!Number.isInteger(a)||!Number.isInteger(t)||!Number.isInteger(i)||!Number.isInteger(n)||!Number.isInteger(l)||!Number.isInteger(c))throw new Error("m, n, k, lda, ldb, and ldc must be integers.");if(!g&&!(u instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!y&&!(d instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(!b&&!(w instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if((g||y)&&!b)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(b&&(!g||!y))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(a<0||t<0||i<0)throw new Error("m, n, and k must be non-negative.");if(n<=0||l<=0||c<=0)throw new Error("lda, ldb, and ldc must be positive.");if(a===0||t===0)return b?{}:{C:w};let x=g?u.layout:p,v=y?d.layout:p,B=b?w.layout:p,A=x==="column-major"?i:a,S=x==="column-major"?a:i,_=o==="no-transpose"?A:S,N=o==="no-transpose"?S:A;if(n<N)throw new Error(`lda must be >= ${x==="column-major"?"rows":"cols"} of A as stored.`);if(g){if(n!==u.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[lr,ur]=o==="no-transpose"?[a,i]:[i,a];if(u.rows<lr||u.cols<ur)throw new Error("A is too small for the given m, k, and transA.")}else if(u.length<(_-1)*n+N)throw new Error("A does not have enough elements for the given dimensions and lda.");let I=v==="column-major"?t:i,k=v==="column-major"?i:t,L=e==="no-transpose"?I:k,R=e==="no-transpose"?k:I;if(l<R)throw new Error(`ldb must be >= ${v==="column-major"?"rows":"cols"} of B as stored.`);if(y){if(l!==d.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");let[lr,ur]=e==="no-transpose"?[i,t]:[t,i];if(d.rows<lr||d.cols<ur)throw new Error("B is too small for the given n, k, and transB.")}else if(d.length<(L-1)*l+R)throw new Error("B does not have enough elements for the given dimensions and ldb.");let W=B==="column-major"?t:a,V=B==="column-major"?a:t;if(c<V)throw new Error(`ldc must be >= ${B==="column-major"?"rows":"cols"} of C as stored.`);if(b){if(c!==w.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(w.rows<a||w.cols<t)throw new Error("C is too small for the given m and n.")}else if(w.length<(W-1)*c+V)throw new Error("C does not have enough elements for the given dimensions and ldc.");x==="column-major"&&(o=o==="no-transpose"?"transpose":"no-transpose"),v==="column-major"&&(e=e==="no-transpose"?"transpose":"no-transpose"),B==="column-major"&&([u,d]=[d,u],[g,y]=[y,g],[n,l]=[l,n],[o,e]=[e==="no-transpose"?"transpose":"no-transpose",o==="no-transpose"?"transpose":"no-transpose"],[a,t]=[t,a]);let C=Math.ceil(t/64),z=Math.ceil(a/64),K=C*z>=36,Y=await P(r,K?"sgemm_large":"sgemm_small"),$=g?u._buf:h(r,u,"sgemm-A",!1),J=y?d._buf:h(r,d,"sgemm-B",!1),nr=b?w._buf:h(r,w,"sgemm-C",!0),er=o==="no-transpose",Q=e==="no-transpose",rr=er&&Ee($,n,a,i),ar=Ee(J,l,Q?i:t,Q?t:i),sr=q(r,[{value:a,type:"u32"},{value:t,type:"u32"},{value:i,type:"u32"},{value:s,type:"f32"},{value:m,type:"f32"},{value:n,type:"u32"},{value:l,type:"u32"},{value:c,type:"u32"},{value:o==="transpose"?1:0,type:"u32"},{value:e==="transpose"?1:0,type:"u32"},{value:rr?1:0,type:"u32"},{value:ar?1:0,type:"u32"}],"sgemm-params");try{let lr=D(r,Y.getBindGroupLayout(0),[$,Dr(r,$),J,Dr(r,J),nr,sr]),ur=K?{x:or(r,C,"sgemm","x"),y:or(r,z,"sgemm","y")}:{x:or(r,Math.ceil(t/32),"sgemm","x"),y:or(r,Math.ceil(a/32),"sgemm","y")},{commandEncoder:mr,ts:yr}=O(r,Y,lr,ur),wr=b?null:E(r,mr,nr);F(r,mr);let tr=await j(yr);if(b)return tr!==void 0?{gpuTimeMs:tr}:{};let gr=await G(wr,Float32Array);return tr!==void 0?{C:gr,gpuTimeMs:tr}:{C:gr}}finally{g||f($),y||f(J),b||f(nr),f(sr)}}async function Wa(r,o,e,a,t,i,s,u,n,d,l,m,w,c,p,g="row-major"){let y=n instanceof X,b=l instanceof X,x=c instanceof X;if(H(r),T(r,"sgemmtr",{A:n,B:l,C:c}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("transA must be 'no-transpose' or 'transpose'.");if(a!=="no-transpose"&&a!=="transpose")throw new Error("transB must be 'no-transpose' or 'transpose'.");if(g!=="row-major"&&g!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof u!="number")throw new Error("alpha must be a number.");if(Number.isNaN(u))throw new Error("alpha must not be NaN.");if(!Number.isFinite(u))throw new Error("alpha must be finite.");if(typeof w!="number")throw new Error("beta must be a number.");if(Number.isNaN(w))throw new Error("beta must not be NaN.");if(!Number.isFinite(w))throw new Error("beta must be finite.");if(!Number.isInteger(t)||!Number.isInteger(i)||!Number.isInteger(s)||!Number.isInteger(d)||!Number.isInteger(m)||!Number.isInteger(p))throw new Error("m, n, k, lda, ldb, and ldc must be integers.");if(!y&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!b&&!(l instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(!x&&!(c instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if((y||b)&&!x)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(x&&(!y||!b))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(t<0||i<0||s<0)throw new Error("m, n, and k must be non-negative.");if(d<=0||m<=0||p<=0)throw new Error("lda, ldb, and ldc must be positive.");if(t===0||i===0)return x?{}:{C:c};let v=y?n.layout:g,B=b?l.layout:g,A=x?c.layout:g,S=v==="column-major"?s:t,_=v==="column-major"?t:s,N=e==="no-transpose"?S:_,I=e==="no-transpose"?_:S;if(d<I)throw new Error(`lda must be >= ${v==="column-major"?"rows":"cols"} of A as stored.`);if(y){if(d!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[rr,ar]=e==="no-transpose"?[t,s]:[s,t];if(n.rows<rr||n.cols<ar)throw new Error("A is too small for the given m, k, and transA.")}else if(n.length<(N-1)*d+I)throw new Error("A does not have enough elements for the given dimensions and lda.");let k=B==="column-major"?i:s,L=B==="column-major"?s:i,R=a==="no-transpose"?k:L,W=a==="no-transpose"?L:k;if(m<W)throw new Error(`ldb must be >= ${B==="column-major"?"rows":"cols"} of B as stored.`);if(b){if(m!==l.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");let[rr,ar]=a==="no-transpose"?[s,i]:[i,s];if(l.rows<rr||l.cols<ar)throw new Error("B is too small for the given n, k, and transB.")}else if(l.length<(R-1)*m+W)throw new Error("B does not have enough elements for the given dimensions and ldb.");let V=A==="column-major"?i:t,C=A==="column-major"?t:i;if(p<C)throw new Error(`ldc must be >= ${A==="column-major"?"rows":"cols"} of C as stored.`);if(x){if(p!==c.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(c.rows<t||c.cols<i)throw new Error("C is too small for the given m and n.")}else if(c.length<(V-1)*p+C)throw new Error("C does not have enough elements for the given dimensions and ldc.");v==="column-major"&&(e=e==="no-transpose"?"transpose":"no-transpose"),B==="column-major"&&(a=a==="no-transpose"?"transpose":"no-transpose"),A==="column-major"&&([n,l]=[l,n],[y,b]=[b,y],[d,m]=[m,d],[e,a]=[a==="no-transpose"?"transpose":"no-transpose",e==="no-transpose"?"transpose":"no-transpose"],[t,i]=[i,t],o=o==="lower"?"upper":"lower");let z=Math.ceil(i/64),K=Math.ceil(t/64),Y=z*K>=36,$=await P(r,Y?"sgemmtr_large":"sgemmtr_small"),J=y?n._buf:h(r,n,"sgemmtr-A",!1),nr=b?l._buf:h(r,l,"sgemmtr-B",!1),er=x?c._buf:h(r,c,"sgemmtr-C",!0),Q=q(r,[{value:t,type:"u32"},{value:i,type:"u32"},{value:s,type:"u32"},{value:u,type:"f32"},{value:w,type:"f32"},{value:d,type:"u32"},{value:m,type:"u32"},{value:p,type:"u32"},{value:e==="transpose"?1:0,type:"u32"},{value:a==="transpose"?1:0,type:"u32"},{value:o==="upper"?1:0,type:"u32"}],"sgemmtr-params");try{let rr=D(r,$.getBindGroupLayout(0),[J,nr,er,Q]),ar=Y?{x:or(r,z,"sgemmtr","x"),y:or(r,K,"sgemmtr","y")}:{x:or(r,Math.ceil(i/32),"sgemmtr","x"),y:or(r,Math.ceil(t/32),"sgemmtr","y")},{commandEncoder:sr,ts:lr}=O(r,$,rr,ar),ur=x?null:E(r,sr,er);F(r,sr);let mr=await j(lr);if(x)return mr!==void 0?{gpuTimeMs:mr}:{};let yr=await G(ur,Float32Array);return mr!==void 0?{C:yr,gpuTimeMs:mr}:{C:yr}}finally{y||f(J),b||f(nr),x||f(er),f(Q)}}async function Va(r,o,e,a,t,i,s,u,n,d,l,m="row-major"){let w=s instanceof X,c=d instanceof X;if(H(r),T(r,"ssyrk",{A:s,C:d}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(m!=="row-major"&&m!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof i!="number")throw new Error("alpha must be a number.");if(Number.isNaN(i))throw new Error("alpha must not be NaN.");if(!Number.isFinite(i))throw new Error("alpha must be finite.");if(typeof n!="number")throw new Error("beta must be a number.");if(Number.isNaN(n))throw new Error("beta must not be NaN.");if(!Number.isFinite(n))throw new Error("beta must be finite.");if(!Number.isInteger(a)||!Number.isInteger(t)||!Number.isInteger(u)||!Number.isInteger(l))throw new Error("n, k, lda, and ldc must be integers.");if(!w&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!c&&!(d instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if(w&&!c)throw new Error("C must be a GpuMatrix when A is a GpuMatrix.");if(c&&!w)throw new Error("A must be a GpuMatrix when C is a GpuMatrix.");if(a<0||t<0)throw new Error("n and k must be non-negative.");if(u<=0||l<=0)throw new Error("lda and ldc must be positive.");if(a===0)return c?{}:{C:d};let p=w?s.layout:m,g=c?d.layout:m,y=p==="column-major"?t:a,b=p==="column-major"?a:t,x=e==="no-transpose"?y:b,v=e==="no-transpose"?b:y;if(u<v)throw new Error(`lda must be >= ${p==="column-major"?"rows":"cols"} of A as stored.`);if(w){if(u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[C,z]=e==="no-transpose"?[a,t]:[t,a];if(s.rows<C||s.cols<z)throw new Error("A is too small for the given n, k, and trans.")}else if(s.length<(x-1)*u+v)throw new Error("A does not have enough elements for the given dimensions and lda.");if(l<a)throw new Error("ldc must be >= n.");if(c){if(l!==d.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(d.rows<a||d.cols<a)throw new Error("C is too small for the given n.")}else if(d.length<(a-1)*l+a)throw new Error("C does not have enough elements for the given dimensions and ldc.");let B=e;p==="column-major"&&(B=B==="no-transpose"?"transpose":"no-transpose");let A=B==="no-transpose"?"transpose":"no-transpose",S=o;g==="column-major"&&([B,A]=[A==="no-transpose"?"transpose":"no-transpose",B==="no-transpose"?"transpose":"no-transpose"],S=S==="lower"?"upper":"lower");let _=Math.ceil(a/64),N=Math.ceil(a/64),I=_*N>=36,k=await P(r,I?"sgemmtr_large":"sgemmtr_small"),L=w?s._buf:h(r,s,"ssyrk-A",!1),R=c?d._buf:h(r,d,"ssyrk-C",!0),W=w?fr(r,L.size,"ssyrk-B",GPUBufferUsage.COPY_DST):h(r,s,"ssyrk-B",!1),V=q(r,[{value:a,type:"u32"},{value:a,type:"u32"},{value:t,type:"u32"},{value:i,type:"f32"},{value:n,type:"f32"},{value:u,type:"u32"},{value:u,type:"u32"},{value:l,type:"u32"},{value:B==="transpose"?1:0,type:"u32"},{value:A==="transpose"?1:0,type:"u32"},{value:S==="upper"?1:0,type:"u32"}],"ssyrk-params");try{let C=D(r,k.getBindGroupLayout(0),[L,W,R,V]),z=I?{x:or(r,_,"ssyrk","x"),y:or(r,N,"ssyrk","y")}:{x:or(r,Math.ceil(a/32),"ssyrk","x"),y:or(r,Math.ceil(a/32),"ssyrk","y")},{commandEncoder:K,querySet:Y,passDescriptor:$}=Mr(r);w&&K.copyBufferToBuffer(L,0,W,0,L.size),hr(K,k,C,z,$);let J=kr(r,K,Y),nr=c?null:E(r,K,R);F(r,K);let er=await j(J);if(c)return er!==void 0?{gpuTimeMs:er}:{};let Q=await G(nr,Float32Array);return er!==void 0?{C:Q,gpuTimeMs:er}:{C:Q}}finally{w||f(L),f(W),c||f(R),f(V)}}async function Oa(r,o,e,a,t,i,s,u,n,d,l,m,w,c="row-major"){let p=s instanceof X,g=n instanceof X,y=m instanceof X;if(H(r),T(r,"ssyr2k",{A:s,B:n,C:m}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(c!=="row-major"&&c!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof i!="number")throw new Error("alpha must be a number.");if(Number.isNaN(i))throw new Error("alpha must not be NaN.");if(!Number.isFinite(i))throw new Error("alpha must be finite.");if(typeof l!="number")throw new Error("beta must be a number.");if(Number.isNaN(l))throw new Error("beta must not be NaN.");if(!Number.isFinite(l))throw new Error("beta must be finite.");if(!Number.isInteger(a)||!Number.isInteger(t)||!Number.isInteger(u)||!Number.isInteger(d)||!Number.isInteger(w))throw new Error("n, k, lda, ldb, and ldc must be integers.");if(!p&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!g&&!(n instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(!y&&!(m instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if((p||g)&&!y)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(y&&(!p||!g))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(a<0||t<0)throw new Error("n and k must be non-negative.");if(u<=0||d<=0||w<=0)throw new Error("lda, ldb, and ldc must be positive.");if(a===0)return y?{}:{C:m};let b=p?s.layout:c,x=g?n.layout:c,v=y?m.layout:c,B=b==="column-major"?t:a,A=b==="column-major"?a:t,S=e==="no-transpose"?B:A,_=e==="no-transpose"?A:B;if(u<_)throw new Error(`lda must be >= ${b==="column-major"?"rows":"cols"} of A as stored.`);if(p){if(u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[lr,ur]=e==="no-transpose"?[a,t]:[t,a];if(s.rows<lr||s.cols<ur)throw new Error("A is too small for the given n, k, and trans.")}else if(s.length<(S-1)*u+_)throw new Error("A does not have enough elements for the given dimensions and lda.");let N=x==="column-major"?t:a,I=x==="column-major"?a:t,k=e==="no-transpose"?N:I,L=e==="no-transpose"?I:N;if(d<L)throw new Error(`ldb must be >= ${x==="column-major"?"rows":"cols"} of B as stored.`);if(g){if(d!==n.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");let[lr,ur]=e==="no-transpose"?[a,t]:[t,a];if(n.rows<lr||n.cols<ur)throw new Error("B is too small for the given n, k, and trans.")}else if(n.length<(k-1)*d+L)throw new Error("B does not have enough elements for the given dimensions and ldb.");if(w<a)throw new Error("ldc must be >= n.");if(y){if(w!==m.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(m.rows<a||m.cols<a)throw new Error("C is too small for the given n.")}else if(m.length<(a-1)*w+a)throw new Error("C does not have enough elements for the given dimensions and ldc.");let R=e;b==="column-major"&&(R=R==="no-transpose"?"transpose":"no-transpose");let W=e;x==="column-major"&&(W=W==="no-transpose"?"transpose":"no-transpose");let V=v==="column-major"?o==="lower"?"upper":"lower":o,C=lr=>lr==="no-transpose"?"transpose":"no-transpose";function z(lr,ur,mr,yr,wr,tr){let gr=lr,Gr=C(yr);return v!=="column-major"?{transX:gr,X:ur,ldX:mr,transY:Gr,Y:wr,ldY:tr}:{transX:C(Gr),X:wr,ldX:tr,transY:C(gr),Y:ur,ldY:mr}}let K=Math.ceil(a/64),Y=Math.ceil(a/64),$=K*Y>=36,J=await P(r,$?"sgemmtr_large":"sgemmtr_small"),nr=$?{x:or(r,K,"ssyr2k","x"),y:or(r,Y,"ssyr2k","y")}:{x:or(r,Math.ceil(a/32),"ssyr2k","x"),y:or(r,Math.ceil(a/32),"ssyr2k","y")},er=p?s._buf:h(r,s,"ssyr2k-A",!1),Q=g?n._buf:h(r,n,"ssyr2k-B",!1),rr=y?m._buf:h(r,m,"ssyr2k-C",!0),ar=null,sr=null;try{let lr=z(R,er,u,W,Q,d),ur=z(W,Q,d,R,er,u),mr=(Er,_r)=>q(r,[{value:a,type:"u32"},{value:a,type:"u32"},{value:t,type:"u32"},{value:i,type:"f32"},{value:_r,type:"f32"},{value:Er.ldX,type:"u32"},{value:Er.ldY,type:"u32"},{value:w,type:"u32"},{value:Er.transX==="transpose"?1:0,type:"u32"},{value:Er.transY==="transpose"?1:0,type:"u32"},{value:V==="upper"?1:0,type:"u32"}],"ssyr2k-params");ar=mr(lr,l),sr=mr(ur,1);let yr=D(r,J.getBindGroupLayout(0),[lr.X,lr.Y,rr,ar]),wr=D(r,J.getBindGroupLayout(0),[ur.X,ur.Y,rr,sr]),{commandEncoder:tr,querySet:gr}=Mr(r),Gr=gr?{timestampWrites:{querySet:gr,beginningOfPassWriteIndex:0}}:void 0,Nr=gr?{timestampWrites:{querySet:gr,endOfPassWriteIndex:1}}:void 0;hr(tr,J,yr,nr,Gr),hr(tr,J,wr,nr,Nr);let Tr=kr(r,tr,gr),Sr=y?null:E(r,tr,rr);F(r,tr);let xr=await j(Tr);if(y)return xr!==void 0?{gpuTimeMs:xr}:{};let vr=await G(Sr,Float32Array);return xr!==void 0?{C:vr,gpuTimeMs:xr}:{C:vr}}finally{p||f(er),g||f(Q),y||f(rr),ar&&f(ar),sr&&f(sr)}}async function Ka(r,o,e,a,t,i,s,u,n,d,l,m,w,c="row-major"){let p=s instanceof X,g=n instanceof X,y=m instanceof X;if(H(r),T(r,"ssymm",{A:s,B:n,C:m}),o!=="left"&&o!=="right")throw new Error("side must be 'left' or 'right'.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(c!=="row-major"&&c!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof i!="number")throw new Error("alpha must be a number.");if(Number.isNaN(i))throw new Error("alpha must not be NaN.");if(!Number.isFinite(i))throw new Error("alpha must be finite.");if(typeof l!="number")throw new Error("beta must be a number.");if(Number.isNaN(l))throw new Error("beta must not be NaN.");if(!Number.isFinite(l))throw new Error("beta must be finite.");if(!Number.isInteger(a)||!Number.isInteger(t)||!Number.isInteger(u)||!Number.isInteger(d)||!Number.isInteger(w))throw new Error("m, n, lda, ldb, and ldc must be integers.");if(!p&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!g&&!(n instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(!y&&!(m instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if((p||g)&&!y)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(y&&(!p||!g))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(a<0||t<0)throw new Error("m and n must be non-negative.");if(a===0||t===0)return y?{}:{C:m};let b=p?s.layout:c,x=g?n.layout:c,v=y?m.layout:c,B=o==="left"?a:t;if(u<B)throw new Error("lda must be >= "+(o==="left"?"m":"n")+".");if(p){if(u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(s.rows<B||s.cols<B)throw new Error("A is too small for the given m/n and side.")}else if(s.length<(B-1)*u+B)throw new Error("A does not have enough elements for the given dimensions and lda.");let A=x==="column-major"?t:a,S=x==="column-major"?a:t;if(d<S)throw new Error(`ldb must be >= ${x==="column-major"?"rows":"cols"} of B as stored.`);if(g){if(d!==n.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");if(n.rows<a||n.cols<t)throw new Error("B is too small for the given m and n.")}else if(n.length<(A-1)*d+S)throw new Error("B does not have enough elements for the given dimensions and ldb.");let _=v==="column-major"?t:a,N=v==="column-major"?a:t;if(w<N)throw new Error(`ldc must be >= ${v==="column-major"?"rows":"cols"} of C as stored.`);if(y){if(w!==m.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(m.rows<a||m.cols<t)throw new Error("C is too small for the given m and n.")}else if(m.length<(_-1)*w+N)throw new Error("C does not have enough elements for the given dimensions and ldc.");let I=b==="column-major"?e==="lower"?"upper":"lower":e,k=x==="column-major"?"transpose":"no-transpose",L="no-transpose",R=a,W=t,V=B,C=o==="left"?L:k,z=o==="left"?k:L,K=tr=>tr==="no-transpose"?"transpose":"no-transpose",Y=o==="right";v==="column-major"&&([C,z]=[K(z),K(C)],Y=!Y,[R,W]=[W,R]);let $=B,J=Math.ceil(W/64),nr=Math.ceil(R/64),er=J*nr>=36,Q=await P(r,er?"sgemm_large":"sgemm_small"),rr=await P(r,"symmetrize"),ar=er?{x:or(r,J,"ssymm","x"),y:or(r,nr,"ssymm","y")}:{x:or(r,Math.ceil(W/32),"ssymm","x"),y:or(r,Math.ceil(R/32),"ssymm","y")},sr=p?s._buf:h(r,s,"ssymm-A",!1),lr=g?n._buf:h(r,n,"ssymm-B",!1),ur=y?m._buf:h(r,m,"ssymm-C",!0),mr=fr(r,B*$*4,"ssymm-Adense"),yr=null,wr=null;try{yr=q(r,[{value:B,type:"u32"},{value:u,type:"u32"},{value:$,type:"u32"},{value:I==="upper"?1:0,type:"u32"}],"ssymm-sym-params");let tr=D(r,rr.getBindGroupLayout(0),[sr,mr,yr]),gr=Y?lr:mr,Gr=Y?d:$,Nr=Y?mr:lr;wr=q(r,[{value:R,type:"u32"},{value:W,type:"u32"},{value:V,type:"u32"},{value:i,type:"f32"},{value:l,type:"f32"},{value:Gr,type:"u32"},{value:Y?$:d,type:"u32"},{value:w,type:"u32"},{value:C==="transpose"?1:0,type:"u32"},{value:z==="transpose"?1:0,type:"u32"}],"ssymm-gemm-params");let Sr=D(r,Q.getBindGroupLayout(0),[gr,Dr(r,gr),Nr,Dr(r,Nr),ur,wr]),{commandEncoder:xr,querySet:vr}=Mr(r),Er=vr?{timestampWrites:{querySet:vr,beginningOfPassWriteIndex:0}}:void 0,_r=vr?{timestampWrites:{querySet:vr,endOfPassWriteIndex:1}}:void 0;hr(xr,rr,tr,{x:Math.ceil(B/8),y:Math.ceil(B/8)},Er),hr(xr,Q,Sr,ar,_r);let Wr=kr(r,xr,vr),Ur=y?null:E(r,xr,ur);F(r,xr);let Zr=await j(Wr);if(y)return Zr!==void 0?{gpuTimeMs:Zr}:{};let fe=await G(Ur,Float32Array);return Zr!==void 0?{C:fe,gpuTimeMs:Zr}:{C:fe}}finally{p||f(sr),g||f(lr),y||f(ur),f(mr),yr&&f(yr),wr&&f(wr)}}async function Ua(r,o,e,a,t,i,s,u,n,d,l,m,w="row-major"){let c=n instanceof X,p=l instanceof X,g=t==="unit";if(H(r),T(r,"strmm",{A:n,B:l}),o!=="left"&&o!=="right")throw new Error("side must be 'left' or 'right'.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(a!=="no-transpose"&&a!=="transpose")throw new Error("transA must be 'no-transpose' or 'transpose'.");if(!g&&t!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(w!=="row-major"&&w!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof u!="number")throw new Error("alpha must be a number.");if(Number.isNaN(u))throw new Error("alpha must not be NaN.");if(!Number.isFinite(u))throw new Error("alpha must be finite.");if(!Number.isInteger(i)||!Number.isInteger(s)||!Number.isInteger(d)||!Number.isInteger(m))throw new Error("m, n, lda, and ldb must be integers.");if(!c&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!p&&!(l instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(c!==p)throw new Error("A and B must both be GpuMatrix or both be Float32Array.");if(i<0||s<0)throw new Error("m and n must be non-negative.");if(i===0||s===0)return p?{}:{B:l};let y=c?n.layout:w,b=p?l.layout:w,x=o==="left"?i:s;if(d<x)throw new Error("lda must be >= "+(o==="left"?"m":"n")+".");if(c){if(d!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(n.rows<x||n.cols<x)throw new Error("A is too small for the given m/n and side.")}else if(n.length<(x-1)*d+x)throw new Error("A does not have enough elements for the given dimensions and lda.");let v=b==="column-major"?s:i,B=b==="column-major"?i:s;if(m<B)throw new Error(`ldb must be >= ${b==="column-major"?"rows":"cols"} of B as stored.`);if(p){if(m!==l.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");if(l.rows<i||l.cols<s)throw new Error("B is too small for the given m and n.")}else if(l.length<(v-1)*m+B)throw new Error("B does not have enough elements for the given dimensions and ldb.");let A=y==="column-major"?e==="lower"?"upper":"lower":e,S=y==="column-major"?a==="no-transpose"?"transpose":"no-transpose":a,_=b==="column-major"?"transpose":"no-transpose",N="no-transpose",I=i,k=s,L=x,R=o==="left"?N:_,W=o==="left"?_:N,V=yr=>yr==="no-transpose"?"transpose":"no-transpose",C=o==="right";b==="column-major"&&([R,W]=[V(W),V(R)],C=!C,[I,k]=[k,I]);let z=x,K=Math.ceil(k/64),Y=Math.ceil(I/64),$=K*Y>=36,J=await P(r,$?"sgemm_large":"sgemm_small"),nr=await P(r,"triangularize"),er=$?{x:or(r,K,"strmm","x"),y:or(r,Y,"strmm","y")}:{x:or(r,Math.ceil(k/32),"strmm","x"),y:or(r,Math.ceil(I/32),"strmm","y")},Q=null,rr=null,ar=null,sr=null,lr=null,ur=null,mr=!1;try{Q=c?n._buf:h(r,n,"strmm-A",!1),rr=p?l._buf:h(r,l,"strmm-B",!0),ar=fr(r,x*z*4,"strmm-Adense"),sr=fr(r,v*m*4,"strmm-out",GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST),lr=q(r,[{value:x,type:"u32"},{value:d,type:"u32"},{value:z,type:"u32"},{value:A==="upper"?1:0,type:"u32"},{value:S==="transpose"?1:0,type:"u32"},{value:g?1:0,type:"u32"}],"strmm-tri-params");let yr=D(r,nr.getBindGroupLayout(0),[Q,ar,lr]),wr=C?rr:ar,tr=C?m:z,gr=C?ar:rr;ur=q(r,[{value:I,type:"u32"},{value:k,type:"u32"},{value:L,type:"u32"},{value:u,type:"f32"},{value:0,type:"f32"},{value:tr,type:"u32"},{value:C?z:m,type:"u32"},{value:m,type:"u32"},{value:R==="transpose"?1:0,type:"u32"},{value:W==="transpose"?1:0,type:"u32"}],"strmm-gemm-params");let Nr=D(r,J.getBindGroupLayout(0),[wr,Dr(r,wr),gr,Dr(r,gr),sr,ur]),{commandEncoder:Tr,querySet:Sr}=Mr(r);Tr.copyBufferToBuffer(rr,0,sr,0,Math.min(rr.size,sr.size));let xr=Sr?{timestampWrites:{querySet:Sr,beginningOfPassWriteIndex:0}}:void 0,vr=Sr?{timestampWrites:{querySet:Sr,endOfPassWriteIndex:1}}:void 0;hr(Tr,nr,yr,{x:Math.ceil(x/8),y:Math.ceil(x/8)},xr),hr(Tr,J,Nr,er,vr);let Er=kr(r,Tr,Sr),_r=p?null:E(r,Tr,sr);F(r,Tr);let Wr=await j(Er);if(p)return f(l._buf),l._buf=sr,mr=!0,Wr!==void 0?{gpuTimeMs:Wr}:{};let Ur=await G(_r,Float32Array);return Wr!==void 0?{B:Ur,gpuTimeMs:Wr}:{B:Ur}}finally{!c&&Q&&f(Q),!p&&rr&&f(rr),ar&&f(ar),sr&&!mr&&f(sr),lr&&f(lr),ur&&f(ur)}}async function za(r,o,e,a,t,i,s,u,n,d,l,m,w="row-major"){let c=n instanceof X,p=l instanceof X,g=t==="unit";if(H(r),T(r,"strsm",{A:n,B:l}),o!=="left"&&o!=="right")throw new Error("side must be 'left' or 'right'.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(a!=="no-transpose"&&a!=="transpose")throw new Error("transA must be 'no-transpose' or 'transpose'.");if(!g&&t!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(w!=="row-major"&&w!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof u!="number")throw new Error("alpha must be a number.");if(Number.isNaN(u))throw new Error("alpha must not be NaN.");if(!Number.isFinite(u))throw new Error("alpha must be finite.");if(!Number.isInteger(i)||!Number.isInteger(s)||!Number.isInteger(d)||!Number.isInteger(m))throw new Error("m, n, lda, and ldb must be integers.");if(!c&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!p&&!(l instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(c!==p)throw new Error("A and B must both be GpuMatrix or both be Float32Array.");if(i<0||s<0)throw new Error("m and n must be non-negative.");if(i===0||s===0)return p?{}:{B:l};let y=c?n.layout:w,b=p?l.layout:w,x=o==="left"?i:s;if(d<x)throw new Error("lda must be >= "+(o==="left"?"m":"n")+".");if(c){if(d!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(n.rows<x||n.cols<x)throw new Error("A is too small for the given m/n and side.")}else if(n.length<(x-1)*d+x)throw new Error("A does not have enough elements for the given dimensions and lda.");let v=b==="column-major"?s:i,B=b==="column-major"?i:s;if(m<B)throw new Error(`ldb must be >= ${b==="column-major"?"rows":"cols"} of B as stored.`);if(p){if(m!==l.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");if(l.rows<i||l.cols<s)throw new Error("B is too small for the given m and n.")}else if(l.length<(v-1)*m+B)throw new Error("B does not have enough elements for the given dimensions and ldb.");let A=y==="column-major"?e==="lower"?"upper":"lower":e,S=y==="column-major"?a==="no-transpose"?"transpose":"no-transpose":a,_=o==="left"?s:i,N=o==="left",I=S==="no-transpose"==(A==="lower"),k=o==="left"?I:!I,L=[];for(let rr=0;rr<x;rr+=64)L.push(rr);k||L.reverse();let R=L.length,W=await P(r,"strsv_invert_block"),V=await P(r,"block_transfer"),C=await P(r,"sscal"),z=null,K=null,Y=null,$=[],J=[];function nr(rr,ar){let sr=fr(r,rr,ar);return J.push(sr),sr}function er(rr,ar){let sr=q(r,rr,ar);return $.push(sr),sr}let Q=(v-1)*m+B;try{z=c?n._buf:h(r,n,"strsm-A",!1),K=p?l._buf:h(r,l,"strsm-B",!0),Y=fr(r,R*64*64*4,"strsm-Ainv");let rr=null;if(u!==1&&u!==0){let Sr=er([{value:Q,type:"u32"},{value:u,type:"f32"},{value:1,type:"u32"}],"strsm-scale-params");rr=D(r,C.getBindGroupLayout(0),[K,Sr])}let ar=er([{value:x,type:"u32"},{value:d,type:"u32"},{value:S==="transpose"?1:0,type:"u32"},{value:A==="upper"?1:0,type:"u32"},{value:g?1:0,type:"u32"}],"strsm-invert-params"),sr=D(r,W.getBindGroupLayout(0),[z,Y,ar]),lr=nr(64*_*4,"strsm-Bblock"),ur=nr(64*_*4,"strsm-Xblock"),mr=nr(x*64*4,"strsm-Aoff"),yr=nr(x*_*4,"strsm-delta"),{commandEncoder:wr,querySet:tr}=Mr(r);if(u===0){let Sr=Math.ceil(B/64),xr=Math.ceil(v/64),vr=Sr*xr>=36,Er=await P(r,vr?"sgemm_large":"sgemm_small"),_r=er([{value:v,type:"u32"},{value:B,type:"u32"},{value:0,type:"u32"},{value:0,type:"f32"},{value:0,type:"f32"},{value:1,type:"u32"},{value:1,type:"u32"},{value:m,type:"u32"},{value:0,type:"u32"},{value:0,type:"u32"}],"strsm-zero-params"),Wr=D(r,Er.getBindGroupLayout(0),[Y,Dr(r,Y),Y,Dr(r,Y),K,_r]),Ur=vr?{x:or(r,Sr,"strsm","x"),y:or(r,xr,"strsm","y")}:{x:or(r,Math.ceil(B/32),"strsm","x"),y:or(r,Math.ceil(v/32),"strsm","y")};hr(wr,Er,Wr,Ur,tr?{timestampWrites:{querySet:tr,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1}}:void 0)}else{rr&&hr(wr,C,rr,br(r,Q)),hr(wr,W,sr,{x:64,y:R},tr?{timestampWrites:{querySet:tr,beginningOfPassWriteIndex:0}}:void 0);for(let xr=0;xr<L.length;xr++){let vr=L[xr],Er=Math.min(vr+64,x),_r=Er-vr,Wr=vr/64,Ur=xr===L.length-1,Zr=er([{value:vr,type:"u32"},{value:_r,type:"u32"},{value:0,type:"u32"},{value:_,type:"u32"},{value:m,type:"u32"},{value:b==="column-major"?1:0,type:"u32"},{value:N?1:0,type:"u32"},{value:2,type:"u32"}],"strsm-gather-B-params"),fe=D(r,V.getBindGroupLayout(0),[lr,K,Zr]);hr(wr,V,fe,Yr(r,"strsm",_r,_));{let Xr=_r,$r=_,_e=_r,ae=Math.ceil($r/64),ie=Math.ceil(Xr/64),se=ae*ie>=36,ne=await P(r,se?"sgemm_large":"sgemm_small"),Be=er([{value:Xr,type:"u32"},{value:$r,type:"u32"},{value:_e,type:"u32"},{value:1,type:"f32"},{value:0,type:"f32"},{value:64,type:"u32"},{value:_,type:"u32"},{value:_,type:"u32"},{value:o==="right"?1:0,type:"u32"},{value:0,type:"u32"}],"strsm-apply-params"),ce={buffer:Y,offset:Wr*64*64*4,size:4096*4},Ae=D(r,ne.getBindGroupLayout(0),[ce,Dr(r,ce),lr,Dr(r,lr),ur,Be]),ti=se?{x:or(r,ae,"strsm","x"),y:or(r,ie,"strsm","y")}:{x:or(r,Math.ceil($r/32),"strsm","x"),y:or(r,Math.ceil(Xr/32),"strsm","y")};hr(wr,ne,Ae,ti)}let me=k?Er:0,Re=k?x:vr,je=me<Re,Ya=er([{value:vr,type:"u32"},{value:_r,type:"u32"},{value:0,type:"u32"},{value:_,type:"u32"},{value:m,type:"u32"},{value:b==="column-major"?1:0,type:"u32"},{value:N?1:0,type:"u32"},{value:0,type:"u32"}],"strsm-scatter-params"),Za=D(r,V.getBindGroupLayout(0),[ur,K,Ya]),Xa=Ur&&!je&&tr?{timestampWrites:{querySet:tr,endOfPassWriteIndex:1}}:void 0;if(hr(wr,V,Za,Yr(r,"strsm",_r,_),Xa),!je)continue;let oe=Re-me,$a=er([{value:me,type:"u32"},{value:oe,type:"u32"},{value:vr,type:"u32"},{value:_r,type:"u32"},{value:d,type:"u32"},{value:S==="transpose"?1:0,type:"u32"},{value:N?1:0,type:"u32"},{value:2,type:"u32"}],"strsm-gather-A-params"),Ja=D(r,V.getBindGroupLayout(0),[mr,z,$a]);hr(wr,V,Ja,Yr(r,"strsm",oe,_r));{let Xr=oe,$r=_,_e=_r,ae=Math.ceil($r/64),ie=Math.ceil(Xr/64),se=ae*ie>=36,ne=await P(r,se?"sgemm_large":"sgemm_small"),Be=er([{value:Xr,type:"u32"},{value:$r,type:"u32"},{value:_e,type:"u32"},{value:1,type:"f32"},{value:0,type:"f32"},{value:_r,type:"u32"},{value:_,type:"u32"},{value:_,type:"u32"},{value:0,type:"u32"},{value:0,type:"u32"}],"strsm-update-params"),ce=D(r,ne.getBindGroupLayout(0),[mr,Dr(r,mr),ur,Dr(r,ur),yr,Be]),Ae=se?{x:or(r,ae,"strsm","x"),y:or(r,ie,"strsm","y")}:{x:or(r,Math.ceil($r/32),"strsm","x"),y:or(r,Math.ceil(Xr/32),"strsm","y")};hr(wr,ne,ce,Ae)}let Qa=er([{value:me,type:"u32"},{value:oe,type:"u32"},{value:0,type:"u32"},{value:_,type:"u32"},{value:m,type:"u32"},{value:b==="column-major"?1:0,type:"u32"},{value:N?1:0,type:"u32"},{value:1,type:"u32"}],"strsm-scatter-sub-params"),ri=D(r,V.getBindGroupLayout(0),[yr,K,Qa]),ei=Ur&&tr?{timestampWrites:{querySet:tr,endOfPassWriteIndex:1}}:void 0;hr(wr,V,ri,Yr(r,"strsm",oe,_),ei)}}let gr=kr(r,wr,tr),Gr=p?null:E(r,wr,K);F(r,wr);let Nr=await j(gr);if(p)return Nr!==void 0?{gpuTimeMs:Nr}:{};let Tr=await G(Gr,Float32Array);return Nr!==void 0?{B:Tr,gpuTimeMs:Nr}:{B:Tr}}finally{!c&&z&&f(z),!p&&K&&f(K),Y&&f(Y),f(J),f($)}}return li(_s);})();