/
optbs.jl
115 lines (96 loc) · 4.19 KB
/
optbs.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# This file is a part of SimilaritySearch.jl
export BeamSearchSpace
"""
BeamSearchSpace(; bsize, Δ, bsize_scale, Δ_scale)
Define search space for beam search autotuning
"""
@with_kw struct BeamSearchSpace <: AbstractSolutionSpace
bsize = 8:8:64
Δ = [0.8, 0.9, 1.0, 1.1] # this really depends on the dataset, be careful
bsize_scale = (s=1.5, p1=0.8, p2=0.8, lower=2, upper=512) # all these are reasonably values
Δ_scale = (s=1.07, p1=0.8, p2=0.8, lower=0.6, upper=2.0) # that should work in most datasets
end
Base.hash(c::BeamSearch) = hash((c.bsize, c.Δ, c.maxvisits))
Base.isequal(a::BeamSearch, b::BeamSearch) = a.bsize == b.bsize && a.Δ == b.Δ && a.maxvisits == b.maxvisits
Base.eltype(::BeamSearchSpace) = BeamSearch
Base.rand(space::BeamSearchSpace) = BeamSearch(bsize=rand(space.bsize), Δ=rand(space.Δ))
function combine(a::BeamSearch, b::BeamSearch)
bsize = ceil(Int, (a.bsize + b.bsize) / 2)
Δ = (a.Δ + b.Δ) / 2
BeamSearch(; bsize, Δ)
end
function mutate(space::BeamSearchSpace, c::BeamSearch, iter)
bsize = SearchModels.scale(c.bsize; space.bsize_scale...)
Δ = SearchModels.scale(c.Δ; space.Δ_scale...)
BeamSearch(; bsize, Δ)
end
mutable struct OptimizeParameters <: Callback
kind::ErrorFunction
initialpopulation
params::SearchParams
ksearch::Int32
numqueries::Int32
space::BeamSearchSpace
verbose::Bool
end
"""
OptimizeParameters(kind=MinRecall(0.9);
initialpopulation=16,
maxiters=12,
bsize=4,
tol=-1.0,
ksearch=10,
numqueries=32,
verbose=false,
params=SearchParams(; maxpopulation=initialpopulation, bsize, mutbsize=4bsize, crossbsize=2bsize, tol, maxiters, verbose),
space::BeamSearchSpace=BeamSearchSpace()
)
Creates a hyperoptimization callback using the given parameters
# Arguments
- `kind`: The kind of error function, e.g. `MinRecall(0.9)`.
- `hints`: How search hints should be computed.
- `initialpopulation`: Optimization argument that determines the initial number of configurations.
- `maxiters`: Optimization argument that determines the number of iterations.
- `bsize`: Optimization argument that determines how many top configurations are allowed to mutate and cross.
- `tol`: Optimization argument that determines the minimal tolerance improvement to stop the optimization.
- `params`: The `SearchParams` arguments (if separated optimization arguments are not enough)
- `ksearch`: The number of neighbors to be retrived by the optimization process.
- `numqueries`: The number of queries to be performed during the optimization process.
- `space`: The cofiguration search space
# See more
- See [`BeamSearchSpace`](@ref)
- [`SearchParams` arguments of `SearchModels.jl`](https://github.com/sadit/SearchModels.jl)
for more details
"""
function OptimizeParameters(kind=MinRecall(0.9);
initialpopulation=16,
maxiters=12,
bsize=4,
tol=-1.0,
ksearch=10,
numqueries=32,
verbose=false,
params=SearchParams(; maxpopulation=initialpopulation, bsize, mutbsize=4bsize, crossbsize=2bsize, tol, maxiters, verbose),
space::BeamSearchSpace=BeamSearchSpace()
)
OptimizeParameters(kind, initialpopulation, params, ksearch, numqueries, space, verbose)
end
optimization_space(index::SearchGraph) = BeamSearchSpace()
function setconfig!(bs::BeamSearch, index::SearchGraph, perf)
index.search_algo.bsize = bs.bsize
index.search_algo.Δ = bs.Δ
index.search_algo.maxvisits = ceil(Int, 2perf.visited[end])
end
function runconfig(bs::BeamSearch, index::SearchGraph, ctx::SearchGraphContext, q, res::KnnResult)
search(bs, index, ctx, q, res, index.hints; maxvisits = 4index.search_algo.maxvisits)
# search(bs, index, q, res, index.hints, caches)
end
"""
execute_callback(index::SearchGraph, context::SearchGraphContext, opt::OptimizeParameters)
SearchGraph's callback for adjunting search parameters
"""
function execute_callback(index::SearchGraph, context::SearchGraphContext, opt::OptimizeParameters)
queries = nothing
optimize_index!(index, context, opt.kind; opt.space,
queries, opt.ksearch, opt.numqueries, opt.initialpopulation, opt.verbose, opt.params)
end