solveValidation.js 3.5 KB

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