From 6f2656214a8379c26615925a694a526d5d8c0ef6 Mon Sep 17 00:00:00 2001 From: youge325 Date: Thu, 8 Jan 2026 17:25:40 +0800 Subject: [PATCH 1/2] add squeeze and unsqueeze test --- test/TensorTest.cpp | 103 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/test/TensorTest.cpp b/test/TensorTest.cpp index cb50e62..c42a2cc 100644 --- a/test/TensorTest.cpp +++ b/test/TensorTest.cpp @@ -287,5 +287,108 @@ TEST_F(TensorTest, SymNumel) { EXPECT_EQ(sym_numel, tensor.numel()); } +// 测试 squeeze +TEST_F(TensorTest, Squeeze) { + // 创建一个包含大小为1的维度的tensor: shape = {2, 1, 3, 1, 4} + at::Tensor tensor_with_ones = at::ones({2, 1, 3, 1, 4}, at::kFloat); + + // 移除所有大小为1的维度 + at::Tensor squeezed = tensor_with_ones.squeeze(); + EXPECT_EQ(squeezed.dim(), 3); + EXPECT_EQ(squeezed.sizes()[0], 2); + EXPECT_EQ(squeezed.sizes()[1], 3); + EXPECT_EQ(squeezed.sizes()[2], 4); + EXPECT_EQ(squeezed.numel(), 24); + + // 移除指定维度(维度1,大小为1) + at::Tensor squeezed_dim1 = tensor_with_ones.squeeze(1); + EXPECT_EQ(squeezed_dim1.dim(), 4); + EXPECT_EQ(squeezed_dim1.sizes()[0], 2); + EXPECT_EQ(squeezed_dim1.sizes()[1], 3); + EXPECT_EQ(squeezed_dim1.sizes()[2], 1); + EXPECT_EQ(squeezed_dim1.sizes()[3], 4); +} + +// 测试 squeeze_ (原位操作) +TEST_F(TensorTest, SqueezeInplace) { + // 创建一个包含大小为1的维度的tensor: shape = {2, 1, 3, 1, 4} + at::Tensor tensor_with_ones = at::ones({2, 1, 3, 1, 4}, at::kFloat); + + // 记录原始数据指针 + void* original_ptr = tensor_with_ones.data_ptr(); + + // 原位移除所有大小为1的维度 + tensor_with_ones.squeeze_(); + EXPECT_EQ(tensor_with_ones.dim(), 3); + EXPECT_EQ(tensor_with_ones.sizes()[0], 2); + EXPECT_EQ(tensor_with_ones.sizes()[1], 3); + EXPECT_EQ(tensor_with_ones.sizes()[2], 4); + EXPECT_EQ(tensor_with_ones.numel(), 24); + + // 验证是原位操作(数据指针未改变) + EXPECT_EQ(tensor_with_ones.data_ptr(), original_ptr); + + // 测试原位移除指定维度 + at::Tensor tensor_with_ones2 = at::ones({2, 1, 3, 1, 4}, at::kFloat); + tensor_with_ones2.squeeze_(1); + EXPECT_EQ(tensor_with_ones2.dim(), 4); + EXPECT_EQ(tensor_with_ones2.sizes()[1], 3); +} + +// 测试 unsqueeze +TEST_F(TensorTest, Unsqueeze) { + // 在维度0之前添加一个大小为1的维度 + at::Tensor unsqueezed0 = tensor.unsqueeze(0); + EXPECT_EQ(unsqueezed0.dim(), 4); + EXPECT_EQ(unsqueezed0.sizes()[0], 1); + EXPECT_EQ(unsqueezed0.sizes()[1], 2); + EXPECT_EQ(unsqueezed0.sizes()[2], 3); + EXPECT_EQ(unsqueezed0.sizes()[3], 4); + EXPECT_EQ(unsqueezed0.numel(), 24); + + // 在维度2之前添加一个大小为1的维度 + at::Tensor unsqueezed2 = tensor.unsqueeze(2); + EXPECT_EQ(unsqueezed2.dim(), 4); + EXPECT_EQ(unsqueezed2.sizes()[0], 2); + EXPECT_EQ(unsqueezed2.sizes()[1], 3); + EXPECT_EQ(unsqueezed2.sizes()[2], 1); + EXPECT_EQ(unsqueezed2.sizes()[3], 4); + + // 在最后添加一个大小为1的维度(使用负索引-1) + at::Tensor unsqueezed_last = tensor.unsqueeze(-1); + EXPECT_EQ(unsqueezed_last.dim(), 4); + EXPECT_EQ(unsqueezed_last.sizes()[0], 2); + EXPECT_EQ(unsqueezed_last.sizes()[1], 3); + EXPECT_EQ(unsqueezed_last.sizes()[2], 4); + EXPECT_EQ(unsqueezed_last.sizes()[3], 1); +} + +// 测试 unsqueeze_ (原位操作) +TEST_F(TensorTest, UnsqueezeInplace) { + // 创建一个新的tensor用于原位操作 + at::Tensor test_tensor = at::ones({2, 3, 4}, at::kFloat); + + // 记录原始数据指针 + void* original_ptr = test_tensor.data_ptr(); + + // 原位在维度0之前添加一个大小为1的维度 + test_tensor.unsqueeze_(0); + EXPECT_EQ(test_tensor.dim(), 4); + EXPECT_EQ(test_tensor.sizes()[0], 1); + EXPECT_EQ(test_tensor.sizes()[1], 2); + EXPECT_EQ(test_tensor.sizes()[2], 3); + EXPECT_EQ(test_tensor.sizes()[3], 4); + EXPECT_EQ(test_tensor.numel(), 24); + + // 验证是原位操作(数据指针未改变) + EXPECT_EQ(test_tensor.data_ptr(), original_ptr); + + // 测试使用负索引的原位操作 + at::Tensor test_tensor2 = at::ones({2, 3, 4}, at::kFloat); + test_tensor2.unsqueeze_(-1); + EXPECT_EQ(test_tensor2.dim(), 4); + EXPECT_EQ(test_tensor2.sizes()[3], 1); +} + } // namespace test } // namespace at From 8f2d046fef4829f5a6ac7b5c9ef5564a5be5686b Mon Sep 17 00:00:00 2001 From: youge325 Date: Fri, 6 Feb 2026 10:54:53 +0800 Subject: [PATCH 2/2] rewrite test files --- test/TensorTest.cpp | 103 ----------------------------------- test/ops/SqueezeTest.cpp | 96 ++++++++++++++++++++++++++++++++ test/ops/UnsqueezeTest.cpp | 109 +++++++++++++++++++++++++++++++++++++ 3 files changed, 205 insertions(+), 103 deletions(-) create mode 100644 test/ops/SqueezeTest.cpp create mode 100644 test/ops/UnsqueezeTest.cpp diff --git a/test/TensorTest.cpp b/test/TensorTest.cpp index c42a2cc..cb50e62 100644 --- a/test/TensorTest.cpp +++ b/test/TensorTest.cpp @@ -287,108 +287,5 @@ TEST_F(TensorTest, SymNumel) { EXPECT_EQ(sym_numel, tensor.numel()); } -// 测试 squeeze -TEST_F(TensorTest, Squeeze) { - // 创建一个包含大小为1的维度的tensor: shape = {2, 1, 3, 1, 4} - at::Tensor tensor_with_ones = at::ones({2, 1, 3, 1, 4}, at::kFloat); - - // 移除所有大小为1的维度 - at::Tensor squeezed = tensor_with_ones.squeeze(); - EXPECT_EQ(squeezed.dim(), 3); - EXPECT_EQ(squeezed.sizes()[0], 2); - EXPECT_EQ(squeezed.sizes()[1], 3); - EXPECT_EQ(squeezed.sizes()[2], 4); - EXPECT_EQ(squeezed.numel(), 24); - - // 移除指定维度(维度1,大小为1) - at::Tensor squeezed_dim1 = tensor_with_ones.squeeze(1); - EXPECT_EQ(squeezed_dim1.dim(), 4); - EXPECT_EQ(squeezed_dim1.sizes()[0], 2); - EXPECT_EQ(squeezed_dim1.sizes()[1], 3); - EXPECT_EQ(squeezed_dim1.sizes()[2], 1); - EXPECT_EQ(squeezed_dim1.sizes()[3], 4); -} - -// 测试 squeeze_ (原位操作) -TEST_F(TensorTest, SqueezeInplace) { - // 创建一个包含大小为1的维度的tensor: shape = {2, 1, 3, 1, 4} - at::Tensor tensor_with_ones = at::ones({2, 1, 3, 1, 4}, at::kFloat); - - // 记录原始数据指针 - void* original_ptr = tensor_with_ones.data_ptr(); - - // 原位移除所有大小为1的维度 - tensor_with_ones.squeeze_(); - EXPECT_EQ(tensor_with_ones.dim(), 3); - EXPECT_EQ(tensor_with_ones.sizes()[0], 2); - EXPECT_EQ(tensor_with_ones.sizes()[1], 3); - EXPECT_EQ(tensor_with_ones.sizes()[2], 4); - EXPECT_EQ(tensor_with_ones.numel(), 24); - - // 验证是原位操作(数据指针未改变) - EXPECT_EQ(tensor_with_ones.data_ptr(), original_ptr); - - // 测试原位移除指定维度 - at::Tensor tensor_with_ones2 = at::ones({2, 1, 3, 1, 4}, at::kFloat); - tensor_with_ones2.squeeze_(1); - EXPECT_EQ(tensor_with_ones2.dim(), 4); - EXPECT_EQ(tensor_with_ones2.sizes()[1], 3); -} - -// 测试 unsqueeze -TEST_F(TensorTest, Unsqueeze) { - // 在维度0之前添加一个大小为1的维度 - at::Tensor unsqueezed0 = tensor.unsqueeze(0); - EXPECT_EQ(unsqueezed0.dim(), 4); - EXPECT_EQ(unsqueezed0.sizes()[0], 1); - EXPECT_EQ(unsqueezed0.sizes()[1], 2); - EXPECT_EQ(unsqueezed0.sizes()[2], 3); - EXPECT_EQ(unsqueezed0.sizes()[3], 4); - EXPECT_EQ(unsqueezed0.numel(), 24); - - // 在维度2之前添加一个大小为1的维度 - at::Tensor unsqueezed2 = tensor.unsqueeze(2); - EXPECT_EQ(unsqueezed2.dim(), 4); - EXPECT_EQ(unsqueezed2.sizes()[0], 2); - EXPECT_EQ(unsqueezed2.sizes()[1], 3); - EXPECT_EQ(unsqueezed2.sizes()[2], 1); - EXPECT_EQ(unsqueezed2.sizes()[3], 4); - - // 在最后添加一个大小为1的维度(使用负索引-1) - at::Tensor unsqueezed_last = tensor.unsqueeze(-1); - EXPECT_EQ(unsqueezed_last.dim(), 4); - EXPECT_EQ(unsqueezed_last.sizes()[0], 2); - EXPECT_EQ(unsqueezed_last.sizes()[1], 3); - EXPECT_EQ(unsqueezed_last.sizes()[2], 4); - EXPECT_EQ(unsqueezed_last.sizes()[3], 1); -} - -// 测试 unsqueeze_ (原位操作) -TEST_F(TensorTest, UnsqueezeInplace) { - // 创建一个新的tensor用于原位操作 - at::Tensor test_tensor = at::ones({2, 3, 4}, at::kFloat); - - // 记录原始数据指针 - void* original_ptr = test_tensor.data_ptr(); - - // 原位在维度0之前添加一个大小为1的维度 - test_tensor.unsqueeze_(0); - EXPECT_EQ(test_tensor.dim(), 4); - EXPECT_EQ(test_tensor.sizes()[0], 1); - EXPECT_EQ(test_tensor.sizes()[1], 2); - EXPECT_EQ(test_tensor.sizes()[2], 3); - EXPECT_EQ(test_tensor.sizes()[3], 4); - EXPECT_EQ(test_tensor.numel(), 24); - - // 验证是原位操作(数据指针未改变) - EXPECT_EQ(test_tensor.data_ptr(), original_ptr); - - // 测试使用负索引的原位操作 - at::Tensor test_tensor2 = at::ones({2, 3, 4}, at::kFloat); - test_tensor2.unsqueeze_(-1); - EXPECT_EQ(test_tensor2.dim(), 4); - EXPECT_EQ(test_tensor2.sizes()[3], 1); -} - } // namespace test } // namespace at diff --git a/test/ops/SqueezeTest.cpp b/test/ops/SqueezeTest.cpp new file mode 100644 index 0000000..0db4134 --- /dev/null +++ b/test/ops/SqueezeTest.cpp @@ -0,0 +1,96 @@ +#include +#include +#include +#include + +#include +#include + +#include "../../src/file_manager.h" + +extern paddle_api_test::ThreadSafeParam g_custom_param; + +namespace at { +namespace test { + +using paddle_api_test::FileManerger; +using paddle_api_test::ThreadSafeParam; + +class SqueezeTest : public ::testing::Test { + protected: + void SetUp() override { + // 创建一个包含大小为1的维度的tensor: shape = {2, 1, 3, 1, 4} + tensor_with_ones = at::ones({2, 1, 3, 1, 4}, at::kFloat); + } + at::Tensor tensor_with_ones; +}; + +// 测试 squeeze - 移除所有大小为1的维度 +TEST_F(SqueezeTest, SqueezeAll) { + auto file_name = g_custom_param.get(); + FileManerger file(file_name); + file.createFile(); + at::Tensor squeezed = tensor_with_ones.squeeze(); + file << std::to_string(squeezed.dim()) << " "; + file << std::to_string(squeezed.numel()) << " "; + for (int64_t i = 0; i < squeezed.dim(); ++i) { + file << std::to_string(squeezed.sizes()[i]) << " "; + } + file.saveFile(); +} + +// 测试 squeeze - 移除指定维度 +TEST_F(SqueezeTest, SqueezeDim) { + auto file_name = g_custom_param.get(); + FileManerger file(file_name); + file.createFile(); + // 移除维度1(大小为1) + at::Tensor squeezed_dim1 = tensor_with_ones.squeeze(1); + file << std::to_string(squeezed_dim1.dim()) << " "; + file << std::to_string(squeezed_dim1.numel()) << " "; + for (int64_t i = 0; i < squeezed_dim1.dim(); ++i) { + file << std::to_string(squeezed_dim1.sizes()[i]) << " "; + } + file.saveFile(); +} + +// 测试 squeeze_ - 原位移除所有大小为1的维度 +TEST_F(SqueezeTest, SqueezeInplaceAll) { + auto file_name = g_custom_param.get(); + FileManerger file(file_name); + file.createFile(); + // 记录原始数据指针 + void* original_ptr = tensor_with_ones.data_ptr(); + // 原位移除所有大小为1的维度 + tensor_with_ones.squeeze_(); + file << std::to_string(tensor_with_ones.dim()) << " "; + file << std::to_string(tensor_with_ones.numel()) << " "; + for (int64_t i = 0; i < tensor_with_ones.dim(); ++i) { + file << std::to_string(tensor_with_ones.sizes()[i]) << " "; + } + // 验证是原位操作(数据指针未改变) + file << std::to_string(tensor_with_ones.data_ptr() == original_ptr) << " "; + file.saveFile(); +} + +// 测试 squeeze_ - 原位移除指定维度 +TEST_F(SqueezeTest, SqueezeInplaceDim) { + auto file_name = g_custom_param.get(); + FileManerger file(file_name); + file.createFile(); + // 记录原始数据指针 + void* original_ptr = tensor_with_ones.data_ptr(); + // 原位移除维度1 + tensor_with_ones.squeeze_(1); + file << std::to_string(tensor_with_ones.dim()) << " "; + file << std::to_string(tensor_with_ones.numel()) << " "; + for (int64_t i = 0; i < tensor_with_ones.dim(); ++i) { + file << std::to_string(tensor_with_ones.sizes()[i]) << " "; + } + // 验证是原位操作(数据指针未改变) + file << std::to_string(tensor_with_ones.data_ptr() == original_ptr) << " "; + file.saveFile(); +} + +} // namespace test +} // namespace at diff --git a/test/ops/UnsqueezeTest.cpp b/test/ops/UnsqueezeTest.cpp new file mode 100644 index 0000000..ecd4d85 --- /dev/null +++ b/test/ops/UnsqueezeTest.cpp @@ -0,0 +1,109 @@ +#include +#include +#include +#include + +#include +#include + +#include "../../src/file_manager.h" + +extern paddle_api_test::ThreadSafeParam g_custom_param; + +namespace at { +namespace test { + +using paddle_api_test::FileManerger; +using paddle_api_test::ThreadSafeParam; + +class UnsqueezeTest : public ::testing::Test { + protected: + void SetUp() override { + // 创建一个基础tensor: shape = {2, 3, 4} + tensor = at::ones({2, 3, 4}, at::kFloat); + } + at::Tensor tensor; +}; + +// 测试 unsqueeze - 在维度0之前添加维度 +TEST_F(UnsqueezeTest, UnsqueezeDim0) { + auto file_name = g_custom_param.get(); + FileManerger file(file_name); + file.createFile(); + at::Tensor unsqueezed0 = tensor.unsqueeze(0); + file << std::to_string(unsqueezed0.dim()) << " "; + file << std::to_string(unsqueezed0.numel()) << " "; + for (int64_t i = 0; i < unsqueezed0.dim(); ++i) { + file << std::to_string(unsqueezed0.sizes()[i]) << " "; + } + file.saveFile(); +} + +// 测试 unsqueeze - 在维度2之前添加维度 +TEST_F(UnsqueezeTest, UnsqueezeDim2) { + auto file_name = g_custom_param.get(); + FileManerger file(file_name); + file.createFile(); + at::Tensor unsqueezed2 = tensor.unsqueeze(2); + file << std::to_string(unsqueezed2.dim()) << " "; + file << std::to_string(unsqueezed2.numel()) << " "; + for (int64_t i = 0; i < unsqueezed2.dim(); ++i) { + file << std::to_string(unsqueezed2.sizes()[i]) << " "; + } + file.saveFile(); +} + +// 测试 unsqueeze - 使用负索引在最后添加维度 +TEST_F(UnsqueezeTest, UnsqueezeNegativeDim) { + auto file_name = g_custom_param.get(); + FileManerger file(file_name); + file.createFile(); + at::Tensor unsqueezed_last = tensor.unsqueeze(-1); + file << std::to_string(unsqueezed_last.dim()) << " "; + file << std::to_string(unsqueezed_last.numel()) << " "; + for (int64_t i = 0; i < unsqueezed_last.dim(); ++i) { + file << std::to_string(unsqueezed_last.sizes()[i]) << " "; + } + file.saveFile(); +} + +// 测试 unsqueeze_ - 原位在维度0之前添加维度 +TEST_F(UnsqueezeTest, UnsqueezeInplaceDim0) { + auto file_name = g_custom_param.get(); + FileManerger file(file_name); + file.createFile(); + // 记录原始数据指针 + void* original_ptr = tensor.data_ptr(); + // 原位在维度0之前添加维度 + tensor.unsqueeze_(0); + file << std::to_string(tensor.dim()) << " "; + file << std::to_string(tensor.numel()) << " "; + for (int64_t i = 0; i < tensor.dim(); ++i) { + file << std::to_string(tensor.sizes()[i]) << " "; + } + // 验证是原位操作(数据指针未改变) + file << std::to_string(tensor.data_ptr() == original_ptr) << " "; + file.saveFile(); +} + +// 测试 unsqueeze_ - 原位使用负索引添加维度 +TEST_F(UnsqueezeTest, UnsqueezeInplaceNegativeDim) { + auto file_name = g_custom_param.get(); + FileManerger file(file_name); + file.createFile(); + // 记录原始数据指针 + void* original_ptr = tensor.data_ptr(); + // 原位在最后添加维度 + tensor.unsqueeze_(-1); + file << std::to_string(tensor.dim()) << " "; + file << std::to_string(tensor.numel()) << " "; + for (int64_t i = 0; i < tensor.dim(); ++i) { + file << std::to_string(tensor.sizes()[i]) << " "; + } + // 验证是原位操作(数据指针未改变) + file << std::to_string(tensor.data_ptr() == original_ptr) << " "; + file.saveFile(); +} + +} // namespace test +} // namespace at