Full Parameter list (= default):

function struct2dict(x::T) where {T}
    return Dict{String,Any}(string(fn) => getfield(x, fn) for fn in fieldnames(T))
end

@kwdef mutable struct EnsembleParameters
    mode::String = "sim"
    L::NTuple{4,Int64} = (4, 4, 4, 4)
    backend::String = "cpu"
    float_type::String = "float64"
    solver_float_type::String = "float64"
    randomseed::Union{UInt64,Vector{UInt64}} = 0x0000000000000000
    NC::Int64 = 3
    su3_nfloats::Int64 = 18
    numprocs_cart::NTuple{4,Int64} = (1, 1, 1, 1)
    halo_width::Int64 = 0
    numtherm::Int64 = 10
    numsteps::Int64 = 100
    inital::String = "cold"
    update_method::String = "HMC"
    hb_maxit::Int64 = 10^5
    numheatbath::Int64 = 4
    metro_epsilon::Float64 = 0.1
    metro_numhits::Int64 = 1
    metro_target_acc::Float64 = 0.5
    eo::Bool = true
    or_algorithm::String = "subgroups"
    numorelax::Int64 = 0
    parity_update::Bool = false
end

@kwdef mutable struct DataParameters
    ensemble_dir::String = ""
    log_to_console::Bool = true
    verboselevel::Int64 = 1
    save_config_format::String = ""
    save_config_every::Int64 = 0
    save_checkpoint_format::String = ""
    save_checkpoint_every::Int64 = 0
    load_config_fromfile::Bool = false
    load_config_format::String = ""
    load_config_path::String = ""
    load_checkpoint_fromfile::Bool = false
    load_checkpoint_format::String = "jld2"
    load_checkpoint_path::String = ""
    overwrite::Bool = false
end

@kwdef mutable struct GaugeActionParameters
    beta::Float64 = 5.7
    gauge_action::String = "wilson"
end

@kwdef mutable struct FermionActionParameters
    fermion_action::String = "none"
    boundary_condition::String = "antiperiodic"
    wilson_r::Float64 = 1.0
    wilson_csw::Float64 = 0.0
    fermions::Vector{Dict} = Dict[]
end

@kwdef mutable struct BiasParameters
    biases::Vector{Dict} = Dict[]
    recycle::Bool = true
    rhostout_for_cv::Float64 = 0.12
    weight_type::Vector{String} = ["tiwari"]
    starting_Q::Union{Nothing,Vector{Int64}} = nothing
    usebiases::Vector{String} = [""]
    # tempering specific
    tempering_enabled::Bool = false
    numinstances::Int64 = 1
    swap_every::Int64 = 1
    non_metadynamics_updates::Int64 = 1
    measure_on_all::Bool = false
end

@kwdef mutable struct HMCParameters
    levels::Vector{Dict} = Dict[]
    hmc_trajectory::Float64 = 1
    hmc_friction::Float64 = 0.0
    hmc_rafriction::Float64 = 1.0
    hmc_numsmear_gauge::Int64 = 0
    hmc_numsmear_fermion::Int64 = 0
    hmc_rhostout_gauge::Float64 = 0.0
    hmc_rhostout_fermion::Float64 = 0.0
    hmc_logging::Bool = true
end

@kwdef mutable struct GradientFlowParameters
    flow_integrator::String = "none"
    flow_num::Int64 = 0
    flow_tf::Float64 = 0.0
    flow_steps::Int64 = 0
    flow_measure_every::Union{Int64,Vector{Int64}} = 1
end

@kwdef mutable struct MeasurementParameters
    measurements::Vector{Dict} = Dict[]
    measurements_with_flow::Vector{Dict} = Dict[]
end