[arrayfire] 18/41: BUGFIX diagonal extract length is min instead of max of dims

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Mon Mar 21 14:56:22 UTC 2016


This is an automated email from the git hooks/post-receive script.

ghisvail-guest pushed a commit to branch debian/experimental
in repository arrayfire.

commit 1fc86c44774ccd4b04b44450cf170b1b753d0d07
Author: Shehzan Mohammed <shehzan at arrayfire.com>
Date:   Wed Mar 9 15:12:43 2016 -0500

    BUGFIX diagonal extract length is min instead of max of dims
---
 src/backend/cpu/diagonal.cpp    |  2 +-
 src/backend/cuda/diagonal.cu    |  2 +-
 src/backend/opencl/diagonal.cpp |  2 +-
 test/diagonal.cpp               | 31 +++++++++++++++++++++++++++++++
 4 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/src/backend/cpu/diagonal.cpp b/src/backend/cpu/diagonal.cpp
index c818f82..80375ea 100644
--- a/src/backend/cpu/diagonal.cpp
+++ b/src/backend/cpu/diagonal.cpp
@@ -42,7 +42,7 @@ Array<T> diagExtract(const Array<T> &in, const int num)
     in.eval();
 
     const dim4 idims = in.dims();
-    dim_t size = std::max(idims[0], idims[1]) - std::abs(num);
+    dim_t size = std::min(idims[0], idims[1]) - std::abs(num);
     Array<T> out = createEmptyArray<T>(dim4(size, 1, idims[2], idims[3]));
 
     getQueue().enqueue(kernel::diagExtract<T>, out, in, num);
diff --git a/src/backend/cuda/diagonal.cu b/src/backend/cuda/diagonal.cu
index fd023c9..db0d1b4 100644
--- a/src/backend/cuda/diagonal.cu
+++ b/src/backend/cuda/diagonal.cu
@@ -34,7 +34,7 @@ namespace cuda
     Array<T> diagExtract(const Array<T> &in, const int num)
     {
         const dim_t *idims = in.dims().get();
-        dim_t size = std::max(idims[0], idims[1]) - std::abs(num);
+        dim_t size = std::min(idims[0], idims[1]) - std::abs(num);
         Array<T> out = createEmptyArray<T>(dim4(size, 1, idims[2], idims[3]));
 
         kernel::diagExtract<T>(out, in, num);
diff --git a/src/backend/opencl/diagonal.cpp b/src/backend/opencl/diagonal.cpp
index 79cd758..8693b11 100644
--- a/src/backend/opencl/diagonal.cpp
+++ b/src/backend/opencl/diagonal.cpp
@@ -34,7 +34,7 @@ namespace opencl
     Array<T> diagExtract(const Array<T> &in, const int num)
     {
         const dim_t *idims = in.dims().get();
-        dim_t size = std::max(idims[0], idims[1]) - std::abs(num);
+        dim_t size = std::min(idims[0], idims[1]) - std::abs(num);
         Array<T> out = createEmptyArray<T>(dim4(size, 1, idims[2], idims[3]));
 
         kernel::diagExtract<T>(out, in, num);
diff --git a/test/diagonal.cpp b/test/diagonal.cpp
index c4becab..3f5e441 100644
--- a/test/diagonal.cpp
+++ b/test/diagonal.cpp
@@ -80,6 +80,37 @@ TYPED_TEST(Diagonal, Extract)
     }
 }
 
+TYPED_TEST(Diagonal, ExtractRect)
+{
+    if (noDoubleTests<TypeParam>()) return;
+
+    try {
+        static const int size0 = 1000, size1 = 900;
+        vector<TypeParam> input (size0 * size1);
+        for(int i = 0; i < size0 * size1; i++) {
+            input[i] = i;
+        }
+
+        for(int jj = 10; jj < size0; jj += 100) {
+            for(int kk = 10; kk < size1; kk += 90) {
+                array data(jj, kk, &input.front(), afHost);
+                array out = diag(data, 0);
+
+                vector<TypeParam> h_out(out.elements());
+                out.host(&h_out.front());
+
+                ASSERT_EQ(out.dims(0), std::min(jj, kk));
+
+                for(int i =0; i < (int)out.dims(0); i++) {
+                    ASSERT_EQ(input[i * data.dims(0) + i], h_out[i]);
+                }
+            }
+        }
+    } catch (const af::exception& ex) {
+        FAIL() << ex.what() << std::endl;
+    }
+}
+
 TEST(Diagonal, ExtractGFOR)
 {
     dim4 dims = dim4(100, 100, 3);

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/arrayfire.git



More information about the debian-science-commits mailing list