Skip to content
This repository was archived by the owner on May 15, 2025. It is now read-only.

Commit b359a9d

Browse files
committed
modified allocations
1 parent 2233c47 commit b359a9d

File tree

1 file changed

+13
-37
lines changed

1 file changed

+13
-37
lines changed

src/halley.jl

Lines changed: 13 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -42,28 +42,8 @@ function SciMLBase.__solve(prob::NonlinearProblem,
4242
maxiters = 1000, kwargs...)
4343
f = Base.Fix2(prob.f, prob.p)
4444
x = float(prob.u0)
45-
# Defining all derivative expressions in one place before the iterations
4645
if isa(x, AbstractArray)
47-
if alg_autodiff(alg)
48-
n = length(x)
49-
a_dfdx(x) = ForwardDiff.jacobian(f, x)
50-
a_d2fdx(x) = ForwardDiff.jacobian(a_dfdx, x)
51-
A = Array{Union{Nothing, Number}}(nothing, n, n)
52-
#fx = f(x)
53-
else
54-
n = length(x)
55-
f_dfdx(x) = FiniteDiff.finite_difference_jacobian(f, x, diff_type(alg), eltype(x))
56-
f_d2fdx(x) = FiniteDiff.finite_difference_jacobian(f_dfdx, x, diff_type(alg), eltype(x))
57-
A = Array{Union{Nothing, Number}}(nothing, n, n)
58-
end
59-
elseif isa(x, Number)
60-
if alg_autodiff(alg)
61-
sa_dfdx(x) = ForwardDiff.derivative(f, x)
62-
sa_d2fdx(x) = ForwardDiff.derivative(sa_dfdx, x)
63-
else
64-
sf_dfdx(x) = FiniteDiff.finite_difference_derivative(f, x, diff_type(alg), eltype(x))
65-
sf_d2fdx(x) = FiniteDiff.finite_difference_derivative(sf_dfdx, x, diff_type(alg), eltype(x))
66-
end
46+
n = length(x)
6747
end
6848
T = typeof(x)
6949

@@ -85,34 +65,30 @@ function SciMLBase.__solve(prob::NonlinearProblem,
8565
if alg_autodiff(alg)
8666
if isa(x, Number)
8767
fx = f(x)
88-
dfx = sa_dfdx(x)
89-
d2fx = sa_d2fdx(x)
68+
dfx = ForwardDiff.derivative(f, x)
69+
d2fx = ForwardDiff.derivative(x -> ForwardDiff.derivative(f, x), x)
9070
else
9171
fx = f(x)
92-
dfx = a_dfdx(x)
93-
d2fx = reshape(a_d2fdx(x), (n,n,n)) # A 3-dim Hessian Tensor
72+
dfx = ForwardDiff.jacobian(f, x)
73+
d2fx = ForwardDiff.jacobian(x -> ForwardDiff.jacobian(f, x), x) # n^2 by n matrix
9474
ai = -(dfx \ fx)
95-
for j in 1:n
96-
tmp = transpose(d2fx[:, :, j] * ai)
97-
A[j, :] = tmp
98-
end
75+
A = reshape(d2fx * ai, (n, n))
9976
bi = (dfx) \ (A * ai)
10077
ci = (ai .* ai) ./ (ai .+ (0.5 .* bi))
10178
end
10279
else
10380
if isa(x, Number)
10481
fx = f(x)
105-
dfx = sf_dfdx(x)
106-
d2fx = sf_d2fdx(x)
82+
dfx = FiniteDiff.finite_difference_derivative(f, x, diff_type(alg), eltype(x))
83+
d2fx = FiniteDiff.finite_difference_derivative(x -> FiniteDiff.finite_difference_derivative(f, x), x,
84+
diff_type(alg), eltype(x))
10785
else
10886
fx = f(x)
109-
dfx = f_dfdx(x)
110-
d2fx = reshape(f_d2fdx(x), (n,n,n)) # A 3-dim Hessian Tensor
87+
dfx = FiniteDiff.finite_difference_jacobian(f, x, diff_type(alg), eltype(x))
88+
d2fx = FiniteDiff.finite_difference_jacobian(x -> FiniteDiff.finite_difference_jacobian(f, x), x,
89+
diff_type(alg), eltype(x))
11190
ai = -(dfx \ fx)
112-
for j in 1:n
113-
tmp = transpose(d2fx[:, :, j] * ai)
114-
A[j, :] = tmp
115-
end
91+
A = reshape(d2fx * ai, (n, n))
11692
bi = (dfx) \ (A * ai)
11793
ci = (ai .* ai) ./ (ai .+ (0.5 .* bi))
11894
end

0 commit comments

Comments
 (0)