mathjs 11.12.0 → 12.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HISTORY.md +54 -2
- package/README.md +1 -1
- package/lib/browser/math.js +1 -1
- package/lib/browser/math.js.LICENSE.txt +2 -2
- package/lib/browser/math.js.map +1 -1
- package/lib/cjs/entry/dependenciesAny/dependenciesEigs.generated.js +4 -0
- package/lib/cjs/entry/pureFunctionsAny.generated.js +2 -0
- package/lib/cjs/expression/embeddedDocs/function/arithmetic/round.js +2 -2
- package/lib/cjs/expression/embeddedDocs/function/matrix/eigs.js +2 -2
- package/lib/cjs/expression/node/AssignmentNode.js +1 -1
- package/lib/cjs/expression/node/FunctionAssignmentNode.js +1 -1
- package/lib/cjs/function/algebra/derivative.js +8 -31
- package/lib/cjs/function/arithmetic/gcd.js +4 -5
- package/lib/cjs/function/arithmetic/mod.js +2 -9
- package/lib/cjs/function/arithmetic/round.js +59 -16
- package/lib/cjs/function/matrix/eigs/complexEigs.js +73 -68
- package/lib/cjs/function/matrix/eigs/{realSymetric.js → realSymmetric.js} +57 -51
- package/lib/cjs/function/matrix/eigs.js +118 -45
- package/lib/cjs/function/probability/pickRandom.js +2 -2
- package/lib/cjs/header.js +2 -2
- package/lib/cjs/type/number.js +2 -2
- package/lib/cjs/utils/number.js +1 -1
- package/lib/cjs/utils/snapshot.js +6 -6
- package/lib/cjs/version.js +1 -1
- package/lib/esm/entry/dependenciesAny/dependenciesEigs.generated.js +4 -0
- package/lib/esm/entry/pureFunctionsAny.generated.js +2 -0
- package/lib/esm/expression/embeddedDocs/function/arithmetic/round.js +2 -2
- package/lib/esm/expression/embeddedDocs/function/matrix/eigs.js +2 -2
- package/lib/esm/expression/node/AssignmentNode.js +1 -1
- package/lib/esm/expression/node/FunctionAssignmentNode.js +1 -1
- package/lib/esm/function/algebra/derivative.js +8 -31
- package/lib/esm/function/arithmetic/mod.js +2 -9
- package/lib/esm/function/arithmetic/round.js +40 -17
- package/lib/esm/function/matrix/eigs/complexEigs.js +73 -68
- package/lib/esm/function/matrix/eigs/{realSymetric.js → realSymmetric.js} +55 -51
- package/lib/esm/function/matrix/eigs.js +119 -47
- package/lib/esm/function/probability/pickRandom.js +2 -2
- package/lib/esm/type/number.js +2 -2
- package/lib/esm/utils/number.js +1 -1
- package/lib/esm/version.js +1 -1
- package/package.json +14 -14
- package/types/EXPLANATION.md +54 -0
- package/types/index.d.ts +6825 -6483
| @@ -21,6 +21,8 @@ function createComplexEigs(_ref) { | |
| 21 21 | 
             
                abs = _ref.abs,
         | 
| 22 22 | 
             
                bignumber = _ref.bignumber,
         | 
| 23 23 | 
             
                diag = _ref.diag,
         | 
| 24 | 
            +
                size = _ref.size,
         | 
| 25 | 
            +
                reshape = _ref.reshape,
         | 
| 24 26 | 
             
                inv = _ref.inv,
         | 
| 25 27 | 
             
                qr = _ref.qr,
         | 
| 26 28 | 
             
                usolve = _ref.usolve,
         | 
| @@ -40,11 +42,8 @@ function createComplexEigs(_ref) { | |
| 40 42 | 
             
               *
         | 
| 41 43 | 
             
               * @returns {{ values: number[], vectors: number[][] }}
         | 
| 42 44 | 
             
               */
         | 
| 43 | 
            -
              function complexEigs(arr, N, prec, type | 
| 44 | 
            -
                 | 
| 45 | 
            -
                  findVectors = true;
         | 
| 46 | 
            -
                }
         | 
| 47 | 
            -
             | 
| 45 | 
            +
              function complexEigs(arr, N, prec, type) {
         | 
| 46 | 
            +
                var findVectors = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
         | 
| 48 47 | 
             
                // TODO check if any row/col are zero except the diagonal
         | 
| 49 48 |  | 
| 50 49 | 
             
                // make sure corresponding rows and columns have similar magnitude
         | 
| @@ -53,9 +52,9 @@ function createComplexEigs(_ref) { | |
| 53 52 | 
             
                var R = balance(arr, N, prec, type, findVectors);
         | 
| 54 53 |  | 
| 55 54 | 
             
                // R is the row transformation matrix
         | 
| 56 | 
            -
                // arr = A' = R A R | 
| 55 | 
            +
                // arr = A' = R A R^-1, A is the original matrix
         | 
| 57 56 | 
             
                // (if findVectors is false, R is undefined)
         | 
| 58 | 
            -
                // (And so to return to original matrix: A = R | 
| 57 | 
            +
                // (And so to return to original matrix: A = R^-1 arr R)
         | 
| 59 58 |  | 
| 60 59 | 
             
                // TODO if magnitudes of elements vary over many orders,
         | 
| 61 60 | 
             
                // move greatest elements to the top left corner
         | 
| @@ -65,7 +64,7 @@ function createComplexEigs(_ref) { | |
| 65 64 | 
             
                // updates the transformation matrix R with new row operationsq
         | 
| 66 65 | 
             
                // MODIFIES arr by side effect!
         | 
| 67 66 | 
             
                reduceToHessenberg(arr, N, prec, type, findVectors, R);
         | 
| 68 | 
            -
                // still true that original A = R | 
| 67 | 
            +
                // still true that original A = R^-1 arr R)
         | 
| 69 68 |  | 
| 70 69 | 
             
                // find eigenvalues
         | 
| 71 70 | 
             
                var _iterateUntilTriangul = iterateUntilTriangular(arr, N, prec, type, findVectors),
         | 
| @@ -75,17 +74,18 @@ function createComplexEigs(_ref) { | |
| 75 74 | 
             
                // values is the list of eigenvalues, C is the column
         | 
| 76 75 | 
             
                // transformation matrix that transforms arr, the hessenberg
         | 
| 77 76 | 
             
                // matrix, to upper triangular
         | 
| 78 | 
            -
                // (So U = C | 
| 77 | 
            +
                // (So U = C^-1 arr C and the relationship between current arr
         | 
| 79 78 | 
             
                // and original A is unchanged.)
         | 
| 80 79 |  | 
| 81 | 
            -
                var vectors;
         | 
| 82 80 | 
             
                if (findVectors) {
         | 
| 83 | 
            -
                   | 
| 84 | 
            -
                   | 
| 81 | 
            +
                  var eigenvectors = findEigenvectors(arr, N, C, R, values, prec, type);
         | 
| 82 | 
            +
                  return {
         | 
| 83 | 
            +
                    values: values,
         | 
| 84 | 
            +
                    eigenvectors: eigenvectors
         | 
| 85 | 
            +
                  };
         | 
| 85 86 | 
             
                }
         | 
| 86 87 | 
             
                return {
         | 
| 87 | 
            -
                  values: values | 
| 88 | 
            -
                  vectors: vectors
         | 
| 88 | 
            +
                  values: values
         | 
| 89 89 | 
             
                };
         | 
| 90 90 | 
             
              }
         | 
| 91 91 |  | 
| @@ -125,9 +125,8 @@ function createComplexEigs(_ref) { | |
| 125 125 | 
             
                    var rowNorm = realzero;
         | 
| 126 126 | 
             
                    for (var j = 0; j < N; j++) {
         | 
| 127 127 | 
             
                      if (i === j) continue;
         | 
| 128 | 
            -
                       | 
| 129 | 
            -
                       | 
| 130 | 
            -
                      rowNorm = addScalar(rowNorm, c);
         | 
| 128 | 
            +
                      colNorm = addScalar(colNorm, abs(arr[j][i]));
         | 
| 129 | 
            +
                      rowNorm = addScalar(rowNorm, abs(arr[i][j]));
         | 
| 131 130 | 
             
                    }
         | 
| 132 131 | 
             
                    if (!equal(colNorm, 0) && !equal(rowNorm, 0)) {
         | 
| 133 132 | 
             
                      // find integer power closest to balancing the matrix
         | 
| @@ -135,21 +134,21 @@ function createComplexEigs(_ref) { | |
| 135 134 | 
             
                      // so that we don't lose any precision due to round-off)
         | 
| 136 135 |  | 
| 137 136 | 
             
                      var f = realone;
         | 
| 138 | 
            -
                      var  | 
| 137 | 
            +
                      var c = colNorm;
         | 
| 139 138 | 
             
                      var rowDivRadix = divideScalar(rowNorm, radix);
         | 
| 140 139 | 
             
                      var rowMulRadix = multiplyScalar(rowNorm, radix);
         | 
| 141 | 
            -
                      while (smaller( | 
| 142 | 
            -
                         | 
| 140 | 
            +
                      while (smaller(c, rowDivRadix)) {
         | 
| 141 | 
            +
                        c = multiplyScalar(c, radixSq);
         | 
| 143 142 | 
             
                        f = multiplyScalar(f, radix);
         | 
| 144 143 | 
             
                      }
         | 
| 145 | 
            -
                      while (larger( | 
| 146 | 
            -
                         | 
| 144 | 
            +
                      while (larger(c, rowMulRadix)) {
         | 
| 145 | 
            +
                        c = divideScalar(c, radixSq);
         | 
| 147 146 | 
             
                        f = divideScalar(f, radix);
         | 
| 148 147 | 
             
                      }
         | 
| 149 148 |  | 
| 150 149 | 
             
                      // check whether balancing is needed
         | 
| 151 150 | 
             
                      // condition = (c + rowNorm) / f < 0.95 * (colNorm + rowNorm)
         | 
| 152 | 
            -
                      var condition = smaller(divideScalar(addScalar( | 
| 151 | 
            +
                      var condition = smaller(divideScalar(addScalar(c, rowNorm), f), multiplyScalar(addScalar(colNorm, rowNorm), 0.95));
         | 
| 153 152 |  | 
| 154 153 | 
             
                      // apply balancing similarity transformation
         | 
| 155 154 | 
             
                      if (condition) {
         | 
| @@ -161,13 +160,13 @@ function createComplexEigs(_ref) { | |
| 161 160 | 
             
                          if (i === _j) {
         | 
| 162 161 | 
             
                            continue;
         | 
| 163 162 | 
             
                          }
         | 
| 164 | 
            -
                          arr[i][_j] = multiplyScalar(arr[i][_j],  | 
| 165 | 
            -
                          arr[_j][i] = multiplyScalar(arr[_j][i],  | 
| 163 | 
            +
                          arr[i][_j] = multiplyScalar(arr[i][_j], g);
         | 
| 164 | 
            +
                          arr[_j][i] = multiplyScalar(arr[_j][i], f);
         | 
| 166 165 | 
             
                        }
         | 
| 167 166 |  | 
| 168 167 | 
             
                        // keep track of transformations
         | 
| 169 168 | 
             
                        if (findVectors) {
         | 
| 170 | 
            -
                          Rdiag[i] = multiplyScalar(Rdiag[i],  | 
| 169 | 
            +
                          Rdiag[i] = multiplyScalar(Rdiag[i], g);
         | 
| 171 170 | 
             
                        }
         | 
| 172 171 | 
             
                      }
         | 
| 173 172 | 
             
                    }
         | 
| @@ -175,7 +174,7 @@ function createComplexEigs(_ref) { | |
| 175 174 | 
             
                }
         | 
| 176 175 |  | 
| 177 176 | 
             
                // return the diagonal row transformation matrix
         | 
| 178 | 
            -
                return diag(Rdiag);
         | 
| 177 | 
            +
                return findVectors ? diag(Rdiag) : null;
         | 
| 179 178 | 
             
              }
         | 
| 180 179 |  | 
| 181 180 | 
             
              /**
         | 
| @@ -274,7 +273,7 @@ function createComplexEigs(_ref) { | |
| 274 273 |  | 
| 275 274 | 
             
                // The Francis Algorithm
         | 
| 276 275 | 
             
                // The core idea of this algorithm is that doing successive
         | 
| 277 | 
            -
                // A' =  | 
| 276 | 
            +
                // A' = QtAQ transformations will eventually converge to block-
         | 
| 278 277 | 
             
                // upper-triangular with diagonal blocks either 1x1 or 2x2.
         | 
| 279 278 | 
             
                // The Q here is the one from the QR decomposition, A = QR.
         | 
| 280 279 | 
             
                // Since the eigenvalues of a block-upper-triangular matrix are
         | 
| @@ -296,7 +295,7 @@ function createComplexEigs(_ref) { | |
| 296 295 | 
             
                // N×N matrix describing the overall transformation done during the QR algorithm
         | 
| 297 296 | 
             
                var Qtotal = findVectors ? diag(Array(N).fill(one)) : undefined;
         | 
| 298 297 |  | 
| 299 | 
            -
                //  | 
| 298 | 
            +
                // nxn matrix describing the QR transformations done since last convergence
         | 
| 300 299 | 
             
                var Qpartial = findVectors ? diag(Array(n).fill(one)) : undefined;
         | 
| 301 300 |  | 
| 302 301 | 
             
                // last eigenvalue converged before this many steps
         | 
| @@ -308,7 +307,12 @@ function createComplexEigs(_ref) { | |
| 308 307 |  | 
| 309 308 | 
             
                  // Perform the factorization
         | 
| 310 309 |  | 
| 311 | 
            -
                  var k =  | 
| 310 | 
            +
                  var k = arr[n - 1][n - 1]; // TODO this is apparently a somewhat
         | 
| 311 | 
            +
                  // old-fashioned choice; ideally set close to an eigenvalue, or
         | 
| 312 | 
            +
                  // perhaps better yet switch to the implicit QR version that is sometimes
         | 
| 313 | 
            +
                  // specifically called the "Francis algorithm" that is alluded to
         | 
| 314 | 
            +
                  // in the following TODO. (Or perhaps we switch to an independently
         | 
| 315 | 
            +
                  // optimized third-party package for the linear algebra operations...)
         | 
| 312 316 |  | 
| 313 317 | 
             
                  for (var i = 0; i < n; i++) {
         | 
| 314 318 | 
             
                    arr[i][i] = subtract(arr[i][i], k);
         | 
| @@ -427,17 +431,17 @@ function createComplexEigs(_ref) { | |
| 427 431 | 
             
                  _step;
         | 
| 428 432 | 
             
                try {
         | 
| 429 433 | 
             
                  for (_iterator.s(); !(_step = _iterator.n()).done;) {
         | 
| 430 | 
            -
                    var  | 
| 431 | 
            -
                    var _i4 = indexOf(uniqueValues,  | 
| 434 | 
            +
                    var lambda = _step.value;
         | 
| 435 | 
            +
                    var _i4 = indexOf(uniqueValues, lambda, equal);
         | 
| 432 436 | 
             
                    if (_i4 === -1) {
         | 
| 433 | 
            -
                      uniqueValues.push( | 
| 437 | 
            +
                      uniqueValues.push(lambda);
         | 
| 434 438 | 
             
                      multiplicities.push(1);
         | 
| 435 439 | 
             
                    } else {
         | 
| 436 440 | 
             
                      multiplicities[_i4] += 1;
         | 
| 437 441 | 
             
                    }
         | 
| 438 442 | 
             
                  }
         | 
| 439 443 |  | 
| 440 | 
            -
                  // find eigenvectors by solving U −  | 
| 444 | 
            +
                  // find eigenvectors by solving U − lambdaE = 0
         | 
| 441 445 | 
             
                  // TODO replace with an iterative eigenvector algorithm
         | 
| 442 446 | 
             
                  // (this one might fail for imprecise eigenvalues)
         | 
| 443 447 | 
             
                } catch (err) {
         | 
| @@ -449,24 +453,21 @@ function createComplexEigs(_ref) { | |
| 449 453 | 
             
                var len = uniqueValues.length;
         | 
| 450 454 | 
             
                var b = Array(N).fill(zero);
         | 
| 451 455 | 
             
                var E = diag(Array(N).fill(one));
         | 
| 452 | 
            -
             | 
| 453 | 
            -
                // eigenvalues for which usolve failed (due to numerical error)
         | 
| 454 | 
            -
                var failedLambdas = [];
         | 
| 455 456 | 
             
                var _loop = function _loop() {
         | 
| 456 | 
            -
                  var  | 
| 457 | 
            -
                  var S = subtract(U, multiply( | 
| 457 | 
            +
                  var lambda = uniqueValues[i];
         | 
| 458 | 
            +
                  var S = subtract(U, multiply(lambda, E)); // the characteristic matrix
         | 
| 458 459 |  | 
| 459 460 | 
             
                  var solutions = usolveAll(S, b);
         | 
| 460 461 | 
             
                  solutions.shift(); // ignore the null vector
         | 
| 461 462 |  | 
| 462 463 | 
             
                  // looks like we missed something, try inverse iteration
         | 
| 464 | 
            +
                  // But if that fails, just presume that the original matrix truly
         | 
| 465 | 
            +
                  // was defective.
         | 
| 463 466 | 
             
                  while (solutions.length < multiplicities[i]) {
         | 
| 464 467 | 
             
                    var approxVec = inverseIterate(S, N, solutions, prec, type);
         | 
| 465 | 
            -
                    if (approxVec  | 
| 466 | 
            -
                      // no more vectors were found
         | 
| 467 | 
            -
                      failedLambdas.push(λ);
         | 
| 468 | 
            +
                    if (approxVec === null) {
         | 
| 468 469 | 
             
                      break;
         | 
| 469 | 
            -
                    }
         | 
| 470 | 
            +
                    } // no more vectors were found
         | 
| 470 471 | 
             
                    solutions.push(approxVec);
         | 
| 471 472 | 
             
                  }
         | 
| 472 473 |  | 
| @@ -476,18 +477,15 @@ function createComplexEigs(_ref) { | |
| 476 477 | 
             
                    return multiply(correction, v);
         | 
| 477 478 | 
             
                  });
         | 
| 478 479 | 
             
                  vectors.push.apply(vectors, (0, _toConsumableArray2["default"])(solutions.map(function (v) {
         | 
| 479 | 
            -
                    return  | 
| 480 | 
            +
                    return {
         | 
| 481 | 
            +
                      value: lambda,
         | 
| 482 | 
            +
                      vector: flatten(v)
         | 
| 483 | 
            +
                    };
         | 
| 480 484 | 
             
                  })));
         | 
| 481 485 | 
             
                };
         | 
| 482 486 | 
             
                for (var i = 0; i < len; i++) {
         | 
| 483 487 | 
             
                  _loop();
         | 
| 484 488 | 
             
                }
         | 
| 485 | 
            -
                if (failedLambdas.length !== 0) {
         | 
| 486 | 
            -
                  var err = new Error('Failed to find eigenvectors for the following eigenvalues: ' + failedLambdas.join(', '));
         | 
| 487 | 
            -
                  err.values = values;
         | 
| 488 | 
            -
                  err.vectors = vectors;
         | 
| 489 | 
            -
                  throw err;
         | 
| 490 | 
            -
                }
         | 
| 491 489 | 
             
                return vectors;
         | 
| 492 490 | 
             
              }
         | 
| 493 491 |  | 
| @@ -496,7 +494,7 @@ function createComplexEigs(_ref) { | |
| 496 494 | 
             
               * @return {[number,number]}
         | 
| 497 495 | 
             
               */
         | 
| 498 496 | 
             
              function eigenvalues2x2(a, b, c, d) {
         | 
| 499 | 
            -
                //  | 
| 497 | 
            +
                // lambda_+- = 1/2 trA +- 1/2 sqrt( tr^2 A - 4 detA )
         | 
| 500 498 | 
             
                var trA = addScalar(a, d);
         | 
| 501 499 | 
             
                var detA = subtract(multiplyScalar(a, d), multiplyScalar(b, c));
         | 
| 502 500 | 
             
                var x = multiplyScalar(trA, 0.5);
         | 
| @@ -506,7 +504,7 @@ function createComplexEigs(_ref) { | |
| 506 504 |  | 
| 507 505 | 
             
              /**
         | 
| 508 506 | 
             
               * For an 2x2 matrix compute the transformation matrix S,
         | 
| 509 | 
            -
               * so that SAS | 
| 507 | 
            +
               * so that SAS^-1 is an upper triangular matrix
         | 
| 510 508 | 
             
               * @return {[[number,number],[number,number]]}
         | 
| 511 509 | 
             
               * @see https://math.berkeley.edu/~ogus/old/Math_54-05/webfoils/jordan.pdf
         | 
| 512 510 | 
             
               * @see http://people.math.harvard.edu/~knill/teaching/math21b2004/exhibits/2dmatrices/index.html
         | 
| @@ -530,23 +528,22 @@ function createComplexEigs(_ref) { | |
| 530 528 | 
             
                }
         | 
| 531 529 |  | 
| 532 530 | 
             
                // matrix is not diagonalizable
         | 
| 533 | 
            -
                // compute  | 
| 534 | 
            -
                // N₁₂ = 0 ⇒ S = ( N⃗₁, I⃗₁ )
         | 
| 535 | 
            -
                // N₁₂ ≠ 0 ⇒ S = ( N⃗₂, I⃗₂ )
         | 
| 536 | 
            -
             | 
| 531 | 
            +
                // compute diagonal elements of N = A - lambdaI
         | 
| 537 532 | 
             
                var na = subtract(a, l1);
         | 
| 538 | 
            -
                var nb = subtract(b, l1);
         | 
| 539 | 
            -
                var nc = subtract(c, l1);
         | 
| 540 533 | 
             
                var nd = subtract(d, l1);
         | 
| 541 | 
            -
             | 
| 542 | 
            -
             | 
| 534 | 
            +
             | 
| 535 | 
            +
                // col(N,2) = 0  implies  S = ( col(N,1), e_1 )
         | 
| 536 | 
            +
                // col(N,2) != 0 implies  S = ( col(N,2), e_2 )
         | 
| 537 | 
            +
             | 
| 538 | 
            +
                if (smaller(abs(b), prec) && smaller(abs(nd), prec)) {
         | 
| 539 | 
            +
                  return [[na, one], [c, zero]];
         | 
| 543 540 | 
             
                } else {
         | 
| 544 | 
            -
                  return [[ | 
| 541 | 
            +
                  return [[b, zero], [nd, one]];
         | 
| 545 542 | 
             
                }
         | 
| 546 543 | 
             
              }
         | 
| 547 544 |  | 
| 548 545 | 
             
              /**
         | 
| 549 | 
            -
               * Enlarge the matrix from  | 
| 546 | 
            +
               * Enlarge the matrix from nxn to NxN, setting the new
         | 
| 550 547 | 
             
               * elements to 1 on diagonal and 0 elsewhere
         | 
| 551 548 | 
             
               */
         | 
| 552 549 | 
             
              function inflateMatrix(arr, N) {
         | 
| @@ -633,15 +630,21 @@ function createComplexEigs(_ref) { | |
| 633 630 |  | 
| 634 631 | 
             
                // you better choose a random vector before I count to five
         | 
| 635 632 | 
             
                var i = 0;
         | 
| 636 | 
            -
                 | 
| 633 | 
            +
                for (; i < 5; ++i) {
         | 
| 637 634 | 
             
                  b = randomOrthogonalVector(N, orthog, type);
         | 
| 638 | 
            -
                   | 
| 635 | 
            +
                  try {
         | 
| 636 | 
            +
                    b = usolve(A, b);
         | 
| 637 | 
            +
                  } catch (_unused) {
         | 
| 638 | 
            +
                    // That direction didn't work, likely because the original matrix
         | 
| 639 | 
            +
                    // was defective. But still make the full number of tries...
         | 
| 640 | 
            +
                    continue;
         | 
| 641 | 
            +
                  }
         | 
| 639 642 | 
             
                  if (larger(norm(b), largeNum)) {
         | 
| 640 643 | 
             
                    break;
         | 
| 641 644 | 
             
                  }
         | 
| 642 | 
            -
             | 
| 643 | 
            -
             | 
| 644 | 
            -
                   | 
| 645 | 
            +
                }
         | 
| 646 | 
            +
                if (i >= 5) {
         | 
| 647 | 
            +
                  return null; // couldn't find any orthogonal vector in the image
         | 
| 645 648 | 
             
                }
         | 
| 646 649 |  | 
| 647 650 | 
             
                // you better converge before I count to ten
         | 
| @@ -697,12 +700,14 @@ function createComplexEigs(_ref) { | |
| 697 700 | 
             
               * Project vector v to the orthogonal complement of an array of vectors
         | 
| 698 701 | 
             
               */
         | 
| 699 702 | 
             
              function orthogonalComplement(v, orthog) {
         | 
| 703 | 
            +
                var vectorShape = size(v);
         | 
| 700 704 | 
             
                var _iterator3 = _createForOfIteratorHelper(orthog),
         | 
| 701 705 | 
             
                  _step3;
         | 
| 702 706 | 
             
                try {
         | 
| 703 707 | 
             
                  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
         | 
| 704 708 | 
             
                    var w = _step3.value;
         | 
| 705 | 
            -
                     | 
| 709 | 
            +
                    w = reshape(w, vectorShape); // make sure this is just a vector computation
         | 
| 710 | 
            +
                    // v := v − (w, v)/|w|^2 w
         | 
| 706 711 | 
             
                    v = subtract(v, multiply(divideScalar(dot(w, v), dot(w, w)), w));
         | 
| 707 712 | 
             
                  }
         | 
| 708 713 | 
             
                } catch (err) {
         | 
| @@ -27,25 +27,29 @@ function createRealSymmetric(_ref) { | |
| 27 27 | 
             
              function main(arr, N) {
         | 
| 28 28 | 
             
                var prec = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : config.epsilon;
         | 
| 29 29 | 
             
                var type = arguments.length > 3 ? arguments[3] : undefined;
         | 
| 30 | 
            +
                var computeVectors = arguments.length > 4 ? arguments[4] : undefined;
         | 
| 30 31 | 
             
                if (type === 'number') {
         | 
| 31 | 
            -
                  return diag(arr, prec);
         | 
| 32 | 
            +
                  return diag(arr, prec, computeVectors);
         | 
| 32 33 | 
             
                }
         | 
| 33 34 | 
             
                if (type === 'BigNumber') {
         | 
| 34 | 
            -
                  return diagBig(arr, prec);
         | 
| 35 | 
            +
                  return diagBig(arr, prec, computeVectors);
         | 
| 35 36 | 
             
                }
         | 
| 36 37 | 
             
                throw TypeError('Unsupported data type: ' + type);
         | 
| 37 38 | 
             
              }
         | 
| 38 39 |  | 
| 39 40 | 
             
              // diagonalization implementation for number (efficient)
         | 
| 40 | 
            -
              function diag(x, precision) {
         | 
| 41 | 
            +
              function diag(x, precision, computeVectors) {
         | 
| 41 42 | 
             
                var N = x.length;
         | 
| 42 43 | 
             
                var e0 = Math.abs(precision / N);
         | 
| 43 44 | 
             
                var psi;
         | 
| 44 | 
            -
                var Sij | 
| 45 | 
            -
                 | 
| 46 | 
            -
             | 
| 47 | 
            -
                  Sij | 
| 48 | 
            -
                   | 
| 45 | 
            +
                var Sij;
         | 
| 46 | 
            +
                if (computeVectors) {
         | 
| 47 | 
            +
                  Sij = new Array(N);
         | 
| 48 | 
            +
                  // Sij is Identity Matrix
         | 
| 49 | 
            +
                  for (var i = 0; i < N; i++) {
         | 
| 50 | 
            +
                    Sij[i] = Array(N).fill(0);
         | 
| 51 | 
            +
                    Sij[i][i] = 1.0;
         | 
| 52 | 
            +
                  }
         | 
| 49 53 | 
             
                }
         | 
| 50 54 | 
             
                // initial error
         | 
| 51 55 | 
             
                var Vab = getAij(x);
         | 
| @@ -54,26 +58,29 @@ function createRealSymmetric(_ref) { | |
| 54 58 | 
             
                  var j = Vab[0][1];
         | 
| 55 59 | 
             
                  psi = getTheta(x[_i][_i], x[j][j], x[_i][j]);
         | 
| 56 60 | 
             
                  x = x1(x, psi, _i, j);
         | 
| 57 | 
            -
                  Sij = Sij1(Sij, psi, _i, j);
         | 
| 61 | 
            +
                  if (computeVectors) Sij = Sij1(Sij, psi, _i, j);
         | 
| 58 62 | 
             
                  Vab = getAij(x);
         | 
| 59 63 | 
             
                }
         | 
| 60 | 
            -
                var Ei =  | 
| 64 | 
            +
                var Ei = Array(N).fill(0); // eigenvalues
         | 
| 61 65 | 
             
                for (var _i2 = 0; _i2 < N; _i2++) {
         | 
| 62 66 | 
             
                  Ei[_i2] = x[_i2][_i2];
         | 
| 63 67 | 
             
                }
         | 
| 64 | 
            -
                return sorting((0, _object.clone)(Ei),  | 
| 68 | 
            +
                return sorting((0, _object.clone)(Ei), Sij, computeVectors);
         | 
| 65 69 | 
             
              }
         | 
| 66 70 |  | 
| 67 71 | 
             
              // diagonalization implementation for bigNumber
         | 
| 68 | 
            -
              function diagBig(x, precision) {
         | 
| 72 | 
            +
              function diagBig(x, precision, computeVectors) {
         | 
| 69 73 | 
             
                var N = x.length;
         | 
| 70 74 | 
             
                var e0 = abs(precision / N);
         | 
| 71 75 | 
             
                var psi;
         | 
| 72 | 
            -
                var Sij | 
| 73 | 
            -
                 | 
| 74 | 
            -
             | 
| 75 | 
            -
                  Sij | 
| 76 | 
            -
                   | 
| 76 | 
            +
                var Sij;
         | 
| 77 | 
            +
                if (computeVectors) {
         | 
| 78 | 
            +
                  Sij = new Array(N);
         | 
| 79 | 
            +
                  // Sij is Identity Matrix
         | 
| 80 | 
            +
                  for (var i = 0; i < N; i++) {
         | 
| 81 | 
            +
                    Sij[i] = Array(N).fill(0);
         | 
| 82 | 
            +
                    Sij[i][i] = 1.0;
         | 
| 83 | 
            +
                  }
         | 
| 77 84 | 
             
                }
         | 
| 78 85 | 
             
                // initial error
         | 
| 79 86 | 
             
                var Vab = getAijBig(x);
         | 
| @@ -82,15 +89,15 @@ function createRealSymmetric(_ref) { | |
| 82 89 | 
             
                  var j = Vab[0][1];
         | 
| 83 90 | 
             
                  psi = getThetaBig(x[_i3][_i3], x[j][j], x[_i3][j]);
         | 
| 84 91 | 
             
                  x = x1Big(x, psi, _i3, j);
         | 
| 85 | 
            -
                  Sij = Sij1Big(Sij, psi, _i3, j);
         | 
| 92 | 
            +
                  if (computeVectors) Sij = Sij1Big(Sij, psi, _i3, j);
         | 
| 86 93 | 
             
                  Vab = getAijBig(x);
         | 
| 87 94 | 
             
                }
         | 
| 88 | 
            -
                var Ei =  | 
| 95 | 
            +
                var Ei = Array(N).fill(0); // eigenvalues
         | 
| 89 96 | 
             
                for (var _i4 = 0; _i4 < N; _i4++) {
         | 
| 90 97 | 
             
                  Ei[_i4] = x[_i4][_i4];
         | 
| 91 98 | 
             
                }
         | 
| 92 99 | 
             
                // return [clone(Ei), clone(Sij)]
         | 
| 93 | 
            -
                return sorting((0, _object.clone)(Ei),  | 
| 100 | 
            +
                return sorting((0, _object.clone)(Ei), Sij, computeVectors);
         | 
| 94 101 | 
             
              }
         | 
| 95 102 |  | 
| 96 103 | 
             
              // get angle
         | 
| @@ -118,8 +125,8 @@ function createRealSymmetric(_ref) { | |
| 118 125 | 
             
                var N = Sij.length;
         | 
| 119 126 | 
             
                var c = Math.cos(theta);
         | 
| 120 127 | 
             
                var s = Math.sin(theta);
         | 
| 121 | 
            -
                var Ski =  | 
| 122 | 
            -
                var Skj =  | 
| 128 | 
            +
                var Ski = Array(N).fill(0);
         | 
| 129 | 
            +
                var Skj = Array(N).fill(0);
         | 
| 123 130 | 
             
                for (var k = 0; k < N; k++) {
         | 
| 124 131 | 
             
                  Ski[k] = c * Sij[k][i] - s * Sij[k][j];
         | 
| 125 132 | 
             
                  Skj[k] = s * Sij[k][i] + c * Sij[k][j];
         | 
| @@ -135,8 +142,8 @@ function createRealSymmetric(_ref) { | |
| 135 142 | 
             
                var N = Sij.length;
         | 
| 136 143 | 
             
                var c = cos(theta);
         | 
| 137 144 | 
             
                var s = sin(theta);
         | 
| 138 | 
            -
                var Ski =  | 
| 139 | 
            -
                var Skj =  | 
| 145 | 
            +
                var Ski = Array(N).fill(bignumber(0));
         | 
| 146 | 
            +
                var Skj = Array(N).fill(bignumber(0));
         | 
| 140 147 | 
             
                for (var k = 0; k < N; k++) {
         | 
| 141 148 | 
             
                  Ski[k] = subtract(multiplyScalar(c, Sij[k][i]), multiplyScalar(s, Sij[k][j]));
         | 
| 142 149 | 
             
                  Skj[k] = addScalar(multiplyScalar(s, Sij[k][i]), multiplyScalar(c, Sij[k][j]));
         | 
| @@ -155,8 +162,8 @@ function createRealSymmetric(_ref) { | |
| 155 162 | 
             
                var s = bignumber(sin(theta));
         | 
| 156 163 | 
             
                var c2 = multiplyScalar(c, c);
         | 
| 157 164 | 
             
                var s2 = multiplyScalar(s, s);
         | 
| 158 | 
            -
                var Aki =  | 
| 159 | 
            -
                var Akj =  | 
| 165 | 
            +
                var Aki = Array(N).fill(bignumber(0));
         | 
| 166 | 
            +
                var Akj = Array(N).fill(bignumber(0));
         | 
| 160 167 | 
             
                // 2cs Hij
         | 
| 161 168 | 
             
                var csHij = multiply(bignumber(2), c, s, Hij[i][j]);
         | 
| 162 169 | 
             
                //  Aii
         | 
| @@ -191,8 +198,8 @@ function createRealSymmetric(_ref) { | |
| 191 198 | 
             
                var s = Math.sin(theta);
         | 
| 192 199 | 
             
                var c2 = c * c;
         | 
| 193 200 | 
             
                var s2 = s * s;
         | 
| 194 | 
            -
                var Aki =  | 
| 195 | 
            -
                var Akj =  | 
| 201 | 
            +
                var Aki = Array(N).fill(0);
         | 
| 202 | 
            +
                var Akj = Array(N).fill(0);
         | 
| 196 203 | 
             
                //  Aii
         | 
| 197 204 | 
             
                var Aii = c2 * Hij[i][i] - 2 * c * s * Hij[i][j] + s2 * Hij[j][j];
         | 
| 198 205 | 
             
                var Ajj = s2 * Hij[i][i] + 2 * c * s * Hij[i][j] + c2 * Hij[j][j];
         | 
| @@ -251,12 +258,15 @@ function createRealSymmetric(_ref) { | |
| 251 258 | 
             
              }
         | 
| 252 259 |  | 
| 253 260 | 
             
              // sort results
         | 
| 254 | 
            -
              function sorting(E, S) {
         | 
| 261 | 
            +
              function sorting(E, S, computeVectors) {
         | 
| 255 262 | 
             
                var N = E.length;
         | 
| 256 263 | 
             
                var values = Array(N);
         | 
| 257 | 
            -
                var  | 
| 258 | 
            -
                 | 
| 259 | 
            -
                   | 
| 264 | 
            +
                var vecs;
         | 
| 265 | 
            +
                if (computeVectors) {
         | 
| 266 | 
            +
                  vecs = Array(N);
         | 
| 267 | 
            +
                  for (var k = 0; k < N; k++) {
         | 
| 268 | 
            +
                    vecs[k] = Array(N);
         | 
| 269 | 
            +
                  }
         | 
| 260 270 | 
             
                }
         | 
| 261 271 | 
             
                for (var i = 0; i < N; i++) {
         | 
| 262 272 | 
             
                  var minID = 0;
         | 
| @@ -268,30 +278,26 @@ function createRealSymmetric(_ref) { | |
| 268 278 | 
             
                    }
         | 
| 269 279 | 
             
                  }
         | 
| 270 280 | 
             
                  values[i] = E.splice(minID, 1)[0];
         | 
| 271 | 
            -
                   | 
| 272 | 
            -
                     | 
| 273 | 
            -
             | 
| 281 | 
            +
                  if (computeVectors) {
         | 
| 282 | 
            +
                    for (var _k5 = 0; _k5 < N; _k5++) {
         | 
| 283 | 
            +
                      vecs[i][_k5] = S[_k5][minID];
         | 
| 284 | 
            +
                      S[_k5].splice(minID, 1);
         | 
| 285 | 
            +
                    }
         | 
| 274 286 | 
             
                  }
         | 
| 275 287 | 
             
                }
         | 
| 288 | 
            +
                if (!computeVectors) return {
         | 
| 289 | 
            +
                  values: values
         | 
| 290 | 
            +
                };
         | 
| 291 | 
            +
                var eigenvectors = vecs.map(function (vector, i) {
         | 
| 292 | 
            +
                  return {
         | 
| 293 | 
            +
                    value: values[i],
         | 
| 294 | 
            +
                    vector: vector
         | 
| 295 | 
            +
                  };
         | 
| 296 | 
            +
                });
         | 
| 276 297 | 
             
                return {
         | 
| 277 298 | 
             
                  values: values,
         | 
| 278 | 
            -
                   | 
| 299 | 
            +
                  eigenvectors: eigenvectors
         | 
| 279 300 | 
             
                };
         | 
| 280 301 | 
             
              }
         | 
| 281 | 
            -
             | 
| 282 | 
            -
              /**
         | 
| 283 | 
            -
               * Create an array of a certain size and fill all items with an initial value
         | 
| 284 | 
            -
               * @param {number} size
         | 
| 285 | 
            -
               * @param {number} value
         | 
| 286 | 
            -
               * @return {number[]}
         | 
| 287 | 
            -
               */
         | 
| 288 | 
            -
              function createArray(size, value) {
         | 
| 289 | 
            -
                // TODO: as soon as all browsers support Array.fill, use that instead (IE doesn't support it)
         | 
| 290 | 
            -
                var array = new Array(size);
         | 
| 291 | 
            -
                for (var i = 0; i < size; i++) {
         | 
| 292 | 
            -
                  array[i] = value;
         | 
| 293 | 
            -
                }
         | 
| 294 | 
            -
                return array;
         | 
| 295 | 
            -
              }
         | 
| 296 302 | 
             
              return main;
         | 
| 297 303 | 
             
            }
         |