1#ifndef included_AMP_ArrayClass
2#define included_AMP_ArrayClass
4#include "AMP/utils/ArraySize.h"
5#include "AMP/utils/FunctionTable.h"
6#include "AMP/utils/Memory.h"
11#include <initializer_list>
24template<
class TYPE,
class FUN,
class Allocator>
30 static_assert( !std::is_same_v<TYPE, std::vector<bool>::reference> );
31 static_assert( std::is_same_v<typename FUN::value_type, TYPE> );
32 static_assert( std::is_same_v<typename Allocator::value_type, void> ||
33 std::is_same_v<typename Allocator::value_type, TYPE> );
35 typename std::allocator_traits<Allocator>::template rebind_alloc<TYPE>;
61 explicit Array(
size_t N_rows,
size_t N_columns );
69 explicit Array(
size_t N1,
size_t N2,
size_t N3 );
78 explicit Array(
size_t N1,
size_t N2,
size_t N3,
size_t N4 );
88 explicit Array(
size_t N1,
size_t N2,
size_t N3,
size_t N4,
size_t N5 );
94 template<
typename U = TYPE,
typename =
typename std::enable_if<std::is_same_v<U, TYPE>>::type>
101 explicit Array( std::string range );
113 Array( std::initializer_list<std::initializer_list<TYPE>>
data );
177 const std::shared_ptr<const TYPE> &
data );
259 template<
class TYPE2>
262 using FUN2 =
typename FUN::template cloneTo<TYPE2>;
263 static_assert( std::is_same_v<typename FUN2::value_type, TYPE2> );
265 auto array2 = std::make_unique<ARRAY2>( array->size() );
266 array2.copy( *array );
275 template<
class TYPE2>
278 using FUN2 =
typename FUN::template cloneTo<TYPE2>;
279 static_assert( std::is_same_v<typename FUN2::value_type, TYPE2> );
281 auto array2 = std::make_unique<ARRAY2>( array->size() );
282 array2.copy( *array );
291 template<
class TYPE2,
class FUN2,
class Allocator2>
303 template<
class TYPE2>
310 template<
class TYPE2>
316 template<
class TYPE2>
319 using FUN2 =
typename FUN::template cloneTo<TYPE2>;
320 static_assert( std::is_same_v<typename FUN2::value_type, TYPE2> );
330 template<
class TYPE2>
333 static_assert(
sizeof( TYPE ) ==
sizeof( TYPE2 ) );
334 auto ptr = std::reinterpret_pointer_cast<TYPE2>( std::const_pointer_cast<TYPE>(
d_ptr ) );
335 using FUN2 =
typename FUN::template cloneTo<TYPE2>;
336 static_assert( std::is_same_v<typename FUN2::value_type, TYPE2> );
353 for (
auto &x : *this )
412 void resize(
size_t N_row,
size_t N_col );
420 void resize(
size_t N1,
size_t N2,
size_t N3 );
594 operator()(
size_t i1,
size_t i2,
size_t i3,
size_t i4,
size_t i5 )
const
675 static Array cat(
const std::vector<Array> &x,
int dim = 0 );
678 static Array cat(
const std::initializer_list<Array> &x,
int dim = 0 );
714 TYPE
min(
const std::vector<size_t> &index )
const;
717 TYPE
max(
const std::vector<size_t> &index )
const;
720 TYPE
sum(
const std::vector<size_t> &index )
const;
723 TYPE
mean(
const std::vector<size_t> &index )
const;
738 std::vector<size_t>
find(
const TYPE &value,
739 std::function<
bool(
const TYPE &,
const TYPE & )> compare )
const;
743 std::function<
bool(
const TYPE &,
const TYPE & )> compare )
const;
747 std::function<
bool(
const TYPE &,
const TYPE & )> compare )
const;
751 print( std::ostream &os,
const std::string &name =
"A",
const std::string &prefix =
"" )
const;
788 void axpby(
const TYPE &alpha,
const Array &x,
const TYPE &beta );
794 inline TYPE
interp(
const std::vector<double> &x )
const {
return interp( x.data() ); }
809 bool equals(
const Array &rhs,
const TYPE &tol = 0.000001 )
const;
815 size_t pack( std::byte * )
const;
830 inline std::vector<Range<size_t>>
convert(
const std::vector<size_t> &index )
const;
832 std::array<size_t, 5> &first,
833 std::array<size_t, 5> &last,
834 std::array<size_t, 5> &inc,
835 std::array<size_t, 5> &N );
844 if constexpr ( !std::is_trivially_copyable<TYPE>::value ) {
845 for (
size_t i = 0; i <
d_N; ++i )
864 for (
size_t i = 1; i < s.
ndim(); i++ )
872 out << r.
i <<
':' << r.
k <<
':' << r.
j;
880template<
class TYPE,
class FUN,
class Allocator>
888template<
class TYPE,
class FUN,
class Allocator>
896template<
class TYPE,
class FUN,
class Allocator>
901 FUN::multiply( a.
size(), a.
data(), b.size(), b.data(), c.size(), c.data() );
904template<
class TYPE,
class FUN,
class Allocator>
906 const std::vector<TYPE> &b )
909 b2.
viewRaw( { b.size() },
const_cast<TYPE *
>( b.data() ) );
911 FUN::multiply( a.
size(), a.
data(), b2.
size(), b2.
data(), c.size(), c.data() );
914template<
class TYPE,
class FUN,
class Allocator>
921template<
class TYPE,
class FUN,
class Allocator>
933template<
class TYPE,
class FUN,
class Allocator>
937 if constexpr ( std::is_same_v<TYPE, TYPE2> ) {
938 std::copy( data, data + d_size.length(), d_data );
940 for (
size_t i = 0; i < d_size.length(); i++ )
941 d_data[i] =
static_cast<TYPE
>( data[i] );
944template<
class TYPE,
class FUN,
class Allocator>
948 if constexpr ( std::is_same_v<TYPE, TYPE2> ) {
949 std::copy( d_data, d_data + d_size.length(), data );
951 for (
size_t i = 0; i < d_size.length(); i++ )
952 data[i] =
static_cast<TYPE2
>( d_data[i] );
Simple class to store the array dimensions.
constexpr void setNdim(uint8_t ndim)
constexpr uint8_t ndim() const
Return the number of dimensions.
constexpr size_t index(size_t i) const
Get the index.
constexpr size_t length() const
Return the total number of elements in the array.
scalarAllocator_t d_alloc
Deleter(const scalarAllocator_t &alloc, size_t N)
std::vector< Range< size_t > > convert(const std::vector< size_t > &index) const
ARRAY_INLINE TYPE * ptr(size_t i)
static Array transform(std::function< TYPE(const TYPE &, const TYPE &)> fun, const Array &x, const Array &y)
bool NaNs() const
Return true if NaNs are present.
std::shared_ptr< const TYPE > getPtr() const
Return the pointer to the raw data.
void pow(const Array &base, const TYPE &exp)
Array & operator=(const std::vector< TYPE > &rhs)
int64_t findFirst(const TYPE &value, std::function< bool(const TYPE &, const TYPE &)> compare) const
Find all elements that match the operator (if element is not found return -1)
ARRAY_INLINE TYPE & operator()(size_t i1, size_t i2, size_t i3, size_t i4, size_t i5)
void copyTo(TYPE2 *data) const
Array reverseDim() const
Transpose an array.
ARRAY_INLINE bool empty() const
Return true if the Array is empty.
Array coarsen(const Array &filter) const
Coarsen an array using the given filter.
TYPE sum(const std::vector< size_t > &index) const
Return the sum of all elements.
ARRAY_INLINE const TYPE & operator()(size_t i, size_t j, size_t k) const
ARRAY_INLINE void setFixedSize(bool flag)
Set is copyable.
ARRAY_INLINE void setNdim(int ndim)
scalarAllocator_t d_alloc
static Array staticView(const ArraySize &N, TYPE *data)
ARRAY_INLINE const TYPE * end() const
Get iterator to beginning of data.
ARRAY_INLINE bool isFixedSize() const
Is fixed size?
ARRAY_INLINE const TYPE & operator()(size_t i, size_t j) const
void cat(const Array &x, int dim=0)
Concatenates a given array with the current array.
TYPE max(const std::vector< size_t > &index) const
Return the largest value.
TYPE mean(const std::vector< Range< size_t > > &index) const
Return the mean of all elements.
ARRAY_INLINE const TYPE * begin() const
Get iterator to beginning of data.
Array & operator+=(const Array &rhs)
Add another array.
ARRAY_INLINE const TYPE & operator[](size_t i) const
static auto convert(std::shared_ptr< const Array< TYPE, FUN, Allocator > > array)
static auto convert(std::shared_ptr< Array< TYPE, FUN, Allocator > > array)
ARRAY_INLINE TYPE * data()
Return the pointer to the raw data.
ARRAY_INLINE TYPE & operator[](size_t i)
void checkSubsetIndex(const std::vector< Range< size_t > > &range) const
Array(std::initializer_list< TYPE > data)
void print(std::ostream &os, const std::string &name="A", const std::string &prefix="") const
Print an array.
Array & operator=(const Array &rhs)
std::shared_ptr< TYPE > d_ptr
Array sum(int dir) const
Return the sum of all elements in a given direction.
bool equals(const Array &rhs, const TYPE &tol=0.000001) const
Determine if two Arrays are equal using an absolute tolerance.
void viewRaw(const ArraySize &N, TYPE *data, bool isCopyable=true, bool isFixedSize=true)
ARRAY_INLINE size_t size(int d) const
Return the size of the Array.
std::vector< size_t > find(const TYPE &value, std::function< bool(const TYPE &, const TYPE &)> compare) const
Find all elements that match the operator.
ARRAY_INLINE const ArraySize & size() const
Return the size of the Array.
bool operator!=(const Array &rhs) const
Check if two matrices are not equal.
void addSubset(const std::vector< Range< size_t > > &index, const Array &subset)
Array & operator+=(const TYPE &rhs)
Add a scalar.
void addSubset(const std::vector< size_t > &index, const Array &subset)
void allocate(const ArraySize &N)
void copySubset(const std::vector< Range< size_t > > &index, const Array &subset)
TYPE sum(const std::vector< Range< size_t > > &index) const
Return the sum of all elements.
ARRAY_INLINE const TYPE & operator()(size_t i) const
Array(size_t N_rows, size_t N_columns)
Array & operator=(Array &&rhs)
bool operator==(const Array &rhs) const
Check if two matrices are equal.
void view2(const ArraySize &N, std::shared_ptr< TYPE > data)
TYPE min() const
Return the smallest value.
static Array cat(const std::vector< Array > &x, int dim=0)
Concatenates the arrays along the dimension dim.
static std::unique_ptr< Array > view(const ArraySize &N, std::shared_ptr< TYPE > data)
auto reinterpretArray() const
Array(size_t N1, size_t N2, size_t N3, size_t N4, size_t N5)
int64_t findLast(const TYPE &value, std::function< bool(const TYPE &, const TYPE &)> compare) const
Find all elements that match the operator (if element is not found return -1)
TYPE sum() const
Return the sum of all elements.
void clear()
Clear the data in the array.
static Array transform(std::function< TYPE(const TYPE &)> fun, const Array &x)
std::shared_ptr< TYPE > getPtr()
Return the pointer to the raw data.
Array max(int dir) const
Return the max of all elements in a given direction.
static Array cat(size_t N_array, const Array *x, int dim)
Concatenates the arrays along the dimension dim.
ARRAY_INLINE TYPE & operator()(size_t i, size_t j, size_t k)
TYPE min(const std::vector< size_t > &index) const
Return the smallest value.
Array coarsen(const ArraySize &ratio, std::function< TYPE(const Array &)> filter) const
Coarsen an array using the given filter.
ARRAY_INLINE void setCopyable(bool flag)
Set is copyable.
ARRAY_INLINE const TYPE & operator()(size_t i1, size_t i2, size_t i3, size_t i4) const
void copy(const Array< TYPE2, FUN2, Allocator2 > &array)
static std::unique_ptr< const Array > constView(const ArraySize &N, const std::shared_ptr< const TYPE > &data)
TYPE mean() const
Return the mean of all elements.
typename std::allocator_traits< Allocator >::template rebind_alloc< TYPE > scalarAllocator_t
ARRAY_INLINE const TYPE * ptr(size_t i) const
ARRAY_INLINE const TYPE & operator()(size_t i1, size_t i2, size_t i3, size_t i4, size_t i5) const
ARRAY_INLINE TYPE & operator()(size_t i, size_t j)
Array(const Range< U > &range)
Array min(int dir) const
Return the min of all elements in a given direction.
ARRAY_INLINE int ndim() const
Return the size of the Array.
void resize(size_t N_row, size_t N_col)
Array repmat(const ArraySize &N) const
Replicate an array a given number of times in each direction.
ARRAY_INLINE void fill(const TYPE &y)
TYPE interp(const std::vector< double > &x) const
void scale(const TYPE &y)
void viewRaw(int ndim, const size_t *dims, TYPE *data, bool isCopyable=true, bool isFixedSize=true)
void axpby(const TYPE &alpha, const Array &x, const TYPE &beta)
Array & operator-=(const Array &rhs)
Subtract another array.
ARRAY_INLINE TYPE * end()
Get iterator to beginning of data.
Array(const ArraySize &N, const TYPE *data=nullptr)
Array subset(const std::vector< Range< size_t > > &index) const
void copy(const TYPE2 *data)
size_t pack(std::byte *) const
Pack the data to a buffer.
TYPE max() const
Return the largest value.
size_t unpack(const std::byte *)
Unpack the data from a buffer.
ARRAY_INLINE size_t length() const
Return the size of the Array.
void reshape(const ArraySize &N)
ARRAY_INLINE bool isCopyable() const
Is copyable?
Array< TYPE, FUN, Allocator > view()
ARRAY_INLINE TYPE & operator()(size_t i)
size_t packSize() const
Return the number of bytes required to pack the data.
ARRAY_INLINE const TYPE * data() const
Return the pointer to the raw data.
TYPE min(const std::vector< Range< size_t > > &index) const
Return the smallest value.
void rand()
Initialize the array with random values (defined from the function table)
Array(size_t N1, size_t N2, size_t N3)
ARRAY_INLINE TYPE * begin()
Get iterator to beginning of data.
void resize(const ArraySize &N)
Array(std::initializer_list< std::initializer_list< TYPE > > data)
void resize(size_t N1, size_t N2, size_t N3)
void resizeDim(int dim, size_t N, const TYPE &value)
Array(size_t N1, size_t N2, size_t N3, size_t N4)
Array & operator-=(const TYPE &rhs)
Subtract a scalar.
Array subset(const std::vector< size_t > &index) const
void copySubset(const std::vector< size_t > &index, const Array &subset)
ARRAY_INLINE TYPE & operator()(size_t i1, size_t i2, size_t i3, size_t i4)
static Array cat(const std::initializer_list< Array > &x, int dim=0)
Concatenates the arrays along the dimension dim.
TYPE mean(const std::vector< size_t > &index) const
Return the mean of all elements.
TYPE max(const std::vector< Range< size_t > > &index) const
Return the largest value.
TYPE interp(const double *x) const
static void getSubsetArrays(const std::vector< Range< size_t > > &range, std::array< size_t, 5 > &first, std::array< size_t, 5 > &last, std::array< size_t, 5 > &inc, std::array< size_t, 5 > &N)
Array< TYPE, FUN, Allocator > operator-(const Array< TYPE, FUN, Allocator > &a, const Array< TYPE, FUN, Allocator > &b)
constexpr ArraySize multiplySize(const ArraySize &sa, const ArraySize &sb)
std::ostream & operator<<(std::ostream &out, const AMP::ArraySize &s)
Array< TYPE, FUN, Allocator > operator*(const Array< TYPE, FUN, Allocator > &a, const Array< TYPE, FUN, Allocator > &b)
Array< TYPE, FUN, Allocator > operator+(const Array< TYPE, FUN, Allocator > &a, const Array< TYPE, FUN, Allocator > &b)