1 /* Copyright 2017 The TensorFlow Authors. All Rights Reserved. 2 3 Licensed under the Apache License, Version 2.0 (the "License"); 4 you may not use this file except in compliance with the License. 5 You may obtain a copy of the License at 6 7 http://www.apache.org/licenses/LICENSE-2.0 8 9 Unless required by applicable law or agreed to in writing, software 10 distributed under the License is distributed on an "AS IS" BASIS, 11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 See the License for the specific language governing permissions and 13 limitations under the License. 14 ==============================================================================*/ 15 16 #include "tensorflow/compiler/xla/array2d.h" 17 18 #include <initializer_list> 19 20 #include "tensorflow/compiler/xla/test.h" 21 22 namespace xla { 23 namespace { 24 25 TEST(Array2dTest, DefaultCtor) { 26 Array2D<int> empty; 27 EXPECT_EQ(empty.n1(), 0); 28 EXPECT_EQ(empty.n2(), 0); 29 EXPECT_EQ(empty.num_elements(), 0); 30 } 31 32 TEST(Array2dTest, UninitializedDimsCtor) { 33 Array2D<int> uninit(2, 3); 34 EXPECT_EQ(uninit.n1(), 2); 35 EXPECT_EQ(uninit.n2(), 3); 36 EXPECT_EQ(uninit.num_elements(), 6); 37 } 38 39 TEST(Array2dTest, FillCtor) { 40 Array2D<int> fullof7(2, 3, 7); 41 42 EXPECT_EQ(fullof7.n1(), 2); 43 EXPECT_EQ(fullof7.n2(), 3); 44 45 for (int64 n1 = 0; n1 < fullof7.n1(); ++n1) { 46 for (int64 n2 = 0; n2 < fullof7.n2(); ++n2) { 47 EXPECT_EQ(fullof7(n1, n2), 7); 48 } 49 } 50 } 51 52 TEST(Array2dTest, InitializerListCtor) { 53 Array2D<int> arr = {{1, 2, 3}, {4, 5, 6}}; 54 55 EXPECT_EQ(arr.n1(), 2); 56 EXPECT_EQ(arr.n2(), 3); 57 58 EXPECT_EQ(arr(0, 0), 1); 59 EXPECT_EQ(arr(0, 1), 2); 60 EXPECT_EQ(arr(0, 2), 3); 61 EXPECT_EQ(arr(1, 0), 4); 62 EXPECT_EQ(arr(1, 1), 5); 63 EXPECT_EQ(arr(1, 2), 6); 64 } 65 66 TEST(Array2dTest, InitializerListCtorHalf) { 67 Array2D<Eigen::half> arr = {{1.0f, 2.0f, 3.0f}, {4.0f, 5.0f, 6.0f}}; 68 69 EXPECT_EQ(arr.n1(), 2); 70 EXPECT_EQ(arr.n2(), 3); 71 72 EXPECT_EQ(arr(0, 0), static_cast<Eigen::half>(1)); 73 EXPECT_EQ(arr(0, 1), static_cast<Eigen::half>(2)); 74 EXPECT_EQ(arr(0, 2), static_cast<Eigen::half>(3)); 75 EXPECT_EQ(arr(1, 0), static_cast<Eigen::half>(4)); 76 EXPECT_EQ(arr(1, 1), static_cast<Eigen::half>(5)); 77 EXPECT_EQ(arr(1, 2), static_cast<Eigen::half>(6)); 78 } 79 80 TEST(Array2dTest, Accessors) { 81 Array2D<int> arr = {{1, 2, 3}, {4, 5, 6}}; 82 83 EXPECT_EQ(arr.n1(), 2); 84 EXPECT_EQ(arr.n2(), 3); 85 EXPECT_EQ(arr.height(), 2); 86 EXPECT_EQ(arr.width(), 3); 87 EXPECT_EQ(arr.num_elements(), 6); 88 } 89 90 TEST(Array2dTest, IndexingReadWrite) { 91 Array2D<int> arr = {{1, 2, 3}, {4, 5, 6}}; 92 93 EXPECT_EQ(arr(1, 1), 5); 94 EXPECT_EQ(arr(1, 2), 6); 95 arr(1, 1) = 51; 96 arr(1, 2) = 61; 97 EXPECT_EQ(arr(1, 1), 51); 98 EXPECT_EQ(arr(1, 2), 61); 99 } 100 101 TEST(Array2dTest, IndexingReadWriteBool) { 102 Array2D<bool> arr = {{false, true, false}, {true, true, false}}; 103 104 EXPECT_EQ(arr(1, 1), true); 105 EXPECT_EQ(arr(1, 2), false); 106 arr(1, 1) = false; 107 arr(1, 2) = true; 108 EXPECT_EQ(arr(1, 1), false); 109 EXPECT_EQ(arr(1, 2), true); 110 } 111 112 TEST(Array2dTest, Fill) { 113 Array2D<int> fullof7(2, 3, 7); 114 for (int64 n1 = 0; n1 < fullof7.n1(); ++n1) { 115 for (int64 n2 = 0; n2 < fullof7.n2(); ++n2) { 116 EXPECT_EQ(fullof7(n1, n2), 7); 117 } 118 } 119 120 fullof7.Fill(11); 121 for (int64 n1 = 0; n1 < fullof7.n1(); ++n1) { 122 for (int64 n2 = 0; n2 < fullof7.n2(); ++n2) { 123 EXPECT_EQ(fullof7(n1, n2), 11); 124 } 125 } 126 } 127 128 TEST(Array2dTest, DataPointer) { 129 Array2D<int> arr = {{1, 2, 3}, {4, 5, 6}}; 130 131 EXPECT_EQ(arr.data()[0], 1); 132 } 133 134 TEST(Array2dTest, Linspace) { 135 auto arr = MakeLinspaceArray2D(1.0, 3.5, 3, 2); 136 137 EXPECT_EQ(arr->n1(), 3); 138 EXPECT_EQ(arr->n2(), 2); 139 140 EXPECT_FLOAT_EQ((*arr)(0, 0), 1.0); 141 EXPECT_FLOAT_EQ((*arr)(0, 1), 1.5); 142 EXPECT_FLOAT_EQ((*arr)(1, 0), 2.0); 143 EXPECT_FLOAT_EQ((*arr)(1, 1), 2.5); 144 EXPECT_FLOAT_EQ((*arr)(2, 0), 3.0); 145 EXPECT_FLOAT_EQ((*arr)(2, 1), 3.5); 146 } 147 148 TEST(Array2dTest, Stringification) { 149 auto arr = MakeLinspaceArray2D(1.0, 3.5, 3, 2); 150 const string expected = R"([[1, 1.5], 151 [2, 2.5], 152 [3, 3.5]])"; 153 EXPECT_EQ(expected, arr->ToString()); 154 } 155 156 TEST(Array2dTest, Equals) { 157 Array2D<int> arr0 = {{1, 2}, {3, 4}, {5, 6}}; 158 Array2D<int> arr1 = {{1, 2}, {3, 4}, {5, 6}}; 159 EXPECT_TRUE(arr0 == arr1); 160 EXPECT_FALSE(arr0 != arr1); 161 EXPECT_TRUE(arr1 == arr0); 162 EXPECT_FALSE(arr1 != arr0); 163 164 Array2D<int> arr2 = {{1, 2}, {3, 4}, {5, 6}, {7, 8}}; 165 EXPECT_TRUE(arr0 != arr2); 166 EXPECT_FALSE(arr0 == arr2); 167 EXPECT_TRUE(arr2 != arr0); 168 EXPECT_FALSE(arr2 == arr0); 169 170 Array2D<int> arr3 = {{1, 2, 3}, {4, 5, 6}}; 171 EXPECT_TRUE(arr0 != arr3); 172 EXPECT_FALSE(arr0 == arr3); 173 EXPECT_TRUE(arr3 != arr0); 174 EXPECT_FALSE(arr3 == arr0); 175 176 Array2D<int> arr4 = {{1, 2}, {3, 4}}; 177 EXPECT_TRUE(arr0 != arr4); 178 EXPECT_FALSE(arr0 == arr4); 179 EXPECT_TRUE(arr4 != arr0); 180 EXPECT_FALSE(arr4 == arr0); 181 182 Array2D<int> arr5 = {{1, 2}, {13, 4}, {5, 6}}; 183 EXPECT_TRUE(arr0 != arr5); 184 EXPECT_FALSE(arr0 == arr5); 185 EXPECT_TRUE(arr5 != arr0); 186 EXPECT_FALSE(arr5 == arr0); 187 188 Array2D<bool> bool_arr0 = {{false}, {true}}; 189 Array2D<bool> bool_arr1 = {{false}, {true}}; 190 EXPECT_TRUE(bool_arr0 == bool_arr1); 191 EXPECT_FALSE(bool_arr0 != bool_arr1); 192 Array2D<bool> bool_arr2 = {{false}, {false}}; 193 EXPECT_FALSE(bool_arr0 == bool_arr2); 194 EXPECT_TRUE(bool_arr0 != bool_arr2); 195 } 196 197 } // namespace 198 } // namespace xla 199