summaryrefslogtreecommitdiffstats
path: root/eval
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2020-06-12 10:27:46 +0000
committerHåvard Pettersen <havardpe@oath.com>2020-06-12 10:28:33 +0000
commit0d3bde8c4714dfb9c81837d837d61fc829b7eff1 (patch)
tree79dcc9e09e4c69d1a10fca198cb6361ebe8fe810 /eval
parentcdbf81bec26eaae36e40d56cb4dd072e39392943 (diff)
use common apply loops
Diffstat (limited to 'eval')
-rw-r--r--eval/src/vespa/eval/eval/inline_operation.h23
-rw-r--r--eval/src/vespa/eval/tensor/dense/dense_number_join_function.cpp9
-rw-r--r--eval/src/vespa/eval/tensor/dense/dense_simple_join_function.cpp20
-rw-r--r--eval/src/vespa/eval/tensor/dense/dense_simple_map_function.cpp9
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)));
}