ml-matrix 6.1.2 → 6.4.1

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.umd.js ADDED
@@ -0,0 +1 @@
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).mlMatrix={})}(this,(function(t){"use strict";const e=Object.prototype.toString;var r=function(t){return e.call(t).endsWith("Array]")};function s(t){var e,s=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!==s.output){if(!r(s.output))throw new TypeError("output option must be an array if specified");e=s.output}else e=new Array(t.length);var o=function(t){if(!r(t))throw new TypeError("input must be an array");if(0===t.length)throw new TypeError("input must not be empty");for(var e=t[0],s=1;s<t.length;s++)t[s]<e&&(e=t[s]);return e}(t),i=function(t){if(!r(t))throw new TypeError("input must be an array");if(0===t.length)throw new TypeError("input must not be empty");for(var e=t[0],s=1;s<t.length;s++)t[s]>e&&(e=t[s]);return e}(t);if(o===i)throw new RangeError("minimum and maximum input values are equal. Cannot rescale a constant array");var n=s.min,h=void 0===n?s.autoMinMax?o:0:n,u=s.max,l=void 0===u?s.autoMinMax?i:1:u;if(h>=l)throw new RangeError("min option must be smaller than max option");for(var a=(l-h)/(i-o),f=0;f<t.length;f++)e[f]=(t[f]-o)*a+h;return e}function o(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 i(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 n(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 h(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 u(t,e,r){return{row:l(t,e),column:a(t,r)}}function l(t,e){if("object"!=typeof e)throw new TypeError("unexpected type for row indices");if(e.some(e=>e<0||e>=t.rows))throw new RangeError("row indices are out of range");return Array.isArray(e)||(e=Array.from(e)),e}function a(t,e){if("object"!=typeof e)throw new TypeError("unexpected type for column indices");if(e.some(e=>e<0||e>=t.columns))throw new RangeError("column indices are out of range");return Array.isArray(e)||(e=Array.from(e)),e}function f(t,e,r,s,o){if(5!==arguments.length)throw new RangeError("expected 4 arguments");if(g("startRow",e),g("endRow",r),g("startColumn",s),g("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 c(t,e=0){let r=[];for(let s=0;s<t;s++)r.push(e);return r}function g(t,e){if("number"!=typeof e)throw new TypeError(`${t} must be a number`)}const m=15,w=10,p=8;function d(t){const e=String(t);if(e.length<=p)return e.padEnd(p," ");const r=t.toPrecision(p-2);if(r.length<=p)return r;const s=t.toExponential(p-2),o=s.indexOf("e"),i=s.substring(o);return s.substring(0,p-i.length)+i}class M{static from1DArray(t,e,r){if(t*e!==r.length)throw new RangeError("data length does not match given dimensions");let s=new b(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 b(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 b(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 b(t,e)}static ones(t,e){return new b(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 b(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 b(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 b(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 M.isMatrix(t)?t:new b(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}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 b(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){o(this,t);let e=[];for(let r=0;r<this.columns;r++)e.push(this.get(t,r));return e}getRowVector(t){return b.rowVector(this.getRow(t))}setRow(t,e){o(this,t),e=n(this,e);for(let r=0;r<this.columns;r++)this.set(t,r,e[r]);return this}swapRows(t,e){o(this,t),o(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){i(this,t);let e=[];for(let r=0;r<this.rows;r++)e.push(this.get(r,t));return e}getColumnVector(t){return b.columnVector(this.getColumn(t))}setColumn(t,e){i(this,t),e=h(this,e);for(let r=0;r<this.rows;r++)this.set(r,t,e[r]);return this}swapColumns(t,e){i(this,t),i(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=n(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=n(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=n(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=n(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=h(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=h(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=h(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=h(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){o(this,t);for(let r=0;r<this.columns;r++)this.set(t,r,this.get(t,r)*e);return this}mulColumn(t,e){i(this,t);for(let r=0;r<this.rows;r++)this.set(r,t,this.get(r,t)*e);return this}max(){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}maxIndex(){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(){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}minIndex(){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){o(this,t);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){o(this,t);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){o(this,t);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){o(this,t);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){i(this,t);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){i(this,t);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){i(this,t);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){i(this,t);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){M.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=b.checkMatrix(t);let e=this.rows,r=this.columns,s=t.columns,o=new b(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=b.checkMatrix(t);let e=new b(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),g=u*(h-s),m=(r+o)*l,w=a+g-m+(o-u)*(h+l),p=c+m,d=f+g,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=b.checkMatrix(t);let e=new b(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),g=t.get(0,2),m=t.get(1,0),w=t.get(1,1),p=t.get(1,2),d=t.get(2,0),M=t.get(2,1),y=t.get(2,2),x=(r-i)*(-c+w),v=(-r+i+n)*(f-c+w),E=(i+n)*(-f+c),S=r*f,R=(-r+u+l)*(f-g+p),A=(-r+u)*(g-p),k=(u+l)*(-f+g),V=(-o+l+a)*(w+d-M),T=(o-a)*(w-M),I=o*d,q=(l+a)*(-d+M),C=(-o+n+h)*(p+d-y),F=(o-h)*(p-y),N=(n+h)*(-d+y),D=S+I+s*m,j=(r+s+o-i-n-l-a)*w+v+E+S+V+I+q,$=S+R+k+(r+s+o-n-h-u-l)*p+I+C+N,L=x+n*(-f+c+m-w-p-d+y)+v+S+I+C+F,P=x+v+E+S+h*M,z=I+C+F+N+i*g,U=S+R+A+l*(-f+g+m-w-p-d+M)+V+T+I,O=V+T+I+q+u*c,_=S+R+A+k+a*y;return e.set(0,0,D),e.set(0,1,j),e.set(0,2,$),e.set(1,0,L),e.set(1,1,P),e.set(1,2,z),e.set(2,0,U),e.set(2,1,O),e.set(2,2,_),e}mmulStrassen(t){t=b.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=M.zeros(e,r);return s=s.setSubMatrix(t,0,0)}}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 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),g=r.subMatrix(i,r.rows-1,0,h-1),m=e.subMatrix(i,e.rows-1,h,e.columns-1),w=r.subMatrix(i,r.rows-1,h,r.columns-1),p=t(M.add(u,m),M.add(l,w),i,h),d=t(M.add(c,m),l,i,h),y=t(u,M.sub(f,w),i,h),b=t(m,M.sub(g,l),i,h),x=t(M.add(u,a),w,i,h),v=t(M.sub(c,u),M.add(l,f),i,h),E=t(M.sub(a,m),M.add(g,w),i,h),S=M.add(p,b);S.sub(x),S.add(E);let R=M.add(y,x),A=M.add(d,b),k=M.sub(p,d);k.add(y),k.add(v);let V=M.zeros(2*S.rows,2*S.columns);return(V=(V=(V=(V=V.setSubMatrix(S,0,0)).setSubMatrix(R,S.rows,0)).setSubMatrix(A,0,S.columns)).setSubMatrix(k,S.rows,S.columns)).subMatrix(0,s-1,0,o-1)}(e=n(e,h,u),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 o=new b(this.rows,this.columns);for(let t=0;t<this.rows;t++){const i=this.getRow(t);s(i,{min:e,max:r,output:i}),o.setRow(t,i)}return o}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 o=new b(this.rows,this.columns);for(let t=0;t<this.columns;t++){const i=this.getColumn(t);s(i,{min:e,max:r,output:i}),o.setColumn(t,i)}return o}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=b.checkMatrix(t);let e=this.rows,r=this.columns,s=t.rows,o=t.columns,i=new b(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}transpose(){let t=new b(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=y){for(let e=0;e<this.rows;e++)this.setRow(e,this.getRow(e).sort(t));return this}sortColumns(t=y){for(let e=0;e<this.columns;e++)this.setColumn(e,this.getColumn(e).sort(t));return this}subMatrix(t,e,r,s){f(this,t,e,r,s);let o=new b(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 b(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 b(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){f(this,e,e+(t=b.checkMatrix(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){let r=u(this,t,e),s=new b(t.length,e.length);for(let t=0;t<r.row.length;t++){let e=r.row[t];for(let o=0;o<r.column.length;o++){let i=r.column[o];s.set(t,o,this.get(e,i))}}return s}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 b(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=c(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=c(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=c(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=c(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:r=!0,mean:s=this.mean(t)}=e;if("boolean"!=typeof r)throw new TypeError("unbiased must be a boolean");switch(t){case"row":if(!Array.isArray(s))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++)s+=u=t.get(n,e)-r[n],h+=u*u;e?i.push((h-s*s/o)/(o-1)):i.push((h-s*s/o)/o)}return i}(this,r,s);case"column":if(!Array.isArray(s))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++)o+=u=t.get(e,n)-r[n],h+=u*u;e?i.push((h-o*o/s)/(s-1)):i.push((h-o*o/s)/s)}return i}(this,r,s);case void 0:if("number"!=typeof s)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++)n+=u=t.get(e,s)-r,h+=u*u;return e?(h-n*n/i)/(i-1):(h-n*n/i)/i}(this,r,s);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:r=this.mean(t)}=e;switch(t){case"row":if(!Array.isArray(r))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,r),this;case"column":if(!Array.isArray(r))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,r),this;case void 0:if("number"!=typeof r)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,r),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 r=e.scale;switch(t){case"row":if(void 0===r)r=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(!Array.isArray(r))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,r),this;case"column":if(void 0===r)r=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(!Array.isArray(r))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,r),this;case void 0:if(void 0===r)r=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 r)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,r),this;default:throw new Error(`invalid option: ${t}`)}}}function y(t,e){return t-e}M.prototype.klass="Matrix","undefined"!=typeof Symbol&&(M.prototype[Symbol.for("nodejs.util.inspect.custom")]=function(){const t=" ".repeat(2),e=" ".repeat(4);return`${this.constructor.name} {\n${t}[\n${e}${function(t,e){const{rows:r,columns:s}=t,o=Math.min(r,m),i=Math.min(s,w),n=[];for(let e=0;e<o;e++){let r=[];for(let s=0;s<i;s++)r.push(d(t.get(e,s)));n.push(`${r.join(" ")}`)}i!==s&&(n[n.length-1]+=` ... ${s-w} more columns`);o!==r&&n.push(`... ${r-m} more rows`);return n.join(`\n${e}`)}(this,e)}\n${t}]\n${t}rows: ${this.rows}\n${t}columns: ${this.columns}\n}`}),M.random=M.rand,M.randomInt=M.randInt,M.diagonal=M.diag,M.prototype.diagonal=M.prototype.diag,M.identity=M.eye,M.prototype.negate=M.prototype.neg,M.prototype.tensorProduct=M.prototype.kroneckerProduct;class b extends M{constructor(t,e){if(super(),b.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(!Array.isArray(t))throw new TypeError("First argument must be a positive number or an array");{const r=t;if(t=r.length,"number"!=typeof(e=r[0].length)||0===e)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");this.data.push(Float64Array.from(r[s]))}}}return this.rows=t,this.columns=e,this}set(t,e,r){return this.data[t][e]=r,this}get(t,e){return this.data[t][e]}removeRow(t){if(o(this,t),1===this.rows)throw new RangeError("A matrix cannot have less than one row");return this.data.splice(t,1),this.rows-=1,this}addRow(t,e){return void 0===e&&(e=t,t=this.rows),o(this,t,!0),e=Float64Array.from(n(this,e)),this.data.splice(t,0,e),this.rows+=1,this}removeColumn(t){if(i(this,t),1===this.columns)throw new RangeError("A matrix cannot have less than one column");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),i(this,t,!0),e=h(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}}(M,b);class x extends M{constructor(t,e,r){super(),this.matrix=t,this.rows=e,this.columns=r}}class v extends x{constructor(t,e,r){let s=u(t,e,r);super(t,s.row.length,s.column.length),this.rowIndices=s.row,this.columnIndices=s.column}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 E extends M{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 S extends M{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 R{constructor(t){let e,r,s,o,i,n,h,u,l,a=(t=S.checkMatrix(t)).clone(),f=a.rows,c=a.columns,g=new Float64Array(f),m=1;for(e=0;e<f;e++)g[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=g[o],g[o]=g[r],g[r]=h,m=-m}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=g,this.pivotSign=m}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=b.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 b(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 b(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 A(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 k{constructor(t){let e,r,s,o,i=(t=S.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=A(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=b.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 b(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 b(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={}){let r=(t=S.checkMatrix(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){r=(h=t.transpose()).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),g=new Float64Array(c),m=new b(r,f),w=new b(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 y=Math.min(r-1,s),x=Math.max(0,Math.min(s-2,r)),v=Math.max(y,x);for(let t=0;t<v;t++){if(t<y){g[t]=0;for(let e=t;e<r;e++)g[t]=A(g[t],h.get(e,t));if(0!==g[t]){h.get(t,t)<0&&(g[t]=-g[t]);for(let e=t;e<r;e++)h.set(e,t,h.get(e,t)/g[t]);h.set(t,t,h.get(t,t)+1)}g[t]=-g[t]}for(let e=t+1;e<s;e++){if(t<y&&0!==g[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<y)for(let e=t;e<r;e++)m.set(e,t,h.get(e,t));if(t<x){p[t]=0;for(let e=t+1;e<s;e++)p[t]=A(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(y<s&&(g[y]=h.get(y,y)),r<E&&(g[E-1]=0),x+1<E&&(p[x]=h.get(x,E-1)),p[E-1]=0,u){for(let t=y;t<f;t++){for(let e=0;e<r;e++)m.set(e,t,0);m.set(t,t,1)}for(let t=y-1;t>=0;t--)if(0!==g[t]){for(let e=t+1;e<f;e++){let s=0;for(let o=t;o<r;o++)s+=m.get(o,t)*m.get(o,e);s=-s/m.get(t,t);for(let o=t;o<r;o++)m.set(o,e,m.get(o,e)+s*m.get(o,t))}for(let e=t;e<r;e++)m.set(e,t,-m.get(e,t));m.set(t,t,1+m.get(t,t));for(let e=0;e<t-1;e++)m.set(e,t,0)}else{for(let e=0;e<r;e++)m.set(e,t,0);m.set(t,t,1)}}if(l)for(let t=s-1;t>=0;t--){if(t<x&&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 R=E-1,k=Number.EPSILON;for(;E>0;){let t,e;for(t=E-2;t>=-1&&-1!==t;t--){const e=Number.MIN_VALUE+k*Math.abs(g[t]+Math.abs(g[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(g[r])<=k*e){g[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=A(g[r],e),i=g[r]/o,n=e/o;if(g[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=A(g[s],e),i=g[s]/o,n=e/o;if(g[s]=o,e=-n*p[s],p[s]=i*p[s],u)for(let e=0;e<r;e++)o=i*m.get(e,s)+n*m.get(e,t-1),m.set(e,t-1,-n*m.get(e,s)+i*m.get(e,t-1)),m.set(e,s,o)}break}case 3:{const e=Math.max(Math.abs(g[E-1]),Math.abs(g[E-2]),Math.abs(p[E-2]),Math.abs(g[t]),Math.abs(p[t])),o=g[E-1]/e,i=g[E-2]/e,n=p[E-2]/e,h=g[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=c/(f+(d=f<0?0-Math.sqrt(f*f+c):Math.sqrt(f*f+c))));let M=(h+o)*(h-o)+d,y=h*a;for(let e=t;e<E-1;e++){let o=A(M,y);0===o&&(o=Number.MIN_VALUE);let i=M/o,n=y/o;if(e!==t&&(p[e-1]=o),M=i*g[e]+n*p[e],p[e]=i*p[e]-n*g[e],y=n*g[e+1],g[e+1]=i*g[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(0===(o=A(M,y))&&(o=Number.MIN_VALUE),i=M/o,n=y/o,g[e]=o,M=i*p[e]+n*g[e+1],g[e+1]=-n*p[e]+i*g[e+1],y=n*p[e+1],p[e+1]=i*p[e+1],u&&e<r-1)for(let t=0;t<r;t++)o=i*m.get(t,e)+n*m.get(t,e+1),m.set(t,e+1,-n*m.get(t,e)+i*m.get(t,e+1)),m.set(t,e,o)}p[E-2]=M;break}case 4:if(g[t]<=0&&(g[t]=g[t]<0?-g[t]:0,l))for(let e=0;e<=R;e++)w.set(e,t,-w.get(e,t));for(;t<R&&!(g[t]>=g[t+1]);){let e=g[t];if(g[t]=g[t+1],g[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=m.get(s,t+1),m.set(s,t+1,m.get(s,t)),m.set(s,t,e);t++}E--}}if(a){let t=w;w=m,m=t}this.m=r,this.n=s,this.s=g,this.U=m,this.V=w}solve(t){let e=t,r=this.threshold,s=this.s.length,o=b.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=b.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(b.diag(t))}inverse(){let t=this.V,e=this.threshold,r=t.rows,s=t.columns,o=new b(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 b(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 b.diag(this.s)}}function T(t,e,r=!1){return t=S.checkMatrix(t),e=S.checkMatrix(e),r?new V(t).solve(e):t.isSquare()?new R(t).solve(e):new k(t).solve(e)}function I(t,e){let r=[];for(let s=0;s<t;s++)s!==e&&r.push(s);return r}function q(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 C{constructor(t,e={}){const{assumeSymmetric:r=!1}=e;if(!(t=S.checkMatrix(t)).isSquare())throw new Error("Matrix is not a square matrix");let s,o,i=t.columns,n=new b(i,i),h=new Float64Array(i),u=new Float64Array(i),l=t,a=!1;if(a=!!r||t.isSymmetric()){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),0!==(n=r[h+1])){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,g,m,w,p,d,M,y;for(n=1;n<t;n++)e[n-1]=e[n];e[t-1]=0;let b=0,x=0,v=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])<=v*x);)a++;if(a>l)do{for(o=r[l],f=(r[l+1]-o)/(2*e[l]),c=A(f,1),f<0&&(c=-c),r[l]=e[l]/(f+c),r[l+1]=e[l]*(f+c),g=r[l+1],i=o-r[l],n=l+2;n<t;n++)r[n]-=i;for(b+=i,f=r[a],w=m=1,p=m,d=e[l+1],M=0,y=0,n=a-1;n>=l;n--)for(p=w,w=m,y=M,o=m*e[n],i=m*f,c=A(f,e[n]),e[n+1]=M*c,M=e[n]/c,f=(m=f/c)*r[n]-M*o,r[n+1]=i+M*(m*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)+m*i),s.set(u,n,m*s.get(u,n)-M*i);f=-M*y*p*d*e[l]/g,e[l]=M*f,r[l]=m*f}while(Math.abs(e[l])>v*x);r[l]=r[l]+b,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 b(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=t-1;for(l=1;l<=f-1;l++){for(a=0,h=l;h<=f;h++)a+=Math.abs(e.get(h,l-1));if(0!==a){for(n=0,h=f;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=f;h>=l;h--)o+=r[h]*e.get(h,u);for(o/=n,h=l;h<=f;h++)e.set(h,u,e.get(h,u)-o*r[h])}for(h=0;h<=f;h++){for(o=0,u=f;u>=l;u--)o+=r[u]*e.get(h,u);for(o/=n,u=l;u<=f;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=f-1;l>=1;l--)if(0!==e.get(l,l-1)){for(h=l+1;h<=f;h++)r[h]=e.get(h,l-1);for(u=l;u<=f;u++){for(i=0,h=l;h<=f;h++)i+=r[h]*s.get(h,u);for(i=i/r[l]/e.get(l,l-1),h=l;h<=f;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,g,m,w,p,d,M,y,b=t-1,x=t-1,v=Number.EPSILON,E=0,S=0,R=0,A=0,k=0,V=0,T=0,I=0;for(i=0;i<t;i++)for((i<0||i>x)&&(r[i]=o.get(i,i),e[i]=0),n=Math.max(i-1,0);n<t;n++)S+=Math.abs(o.get(i,n));for(;b>=0;){for(u=b;u>0&&(0===(V=Math.abs(o.get(u-1,u-1))+Math.abs(o.get(u,u)))&&(V=S),!(Math.abs(o.get(u,u-1))<v*V));)u--;if(u===b)o.set(b,b,o.get(b,b)+E),r[b]=o.get(b,b),e[b]=0,b--,I=0;else if(u===b-1){if(f=o.get(b,b-1)*o.get(b-1,b),R=(o.get(b-1,b-1)-o.get(b,b))/2,A=R*R+f,T=Math.sqrt(Math.abs(A)),o.set(b,b,o.get(b,b)+E),o.set(b-1,b-1,o.get(b-1,b-1)+E),c=o.get(b,b),A>=0){for(T=R>=0?R+T:R-T,r[b-1]=c+T,r[b]=r[b-1],0!==T&&(r[b]=c-f/T),e[b-1]=0,e[b]=0,c=o.get(b,b-1),V=Math.abs(c)+Math.abs(T),R=c/V,A=T/V,k=Math.sqrt(R*R+A*A),R/=k,A/=k,n=b-1;n<t;n++)T=o.get(b-1,n),o.set(b-1,n,A*T+R*o.get(b,n)),o.set(b,n,A*o.get(b,n)-R*T);for(i=0;i<=b;i++)T=o.get(i,b-1),o.set(i,b-1,A*T+R*o.get(i,b)),o.set(i,b,A*o.get(i,b)-R*T);for(i=0;i<=x;i++)T=s.get(i,b-1),s.set(i,b-1,A*T+R*s.get(i,b)),s.set(i,b,A*s.get(i,b)-R*T)}else r[b-1]=c+R,r[b]=c+R,e[b-1]=T,e[b]=-T;b-=2,I=0}else{if(c=o.get(b,b),g=0,f=0,u<b&&(g=o.get(b-1,b-1),f=o.get(b,b-1)*o.get(b-1,b)),10===I){for(E+=c,i=0;i<=b;i++)o.set(i,i,o.get(i,i)-c);V=Math.abs(o.get(b,b-1))+Math.abs(o.get(b-1,b-2)),c=g=.75*V,f=-.4375*V*V}if(30===I&&(V=(V=(g-c)/2)*V+f)>0){for(V=Math.sqrt(V),g<c&&(V=-V),V=c-f/((g-c)/2+V),i=0;i<=b;i++)o.set(i,i,o.get(i,i)-V);E+=V,c=g=f=.964}for(I+=1,l=b-2;l>=u&&(T=o.get(l,l),R=((k=c-T)*(V=g-T)-f)/o.get(l+1,l)+o.get(l,l+1),A=o.get(l+1,l+1)-T-k-V,k=o.get(l+2,l+1),V=Math.abs(R)+Math.abs(A)+Math.abs(k),R/=V,A/=V,k/=V,l!==u)&&!(Math.abs(o.get(l,l-1))*(Math.abs(A)+Math.abs(k))<v*(Math.abs(R)*(Math.abs(o.get(l-1,l-1))+Math.abs(T)+Math.abs(o.get(l+1,l+1)))));)l--;for(i=l+2;i<=b;i++)o.set(i,i-2,0),i>l+2&&o.set(i,i-3,0);for(h=l;h<=b-1&&(M=h!==b-1,h!==l&&(R=o.get(h,h-1),A=o.get(h+1,h-1),k=M?o.get(h+2,h-1):0,0!==(c=Math.abs(R)+Math.abs(A)+Math.abs(k))&&(R/=c,A/=c,k/=c)),0!==c);h++)if(V=Math.sqrt(R*R+A*A+k*k),R<0&&(V=-V),0!==V){for(h!==l?o.set(h,h-1,-V*c):u!==l&&o.set(h,h-1,-o.get(h,h-1)),c=(R+=V)/V,g=A/V,T=k/V,A/=R,k/=R,n=h;n<t;n++)R=o.get(h,n)+A*o.get(h+1,n),M&&(R+=k*o.get(h+2,n),o.set(h+2,n,o.get(h+2,n)-R*T)),o.set(h,n,o.get(h,n)-R*c),o.set(h+1,n,o.get(h+1,n)-R*g);for(i=0;i<=Math.min(b,h+3);i++)R=c*o.get(i,h)+g*o.get(i,h+1),M&&(R+=T*o.get(i,h+2),o.set(i,h+2,o.get(i,h+2)-R*k)),o.set(i,h,o.get(i,h)-R),o.set(i,h+1,o.get(i,h+1)-R*A);for(i=0;i<=x;i++)R=c*s.get(i,h)+g*s.get(i,h+1),M&&(R+=T*s.get(i,h+2),s.set(i,h+2,s.get(i,h+2)-R*k)),s.set(i,h,s.get(i,h)-R),s.set(i,h+1,s.get(i,h+1)-R*A)}}}if(0===S)return;for(b=t-1;b>=0;b--)if(R=r[b],0===(A=e[b]))for(u=b,o.set(b,b,1),i=b-1;i>=0;i--){for(f=o.get(i,i)-R,k=0,n=u;n<=b;n++)k+=o.get(i,n)*o.get(n,b);if(e[i]<0)T=f,V=k;else if(u=i,0===e[i]?o.set(i,b,0!==f?-k/f:-k/(v*S)):(c=o.get(i,i+1),g=o.get(i+1,i),A=(r[i]-R)*(r[i]-R)+e[i]*e[i],a=(c*V-T*k)/A,o.set(i,b,a),o.set(i+1,b,Math.abs(c)>Math.abs(T)?(-k-f*a)/c:(-V-g*a)/T)),a=Math.abs(o.get(i,b)),v*a*a>1)for(n=i;n<=b;n++)o.set(n,b,o.get(n,b)/a)}else if(A<0)for(u=b-1,Math.abs(o.get(b,b-1))>Math.abs(o.get(b-1,b))?(o.set(b-1,b-1,A/o.get(b,b-1)),o.set(b-1,b,-(o.get(b,b)-R)/o.get(b,b-1))):(y=F(0,-o.get(b-1,b),o.get(b-1,b-1)-R,A),o.set(b-1,b-1,y[0]),o.set(b-1,b,y[1])),o.set(b,b-1,0),o.set(b,b,1),i=b-2;i>=0;i--){for(m=0,w=0,n=u;n<=b;n++)m+=o.get(i,n)*o.get(n,b-1),w+=o.get(i,n)*o.get(n,b);if(f=o.get(i,i)-R,e[i]<0)T=f,k=m,V=w;else if(u=i,0===e[i]?(y=F(-m,-w,f,A),o.set(i,b-1,y[0]),o.set(i,b,y[1])):(c=o.get(i,i+1),g=o.get(i+1,i),p=(r[i]-R)*(r[i]-R)+e[i]*e[i]-A*A,d=2*(r[i]-R)*A,0===p&&0===d&&(p=v*S*(Math.abs(f)+Math.abs(A)+Math.abs(c)+Math.abs(g)+Math.abs(T))),y=F(c*k-T*m+A*w,c*V-T*w-A*m,p,d),o.set(i,b-1,y[0]),o.set(i,b,y[1]),Math.abs(c)>Math.abs(T)+Math.abs(A)?(o.set(i+1,b-1,(-m-f*o.get(i,b-1)+A*o.get(i,b))/c),o.set(i+1,b,(-w-f*o.get(i,b)-A*o.get(i,b-1))/c)):(y=F(-k-g*o.get(i,b-1),-V-g*o.get(i,b),T,A),o.set(i+1,b-1,y[0]),o.set(i+1,b,y[1]))),a=Math.max(Math.abs(o.get(i,b-1)),Math.abs(o.get(i,b))),v*a*a>1)for(n=i;n<=b;n++)o.set(n,b-1,o.get(n,b-1)/a),o.set(n,b,o.get(n,b)/a)}for(i=0;i<t;i++)if(i<0||i>x)for(n=i;n<t;n++)s.set(i,n,o.get(i,n));for(n=t-1;n>=0;n--)for(i=0;i<=x;i++){for(T=0,h=0;h<=Math.min(n,x);h++)T+=s.get(i,h)*o.get(h,n);s.set(i,n,T)}}(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 b(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 F(t,e,r,s){let o,i;return Math.abs(r)>Math.abs(s)?[(t+(o=s/r)*e)/(i=r+o*s),(e-o*t)/i]:[((o=r/s)*t+e)/(i=s+o*r),(o*e-t)/i]}class N{constructor(t){if(!(t=S.checkMatrix(t)).isSymmetric())throw new Error("Matrix is not symmetric");let e,r,s,o=t,i=o.rows,n=new b(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(h&=(t=o.get(r,r)-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=S.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 D{constructor(t,e={}){t=S.checkMatrix(t);let{Y:r}=e;const{scaleScores:s=!1,maxIterations:o=1e3,terminationCriteria:i=1e-10}=e;let n;if(r){if(!(r=Array.isArray(r)&&"number"==typeof r[0]?b.columnVector(r):S.checkMatrix(r)).isColumnVector()||r.rows!==t.rows)throw new Error("Y must be a column vector of length X.rows");n=r}else n=t.getColumnVector(0);let h,u,l,a,f=1;for(let e=0;e<o&&f>i;e++)l=(l=t.transpose().mmul(n).div(n.transpose().mmul(n).get(0,0))).div(l.norm()),h=t.mmul(l).div(l.transpose().mmul(l).get(0,0)),e>0&&(f=h.clone().sub(a).pow(2).sum()),a=h.clone(),r?(u=(u=r.transpose().mmul(h).div(h.transpose().mmul(h).get(0,0))).div(u.norm()),n=r.mmul(u).div(u.transpose().mmul(u).get(0,0))):n=h;if(r){let e=t.transpose().mmul(h).div(h.transpose().mmul(h).get(0,0));e=e.div(e.norm());let s=t.clone().sub(h.clone().mmul(e.transpose())),o=n.transpose().mmul(h).div(h.transpose().mmul(h).get(0,0)),i=r.clone().sub(h.clone().mulS(o.get(0,0)).mmul(u.transpose()));this.t=h,this.p=e.transpose(),this.w=l.transpose(),this.q=u,this.u=n,this.s=h.transpose().mmul(h),this.xResidual=s,this.yResidual=i,this.betas=o}else this.w=l.transpose(),this.s=h.transpose().mmul(h).sqrt(),this.t=s?h.clone().div(this.s.get(0,0)):h,this.xResidual=t.sub(h.mmul(l.transpose()))}}t.AbstractMatrix=M,t.CHO=N,t.CholeskyDecomposition=N,t.EVD=C,t.EigenvalueDecomposition=C,t.LU=R,t.LuDecomposition=R,t.Matrix=b,t.MatrixColumnSelectionView=class extends x{constructor(t,e){e=a(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 x{constructor(t,e){i(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 x{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 x{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 x{constructor(t,e){super(t,(e=l(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 x{constructor(t,e){o(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=v,t.MatrixSubView=class extends x{constructor(t,e,r,s,o){f(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 x{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=D,t.Nipals=D,t.QR=k,t.QrDecomposition=k,t.SVD=V,t.SingularValueDecomposition=V,t.WrapperMatrix1D=E,t.WrapperMatrix2D=S,t.correlation=function(t,e=t,r={}){t=b.checkMatrix(t);let s=!1;if("object"!=typeof e||b.isMatrix(e)||Array.isArray(e)?e=b.checkMatrix(e):(r=e,e=t,s=!0),t.rows!==e.rows)throw new TypeError("Both matrices must have the same number of rows");const{center:o=!0,scale:i=!0}=r;o&&(t.center("column"),s||e.center("column")),i&&(t.scale("column"),s||e.scale("column"));const n=t.standardDeviation("column",{unbiased:!0}),h=s?n:e.standardDeviation("column",{unbiased:!0}),u=t.transpose().mmul(e);for(let e=0;e<u.rows;e++)for(let r=0;r<u.columns;r++)u.set(e,r,u.get(e,r)*(1/(n[e]*h[r]))*(1/(t.rows-1)));return u},t.covariance=function(t,e=t,r={}){t=b.checkMatrix(t);let s=!1;if("object"!=typeof e||b.isMatrix(e)||Array.isArray(e)?e=b.checkMatrix(e):(r=e,e=t,s=!0),t.rows!==e.rows)throw new TypeError("Both matrices must have the same number of rows");const{center:o=!0}=r;o&&(t=t.center("column"),s||(e=e.center("column")));const i=t.transpose().mmul(e);for(let e=0;e<i.rows;e++)for(let r=0;r<i.columns;r++)i.set(e,r,i.get(e,r)*(1/(t.rows-1)));return i},t.default=b,t.determinant=function t(e){if((e=b.checkMatrix(e)).isSquare()){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),r*(i=e.get(1,1))-s*o;if(3===e.columns){let i,n,h;return i=new v(e,[1,2],[1,2]),n=new v(e,[1,2],[0,2]),h=new v(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 R(e).determinant}throw Error("determinant can only be calculated for a square matrix")},t.inverse=function(t,e=!1){return t=S.checkMatrix(t),e?new V(t).inverse():T(t,b.eye(t.rows))},t.linearDependencies=function(t,e={}){const{thresholdValue:r=1e-9,thresholdError:s=1e-9}=e;let o=(t=b.checkMatrix(t)).rows,i=new b(o,o);for(let e=0;e<o;e++){let n=b.columnVector(t.getRow(e)),h=t.subMatrixRow(I(o,e)).transpose(),u=new V(h).solve(n),l=b.sub(n,h.mmul(u)).abs().max();i.setRow(e,q(l,u,e,r,s))}return i},t.pseudoInverse=function(t,e=Number.EPSILON){t=b.checkMatrix(t);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(b.diag(i).mmul(s.transpose()))},t.solve=T,t.wrap=function(t,e){if(Array.isArray(t))return t[0]&&Array.isArray(t[0])?new S(t):new E(t,e);throw new Error("the argument is not an array")},Object.defineProperty(t,"__esModule",{value:!0})}));
package/package.json CHANGED
@@ -1,14 +1,17 @@
1
1
  {
2
2
  "name": "ml-matrix",
3
- "version": "6.1.2",
3
+ "version": "6.4.1",
4
4
  "description": "Matrix manipulation and computation library",
5
5
  "main": "matrix.js",
6
6
  "module": "src/index.js",
7
+ "jsdelivr": "matrix.umd.js",
8
+ "unpkg": "matrix.umd.js",
7
9
  "types": "matrix.d.ts",
8
10
  "sideEffects": false,
9
11
  "files": [
10
12
  "matrix.d.ts",
11
13
  "matrix.js",
14
+ "matrix.umd.js",
12
15
  "src"
13
16
  ],
14
17
  "scripts": {
@@ -52,22 +55,28 @@
52
55
  },
53
56
  "homepage": "https://github.com/mljs/matrix",
54
57
  "devDependencies": {
55
- "@babel/plugin-transform-modules-commonjs": "^7.4.4",
58
+ "@babel/plugin-transform-modules-commonjs": "^7.6.0",
56
59
  "benchmark": "^2.1.4",
57
- "csv-parse": "^4.4.3",
58
- "eslint": "^6.0.1",
59
- "eslint-config-cheminfo": "^1.20.1",
60
- "eslint-plugin-import": "^2.18.0",
61
- "eslint-plugin-jest": "^22.7.1",
62
- "jest": "^24.8.0",
60
+ "csv-parse": "^4.4.7",
61
+ "eslint": "^6.5.0",
62
+ "eslint-config-cheminfo": "^2.0.3",
63
+ "eslint-plugin-import": "^2.18.2",
64
+ "eslint-plugin-jest": "^22.17.0",
65
+ "eslint-plugin-prettier": "^3.1.1",
66
+ "jest": "^24.9.0",
63
67
  "jest-matcher-deep-close-to": "^1.3.0",
64
- "mathjs": "^6.0.2",
68
+ "mathjs": "^6.2.2",
69
+ "ml-dataset-iris": "^1.1.1",
65
70
  "numeric": "^1.2.6",
71
+ "prettier": "^1.18.2",
66
72
  "pretty-hrtime": "^1.0.3",
67
- "rollup": "^1.16.3",
68
- "typedoc": "^0.14.2"
73
+ "rollup": "^1.22.0",
74
+ "rollup-plugin-commonjs": "^10.1.0",
75
+ "rollup-plugin-node-resolve": "^5.2.0",
76
+ "rollup-plugin-terser": "^5.1.2",
77
+ "typedoc": "^0.15.0"
69
78
  },
70
79
  "dependencies": {
71
- "ml-array-rescale": "^1.2.1"
80
+ "ml-array-rescale": "^1.2.2"
72
81
  }
73
82
  }
@@ -3,7 +3,11 @@ import Matrix from './matrix';
3
3
  export function correlation(xMatrix, yMatrix = xMatrix, options = {}) {
4
4
  xMatrix = Matrix.checkMatrix(xMatrix);
5
5
  let yIsSame = false;
6
- if (typeof yMatrix === 'object' && !Matrix.isMatrix(yMatrix) && !Array.isArray(yMatrix)) {
6
+ if (
7
+ typeof yMatrix === 'object' &&
8
+ !Matrix.isMatrix(yMatrix) &&
9
+ !Array.isArray(yMatrix)
10
+ ) {
7
11
  options = yMatrix;
8
12
  yMatrix = xMatrix;
9
13
  yIsSame = true;
@@ -29,13 +33,19 @@ export function correlation(xMatrix, yMatrix = xMatrix, options = {}) {
29
33
  }
30
34
 
31
35
  const sdx = xMatrix.standardDeviation('column', { unbiased: true });
32
- const sdy = yIsSame ? sdx : yMatrix.standardDeviation('column', { unbiased: true });
36
+ const sdy = yIsSame
37
+ ? sdx
38
+ : yMatrix.standardDeviation('column', { unbiased: true });
33
39
 
34
- const correlation = xMatrix.transpose().mmul(yMatrix);
35
- for (let i = 0; i < correlation.rows; i++) {
36
- for (let j = 0; j < correlation.columns; j++) {
37
- correlation.set(i, j, correlation.get(i, j) * (1 / (sdx[i] * sdy[j])) * (1 / (xMatrix.rows - 1)));
40
+ const corr = xMatrix.transpose().mmul(yMatrix);
41
+ for (let i = 0; i < corr.rows; i++) {
42
+ for (let j = 0; j < corr.columns; j++) {
43
+ corr.set(
44
+ i,
45
+ j,
46
+ corr.get(i, j) * (1 / (sdx[i] * sdy[j])) * (1 / (xMatrix.rows - 1)),
47
+ );
38
48
  }
39
49
  }
40
- return correlation;
50
+ return corr;
41
51
  }
package/src/covariance.js CHANGED
@@ -3,7 +3,11 @@ import Matrix from './matrix';
3
3
  export function covariance(xMatrix, yMatrix = xMatrix, options = {}) {
4
4
  xMatrix = Matrix.checkMatrix(xMatrix);
5
5
  let yIsSame = false;
6
- if (typeof yMatrix === 'object' && !Matrix.isMatrix(yMatrix) && !Array.isArray(yMatrix)) {
6
+ if (
7
+ typeof yMatrix === 'object' &&
8
+ !Matrix.isMatrix(yMatrix) &&
9
+ !Array.isArray(yMatrix)
10
+ ) {
7
11
  options = yMatrix;
8
12
  yMatrix = xMatrix;
9
13
  yIsSame = true;
@@ -20,11 +24,11 @@ export function covariance(xMatrix, yMatrix = xMatrix, options = {}) {
20
24
  yMatrix = yMatrix.center('column');
21
25
  }
22
26
  }
23
- const covariance = xMatrix.transpose().mmul(yMatrix);
24
- for (let i = 0; i < covariance.rows; i++) {
25
- for (let j = 0; j < covariance.columns; j++) {
26
- covariance.set(i, j, covariance.get(i, j) * (1 / (xMatrix.rows - 1)));
27
+ const cov = xMatrix.transpose().mmul(yMatrix);
28
+ for (let i = 0; i < cov.rows; i++) {
29
+ for (let j = 0; j < cov.columns; j++) {
30
+ cov.set(i, j, cov.get(i, j) * (1 / (xMatrix.rows - 1)));
27
31
  }
28
32
  }
29
- return covariance;
33
+ return cov;
30
34
  }
@@ -8,16 +8,16 @@ export default class CholeskyDecomposition {
8
8
  throw new Error('Matrix is not symmetric');
9
9
  }
10
10
 
11
- var a = value;
12
- var dimension = a.rows;
13
- var l = new Matrix(dimension, dimension);
14
- var positiveDefinite = true;
15
- var i, j, k;
11
+ let a = value;
12
+ let dimension = a.rows;
13
+ let l = new Matrix(dimension, dimension);
14
+ let positiveDefinite = true;
15
+ let i, j, k;
16
16
 
17
17
  for (j = 0; j < dimension; j++) {
18
- var d = 0;
18
+ let d = 0;
19
19
  for (k = 0; k < j; k++) {
20
- var s = 0;
20
+ let s = 0;
21
21
  for (i = 0; i < k; i++) {
22
22
  s += l.get(k, i) * l.get(j, i);
23
23
  }
@@ -35,26 +35,30 @@ export default class CholeskyDecomposition {
35
35
  }
36
36
  }
37
37
 
38
- if (!positiveDefinite) {
39
- throw new Error('Matrix is not positive definite');
40
- }
41
-
42
38
  this.L = l;
39
+ this.positiveDefinite = Boolean(positiveDefinite);
40
+ }
41
+
42
+ isPositiveDefinite() {
43
+ return this.positiveDefinite;
43
44
  }
44
45
 
45
46
  solve(value) {
46
47
  value = WrapperMatrix2D.checkMatrix(value);
47
48
 
48
- var l = this.L;
49
- var dimension = l.rows;
49
+ let l = this.L;
50
+ let dimension = l.rows;
50
51
 
51
52
  if (value.rows !== dimension) {
52
53
  throw new Error('Matrix dimensions do not match');
53
54
  }
55
+ if (this.isPositiveDefinite() === false) {
56
+ throw new Error('Matrix is not positive definite');
57
+ }
54
58
 
55
- var count = value.columns;
56
- var B = value.clone();
57
- var i, j, k;
59
+ let count = value.columns;
60
+ let B = value.clone();
61
+ let i, j, k;
58
62
 
59
63
  for (k = 0; k < dimension; k++) {
60
64
  for (j = 0; j < count; j++) {
package/src/dc/evd.js CHANGED
@@ -12,14 +12,14 @@ export default class EigenvalueDecomposition {
12
12
  throw new Error('Matrix is not a square matrix');
13
13
  }
14
14
 
15
- var n = matrix.columns;
16
- var V = new Matrix(n, n);
17
- var d = new Float64Array(n);
18
- var e = new Float64Array(n);
19
- var value = matrix;
20
- var i, j;
21
-
22
- var isSymmetric = false;
15
+ let n = matrix.columns;
16
+ let V = new Matrix(n, n);
17
+ let d = new Float64Array(n);
18
+ let e = new Float64Array(n);
19
+ let value = matrix;
20
+ let i, j;
21
+
22
+ let isSymmetric = false;
23
23
  if (assumeSymmetric) {
24
24
  isSymmetric = true;
25
25
  } else {
@@ -35,8 +35,8 @@ export default class EigenvalueDecomposition {
35
35
  tred2(n, e, d, V);
36
36
  tql2(n, e, d, V);
37
37
  } else {
38
- var H = new Matrix(n, n);
39
- var ort = new Float64Array(n);
38
+ let H = new Matrix(n, n);
39
+ let ort = new Float64Array(n);
40
40
  for (j = 0; j < n; j++) {
41
41
  for (i = 0; i < n; i++) {
42
42
  H.set(i, j, value.get(i, j));
@@ -65,11 +65,11 @@ export default class EigenvalueDecomposition {
65
65
  }
66
66
 
67
67
  get diagonalMatrix() {
68
- var n = this.n;
69
- var e = this.e;
70
- var d = this.d;
71
- var X = new Matrix(n, n);
72
- var i, j;
68
+ let n = this.n;
69
+ let e = this.e;
70
+ let d = this.d;
71
+ let X = new Matrix(n, n);
72
+ let i, j;
73
73
  for (i = 0; i < n; i++) {
74
74
  for (j = 0; j < n; j++) {
75
75
  X.set(i, j, 0);
@@ -86,7 +86,7 @@ export default class EigenvalueDecomposition {
86
86
  }
87
87
 
88
88
  function tred2(n, e, d, V) {
89
- var f, g, h, i, j, k, hh, scale;
89
+ let f, g, h, i, j, k, hh, scale;
90
90
 
91
91
  for (j = 0; j < n; j++) {
92
92
  d[j] = V.get(n - 1, j);
@@ -195,7 +195,7 @@ function tred2(n, e, d, V) {
195
195
  }
196
196
 
197
197
  function tql2(n, e, d, V) {
198
- var g, h, i, j, k, l, m, p, r, dl1, c, c2, c3, el1, s, s2, iter;
198
+ let g, h, i, j, k, l, m, p, r, dl1, c, c2, c3, el1, s, s2, iter;
199
199
 
200
200
  for (i = 1; i < n; i++) {
201
201
  e[i - 1] = e[i];
@@ -203,9 +203,9 @@ function tql2(n, e, d, V) {
203
203
 
204
204
  e[n - 1] = 0;
205
205
 
206
- var f = 0;
207
- var tst1 = 0;
208
- var eps = Number.EPSILON;
206
+ let f = 0;
207
+ let tst1 = 0;
208
+ let eps = Number.EPSILON;
209
209
 
210
210
  for (l = 0; l < n; l++) {
211
211
  tst1 = Math.max(tst1, Math.abs(d[l]) + Math.abs(e[l]));
@@ -298,10 +298,10 @@ function tql2(n, e, d, V) {
298
298
  }
299
299
 
300
300
  function orthes(n, H, ort, V) {
301
- var low = 0;
302
- var high = n - 1;
303
- var f, g, h, i, j, m;
304
- var scale;
301
+ let low = 0;
302
+ let high = n - 1;
303
+ let f, g, h, i, j, m;
304
+ let scale;
305
305
 
306
306
  for (m = low + 1; m <= high - 1; m++) {
307
307
  scale = 0;
@@ -381,21 +381,21 @@ function orthes(n, H, ort, V) {
381
381
  }
382
382
 
383
383
  function hqr2(nn, e, d, V, H) {
384
- var n = nn - 1;
385
- var low = 0;
386
- var high = nn - 1;
387
- var eps = Number.EPSILON;
388
- var exshift = 0;
389
- var norm = 0;
390
- var p = 0;
391
- var q = 0;
392
- var r = 0;
393
- var s = 0;
394
- var z = 0;
395
- var iter = 0;
396
- var i, j, k, l, m, t, w, x, y;
397
- var ra, sa, vr, vi;
398
- var notlast, cdivres;
384
+ let n = nn - 1;
385
+ let low = 0;
386
+ let high = nn - 1;
387
+ let eps = Number.EPSILON;
388
+ let exshift = 0;
389
+ let norm = 0;
390
+ let p = 0;
391
+ let q = 0;
392
+ let r = 0;
393
+ let s = 0;
394
+ let z = 0;
395
+ let iter = 0;
396
+ let i, j, k, l, m, t, w, x, y;
397
+ let ra, sa, vr, vi;
398
+ let notlast, cdivres;
399
399
 
400
400
  for (i = 0; i < nn; i++) {
401
401
  if (i < low || i > high) {
@@ -660,7 +660,7 @@ function hqr2(nn, e, d, V, H) {
660
660
  H.set(
661
661
  i + 1,
662
662
  n,
663
- Math.abs(x) > Math.abs(z) ? (-r - w * t) / x : (-s - y * t) / z
663
+ Math.abs(x) > Math.abs(z) ? (-r - w * t) / x : (-s - y * t) / z,
664
664
  );
665
665
  }
666
666
 
@@ -725,7 +725,7 @@ function hqr2(nn, e, d, V, H) {
725
725
  x * r - z * ra + q * sa,
726
726
  x * s - z * sa - q * ra,
727
727
  vr,
728
- vi
728
+ vi,
729
729
  );
730
730
  H.set(i, n - 1, cdivres[0]);
731
731
  H.set(i, n, cdivres[1]);
@@ -733,19 +733,19 @@ function hqr2(nn, e, d, V, H) {
733
733
  H.set(
734
734
  i + 1,
735
735
  n - 1,
736
- (-ra - w * H.get(i, n - 1) + q * H.get(i, n)) / x
736
+ (-ra - w * H.get(i, n - 1) + q * H.get(i, n)) / x,
737
737
  );
738
738
  H.set(
739
739
  i + 1,
740
740
  n,
741
- (-sa - w * H.get(i, n) - q * H.get(i, n - 1)) / x
741
+ (-sa - w * H.get(i, n) - q * H.get(i, n - 1)) / x,
742
742
  );
743
743
  } else {
744
744
  cdivres = cdiv(
745
745
  -r - y * H.get(i, n - 1),
746
746
  -s - y * H.get(i, n),
747
747
  z,
748
- q
748
+ q,
749
749
  );
750
750
  H.set(i + 1, n - 1, cdivres[0]);
751
751
  H.set(i + 1, n, cdivres[1]);
@@ -784,7 +784,7 @@ function hqr2(nn, e, d, V, H) {
784
784
  }
785
785
 
786
786
  function cdiv(xr, xi, yr, yi) {
787
- var r, d;
787
+ let r, d;
788
788
  if (Math.abs(yr) > Math.abs(yi)) {
789
789
  r = yi / yr;
790
790
  d = yr + r * yi;
package/src/dc/lu.js CHANGED
@@ -5,13 +5,13 @@ export default class LuDecomposition {
5
5
  constructor(matrix) {
6
6
  matrix = WrapperMatrix2D.checkMatrix(matrix);
7
7
 
8
- var lu = matrix.clone();
9
- var rows = lu.rows;
10
- var columns = lu.columns;
11
- var pivotVector = new Float64Array(rows);
12
- var pivotSign = 1;
13
- var i, j, k, p, s, t, v;
14
- var LUcolj, kmax;
8
+ let lu = matrix.clone();
9
+ let rows = lu.rows;
10
+ let columns = lu.columns;
11
+ let pivotVector = new Float64Array(rows);
12
+ let pivotSign = 1;
13
+ let i, j, k, p, s, t, v;
14
+ let LUcolj, kmax;
15
15
 
16
16
  for (i = 0; i < rows; i++) {
17
17
  pivotVector[i] = i;
@@ -68,9 +68,9 @@ export default class LuDecomposition {
68
68
  }
69
69
 
70
70
  isSingular() {
71
- var data = this.LU;
72
- var col = data.columns;
73
- for (var j = 0; j < col; j++) {
71
+ let data = this.LU;
72
+ let col = data.columns;
73
+ for (let j = 0; j < col; j++) {
74
74
  if (data.get(j, j) === 0) {
75
75
  return true;
76
76
  }
@@ -81,8 +81,8 @@ export default class LuDecomposition {
81
81
  solve(value) {
82
82
  value = Matrix.checkMatrix(value);
83
83
 
84
- var lu = this.LU;
85
- var rows = lu.rows;
84
+ let lu = this.LU;
85
+ let rows = lu.rows;
86
86
 
87
87
  if (rows !== value.rows) {
88
88
  throw new Error('Invalid matrix dimensions');
@@ -91,10 +91,10 @@ export default class LuDecomposition {
91
91
  throw new Error('LU matrix is singular');
92
92
  }
93
93
 
94
- var count = value.columns;
95
- var X = value.subMatrixRow(this.pivotVector, 0, count - 1);
96
- var columns = lu.columns;
97
- var i, j, k;
94
+ let count = value.columns;
95
+ let X = value.subMatrixRow(this.pivotVector, 0, count - 1);
96
+ let columns = lu.columns;
97
+ let i, j, k;
98
98
 
99
99
  for (k = 0; k < columns; k++) {
100
100
  for (i = k + 1; i < columns; i++) {
@@ -117,25 +117,25 @@ export default class LuDecomposition {
117
117
  }
118
118
 
119
119
  get determinant() {
120
- var data = this.LU;
120
+ let data = this.LU;
121
121
  if (!data.isSquare()) {
122
122
  throw new Error('Matrix must be square');
123
123
  }
124
- var determinant = this.pivotSign;
125
- var col = data.columns;
126
- for (var j = 0; j < col; j++) {
124
+ let determinant = this.pivotSign;
125
+ let col = data.columns;
126
+ for (let j = 0; j < col; j++) {
127
127
  determinant *= data.get(j, j);
128
128
  }
129
129
  return determinant;
130
130
  }
131
131
 
132
132
  get lowerTriangularMatrix() {
133
- var data = this.LU;
134
- var rows = data.rows;
135
- var columns = data.columns;
136
- var X = new Matrix(rows, columns);
137
- for (var i = 0; i < rows; i++) {
138
- for (var j = 0; j < columns; j++) {
133
+ let data = this.LU;
134
+ let rows = data.rows;
135
+ let columns = data.columns;
136
+ let X = new Matrix(rows, columns);
137
+ for (let i = 0; i < rows; i++) {
138
+ for (let j = 0; j < columns; j++) {
139
139
  if (i > j) {
140
140
  X.set(i, j, data.get(i, j));
141
141
  } else if (i === j) {
@@ -149,12 +149,12 @@ export default class LuDecomposition {
149
149
  }
150
150
 
151
151
  get upperTriangularMatrix() {
152
- var data = this.LU;
153
- var rows = data.rows;
154
- var columns = data.columns;
155
- var X = new Matrix(rows, columns);
156
- for (var i = 0; i < rows; i++) {
157
- for (var j = 0; j < columns; j++) {
152
+ let data = this.LU;
153
+ let rows = data.rows;
154
+ let columns = data.columns;
155
+ let X = new Matrix(rows, columns);
156
+ for (let i = 0; i < rows; i++) {
157
+ for (let j = 0; j < columns; j++) {
158
158
  if (i <= j) {
159
159
  X.set(i, j, data.get(i, j));
160
160
  } else {