diff options
author | Håvard Pettersen <havardpe@oath.com> | 2020-06-12 10:27:46 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2020-06-12 10:28:33 +0000 |
commit | 0d3bde8c4714dfb9c81837d837d61fc829b7eff1 (patch) | |
tree | 79dcc9e09e4c69d1a10fca198cb6361ebe8fe810 /eval | |
parent | cdbf81bec26eaae36e40d56cb4dd072e39392943 (diff) |
use common apply loops
Diffstat (limited to 'eval')
4 files changed, 28 insertions, 33 deletions
diff --git a/eval/src/vespa/eval/eval/inline_operation.h b/eval/src/vespa/eval/eval/inline_operation.h index 493de9ea56c..71e81b223e2 100644 --- a/eval/src/vespa/eval/eval/inline_operation.h +++ b/eval/src/vespa/eval/eval/inline_operation.h @@ -64,4 +64,27 @@ struct TypifyOp2 { //----------------------------------------------------------------------------- +template <typename A, typename OP1> +void apply_op1_vec(A *dst, const A *src, size_t n, OP1 &&f) { + for (size_t i = 0; i < n; ++i) { + dst[i] = f(src[i]); + } +} + +template <typename D, typename A, typename B, typename OP2> +void apply_op2_vec_num(D *dst, const A *a, B b, size_t n, OP2 &&f) { + for (size_t i = 0; i < n; ++i) { + dst[i] = f(a[i], b); + } +} + +template <typename D, typename A, typename B, typename OP2> +void apply_op2_vec_vec(D *dst, const A *a, const B *b, size_t n, OP2 &&f) { + for (size_t i = 0; i < n; ++i) { + dst[i] = f(a[i], b[i]); + } +} + +//----------------------------------------------------------------------------- + } diff --git a/eval/src/vespa/eval/tensor/dense/dense_number_join_function.cpp b/eval/src/vespa/eval/tensor/dense/dense_number_join_function.cpp index a28c8150d59..925627c5684 100644 --- a/eval/src/vespa/eval/tensor/dense/dense_number_join_function.cpp +++ b/eval/src/vespa/eval/tensor/dense/dense_number_join_function.cpp @@ -29,13 +29,6 @@ using State = eval::InterpretedFunction::State; namespace { -template <typename CT, typename Fun> -void apply_fun_1_to_n(CT *dst, const CT *pri, CT sec, size_t n, const Fun &fun) { - for (size_t i = 0; i < n; ++i) { - dst[i] = fun(pri[i], sec); - } -} - template <typename CT, bool inplace> ArrayRef<CT> make_dst_cells(ConstArrayRef<CT> src_cells, Stash &stash) { if (inplace) { @@ -53,7 +46,7 @@ void my_number_join_op(State &state, uint64_t param) { CT number = state.peek(swap ? 1 : 0).as_double(); auto src_cells = DenseTensorView::typify_cells<CT>(tensor); auto dst_cells = make_dst_cells<CT, inplace>(src_cells, state.stash); - apply_fun_1_to_n(dst_cells.begin(), src_cells.begin(), number, dst_cells.size(), my_op); + apply_op2_vec_num(dst_cells.begin(), src_cells.begin(), number, dst_cells.size(), my_op); if (inplace) { state.pop_pop_push(tensor); } else { diff --git a/eval/src/vespa/eval/tensor/dense/dense_simple_join_function.cpp b/eval/src/vespa/eval/tensor/dense/dense_simple_join_function.cpp index c358c9d618d..5f8fbcac9bb 100644 --- a/eval/src/vespa/eval/tensor/dense/dense_simple_join_function.cpp +++ b/eval/src/vespa/eval/tensor/dense/dense_simple_join_function.cpp @@ -53,20 +53,6 @@ struct JoinParams { : result_type(result_type_in), factor(factor_in), function(function_in) {} }; -template <typename OCT, typename PCT, typename SCT, typename Fun> -void apply_fun_1_to_n(OCT *dst, const PCT *pri, SCT sec, size_t n, const Fun &fun) { - for (size_t i = 0; i < n; ++i) { - dst[i] = fun(pri[i], sec); - } -} - -template <typename OCT, typename PCT, typename SCT, typename Fun> -void apply_fun_n_to_n(OCT *dst, const PCT *pri, const SCT *sec, size_t n, const Fun &fun) { - for (size_t i = 0; i < n; ++i) { - dst[i] = fun(pri[i], sec[i]); - } -} - template <typename OCT, bool pri_mut, typename PCT> ArrayRef<OCT> make_dst_cells(ConstArrayRef<PCT> pri_cells, Stash &stash) { if constexpr (pri_mut && std::is_same<PCT,OCT>::value) { @@ -88,12 +74,12 @@ void my_simple_join_op(State &state, uint64_t param) { auto sec_cells = DenseTensorView::typify_cells<SCT>(state.peek(swap ? 1 : 0)); auto dst_cells = make_dst_cells<OCT, pri_mut>(pri_cells, state.stash); if (overlap == Overlap::FULL) { - apply_fun_n_to_n(dst_cells.begin(), pri_cells.begin(), sec_cells.begin(), dst_cells.size(), my_op); + apply_op2_vec_vec(dst_cells.begin(), pri_cells.begin(), sec_cells.begin(), dst_cells.size(), my_op); } else if (overlap == Overlap::OUTER) { size_t offset = 0; size_t factor = params.factor; for (SCT cell: sec_cells) { - apply_fun_1_to_n(dst_cells.begin() + offset, pri_cells.begin() + offset, cell, factor, my_op); + apply_op2_vec_num(dst_cells.begin() + offset, pri_cells.begin() + offset, cell, factor, my_op); offset += factor; } } else { @@ -101,7 +87,7 @@ void my_simple_join_op(State &state, uint64_t param) { size_t offset = 0; size_t factor = params.factor; for (size_t i = 0; i < factor; ++i) { - apply_fun_n_to_n(dst_cells.begin() + offset, pri_cells.begin() + offset, sec_cells.begin(), sec_cells.size(), my_op); + apply_op2_vec_vec(dst_cells.begin() + offset, pri_cells.begin() + offset, sec_cells.begin(), sec_cells.size(), my_op); offset += sec_cells.size(); } } diff --git a/eval/src/vespa/eval/tensor/dense/dense_simple_map_function.cpp b/eval/src/vespa/eval/tensor/dense/dense_simple_map_function.cpp index 784d356da39..b5f46fca70c 100644 --- a/eval/src/vespa/eval/tensor/dense/dense_simple_map_function.cpp +++ b/eval/src/vespa/eval/tensor/dense/dense_simple_map_function.cpp @@ -27,13 +27,6 @@ using State = eval::InterpretedFunction::State; namespace { -template <typename CT, typename Fun> -void apply_fun_to_n(CT *dst, const CT *src, size_t n, const Fun &fun) { - for (size_t i = 0; i < n; ++i) { - dst[i] = fun(src[i]); - } -} - template <typename CT, bool inplace> ArrayRef<CT> make_dst_cells(ConstArrayRef<CT> src_cells, Stash &stash) { if (inplace) { @@ -49,7 +42,7 @@ void my_simple_map_op(State &state, uint64_t param) { auto const &child = state.peek(0); auto src_cells = DenseTensorView::typify_cells<CT>(child); auto dst_cells = make_dst_cells<CT, inplace>(src_cells, state.stash); - apply_fun_to_n(dst_cells.begin(), src_cells.begin(), dst_cells.size(), my_fun); + apply_op1_vec(dst_cells.begin(), src_cells.begin(), dst_cells.size(), my_fun); if (!inplace) { state.pop_push(state.stash.create<DenseTensorView>(child.type(), TypedCells(dst_cells))); } |