simple-squiggle

A restricted subset of Squiggle
Log | Files | Refs | README

csPermute.js (1723B)


      1 "use strict";
      2 
      3 Object.defineProperty(exports, "__esModule", {
      4   value: true
      5 });
      6 exports.csPermute = csPermute;
      7 
      8 /**
      9  * Permutes a sparse matrix C = P * A * Q
     10  *
     11  * @param {SparseMatrix}  a         The Matrix A
     12  * @param {Array}   pinv            The row permutation vector
     13  * @param {Array}   q               The column permutation vector
     14  * @param {boolean} values          Create a pattern matrix (false), values and pattern otherwise
     15  *
     16  * @return {Matrix}                 C = P * A * Q, null on error
     17  *
     18  * Reference: http://faculty.cse.tamu.edu/davis/publications.html
     19  */
     20 function csPermute(a, pinv, q, values) {
     21   // a arrays
     22   var avalues = a._values;
     23   var aindex = a._index;
     24   var aptr = a._ptr;
     25   var asize = a._size;
     26   var adt = a._datatype; // rows & columns
     27 
     28   var m = asize[0];
     29   var n = asize[1]; // c arrays
     30 
     31   var cvalues = values && a._values ? [] : null;
     32   var cindex = []; // (aptr[n])
     33 
     34   var cptr = []; // (n + 1)
     35   // initialize vars
     36 
     37   var nz = 0; // loop columns
     38 
     39   for (var k = 0; k < n; k++) {
     40     // column k of C is column q[k] of A
     41     cptr[k] = nz; // apply column permutation
     42 
     43     var j = q ? q[k] : k; // loop values in column j of A
     44 
     45     for (var t0 = aptr[j], t1 = aptr[j + 1], t = t0; t < t1; t++) {
     46       // row i of A is row pinv[i] of C
     47       var r = pinv ? pinv[aindex[t]] : aindex[t]; // index
     48 
     49       cindex[nz] = r; // check we need to populate values
     50 
     51       if (cvalues) {
     52         cvalues[nz] = avalues[t];
     53       } // increment number of nonzero elements
     54 
     55 
     56       nz++;
     57     }
     58   } // finalize the last column of C
     59 
     60 
     61   cptr[n] = nz; // return C matrix
     62 
     63   return a.createSparseMatrix({
     64     values: cvalues,
     65     index: cindex,
     66     ptr: cptr,
     67     size: [m, n],
     68     datatype: adt
     69   });
     70 }