JuliaPhysics / JuliaPhysics/WaveOpticsPropagation.jl

ChainRules with Tagent

Open
#13 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Julia
Stars
42
Forks
4
PR merge metrics
No merged PRs in 30d

Description

The following fails:

```julia
function ChainRulesCore.rrule(as::AngularSpectrum3, field)
field_and_tuple = as(field)
function as_pullback(ȳ)
f̄ = NoTangent()
y2 = ȳ

fill!(as.buffer2, 0)

# THIS LINE FAILS
field_new = as.padding ? ∇set_center!(y2, as.buffer2, field, broadcast=true) : y2
field_imd = as.p * ifftshift!(as.buffer, field_new, (1, 2))
field_imd .*= conj.(as.HW)
field_out = fftshift!(as.buffer2, inv(as.p) * field_imd, (1, 2))
field_out_cropped = as.padding ? crop_center(field_out, size(field), return_view=true) : field_out
return f̄, field_out_cropped
end
return field_and_tuple, as_pullback
end

function ∇set_center!(dy, arr_large::AbstractArray{T, N}, arr_small::AbstractArray{T1, M};
broadcast=false) where {T, T1, M, N}
@assert N ≥ M "Can't put a higher dimensional array in a lower dimensional one."

if broadcast == false
inds = ntuple(i -> begin
a, b = get_indices_around_center(size(arr_large, i), size(arr_small, i))
a:b
end,
Val(N))
arr_large[inds..., ..] .= dy
else
inds = ntuple(i -> begin
a, b = get_indices_around_center(size(arr_large, i), size(arr_small, i))
a:b
end,
Val(M))
# THIS LINE fails with broadcasting
arr_large[inds..., ..] .= dy
end

return arr_large
end
```

with
```julia
julia> include("test/angular_spectrum.jl")
typeof(dy) = Tangent{Any, Tuple{Matrix{ComplexF64}, ZeroTangent}}
Test gradient with Finite Differences: Error During Test at /home/fxw/.julia/dev/WaveOpticsPropagation.jl/test/angular_spectrum.jl:3
Got exception outside of a @test
DimensionMismatch: array could not be broadcast to match destination
Stacktrace:
[1] check_broadcast_shape
@ ./broadcast.jl:579 [inlined]
[2] check_broadcast_axes
@ ./broadcast.jl:582 [inlined]
[3] instantiate
@ ./broadcast.jl:309 [inlined]
[4] materialize!
@ ./broadcast.jl:914 [inlined]
[5] materialize!
@ ./broadcast.jl:911 [inlined]
[6] ∇set_center!(dy::Tangent{Any, Tuple{Matrix{ComplexF64}, ZeroTangent}}, arr_large::Matrix{ComplexF64}, arr_small::Matrix{ComplexF64}; broadcast::Bool)
@ WaveOpticsPropagation ~/.julia/dev/WaveOpticsPropagation.jl/src/utils.jl:248
[7] ∇set_center!
@ ~/.julia/dev/WaveOpticsPropagation.jl/src/utils.jl:230 [inlined]
[8] (::WaveOpticsPropagation.var"#as_pullback#166"{WaveOpticsPropagation.AngularSpectrum3{Matrix{ComplexF64}, Float64, FFTW.cFFTWPlan{ComplexF64, -1, true, 2, Tuple{Int64, Int64}}}, Matrix{ComplexF64}})(ȳ::Tangent{Any, Tuple{Matrix{ComplexF64}, ZeroTangent}})
@ WaveOpticsPropagation ~/.julia/dev/WaveOpticsPropagation.jl/src/angular_spectrum.jl:200
[9] (::Zygote.ZBack{WaveOpticsPropagation.var"#as_pullback#166"{WaveOpticsPropagation.AngularSpectrum3{Matrix{ComplexF64}, Float64, FFTW.cFFTWPlan{ComplexF64, -1, true, 2, Tuple{Int64, Int64}}}, Matrix{ComplexF64}}})(dy::Tuple{Matrix{ComplexF64}, Nothing})
@ Zygote ~/.julia/packages/Zygote/WOy6z/src/compiler/chainrules.jl:211
[10] f_AS
@ ~/.julia/dev/WaveOpticsPropagation.jl/test/angular_spectrum.jl:15 [inlined]
[11] (::Zygote.Pullback{Tuple{var"#f_AS#132", Matrix{ComplexF64}}, Any})(Δ::Float64)
@ Zygote ~/.julia/packages/Zygote/WOy6z/src/compiler/interface2.jl:0
[12] (::Zygote.var"#75#76"{Zygote.Pullback{Tuple{var"#f_AS#132", Matrix{ComplexF64}}, Any}})(Δ::Float64)
@ Zygote ~/.julia/packages/Zygote/WOy6z/src/compiler/interface.jl:45
[13] gradient(f::Function, args::Matrix{ComplexF64})
@ Zygote ~/.julia/packages/Zygote/WOy6z/src/compiler/interface.jl:97
[14] macro expansion
@ ~/.julia/dev/WaveOpticsPropagation.jl/test/angular_spectrum.jl:17 [inlined]
[15] macro expansion
@ ~/.julia/juliaup/julia-1.10.0+0.x64.linux.gnu/share/julia/stdlib/v1.10/Test/src/Test.jl:1577 [inlined]
[16] macro expansion
@ ~/.julia/dev/WaveOpticsPropagation.jl/test/angular_spectrum.jl:4 [inlined]
[17] macro expansion
@ ~/.julia/juliaup/julia-1.10.0+0.x64.linux.gnu/share/julia/stdlib/v1.10/Test/src/Test.jl:1577 [inlined]
[18] top-level scope
@ ~/.julia/dev/WaveOpticsPropagation.jl/test/angular_spectrum.jl:3
[19] include(fname::String)
@ Base.MainInclude ./client.jl:489
[20] top-level scope
@ REPL[21]:1
[21] top-level scope
@ ~/.julia/packages/CUDA/rXson/src/initialization.jl:208
[22] eval
@ Core ./boot.jl:385 [inlined]
[23] eval_user_input(ast::Any, backend::REPL.REPLBackend, mod::Module)
@ REPL ~/.julia/juliaup/julia-1.10.0+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:150
[24] repl_backend_loop(backend::REPL.REPLBackend, get_module::Function)
@ REPL ~/.julia/juliaup/julia-1.10.0+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:246
[25] start_repl_backend(backend::REPL.REPLBackend, consumer::Any; get_module::Function)
@ REPL ~/.julia/juliaup/julia-1.10.0+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:231
[26] run_repl(repl::REPL.AbstractREPL, consumer::Any; backend_on_current_task::Bool, backend::Any)
@ REPL ~/.julia/juliaup/julia-1.10.0+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:389
[27] run_repl(repl::REPL.AbstractREPL, consumer::Any)
@ REPL ~/.julia/juliaup/julia-1.10.0+0.x64.linux.gnu/share/julia/stdlib/v1.10/REPL/src/REPL.jl:375
[28] (::Base.var"#1013#1015"{Bool, Bool, Bool})(REPL::Module)
@ Base ./client.jl:432
[29] #invokelatest#2
@ Base ./essentials.jl:887 [inlined]
[30] invokelatest
@ Base ./essentials.jl:884 [inlined]
[31] run_main_repl(interactive::Bool, quiet::Bool, banner::Bool, history_file::Bool, color_set::Bool)
@ Base ./client.jl:416
[32] exec_options(opts::Base.JLOptions)
@ Base ./client.jl:333
[33] _start()
@ Base ./client.jl:552

```

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by reproducing the failure with include("test/angular_spectrum.jl"). Inspect ∇set_center! in src/utils.jl and its call from the AngularSpectrum3 pullback in src/angular_spectrum.jl, focusing on the Tangent value shown in the traceback. Done means the angular spectrum gradient test runs without the DimensionMismatch and still validates the gradient.

Written by the indexing model from the issue text.

Assessment

Tech stack
julia
Domain
testing-qa
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.