Tatooine
unary_operation.h
Go to the documentation of this file.
1#ifndef TATOOINE_TENSOR_OPERATIONS_UNARY_OPERATION_H
2#define TATOOINE_TENSOR_OPERATIONS_UNARY_OPERATION_H
3//==============================================================================
5//==============================================================================
6namespace tatooine {
7//==============================================================================
8template <dynamic_tensor Tensor>
10 Tensor const& t) {
11 using TOut = std::invoke_result_t<decltype(op), tatooine::value_type<Tensor>>;
12 auto t_out = tensor<TOut>::zeros(t.dimensions());
13 for (std::size_t i = 0; i < t.data().size(); ++i) {
14 t_out.data()[i] = op(t.data()[i]);
15 }
16 return t_out;
17}
18//------------------------------------------------------------------------------
19template <typename Op, static_tensor Tensor, std::size_t... Seq>
20constexpr auto unary_operation(Op&& op, Tensor const& t,
21 std::index_sequence<Seq...> /*seq*/) {
22 using TOut = std::invoke_result_t<Op, typename Tensor::value_type>;
23 auto constexpr rank = Tensor::rank();
24 auto t_out = [&] {
25 if constexpr (rank == 1) {
26 return vec<TOut, Tensor::dimension(Seq)...>{};
27 } else if constexpr (rank == 2) {
28 return mat<TOut, Tensor::dimension(Seq)...>{};
29 } else {
30 return tensor<TOut, Tensor::dimension(Seq)...>{};
31 };
32 }();
33 t_out.for_indices([&](auto const... is) {
34 t_out(is...) = op(t(is...));
35 });
36 return t_out;
37}
38//------------------------------------------------------------------------------
39template <typename Op, static_tensor Tensor>
40constexpr auto unary_operation(Op&& op, Tensor const& t) {
41 return unary_operation(std::forward<Op>(op), t,
42 std::make_index_sequence<Tensor::rank()>{});
43}
44//==============================================================================
45} // namespace tatooine
46//==============================================================================
47#endif
constexpr auto data() -> ValueType *
Definition: static_multidim_array.h:260
Definition: concepts.h:121
Definition: algorithm.h:6
typename value_type_impl< T >::type value_type
Definition: type_traits.h:280
tensor< real_number, Dimensions... > Tensor
Definition: tensor.h:184
constexpr auto unary_operation(invocable< tatooine::value_type< Tensor > > auto &&op, Tensor const &t)
Definition: unary_operation.h:9
auto size(vec< ValueType, N > const &v)
Definition: vec.h:148
constexpr auto rank()
Definition: rank.h:10
static auto constexpr dimensions()
Definition: base_tensor.h:47
auto constexpr dimension() const
Definition: contracted_dynamic_tensor.h:36
Definition: mat.h:14
static auto constexpr rank()
Definition: base_tensor.h:41
static constexpr auto zeros()
Definition: tensor.h:144
Definition: vec.h:12