Home | History | Annotate | Download | only in xla
      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