Skip to content

Commit 59ed76e

Browse files
committed
SubArray of subArray now returns subArray of original parent
1 parent 6e5dca4 commit 59ed76e

File tree

5 files changed

+87
-7
lines changed

5 files changed

+87
-7
lines changed

src/backend/cpu/Array.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,23 @@ Array<T> createSubArray(const Array<T> &parent, const vector<af_seq> &index,
279279
dim4 dDims = parent.getDataDims();
280280
dim4 parent_strides = parent.strides();
281281

282-
if (parent.isLinear() == false) {
282+
// Subarray is only possible on linear data (parent) array.
283+
// Subarray of a subarray is only possible on linear data array. Since the
284+
// parent array is already a subarray, it is frequently non-linear.
285+
bool data_isLinear = true;
286+
dim_t count = 1;
287+
for (dim_t i = 0; i < parent.ndims(); ++i) {
288+
if (count != parent_strides[i]) { data_isLinear = false; }
289+
count *= dDims[i];
290+
}
291+
292+
if (!data_isLinear) {
293+
if (!copy) {
294+
// Linearizing parent through copy, is in conflict with the request
295+
// of remaining inLine.
296+
AF_ERROR("createSubArray inLine is impossible on non-Linear arrays",
297+
AF_ERR_INVALID_ARRAY);
298+
}
283299
const Array<T> parentCopy = copyArray(parent);
284300
return createSubArray(parentCopy, index, copy);
285301
}

src/backend/cuda/Array.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,23 @@ Array<T> createSubArray(const Array<T> &parent,
391391
dim4 dDims = parent.getDataDims();
392392
dim4 parent_strides = parent.strides();
393393

394-
if (parent.isLinear() == false) {
394+
// Subarray is only possible on linear data (parent) array.
395+
// Subarray of a subarray is only possible on linear data array. Since the
396+
// parent array is already a subarray, it is frequently non-linear.
397+
bool data_isLinear = true;
398+
dim_t count = 1;
399+
for (dim_t i = 0; i < parent.ndims(); ++i) {
400+
if (count != parent_strides[i]) { data_isLinear = false; }
401+
count *= dDims[i];
402+
}
403+
404+
if (!data_isLinear) {
405+
if (!copy) {
406+
// Linearizing parent through copy, is in conflict with the request
407+
// of remaining inLine.
408+
AF_ERROR("createSubArray inLine is impossible on non-Linear arrays",
409+
AF_ERR_INVALID_ARRAY);
410+
}
395411
const Array<T> parentCopy = copyArray(parent);
396412
return createSubArray(parentCopy, index, copy);
397413
}

src/backend/oneapi/Array.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,23 @@ Array<T> createSubArray(const Array<T> &parent, const vector<af_seq> &index,
434434
dim4 dDims = parent.getDataDims();
435435
dim4 parent_strides = parent.strides();
436436

437-
if (parent.isLinear() == false) {
437+
// Subarray is only possible on linear data (parent) array.
438+
// Subarray of a subarray is only possible on linear data array. Since the
439+
// parent array is already a subarray, it is frequently non-linear.
440+
bool data_isLinear = true;
441+
dim_t count = 1;
442+
for (dim_t i = 0; i < parent.ndims(); ++i) {
443+
if (count != parent_strides[i]) { data_isLinear = false; }
444+
count *= dDims[i];
445+
}
446+
447+
if (!data_isLinear) {
448+
if (!copy) {
449+
// Linearizing parent through copy, is in conflict with the request
450+
// of remaining inLine.
451+
AF_ERROR("createSubArray inLine is impossible on non-Linear arrays",
452+
AF_ERR_INVALID_ARRAY);
453+
}
438454
const Array<T> parentCopy = copyArray(parent);
439455
return createSubArray(parentCopy, index, copy);
440456
}

src/backend/opencl/Array.cpp

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -446,15 +446,30 @@ Array<T> createSubArray(const Array<T> &parent, const vector<af_seq> &index,
446446
dim4 dDims = parent.getDataDims();
447447
dim4 parent_strides = parent.strides();
448448

449-
if (parent.isLinear() == false) {
449+
// Subarray is only possible on linear data (parent) array.
450+
// Subarray of a subarray is only possible on linear data array. Since the
451+
// parent array is already a subarray, it is frequently non-linear.
452+
bool data_isLinear = true;
453+
dim_t count = 1;
454+
for (dim_t i = 0; i < parent.ndims(); ++i) {
455+
if (count != parent_strides[i]) { data_isLinear = false; }
456+
count *= dDims[i];
457+
}
458+
459+
if (!data_isLinear) {
460+
if (!copy) {
461+
// Linearizing parent through copy, is in conflict with the request
462+
// of remaining inLine.
463+
AF_ERROR("createSubArray inLine is impossible on non-Linear arrays",
464+
AF_ERR_INVALID_ARRAY);
465+
}
450466
const Array<T> parentCopy = copyArray(parent);
451467
return createSubArray(parentCopy, index, copy);
452468
}
453469

454470
const dim4 &pDims = parent.dims();
455-
456-
dim4 dims = toDims(index, pDims);
457-
dim4 strides = toStride(index, dDims);
471+
dim4 dims = toDims(index, pDims);
472+
dim4 strides = toStride(index, dDims);
458473

459474
// Find total offsets after indexing
460475
dim4 offsets = toOffset(index, pDims);

test/array.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,23 @@ TEST(Array, ISSUE_951) {
420420
array b = a.cols(0, 20).rows(10, 20);
421421
}
422422

423+
TEST(Array, ISSUE_3534) {
424+
// This works
425+
// array a = range(dim4(5,5));
426+
// a = a.rows(0,3).copy();
427+
// Following assignment failed silently without above copy()
428+
// a(0,0) = 1234;
429+
430+
array a = range(dim4(5, 5));
431+
a = a.rows(1, 4);
432+
a(1, 1) = 1234;
433+
434+
array b = range(dim4(4, 5)) + 1.0;
435+
b(1, 1) = 1234;
436+
437+
ASSERT_ARRAYS_EQ(a, b);
438+
}
439+
423440
TEST(Array, CreateHandleInvalidNullDimsPointer) {
424441
af_array out = 0;
425442
EXPECT_EQ(AF_ERR_ARG, af_create_handle(&out, 1, NULL, f32));

0 commit comments

Comments
 (0)