1f9b284de2
Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> # Conflicts: # Code/Editor/Plugins/ComponentEntityEditorPlugin/ComponentEntityEditorPlugin_precompiled.h # Code/Editor/Plugins/EditorCommon/EditorCommon_precompiled.h # Code/Editor/Plugins/EditorCommon/stdafx.cpp # Code/Editor/Plugins/FFMPEGPlugin/FFMPEGPlugin_precompiled.h # Code/Editor/Plugins/PerforcePlugin/PerforcePlugin_precompiled.h # Code/Editor/Plugins/ProjectSettingsTool/ProjectSettingsTool_precompiled.h # Code/Framework/AzToolsFramework/AzToolsFramework/AzToolsFramework_precompiled.h # Code/Tools/AssetProcessor/native/precompiled.h # Code/Tools/Standalone/StandaloneTools_precompiled.h # Gems/AssetMemoryAnalyzer/Code/Source/AssetMemoryAnalyzer_precompiled.h # Gems/Atom/Asset/ImageProcessingAtom/Code/Source/ImageProcessing_precompiled.h # Gems/Atom/RHI/DX12/Code/Source/RHI/Atom_RHI_DX12_precompiled.h # Gems/Atom/RHI/Metal/Code/Include/Platform/Mac/Atom_RHI_Metal_precompiled_Platform.h # Gems/Atom/RHI/Metal/Code/Include/Platform/iOS/Atom_RHI_Metal_precompiled_Platform.h # Gems/Atom/RHI/Metal/Code/Source/Atom_RHI_Metal_precompiled.h # Gems/Atom/RHI/Metal/Code/atom_rhi_metal_common_files.cmake # Gems/Atom/RHI/Null/Code/Source/Atom_RHI_Null_precompiled.h # Gems/Atom/RHI/Null/Code/atom_rhi_null_common_files.cmake # Gems/Atom/RHI/Vulkan/Code/Include/Platform/Android/Atom_RHI_Vulkan_precompiled_Platform.h # Gems/Atom/RHI/Vulkan/Code/Include/Platform/Linux/Atom_RHI_Vulkan_precompiled_Platform.h # Gems/Atom/RHI/Vulkan/Code/Include/Platform/Mac/Atom_RHI_Vulkan_precompiled_Platform.h # Gems/Atom/RHI/Vulkan/Code/Include/Platform/Windows/Atom_RHI_Vulkan_precompiled_Platform.h # Gems/Atom/RHI/Vulkan/Code/Source/Atom_RHI_Vulkan_precompiled.h # Gems/Atom/RHI/Vulkan/Code/Source/RHI/SwapChain.cpp # Gems/Atom/RHI/Vulkan/Code/atom_rhi_vulkan_common_files.cmake # Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomFont_precompiled.h # Gems/Blast/Code/Source/StdAfx.cpp # Gems/Camera/Code/Source/Camera_precompiled.h # Gems/EMotionFX/Code/Source/EMotionFX_precompiled.h # Gems/FastNoise/Code/Source/FastNoise_precompiled.h # Gems/Gestures/Code/Source/Gestures_precompiled.h # Gems/GradientSignal/Code/Source/GradientSignal_precompiled.h # Gems/GraphCanvas/Code/precompiled.h # Gems/ImGui/Code/Source/ImGui_precompiled.h # Gems/InAppPurchases/Code/Source/InAppPurchases_precompiled.h # Gems/LmbrCentral/Code/Source/LmbrCentral_precompiled.h # Gems/LmbrCentral/Code/Tests/ShapeGeometryUtilTest.cpp # Gems/LyShine/Code/Editor/UiCanvasEditor_precompiled.h # Gems/LyShine/Code/Source/Animation/LyShine_precompiled.h # Gems/LyShine/Code/Source/LyShine_precompiled.h # Gems/LyShineExamples/Code/Source/LyShineExamples_precompiled.h # Gems/Maestro/Code/Source/Cinematics/Maestro_precompiled.h # Gems/Maestro/Code/Source/Maestro_precompiled.h # Gems/MessagePopup/Code/Source/MessagePopup_precompiled.h # Gems/Metastream/Code/Source/Metastream_precompiled.h # Gems/Microphone/Code/Source/Microphone_precompiled.h # Gems/Multiplayer/Code/Source/Multiplayer_precompiled.h # Gems/PhysX/Code/NumericalMethods/Source/NumericalMethods_precompiled.h # Gems/PhysX/Code/Source/PhysXUnsupported_precompiled.h # Gems/PhysX/Code/Source/PhysX_precompiled.h # Gems/PhysX/Code/physx_unsupported_files.cmake # Gems/PhysXDebug/Code/Source/PhysXDebugUnsupported_precompiled.h # Gems/PhysXDebug/Code/Source/PhysXDebug_precompiled.h # Gems/ScriptCanvas/Code/Editor/precompiled.h # Gems/ScriptCanvas/Code/Source/precompiled.h # Gems/ScriptCanvasDeveloper/Code/Source/precompiled.h # Gems/ScriptCanvasPhysics/Code/Source/ScriptCanvasPhysics_precompiled.h # Gems/ScriptEvents/Code/Source/precompiled.h # Gems/ScriptEvents/Code/Tests/Editor/EditorTests.cpp # Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweener_precompiled.h # Gems/SliceFavorites/Code/Source/SliceFavorites_precompiled.h # Gems/StartingPointCamera/Code/Source/StartingPointCamera_precompiled.h # Gems/StartingPointInput/Code/Source/StartingPointInput_precompiled.h # Gems/StartingPointMovement/Code/Source/StartingPointMovement_precompiled.h # Gems/SurfaceData/Code/Source/SurfaceData_precompiled.h # Gems/TextureAtlas/Code/Source/TextureAtlas_precompiled.h # Gems/TickBusOrderViewer/Code/Source/TickBusOrderViewer_precompiled.h # Gems/Twitch/Code/Source/Twitch_precompiled.h # Gems/VirtualGamepad/Code/Source/VirtualGamepad_precompiled.h # Gems/WhiteBox/Code/Source/WhiteBoxUnsupported_precompiled.h # Gems/WhiteBox/Code/Source/WhiteBox_precompiled.h
242 lines
9.1 KiB
C++
242 lines
9.1 KiB
C++
/*
|
|
* Copyright (c) Contributors to the Open 3D Engine Project.
|
|
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
*
|
|
*/
|
|
|
|
#include <Tests/Environment.h>
|
|
#include <AzTest/AzTest.h>
|
|
#include <LinearAlgebra.h>
|
|
|
|
namespace NumericalMethods
|
|
{
|
|
TEST(LinearAlgebraTest, VectorVariableAccessors_AccessingElements_CorrectResults)
|
|
{
|
|
VectorVariable v1 = VectorVariable::CreateFromVector({ 2.0, 5.0, -3.0 });
|
|
|
|
EXPECT_NEAR(v1[0], 2.0, 1e-3);
|
|
EXPECT_NEAR(v1[2], -3.0, 1e-3);
|
|
EXPECT_NEAR(v1[1], 5.0, 1e-3);
|
|
}
|
|
|
|
TEST(LinearAlgebraTest, VectorVariable_GetDimension_CorrectDimension)
|
|
{
|
|
VectorVariable v1 = VectorVariable::CreateFromVector({ 3.0, -4.0, 12.0 });
|
|
VectorVariable v2 = VectorVariable::CreateFromVector({ -7.0, -24.0 });
|
|
VectorVariable v3 = VectorVariable::CreateFromVector({ 17.0 });
|
|
VectorVariable v4;
|
|
VectorVariable v5 = VectorVariable::CreateFromVector({ 3.0, 10.0, -5.0, 7.0, -8.0, 3.0 });
|
|
VectorVariable v6(5);
|
|
|
|
EXPECT_EQ(v1.GetDimension(), 3);
|
|
EXPECT_EQ(v2.GetDimension(), 2);
|
|
EXPECT_EQ(v3.GetDimension(), 1);
|
|
EXPECT_EQ(v4.GetDimension(), 0);
|
|
EXPECT_EQ(v5.GetDimension(), 6);
|
|
EXPECT_EQ(v6.GetDimension(), 5);
|
|
}
|
|
|
|
TEST(LinearAlgebraTest, VectorVariableArithmetic_AddingVectors_CorrectResults)
|
|
{
|
|
VectorVariable v1 = VectorVariable::CreateFromVector({ 1.0, 2.0, 3.0 });
|
|
VectorVariable v2 = VectorVariable::CreateFromVector({ 2.0, 6.0, -4.0 });
|
|
VectorVariable v3 = v1 + v2;
|
|
ExpectClose(v3.GetValues(), { 3.0, 8.0, -1.0 }, 1e-3);
|
|
v3 += v1;
|
|
ExpectClose(v3.GetValues(), { 4.0, 10.0, 2.0 }, 1e-3);
|
|
}
|
|
|
|
TEST(LinearAlgebraTest, VectorVariableArithmetic_SubtractingVectors_CorrectResults)
|
|
{
|
|
VectorVariable v1 = VectorVariable::CreateFromVector({ 1.0, 2.0, 3.0 });
|
|
VectorVariable v2 = VectorVariable::CreateFromVector({ 2.0, 6.0, -4.0 });
|
|
VectorVariable v3 = v1 - v2;
|
|
ExpectClose(v3.GetValues(), { -1.0, -4.0, 7.0 }, 1e-3);
|
|
v3 = v2 - v1;
|
|
ExpectClose(v3.GetValues(), { 1.0, 4.0, -7.0 }, 1e-3);
|
|
VectorVariable v4 = -v3;
|
|
ExpectClose(v4.GetValues(), { -1.0, -4.0, 7.0 }, 1e-3);
|
|
v4 -= v2;
|
|
ExpectClose(v4.GetValues(), { -3.0, -10.0, 11.0 }, 1e-3);
|
|
}
|
|
|
|
TEST(LinearAlgebraTest, VectorVariableArithmetic_ScalarVectorMultiplication_CorrectResults)
|
|
{
|
|
VectorVariable v1 = VectorVariable::CreateFromVector({ 1.0, 2.0, 3.0 });
|
|
VectorVariable v2 = VectorVariable::CreateFromVector({ 2.0, 6.0, -4.0 });
|
|
VectorVariable v3 = 3.0 * v1;
|
|
ExpectClose(v3.GetValues(), { 3.0, 6.0, 9.0 }, 1e-3);
|
|
v3 = v2 * 0.5;
|
|
ExpectClose(v3.GetValues(), { 1.0, 3.0, -2.0 }, 1e-3);
|
|
}
|
|
|
|
TEST(LinearAlgebraTest, VectorVariableArithmetic_Norm_CorrectResults)
|
|
{
|
|
VectorVariable v1 = VectorVariable::CreateFromVector({ 3.0, -4.0, 12.0 });
|
|
VectorVariable v2 = VectorVariable::CreateFromVector({ -7.0, -24.0 });
|
|
VectorVariable v3 = VectorVariable::CreateFromVector({ 17.0 });
|
|
VectorVariable v4;
|
|
VectorVariable v5 = VectorVariable::CreateFromVector({ 3.0, 10.0, -5.0, 7.0, -8.0, 3.0 });
|
|
VectorVariable v6(5);
|
|
|
|
EXPECT_NEAR(v1.Norm(), 13.0, 1e-3);
|
|
EXPECT_NEAR(v2.Norm(), 25.0, 1e-3);
|
|
EXPECT_NEAR(v3.Norm(), 17.0, 1e-3);
|
|
EXPECT_NEAR(v4.Norm(), 0, 1e-3);
|
|
EXPECT_NEAR(v5.Norm(), 16, 1e-3);
|
|
EXPECT_NEAR(v6.Norm(), 0, 1e-3);
|
|
}
|
|
|
|
TEST(LinearAlgebraTest, VectorVariableArithmetic_DotProduct_CorrectResults)
|
|
{
|
|
VectorVariable v1 = VectorVariable::CreateFromVector({ 6.0, -5.0, 8.0 });
|
|
VectorVariable v2 = VectorVariable::CreateFromVector({ -7.0, -4.0, 2.0 });
|
|
VectorVariable v3 = VectorVariable::CreateFromVector({ 3.0, 7.0, -5.0 });
|
|
|
|
EXPECT_NEAR(v1.Dot(v2), -6.0, 1e-3);
|
|
EXPECT_NEAR(v2.Dot(v1), -6.0, 1e-3);
|
|
EXPECT_NEAR(v1.Dot(v3), -57.0, 1e-3);
|
|
EXPECT_NEAR(v2.Dot(v3), -59.0, 1e-3);
|
|
}
|
|
|
|
TEST(LinearAlgebraTest, MatrixArithmetic_AddingMatrices_CorrectResults)
|
|
{
|
|
MatrixVariable m1(2, 3);
|
|
MatrixVariable m2(2, 3);
|
|
for (AZ::u32 row = 0; row < 2; row++)
|
|
{
|
|
for (AZ::u32 col = 0; col < 3; col++)
|
|
{
|
|
m1.Element(row, col) = row * row + col; // [[0, 1, 2], [1, 2, 3]]
|
|
m2.Element(row, col) = row + col * 2.0; // [[0, 2, 4], [1, 3, 5]]
|
|
}
|
|
}
|
|
|
|
MatrixVariable m3 = m1 + m2; // [[0, 3, 6], [2, 5, 8]]
|
|
EXPECT_EQ(m3.GetNumRows(), 2);
|
|
EXPECT_EQ(m3.GetNumColumns(), 3);
|
|
EXPECT_NEAR(m3.Element(0, 0), 0.0, 1e-3);
|
|
EXPECT_NEAR(m3.Element(1, 2), 8.0, 1e-3);
|
|
EXPECT_NEAR(m3.Element(0, 1), 3.0, 1e-3);
|
|
m3 += m1; // [[0, 4, 8], [3, 7, 11]]
|
|
EXPECT_NEAR(m3.Element(0, 2), 8.0, 1e-3);
|
|
EXPECT_NEAR(m3.Element(1, 1), 7.0, 1e-3);
|
|
}
|
|
|
|
TEST(LinearAlgebraTest, MatrixArithmetic_SubtractingMatrices_CorrectResults)
|
|
{
|
|
MatrixVariable m1(2, 3);
|
|
MatrixVariable m2(2, 3);
|
|
for (AZ::u32 row = 0; row < 2; row++)
|
|
{
|
|
for (AZ::u32 col = 0; col < 3; col++)
|
|
{
|
|
m1.Element(row, col) = row * row + col; // [[0, 1, 2], [1, 2, 3]]
|
|
m2.Element(row, col) = row + col * 2.0; // [[0, 2, 4], [1, 3, 5]]
|
|
}
|
|
}
|
|
|
|
MatrixVariable m3 = m2 - m1; // [[0, 1, 2], [0, 1, 2]]
|
|
EXPECT_EQ(m3.GetNumRows(), 2);
|
|
EXPECT_EQ(m3.GetNumColumns(), 3);
|
|
EXPECT_NEAR(m3.Element(0, 2), 2.0, 1e-3);
|
|
EXPECT_NEAR(m3.Element(1, 1), 1.0, 1e-3);
|
|
EXPECT_NEAR(m3.Element(0, 1), 1.0, 1e-3);
|
|
m3 = m1 - m3; // [[0, 0, 0], [1, 1, 1]]
|
|
EXPECT_NEAR(m3.Element(0, 1), 0.0, 1e-3);
|
|
EXPECT_NEAR(m3.Element(0, 0), 0.0, 1e-3);
|
|
EXPECT_NEAR(m3.Element(1, 2), 1.0, 1e-3);
|
|
}
|
|
|
|
TEST(LinearAlgebraTest, MatrixArithmetic_MatrixScalarDivision_CorrectResults)
|
|
{
|
|
MatrixVariable m1(2, 2);
|
|
m1.Element(0, 0) = 3.0;
|
|
m1.Element(0, 1) = 9.0;
|
|
m1.Element(1, 0) = -6.0;
|
|
m1.Element(1, 1) = 3.0;
|
|
MatrixVariable m2 = m1 / 3.0;
|
|
EXPECT_NEAR(m2.Element(0, 0), 1.0, 1e-3);
|
|
EXPECT_NEAR(m2.Element(1, 0), -2.0, 1e-3);
|
|
MatrixVariable m3 = m2 / 0.5;
|
|
EXPECT_NEAR(m3.Element(1, 1), 2.0, 1e-3);
|
|
EXPECT_NEAR(m3.Element(1, 0), -4.0, 1e-3);
|
|
}
|
|
|
|
TEST(LinearAlgebraTest, MatrixArithmetic_MatrixScalarMultiplication_CorrectResults)
|
|
{
|
|
MatrixVariable m1(3, 2);
|
|
m1.Element(0, 0) = 7.0;
|
|
m1.Element(0, 1) = 5.0;
|
|
m1.Element(1, 0) = -3.0;
|
|
m1.Element(1, 1) = 4.0;
|
|
m1.Element(2, 0) = 6.0;
|
|
m1.Element(2, 1) = -2.0;
|
|
MatrixVariable m2 = 4.0 * m1;
|
|
EXPECT_NEAR(m2.Element(2, 0), 24.0, 1e-3);
|
|
EXPECT_NEAR(m2.Element(1, 0), -12.0, 1e-3);
|
|
EXPECT_NEAR(m2.Element(0, 1), 20.0, 1e-3);
|
|
MatrixVariable m3 = 0.5 * m2;
|
|
EXPECT_NEAR(m3.Element(1, 1), 8.0, 1e-3);
|
|
EXPECT_NEAR(m3.Element(2, 1), -4.0, 1e-3);
|
|
EXPECT_NEAR(m3.Element(0, 0), 14.0, 1e-3);
|
|
}
|
|
|
|
TEST(LinearAlgebraTest, MatrixArithmetic_MatrixMatrixMultiplication_CorrectResults)
|
|
{
|
|
MatrixVariable m1(3, 2);
|
|
m1.Element(0, 0) = 1.0;
|
|
m1.Element(0, 1) = 7.0;
|
|
m1.Element(1, 0) = -2.0;
|
|
m1.Element(1, 1) = -4.0;
|
|
m1.Element(2, 0) = -3.0;
|
|
m1.Element(2, 1) = 5.0;
|
|
MatrixVariable m2(2, 2);
|
|
m2.Element(0, 0) = 4.0;
|
|
m2.Element(0, 1) = -3.0;
|
|
m2.Element(1, 0) = 5.0;
|
|
m2.Element(1, 1) = 2.0;
|
|
MatrixVariable m3 = m1 * m2;
|
|
|
|
EXPECT_EQ(m3.GetNumRows(), 3);
|
|
EXPECT_EQ(m3.GetNumColumns(), 2);
|
|
EXPECT_NEAR(m3.Element(0, 0), 39.0, 1e-3);
|
|
EXPECT_NEAR(m3.Element(0, 1), 11.0, 1e-3);
|
|
EXPECT_NEAR(m3.Element(1, 0), -28.0, 1e-3);
|
|
EXPECT_NEAR(m3.Element(1, 1), -2.0, 1e-3);
|
|
EXPECT_NEAR(m3.Element(2, 0), 13.0, 1e-3);
|
|
EXPECT_NEAR(m3.Element(2, 1), 19.0, 1e-3);
|
|
}
|
|
|
|
TEST(LinearAlgebraTest, MatrixArithmetic_MatrixVectorMultiplication_CorrectResults)
|
|
{
|
|
MatrixVariable m(3, 2);
|
|
m.Element(0, 0) = 1.0;
|
|
m.Element(0, 1) = 7.0;
|
|
m.Element(1, 0) = -2.0;
|
|
m.Element(1, 1) = -4.0;
|
|
m.Element(2, 0) = -3.0;
|
|
m.Element(2, 1) = 5.0;
|
|
VectorVariable v1 = VectorVariable::CreateFromVector({ 2.0, -3.0 });
|
|
VectorVariable v2 = m * v1;
|
|
|
|
EXPECT_EQ(v2.GetDimension(), 3);
|
|
ExpectClose(v2.GetValues(), { -19.0, 8.0, -21.0 }, 1e-3);
|
|
}
|
|
|
|
TEST(LinearAlgebraTest, MatrixArithmetic_OuterProduct_CorrectResults)
|
|
{
|
|
VectorVariable v1 = VectorVariable::CreateFromVector({ 1.0, -2.0, 2.0 });
|
|
VectorVariable v2 = VectorVariable::CreateFromVector({ -2.0, 3.0, 1.0 });
|
|
MatrixVariable m = OuterProduct(v1, v2);
|
|
|
|
EXPECT_NEAR(m.Element(0, 1), 3.0, 1e-3);
|
|
EXPECT_NEAR(m.Element(1, 2), -2.0, 1e-3);
|
|
EXPECT_NEAR(m.Element(1, 1), -6.0, 1e-3);
|
|
EXPECT_NEAR(m.Element(0, 2), 1.0, 1e-3);
|
|
EXPECT_NEAR(m.Element(2, 1), 6.0, 1e-3);
|
|
}
|
|
} // namespace NumericalMethods::Optimization
|