CommonTest.cpp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <Tests/Environment.h>
  9. #include <AzTest/AzTest.h>
  10. #include <LinearAlgebra.h>
  11. namespace NumericalMethods
  12. {
  13. TEST(LinearAlgebraTest, VectorVariableAccessors_AccessingElements_CorrectResults)
  14. {
  15. VectorVariable v1 = VectorVariable::CreateFromVector({ 2.0, 5.0, -3.0 });
  16. EXPECT_NEAR(v1[0], 2.0, 1e-3);
  17. EXPECT_NEAR(v1[2], -3.0, 1e-3);
  18. EXPECT_NEAR(v1[1], 5.0, 1e-3);
  19. }
  20. TEST(LinearAlgebraTest, VectorVariable_GetDimension_CorrectDimension)
  21. {
  22. VectorVariable v1 = VectorVariable::CreateFromVector({ 3.0, -4.0, 12.0 });
  23. VectorVariable v2 = VectorVariable::CreateFromVector({ -7.0, -24.0 });
  24. VectorVariable v3 = VectorVariable::CreateFromVector({ 17.0 });
  25. VectorVariable v4;
  26. VectorVariable v5 = VectorVariable::CreateFromVector({ 3.0, 10.0, -5.0, 7.0, -8.0, 3.0 });
  27. VectorVariable v6(5);
  28. EXPECT_EQ(v1.GetDimension(), 3);
  29. EXPECT_EQ(v2.GetDimension(), 2);
  30. EXPECT_EQ(v3.GetDimension(), 1);
  31. EXPECT_EQ(v4.GetDimension(), 0);
  32. EXPECT_EQ(v5.GetDimension(), 6);
  33. EXPECT_EQ(v6.GetDimension(), 5);
  34. }
  35. TEST(LinearAlgebraTest, VectorVariableArithmetic_AddingVectors_CorrectResults)
  36. {
  37. VectorVariable v1 = VectorVariable::CreateFromVector({ 1.0, 2.0, 3.0 });
  38. VectorVariable v2 = VectorVariable::CreateFromVector({ 2.0, 6.0, -4.0 });
  39. VectorVariable v3 = v1 + v2;
  40. ExpectClose(v3.GetValues(), { 3.0, 8.0, -1.0 }, 1e-3);
  41. v3 += v1;
  42. ExpectClose(v3.GetValues(), { 4.0, 10.0, 2.0 }, 1e-3);
  43. }
  44. TEST(LinearAlgebraTest, VectorVariableArithmetic_SubtractingVectors_CorrectResults)
  45. {
  46. VectorVariable v1 = VectorVariable::CreateFromVector({ 1.0, 2.0, 3.0 });
  47. VectorVariable v2 = VectorVariable::CreateFromVector({ 2.0, 6.0, -4.0 });
  48. VectorVariable v3 = v1 - v2;
  49. ExpectClose(v3.GetValues(), { -1.0, -4.0, 7.0 }, 1e-3);
  50. v3 = v2 - v1;
  51. ExpectClose(v3.GetValues(), { 1.0, 4.0, -7.0 }, 1e-3);
  52. VectorVariable v4 = -v3;
  53. ExpectClose(v4.GetValues(), { -1.0, -4.0, 7.0 }, 1e-3);
  54. v4 -= v2;
  55. ExpectClose(v4.GetValues(), { -3.0, -10.0, 11.0 }, 1e-3);
  56. }
  57. TEST(LinearAlgebraTest, VectorVariableArithmetic_ScalarVectorMultiplication_CorrectResults)
  58. {
  59. VectorVariable v1 = VectorVariable::CreateFromVector({ 1.0, 2.0, 3.0 });
  60. VectorVariable v2 = VectorVariable::CreateFromVector({ 2.0, 6.0, -4.0 });
  61. VectorVariable v3 = 3.0 * v1;
  62. ExpectClose(v3.GetValues(), { 3.0, 6.0, 9.0 }, 1e-3);
  63. v3 = v2 * 0.5;
  64. ExpectClose(v3.GetValues(), { 1.0, 3.0, -2.0 }, 1e-3);
  65. }
  66. TEST(LinearAlgebraTest, VectorVariableArithmetic_Norm_CorrectResults)
  67. {
  68. VectorVariable v1 = VectorVariable::CreateFromVector({ 3.0, -4.0, 12.0 });
  69. VectorVariable v2 = VectorVariable::CreateFromVector({ -7.0, -24.0 });
  70. VectorVariable v3 = VectorVariable::CreateFromVector({ 17.0 });
  71. VectorVariable v4;
  72. VectorVariable v5 = VectorVariable::CreateFromVector({ 3.0, 10.0, -5.0, 7.0, -8.0, 3.0 });
  73. VectorVariable v6(5);
  74. EXPECT_NEAR(v1.Norm(), 13.0, 1e-3);
  75. EXPECT_NEAR(v2.Norm(), 25.0, 1e-3);
  76. EXPECT_NEAR(v3.Norm(), 17.0, 1e-3);
  77. EXPECT_NEAR(v4.Norm(), 0, 1e-3);
  78. EXPECT_NEAR(v5.Norm(), 16, 1e-3);
  79. EXPECT_NEAR(v6.Norm(), 0, 1e-3);
  80. }
  81. TEST(LinearAlgebraTest, VectorVariableArithmetic_DotProduct_CorrectResults)
  82. {
  83. VectorVariable v1 = VectorVariable::CreateFromVector({ 6.0, -5.0, 8.0 });
  84. VectorVariable v2 = VectorVariable::CreateFromVector({ -7.0, -4.0, 2.0 });
  85. VectorVariable v3 = VectorVariable::CreateFromVector({ 3.0, 7.0, -5.0 });
  86. EXPECT_NEAR(v1.Dot(v2), -6.0, 1e-3);
  87. EXPECT_NEAR(v2.Dot(v1), -6.0, 1e-3);
  88. EXPECT_NEAR(v1.Dot(v3), -57.0, 1e-3);
  89. EXPECT_NEAR(v2.Dot(v3), -59.0, 1e-3);
  90. }
  91. TEST(LinearAlgebraTest, MatrixArithmetic_AddingMatrices_CorrectResults)
  92. {
  93. MatrixVariable m1(2, 3);
  94. MatrixVariable m2(2, 3);
  95. for (AZ::u32 row = 0; row < 2; row++)
  96. {
  97. for (AZ::u32 col = 0; col < 3; col++)
  98. {
  99. m1.Element(row, col) = row * row + col; // [[0, 1, 2], [1, 2, 3]]
  100. m2.Element(row, col) = row + col * 2.0; // [[0, 2, 4], [1, 3, 5]]
  101. }
  102. }
  103. MatrixVariable m3 = m1 + m2; // [[0, 3, 6], [2, 5, 8]]
  104. EXPECT_EQ(m3.GetNumRows(), 2);
  105. EXPECT_EQ(m3.GetNumColumns(), 3);
  106. EXPECT_NEAR(m3.Element(0, 0), 0.0, 1e-3);
  107. EXPECT_NEAR(m3.Element(1, 2), 8.0, 1e-3);
  108. EXPECT_NEAR(m3.Element(0, 1), 3.0, 1e-3);
  109. m3 += m1; // [[0, 4, 8], [3, 7, 11]]
  110. EXPECT_NEAR(m3.Element(0, 2), 8.0, 1e-3);
  111. EXPECT_NEAR(m3.Element(1, 1), 7.0, 1e-3);
  112. }
  113. TEST(LinearAlgebraTest, MatrixArithmetic_SubtractingMatrices_CorrectResults)
  114. {
  115. MatrixVariable m1(2, 3);
  116. MatrixVariable m2(2, 3);
  117. for (AZ::u32 row = 0; row < 2; row++)
  118. {
  119. for (AZ::u32 col = 0; col < 3; col++)
  120. {
  121. m1.Element(row, col) = row * row + col; // [[0, 1, 2], [1, 2, 3]]
  122. m2.Element(row, col) = row + col * 2.0; // [[0, 2, 4], [1, 3, 5]]
  123. }
  124. }
  125. MatrixVariable m3 = m2 - m1; // [[0, 1, 2], [0, 1, 2]]
  126. EXPECT_EQ(m3.GetNumRows(), 2);
  127. EXPECT_EQ(m3.GetNumColumns(), 3);
  128. EXPECT_NEAR(m3.Element(0, 2), 2.0, 1e-3);
  129. EXPECT_NEAR(m3.Element(1, 1), 1.0, 1e-3);
  130. EXPECT_NEAR(m3.Element(0, 1), 1.0, 1e-3);
  131. m3 = m1 - m3; // [[0, 0, 0], [1, 1, 1]]
  132. EXPECT_NEAR(m3.Element(0, 1), 0.0, 1e-3);
  133. EXPECT_NEAR(m3.Element(0, 0), 0.0, 1e-3);
  134. EXPECT_NEAR(m3.Element(1, 2), 1.0, 1e-3);
  135. }
  136. TEST(LinearAlgebraTest, MatrixArithmetic_MatrixScalarDivision_CorrectResults)
  137. {
  138. MatrixVariable m1(2, 2);
  139. m1.Element(0, 0) = 3.0;
  140. m1.Element(0, 1) = 9.0;
  141. m1.Element(1, 0) = -6.0;
  142. m1.Element(1, 1) = 3.0;
  143. MatrixVariable m2 = m1 / 3.0;
  144. EXPECT_NEAR(m2.Element(0, 0), 1.0, 1e-3);
  145. EXPECT_NEAR(m2.Element(1, 0), -2.0, 1e-3);
  146. MatrixVariable m3 = m2 / 0.5;
  147. EXPECT_NEAR(m3.Element(1, 1), 2.0, 1e-3);
  148. EXPECT_NEAR(m3.Element(1, 0), -4.0, 1e-3);
  149. }
  150. TEST(LinearAlgebraTest, MatrixArithmetic_MatrixScalarMultiplication_CorrectResults)
  151. {
  152. MatrixVariable m1(3, 2);
  153. m1.Element(0, 0) = 7.0;
  154. m1.Element(0, 1) = 5.0;
  155. m1.Element(1, 0) = -3.0;
  156. m1.Element(1, 1) = 4.0;
  157. m1.Element(2, 0) = 6.0;
  158. m1.Element(2, 1) = -2.0;
  159. MatrixVariable m2 = 4.0 * m1;
  160. EXPECT_NEAR(m2.Element(2, 0), 24.0, 1e-3);
  161. EXPECT_NEAR(m2.Element(1, 0), -12.0, 1e-3);
  162. EXPECT_NEAR(m2.Element(0, 1), 20.0, 1e-3);
  163. MatrixVariable m3 = 0.5 * m2;
  164. EXPECT_NEAR(m3.Element(1, 1), 8.0, 1e-3);
  165. EXPECT_NEAR(m3.Element(2, 1), -4.0, 1e-3);
  166. EXPECT_NEAR(m3.Element(0, 0), 14.0, 1e-3);
  167. }
  168. TEST(LinearAlgebraTest, MatrixArithmetic_MatrixMatrixMultiplication_CorrectResults)
  169. {
  170. MatrixVariable m1(3, 2);
  171. m1.Element(0, 0) = 1.0;
  172. m1.Element(0, 1) = 7.0;
  173. m1.Element(1, 0) = -2.0;
  174. m1.Element(1, 1) = -4.0;
  175. m1.Element(2, 0) = -3.0;
  176. m1.Element(2, 1) = 5.0;
  177. MatrixVariable m2(2, 2);
  178. m2.Element(0, 0) = 4.0;
  179. m2.Element(0, 1) = -3.0;
  180. m2.Element(1, 0) = 5.0;
  181. m2.Element(1, 1) = 2.0;
  182. MatrixVariable m3 = m1 * m2;
  183. EXPECT_EQ(m3.GetNumRows(), 3);
  184. EXPECT_EQ(m3.GetNumColumns(), 2);
  185. EXPECT_NEAR(m3.Element(0, 0), 39.0, 1e-3);
  186. EXPECT_NEAR(m3.Element(0, 1), 11.0, 1e-3);
  187. EXPECT_NEAR(m3.Element(1, 0), -28.0, 1e-3);
  188. EXPECT_NEAR(m3.Element(1, 1), -2.0, 1e-3);
  189. EXPECT_NEAR(m3.Element(2, 0), 13.0, 1e-3);
  190. EXPECT_NEAR(m3.Element(2, 1), 19.0, 1e-3);
  191. }
  192. TEST(LinearAlgebraTest, MatrixArithmetic_MatrixVectorMultiplication_CorrectResults)
  193. {
  194. MatrixVariable m(3, 2);
  195. m.Element(0, 0) = 1.0;
  196. m.Element(0, 1) = 7.0;
  197. m.Element(1, 0) = -2.0;
  198. m.Element(1, 1) = -4.0;
  199. m.Element(2, 0) = -3.0;
  200. m.Element(2, 1) = 5.0;
  201. VectorVariable v1 = VectorVariable::CreateFromVector({ 2.0, -3.0 });
  202. VectorVariable v2 = m * v1;
  203. EXPECT_EQ(v2.GetDimension(), 3);
  204. ExpectClose(v2.GetValues(), { -19.0, 8.0, -21.0 }, 1e-3);
  205. }
  206. TEST(LinearAlgebraTest, MatrixArithmetic_OuterProduct_CorrectResults)
  207. {
  208. VectorVariable v1 = VectorVariable::CreateFromVector({ 1.0, -2.0, 2.0 });
  209. VectorVariable v2 = VectorVariable::CreateFromVector({ -2.0, 3.0, 1.0 });
  210. MatrixVariable m = OuterProduct(v1, v2);
  211. EXPECT_NEAR(m.Element(0, 1), 3.0, 1e-3);
  212. EXPECT_NEAR(m.Element(1, 2), -2.0, 1e-3);
  213. EXPECT_NEAR(m.Element(1, 1), -6.0, 1e-3);
  214. EXPECT_NEAR(m.Element(0, 2), 1.0, 1e-3);
  215. EXPECT_NEAR(m.Element(2, 1), 6.0, 1e-3);
  216. }
  217. } // namespace NumericalMethods::Optimization