aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/vespa/searchlib/tensor/temporary_vector_store.cpp
blob: ff07f245de40b9c025abf9ef4bba341be3bcb046 (plain) (blame)
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
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.

#include "temporary_vector_store.h"

#include <vespa/log/log.h>

LOG_SETUP(".searchlib.tensor.temporary_vector_store");

using vespalib::ConstArrayRef;
using vespalib::ArrayRef;
using vespalib::eval::CellType;
using vespalib::eval::TypedCells;

namespace search::tensor {

namespace {

template<typename FromType, typename ToType>
ConstArrayRef<ToType>
convert_cells(ArrayRef<ToType> space, TypedCells cells)
{
    assert(cells.size == space.size());
    auto old_cells = cells.typify<FromType>();
    ToType *p = space.data();
    for (FromType value : old_cells) {
        ToType conv(value);
        *p++ = conv;
    }
    return space;
}

template <typename ToType>
struct ConvertCellsSelector
{
    template <typename FromType> static auto invoke(ArrayRef<ToType> dst, TypedCells src) {
        return convert_cells<FromType, ToType>(dst, src);
    }
};

} // namespace

template <typename FloatType>
ConstArrayRef<FloatType>
TemporaryVectorStore<FloatType>::internal_convert(TypedCells cells, size_t offset) {
    LOG_ASSERT(cells.size * 2 == _tmpSpace.size());
    ArrayRef<FloatType> where(_tmpSpace.data() + offset, cells.size);
    using MyTypify = vespalib::eval::TypifyCellType;
    using MySelector = ConvertCellsSelector<FloatType>;
    ConstArrayRef<FloatType> result = vespalib::typify_invoke<1,MyTypify,MySelector>(cells.type, where, cells);
    return result;
}

template class TemporaryVectorStore<vespalib::eval::Int8Float>;
template class TemporaryVectorStore<float>;
template class TemporaryVectorStore<double>;

}