STORMM Source Documentation
Loading...
Searching...
No Matches
vector_ops.h
1// -*-c++-*-
2#ifndef STORMM_VECTOR_OPS_H
3#define STORMM_VECTOR_OPS_H
4
5#include <algorithm>
6#include <cmath>
7#include <vector>
8#include "copyright.h"
9#include "Accelerator/hybrid.h"
10#include "Constants/behavior.h"
11#include "Constants/scaling.h"
12#include "Constants/symbol_values.h"
13#include "DataTypes/common_types.h"
14#include "DataTypes/mixed_types.h"
15#include "DataTypes/stormm_vector_types.h"
16#include "Numerics/split_fixed_precision.h"
17#include "Parsing/parse.h"
18#include "Reporting/error_format.h"
19#include "UnitTesting/approx.h"
20#include "sorting_enumerators.h"
21#include "statistics.h"
22
23namespace stormm {
24namespace stmath {
25
26using card::Hybrid;
27using constants::ExceptionResponse;
28using data_types::getHpcVectorTypeSize;
29using data_types::isHpcVectorType;
30using data_types::isFloatingPointScalarType;
31using data_types::isScalarType;
32using data_types::isSignedIntegralScalarType;
33using data_types::isUnsignedIntegralScalarType;
34using data_types::ValueWithCounter;
35using numerics::hostChangeFPBits;
36using numerics::hostDoubleToInt95;
37using numerics::hostInt95ToDouble;
38using parse::NumberFormat;
39using parse::realToString;
40using symbols::avogadro_number;
41using symbols::boltzmann_constant;
42using testing::Approx;
43
54template <typename T> void vectorComparisonCheck(const std::vector<T> &va,
55 const std::vector<T> &vb, const char* caller);
56template <typename T> void vectorComparisonCheck(const Hybrid<T> &va, const Hybrid<T> &vb,
57 const char* caller);
59
71template <typename T> T maxAbsoluteDifference(const T* va, const T* vb, size_t length);
72template <typename T> T maxAbsoluteDifference(const std::vector<T> &va, const std::vector<T> &vb);
73template <typename T> T maxAbsoluteDifference(const Hybrid<T> &va, const Hybrid<T> &vb);
75
88template <typename T> double maxRelativeDifference(const T* va, const T* vb, size_t length);
89template <typename T> double maxRelativeDifference(const std::vector<T> &va,
90 const std::vector<T> &vb);
91template <typename T> double maxRelativeDifference(const Hybrid<T> &va, const Hybrid<T> &vb);
93
105template <typename T> double meanUnsignedError(const T* va, const T* vb, size_t length);
106template <typename T> double meanUnsignedError(const std::vector<T> &va, const std::vector<T> &vb);
107template <typename T> double meanUnsignedError(const Hybrid<T> &va, const Hybrid<T> &vb);
109
121template <typename T> double rmsError(const T* va, const T* vb, size_t length);
122template <typename T> double rmsError(const std::vector<T> &va, const std::vector<T> &vb);
123template <typename T> double rmsError(const Hybrid<T> &va, const Hybrid<T> &vb);
125
138template <typename T> double relativeRmsError(const T* va, const T* vb, size_t length);
139template <typename T> double relativeRmsError(const std::vector<T> &va, const std::vector<T> &vb);
140template <typename T> double relativeRmsError(const Hybrid<T> &va, const Hybrid<T> &vb);
142
153template <typename T> double mean(const T* va, const size_t length);
154template <typename T> double mean(const std::vector<T> &va);
155template <typename T> double mean(const Hybrid<T> &va);
157
169template <typename T> double variance(const T* va, size_t length, VarianceMethod method);
170template <typename T> double variance(const std::vector<T> &va, VarianceMethod method);
171template <typename T> double variance(const Hybrid<T> &va, VarianceMethod method);
173
184template <typename T> double2 bivariateMean(const T* va, size_t length);
185template <typename T> double2 bivariateMean(const std::vector<T> &va);
186template <typename T> double2 bivariateMean(const Hybrid<T> &va);
188
199template <typename T> double3 trivariateMean(const T* va, size_t length);
200template <typename T> double3 trivariateMean(const std::vector<T> &va);
201template <typename T> double3 trivariateMean(const Hybrid<T> &va);
203
214template <typename T> double4 quadrivariateMean(const T* va, size_t length);
215template <typename T> double4 quadrivariateMean(const std::vector<T> &va);
216template <typename T> double4 quadrivariateMean(const Hybrid<T> &va);
218
223template <typename T> double boltzmannWeightedMean(const T* va, size_t length);
224template <typename T> double boltzmannWeightedMean(const std::vector<T> &va);
225template <typename T> double boltzmannWeightedMean(const Hybrid<T> &va);
227
238template <typename T> T maxValue(const T* va, size_t length);
239template <typename T> T maxValue(const std::vector<T> &va);
240template <typename T> T maxValue(const Hybrid<T> &va);
242
253template <typename T> T minValue(const T* va, size_t length);
254template <typename T> T minValue(const std::vector<T> &va);
255template <typename T> T minValue(const Hybrid<T> &va);
257
268template <typename T> T maxAbsValue(const T* va, size_t length);
269template <typename T> T maxAbsValue(const std::vector<T> &va);
270template <typename T> T maxAbsValue(const Hybrid<T> &va);
272
284template <typename T> double pearson(const T* va, const T* vb, size_t length);
285template <typename T> double pearson(const std::vector<T> &va, const std::vector<T> &vb);
286template <typename T> double pearson(const Hybrid<T> &va, const Hybrid<T> &vb);
288
301template <typename T> void addScalarToVector(T* va, size_t length, T inc);
302template <typename T> void addScalarToVector(std::vector<T> *va, T inc);
303template <typename T> void addScalarToVector(Hybrid<T> *va, T inc);
305
318template <typename T> void elementwiseMultiply(T* va, size_t length, T factor);
319template <typename T> void elementwiseMultiply(std::vector<T> *va, T factor);
320template <typename T> void elementwiseMultiply(Hybrid<T> *va, T factor);
322
336template <typename T> void elementwiseDivide(T* va, size_t length, T factor);
337template <typename T> void elementwiseDivide(std::vector<T> *va, T factor);
338template <typename T> void elementwiseDivide(Hybrid<T> *va, T factor);
340
358template <typename T> void crossProduct(const T* va, const T* vb, T* vc);
359template <typename T> void crossProduct(const std::vector<T> &va, const std::vector<T> &vb,
360 std::vector<T> *vc);
361template <typename T3> T3 crossProduct(const T3 va, const T3 vb);
363
376template <typename T> double magnitude(const T* va, const size_t length);
377template <typename T> double magnitude(const std::vector<T> &va);
378template <typename T> double magnitude(const Hybrid<T> &va);
380
387template <typename T> T hypotenuse(const T a, const T b);
388
401template <typename T> double normalize(T* va, const size_t length);
402template <typename T> double normalize(std::vector<T> *va);
403template <typename T> double normalize(Hybrid<T> *va);
404template <typename T3, typename Tcalc> Tcalc normalize(T3 *va);
406
421template <typename T> double dot(const T* va, const T* vb, const size_t length);
422template <typename T> double dot(const std::vector<T> &va, const std::vector<T> &vb);
423template <typename T> double dot(const Hybrid<T> &va, const Hybrid<T> &vb);
425
438template <typename T> double angleBetweenVectors(const T* va, const T* vb, const size_t length);
439template <typename T> double angleBetweenVectors(const std::vector<T> &va,
440 const std::vector<T> &vb);
441template <typename T> double angleBetweenVectors(const Hybrid<T> &va, const Hybrid<T> &vb);
443
458template <typename T> void project(const T* va, const T* vb, T* vc, size_t length);
459template <typename T> void project(const std::vector<T> &va, const std::vector<T> &vb,
460 std::vector<T> *vc);
461template <typename T> void project(const Hybrid<T> &va, const Hybrid<T> &vb, Hybrid<T> *vc);
462template <typename T> std::vector<T> project(const std::vector<T> &va, const std::vector<T> &vb);
464
478template <typename T> void perpendicularComponent(const T* va, const T* vb, T* result,
479 const size_t length);
480template <typename T> void perpendicularComponent(const std::vector<T> &va,
481 const std::vector<T> &vb,
482 std::vector<T> *result);
483template <typename T> std::vector<T> perpendicularComponent(const std::vector<T> &va,
484 const std::vector<T> &vb);
486
502template <typename T> double pointPlaneDistance(const T* va, const T* vb, const T* pt_pos);
503template <typename T> double pointPlaneDistance(const std::vector<T> &va, const std::vector<T> &vb,
504 const std::vector<T> &pt_pos);
505template <typename T> double pointPlaneDistance(const Hybrid<T> &va, const Hybrid<T> &vb,
506 const Hybrid<T> &pt_pos);
508
515template <typename T> void reportBinLimitError(const std::string &desc, const T value,
516 const ExceptionResponse policy);
517
533template <typename T> int findBin(const T* limits, const T value, const int length,
534 const ExceptionResponse policy = ExceptionResponse::DIE);
535template <typename T> int findBin(const std::vector<T> &limits, const T value,
536 const ExceptionResponse policy = ExceptionResponse::DIE);
537template <typename T> int findBin(const Hybrid<T> &limits, const T value,
538 const ExceptionResponse policy = ExceptionResponse::DIE);
540
558template <typename T> size_t locateValue(const T* vdata, const T value, const size_t length,
559 const DataOrder format = DataOrder::NONE);
560
561template <typename T> size_t locateValue(const std::vector<T> &vdata, const T value,
562 const DataOrder format = DataOrder::NONE);
563
564template <typename T> size_t locateValue(const Hybrid<T> &vdata, const T value,
565 const DataOrder format = DataOrder::NONE);
566
567template <typename T> size_t locateValue(const Approx &value, const T* vdata, const size_t length,
568 const DataOrder format = DataOrder::NONE);
569
570template <typename T> size_t locateValue(const Approx &value, const std::vector<T> &vdata,
571 const DataOrder format = DataOrder::NONE);
572
573template <typename T> size_t locateValue(const Approx &value, const Hybrid<T> &vdata,
574 const DataOrder format = DataOrder::NONE);
576
587template <typename T> std::vector<T> reduceUniqueValues(const std::vector<T> &va);
588template <typename T> void reduceUniqueValues(std::vector<T> *va);
590
615template <typename T> std::vector<ValueWithCounter<T>>
616findUnmatchedValues(const std::vector<T> &va, const std::vector<T> &vb,
617 UniqueValueHandling check_repeats = UniqueValueHandling::UNIQUE_VALUES_ONLY);
618
619template <typename T> std::vector<ValueWithCounter<T>>
620findUnmatchedValues(const T* va, const T* vb, size_t length_a, size_t length_b,
621 UniqueValueHandling check_repeats = UniqueValueHandling::UNIQUE_VALUES_ONLY);
622
623template <typename T> std::vector<ValueWithCounter<T>>
624findUnmatchedValues(const Hybrid<T> &va, const Hybrid<T> &vb,
625 UniqueValueHandling check_repeats = UniqueValueHandling::UNIQUE_VALUES_ONLY);
627
640void accumulateBitmask(uint* va, const size_t pos);
641void accumulateBitmask(std::vector<uint> *va, const size_t pos);
642void accumulateBitmask(ullint* va, const size_t pos);
643void accumulateBitmask(std::vector<ullint> *va, const size_t pos);
644void accumulateBitmask(ushort* va, const size_t pos);
645void accumulateBitmask(std::vector<ushort> *va, const size_t pos);
647
660void unsetBitInMask(uint* va, const size_t pos);
661void unsetBitInMask(std::vector<uint> *va, const size_t pos);
662void unsetBitInMask(ullint* va, const size_t pos);
663void unsetBitInMask(std::vector<ullint> *va, const size_t pos);
664void unsetBitInMask(ushort* va, const size_t pos);
665void unsetBitInMask(std::vector<ushort> *va, const size_t pos);
667
681int readBitFromMask(const uint* va, const size_t pos);
682int readBitFromMask(const std::vector<uint> &va, const size_t pos);
683int readBitFromMask(const ullint* va, const size_t pos);
684int readBitFromMask(const std::vector<ullint> &va, const size_t pos);
685int readBitFromMask(const ushort* va, const size_t pos);
686int readBitFromMask(const std::vector<ushort> &va, const size_t pos);
688
698template <typename T> std::vector<bool> colorVectorMask(const std::vector<T> &mask);
699
700template <typename T> std::vector<bool> colorVectorMask(const std::vector<T> &mask, size_t length);
701
702template <typename T> void colorVectorMask(std::vector<bool> *result, const std::vector<T> &mask);
704
717template <typename T> std::vector<T> tileVector(const std::vector<T> &va, size_t nrep = 1);
718
719template <typename T>
720std::vector<T> tileVector(const std::vector<T> &va, const std::vector<int> &tidx, size_t nrep = 1);
721
722template <typename T>
723std::vector<T> tileVector(const std::vector<T> &va, const std::vector<size_t> &tidx,
724 size_t nrep = 1);
726
743template <typename Tout>
744std::vector<Tout> convertData(std::vector<int95_t> *input, double input_scale = 1.0,
745 double output_scale = 1.0);
746
747template <typename Tout>
748std::vector<Tout> convertData(std::vector<llint> *primary, std::vector<int> *overflow,
749 double input_scale = 1.0, double output_scale = 1.0);
750
751template <typename Tin>
752std::vector<int95_t> convertData(std::vector<Tin> *input, double input_scale = 1.0,
753 double output_scale = 1.0);
754
755template <typename Tin, typename Tout>
756std::vector<Tout> convertData(std::vector<Tin> *input, double input_scale = 1.0,
757 double output_scale = 1.0);
758
759template <typename Tout>
760Hybrid<Tout> convertData(Hybrid<int95_t> *input, double input_scale = 1.0,
761 double output_scale = 1.0);
762
763template <typename Tout>
764Hybrid<Tout> convertData(Hybrid<llint> *primary, Hybrid<int> *overflow, double input_scale = 1.0,
765 double output_scale = 1.0);
766
767template <typename Tin>
768Hybrid<int95_t> convertData(Hybrid<Tin> *input, double input_scale = 1.0,
769 double output_scale = 1.0);
770
771template <typename Tin, typename Tout>
772Hybrid<Tout> convertData(Hybrid<Tin> *input, double input_scale = 1.0, double output_scale = 1.0);
774
794template <typename T>
795std::vector<T> applyAssociatedSort(const std::vector<T> &unsorted_data,
796 const std::vector<int> &sorting_pattern);
797
798template <typename T>
799std::vector<T> applyAssociatedSort(const std::vector<T> &unsorted_data,
800 const std::vector<size_t> &sorting_pattern);
801
802template <typename T, typename T2>
803std::vector<T> applyAssociatedSort(const std::vector<T> &unsorted_data,
804 const std::vector<T2> &sorting_pattern);
806
807} // namespace stmath
808} // namespace stormm
809
810#include "vector_ops.tpp"
811
812#endif
An evolution of GpuBuffer in pmemd.cuda, the Composite array has elements that are accessible from ei...
Definition hybrid.h:202
Class for handling comparisons of floating-point results versus expected values in unit tests....
Definition approx.h:23