11template <
typename str
ide_t>
14 const std::vector<int>& shape,
15 const std::vector<stride_t>& strides) {
17 for (
int i = shape.size() - 1; i >= 0; --i) {
18 auto q_and_r = ldiv(elem, shape[i]);
19 loc += q_and_r.rem * strides[i];
32template <
typename str
ide_t>
34 std::vector<stride_t> strides(shape.size(), 1);
35 for (
int i = shape.size() - 1; i > 0; i--) {
36 strides[i - 1] = strides[i] * shape[i];
47template <
typename str
ide_t>
48inline std::tuple<std::vector<int>, std::vector<std::vector<stride_t>>>
50 const std::vector<int>& shape,
51 const std::vector<std::vector<stride_t>> strides) {
54 std::vector<int> to_collapse;
55 if (shape.size() > 0) {
56 to_collapse.push_back(0);
57 for (
int i = 1; i < shape.size(); i++) {
58 bool contiguous =
true;
59 for (
const std::vector<stride_t>& st : strides) {
60 if (st[i] * shape[i] != st[i - 1]) {
68 to_collapse.push_back(-1);
70 to_collapse.push_back(i);
72 to_collapse.push_back(-1);
75 std::vector<int> out_shape;
76 std::vector<std::vector<stride_t>> out_strides(strides.size());
77 for (
int i = 0; i < to_collapse.size(); i++) {
78 int current_shape = shape[to_collapse[i]];
79 while (to_collapse[++i] != -1) {
80 current_shape *= shape[to_collapse[i]];
82 out_shape.push_back(current_shape);
83 for (
int j = 0; j < strides.size(); j++) {
84 const std::vector<stride_t>& st = strides[j];
85 out_strides[j].push_back(st[to_collapse[i - 1]]);
89 return std::make_tuple(out_shape, out_strides);
92inline std::tuple<std::vector<int>, std::vector<std::vector<size_t>>>
94 std::vector<std::vector<size_t>> strides;
96 strides.emplace_back(x.strides());
104 std::vector<array>{std::forward<Arrays>(xs)...});
108inline std::tuple<std::vector<int>, std::vector<size_t>>
110 const std::vector<int>& shape,
111 const std::vector<size_t>& strides) {
112 std::vector<int> collapsed_shape;
113 std::vector<size_t> collapsed_strides;
115 if (shape.size() > 0) {
116 collapsed_shape.push_back(shape[0]);
117 collapsed_strides.push_back(strides[0]);
118 for (
int i = 1; i < shape.size(); i++) {
119 if (strides[i] * shape[i] != collapsed_strides.back() ||
120 collapsed_shape.back() *
static_cast<size_t>(shape[i]) >
121 std::numeric_limits<int>::max()) {
122 collapsed_shape.push_back(shape[i]);
123 collapsed_strides.push_back(strides[i]);
125 collapsed_shape.back() *= shape[i];
126 collapsed_strides.back() = strides[i];
131 return std::make_tuple(collapsed_shape, collapsed_strides);
134template <
typename str
ide_t>
136 const std::vector<int>& shape,
137 const std::vector<stride_t>& strides) {
138 size_t no_broadcast_data_size = 1;
141 bool is_row_contiguous =
true;
142 bool is_col_contiguous =
true;
144 for (
int i = 0, ri = shape.size() - 1; ri >= 0; i++, ri--) {
145 is_col_contiguous &= strides[i] == f_stride || shape[i] == 1;
146 is_row_contiguous &= strides[ri] == b_stride || shape[ri] == 1;
147 f_stride *= shape[i];
148 b_stride *= shape[ri];
149 if (strides[i] > 0) {
150 no_broadcast_data_size *= shape[i];
154 return std::make_tuple(
155 no_broadcast_data_size, is_row_contiguous, is_col_contiguous);
159 constexpr size_t donation_extra = 16384;
const Flags & flags() const
Get the Flags bit-field.
Definition array.h:302
const std::vector< size_t > & strides() const
The strides of the array.
Definition array.h:113
size_t nbytes() const
The number of bytes in the array.
Definition array.h:89
bool is_donatable() const
True indicates the arrays buffer is safe to reuse.
Definition array.h:267
const std::vector< int > & shape() const
The shape of the array as a vector of integers.
Definition array.h:99
size_t buffer_size() const
Definition array.h:327
size_t itemsize() const
The size of the array's datatype in bytes.
Definition array.h:79
stride_t elem_to_loc(int elem, const std::vector< int > &shape, const std::vector< stride_t > &strides)
Definition utils.h:12
auto check_contiguity(const std::vector< int > &shape, const std::vector< stride_t > &strides)
Definition utils.h:135
std::tuple< std::vector< int >, std::vector< std::vector< stride_t > > > collapse_contiguous_dims(const std::vector< int > &shape, const std::vector< std::vector< stride_t > > strides)
Definition utils.h:49
std::vector< stride_t > make_contiguous_strides(const std::vector< int > &shape)
Definition utils.h:33
bool is_donatable(const array &in, const array &out)
Definition utils.h:158
typename std::enable_if_t< is_arrays_v< T... > > enable_for_arrays_t
Definition array.h:589
bool row_contiguous
Definition array.h:233