# FFTs in probabilistic models

**URL:** <https://discourse.julialang.org/t/ffts-in-probabilistic-models/69775>\
**Category:** Probabilistic Programming\
**Tags:** question, fftw\
**Created:** [October 14, 2021, 8:54pm UTC](https://discourse.julialang.org/t/ffts-in-probabilistic-models/69775 "2021-10-14T20:54:21Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![bdecost](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bdecost/32/22687_2.png) [@bdecost](https://discourse.julialang.org/u/bdecost)\
**Post date:** [October 14, 2021, 8:54pm UTC](https://discourse.julialang.org/t/ffts-in-probabilistic-models/69775/1 "2021-10-14T20:54:22Z")

</div>

I’m working on a model that involves a Fourier transform, and I’m running the limits of my julia debugging ability

I’m using [this AbstractFFTs PR](https://github.com/JuliaMath/AbstractFFTs.jl/pull/58) to try to get it working with the ForwardDiff backend. (Zygote fails with what I think is an unrelated issue that has to due with MvNormal, but I haven’t pursued it that hard.)

This MWE model fails with the forwarddiff backend, complaining about (I think?) the type conversion for FFTW. (I actually want to model both the real and complex components of the FFT output, but I don’t think it’s relevant to the MWE)

```julia
using Pkg
Pkg.add("Turing")
Pkg.add("FFTW")
Pkg.add(url="https://github.com/devmotion/AbstractFFTs.jl", rev = "dw/chainrules")
using FFTW
using Turing
using Distributions
using LinearAlgebra
using AbstractFFTs

# MWE model with a fourier transform
@model function fftmodel(x, y)
	mu ~ Normal(0, 1)
	q = fft(mu .+ x)
	y ~ MvNormal(real.(q), 0.1)
	return y
end

x = rand(10)
y = fft(3.0 .+ x)
chain = sample(fftmodel(x, real.(y)) , NUTS(0.65), 1000) 

```

here is the traceback:

> type ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1} not supported
> 
> 1. **error** (::String)@ _error.jl:33_
> 2. **\_fftfloat** (::Type{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}})@ _definitions.jl:22_
> 3. **\_fftfloat** (::ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1})@ _definitions.jl:23_
> 4. **fftfloat** (::ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1})@ _definitions.jl:18_
> 5. **complexfloat** (::Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}})@ _definitions.jl:31_
> 6. **fft** (::Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}, ::UnitRange{Int64})@ _definitions.jl:198_
> 7. (::Main.workspace18.var"#fftmodel#1")(::DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, ::DynamicPPL.ThreadSafeVarInfo{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}, Vector{Set{DynamicPPL.Selector}}}}}, ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}, Vector{Base.RefValue{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}}}, ::DynamicPPL.SamplingContext{DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext, Random.\_GLOBAL\_RNG}, ::Vector{Float64}, ::Vector{Float64})@ \*[Local: 6]
> 8. **macro expansion** @ _model.jl:465_ [inlined]
> 9. **\_evaluate** (::DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, ::DynamicPPL.ThreadSafeVarInfo{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}, Vector{Set{DynamicPPL.Selector}}}}}, ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}, Vector{Base.RefValue{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}}}, ::DynamicPPL.SamplingContext{DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext, Random.\_GLOBAL\_RNG})@ _model.jl:448_
> 10. **evaluate\_threadsafe** (::DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, ::DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}, Vector{Set{DynamicPPL.Selector}}}}}, ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}, ::DynamicPPL.SamplingContext{DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext, Random.\_GLOBAL\_RNG})@ _model.jl:438_
> 11. (::DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext})(::DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}, Vector{Set{DynamicPPL.Selector}}}}}, ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}, ::DynamicPPL.SamplingContext{DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext, Random.\_GLOBAL\_RNG})@ _model.jl:391_
> 12. (::DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext})(::Random.\_GLOBAL\_RNG, ::DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}, Vector{Set{DynamicPPL.Selector}}}}}, ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}, ::DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, ::DynamicPPL.DefaultContext)@ _model.jl:383_
> 13. (::DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext})(::DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}, Vector{Set{DynamicPPL.Selector}}}}}, ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}, ::Vararg{Any, N} where N)@ _model.jl:396_
> 14. (::Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext})(::Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}})@ _ad.jl:111_
> 15. **vector\_mode\_dual\_eval!** (::Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, ::ForwardDiff.GradientConfig{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}}, ::Vector{Float64})@ _apiutils.jl:37_
> 16. **vector\_mode\_gradient!** (::Vector{Float64}, ::Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, ::Vector{Float64}, ::ForwardDiff.GradientConfig{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}})@ _gradient.jl:113_
> 17. **gradient!** (::Vector{Float64}, ::Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, ::Vector{Float64}, ::ForwardDiff.GradientConfig{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}}, ::Val{true})@ _gradient.jl:37_
> 18. **gradient!** (::Vector{Float64}, ::Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, ::Vector{Float64}, ::ForwardDiff.GradientConfig{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1, Vector{ForwardDiff.Dual{ForwardDiff.Tag{Turing.Core.var"#f#1"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.DefaultContext}, Float64}, Float64, 1}}})@ _gradient.jl:35_
> 19. **gradient\_logp** (::Turing.Core.ForwardDiffAD{40}, ::Vector{Float64}, ::DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, ::DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, ::DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, ::DynamicPPL.DefaultContext)@ _ad.jl:121_  
> ::AdvancedHMC.Hamiltonian{AdvancedHMC.DiagEuclideanMetric{Float64, Vector{Float64}}, Turing.Inference.var"#logπ#52"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}}, Turing.Inference.var"#∂logπ∂θ#51"{DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}}})@ _hamiltonian.jl:153_
> 20. **var"#initialstep#41"** (::Nothing, ::Int64, ::Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, ::typeof(DynamicPPL.initialstep), ::Random.\_GLOBAL\_RNG, ::DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, ::DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, ::DynamicPPL.TypedVarInfo{NamedTuple{(:mu,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:mu, Tuple{}}, Int64}, Vector{Distributions.Normal{Float64}}, Vector{AbstractPPL.VarName{:mu, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64})@ _hmc.jl:167_
> 21. **var"#step#17"** (::Nothing, ::Base.Iterators.Pairs{Symbol, Int64, Tuple{Symbol}, NamedTuple{(:nadapts,), Tuple{Int64}}}, ::typeof(AbstractMCMC.step), ::Random.\_GLOBAL\_RNG, ::DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, ::DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}})@ _sampler.jl:87_
> 22. **var"#mcmcsample#20"** (::Bool, ::String, ::Nothing, ::Int64, ::Int64, ::Type, ::Base.Iterators.Pairs{Symbol, Int64, Tuple{Symbol}, NamedTuple{(:nadapts,), Tuple{Int64}}}, ::typeof(AbstractMCMC.mcmcsample), ::Random.\_GLOBAL\_RNG, ::DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, ::DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, ::Int64)@ _sample.jl:114_
> 23. **var"#sample#40"** (::Type, ::Nothing, ::Bool, ::Int64, ::Bool, ::Int64, ::Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, ::typeof(StatsBase.sample), ::Random.\_GLOBAL\_RNG, ::DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, ::DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}}, ::Int64)@ _hmc.jl:133_
> 24. **sample** (::DynamicPPL.Model{Main.workspace18.var"#fftmodel#1", (:x, :y), (), (), Tuple{Vector{Float64}, Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, ::Turing.Inference.NUTS{Turing.Core.ForwardDiffAD{40}, (), AdvancedHMC.DiagEuclideanMetric}, ::Int64)@ _Inference.jl:132_

Any pointers?

version info:

> Julia Version 1.6.0  
> Commit f9720dc2eb (2021-03-24 12:55 UTC)  
> Platform Info:  
> OS: macOS (x86\_64-apple-darwin19.6.0)  
> CPU: Intel(R) Core™ i7-4770HQ CPU @ 2.20GHz  
> WORD\_SIZE: 64  
> LIBM: libopenlibm  
> LLVM: libLLVM-11.0.1 (ORCJIT, haswell)  
> Environment:  
> JULIA\_NUM\_THREADS = 4  
> JULIA\_REVISE\_WORKER\_ONLY = 1

---

<div class="post-metadata">

**Author:** ![bdecost](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bdecost/32/22687_2.png) [@bdecost](https://discourse.julialang.org/u/bdecost)\
**Post date:** [October 14, 2021, 8:56pm UTC](https://discourse.julialang.org/t/ffts-in-probabilistic-models/69775/2 "2021-10-14T20:56:02Z")

</div>

sorry, the traceback is really long so I had to truncate some of it.

In contrast, explicitly constructing and using the DFT matrix works. I’d like to make it work with FFTW though.

```julia

N = 10
ℱ = fft(Matrix(1.0I, N, N), 1)

@model function naivefftmodel(x, y)
	mu ~ Normal(0, 1)
	q = ℱ * (mu .+ x)
	y ~ MvNormal(real.(q), 0.1)
	return y
end

x = rand(N)
y = fft(3.0 .+ x)
chain = sample(naivefftmodel(x, real.(y)) , NUTS(0.65), 1000) 

```

Any pointers?

Zygote fails on this model also, but I think it’s unrelated. MWE:

```julia
Turing.setadbackend(:zygote)

@model function mymodel(y)
	x ~ filldist(Normal(0, 1), 10)
	y ~ MvNormal(x, 1)
end
y = rand(10)	
chain = sample(mymodel(y), NUTS(0.65), 1000) 

```

the trace:

> MethodError: no method matching (::ChainRulesCore.ProjectTo{Float64, NamedTuple{(), Tuple{}}})(::NamedTuple{(:x,), Tuple{Int64}})
> 
> Closest candidates are:
> 
> (::ChainRulesCore.ProjectTo{var"#s12", D} where {var"#s12"\<:Real, D\<:NamedTuple})(!Matched::Complex) at /Users/bld/.julia/packages/ChainRulesCore/MhCRV/src/projection.jl:186
> 
> (::ChainRulesCore.ProjectTo{var"#s12", D} where {var"#s12"\<:Number, D\<:NamedTuple})(!Matched::ChainRulesCore.Tangent{var"#s11", T} where {var"#s11"\<:Number, T}) at /Users/bld/.julia/packages/ChainRulesCore/MhCRV/src/projection.jl:192
> 
> (::ChainRulesCore.ProjectTo{T, D} where D\<:NamedTuple)(!Matched::ChainRulesCore.Tangent{var"#s12", T} where {var"#s12"\<:T, T}) where T at /Users/bld/.julia/packages/ChainRulesCore/MhCRV/src/projection.jl:142
> 
> …
> 
> 1. (::ChainRulesCore.ProjectTo{Ref, NamedTuple{(:type, :x), Tuple{DataType, ChainRulesCore.ProjectTo{Float64, NamedTuple{(), Tuple{}}}}}})(::Base.RefValue{Any})@ _projection.jl:284_
> 2. **#56** @ _projection.jl:237_ [inlined]
> 3. **#4** @ _generator.jl:36_ [inlined]
> 4. **iterate** @ _generator.jl:47_ [inlined]
> 5. **collect** (::Base.Generator{Base.Iterators.Zip{Tuple{Vector{ChainRulesCore.ProjectTo{Ref, NamedTuple{(:type, :x), Tuple{DataType, ChainRulesCore.ProjectTo{Float64, NamedTuple{(), Tuple{}}}}}}}, Vector{Base.RefValue{Any}}}}, Base.var"#4#5"{ChainRulesCore.var"#56#57"}})@ _array.jl:678_
> 6. **map** @ _abstractarray.jl:2383_ [inlined]
> 7. (::ChainRulesCore.ProjectTo{AbstractArray, NamedTuple{(:elements, :axes), Tuple{Vector{ChainRulesCore.ProjectTo{Ref, NamedTuple{(:type, :x), Tuple{DataType, ChainRulesCore.ProjectTo{Float64, NamedTuple{(), Tuple{}}}}}}}, Tuple{Base.OneTo{Int64}}}}})(::Vector{Base.RefValue{Any}})@ _projection.jl:237_
> 8. (::ChainRules.var"#sum\_pullback#1375"{Colon, typeof(getindex), ChainRulesCore.ProjectTo{AbstractArray, NamedTuple{(:elements, :axes), Tuple{Vector{ChainRulesCore.ProjectTo{Ref, NamedTuple{(:type, :x), Tuple{DataType, ChainRulesCore.ProjectTo{Float64, NamedTuple{(), Tuple{}}}}}}}, Tuple{Base.OneTo{Int64}}}}}, Vector{Zygote.var"#ad\_pullback#45"{Tuple{typeof(getindex), Base.RefValue{Float64}}, typeof(∂(getindex))}}})(::Int64)@ _mapreduce.jl:88_
> 9. **ZBack** @ _chainrules.jl:168_ [inlined]
> 10. **Pullback** @ _threadsafe.jl:25_ [inlined]
> 11. (::typeof(∂(getlogp)))(::Int64)@ _interface2.jl:0_
> 12. **Pullback** @ _model.jl:439_ [inlined]
> 13. (::typeof(∂(evaluate\_threadsafe)))(::Nothing)@ _interface2.jl:0_
> 14. **Pullback** @ _model.jl:391_ [inlined]
> 15. (::typeof(∂(λ)))(::Nothing)@ _interface2.jl:0_
> 16. **Pullback** @ _model.jl:383_ [inlined]
> 17. (::typeof(∂(λ)))(::Nothing)@ _interface2.jl:0_
> 18. **#203** @ _lib.jl:203_ [inlined]
> 19. **#1734#back** @ _adjoint.jl:67_ [inlined]
> 20. **Pullback** @ _model.jl:396_ [inlined]
> 21. (::typeof(∂(λ)))(::Nothing)@ _interface2.jl:0_
> 22. **Pullback** @ _ad.jl:165_ [inlined]
> 23. (::typeof(∂(λ)))(::Int64)@ _interface2.jl:0_
> 24. (::Zygote.var"#50#51"{typeof(∂(λ))})(::Int64)@ _interface.jl:41_
> 25. **gradient\_logp** (::Turing.Core.ZygoteAD, ::Vector{Float64}, ::DynamicPPL.TypedVarInfo{NamedTuple{(:x,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:x, Tuple{}}, Int64}, Vector{DistributionsAD.TuringScalMvNormal{Vector{Float64}, Float64}}, Vector{AbstractPPL.VarName{:x, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, ::DynamicPPL.Model{Main.workspace388.var"#mymodel#1", (:y,), (), (), Tuple{Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, ::DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ZygoteAD, (), AdvancedHMC.DiagEuclideanMetric}}, ::DynamicPPL.DefaultContext)@ _ad.jl:171_
> 26. **gradient\_logp** @ _ad.jl:83_ [inlined]
> 27. **∂logπ∂θ** @ _hmc.jl:433_ [inlined]
> 28. **∂H∂θ** @ _hamiltonian.jl:31_ [inlined]
> 29. **phasepoint** @ _hamiltonian.jl:76_ [inlined]
> 30. **phasepoint** (::Random.\_GLOBAL\_RNG, ::Vector{Float64}, ::AdvancedHMC.Hamiltonian{AdvancedHMC.DiagEuclideanMetric{Float64, Vector{Float64}}, Turing.Inference.var"#logπ#52"{DynamicPPL.TypedVarInfo{NamedTuple{(:x,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:x, Tuple{}}, Int64}, Vector{DistributionsAD.TuringScalMvNormal{Vector{Float64}, Float64}}, Vector{AbstractPPL.VarName{:x, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ZygoteAD, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.Model{Main.workspace388.var"#mymodel#1", (:y,), (), (), Tuple{Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}}, Turing.Inference.var"#∂logπ∂θ#51"{DynamicPPL.TypedVarInfo{NamedTuple{(:x,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:x, Tuple{}}, Int64}, Vector{DistributionsAD.TuringScalMvNormal{Vector{Float64}, Float64}}, Vector{AbstractPPL.VarName{:x, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64}, DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ZygoteAD, (), AdvancedHMC.DiagEuclideanMetric}}, DynamicPPL.Model{Main.workspace388.var"#mymodel#1", (:y,), (), (), Tuple{Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}}})@ _hamiltonian.jl:153_
> 31. **var"#initialstep#41"** (::Nothing, ::Int64, ::Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, ::typeof(DynamicPPL.initialstep), ::Random.\_GLOBAL\_RNG, ::DynamicPPL.Model{Main.workspace388.var"#mymodel#1", (:y,), (), (), Tuple{Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, ::DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ZygoteAD, (), AdvancedHMC.DiagEuclideanMetric}}, ::DynamicPPL.TypedVarInfo{NamedTuple{(:x,), Tuple{DynamicPPL.Metadata{Dict{AbstractPPL.VarName{:x, Tuple{}}, Int64}, Vector{DistributionsAD.TuringScalMvNormal{Vector{Float64}, Float64}}, Vector{AbstractPPL.VarName{:x, Tuple{}}}, Vector{Float64}, Vector{Set{DynamicPPL.Selector}}}}}, Float64})@ _hmc.jl:167_
> 32. **var"#step#17"** (::Nothing, ::Base.Iterators.Pairs{Symbol, Int64, Tuple{Symbol}, NamedTuple{(:nadapts,), Tuple{Int64}}}, ::typeof(AbstractMCMC.step), ::Random.\_GLOBAL\_RNG, ::DynamicPPL.Model{Main.workspace388.var"#mymodel#1", (:y,), (), (), Tuple{Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, ::DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ZygoteAD, (), AdvancedHMC.DiagEuclideanMetric}})@ _sampler.jl:87_
> 33. **macro expansion** @ _sample.jl:123_ [inlined]
> 34. **macro expansion** @ _ProgressLogging.jl:328_ [inlined]
> 35. **macro expansion** @ _logging.jl:8_ [inlined]
> 36. **var"#mcmcsample#20"** (::Bool, ::String, ::Nothing, ::Int64, ::Int64, ::Type, ::Base.Iterators.Pairs{Symbol, Int64, Tuple{Symbol}, NamedTuple{(:nadapts,), Tuple{Int64}}}, ::typeof(AbstractMCMC.mcmcsample), ::Random.\_GLOBAL\_RNG, ::DynamicPPL.Model{Main.workspace388.var"#mymodel#1", (:y,), (), (), Tuple{Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, ::DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ZygoteAD, (), AdvancedHMC.DiagEuclideanMetric}}, ::Int64)@ _sample.jl:114_
> 37. **var"#sample#40"** (::Type, ::Nothing, ::Bool, ::Int64, ::Bool, ::Int64, ::Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, ::typeof(StatsBase.sample), ::Random.\_GLOBAL\_RNG, ::DynamicPPL.Model{Main.workspace388.var"#mymodel#1", (:y,), (), (), Tuple{Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, ::DynamicPPL.Sampler{Turing.Inference.NUTS{Turing.Core.ZygoteAD, (), AdvancedHMC.DiagEuclideanMetric}}, ::Int64)@ _hmc.jl:133_
> 38. **sample** @ _hmc.jl:116_ [inlined]
> 39. **#sample#2** @ _Inference.jl:142_ [inlined]
> 40. **sample** @ _Inference.jl:142_ [inlined]
> 41. **#sample#1** @ _Inference.jl:132_ [inlined]
> 42. **sample** (::DynamicPPL.Model{Main.workspace388.var"#mymodel#1", (:y,), (), (), Tuple{Vector{Float64}}, Tuple{}, DynamicPPL.DefaultContext}, ::Turing.Inference.NUTS{Turing.Core.ZygoteAD, (), AdvancedHMC.DiagEuclideanMetric}, ::Int64)@ _Inference.jl:132_
> 43. **top-level scope** @ \*[Local: 11]

version info:

> Julia Version 1.6.0  
> Commit f9720dc2eb (2021-03-24 12:55 UTC)  
> Platform Info:  
> OS: macOS (x86\_64-apple-darwin19.6.0)  
> CPU: Intel(R) Core™ i7-4770HQ CPU @ 2.20GHz  
> WORD\_SIZE: 64  
> LIBM: libopenlibm  
> LLVM: libLLVM-11.0.1 (ORCJIT, haswell)  
> Environment:  
> JULIA\_NUM\_THREADS = 4  
> JULIA\_REVISE\_WORKER\_ONLY = 1

---

<div class="post-metadata">

**Author:** ![hzgzh](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/hzgzh/32/6596_2.png) [@hzgzh](https://discourse.julialang.org/u/hzgzh)\
**Post date:** [October 15, 2021, 1:08am UTC](https://discourse.julialang.org/t/ffts-in-probabilistic-models/69775/3 "2021-10-15T01:08:48Z")

</div>

FFTW is written by C, so ForwardDiff work in code written by pure Julia,so you need fft function written by julia.try [FFTA](https://juliahub.com/ui/Packages/FFTA/V4Q1C/0.2.2)

---

<div class="post-metadata">

**Author:** ![mcabbott](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mcabbott/32/6603_2.png) [@mcabbott](https://discourse.julialang.org/u/mcabbott)\
**Post date:** [October 15, 2021, 2:35am UTC](https://discourse.julialang.org/t/ffts-in-probabilistic-models/69775/4 "2021-10-15T02:35:08Z")

</div>

The linked PR won’t help for FFTW + ForwardDiff, since this does not use ChainRules at all. What might work is [ForwardDiff#541](https://github.com/JuliaDiff/ForwardDiff.jl/pull/541).

The Zygote issue indeed looks unrelated. It looks a bit like [ChainRules#539](https://github.com/JuliaDiff/ChainRules.jl/issues/539). But this one can be triggered as follows:

```julia
julia> using ChainRulesCore

julia> ProjectTo(Ref(1))(Ref{Any}(2))
Tangent{Base.RefValue{Int64}}(x = 2.0,)

julia> ProjectTo(Ref(3))(Ref{Any}((x=4,)))
ERROR: MethodError: no method matching (::ProjectTo{Float64, NamedTuple{(), Tuple{}}})(::NamedTuple{(:x,), Tuple{Int64}})
  ...
Stacktrace:
 [1] (::ProjectTo{Ref, NamedTuple{(:type, :x), Tuple{DataType, ProjectTo{Float64, NamedTuple{(), Tuple{}}}}}})(dx::Base.RefValue{Any})
   @ ChainRulesCore ~/.julia/packages/ChainRulesCore/1L9My/src/projection.jl:275

```

I believe this is probably some mismatch between how Zygote handles `mutable struct`s and its interface to ChainRules. It’s a bug, though.

---

<div class="post-metadata">

**Author:** ![bdecost](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bdecost/32/22687_2.png) [@bdecost](https://discourse.julialang.org/u/bdecost)\
**Post date:** [October 15, 2021, 3:03am UTC](https://discourse.julialang.org/t/ffts-in-probabilistic-models/69775/5 "2021-10-15T03:03:07Z")

</div>

awesome, thanks for setting me straight! [https://github.com/JuliaDiff/ForwardDiff.jl/pull/541](https://ForwardDiff#541) works for my minimal example; I’ll report back if there’s some issue on the real model.

---

<div class="post-metadata">

**Author:** ![bdecost](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bdecost/32/22687_2.png) [@bdecost](https://discourse.julialang.org/u/bdecost)\
**Post date:** [October 15, 2021, 3:19am UTC](https://discourse.julialang.org/t/ffts-in-probabilistic-models/69775/6 "2021-10-15T03:19:55Z")

</div>

cool library, thanks for sharing! I didn’t find that one when I was looking for a native julia FFT.

The AbstractFFTs PR I linked implements some custom automatic differentiation rules for FFTs to get around the external call to FFTW. I guess my issue in the other fork of this topic was that I have an incomplete understanding of the Julia autodiff ecosystem and was looking in the wrong place.
