Implement hessian! for scalar x
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 35/100
Rechercherichtung
Beginne damit, den bestehenden ForwardDiff.hessian!-Einstiegspunkt und dessen Verwendung von DiffResults.HessianResult für Array-Eingaben zu untersuchen. Verfolge, wie der skalare Wert x derzeit über einen ein-elementigen SVector gewrappt wird, und bestimme dann die erwartete skalare API und das Allokationsverhalten. Die Aufgabe ist erledigt, wenn skalare Eingaben dasselbe Ergebnis für Wert, Gradient und Hessian ohne die Wrapper-Allokation unterstützen, sofern f selbst nicht allokiert.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
If I have a function f(x::Real)::Real I have two options for computing f(x), f'(x), f''(x):
using ForwardDiff, DiffResults, StaticArrays, BenchmarkTools
function computehessian(f, x::AbstractArray)
result = DiffResults.HessianResult(x)
result = ForwardDiff.hessian!(result, f, x)
return DiffResults.value(result), DiffResults.gradient(result), DiffResults.hessian(result)
end
computehessian(f, x::T) where T <: Number = map(first, computehessian(f ∘ first, SVector{1, T}(x)))
function computehessian2(f, x)
df(x) = ForwardDiff.derivative(f, x)
d2f(x) = ForwardDiff.derivative(df, x)
return (f(x), df(x), d2f(x))
end
x = rand()
w = rand()
s1 = rand()
s2 = rand()
f(w, s1, s2, x) = log(w * s1 * exp(-0.5 * x * s1 ^ 2) + (1-w) * s2 * exp(-0.5 * x * s2 ^ 2))
expandfunc(args, v) = args[1](args[2:end]..., v)
fixallbutlast(func, args...) = Base.Fix1(expandfunc, (func, args...))
g = fixallbutlast(f, w, s1, s2)
@btime computehessian($g, $x)
@btime computehessian2($g, $x)
69.075 ns (1 allocation: 64 bytes)
83.289 ns (0 allocations: 0 bytes)
The first approach, using the hessian! function, is faster because the value, 1st and 2nd derivatives can all be computed with a single call to f (using a DiffResult structure), whereas the second approach requires 4 calls of f to perform the same calculation. If f is slow, then the second approach is much worse. However, the first approach doesn't support scalar x::T (where T <: Number), requiring a wrapper to get around this. Furthermore, it causes an allocation, making the calculation slower than necessary.
Is it possible to implement the functionality of hessian! with a DiffResult input, but for scalar x? If so, is it possible to avoid the allocation (assuming f doesn't allocate)?
- Vorherrschende Sprache
- Julia
- Sterne
- 1k
- Forks
- 162
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Entwicklungsumgebung
Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus JuliaDiff/ForwardDiff.jl
-
missing floatmin, floatmax, and issubnormal for DualEvtl. vergeben @devmotion hat das vor 17 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
JuliaDiff/ForwardDiff.jl#852 · 6 Kommentare ·
-
`fma` and `muladd` ignore NaN-safe modeEvtl. vergeben @devmotion hat das vor 2 Tagen übernommen. Offen
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 55/100
JuliaDiff/ForwardDiff.jl#860 ·
-
Enable NaN-safe mode by defaultEvtl. vergeben @devmotion hat das vor 4 Tagen übernommen. Offen
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 25/100
JuliaDiff/ForwardDiff.jl#857 · 1 Reaktion ·
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 52/100
JuliaDiff/ForwardDiff.jl#854 · 1 Kommentar ·
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 75/100
JuliaDiff/ForwardDiff.jl#849 ·
Alle Issues in JuliaDiff/ForwardDiff.jl
Ähnliche Issues
-
enhancement good first issue help wanted
Schwierigkeit 2/5 Ein halber Tag Anfängerfreundlichkeit 82/100
-
authority-vechtstromen ready-for-agent
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 75/100
Deltares/Ribasim-NL#890 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 88/100
Maintainer antworten meist innerhalb von 1 Tag
-
Precompilation fails on Julia 1.14 nightly: HessenbergQ lmul! methods overwrite LinearAlgebra'sOffen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
JuliaLinearAlgebra/GenericLinearAlgebra.jl#183 · 1 Kommentar ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
JuliaGPU/KernelAbstractions.jl#897 ·
Maintainer antworten meist innerhalb von 1 Tag