csEreach.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.csEreach = csEreach;
  6. var _csMark = require("./csMark.js");
  7. var _csMarked = require("./csMarked.js");
  8. /**
  9. * Find nonzero pattern of Cholesky L(k,1:k-1) using etree and triu(A(:,k))
  10. *
  11. * @param {Matrix} a The A matrix
  12. * @param {Number} k The kth column in A
  13. * @param {Array} parent The parent vector from the symbolic analysis result
  14. * @param {Array} w The nonzero pattern xi[top] .. xi[n - 1], an array of size = 2 * n
  15. * The first n entries is the nonzero pattern, the last n entries is the stack
  16. *
  17. * @return {Number} The index for the nonzero pattern
  18. *
  19. * Reference: http://faculty.cse.tamu.edu/davis/publications.html
  20. */
  21. function csEreach(a, k, parent, w) {
  22. // a arrays
  23. var aindex = a._index;
  24. var aptr = a._ptr;
  25. var asize = a._size;
  26. // columns
  27. var n = asize[1];
  28. // initialize top
  29. var top = n;
  30. // vars
  31. var p, p0, p1, len;
  32. // mark node k as visited
  33. (0, _csMark.csMark)(w, k);
  34. // loop values & index for column k
  35. for (p0 = aptr[k], p1 = aptr[k + 1], p = p0; p < p1; p++) {
  36. // A(i,k) is nonzero
  37. var i = aindex[p];
  38. // only use upper triangular part of A
  39. if (i > k) {
  40. continue;
  41. }
  42. // traverse up etree
  43. for (len = 0; !(0, _csMarked.csMarked)(w, i); i = parent[i]) {
  44. // L(k,i) is nonzero, last n entries in w
  45. w[n + len++] = i;
  46. // mark i as visited
  47. (0, _csMark.csMark)(w, i);
  48. }
  49. while (len > 0) {
  50. // decrement top & len
  51. --top;
  52. --len;
  53. // push path onto stack, last n entries in w
  54. w[n + top] = w[n + len];
  55. }
  56. }
  57. // unmark all nodes
  58. for (p = top; p < n; p++) {
  59. // use stack value, last n entries in w
  60. (0, _csMark.csMark)(w, w[n + p]);
  61. }
  62. // unmark node k
  63. (0, _csMark.csMark)(w, k);
  64. // s[top..n-1] contains pattern of L(k,:)
  65. return top;
  66. }