Skip to content

Commit

Permalink
add another test optimization, only Enzyme to calculate the gradient …
Browse files Browse the repository at this point in the history
…works, but LBFGS does not
  • Loading branch information
enigne committed May 14, 2024
1 parent 0fe8dfb commit e86b217
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 10 deletions.
1 change: 0 additions & 1 deletion Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
Triangulate = "f7e6ffb2-c36d-4f8f-a77e-16e897189344"
UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed"

[extras]
Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9"
Expand Down
29 changes: 20 additions & 9 deletions test/testoptimization.jl
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
module enzymeDiff

using dJUICE
using MAT
using Test
using Enzyme

Enzyme.API.typeWarning!(false)
Enzyme.Compiler.RunAttributor[] = false
using Optimization, OptimizationOptimJL

using Optimization

#Load model from MATLAB file
#file = matopen(joinpath(@__DIR__, "..", "data","temp12k.mat")) #BIG model
Expand All @@ -26,21 +26,32 @@ md.inversion.max_parameters = ones(md.mesh.numberofvertices)*(1.0e3)
md.inversion.independent_string = "FrictionCoefficient"

α = md.inversion.independent
α[2] = 10.0
∂J_∂α = zero(α)

femmodel=dJUICE.ModelProcessor(md, :StressbalanceSolution)
n = length(α)
# use user defined grad, errors!
optprob = OptimizationFunction(dJUICE.costfunction, Optimization.AutoEnzyme(), grad=dJUICE.computeGradient)
#optprob = OptimizationFunction(dJUICE.costfunction, Optimization.AutoEnzyme())
#prob = Optimization.OptimizationProblem(optprob, α, femmodel, lb=md.inversion.min_parameters, ub=md.inversion.max_parameters)
prob = Optimization.OptimizationProblem(optprob, α, femmodel)
sol = Optimization.solve(prob, Optim.LBFGS())
optprob = OptimizationFunction(DJUICE.costfunction, Optimization.AutoEnzyme())
prob = Optimization.OptimizationProblem(optprob, α, femmodel, lb=md.inversion.min_parameters, ub=md.inversion.max_parameters, maxiters=1000)
#prob = Optimization.OptimizationProblem(optprob, α, femmodel)
#sol = Optimization.solve(prob, Optim.NelderMead())
sol = Optimization.solve(prob, Optimization.LBFGS())

# compute the gradient by enzyme
md = DJUICE.solve(md, :grad)
enz_grad = md.results["StressbalanceSolution"]["Gradient"]

# evaluating the gradient
sol.cache.f.grad(∂J_∂α, prob.u0, prob.p)

#independent_enum = DJUICE.StringToEnum(md.inversion.independent_string)
#DJUICE.InputUpdateFromVectorx(femmodel, sol.u, independent_enum, DJUICE.VertexSIdEnum)
#DJUICE.RequestedOutputsx(femmodel, [independent_enum])
#DJUICE.OutputResultsx(femmodel, md, :StressbalanceSolution)

#md = solve(md, :sb)

# compute gradient by finite differences at each node
#addJ = md.results["StressbalanceSolution"]["Gradient"]

end

0 comments on commit e86b217

Please sign in to comment.