Project
Loading...
Searching...
No Matches
mathUtil.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#ifndef O2_MCH_MATHUTIL_H
13#define O2_MCH_MATHUTIL_H
14
15#include <algorithm>
16#include <cfloat>
17#include <climits>
18#include <cmath>
19#include <cstddef>
20#include <iostream>
21
23
24namespace o2
25{
26namespace mch
27{
28
29inline static void vectorSetZero(double* u, int N)
30{
31 for (int i = 0; i < N; i++) {
32 u[i] = 0;
33 }
34 return;
35}
36
37inline static void vectorSetZeroInt(int* u, int N)
38{
39 for (int i = 0; i < N; i++) {
40 u[i] = 0;
41 }
42 return;
43}
44
45inline static void vectorSetZeroShort(short* u, int N)
46{
47 for (int i = 0; i < N; i++) {
48 u[i] = 0;
49 }
50 return;
51}
52
53inline static void vectorSetZeroChar(char* u, int N)
54{
55 for (int i = 0; i < N; i++) {
56 u[i] = 0;
57 }
58 return;
59}
60
61inline static void vectorSet(double* u, double value, int N)
62{
63 for (int i = 0; i < N; i++) {
64 u[i] = value;
65 }
66 return;
67}
68
69inline static void vectorSetInt(int* u, int value, int N)
70{
71 for (int i = 0; i < N; i++) {
72 u[i] = value;
73 }
74 return;
75}
76
77inline static void vectorSetShort(short* u, short value, int N)
78{
79 for (int i = 0; i < N; i++) {
80 u[i] = value;
81 }
82 return;
83}
84
85inline static void vectorCopy(const double* src, int N, double* dest)
86{
87 for (int i = 0; i < N; i++) {
88 dest[i] = src[i];
89 }
90 return;
91}
92
93inline static void vectorCopyShort(const short* src, int N, short* dest)
94{
95 for (int i = 0; i < N; i++) {
96 dest[i] = src[i];
97 }
98 return;
99}
100
101inline static void vectorAddVector(const double* u, double cst, const double* v,
102 int N, double* res)
103{
104 for (int i = 0; i < N; i++) {
105 res[i] = u[i] + cst * v[i];
106 }
107 return;
108}
109
110inline static void vectorAbs(const double* u, int N, double* res)
111{
112 for (int i = 0; i < N; i++) {
113 res[i] = fabs(u[i]);
114 }
115 return;
116}
117
118inline static void vectorAddScalar(const double* u, double cst, int N,
119 double* res)
120{
121 for (int i = 0; i < N; i++) {
122 res[i] = u[i] + cst;
123 }
124 return;
125}
126
127inline static void vectorMultVector(const double* u, const double* v, int N,
128 double* res)
129{
130 for (int i = 0; i < N; i++) {
131 res[i] = u[i] * v[i];
132 }
133 return;
134}
135
136inline static void vectorMultVectorShort(const short* u, const short* v, int N,
137 short* res)
138{
139 for (int i = 0; i < N; i++) {
140 res[i] = u[i] * v[i];
141 }
142 return;
143}
144
145inline static void vectorMultScalar(const double* u, double cst, int N,
146 double* res)
147{
148 for (int i = 0; i < N; i++) {
149 res[i] = u[i] * cst;
150 }
151 return;
152}
153
154inline static double vectorDotProd(const double* u, const double* v, int N)
155{
156 double res = 0.0;
157 for (int i = 0; i < N; i++) {
158 res += u[i] * v[i];
159 }
160 return res;
161}
162
163inline static double vectorNorm(const double* u, int N)
164{
165 double res = 0;
166 for (int i = 0; i < N; i++) {
167 res += u[i] * u[i];
168 }
169 return sqrt(res);
170}
171
172inline static double vectorSum(const double* u, int N)
173{
174 double res = 0;
175 for (int i = 0; i < N; i++) {
176 res += u[i];
177 }
178 return res;
179}
180
181inline static int vectorSumInt(const int* u, int N)
182{
183 int res = 0;
184 for (int i = 0; i < N; i++) {
185 res += u[i];
186 }
187 return res;
188}
189
190inline static int vectorSumShort(const short* u, int N)
191{
192 int res = 0;
193 for (int i = 0; i < N; i++) {
194 res += u[i];
195 }
196 return res;
197}
198
199inline static int vectorSumChar(const char* u, int N)
200{
201 int res = 0;
202 for (int i = 0; i < N; i++) {
203 res += u[i];
204 }
205 return res;
206}
207
208inline static int vectorSumRowInt(const int* matrix, int N, int M)
209{
210 int res = 0;
211 for (int j = 0; j < M; j++) {
212 res += matrix[j];
213 }
214 return res;
215}
216
217inline static int vectorSumColumnInt(const int* matrix, int N, int M)
218{
219 int res = 0;
220 for (int i = 0; i < N; i++) {
221 res += matrix[i * M];
222 }
223 return res;
224}
225
226inline static int vectorSumRowChar(const char* matrix, int N, int M)
227{
228 int res = 0;
229 for (int j = 0; j < M; j++) {
230 res += matrix[j];
231 }
232 return res;
233}
234
235inline static int vectorSumColumnChar(const char* matrix, int N, int M)
236{
237 int res = 0;
238 for (int i = 0; i < N; i++) {
239 res += matrix[i * M];
240 }
241 return res;
242}
243
244inline static double vectorMin(const double* u, int N)
245{
246 double res = DBL_MAX;
247 for (int i = 0; i < N; i++) {
248 res = fmin(res, u[i]);
249 }
250 return res;
251}
252
253inline static double vectorMax(const double* u, int N)
254{
255 double res = -DBL_MAX;
256 for (int i = 0; i < N; i++) {
257 res = fmax(res, u[i]);
258 }
259 return res;
260}
261
262inline static short vectorMaxShort(const short* u, int N)
263{
264 short res = SHRT_MIN;
265 for (int i = 0; i < N; i++) {
266 res = std::max(res, u[i]);
267 }
268 return res;
269}
270
271inline static void vectorMaxScalar(const double* u, double cst, int N, double* res)
272{
273 for (int i = 0; i < N; i++) {
274 res[i] = std::fmax(cst, u[i]);
275 }
276}
277
278inline static void vectorMinScalar(const double* u, double cst, int N, double* res)
279{
280 for (int i = 0; i < N; i++) {
281 res[i] = std::fmin(cst, u[i]);
282 }
283}
284//
285// Logical operations
286//
287inline static void vectorNotShort(const short* src, int N, short* dest)
288{
289 for (int i = 0; i < N; i++) {
290 dest[i] = !src[i];
291 }
292 return;
293}
294
295//
296// Compare oparations
297//
298inline static int vectorSumOfGreater(const double* src, double cmpValue,
299 int N)
300{
301 int count = 0;
302 for (int i = 0; i < N; i++) {
303 count += ((src[i] > cmpValue) ? 1 : 0);
304 }
305 return count;
306}
307
308inline static int vectorArgMax(const double* u, int N)
309{
310 int idx = -1;
311 double maxVal = DBL_MIN;
312 for (int i = 0; i < N; i++) {
313 if (u[i] > maxVal) {
314 maxVal = u[i];
315 idx = i;
316 }
317 }
318 return idx;
319}
320
321inline static int vectorArgMin(const double* u, int N)
322{
323 int idx = -1;
324 double minVal = DBL_MAX;
325 for (int i = 0; i < N; i++) {
326 if (u[i] < minVal) {
327 minVal = u[i];
328 idx = i;
329 }
330 }
331 return idx;
332}
333
334//
335// Mask operations
336//
337inline static int vectorBuildMaskEqualShort(const short* src, short value,
338 int N, short* mask)
339{
340 int count = 0;
341 for (int i = 0; i < N; i++) {
342 mask[i] = (src[i] == value);
343 count += ((src[i] == value));
344 }
345 return count;
346}
347
348inline static void vectorBuildMaskGreater(const double* src, double value,
349 int N, short* mask)
350{
351 for (int i = 0; i < N; i++) {
352 mask[i] = (src[i] > value);
353 }
354 return;
355}
356
357inline static void vectorBuildMaskLess(const double* src, double value,
358 int N, short* mask)
359{
360 for (int i = 0; i < N; i++) {
361 mask[i] = (src[i] < value);
362 }
363 return;
364}
365
366inline static void vectorBuildMaskEqual(const double* src, double value, int N,
367 short* mask)
368{
369 for (int i = 0; i < N; i++) {
370 mask[i] = (src[i] == value);
371 }
372 return;
373}
374
375inline static int vectorGetIndexFromMaskInt(const Mask_t* mask, int N,
376 int* indexVector)
377{
378 int k = 0;
379 for (int i = 0; i < N; i++) {
380 if (mask[i] == 1) {
381 indexVector[i] = k;
382 k++;
383 }
384 }
385 return k;
386}
387// int k=0;for (int i=0; i < N; i++) { indexVector[i] = ( mask[i] == 1) ? k :
388// -1; k++;} return k;}
389
390inline static void vectorAppyMapIdxInt(const int* vect, const int* map, int N,
391 int* mappedVect)
392{
393 for (int i = 0; i < N; i++) {
394 mappedVect[i] = map[vect[i]];
395 }
396 return;
397}
398
399inline static int vectorGather(const double* v, const Mask_t* mask, int N,
400 double* gatherVector)
401{
402 int k = 0;
403 for (int i = 0; i < N; i++) {
404 if (mask[i]) {
405 gatherVector[k++] = v[i];
406 }
407 }
408 return k;
409}
410
411inline static int vectorScatter(const double* v, const Mask_t* mask, int N,
412 double* scatterVec)
413{
414 int k = 0;
415 for (int i = 0; i < N; i++) {
416 if (mask[i]) {
417 scatterVec[i] = v[k++];
418 }
419 }
420 return k;
421}
422inline static int vectorScatterShort(const short* v, const Mask_t* mask, int N,
423 short* scatterVec)
424{
425 int k = 0;
426 for (int i = 0; i < N; i++) {
427 if (mask[i]) {
428 scatterVec[i] = v[k++];
429 }
430 }
431 return k;
432}
433
434inline static int vectorGatherShort(const short* v, const Mask_t* mask, int N,
435 short* gatherVector)
436{
437 int k = 0;
438 for (int i = 0; i < N; i++) {
439 if (mask[i]) {
440 gatherVector[k++] = v[i];
441 }
442 }
443 return k;
444}
445
446inline static int vectorGetIndexFromMaskShort(const Mask_t* mask, int N,
447 short* index)
448{
449 int k = 0;
450 for (int i = 0; i < N; i++) {
451 if (mask[i]) {
452 index[k++] = i;
453 }
454 }
455 return k;
456}
457
458inline static int vectorGetIndexFromMask(const Mask_t* mask, int N,
459 int* index)
460{
461 int k = 0;
462 for (int i = 0; i < N; i++) {
463 if (mask[i]) {
464 index[k++] = i;
465 }
466 }
467 return k;
468}
469
470inline static void vectorMaskedSet(const Mask_t* mask, const double* vTrue,
471 const double* vFalse, int N, double* vR)
472{
473 for (int i = 0; i < N; i++) {
474 vR[i] = (mask[i]) ? vTrue[i] : vFalse[i];
475 };
476 return;
477}
478
479inline static void vectorMaskedUpdate(const Mask_t* mask, const double* vTrue,
480 int N, double* vR)
481{
482 for (int i = 0; i < N; i++) {
483 vR[i] = (mask[i]) ? vTrue[i] : vR[i];
484 };
485 return;
486}
487
488inline static double vectorMaskedSum(const double* v, const Mask_t* mask,
489 int N)
490{
491 double sum = 0;
492 for (int i = 0; i < N; i++) {
493 sum += v[i] * mask[i];
494 }
495 return sum;
496}
497
498inline static void vectorMaskedMult(const double* v, const Mask_t* mask, int N,
499 double* res)
500{
501 for (int i = 0; i < N; i++) {
502 res[i] = v[i] * mask[i];
503 }
504 return;
505}
506
507inline static void vectorMaskedMultScalar(double* v, const Mask_t* mask,
508 double trueVal, double falseVal,
509 int N)
510{
511 for (int i = 0; i < N; i++) {
512 v[i] = (mask[i]) ? v[i] * trueVal : v[i] * falseVal;
513 }
514 return;
515}
516
517inline static void vectorMapShort(short* array, const short* map, int N)
518{
519 for (int i = 0; i < N; i++) {
520 array[i] = map[array[i]];
521 }
522}
523
524inline void deleteDouble(double* ptr)
525{
526 if (ptr != nullptr) {
527 delete[] ptr;
528 ptr = nullptr;
529 }
530}
531
532inline void deleteInt(int* ptr)
533{
534 if (ptr != nullptr) {
535 delete[] ptr;
536 ptr = nullptr;
537 }
538}
539
540inline void deleteShort(short* ptr)
541{
542 if (ptr != nullptr) {
543 delete[] ptr;
544 ptr = nullptr;
545 }
546}
547
548void vectorPrint(const char* str, const double* x, int N);
549void vectorPrintInt(const char* str, const int* x, int N);
550void vectorPrintShort(const char* str, const short* x, int N);
551void vectorPrint2Columns(const char* str, const double* x, const double* y,
552 int N);
553
554void printMatrixInt(const char* str, const int* matrix, int N, int M);
555void printMatrixShort(const char* str, const short* matrix, int N, int M);
556void printMatrixChar(const char* str, const char* matrix, int N, int M);
557
558void printInterMap(const char* str, const PadIdx_t* inter, int N);
559
560} // namespace mch
561} // namespace o2
562
563#endif // O2_MCH_MATHUTIL_H
int32_t i
uint32_t j
Definition RawData.h:0
uint32_t res
Definition RawData.h:0
TBranch * ptr
float sum(float s, o2::dcs::DataPointValue v)
Definition dcs-ccdb.cxx:39
GLint GLenum GLint x
Definition glcorearb.h:403
GLenum src
Definition glcorearb.h:1767
GLint GLsizei count
Definition glcorearb.h:399
const GLdouble * v
Definition glcorearb.h:832
GLenum array
Definition glcorearb.h:4274
GLuint index
Definition glcorearb.h:781
GLsizei const GLfloat * value
Definition glcorearb.h:819
GLint GLuint mask
Definition glcorearb.h:291
void vectorPrintShort(const char *str, const short *x, int K)
Definition mathUtil.cxx:43
void printMatrixInt(const char *str, const int *matrix, int N, int M)
Definition mathUtil.cxx:62
void deleteDouble(double *ptr)
Definition mathUtil.h:524
void vectorPrint2Columns(const char *str, const double *x, const double *y, int K)
Definition mathUtil.cxx:52
short Mask_t
void vectorPrint(const char *str, const double *x, int K)
Definition mathUtil.cxx:20
void printMatrixShort(const char *str, const short *matrix, int N, int M)
Definition mathUtil.cxx:74
void printInterMap(const char *str, const PadIdx_t *inter, int N)
Definition mathUtil.cxx:98
void deleteInt(int *ptr)
Definition mathUtil.h:532
void deleteShort(short *ptr)
Definition mathUtil.h:540
void printMatrixChar(const char *str, const char *matrix, int N, int M)
Definition mathUtil.cxx:86
void vectorPrintInt(const char *str, const int *x, int K)
Definition mathUtil.cxx:34
value_T gpu::gpustd::array< value_T, 7 > & vect
Definition TrackUtils.h:42
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
const std::string str