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 }