ml-matrix 6.10.2 → 6.10.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/matrix.d.ts +32 -2
- package/matrix.js +53 -15
- package/matrix.umd.js +1 -1
- package/package.json +1 -1
- package/src/inspect.js +53 -15
package/matrix.d.ts
CHANGED
|
@@ -110,6 +110,11 @@ export interface IToStringOptions {
|
|
|
110
110
|
* @default `8`
|
|
111
111
|
*/
|
|
112
112
|
maxNumSize?: number;
|
|
113
|
+
/**
|
|
114
|
+
* Place minus signs in their own column.
|
|
115
|
+
* @default `'auto'`
|
|
116
|
+
*/
|
|
117
|
+
padMinus?: true | false | 'auto';
|
|
113
118
|
}
|
|
114
119
|
|
|
115
120
|
export abstract class AbstractMatrix {
|
|
@@ -260,7 +265,7 @@ export abstract class AbstractMatrix {
|
|
|
260
265
|
* @param columnIndex - Index of the element's column.
|
|
261
266
|
* @param value - The new value for the element.
|
|
262
267
|
*/
|
|
263
|
-
set(rowIndex: number, columnIndex: number, value: number): this;
|
|
268
|
+
abstract set(rowIndex: number, columnIndex: number, value: number): this;
|
|
264
269
|
|
|
265
270
|
/**
|
|
266
271
|
* Returns the value of the given element of the matrix.
|
|
@@ -268,7 +273,7 @@ export abstract class AbstractMatrix {
|
|
|
268
273
|
* @param columnIndex - Index of the element's column.
|
|
269
274
|
* @returns - The value of the element.
|
|
270
275
|
*/
|
|
271
|
-
get(rowIndex: number, columnIndex: number): number;
|
|
276
|
+
abstract get(rowIndex: number, columnIndex: number): number;
|
|
272
277
|
|
|
273
278
|
/**
|
|
274
279
|
* Applies a callback for each element of the matrix. The function is called in the matrix (this) context.
|
|
@@ -934,6 +939,9 @@ export class Matrix extends AbstractMatrix {
|
|
|
934
939
|
constructor(data: ArrayLike<ArrayLike<number>>);
|
|
935
940
|
constructor(otherMatrix: AbstractMatrix);
|
|
936
941
|
|
|
942
|
+
set(rowIndex: number, columnIndex: number, value: number): this;
|
|
943
|
+
get(rowIndex: number, columnIndex: number): number;
|
|
944
|
+
|
|
937
945
|
/**
|
|
938
946
|
* Removes a column from the matrix (in place).
|
|
939
947
|
* @param index - Column index.
|
|
@@ -965,26 +973,38 @@ export default Matrix;
|
|
|
965
973
|
|
|
966
974
|
export class MatrixColumnView extends AbstractMatrix {
|
|
967
975
|
constructor(matrix: AbstractMatrix, column: number);
|
|
976
|
+
set(rowIndex: number, columnIndex: number, value: number): this;
|
|
977
|
+
get(rowIndex: number, columnIndex: number): number;
|
|
968
978
|
}
|
|
969
979
|
|
|
970
980
|
export class MatrixColumnSelectionView extends AbstractMatrix {
|
|
971
981
|
constructor(matrix: AbstractMatrix, columnIndices: ArrayLike<number>);
|
|
982
|
+
set(rowIndex: number, columnIndex: number, value: number): this;
|
|
983
|
+
get(rowIndex: number, columnIndex: number): number;
|
|
972
984
|
}
|
|
973
985
|
|
|
974
986
|
export class MatrixFlipColumnView extends AbstractMatrix {
|
|
975
987
|
constructor(matrix: AbstractMatrix);
|
|
988
|
+
set(rowIndex: number, columnIndex: number, value: number): this;
|
|
989
|
+
get(rowIndex: number, columnIndex: number): number;
|
|
976
990
|
}
|
|
977
991
|
|
|
978
992
|
export class MatrixFlipRowView extends AbstractMatrix {
|
|
979
993
|
constructor(matrix: AbstractMatrix);
|
|
994
|
+
set(rowIndex: number, columnIndex: number, value: number): this;
|
|
995
|
+
get(rowIndex: number, columnIndex: number): number;
|
|
980
996
|
}
|
|
981
997
|
|
|
982
998
|
export class MatrixRowView extends AbstractMatrix {
|
|
983
999
|
constructor(matrix: AbstractMatrix, row: number);
|
|
1000
|
+
set(rowIndex: number, columnIndex: number, value: number): this;
|
|
1001
|
+
get(rowIndex: number, columnIndex: number): number;
|
|
984
1002
|
}
|
|
985
1003
|
|
|
986
1004
|
export class MatrixRowSelectionView extends AbstractMatrix {
|
|
987
1005
|
constructor(matrix: AbstractMatrix, rowIndices: ArrayLike<number>);
|
|
1006
|
+
set(rowIndex: number, columnIndex: number, value: number): this;
|
|
1007
|
+
get(rowIndex: number, columnIndex: number): number;
|
|
988
1008
|
}
|
|
989
1009
|
|
|
990
1010
|
export class MatrixSelectionView extends AbstractMatrix {
|
|
@@ -993,6 +1013,8 @@ export class MatrixSelectionView extends AbstractMatrix {
|
|
|
993
1013
|
rowIndices: ArrayLike<number>,
|
|
994
1014
|
columnIndices: ArrayLike<number>,
|
|
995
1015
|
);
|
|
1016
|
+
set(rowIndex: number, columnIndex: number, value: number): this;
|
|
1017
|
+
get(rowIndex: number, columnIndex: number): number;
|
|
996
1018
|
}
|
|
997
1019
|
|
|
998
1020
|
export class MatrixSubView extends AbstractMatrix {
|
|
@@ -1003,10 +1025,14 @@ export class MatrixSubView extends AbstractMatrix {
|
|
|
1003
1025
|
startColumn: number,
|
|
1004
1026
|
endColumn: number,
|
|
1005
1027
|
);
|
|
1028
|
+
set(rowIndex: number, columnIndex: number, value: number): this;
|
|
1029
|
+
get(rowIndex: number, columnIndex: number): number;
|
|
1006
1030
|
}
|
|
1007
1031
|
|
|
1008
1032
|
export class MatrixTransposeView extends AbstractMatrix {
|
|
1009
1033
|
constructor(matrix: AbstractMatrix);
|
|
1034
|
+
set(rowIndex: number, columnIndex: number, value: number): this;
|
|
1035
|
+
get(rowIndex: number, columnIndex: number): number;
|
|
1010
1036
|
}
|
|
1011
1037
|
|
|
1012
1038
|
export interface IWrap1DOptions {
|
|
@@ -1025,10 +1051,14 @@ export function wrap(twoDAray: ArrayLike<ArrayLike<number>>): WrapperMatrix2D;
|
|
|
1025
1051
|
|
|
1026
1052
|
export class WrapperMatrix1D extends AbstractMatrix {
|
|
1027
1053
|
constructor(data: ArrayLike<number>, options?: IWrap1DOptions);
|
|
1054
|
+
set(rowIndex: number, columnIndex: number, value: number): this;
|
|
1055
|
+
get(rowIndex: number, columnIndex: number): number;
|
|
1028
1056
|
}
|
|
1029
1057
|
|
|
1030
1058
|
export class WrapperMatrix2D extends AbstractMatrix {
|
|
1031
1059
|
constructor(data: ArrayLike<ArrayLike<number>>);
|
|
1060
|
+
set(rowIndex: number, columnIndex: number, value: number): this;
|
|
1061
|
+
get(rowIndex: number, columnIndex: number): number;
|
|
1032
1062
|
}
|
|
1033
1063
|
|
|
1034
1064
|
/**
|
package/matrix.js
CHANGED
|
@@ -17,25 +17,43 @@ function inspectMatrix() {
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
function inspectMatrixWithOptions(matrix, options = {}) {
|
|
20
|
-
const {
|
|
20
|
+
const {
|
|
21
|
+
maxRows = 15,
|
|
22
|
+
maxColumns = 10,
|
|
23
|
+
maxNumSize = 8,
|
|
24
|
+
padMinus = 'auto',
|
|
25
|
+
} = options;
|
|
21
26
|
return `${matrix.constructor.name} {
|
|
22
27
|
${indent}[
|
|
23
|
-
${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize)}
|
|
28
|
+
${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus)}
|
|
24
29
|
${indent}]
|
|
25
30
|
${indent}rows: ${matrix.rows}
|
|
26
31
|
${indent}columns: ${matrix.columns}
|
|
27
32
|
}`;
|
|
28
33
|
}
|
|
29
34
|
|
|
30
|
-
function inspectData(matrix, maxRows, maxColumns, maxNumSize) {
|
|
35
|
+
function inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus) {
|
|
31
36
|
const { rows, columns } = matrix;
|
|
32
37
|
const maxI = Math.min(rows, maxRows);
|
|
33
38
|
const maxJ = Math.min(columns, maxColumns);
|
|
34
39
|
const result = [];
|
|
40
|
+
|
|
41
|
+
if (padMinus === 'auto') {
|
|
42
|
+
padMinus = false;
|
|
43
|
+
loop: for (let i = 0; i < maxI; i++) {
|
|
44
|
+
for (let j = 0; j < maxJ; j++) {
|
|
45
|
+
if (matrix.get(i, j) < 0) {
|
|
46
|
+
padMinus = true;
|
|
47
|
+
break loop;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
35
53
|
for (let i = 0; i < maxI; i++) {
|
|
36
54
|
let line = [];
|
|
37
55
|
for (let j = 0; j < maxJ; j++) {
|
|
38
|
-
line.push(formatNumber(matrix.get(i, j), maxNumSize));
|
|
56
|
+
line.push(formatNumber(matrix.get(i, j), maxNumSize, padMinus));
|
|
39
57
|
}
|
|
40
58
|
result.push(`${line.join(' ')}`);
|
|
41
59
|
}
|
|
@@ -48,19 +66,39 @@ function inspectData(matrix, maxRows, maxColumns, maxNumSize) {
|
|
|
48
66
|
return result.join(`\n${indentData}`);
|
|
49
67
|
}
|
|
50
68
|
|
|
51
|
-
function formatNumber(num, maxNumSize) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
69
|
+
function formatNumber(num, maxNumSize, padMinus) {
|
|
70
|
+
return (
|
|
71
|
+
num >= 0 && padMinus
|
|
72
|
+
? ` ${formatNumber2(num, maxNumSize - 1)}`
|
|
73
|
+
: formatNumber2(num, maxNumSize)
|
|
74
|
+
).padEnd(maxNumSize);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function formatNumber2(num, len) {
|
|
78
|
+
// small.length numbers should be as is
|
|
79
|
+
let str = num.toString();
|
|
80
|
+
if (str.length <= len) return str;
|
|
81
|
+
|
|
82
|
+
// (7)'0.00123' is better then (7)'1.23e-2'
|
|
83
|
+
// (8)'0.000123' is worse then (7)'1.23e-3',
|
|
84
|
+
let fix = num.toFixed(len);
|
|
85
|
+
if (fix.length > len) {
|
|
86
|
+
fix = num.toFixed(Math.max(0, len - (fix.length - len)));
|
|
87
|
+
}
|
|
88
|
+
if (
|
|
89
|
+
fix.length <= len &&
|
|
90
|
+
!fix.startsWith('0.000') &&
|
|
91
|
+
!fix.startsWith('-0.000')
|
|
92
|
+
) {
|
|
93
|
+
return fix;
|
|
55
94
|
}
|
|
56
|
-
|
|
57
|
-
if
|
|
58
|
-
|
|
95
|
+
|
|
96
|
+
// well, if it's still too long the user should've used longer numbers
|
|
97
|
+
let exp = num.toExponential(len);
|
|
98
|
+
if (exp.length > len) {
|
|
99
|
+
exp = num.toExponential(Math.max(0, len - (exp.length - len)));
|
|
59
100
|
}
|
|
60
|
-
|
|
61
|
-
const eIndex = exponential.indexOf('e');
|
|
62
|
-
const e = exponential.slice(eIndex);
|
|
63
|
-
return exponential.slice(0, maxNumSize - e.length) + e;
|
|
101
|
+
return exp.slice(0);
|
|
64
102
|
}
|
|
65
103
|
|
|
66
104
|
function installMathOperations(AbstractMatrix, Matrix) {
|
package/matrix.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).mlMatrix={})}(this,(function(t){"use strict";const e=Object.prototype.toString;function r(t){return e.call(t).endsWith("Array]")}function s(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!r(t))throw new TypeError("input must be an array");if(0===t.length)throw new TypeError("input must not be empty");var s=e.fromIndex,o=void 0===s?0:s,i=e.toIndex,n=void 0===i?t.length:i;if(o<0||o>=t.length||!Number.isInteger(o))throw new Error("fromIndex must be a positive integer smaller than length");if(n<=o||n>t.length||!Number.isInteger(n))throw new Error("toIndex must be an integer greater than fromIndex and at most equal to length");for(var h=t[o],u=o+1;u<n;u++)t[u]>h&&(h=t[u]);return h}function o(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!r(t))throw new TypeError("input must be an array");if(0===t.length)throw new TypeError("input must not be empty");var s=e.fromIndex,o=void 0===s?0:s,i=e.toIndex,n=void 0===i?t.length:i;if(o<0||o>=t.length||!Number.isInteger(o))throw new Error("fromIndex must be a positive integer smaller than length");if(n<=o||n>t.length||!Number.isInteger(n))throw new Error("toIndex must be an integer greater than fromIndex and at most equal to length");for(var h=t[o],u=o+1;u<n;u++)t[u]<h&&(h=t[u]);return h}function i(t){var e,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!r(t))throw new TypeError("input must be an array");if(0===t.length)throw new TypeError("input must not be empty");if(void 0!==i.output){if(!r(i.output))throw new TypeError("output option must be an array if specified");e=i.output}else e=new Array(t.length);var n=o(t),h=s(t);if(n===h)throw new RangeError("minimum and maximum input values are equal. Cannot rescale a constant array");var u=i.min,l=void 0===u?i.autoMinMax?n:0:u,a=i.max,f=void 0===a?i.autoMinMax?h:1:a;if(l>=f)throw new RangeError("min option must be smaller than max option");for(var c=(f-l)/(h-n),m=0;m<t.length;m++)e[m]=(t[m]-n)*c+l;return e}const n=" ".repeat(2),h=" ".repeat(4);function u(t,e={}){const{maxRows:r=15,maxColumns:s=10,maxNumSize:o=8}=e;return`${t.constructor.name} {\n${n}[\n${h}${function(t,e,r,s){const{rows:o,columns:i}=t,n=Math.min(o,e),u=Math.min(i,r),a=[];for(let e=0;e<n;e++){let r=[];for(let o=0;o<u;o++)r.push(l(t.get(e,o),s));a.push(`${r.join(" ")}`)}u!==i&&(a[a.length-1]+=` ... ${i-r} more columns`);n!==o&&a.push(`... ${o-e} more rows`);return a.join(`\n${h}`)}(t,r,s,o)}\n${n}]\n${n}rows: ${t.rows}\n${n}columns: ${t.columns}\n}`}function l(t,e){const r=String(t);if(r.length<=e)return r.padEnd(e," ");const s=t.toPrecision(e-2);if(s.length<=e)return s;const o=t.toExponential(e-2),i=o.indexOf("e"),n=o.slice(i);return o.slice(0,e-n.length)+n}function a(t,e,r){let s=r?t.rows:t.rows-1;if(e<0||e>s)throw new RangeError("Row index out of range")}function f(t,e,r){let s=r?t.columns:t.columns-1;if(e<0||e>s)throw new RangeError("Column index out of range")}function c(t,e){if(e.to1DArray&&(e=e.to1DArray()),e.length!==t.columns)throw new RangeError("vector size must be the same as the number of columns");return e}function m(t,e){if(e.to1DArray&&(e=e.to1DArray()),e.length!==t.rows)throw new RangeError("vector size must be the same as the number of rows");return e}function g(t,e){if(!r(e))throw new TypeError("row indices must be an array");for(let r=0;r<e.length;r++)if(e[r]<0||e[r]>=t.rows)throw new RangeError("row indices are out of range")}function w(t,e){if(!r(e))throw new TypeError("column indices must be an array");for(let r=0;r<e.length;r++)if(e[r]<0||e[r]>=t.columns)throw new RangeError("column indices are out of range")}function p(t,e,r,s,o){if(5!==arguments.length)throw new RangeError("expected 4 arguments");if(M("startRow",e),M("endRow",r),M("startColumn",s),M("endColumn",o),e>r||s>o||e<0||e>=t.rows||r<0||r>=t.rows||s<0||s>=t.columns||o<0||o>=t.columns)throw new RangeError("Submatrix indices are out of range")}function d(t,e=0){let r=[];for(let s=0;s<t;s++)r.push(e);return r}function M(t,e){if("number"!=typeof e)throw new TypeError(`${t} must be a number`)}function b(t){if(t.isEmpty())throw new Error("Empty matrix has no elements to index")}class y{static from1DArray(t,e,r){if(t*e!==r.length)throw new RangeError("data length does not match given dimensions");let s=new E(t,e);for(let o=0;o<t;o++)for(let t=0;t<e;t++)s.set(o,t,r[o*e+t]);return s}static rowVector(t){let e=new E(1,t.length);for(let r=0;r<t.length;r++)e.set(0,r,t[r]);return e}static columnVector(t){let e=new E(t.length,1);for(let r=0;r<t.length;r++)e.set(r,0,t[r]);return e}static zeros(t,e){return new E(t,e)}static ones(t,e){return new E(t,e).fill(1)}static rand(t,e,r={}){if("object"!=typeof r)throw new TypeError("options must be an object");const{random:s=Math.random}=r;let o=new E(t,e);for(let r=0;r<t;r++)for(let t=0;t<e;t++)o.set(r,t,s());return o}static randInt(t,e,r={}){if("object"!=typeof r)throw new TypeError("options must be an object");const{min:s=0,max:o=1e3,random:i=Math.random}=r;if(!Number.isInteger(s))throw new TypeError("min must be an integer");if(!Number.isInteger(o))throw new TypeError("max must be an integer");if(s>=o)throw new RangeError("min must be smaller than max");let n=o-s,h=new E(t,e);for(let r=0;r<t;r++)for(let t=0;t<e;t++){let e=s+Math.round(i()*n);h.set(r,t,e)}return h}static eye(t,e,r){void 0===e&&(e=t),void 0===r&&(r=1);let s=Math.min(t,e),o=this.zeros(t,e);for(let t=0;t<s;t++)o.set(t,t,r);return o}static diag(t,e,r){let s=t.length;void 0===e&&(e=s),void 0===r&&(r=e);let o=Math.min(s,e,r),i=this.zeros(e,r);for(let e=0;e<o;e++)i.set(e,e,t[e]);return i}static min(t,e){t=this.checkMatrix(t),e=this.checkMatrix(e);let r=t.rows,s=t.columns,o=new E(r,s);for(let i=0;i<r;i++)for(let r=0;r<s;r++)o.set(i,r,Math.min(t.get(i,r),e.get(i,r)));return o}static max(t,e){t=this.checkMatrix(t),e=this.checkMatrix(e);let r=t.rows,s=t.columns,o=new this(r,s);for(let i=0;i<r;i++)for(let r=0;r<s;r++)o.set(i,r,Math.max(t.get(i,r),e.get(i,r)));return o}static checkMatrix(t){return y.isMatrix(t)?t:new E(t)}static isMatrix(t){return null!=t&&"Matrix"===t.klass}get size(){return this.rows*this.columns}apply(t){if("function"!=typeof t)throw new TypeError("callback must be a function");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)t.call(this,e,r);return this}to1DArray(){let t=[];for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)t.push(this.get(e,r));return t}to2DArray(){let t=[];for(let e=0;e<this.rows;e++){t.push([]);for(let r=0;r<this.columns;r++)t[e].push(this.get(e,r))}return t}toJSON(){return this.to2DArray()}isRowVector(){return 1===this.rows}isColumnVector(){return 1===this.columns}isVector(){return 1===this.rows||1===this.columns}isSquare(){return this.rows===this.columns}isEmpty(){return 0===this.rows||0===this.columns}isSymmetric(){if(this.isSquare()){for(let t=0;t<this.rows;t++)for(let e=0;e<=t;e++)if(this.get(t,e)!==this.get(e,t))return!1;return!0}return!1}isEchelonForm(){let t=0,e=0,r=-1,s=!0,o=!1;for(;t<this.rows&&s;){for(e=0,o=!1;e<this.columns&&!1===o;)0===this.get(t,e)?e++:1===this.get(t,e)&&e>r?(o=!0,r=e):(s=!1,o=!0);t++}return s}isReducedEchelonForm(){let t=0,e=0,r=-1,s=!0,o=!1;for(;t<this.rows&&s;){for(e=0,o=!1;e<this.columns&&!1===o;)0===this.get(t,e)?e++:1===this.get(t,e)&&e>r?(o=!0,r=e):(s=!1,o=!0);for(let r=e+1;r<this.rows;r++)0!==this.get(t,r)&&(s=!1);t++}return s}echelonForm(){let t=this.clone(),e=0,r=0;for(;e<t.rows&&r<t.columns;){let s=e;for(let o=e;o<t.rows;o++)t.get(o,r)>t.get(s,r)&&(s=o);if(0===t.get(s,r))r++;else{t.swapRows(e,s);let o=t.get(e,r);for(let s=r;s<t.columns;s++)t.set(e,s,t.get(e,s)/o);for(let s=e+1;s<t.rows;s++){let o=t.get(s,r)/t.get(e,r);t.set(s,r,0);for(let i=r+1;i<t.columns;i++)t.set(s,i,t.get(s,i)-t.get(e,i)*o)}e++,r++}}return t}reducedEchelonForm(){let t=this.echelonForm(),e=t.columns,r=t.rows,s=r-1;for(;s>=0;)if(0===t.maxRow(s))s--;else{let o=0,i=!1;for(;o<r&&!1===i;)1===t.get(s,o)?i=!0:o++;for(let r=0;r<s;r++){let i=t.get(r,o);for(let n=o;n<e;n++){let e=t.get(r,n)-i*t.get(s,n);t.set(r,n,e)}}s--}return t}set(){throw new Error("set method is unimplemented")}get(){throw new Error("get method is unimplemented")}repeat(t={}){if("object"!=typeof t)throw new TypeError("options must be an object");const{rows:e=1,columns:r=1}=t;if(!Number.isInteger(e)||e<=0)throw new TypeError("rows must be a positive integer");if(!Number.isInteger(r)||r<=0)throw new TypeError("columns must be a positive integer");let s=new E(this.rows*e,this.columns*r);for(let t=0;t<e;t++)for(let e=0;e<r;e++)s.setSubMatrix(this,this.rows*t,this.columns*e);return s}fill(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,t);return this}neg(){return this.mulS(-1)}getRow(t){a(this,t);let e=[];for(let r=0;r<this.columns;r++)e.push(this.get(t,r));return e}getRowVector(t){return E.rowVector(this.getRow(t))}setRow(t,e){a(this,t),e=c(this,e);for(let r=0;r<this.columns;r++)this.set(t,r,e[r]);return this}swapRows(t,e){a(this,t),a(this,e);for(let r=0;r<this.columns;r++){let s=this.get(t,r);this.set(t,r,this.get(e,r)),this.set(e,r,s)}return this}getColumn(t){f(this,t);let e=[];for(let r=0;r<this.rows;r++)e.push(this.get(r,t));return e}getColumnVector(t){return E.columnVector(this.getColumn(t))}setColumn(t,e){f(this,t),e=m(this,e);for(let r=0;r<this.rows;r++)this.set(r,t,e[r]);return this}swapColumns(t,e){f(this,t),f(this,e);for(let r=0;r<this.rows;r++){let s=this.get(r,t);this.set(r,t,this.get(r,e)),this.set(r,e,s)}return this}addRowVector(t){t=c(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)+t[r]);return this}subRowVector(t){t=c(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)-t[r]);return this}mulRowVector(t){t=c(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)*t[r]);return this}divRowVector(t){t=c(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)/t[r]);return this}addColumnVector(t){t=m(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)+t[e]);return this}subColumnVector(t){t=m(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)-t[e]);return this}mulColumnVector(t){t=m(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)*t[e]);return this}divColumnVector(t){t=m(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)/t[e]);return this}mulRow(t,e){a(this,t);for(let r=0;r<this.columns;r++)this.set(t,r,this.get(t,r)*e);return this}mulColumn(t,e){f(this,t);for(let r=0;r<this.rows;r++)this.set(r,t,this.get(r,t)*e);return this}max(t){if(this.isEmpty())return NaN;switch(t){case"row":{const t=new Array(this.rows).fill(Number.NEGATIVE_INFINITY);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.get(e,r)>t[e]&&(t[e]=this.get(e,r));return t}case"column":{const t=new Array(this.columns).fill(Number.NEGATIVE_INFINITY);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.get(e,r)>t[r]&&(t[r]=this.get(e,r));return t}case void 0:{let t=this.get(0,0);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.get(e,r)>t&&(t=this.get(e,r));return t}default:throw new Error(`invalid option: ${t}`)}}maxIndex(){b(this);let t=this.get(0,0),e=[0,0];for(let r=0;r<this.rows;r++)for(let s=0;s<this.columns;s++)this.get(r,s)>t&&(t=this.get(r,s),e[0]=r,e[1]=s);return e}min(t){if(this.isEmpty())return NaN;switch(t){case"row":{const t=new Array(this.rows).fill(Number.POSITIVE_INFINITY);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.get(e,r)<t[e]&&(t[e]=this.get(e,r));return t}case"column":{const t=new Array(this.columns).fill(Number.POSITIVE_INFINITY);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.get(e,r)<t[r]&&(t[r]=this.get(e,r));return t}case void 0:{let t=this.get(0,0);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.get(e,r)<t&&(t=this.get(e,r));return t}default:throw new Error(`invalid option: ${t}`)}}minIndex(){b(this);let t=this.get(0,0),e=[0,0];for(let r=0;r<this.rows;r++)for(let s=0;s<this.columns;s++)this.get(r,s)<t&&(t=this.get(r,s),e[0]=r,e[1]=s);return e}maxRow(t){if(a(this,t),this.isEmpty())return NaN;let e=this.get(t,0);for(let r=1;r<this.columns;r++)this.get(t,r)>e&&(e=this.get(t,r));return e}maxRowIndex(t){a(this,t),b(this);let e=this.get(t,0),r=[t,0];for(let s=1;s<this.columns;s++)this.get(t,s)>e&&(e=this.get(t,s),r[1]=s);return r}minRow(t){if(a(this,t),this.isEmpty())return NaN;let e=this.get(t,0);for(let r=1;r<this.columns;r++)this.get(t,r)<e&&(e=this.get(t,r));return e}minRowIndex(t){a(this,t),b(this);let e=this.get(t,0),r=[t,0];for(let s=1;s<this.columns;s++)this.get(t,s)<e&&(e=this.get(t,s),r[1]=s);return r}maxColumn(t){if(f(this,t),this.isEmpty())return NaN;let e=this.get(0,t);for(let r=1;r<this.rows;r++)this.get(r,t)>e&&(e=this.get(r,t));return e}maxColumnIndex(t){f(this,t),b(this);let e=this.get(0,t),r=[0,t];for(let s=1;s<this.rows;s++)this.get(s,t)>e&&(e=this.get(s,t),r[0]=s);return r}minColumn(t){if(f(this,t),this.isEmpty())return NaN;let e=this.get(0,t);for(let r=1;r<this.rows;r++)this.get(r,t)<e&&(e=this.get(r,t));return e}minColumnIndex(t){f(this,t),b(this);let e=this.get(0,t),r=[0,t];for(let s=1;s<this.rows;s++)this.get(s,t)<e&&(e=this.get(s,t),r[0]=s);return r}diag(){let t=Math.min(this.rows,this.columns),e=[];for(let r=0;r<t;r++)e.push(this.get(r,r));return e}norm(t="frobenius"){let e=0;if("max"===t)return this.max();if("frobenius"===t){for(let t=0;t<this.rows;t++)for(let r=0;r<this.columns;r++)e+=this.get(t,r)*this.get(t,r);return Math.sqrt(e)}throw new RangeError(`unknown norm type: ${t}`)}cumulativeSum(){let t=0;for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)t+=this.get(e,r),this.set(e,r,t);return this}dot(t){y.isMatrix(t)&&(t=t.to1DArray());let e=this.to1DArray();if(e.length!==t.length)throw new RangeError("vectors do not have the same size");let r=0;for(let s=0;s<e.length;s++)r+=e[s]*t[s];return r}mmul(t){t=E.checkMatrix(t);let e=this.rows,r=this.columns,s=t.columns,o=new E(e,s),i=new Float64Array(r);for(let n=0;n<s;n++){for(let e=0;e<r;e++)i[e]=t.get(e,n);for(let t=0;t<e;t++){let e=0;for(let s=0;s<r;s++)e+=this.get(t,s)*i[s];o.set(t,n,e)}}return o}strassen2x2(t){t=E.checkMatrix(t);let e=new E(2,2);const r=this.get(0,0),s=t.get(0,0),o=this.get(0,1),i=t.get(0,1),n=this.get(1,0),h=t.get(1,0),u=this.get(1,1),l=t.get(1,1),a=(r+u)*(s+l),f=(n+u)*s,c=r*(i-l),m=u*(h-s),g=(r+o)*l,w=a+m-g+(o-u)*(h+l),p=c+g,d=f+m,M=a-f+c+(n-r)*(s+i);return e.set(0,0,w),e.set(0,1,p),e.set(1,0,d),e.set(1,1,M),e}strassen3x3(t){t=E.checkMatrix(t);let e=new E(3,3);const r=this.get(0,0),s=this.get(0,1),o=this.get(0,2),i=this.get(1,0),n=this.get(1,1),h=this.get(1,2),u=this.get(2,0),l=this.get(2,1),a=this.get(2,2),f=t.get(0,0),c=t.get(0,1),m=t.get(0,2),g=t.get(1,0),w=t.get(1,1),p=t.get(1,2),d=t.get(2,0),M=t.get(2,1),b=t.get(2,2),y=(r-i)*(-c+w),x=(-r+i+n)*(f-c+w),v=(i+n)*(-f+c),S=r*f,R=(-r+u+l)*(f-m+p),I=(-r+u)*(m-p),k=(u+l)*(-f+m),N=(-o+l+a)*(w+d-M),T=(o-a)*(w-M),V=o*d,q=(l+a)*(-d+M),A=(-o+n+h)*(p+d-b),C=(o-h)*(p-b),F=(n+h)*(-d+b),D=S+V+s*g,$=(r+s+o-i-n-l-a)*w+x+v+S+N+V+q,j=S+R+k+(r+s+o-n-h-u-l)*p+V+A+F,P=y+n*(-f+c+g-w-p-d+b)+x+S+V+A+C,L=y+x+v+S+h*M,z=V+A+C+F+i*m,U=S+R+I+l*(-f+m+g-w-p-d+M)+N+T+V,O=N+T+V+q+u*c,_=S+R+I+k+a*b;return e.set(0,0,D),e.set(0,1,$),e.set(0,2,j),e.set(1,0,P),e.set(1,1,L),e.set(1,2,z),e.set(2,0,U),e.set(2,1,O),e.set(2,2,_),e}mmulStrassen(t){t=E.checkMatrix(t);let e=this.clone(),r=e.rows,s=e.columns,o=t.rows,i=t.columns;function n(t,e,r){let s=t.rows,o=t.columns;if(s===e&&o===r)return t;{let s=y.zeros(e,r);return s=s.setSubMatrix(t,0,0),s}}s!==o&&console.warn(`Multiplying ${r} x ${s} and ${o} x ${i} matrix: dimensions do not match.`);let h=Math.max(r,o),u=Math.max(s,i);return e=n(e,h,u),function t(e,r,s,o){if(s<=512||o<=512)return e.mmul(r);s%2==1&&o%2==1?(e=n(e,s+1,o+1),r=n(r,s+1,o+1)):s%2==1?(e=n(e,s+1,o),r=n(r,s+1,o)):o%2==1&&(e=n(e,s,o+1),r=n(r,s,o+1));let i=parseInt(e.rows/2,10),h=parseInt(e.columns/2,10),u=e.subMatrix(0,i-1,0,h-1),l=r.subMatrix(0,i-1,0,h-1),a=e.subMatrix(0,i-1,h,e.columns-1),f=r.subMatrix(0,i-1,h,r.columns-1),c=e.subMatrix(i,e.rows-1,0,h-1),m=r.subMatrix(i,r.rows-1,0,h-1),g=e.subMatrix(i,e.rows-1,h,e.columns-1),w=r.subMatrix(i,r.rows-1,h,r.columns-1),p=t(y.add(u,g),y.add(l,w),i,h),d=t(y.add(c,g),l,i,h),M=t(u,y.sub(f,w),i,h),b=t(g,y.sub(m,l),i,h),x=t(y.add(u,a),w,i,h),E=t(y.sub(c,u),y.add(l,f),i,h),v=t(y.sub(a,g),y.add(m,w),i,h),S=y.add(p,b);S.sub(x),S.add(v);let R=y.add(M,x),I=y.add(d,b),k=y.sub(p,d);k.add(M),k.add(E);let N=y.zeros(2*S.rows,2*S.columns);return N=N.setSubMatrix(S,0,0),N=N.setSubMatrix(R,S.rows,0),N=N.setSubMatrix(I,0,S.columns),N=N.setSubMatrix(k,S.rows,S.columns),N.subMatrix(0,s-1,0,o-1)}(e,t=n(t,h,u),h,u)}scaleRows(t={}){if("object"!=typeof t)throw new TypeError("options must be an object");const{min:e=0,max:r=1}=t;if(!Number.isFinite(e))throw new TypeError("min must be a number");if(!Number.isFinite(r))throw new TypeError("max must be a number");if(e>=r)throw new RangeError("min must be smaller than max");let s=new E(this.rows,this.columns);for(let t=0;t<this.rows;t++){const o=this.getRow(t);o.length>0&&i(o,{min:e,max:r,output:o}),s.setRow(t,o)}return s}scaleColumns(t={}){if("object"!=typeof t)throw new TypeError("options must be an object");const{min:e=0,max:r=1}=t;if(!Number.isFinite(e))throw new TypeError("min must be a number");if(!Number.isFinite(r))throw new TypeError("max must be a number");if(e>=r)throw new RangeError("min must be smaller than max");let s=new E(this.rows,this.columns);for(let t=0;t<this.columns;t++){const o=this.getColumn(t);o.length&&i(o,{min:e,max:r,output:o}),s.setColumn(t,o)}return s}flipRows(){const t=Math.ceil(this.columns/2);for(let e=0;e<this.rows;e++)for(let r=0;r<t;r++){let t=this.get(e,r),s=this.get(e,this.columns-1-r);this.set(e,r,s),this.set(e,this.columns-1-r,t)}return this}flipColumns(){const t=Math.ceil(this.rows/2);for(let e=0;e<this.columns;e++)for(let r=0;r<t;r++){let t=this.get(r,e),s=this.get(this.rows-1-r,e);this.set(r,e,s),this.set(this.rows-1-r,e,t)}return this}kroneckerProduct(t){t=E.checkMatrix(t);let e=this.rows,r=this.columns,s=t.rows,o=t.columns,i=new E(e*s,r*o);for(let n=0;n<e;n++)for(let e=0;e<r;e++)for(let r=0;r<s;r++)for(let h=0;h<o;h++)i.set(s*n+r,o*e+h,this.get(n,e)*t.get(r,h));return i}kroneckerSum(t){if(t=E.checkMatrix(t),!this.isSquare()||!t.isSquare())throw new Error("Kronecker Sum needs two Square Matrices");let e=this.rows,r=t.rows,s=this.kroneckerProduct(E.eye(r,r)),o=E.eye(e,e).kroneckerProduct(t);return s.add(o)}transpose(){let t=new E(this.columns,this.rows);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)t.set(r,e,this.get(e,r));return t}sortRows(t=x){for(let e=0;e<this.rows;e++)this.setRow(e,this.getRow(e).sort(t));return this}sortColumns(t=x){for(let e=0;e<this.columns;e++)this.setColumn(e,this.getColumn(e).sort(t));return this}subMatrix(t,e,r,s){p(this,t,e,r,s);let o=new E(e-t+1,s-r+1);for(let i=t;i<=e;i++)for(let e=r;e<=s;e++)o.set(i-t,e-r,this.get(i,e));return o}subMatrixRow(t,e,r){if(void 0===e&&(e=0),void 0===r&&(r=this.columns-1),e>r||e<0||e>=this.columns||r<0||r>=this.columns)throw new RangeError("Argument out of range");let s=new E(t.length,r-e+1);for(let o=0;o<t.length;o++)for(let i=e;i<=r;i++){if(t[o]<0||t[o]>=this.rows)throw new RangeError(`Row index out of range: ${t[o]}`);s.set(o,i-e,this.get(t[o],i))}return s}subMatrixColumn(t,e,r){if(void 0===e&&(e=0),void 0===r&&(r=this.rows-1),e>r||e<0||e>=this.rows||r<0||r>=this.rows)throw new RangeError("Argument out of range");let s=new E(r-e+1,t.length);for(let o=0;o<t.length;o++)for(let i=e;i<=r;i++){if(t[o]<0||t[o]>=this.columns)throw new RangeError(`Column index out of range: ${t[o]}`);s.set(i-e,o,this.get(i,t[o]))}return s}setSubMatrix(t,e,r){if((t=E.checkMatrix(t)).isEmpty())return this;p(this,e,e+t.rows-1,r,r+t.columns-1);for(let s=0;s<t.rows;s++)for(let o=0;o<t.columns;o++)this.set(e+s,r+o,t.get(s,o));return this}selection(t,e){g(this,t),w(this,e);let r=new E(t.length,e.length);for(let s=0;s<t.length;s++){let o=t[s];for(let t=0;t<e.length;t++){let i=e[t];r.set(s,t,this.get(o,i))}}return r}trace(){let t=Math.min(this.rows,this.columns),e=0;for(let r=0;r<t;r++)e+=this.get(r,r);return e}clone(){let t=new E(this.rows,this.columns);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)t.set(e,r,this.get(e,r));return t}sum(t){switch(t){case"row":return function(t){let e=d(t.rows);for(let r=0;r<t.rows;++r)for(let s=0;s<t.columns;++s)e[r]+=t.get(r,s);return e}(this);case"column":return function(t){let e=d(t.columns);for(let r=0;r<t.rows;++r)for(let s=0;s<t.columns;++s)e[s]+=t.get(r,s);return e}(this);case void 0:return function(t){let e=0;for(let r=0;r<t.rows;r++)for(let s=0;s<t.columns;s++)e+=t.get(r,s);return e}(this);default:throw new Error(`invalid option: ${t}`)}}product(t){switch(t){case"row":return function(t){let e=d(t.rows,1);for(let r=0;r<t.rows;++r)for(let s=0;s<t.columns;++s)e[r]*=t.get(r,s);return e}(this);case"column":return function(t){let e=d(t.columns,1);for(let r=0;r<t.rows;++r)for(let s=0;s<t.columns;++s)e[s]*=t.get(r,s);return e}(this);case void 0:return function(t){let e=1;for(let r=0;r<t.rows;r++)for(let s=0;s<t.columns;s++)e*=t.get(r,s);return e}(this);default:throw new Error(`invalid option: ${t}`)}}mean(t){const e=this.sum(t);switch(t){case"row":for(let t=0;t<this.rows;t++)e[t]/=this.columns;return e;case"column":for(let t=0;t<this.columns;t++)e[t]/=this.rows;return e;case void 0:return e/this.size;default:throw new Error(`invalid option: ${t}`)}}variance(t,e={}){if("object"==typeof t&&(e=t,t=void 0),"object"!=typeof e)throw new TypeError("options must be an object");const{unbiased:s=!0,mean:o=this.mean(t)}=e;if("boolean"!=typeof s)throw new TypeError("unbiased must be a boolean");switch(t){case"row":if(!r(o))throw new TypeError("mean must be an array");return function(t,e,r){const s=t.rows,o=t.columns,i=[];for(let n=0;n<s;n++){let s=0,h=0,u=0;for(let e=0;e<o;e++)u=t.get(n,e)-r[n],s+=u,h+=u*u;e?i.push((h-s*s/o)/(o-1)):i.push((h-s*s/o)/o)}return i}(this,s,o);case"column":if(!r(o))throw new TypeError("mean must be an array");return function(t,e,r){const s=t.rows,o=t.columns,i=[];for(let n=0;n<o;n++){let o=0,h=0,u=0;for(let e=0;e<s;e++)u=t.get(e,n)-r[n],o+=u,h+=u*u;e?i.push((h-o*o/s)/(s-1)):i.push((h-o*o/s)/s)}return i}(this,s,o);case void 0:if("number"!=typeof o)throw new TypeError("mean must be a number");return function(t,e,r){const s=t.rows,o=t.columns,i=s*o;let n=0,h=0,u=0;for(let e=0;e<s;e++)for(let s=0;s<o;s++)u=t.get(e,s)-r,n+=u,h+=u*u;return e?(h-n*n/i)/(i-1):(h-n*n/i)/i}(this,s,o);default:throw new Error(`invalid option: ${t}`)}}standardDeviation(t,e){"object"==typeof t&&(e=t,t=void 0);const r=this.variance(t,e);if(void 0===t)return Math.sqrt(r);for(let t=0;t<r.length;t++)r[t]=Math.sqrt(r[t]);return r}center(t,e={}){if("object"==typeof t&&(e=t,t=void 0),"object"!=typeof e)throw new TypeError("options must be an object");const{center:s=this.mean(t)}=e;switch(t){case"row":if(!r(s))throw new TypeError("center must be an array");return function(t,e){for(let r=0;r<t.rows;r++)for(let s=0;s<t.columns;s++)t.set(r,s,t.get(r,s)-e[r])}(this,s),this;case"column":if(!r(s))throw new TypeError("center must be an array");return function(t,e){for(let r=0;r<t.rows;r++)for(let s=0;s<t.columns;s++)t.set(r,s,t.get(r,s)-e[s])}(this,s),this;case void 0:if("number"!=typeof s)throw new TypeError("center must be a number");return function(t,e){for(let r=0;r<t.rows;r++)for(let s=0;s<t.columns;s++)t.set(r,s,t.get(r,s)-e)}(this,s),this;default:throw new Error(`invalid option: ${t}`)}}scale(t,e={}){if("object"==typeof t&&(e=t,t=void 0),"object"!=typeof e)throw new TypeError("options must be an object");let s=e.scale;switch(t){case"row":if(void 0===s)s=function(t){const e=[];for(let r=0;r<t.rows;r++){let s=0;for(let e=0;e<t.columns;e++)s+=Math.pow(t.get(r,e),2)/(t.columns-1);e.push(Math.sqrt(s))}return e}(this);else if(!r(s))throw new TypeError("scale must be an array");return function(t,e){for(let r=0;r<t.rows;r++)for(let s=0;s<t.columns;s++)t.set(r,s,t.get(r,s)/e[r])}(this,s),this;case"column":if(void 0===s)s=function(t){const e=[];for(let r=0;r<t.columns;r++){let s=0;for(let e=0;e<t.rows;e++)s+=Math.pow(t.get(e,r),2)/(t.rows-1);e.push(Math.sqrt(s))}return e}(this);else if(!r(s))throw new TypeError("scale must be an array");return function(t,e){for(let r=0;r<t.rows;r++)for(let s=0;s<t.columns;s++)t.set(r,s,t.get(r,s)/e[s])}(this,s),this;case void 0:if(void 0===s)s=function(t){const e=t.size-1;let r=0;for(let s=0;s<t.columns;s++)for(let o=0;o<t.rows;o++)r+=Math.pow(t.get(o,s),2)/e;return Math.sqrt(r)}(this);else if("number"!=typeof s)throw new TypeError("scale must be a number");return function(t,e){for(let r=0;r<t.rows;r++)for(let s=0;s<t.columns;s++)t.set(r,s,t.get(r,s)/e)}(this,s),this;default:throw new Error(`invalid option: ${t}`)}}toString(t){return u(this,t)}}function x(t,e){return t-e}y.prototype.klass="Matrix","undefined"!=typeof Symbol&&(y.prototype[Symbol.for("nodejs.util.inspect.custom")]=function(){return u(this)}),y.random=y.rand,y.randomInt=y.randInt,y.diagonal=y.diag,y.prototype.diagonal=y.prototype.diag,y.identity=y.eye,y.prototype.negate=y.prototype.neg,y.prototype.tensorProduct=y.prototype.kroneckerProduct;class E extends y{constructor(t,e){if(super(),E.isMatrix(t))return t.clone();if(Number.isInteger(t)&&t>=0){if(this.data=[],!(Number.isInteger(e)&&e>=0))throw new TypeError("nColumns must be a positive integer");for(let r=0;r<t;r++)this.data.push(new Float64Array(e))}else{if(!r(t))throw new TypeError("First argument must be a positive number or an array");{const r=t;if("number"!=typeof(e=(t=r.length)?r[0].length:0))throw new TypeError("Data must be a 2D array with at least one element");this.data=[];for(let s=0;s<t;s++){if(r[s].length!==e)throw new RangeError("Inconsistent array dimensions");if(!r[s].every((t=>"number"==typeof t)))throw new TypeError("Input data contains non-numeric values");this.data.push(Float64Array.from(r[s]))}}}this.rows=t,this.columns=e}set(t,e,r){return this.data[t][e]=r,this}get(t,e){return this.data[t][e]}removeRow(t){return a(this,t),this.data.splice(t,1),this.rows-=1,this}addRow(t,e){return void 0===e&&(e=t,t=this.rows),a(this,t,!0),e=Float64Array.from(c(this,e)),this.data.splice(t,0,e),this.rows+=1,this}removeColumn(t){f(this,t);for(let e=0;e<this.rows;e++){const r=new Float64Array(this.columns-1);for(let s=0;s<t;s++)r[s]=this.data[e][s];for(let s=t+1;s<this.columns;s++)r[s-1]=this.data[e][s];this.data[e]=r}return this.columns-=1,this}addColumn(t,e){void 0===e&&(e=t,t=this.columns),f(this,t,!0),e=m(this,e);for(let r=0;r<this.rows;r++){const s=new Float64Array(this.columns+1);let o=0;for(;o<t;o++)s[o]=this.data[r][o];for(s[o++]=e[r];o<this.columns+1;o++)s[o]=this.data[r][o-1];this.data[r]=s}return this.columns+=1,this}}!function(t,e){t.prototype.add=function(t){return"number"==typeof t?this.addS(t):this.addM(t)},t.prototype.addS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)+t);return this},t.prototype.addM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)+t.get(e,r));return this},t.add=function(t,r){return new e(t).add(r)},t.prototype.sub=function(t){return"number"==typeof t?this.subS(t):this.subM(t)},t.prototype.subS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)-t);return this},t.prototype.subM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)-t.get(e,r));return this},t.sub=function(t,r){return new e(t).sub(r)},t.prototype.subtract=t.prototype.sub,t.prototype.subtractS=t.prototype.subS,t.prototype.subtractM=t.prototype.subM,t.subtract=t.sub,t.prototype.mul=function(t){return"number"==typeof t?this.mulS(t):this.mulM(t)},t.prototype.mulS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)*t);return this},t.prototype.mulM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)*t.get(e,r));return this},t.mul=function(t,r){return new e(t).mul(r)},t.prototype.multiply=t.prototype.mul,t.prototype.multiplyS=t.prototype.mulS,t.prototype.multiplyM=t.prototype.mulM,t.multiply=t.mul,t.prototype.div=function(t){return"number"==typeof t?this.divS(t):this.divM(t)},t.prototype.divS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)/t);return this},t.prototype.divM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)/t.get(e,r));return this},t.div=function(t,r){return new e(t).div(r)},t.prototype.divide=t.prototype.div,t.prototype.divideS=t.prototype.divS,t.prototype.divideM=t.prototype.divM,t.divide=t.div,t.prototype.mod=function(t){return"number"==typeof t?this.modS(t):this.modM(t)},t.prototype.modS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)%t);return this},t.prototype.modM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)%t.get(e,r));return this},t.mod=function(t,r){return new e(t).mod(r)},t.prototype.modulus=t.prototype.mod,t.prototype.modulusS=t.prototype.modS,t.prototype.modulusM=t.prototype.modM,t.modulus=t.mod,t.prototype.and=function(t){return"number"==typeof t?this.andS(t):this.andM(t)},t.prototype.andS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)&t);return this},t.prototype.andM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)&t.get(e,r));return this},t.and=function(t,r){return new e(t).and(r)},t.prototype.or=function(t){return"number"==typeof t?this.orS(t):this.orM(t)},t.prototype.orS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)|t);return this},t.prototype.orM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)|t.get(e,r));return this},t.or=function(t,r){return new e(t).or(r)},t.prototype.xor=function(t){return"number"==typeof t?this.xorS(t):this.xorM(t)},t.prototype.xorS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)^t);return this},t.prototype.xorM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)^t.get(e,r));return this},t.xor=function(t,r){return new e(t).xor(r)},t.prototype.leftShift=function(t){return"number"==typeof t?this.leftShiftS(t):this.leftShiftM(t)},t.prototype.leftShiftS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)<<t);return this},t.prototype.leftShiftM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)<<t.get(e,r));return this},t.leftShift=function(t,r){return new e(t).leftShift(r)},t.prototype.signPropagatingRightShift=function(t){return"number"==typeof t?this.signPropagatingRightShiftS(t):this.signPropagatingRightShiftM(t)},t.prototype.signPropagatingRightShiftS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)>>t);return this},t.prototype.signPropagatingRightShiftM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)>>t.get(e,r));return this},t.signPropagatingRightShift=function(t,r){return new e(t).signPropagatingRightShift(r)},t.prototype.rightShift=function(t){return"number"==typeof t?this.rightShiftS(t):this.rightShiftM(t)},t.prototype.rightShiftS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)>>>t);return this},t.prototype.rightShiftM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)>>>t.get(e,r));return this},t.rightShift=function(t,r){return new e(t).rightShift(r)},t.prototype.zeroFillRightShift=t.prototype.rightShift,t.prototype.zeroFillRightShiftS=t.prototype.rightShiftS,t.prototype.zeroFillRightShiftM=t.prototype.rightShiftM,t.zeroFillRightShift=t.rightShift,t.prototype.not=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,~this.get(t,e));return this},t.not=function(t){return new e(t).not()},t.prototype.abs=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.abs(this.get(t,e)));return this},t.abs=function(t){return new e(t).abs()},t.prototype.acos=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.acos(this.get(t,e)));return this},t.acos=function(t){return new e(t).acos()},t.prototype.acosh=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.acosh(this.get(t,e)));return this},t.acosh=function(t){return new e(t).acosh()},t.prototype.asin=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.asin(this.get(t,e)));return this},t.asin=function(t){return new e(t).asin()},t.prototype.asinh=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.asinh(this.get(t,e)));return this},t.asinh=function(t){return new e(t).asinh()},t.prototype.atan=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.atan(this.get(t,e)));return this},t.atan=function(t){return new e(t).atan()},t.prototype.atanh=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.atanh(this.get(t,e)));return this},t.atanh=function(t){return new e(t).atanh()},t.prototype.cbrt=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.cbrt(this.get(t,e)));return this},t.cbrt=function(t){return new e(t).cbrt()},t.prototype.ceil=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.ceil(this.get(t,e)));return this},t.ceil=function(t){return new e(t).ceil()},t.prototype.clz32=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.clz32(this.get(t,e)));return this},t.clz32=function(t){return new e(t).clz32()},t.prototype.cos=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.cos(this.get(t,e)));return this},t.cos=function(t){return new e(t).cos()},t.prototype.cosh=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.cosh(this.get(t,e)));return this},t.cosh=function(t){return new e(t).cosh()},t.prototype.exp=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.exp(this.get(t,e)));return this},t.exp=function(t){return new e(t).exp()},t.prototype.expm1=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.expm1(this.get(t,e)));return this},t.expm1=function(t){return new e(t).expm1()},t.prototype.floor=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.floor(this.get(t,e)));return this},t.floor=function(t){return new e(t).floor()},t.prototype.fround=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.fround(this.get(t,e)));return this},t.fround=function(t){return new e(t).fround()},t.prototype.log=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.log(this.get(t,e)));return this},t.log=function(t){return new e(t).log()},t.prototype.log1p=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.log1p(this.get(t,e)));return this},t.log1p=function(t){return new e(t).log1p()},t.prototype.log10=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.log10(this.get(t,e)));return this},t.log10=function(t){return new e(t).log10()},t.prototype.log2=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.log2(this.get(t,e)));return this},t.log2=function(t){return new e(t).log2()},t.prototype.round=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.round(this.get(t,e)));return this},t.round=function(t){return new e(t).round()},t.prototype.sign=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.sign(this.get(t,e)));return this},t.sign=function(t){return new e(t).sign()},t.prototype.sin=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.sin(this.get(t,e)));return this},t.sin=function(t){return new e(t).sin()},t.prototype.sinh=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.sinh(this.get(t,e)));return this},t.sinh=function(t){return new e(t).sinh()},t.prototype.sqrt=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.sqrt(this.get(t,e)));return this},t.sqrt=function(t){return new e(t).sqrt()},t.prototype.tan=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.tan(this.get(t,e)));return this},t.tan=function(t){return new e(t).tan()},t.prototype.tanh=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.tanh(this.get(t,e)));return this},t.tanh=function(t){return new e(t).tanh()},t.prototype.trunc=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.trunc(this.get(t,e)));return this},t.trunc=function(t){return new e(t).trunc()},t.pow=function(t,r){return new e(t).pow(r)},t.prototype.pow=function(t){return"number"==typeof t?this.powS(t):this.powM(t)},t.prototype.powS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,Math.pow(this.get(e,r),t));return this},t.prototype.powM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,Math.pow(this.get(e,r),t.get(e,r)));return this}}(y,E);class v extends y{constructor(t,e,r){super(),this.matrix=t,this.rows=e,this.columns=r}}class S extends v{constructor(t,e,r){g(t,e),w(t,r),super(t,e.length,r.length),this.rowIndices=e,this.columnIndices=r}set(t,e,r){return this.matrix.set(this.rowIndices[t],this.columnIndices[e],r),this}get(t,e){return this.matrix.get(this.rowIndices[t],this.columnIndices[e])}}class R extends y{constructor(t,e={}){const{rows:r=1}=e;if(t.length%r!=0)throw new Error("the data length is not divisible by the number of rows");super(),this.rows=r,this.columns=t.length/r,this.data=t}set(t,e,r){let s=this._calculateIndex(t,e);return this.data[s]=r,this}get(t,e){let r=this._calculateIndex(t,e);return this.data[r]}_calculateIndex(t,e){return t*this.columns+e}}class I extends y{constructor(t){super(),this.data=t,this.rows=t.length,this.columns=t[0].length}set(t,e,r){return this.data[t][e]=r,this}get(t,e){return this.data[t][e]}}class k{constructor(t){let e,r,s,o,i,n,h,u,l,a=(t=I.checkMatrix(t)).clone(),f=a.rows,c=a.columns,m=new Float64Array(f),g=1;for(e=0;e<f;e++)m[e]=e;for(u=new Float64Array(f),r=0;r<c;r++){for(e=0;e<f;e++)u[e]=a.get(e,r);for(e=0;e<f;e++){for(l=Math.min(e,r),i=0,s=0;s<l;s++)i+=a.get(e,s)*u[s];u[e]-=i,a.set(e,r,u[e])}for(o=r,e=r+1;e<f;e++)Math.abs(u[e])>Math.abs(u[o])&&(o=e);if(o!==r){for(s=0;s<c;s++)n=a.get(o,s),a.set(o,s,a.get(r,s)),a.set(r,s,n);h=m[o],m[o]=m[r],m[r]=h,g=-g}if(r<f&&0!==a.get(r,r))for(e=r+1;e<f;e++)a.set(e,r,a.get(e,r)/a.get(r,r))}this.LU=a,this.pivotVector=m,this.pivotSign=g}isSingular(){let t=this.LU,e=t.columns;for(let r=0;r<e;r++)if(0===t.get(r,r))return!0;return!1}solve(t){t=E.checkMatrix(t);let e=this.LU;if(e.rows!==t.rows)throw new Error("Invalid matrix dimensions");if(this.isSingular())throw new Error("LU matrix is singular");let r,s,o,i=t.columns,n=t.subMatrixRow(this.pivotVector,0,i-1),h=e.columns;for(o=0;o<h;o++)for(r=o+1;r<h;r++)for(s=0;s<i;s++)n.set(r,s,n.get(r,s)-n.get(o,s)*e.get(r,o));for(o=h-1;o>=0;o--){for(s=0;s<i;s++)n.set(o,s,n.get(o,s)/e.get(o,o));for(r=0;r<o;r++)for(s=0;s<i;s++)n.set(r,s,n.get(r,s)-n.get(o,s)*e.get(r,o))}return n}get determinant(){let t=this.LU;if(!t.isSquare())throw new Error("Matrix must be square");let e=this.pivotSign,r=t.columns;for(let s=0;s<r;s++)e*=t.get(s,s);return e}get lowerTriangularMatrix(){let t=this.LU,e=t.rows,r=t.columns,s=new E(e,r);for(let o=0;o<e;o++)for(let e=0;e<r;e++)o>e?s.set(o,e,t.get(o,e)):o===e?s.set(o,e,1):s.set(o,e,0);return s}get upperTriangularMatrix(){let t=this.LU,e=t.rows,r=t.columns,s=new E(e,r);for(let o=0;o<e;o++)for(let e=0;e<r;e++)o<=e?s.set(o,e,t.get(o,e)):s.set(o,e,0);return s}get pivotPermutationVector(){return Array.from(this.pivotVector)}}function N(t,e){let r=0;return Math.abs(t)>Math.abs(e)?(r=e/t,Math.abs(t)*Math.sqrt(1+r*r)):0!==e?(r=t/e,Math.abs(e)*Math.sqrt(1+r*r)):0}class T{constructor(t){let e,r,s,o,i=(t=I.checkMatrix(t)).clone(),n=t.rows,h=t.columns,u=new Float64Array(h);for(s=0;s<h;s++){let t=0;for(e=s;e<n;e++)t=N(t,i.get(e,s));if(0!==t){for(i.get(s,s)<0&&(t=-t),e=s;e<n;e++)i.set(e,s,i.get(e,s)/t);for(i.set(s,s,i.get(s,s)+1),r=s+1;r<h;r++){for(o=0,e=s;e<n;e++)o+=i.get(e,s)*i.get(e,r);for(o=-o/i.get(s,s),e=s;e<n;e++)i.set(e,r,i.get(e,r)+o*i.get(e,s))}}u[s]=-t}this.QR=i,this.Rdiag=u}solve(t){t=E.checkMatrix(t);let e=this.QR,r=e.rows;if(t.rows!==r)throw new Error("Matrix row dimensions must agree");if(!this.isFullRank())throw new Error("Matrix is rank deficient");let s,o,i,n,h=t.columns,u=t.clone(),l=e.columns;for(i=0;i<l;i++)for(o=0;o<h;o++){for(n=0,s=i;s<r;s++)n+=e.get(s,i)*u.get(s,o);for(n=-n/e.get(i,i),s=i;s<r;s++)u.set(s,o,u.get(s,o)+n*e.get(s,i))}for(i=l-1;i>=0;i--){for(o=0;o<h;o++)u.set(i,o,u.get(i,o)/this.Rdiag[i]);for(s=0;s<i;s++)for(o=0;o<h;o++)u.set(s,o,u.get(s,o)-u.get(i,o)*e.get(s,i))}return u.subMatrix(0,l-1,0,h-1)}isFullRank(){let t=this.QR.columns;for(let e=0;e<t;e++)if(0===this.Rdiag[e])return!1;return!0}get upperTriangularMatrix(){let t,e,r=this.QR,s=r.columns,o=new E(s,s);for(t=0;t<s;t++)for(e=0;e<s;e++)t<e?o.set(t,e,r.get(t,e)):t===e?o.set(t,e,this.Rdiag[t]):o.set(t,e,0);return o}get orthogonalMatrix(){let t,e,r,s,o=this.QR,i=o.rows,n=o.columns,h=new E(i,n);for(r=n-1;r>=0;r--){for(t=0;t<i;t++)h.set(t,r,0);for(h.set(r,r,1),e=r;e<n;e++)if(0!==o.get(r,r)){for(s=0,t=r;t<i;t++)s+=o.get(t,r)*h.get(t,e);for(s=-s/o.get(r,r),t=r;t<i;t++)h.set(t,e,h.get(t,e)+s*o.get(t,r))}}return h}}class V{constructor(t,e={}){if((t=I.checkMatrix(t)).isEmpty())throw new Error("Matrix must be non-empty");let r=t.rows,s=t.columns;const{computeLeftSingularVectors:o=!0,computeRightSingularVectors:i=!0,autoTranspose:n=!1}=e;let h,u=Boolean(o),l=Boolean(i),a=!1;if(r<s)if(n){h=t.transpose(),r=h.rows,s=h.columns,a=!0;let e=u;u=l,l=e}else h=t.clone(),console.warn("Computing SVD on a matrix with more columns than rows. Consider enabling autoTranspose");else h=t.clone();let f=Math.min(r,s),c=Math.min(r+1,s),m=new Float64Array(c),g=new E(r,f),w=new E(s,s),p=new Float64Array(s),d=new Float64Array(r),M=new Float64Array(c);for(let t=0;t<c;t++)M[t]=t;let b=Math.min(r-1,s),y=Math.max(0,Math.min(s-2,r)),x=Math.max(b,y);for(let t=0;t<x;t++){if(t<b){m[t]=0;for(let e=t;e<r;e++)m[t]=N(m[t],h.get(e,t));if(0!==m[t]){h.get(t,t)<0&&(m[t]=-m[t]);for(let e=t;e<r;e++)h.set(e,t,h.get(e,t)/m[t]);h.set(t,t,h.get(t,t)+1)}m[t]=-m[t]}for(let e=t+1;e<s;e++){if(t<b&&0!==m[t]){let s=0;for(let o=t;o<r;o++)s+=h.get(o,t)*h.get(o,e);s=-s/h.get(t,t);for(let o=t;o<r;o++)h.set(o,e,h.get(o,e)+s*h.get(o,t))}p[e]=h.get(t,e)}if(u&&t<b)for(let e=t;e<r;e++)g.set(e,t,h.get(e,t));if(t<y){p[t]=0;for(let e=t+1;e<s;e++)p[t]=N(p[t],p[e]);if(0!==p[t]){p[t+1]<0&&(p[t]=0-p[t]);for(let e=t+1;e<s;e++)p[e]/=p[t];p[t+1]+=1}if(p[t]=-p[t],t+1<r&&0!==p[t]){for(let e=t+1;e<r;e++)d[e]=0;for(let e=t+1;e<r;e++)for(let r=t+1;r<s;r++)d[e]+=p[r]*h.get(e,r);for(let e=t+1;e<s;e++){let s=-p[e]/p[t+1];for(let o=t+1;o<r;o++)h.set(o,e,h.get(o,e)+s*d[o])}}if(l)for(let e=t+1;e<s;e++)w.set(e,t,p[e])}}let v=Math.min(s,r+1);if(b<s&&(m[b]=h.get(b,b)),r<v&&(m[v-1]=0),y+1<v&&(p[y]=h.get(y,v-1)),p[v-1]=0,u){for(let t=b;t<f;t++){for(let e=0;e<r;e++)g.set(e,t,0);g.set(t,t,1)}for(let t=b-1;t>=0;t--)if(0!==m[t]){for(let e=t+1;e<f;e++){let s=0;for(let o=t;o<r;o++)s+=g.get(o,t)*g.get(o,e);s=-s/g.get(t,t);for(let o=t;o<r;o++)g.set(o,e,g.get(o,e)+s*g.get(o,t))}for(let e=t;e<r;e++)g.set(e,t,-g.get(e,t));g.set(t,t,1+g.get(t,t));for(let e=0;e<t-1;e++)g.set(e,t,0)}else{for(let e=0;e<r;e++)g.set(e,t,0);g.set(t,t,1)}}if(l)for(let t=s-1;t>=0;t--){if(t<y&&0!==p[t])for(let e=t+1;e<s;e++){let r=0;for(let o=t+1;o<s;o++)r+=w.get(o,t)*w.get(o,e);r=-r/w.get(t+1,t);for(let o=t+1;o<s;o++)w.set(o,e,w.get(o,e)+r*w.get(o,t))}for(let e=0;e<s;e++)w.set(e,t,0);w.set(t,t,1)}let S=v-1,R=Number.EPSILON;for(;v>0;){let t,e;for(t=v-2;t>=-1&&-1!==t;t--){const e=Number.MIN_VALUE+R*Math.abs(m[t]+Math.abs(m[t+1]));if(Math.abs(p[t])<=e||Number.isNaN(p[t])){p[t]=0;break}}if(t===v-2)e=4;else{let r;for(r=v-1;r>=t&&r!==t;r--){let e=(r!==v?Math.abs(p[r]):0)+(r!==t+1?Math.abs(p[r-1]):0);if(Math.abs(m[r])<=R*e){m[r]=0;break}}r===t?e=3:r===v-1?e=1:(e=2,t=r)}switch(t++,e){case 1:{let e=p[v-2];p[v-2]=0;for(let r=v-2;r>=t;r--){let o=N(m[r],e),i=m[r]/o,n=e/o;if(m[r]=o,r!==t&&(e=-n*p[r-1],p[r-1]=i*p[r-1]),l)for(let t=0;t<s;t++)o=i*w.get(t,r)+n*w.get(t,v-1),w.set(t,v-1,-n*w.get(t,r)+i*w.get(t,v-1)),w.set(t,r,o)}break}case 2:{let e=p[t-1];p[t-1]=0;for(let s=t;s<v;s++){let o=N(m[s],e),i=m[s]/o,n=e/o;if(m[s]=o,e=-n*p[s],p[s]=i*p[s],u)for(let e=0;e<r;e++)o=i*g.get(e,s)+n*g.get(e,t-1),g.set(e,t-1,-n*g.get(e,s)+i*g.get(e,t-1)),g.set(e,s,o)}break}case 3:{const e=Math.max(Math.abs(m[v-1]),Math.abs(m[v-2]),Math.abs(p[v-2]),Math.abs(m[t]),Math.abs(p[t])),o=m[v-1]/e,i=m[v-2]/e,n=p[v-2]/e,h=m[t]/e,a=p[t]/e,f=((i+o)*(i-o)+n*n)/2,c=o*n*(o*n);let d=0;0===f&&0===c||(d=f<0?0-Math.sqrt(f*f+c):Math.sqrt(f*f+c),d=c/(f+d));let M=(h+o)*(h-o)+d,b=h*a;for(let e=t;e<v-1;e++){let o=N(M,b);0===o&&(o=Number.MIN_VALUE);let i=M/o,n=b/o;if(e!==t&&(p[e-1]=o),M=i*m[e]+n*p[e],p[e]=i*p[e]-n*m[e],b=n*m[e+1],m[e+1]=i*m[e+1],l)for(let t=0;t<s;t++)o=i*w.get(t,e)+n*w.get(t,e+1),w.set(t,e+1,-n*w.get(t,e)+i*w.get(t,e+1)),w.set(t,e,o);if(o=N(M,b),0===o&&(o=Number.MIN_VALUE),i=M/o,n=b/o,m[e]=o,M=i*p[e]+n*m[e+1],m[e+1]=-n*p[e]+i*m[e+1],b=n*p[e+1],p[e+1]=i*p[e+1],u&&e<r-1)for(let t=0;t<r;t++)o=i*g.get(t,e)+n*g.get(t,e+1),g.set(t,e+1,-n*g.get(t,e)+i*g.get(t,e+1)),g.set(t,e,o)}p[v-2]=M;break}case 4:if(m[t]<=0&&(m[t]=m[t]<0?-m[t]:0,l))for(let e=0;e<=S;e++)w.set(e,t,-w.get(e,t));for(;t<S&&!(m[t]>=m[t+1]);){let e=m[t];if(m[t]=m[t+1],m[t+1]=e,l&&t<s-1)for(let r=0;r<s;r++)e=w.get(r,t+1),w.set(r,t+1,w.get(r,t)),w.set(r,t,e);if(u&&t<r-1)for(let s=0;s<r;s++)e=g.get(s,t+1),g.set(s,t+1,g.get(s,t)),g.set(s,t,e);t++}v--}}if(a){let t=w;w=g,g=t}this.m=r,this.n=s,this.s=m,this.U=g,this.V=w}solve(t){let e=t,r=this.threshold,s=this.s.length,o=E.zeros(s,s);for(let t=0;t<s;t++)Math.abs(this.s[t])<=r?o.set(t,t,0):o.set(t,t,1/this.s[t]);let i=this.U,n=this.rightSingularVectors,h=n.mmul(o),u=n.rows,l=i.rows,a=E.zeros(u,l);for(let t=0;t<u;t++)for(let e=0;e<l;e++){let r=0;for(let o=0;o<s;o++)r+=h.get(t,o)*i.get(e,o);a.set(t,e,r)}return a.mmul(e)}solveForDiagonal(t){return this.solve(E.diag(t))}inverse(){let t=this.V,e=this.threshold,r=t.rows,s=t.columns,o=new E(r,this.s.length);for(let i=0;i<r;i++)for(let r=0;r<s;r++)Math.abs(this.s[r])>e&&o.set(i,r,t.get(i,r)/this.s[r]);let i=this.U,n=i.rows,h=i.columns,u=new E(r,n);for(let t=0;t<r;t++)for(let e=0;e<n;e++){let r=0;for(let s=0;s<h;s++)r+=o.get(t,s)*i.get(e,s);u.set(t,e,r)}return u}get condition(){return this.s[0]/this.s[Math.min(this.m,this.n)-1]}get norm2(){return this.s[0]}get rank(){let t=Math.max(this.m,this.n)*this.s[0]*Number.EPSILON,e=0,r=this.s;for(let s=0,o=r.length;s<o;s++)r[s]>t&&e++;return e}get diagonal(){return Array.from(this.s)}get threshold(){return Number.EPSILON/2*Math.max(this.m,this.n)*this.s[0]}get leftSingularVectors(){return this.U}get rightSingularVectors(){return this.V}get diagonalMatrix(){return E.diag(this.s)}}function q(t,e,r=!1){return t=I.checkMatrix(t),e=I.checkMatrix(e),r?new V(t).solve(e):t.isSquare()?new k(t).solve(e):new T(t).solve(e)}function A(t,e){let r=[];for(let s=0;s<t;s++)s!==e&&r.push(s);return r}function C(t,e,r,s=1e-9,o=1e-9){if(t>o)return new Array(e.rows+1).fill(0);{let t=e.addRow(r,[0]);for(let e=0;e<t.rows;e++)Math.abs(t.get(e,0))<s&&t.set(e,0,0);return t.to1DArray()}}class F{constructor(t,e={}){const{assumeSymmetric:r=!1}=e;if(!(t=I.checkMatrix(t)).isSquare())throw new Error("Matrix is not a square matrix");if(t.isEmpty())throw new Error("Matrix must be non-empty");let s,o,i=t.columns,n=new E(i,i),h=new Float64Array(i),u=new Float64Array(i),l=t,a=!1;if(a=!!r||t.isSymmetric(),a){for(s=0;s<i;s++)for(o=0;o<i;o++)n.set(s,o,l.get(s,o));!function(t,e,r,s){let o,i,n,h,u,l,a,f;for(u=0;u<t;u++)r[u]=s.get(t-1,u);for(h=t-1;h>0;h--){for(f=0,n=0,l=0;l<h;l++)f+=Math.abs(r[l]);if(0===f)for(e[h]=r[h-1],u=0;u<h;u++)r[u]=s.get(h-1,u),s.set(h,u,0),s.set(u,h,0);else{for(l=0;l<h;l++)r[l]/=f,n+=r[l]*r[l];for(o=r[h-1],i=Math.sqrt(n),o>0&&(i=-i),e[h]=f*i,n-=o*i,r[h-1]=o-i,u=0;u<h;u++)e[u]=0;for(u=0;u<h;u++){for(o=r[u],s.set(u,h,o),i=e[u]+s.get(u,u)*o,l=u+1;l<=h-1;l++)i+=s.get(l,u)*r[l],e[l]+=s.get(l,u)*o;e[u]=i}for(o=0,u=0;u<h;u++)e[u]/=n,o+=e[u]*r[u];for(a=o/(n+n),u=0;u<h;u++)e[u]-=a*r[u];for(u=0;u<h;u++){for(o=r[u],i=e[u],l=u;l<=h-1;l++)s.set(l,u,s.get(l,u)-(o*e[l]+i*r[l]));r[u]=s.get(h-1,u),s.set(h,u,0)}}r[h]=n}for(h=0;h<t-1;h++){if(s.set(t-1,h,s.get(h,h)),s.set(h,h,1),n=r[h+1],0!==n){for(l=0;l<=h;l++)r[l]=s.get(l,h+1)/n;for(u=0;u<=h;u++){for(i=0,l=0;l<=h;l++)i+=s.get(l,h+1)*s.get(l,u);for(l=0;l<=h;l++)s.set(l,u,s.get(l,u)-i*r[l])}}for(l=0;l<=h;l++)s.set(l,h+1,0)}for(u=0;u<t;u++)r[u]=s.get(t-1,u),s.set(t-1,u,0);s.set(t-1,t-1,1),e[0]=0}(i,u,h,n),function(t,e,r,s){let o,i,n,h,u,l,a,f,c,m,g,w,p,d,M,b;for(n=1;n<t;n++)e[n-1]=e[n];e[t-1]=0;let y=0,x=0,E=Number.EPSILON;for(l=0;l<t;l++){for(x=Math.max(x,Math.abs(r[l])+Math.abs(e[l])),a=l;a<t&&!(Math.abs(e[a])<=E*x);)a++;if(a>l)do{for(o=r[l],f=(r[l+1]-o)/(2*e[l]),c=N(f,1),f<0&&(c=-c),r[l]=e[l]/(f+c),r[l+1]=e[l]*(f+c),m=r[l+1],i=o-r[l],n=l+2;n<t;n++)r[n]-=i;for(y+=i,f=r[a],g=1,w=g,p=g,d=e[l+1],M=0,b=0,n=a-1;n>=l;n--)for(p=w,w=g,b=M,o=g*e[n],i=g*f,c=N(f,e[n]),e[n+1]=M*c,M=e[n]/c,g=f/c,f=g*r[n]-M*o,r[n+1]=i+M*(g*o+M*r[n]),u=0;u<t;u++)i=s.get(u,n+1),s.set(u,n+1,M*s.get(u,n)+g*i),s.set(u,n,g*s.get(u,n)-M*i);f=-M*b*p*d*e[l]/m,e[l]=M*f,r[l]=g*f}while(Math.abs(e[l])>E*x);r[l]=r[l]+y,e[l]=0}for(n=0;n<t-1;n++){for(u=n,f=r[n],h=n+1;h<t;h++)r[h]<f&&(u=h,f=r[h]);if(u!==n)for(r[u]=r[n],r[n]=f,h=0;h<t;h++)f=s.get(h,n),s.set(h,n,s.get(h,u)),s.set(h,u,f)}}(i,u,h,n)}else{let t=new E(i,i),e=new Float64Array(i);for(o=0;o<i;o++)for(s=0;s<i;s++)t.set(s,o,l.get(s,o));!function(t,e,r,s){let o,i,n,h,u,l,a,f=0,c=t-1;for(l=f+1;l<=c-1;l++){for(a=0,h=l;h<=c;h++)a+=Math.abs(e.get(h,l-1));if(0!==a){for(n=0,h=c;h>=l;h--)r[h]=e.get(h,l-1)/a,n+=r[h]*r[h];for(i=Math.sqrt(n),r[l]>0&&(i=-i),n-=r[l]*i,r[l]=r[l]-i,u=l;u<t;u++){for(o=0,h=c;h>=l;h--)o+=r[h]*e.get(h,u);for(o/=n,h=l;h<=c;h++)e.set(h,u,e.get(h,u)-o*r[h])}for(h=0;h<=c;h++){for(o=0,u=c;u>=l;u--)o+=r[u]*e.get(h,u);for(o/=n,u=l;u<=c;u++)e.set(h,u,e.get(h,u)-o*r[u])}r[l]=a*r[l],e.set(l,l-1,a*i)}}for(h=0;h<t;h++)for(u=0;u<t;u++)s.set(h,u,h===u?1:0);for(l=c-1;l>=f+1;l--)if(0!==e.get(l,l-1)){for(h=l+1;h<=c;h++)r[h]=e.get(h,l-1);for(u=l;u<=c;u++){for(i=0,h=l;h<=c;h++)i+=r[h]*s.get(h,u);for(i=i/r[l]/e.get(l,l-1),h=l;h<=c;h++)s.set(h,u,s.get(h,u)+i*r[h])}}}(i,t,e,n),function(t,e,r,s,o){let i,n,h,u,l,a,f,c,m,g,w,p,d,M,b,y=t-1,x=0,E=t-1,v=Number.EPSILON,S=0,R=0,I=0,k=0,N=0,T=0,V=0,q=0;for(i=0;i<t;i++)for((i<x||i>E)&&(r[i]=o.get(i,i),e[i]=0),n=Math.max(i-1,0);n<t;n++)R+=Math.abs(o.get(i,n));for(;y>=x;){for(u=y;u>x&&(T=Math.abs(o.get(u-1,u-1))+Math.abs(o.get(u,u)),0===T&&(T=R),!(Math.abs(o.get(u,u-1))<v*T));)u--;if(u===y)o.set(y,y,o.get(y,y)+S),r[y]=o.get(y,y),e[y]=0,y--,q=0;else if(u===y-1){if(f=o.get(y,y-1)*o.get(y-1,y),I=(o.get(y-1,y-1)-o.get(y,y))/2,k=I*I+f,V=Math.sqrt(Math.abs(k)),o.set(y,y,o.get(y,y)+S),o.set(y-1,y-1,o.get(y-1,y-1)+S),c=o.get(y,y),k>=0){for(V=I>=0?I+V:I-V,r[y-1]=c+V,r[y]=r[y-1],0!==V&&(r[y]=c-f/V),e[y-1]=0,e[y]=0,c=o.get(y,y-1),T=Math.abs(c)+Math.abs(V),I=c/T,k=V/T,N=Math.sqrt(I*I+k*k),I/=N,k/=N,n=y-1;n<t;n++)V=o.get(y-1,n),o.set(y-1,n,k*V+I*o.get(y,n)),o.set(y,n,k*o.get(y,n)-I*V);for(i=0;i<=y;i++)V=o.get(i,y-1),o.set(i,y-1,k*V+I*o.get(i,y)),o.set(i,y,k*o.get(i,y)-I*V);for(i=x;i<=E;i++)V=s.get(i,y-1),s.set(i,y-1,k*V+I*s.get(i,y)),s.set(i,y,k*s.get(i,y)-I*V)}else r[y-1]=c+I,r[y]=c+I,e[y-1]=V,e[y]=-V;y-=2,q=0}else{if(c=o.get(y,y),m=0,f=0,u<y&&(m=o.get(y-1,y-1),f=o.get(y,y-1)*o.get(y-1,y)),10===q){for(S+=c,i=x;i<=y;i++)o.set(i,i,o.get(i,i)-c);T=Math.abs(o.get(y,y-1))+Math.abs(o.get(y-1,y-2)),c=m=.75*T,f=-.4375*T*T}if(30===q&&(T=(m-c)/2,T=T*T+f,T>0)){for(T=Math.sqrt(T),m<c&&(T=-T),T=c-f/((m-c)/2+T),i=x;i<=y;i++)o.set(i,i,o.get(i,i)-T);S+=T,c=m=f=.964}for(q+=1,l=y-2;l>=u&&(V=o.get(l,l),N=c-V,T=m-V,I=(N*T-f)/o.get(l+1,l)+o.get(l,l+1),k=o.get(l+1,l+1)-V-N-T,N=o.get(l+2,l+1),T=Math.abs(I)+Math.abs(k)+Math.abs(N),I/=T,k/=T,N/=T,l!==u)&&!(Math.abs(o.get(l,l-1))*(Math.abs(k)+Math.abs(N))<v*(Math.abs(I)*(Math.abs(o.get(l-1,l-1))+Math.abs(V)+Math.abs(o.get(l+1,l+1)))));)l--;for(i=l+2;i<=y;i++)o.set(i,i-2,0),i>l+2&&o.set(i,i-3,0);for(h=l;h<=y-1&&(M=h!==y-1,h!==l&&(I=o.get(h,h-1),k=o.get(h+1,h-1),N=M?o.get(h+2,h-1):0,c=Math.abs(I)+Math.abs(k)+Math.abs(N),0!==c&&(I/=c,k/=c,N/=c)),0!==c);h++)if(T=Math.sqrt(I*I+k*k+N*N),I<0&&(T=-T),0!==T){for(h!==l?o.set(h,h-1,-T*c):u!==l&&o.set(h,h-1,-o.get(h,h-1)),I+=T,c=I/T,m=k/T,V=N/T,k/=I,N/=I,n=h;n<t;n++)I=o.get(h,n)+k*o.get(h+1,n),M&&(I+=N*o.get(h+2,n),o.set(h+2,n,o.get(h+2,n)-I*V)),o.set(h,n,o.get(h,n)-I*c),o.set(h+1,n,o.get(h+1,n)-I*m);for(i=0;i<=Math.min(y,h+3);i++)I=c*o.get(i,h)+m*o.get(i,h+1),M&&(I+=V*o.get(i,h+2),o.set(i,h+2,o.get(i,h+2)-I*N)),o.set(i,h,o.get(i,h)-I),o.set(i,h+1,o.get(i,h+1)-I*k);for(i=x;i<=E;i++)I=c*s.get(i,h)+m*s.get(i,h+1),M&&(I+=V*s.get(i,h+2),s.set(i,h+2,s.get(i,h+2)-I*N)),s.set(i,h,s.get(i,h)-I),s.set(i,h+1,s.get(i,h+1)-I*k)}}}if(0===R)return;for(y=t-1;y>=0;y--)if(I=r[y],k=e[y],0===k)for(u=y,o.set(y,y,1),i=y-1;i>=0;i--){for(f=o.get(i,i)-I,N=0,n=u;n<=y;n++)N+=o.get(i,n)*o.get(n,y);if(e[i]<0)V=f,T=N;else if(u=i,0===e[i]?o.set(i,y,0!==f?-N/f:-N/(v*R)):(c=o.get(i,i+1),m=o.get(i+1,i),k=(r[i]-I)*(r[i]-I)+e[i]*e[i],a=(c*T-V*N)/k,o.set(i,y,a),o.set(i+1,y,Math.abs(c)>Math.abs(V)?(-N-f*a)/c:(-T-m*a)/V)),a=Math.abs(o.get(i,y)),v*a*a>1)for(n=i;n<=y;n++)o.set(n,y,o.get(n,y)/a)}else if(k<0)for(u=y-1,Math.abs(o.get(y,y-1))>Math.abs(o.get(y-1,y))?(o.set(y-1,y-1,k/o.get(y,y-1)),o.set(y-1,y,-(o.get(y,y)-I)/o.get(y,y-1))):(b=D(0,-o.get(y-1,y),o.get(y-1,y-1)-I,k),o.set(y-1,y-1,b[0]),o.set(y-1,y,b[1])),o.set(y,y-1,0),o.set(y,y,1),i=y-2;i>=0;i--){for(g=0,w=0,n=u;n<=y;n++)g+=o.get(i,n)*o.get(n,y-1),w+=o.get(i,n)*o.get(n,y);if(f=o.get(i,i)-I,e[i]<0)V=f,N=g,T=w;else if(u=i,0===e[i]?(b=D(-g,-w,f,k),o.set(i,y-1,b[0]),o.set(i,y,b[1])):(c=o.get(i,i+1),m=o.get(i+1,i),p=(r[i]-I)*(r[i]-I)+e[i]*e[i]-k*k,d=2*(r[i]-I)*k,0===p&&0===d&&(p=v*R*(Math.abs(f)+Math.abs(k)+Math.abs(c)+Math.abs(m)+Math.abs(V))),b=D(c*N-V*g+k*w,c*T-V*w-k*g,p,d),o.set(i,y-1,b[0]),o.set(i,y,b[1]),Math.abs(c)>Math.abs(V)+Math.abs(k)?(o.set(i+1,y-1,(-g-f*o.get(i,y-1)+k*o.get(i,y))/c),o.set(i+1,y,(-w-f*o.get(i,y)-k*o.get(i,y-1))/c)):(b=D(-N-m*o.get(i,y-1),-T-m*o.get(i,y),V,k),o.set(i+1,y-1,b[0]),o.set(i+1,y,b[1]))),a=Math.max(Math.abs(o.get(i,y-1)),Math.abs(o.get(i,y))),v*a*a>1)for(n=i;n<=y;n++)o.set(n,y-1,o.get(n,y-1)/a),o.set(n,y,o.get(n,y)/a)}for(i=0;i<t;i++)if(i<x||i>E)for(n=i;n<t;n++)s.set(i,n,o.get(i,n));for(n=t-1;n>=x;n--)for(i=x;i<=E;i++){for(V=0,h=x;h<=Math.min(n,E);h++)V+=s.get(i,h)*o.get(h,n);s.set(i,n,V)}}(i,u,h,n,t)}this.n=i,this.e=u,this.d=h,this.V=n}get realEigenvalues(){return Array.from(this.d)}get imaginaryEigenvalues(){return Array.from(this.e)}get eigenvectorMatrix(){return this.V}get diagonalMatrix(){let t,e,r=this.n,s=this.e,o=this.d,i=new E(r,r);for(t=0;t<r;t++){for(e=0;e<r;e++)i.set(t,e,0);i.set(t,t,o[t]),s[t]>0?i.set(t,t+1,s[t]):s[t]<0&&i.set(t,t-1,s[t])}return i}}function D(t,e,r,s){let o,i;return Math.abs(r)>Math.abs(s)?(o=s/r,i=r+o*s,[(t+o*e)/i,(e-o*t)/i]):(o=r/s,i=s+o*r,[(o*t+e)/i,(o*e-t)/i])}class ${constructor(t){if(!(t=I.checkMatrix(t)).isSymmetric())throw new Error("Matrix is not symmetric");let e,r,s,o=t,i=o.rows,n=new E(i,i),h=!0;for(r=0;r<i;r++){let t=0;for(s=0;s<r;s++){let i=0;for(e=0;e<s;e++)i+=n.get(s,e)*n.get(r,e);i=(o.get(r,s)-i)/n.get(s,s),n.set(r,s,i),t+=i*i}for(t=o.get(r,r)-t,h&=t>0,n.set(r,r,Math.sqrt(Math.max(t,0))),s=r+1;s<i;s++)n.set(r,s,0)}this.L=n,this.positiveDefinite=Boolean(h)}isPositiveDefinite(){return this.positiveDefinite}solve(t){t=I.checkMatrix(t);let e=this.L,r=e.rows;if(t.rows!==r)throw new Error("Matrix dimensions do not match");if(!1===this.isPositiveDefinite())throw new Error("Matrix is not positive definite");let s,o,i,n=t.columns,h=t.clone();for(i=0;i<r;i++)for(o=0;o<n;o++){for(s=0;s<i;s++)h.set(i,o,h.get(i,o)-h.get(s,o)*e.get(i,s));h.set(i,o,h.get(i,o)/e.get(i,i))}for(i=r-1;i>=0;i--)for(o=0;o<n;o++){for(s=i+1;s<r;s++)h.set(i,o,h.get(i,o)-h.get(s,o)*e.get(s,i));h.set(i,o,h.get(i,o)/e.get(i,i))}return h}get lowerTriangularMatrix(){return this.L}}class j{constructor(t,e={}){t=I.checkMatrix(t);let{Y:s}=e;const{scaleScores:o=!1,maxIterations:i=1e3,terminationCriteria:n=1e-10}=e;let h;if(s){if(s=r(s)&&"number"==typeof s[0]?E.columnVector(s):I.checkMatrix(s),s.rows!==t.rows)throw new Error("Y should have the same number of rows as X");h=s.getColumnVector(0)}else h=t.getColumnVector(0);let u,l,a,f,c=1;for(let e=0;e<i&&c>n;e++)a=t.transpose().mmul(h).div(h.transpose().mmul(h).get(0,0)),a=a.div(a.norm()),u=t.mmul(a).div(a.transpose().mmul(a).get(0,0)),e>0&&(c=u.clone().sub(f).pow(2).sum()),f=u.clone(),s?(l=s.transpose().mmul(u).div(u.transpose().mmul(u).get(0,0)),l=l.div(l.norm()),h=s.mmul(l).div(l.transpose().mmul(l).get(0,0))):h=u;if(s){let e=t.transpose().mmul(u).div(u.transpose().mmul(u).get(0,0));e=e.div(e.norm());let r=t.clone().sub(u.clone().mmul(e.transpose())),o=h.transpose().mmul(u).div(u.transpose().mmul(u).get(0,0)),i=s.clone().sub(u.clone().mulS(o.get(0,0)).mmul(l.transpose()));this.t=u,this.p=e.transpose(),this.w=a.transpose(),this.q=l,this.u=h,this.s=u.transpose().mmul(u),this.xResidual=r,this.yResidual=i,this.betas=o}else this.w=a.transpose(),this.s=u.transpose().mmul(u).sqrt(),this.t=o?u.clone().div(this.s.get(0,0)):u,this.xResidual=t.sub(u.mmul(a.transpose()))}}t.AbstractMatrix=y,t.CHO=$,t.CholeskyDecomposition=$,t.EVD=F,t.EigenvalueDecomposition=F,t.LU=k,t.LuDecomposition=k,t.Matrix=E,t.MatrixColumnSelectionView=class extends v{constructor(t,e){w(t,e),super(t,t.rows,e.length),this.columnIndices=e}set(t,e,r){return this.matrix.set(t,this.columnIndices[e],r),this}get(t,e){return this.matrix.get(t,this.columnIndices[e])}},t.MatrixColumnView=class extends v{constructor(t,e){f(t,e),super(t,t.rows,1),this.column=e}set(t,e,r){return this.matrix.set(t,this.column,r),this}get(t){return this.matrix.get(t,this.column)}},t.MatrixFlipColumnView=class extends v{constructor(t){super(t,t.rows,t.columns)}set(t,e,r){return this.matrix.set(t,this.columns-e-1,r),this}get(t,e){return this.matrix.get(t,this.columns-e-1)}},t.MatrixFlipRowView=class extends v{constructor(t){super(t,t.rows,t.columns)}set(t,e,r){return this.matrix.set(this.rows-t-1,e,r),this}get(t,e){return this.matrix.get(this.rows-t-1,e)}},t.MatrixRowSelectionView=class extends v{constructor(t,e){g(t,e),super(t,e.length,t.columns),this.rowIndices=e}set(t,e,r){return this.matrix.set(this.rowIndices[t],e,r),this}get(t,e){return this.matrix.get(this.rowIndices[t],e)}},t.MatrixRowView=class extends v{constructor(t,e){a(t,e),super(t,1,t.columns),this.row=e}set(t,e,r){return this.matrix.set(this.row,e,r),this}get(t,e){return this.matrix.get(this.row,e)}},t.MatrixSelectionView=S,t.MatrixSubView=class extends v{constructor(t,e,r,s,o){p(t,e,r,s,o),super(t,r-e+1,o-s+1),this.startRow=e,this.startColumn=s}set(t,e,r){return this.matrix.set(this.startRow+t,this.startColumn+e,r),this}get(t,e){return this.matrix.get(this.startRow+t,this.startColumn+e)}},t.MatrixTransposeView=class extends v{constructor(t){super(t,t.columns,t.rows)}set(t,e,r){return this.matrix.set(e,t,r),this}get(t,e){return this.matrix.get(e,t)}},t.NIPALS=j,t.Nipals=j,t.QR=T,t.QrDecomposition=T,t.SVD=V,t.SingularValueDecomposition=V,t.WrapperMatrix1D=R,t.WrapperMatrix2D=I,t.correlation=function(t,e=t,s={}){t=new E(t);let o=!1;if("object"!=typeof e||E.isMatrix(e)||r(e)?e=new E(e):(s=e,e=t,o=!0),t.rows!==e.rows)throw new TypeError("Both matrices must have the same number of rows");const{center:i=!0,scale:n=!0}=s;i&&(t.center("column"),o||e.center("column")),n&&(t.scale("column"),o||e.scale("column"));const h=t.standardDeviation("column",{unbiased:!0}),u=o?h:e.standardDeviation("column",{unbiased:!0}),l=t.transpose().mmul(e);for(let e=0;e<l.rows;e++)for(let r=0;r<l.columns;r++)l.set(e,r,l.get(e,r)*(1/(h[e]*u[r]))*(1/(t.rows-1)));return l},t.covariance=function(t,e=t,s={}){t=new E(t);let o=!1;if("object"!=typeof e||E.isMatrix(e)||r(e)?e=new E(e):(s=e,e=t,o=!0),t.rows!==e.rows)throw new TypeError("Both matrices must have the same number of rows");const{center:i=!0}=s;i&&(t=t.center("column"),o||(e=e.center("column")));const n=t.transpose().mmul(e);for(let e=0;e<n.rows;e++)for(let r=0;r<n.columns;r++)n.set(e,r,n.get(e,r)*(1/(t.rows-1)));return n},t.default=E,t.determinant=function t(e){if((e=E.checkMatrix(e)).isSquare()){if(0===e.columns)return 1;let r,s,o,i;if(2===e.columns)return r=e.get(0,0),s=e.get(0,1),o=e.get(1,0),i=e.get(1,1),r*i-s*o;if(3===e.columns){let i,n,h;return i=new S(e,[1,2],[1,2]),n=new S(e,[1,2],[0,2]),h=new S(e,[1,2],[0,1]),r=e.get(0,0),s=e.get(0,1),o=e.get(0,2),r*t(i)-s*t(n)+o*t(h)}return new k(e).determinant}throw Error("determinant can only be calculated for a square matrix")},t.inverse=function(t,e=!1){return t=I.checkMatrix(t),e?new V(t).inverse():q(t,E.eye(t.rows))},t.linearDependencies=function(t,e={}){const{thresholdValue:r=1e-9,thresholdError:s=1e-9}=e;let o=(t=E.checkMatrix(t)).rows,i=new E(o,o);for(let e=0;e<o;e++){let n=E.columnVector(t.getRow(e)),h=t.subMatrixRow(A(o,e)).transpose(),u=new V(h).solve(n),l=E.sub(n,h.mmul(u)).abs().max();i.setRow(e,C(l,u,e,r,s))}return i},t.pseudoInverse=function(t,e=Number.EPSILON){if((t=E.checkMatrix(t)).isEmpty())return t.transpose();let r=new V(t,{autoTranspose:!0}),s=r.leftSingularVectors,o=r.rightSingularVectors,i=r.diagonal;for(let t=0;t<i.length;t++)Math.abs(i[t])>e?i[t]=1/i[t]:i[t]=0;return o.mmul(E.diag(i).mmul(s.transpose()))},t.solve=q,t.wrap=function(t,e){if(r(t))return t[0]&&r(t[0])?new I(t):new R(t,e);throw new Error("the argument is not an array")},Object.defineProperty(t,"__esModule",{value:!0})}));
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).mlMatrix={})}(this,(function(t){"use strict";const e=Object.prototype.toString;function r(t){return e.call(t).endsWith("Array]")}function s(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!r(t))throw new TypeError("input must be an array");if(0===t.length)throw new TypeError("input must not be empty");var s=e.fromIndex,o=void 0===s?0:s,i=e.toIndex,n=void 0===i?t.length:i;if(o<0||o>=t.length||!Number.isInteger(o))throw new Error("fromIndex must be a positive integer smaller than length");if(n<=o||n>t.length||!Number.isInteger(n))throw new Error("toIndex must be an integer greater than fromIndex and at most equal to length");for(var h=t[o],u=o+1;u<n;u++)t[u]>h&&(h=t[u]);return h}function o(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!r(t))throw new TypeError("input must be an array");if(0===t.length)throw new TypeError("input must not be empty");var s=e.fromIndex,o=void 0===s?0:s,i=e.toIndex,n=void 0===i?t.length:i;if(o<0||o>=t.length||!Number.isInteger(o))throw new Error("fromIndex must be a positive integer smaller than length");if(n<=o||n>t.length||!Number.isInteger(n))throw new Error("toIndex must be an integer greater than fromIndex and at most equal to length");for(var h=t[o],u=o+1;u<n;u++)t[u]<h&&(h=t[u]);return h}function i(t){var e,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!r(t))throw new TypeError("input must be an array");if(0===t.length)throw new TypeError("input must not be empty");if(void 0!==i.output){if(!r(i.output))throw new TypeError("output option must be an array if specified");e=i.output}else e=new Array(t.length);var n=o(t),h=s(t);if(n===h)throw new RangeError("minimum and maximum input values are equal. Cannot rescale a constant array");var u=i.min,l=void 0===u?i.autoMinMax?n:0:u,a=i.max,f=void 0===a?i.autoMinMax?h:1:a;if(l>=f)throw new RangeError("min option must be smaller than max option");for(var c=(f-l)/(h-n),m=0;m<t.length;m++)e[m]=(t[m]-n)*c+l;return e}const n=" ".repeat(2),h=" ".repeat(4);function u(t,e={}){const{maxRows:r=15,maxColumns:s=10,maxNumSize:o=8,padMinus:i="auto"}=e;return`${t.constructor.name} {\n${n}[\n${h}${function(t,e,r,s,o){const{rows:i,columns:n}=t,u=Math.min(i,e),a=Math.min(n,r),f=[];if("auto"===o){o=!1;t:for(let e=0;e<u;e++)for(let r=0;r<a;r++)if(t.get(e,r)<0){o=!0;break t}}for(let e=0;e<u;e++){let r=[];for(let i=0;i<a;i++)r.push(l(t.get(e,i),s,o));f.push(`${r.join(" ")}`)}a!==n&&(f[f.length-1]+=` ... ${n-r} more columns`);u!==i&&f.push(`... ${i-e} more rows`);return f.join(`\n${h}`)}(t,r,s,o,i)}\n${n}]\n${n}rows: ${t.rows}\n${n}columns: ${t.columns}\n}`}function l(t,e,r){return(t>=0&&r?` ${a(t,e-1)}`:a(t,e)).padEnd(e)}function a(t,e){let r=t.toString();if(r.length<=e)return r;let s=t.toFixed(e);if(s.length>e&&(s=t.toFixed(Math.max(0,e-(s.length-e)))),s.length<=e&&!s.startsWith("0.000")&&!s.startsWith("-0.000"))return s;let o=t.toExponential(e);return o.length>e&&(o=t.toExponential(Math.max(0,e-(o.length-e)))),o.slice(0)}function f(t,e,r){let s=r?t.rows:t.rows-1;if(e<0||e>s)throw new RangeError("Row index out of range")}function c(t,e,r){let s=r?t.columns:t.columns-1;if(e<0||e>s)throw new RangeError("Column index out of range")}function m(t,e){if(e.to1DArray&&(e=e.to1DArray()),e.length!==t.columns)throw new RangeError("vector size must be the same as the number of columns");return e}function g(t,e){if(e.to1DArray&&(e=e.to1DArray()),e.length!==t.rows)throw new RangeError("vector size must be the same as the number of rows");return e}function w(t,e){if(!r(e))throw new TypeError("row indices must be an array");for(let r=0;r<e.length;r++)if(e[r]<0||e[r]>=t.rows)throw new RangeError("row indices are out of range")}function p(t,e){if(!r(e))throw new TypeError("column indices must be an array");for(let r=0;r<e.length;r++)if(e[r]<0||e[r]>=t.columns)throw new RangeError("column indices are out of range")}function d(t,e,r,s,o){if(5!==arguments.length)throw new RangeError("expected 4 arguments");if(b("startRow",e),b("endRow",r),b("startColumn",s),b("endColumn",o),e>r||s>o||e<0||e>=t.rows||r<0||r>=t.rows||s<0||s>=t.columns||o<0||o>=t.columns)throw new RangeError("Submatrix indices are out of range")}function M(t,e=0){let r=[];for(let s=0;s<t;s++)r.push(e);return r}function b(t,e){if("number"!=typeof e)throw new TypeError(`${t} must be a number`)}function y(t){if(t.isEmpty())throw new Error("Empty matrix has no elements to index")}class x{static from1DArray(t,e,r){if(t*e!==r.length)throw new RangeError("data length does not match given dimensions");let s=new v(t,e);for(let o=0;o<t;o++)for(let t=0;t<e;t++)s.set(o,t,r[o*e+t]);return s}static rowVector(t){let e=new v(1,t.length);for(let r=0;r<t.length;r++)e.set(0,r,t[r]);return e}static columnVector(t){let e=new v(t.length,1);for(let r=0;r<t.length;r++)e.set(r,0,t[r]);return e}static zeros(t,e){return new v(t,e)}static ones(t,e){return new v(t,e).fill(1)}static rand(t,e,r={}){if("object"!=typeof r)throw new TypeError("options must be an object");const{random:s=Math.random}=r;let o=new v(t,e);for(let r=0;r<t;r++)for(let t=0;t<e;t++)o.set(r,t,s());return o}static randInt(t,e,r={}){if("object"!=typeof r)throw new TypeError("options must be an object");const{min:s=0,max:o=1e3,random:i=Math.random}=r;if(!Number.isInteger(s))throw new TypeError("min must be an integer");if(!Number.isInteger(o))throw new TypeError("max must be an integer");if(s>=o)throw new RangeError("min must be smaller than max");let n=o-s,h=new v(t,e);for(let r=0;r<t;r++)for(let t=0;t<e;t++){let e=s+Math.round(i()*n);h.set(r,t,e)}return h}static eye(t,e,r){void 0===e&&(e=t),void 0===r&&(r=1);let s=Math.min(t,e),o=this.zeros(t,e);for(let t=0;t<s;t++)o.set(t,t,r);return o}static diag(t,e,r){let s=t.length;void 0===e&&(e=s),void 0===r&&(r=e);let o=Math.min(s,e,r),i=this.zeros(e,r);for(let e=0;e<o;e++)i.set(e,e,t[e]);return i}static min(t,e){t=this.checkMatrix(t),e=this.checkMatrix(e);let r=t.rows,s=t.columns,o=new v(r,s);for(let i=0;i<r;i++)for(let r=0;r<s;r++)o.set(i,r,Math.min(t.get(i,r),e.get(i,r)));return o}static max(t,e){t=this.checkMatrix(t),e=this.checkMatrix(e);let r=t.rows,s=t.columns,o=new this(r,s);for(let i=0;i<r;i++)for(let r=0;r<s;r++)o.set(i,r,Math.max(t.get(i,r),e.get(i,r)));return o}static checkMatrix(t){return x.isMatrix(t)?t:new v(t)}static isMatrix(t){return null!=t&&"Matrix"===t.klass}get size(){return this.rows*this.columns}apply(t){if("function"!=typeof t)throw new TypeError("callback must be a function");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)t.call(this,e,r);return this}to1DArray(){let t=[];for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)t.push(this.get(e,r));return t}to2DArray(){let t=[];for(let e=0;e<this.rows;e++){t.push([]);for(let r=0;r<this.columns;r++)t[e].push(this.get(e,r))}return t}toJSON(){return this.to2DArray()}isRowVector(){return 1===this.rows}isColumnVector(){return 1===this.columns}isVector(){return 1===this.rows||1===this.columns}isSquare(){return this.rows===this.columns}isEmpty(){return 0===this.rows||0===this.columns}isSymmetric(){if(this.isSquare()){for(let t=0;t<this.rows;t++)for(let e=0;e<=t;e++)if(this.get(t,e)!==this.get(e,t))return!1;return!0}return!1}isEchelonForm(){let t=0,e=0,r=-1,s=!0,o=!1;for(;t<this.rows&&s;){for(e=0,o=!1;e<this.columns&&!1===o;)0===this.get(t,e)?e++:1===this.get(t,e)&&e>r?(o=!0,r=e):(s=!1,o=!0);t++}return s}isReducedEchelonForm(){let t=0,e=0,r=-1,s=!0,o=!1;for(;t<this.rows&&s;){for(e=0,o=!1;e<this.columns&&!1===o;)0===this.get(t,e)?e++:1===this.get(t,e)&&e>r?(o=!0,r=e):(s=!1,o=!0);for(let r=e+1;r<this.rows;r++)0!==this.get(t,r)&&(s=!1);t++}return s}echelonForm(){let t=this.clone(),e=0,r=0;for(;e<t.rows&&r<t.columns;){let s=e;for(let o=e;o<t.rows;o++)t.get(o,r)>t.get(s,r)&&(s=o);if(0===t.get(s,r))r++;else{t.swapRows(e,s);let o=t.get(e,r);for(let s=r;s<t.columns;s++)t.set(e,s,t.get(e,s)/o);for(let s=e+1;s<t.rows;s++){let o=t.get(s,r)/t.get(e,r);t.set(s,r,0);for(let i=r+1;i<t.columns;i++)t.set(s,i,t.get(s,i)-t.get(e,i)*o)}e++,r++}}return t}reducedEchelonForm(){let t=this.echelonForm(),e=t.columns,r=t.rows,s=r-1;for(;s>=0;)if(0===t.maxRow(s))s--;else{let o=0,i=!1;for(;o<r&&!1===i;)1===t.get(s,o)?i=!0:o++;for(let r=0;r<s;r++){let i=t.get(r,o);for(let n=o;n<e;n++){let e=t.get(r,n)-i*t.get(s,n);t.set(r,n,e)}}s--}return t}set(){throw new Error("set method is unimplemented")}get(){throw new Error("get method is unimplemented")}repeat(t={}){if("object"!=typeof t)throw new TypeError("options must be an object");const{rows:e=1,columns:r=1}=t;if(!Number.isInteger(e)||e<=0)throw new TypeError("rows must be a positive integer");if(!Number.isInteger(r)||r<=0)throw new TypeError("columns must be a positive integer");let s=new v(this.rows*e,this.columns*r);for(let t=0;t<e;t++)for(let e=0;e<r;e++)s.setSubMatrix(this,this.rows*t,this.columns*e);return s}fill(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,t);return this}neg(){return this.mulS(-1)}getRow(t){f(this,t);let e=[];for(let r=0;r<this.columns;r++)e.push(this.get(t,r));return e}getRowVector(t){return v.rowVector(this.getRow(t))}setRow(t,e){f(this,t),e=m(this,e);for(let r=0;r<this.columns;r++)this.set(t,r,e[r]);return this}swapRows(t,e){f(this,t),f(this,e);for(let r=0;r<this.columns;r++){let s=this.get(t,r);this.set(t,r,this.get(e,r)),this.set(e,r,s)}return this}getColumn(t){c(this,t);let e=[];for(let r=0;r<this.rows;r++)e.push(this.get(r,t));return e}getColumnVector(t){return v.columnVector(this.getColumn(t))}setColumn(t,e){c(this,t),e=g(this,e);for(let r=0;r<this.rows;r++)this.set(r,t,e[r]);return this}swapColumns(t,e){c(this,t),c(this,e);for(let r=0;r<this.rows;r++){let s=this.get(r,t);this.set(r,t,this.get(r,e)),this.set(r,e,s)}return this}addRowVector(t){t=m(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)+t[r]);return this}subRowVector(t){t=m(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)-t[r]);return this}mulRowVector(t){t=m(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)*t[r]);return this}divRowVector(t){t=m(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)/t[r]);return this}addColumnVector(t){t=g(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)+t[e]);return this}subColumnVector(t){t=g(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)-t[e]);return this}mulColumnVector(t){t=g(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)*t[e]);return this}divColumnVector(t){t=g(this,t);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)/t[e]);return this}mulRow(t,e){f(this,t);for(let r=0;r<this.columns;r++)this.set(t,r,this.get(t,r)*e);return this}mulColumn(t,e){c(this,t);for(let r=0;r<this.rows;r++)this.set(r,t,this.get(r,t)*e);return this}max(t){if(this.isEmpty())return NaN;switch(t){case"row":{const t=new Array(this.rows).fill(Number.NEGATIVE_INFINITY);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.get(e,r)>t[e]&&(t[e]=this.get(e,r));return t}case"column":{const t=new Array(this.columns).fill(Number.NEGATIVE_INFINITY);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.get(e,r)>t[r]&&(t[r]=this.get(e,r));return t}case void 0:{let t=this.get(0,0);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.get(e,r)>t&&(t=this.get(e,r));return t}default:throw new Error(`invalid option: ${t}`)}}maxIndex(){y(this);let t=this.get(0,0),e=[0,0];for(let r=0;r<this.rows;r++)for(let s=0;s<this.columns;s++)this.get(r,s)>t&&(t=this.get(r,s),e[0]=r,e[1]=s);return e}min(t){if(this.isEmpty())return NaN;switch(t){case"row":{const t=new Array(this.rows).fill(Number.POSITIVE_INFINITY);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.get(e,r)<t[e]&&(t[e]=this.get(e,r));return t}case"column":{const t=new Array(this.columns).fill(Number.POSITIVE_INFINITY);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.get(e,r)<t[r]&&(t[r]=this.get(e,r));return t}case void 0:{let t=this.get(0,0);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.get(e,r)<t&&(t=this.get(e,r));return t}default:throw new Error(`invalid option: ${t}`)}}minIndex(){y(this);let t=this.get(0,0),e=[0,0];for(let r=0;r<this.rows;r++)for(let s=0;s<this.columns;s++)this.get(r,s)<t&&(t=this.get(r,s),e[0]=r,e[1]=s);return e}maxRow(t){if(f(this,t),this.isEmpty())return NaN;let e=this.get(t,0);for(let r=1;r<this.columns;r++)this.get(t,r)>e&&(e=this.get(t,r));return e}maxRowIndex(t){f(this,t),y(this);let e=this.get(t,0),r=[t,0];for(let s=1;s<this.columns;s++)this.get(t,s)>e&&(e=this.get(t,s),r[1]=s);return r}minRow(t){if(f(this,t),this.isEmpty())return NaN;let e=this.get(t,0);for(let r=1;r<this.columns;r++)this.get(t,r)<e&&(e=this.get(t,r));return e}minRowIndex(t){f(this,t),y(this);let e=this.get(t,0),r=[t,0];for(let s=1;s<this.columns;s++)this.get(t,s)<e&&(e=this.get(t,s),r[1]=s);return r}maxColumn(t){if(c(this,t),this.isEmpty())return NaN;let e=this.get(0,t);for(let r=1;r<this.rows;r++)this.get(r,t)>e&&(e=this.get(r,t));return e}maxColumnIndex(t){c(this,t),y(this);let e=this.get(0,t),r=[0,t];for(let s=1;s<this.rows;s++)this.get(s,t)>e&&(e=this.get(s,t),r[0]=s);return r}minColumn(t){if(c(this,t),this.isEmpty())return NaN;let e=this.get(0,t);for(let r=1;r<this.rows;r++)this.get(r,t)<e&&(e=this.get(r,t));return e}minColumnIndex(t){c(this,t),y(this);let e=this.get(0,t),r=[0,t];for(let s=1;s<this.rows;s++)this.get(s,t)<e&&(e=this.get(s,t),r[0]=s);return r}diag(){let t=Math.min(this.rows,this.columns),e=[];for(let r=0;r<t;r++)e.push(this.get(r,r));return e}norm(t="frobenius"){let e=0;if("max"===t)return this.max();if("frobenius"===t){for(let t=0;t<this.rows;t++)for(let r=0;r<this.columns;r++)e+=this.get(t,r)*this.get(t,r);return Math.sqrt(e)}throw new RangeError(`unknown norm type: ${t}`)}cumulativeSum(){let t=0;for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)t+=this.get(e,r),this.set(e,r,t);return this}dot(t){x.isMatrix(t)&&(t=t.to1DArray());let e=this.to1DArray();if(e.length!==t.length)throw new RangeError("vectors do not have the same size");let r=0;for(let s=0;s<e.length;s++)r+=e[s]*t[s];return r}mmul(t){t=v.checkMatrix(t);let e=this.rows,r=this.columns,s=t.columns,o=new v(e,s),i=new Float64Array(r);for(let n=0;n<s;n++){for(let e=0;e<r;e++)i[e]=t.get(e,n);for(let t=0;t<e;t++){let e=0;for(let s=0;s<r;s++)e+=this.get(t,s)*i[s];o.set(t,n,e)}}return o}strassen2x2(t){t=v.checkMatrix(t);let e=new v(2,2);const r=this.get(0,0),s=t.get(0,0),o=this.get(0,1),i=t.get(0,1),n=this.get(1,0),h=t.get(1,0),u=this.get(1,1),l=t.get(1,1),a=(r+u)*(s+l),f=(n+u)*s,c=r*(i-l),m=u*(h-s),g=(r+o)*l,w=a+m-g+(o-u)*(h+l),p=c+g,d=f+m,M=a-f+c+(n-r)*(s+i);return e.set(0,0,w),e.set(0,1,p),e.set(1,0,d),e.set(1,1,M),e}strassen3x3(t){t=v.checkMatrix(t);let e=new v(3,3);const r=this.get(0,0),s=this.get(0,1),o=this.get(0,2),i=this.get(1,0),n=this.get(1,1),h=this.get(1,2),u=this.get(2,0),l=this.get(2,1),a=this.get(2,2),f=t.get(0,0),c=t.get(0,1),m=t.get(0,2),g=t.get(1,0),w=t.get(1,1),p=t.get(1,2),d=t.get(2,0),M=t.get(2,1),b=t.get(2,2),y=(r-i)*(-c+w),x=(-r+i+n)*(f-c+w),E=(i+n)*(-f+c),S=r*f,R=(-r+u+l)*(f-m+p),I=(-r+u)*(m-p),k=(u+l)*(-f+m),N=(-o+l+a)*(w+d-M),T=(o-a)*(w-M),V=o*d,q=(l+a)*(-d+M),A=(-o+n+h)*(p+d-b),C=(o-h)*(p-b),F=(n+h)*(-d+b),D=S+V+s*g,$=(r+s+o-i-n-l-a)*w+x+E+S+N+V+q,j=S+R+k+(r+s+o-n-h-u-l)*p+V+A+F,P=y+n*(-f+c+g-w-p-d+b)+x+S+V+A+C,L=y+x+E+S+h*M,z=V+A+C+F+i*m,U=S+R+I+l*(-f+m+g-w-p-d+M)+N+T+V,O=N+T+V+q+u*c,_=S+R+I+k+a*b;return e.set(0,0,D),e.set(0,1,$),e.set(0,2,j),e.set(1,0,P),e.set(1,1,L),e.set(1,2,z),e.set(2,0,U),e.set(2,1,O),e.set(2,2,_),e}mmulStrassen(t){t=v.checkMatrix(t);let e=this.clone(),r=e.rows,s=e.columns,o=t.rows,i=t.columns;function n(t,e,r){let s=t.rows,o=t.columns;if(s===e&&o===r)return t;{let s=x.zeros(e,r);return s=s.setSubMatrix(t,0,0),s}}s!==o&&console.warn(`Multiplying ${r} x ${s} and ${o} x ${i} matrix: dimensions do not match.`);let h=Math.max(r,o),u=Math.max(s,i);return e=n(e,h,u),function t(e,r,s,o){if(s<=512||o<=512)return e.mmul(r);s%2==1&&o%2==1?(e=n(e,s+1,o+1),r=n(r,s+1,o+1)):s%2==1?(e=n(e,s+1,o),r=n(r,s+1,o)):o%2==1&&(e=n(e,s,o+1),r=n(r,s,o+1));let i=parseInt(e.rows/2,10),h=parseInt(e.columns/2,10),u=e.subMatrix(0,i-1,0,h-1),l=r.subMatrix(0,i-1,0,h-1),a=e.subMatrix(0,i-1,h,e.columns-1),f=r.subMatrix(0,i-1,h,r.columns-1),c=e.subMatrix(i,e.rows-1,0,h-1),m=r.subMatrix(i,r.rows-1,0,h-1),g=e.subMatrix(i,e.rows-1,h,e.columns-1),w=r.subMatrix(i,r.rows-1,h,r.columns-1),p=t(x.add(u,g),x.add(l,w),i,h),d=t(x.add(c,g),l,i,h),M=t(u,x.sub(f,w),i,h),b=t(g,x.sub(m,l),i,h),y=t(x.add(u,a),w,i,h),E=t(x.sub(c,u),x.add(l,f),i,h),v=t(x.sub(a,g),x.add(m,w),i,h),S=x.add(p,b);S.sub(y),S.add(v);let R=x.add(M,y),I=x.add(d,b),k=x.sub(p,d);k.add(M),k.add(E);let N=x.zeros(2*S.rows,2*S.columns);return N=N.setSubMatrix(S,0,0),N=N.setSubMatrix(R,S.rows,0),N=N.setSubMatrix(I,0,S.columns),N=N.setSubMatrix(k,S.rows,S.columns),N.subMatrix(0,s-1,0,o-1)}(e,t=n(t,h,u),h,u)}scaleRows(t={}){if("object"!=typeof t)throw new TypeError("options must be an object");const{min:e=0,max:r=1}=t;if(!Number.isFinite(e))throw new TypeError("min must be a number");if(!Number.isFinite(r))throw new TypeError("max must be a number");if(e>=r)throw new RangeError("min must be smaller than max");let s=new v(this.rows,this.columns);for(let t=0;t<this.rows;t++){const o=this.getRow(t);o.length>0&&i(o,{min:e,max:r,output:o}),s.setRow(t,o)}return s}scaleColumns(t={}){if("object"!=typeof t)throw new TypeError("options must be an object");const{min:e=0,max:r=1}=t;if(!Number.isFinite(e))throw new TypeError("min must be a number");if(!Number.isFinite(r))throw new TypeError("max must be a number");if(e>=r)throw new RangeError("min must be smaller than max");let s=new v(this.rows,this.columns);for(let t=0;t<this.columns;t++){const o=this.getColumn(t);o.length&&i(o,{min:e,max:r,output:o}),s.setColumn(t,o)}return s}flipRows(){const t=Math.ceil(this.columns/2);for(let e=0;e<this.rows;e++)for(let r=0;r<t;r++){let t=this.get(e,r),s=this.get(e,this.columns-1-r);this.set(e,r,s),this.set(e,this.columns-1-r,t)}return this}flipColumns(){const t=Math.ceil(this.rows/2);for(let e=0;e<this.columns;e++)for(let r=0;r<t;r++){let t=this.get(r,e),s=this.get(this.rows-1-r,e);this.set(r,e,s),this.set(this.rows-1-r,e,t)}return this}kroneckerProduct(t){t=v.checkMatrix(t);let e=this.rows,r=this.columns,s=t.rows,o=t.columns,i=new v(e*s,r*o);for(let n=0;n<e;n++)for(let e=0;e<r;e++)for(let r=0;r<s;r++)for(let h=0;h<o;h++)i.set(s*n+r,o*e+h,this.get(n,e)*t.get(r,h));return i}kroneckerSum(t){if(t=v.checkMatrix(t),!this.isSquare()||!t.isSquare())throw new Error("Kronecker Sum needs two Square Matrices");let e=this.rows,r=t.rows,s=this.kroneckerProduct(v.eye(r,r)),o=v.eye(e,e).kroneckerProduct(t);return s.add(o)}transpose(){let t=new v(this.columns,this.rows);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)t.set(r,e,this.get(e,r));return t}sortRows(t=E){for(let e=0;e<this.rows;e++)this.setRow(e,this.getRow(e).sort(t));return this}sortColumns(t=E){for(let e=0;e<this.columns;e++)this.setColumn(e,this.getColumn(e).sort(t));return this}subMatrix(t,e,r,s){d(this,t,e,r,s);let o=new v(e-t+1,s-r+1);for(let i=t;i<=e;i++)for(let e=r;e<=s;e++)o.set(i-t,e-r,this.get(i,e));return o}subMatrixRow(t,e,r){if(void 0===e&&(e=0),void 0===r&&(r=this.columns-1),e>r||e<0||e>=this.columns||r<0||r>=this.columns)throw new RangeError("Argument out of range");let s=new v(t.length,r-e+1);for(let o=0;o<t.length;o++)for(let i=e;i<=r;i++){if(t[o]<0||t[o]>=this.rows)throw new RangeError(`Row index out of range: ${t[o]}`);s.set(o,i-e,this.get(t[o],i))}return s}subMatrixColumn(t,e,r){if(void 0===e&&(e=0),void 0===r&&(r=this.rows-1),e>r||e<0||e>=this.rows||r<0||r>=this.rows)throw new RangeError("Argument out of range");let s=new v(r-e+1,t.length);for(let o=0;o<t.length;o++)for(let i=e;i<=r;i++){if(t[o]<0||t[o]>=this.columns)throw new RangeError(`Column index out of range: ${t[o]}`);s.set(i-e,o,this.get(i,t[o]))}return s}setSubMatrix(t,e,r){if((t=v.checkMatrix(t)).isEmpty())return this;d(this,e,e+t.rows-1,r,r+t.columns-1);for(let s=0;s<t.rows;s++)for(let o=0;o<t.columns;o++)this.set(e+s,r+o,t.get(s,o));return this}selection(t,e){w(this,t),p(this,e);let r=new v(t.length,e.length);for(let s=0;s<t.length;s++){let o=t[s];for(let t=0;t<e.length;t++){let i=e[t];r.set(s,t,this.get(o,i))}}return r}trace(){let t=Math.min(this.rows,this.columns),e=0;for(let r=0;r<t;r++)e+=this.get(r,r);return e}clone(){let t=new v(this.rows,this.columns);for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)t.set(e,r,this.get(e,r));return t}sum(t){switch(t){case"row":return function(t){let e=M(t.rows);for(let r=0;r<t.rows;++r)for(let s=0;s<t.columns;++s)e[r]+=t.get(r,s);return e}(this);case"column":return function(t){let e=M(t.columns);for(let r=0;r<t.rows;++r)for(let s=0;s<t.columns;++s)e[s]+=t.get(r,s);return e}(this);case void 0:return function(t){let e=0;for(let r=0;r<t.rows;r++)for(let s=0;s<t.columns;s++)e+=t.get(r,s);return e}(this);default:throw new Error(`invalid option: ${t}`)}}product(t){switch(t){case"row":return function(t){let e=M(t.rows,1);for(let r=0;r<t.rows;++r)for(let s=0;s<t.columns;++s)e[r]*=t.get(r,s);return e}(this);case"column":return function(t){let e=M(t.columns,1);for(let r=0;r<t.rows;++r)for(let s=0;s<t.columns;++s)e[s]*=t.get(r,s);return e}(this);case void 0:return function(t){let e=1;for(let r=0;r<t.rows;r++)for(let s=0;s<t.columns;s++)e*=t.get(r,s);return e}(this);default:throw new Error(`invalid option: ${t}`)}}mean(t){const e=this.sum(t);switch(t){case"row":for(let t=0;t<this.rows;t++)e[t]/=this.columns;return e;case"column":for(let t=0;t<this.columns;t++)e[t]/=this.rows;return e;case void 0:return e/this.size;default:throw new Error(`invalid option: ${t}`)}}variance(t,e={}){if("object"==typeof t&&(e=t,t=void 0),"object"!=typeof e)throw new TypeError("options must be an object");const{unbiased:s=!0,mean:o=this.mean(t)}=e;if("boolean"!=typeof s)throw new TypeError("unbiased must be a boolean");switch(t){case"row":if(!r(o))throw new TypeError("mean must be an array");return function(t,e,r){const s=t.rows,o=t.columns,i=[];for(let n=0;n<s;n++){let s=0,h=0,u=0;for(let e=0;e<o;e++)u=t.get(n,e)-r[n],s+=u,h+=u*u;e?i.push((h-s*s/o)/(o-1)):i.push((h-s*s/o)/o)}return i}(this,s,o);case"column":if(!r(o))throw new TypeError("mean must be an array");return function(t,e,r){const s=t.rows,o=t.columns,i=[];for(let n=0;n<o;n++){let o=0,h=0,u=0;for(let e=0;e<s;e++)u=t.get(e,n)-r[n],o+=u,h+=u*u;e?i.push((h-o*o/s)/(s-1)):i.push((h-o*o/s)/s)}return i}(this,s,o);case void 0:if("number"!=typeof o)throw new TypeError("mean must be a number");return function(t,e,r){const s=t.rows,o=t.columns,i=s*o;let n=0,h=0,u=0;for(let e=0;e<s;e++)for(let s=0;s<o;s++)u=t.get(e,s)-r,n+=u,h+=u*u;return e?(h-n*n/i)/(i-1):(h-n*n/i)/i}(this,s,o);default:throw new Error(`invalid option: ${t}`)}}standardDeviation(t,e){"object"==typeof t&&(e=t,t=void 0);const r=this.variance(t,e);if(void 0===t)return Math.sqrt(r);for(let t=0;t<r.length;t++)r[t]=Math.sqrt(r[t]);return r}center(t,e={}){if("object"==typeof t&&(e=t,t=void 0),"object"!=typeof e)throw new TypeError("options must be an object");const{center:s=this.mean(t)}=e;switch(t){case"row":if(!r(s))throw new TypeError("center must be an array");return function(t,e){for(let r=0;r<t.rows;r++)for(let s=0;s<t.columns;s++)t.set(r,s,t.get(r,s)-e[r])}(this,s),this;case"column":if(!r(s))throw new TypeError("center must be an array");return function(t,e){for(let r=0;r<t.rows;r++)for(let s=0;s<t.columns;s++)t.set(r,s,t.get(r,s)-e[s])}(this,s),this;case void 0:if("number"!=typeof s)throw new TypeError("center must be a number");return function(t,e){for(let r=0;r<t.rows;r++)for(let s=0;s<t.columns;s++)t.set(r,s,t.get(r,s)-e)}(this,s),this;default:throw new Error(`invalid option: ${t}`)}}scale(t,e={}){if("object"==typeof t&&(e=t,t=void 0),"object"!=typeof e)throw new TypeError("options must be an object");let s=e.scale;switch(t){case"row":if(void 0===s)s=function(t){const e=[];for(let r=0;r<t.rows;r++){let s=0;for(let e=0;e<t.columns;e++)s+=Math.pow(t.get(r,e),2)/(t.columns-1);e.push(Math.sqrt(s))}return e}(this);else if(!r(s))throw new TypeError("scale must be an array");return function(t,e){for(let r=0;r<t.rows;r++)for(let s=0;s<t.columns;s++)t.set(r,s,t.get(r,s)/e[r])}(this,s),this;case"column":if(void 0===s)s=function(t){const e=[];for(let r=0;r<t.columns;r++){let s=0;for(let e=0;e<t.rows;e++)s+=Math.pow(t.get(e,r),2)/(t.rows-1);e.push(Math.sqrt(s))}return e}(this);else if(!r(s))throw new TypeError("scale must be an array");return function(t,e){for(let r=0;r<t.rows;r++)for(let s=0;s<t.columns;s++)t.set(r,s,t.get(r,s)/e[s])}(this,s),this;case void 0:if(void 0===s)s=function(t){const e=t.size-1;let r=0;for(let s=0;s<t.columns;s++)for(let o=0;o<t.rows;o++)r+=Math.pow(t.get(o,s),2)/e;return Math.sqrt(r)}(this);else if("number"!=typeof s)throw new TypeError("scale must be a number");return function(t,e){for(let r=0;r<t.rows;r++)for(let s=0;s<t.columns;s++)t.set(r,s,t.get(r,s)/e)}(this,s),this;default:throw new Error(`invalid option: ${t}`)}}toString(t){return u(this,t)}}function E(t,e){return t-e}x.prototype.klass="Matrix","undefined"!=typeof Symbol&&(x.prototype[Symbol.for("nodejs.util.inspect.custom")]=function(){return u(this)}),x.random=x.rand,x.randomInt=x.randInt,x.diagonal=x.diag,x.prototype.diagonal=x.prototype.diag,x.identity=x.eye,x.prototype.negate=x.prototype.neg,x.prototype.tensorProduct=x.prototype.kroneckerProduct;class v extends x{constructor(t,e){if(super(),v.isMatrix(t))return t.clone();if(Number.isInteger(t)&&t>=0){if(this.data=[],!(Number.isInteger(e)&&e>=0))throw new TypeError("nColumns must be a positive integer");for(let r=0;r<t;r++)this.data.push(new Float64Array(e))}else{if(!r(t))throw new TypeError("First argument must be a positive number or an array");{const r=t;if("number"!=typeof(e=(t=r.length)?r[0].length:0))throw new TypeError("Data must be a 2D array with at least one element");this.data=[];for(let s=0;s<t;s++){if(r[s].length!==e)throw new RangeError("Inconsistent array dimensions");if(!r[s].every((t=>"number"==typeof t)))throw new TypeError("Input data contains non-numeric values");this.data.push(Float64Array.from(r[s]))}}}this.rows=t,this.columns=e}set(t,e,r){return this.data[t][e]=r,this}get(t,e){return this.data[t][e]}removeRow(t){return f(this,t),this.data.splice(t,1),this.rows-=1,this}addRow(t,e){return void 0===e&&(e=t,t=this.rows),f(this,t,!0),e=Float64Array.from(m(this,e)),this.data.splice(t,0,e),this.rows+=1,this}removeColumn(t){c(this,t);for(let e=0;e<this.rows;e++){const r=new Float64Array(this.columns-1);for(let s=0;s<t;s++)r[s]=this.data[e][s];for(let s=t+1;s<this.columns;s++)r[s-1]=this.data[e][s];this.data[e]=r}return this.columns-=1,this}addColumn(t,e){void 0===e&&(e=t,t=this.columns),c(this,t,!0),e=g(this,e);for(let r=0;r<this.rows;r++){const s=new Float64Array(this.columns+1);let o=0;for(;o<t;o++)s[o]=this.data[r][o];for(s[o++]=e[r];o<this.columns+1;o++)s[o]=this.data[r][o-1];this.data[r]=s}return this.columns+=1,this}}!function(t,e){t.prototype.add=function(t){return"number"==typeof t?this.addS(t):this.addM(t)},t.prototype.addS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)+t);return this},t.prototype.addM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)+t.get(e,r));return this},t.add=function(t,r){return new e(t).add(r)},t.prototype.sub=function(t){return"number"==typeof t?this.subS(t):this.subM(t)},t.prototype.subS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)-t);return this},t.prototype.subM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)-t.get(e,r));return this},t.sub=function(t,r){return new e(t).sub(r)},t.prototype.subtract=t.prototype.sub,t.prototype.subtractS=t.prototype.subS,t.prototype.subtractM=t.prototype.subM,t.subtract=t.sub,t.prototype.mul=function(t){return"number"==typeof t?this.mulS(t):this.mulM(t)},t.prototype.mulS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)*t);return this},t.prototype.mulM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)*t.get(e,r));return this},t.mul=function(t,r){return new e(t).mul(r)},t.prototype.multiply=t.prototype.mul,t.prototype.multiplyS=t.prototype.mulS,t.prototype.multiplyM=t.prototype.mulM,t.multiply=t.mul,t.prototype.div=function(t){return"number"==typeof t?this.divS(t):this.divM(t)},t.prototype.divS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)/t);return this},t.prototype.divM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)/t.get(e,r));return this},t.div=function(t,r){return new e(t).div(r)},t.prototype.divide=t.prototype.div,t.prototype.divideS=t.prototype.divS,t.prototype.divideM=t.prototype.divM,t.divide=t.div,t.prototype.mod=function(t){return"number"==typeof t?this.modS(t):this.modM(t)},t.prototype.modS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)%t);return this},t.prototype.modM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)%t.get(e,r));return this},t.mod=function(t,r){return new e(t).mod(r)},t.prototype.modulus=t.prototype.mod,t.prototype.modulusS=t.prototype.modS,t.prototype.modulusM=t.prototype.modM,t.modulus=t.mod,t.prototype.and=function(t){return"number"==typeof t?this.andS(t):this.andM(t)},t.prototype.andS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)&t);return this},t.prototype.andM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)&t.get(e,r));return this},t.and=function(t,r){return new e(t).and(r)},t.prototype.or=function(t){return"number"==typeof t?this.orS(t):this.orM(t)},t.prototype.orS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)|t);return this},t.prototype.orM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)|t.get(e,r));return this},t.or=function(t,r){return new e(t).or(r)},t.prototype.xor=function(t){return"number"==typeof t?this.xorS(t):this.xorM(t)},t.prototype.xorS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)^t);return this},t.prototype.xorM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)^t.get(e,r));return this},t.xor=function(t,r){return new e(t).xor(r)},t.prototype.leftShift=function(t){return"number"==typeof t?this.leftShiftS(t):this.leftShiftM(t)},t.prototype.leftShiftS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)<<t);return this},t.prototype.leftShiftM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)<<t.get(e,r));return this},t.leftShift=function(t,r){return new e(t).leftShift(r)},t.prototype.signPropagatingRightShift=function(t){return"number"==typeof t?this.signPropagatingRightShiftS(t):this.signPropagatingRightShiftM(t)},t.prototype.signPropagatingRightShiftS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)>>t);return this},t.prototype.signPropagatingRightShiftM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)>>t.get(e,r));return this},t.signPropagatingRightShift=function(t,r){return new e(t).signPropagatingRightShift(r)},t.prototype.rightShift=function(t){return"number"==typeof t?this.rightShiftS(t):this.rightShiftM(t)},t.prototype.rightShiftS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)>>>t);return this},t.prototype.rightShiftM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,this.get(e,r)>>>t.get(e,r));return this},t.rightShift=function(t,r){return new e(t).rightShift(r)},t.prototype.zeroFillRightShift=t.prototype.rightShift,t.prototype.zeroFillRightShiftS=t.prototype.rightShiftS,t.prototype.zeroFillRightShiftM=t.prototype.rightShiftM,t.zeroFillRightShift=t.rightShift,t.prototype.not=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,~this.get(t,e));return this},t.not=function(t){return new e(t).not()},t.prototype.abs=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.abs(this.get(t,e)));return this},t.abs=function(t){return new e(t).abs()},t.prototype.acos=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.acos(this.get(t,e)));return this},t.acos=function(t){return new e(t).acos()},t.prototype.acosh=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.acosh(this.get(t,e)));return this},t.acosh=function(t){return new e(t).acosh()},t.prototype.asin=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.asin(this.get(t,e)));return this},t.asin=function(t){return new e(t).asin()},t.prototype.asinh=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.asinh(this.get(t,e)));return this},t.asinh=function(t){return new e(t).asinh()},t.prototype.atan=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.atan(this.get(t,e)));return this},t.atan=function(t){return new e(t).atan()},t.prototype.atanh=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.atanh(this.get(t,e)));return this},t.atanh=function(t){return new e(t).atanh()},t.prototype.cbrt=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.cbrt(this.get(t,e)));return this},t.cbrt=function(t){return new e(t).cbrt()},t.prototype.ceil=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.ceil(this.get(t,e)));return this},t.ceil=function(t){return new e(t).ceil()},t.prototype.clz32=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.clz32(this.get(t,e)));return this},t.clz32=function(t){return new e(t).clz32()},t.prototype.cos=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.cos(this.get(t,e)));return this},t.cos=function(t){return new e(t).cos()},t.prototype.cosh=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.cosh(this.get(t,e)));return this},t.cosh=function(t){return new e(t).cosh()},t.prototype.exp=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.exp(this.get(t,e)));return this},t.exp=function(t){return new e(t).exp()},t.prototype.expm1=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.expm1(this.get(t,e)));return this},t.expm1=function(t){return new e(t).expm1()},t.prototype.floor=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.floor(this.get(t,e)));return this},t.floor=function(t){return new e(t).floor()},t.prototype.fround=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.fround(this.get(t,e)));return this},t.fround=function(t){return new e(t).fround()},t.prototype.log=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.log(this.get(t,e)));return this},t.log=function(t){return new e(t).log()},t.prototype.log1p=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.log1p(this.get(t,e)));return this},t.log1p=function(t){return new e(t).log1p()},t.prototype.log10=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.log10(this.get(t,e)));return this},t.log10=function(t){return new e(t).log10()},t.prototype.log2=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.log2(this.get(t,e)));return this},t.log2=function(t){return new e(t).log2()},t.prototype.round=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.round(this.get(t,e)));return this},t.round=function(t){return new e(t).round()},t.prototype.sign=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.sign(this.get(t,e)));return this},t.sign=function(t){return new e(t).sign()},t.prototype.sin=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.sin(this.get(t,e)));return this},t.sin=function(t){return new e(t).sin()},t.prototype.sinh=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.sinh(this.get(t,e)));return this},t.sinh=function(t){return new e(t).sinh()},t.prototype.sqrt=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.sqrt(this.get(t,e)));return this},t.sqrt=function(t){return new e(t).sqrt()},t.prototype.tan=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.tan(this.get(t,e)));return this},t.tan=function(t){return new e(t).tan()},t.prototype.tanh=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.tanh(this.get(t,e)));return this},t.tanh=function(t){return new e(t).tanh()},t.prototype.trunc=function(){for(let t=0;t<this.rows;t++)for(let e=0;e<this.columns;e++)this.set(t,e,Math.trunc(this.get(t,e)));return this},t.trunc=function(t){return new e(t).trunc()},t.pow=function(t,r){return new e(t).pow(r)},t.prototype.pow=function(t){return"number"==typeof t?this.powS(t):this.powM(t)},t.prototype.powS=function(t){for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,Math.pow(this.get(e,r),t));return this},t.prototype.powM=function(t){if(t=e.checkMatrix(t),this.rows!==t.rows||this.columns!==t.columns)throw new RangeError("Matrices dimensions must be equal");for(let e=0;e<this.rows;e++)for(let r=0;r<this.columns;r++)this.set(e,r,Math.pow(this.get(e,r),t.get(e,r)));return this}}(x,v);class S extends x{constructor(t,e,r){super(),this.matrix=t,this.rows=e,this.columns=r}}class R extends S{constructor(t,e,r){w(t,e),p(t,r),super(t,e.length,r.length),this.rowIndices=e,this.columnIndices=r}set(t,e,r){return this.matrix.set(this.rowIndices[t],this.columnIndices[e],r),this}get(t,e){return this.matrix.get(this.rowIndices[t],this.columnIndices[e])}}class I extends x{constructor(t,e={}){const{rows:r=1}=e;if(t.length%r!=0)throw new Error("the data length is not divisible by the number of rows");super(),this.rows=r,this.columns=t.length/r,this.data=t}set(t,e,r){let s=this._calculateIndex(t,e);return this.data[s]=r,this}get(t,e){let r=this._calculateIndex(t,e);return this.data[r]}_calculateIndex(t,e){return t*this.columns+e}}class k extends x{constructor(t){super(),this.data=t,this.rows=t.length,this.columns=t[0].length}set(t,e,r){return this.data[t][e]=r,this}get(t,e){return this.data[t][e]}}class N{constructor(t){let e,r,s,o,i,n,h,u,l,a=(t=k.checkMatrix(t)).clone(),f=a.rows,c=a.columns,m=new Float64Array(f),g=1;for(e=0;e<f;e++)m[e]=e;for(u=new Float64Array(f),r=0;r<c;r++){for(e=0;e<f;e++)u[e]=a.get(e,r);for(e=0;e<f;e++){for(l=Math.min(e,r),i=0,s=0;s<l;s++)i+=a.get(e,s)*u[s];u[e]-=i,a.set(e,r,u[e])}for(o=r,e=r+1;e<f;e++)Math.abs(u[e])>Math.abs(u[o])&&(o=e);if(o!==r){for(s=0;s<c;s++)n=a.get(o,s),a.set(o,s,a.get(r,s)),a.set(r,s,n);h=m[o],m[o]=m[r],m[r]=h,g=-g}if(r<f&&0!==a.get(r,r))for(e=r+1;e<f;e++)a.set(e,r,a.get(e,r)/a.get(r,r))}this.LU=a,this.pivotVector=m,this.pivotSign=g}isSingular(){let t=this.LU,e=t.columns;for(let r=0;r<e;r++)if(0===t.get(r,r))return!0;return!1}solve(t){t=v.checkMatrix(t);let e=this.LU;if(e.rows!==t.rows)throw new Error("Invalid matrix dimensions");if(this.isSingular())throw new Error("LU matrix is singular");let r,s,o,i=t.columns,n=t.subMatrixRow(this.pivotVector,0,i-1),h=e.columns;for(o=0;o<h;o++)for(r=o+1;r<h;r++)for(s=0;s<i;s++)n.set(r,s,n.get(r,s)-n.get(o,s)*e.get(r,o));for(o=h-1;o>=0;o--){for(s=0;s<i;s++)n.set(o,s,n.get(o,s)/e.get(o,o));for(r=0;r<o;r++)for(s=0;s<i;s++)n.set(r,s,n.get(r,s)-n.get(o,s)*e.get(r,o))}return n}get determinant(){let t=this.LU;if(!t.isSquare())throw new Error("Matrix must be square");let e=this.pivotSign,r=t.columns;for(let s=0;s<r;s++)e*=t.get(s,s);return e}get lowerTriangularMatrix(){let t=this.LU,e=t.rows,r=t.columns,s=new v(e,r);for(let o=0;o<e;o++)for(let e=0;e<r;e++)o>e?s.set(o,e,t.get(o,e)):o===e?s.set(o,e,1):s.set(o,e,0);return s}get upperTriangularMatrix(){let t=this.LU,e=t.rows,r=t.columns,s=new v(e,r);for(let o=0;o<e;o++)for(let e=0;e<r;e++)o<=e?s.set(o,e,t.get(o,e)):s.set(o,e,0);return s}get pivotPermutationVector(){return Array.from(this.pivotVector)}}function T(t,e){let r=0;return Math.abs(t)>Math.abs(e)?(r=e/t,Math.abs(t)*Math.sqrt(1+r*r)):0!==e?(r=t/e,Math.abs(e)*Math.sqrt(1+r*r)):0}class V{constructor(t){let e,r,s,o,i=(t=k.checkMatrix(t)).clone(),n=t.rows,h=t.columns,u=new Float64Array(h);for(s=0;s<h;s++){let t=0;for(e=s;e<n;e++)t=T(t,i.get(e,s));if(0!==t){for(i.get(s,s)<0&&(t=-t),e=s;e<n;e++)i.set(e,s,i.get(e,s)/t);for(i.set(s,s,i.get(s,s)+1),r=s+1;r<h;r++){for(o=0,e=s;e<n;e++)o+=i.get(e,s)*i.get(e,r);for(o=-o/i.get(s,s),e=s;e<n;e++)i.set(e,r,i.get(e,r)+o*i.get(e,s))}}u[s]=-t}this.QR=i,this.Rdiag=u}solve(t){t=v.checkMatrix(t);let e=this.QR,r=e.rows;if(t.rows!==r)throw new Error("Matrix row dimensions must agree");if(!this.isFullRank())throw new Error("Matrix is rank deficient");let s,o,i,n,h=t.columns,u=t.clone(),l=e.columns;for(i=0;i<l;i++)for(o=0;o<h;o++){for(n=0,s=i;s<r;s++)n+=e.get(s,i)*u.get(s,o);for(n=-n/e.get(i,i),s=i;s<r;s++)u.set(s,o,u.get(s,o)+n*e.get(s,i))}for(i=l-1;i>=0;i--){for(o=0;o<h;o++)u.set(i,o,u.get(i,o)/this.Rdiag[i]);for(s=0;s<i;s++)for(o=0;o<h;o++)u.set(s,o,u.get(s,o)-u.get(i,o)*e.get(s,i))}return u.subMatrix(0,l-1,0,h-1)}isFullRank(){let t=this.QR.columns;for(let e=0;e<t;e++)if(0===this.Rdiag[e])return!1;return!0}get upperTriangularMatrix(){let t,e,r=this.QR,s=r.columns,o=new v(s,s);for(t=0;t<s;t++)for(e=0;e<s;e++)t<e?o.set(t,e,r.get(t,e)):t===e?o.set(t,e,this.Rdiag[t]):o.set(t,e,0);return o}get orthogonalMatrix(){let t,e,r,s,o=this.QR,i=o.rows,n=o.columns,h=new v(i,n);for(r=n-1;r>=0;r--){for(t=0;t<i;t++)h.set(t,r,0);for(h.set(r,r,1),e=r;e<n;e++)if(0!==o.get(r,r)){for(s=0,t=r;t<i;t++)s+=o.get(t,r)*h.get(t,e);for(s=-s/o.get(r,r),t=r;t<i;t++)h.set(t,e,h.get(t,e)+s*o.get(t,r))}}return h}}class q{constructor(t,e={}){if((t=k.checkMatrix(t)).isEmpty())throw new Error("Matrix must be non-empty");let r=t.rows,s=t.columns;const{computeLeftSingularVectors:o=!0,computeRightSingularVectors:i=!0,autoTranspose:n=!1}=e;let h,u=Boolean(o),l=Boolean(i),a=!1;if(r<s)if(n){h=t.transpose(),r=h.rows,s=h.columns,a=!0;let e=u;u=l,l=e}else h=t.clone(),console.warn("Computing SVD on a matrix with more columns than rows. Consider enabling autoTranspose");else h=t.clone();let f=Math.min(r,s),c=Math.min(r+1,s),m=new Float64Array(c),g=new v(r,f),w=new v(s,s),p=new Float64Array(s),d=new Float64Array(r),M=new Float64Array(c);for(let t=0;t<c;t++)M[t]=t;let b=Math.min(r-1,s),y=Math.max(0,Math.min(s-2,r)),x=Math.max(b,y);for(let t=0;t<x;t++){if(t<b){m[t]=0;for(let e=t;e<r;e++)m[t]=T(m[t],h.get(e,t));if(0!==m[t]){h.get(t,t)<0&&(m[t]=-m[t]);for(let e=t;e<r;e++)h.set(e,t,h.get(e,t)/m[t]);h.set(t,t,h.get(t,t)+1)}m[t]=-m[t]}for(let e=t+1;e<s;e++){if(t<b&&0!==m[t]){let s=0;for(let o=t;o<r;o++)s+=h.get(o,t)*h.get(o,e);s=-s/h.get(t,t);for(let o=t;o<r;o++)h.set(o,e,h.get(o,e)+s*h.get(o,t))}p[e]=h.get(t,e)}if(u&&t<b)for(let e=t;e<r;e++)g.set(e,t,h.get(e,t));if(t<y){p[t]=0;for(let e=t+1;e<s;e++)p[t]=T(p[t],p[e]);if(0!==p[t]){p[t+1]<0&&(p[t]=0-p[t]);for(let e=t+1;e<s;e++)p[e]/=p[t];p[t+1]+=1}if(p[t]=-p[t],t+1<r&&0!==p[t]){for(let e=t+1;e<r;e++)d[e]=0;for(let e=t+1;e<r;e++)for(let r=t+1;r<s;r++)d[e]+=p[r]*h.get(e,r);for(let e=t+1;e<s;e++){let s=-p[e]/p[t+1];for(let o=t+1;o<r;o++)h.set(o,e,h.get(o,e)+s*d[o])}}if(l)for(let e=t+1;e<s;e++)w.set(e,t,p[e])}}let E=Math.min(s,r+1);if(b<s&&(m[b]=h.get(b,b)),r<E&&(m[E-1]=0),y+1<E&&(p[y]=h.get(y,E-1)),p[E-1]=0,u){for(let t=b;t<f;t++){for(let e=0;e<r;e++)g.set(e,t,0);g.set(t,t,1)}for(let t=b-1;t>=0;t--)if(0!==m[t]){for(let e=t+1;e<f;e++){let s=0;for(let o=t;o<r;o++)s+=g.get(o,t)*g.get(o,e);s=-s/g.get(t,t);for(let o=t;o<r;o++)g.set(o,e,g.get(o,e)+s*g.get(o,t))}for(let e=t;e<r;e++)g.set(e,t,-g.get(e,t));g.set(t,t,1+g.get(t,t));for(let e=0;e<t-1;e++)g.set(e,t,0)}else{for(let e=0;e<r;e++)g.set(e,t,0);g.set(t,t,1)}}if(l)for(let t=s-1;t>=0;t--){if(t<y&&0!==p[t])for(let e=t+1;e<s;e++){let r=0;for(let o=t+1;o<s;o++)r+=w.get(o,t)*w.get(o,e);r=-r/w.get(t+1,t);for(let o=t+1;o<s;o++)w.set(o,e,w.get(o,e)+r*w.get(o,t))}for(let e=0;e<s;e++)w.set(e,t,0);w.set(t,t,1)}let S=E-1,R=Number.EPSILON;for(;E>0;){let t,e;for(t=E-2;t>=-1&&-1!==t;t--){const e=Number.MIN_VALUE+R*Math.abs(m[t]+Math.abs(m[t+1]));if(Math.abs(p[t])<=e||Number.isNaN(p[t])){p[t]=0;break}}if(t===E-2)e=4;else{let r;for(r=E-1;r>=t&&r!==t;r--){let e=(r!==E?Math.abs(p[r]):0)+(r!==t+1?Math.abs(p[r-1]):0);if(Math.abs(m[r])<=R*e){m[r]=0;break}}r===t?e=3:r===E-1?e=1:(e=2,t=r)}switch(t++,e){case 1:{let e=p[E-2];p[E-2]=0;for(let r=E-2;r>=t;r--){let o=T(m[r],e),i=m[r]/o,n=e/o;if(m[r]=o,r!==t&&(e=-n*p[r-1],p[r-1]=i*p[r-1]),l)for(let t=0;t<s;t++)o=i*w.get(t,r)+n*w.get(t,E-1),w.set(t,E-1,-n*w.get(t,r)+i*w.get(t,E-1)),w.set(t,r,o)}break}case 2:{let e=p[t-1];p[t-1]=0;for(let s=t;s<E;s++){let o=T(m[s],e),i=m[s]/o,n=e/o;if(m[s]=o,e=-n*p[s],p[s]=i*p[s],u)for(let e=0;e<r;e++)o=i*g.get(e,s)+n*g.get(e,t-1),g.set(e,t-1,-n*g.get(e,s)+i*g.get(e,t-1)),g.set(e,s,o)}break}case 3:{const e=Math.max(Math.abs(m[E-1]),Math.abs(m[E-2]),Math.abs(p[E-2]),Math.abs(m[t]),Math.abs(p[t])),o=m[E-1]/e,i=m[E-2]/e,n=p[E-2]/e,h=m[t]/e,a=p[t]/e,f=((i+o)*(i-o)+n*n)/2,c=o*n*(o*n);let d=0;0===f&&0===c||(d=f<0?0-Math.sqrt(f*f+c):Math.sqrt(f*f+c),d=c/(f+d));let M=(h+o)*(h-o)+d,b=h*a;for(let e=t;e<E-1;e++){let o=T(M,b);0===o&&(o=Number.MIN_VALUE);let i=M/o,n=b/o;if(e!==t&&(p[e-1]=o),M=i*m[e]+n*p[e],p[e]=i*p[e]-n*m[e],b=n*m[e+1],m[e+1]=i*m[e+1],l)for(let t=0;t<s;t++)o=i*w.get(t,e)+n*w.get(t,e+1),w.set(t,e+1,-n*w.get(t,e)+i*w.get(t,e+1)),w.set(t,e,o);if(o=T(M,b),0===o&&(o=Number.MIN_VALUE),i=M/o,n=b/o,m[e]=o,M=i*p[e]+n*m[e+1],m[e+1]=-n*p[e]+i*m[e+1],b=n*p[e+1],p[e+1]=i*p[e+1],u&&e<r-1)for(let t=0;t<r;t++)o=i*g.get(t,e)+n*g.get(t,e+1),g.set(t,e+1,-n*g.get(t,e)+i*g.get(t,e+1)),g.set(t,e,o)}p[E-2]=M;break}case 4:if(m[t]<=0&&(m[t]=m[t]<0?-m[t]:0,l))for(let e=0;e<=S;e++)w.set(e,t,-w.get(e,t));for(;t<S&&!(m[t]>=m[t+1]);){let e=m[t];if(m[t]=m[t+1],m[t+1]=e,l&&t<s-1)for(let r=0;r<s;r++)e=w.get(r,t+1),w.set(r,t+1,w.get(r,t)),w.set(r,t,e);if(u&&t<r-1)for(let s=0;s<r;s++)e=g.get(s,t+1),g.set(s,t+1,g.get(s,t)),g.set(s,t,e);t++}E--}}if(a){let t=w;w=g,g=t}this.m=r,this.n=s,this.s=m,this.U=g,this.V=w}solve(t){let e=t,r=this.threshold,s=this.s.length,o=v.zeros(s,s);for(let t=0;t<s;t++)Math.abs(this.s[t])<=r?o.set(t,t,0):o.set(t,t,1/this.s[t]);let i=this.U,n=this.rightSingularVectors,h=n.mmul(o),u=n.rows,l=i.rows,a=v.zeros(u,l);for(let t=0;t<u;t++)for(let e=0;e<l;e++){let r=0;for(let o=0;o<s;o++)r+=h.get(t,o)*i.get(e,o);a.set(t,e,r)}return a.mmul(e)}solveForDiagonal(t){return this.solve(v.diag(t))}inverse(){let t=this.V,e=this.threshold,r=t.rows,s=t.columns,o=new v(r,this.s.length);for(let i=0;i<r;i++)for(let r=0;r<s;r++)Math.abs(this.s[r])>e&&o.set(i,r,t.get(i,r)/this.s[r]);let i=this.U,n=i.rows,h=i.columns,u=new v(r,n);for(let t=0;t<r;t++)for(let e=0;e<n;e++){let r=0;for(let s=0;s<h;s++)r+=o.get(t,s)*i.get(e,s);u.set(t,e,r)}return u}get condition(){return this.s[0]/this.s[Math.min(this.m,this.n)-1]}get norm2(){return this.s[0]}get rank(){let t=Math.max(this.m,this.n)*this.s[0]*Number.EPSILON,e=0,r=this.s;for(let s=0,o=r.length;s<o;s++)r[s]>t&&e++;return e}get diagonal(){return Array.from(this.s)}get threshold(){return Number.EPSILON/2*Math.max(this.m,this.n)*this.s[0]}get leftSingularVectors(){return this.U}get rightSingularVectors(){return this.V}get diagonalMatrix(){return v.diag(this.s)}}function A(t,e,r=!1){return t=k.checkMatrix(t),e=k.checkMatrix(e),r?new q(t).solve(e):t.isSquare()?new N(t).solve(e):new V(t).solve(e)}function C(t,e){let r=[];for(let s=0;s<t;s++)s!==e&&r.push(s);return r}function F(t,e,r,s=1e-9,o=1e-9){if(t>o)return new Array(e.rows+1).fill(0);{let t=e.addRow(r,[0]);for(let e=0;e<t.rows;e++)Math.abs(t.get(e,0))<s&&t.set(e,0,0);return t.to1DArray()}}class D{constructor(t,e={}){const{assumeSymmetric:r=!1}=e;if(!(t=k.checkMatrix(t)).isSquare())throw new Error("Matrix is not a square matrix");if(t.isEmpty())throw new Error("Matrix must be non-empty");let s,o,i=t.columns,n=new v(i,i),h=new Float64Array(i),u=new Float64Array(i),l=t,a=!1;if(a=!!r||t.isSymmetric(),a){for(s=0;s<i;s++)for(o=0;o<i;o++)n.set(s,o,l.get(s,o));!function(t,e,r,s){let o,i,n,h,u,l,a,f;for(u=0;u<t;u++)r[u]=s.get(t-1,u);for(h=t-1;h>0;h--){for(f=0,n=0,l=0;l<h;l++)f+=Math.abs(r[l]);if(0===f)for(e[h]=r[h-1],u=0;u<h;u++)r[u]=s.get(h-1,u),s.set(h,u,0),s.set(u,h,0);else{for(l=0;l<h;l++)r[l]/=f,n+=r[l]*r[l];for(o=r[h-1],i=Math.sqrt(n),o>0&&(i=-i),e[h]=f*i,n-=o*i,r[h-1]=o-i,u=0;u<h;u++)e[u]=0;for(u=0;u<h;u++){for(o=r[u],s.set(u,h,o),i=e[u]+s.get(u,u)*o,l=u+1;l<=h-1;l++)i+=s.get(l,u)*r[l],e[l]+=s.get(l,u)*o;e[u]=i}for(o=0,u=0;u<h;u++)e[u]/=n,o+=e[u]*r[u];for(a=o/(n+n),u=0;u<h;u++)e[u]-=a*r[u];for(u=0;u<h;u++){for(o=r[u],i=e[u],l=u;l<=h-1;l++)s.set(l,u,s.get(l,u)-(o*e[l]+i*r[l]));r[u]=s.get(h-1,u),s.set(h,u,0)}}r[h]=n}for(h=0;h<t-1;h++){if(s.set(t-1,h,s.get(h,h)),s.set(h,h,1),n=r[h+1],0!==n){for(l=0;l<=h;l++)r[l]=s.get(l,h+1)/n;for(u=0;u<=h;u++){for(i=0,l=0;l<=h;l++)i+=s.get(l,h+1)*s.get(l,u);for(l=0;l<=h;l++)s.set(l,u,s.get(l,u)-i*r[l])}}for(l=0;l<=h;l++)s.set(l,h+1,0)}for(u=0;u<t;u++)r[u]=s.get(t-1,u),s.set(t-1,u,0);s.set(t-1,t-1,1),e[0]=0}(i,u,h,n),function(t,e,r,s){let o,i,n,h,u,l,a,f,c,m,g,w,p,d,M,b;for(n=1;n<t;n++)e[n-1]=e[n];e[t-1]=0;let y=0,x=0,E=Number.EPSILON;for(l=0;l<t;l++){for(x=Math.max(x,Math.abs(r[l])+Math.abs(e[l])),a=l;a<t&&!(Math.abs(e[a])<=E*x);)a++;if(a>l)do{for(o=r[l],f=(r[l+1]-o)/(2*e[l]),c=T(f,1),f<0&&(c=-c),r[l]=e[l]/(f+c),r[l+1]=e[l]*(f+c),m=r[l+1],i=o-r[l],n=l+2;n<t;n++)r[n]-=i;for(y+=i,f=r[a],g=1,w=g,p=g,d=e[l+1],M=0,b=0,n=a-1;n>=l;n--)for(p=w,w=g,b=M,o=g*e[n],i=g*f,c=T(f,e[n]),e[n+1]=M*c,M=e[n]/c,g=f/c,f=g*r[n]-M*o,r[n+1]=i+M*(g*o+M*r[n]),u=0;u<t;u++)i=s.get(u,n+1),s.set(u,n+1,M*s.get(u,n)+g*i),s.set(u,n,g*s.get(u,n)-M*i);f=-M*b*p*d*e[l]/m,e[l]=M*f,r[l]=g*f}while(Math.abs(e[l])>E*x);r[l]=r[l]+y,e[l]=0}for(n=0;n<t-1;n++){for(u=n,f=r[n],h=n+1;h<t;h++)r[h]<f&&(u=h,f=r[h]);if(u!==n)for(r[u]=r[n],r[n]=f,h=0;h<t;h++)f=s.get(h,n),s.set(h,n,s.get(h,u)),s.set(h,u,f)}}(i,u,h,n)}else{let t=new v(i,i),e=new Float64Array(i);for(o=0;o<i;o++)for(s=0;s<i;s++)t.set(s,o,l.get(s,o));!function(t,e,r,s){let o,i,n,h,u,l,a,f=0,c=t-1;for(l=f+1;l<=c-1;l++){for(a=0,h=l;h<=c;h++)a+=Math.abs(e.get(h,l-1));if(0!==a){for(n=0,h=c;h>=l;h--)r[h]=e.get(h,l-1)/a,n+=r[h]*r[h];for(i=Math.sqrt(n),r[l]>0&&(i=-i),n-=r[l]*i,r[l]=r[l]-i,u=l;u<t;u++){for(o=0,h=c;h>=l;h--)o+=r[h]*e.get(h,u);for(o/=n,h=l;h<=c;h++)e.set(h,u,e.get(h,u)-o*r[h])}for(h=0;h<=c;h++){for(o=0,u=c;u>=l;u--)o+=r[u]*e.get(h,u);for(o/=n,u=l;u<=c;u++)e.set(h,u,e.get(h,u)-o*r[u])}r[l]=a*r[l],e.set(l,l-1,a*i)}}for(h=0;h<t;h++)for(u=0;u<t;u++)s.set(h,u,h===u?1:0);for(l=c-1;l>=f+1;l--)if(0!==e.get(l,l-1)){for(h=l+1;h<=c;h++)r[h]=e.get(h,l-1);for(u=l;u<=c;u++){for(i=0,h=l;h<=c;h++)i+=r[h]*s.get(h,u);for(i=i/r[l]/e.get(l,l-1),h=l;h<=c;h++)s.set(h,u,s.get(h,u)+i*r[h])}}}(i,t,e,n),function(t,e,r,s,o){let i,n,h,u,l,a,f,c,m,g,w,p,d,M,b,y=t-1,x=0,E=t-1,v=Number.EPSILON,S=0,R=0,I=0,k=0,N=0,T=0,V=0,q=0;for(i=0;i<t;i++)for((i<x||i>E)&&(r[i]=o.get(i,i),e[i]=0),n=Math.max(i-1,0);n<t;n++)R+=Math.abs(o.get(i,n));for(;y>=x;){for(u=y;u>x&&(T=Math.abs(o.get(u-1,u-1))+Math.abs(o.get(u,u)),0===T&&(T=R),!(Math.abs(o.get(u,u-1))<v*T));)u--;if(u===y)o.set(y,y,o.get(y,y)+S),r[y]=o.get(y,y),e[y]=0,y--,q=0;else if(u===y-1){if(f=o.get(y,y-1)*o.get(y-1,y),I=(o.get(y-1,y-1)-o.get(y,y))/2,k=I*I+f,V=Math.sqrt(Math.abs(k)),o.set(y,y,o.get(y,y)+S),o.set(y-1,y-1,o.get(y-1,y-1)+S),c=o.get(y,y),k>=0){for(V=I>=0?I+V:I-V,r[y-1]=c+V,r[y]=r[y-1],0!==V&&(r[y]=c-f/V),e[y-1]=0,e[y]=0,c=o.get(y,y-1),T=Math.abs(c)+Math.abs(V),I=c/T,k=V/T,N=Math.sqrt(I*I+k*k),I/=N,k/=N,n=y-1;n<t;n++)V=o.get(y-1,n),o.set(y-1,n,k*V+I*o.get(y,n)),o.set(y,n,k*o.get(y,n)-I*V);for(i=0;i<=y;i++)V=o.get(i,y-1),o.set(i,y-1,k*V+I*o.get(i,y)),o.set(i,y,k*o.get(i,y)-I*V);for(i=x;i<=E;i++)V=s.get(i,y-1),s.set(i,y-1,k*V+I*s.get(i,y)),s.set(i,y,k*s.get(i,y)-I*V)}else r[y-1]=c+I,r[y]=c+I,e[y-1]=V,e[y]=-V;y-=2,q=0}else{if(c=o.get(y,y),m=0,f=0,u<y&&(m=o.get(y-1,y-1),f=o.get(y,y-1)*o.get(y-1,y)),10===q){for(S+=c,i=x;i<=y;i++)o.set(i,i,o.get(i,i)-c);T=Math.abs(o.get(y,y-1))+Math.abs(o.get(y-1,y-2)),c=m=.75*T,f=-.4375*T*T}if(30===q&&(T=(m-c)/2,T=T*T+f,T>0)){for(T=Math.sqrt(T),m<c&&(T=-T),T=c-f/((m-c)/2+T),i=x;i<=y;i++)o.set(i,i,o.get(i,i)-T);S+=T,c=m=f=.964}for(q+=1,l=y-2;l>=u&&(V=o.get(l,l),N=c-V,T=m-V,I=(N*T-f)/o.get(l+1,l)+o.get(l,l+1),k=o.get(l+1,l+1)-V-N-T,N=o.get(l+2,l+1),T=Math.abs(I)+Math.abs(k)+Math.abs(N),I/=T,k/=T,N/=T,l!==u)&&!(Math.abs(o.get(l,l-1))*(Math.abs(k)+Math.abs(N))<v*(Math.abs(I)*(Math.abs(o.get(l-1,l-1))+Math.abs(V)+Math.abs(o.get(l+1,l+1)))));)l--;for(i=l+2;i<=y;i++)o.set(i,i-2,0),i>l+2&&o.set(i,i-3,0);for(h=l;h<=y-1&&(M=h!==y-1,h!==l&&(I=o.get(h,h-1),k=o.get(h+1,h-1),N=M?o.get(h+2,h-1):0,c=Math.abs(I)+Math.abs(k)+Math.abs(N),0!==c&&(I/=c,k/=c,N/=c)),0!==c);h++)if(T=Math.sqrt(I*I+k*k+N*N),I<0&&(T=-T),0!==T){for(h!==l?o.set(h,h-1,-T*c):u!==l&&o.set(h,h-1,-o.get(h,h-1)),I+=T,c=I/T,m=k/T,V=N/T,k/=I,N/=I,n=h;n<t;n++)I=o.get(h,n)+k*o.get(h+1,n),M&&(I+=N*o.get(h+2,n),o.set(h+2,n,o.get(h+2,n)-I*V)),o.set(h,n,o.get(h,n)-I*c),o.set(h+1,n,o.get(h+1,n)-I*m);for(i=0;i<=Math.min(y,h+3);i++)I=c*o.get(i,h)+m*o.get(i,h+1),M&&(I+=V*o.get(i,h+2),o.set(i,h+2,o.get(i,h+2)-I*N)),o.set(i,h,o.get(i,h)-I),o.set(i,h+1,o.get(i,h+1)-I*k);for(i=x;i<=E;i++)I=c*s.get(i,h)+m*s.get(i,h+1),M&&(I+=V*s.get(i,h+2),s.set(i,h+2,s.get(i,h+2)-I*N)),s.set(i,h,s.get(i,h)-I),s.set(i,h+1,s.get(i,h+1)-I*k)}}}if(0===R)return;for(y=t-1;y>=0;y--)if(I=r[y],k=e[y],0===k)for(u=y,o.set(y,y,1),i=y-1;i>=0;i--){for(f=o.get(i,i)-I,N=0,n=u;n<=y;n++)N+=o.get(i,n)*o.get(n,y);if(e[i]<0)V=f,T=N;else if(u=i,0===e[i]?o.set(i,y,0!==f?-N/f:-N/(v*R)):(c=o.get(i,i+1),m=o.get(i+1,i),k=(r[i]-I)*(r[i]-I)+e[i]*e[i],a=(c*T-V*N)/k,o.set(i,y,a),o.set(i+1,y,Math.abs(c)>Math.abs(V)?(-N-f*a)/c:(-T-m*a)/V)),a=Math.abs(o.get(i,y)),v*a*a>1)for(n=i;n<=y;n++)o.set(n,y,o.get(n,y)/a)}else if(k<0)for(u=y-1,Math.abs(o.get(y,y-1))>Math.abs(o.get(y-1,y))?(o.set(y-1,y-1,k/o.get(y,y-1)),o.set(y-1,y,-(o.get(y,y)-I)/o.get(y,y-1))):(b=$(0,-o.get(y-1,y),o.get(y-1,y-1)-I,k),o.set(y-1,y-1,b[0]),o.set(y-1,y,b[1])),o.set(y,y-1,0),o.set(y,y,1),i=y-2;i>=0;i--){for(g=0,w=0,n=u;n<=y;n++)g+=o.get(i,n)*o.get(n,y-1),w+=o.get(i,n)*o.get(n,y);if(f=o.get(i,i)-I,e[i]<0)V=f,N=g,T=w;else if(u=i,0===e[i]?(b=$(-g,-w,f,k),o.set(i,y-1,b[0]),o.set(i,y,b[1])):(c=o.get(i,i+1),m=o.get(i+1,i),p=(r[i]-I)*(r[i]-I)+e[i]*e[i]-k*k,d=2*(r[i]-I)*k,0===p&&0===d&&(p=v*R*(Math.abs(f)+Math.abs(k)+Math.abs(c)+Math.abs(m)+Math.abs(V))),b=$(c*N-V*g+k*w,c*T-V*w-k*g,p,d),o.set(i,y-1,b[0]),o.set(i,y,b[1]),Math.abs(c)>Math.abs(V)+Math.abs(k)?(o.set(i+1,y-1,(-g-f*o.get(i,y-1)+k*o.get(i,y))/c),o.set(i+1,y,(-w-f*o.get(i,y)-k*o.get(i,y-1))/c)):(b=$(-N-m*o.get(i,y-1),-T-m*o.get(i,y),V,k),o.set(i+1,y-1,b[0]),o.set(i+1,y,b[1]))),a=Math.max(Math.abs(o.get(i,y-1)),Math.abs(o.get(i,y))),v*a*a>1)for(n=i;n<=y;n++)o.set(n,y-1,o.get(n,y-1)/a),o.set(n,y,o.get(n,y)/a)}for(i=0;i<t;i++)if(i<x||i>E)for(n=i;n<t;n++)s.set(i,n,o.get(i,n));for(n=t-1;n>=x;n--)for(i=x;i<=E;i++){for(V=0,h=x;h<=Math.min(n,E);h++)V+=s.get(i,h)*o.get(h,n);s.set(i,n,V)}}(i,u,h,n,t)}this.n=i,this.e=u,this.d=h,this.V=n}get realEigenvalues(){return Array.from(this.d)}get imaginaryEigenvalues(){return Array.from(this.e)}get eigenvectorMatrix(){return this.V}get diagonalMatrix(){let t,e,r=this.n,s=this.e,o=this.d,i=new v(r,r);for(t=0;t<r;t++){for(e=0;e<r;e++)i.set(t,e,0);i.set(t,t,o[t]),s[t]>0?i.set(t,t+1,s[t]):s[t]<0&&i.set(t,t-1,s[t])}return i}}function $(t,e,r,s){let o,i;return Math.abs(r)>Math.abs(s)?(o=s/r,i=r+o*s,[(t+o*e)/i,(e-o*t)/i]):(o=r/s,i=s+o*r,[(o*t+e)/i,(o*e-t)/i])}class j{constructor(t){if(!(t=k.checkMatrix(t)).isSymmetric())throw new Error("Matrix is not symmetric");let e,r,s,o=t,i=o.rows,n=new v(i,i),h=!0;for(r=0;r<i;r++){let t=0;for(s=0;s<r;s++){let i=0;for(e=0;e<s;e++)i+=n.get(s,e)*n.get(r,e);i=(o.get(r,s)-i)/n.get(s,s),n.set(r,s,i),t+=i*i}for(t=o.get(r,r)-t,h&=t>0,n.set(r,r,Math.sqrt(Math.max(t,0))),s=r+1;s<i;s++)n.set(r,s,0)}this.L=n,this.positiveDefinite=Boolean(h)}isPositiveDefinite(){return this.positiveDefinite}solve(t){t=k.checkMatrix(t);let e=this.L,r=e.rows;if(t.rows!==r)throw new Error("Matrix dimensions do not match");if(!1===this.isPositiveDefinite())throw new Error("Matrix is not positive definite");let s,o,i,n=t.columns,h=t.clone();for(i=0;i<r;i++)for(o=0;o<n;o++){for(s=0;s<i;s++)h.set(i,o,h.get(i,o)-h.get(s,o)*e.get(i,s));h.set(i,o,h.get(i,o)/e.get(i,i))}for(i=r-1;i>=0;i--)for(o=0;o<n;o++){for(s=i+1;s<r;s++)h.set(i,o,h.get(i,o)-h.get(s,o)*e.get(s,i));h.set(i,o,h.get(i,o)/e.get(i,i))}return h}get lowerTriangularMatrix(){return this.L}}class P{constructor(t,e={}){t=k.checkMatrix(t);let{Y:s}=e;const{scaleScores:o=!1,maxIterations:i=1e3,terminationCriteria:n=1e-10}=e;let h;if(s){if(s=r(s)&&"number"==typeof s[0]?v.columnVector(s):k.checkMatrix(s),s.rows!==t.rows)throw new Error("Y should have the same number of rows as X");h=s.getColumnVector(0)}else h=t.getColumnVector(0);let u,l,a,f,c=1;for(let e=0;e<i&&c>n;e++)a=t.transpose().mmul(h).div(h.transpose().mmul(h).get(0,0)),a=a.div(a.norm()),u=t.mmul(a).div(a.transpose().mmul(a).get(0,0)),e>0&&(c=u.clone().sub(f).pow(2).sum()),f=u.clone(),s?(l=s.transpose().mmul(u).div(u.transpose().mmul(u).get(0,0)),l=l.div(l.norm()),h=s.mmul(l).div(l.transpose().mmul(l).get(0,0))):h=u;if(s){let e=t.transpose().mmul(u).div(u.transpose().mmul(u).get(0,0));e=e.div(e.norm());let r=t.clone().sub(u.clone().mmul(e.transpose())),o=h.transpose().mmul(u).div(u.transpose().mmul(u).get(0,0)),i=s.clone().sub(u.clone().mulS(o.get(0,0)).mmul(l.transpose()));this.t=u,this.p=e.transpose(),this.w=a.transpose(),this.q=l,this.u=h,this.s=u.transpose().mmul(u),this.xResidual=r,this.yResidual=i,this.betas=o}else this.w=a.transpose(),this.s=u.transpose().mmul(u).sqrt(),this.t=o?u.clone().div(this.s.get(0,0)):u,this.xResidual=t.sub(u.mmul(a.transpose()))}}t.AbstractMatrix=x,t.CHO=j,t.CholeskyDecomposition=j,t.EVD=D,t.EigenvalueDecomposition=D,t.LU=N,t.LuDecomposition=N,t.Matrix=v,t.MatrixColumnSelectionView=class extends S{constructor(t,e){p(t,e),super(t,t.rows,e.length),this.columnIndices=e}set(t,e,r){return this.matrix.set(t,this.columnIndices[e],r),this}get(t,e){return this.matrix.get(t,this.columnIndices[e])}},t.MatrixColumnView=class extends S{constructor(t,e){c(t,e),super(t,t.rows,1),this.column=e}set(t,e,r){return this.matrix.set(t,this.column,r),this}get(t){return this.matrix.get(t,this.column)}},t.MatrixFlipColumnView=class extends S{constructor(t){super(t,t.rows,t.columns)}set(t,e,r){return this.matrix.set(t,this.columns-e-1,r),this}get(t,e){return this.matrix.get(t,this.columns-e-1)}},t.MatrixFlipRowView=class extends S{constructor(t){super(t,t.rows,t.columns)}set(t,e,r){return this.matrix.set(this.rows-t-1,e,r),this}get(t,e){return this.matrix.get(this.rows-t-1,e)}},t.MatrixRowSelectionView=class extends S{constructor(t,e){w(t,e),super(t,e.length,t.columns),this.rowIndices=e}set(t,e,r){return this.matrix.set(this.rowIndices[t],e,r),this}get(t,e){return this.matrix.get(this.rowIndices[t],e)}},t.MatrixRowView=class extends S{constructor(t,e){f(t,e),super(t,1,t.columns),this.row=e}set(t,e,r){return this.matrix.set(this.row,e,r),this}get(t,e){return this.matrix.get(this.row,e)}},t.MatrixSelectionView=R,t.MatrixSubView=class extends S{constructor(t,e,r,s,o){d(t,e,r,s,o),super(t,r-e+1,o-s+1),this.startRow=e,this.startColumn=s}set(t,e,r){return this.matrix.set(this.startRow+t,this.startColumn+e,r),this}get(t,e){return this.matrix.get(this.startRow+t,this.startColumn+e)}},t.MatrixTransposeView=class extends S{constructor(t){super(t,t.columns,t.rows)}set(t,e,r){return this.matrix.set(e,t,r),this}get(t,e){return this.matrix.get(e,t)}},t.NIPALS=P,t.Nipals=P,t.QR=V,t.QrDecomposition=V,t.SVD=q,t.SingularValueDecomposition=q,t.WrapperMatrix1D=I,t.WrapperMatrix2D=k,t.correlation=function(t,e=t,s={}){t=new v(t);let o=!1;if("object"!=typeof e||v.isMatrix(e)||r(e)?e=new v(e):(s=e,e=t,o=!0),t.rows!==e.rows)throw new TypeError("Both matrices must have the same number of rows");const{center:i=!0,scale:n=!0}=s;i&&(t.center("column"),o||e.center("column")),n&&(t.scale("column"),o||e.scale("column"));const h=t.standardDeviation("column",{unbiased:!0}),u=o?h:e.standardDeviation("column",{unbiased:!0}),l=t.transpose().mmul(e);for(let e=0;e<l.rows;e++)for(let r=0;r<l.columns;r++)l.set(e,r,l.get(e,r)*(1/(h[e]*u[r]))*(1/(t.rows-1)));return l},t.covariance=function(t,e=t,s={}){t=new v(t);let o=!1;if("object"!=typeof e||v.isMatrix(e)||r(e)?e=new v(e):(s=e,e=t,o=!0),t.rows!==e.rows)throw new TypeError("Both matrices must have the same number of rows");const{center:i=!0}=s;i&&(t=t.center("column"),o||(e=e.center("column")));const n=t.transpose().mmul(e);for(let e=0;e<n.rows;e++)for(let r=0;r<n.columns;r++)n.set(e,r,n.get(e,r)*(1/(t.rows-1)));return n},t.default=v,t.determinant=function t(e){if((e=v.checkMatrix(e)).isSquare()){if(0===e.columns)return 1;let r,s,o,i;if(2===e.columns)return r=e.get(0,0),s=e.get(0,1),o=e.get(1,0),i=e.get(1,1),r*i-s*o;if(3===e.columns){let i,n,h;return i=new R(e,[1,2],[1,2]),n=new R(e,[1,2],[0,2]),h=new R(e,[1,2],[0,1]),r=e.get(0,0),s=e.get(0,1),o=e.get(0,2),r*t(i)-s*t(n)+o*t(h)}return new N(e).determinant}throw Error("determinant can only be calculated for a square matrix")},t.inverse=function(t,e=!1){return t=k.checkMatrix(t),e?new q(t).inverse():A(t,v.eye(t.rows))},t.linearDependencies=function(t,e={}){const{thresholdValue:r=1e-9,thresholdError:s=1e-9}=e;let o=(t=v.checkMatrix(t)).rows,i=new v(o,o);for(let e=0;e<o;e++){let n=v.columnVector(t.getRow(e)),h=t.subMatrixRow(C(o,e)).transpose(),u=new q(h).solve(n),l=v.sub(n,h.mmul(u)).abs().max();i.setRow(e,F(l,u,e,r,s))}return i},t.pseudoInverse=function(t,e=Number.EPSILON){if((t=v.checkMatrix(t)).isEmpty())return t.transpose();let r=new q(t,{autoTranspose:!0}),s=r.leftSingularVectors,o=r.rightSingularVectors,i=r.diagonal;for(let t=0;t<i.length;t++)Math.abs(i[t])>e?i[t]=1/i[t]:i[t]=0;return o.mmul(v.diag(i).mmul(s.transpose()))},t.solve=A,t.wrap=function(t,e){if(r(t))return t[0]&&r(t[0])?new k(t):new I(t,e);throw new Error("the argument is not an array")},Object.defineProperty(t,"__esModule",{value:!0})}));
|
package/package.json
CHANGED
package/src/inspect.js
CHANGED
|
@@ -6,25 +6,43 @@ export function inspectMatrix() {
|
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
export function inspectMatrixWithOptions(matrix, options = {}) {
|
|
9
|
-
const {
|
|
9
|
+
const {
|
|
10
|
+
maxRows = 15,
|
|
11
|
+
maxColumns = 10,
|
|
12
|
+
maxNumSize = 8,
|
|
13
|
+
padMinus = 'auto',
|
|
14
|
+
} = options;
|
|
10
15
|
return `${matrix.constructor.name} {
|
|
11
16
|
${indent}[
|
|
12
|
-
${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize)}
|
|
17
|
+
${indentData}${inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus)}
|
|
13
18
|
${indent}]
|
|
14
19
|
${indent}rows: ${matrix.rows}
|
|
15
20
|
${indent}columns: ${matrix.columns}
|
|
16
21
|
}`;
|
|
17
22
|
}
|
|
18
23
|
|
|
19
|
-
function inspectData(matrix, maxRows, maxColumns, maxNumSize) {
|
|
24
|
+
function inspectData(matrix, maxRows, maxColumns, maxNumSize, padMinus) {
|
|
20
25
|
const { rows, columns } = matrix;
|
|
21
26
|
const maxI = Math.min(rows, maxRows);
|
|
22
27
|
const maxJ = Math.min(columns, maxColumns);
|
|
23
28
|
const result = [];
|
|
29
|
+
|
|
30
|
+
if (padMinus === 'auto') {
|
|
31
|
+
padMinus = false;
|
|
32
|
+
loop: for (let i = 0; i < maxI; i++) {
|
|
33
|
+
for (let j = 0; j < maxJ; j++) {
|
|
34
|
+
if (matrix.get(i, j) < 0) {
|
|
35
|
+
padMinus = true;
|
|
36
|
+
break loop;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
24
42
|
for (let i = 0; i < maxI; i++) {
|
|
25
43
|
let line = [];
|
|
26
44
|
for (let j = 0; j < maxJ; j++) {
|
|
27
|
-
line.push(formatNumber(matrix.get(i, j), maxNumSize));
|
|
45
|
+
line.push(formatNumber(matrix.get(i, j), maxNumSize, padMinus));
|
|
28
46
|
}
|
|
29
47
|
result.push(`${line.join(' ')}`);
|
|
30
48
|
}
|
|
@@ -37,17 +55,37 @@ function inspectData(matrix, maxRows, maxColumns, maxNumSize) {
|
|
|
37
55
|
return result.join(`\n${indentData}`);
|
|
38
56
|
}
|
|
39
57
|
|
|
40
|
-
function formatNumber(num, maxNumSize) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
58
|
+
function formatNumber(num, maxNumSize, padMinus) {
|
|
59
|
+
return (
|
|
60
|
+
num >= 0 && padMinus
|
|
61
|
+
? ` ${formatNumber2(num, maxNumSize - 1)}`
|
|
62
|
+
: formatNumber2(num, maxNumSize)
|
|
63
|
+
).padEnd(maxNumSize);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function formatNumber2(num, len) {
|
|
67
|
+
// small.length numbers should be as is
|
|
68
|
+
let str = num.toString();
|
|
69
|
+
if (str.length <= len) return str;
|
|
70
|
+
|
|
71
|
+
// (7)'0.00123' is better then (7)'1.23e-2'
|
|
72
|
+
// (8)'0.000123' is worse then (7)'1.23e-3',
|
|
73
|
+
let fix = num.toFixed(len);
|
|
74
|
+
if (fix.length > len) {
|
|
75
|
+
fix = num.toFixed(Math.max(0, len - (fix.length - len)));
|
|
44
76
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
77
|
+
if (
|
|
78
|
+
fix.length <= len &&
|
|
79
|
+
!fix.startsWith('0.000') &&
|
|
80
|
+
!fix.startsWith('-0.000')
|
|
81
|
+
) {
|
|
82
|
+
return fix;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// well, if it's still too long the user should've used longer numbers
|
|
86
|
+
let exp = num.toExponential(len);
|
|
87
|
+
if (exp.length > len) {
|
|
88
|
+
exp = num.toExponential(Math.max(0, len - (exp.length - len)));
|
|
48
89
|
}
|
|
49
|
-
|
|
50
|
-
const eIndex = exponential.indexOf('e');
|
|
51
|
-
const e = exponential.slice(eIndex);
|
|
52
|
-
return exponential.slice(0, maxNumSize - e.length) + e;
|
|
90
|
+
return exp.slice(0);
|
|
53
91
|
}
|