@@ -67,11 +67,12 @@ function ∂H∂r(h::Hamiltonian{<:DenseEuclideanMetric,<:GaussianKinetic}, r::A
6767 return M⁻¹ * r
6868end
6969
70- # TODO (kai) make the order of θ and r consistent with neg_energy
7170# TODO (kai) add stricter types to block hamiltonian.jl#L37 from working on unknown metric/kinetic
7271# The gradient of a position-dependent Hamiltonian system depends on both θ and r.
7372∂H∂θ (h:: Hamiltonian , θ:: AbstractVecOrMat , r:: AbstractVecOrMat ) = ∂H∂θ (h, θ)
74- ∂H∂r (h:: Hamiltonian , θ:: AbstractVecOrMat , r:: AbstractVecOrMat ) = ∂H∂r (h, r)
73+ function ∂H∂r (h:: Hamiltonian , θ:: AbstractVecOrMat , r:: AbstractVecOrMat )
74+ return DualValue (neg_energy (h, θ, r), ∂H∂r (h, r))
75+ end
7576
7677struct PhasePoint{T<: AbstractVecOrMat{<:AbstractFloat} ,V<: DualValue }
7778 θ:: T # Position variables / model parameters.
@@ -101,7 +102,7 @@ function Base.similar(z::PhasePoint{<:AbstractVecOrMat{T}}) where {T<:AbstractFl
101102end
102103
103104function phasepoint (
104- h:: Hamiltonian , θ:: T , r:: T ; ℓπ= ∂H∂θ (h, θ), ℓκ= DualValue ( neg_energy (h, r, θ), ∂H∂r (h, r) )
105+ h:: Hamiltonian , θ:: T , r:: T ; ℓπ= ∂H∂θ (h, θ), ℓκ= ∂H∂r (h, θ, r )
105106) where {T<: AbstractVecOrMat }
106107 return PhasePoint (θ, r, ℓπ, ℓκ)
107108end
110111# move the momentum variable to that of the position variable.
111112# This is needed for AHMC to work with CuArrays and other Arrays (without depending on it).
112113function phasepoint (
113- h:: Hamiltonian ,
114- θ:: T1 ,
115- _r:: T2 ;
116- r= safe_rsimilar (θ, _r),
117- ℓπ= ∂H∂θ (h, θ),
118- ℓκ= DualValue (neg_energy (h, r, θ), ∂H∂r (h, r)),
114+ h:: Hamiltonian , θ:: T1 , _r:: T2 ; r= safe_rsimilar (θ, _r), ℓπ= ∂H∂θ (h, θ), ℓκ= ∂H∂r (h, θ, r)
119115) where {T1<: AbstractVecOrMat ,T2<: AbstractVecOrMat }
120116 return PhasePoint (θ, r, ℓπ, ℓκ)
121117end
@@ -141,31 +137,31 @@ neg_energy(h::Hamiltonian, θ::AbstractVecOrMat) = h.ℓπ(θ)
141137# GaussianKinetic
142138
143139function neg_energy (
144- h:: Hamiltonian{<:UnitEuclideanMetric,<:GaussianKinetic} , r :: T , θ :: T
140+ h:: Hamiltonian{<:UnitEuclideanMetric,<:GaussianKinetic} , θ :: T , r :: T
145141) where {T<: AbstractVector }
146142 return - sum (abs2, r) / 2
147143end
148144
149145function neg_energy (
150- h:: Hamiltonian{<:UnitEuclideanMetric,<:GaussianKinetic} , r :: T , θ :: T
146+ h:: Hamiltonian{<:UnitEuclideanMetric,<:GaussianKinetic} , θ :: T , r :: T
151147) where {T<: AbstractMatrix }
152148 return - vec (sum (abs2, r; dims= 1 )) / 2
153149end
154150
155151function neg_energy (
156- h:: Hamiltonian{<:DiagEuclideanMetric,<:GaussianKinetic} , r :: T , θ :: T
152+ h:: Hamiltonian{<:DiagEuclideanMetric,<:GaussianKinetic} , θ :: T , r :: T
157153) where {T<: AbstractVector }
158154 return - sum (abs2 .(r) .* h. metric. M⁻¹) / 2
159155end
160156
161157function neg_energy (
162- h:: Hamiltonian{<:DiagEuclideanMetric,<:GaussianKinetic} , r :: T , θ :: T
158+ h:: Hamiltonian{<:DiagEuclideanMetric,<:GaussianKinetic} , θ :: T , r :: T
163159) where {T<: AbstractMatrix }
164160 return - vec (sum (abs2 .(r) .* h. metric. M⁻¹; dims= 1 )) / 2
165161end
166162
167163function neg_energy (
168- h:: Hamiltonian{<:DenseEuclideanMetric,<:GaussianKinetic} , r :: T , θ :: T
164+ h:: Hamiltonian{<:DenseEuclideanMetric,<:GaussianKinetic} , θ :: T , r :: T
169165) where {T<: AbstractVecOrMat }
170166 mul! (h. metric. _temp, h. metric. M⁻¹, r)
171167 return - dot (r, h. metric. _temp) / 2
0 commit comments