2#ifndef STORMM_VECTOR_OPS_H
3#define STORMM_VECTOR_OPS_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"
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;
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,
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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,
361template <
typename T3> T3 crossProduct(
const T3 va,
const T3 vb);
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);
387template <
typename T> T hypotenuse(
const T a,
const T b);
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);
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);
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);
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,
462template <
typename T> std::vector<T> project(
const std::vector<T> &va,
const std::vector<T> &vb);
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);
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,
515template <
typename T>
void reportBinLimitError(
const std::string &desc,
const T value,
516 const ExceptionResponse policy);
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);
558template <
typename T>
size_t locateValue(
const T* vdata,
const T value,
const size_t length,
559 const DataOrder format = DataOrder::NONE);
561template <
typename T>
size_t locateValue(
const std::vector<T> &vdata,
const T value,
562 const DataOrder format = DataOrder::NONE);
564template <
typename T>
size_t locateValue(
const Hybrid<T> &vdata,
const T value,
565 const DataOrder format = DataOrder::NONE);
567template <
typename T>
size_t locateValue(
const Approx &value,
const T* vdata,
const size_t length,
568 const DataOrder format = DataOrder::NONE);
570template <
typename T>
size_t locateValue(
const Approx &value,
const std::vector<T> &vdata,
571 const DataOrder format = DataOrder::NONE);
573template <
typename T>
size_t locateValue(
const Approx &value,
const Hybrid<T> &vdata,
574 const DataOrder format = DataOrder::NONE);
587template <
typename T> std::vector<T> reduceUniqueValues(
const std::vector<T> &va);
588template <
typename T>
void reduceUniqueValues(std::vector<T> *va);
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);
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);
623template <
typename T> std::vector<ValueWithCounter<T>>
625 UniqueValueHandling check_repeats = UniqueValueHandling::UNIQUE_VALUES_ONLY);
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);
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);
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);
698template <
typename T> std::vector<bool> colorVectorMask(
const std::vector<T> &mask);
700template <
typename T> std::vector<bool> colorVectorMask(
const std::vector<T> &mask,
size_t length);
702template <
typename T>
void colorVectorMask(std::vector<bool> *result,
const std::vector<T> &mask);
717template <
typename T> std::vector<T> tileVector(
const std::vector<T> &va,
size_t nrep = 1);
720std::vector<T> tileVector(
const std::vector<T> &va,
const std::vector<int> &tidx,
size_t nrep = 1);
723std::vector<T> tileVector(
const std::vector<T> &va,
const std::vector<size_t> &tidx,
743template <
typename Tout>
744std::vector<Tout> convertData(std::vector<int95_t> *input,
double input_scale = 1.0,
745 double output_scale = 1.0);
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);
751template <
typename Tin>
752std::vector<int95_t> convertData(std::vector<Tin> *input,
double input_scale = 1.0,
753 double output_scale = 1.0);
755template <
typename Tin,
typename Tout>
756std::vector<Tout> convertData(std::vector<Tin> *input,
double input_scale = 1.0,
757 double output_scale = 1.0);
759template <
typename Tout>
761 double output_scale = 1.0);
763template <
typename Tout>
765 double output_scale = 1.0);
767template <
typename Tin>
769 double output_scale = 1.0);
771template <
typename Tin,
typename Tout>
795std::vector<T> applyAssociatedSort(
const std::vector<T> &unsorted_data,
796 const std::vector<int> &sorting_pattern);
799std::vector<T> applyAssociatedSort(
const std::vector<T> &unsorted_data,
800 const std::vector<size_t> &sorting_pattern);
802template <
typename T,
typename T2>
803std::vector<T> applyAssociatedSort(
const std::vector<T> &unsorted_data,
804 const std::vector<T2> &sorting_pattern);
810#include "vector_ops.tpp"
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