Skip to content

Instantly share code, notes, and snippets.

@gragusa
Created February 27, 2015 16:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gragusa/b56ce402dc16f561e88b to your computer and use it in GitHub Desktop.
Save gragusa/b56ce402dc16f561e88b to your computer and use it in GitHub Desktop.
Modifies ForwardDiff to allow parameters in function definition
using ForwardDiff
import ForwardDiff: Dual, epsilon
function my_dual_fad{T<:Real}(f!::Function, x::Vector{T}, jac_out::Matrix{T}, dual_in, dual_out, args...)
for i in 1:length(x)
dual_in[i] = Dual(x[i], zero(T))
end
for i in 1:length(x)
dual_in[i] = Dual(x[i], one(T))
f!(dual_in, dual_out, args...)
for k in 1:length(dual_out)
jac_out[k, i] = epsilon(dual_out[k])
end
dual_in[i] = Dual(real(dual_in[i]), zero(T))
end
end
function my_dual_fad_jacobian!{T<:Real}(f!::Function, ::Type{T}; n::Int=1, m::Int=1)
dual_in = Array(Dual{T}, n)
dual_out = Array(Dual{T}, m)
g!(x, jac_out, args...) = my_dual_fad(f!, x, jac_out, dual_in, dual_out, args...)
return g!
end
function my_dual_fad_jacobian{T<:Real}(f!::Function, ::Type{T}; n::Int=1, m::Int=1)
dual_in = Array(Dual{T}, n)
dual_out = Array(Dual{T}, m)
jac_out = Array(T, m, n)
function g(x, args...)
my_dual_fad(f!, x, jac_out, dual_in, dual_out, args...)
jac_out
end
return g
end
function f!(x, y, z)
y[1] = z[1]*(x[1]^2+x[2])
y[2] = z[1]*(3*x[1])
y[3] = z[1]*(x[1]^2*x[2]^3)
end
j = my_dual_fad_jacobian(f!, Float64, n = 2, m = 3)
j([2.1, 1.5], [0.1])
j! = my_dual_fad_jacobian!(f!, Float64, n = 2, m = 3)
y = zeros(3,2)
j!([2.1, 1.5], y, [0.1])
function f!(x, y, z)
y[1] = (x[1]^2+x[2])
y[2] = (3*x[1])
y[3] = (x[1]^2*x[2]^3)
end
function f!(x, y)
y[1] = x[1]^2+x[2]
y[2] = 3*x[1]
y[3] = x[1]^2*x[2]^3
end
j = my_dual_fad_jacobian(f!, Float64, n = 2, m = 3)
j([2.1, 1.5])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment