SearchSpaces.jl
Just a simple Julia package to define search spaces for, perhaps, optimization.
Installation
Open Julia (v1.7 or latest) and type the following command:
julia> ]add SearchSpaces
or
julia> import Pkg; Pkg.add("SearchSpaces")
Quick Start
The search space can be composed by other spaces. Here, you can define custom search spaces as follows:
Assume the following three search spaces:
\[\begin{matrix} X = &\{10, 20, \ldots, 50\}\\ Y = &\{\text{red},\ \text{green},\ \text{blue}\}\\ Z = &\{0, 0.1, 0.2, \ldots, 1\} \end{matrix}\]
Let us define a mixed space $X \times Y \times Z$. Here, we can proceed as follows:
julia> searchspace = MixedSpace( :X => 10:10:50, :Y => [:red, :green, :blue], :Z => 0:0.1:1 )
MixedSpace defined by 3 subspaces: X => PermutationSpace{StepRange{Int64, Int64}}(10:10:50, 1) Y => PermutationSpace{Vector{Symbol}}([:red, :green, :blue], 1) Z => PermutationSpace{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}}(0.0:0.1:1.0, 1)
Computing the cardinality
of the search space:
julia> cardinality(searchspace)
165
This can be useful to know how many items are in the search space.
Now, let's sample some random elements in the mixed space.
julia> rand(searchspace)
Dict{Symbol, Any} with 3 entries: :Z => 0.3 :X => 50 :Y => :green
To sample every element in the search space, we can use the grid sampler:
julia> collect(GridSampler(searchspace))
165-element Vector{Any}: Dict{Symbol, Any}(:Z => 0.0, :X => 10, :Y => :red) Dict{Symbol, Any}(:Z => 0.1, :X => 10, :Y => :red) Dict{Symbol, Any}(:Z => 0.2, :X => 10, :Y => :red) Dict{Symbol, Any}(:Z => 0.3, :X => 10, :Y => :red) Dict{Symbol, Any}(:Z => 0.4, :X => 10, :Y => :red) Dict{Symbol, Any}(:Z => 0.5, :X => 10, :Y => :red) Dict{Symbol, Any}(:Z => 0.6, :X => 10, :Y => :red) Dict{Symbol, Any}(:Z => 0.7, :X => 10, :Y => :red) Dict{Symbol, Any}(:Z => 0.8, :X => 10, :Y => :red) Dict{Symbol, Any}(:Z => 0.9, :X => 10, :Y => :red) ⋮ Dict{Symbol, Any}(:Z => 0.2, :X => 50, :Y => :blue) Dict{Symbol, Any}(:Z => 0.3, :X => 50, :Y => :blue) Dict{Symbol, Any}(:Z => 0.4, :X => 50, :Y => :blue) Dict{Symbol, Any}(:Z => 0.5, :X => 50, :Y => :blue) Dict{Symbol, Any}(:Z => 0.6, :X => 50, :Y => :blue) Dict{Symbol, Any}(:Z => 0.7, :X => 50, :Y => :blue) Dict{Symbol, Any}(:Z => 0.8, :X => 50, :Y => :blue) Dict{Symbol, Any}(:Z => 0.9, :X => 50, :Y => :blue) Dict{Symbol, Any}(:Z => 1.0, :X => 50, :Y => :blue)