OptimisersExt
Optimization rules and proximal operators for constrained inverse design.
Overview
The OptimisersExt module extends Optimisers.jl with:
- Custom optimization rules: FISTA, NoDescent
- Proximal operators: Constraints and regularization (TV, sparsity, clamping)
- Per-parameter rules: Different optimizers for different components
- Proximal-gradient methods: Combine optimization with constraints
Quick Example
using FluxOptics
# Define source
xv, yv = spatial_vectors(128, 128, 1.0, 1.0)
u = ScalarField(Gaussian(20.0)(xv, yv), (1.0, 1.0), 1.064)
source = ScalarSource(u)
# Define optical components
phasemask = Phase(u, (x, y) -> 0.0; trainable=true)
mask = FourierMask(u, (fx, fy) -> 1.0; trainable=true)
# Define optical system
system = source |> phasemask |> mask
# Per-component optimization rules
rules = make_rules(
phasemask => ProxRule(Descent(0.01), ClampProx(-π, π)), # Constrained phase
mask => Momentum(0.1, 0.9) # Momentum for mask
)
# Setup
opt_state = setup(rules, system)(source = (u0 = (),), components = (optical_components = ((ϕ = Leaf(ProxRule{Descent{Float64}, PointwiseProx{var"#5#6"{Float64, Irrational{:π}}}}(Descent(0.01), PointwiseProx{var"#5#6"{Float64, Irrational{:π}}}(#5)), (nothing, ())),), (optical_components = ((p_f = (), s = (), direct = ()), (m = Leaf(Momentum(eta=0.1, rho=0.9), ComplexF64[0.0+0.0im 0.0+0.0im … 0.0+0.0im 0.0+0.0im; 0.0+0.0im 0.0+0.0im … 0.0+0.0im 0.0+0.0im; … ; 0.0+0.0im 0.0+0.0im … 0.0+0.0im 0.0+0.0im; 0.0+0.0im 0.0+0.0im … 0.0+0.0im 0.0+0.0im]),), (p_f = (), s = (), direct = ())),)),))Key Types
ProxRule: Combine optimizer with proximal operatorFista: Fast iterative shrinkage-thresholdingNoDescent: No-op optimizer for fixed parameters
Proximal Operators
IstaProx: Soft thresholding for sparsityTVProx: Total variation regularizationClampProx: Box constraintsPositiveProx: Non-negativity constraintPointwiseProx: Custom element-wise constraints
Key Functions
make_rules: Create per-parameter optimization rulessetup: Initialize optimization state with custom rulesupdate!: Apply optimization step (from Optimisers.jl)
See Also
- Typical Workflow - Complete example of building and optimizing an optical system
- Metrics for loss functions
- Optimisers.jl for base optimization algorithms
Index
FluxOptics.OptimisersExt.FistaFluxOptics.OptimisersExt.NoDescentFluxOptics.OptimisersExt.make_rulesFluxOptics.OptimisersExt.ProximalOperators.AbstractProximalOperatorFluxOptics.OptimisersExt.ProximalOperators.PointwiseProxFluxOptics.OptimisersExt.ProximalOperators.ProxRuleFluxOptics.OptimisersExt.ProximalOperators.TVProxFluxOptics.OptimisersExt.ProximalOperators.ClampProxFluxOptics.OptimisersExt.ProximalOperators.IstaProxFluxOptics.OptimisersExt.ProximalOperators.PositiveProxFluxOptics.OptimisersExt.ProximalOperators.TV_denoise!