From 4866764679baa54be8700ac1096f3f51baf56889 Mon Sep 17 00:00:00 2001 From: Christoph Hansknecht Date: Mon, 13 Oct 2025 17:03:13 +0200 Subject: [PATCH 1/4] Enable more unit tests --- ADOL-C/test/CMakeLists.txt | 14 ++++++++++++++ CMakeLists.txt | 9 +++++++++ 2 files changed, 23 insertions(+) create mode 100644 ADOL-C/test/CMakeLists.txt diff --git a/ADOL-C/test/CMakeLists.txt b/ADOL-C/test/CMakeLists.txt new file mode 100644 index 00000000..0f568552 --- /dev/null +++ b/ADOL-C/test/CMakeLists.txt @@ -0,0 +1,14 @@ +add_executable(fminmax_test fminmax.cpp) +target_include_directories(fminmax_test PRIVATE "${ADOLC_INCLUDE_DIR}") +target_link_libraries(fminmax_test PRIVATE adolc) +add_test(NAME fminmax COMMAND fminmax_test) + +add_executable(powexam_test powexam.cpp) +target_include_directories(powexam_test PRIVATE "${ADOLC_INCLUDE_DIR}") +target_link_libraries(powexam_test PRIVATE adolc) +add_test(NAME powexam COMMAND powexam_test) + +# add_executable(speelpenning_test speelpenning.cpp) +# target_include_directories(speelpenning_test PRIVATE "${ADOLC_INCLUDE_DIR}") +# target_link_libraries(speelpenning_test PRIVATE adolc) +# add_test(NAME speelpenning COMMAND speelpenning_test) diff --git a/CMakeLists.txt b/CMakeLists.txt index fa023696..fb3c7344 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -215,12 +215,21 @@ endif() if(BUILD_TESTS) set(ADOLC_INCLUDE_DIR "${CMAKE_BINARY_DIR}/ADOL-C/include") add_subdirectory(ADOL-C/boost-test) + add_subdirectory(ADOL-C/test) enable_testing() add_test(NAME boost-test-adolc COMMAND boost-test-adolc) add_test(NAME boost-test-adolc-omp COMMAND boost-test-adolc-omp) + + add_test(NAME powexam_test + COMMAND powexam_test) + add_test(NAME fminmax_test + COMMAND fminmax_test) + # add_test(NAME speelpenning_test + # COMMAND speelpenning_test) + endif() # build the adolc and tests with coverage From ae2c74285c95f1964884d20a74455944606e5ecf Mon Sep 17 00:00:00 2001 From: Christoph Hansknecht Date: Mon, 13 Oct 2025 17:10:12 +0200 Subject: [PATCH 2/4] Enable speelpenning test example --- ADOL-C/test/CMakeLists.txt | 8 ++++---- ADOL-C/test/speelpenning.cpp | 4 ++-- CMakeLists.txt | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ADOL-C/test/CMakeLists.txt b/ADOL-C/test/CMakeLists.txt index 0f568552..76bfd771 100644 --- a/ADOL-C/test/CMakeLists.txt +++ b/ADOL-C/test/CMakeLists.txt @@ -8,7 +8,7 @@ target_include_directories(powexam_test PRIVATE "${ADOLC_INCLUDE_DIR}") target_link_libraries(powexam_test PRIVATE adolc) add_test(NAME powexam COMMAND powexam_test) -# add_executable(speelpenning_test speelpenning.cpp) -# target_include_directories(speelpenning_test PRIVATE "${ADOLC_INCLUDE_DIR}") -# target_link_libraries(speelpenning_test PRIVATE adolc) -# add_test(NAME speelpenning COMMAND speelpenning_test) +add_executable(speelpenning_test speelpenning.cpp) +target_include_directories(speelpenning_test PRIVATE "${ADOLC_INCLUDE_DIR}") +target_link_libraries(speelpenning_test PRIVATE adolc) +add_test(NAME speelpenning COMMAND speelpenning_test) diff --git a/ADOL-C/test/speelpenning.cpp b/ADOL-C/test/speelpenning.cpp index 945030b8..dbe12a2c 100644 --- a/ADOL-C/test/speelpenning.cpp +++ b/ADOL-C/test/speelpenning.cpp @@ -30,7 +30,6 @@ using namespace std; /* MAIN PROGRAM */ int main() { int n, i, j; - size_t tape_stats[STAT_SIZE]; cout << "SPEELPENNINGS PRODUCT (ADOL-C Documented Example)\n\n"; cout << "number of independent variables = 100 \n"; @@ -53,7 +52,8 @@ int main() { delete[] x; trace_off(); - tapestats(1, tape_stats); // reading of tape statistics + std::array tape_stats = + tapestats(1); // reading of tape statistics cout << "maxlive " << tape_stats[NUM_MAX_LIVES] << "\n"; // ..... print other tape stats diff --git a/CMakeLists.txt b/CMakeLists.txt index fb3c7344..1472a4ea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -227,8 +227,8 @@ if(BUILD_TESTS) COMMAND powexam_test) add_test(NAME fminmax_test COMMAND fminmax_test) - # add_test(NAME speelpenning_test - # COMMAND speelpenning_test) + add_test(NAME speelpenning_test + COMMAND speelpenning_test) endif() From 3cad81bbd95e2104c101928fbff95c63896ebbbc Mon Sep 17 00:00:00 2001 From: Christoph Hansknecht Date: Mon, 13 Oct 2025 17:31:43 +0200 Subject: [PATCH 3/4] Add callback example using linear interpolator --- ADOL-C/test/CMakeLists.txt | 5 ++ ADOL-C/test/callback.cpp | 147 +++++++++++++++++++++++++++++++++++++ CMakeLists.txt | 2 + 3 files changed, 154 insertions(+) create mode 100644 ADOL-C/test/callback.cpp diff --git a/ADOL-C/test/CMakeLists.txt b/ADOL-C/test/CMakeLists.txt index 76bfd771..4a93fea0 100644 --- a/ADOL-C/test/CMakeLists.txt +++ b/ADOL-C/test/CMakeLists.txt @@ -12,3 +12,8 @@ add_executable(speelpenning_test speelpenning.cpp) target_include_directories(speelpenning_test PRIVATE "${ADOLC_INCLUDE_DIR}") target_link_libraries(speelpenning_test PRIVATE adolc) add_test(NAME speelpenning COMMAND speelpenning_test) + +add_executable(callback_test callback.cpp) +target_include_directories(callback_test PRIVATE "${ADOLC_INCLUDE_DIR}") +target_link_libraries(callback_test PRIVATE adolc) +add_test(NAME callback COMMAND callback_test) diff --git a/ADOL-C/test/callback.cpp b/ADOL-C/test/callback.cpp new file mode 100644 index 00000000..6355037b --- /dev/null +++ b/ADOL-C/test/callback.cpp @@ -0,0 +1,147 @@ +#include +#include +#include +#include + +#include +#include + +const int m = 1; +const int n = 1; +const int num_points = 3; + +std::array xvals = {0., 1., 2.}; +std::array yvals = {3., 2., 4.}; + +int find_index(double xval) { + if (xval < xvals[0]) { + return -1; + } + + if (xval >= xvals[num_points - 1]) { + return -1; + } + + for (int i = 0; i < num_points - 1; ++i) { + if (xval >= xvals[i] && xval <= xvals[i + 1]) { + return i; + } + } + + return -1; +} + +int interpolator(short tapeId, size_t n, double *x, size_t m, double *y) { + std::cout << "Calling interpolator()" << std::endl; + assert(n == 1); + assert(m == 1); + + double xval = x[0]; + + const int i = find_index(xval); + + double dydx = (yvals[i + 1] - yvals[i]) / (xvals[i + 1] - xvals[i]); + + *y = (yvals[i] + dydx * (xval - xvals[i])); + return 0; +} + +int interpolator_fos_forward(short tapeId, size_t n, double *x, double *X, + size_t m, double *y, double *Y) { + std::cout << "Calling interpolator_fos_forward()" << std::endl; + + assert(n == 1); + assert(m == 1); + + double xval = x[0]; + + const int i = find_index(xval); + + double dydx = (yvals[i + 1] - yvals[i]) / (xvals[i + 1] - xvals[i]); + + *y = (xvals[i] + dydx * (xval - xvals[i])); + + Y[0] = dydx * X[0]; + + return 0; +} + +int interpolator_fov_forward(short tapeId, size_t n, double *x, size_t p, + double **X, size_t m, double *y, double **Y) { + std::cout << "Calling interpolator_fov_forward()" << std::endl; + assert(n == 1); + assert(m == 1); + + double xval = x[0]; + + const int i = find_index(xval); + + double dydx = (yvals[i + 1] - yvals[i]) / (xvals[i + 1] - xvals[i]); + + *y = (xvals[i] + dydx * (xval - xvals[i])); + + for (int l = 0; l < p; ++l) { + Y[0][l] = dydx * X[0][l]; + } + + return 0; +} + +int main() { + const int num_points = 2; + short default_tag = 0; + + createNewTape(default_tag); + setCurrentTape(default_tag); + + adouble x[m]; + adouble f[n]; + // double gradval[1]; + + double xval[num_points] = {0.5, 1.25}; + + double exp_fval[num_points] = {}; + double exp_jacs[num_points] = {-1., 2.}; + + double fval[n]; + + double jacvals[m * n] = {}; + double *jac[] = {jacvals}; + + // Interpolator interpolator(default_tag, num_points, xvals, yvals); + + // Initial taping + + ext_diff_fct *edf = reg_ext_fct(0, 0, interpolator); + edf->fos_forward = interpolator_fos_forward; + edf->fov_forward = interpolator_fov_forward; + trace_on(default_tag); + + x[0] <<= xval[0]; + + call_ext_fct(edf, n, x, m, f); + + f[0] >>= fval[0]; + + std::cout << "Interpolator(" << xval[0] << ") = " << fval[0] << std::endl; + + trace_off(default_tag); + + for (int k = 0; k < num_points; ++k) { + std::cout << "Evaluating derivative at " << xval[k] << ": " << std::endl; + + jacobian(default_tag, m, n, xval + k, jac); + + double act_jacval = jac[0][0]; + double exp_jacval = exp_jacs[k]; + double jac_error = abs(act_jacval - exp_jacval); + + std::cout << "Expected = " << exp_jacval << ", actual = " << act_jacval + << ", error = " << jac_error << std::endl; + + if (jac_error >= 1e-10) { + return 1; + } + } + return 0; +} diff --git a/CMakeLists.txt b/CMakeLists.txt index 1472a4ea..6a989131 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -229,6 +229,8 @@ if(BUILD_TESTS) COMMAND fminmax_test) add_test(NAME speelpenning_test COMMAND speelpenning_test) + add_test(NAME callback_test + COMMAND callback_test) endif() From bba4047a5c9578dc1c6c3fa44ef2e6de63d17ec0 Mon Sep 17 00:00:00 2001 From: Christoph Hansknecht Date: Tue, 14 Oct 2025 09:27:07 +0200 Subject: [PATCH 4/4] Remove redundant headers --- ADOL-C/test/callback.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/ADOL-C/test/callback.cpp b/ADOL-C/test/callback.cpp index 6355037b..65e53797 100644 --- a/ADOL-C/test/callback.cpp +++ b/ADOL-C/test/callback.cpp @@ -1,10 +1,7 @@ -#include -#include #include #include #include -#include const int m = 1; const int n = 1;