johnmyleswhite / FiniteDiff.jl

A replacement for the finite-differencing code in Calculus.jl
Other
2 stars 2 forks source link

Add benchmarks and alternative step-size rules #7

Closed johnmyleswhite closed 8 years ago

johnmyleswhite commented 8 years ago

This pull request adds benchmarks and alternative step-size rules. The rules come from two factors:

The results are pretty inconclusive, so I'm likely to close this PR after documenting the work I've done. As part of this work, I've demonstrated that FiniteDiff.jl produces identical results to Calculus.jl.

Results for V0 step-size rules:

Method Log Mean Error Log Max Error
Calculus.finite_difference_hessian(f, x) -1.057039 0.8104079
Calculus.finite_difference(f, x) -3.904533 -2.0772611
FiniteDiff.gradient(f, x, FiniteDiff.BackwardMode()) -1.137203 0.6789916
FiniteDiff.gradient(f, x, FiniteDiff.CentralMode()) -3.904533 -2.0772611
FiniteDiff.gradient(f, x, FiniteDiff.ComplexMode()) -20.000428 -17.7607697
FiniteDiff.gradient(f, x, FiniteDiff.ForwardMode()) -1.129119 0.5269662
FiniteDiff.gradient(f, x) -3.904533 -2.0772611
FiniteDiff.hessian(f, x) -1.057039 0.8104079

Results for V1 step-size rules:

Method Log Mean Error Log Max Error
Calculus.finite_difference_hessian(f, x) -1.057039 0.8104079
Calculus.finite_difference(f, x) -3.904533 -2.0772611
FiniteDiff.gradient(f, x, FiniteDiff.BackwardMode()) -1.117063 0.6789916
FiniteDiff.gradient(f, x, FiniteDiff.CentralMode()) -3.921864 -2.0773847
FiniteDiff.gradient(f, x, FiniteDiff.ComplexMode()) -Inf -Inf
FiniteDiff.gradient(f, x, FiniteDiff.ForwardMode()) -1.158569 0.5270272
FiniteDiff.gradient(f, x) -3.921864 -2.0773847
FiniteDiff.hessian(f, x) -1.057039 0.8104079

Results for V2 step-size rules:

Method Log Mean Error Log Max Error
Calculus.finite_difference_hessian(f, x) -1.0570394 0.8104079
Calculus.finite_difference(f, x) -3.9045333 -2.0772611
FiniteDiff.gradient(f, x, FiniteDiff.BackwardMode()) -0.9259734 1.1065812
FiniteDiff.gradient(f, x, FiniteDiff.CentralMode()) -4.0523794 -2.6140940
FiniteDiff.gradient(f, x, FiniteDiff.ComplexMode()) -20.0004281 -17.7607697
FiniteDiff.gradient(f, x, FiniteDiff.ForwardMode()) -0.9023980 0.9905542
FiniteDiff.gradient(f, x) -4.0523794 -2.6140940
FiniteDiff.hessian(f, x) -0.6663852 1.4290833

Results for V3 step-size rules:

Method Log Mean Error Log Max Error
Calculus.finite_difference_hessian(f, x) -1.0570394 0.8104079
Calculus.finite_difference(f, x) -3.9045333 -2.0772611
FiniteDiff.gradient(f, x, FiniteDiff.BackwardMode()) -0.9139828 1.1065681
FiniteDiff.gradient(f, x, FiniteDiff.CentralMode()) -4.0734045 -2.6140484
FiniteDiff.gradient(f, x, FiniteDiff.ComplexMode()) -Inf -Inf
FiniteDiff.gradient(f, x, FiniteDiff.ForwardMode()) -0.9149383 0.9905714
FiniteDiff.gradient(f, x) -4.0734045 -2.6140484
FiniteDiff.hessian(f, x) -0.6663852 1.4290833