| 145 | } |
| 146 | } |
| 147 | TEST(RELAYOUT, TRANSPOSE_DET) { |
| 148 | auto run = [](const TensorShape& shape, const std::vector<size_t>& dimshuffle, |
| 149 | bool expect_is_transpose, const TransposeParam& p = {}) { |
| 150 | TensorLayout src{shape, dtype::Float32{}}; |
| 151 | src = src.dimshuffle(dimshuffle).collapse_contiguous(); |
| 152 | TensorLayout dst{TensorShape{src.total_nr_elems()}, src.dtype}; |
| 153 | TransposeParam p_get; |
| 154 | bool succ = is_transpose(src, dst, p_get); |
| 155 | ASSERT_EQ(expect_is_transpose, succ); |
| 156 | if (succ) { |
| 157 | ASSERT_EQ(p_get.batch, p.batch); |
| 158 | ASSERT_EQ(p_get.m, p.m); |
| 159 | ASSERT_EQ(p_get.n, p.n); |
| 160 | ASSERT_EQ(p_get.c, p.c); |
| 161 | } |
| 162 | // swap m, n |
| 163 | succ = is_transpose(dst, src, p_get); |
| 164 | ASSERT_EQ(expect_is_transpose, succ); |
| 165 | if (succ) { |
| 166 | ASSERT_EQ(p_get.batch, p.batch); |
| 167 | ASSERT_EQ(p_get.m, p.n); |
| 168 | ASSERT_EQ(p_get.n, p.m); |
| 169 | ASSERT_EQ(p_get.c, p.c); |
| 170 | } |
| 171 | }; |
| 172 | run({2, 3}, {1, 0}, true, {1, 2, 3, 1, 0}); |
| 173 | run({2, 3, 5}, {1, 0, 2}, true, {1, 2, 3, 5, 0}); |
| 174 | run({2, 3, 5}, {0, 2, 1}, true, {2, 3, 5, 1, 0}); |
| 175 | run({3, 2, 3, 5}, {0, 2, 1, 3}, true, {3, 2, 3, 5, 0}); |
| 176 | run({3, 2, 3, 5}, {0, 1, 3, 2}, true, {6, 3, 5, 1, 0}); |
| 177 | run({2, 3, 5}, {2, 1, 0}, false); |
| 178 | run({3, 2, 3, 5}, {3, 2, 1, 0}, false); |
| 179 | } |
| 180 | // vim: syntax=cpp.doxygen |
nothing calls this directly
no test coverage detected