# Handling solver parameters elegantly in Julia

**URL:** <https://discourse.julialang.org/t/handling-solver-parameters-elegantly-in-julia/5269>\
**Category:** General Usage\
**Tags:** question\
**Created:** [August 8, 2017, 1:24am UTC](https://discourse.julialang.org/t/handling-solver-parameters-elegantly-in-julia/5269 "2017-08-08T01:24:09Z")\
**Posts on this page:** 3\
**Page:** 2

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [August 22, 2017, 7:07am UTC](https://discourse.julialang.org/t/handling-solver-parameters-elegantly-in-julia/5269/21 "2017-08-22T07:07:34Z")

</div>

You were missing a `;` when calling the `Param` keyword constructor. This now runs for me:

```julia
using Parameters: @with_kw
using NamedTuples

@with_kw struct Param
    mean = 0.
    variance = 1.
end

struct Solver
    params::Dict{Symbol,Param}
end

function Solver(params...)
    # build Dict for inner ctor
    dict = Dict{Symbol,Param}()
    
    for (varname, varparams) in params
        # varparams is a NamedTuple
        d = Dict(k => v for (k,v) in zip(fieldnames(typeof(varparams)), varparams))
        
        push!(dict, varname => Param(; d...))
    end

    Solver(dict)
end

solver = Solver(
  :var1 => @NT(mean=1.),
  :var2 => @NT(variance=2)
)

```

Note that your lines above are still not an MWE, because `GaussianVariogram` is not defined, and `variogram` is not a field `Param` knows about. I of course modified it accordingly, but when you are asking for help with code, posting a **self-contained** MWE in a single post will get you replies much faster.

---

<div class="post-metadata">

**Author:** ![juliohm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/juliohm/32/215266_2.png) [@juliohm](https://discourse.julialang.org/u/juliohm)\
**Post date:** [August 22, 2017, 2:35pm UTC](https://discourse.julialang.org/t/handling-solver-parameters-elegantly-in-julia/5269/22 "2017-08-22T14:35:49Z")

</div>

Thank you @Tamas_Papp, I always forget the ; before the kwargs, below is an even cleaner version:

```julia
function Solver(params...)
  dict = Dict{Symbol,Param}()

  for (varname, varparams) in params
    kwargs = [k => v for (k,v) in zip(keys(varparams), varparams)]
    push!(dict, varname => Param(; kwargs...))
  end

  Solver(dict)
end

```

---

<div class="post-metadata">

**Author:** ![juliohm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/juliohm/32/215266_2.png) [@juliohm](https://discourse.julialang.org/u/juliohm)\
**Post date:** [August 22, 2017, 3:31pm UTC](https://discourse.julialang.org/t/handling-solver-parameters-elegantly-in-julia/5269/23 "2017-08-22T15:31:44Z")

</div>

@Tamas_Papp, regarding your previous comment about the inner constructor, I don’t know what is happening, but if I comment it out, I get a strange error:

```julia
MethodError: Cannot `convert` an object of type Pair{Symbol,NamedTuples._NT_variogram{GeoStats.GaussianVariogram{Float64,Float64,GeoStats.EuclideanDistance}}} to an object of type Dict{Symbol,GeoStats.KrigParam}
This may have arisen from a call to the constructor Dict{Symbol,GeoStats.KrigParam}(...),
since type constructors fall back to convert methods.

```

This is the line that I am commenting out: [https://github.com/juliohm/GeoStats.jl/blob/master/src/solvers/kriging\_solver.jl#L77](https://github.com/juliohm/GeoStats.jl/blob/master/src/solvers/kriging_solver.jl#L77)

[Previous page](https://discourse.julialang.org/t/handling-solver-parameters-elegantly-in-julia/5269.md?page=1)
