simple-squiggle

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

solveValidation.js (3791B)


      1 "use strict";
      2 
      3 Object.defineProperty(exports, "__esModule", {
      4   value: true
      5 });
      6 exports.createSolveValidation = createSolveValidation;
      7 
      8 var _is = require("../../../../utils/is.js");
      9 
     10 var _array = require("../../../../utils/array.js");
     11 
     12 var _string = require("../../../../utils/string.js");
     13 
     14 function createSolveValidation(_ref) {
     15   var DenseMatrix = _ref.DenseMatrix;
     16 
     17   /**
     18    * Validates matrix and column vector b for backward/forward substitution algorithms.
     19    *
     20    * @param {Matrix} m            An N x N matrix
     21    * @param {Array | Matrix} b    A column vector
     22    * @param {Boolean} copy        Return a copy of vector b
     23    *
     24    * @return {DenseMatrix}        Dense column vector b
     25    */
     26   return function solveValidation(m, b, copy) {
     27     var mSize = m.size();
     28 
     29     if (mSize.length !== 2) {
     30       throw new RangeError('Matrix must be two dimensional (size: ' + (0, _string.format)(mSize) + ')');
     31     }
     32 
     33     var rows = mSize[0];
     34     var columns = mSize[1];
     35 
     36     if (rows !== columns) {
     37       throw new RangeError('Matrix must be square (size: ' + (0, _string.format)(mSize) + ')');
     38     }
     39 
     40     var data = [];
     41 
     42     if ((0, _is.isMatrix)(b)) {
     43       var bSize = b.size();
     44       var bdata = b._data; // 1-dim vector
     45 
     46       if (bSize.length === 1) {
     47         if (bSize[0] !== rows) {
     48           throw new RangeError('Dimension mismatch. Matrix columns must match vector length.');
     49         }
     50 
     51         for (var i = 0; i < rows; i++) {
     52           data[i] = [bdata[i]];
     53         }
     54 
     55         return new DenseMatrix({
     56           data: data,
     57           size: [rows, 1],
     58           datatype: b._datatype
     59         });
     60       } // 2-dim column
     61 
     62 
     63       if (bSize.length === 2) {
     64         if (bSize[0] !== rows || bSize[1] !== 1) {
     65           throw new RangeError('Dimension mismatch. Matrix columns must match vector length.');
     66         }
     67 
     68         if ((0, _is.isDenseMatrix)(b)) {
     69           if (copy) {
     70             data = [];
     71 
     72             for (var _i = 0; _i < rows; _i++) {
     73               data[_i] = [bdata[_i][0]];
     74             }
     75 
     76             return new DenseMatrix({
     77               data: data,
     78               size: [rows, 1],
     79               datatype: b._datatype
     80             });
     81           }
     82 
     83           return b;
     84         }
     85 
     86         if ((0, _is.isSparseMatrix)(b)) {
     87           for (var _i2 = 0; _i2 < rows; _i2++) {
     88             data[_i2] = [0];
     89           }
     90 
     91           var values = b._values;
     92           var index = b._index;
     93           var ptr = b._ptr;
     94 
     95           for (var k1 = ptr[1], k = ptr[0]; k < k1; k++) {
     96             var _i3 = index[k];
     97             data[_i3][0] = values[k];
     98           }
     99 
    100           return new DenseMatrix({
    101             data: data,
    102             size: [rows, 1],
    103             datatype: b._datatype
    104           });
    105         }
    106       }
    107 
    108       throw new RangeError('Dimension mismatch. The right side has to be either 1- or 2-dimensional vector.');
    109     }
    110 
    111     if ((0, _is.isArray)(b)) {
    112       var bsize = (0, _array.arraySize)(b);
    113 
    114       if (bsize.length === 1) {
    115         if (bsize[0] !== rows) {
    116           throw new RangeError('Dimension mismatch. Matrix columns must match vector length.');
    117         }
    118 
    119         for (var _i4 = 0; _i4 < rows; _i4++) {
    120           data[_i4] = [b[_i4]];
    121         }
    122 
    123         return new DenseMatrix({
    124           data: data,
    125           size: [rows, 1]
    126         });
    127       }
    128 
    129       if (bsize.length === 2) {
    130         if (bsize[0] !== rows || bsize[1] !== 1) {
    131           throw new RangeError('Dimension mismatch. Matrix columns must match vector length.');
    132         }
    133 
    134         for (var _i5 = 0; _i5 < rows; _i5++) {
    135           data[_i5] = [b[_i5][0]];
    136         }
    137 
    138         return new DenseMatrix({
    139           data: data,
    140           size: [rows, 1]
    141         });
    142       }
    143 
    144       throw new RangeError('Dimension mismatch. The right side has to be either 1- or 2-dimensional vector.');
    145     }
    146   };
    147 }