wgblas 1.1.1 → 1.2.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 mt=Object.create;var ur=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var pt=Object.getOwnPropertyNames;var gt=Object.getPrototypeOf,wt=Object.prototype.hasOwnProperty;var lr=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(r,e)=>(typeof require<"u"?require:r)[e]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var I=(a,r,e)=>()=>{if(e)throw e[0];try{return a&&(r=a(a=0)),r}catch(o){throw e=[o],o}};var yr=(a,r)=>{for(var e in r)ur(a,e,{get:r[e],enumerable:!0})},_r=(a,r,e,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of pt(r))!wt.call(a,t)&&t!==e&&ur(a,t,{get:()=>r[t],enumerable:!(o=dt(r,t))||o.enumerable});return a};var fr=(a,r,e)=>(e=a!=null?mt(gt(a)):{},_r(r||!a||!a.__esModule?ur(e,"default",{value:a,enumerable:!0}):e,a)),bt=a=>_r(ur({},"__esModule",{value:!0}),a);var Ur,Mr=I(()=>{Ur=`// amax reduction: collapses 2*WGS (value, index) pairs into one index.
1
+ var wgblas=(()=>{var ft=Object.create;var ur=Object.defineProperty;var ct=Object.getOwnPropertyDescriptor;var mt=Object.getOwnPropertyNames;var dt=Object.getPrototypeOf,pt=Object.prototype.hasOwnProperty;var lr=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var W=(a,e,r)=>()=>{if(r)throw r[0];try{return a&&(e=a(a=0)),e}catch(o){throw r=[o],o}};var vr=(a,e)=>{for(var r in e)ur(a,r,{get:e[r],enumerable:!0})},yr=(a,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of mt(e))!pt.call(a,t)&&t!==r&&ur(a,t,{get:()=>e[t],enumerable:!(o=ct(e,t))||o.enumerable});return a};var fr=(a,e,r)=>(r=a!=null?ft(dt(a)):{},yr(e||!a||!a.__esModule?ur(r,"default",{value:a,enumerable:!0}):r,a)),gt=a=>yr(ur({},"__esModule",{value:!0}),a);var Ir,Fr=W(()=>{Ir=`// amax reduction: collapses 2*WGS (value, index) pairs into one index.
2
2
  // dispatch: 1 workgroup of WGS threads.
3
3
  // partials_val and partials_idx must have exactly 2*WGS entries.
4
4
 
@@ -41,7 +41,7 @@ fn reduce(
41
41
 
42
42
  if (i == 0u) { result[0] = tile_idx[0]; }
43
43
  }
44
- `});var Vr,Tr=I(()=>{Vr=`// sum reduction: collapses 2*WGS partials into one scalar.
44
+ `});var Wr,Nr=W(()=>{Wr=`// sum reduction: collapses 2*WGS partials into one scalar.
45
45
  // dispatch: 1 workgroup of WGS threads.
46
46
  // partials must have exactly 2*WGS entries.
47
47
 
@@ -67,56 +67,47 @@ fn reduce(
67
67
 
68
68
  if (i == 0u) { result[0] = tile[0]; }
69
69
  }
70
- `});var Hr,Rr=I(()=>{Hr=`// sum reduction (f64): collapses 2*WGS partial [main, aux] pairs into one,
71
- // using computeSum instead of plain f32 \`+\` (see reduction/sum.wgsl for the
72
- // f32 original this mirrors).
73
- // dispatch: 1 workgroup of WGS threads. partialsMain/partialsAux must have
74
- // exactly 2*WGS entries each.
75
- //
76
- // Concatenated after f64add.wgsl by getPipeline (WGSL has no #include),
77
- // reusing its decode/encode/computeSum and Packed struct \u2014 f64add.wgsl
78
- // declares no bindings and no entry point of its own (just helper functions),
79
- // so bindings here start at 0 and the entry point is simply \`reduce_f64\`.
80
- //
81
- // partialsAux/result's aux slot are array<u32>, not array<f32> \u2014 aux's bits
82
- // must never pass through an f32-typed storage slot (NaN-bit-pattern
83
- // corruption risk, see f64pack.mjs and the Packed struct comment above
84
- // decode()/encode() in f64add.wgsl).
85
-
86
- @group(0) @binding(0) var<storage, read> partialsMain: array<f32>;
87
- @group(0) @binding(1) var<storage, read> partialsAux: array<u32>;
88
- @group(0) @binding(2) var<storage, read_write> resultMain: array<f32, 1>;
89
- @group(0) @binding(3) var<storage, read_write> resultAux: array<u32, 1>;
70
+ `});var Mr,Dr=W(()=>{Mr=`// sum reduction (f64, double-double): collapses 2*WGS partial (hi, lo) pairs
71
+ // into one, using ddAddProtected instead of plain f32 \`+\` (see
72
+ // reduction/sum.wgsl for the f32 original this mirrors).
73
+ // dispatch: 1 workgroup of WGS threads. partialsHi/partialsLo must have
74
+ // exactly 2*WGS entries each. Concatenated after f64/dekker.wgsl for
75
+ // DD/ddAddProtected (see it for why plain ddAdd isn't safe).
76
+
77
+ @group(0) @binding(0) var<storage, read> partialsHi: array<f32>;
78
+ @group(0) @binding(1) var<storage, read> partialsLo: array<f32>;
79
+ @group(0) @binding(2) var<storage, read_write> resultHi: array<f32, 1>;
80
+ @group(0) @binding(3) var<storage, read_write> resultLo: array<f32, 1>;
90
81
 
91
82
  const WGS: u32 = 64;
92
83
 
93
- var<workgroup> tile: array<Packed, 64>;
94
-
95
- fn addPair(a: Packed, b: Packed) -> Packed {
96
- return computeSum(decode(bitcast<u32>(a.main), a.aux), decode(bitcast<u32>(b.main), b.aux));
97
- }
84
+ var<workgroup> tile: array<DD, 64>;
98
85
 
99
86
  @compute @workgroup_size(64)
100
87
  fn reduce_f64(
101
88
  @builtin(local_invocation_id) lid: vec3u,
102
89
  ) {
103
90
  let i = lid.x;
104
- let a = Packed(partialsMain[i], partialsAux[i]);
105
- let b = Packed(partialsMain[i + WGS], partialsAux[i + WGS]);
106
- tile[i] = addPair(a, b);
91
+ let a = DD(partialsHi[i], partialsLo[i]);
92
+ let b = DD(partialsHi[i + WGS], partialsLo[i + WGS]);
93
+ tile[i] = ddAddProtected(a, b, i);
107
94
  workgroupBarrier();
108
95
 
96
+ // ddAddProtected must be called unconditionally by every thread.
109
97
  for (var s = WGS / 2u; s > 0u; s >>= 1u) {
110
- if (i < s) { tile[i] = addPair(tile[i], tile[i + s]); }
98
+ let partner = select(i, i + s, i < s);
99
+ let combined = ddAddProtected(tile[i], tile[partner], i);
100
+ workgroupBarrier();
101
+ if (i < s) { tile[i] = combined; }
111
102
  workgroupBarrier();
112
103
  }
113
104
 
114
105
  if (i == 0u) {
115
- resultMain[0] = tile[0].main;
116
- resultAux[0] = tile[0].aux;
106
+ resultHi[0] = tile[0].hi;
107
+ resultLo[0] = tile[0].lo;
117
108
  }
118
109
  }
119
- `});var Cr,Dr=I(()=>{Cr=`// sscal: x = alpha * x
110
+ `});var Ur,Tr=W(()=>{Ur=`// sscal: x = alpha * x
120
111
 
121
112
  @group(0) @binding(0) var<storage, read_write> x: array<f32>;
122
113
 
@@ -139,7 +130,7 @@ fn main(
139
130
  x[id * params.x_inc] = params.alpha * x[id * params.x_inc];
140
131
  }
141
132
  }
142
- `});var zr,Or=I(()=>{zr=`// sswap: x <-> y
133
+ `});var Vr,Hr=W(()=>{Vr=`// sswap: x <-> y
143
134
 
144
135
  @group(0) @binding(0) var<storage, read_write> x: array<f32>;
145
136
  @group(0) @binding(1) var<storage, read_write> y: array<f32>;
@@ -165,7 +156,7 @@ fn main(
165
156
  y[id * params.y_inc] = temp;
166
157
  }
167
158
  }
168
- `});var qr,Qr=I(()=>{qr=`// saxpy: y = alpha * x + y
159
+ `});var Cr,Rr=W(()=>{Cr=`// saxpy: y = alpha * x + y
169
160
 
170
161
  @group(0) @binding(0) var<storage, read> x: array<f32>;
171
162
  @group(0) @binding(1) var<storage, read_write> y: array<f32>;
@@ -190,7 +181,7 @@ fn main(
190
181
  y[id * params.y_inc] = params.alpha * x[id * params.x_inc] + y[id * params.y_inc];
191
182
  }
192
183
  }
193
- `});var Kr,Zr=I(()=>{Kr=`// scopy: y = x
184
+ `});var zr,Or=W(()=>{zr=`// scopy: y = x
194
185
 
195
186
  @group(0) @binding(0) var<storage, read> x: array<f32>;
196
187
  @group(0) @binding(1) var<storage, read_write> y: array<f32>;
@@ -214,7 +205,7 @@ fn main(
214
205
  y[id * params.y_inc] = x[id * params.x_inc];
215
206
  }
216
207
  }
217
- `});var $r,Xr=I(()=>{$r=`// sdot: result = sum(x[i] * y[i])
208
+ `});var qr,Qr=W(()=>{qr=`// sdot: result = sum(x[i] * y[i])
218
209
  // pass 1 dispatches exactly 2 * WGS workgroups; pass 2 uses reduction/sum.wgsl.
219
210
 
220
211
  @group(0) @binding(0) var<storage, read> x: array<f32>;
@@ -267,7 +258,7 @@ fn main(
267
258
 
268
259
  if (lid.x == 0u) { partials[wgid.x] = tile[0]; }
269
260
  }
270
- `});var Jr,Yr=I(()=>{Jr=`// sasum: result = sum(|x[i]|)
261
+ `});var Kr,Zr=W(()=>{Kr=`// sasum: result = sum(|x[i]|)
271
262
  // pass 1 dispatches exactly 2 * WGS workgroups; pass 2 uses reduction/abssum.wgsl.
272
263
 
273
264
  @group(0) @binding(0) var<storage, read> x: array<f32>;
@@ -318,7 +309,7 @@ fn main(
318
309
 
319
310
  if (lid.x == 0u) { partials[wgid.x] = tile[0]; }
320
311
  }
321
- `});var ee,re=I(()=>{ee=`// snrm2: result = sqrt(sum(x[i] * x[i]))
312
+ `});var $r,Xr=W(()=>{$r=`// snrm2: result = sqrt(sum(x[i] * x[i]))
322
313
  // pass 1 dispatches exactly 2 * WGS workgroups; pass 2 uses reduction/sqsum.wgsl.
323
314
 
324
315
  @group(0) @binding(0) var<storage, read> x: array<f32>;
@@ -374,7 +365,7 @@ fn main(
374
365
 
375
366
  if (lid.x == 0u) { partials[wgid.x] = tile[0]; }
376
367
  }
377
- `});var ae,te=I(()=>{ae=`// srot: x = c*x + s*y, y = -s*x + c*y
368
+ `});var Jr,Yr=W(()=>{Jr=`// srot: x = c*x + s*y, y = -s*x + c*y
378
369
 
379
370
  @group(0) @binding(0) var<storage, read_write> x: array<f32>;
380
371
  @group(0) @binding(1) var<storage, read_write> y: array<f32>;
@@ -403,7 +394,7 @@ fn main(
403
394
  y[id * params.y_inc] = -params.s * xi + params.c * yi;
404
395
  }
405
396
  }
406
- `});var ie,oe=I(()=>{ie=`// srotm: applies modified Givens rotation H to vectors x and y.
397
+ `});var ee,re=W(()=>{ee=`// srotm: applies modified Givens rotation H to vectors x and y.
407
398
  // param[0] = flag: -1 (full H), 0 (unit diagonal), 1 (unit off-diagonal)
408
399
  // param = [ flag, h11, h21, h12, h22 ]
409
400
  // flag == -2 (identity/no-op) is handled in JS before dispatch reaches here.
@@ -453,7 +444,7 @@ fn main(
453
444
  y[id * params.y_inc] = h21 * xi + h22 * yi;
454
445
  }
455
446
  }
456
- `});var se,ne=I(()=>{se=`// isamax: returns index of element with largest absolute value
447
+ `});var ae,te=W(()=>{ae=`// isamax: returns index of element with largest absolute value
457
448
  // pass 1 dispatches exactly 2 * WGS workgroups; pass 2 uses reduction/argmax.wgsl.
458
449
 
459
450
  @group(0) @binding(0) var<storage, read> x: array<f32>;
@@ -535,7 +526,7 @@ fn main(
535
526
  partials_idx[wgid.x] = tile_idx[0];
536
527
  }
537
528
  }
538
- `});var le,ue=I(()=>{le=`// sgemv_n: y = alpha * A * x + beta * y (A is m\xD7n row-major, no-transpose)
529
+ `});var ie,oe=W(()=>{ie=`// sgemv_n: y = alpha * A * x + beta * y (A is m\xD7n row-major, no-transpose)
539
530
  //
540
531
  // One workgroup per output row, with a grid-stride outer loop so the shader
541
532
  // still covers all rows when m exceeds maxComputeWorkgroupsPerDimension.
@@ -610,7 +601,7 @@ fn main(
610
601
  workgroupBarrier();
611
602
  }
612
603
  }
613
- `});var ce,fe=I(()=>{ce=`// sgemv_t: y = alpha * A^T * x + beta * y (A is m\xD7n row-major, transposed)
604
+ `});var se,ne=W(()=>{se=`// sgemv_t: y = alpha * A^T * x + beta * y (A is m\xD7n row-major, transposed)
614
605
  // each thread owns one column of A \u2192 one element of y (length n)
615
606
  // tiles over x (length m) using shared memory; four independent accumulators
616
607
  // let the GPU pipeline A reads across j within each tile (ILP=4)
@@ -675,7 +666,7 @@ fn main(
675
666
  y[yi] = params.alpha * (acc0 + acc1 + acc2 + acc3) + params.beta * y[yi];
676
667
  }
677
668
  }
678
- `});var de,me=I(()=>{de=`// ssymv: y = alpha * A * x + beta * y
669
+ `});var le,ue=W(()=>{le=`// ssymv: y = alpha * A * x + beta * y
679
670
  // A is n\xD7n symmetric, lower (uplo=0) or upper (uplo=1) triangle stored.
680
671
  // The logical matrix is fully dense (symmetric), so each row's dot product
681
672
  // sums over all n columns; entries on the unstored side of the diagonal are
@@ -744,7 +735,7 @@ fn main(
744
735
  }
745
736
  }
746
737
  }
747
- `});var ge,pe=I(()=>{ge=`// strmv: y = op(A) * x
738
+ `});var ce,fe=W(()=>{ce=`// strmv: y = op(A) * x
748
739
  // A is n\xD7n triangular, lower (uplo=0) or upper (uplo=1) triangle stored.
749
740
  // op(A) is A (trans=0) or A^T (trans=1).
750
741
  // diag=1 (unit) treats the diagonal as 1 without reading A's diagonal values.
@@ -847,7 +838,7 @@ fn main(
847
838
  }
848
839
  }
849
840
  }
850
- `});var be,we=I(()=>{be=`// sger: A := alpha * x * y^T + A (rank-1 update, A is m\xD7n general/dense)
841
+ `});var de,me=W(()=>{de=`// sger: A := alpha * x * y^T + A (rank-1 update, A is m\xD7n general/dense)
851
842
 
852
843
  @group(0) @binding(0) var<storage, read> x: array<f32>;
853
844
  @group(0) @binding(1) var<storage, read> y: array<f32>;
@@ -895,7 +886,7 @@ fn main(
895
886
  }
896
887
  }
897
888
  }
898
- `});var xe,he=I(()=>{xe=`// ssyr: A := alpha * x * x^T + A (symmetric rank-1 update)
889
+ `});var ge,pe=W(()=>{ge=`// ssyr: A := alpha * x * x^T + A (symmetric rank-1 update)
899
890
  // A is n\xD7n symmetric; only the triangle specified by uplo is referenced/updated,
900
891
  // the other triangle is implied by symmetry (not touched).
901
892
 
@@ -955,7 +946,7 @@ fn main(
955
946
  }
956
947
  }
957
948
  }
958
- `});var ye,ve=I(()=>{ye=`// ssyr2: A := alpha * x * y^T + alpha * y * x^T + A (symmetric rank-2 update)
949
+ `});var be,we=W(()=>{be=`// ssyr2: A := alpha * x * y^T + alpha * y * x^T + A (symmetric rank-2 update)
959
950
  // A is n\xD7n symmetric; only the triangle specified by uplo is referenced/updated,
960
951
  // the other triangle is implied by symmetry (not touched).
961
952
 
@@ -1018,7 +1009,7 @@ fn main(
1018
1009
  }
1019
1010
  }
1020
1011
  }
1021
- `});var Ee,_e=I(()=>{Ee=`// f64add: adds two doubles, each packed as a [main, aux] pair (main: f32
1012
+ `});var xe,he=W(()=>{xe=`// f64add: adds two doubles, each packed as a [main, aux] pair (main: f32
1022
1013
  // value, aux: raw u32 bits \u2014 see src/util/f64pack.mjs; decode()/encode()
1023
1014
  // below are the WGSL mirror of that file's packedToFields()/fieldsToPacked()),
1024
1015
  // producing the sum as another [main, aux] pair.
@@ -1299,63 +1290,124 @@ fn computeSum(a: Fields, b: Fields) -> Packed {
1299
1290
  let f = addFields(a, b);
1300
1291
  return encode(f.sign, f.rawExp, f.mantissaHi, f.lo);
1301
1292
  }
1302
- `});var Ae,Ge=I(()=>{Ae=`// dasum: result = sum(|x[i]|)
1303
- // pass 1 dispatches exactly 2 * WGS workgroups; pass 2 uses reduction/sumF64.wgsl.
1304
- // Same structure as sasum.wgsl \u2014 every value is now a [main, aux] pair
1305
- // (see src/util/f64pack.mjs) and every \`+\`/\`+=\` is computeSum via addPair
1306
- // instead of plain f32 addition. Concatenated after f64add.wgsl by
1307
- // getPipeline (WGSL has no #include), reusing its decode/encode/computeSum/
1308
- // addFields and Packed struct \u2014 f64add.wgsl declares no bindings and no entry
1309
- // point of its own (just helper functions), so bindings here start at 0 and
1310
- // the entry point is simply \`dasum_main\`.
1293
+ `});var ye,ve=W(()=>{ye=`// Double-double arithmetic via Dekker's algorithm \u2014 an alternative to
1294
+ // f64add.wgsl's bit-exact IEEE-754 emulation. Doesn't touch that path.
1311
1295
  //
1312
- // xAux/partialsAux are array<u32>, not array<f32> \u2014 aux's bits must never
1313
- // pass through an f32-typed storage slot (NaN-bit-pattern corruption risk,
1314
- // see f64pack.mjs and the Packed struct comment above decode()/encode() in
1315
- // f64add.wgsl); Packed (from f64add.wgsl) keeps aux as u32 in registers/
1316
- // workgroup memory too.
1296
+ // A double-double number is a pair (hi, lo) of f32 with hi+lo approximating
1297
+ // a higher-precision value, hi holding the leading bits and lo the rounding
1298
+ // error hi lost. ~48 bits of mantissa vs f32's 24, less than real f64's 52.
1317
1299
  //
1318
- // Per-thread accumulation (acc0..acc3) stays in DECODED Fields form for the
1319
- // entire strided loop below, via addFields \u2014 not re-encoded to Packed and
1320
- // re-decoded on every single element like a naive version would. Only the
1321
- // freshly-loaded x[idx] needs decoding each iteration (unavoidable, it's new
1322
- // data every time); the running total never leaves Fields form until the
1323
- // four accumulators are combined and encoded exactly once, right before
1324
- // writing into workgroup-shared \`tile\`. The cross-thread reduction tree
1325
- // after that still goes through Packed per level (unavoidable \u2014 each level
1326
- // combines values that live in different threads' registers via shared
1327
- // memory), but that's a fixed 6 levels regardless of n, unlike the strided
1328
- // loop above whose iteration count scales with n.
1329
-
1330
- @group(0) @binding(0) var<storage, read> xMain: array<f32>;
1331
- @group(0) @binding(1) var<storage, read> xAux: array<u32>;
1332
- @group(0) @binding(2) var<storage, read_write> partialsMain: array<f32>;
1333
- @group(0) @binding(3) var<storage, read_write> partialsAux: array<u32>;
1334
- @group(0) @binding(4) var<uniform> params: Params;
1300
+ // No bindings, no entry point \u2014 a helper library, concatenated with a
1301
+ // consumer's own bindings/entry point by getPipeline (WGSL has no #include).
1335
1302
 
1336
- struct Params {
1337
- n: u32,
1338
- x_inc: u32,
1303
+ struct DD {
1304
+ hi: f32,
1305
+ lo: f32,
1339
1306
  }
1340
1307
 
1341
- const WGS: u32 = 64;
1308
+ // |a| for a double-double pair. Negation is exact (no rounding), so this is
1309
+ // just a sign flip on both components \u2014 hi alone determines the pair's sign.
1310
+ fn ddAbs(a: DD) -> DD {
1311
+ if (a.hi < 0.0) {
1312
+ return DD(-a.hi, -a.lo);
1313
+ }
1314
+ return a;
1315
+ }
1316
+
1317
+ // \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
1318
+ //
1319
+ // twoSum/fastTwoSum's error term \`e\` should be nonzero (that's the point \u2014
1320
+ // \`s\` is rounded). A front-end-optimizer bug zeros it anyway, on both NVIDIA
1321
+ // and Mesa (ANV + llvmpipe), via two different mechanisms needing two fixes:
1322
+ // bitcast-based subtraction (\`fsub\`/\`negf\`, fixes NVIDIA) and materializing
1323
+ // the sum through workgroup memory + workgroupBarrier() (fixes Mesa). Only
1324
+ // both together (ddAddProtected) is verified correct everywhere \u2014 the plain
1325
+ // twoSum/fastTwoSum/ddAdd below are reference-only, not safe to use.
1326
+ fn negf(x: f32) -> f32 {
1327
+ return bitcast<f32>(bitcast<u32>(x) ^ 0x80000000u);
1328
+ }
1329
+ fn fsub(a: f32, b: f32) -> f32 {
1330
+ return a + negf(b);
1331
+ }
1332
+
1333
+ // Knuth/M\xF8ller's TwoSum: s = fl(a+b), e = exact rounding error, a+b == s+e.
1334
+ // Works for any a, b. UNPROTECTED \u2014 see header above.
1335
+ fn twoSum(a: f32, b: f32) -> DD {
1336
+ let s = a + b;
1337
+ let v = s - a;
1338
+ let e = (a - (s - v)) + (b - v);
1339
+ return DD(s, e);
1340
+ }
1341
+
1342
+ // Dekker's Fast-Two-Sum: same contract, but only correct when |a| >= |b|.
1343
+ // UNPROTECTED \u2014 see header above.
1344
+ fn fastTwoSum(a: f32, b: f32) -> DD {
1345
+ let s = a + b;
1346
+ let e = b - (s - a);
1347
+ return DD(s, e);
1348
+ }
1342
1349
 
1343
- var<workgroup> tile: array<Packed, 64>;
1350
+ // Double-double addition (Dekker's Add2). UNPROTECTED \u2014 see header above.
1351
+ fn ddAdd(a: DD, b: DD) -> DD {
1352
+ let s = twoSum(a.hi, b.hi);
1353
+ let loSum = a.lo + b.lo;
1354
+ return fastTwoSum(s.hi, s.lo + loSum);
1355
+ }
1356
+
1357
+ // \u2500\u2500 Protected variants \u2014 use these \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
1358
+ //
1359
+ // Bitcast subtraction + workgroup-barrier materialization, verified correct
1360
+ // on all three backends tested. Costs a real barrier: fine for O(1)-per-
1361
+ // thread or O(log n) reduction use, not a long per-element loop. A
1362
+ // workgroupBarrier() requires uniform control flow, so:
1363
+ // - \`threadSlot\` must be unique per concurrent caller (e.g. local_invocation_index).
1364
+ // - Every thread in the workgroup must call this the same number of times
1365
+ // \u2014 including ones whose result gets discarded. Compute unconditionally;
1366
+ // only the write-back should be conditional.
1367
+ var<workgroup> dekkerScratch: array<f32, 64>;
1368
+
1369
+ fn twoSumProtected(a: f32, b: f32, threadSlot: u32) -> DD {
1370
+ dekkerScratch[threadSlot] = a + b;
1371
+ workgroupBarrier();
1372
+ let s = dekkerScratch[threadSlot];
1373
+ let v = fsub(s, a);
1374
+ let e = fsub(a, fsub(s, v)) + fsub(b, v);
1375
+ return DD(s, e);
1376
+ }
1344
1377
 
1345
- // a + b, where a/b are [main, aux] pairs \u2014 computeSum takes decoded Fields.
1346
- // Only used for the cross-thread reduction tree below; the per-thread
1347
- // strided loop uses addFields directly instead (see module comment).
1348
- fn addPair(a: Packed, b: Packed) -> Packed {
1349
- return computeSum(decode(bitcast<u32>(a.main), a.aux), decode(bitcast<u32>(b.main), b.aux));
1378
+ fn fastTwoSumProtected(a: f32, b: f32, threadSlot: u32) -> DD {
1379
+ dekkerScratch[threadSlot] = a + b;
1380
+ workgroupBarrier();
1381
+ let s = dekkerScratch[threadSlot];
1382
+ let e = fsub(b, fsub(s, a));
1383
+ return DD(s, e);
1384
+ }
1385
+
1386
+ // Protected double-double addition \u2014 same contract as ddAdd, but exact.
1387
+ fn ddAddProtected(a: DD, b: DD, threadSlot: u32) -> DD {
1388
+ let s = twoSumProtected(a.hi, b.hi, threadSlot);
1389
+ let loSum = a.lo + b.lo;
1390
+ return fastTwoSumProtected(s.hi, s.lo + loSum, threadSlot);
1350
1391
  }
1392
+ `});var Ee,_e=W(()=>{Ee=`// dasum: sum(|x[i]|), double-double (Dekker). Same ILP=4 shape as sasum.wgsl;
1393
+ // see f64/dekker.wgsl for ddAddProtected and why plain ddAdd isn't safe.
1394
+ // GpuVector input isn't pre-abs'd, so ddAbs() applies unconditionally below.
1351
1395
 
1352
- // |x| for a packed double is abs(main) with aux untouched \u2014 only main's
1353
- // sign bit carries the double's sign (see fieldsToPacked() in f64pack.mjs).
1354
- // Returns decoded Fields directly (not Packed) for the per-thread loop.
1355
- fn absFields(idx: u32) -> Fields {
1356
- return decode(bitcast<u32>(abs(xMain[idx])), xAux[idx]);
1396
+ @group(0) @binding(0) var<storage, read> xHi: array<f32>;
1397
+ @group(0) @binding(1) var<storage, read> xLo: array<f32>;
1398
+ @group(0) @binding(2) var<storage, read_write> partialsHi: array<f32>;
1399
+ @group(0) @binding(3) var<storage, read_write> partialsLo: array<f32>;
1400
+ @group(0) @binding(4) var<uniform> params: Params;
1401
+
1402
+ struct Params {
1403
+ n: u32,
1404
+ x_inc: u32,
1357
1405
  }
1358
1406
 
1407
+ const WGS: u32 = 64;
1408
+
1409
+ var<workgroup> tile: array<DD, 64>;
1410
+
1359
1411
  @compute @workgroup_size(64)
1360
1412
  fn dasum_main(
1361
1413
  @builtin(global_invocation_id) gid: vec3u,
@@ -1363,41 +1415,65 @@ fn dasum_main(
1363
1415
  @builtin(workgroup_id) wgid: vec3u,
1364
1416
  @builtin(num_workgroups) num_wg: vec3u,
1365
1417
  ) {
1366
- var acc0: Fields = Fields(0u, 0u, 0u, 0u);
1367
- var acc1: Fields = Fields(0u, 0u, 0u, 0u);
1368
- var acc2: Fields = Fields(0u, 0u, 0u, 0u);
1369
- var acc3: Fields = Fields(0u, 0u, 0u, 0u);
1418
+ var acc0 = DD(0.0, 0.0);
1419
+ var acc1 = DD(0.0, 0.0);
1420
+ var acc2 = DD(0.0, 0.0);
1421
+ var acc3 = DD(0.0, 0.0);
1370
1422
 
1371
1423
  let stride = num_wg.x * WGS;
1372
1424
  let n4_floor = (params.n / (4u * stride)) * (4u * stride);
1373
1425
 
1374
- for (var id = gid.x; id < n4_floor; id += 4u * stride) {
1375
- acc0 = addFields(acc0, absFields( id * params.x_inc));
1376
- acc1 = addFields(acc1, absFields((id + stride) * params.x_inc));
1377
- acc2 = addFields(acc2, absFields((id + 2u * stride) * params.x_inc));
1378
- acc3 = addFields(acc3, absFields((id + 3u * stride) * params.x_inc));
1379
- }
1380
- for (var id = n4_floor + gid.x; id < params.n; id += stride) {
1381
- acc0 = addFields(acc0, absFields(id * params.x_inc));
1382
- }
1383
-
1384
- // Combine the 4 per-thread accumulators in Fields form too \u2014 still no
1385
- // encode/decode needed, since none of them have touched Packed yet.
1386
- let combined = addFields(addFields(acc0, acc1), addFields(acc2, acc3));
1387
- tile[lid.x] = encode(combined.sign, combined.rawExp, combined.mantissaHi, combined.lo);
1426
+ // Same trip count for every thread, but driven by a counter, not \`id\`
1427
+ // itself (ddAddProtected's barrier needs a provably-uniform loop bound).
1428
+ let mainIters = n4_floor / (4u * stride);
1429
+ for (var iter = 0u; iter < mainIters; iter++) {
1430
+ let id = gid.x + iter * 4u * stride;
1431
+ let i0 = id * params.x_inc;
1432
+ let i1 = (id + stride) * params.x_inc;
1433
+ let i2 = (id + 2u * stride) * params.x_inc;
1434
+ let i3 = (id + 3u * stride) * params.x_inc;
1435
+ acc0 = ddAddProtected(acc0, ddAbs(DD(xHi[i0], xLo[i0])), lid.x);
1436
+ acc1 = ddAddProtected(acc1, ddAbs(DD(xHi[i1], xLo[i1])), lid.x);
1437
+ acc2 = ddAddProtected(acc2, ddAbs(DD(xHi[i2], xLo[i2])), lid.x);
1438
+ acc3 = ddAddProtected(acc3, ddAbs(DD(xHi[i3], xLo[i3])), lid.x);
1439
+ }
1440
+
1441
+ // Tail is ragged (0-3 extra per thread) \u2014 pad to this workgroup's worst case.
1442
+ let wgBaseGid = wgid.x * WGS;
1443
+ var tailIters = 0u;
1444
+ if (n4_floor + wgBaseGid < params.n) {
1445
+ tailIters = (params.n - 1u - n4_floor - wgBaseGid) / stride + 1u;
1446
+ }
1447
+ for (var iter = 0u; iter < tailIters; iter++) {
1448
+ let id = n4_floor + gid.x + iter * stride;
1449
+ let valid = id < params.n;
1450
+ let i = select(0u, id * params.x_inc, valid);
1451
+ let loaded = ddAbs(DD(xHi[i], xLo[i])); // select() has no DD overload
1452
+ let contribution = DD(select(0.0, loaded.hi, valid), select(0.0, loaded.lo, valid));
1453
+ acc0 = ddAddProtected(acc0, contribution, lid.x);
1454
+ }
1455
+
1456
+ let combined01 = ddAddProtected(acc0, acc1, lid.x);
1457
+ let combined23 = ddAddProtected(acc2, acc3, lid.x);
1458
+ tile[lid.x] = ddAddProtected(combined01, combined23, lid.x);
1388
1459
  workgroupBarrier();
1389
1460
 
1461
+ // Inactive threads combine against a throwaway partner and discard it
1462
+ // (ddAddProtected must be called unconditionally by every thread).
1390
1463
  for (var s = WGS / 2u; s > 0u; s >>= 1u) {
1391
- if (lid.x < s) { tile[lid.x] = addPair(tile[lid.x], tile[lid.x + s]); }
1464
+ let partner = select(lid.x, lid.x + s, lid.x < s);
1465
+ let combined = ddAddProtected(tile[lid.x], tile[partner], lid.x);
1466
+ workgroupBarrier(); // all threads must read tile[] above before any write below
1467
+ if (lid.x < s) { tile[lid.x] = combined; }
1392
1468
  workgroupBarrier();
1393
1469
  }
1394
1470
 
1395
1471
  if (lid.x == 0u) {
1396
- partialsMain[wgid.x] = tile[0].main;
1397
- partialsAux[wgid.x] = tile[0].aux;
1472
+ partialsHi[wgid.x] = tile[0].hi;
1473
+ partialsLo[wgid.x] = tile[0].lo;
1398
1474
  }
1399
1475
  }
1400
- `});var ke,Be=I(()=>{ke=`// strsv_invert_block: computes ONE column (workgroup_id.x) of ONE block's
1476
+ `});var Ae,Ge=W(()=>{Ae=`// strsv_invert_block: computes ONE column (workgroup_id.x) of ONE block's
1401
1477
  // (workgroup_id.y) explicit inverse, via the same one-row-at-a-time
1402
1478
  // substitution as strsv_block.wgsl, but solving against a unit basis vector
1403
1479
  // e_col instead of the real right-hand side, and writing to a dense
@@ -1506,7 +1582,7 @@ fn strsv_invert_block_main(
1506
1582
  workgroupBarrier();
1507
1583
  }
1508
1584
  }
1509
- `});var Se,Pe=I(()=>{Se=`// strsv_apply_inverse: given a precomputed block inverse (from
1585
+ `});var ke,Be=W(()=>{ke=`// strsv_apply_inverse: given a precomputed block inverse (from
1510
1586
  // strsv_invert_block.wgsl), computes this block's solution as a dense
1511
1587
  // matrix-vector multiply against the block's current remainder in x \u2014
1512
1588
  // replacing what the old strsv_block.wgsl did via a genuinely sequential,
@@ -1553,7 +1629,7 @@ fn strsv_apply_inverse_main(@builtin(local_invocation_id) lid: vec3u) {
1553
1629
  }
1554
1630
  x[(params.blockStart + lid.x) * params.incx] = acc;
1555
1631
  }
1556
- `});var je,Fe=I(()=>{je=`// strsv_update: subtracts a solved block's contribution from every
1632
+ `});var Pe,Se=W(()=>{Pe=`// strsv_update: subtracts a solved block's contribution from every
1557
1633
  // remaining row in parallel (one workgroup per row, like strmv.wgsl) \u2014
1558
1634
  // this is what turns strsv's O(n) sequential stages into O(n/blockSize).
1559
1635
  // No diag/masking needed: this region never touches the diagonal.
@@ -1628,7 +1704,7 @@ fn strsv_update_main(
1628
1704
  workgroupBarrier();
1629
1705
  }
1630
1706
  }
1631
- `});var Le={};yr(Le,{shaderSources:()=>Xt});var Xt,Ne=I(()=>{Mr();Tr();Rr();Dr();Or();Qr();Zr();Xr();Yr();re();te();oe();ne();ue();fe();me();pe();we();he();ve();_e();Ge();Be();Pe();Fe();Xt={"reduction/argmax":Ur,"reduction/sum":Vr,"reduction/sumF64":Hr,sscal:Cr,sswap:zr,saxpy:qr,scopy:Kr,sdot:$r,sasum:Jr,snrm2:ee,srot:ae,srotm:ie,isamax:se,sgemv_n:le,sgemv_t:ce,ssymv:de,strmv:ge,sger:be,ssyr:xe,ssyr2:ye,f64add:Ee,dasum:Ae,strsv_invert_block:ke,strsv_apply_inverse:Se,strsv_update:je}});var ea={};yr(ea,{GpuMatrix:()=>H,GpuVector:()=>x,cleanup:()=>Pr,dasum:()=>Ce,gpuName:()=>Sr,init:()=>kr,isamax:()=>Qe,randomFloat32Array:()=>Nr,randomFloat64Array:()=>Wr,randomTriangularFloat32Array:()=>Ir,sasum:()=>De,saxpy:()=>Ue,scopy:()=>Te,sdot:()=>Re,sgemv:()=>Ke,sger:()=>et,snrm2:()=>ze,srot:()=>qe,srotm:()=>Ze,sscal:()=>Ie,sswap:()=>Me,ssymv:()=>Xe,ssyr:()=>tt,ssyr2:()=>at,strmv:()=>$e,strsv:()=>rt});function Er(a,r){return r?a.features.has("timestamp-query")?{requiredFeatures:["timestamp-query"]}:(console.warn("timestamp-query not supported on this device \u2014 benchmark mode disabled."),{}):{}}function Gr(){if(!Ar())return{querySet:null,passDescriptor:void 0};let r=V().createQuerySet({type:"timestamp",count:2});return{querySet:r,passDescriptor:{timestampWrites:{querySet:r,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1}}}}function cr(a,r){if(!r)return null;let e=V(),o=e.createBuffer({label:"timestamp-resolve",size:16,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC});a.resolveQuerySet(r,0,2,o,0);let t=e.createBuffer({label:"timestamp-readback",size:16,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});return a.copyBufferToBuffer(o,0,t,0,16),{tsReadBuffer:t,resolveBuffer:o,querySet:r}}async function P(a){if(!a)return;let{tsReadBuffer:r,resolveBuffer:e,querySet:o}=a;await r.mapAsync(GPUMapMode.READ);let t=new BigInt64Array(r.getMappedRange().slice());return r.unmap(),r.destroy(),e.destroy(),o.destroy(),Math.max(0,Number(t[1]-t[0]))/1e6}var Z=null,J=null,Br=null,dr=!1;async function kr({powerPreference:a="high-performance",benchmark:r=!1}={}){if(Z)return Z;let e;if(typeof window>"u"){let{create:i,globals:s}=await import("webgpu");Object.assign(globalThis,s),e=i([]),Br=e}else e=navigator.gpu;if(!e)throw new Error("WebGPU not supported in this environment.");if(J=await e.requestAdapter({powerPreference:a})??await e.requestAdapter(),!J)throw new Error("No WebGPU adapter found.");dr=r;let t=[...Er(J,r).requiredFeatures??[]];return Z=await J.requestDevice({requiredFeatures:t}),Z.addEventListener("uncapturederror",i=>{console.error("Uncaptured GPU error:",i.error.message)}),Z}function Pr(){Z&&(Z.destroy(),Z=null),J=null,Br=null,dr=!1}function Sr(){if(!J)throw new Error("WebGPU adapter not initialized \u2014 call init() first.");let{device:a,description:r}=J.info;return{description:r||"unknown",device:a||"unknown"}}function Ar(){return dr}function V(){if(!Z)throw new Error("WebGPU device not initialized \u2014 call init() first.");return Z}function d(...a){a.flat().forEach(r=>r.destroy())}function b(a,r="blas-input",e=!1){let o=V(),t=o.limits.maxStorageBufferBindingSize,i=a.byteLength;if(i>t)throw new Error(`Buffer size ${i} bytes exceeds device limit of ${t} bytes.`);let s=e?GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC:GPUBufferUsage.STORAGE,u=o.createBuffer({label:r,size:i,usage:s,mappedAtCreation:!0}),n=a.constructor;return new n(u.getMappedRange()).set(a),u.unmap(),u}function D(a,r="blas-storage"){return V().createBuffer({label:r,size:a,usage:GPUBufferUsage.STORAGE})}function q(a,r="blas-result"){return V().createBuffer({label:r,size:a,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC})}function E(a,r){let o=V().createBuffer({label:"blas-readback",size:r.size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});return a.copyBufferToBuffer(r,0,o,0,r.size),o}function N(a,r="blas-params"){let e=V(),o=a.length*4,t=Math.ceil(o/16)*16,i=new ArrayBuffer(t),s=new DataView(i);a.forEach(({value:n,type:l},f)=>{let c=f*4;if(l==="u32")s.setUint32(c,n,!0);else if(l==="i32")s.setInt32(c,n,!0);else if(l==="f32")s.setFloat32(c,n,!0);else throw new Error(`Unknown param type "${l}". Use "f32", "u32", or "i32".`)});let u=e.createBuffer({label:r,size:t,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return e.queue.writeBuffer(u,0,i),u}async function _(a,r=Float32Array){try{await a.mapAsync(GPUMapMode.READ);let e=new r(a.getMappedRange().slice());return a.unmap(),e}finally{a.destroy()}}var ht=new ArrayBuffer(8),er=new DataView(ht),Fr=new ArrayBuffer(4),jr=new Uint32Array(Fr),Lr=new Float32Array(Fr);function xt(a){return jr[0]=a>>>0,Lr[0]}function vt(a){return Lr[0]=a,jr[0]}function yt(a,r,e,o){let t=r>>>3,i=r&7,s=o>>>29,u=e<<3|s,n=o&536870911,l=a<<31|t<<23|u,f=i>>>2&1,c=i&3,p=n>>>23,m=n&8388607,g=c<<6|p,w=(f<<31|g<<23|m)>>>0;return[xt(l),w]}function _t(a,r){let e=vt(a);r=r>>>0;let o=e>>>31,t=e>>>23&255,i=e&8388607,s=r>>>31,u=r>>>23&255,n=r&8388607,l=s<<2|u>>>6,f=(u&63)<<23|n,c=t<<3|l,p=i>>>3,g=((i&7)<<29|f)>>>0;return{sign:o,rawExp:c,mantissaHi:p,lo:g}}var Et=2040;function mr(a){er.setFloat64(0,a,!1);let r=er.getUint32(0,!1),e=er.getUint32(4,!1),o=r>>>31,t=r>>>20&2047,i=r&1048575;if(t>=Et)throw new RangeError(`packF64: |${a}| is too large to pack safely (must be finite with magnitude below ~1.4e306); main's bit pattern would itself be NaN/Infinity-shaped and get silently corrupted by any real float32 round-trip`);return yt(o,t,i,e)}function tr(a,r){let{sign:e,rawExp:o,mantissaHi:t,lo:i}=_t(a,r),s=(e<<31|o<<20|t)>>>0;return er.setUint32(0,s,!1),er.setUint32(4,i,!1),er.getFloat64(0,!1)}var x=class a{constructor(r,e,o=Float32Array,t=null){this._buf=r,this._auxBuf=t,this.length=e,this.dtype=o}static from(r){if(r instanceof Float64Array){let o=new Float32Array(r.length),t=new Uint32Array(r.length);for(let u=0;u<r.length;u++){let n=mr(r[u]);o[u]=n[0],t[u]=n[1]}let i=b(o,"gpu-vector-f64-main",!0),s=b(t,"gpu-vector-f64-aux",!0);return new a(i,r.length,Float64Array,s)}if(!(r instanceof Float32Array))throw new Error("GpuVector.from expects a Float32Array or Float64Array.");let e=b(r,"gpu-vector",!0);return new a(e,r.length,r.constructor)}async read(){let r=V(),e=r.createCommandEncoder(),o=E(e,this._buf);if(r.queue.submit([e.finish()]),!this._auxBuf)return _(o,this.dtype);let t=r.createCommandEncoder(),i=E(t,this._auxBuf);r.queue.submit([t.finish()]);let[s,u]=await Promise.all([_(o,Float32Array),_(i,Uint32Array)]),n=new Float64Array(this.length);for(let l=0;l<this.length;l++)n[l]=tr(s[l],u[l]);return n}destroy(){this._buf.destroy(),this._auxBuf&&this._auxBuf.destroy()}};var H=class a{constructor(r,e,o,t,i=null,s="row-major"){this._buf=r,this._auxBuf=i,this.rows=e,this.cols=o,this.lda=t,this.layout=s}static from(r,e,o,t,i="row-major"){if(i!=="row-major"&&i!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");let s=i==="row-major";if(t===void 0&&(t=s?o:e),!(r instanceof Float32Array)&&!(r instanceof Float64Array))throw new Error("GpuMatrix.from expects a Float32Array or Float64Array.");if(!Number.isInteger(e)||e<=0)throw new Error("rows must be a positive integer.");if(!Number.isInteger(o)||o<=0)throw new Error("cols must be a positive integer.");let u=s?o:e;if(!Number.isInteger(t)||t<u)throw new Error(`lda must be an integer >= ${s?"cols":"rows"}.`);let n=s?e:o;if(r.length<n*t)throw new Error("data does not have enough elements for the given rows, cols, and lda.");if(r instanceof Float64Array){let f=n*t,c=new Float32Array(f),p=new Uint32Array(f);for(let w=0;w<f;w++){let y=mr(r[w]);c[w]=y[0],p[w]=y[1]}let m=b(c,"gpu-matrix-f64-main",!0),g=b(p,"gpu-matrix-f64-aux",!0);return new a(m,e,o,t,g,i)}let l=b(r.subarray(0,n*t),"gpu-matrix",!0);return new a(l,e,o,t,null,i)}async read(){let r=V(),e=r.createCommandEncoder(),o=E(e,this._buf);r.queue.submit([e.finish()]);let t=this.layout!=="column-major",i=t?this.rows:this.cols,s=t?this.cols:this.rows;if(this._auxBuf){let l=r.createCommandEncoder(),f=E(l,this._auxBuf);r.queue.submit([l.finish()]);let[c,p]=await Promise.all([_(o,Float32Array),_(f,Uint32Array)]),m=new Float64Array(i*this.lda);for(let w=0;w<m.length;w++)m[w]=tr(c[w],p[w]);if(this.lda===s)return m;let g=new Float64Array(i*s);for(let w=0;w<i;w++)g.set(m.subarray(w*this.lda,w*this.lda+s),w*s);return g}let u=await _(o,Float32Array);if(this.lda===s)return u;let n=new Float32Array(i*s);for(let l=0;l<i;l++)n.set(u.subarray(l*this.lda,l*this.lda+s),l*s);return n}destroy(){this._buf.destroy(),this._auxBuf&&this._auxBuf.destroy()}};function Nr(a,r=-1,e=1){let o=new Float32Array(a);for(let t=0;t<a;t++)o[t]=r+Math.random()*(e-r);return o}function Wr(a,r=-1,e=1){let o=new Float64Array(a);for(let t=0;t<a;t++)o[t]=r+Math.random()*(e-r);return o}function Ir(a,r,e="lower",o=-1,t=1,i=5,s=15){if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(r<a)throw new Error("lda must be >= n.");let u=new Float32Array(a*r);for(let n=0;n<a;n++){for(let l=0;l<a;l++){if(n===l)continue;(e==="lower"?l<n:l>n)&&(u[n*r+l]=o+Math.random()*(t-o))}u[n*r+n]=i+Math.random()*(s-i)}return u}function A(a,r,e=0){let o=V(),t=r.map((i,s)=>({binding:e+s,resource:i instanceof GPUBuffer?{buffer:i}:i}));return o.createBindGroup({layout:a,entries:t})}var Gt=new WeakMap;function S(a){V().queue.submit([a.finish()])}function pr(){let a=V(),{querySet:r,passDescriptor:e}=Gr();return{commandEncoder:a.createCommandEncoder(),querySet:r,passDescriptor:e}}function ir(a,r,e,o,t){let i=a.beginComputePass(t);i.setPipeline(r),i.setBindGroup(0,e),typeof o=="number"?i.dispatchWorkgroups(o):i.dispatchWorkgroups(o.x,o.y),i.end(),Gt.set(a,i)}function L(a,r,e){let{commandEncoder:o,querySet:t,passDescriptor:i}=pr();ir(o,a,r,e,i);let s=cr(o,t);return{commandEncoder:o,ts:s}}var Jt={},gr=new WeakMap;async function B(a,r,e="main"){gr.has(a)||gr.set(a,new Map);let o=gr.get(a),t=Array.isArray(r)?r:[r],i=`${t.join("+")}::${e}`;return o.has(i)||o.set(i,await Yt(t,e)),o.get(i)}async function $t(a){if(typeof process>"u"||!process.versions?.node){let{shaderSources:r}=await Promise.resolve().then(()=>(Ne(),Le)),e=r[a];if(!e)throw new Error(`Shader "${a}" not found in browser bundle.`);return e}else{let{readFileSync:r}=await import("fs"),{fileURLToPath:e}=await import("url"),{dirname:o,join:t}=await import("path"),i=o(e(Jt.url));return r(t(i,`../shaders/${a}.wgsl`),"utf8")}}async function Yt(a,r="main"){let e=V(),o=a.join("+"),t=(await Promise.all(a.map($t))).join(`
1632
- `),i=e.createShaderModule({label:o,code:t}),u=(await i.getCompilationInfo()).messages.filter(f=>f.type==="error");if(u.length>0)throw new Error(`Shader "${o}" compilation failed:
1707
+ `});var Le={};vr(Le,{shaderSources:()=>Ct});var Ct,je=W(()=>{Fr();Nr();Dr();Tr();Hr();Rr();Or();Qr();Zr();Xr();Yr();re();te();oe();ne();ue();fe();me();pe();we();he();ve();_e();Ge();Be();Se();Ct={"reduction/argmax":Ir,"reduction/sum":Wr,"reduction/sumF64":Mr,sscal:Ur,sswap:Vr,saxpy:Cr,scopy:zr,sdot:qr,sasum:Kr,snrm2:$r,srot:Jr,srotm:ee,isamax:ae,sgemv_n:ie,sgemv_t:se,ssymv:le,strmv:ce,sger:de,ssyr:ge,ssyr2:be,f64add:xe,"f64/dekker":ye,dasum:Ee,strsv_invert_block:Ae,strsv_apply_inverse:ke,strsv_update:Pe}});var Zt={};vr(Zt,{GpuMatrix:()=>V,GpuVector:()=>x,cleanup:()=>kr,dasum:()=>Ve,gpuName:()=>Sr,init:()=>Br,isamax:()=>Oe,randomFloat32Array:()=>Pr,randomFloat64Array:()=>Lr,randomTriangularFloat32Array:()=>jr,sasum:()=>He,saxpy:()=>We,scopy:()=>De,sdot:()=>Te,sgemv:()=>qe,sger:()=>Je,snrm2:()=>Ce,srot:()=>ze,srotm:()=>Qe,sscal:()=>Ie,sswap:()=>Ne,ssymv:()=>Ze,ssyr:()=>rt,ssyr2:()=>et,strmv:()=>Ke,strsv:()=>Ye});function _r(a,e){return e?a.features.has("timestamp-query")?{requiredFeatures:["timestamp-query"]}:(console.warn("timestamp-query not supported on this device \u2014 benchmark mode disabled."),{}):{}}function Er(){if(!Gr())return{querySet:null,passDescriptor:void 0};let e=U().createQuerySet({type:"timestamp",count:2});return{querySet:e,passDescriptor:{timestampWrites:{querySet:e,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1}}}}function cr(a,e){if(!e)return null;let r=U(),o=r.createBuffer({label:"timestamp-resolve",size:16,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC});a.resolveQuerySet(e,0,2,o,0);let t=r.createBuffer({label:"timestamp-readback",size:16,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});return a.copyBufferToBuffer(o,0,t,0,16),{tsReadBuffer:t,resolveBuffer:o,querySet:e}}async function P(a){if(!a)return;let{tsReadBuffer:e,resolveBuffer:r,querySet:o}=a;await e.mapAsync(GPUMapMode.READ);let t=new BigInt64Array(e.getMappedRange().slice());return e.unmap(),e.destroy(),r.destroy(),o.destroy(),Math.max(0,Number(t[1]-t[0]))/1e6}var K=null,J=null,Ar=null,mr=!1;async function Br({powerPreference:a="high-performance",benchmark:e=!1}={}){if(K)return K;let r;if(typeof window>"u"){let{create:i,globals:n}=await import("webgpu");Object.assign(globalThis,n),r=i([]),Ar=r}else r=navigator.gpu;if(!r)throw new Error("WebGPU not supported in this environment.");if(J=await r.requestAdapter({powerPreference:a})??await r.requestAdapter(),!J)throw new Error("No WebGPU adapter found.");mr=e;let t=[..._r(J,e).requiredFeatures??[]];return K=await J.requestDevice({requiredFeatures:t}),K.addEventListener("uncapturederror",i=>{console.error("Uncaptured GPU error:",i.error.message)}),K}function kr(){K&&(K.destroy(),K=null),J=null,Ar=null,mr=!1}function Sr(){if(!J)throw new Error("WebGPU adapter not initialized \u2014 call init() first.");let{device:a,description:e}=J.info;return{description:e||"unknown",device:a||"unknown"}}function Gr(){return mr}function U(){if(!K)throw new Error("WebGPU device not initialized \u2014 call init() first.");return K}function m(...a){a.flat().forEach(e=>e.destroy())}function b(a,e="blas-input",r=!1){let o=U(),t=o.limits.maxStorageBufferBindingSize,i=a.byteLength;if(i>t)throw new Error(`Buffer size ${i} bytes exceeds device limit of ${t} bytes.`);let n=r?GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC:GPUBufferUsage.STORAGE,u=o.createBuffer({label:e,size:i,usage:n,mappedAtCreation:!0}),s=a.constructor;return new s(u.getMappedRange()).set(a),u.unmap(),u}function C(a,e="blas-storage"){return U().createBuffer({label:e,size:a,usage:GPUBufferUsage.STORAGE})}function q(a,e="blas-result"){return U().createBuffer({label:e,size:a,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC})}function _(a,e){let o=U().createBuffer({label:"blas-readback",size:e.size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});return a.copyBufferToBuffer(e,0,o,0,e.size),o}function I(a,e="blas-params"){let r=U(),o=a.length*4,t=Math.ceil(o/16)*16,i=new ArrayBuffer(t),n=new DataView(i);a.forEach(({value:s,type:l},f)=>{let c=f*4;if(l==="u32")n.setUint32(c,s,!0);else if(l==="i32")n.setInt32(c,s,!0);else if(l==="f32")n.setFloat32(c,s,!0);else throw new Error(`Unknown param type "${l}". 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 y(a,e=Float32Array){try{await a.mapAsync(GPUMapMode.READ);let r=new e(a.getMappedRange().slice());return a.unmap(),r}finally{a.destroy()}}function er(a){let e=a.length,r=new Float32Array(e),o=new Float32Array(e);for(let t=0;t<e;t++){let i=Math.fround(a[t]);r[t]=i,o[t]=Math.fround(a[t]-i)}return{hi:r,lo:o}}function tr(a,e){let r=a.length,o=new Float64Array(r);for(let t=0;t<r;t++)o[t]=a[t]+e[t];return o}var x=class a{constructor(e,r,o=Float32Array,t=null){this._buf=e,this._loBuf=t,this.length=r,this.dtype=o}static from(e){if(e instanceof Float64Array){let{hi:o,lo:t}=er(e),i=b(o,"gpu-vector-f64-hi",!0),n=b(t,"gpu-vector-f64-lo",!0);return new a(i,e.length,Float64Array,n)}if(!(e instanceof Float32Array))throw new Error("GpuVector.from expects a Float32Array or Float64Array.");let r=b(e,"gpu-vector",!0);return new a(r,e.length,e.constructor)}async read(){let e=U(),r=e.createCommandEncoder(),o=_(r,this._buf);if(e.queue.submit([r.finish()]),!this._loBuf)return y(o,this.dtype);let t=e.createCommandEncoder(),i=_(t,this._loBuf);e.queue.submit([t.finish()]);let[n,u]=await Promise.all([y(o,Float32Array),y(i,Float32Array)]);return tr(n,u)}destroy(){this._buf.destroy(),this._loBuf&&this._loBuf.destroy()}};var V=class a{constructor(e,r,o,t,i=null,n="row-major"){this._buf=e,this._loBuf=i,this.rows=r,this.cols=o,this.lda=t,this.layout=n}static from(e,r,o,t,i="row-major"){if(i!=="row-major"&&i!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");let n=i==="row-major";if(t===void 0&&(t=n?o:r),!(e instanceof Float32Array)&&!(e instanceof Float64Array))throw new Error("GpuMatrix.from expects a Float32Array or Float64Array.");if(!Number.isInteger(r)||r<=0)throw new Error("rows must be a positive integer.");if(!Number.isInteger(o)||o<=0)throw new Error("cols must be a positive integer.");let u=n?o:r;if(!Number.isInteger(t)||t<u)throw new Error(`lda must be an integer >= ${n?"cols":"rows"}.`);let s=n?r:o;if(e.length<s*t)throw new Error("data does not have enough elements for the given rows, cols, and lda.");if(e instanceof Float64Array){let f=s*t,{hi:c,lo:p}=er(e.subarray(0,f)),d=b(c,"gpu-matrix-f64-hi",!0),g=b(p,"gpu-matrix-f64-lo",!0);return new a(d,r,o,t,g,i)}let l=b(e.subarray(0,s*t),"gpu-matrix",!0);return new a(l,r,o,t,null,i)}async read(){let e=U(),r=e.createCommandEncoder(),o=_(r,this._buf);e.queue.submit([r.finish()]);let t=this.layout!=="column-major",i=t?this.rows:this.cols,n=t?this.cols:this.rows;if(this._loBuf){let l=e.createCommandEncoder(),f=_(l,this._loBuf);e.queue.submit([l.finish()]);let[c,p]=await Promise.all([y(o,Float32Array),y(f,Float32Array)]),d=tr(c,p);if(this.lda===n)return d;let g=new Float64Array(i*n);for(let w=0;w<i;w++)g.set(d.subarray(w*this.lda,w*this.lda+n),w*n);return g}let u=await y(o,Float32Array);if(this.lda===n)return u;let s=new Float32Array(i*n);for(let l=0;l<i;l++)s.set(u.subarray(l*this.lda,l*this.lda+n),l*n);return s}destroy(){this._buf.destroy(),this._loBuf&&this._loBuf.destroy()}};function Pr(a,e=-1,r=1){let o=new Float32Array(a);for(let t=0;t<a;t++)o[t]=e+Math.random()*(r-e);return o}function Lr(a,e=-1,r=1){let o=new Float64Array(a);for(let t=0;t<a;t++)o[t]=e+Math.random()*(r-e);return o}function jr(a,e,r="lower",o=-1,t=1,i=5,n=15){if(r!=="lower"&&r!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e<a)throw new Error("lda must be >= n.");let u=new Float32Array(a*e);for(let s=0;s<a;s++){for(let l=0;l<a;l++){if(s===l)continue;(r==="lower"?l<s:l>s)&&(u[s*e+l]=o+Math.random()*(t-o))}u[s*e+s]=i+Math.random()*(n-i)}return u}function A(a,e,r=0){let o=U(),t=e.map((i,n)=>({binding:r+n,resource:i instanceof GPUBuffer?{buffer:i}:i}));return o.createBindGroup({layout:a,entries:t})}var wt=new WeakMap;function L(a){U().queue.submit([a.finish()])}function dr(){let a=U(),{querySet:e,passDescriptor:r}=Er();return{commandEncoder:a.createCommandEncoder(),querySet:e,passDescriptor:r}}function ir(a,e,r,o,t){let i=a.beginComputePass(t);i.setPipeline(e),i.setBindGroup(0,r),typeof o=="number"?i.dispatchWorkgroups(o):i.dispatchWorkgroups(o.x,o.y),i.end(),wt.set(a,i)}function F(a,e,r){let{commandEncoder:o,querySet:t,passDescriptor:i}=dr();ir(o,a,e,r,i);let n=cr(o,t);return{commandEncoder:o,ts:n}}var Qt={},pr=new WeakMap;async function B(a,e,r="main"){pr.has(a)||pr.set(a,new Map);let o=pr.get(a),t=Array.isArray(e)?e:[e],i=`${t.join("+")}::${r}`;return o.has(i)||o.set(i,await zt(t,r)),o.get(i)}async function Ot(a){if(typeof process>"u"||!process.versions?.node){let{shaderSources:e}=await Promise.resolve().then(()=>(je(),Le)),r=e[a];if(!r)throw new Error(`Shader "${a}" not found in browser bundle.`);return r}else{let{readFileSync:e}=await import("fs"),{fileURLToPath:r}=await import("url"),{dirname:o,join:t}=await import("path"),i=o(r(Qt.url));return e(t(i,`../shaders/${a}.wgsl`),"utf8")}}async function zt(a,e="main"){let r=U(),o=a.join("+"),t=(await Promise.all(a.map(Ot))).join(`
1708
+ `),i=r.createShaderModule({label:o,code:t}),u=(await i.getCompilationInfo()).messages.filter(f=>f.type==="error");if(u.length>0)throw new Error(`Shader "${o}" compilation failed:
1633
1709
  ${u.map(f=>` line ${f.lineNum}: ${f.message}`).join(`
1634
- `)}`);let n=r==="main"?{module:i}:{module:i,entryPoint:r},l=e.createComputePipeline({label:o,layout:"auto",compute:n});return l._shaderModule=i,l}var ra=64,We=8;function C(a,r){let e=V().limits.maxComputeWorkgroupsPerDimension;return r===void 0?Math.min(Math.ceil(a/ra),e):{x:Math.min(Math.ceil(r/We),e),y:Math.min(Math.ceil(a/We),e)}}async function Ie(a,r,e,o,t){let i=o instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(r)||!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(!(o instanceof Float32Array)&&!(o instanceof x))throw new Error("x must be a Float32Array or GpuVector.");if(r<=0)return i?{}:o;if(o.length<(r-1)*t+1)throw new Error("x does not have enough elements for the given n and incx.");let s=await B(a,"sscal"),u=null,n=null,l=null;try{u=i?o._buf:b(o,"sscal-x",!0),n=N([{value:r,type:"u32"},{value:e,type:"f32"},{value:t,type:"u32"}],"sscal-params");let f=A(s.getBindGroupLayout(0),[u,n]),{commandEncoder:c,ts:p}=L(s,f,C(r));l=i?null:E(c,u),S(c);let m=await P(p);if(i)return m!==void 0?{gpuTimeMs:m}:{};let g=await _(l,Float32Array);return l=null,m!==void 0?{x:g,gpuTimeMs:m}:g}finally{!i&&u&&d(u),n&&d(n),l&&d(l)}}async function Me(a,r,e,o,t,i){let s=e instanceof x,u=t instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(r)||!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 x))throw new Error("x must be a Float32Array or GpuVector.");if(!(t instanceof Float32Array)&&!(t instanceof x))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(r<=0)return s?{}:{x:e,y:t};if(e.length<(r-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(r-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await B(a,"sswap"),l=null,f=null,c=null,p=null,m=null;try{l=s?e._buf:b(e,"sswap-x",!0),f=u?t._buf:b(t,"sswap-y",!0),c=N([{value:r,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"sswap-params");let g=A(n.getBindGroupLayout(0),[l,f,c]),{commandEncoder:w,ts:y}=L(n,g,C(r));p=s?null:E(w,l),m=u?null:E(w,f),S(w);let h=await P(y);if(s&&u)return h!==void 0?{gpuTimeMs:h}:{};let G=await _(p,Float32Array);p=null;let v=await _(m,Float32Array);return m=null,h!==void 0?{x:G,y:v,gpuTimeMs:h}:{x:G,y:v}}finally{!s&&l&&d(l),!u&&f&&d(f),c&&d(c),p&&d(p),m&&d(m)}}async function Ue(a,r,e,o,t,i,s){let u=o instanceof x,n=i instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(r)||!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&&!(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(r<=0)return n?{}:{y:i};if(o.length<(r-1)*t+1)throw new Error("x does not have enough elements for the given n and incx.");if(i.length<(r-1)*s+1)throw new Error("y does not have enough elements for the given n and incy.");let l=await B(a,"saxpy"),f=null,c=null,p=null,m=null;try{f=u?o._buf:b(o,"saxpy-x",!1),c=n?i._buf:b(i,"saxpy-y",!0),p=N([{value:r,type:"u32"},{value:e,type:"f32"},{value:t,type:"u32"},{value:s,type:"u32"}],"saxpy-params");let g=A(l.getBindGroupLayout(0),[f,c,p]),{commandEncoder:w,ts:y}=L(l,g,C(r));m=n?null:E(w,c),S(w);let h=await P(y);if(n&&u)return h!==void 0?{gpuTimeMs:h}:{};let G=await _(m,Float32Array);return m=null,h!==void 0?{y:G,gpuTimeMs:h}:{y:G}}finally{!u&&f&&d(f),!n&&c&&d(c),p&&d(p),m&&d(m)}}async function Te(a,r,e,o,t,i){let s=e instanceof x,u=t instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(r)||!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&&!(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(r<=0)return u?{}:{y:t};if(e.length<(r-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(r-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await B(a,"scopy"),l=null,f=null,c=null,p=null;try{l=s?e._buf:b(e,"scopy-x",!1),f=u?t._buf:b(t,"scopy-y",!0),c=N([{value:r,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"scopy-params");let m=A(n.getBindGroupLayout(0),[l,f,c]),{commandEncoder:g,ts:w}=L(n,m,C(r));p=u?null:E(g,f),S(g);let y=await P(w);if(u&&s)return y!==void 0?{gpuTimeMs:y}:{};let h=await _(p,Float32Array);return p=null,y!==void 0?{y:h,gpuTimeMs:y}:{y:h}}finally{!s&&l&&d(l),!u&&f&&d(f),c&&d(c),p&&d(p)}}var Ve=64;async function Re(a,r,e,o,t,i){let s=e instanceof x,u=t instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(r)||!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&&!(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(r<=0)return{dot:0};if(e.length<(r-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(r-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await B(a,"sdot"),l=await B(a,"reduction/sum"),f=null,c=null,p=null,m=null,g=null,w=null;try{f=s?e._buf:b(e,"sdot-x",!1),c=u?t._buf:b(t,"sdot-y",!1),p=D(2*Ve*4,"sdot-partials"),m=q(4,"sdot-result"),g=N([{value:r,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"sdot-params");let y=A(n.getBindGroupLayout(0),[f,c,p,g]),{commandEncoder:h,ts:G}=L(n,y,2*Ve);S(h);let v=A(l.getBindGroupLayout(0),[p,m]),{commandEncoder:F,ts:k}=L(l,v,1);w=E(F,m),S(F);let j=_(w,Float32Array);w=null;let[W,M,U]=await Promise.all([P(G),P(k),j]);return W!==void 0&&M!==void 0?{dot:U[0],gpuTimeMs:W+M}:{dot:U[0]}}finally{!s&&f&&d(f),!u&&c&&d(c),p&&d(p),m&&d(m),g&&d(g),w&&d(w)}}var He=64;async function De(a,r,e,o){let t=e instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(r)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!t&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(r<=0)return{asum:0};if(e.length<(r-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await B(a,"sasum"),s=await B(a,"reduction/sum"),u=null,n=null,l=null,f=null,c=null;try{u=t?e._buf:b(e,"sasum-x",!1),n=D(2*He*4,"sasum-partials"),l=q(4,"sasum-result"),f=N([{value:r,type:"u32"},{value:o,type:"u32"}],"sasum-params");let p=A(i.getBindGroupLayout(0),[u,n,f]),{commandEncoder:m,ts:g}=L(i,p,2*He);S(m);let w=A(s.getBindGroupLayout(0),[n,l]),{commandEncoder:y,ts:h}=L(s,w,1);c=E(y,l),S(y);let G=_(c,Float32Array);c=null;let[v,F,k]=await Promise.all([P(g),P(h),G]);return v!==void 0&&F!==void 0?{asum:k[0],gpuTimeMs:v+F}:{asum:k[0]}}finally{!t&&u&&d(u),n&&d(n),l&&d(l),f&&d(f),c&&d(c)}}var wr=64;async function Ce(a,r,e,o){let t=e instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(r)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=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(r<=0)return{asum:0};if(e.length<(r-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await B(a,["f64add","dasum"]),s=await B(a,["f64add","reduction/sumF64"]),u=null,n=null,l=null,f=null,c=null,p=null,m=null,g=null;try{u=t?e:x.from(e),n=D(2*wr*4,"dasum-partialsMain"),l=D(2*wr*4,"dasum-partialsAux"),f=q(4,"dasum-result-main"),c=q(4,"dasum-result-aux"),p=N([{value:r,type:"u32"},{value:o,type:"u32"}],"dasum-params");let w=A(i.getBindGroupLayout(0),[u._buf,u._auxBuf,n,l,p]),{commandEncoder:y,ts:h}=L(i,w,2*wr);S(y);let G=A(s.getBindGroupLayout(0),[n,l,f,c]),{commandEncoder:v,ts:F}=L(s,G,1);m=E(v,f),g=E(v,c),S(v);let k=_(m,Float32Array),j=_(g,Uint32Array);m=null,g=null;let[W,M,U,T]=await Promise.all([P(h),P(F),k,j]),R=tr(U[0],T[0]);return W!==void 0&&M!==void 0?{asum:R,gpuTimeMs:W+M}:{asum:R}}finally{!t&&u&&u.destroy(),n&&d(n),l&&d(l),f&&d(f),c&&d(c),p&&d(p),m&&d(m),g&&d(g)}}var Oe=64;async function ze(a,r,e,o){let t=e instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(r)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!t&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(r<=0)return{nrm2:0};if(e.length<(r-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await B(a,"snrm2"),s=await B(a,"reduction/sum"),u=null,n=null,l=null,f=null,c=null;try{u=t?e._buf:b(e,"snrm2-x",!1),n=D(2*Oe*4,"snrm2-partials"),l=q(4,"snrm2-result"),f=N([{value:r,type:"u32"},{value:o,type:"u32"}],"snrm2-params");let p=A(i.getBindGroupLayout(0),[u,n,f]),{commandEncoder:m,ts:g}=L(i,p,2*Oe);S(m);let w=A(s.getBindGroupLayout(0),[n,l]),{commandEncoder:y,ts:h}=L(s,w,1);c=E(y,l),S(y);let G=_(c,Float32Array);c=null;let[v,F,k]=await Promise.all([P(g),P(h),G]),j=Math.sqrt(k[0]);return v!==void 0&&F!==void 0?{nrm2:j,gpuTimeMs:v+F}:{nrm2:j}}finally{!t&&u&&d(u),n&&d(n),l&&d(l),f&&d(f),c&&d(c)}}var br=64;async function Qe(a,r,e,o){let t=e instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(r)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!t&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(r<=0)return{index:0};if(e.length<(r-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await B(a,"isamax"),s=await B(a,"reduction/argmax"),u=null,n=null,l=null,f=null,c=null,p=null;try{u=t?e._buf:b(e,"isamax-x",!1),n=D(2*br*4,"isamax-partials-val"),l=D(2*br*4,"isamax-partials-idx"),f=q(4,"isamax-result"),c=N([{value:r,type:"u32"},{value:o,type:"u32"}],"isamax-params");let m=A(i.getBindGroupLayout(0),[u,n,l,c]),{commandEncoder:g,ts:w}=L(i,m,2*br);S(g);let y=A(s.getBindGroupLayout(0),[n,l,f]),{commandEncoder:h,ts:G}=L(s,y,1);p=E(h,f),S(h);let v=_(p,Uint32Array);p=null;let[F,k,j]=await Promise.all([P(w),P(G),v]),W=j[0];return F!==void 0&&k!==void 0?{index:W,gpuTimeMs:F+k}:{index:W}}finally{!t&&u&&d(u),n&&d(n),l&&d(l),f&&d(f),c&&d(c),p&&d(p)}}async function qe(a,r,e,o,t,i,s,u){let n=e instanceof x,l=t instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(r)||!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(!l&&!(t instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(n!==l)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(r<=0)return n?{}:{x:e,y:t};if(e.length<(r-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(r-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let f=await B(a,"srot"),c=null,p=null,m=null,g=null,w=null;try{c=n?e._buf:b(e,"srot-x",!0),p=l?t._buf:b(t,"srot-y",!0),m=N([{value:r,type:"u32"},{value:s,type:"f32"},{value:u,type:"f32"},{value:o,type:"u32"},{value:i,type:"u32"}],"srot-params");let y=A(f.getBindGroupLayout(0),[c,p,m]),{commandEncoder:h,ts:G}=L(f,y,C(r));g=n?null:E(h,c),w=l?null:E(h,p),S(h);let v=await P(G);if(n&&l)return v!==void 0?{gpuTimeMs:v}:{};let F=_(g,Float32Array),k=_(w,Float32Array);g=null,w=null;let[j,W]=await Promise.all([F,k]);return v!==void 0?{x:j,y:W,gpuTimeMs:v}:{x:j,y:W}}finally{!n&&c&&d(c),!l&&p&&d(p),m&&d(m),g&&d(g),w&&d(w)}}async function Ze(a,r,e,o,t,i,s){let u=e instanceof x,n=t instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(r)||!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(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&&!(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(r<=0||s[0]===-2)return u?{}:{x:e,y:t};if(e.length<(r-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(r-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let l=await B(a,"srotm"),f=null,c=null,p=null,m=null,g=null,w=null;try{f=u?e._buf:b(e,"srotm-x",!0),c=n?t._buf:b(t,"srotm-y",!0),p=b(s,"srotm-param",!1),m=N([{value:r,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"srotm-params");let y=A(l.getBindGroupLayout(0),[f,c,p,m]),{commandEncoder:h,ts:G}=L(l,y,C(r));g=u?null:E(h,f),w=n?null:E(h,c),S(h);let v=await P(G);if(u&&n)return v!==void 0?{gpuTimeMs:v}:{};let F=_(g,Float32Array),k=_(w,Float32Array);g=null,w=null;let[j,W]=await Promise.all([F,k]);return v!==void 0?{x:j,y:W,gpuTimeMs:v}:{x:j,y:W}}finally{!u&&f&&d(f),!n&&c&&d(c),p&&d(p),m&&d(m),g&&d(g),w&&d(w)}}async function Ke(a,r,e,o,t,i,s,u,n,l,f,c,p="row-major"){let m=i instanceof H,g=u instanceof x,w=f instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(r!=="no-transpose"&&r!=="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 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 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(e)||!Number.isInteger(o)||!Number.isInteger(n)||!Number.isInteger(c)||!Number.isInteger(s))throw new Error("m, n, incx, incy, and lda must be integers.");if(n<=0||c<=0)throw new Error("incx and incy must be positive.");if(!m&&!(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&&!(f 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&&!m)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(g&&u._buf===f._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(m&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(m&&(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:f};(m?i.layout:p)==="column-major"&&([e,o]=[o,e],r=r==="no-transpose"?"transpose":"no-transpose");let h=r==="no-transpose",G=h?o:e,v=h?e:o;if(s<o)throw new Error("lda must be >= n.");if(!m&&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<(G-1)*n+1)throw new Error("x does not have enough elements for the given dimensions and incx.");if(f.length<(v-1)*c+1)throw new Error("y does not have enough elements for the given dimensions and incy.");let k=await B(a,h?"sgemv_n":"sgemv_t"),j=m?i._buf:b(i,"sgemv-A",!1),W=g?u._buf:b(u,"sgemv-x",!1),M=w?f._buf:b(f,"sgemv-y",!0),U=N([{value:e,type:"u32"},{value:o,type:"u32"},{value:t,type:"f32"},{value:l,type:"f32"},{value:n,type:"u32"},{value:c,type:"u32"},{value:s,type:"u32"}],"sgemv-params");try{let T=A(k.getBindGroupLayout(0),[j,W,M,U]),R=h?Math.min(e,a.limits.maxComputeWorkgroupsPerDimension):C(v),{commandEncoder:z,ts:Y}=L(k,T,R),Q=w?null:E(z,M);S(z);let O=await P(Y);if(w)return O!==void 0?{gpuTimeMs:O}:{};let nr=await _(Q,Float32Array);return O!==void 0?{y:nr,gpuTimeMs:O}:{y:nr}}finally{m||d(j),g||d(W),w||d(M),d(U)}}async function Xe(a,r,e,o,t,i,s,u,n,l,f,c="row-major"){let p=s instanceof x,m=l instanceof x,g=t instanceof H;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(r!=="lower"&&r!=="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(!Number.isInteger(e)||!Number.isInteger(u)||!Number.isInteger(f)||!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||f<=0)throw new Error("incx and incy must be positive.");if(i<e)throw new Error("lda must be >= n.");if(!g&&!(t 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(!m&&!(l instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(p!==m)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(p&&s._buf===l._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(g&&i!==t.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(g&&(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 m?{}:{y:l};if(!g&&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(l.length<(e-1)*f+1)throw new Error("y does not have enough elements for the given n and incy.");let y=(g?t.layout:c)==="column-major"?r==="upper":r==="lower",h=await B(a,"ssymv"),G=null,v=null,F=null,k=null;try{G=g?t._buf:b(t,"ssymv-A",!1),v=p?s._buf:b(s,"ssymv-x",!1),F=m?l._buf:b(l,"ssymv-y",!0),k=N([{value:e,type:"u32"},{value:o,type:"f32"},{value:n,type:"f32"},{value:u,type:"u32"},{value:f,type:"u32"},{value:i,type:"u32"},{value:y?0:1,type:"u32"}],"ssymv-params");let j=A(h.getBindGroupLayout(0),[G,v,F,k]),W=Math.min(e,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:M,ts:U}=L(h,j,W),T=m?null:E(M,F);S(M);let R=await P(U);if(m)return R!==void 0?{gpuTimeMs:R}:{};let z=await _(T,Float32Array);return R!==void 0?{y:z,gpuTimeMs:R}:{y:z}}finally{!g&&G&&d(G),!p&&v&&d(v),!m&&F&&d(F),k&&d(k)}}async function $e(a,r,e,o,t,i,s,u,n,l,f,c="row-major"){let p=u instanceof x,m=l instanceof x,g=i instanceof H,w=o==="unit";if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(r!=="lower"&&r!=="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(c!=="row-major"&&c!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(t)||!Number.isInteger(n)||!Number.isInteger(f)||!Number.isInteger(s))throw new Error("n, incx, incy, and lda must be integers.");if(n<=0||f<=0)throw new Error("incx and incy must be positive.");if(s<t)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(!m&&!(l instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(p!==m)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(p&&u._buf===l._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&&m&&i._buf===l._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<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 m?{}:{y:l};if(!g&&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(l.length<(t-1)*f+1)throw new Error("y does not have enough elements for the given n and incy.");let h=(g?i.layout:c)==="column-major",G=h?r==="upper":r==="lower",v=h?e==="transpose":e==="no-transpose",F=await B(a,"strmv"),k=null,j=null,W=null,M=null;try{k=g?i._buf:b(i,"strmv-A",!1),j=p?u._buf:b(u,"strmv-x",!1),W=m?l._buf:b(l,"strmv-y",!0),M=N([{value:t,type:"u32"},{value:n,type:"u32"},{value:f,type:"u32"},{value:s,type:"u32"},{value:v?0:1,type:"u32"},{value:G?0:1,type:"u32"},{value:w?1:0,type:"u32"}],"strmv-params");let U=A(F.getBindGroupLayout(0),[k,j,W,M]),T=Math.min(t,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:R,ts:z}=L(F,U,T),Y=m?null:E(R,W);S(R);let Q=await P(z);if(m)return Q!==void 0?{gpuTimeMs:Q}:{};let O=await _(Y,Float32Array);return Q!==void 0?{y:O,gpuTimeMs:Q}:{y:O}}finally{!g&&k&&d(k),!p&&j&&d(j),!m&&W&&d(W),M&&d(M)}}var K=64;function Ye(a,r,e){let o=new ArrayBuffer(a*r),t=new DataView(o);for(let i=0;i<a;i++){let s=e(i),u=i*r;s.forEach((n,l)=>t.setUint32(u+l*4,n,!0))}return o}function Je(a,r,e){let o=a.createBuffer({label:e,size:r.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return a.queue.writeBuffer(o,0,r),o}async function rt(a,r,e,o,t,i,s,u,n,l="row-major"){let f=u instanceof x,c=i instanceof H,p=o==="unit";if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(r!=="lower"&&r!=="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(l!=="row-major"&&l!=="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(!c&&!(i instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!f&&!(u instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(f&&!c)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(c&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(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 f?{}:{x:u};if(!c&&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 g=(c?i.layout:l)==="column-major",w=g?r==="upper":r==="lower",y=g?e==="transpose":e==="no-transpose",h=await B(a,"strsv_invert_block"),G=await B(a,"strsv_apply_inverse"),v=await B(a,"strsv_update"),F=y===w,k=[];for(let O=0;O<t;O+=K)k.push(O);F||k.reverse();let j=k.length,W=a.limits.maxComputeWorkgroupsPerDimension,M=a.limits.minUniformBufferOffsetAlignment,U=null,T=null,R=null,z=null,Y=null,Q=null;try{U=c?i._buf:b(i,"strsv-A",!1),T=f?u._buf:b(u,"strsv-x",!0),R=D(j*K*K*4,"strsv-Ainv");let O=Ye(j,M,X=>{let $=X*K,or=Math.min($+K,t);return[n,X,$,or]});z=Je(a,O,"strsv-apply-params");let nr=Ye(j,M,X=>{let $=X*K,or=Math.min($+K,t);return[t,n,s,y?0:1,w?0:1,$,or]});Y=Je(a,nr,"strsv-update-params");let{commandEncoder:rr,querySet:ar}=pr();Q=N([{value:t,type:"u32"},{value:s,type:"u32"},{value:y?0:1,type:"u32"},{value:w?0:1,type:"u32"},{value:p?1:0,type:"u32"}],"strsv-invert-params");let ot=A(h.getBindGroupLayout(0),[U,R,Q]);ir(rr,h,ot,{x:K,y:j},ar?{timestampWrites:{querySet:ar,beginningOfPassWriteIndex:0}}:void 0);for(let X=0;X<k.length;X++){let $=k[X],or=Math.min($+K,t),st=$/K,ut=X===k.length-1,xr=st*M,lt=A(G.getBindGroupLayout(0),[R,T,{buffer:z,offset:xr,size:16}]);ir(rr,G,lt,1,ut&&ar?{timestampWrites:{querySet:ar,endOfPassWriteIndex:1}}:void 0);let vr=F?t-or:$;if(vr===0)continue;let ft=A(v.getBindGroupLayout(0),[U,T,{buffer:Y,offset:xr,size:32}]),ct=Math.min(vr,W);ir(rr,v,ft,ct)}let it=cr(rr,ar),nt=f?null:E(rr,T);S(rr);let sr=await P(it);if(f)return sr!==void 0?{gpuTimeMs:sr}:{};let hr=await _(nt,Float32Array);return sr!==void 0?{x:hr,gpuTimeMs:sr}:{x:hr}}finally{!c&&U&&d(U),!f&&T&&d(T),R&&d(R),z&&d(z),Y&&d(Y),Q&&d(Q)}}async function et(a,r,e,o,t,i,s,u,n,l,f="row-major"){let c=n instanceof H;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(f!=="row-major"&&f!=="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(r)||!Number.isInteger(e)||!Number.isInteger(i)||!Number.isInteger(u)||!Number.isInteger(l))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(!c&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(c&&l!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(n.rows<r||n.cols<e))throw new Error("A is too small for the given m and n.");(c?n.layout:f)==="column-major"&&([r,e]=[e,r],[t,s]=[s,t],[i,u]=[u,i]);let m=t instanceof x,g=s instanceof x;if(l<e)throw new Error("lda must be >= n.");if(!m&&!(t 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(m!==g)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&&n._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(c&&g&&n._buf===s._buf)throw new Error("A and y must not reference the same GPU buffer.");if(r<0||e<0)throw new Error("m and n must be non-negative.");if(r===0||e===0)return c?{}:{A:n};if(!c&&n.length<(r-1)*l+e)throw new Error("A does not have enough elements for the given m, n, and lda.");if(t.length<(r-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 B(a,"sger"),y=null,h=null,G=null,v=null;try{y=m?t._buf:b(t,"sger-x",!1),h=g?s._buf:b(s,"sger-y",!1),G=c?n._buf:b(n,"sger-A",!0),v=N([{value:r,type:"u32"},{value:e,type:"u32"},{value:o,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:l,type:"u32"}],"sger-params");let F=A(w.getBindGroupLayout(0),[y,h,G,v]),k=Math.min(r,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:j,ts:W}=L(w,F,k),M=c?null:E(j,G);S(j);let U=await P(W);if(c)return U!==void 0?{gpuTimeMs:U}:{};let T=await _(M,Float32Array);return U!==void 0?{A:T,gpuTimeMs:U}:{A:T}}finally{!m&&y&&d(y),!g&&h&&d(h),!c&&G&&d(G),v&&d(v)}}async function tt(a,r,e,o,t,i,s,u,n="row-major"){let l=t instanceof x,f=s instanceof H;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(r!=="lower"&&r!=="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(!f&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!l&&!(t instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(l&&!f)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(f&&l&&s._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(f&&u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(f&&(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 f?{}:{A:s};if(!f&&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 p=(f?s.layout:n)==="column-major"?r==="upper":r==="lower",m=await B(a,"ssyr"),g=null,w=null,y=null;try{g=l?t._buf:b(t,"ssyr-x",!1),w=f?s._buf:b(s,"ssyr-A",!0),y=N([{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 h=A(m.getBindGroupLayout(0),[g,w,y]),G=Math.min(e,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:v,ts:F}=L(m,h,G),k=f?null:E(v,w);S(v);let j=await P(F);if(f)return j!==void 0?{gpuTimeMs:j}:{};let W=await _(k,Float32Array);return j!==void 0?{A:W,gpuTimeMs:j}:{A:W}}finally{!l&&g&&d(g),!f&&w&&d(w),y&&d(y)}}async function at(a,r,e,o,t,i,s,u,n,l,f="row-major"){let c=t instanceof x,p=s instanceof x,m=n instanceof H;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(r!=="lower"&&r!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(f!=="row-major"&&f!=="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(l))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(l<e)throw new Error("lda must be >= n.");if(!m&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");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&&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(c&&t._buf===s._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(m&&l!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(m&&(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 m?{}:{A:n};if(!m&&n.length<(e-1)*l+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 w=(m?n.layout:f)==="column-major"?r==="upper":r==="lower",y=await B(a,"ssyr2"),h=null,G=null,v=null,F=null;try{h=c?t._buf:b(t,"ssyr2-x",!1),G=p?s._buf:b(s,"ssyr2-y",!1),v=m?n._buf:b(n,"ssyr2-A",!0),F=N([{value:e,type:"u32"},{value:o,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:l,type:"u32"},{value:w?0:1,type:"u32"}],"ssyr2-params");let k=A(y.getBindGroupLayout(0),[h,G,v,F]),j=Math.min(e,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:W,ts:M}=L(y,k,j),U=m?null:E(W,v);S(W);let T=await P(M);if(m)return T!==void 0?{gpuTimeMs:T}:{};let R=await _(U,Float32Array);return T!==void 0?{A:R,gpuTimeMs:T}:{A:R}}finally{!c&&h&&d(h),!p&&G&&d(G),!m&&v&&d(v),F&&d(F)}}return bt(ea);})();
1710
+ `)}`);let s=e==="main"?{module:i}:{module:i,entryPoint:e},l=r.createComputePipeline({label:o,layout:"auto",compute:s});return l._shaderModule=i,l}var qt=64,Fe=8;function O(a,e){let r=U().limits.maxComputeWorkgroupsPerDimension;return e===void 0?Math.min(Math.ceil(a/qt),r):{x:Math.min(Math.ceil(e/Fe),r),y:Math.min(Math.ceil(a/Fe),r)}}async function Ie(a,e,r,o,t){let i=o instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(t))throw new Error("n and incx must be integers.");if(typeof r!="number")throw new Error("alpha must be a number.");if(Number.isNaN(r))throw new Error("alpha must not be NaN.");if(!Number.isFinite(r))throw new Error("alpha must be finite.");if(t<=0)throw new Error("incx must be positive.");if(!(o instanceof Float32Array)&&!(o instanceof x))throw new Error("x must be a Float32Array or GpuVector.");if(e<=0)return i?{}:o;if(o.length<(e-1)*t+1)throw new Error("x does not have enough elements for the given n and incx.");let n=await B(a,"sscal"),u=null,s=null,l=null;try{u=i?o._buf:b(o,"sscal-x",!0),s=I([{value:e,type:"u32"},{value:r,type:"f32"},{value:t,type:"u32"}],"sscal-params");let f=A(n.getBindGroupLayout(0),[u,s]),{commandEncoder:c,ts:p}=F(n,f,O(e));l=i?null:_(c,u),L(c);let d=await P(p);if(i)return d!==void 0?{gpuTimeMs:d}:{};let g=await y(l,Float32Array);return l=null,d!==void 0?{x:g,gpuTimeMs:d}:g}finally{!i&&u&&m(u),s&&m(s),l&&m(l)}}async function Ne(a,e,r,o,t,i){let n=r instanceof x,u=t instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!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(!(r instanceof Float32Array)&&!(r instanceof x))throw new Error("x must be a Float32Array or GpuVector.");if(!(t instanceof Float32Array)&&!(t instanceof x))throw new Error("y must be a Float32Array or GpuVector.");if(r.constructor!==t.constructor)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(e<=0)return n?{}:{x:r,y:t};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(e-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let s=await B(a,"sswap"),l=null,f=null,c=null,p=null,d=null;try{l=n?r._buf:b(r,"sswap-x",!0),f=u?t._buf:b(t,"sswap-y",!0),c=I([{value:e,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"sswap-params");let g=A(s.getBindGroupLayout(0),[l,f,c]),{commandEncoder:w,ts:E}=F(s,g,O(e));p=n?null:_(w,l),d=u?null:_(w,f),L(w);let h=await P(E);if(n&&u)return h!==void 0?{gpuTimeMs:h}:{};let G=await y(p,Float32Array);p=null;let v=await y(d,Float32Array);return d=null,h!==void 0?{x:G,y:v,gpuTimeMs:h}:{x:G,y:v}}finally{!n&&l&&m(l),!u&&f&&m(f),c&&m(c),p&&m(p),d&&m(d)}}async function We(a,e,r,o,t,i,n){let u=o instanceof x,s=i instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(t)||!Number.isInteger(n))throw new Error("n, incx, and incy must be integers.");if(typeof r!="number")throw new Error("alpha must be a number.");if(Number.isNaN(r))throw new Error("alpha must not be NaN.");if(!Number.isFinite(r))throw new Error("alpha must be finite.");if(t<=0||n<=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(!s&&!(i instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(u!==s)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(e<=0)return s?{}:{y:i};if(o.length<(e-1)*t+1)throw new Error("x does not have enough elements for the given n and incx.");if(i.length<(e-1)*n+1)throw new Error("y does not have enough elements for the given n and incy.");let l=await B(a,"saxpy"),f=null,c=null,p=null,d=null;try{f=u?o._buf:b(o,"saxpy-x",!1),c=s?i._buf:b(i,"saxpy-y",!0),p=I([{value:e,type:"u32"},{value:r,type:"f32"},{value:t,type:"u32"},{value:n,type:"u32"}],"saxpy-params");let g=A(l.getBindGroupLayout(0),[f,c,p]),{commandEncoder:w,ts:E}=F(l,g,O(e));d=s?null:_(w,c),L(w);let h=await P(E);if(s&&u)return h!==void 0?{gpuTimeMs:h}:{};let G=await y(d,Float32Array);return d=null,h!==void 0?{y:G,gpuTimeMs:h}:{y:G}}finally{!u&&f&&m(f),!s&&c&&m(c),p&&m(p),d&&m(d)}}async function De(a,e,r,o,t,i){let n=r instanceof x,u=t instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!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(!n&&!(r 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(n!==u)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(e<=0)return u?{}:{y:t};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(e-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let s=await B(a,"scopy"),l=null,f=null,c=null,p=null;try{l=n?r._buf:b(r,"scopy-x",!1),f=u?t._buf:b(t,"scopy-y",!0),c=I([{value:e,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"scopy-params");let d=A(s.getBindGroupLayout(0),[l,f,c]),{commandEncoder:g,ts:w}=F(s,d,O(e));p=u?null:_(g,f),L(g);let E=await P(w);if(u&&n)return E!==void 0?{gpuTimeMs:E}:{};let h=await y(p,Float32Array);return p=null,E!==void 0?{y:h,gpuTimeMs:E}:{y:h}}finally{!n&&l&&m(l),!u&&f&&m(f),c&&m(c),p&&m(p)}}var Me=64;async function Te(a,e,r,o,t,i){let n=r instanceof x,u=t instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!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(!n&&!(r 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(n!==u)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(e<=0)return{dot:0};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(e-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let s=await B(a,"sdot"),l=await B(a,"reduction/sum"),f=null,c=null,p=null,d=null,g=null,w=null;try{f=n?r._buf:b(r,"sdot-x",!1),c=u?t._buf:b(t,"sdot-y",!1),p=C(2*Me*4,"sdot-partials"),d=q(4,"sdot-result"),g=I([{value:e,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"sdot-params");let E=A(s.getBindGroupLayout(0),[f,c,p,g]),{commandEncoder:h,ts:G}=F(s,E,2*Me);L(h);let v=A(l.getBindGroupLayout(0),[p,d]),{commandEncoder:k,ts:S}=F(l,v,1);w=_(k,d),L(k);let j=y(w,Float32Array);w=null;let[N,D,M]=await Promise.all([P(G),P(S),j]);return N!==void 0&&D!==void 0?{dot:M[0],gpuTimeMs:N+D}:{dot:M[0]}}finally{!n&&f&&m(f),!u&&c&&m(c),p&&m(p),d&&m(d),g&&m(g),w&&m(w)}}var Ue=64;async function He(a,e,r,o){let t=r instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!t&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(e<=0)return{asum:0};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await B(a,"sasum"),n=await B(a,"reduction/sum"),u=null,s=null,l=null,f=null,c=null;try{u=t?r._buf:b(r,"sasum-x",!1),s=C(2*Ue*4,"sasum-partials"),l=q(4,"sasum-result"),f=I([{value:e,type:"u32"},{value:o,type:"u32"}],"sasum-params");let p=A(i.getBindGroupLayout(0),[u,s,f]),{commandEncoder:d,ts:g}=F(i,p,2*Ue);L(d);let w=A(n.getBindGroupLayout(0),[s,l]),{commandEncoder:E,ts:h}=F(n,w,1);c=_(E,l),L(E);let G=y(c,Float32Array);c=null;let[v,k,S]=await Promise.all([P(g),P(h),G]);return v!==void 0&&k!==void 0?{asum:S[0],gpuTimeMs:v+k}:{asum:S[0]}}finally{!t&&u&&m(u),s&&m(s),l&&m(l),f&&m(f),c&&m(c)}}var gr=64;async function Ve(a,e,r,o){let t=r instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!t&&!(r instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(t&&r.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(e<=0)return{asum:0};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await B(a,["f64/dekker","dasum"]),n=await B(a,["f64/dekker","reduction/sumF64"]),u=null,s=null,l=null,f=null,c=null,p=null,d=null,g=null,w=null;try{if(t)u=r._buf,s=r._loBuf;else{let{hi:Z,lo:z}=er(r.map(Math.abs));u=b(Z,"dasum-xHi",!1),s=b(z,"dasum-xLo",!1)}l=C(2*gr*4,"dasum-partialsHi"),f=C(2*gr*4,"dasum-partialsLo"),c=q(4,"dasum-result-hi"),p=q(4,"dasum-result-lo"),d=I([{value:e,type:"u32"},{value:o,type:"u32"}],"dasum-params");let E=A(i.getBindGroupLayout(0),[u,s,l,f,d]),{commandEncoder:h,ts:G}=F(i,E,2*gr);L(h);let v=A(n.getBindGroupLayout(0),[l,f,c,p]),{commandEncoder:k,ts:S}=F(n,v,1);g=_(k,c),w=_(k,p),L(k);let j=y(g,Float32Array),N=y(w,Float32Array);g=null,w=null;let[D,M,T,H]=await Promise.all([P(G),P(S),j,N]),R=tr(T,H)[0];return D!==void 0&&M!==void 0?{asum:R,gpuTimeMs:D+M}:{asum:R}}finally{!t&&u&&m(u),!t&&s&&m(s),l&&m(l),f&&m(f),c&&m(c),p&&m(p),d&&m(d),g&&m(g),w&&m(w)}}var Re=64;async function Ce(a,e,r,o){let t=r instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!t&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(e<=0)return{nrm2:0};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await B(a,"snrm2"),n=await B(a,"reduction/sum"),u=null,s=null,l=null,f=null,c=null;try{u=t?r._buf:b(r,"snrm2-x",!1),s=C(2*Re*4,"snrm2-partials"),l=q(4,"snrm2-result"),f=I([{value:e,type:"u32"},{value:o,type:"u32"}],"snrm2-params");let p=A(i.getBindGroupLayout(0),[u,s,f]),{commandEncoder:d,ts:g}=F(i,p,2*Re);L(d);let w=A(n.getBindGroupLayout(0),[s,l]),{commandEncoder:E,ts:h}=F(n,w,1);c=_(E,l),L(E);let G=y(c,Float32Array);c=null;let[v,k,S]=await Promise.all([P(g),P(h),G]),j=Math.sqrt(S[0]);return v!==void 0&&k!==void 0?{nrm2:j,gpuTimeMs:v+k}:{nrm2:j}}finally{!t&&u&&m(u),s&&m(s),l&&m(l),f&&m(f),c&&m(c)}}var wr=64;async function Oe(a,e,r,o){let t=r instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!t&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(e<=0)return{index:0};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await B(a,"isamax"),n=await B(a,"reduction/argmax"),u=null,s=null,l=null,f=null,c=null,p=null;try{u=t?r._buf:b(r,"isamax-x",!1),s=C(2*wr*4,"isamax-partials-val"),l=C(2*wr*4,"isamax-partials-idx"),f=q(4,"isamax-result"),c=I([{value:e,type:"u32"},{value:o,type:"u32"}],"isamax-params");let d=A(i.getBindGroupLayout(0),[u,s,l,c]),{commandEncoder:g,ts:w}=F(i,d,2*wr);L(g);let E=A(n.getBindGroupLayout(0),[s,l,f]),{commandEncoder:h,ts:G}=F(n,E,1);p=_(h,f),L(h);let v=y(p,Uint32Array);p=null;let[k,S,j]=await Promise.all([P(w),P(G),v]),N=j[0];return k!==void 0&&S!==void 0?{index:N,gpuTimeMs:k+S}:{index:N}}finally{!t&&u&&m(u),s&&m(s),l&&m(l),f&&m(f),c&&m(c),p&&m(p)}}async function ze(a,e,r,o,t,i,n,u){let s=r instanceof x,l=t instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(typeof n!="number")throw new Error("c must be a number.");if(typeof u!="number")throw new Error("s must be a number.");if(Number.isNaN(n)||Number.isNaN(u))throw new Error("c and s must not be NaN.");if(!Number.isFinite(n))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(!s&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!l&&!(t instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(s!==l)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(e<=0)return s?{}:{x:r,y:t};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(e-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let f=await B(a,"srot"),c=null,p=null,d=null,g=null,w=null;try{c=s?r._buf:b(r,"srot-x",!0),p=l?t._buf:b(t,"srot-y",!0),d=I([{value:e,type:"u32"},{value:n,type:"f32"},{value:u,type:"f32"},{value:o,type:"u32"},{value:i,type:"u32"}],"srot-params");let E=A(f.getBindGroupLayout(0),[c,p,d]),{commandEncoder:h,ts:G}=F(f,E,O(e));g=s?null:_(h,c),w=l?null:_(h,p),L(h);let v=await P(G);if(s&&l)return v!==void 0?{gpuTimeMs:v}:{};let k=y(g,Float32Array),S=y(w,Float32Array);g=null,w=null;let[j,N]=await Promise.all([k,S]);return v!==void 0?{x:j,y:N,gpuTimeMs:v}:{x:j,y:N}}finally{!s&&c&&m(c),!l&&p&&m(p),d&&m(d),g&&m(g),w&&m(w)}}async function Qe(a,e,r,o,t,i,n){let u=r instanceof x,s=t instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(!(n instanceof Float32Array)||n.length!==5)throw new Error("param must be a Float32Array of length 5.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!u&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!s&&!(t instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(u!==s)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(e<=0||n[0]===-2)return u?{}:{x:r,y:t};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(e-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let l=await B(a,"srotm"),f=null,c=null,p=null,d=null,g=null,w=null;try{f=u?r._buf:b(r,"srotm-x",!0),c=s?t._buf:b(t,"srotm-y",!0),p=b(n,"srotm-param",!1),d=I([{value:e,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"srotm-params");let E=A(l.getBindGroupLayout(0),[f,c,p,d]),{commandEncoder:h,ts:G}=F(l,E,O(e));g=u?null:_(h,f),w=s?null:_(h,c),L(h);let v=await P(G);if(u&&s)return v!==void 0?{gpuTimeMs:v}:{};let k=y(g,Float32Array),S=y(w,Float32Array);g=null,w=null;let[j,N]=await Promise.all([k,S]);return v!==void 0?{x:j,y:N,gpuTimeMs:v}:{x:j,y:N}}finally{!u&&f&&m(f),!s&&c&&m(c),p&&m(p),d&&m(d),g&&m(g),w&&m(w)}}async function qe(a,e,r,o,t,i,n,u,s,l,f,c,p="row-major"){let d=i instanceof V,g=u instanceof x,w=f instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="no-transpose"&&e!=="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 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 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(r)||!Number.isInteger(o)||!Number.isInteger(s)||!Number.isInteger(c)||!Number.isInteger(n))throw new Error("m, n, incx, incy, and lda must be integers.");if(s<=0||c<=0)throw new Error("incx and incy must be positive.");if(!d&&!(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&&!(f 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&&!d)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(g&&u._buf===f._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(d&&n!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(d&&(i.rows<r||i.cols<o))throw new Error("A is too small for the given m and n.");if(r<0||o<0)throw new Error("m and n must be non-negative.");if(r===0||o===0)return w?{}:{y:f};(d?i.layout:p)==="column-major"&&([r,o]=[o,r],e=e==="no-transpose"?"transpose":"no-transpose");let h=e==="no-transpose",G=h?o:r,v=h?r:o;if(n<o)throw new Error("lda must be >= n.");if(!d&&i.length<(r-1)*n+o)throw new Error("A does not have enough elements for the given m, n, and lda.");if(u.length<(G-1)*s+1)throw new Error("x does not have enough elements for the given dimensions and incx.");if(f.length<(v-1)*c+1)throw new Error("y does not have enough elements for the given dimensions and incy.");let S=await B(a,h?"sgemv_n":"sgemv_t"),j=d?i._buf:b(i,"sgemv-A",!1),N=g?u._buf:b(u,"sgemv-x",!1),D=w?f._buf:b(f,"sgemv-y",!0),M=I([{value:r,type:"u32"},{value:o,type:"u32"},{value:t,type:"f32"},{value:l,type:"f32"},{value:s,type:"u32"},{value:c,type:"u32"},{value:n,type:"u32"}],"sgemv-params");try{let T=A(S.getBindGroupLayout(0),[j,N,D,M]),H=h?Math.min(r,a.limits.maxComputeWorkgroupsPerDimension):O(v),{commandEncoder:R,ts:Z}=F(S,T,H),z=w?null:_(R,D);L(R);let Q=await P(Z);if(w)return Q!==void 0?{gpuTimeMs:Q}:{};let nr=await y(z,Float32Array);return Q!==void 0?{y:nr,gpuTimeMs:Q}:{y:nr}}finally{d||m(j),g||m(N),w||m(D),m(M)}}async function Ze(a,e,r,o,t,i,n,u,s,l,f,c="row-major"){let p=n instanceof x,d=l instanceof x,g=t instanceof V;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");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(!Number.isInteger(r)||!Number.isInteger(u)||!Number.isInteger(f)||!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 s!="number")throw new Error("beta must be a number.");if(Number.isNaN(s))throw new Error("beta must not be NaN.");if(!Number.isFinite(s))throw new Error("beta must be finite.");if(u<=0||f<=0)throw new Error("incx and incy must be positive.");if(i<r)throw new Error("lda must be >= n.");if(!g&&!(t instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!p&&!(n instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!d&&!(l instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(p!==d)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(p&&n._buf===l._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(g&&i!==t.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(g&&(t.rows<r||t.cols<r))throw new Error("A is too small for the given n.");if(r<0)throw new Error("n must be non-negative.");if(r===0)return d?{}:{y:l};if(!g&&t.length<(r-1)*i+r)throw new Error("A does not have enough elements for the given n and lda.");if(n.length<(r-1)*u+1)throw new Error("x does not have enough elements for the given n and incx.");if(l.length<(r-1)*f+1)throw new Error("y does not have enough elements for the given n and incy.");let E=(g?t.layout:c)==="column-major"?e==="upper":e==="lower",h=await B(a,"ssymv"),G=null,v=null,k=null,S=null;try{G=g?t._buf:b(t,"ssymv-A",!1),v=p?n._buf:b(n,"ssymv-x",!1),k=d?l._buf:b(l,"ssymv-y",!0),S=I([{value:r,type:"u32"},{value:o,type:"f32"},{value:s,type:"f32"},{value:u,type:"u32"},{value:f,type:"u32"},{value:i,type:"u32"},{value:E?0:1,type:"u32"}],"ssymv-params");let j=A(h.getBindGroupLayout(0),[G,v,k,S]),N=Math.min(r,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:D,ts:M}=F(h,j,N),T=d?null:_(D,k);L(D);let H=await P(M);if(d)return H!==void 0?{gpuTimeMs:H}:{};let R=await y(T,Float32Array);return H!==void 0?{y:R,gpuTimeMs:H}:{y:R}}finally{!g&&G&&m(G),!p&&v&&m(v),!d&&k&&m(k),S&&m(S)}}async function Ke(a,e,r,o,t,i,n,u,s,l,f,c="row-major"){let p=u instanceof x,d=l instanceof x,g=i instanceof V,w=o==="unit";if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(r!=="no-transpose"&&r!=="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(c!=="row-major"&&c!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(t)||!Number.isInteger(s)||!Number.isInteger(f)||!Number.isInteger(n))throw new Error("n, incx, incy, and lda must be integers.");if(s<=0||f<=0)throw new Error("incx and incy must be positive.");if(n<t)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(!d&&!(l instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(p!==d)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(p&&u._buf===l._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&&d&&i._buf===l._buf)throw new Error("A and y must not reference the same GPU buffer.");if(g&&n!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(g&&(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 d?{}:{y:l};if(!g&&i.length<(t-1)*n+t)throw new Error("A does not have enough elements for the given n and lda.");if(u.length<(t-1)*s+1)throw new Error("x does not have enough elements for the given n and incx.");if(l.length<(t-1)*f+1)throw new Error("y does not have enough elements for the given n and incy.");let h=(g?i.layout:c)==="column-major",G=h?e==="upper":e==="lower",v=h?r==="transpose":r==="no-transpose",k=await B(a,"strmv"),S=null,j=null,N=null,D=null;try{S=g?i._buf:b(i,"strmv-A",!1),j=p?u._buf:b(u,"strmv-x",!1),N=d?l._buf:b(l,"strmv-y",!0),D=I([{value:t,type:"u32"},{value:s,type:"u32"},{value:f,type:"u32"},{value:n,type:"u32"},{value:v?0:1,type:"u32"},{value:G?0:1,type:"u32"},{value:w?1:0,type:"u32"}],"strmv-params");let M=A(k.getBindGroupLayout(0),[S,j,N,D]),T=Math.min(t,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:H,ts:R}=F(k,M,T),Z=d?null:_(H,N);L(H);let z=await P(R);if(d)return z!==void 0?{gpuTimeMs:z}:{};let Q=await y(Z,Float32Array);return z!==void 0?{y:Q,gpuTimeMs:z}:{y:Q}}finally{!g&&S&&m(S),!p&&j&&m(j),!d&&N&&m(N),D&&m(D)}}var X=64;function Xe(a,e,r){let o=new ArrayBuffer(a*e),t=new DataView(o);for(let i=0;i<a;i++){let n=r(i),u=i*e;n.forEach((s,l)=>t.setUint32(u+l*4,s,!0))}return o}function $e(a,e,r){let o=a.createBuffer({label:r,size:e.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return a.queue.writeBuffer(o,0,e),o}async function Ye(a,e,r,o,t,i,n,u,s,l="row-major"){let f=u instanceof x,c=i instanceof V,p=o==="unit";if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(r!=="no-transpose"&&r!=="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(l!=="row-major"&&l!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(t)||!Number.isInteger(s)||!Number.isInteger(n))throw new Error("n, incx, and lda must be integers.");if(s<=0)throw new Error("incx must be positive.");if(n<t)throw new Error("lda must be >= n.");if(!c&&!(i instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!f&&!(u instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(f&&!c)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(c&&n!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(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 f?{}:{x:u};if(!c&&i.length<(t-1)*n+t)throw new Error("A does not have enough elements for the given n and lda.");if(u.length<(t-1)*s+1)throw new Error("x does not have enough elements for the given n and incx.");let g=(c?i.layout:l)==="column-major",w=g?e==="upper":e==="lower",E=g?r==="transpose":r==="no-transpose",h=await B(a,"strsv_invert_block"),G=await B(a,"strsv_apply_inverse"),v=await B(a,"strsv_update"),k=E===w,S=[];for(let Q=0;Q<t;Q+=X)S.push(Q);k||S.reverse();let j=S.length,N=a.limits.maxComputeWorkgroupsPerDimension,D=a.limits.minUniformBufferOffsetAlignment,M=null,T=null,H=null,R=null,Z=null,z=null;try{M=c?i._buf:b(i,"strsv-A",!1),T=f?u._buf:b(u,"strsv-x",!0),H=C(j*X*X*4,"strsv-Ainv");let Q=Xe(j,D,$=>{let Y=$*X,or=Math.min(Y+X,t);return[s,$,Y,or]});R=$e(a,Q,"strsv-apply-params");let nr=Xe(j,D,$=>{let Y=$*X,or=Math.min(Y+X,t);return[t,s,n,E?0:1,w?0:1,Y,or]});Z=$e(a,nr,"strsv-update-params");let{commandEncoder:rr,querySet:ar}=dr();z=I([{value:t,type:"u32"},{value:n,type:"u32"},{value:E?0:1,type:"u32"},{value:w?0:1,type:"u32"},{value:p?1:0,type:"u32"}],"strsv-invert-params");let tt=A(h.getBindGroupLayout(0),[M,H,z]);ir(rr,h,tt,{x:X,y:j},ar?{timestampWrites:{querySet:ar,beginningOfPassWriteIndex:0}}:void 0);for(let $=0;$<S.length;$++){let Y=S[$],or=Math.min(Y+X,t),it=Y/X,nt=$===S.length-1,hr=it*D,st=A(G.getBindGroupLayout(0),[H,T,{buffer:R,offset:hr,size:16}]);ir(rr,G,st,1,nt&&ar?{timestampWrites:{querySet:ar,endOfPassWriteIndex:1}}:void 0);let xr=k?t-or:Y;if(xr===0)continue;let ut=A(v.getBindGroupLayout(0),[M,T,{buffer:Z,offset:hr,size:32}]),lt=Math.min(xr,N);ir(rr,v,ut,lt)}let at=cr(rr,ar),ot=f?null:_(rr,T);L(rr);let sr=await P(at);if(f)return sr!==void 0?{gpuTimeMs:sr}:{};let br=await y(ot,Float32Array);return sr!==void 0?{x:br,gpuTimeMs:sr}:{x:br}}finally{!c&&M&&m(M),!f&&T&&m(T),H&&m(H),R&&m(R),Z&&m(Z),z&&m(z)}}async function Je(a,e,r,o,t,i,n,u,s,l,f="row-major"){let c=s instanceof V;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(f!=="row-major"&&f!=="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(e)||!Number.isInteger(r)||!Number.isInteger(i)||!Number.isInteger(u)||!Number.isInteger(l))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(!c&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(c&&l!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(s.rows<e||s.cols<r))throw new Error("A is too small for the given m and n.");(c?s.layout:f)==="column-major"&&([e,r]=[r,e],[t,n]=[n,t],[i,u]=[u,i]);let d=t instanceof x,g=n instanceof x;if(l<r)throw new Error("lda must be >= n.");if(!d&&!(t instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!g&&!(n instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(d!==g)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(d&&!c)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(c&&d&&s._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(c&&g&&s._buf===n._buf)throw new Error("A and y must not reference the same GPU buffer.");if(e<0||r<0)throw new Error("m and n must be non-negative.");if(e===0||r===0)return c?{}:{A:s};if(!c&&s.length<(e-1)*l+r)throw new Error("A does not have enough elements for the given m, n, and lda.");if(t.length<(e-1)*i+1)throw new Error("x does not have enough elements for the given m and incx.");if(n.length<(r-1)*u+1)throw new Error("y does not have enough elements for the given n and incy.");let w=await B(a,"sger"),E=null,h=null,G=null,v=null;try{E=d?t._buf:b(t,"sger-x",!1),h=g?n._buf:b(n,"sger-y",!1),G=c?s._buf:b(s,"sger-A",!0),v=I([{value:e,type:"u32"},{value:r,type:"u32"},{value:o,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:l,type:"u32"}],"sger-params");let k=A(w.getBindGroupLayout(0),[E,h,G,v]),S=Math.min(e,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:j,ts:N}=F(w,k,S),D=c?null:_(j,G);L(j);let M=await P(N);if(c)return M!==void 0?{gpuTimeMs:M}:{};let T=await y(D,Float32Array);return M!==void 0?{A:T,gpuTimeMs:M}:{A:T}}finally{!d&&E&&m(E),!g&&h&&m(h),!c&&G&&m(G),v&&m(v)}}async function rt(a,e,r,o,t,i,n,u,s="row-major"){let l=t instanceof x,f=n instanceof V;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(s!=="row-major"&&s!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(r)||!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<r)throw new Error("lda must be >= n.");if(!f&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!l&&!(t instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(l&&!f)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(f&&l&&n._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(f&&u!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(f&&(n.rows<r||n.cols<r))throw new Error("A is too small for the given n.");if(r<0)throw new Error("n must be non-negative.");if(r===0)return f?{}:{A:n};if(!f&&n.length<(r-1)*u+r)throw new Error("A does not have enough elements for the given n and lda.");if(t.length<(r-1)*i+1)throw new Error("x does not have enough elements for the given n and incx.");let p=(f?n.layout:s)==="column-major"?e==="upper":e==="lower",d=await B(a,"ssyr"),g=null,w=null,E=null;try{g=l?t._buf:b(t,"ssyr-x",!1),w=f?n._buf:b(n,"ssyr-A",!0),E=I([{value:r,type:"u32"},{value:o,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:p?0:1,type:"u32"}],"ssyr-params");let h=A(d.getBindGroupLayout(0),[g,w,E]),G=Math.min(r,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:v,ts:k}=F(d,h,G),S=f?null:_(v,w);L(v);let j=await P(k);if(f)return j!==void 0?{gpuTimeMs:j}:{};let N=await y(S,Float32Array);return j!==void 0?{A:N,gpuTimeMs:j}:{A:N}}finally{!l&&g&&m(g),!f&&w&&m(w),E&&m(E)}}async function et(a,e,r,o,t,i,n,u,s,l,f="row-major"){let c=t instanceof x,p=n instanceof x,d=s instanceof V;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(f!=="row-major"&&f!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(r)||!Number.isInteger(i)||!Number.isInteger(u)||!Number.isInteger(l))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(l<r)throw new Error("lda must be >= n.");if(!d&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!c&&!(t instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!p&&!(n 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&&!d)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(d&&c&&s._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(d&&p&&s._buf===n._buf)throw new Error("A and y must not reference the same GPU buffer.");if(c&&t._buf===n._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(d&&l!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(d&&(s.rows<r||s.cols<r))throw new Error("A is too small for the given n.");if(r<0)throw new Error("n must be non-negative.");if(r===0)return d?{}:{A:s};if(!d&&s.length<(r-1)*l+r)throw new Error("A does not have enough elements for the given n and lda.");if(t.length<(r-1)*i+1)throw new Error("x does not have enough elements for the given n and incx.");if(n.length<(r-1)*u+1)throw new Error("y does not have enough elements for the given n and incy.");let w=(d?s.layout:f)==="column-major"?e==="upper":e==="lower",E=await B(a,"ssyr2"),h=null,G=null,v=null,k=null;try{h=c?t._buf:b(t,"ssyr2-x",!1),G=p?n._buf:b(n,"ssyr2-y",!1),v=d?s._buf:b(s,"ssyr2-A",!0),k=I([{value:r,type:"u32"},{value:o,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:l,type:"u32"},{value:w?0:1,type:"u32"}],"ssyr2-params");let S=A(E.getBindGroupLayout(0),[h,G,v,k]),j=Math.min(r,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:N,ts:D}=F(E,S,j),M=d?null:_(N,v);L(N);let T=await P(D);if(d)return T!==void 0?{gpuTimeMs:T}:{};let H=await y(M,Float32Array);return T!==void 0?{A:H,gpuTimeMs:T}:{A:H}}finally{!c&&h&&m(h),!p&&G&&m(G),!d&&v&&m(v),k&&m(k)}}return gt(Zt);})();