aboutsummaryrefslogtreecommitdiffhomepage
path: root/unsupported/test/cxx11_tensor_volume_patch.cpp
diff options
context:
space:
mode:
authorGravatar Benoit Steiner <benoit.steiner.goog@gmail.com>2015-06-30 14:48:26 -0700
committerGravatar Benoit Steiner <benoit.steiner.goog@gmail.com>2015-06-30 14:48:26 -0700
commitdc31fcb9ba064f2124827aefb2ca5857327c005e (patch)
treead330ebeeda27a89d37d9607643d02703de41c10 /unsupported/test/cxx11_tensor_volume_patch.cpp
parentf587075987440170dc0856dd08453395e777ad07 (diff)
Added support for 3D patch extraction
Diffstat (limited to 'unsupported/test/cxx11_tensor_volume_patch.cpp')
-rw-r--r--unsupported/test/cxx11_tensor_volume_patch.cpp112
1 files changed, 112 insertions, 0 deletions
diff --git a/unsupported/test/cxx11_tensor_volume_patch.cpp b/unsupported/test/cxx11_tensor_volume_patch.cpp
new file mode 100644
index 000000000..ca6840f3b
--- /dev/null
+++ b/unsupported/test/cxx11_tensor_volume_patch.cpp
@@ -0,0 +1,112 @@
+#include "main.h"
+
+#include <Eigen/CXX11/Tensor>
+
+using Eigen::Tensor;
+
+static void test_single_voxel_patch()
+{
+ Tensor<float, 5> tensor(4,2,3,5,7);
+ tensor.setRandom();
+ Tensor<float, 5, RowMajor> tensor_row_major = tensor.swap_layout();
+
+ Tensor<float, 6> single_voxel_patch;
+ single_voxel_patch = tensor.extract_volume_patches(1, 1, 1);
+ VERIFY_IS_EQUAL(single_voxel_patch.dimension(0), 4);
+ VERIFY_IS_EQUAL(single_voxel_patch.dimension(1), 1);
+ VERIFY_IS_EQUAL(single_voxel_patch.dimension(2), 1);
+ VERIFY_IS_EQUAL(single_voxel_patch.dimension(3), 1);
+ VERIFY_IS_EQUAL(single_voxel_patch.dimension(4), 2 * 3 * 5);
+ VERIFY_IS_EQUAL(single_voxel_patch.dimension(5), 7);
+
+ Tensor<float, 6, RowMajor> single_voxel_patch_row_major;
+ single_voxel_patch_row_major = tensor_row_major.extract_volume_patches(1, 1, 1);
+ VERIFY_IS_EQUAL(single_voxel_patch_row_major.dimension(0), 7);
+ VERIFY_IS_EQUAL(single_voxel_patch_row_major.dimension(1), 2 * 3 * 5);
+ VERIFY_IS_EQUAL(single_voxel_patch_row_major.dimension(2), 1);
+ VERIFY_IS_EQUAL(single_voxel_patch_row_major.dimension(3), 1);
+ VERIFY_IS_EQUAL(single_voxel_patch_row_major.dimension(4), 1);
+ VERIFY_IS_EQUAL(single_voxel_patch_row_major.dimension(5), 4);
+
+ for (int i = 0; i < tensor.size(); ++i) {
+ VERIFY_IS_EQUAL(tensor.data()[i], single_voxel_patch.data()[i]);
+ VERIFY_IS_EQUAL(tensor_row_major.data()[i], single_voxel_patch_row_major.data()[i]);
+ VERIFY_IS_EQUAL(tensor.data()[i], tensor_row_major.data()[i]);
+ }
+}
+
+
+static void test_entire_volume_patch()
+{
+ const int depth = 4;
+ const int patch_z = 2;
+ const int patch_y = 3;
+ const int patch_x = 5;
+ const int batch = 7;
+
+ Tensor<float, 5> tensor(depth, patch_z, patch_y, patch_x, batch);
+ tensor.setRandom();
+ Tensor<float, 5, RowMajor> tensor_row_major = tensor.swap_layout();
+
+ Tensor<float, 6> entire_volume_patch;
+ entire_volume_patch = tensor.extract_volume_patches(patch_z, patch_y, patch_x);
+ VERIFY_IS_EQUAL(entire_volume_patch.dimension(0), depth);
+ VERIFY_IS_EQUAL(entire_volume_patch.dimension(1), patch_z);
+ VERIFY_IS_EQUAL(entire_volume_patch.dimension(2), patch_y);
+ VERIFY_IS_EQUAL(entire_volume_patch.dimension(3), patch_x);
+ VERIFY_IS_EQUAL(entire_volume_patch.dimension(4), patch_z * patch_y * patch_x);
+ VERIFY_IS_EQUAL(entire_volume_patch.dimension(5), batch);
+
+ Tensor<float, 6, RowMajor> entire_volume_patch_row_major;
+ entire_volume_patch_row_major = tensor_row_major.extract_volume_patches(patch_z, patch_y, patch_x);
+ VERIFY_IS_EQUAL(entire_volume_patch_row_major.dimension(0), batch);
+ VERIFY_IS_EQUAL(entire_volume_patch_row_major.dimension(1), patch_z * patch_y * patch_x);
+ VERIFY_IS_EQUAL(entire_volume_patch_row_major.dimension(2), patch_x);
+ VERIFY_IS_EQUAL(entire_volume_patch_row_major.dimension(3), patch_y);
+ VERIFY_IS_EQUAL(entire_volume_patch_row_major.dimension(4), patch_z);
+ VERIFY_IS_EQUAL(entire_volume_patch_row_major.dimension(5), depth);
+
+ const int dz = patch_z - 1;
+ const int dy = patch_y - 1;
+ const int dx = patch_x - 1;
+
+ const int forward_pad_z = dz - dz / 2;
+ const int forward_pad_y = dy - dy / 2;
+ const int forward_pad_x = dx - dx / 2;
+
+ for (int pz = 0; pz < patch_z; pz++) {
+ for (int py = 0; py < patch_y; py++) {
+ for (int px = 0; px < patch_x; px++) {
+ const int patchId = pz + patch_z * (py + px * patch_y);
+ for (int z = 0; z < patch_z; z++) {
+ for (int y = 0; y < patch_y; y++) {
+ for (int x = 0; x < patch_x; x++) {
+ for (int b = 0; b < batch; b++) {
+ for (int d = 0; d < depth; d++) {
+ float expected = 0.0f;
+ float expected_row_major = 0.0f;
+ const int eff_z = z - forward_pad_z + pz;
+ const int eff_y = y - forward_pad_y + py;
+ const int eff_x = x - forward_pad_x + px;
+ if (eff_z >= 0 && eff_y >= 0 && eff_x >= 0 &&
+ eff_z < patch_z && eff_y < patch_y && eff_x < patch_x) {
+ expected = tensor(d, eff_z, eff_y, eff_x, b);
+ expected_row_major = tensor_row_major(b, eff_x, eff_y, eff_z, d);
+ }
+ VERIFY_IS_EQUAL(entire_volume_patch(d, z, y, x, patchId, b), expected);
+ VERIFY_IS_EQUAL(entire_volume_patch_row_major(b, patchId, x, y, z, d), expected_row_major);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+void test_cxx11_tensor_volume_patch()
+{
+ CALL_SUBTEST(test_single_voxel_patch());
+ CALL_SUBTEST(test_entire_volume_patch());
+}