NForge
Tensor library
Loading...
Searching...
No Matches
tensor_impl.h
1#ifndef TENSOR_IMPL_H
2#define TENSOR_IMPL_H
3
4#include "nforge/core/tensor.h"
5#include "nforge/core/tensor_layout.h"
6
16public:
17 Impl() = default;
18 virtual ~Impl() = default;
19
21 virtual void fillAll(float value) = 0;
22
24 virtual void fillRand() = 0;
25
27 virtual void print() const = 0;
28
30 virtual void print(const std::vector<size_t>& position) const = 0;
31
33 virtual size_t getNumElements() const = 0;
34
36 virtual Tensor::Shape getShape() const = 0;
37
39 virtual std::vector<float> toVector() const = 0;
40
42 virtual std::string toString() const = 0;
43
45 virtual std::unique_ptr<Tensor::Impl> clone() const = 0;
46
50 virtual void copyFromHost(const float* data, size_t count) = 0;
51
53 virtual void set(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
54 const TensorLayout& rhsLayout) = 0;
55
57 virtual bool compare(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
58 const TensorLayout& rhsLayout) const = 0;
59
61 virtual std::unique_ptr<Tensor::Impl> add(const TensorLayout& lhsLayout,
62 const Tensor::Impl* rhsImpl,
63 const TensorLayout& rhsLayout,
64 const TensorLayout& outLayout) const = 0;
65
67 virtual std::unique_ptr<Tensor::Impl> sub(const TensorLayout& lhsLayout,
68 const Tensor::Impl* rhsImpl,
69 const TensorLayout& rhsLayout,
70 const TensorLayout& outLayout) const = 0;
71
73 virtual std::unique_ptr<Tensor::Impl> mul(const TensorLayout& lhsLayout,
74 const Tensor::Impl* rhsImpl,
75 const TensorLayout& rhsLayout,
76 const TensorLayout& outLayout) const = 0;
77
79 virtual std::unique_ptr<Tensor::Impl> div(const TensorLayout& lhsLayout,
80 const Tensor::Impl* rhsImpl,
81 const TensorLayout& rhsLayout,
82 const TensorLayout& outLayout) const = 0;
83
85 virtual void iadd(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
86 const TensorLayout& rhsLayout) = 0;
87
89 virtual void isub(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
90 const TensorLayout& rhsLayout) = 0;
91
93 virtual void imul(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
94 const TensorLayout& rhsLayout) = 0;
95
97 virtual void idiv(const TensorLayout& lhsLayout, const Tensor::Impl* rhsImpl,
98 const TensorLayout& rhsLayout) = 0;
99
101 virtual std::unique_ptr<Tensor::Impl> sum(const TensorLayout& layout,
102 const TensorLayout& blockLayout,
103 const TensorLayout& outLayout) const = 0;
104
106 virtual std::unique_ptr<Tensor::Impl> min(const TensorLayout& layout,
107 const TensorLayout& blockLayout,
108 const TensorLayout& outLayout) const = 0;
109
111 virtual std::unique_ptr<Tensor::Impl> max(const TensorLayout& layout,
112 const TensorLayout& blockLayout,
113 const TensorLayout& outLayout) const = 0;
114
116 virtual std::unique_ptr<Tensor::Impl> prod(const TensorLayout& layout,
117 const TensorLayout& blockLayout,
118 const TensorLayout& outLayout) const = 0;
119
121 virtual std::unique_ptr<Tensor::Impl> norm(const TensorLayout& layout) const = 0;
122
126 virtual std::unique_ptr<Tensor::Impl> all(const TensorLayout& layout,
127 const TensorLayout& blockLayout,
128 const TensorLayout& outLayout) const = 0;
129
133 virtual std::unique_ptr<Tensor::Impl> any(const TensorLayout& layout,
134 const TensorLayout& blockLayout,
135 const TensorLayout& outLayout) const = 0;
136
143 virtual std::unique_ptr<Tensor::Impl> matmul(const TensorLayout& lhsLayout,
144 const Tensor::Impl* rhsImpl,
145 const TensorLayout& rhsLayout,
146 const TensorLayout& outLayout, size_t batch,
147 size_t m, size_t k, size_t p) const = 0;
148
149
151 virtual std::unique_ptr<Tensor::Impl> equal(const TensorLayout& lhsLayout,
152 const Tensor::Impl* rhsImpl,
153 const TensorLayout& rhsLayout,
154 const TensorLayout& outLayout) const = 0;
155
157 virtual std::unique_ptr<Tensor::Impl> notEqual(const TensorLayout& lhsLayout,
158 const Tensor::Impl* rhsImpl,
159 const TensorLayout& rhsLayout,
160 const TensorLayout& outLayout) const = 0;
161
163 virtual std::unique_ptr<Tensor::Impl> less(const TensorLayout& lhsLayout,
164 const Tensor::Impl* rhsImpl,
165 const TensorLayout& rhsLayout,
166 const TensorLayout& outLayout) const = 0;
167
169 virtual std::unique_ptr<Tensor::Impl> lessEqual(const TensorLayout& lhsLayout,
170 const Tensor::Impl* rhsImpl,
171 const TensorLayout& rhsLayout,
172 const TensorLayout& outLayout) const = 0;
173
175 virtual std::unique_ptr<Tensor::Impl> greater(const TensorLayout& lhsLayout,
176 const Tensor::Impl* rhsImpl,
177 const TensorLayout& rhsLayout,
178 const TensorLayout& outLayout) const = 0;
179
181 virtual std::unique_ptr<Tensor::Impl> greaterEqual(const TensorLayout& lhsLayout,
182 const Tensor::Impl* rhsImpl,
183 const TensorLayout& rhsLayout,
184 const TensorLayout& outLayout) const = 0;
185
187 virtual std::unique_ptr<Tensor::Impl> isClose(const TensorLayout& lhsLayout,
188 const Tensor::Impl* rhsImpl,
189 const TensorLayout& rhsLayout,
190 const TensorLayout& outLayout,
191 float tolerance) const = 0;
192};
193
194#endif // TENSOR_IMPL_H
Definition tensor_impl.h:15
virtual std::unique_ptr< Tensor::Impl > clone() const =0
Deep copies this implementation.
virtual std::unique_ptr< Tensor::Impl > notEqual(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const =0
Elementwise not equal. Returns a tensor of 0.0 / 1.0 with outLayout.
virtual std::string toString() const =0
Returns a string representation of the data.
virtual std::unique_ptr< Tensor::Impl > sum(const TensorLayout &layout, const TensorLayout &blockLayout, const TensorLayout &outLayout) const =0
Reduces dimensions [dim, rank) by summation. Output with outLayout.
virtual std::unique_ptr< Tensor::Impl > min(const TensorLayout &layout, const TensorLayout &blockLayout, const TensorLayout &outLayout) const =0
Reduces dimensions [dim, rank) by taking the minimum. Output with outLayout.
virtual std::unique_ptr< Tensor::Impl > equal(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const =0
Elementwise equal. Returns a tensor of 0.0 / 1.0 with outLayout.
virtual std::unique_ptr< Tensor::Impl > sub(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const =0
Elementwise subtraction. Returns a new Impl with the result with outLayout.
virtual std::unique_ptr< Tensor::Impl > less(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const =0
Elementwise less than. Returns a tensor of 0.0 / 1.0 with outLayout.
virtual void imul(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout)=0
In-place elementwise multiplication. Modifies lhsLayout in place.
virtual void fillAll(float value)=0
Fills all elements with value.
virtual size_t getNumElements() const =0
Returns the total number of elements.
virtual std::unique_ptr< Tensor::Impl > all(const TensorLayout &layout, const TensorLayout &blockLayout, const TensorLayout &outLayout) const =0
virtual std::unique_ptr< Tensor::Impl > lessEqual(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const =0
Elementwise less or equal. Returns a tensor of 0.0 / 1.0 with outLayout.
virtual std::unique_ptr< Tensor::Impl > any(const TensorLayout &layout, const TensorLayout &blockLayout, const TensorLayout &outLayout) const =0
virtual std::unique_ptr< Tensor::Impl > prod(const TensorLayout &layout, const TensorLayout &blockLayout, const TensorLayout &outLayout) const =0
Reduces dimensions [dim, rank) by taking the product. Output with outLayout.
virtual std::unique_ptr< Tensor::Impl > greater(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const =0
Elementwise greater than. Returns a tensor of 0.0 / 1.0 with outLayout.
virtual std::vector< float > toVector() const =0
Copies all elements into a flat vector (row-major order).
virtual std::unique_ptr< Tensor::Impl > norm(const TensorLayout &layout) const =0
L2 norm of the tensor described by layout.
virtual void idiv(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout)=0
In-place elementwise division. Modifies lhsLayout in place.
virtual bool compare(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout) const =0
Returns true if the data with lhsLayout matches rhsImpl with rhsLayout.
virtual void iadd(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout)=0
In-place elementwise addition. Modifies lhsLayout in place.
virtual std::unique_ptr< Tensor::Impl > div(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const =0
Elementwise division. Returns a new Impl with the result with outLayout.
virtual void copyFromHost(const float *data, size_t count)=0
virtual std::unique_ptr< Tensor::Impl > mul(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const =0
Elementwise multiplication. Returns a new Impl with the result with outLayout.
virtual std::unique_ptr< Tensor::Impl > greaterEqual(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const =0
Elementwise greater or equal. Returns a tensor of 0.0 / 1.0 with outLayout.
virtual void print() const =0
Prints the entire tensor to stdout.
virtual std::unique_ptr< Tensor::Impl > add(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout) const =0
Elementwise addition. Returns a new Impl with the result with outLayout.
virtual void isub(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout)=0
In-place elementwise subtraction. Modifies lhsLayout in place.
virtual std::unique_ptr< Tensor::Impl > isClose(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout, float tolerance) const =0
Elementwise closeness within tolerance. Returns a tensor of 0.0 / 1.0 with outLayout.
virtual void set(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout)=0
Copies data from rhsImpl with rhsLayout into this with lhsLayout.
virtual std::unique_ptr< Tensor::Impl > max(const TensorLayout &layout, const TensorLayout &blockLayout, const TensorLayout &outLayout) const =0
Reduces dimensions [dim, rank) by taking the maximum. Output with outLayout.
virtual Tensor::Shape getShape() const =0
Returns the tensor shape.
virtual std::unique_ptr< Tensor::Impl > matmul(const TensorLayout &lhsLayout, const Tensor::Impl *rhsImpl, const TensorLayout &rhsLayout, const TensorLayout &outLayout, size_t batch, size_t m, size_t k, size_t p) const =0
virtual void print(const std::vector< size_t > &position) const =0
Prints the block starting at position to stdout.
virtual void fillRand()=0
Fills all elements with random values in [-1, 1].
Definition tensor_shape.h:15
Definition tensor_layout.h:15