diff --git a/test/abs_normal/test_derivative!.jl b/test/abs_normal/test_derivative!.jl index f5fe83b..203e960 100644 --- a/test/abs_normal/test_derivative!.jl +++ b/test/abs_normal/test_derivative!.jl @@ -16,9 +16,7 @@ 1, 3, x, - :abs_normal; - tape_id=abs_normal_form.tape_id, - reuse_tape=true, + :abs_normal ) @test abs_normal_form.Y[1, 1] == -1.5 diff --git a/test/first_order/test_derivative!.jl b/test/first_order/test_derivative!.jl index 027d49f..1733d15 100644 --- a/test/first_order/test_derivative!.jl +++ b/test/first_order/test_derivative!.jl @@ -351,3 +351,11 @@ end @test res[3, 2] == 0.0 @test res[3, 3] == 0.0 end + +@testset "tape_less_forward!" begin() + f(x) = x[1]^2 + x = 2.0 + res = allocator(1, 1, :jac, 0, 0) + ADOLC.tape_less_forward!(res, f, 1, x) + @test res[1] == 4.0 +end \ No newline at end of file diff --git a/test/first_order/test_derivative.jl b/test/first_order/test_derivative.jl index 1be78e5..47d87d8 100644 --- a/test/first_order/test_derivative.jl +++ b/test/first_order/test_derivative.jl @@ -131,6 +131,7 @@ end @test res[1] == -1.0 @test res[2] == 0.0 + end @testset "reuse_jac_vec" begin @@ -151,6 +152,11 @@ end @test res[1] == 1.0 @test res[2] == 0.0 + + res = derivative(f, [2.0, 1.0, 2.0], :jac_vec; dir=CxxVector([0.0, 1.0, 0.0]), reuse_tape=true) + + @test res[1] == 1.0 + @test res[2] == 0.0 end @testset "jac_mat" begin @@ -206,6 +212,17 @@ end @test res[2, 1] == 0.0 @test res[2, 2] == 0.0 @test res[2, 3] == 12.0 + + + res = derivative(f, [2.0, 1.0, 2.0], :jac_mat; dir=CxxMatrix(dir), reuse_tape=true) + + @test res[1, 1] == 0.0 + @test res[1, 2] == -3.0 + @test res[1, 3] == 0.0 + + @test res[2, 1] == 0.0 + @test res[2, 2] == 0.0 + @test res[2, 3] == 12.0 end @testset "vec_jac" begin @@ -240,6 +257,12 @@ end @test res[1] == 0.0 @test res[2] == 0.0 @test res[3] == 12 + + res = derivative(f, [2.0, 1.0, 2.0], :vec_jac; weights=CxxVector([0.0, 1.0]), reuse_tape=true) + + @test res[1] == 0.0 + @test res[2] == 0.0 + @test res[3] == 12 end @testset "mat_jac" begin @@ -330,4 +353,18 @@ end @test res[3, 1] == 0.0 @test res[3, 2] == 0.0 @test res[3, 3] == 0.0 + + + res = derivative(f, [2.0, 1.0, 2.0], :mat_jac; weights=CxxMatrix(weights), reuse_tape=true) + @test res[1, 1] == 0.0 + @test res[1, 2] == 0.0 + @test res[1, 3] == -12.0 + + @test res[2, 1] == 0.0 + @test res[2, 2] == 0.0 + @test res[2, 3] == 12.0 + + @test res[3, 1] == 0.0 + @test res[3, 2] == 0.0 + @test res[3, 3] == 0.0 end diff --git a/test/higher_order/test_derivative!.jl b/test/higher_order/test_derivative!.jl index 8e808d8..a8568b7 100644 --- a/test/higher_order/test_derivative!.jl +++ b/test/higher_order/test_derivative!.jl @@ -179,3 +179,104 @@ end @test res[8] ≈ 0.0 @test res[9] ≈ 24.0 end + + +@testset "higher_order_full_tensor" begin() + + function f(x) + return [x[1]^2 * x[2]^2, x[3]^2 * x[4]^2] + end + + + x = [1.0, 2.0, 3.0, 4.0] + m = 2 + n = 4 + num_seeds = n + degree = 2 + res = CxxMatrix(m, binomial(num_seeds + degree, degree)) + derivative!( + res, + f, + m, + n, + x, + degree, + CxxMatrix(create_cxx_identity(n, n), n, n) + ) + + @test res[1, ADOLC.tensor_address(degree, [1, 0])] == 8.0 + @test res[1, ADOLC.tensor_address(degree, [2, 0])] == 4.0 + @test res[1, ADOLC.tensor_address(degree, [3, 0])] == 0.0 + @test res[1, ADOLC.tensor_address(degree, [4, 0])] == 0.0 + + @test res[2, ADOLC.tensor_address(degree, [1, 0])] == 0.0 + @test res[2, ADOLC.tensor_address(degree, [2, 0])] == 0.0 + @test res[2, ADOLC.tensor_address(degree, [3, 0])] == 96.0 + @test res[2, ADOLC.tensor_address(degree, [4, 0])] == 72.0 + + @test res[1, ADOLC.tensor_address(degree, [1, 1])] == 8.0 + @test res[1, ADOLC.tensor_address(degree, [2, 1])] == 8.0 + @test res[1, ADOLC.tensor_address(degree, [3, 1])] == 0.0 + @test res[1, ADOLC.tensor_address(degree, [4, 1])] == 0.0 + @test res[1, ADOLC.tensor_address(degree, [2, 2])] == 2.0 + @test res[1, ADOLC.tensor_address(degree, [3, 2])] == 0.0 + @test res[1, ADOLC.tensor_address(degree, [4, 3])] == 0.0 + @test res[1, ADOLC.tensor_address(degree, [3, 3])] == 0.0 + @test res[1, ADOLC.tensor_address(degree, [4, 3])] == 0.0 + @test res[1, ADOLC.tensor_address(degree, [4, 4])] == 0.0 + @test res[1, ADOLC.tensor_address(degree, [4, 2])] == 0.0 + + @test res[2, ADOLC.tensor_address(degree, [1, 1])] == 0.0 + @test res[2, ADOLC.tensor_address(degree, [2, 1])] == 0.0 + @test res[2, ADOLC.tensor_address(degree, [3, 1])] == 0.0 + @test res[2, ADOLC.tensor_address(degree, [4, 1])] == 0.0 + @test res[2, ADOLC.tensor_address(degree, [2, 2])] == 0.0 + @test res[2, ADOLC.tensor_address(degree, [3, 2])] == 0.0 + @test res[2, ADOLC.tensor_address(degree, [4, 2])] == 0.0 + @test res[2, ADOLC.tensor_address(degree, [4, 3])] == 48.0 + @test res[2, ADOLC.tensor_address(degree, [3, 3])] == 32.0 + @test res[2, ADOLC.tensor_address(degree, [4, 4])] == 18.0 + + derivative!( + res, + f, + m, + n, + x, + degree + ) + + @test res[1, ADOLC.tensor_address(degree, [1, 0])] == 8.0 + @test res[1, ADOLC.tensor_address(degree, [2, 0])] == 4.0 + @test res[1, ADOLC.tensor_address(degree, [3, 0])] == 0.0 + @test res[1, ADOLC.tensor_address(degree, [4, 0])] == 0.0 + + @test res[2, ADOLC.tensor_address(degree, [1, 0])] == 0.0 + @test res[2, ADOLC.tensor_address(degree, [2, 0])] == 0.0 + @test res[2, ADOLC.tensor_address(degree, [3, 0])] == 96.0 + @test res[2, ADOLC.tensor_address(degree, [4, 0])] == 72.0 + + @test res[1, ADOLC.tensor_address(degree, [1, 1])] == 8.0 + @test res[1, ADOLC.tensor_address(degree, [2, 1])] == 8.0 + @test res[1, ADOLC.tensor_address(degree, [3, 1])] == 0.0 + @test res[1, ADOLC.tensor_address(degree, [4, 1])] == 0.0 + @test res[1, ADOLC.tensor_address(degree, [2, 2])] == 2.0 + @test res[1, ADOLC.tensor_address(degree, [3, 2])] == 0.0 + @test res[1, ADOLC.tensor_address(degree, [4, 3])] == 0.0 + @test res[1, ADOLC.tensor_address(degree, [3, 3])] == 0.0 + @test res[1, ADOLC.tensor_address(degree, [4, 3])] == 0.0 + @test res[1, ADOLC.tensor_address(degree, [4, 4])] == 0.0 + @test res[1, ADOLC.tensor_address(degree, [4, 2])] == 0.0 + + @test res[2, ADOLC.tensor_address(degree, [1, 1])] == 0.0 + @test res[2, ADOLC.tensor_address(degree, [2, 1])] == 0.0 + @test res[2, ADOLC.tensor_address(degree, [3, 1])] == 0.0 + @test res[2, ADOLC.tensor_address(degree, [4, 1])] == 0.0 + @test res[2, ADOLC.tensor_address(degree, [2, 2])] == 0.0 + @test res[2, ADOLC.tensor_address(degree, [3, 2])] == 0.0 + @test res[2, ADOLC.tensor_address(degree, [4, 2])] == 0.0 + @test res[2, ADOLC.tensor_address(degree, [4, 3])] == 48.0 + @test res[2, ADOLC.tensor_address(degree, [3, 3])] == 32.0 + @test res[2, ADOLC.tensor_address(degree, [4, 4])] == 18.0 + +end \ No newline at end of file diff --git a/test/second_order/test_derivative.jl b/test/second_order/test_derivative.jl index 73aca27..cb04a7b 100644 --- a/test/second_order/test_derivative.jl +++ b/test/second_order/test_derivative.jl @@ -12,6 +12,12 @@ @test res[1] == 32.0 @test res[2] == -4.0 @test res[3] == 24.0 + + res = derivative(f, x, :vec_hess_vec; dir=CxxVector(dir), weights=CxxVector(weights)) + + @test res[1] == 32.0 + @test res[2] == -4.0 + @test res[3] == 24.0 end @testset "vec_hess_mat" begin @@ -32,6 +38,17 @@ end @test res[3, 1] == 48.0 @test res[3, 2] == -48.0 + + res = derivative(f, x, :vec_hess_mat; dir=CxxMatrix(dir), weights=CxxVector(weights)) + + @test res[1, 1] == 52.0 + @test res[1, 2] == -52.0 + + @test res[2, 1] == 4.0 + @test res[2, 2] == -4.0 + + @test res[3, 1] == 48.0 + @test res[3, 2] == -48.0 end @testset "1D_vec_hess" begin @@ -79,6 +96,20 @@ end @test res[3, 1] == 12.0 @test res[3, 2] == 0.0 @test res[3, 3] == 12.0 + + res = derivative(f, x, :vec_hess; weights=CxxVector(weights)) + + @test res[1, 1] == -4.0 + @test res[1, 2] == -2.0 + @test res[1, 3] == 12.0 + + @test res[2, 1] == -2.0 + @test res[2, 2] == 0.0 + @test res[2, 3] == 0.0 + + @test res[3, 1] == 12.0 + @test res[3, 2] == 0.0 + @test res[3, 3] == 12.0 end @testset "mat_hess_vec" begin @@ -102,6 +133,20 @@ end @test res[3, 1] == -36.0 @test res[3, 2] == 0.0 @test res[3, 3] == -24.0 + + res = derivative(f, x, :mat_hess_vec; dir=CxxVector(dir), weights=CxxMatrix(weights)) + + @test res[1, 1] == -2.0 + @test res[1, 2] == -2.0 + @test res[1, 3] == 0.0 + + @test res[2, 1] == 36.0 + @test res[2, 2] == 0.0 + @test res[2, 3] == 24.0 + + @test res[3, 1] == -36.0 + @test res[3, 2] == 0.0 + @test res[3, 3] == -24.0 end @testset "hess_1D" begin @@ -195,6 +240,35 @@ end @test res[3, 3, 1] == -48.0 @test res[3, 3, 2] == 48.0 + + res = derivative(f, x, :mat_hess_mat; dir=CxxMatrix(dir), weights=CxxMatrix(weights)) + + @test res[1, 1, 1] == 8.0 + @test res[1, 1, 2] == -8.0 + + @test res[1, 2, 1] == 2.0 + @test res[1, 2, 2] == -2.0 + + @test res[1, 3, 1] == 0.0 + @test res[1, 3, 2] == 0.0 + + @test res[2, 1, 1] == 36.0 + @test res[2, 1, 2] == -36.0 + + @test res[2, 2, 1] == 0.0 + @test res[2, 2, 2] == 0.0 + + @test res[2, 3, 1] == 48.0 + @test res[2, 3, 2] == -48.0 + + @test res[3, 1, 1] == -36.0 + @test res[3, 1, 2] == 36.0 + + @test res[3, 2, 1] == 0.0 + @test res[3, 2, 2] == 0.0 + + @test res[3, 3, 1] == -48.0 + @test res[3, 3, 2] == 48.0 end @testset "hess_vec" begin @@ -214,6 +288,16 @@ end @test res[2, 1] == 36.0 @test res[2, 2] == 0.0 @test res[2, 3] == 24.0 + + res = derivative(f, x, :hess_vec; dir=CxxVector(dir)) + + @test res[1, 1] == -2.0 + @test res[1, 2] == -2.0 + @test res[1, 3] == 0.0 + + @test res[2, 1] == 36.0 + @test res[2, 2] == 0.0 + @test res[2, 3] == 24.0 end @testset "mat_hess" begin @@ -262,6 +346,45 @@ end @test res[3, 3, 1] == -12.0 @test res[3, 3, 2] == 0.0 @test res[3, 3, 3] == -12.0 + + + res = derivative(f, x, :mat_hess; weights=CxxMatrix(weights)) + + @test res[1, 1, 1] == 4.0 + @test res[1, 1, 2] == 2.0 + @test res[1, 1, 3] == 0.0 + + @test res[1, 2, 1] == 2.0 + @test res[1, 2, 2] == 0.0 + @test res[1, 2, 3] == 0.0 + + @test res[1, 3, 1] == 0.0 + @test res[1, 3, 2] == 0.0 + @test res[1, 3, 3] == 0.0 + + @test res[2, 1, 1] == 0.0 + @test res[2, 1, 2] == 0.0 + @test res[2, 1, 3] == 12.0 + + @test res[2, 2, 1] == 0.0 + @test res[2, 2, 2] == 0.0 + @test res[2, 2, 3] == 0.0 + + @test res[2, 3, 1] == 12.0 + @test res[2, 3, 2] == 0.0 + @test res[2, 3, 3] == 12.0 + + @test res[3, 1, 1] == 0.0 + @test res[3, 1, 2] == 0.0 + @test res[3, 1, 3] == -12.0 + + @test res[3, 2, 1] == 0.0 + @test res[3, 2, 2] == 0.0 + @test res[3, 2, 3] == 0.0 + + @test res[3, 3, 1] == -12.0 + @test res[3, 3, 2] == 0.0 + @test res[3, 3, 3] == -12.0 end @testset "1D_hess_mat" begin @@ -283,6 +406,17 @@ end @test res[1, 3, 1] == 12.0 @test res[1, 3, 2] == -12.0 + + res = derivative(f, x, :hess_mat; dir=CxxMatrix(dir)) + + @test res[1, 1, 1] == 0.0 + @test res[1, 1, 2] == -12.0 + + @test res[1, 2, 1] == 0.0 + @test res[1, 2, 2] == 0.0 + + @test res[1, 3, 1] == 12.0 + @test res[1, 3, 2] == -12.0 end @testset "mat_hess_vec" begin @@ -308,4 +442,20 @@ end @test res[3, 1] == -36.0 @test res[3, 2] == 0.0 @test res[3, 3] == -24.0 + + res = derivative(f, x, :mat_hess_vec; dir=CxxVector(dir), weights=CxxMatrix(weights)) + + @test res[1, 1] == -2.0 + @test res[1, 2] == -2.0 + @test res[1, 3] == 0.0 + + @test res[2, 1] == 36.0 + @test res[2, 2] == 0.0 + @test res[2, 3] == 24.0 + + @test res[3, 1] == -36.0 + @test res[3, 2] == 0.0 + @test res[3, 3] == -24.0 end + +