Optimizable parameters

Flatten.jl was made entirely to do this! Even for nested structs.

Like:

using Flatten
import Flatten: flattenable

@flattenable @with_kw struct Para{T}
    a::T = 1.0 | true
    b::T = 2.0 | true
    c::T = 3.0 | false
end

julia> para = Para()
Para{Float64}
  a: Float64 1.0
  b: Float64 2.0
  c: Float64 3.0


julia> fieldnameflatten(para)
(:a, :b)

julia> data = flatten(Vector,para)
2-element Array{Float64,1}:
 1.0
 2.0

julia> data[2] = 5.0
5.0

julia> Flatten.reconstruct(para, data)
Para{Float64}
  a: Float64 1.0
  b: Float64 5.0
  c: Float64 3.0

It becomes increasingly useful the larger and more complicated the struct, and it generates pretty fast code.

To use the fieldnames in the array, make an AxisArray

data = flatten(Vector,para)
names = fieldnameflatten(Vector, para)
a = AxisArray(data, Axis{:parameters}(names))                                                                                                                                                                                             

julia> a[:b]                                                                                                               
2.0                
4 Likes