From 5c90ffeba94f4a73d1a09a64fefb3780f90a2d9f Mon Sep 17 00:00:00 2001 From: mayge Date: Tue, 7 Apr 2026 13:50:56 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=88=86=E7=A6=BB=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 3 +- tests/basic.cpp | 75 ----------------------------------------- tests/test_backward.cpp | 41 ++++++++++++++++++++++ tests/test_forward.cpp | 41 ++++++++++++++++++++++ 4 files changed, 84 insertions(+), 76 deletions(-) delete mode 100644 tests/basic.cpp create mode 100644 tests/test_backward.cpp create mode 100644 tests/test_forward.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index eff1055..6db3e35 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,4 +9,5 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON) include_directories(include) # 测试可执行文件 -add_executable(test_basic tests/basic.cpp) \ No newline at end of file +add_executable(test_forward tests/test_forward.cpp) +add_executable(test_backward tests/test_backward.cpp) \ No newline at end of file diff --git a/tests/basic.cpp b/tests/basic.cpp deleted file mode 100644 index f669492..0000000 --- a/tests/basic.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#include -#include "forwardad.hpp" -#include "backwardad.hpp" -#include "types/dual.hpp" - -// 一阶测试函数 -forwardad::Dual f1(forwardad::Dual x) { - return x + x*x + pow(x,3); -} - -// 二阶测试函数 -forwardad::Dual g1(forwardad::Dual x, forwardad::Dual y) { - return exp(x) * log(y); -} - -// 高阶测试函数 -forwardad::Dual h1(forwardad::Dual x, forwardad::Dual y, forwardad::Dual z) { - return pow(x, 3) + pow(y, 2) + z + cos(x * y * z); -} - -backwardad::Node f2(backwardad::Node x) { - return x + x*x + pow(x,3); -} - -backwardad::Node g2(backwardad::Node x, backwardad::Node y) { - return exp(x) * log(y); -} - -backwardad::Node h2(backwardad::Node x, backwardad::Node y, backwardad::Node z) { - return pow(x, 3) + pow(y, 2) + z + cos(x * y * z); -} - -int test_forward_ad() { - std::cout << "Testing f(x) = x^2 + sin(x) at x=2.0\n"; - auto r = forwardad::diff(f1, 2.0); - std::cout << "value = " << r.value << "\n"; - std::cout << "grad = " << r.gradient[0] << "\n"; - - std::cout << "\nTesting g(x,y) = exp(x)*log(y) at (x,y)=(1.0, 2.0)\n"; - auto r2 = forwardad::diff(g1, 1.0, 2.0); - std::cout << "value = " << r2.value << "\n"; - std::cout << "grad = (" << r2.gradient[0] << ", " << r2.gradient[1] << ")\n"; - - std::cout << "\nTesting h(x,y,z) = x^3 + y^2 + z + cos(x*y*z) at (x,y,z)=(1.0, 2.0, 3.0)\n"; - auto r3 = forwardad::diff(h1, 1.0, 2.0, 3.0); - std::cout << "value = " << r3.value << "\n"; - std::cout << "grad = (" << r3.gradient[0] << ", " << r3.gradient[1] << ", " << r3.gradient[2] << ")\n"; - return 0; -} - -int test_backward_ad() { - std::cout << "Testing f(x) = x^2 + sin(x) at x=2.0\n"; - auto r = backwardad::diff(f2, 2.0); - std::cout << "value = " << r.value << "\n"; - std::cout << "grad = " << r.gradient[0] << "\n"; - - std::cout << "\nTesting g(x,y) = exp(x)*log(y) at (x,y)=(1.0, 2.0)\n"; - auto r2 = backwardad::diff(g2, 1.0, 2.0); - std::cout << "value = " << r2.value << "\n"; - std::cout << "grad = (" << r2.gradient[0] << ", " << r2.gradient[1] << ")\n"; - - std::cout << "\nTesting h(x,y,z) = x^3 + y^2 + z + cos(x*y*z) at (x,y,z)=(1.0, 2.0, 3.0)\n"; - auto r3 = backwardad::diff(h2, 1.0, 2.0, 3.0); - std::cout << "value = " << r3.value << "\n"; - std::cout << "grad = (" << r3.gradient[0] << ", " << r3.gradient[1] << ", " << r3.gradient[2] << ")\n"; - return 0; -} - -int main() { - std::cout << "=== Forward AD Tests ===\n"; - test_forward_ad(); - std::cout << "\n=== Backward AD Tests ===\n"; - test_backward_ad(); - return 0; -} \ No newline at end of file diff --git a/tests/test_backward.cpp b/tests/test_backward.cpp new file mode 100644 index 0000000..1172b6c --- /dev/null +++ b/tests/test_backward.cpp @@ -0,0 +1,41 @@ +#include +#include "backwardad.hpp" + +// 一阶反向自动微分测试函数 +backwardad::Node f2(backwardad::Node x) { + return x + x*x + pow(x,3); +} + +// 二阶反向自动微分测试函数 +backwardad::Node g2(backwardad::Node x, backwardad::Node y) { + return exp(x) * log(y); +} + +// 高阶反向自动微分测试函数 +backwardad::Node h2(backwardad::Node x, backwardad::Node y, backwardad::Node z) { + return pow(x, 3) + pow(y, 2) + z + cos(x * y * z); +} + +int test_backward_ad() { + std::cout << "Testing f(x) = x^2 + sin(x) at x=2.0\n"; + auto r = backwardad::diff(f2, 2.0); + std::cout << "value = " << r.value << "\n"; + std::cout << "grad = " << r.gradient[0] << "\n"; + + std::cout << "\nTesting g(x,y) = exp(x)*log(y) at (x,y)=(1.0, 2.0)\n"; + auto r2 = backwardad::diff(g2, 1.0, 2.0); + std::cout << "value = " << r2.value << "\n"; + std::cout << "grad = (" << r2.gradient[0] << ", " << r2.gradient[1] << ")\n"; + + std::cout << "\nTesting h(x,y,z) = x^3 + y^2 + z + cos(x*y*z) at (x,y,z)=(1.0, 2.0, 3.0)\n"; + auto r3 = backwardad::diff(h2, 1.0, 2.0, 3.0); + std::cout << "value = " << r3.value << "\n"; + std::cout << "grad = (" << r3.gradient[0] << ", " << r3.gradient[1] << ", " << r3.gradient[2] << ")\n"; + return 0; +} + +int main() { + std::cout << "\n=== Backward AD Tests ===\n"; + test_backward_ad(); + return 0; +} \ No newline at end of file diff --git a/tests/test_forward.cpp b/tests/test_forward.cpp new file mode 100644 index 0000000..3c14b3b --- /dev/null +++ b/tests/test_forward.cpp @@ -0,0 +1,41 @@ +#include +#include "forwardad.hpp" + +// 一阶前向自动微分测试函数 +forwardad::Dual f1(forwardad::Dual x) { + return x + x*x + pow(x,3); +} + +// 二阶前向自动微分测试函数 +forwardad::Dual g1(forwardad::Dual x, forwardad::Dual y) { + return exp(x) * log(y); +} + +// 高阶前向自动微分测试函数 +forwardad::Dual h1(forwardad::Dual x, forwardad::Dual y, forwardad::Dual z) { + return pow(x, 3) + pow(y, 2) + z + cos(x * y * z); +} + +int test_forward_ad() { + std::cout << "Testing f(x) = x^2 + sin(x) at x=2.0\n"; + auto r = forwardad::diff(f1, 2.0); + std::cout << "value = " << r.value << "\n"; + std::cout << "grad = " << r.gradient[0] << "\n"; + + std::cout << "\nTesting g(x,y) = exp(x)*log(y) at (x,y)=(1.0, 2.0)\n"; + auto r2 = forwardad::diff(g1, 1.0, 2.0); + std::cout << "value = " << r2.value << "\n"; + std::cout << "grad = (" << r2.gradient[0] << ", " << r2.gradient[1] << ")\n"; + + std::cout << "\nTesting h(x,y,z) = x^3 + y^2 + z + cos(x*y*z) at (x,y,z)=(1.0, 2.0, 3.0)\n"; + auto r3 = forwardad::diff(h1, 1.0, 2.0, 3.0); + std::cout << "value = " << r3.value << "\n"; + std::cout << "grad = (" << r3.gradient[0] << ", " << r3.gradient[1] << ", " << r3.gradient[2] << ")\n"; + return 0; +} + +int main() { + std::cout << "=== Forward AD Tests ===\n"; + test_forward_ad(); + return 0; +} \ No newline at end of file