/
sequential-exhaustive.jl
59 lines (46 loc) · 1.79 KB
/
sequential-exhaustive.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
# This file is a part of SimilaritySearch.jl
import Base: push!
export ExhaustiveSearch, search
"""
ExhaustiveSearch(dist::SemiMetric, db::AbstractVector)
Solves queries evaluating `dist` for the query and all elements in the dataset
"""
struct ExhaustiveSearch{DistanceType<:SemiMetric,DataType<:AbstractDatabase} <: AbstractSearchIndex
dist::DistanceType
db::DataType
end
ExhaustiveSearch(dist::SemiMetric, db::AbstractVector) = ExhaustiveSearch(dist, convert(AbstractDatabase, db))
ExhaustiveSearch(dist::SemiMetric, db::Matrix) = ExhaustiveSearch(dist, convert(AbstractDatabase, db))
function ExhaustiveSearch(; dist=SqL2Distance(), db=VectorDatabase{Float32}())
ExhaustiveSearch(dist, db)
end
getcontext(index::ExhaustiveSearch) = DEFAULT_CONTEXT[]
Base.copy(seq::ExhaustiveSearch; dist=seq.dist, db=seq.db) = ExhaustiveSearch(dist, db)
function push_item!(seq::ExhaustiveSearch, context::GenericContext, u)
push_item!(seq.db, u)
context.logger !== nothing && LOG(context.logger, push_item!, seq, length(seq))
seq
end
function append_items!(seq::ExhaustiveSearch, context::GenericContext, u::AbstractDatabase)
sp = length(seq)
append_items!(seq.db, u)
ep = length(seq)
context.logger !== nothing && LOG(context.logger, append_items!, seq, sp, ep, ep)
seq
end
function index!(seq::ExhaustiveSearch, ctx::AbstractContext)
# do nothing
seq
end
"""
search(seq::ExhaustiveSearch, context::AbstractContext, q, res::KnnResult)
Solves the query evaluating all items in the given query.
"""
function search(seq::ExhaustiveSearch, ctx::AbstractContext, q, res::KnnResult)
dist = distance(seq)
@inbounds for i in eachindex(seq)
d = evaluate(dist, database(seq, i), q)
push_item!(res, i, d)
end
SearchResult(res, length(seq))
end