tensor.spec.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /**
  2. * Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import { Tensor as T } from '../tensor'
  7. import { Mat4 } from '../3d'
  8. describe('tensor', () => {
  9. it('vector', () => {
  10. const V = T.Vector(3);
  11. const data = V.create();
  12. V.set(data, 0, 1);
  13. V.set(data, 1, 2);
  14. V.set(data, 2, 3);
  15. expect(data).toEqual(new Float64Array([1, 2, 3]));
  16. expect(V.get(data, 0)).toEqual(1);
  17. expect(V.get(data, 1)).toEqual(2);
  18. expect(V.get(data, 2)).toEqual(3);
  19. });
  20. it('matrix cm', () => {
  21. const M = T.ColumnMajorMatrix(3, 2, Int32Array);
  22. const data = M.create()
  23. // rows: [ [0, 1], [1, 2], [2, 3] ]
  24. for (let i = 0; i < 3; i++) {
  25. for (let j = 0; j < 2; j++) {
  26. M.set(data, i, j, i + j);
  27. }
  28. }
  29. expect(data).toEqual(new Int32Array([0, 1, 2, 1, 2, 3]));
  30. });
  31. it('matrix rm', () => {
  32. const M = T.RowMajorMatrix(3, 2, Int32Array);
  33. const data = M.create();
  34. // rows: [ [0, 1], [1, 2], [2, 3] ]
  35. for (let i = 0; i < 3; i++) {
  36. for (let j = 0; j < 2; j++) {
  37. M.set(data, i, j, i + j);
  38. }
  39. }
  40. expect(data).toEqual(new Int32Array([0, 1, 1, 2, 2, 3]));
  41. });
  42. it('mat4 equiv', () => {
  43. const M = T.ColumnMajorMatrix(4, 4);
  44. const data = M.create();
  45. const m = Mat4.zero();
  46. for (let i = 0; i < 4; i++) {
  47. for (let j = 0; j < 4; j++) {
  48. const v = (i + 1) * (j + 2);
  49. M.set(data, i, j, v);
  50. Mat4.setValue(m, i, j, v);
  51. }
  52. }
  53. for (let i = 0; i < 16; i++) expect(data[i]).toEqual(m[i]);
  54. });
  55. it('2d ij', () => {
  56. const M = T.Space([3, 4], [0, 1]);
  57. const data = M.create();
  58. const exp = new Float64Array(3 * 4)
  59. let o = 0;
  60. for (let i = 0; i < 3; i++) {
  61. for (let j = 0; j < 4; j++) {
  62. M.set(data, i, j, o);
  63. exp[o] = o;
  64. o++;
  65. }
  66. }
  67. expect(data).toEqual(exp);
  68. });
  69. it('2d ji', () => {
  70. const M = T.Space([3, 4], [1, 0]);
  71. const data = M.create();
  72. const exp = new Float64Array(3 * 4)
  73. let o = 0;
  74. for (let j = 0; j < 4; j++) {
  75. for (let i = 0; i < 3; i++) {
  76. M.set(data, i, j, o);
  77. exp[o] = o;
  78. o++;
  79. }
  80. }
  81. expect(data).toEqual(exp);
  82. });
  83. it('3d ijk', () => {
  84. const M = T.Space([3, 4, 5], [0, 1, 2]);
  85. const data = M.create();
  86. const exp = new Float64Array(3 * 4 * 5)
  87. let o = 0;
  88. for (let i = 0; i < 3; i++) {
  89. for (let j = 0; j < 4; j++) {
  90. for (let k = 0; k < 5; k++) {
  91. M.set(data, i, j, k, o);
  92. exp[o] = o;
  93. o++;
  94. }
  95. }
  96. }
  97. expect(data).toEqual(exp);
  98. });
  99. it('3d ikj', () => {
  100. const M = T.Space([3, 3, 3], [0, 2, 1]);
  101. const data = M.create();
  102. const exp = new Float64Array(3 * 3 * 3)
  103. let o = 0;
  104. for (let i = 0; i < 3; i++) {
  105. for (let k = 0; k < 3; k++) {
  106. for (let j = 0; j < 3; j++) {
  107. M.set(data, i, j, k, o);
  108. exp[o] = o;
  109. o++;
  110. }
  111. }
  112. }
  113. expect(data).toEqual(exp);
  114. });
  115. it('3d jik', () => {
  116. const M = T.Space([3, 3, 3], [1, 0, 2]);
  117. const data = M.create();
  118. const exp = new Float64Array(3 * 3 * 3)
  119. let o = 0;
  120. for (let j = 0; j < 3; j++) {
  121. for (let i = 0; i < 3; i++) {
  122. for (let k = 0; k < 3; k++) {
  123. M.set(data, i, j, k, o);
  124. exp[o] = o;
  125. o++;
  126. }
  127. }
  128. }
  129. expect(data).toEqual(exp);
  130. });
  131. it('3d jki', () => {
  132. const M = T.Space([3, 3, 3], [1, 2, 0]);
  133. const data = M.create();
  134. const exp = new Float64Array(3 * 3 * 3)
  135. let o = 0;
  136. for (let j = 0; j < 3; j++) {
  137. for (let k = 0; k < 3; k++) {
  138. for (let i = 0; i < 3; i++) {
  139. M.set(data, i, j, k, o);
  140. exp[o] = o;
  141. o++;
  142. }
  143. }
  144. }
  145. expect(data).toEqual(exp);
  146. });
  147. it('3d kij', () => {
  148. const M = T.Space([3, 3, 3], [2, 0, 1]);
  149. const data = M.create();
  150. const exp = new Float64Array(3 * 3 * 3)
  151. let o = 0;
  152. for (let k = 0; k < 3; k++) {
  153. for (let i = 0; i < 3; i++) {
  154. for (let j = 0; j < 3; j++) {
  155. M.set(data, i, j, k, o);
  156. exp[o] = o;
  157. o++;
  158. }
  159. }
  160. }
  161. expect(data).toEqual(exp);
  162. });
  163. it('3d kji', () => {
  164. const M = T.Space([3, 3, 3], [2, 1, 0]);
  165. const data = M.create();
  166. const exp = new Float64Array(3 * 3 * 3)
  167. let o = 0;
  168. for (let k = 0; k < 3; k++) {
  169. for (let j = 0; j < 3; j++) {
  170. for (let i = 0; i < 3; i++) {
  171. M.set(data, i, j, k, o);
  172. exp[o] = o;
  173. o++;
  174. }
  175. }
  176. }
  177. expect(data).toEqual(exp);
  178. });
  179. });