FLImaging 7.10.21.1
Tensor.h
1#pragma once
2
3#if _MSC_VER >= 1900 && defined(_M_X64)
4
5#include "ComputationalBase.h"
6
7#include <cstdint>
8#include <vector>
9#include <atomic>
10
11#include "Scalar.h"
12#include "DefinitionsAI.h"
13
14#define FL3DAI_MASTEROBJ L"@3DAI MASTEROBJ"
15
16namespace FLImaging
17{
18 namespace AI
19 {
20 #ifdef CUDNN_MODE
21 template <typename T>
22 class CCuda_Tensor_Cudnn;
23 #endif
24
25 #ifdef CUBLAS_MODE
26 template <typename T>
27 class CCuda_ComputationalGraphMatMul_Cublas;
28 #endif
29
30 template <typename T>
31 class FL_EXPORT CTensor : public CComputationalBase<T>
32 {
33 public:
34 CTensor();
35
36 CTensor(const CTensor<float >& tsr, bool bDeepCopy = true);
37 CTensor(const CTensor<double>& tsr, bool bDeepCopy = true);
38
39 CTensor(const T& tScalar);
40 CTensor(const std::vector<int64_t>& vctShapeDesc);
41 CTensor(const std::initializer_list<int64_t>& ilShapeDesc);
42
43 virtual ~CTensor();
44
45 static const CResult GetClassNumFromImages(const Base::CFLImage* pFli, Base::CFLArray<int32_t>& flaClassNum);
46
47 virtual const CResult Load(const wchar_t* pWcsFileName) override;
48 virtual const CResult Save(const wchar_t* pWcsFileName) override;
49
50 virtual const CResult GetBinaryData(Base::CFLData& fldBinary, bool bSuperClass = false, int32_t i32Version = -1, bool bDumpMode = false) const override;
51 virtual const CResult GetBinaryData(Base::CFLData* pFldBinary, bool bSuperClass = false, int32_t i32Version = -1, bool bDumpMode = false) const override;
52
53 virtual const CResult SetBinaryData(const Base::CFLData& fldBinary, int64_t* pI64Offset = nullptr) override;
54 virtual const CResult SetBinaryData(const Base::CFLData* pFldBinary, int64_t* pI64Offset = nullptr) override;
55
56 virtual const CResult Clear() override;
57
58 virtual const CResult CopyHostToDevice();
59 virtual const CResult CopyDeviceToHost();
60
61 virtual const CResult SetMemory(const T* pTMemory, const std::vector<int64_t>& vctShape, bool bOrderByDesc = true, bool bDeepCopy = false);
62 virtual const CResult SetMemory(const T* pTMemory, const std::initializer_list<int64_t>& vctShape, bool bOrderByDesc = true, bool bDeepCopy = false);
63
64 virtual const CResult SetDeviceMemory(const T* pTMemory, const std::vector<int64_t>& vctShape, bool bOrderByDesc = true, bool bDeepCopy = false);
65 virtual const CResult SetDeviceMemory(const T* pTMemory, const std::initializer_list<int64_t>& vctShape, bool bOrderByDesc = true, bool bDeepCopy = false);
66
67 virtual const T* GetMemory() const;
68 virtual const T* GetDeviceMemory() const;
69
70 virtual bool IsAutoDestroyCPUMemoryEnabled() const;
71 virtual bool IsAutoDestroyDeviceMemoryEnabled() const;
72
73 virtual const CResult Assign(const Base::CFLImage& fli, bool bNormalize = true);
74 virtual const CResult Assign(const Base::CFLImage* pFli, bool bNormalize = true);
75 virtual const CResult Assign(const CTensor<float>& tsr, bool bDeepCopy = true);
76 virtual const CResult Assign(const CTensor<float>* pTsr, bool bDeepCopy = true);
77 virtual const CResult Assign(const CTensor<double>& tsr, bool bDeepCopy = true);
78 virtual const CResult Assign(const CTensor<double>* pTsr, bool bDeepCopy = true);
79 virtual const CResult Assign(const T tScalar);
80 virtual const CResult Assign(const CComputationalBase<T>& cb);
81 virtual const CResult Assign(const Base::CFLImage* pFli, const std::vector<int64_t>& vctNewSize, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
82 virtual const CResult Assign(const Base::CFLImage& fli, const std::vector<int64_t>& vctNewSize, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
83 virtual const CResult Assign(const Base::CFLImage* pFli, const std::initializer_list<int64_t>& ilNewSize, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
84 virtual const CResult Assign(const Base::CFLImage& fli, const std::initializer_list<int64_t>& ilNewSize, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
85
86 virtual const CResult Create(const std::vector<int64_t>& vctShape, bool bOrderByDesc = true, bool bDeviceAllocation = true);
87 virtual const CResult Create(const std::initializer_list<int64_t>& ilShape, bool bOrderByDesc = true, bool bDeviceAllocation = true);
88 virtual const CResult Create(const Base::CFLImage& fli, bool bNormalize = true, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
89 virtual const CResult Create(const Base::CFLImage* pFli, bool bNormalize = true, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
90 virtual const CResult Create(const Base::CFLImage* pFli, const std::vector<int64_t>& vctNewSize, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
91 virtual const CResult Create(const Base::CFLImage& fli, const std::vector<int64_t>& vctNewSize, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
92 virtual const CResult Create(const Base::CFLImage* pFli, const std::initializer_list<int64_t>& ilNewSize, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
93 virtual const CResult Create(const Base::CFLImage& fli, const std::initializer_list<int64_t>& ilNewSize, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
94
95 virtual const CResult Append(const Base::CFLImage* pFli, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
96 virtual const CResult Append(const Base::CFLImage& fli, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
97
98 virtual const CResult SetLabels(Foundation::CFLFigureArray& flfaSourceLabel, bool bDeepCopy = false);
99 virtual const CResult SetLabels(Foundation::CFLFigureArray* pFlfaSourceLabel, bool bDeepCopy = false);
100 virtual Foundation::CFLFigureArray* GetLabels() const;
101 virtual const CResult SetObjectRegions(Foundation::CFLFigureArray& flfaSourceObjectRegions, bool bDeepCopy = false);
102 virtual const CResult SetObjectRegions(Foundation::CFLFigureArray* pFlfaSourceObjectRegions, bool bDeepCopy = false);
103 virtual Foundation::CFLFigureArray* GetObjectRegions() const;
104 virtual const CResult SetOriginBoundaryLabels(Foundation::CFLFigureArray& flfaSourceLabel, bool bDeepCopy = false);
105 virtual const CResult SetOriginBoundaryLabels(Foundation::CFLFigureArray* pFlfaSourceLabel, bool bDeepCopy = false);
106 virtual Foundation::CFLFigureArray* GetOriginBoundaryLabels() const;
107
108 virtual const CResult EnableObjectAugmentationRegionMode(bool bEnable);
109 virtual bool IsObjectAugmentationRegionModeEnabled() const;
110
111 virtual const CResult MakeMiniBatch(const CTensor<T>& tsrSrc, int64_t i64Start, int64_t i64End);
112
113 virtual const CResult CreateDeviceMemory();
114 virtual const CResult ClearDeviceMemory();
115
116 virtual const CResult Reshape(const std::vector<int64_t>& vctAxes = { }, bool bOrderByDesc = true);
117
118 virtual const CResult FillZero();
119 virtual const CResult Fill(T tFillValue);
120 virtual const CResult FillRandom(T tRangeMin, T tRangeMax);
121 virtual const CResult FillUniformRandom(T tRangeMin, T tRangeMax);
122 virtual const CResult FillNormalRandom(T tMean = 0, T tStdev = 1);
123 virtual const CResult FillSeries(T tStartValue, T tInterval);
124 virtual const CResult FillXavier();
125 virtual const CResult FillHe();
126 virtual const CResult FillHe(int64_t i64InputSize);
127
128 virtual const CResult ConvertFloatToUint(int32_t i32Depth, CTensor<T>* pTsrResult = nullptr);
129 virtual const CResult ConvertFloatToUint(int32_t i32Depth, uint8_t* pU8Result);
130
131 virtual const CResult ConvertUintToFloat(int32_t i32Depth, CTensor<T>* pTsrResult = nullptr);
132 virtual const CResult ConvertUintToFloat(int32_t i32Depth, T* pTResult);
133
134 virtual CTensor<T>& Evaluate() override;
135 virtual CTensor<T>& Forward() override;
136 virtual CTensor<T>* Backward() override;
137
138 virtual int64_t GetRequiredDedicatedMemory(bool bTraining = false, bool bRecursively = true, int64_t i64BatchSize = 1) const override;
139 virtual int64_t GetRequiredTemporaryMemory(bool bTraining = false, bool bRecursively = true, int64_t i64BatchSize = 1, int64_t i64MemoryIndex = 0) const override;
140
141 virtual CTensor<T>& GetValue() const override;
142 virtual const int64_t& GetRank() const;
143 virtual const std::vector<int64_t>& GetEstimatedShape(bool bRecursive = true) const override;
144 virtual const std::vector<int64_t>& GetShapeAsc() const override;
145
146 virtual const std::vector<int64_t>& GetPitchByRank() const;
147 virtual const std::vector<int64_t>& GetPitchByRankAsc() const;
148 virtual const int64_t& GetTotalElement() const;
149 virtual const int64_t& GetTotalSizeByte() const;
150
151 virtual const CResult SetBatchParameters(const CTensor<T>& tsr);
152
153 operator const T& () const;
154 operator const T* () const;
155 const CTensor<T>& operator=(const CTensor<float>& tsr);
156 const CTensor<T>& operator=(const CTensor<double>& tsr);
157 const CTensor<T>& operator=(const std::initializer_list<T>& ilRank1st);
158 const CTensor<T>& operator=(const std::initializer_list<const std::initializer_list<T>>& ilRank2nd);
159 const CTensor<T>& operator=(const std::initializer_list<const std::initializer_list<const std::initializer_list<T> > >& ilRank3rd);
160 const CTensor<T>& operator=(const std::initializer_list<const std::initializer_list<const std::initializer_list<const std::initializer_list<T> > > >& ilRank4th);
161 const T operator=(const T tScalar);
162 CScalar<T> operator[](int32_t i32Index) const;
163 CScalar<T> operator[](uint32_t u32Index) const;
164 CScalar<T> operator[](int64_t i64Index) const;
165 CScalar<T> operator[](uint64_t u64Index) const;
166
167 virtual const CTensor<T>& operator+=(const CTensor<T>& tsr);
168 virtual const CTensor<T>& operator+=(const float& f32Scalar);
169 virtual const CTensor<T>& operator+=(const double& f64Scalar);
170 virtual const CTensor<T>& operator-=(const CTensor<T>& tsr);
171 virtual const CTensor<T>& operator-=(const float& f32Scalar);
172 virtual const CTensor<T>& operator-=(const double& f64Scalar);
173 virtual const CTensor<T>& operator*=(const CTensor<T>& tsr);
174 virtual const CTensor<T>& operator*=(const float& f32Scalar);
175 virtual const CTensor<T>& operator*=(const double& f64Scalar);
176 virtual const CTensor<T>& operator/=(const CTensor<T>& tsr);
177 virtual const CTensor<T>& operator/=(const float& f32Scalar);
178 virtual const CTensor<T>& operator/=(const double& f64Scalar);
179
180 CTensor<T> operator+(const CTensor<T>& tsr) const;
181 CTensor<T> operator+(const float& f32Scalar) const;
182 CTensor<T> operator+(const double& f64Scalar) const;
183 CTensor<T> operator-(const CTensor<T>& tsr) const;
184 CTensor<T> operator-(const float& f32Scalar) const;
185 CTensor<T> operator-(const double& f64Scalar) const;
186 CTensor<T> operator*(const CTensor<T>& tsr) const;
187 CTensor<T> operator*(const float& f32Scalar) const;
188 CTensor<T> operator*(const double& f64Scalar) const;
189 CTensor<T> operator/(const CTensor<T>& tsr) const;
190 CTensor<T> operator/(const float& f32Scalar) const;
191 CTensor<T> operator/(const double& f64Scalar) const;
192
193 friend CTensor<T> operator+(const float& f32Scalar, const CTensor<T>& tsr)
194 {
195 CTensor<T> tsrReturn((T)f32Scalar);
196
197 tsrReturn += tsr;
198 return tsrReturn;
199 }
200
201 friend CTensor<T> operator+(const double& f64Scalar, const CTensor<T>& tsr)
202 {
203 CTensor<T> tsrReturn((T)f64Scalar);
204
205 tsrReturn += tsr;
206 return tsrReturn;
207 }
208
209 friend CTensor<T> operator-(const float& f32Scalar, const CTensor<T>& tsr)
210 {
211 CTensor<T> tsrReturn((T)f32Scalar);
212
213 tsrReturn -= tsr;
214 return tsrReturn;
215 }
216
217 friend CTensor<T> operator-(const double& f64Scalar, const CTensor<T>& tsr)
218 {
219 CTensor<T> tsrReturn((T)f64Scalar);
220
221 tsrReturn -= tsr;
222 return tsrReturn;
223 }
224
225 friend CTensor<T> operator*(const float& f32Scalar, const CTensor<T>& tsr)
226 {
227 CTensor<T> tsrReturn((T)f32Scalar);
228
229 tsrReturn *= tsr;
230 return tsrReturn;
231 }
232
233 friend CTensor<T> operator*(const double& f64Scalar, const CTensor<T>& tsr)
234 {
235 CTensor<T> tsrReturn((T)f64Scalar);
236
237 tsrReturn *= tsr;
238 return tsrReturn;
239 }
240
241 friend CTensor<T> operator/(const float& f32Scalar, const CTensor<T>& tsr)
242 {
243 CTensor<T> tsrReturn((T)f32Scalar);
244
245 tsrReturn /= tsr;
246 return tsrReturn;
247 }
248
249 friend CTensor<T> operator/(const double& f64Scalar, const CTensor<T>& tsr)
250 {
251 CTensor<T> tsrReturn((T)f64Scalar);
252
253 tsrReturn /= tsr;
254 return tsrReturn;
255 }
256
257 CTensor<T> operator>(const CTensor<T>& tsr);
258 CTensor<T> operator>(const float& f32Scalar);
259 CTensor<T> operator>(const double& f64Scalar);
260 CTensor<T> operator>=(const CTensor<T>& tsr);
261 CTensor<T> operator>=(const float& f32Scalar);
262 CTensor<T> operator>=(const double& f64Scalar);
263 CTensor<T> operator==(const CTensor<T>& tsr);
264 CTensor<T> operator==(const float& f32Scalar);
265 CTensor<T> operator==(const double& f64Scalar);
266 CTensor<T> operator!=(const CTensor<T>& tsr);
267 CTensor<T> operator!=(const float& f32Scalar);
268 CTensor<T> operator!=(const double& f64Scalar);
269 CTensor<T> operator<=(const CTensor<T>& tsr);
270 CTensor<T> operator<=(const float& f32Scalar);
271 CTensor<T> operator<=(const double& f64Scalar);
272 CTensor<T> operator<(const CTensor<T>& tsr);
273 CTensor<T> operator<(const float& f32Scalar);
274 CTensor<T> operator<(const double& f64Scalar);
275
276 bool Equals(const CTensor<float>& tsr);
277 bool Equals(const CTensor<double>& tsr);
278
279 virtual const CResult Add(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult);
280 virtual const CResult Subtract(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult);
281 virtual const CResult Multiply(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult);
282 virtual const CResult MatMul(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult);
283 virtual const CResult Divide(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult);
284 virtual const CResult Dot(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult);
285 virtual const CResult Pow(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult);
286 virtual const CResult Compare(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult, Base::ELogicalCondition eConditon);
287 virtual const CResult PNormDistance(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult, T tP = (T)2.);
288
289 virtual const CResult Chunk(std::vector<CTensor<T>>& vctResult, int64_t i64ChunkCount, int64_t i64Axis = -1);
290 virtual const CResult Chunk(CTensor<T>* pTsrResult, int64_t i64ChunkCount, int64_t i64Axis = -1);
291 virtual const CResult Chunk(CTensor<T>* pTsrResult, std::vector<CTensor<T>>& vctResult, int64_t i64ChunkCount, int64_t i64Axis = -1);
292
293 virtual const CResult Stack(const std::initializer_list<CTensor<T>*>& tsrTarget, CTensor<T>* pTsrResult, int64_t i64Axis = -1);
294 virtual const CResult Stack(const std::vector<CTensor<T>*>& vctTarget, CTensor<T>* pTsrResult, int64_t i64Axis = -1);
295 virtual const CResult HStack(const std::initializer_list<CTensor<T>*>& tsrTarget, CTensor<T>* pTsrResult);
296 virtual const CResult HStack(const std::vector<CTensor<T>*>& vctTarget, CTensor<T>* pTsrResult);
297 virtual const CResult VStack(const std::initializer_list<CTensor<T>*>& tsrTarget, CTensor<T>* pTsrResult);
298 virtual const CResult VStack(const std::vector<CTensor<T>*>& vctTarget, CTensor<T>* pTsrResult);
299 virtual const CResult Concatenate(const std::initializer_list<CTensor<T>*>& ilTarget, CTensor<T>* pTsrResult, int64_t i64Axis = -1);
300 virtual const CResult Concatenate(const std::vector<CTensor<T>*>& vctTarget, CTensor<T>* pTsrResult, int64_t i64Axis = -1);
301
302 virtual const CResult Transpose(CTensor<T>* pTsrResult);
303 virtual const CResult Transpose(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctTransDesc);
304 virtual const CResult Repeat(CTensor<T>* pTsrResult, int64_t i64Count, int64_t i64Axis = 0);
305
306 virtual const CResult ReduceSum(CTensor<T>* pTsrResult, bool bKeepDim = false);
307 virtual const CResult ReduceSum(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctAxes, bool bKeepDim = false);
308 virtual const CResult ReduceSum(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilAxes, bool bKeepDim = false);
309 virtual const CResult ReduceMean(CTensor<T>* pTsrResult, bool bKeepDim = false);
310 virtual const CResult ReduceMean(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctAxes, bool bKeepDim = false);
311 virtual const CResult ReduceMean(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilAxes, bool bKeepDim = false);
312 virtual const CResult ReduceMin(CTensor<T>* pTsrResult, bool bKeepDim = false);
313 virtual const CResult ReduceMin(CTensor<T>* pTsrResult, const std::vector<int64_t>& ilAxes, bool bKeepDim = false);
314 virtual const CResult ReduceMin(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilAxes, bool bKeepDim = false);
315 virtual const CResult ReduceMax(CTensor<T>* pTsrResult, bool bKeepDim = false);
316 virtual const CResult ReduceMax(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctAxes, bool bKeepDim = false);
317 virtual const CResult ReduceMax(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilAxes, bool bKeepDim = false);
318
319 virtual const CResult ReduceVar(CTensor<T>* pTsrResult, bool bUnBiased = true, bool bKeepDim = false);
320 virtual const CResult ReduceVar(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctAxes, bool bUnBiased = true, bool bKeepDim = false);
321 virtual const CResult ReduceVar(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilAxes, bool bUnBiased = true, bool bKeepDim = false);
322 virtual const CResult ReduceVarMean(CTensor<T>* pTsrVarResult, CTensor<T>* pTsrMeanResult, bool bUnBiased = true, bool bKeepDim = false);
323 virtual const CResult ReduceVarMean(CTensor<T>* pTsrVarResult, CTensor<T>* pTsrMeanResult, const std::vector<int64_t>& vctAxes, bool bUnBiased = true, bool bKeepDim = false);
324 virtual const CResult ReduceVarMean(CTensor<T>* pTsrVarResult, CTensor<T>* pTsrMeanResult, const std::initializer_list<int64_t>& ilAxes, bool bUnBiased = true, bool bKeepDim = false);
325
326 virtual const CResult ReduceStdev(CTensor<T>* pTsrResult, bool bUnBiased = true, bool bKeepDim = false);
327 virtual const CResult ReduceStdev(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctAxes, bool bUnBiased = true, bool bKeepDim = false);
328 virtual const CResult ReduceStdev(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilAxes, bool bUnBiased = true, bool bKeepDim = false);
329
330 virtual const CResult ReduceAny(CTensor<T>* pTsrResult, bool bKeepDim = false);
331 virtual const CResult ReduceAny(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctAxes, bool bKeepDim = false);
332 virtual const CResult ReduceAny(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilAxes, bool bKeepDim = false);
333
334 virtual const CResult ArgMax(CTensor<T>* pTsrResult);
335 virtual const CResult ArgMax(CTensor<T>* pTsrResult, int64_t i64Axis);
336
337 virtual const CResult Square(CTensor<T>* pTsrResult);
338 virtual const CResult Sqrt(CTensor<T>* pTsrResult);
339
340 virtual const CResult Sigmoid(CTensor<T>* pTsrResult);
341 virtual const CResult Log(CTensor<T>* pTsrResult);
342 virtual const CResult Log10(CTensor<T>* pTsrResult);
343 virtual const CResult Log1p(CTensor<T>* pTsrResult);
344 virtual const CResult Tanh(CTensor<T>* pTsrResult);
345 virtual const CResult Absolute(CTensor<T>* pTsrResult);
346
347 virtual const CResult Sin(CTensor<T>* pTsrResult);
348 virtual const CResult Cos(CTensor<T>* pTsrResult);
349 virtual const CResult ArcCos(CTensor<T>* pTsrResult);
350 virtual const CResult ArcTan2(const CTensor<T>& tsrTarget, CTensor<T>* pTsrResult);
351 virtual const CResult Degrees(CTensor<T>* pTsrResult);
352
353 virtual CComputationalBase<T>* Clone() const override;
354
355 virtual const CResult ArgMin(CTensor<T>* pTsrResult);
356 virtual const CResult ArgMin(CTensor<T>* pTsrResult, int64_t i64Axis);
357
358 virtual const CResult Ceil(CTensor<T>* pTsrResult);
359 virtual const CResult Floor(CTensor<T>* pTsrResult);
360
361 virtual const CResult Clip(const CTensor<T>& tsrMin, const CTensor<T>& tsrMax = -std::numeric_limits<T>::lowest());
362 virtual const CResult Clip(CTensor<T>* pTsrResult, const CTensor<T>& tsrMin, const CTensor<T>& tsrMax = -std::numeric_limits<T>::lowest());
363
364 virtual const CResult FillZero_Like(CTensor<T>& pTsrOpr);
365
366 virtual const CResult LinSpace(T tStart, T tEnd, int64_t i64Num = 50, bool bEndPoint = true, int64_t i64Axis = 0);
367
368 virtual const CResult Diff(CTensor<T>* pTsrResult, int64_t i64RepeatNum = 1, int64_t i64Axis = -1);
369 virtual const CResult Diff(CTensor<T>* pTsrResult, int64_t i64RepeatNum, int64_t i64Axis, const CTensor<T>& tsrPrepend, const CTensor<T>& tsrAppend = CTensor());
370
371 virtual const CResult Product(CTensor<T>* pTsrResult, bool bKeepDim = false, const CTensor<T>& tsrInitial = CTensor<T>());
372 virtual const CResult Product(CTensor<T>* pTsrResult, int64_t i64Axis, bool bKeepDim = false, const CTensor<T>& tsrInitial = CTensor<T>());
373 virtual const CResult Product(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctAxes, bool bKeepDim = false, const CTensor<T>& tsrInitial = CTensor<T>());
374
375 virtual const CResult ArgSort(CTensor<T>* pTsrResult, bool bDecrease = false, bool bStable = false);
376 virtual const CResult ArgSort(CTensor<T>* pTsrResult, int64_t i64Axis, bool bDecrease = false, bool bStable = false);
377 virtual const CResult Sort(CTensor<T>* pTsrResult, const bool bDecrease = false);
378 virtual const CResult Sort(CTensor<T>* pTsrResult, int64_t i64Axis, bool bDecrease = false);
379 virtual const CResult Sort(CTensor<T>* pTsrResult, std::vector<uint32_t>* pVtIndices, bool bDecrease = false, bool bStable = false);
380 virtual const CResult Sort(CTensor<T>* pTsrResult, std::vector<uint32_t>* pVtIndices, int64_t i64Axis, bool bDecrease = false, bool bStable = false);
381
382 virtual const CResult TopK(CTensor<T>* pTsrResult, int64_t i64K = 3, bool bDec = true);
383 virtual const CResult TopK(CTensor<T>* pTsrResult, int64_t i64K, int64_t i64Axis, bool bDec = true);
384 virtual const CResult TopK(CTensor<T>* pTsrResult, std::vector<uint32_t>* pVtIndices, int64_t i64K = 3, bool bDec = true, bool bStable = false);
385 virtual const CResult TopK(CTensor<T>* pTsrResult, std::vector<uint32_t>* pVtIndices, int64_t i64K, int64_t i64Axis, bool bDec = true, bool bStable = false);
386
387 virtual const CResult Gather(const CTensor<T>& tsrIndex, CTensor<T>* pTsrResult, int64_t i64Axis = 0);
388 virtual const CResult Gather(CTensor<T>* pTsrResult, std::vector<std::pair<int64_t, std::vector<int64_t>>> vtGatherPoint);
389
390 virtual const CResult Slice(CTensor<T>* pTsrResult, const std::vector<std::pair<int64_t, std::pair<int64_t, int64_t>>>& vctIndex);
391 virtual const CResult Slice(CTensor<T>* pTsrResult, const std::vector<std::pair<int64_t, std::tuple<int64_t, int64_t, int64_t>>>& vctIndex);
392
393 virtual const CResult Cross(const CTensor<T>& tsrOprand, CTensor<T>* pTsrResult, int64_t i64AxisA = -1, int64_t i64AxisB = -1, int64_t i64AxisC = -1);
394 virtual const CResult Cross(const CTensor<T>& tsrOprand, CTensor<T>* pTsrResultconst, std::vector<int64_t>& vctAxes);
395
396 virtual const CResult Ones();
397 virtual const CResult Sum(CTensor<T>* pTsrResult, int64_t i64Axis = -1, bool bKeepDim = false, const CTensor<T>& tsrInitial = CTensor<T>());
398 virtual const CResult Sum(CTensor<T>* pTsrResult, std::vector<int64_t> vtAxis, bool bKeepDim = false, const CTensor<T>& tsrInitial = CTensor<T>());
399
400 virtual const CResult Maximum(const CTensor<T>& tsrOpr2, CTensor<T>* pTsrResult);
401 virtual const CResult Minimum(const CTensor<T>& tsrOpr2, CTensor<T>* pTsrResult);
402
403 virtual const CResult Swap(CComputationalBase<T>& cbSwap) override;
404 virtual const CResult SwapMemory(CComputationalBase<T>& cbSwap);
405 virtual const CResult SwapAxes(CTensor<T>* pTsrResult, int64_t i64AxisOne, int64_t i64AxisOther);
406
407 virtual const CResult Permute(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilShape);
408 virtual const CResult Permute(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctShape);
409
410 virtual const CResult Unique(CTensor<T>* pTsrResult);
411 virtual const CResult Unique(CTensor<T>* pTsrResult, int64_t i64Axis);
412 virtual const CResult Unique(CTensor<T>* pTsrResult, std::vector<int64_t>* pVctAdditionalResult, EUniqueResultSettings eResultSettings);
413 virtual const CResult Unique(CTensor<T>* pTsrResult, std::vector<int64_t>* pVctAdditionalResult, EUniqueResultSettings eResultSettings, int64_t i64Axis);
414 virtual const CResult Unique(CTensor<T>* pTsrResult, std::vector<int64_t>* pVctAdditionalResult0, std::vector<int64_t>* pVctAdditionalResult1, EUniqueResultSettings eResultSettings);
415 virtual const CResult Unique(CTensor<T>* pTsrResult, std::vector<int64_t>* pVctAdditionalResult0, std::vector<int64_t>* pVctAdditionalResult1, EUniqueResultSettings eResultSettings, int64_t i64Axis);
416 virtual const CResult Unique(CTensor<T>* pTsrResult, std::vector<int64_t>* pVctAdditionalResult0, std::vector<int64_t>* pVctAdditionalResult1, std::vector<int64_t>* pVctAdditionalResult2, EUniqueResultSettings eResultSettings);
417 virtual const CResult Unique(CTensor<T>* pTsrResult, std::vector<int64_t>* pVctAdditionalResult0, std::vector<int64_t>* pVctAdditionalResult1, std::vector<int64_t>* pVctAdditionalResult2, EUniqueResultSettings eResultSettings, int64_t i64Axis);
418
419 virtual const CResult Norm(CTensor<T>* pTsrResult, ENormOrder eNormOrder = ENormOrder_Frobenius, bool bKeepDim = false);
420 virtual const CResult Norm(CTensor<T>* pTsrResult, int64_t i64Order, bool bKeepDim = false);
421
422 virtual const CResult Norm(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctAxes, ENormOrder eNormOrder = ENormOrder_Frobenius, bool bKeepDim = false);
423 virtual const CResult Norm(CTensor<T>* pTsrResult, const std::vector<int64_t>& vctAxes, int64_t i64Order = 0, bool bKeepDim = false);
424
425 virtual const CResult Norm(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilAxes, ENormOrder eNormOrder = ENormOrder_Frobenius, bool bKeepDim = false);
426 virtual const CResult Norm(CTensor<T>* pTsrResult, const std::initializer_list<int64_t>& ilAxes, int64_t i64Order = 0, bool bKeepDim = false);
427
428 virtual const CResult Where(const CTensor<T>& tsrCondition, CTensor<T>* pTsrResult);
429 virtual const CResult Where(const CTensor<T>* pTsrCondition, CTensor<T>* pTsrResult);
430 virtual const CResult Where(const CTensor<T>& tsrCondition, const CTensor<T>& tsrTrue, const CTensor<T>& tsrFalse, CTensor<T>* pTsrResult, bool bAdd = false);
431 virtual const CResult Where(const CTensor<T>* pTsrCondition, const CTensor<T>* pTsrTrue, const CTensor<T>* pTsrFalse, CTensor<T>* pTsrResult, bool bAdd = false);
432 virtual const CResult Where(const CTensor<T>& tsrCondition, const T tTrue, const CTensor<T>& tsrFalse, CTensor<T>* pTsrResult, bool bAdd = false);
433 virtual const CResult Where(const CTensor<T>* pTsrCondition, const T tTrue, const CTensor<T>* pTsrFalse, CTensor<T>* pTsrResult, bool bAdd = false);
434 virtual const CResult Where(const CTensor<T>& tsrCondition, const CTensor<T>& tsrTrue, const T tFalse, CTensor<T>* pTsrResult, bool bAdd = false);
435 virtual const CResult Where(const CTensor<T>* pTsrCondition, const CTensor<T>* pTsrTrue, const T tFalse, CTensor<T>* pTsrResult, bool bAdd = false);
436 virtual const CResult Where(const CTensor<T>& tsrCondition, const T tTrue, const T tFalse, CTensor<T>* pTsrResult, bool bAdd = false);
437 virtual const CResult Where(const CTensor<T>* pTsrCondition, const T tTrue, const T tFalse, CTensor<T>* pTsrResult, bool bAdd = false);
438
439 virtual const CResult Threshold(T tThreshold, T tValue, Base::ELogicalCondition eLogicalCondition, CTensor<T>* pTsrResult);
440 virtual const CResult Threshold(T tThreshold, T tInRangeValue, T tOutRangeValue, Base::ELogicalCondition eLogicalCondition, CTensor<T>* pTsrResult);
441
442 virtual const CResult Flip(int64_t i64Axis, CTensor<T>* pTsrResult, int32_t i32DeviceIndex = 0);
443 virtual const CResult Flip(const std::initializer_list<int64_t>& ilAxes, CTensor<T>* pTsrResult, int32_t i32DeviceIndex = 0);
444 virtual const CResult Flip(const std::vector<int64_t>& vctAxes, CTensor<T>* pTsrResult, int32_t i32DeviceIndex = 0);
445
446 virtual const CResult Rotate90(int64_t i64K, int64_t i64AxisA, int64_t i64AxisB, CTensor<T>* pTsrResult, int32_t i32DeviceIndex = 0);
447
448 virtual const CResult SSIM(const Base::CFLImage& fliInput1, const Base::CFLImage& fliInput2, CTensor<T>* pTsrResult, T tMaxDiffValue = (T)INFINITY, int64_t i64FilterSize = 11, T tFilterSigma = (T)1.5, T tK1 = (T)0.01, T tK2 = (T)0.03, bool bReturnIndexMap = false);
449 virtual const CResult SSIM(const Base::CFLImage* pFliInput1, const Base::CFLImage* pFliInput2, CTensor<T>* pTsrResult, T tMaxDiffValue = (T)INFINITY, int64_t i64FilterSize = 11, T tFilterSigma = (T)1.5, T tK1 = (T)0.01, T tK2 = (T)0.03, bool bReturnIndexMap = false);
450
451 virtual const CResult SSIM(const CTensor<T>& tsrInput1, const CTensor<T>& tsrInput2, CTensor<T>* pTsrResult, T tMaxDiffValue = (T)INFINITY, int64_t i64FilterSize = 11, T tFilterSigma = (T)1.5, T tK1 = (T)0.01, T tK2 = (T)0.03, bool bReturnIndexMap = false);
452 virtual const CResult SSIM(const CTensor<T>* pTsrInput1, const CTensor<T>* pTsrInput2, CTensor<T>* pTsrResult, T tMaxDiffValue = (T)INFINITY, int64_t i64FilterSize = 11, T tFilterSigma = (T)1.5, T tK1 = (T)0.01, T tK2 = (T)0.03, bool bReturnIndexMap = false);
453
454 virtual const CResult NewtonSchulz(CTensor<T>* pTsrResult, int64_t i64Iter = 5, T tA = (T)1.875, T tB = (T)-1.25, T tC = (T)0.375);
455
456 virtual const CResult EigenSingle(CTensor<T>* pTsrEigenValue, CTensor<T>* pTsrEigenVector, int64_t i64MaxIter = 100, T tEpsilon = (T)1e-6f);
457 virtual const CResult Eigen(CTensor<T>* pTsrEigenValue, CTensor<T>* pTsrEigenVector, int64_t i64MaxIter = 100, T tEpsilon = (T)1e-6f);
458
459 virtual const CResult SVD(CTensor<T>* pTsrUMatrix, CTensor<T>* pTsrSingular, CTensor<T>* pTsrVMatrix, bool bFullMatrices = true);
460
461 virtual const CResult Diag(CTensor<T>* pTsrResult, int64_t i64K = 0);
462 virtual const CResult Eye(CTensor<T>* pTsrResult, int64_t i64Row, int64_t i64Col = 0, int64_t i64K = 0);
463
464 virtual const CResult Unfold(CTensor<T>* pTsrResult, int64_t i64Dim, int64_t i64Size, int64_t i64Step);
465
466 virtual const CComputationalBase<T>* GetAt(const wchar_t* pWcsName) const override;
467 virtual const CResult FindByValueAttribute(EValueAttribute eValueAttribute, std::vector<const CComputationalBase<T>*>& vctResult) const override;
468
469 virtual const CResult PrintGraphInfo(bool bRecursively = true, bool bShapeOrderAsc = false, bool bIncludeTensors = false) const override;
470 virtual const CResult Print();
471
472 virtual const CResult EnableClearFigures(bool bClearFigures = true);
473 virtual bool IsClearFiguresEnabled() const;
474
475 virtual const CResult EnableMemorySavingMode(bool bEnable = false);
476 virtual bool IsMemorySavingModeEnabled() const;
477
478 virtual const CResult SetImagePreprocessingAlgorithms(const std::vector<Foundation::CAlgorithmFeatureBase*>* vctPreprocessingAlgorithm);
479 virtual const std::vector<Foundation::CAlgorithmFeatureBase*>* GetImagePreprocessingAlgorithms() const;
480 static const CResult Preprocessing(Base::CFLImage& fliSrc, const std::vector<Foundation::CAlgorithmFeatureBase*>* vctPreprocessingAlgorithm);
481
482 virtual const CResult SetUpdateWeight(T tUpdateWeight);
483 virtual T GetUpdateWeight() const;
484
485 virtual const CResult SetFigureIoUThreshold(T tIoUThreshold);
486 virtual T GetFigureIoUThreshold() const;
487
488 DeclareGetClassType();
489 SupportToDuplicateObject(CTensor, *this);
490
491 protected:
492 virtual const CResult RecalcPitchByRank();
493
494 virtual const CResult InternalCreate(const std::vector<int64_t>& vctBatchIndices, const Base::CFLImage* pFli, bool bNormalize, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
495 virtual const CResult InternalCreate(const std::vector<int64_t>& vctBatchIndices, const Base::CFLImage* pFli, const std::vector<int64_t>& vctNewSize, EResizeMethod eResizeMethod = EResizeMethod_ScaleAllAxises, bool bROIExtraction = false, bool bNormalize = true, const Base::CMultiVar<T>& mvBlankColor = 0., ImageProcessing::EInterpolationMethod eInterpolationMethod = ImageProcessing::EInterpolationMethod_Bilinear, std::atomic<int32_t>* pI32CurrentPreparingTensorIndex = nullptr, bool* pBAbort = nullptr);
496 protected:
497
498 std::vector<int64_t>& m_vctPitchByRank;
499 std::vector<int64_t>& m_vctPitchByRankAsc;
500
501 #ifdef CUDNN_MODE
502 CCuda_Tensor_Cudnn<T>* m_pCudnn;
503 #endif
504
505 T* m_pMemory;
506 int64_t m_i64Rank;
507 int64_t m_i64TotalElement;
508 int64_t m_i64TotalSizeByte;
509
510 Foundation::CFLFigureArray* m_pFlfaLabels;
511 Foundation::CFLFigureArray* m_pFlfaOrgBoundaryLabels;
512 Foundation::CFLFigureArray* m_pFlfaObjectRegions;
513 bool m_bClearFigures;
514 bool m_bClearTensor;
515 bool m_bClearLabels;
516 bool m_bObjectAugmentationRegionMode;
517 bool m_bRectCropMode;
518 T* m_pDeviceMemory;
519
520 bool m_bAutoDestroyCPUMemory;
521 bool m_bAutoDestroyDeviceMemory;
522 bool m_bMemorySavingMode;
523 T m_tFigureIoUThreshold;
524
525 Base::CFLImage m_fliThreadBuffer;
526
527 #ifdef CUBLAS_MODE
528 CCuda_ComputationalGraphMatMul_Cublas<T>* m_pCublas;
529 #endif
530
531 std::vector<Foundation::CAlgorithmFeatureBase*>* m_pVctPreprocessingAlgorithm;
532
533 T m_tUpdateWeight;
534 public:
535 DeclareGetSignletonObject(CTensor);
536 };
537
538 #define CCGFTensor(...) (*(new CTensor<float>(__VA_ARGS__)))
539 #define CCGDTensor(...) (*(new CTensor<double>(__VA_ARGS__)))
540
541 typedef CTensor<float> CTensorF;
542 typedef CTensor<double> CTensorD;
543 }
544}
545
546#endif
Definition FLImagingImgProcBase/AlgorithmAIBase.h:18
@ Dot
Dot style.
Definition FLImagingFoundationCLR/DefinitionsFigure.h:3304
@ Assign
Set the value of CGUIPropertyItemView3DFigure to the specified figure.
Definition FLImagingGUICLR/DefinitionsGUIView3D.h:3539
@ Flip
Flip based on the center of gravity in Figure.
Definition FLImagingGUICLR/DefinitionsGUI.h:9762
@ Save
Save file.
Definition FLImagingGUICLR/DefinitionsGUI.h:303
@ Log
CGUIPaneLog 타입 Pane.
Definition FLImagingGUICLR/DefinitionsGUI.h:10853
@ Sort
Sort the order of Figure Array or Multiple Figures.
Definition FLImagingGUICLR/DefinitionsGUI.h:9418
@ Rotate90
Rotate figure 90 degree.
Definition FLImagingGUICLR/DefinitionsGUI.h:5382
@ Clear
Clear all the figure objects.
Definition FLImagingGUICLR/DefinitionsGUI.h:5069
@ Add
Add operation (adds the newly selected elements to the existing selection).
Definition FLImagingGUICLR/DefinitionsGUIView3D.h:2913
@ Append
Load and append.
Definition FLImagingGUICLR/DefinitionsGUI.h:58
@ Load
Default Load.
Definition FLImagingGUICLR/DefinitionsGUI.h:50
@ Floor
Definition FLImagingImgProcBaseCLR/DefinitionsImgProcBase.h:122
@ Maximum
Maximum-coordinate alias of FarTopRight.
Definition FLImagingThreeDimCLR/DefinitionsSpacePlanning.h:580
@ Minimum
Minimum-coordinate alias of NearBottomLeft.
Definition FLImagingThreeDimCLR/DefinitionsSpacePlanning.h:564