Home | History | Annotate | Download | only in kernel_tests
      1 # Copyright 2015 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 """Tests for SparseReorder."""
     16 
     17 from __future__ import absolute_import
     18 from __future__ import division
     19 from __future__ import print_function
     20 
     21 import numpy as np
     22 
     23 from tensorflow.python.framework import sparse_tensor
     24 from tensorflow.python.ops import sparse_ops
     25 from tensorflow.python.platform import test
     26 
     27 
     28 class SparseSliceOpTest(test.TestCase):
     29 
     30   def _SparseTensor_4x6(self):
     31     # [0 |  |2 |  |4 |5 ]
     32     # [  |11|  |13|14|  ]
     33     # [20|  |  |23|  |25]
     34     # [30|  |32|33|  |35]
     35     ind = np.array([[0, 0], [0, 2], [0, 4], [0, 5], [1, 1], [1, 3], [1,
     36                                                                      4], [2, 0],
     37                     [2, 3], [2, 5], [3, 0], [3, 2], [3, 3], [3, 5]]).astype(
     38                         np.int64)
     39     val = np.array([0, 2, 4, 5, 11, 13, 14, 20, 23, 25, 30, 32, 33, 35]).astype(
     40         np.int64)
     41     shape = np.array([4, 6]).astype(np.int64)
     42     return sparse_tensor.SparseTensor(ind, val, shape)
     43 
     44   def _SparseTensor_5x7(self):
     45     # [0 |  |2 |  |4 |5 |  ]
     46     # [  |11|  |13|14|  |16]
     47     # [20|  |  |23|  |25|  ]
     48     # [30|  |32|33|  |35|  ]
     49     # [  |41|  |  |44|  |46]
     50     ind = np.array([[0, 0], [0, 2], [0, 4], [0, 5], [1, 1], [1, 3], [1, 4],
     51                     [1, 6], [2, 0], [2, 3], [2, 5], [3, 0], [3, 2], [3, 3],
     52                     [3, 5], [4, 1], [4, 4], [4, 6]]).astype(np.int64)
     53     val = np.array(
     54         [0, 2, 4, 5, 11, 13, 14, 16, 20, 23, 25, 30, 32, 33, 35, 41, 44,
     55          46]).astype(np.int64)
     56     shape = np.array([5, 7]).astype(np.int64)
     57     return sparse_tensor.SparseTensor(ind, val, shape)
     58 
     59   def _SparseTensorValue_3x4x2(self):
     60     #  slice(:,:, 0)
     61     #  ['a0'|    |'b0'|    ]
     62     #  [    |'c0'|    |'d0']
     63     #  [    |    |'e0'|    ]
     64     #  slice(:,:, 1)
     65     #  ['a1'|    |'b1'|    ]
     66     #  [    |'c1'|    |'d1']
     67     #  [    |    |'e1'|    ]
     68     ind = np.array([[0, 0, 0], [0, 0, 1], [0, 2, 0], [0, 2, 1], [1, 1, 0],
     69                     [1, 1, 1], [1, 3, 0], [1, 3, 1], [2, 2, 0], [2, 2,
     70                                                                  1]]).astype(
     71                                                                      np.int64)
     72     val = np.array(['a0', 'a1', 'b0', 'b1', 'c0', 'c1', 'd0', 'd1', 'e0', 'e1'])
     73     shape = np.array([3, 4, 2]).astype(np.int64)
     74     return sparse_tensor.SparseTensorValue(ind, val, shape)
     75 
     76   def _SparseTensor_3x4x2(self):
     77     return sparse_tensor.SparseTensor.from_value(
     78         self._SparseTensorValue_3x4x2())
     79 
     80   def testSliceMatrixRows(self):
     81     with self.test_session(use_gpu=False):
     82       sp_input = self._SparseTensor_4x6()
     83       sp_tensor0 = sparse_ops.sparse_slice(sp_input, [0, 0], [2, 6])
     84       sp_tensor1 = sparse_ops.sparse_slice(sp_input, [2, 0], [3, 7])
     85       self.assertAllEqual(
     86           sp_tensor0.indices.eval(),
     87           [[0, 0], [0, 2], [0, 4], [0, 5], [1, 1], [1, 3], [1, 4]])
     88       self.assertAllEqual(sp_tensor0.values.eval(), [0, 2, 4, 5, 11, 13, 14])
     89       self.assertAllEqual(sp_tensor0.dense_shape.eval(), [2, 6])
     90       self.assertAllEqual(
     91           sp_tensor1.indices.eval(),
     92           [[0, 0], [0, 3], [0, 5], [1, 0], [1, 2], [1, 3], [1, 5]])
     93       self.assertAllEqual(sp_tensor1.values.eval(),
     94                           [20, 23, 25, 30, 32, 33, 35])
     95       self.assertAllEqual(sp_tensor1.dense_shape.eval(), [2, 6])
     96 
     97   def testSliceMatrixUnevenCols(self):
     98     with self.test_session(use_gpu=False):
     99       sp_input = self._SparseTensor_5x7()
    100       sp_tensor0 = sparse_ops.sparse_slice(sp_input, [0, 0], [5, 3])
    101       sp_tensor1 = sparse_ops.sparse_slice(sp_input, [0, 3], [5, 2])
    102       sp_tensor2 = sparse_ops.sparse_slice(sp_input, [0, 5], [5, 2])
    103 
    104       self.assertAllEqual(
    105           sp_tensor0.indices.eval(),
    106           [[0, 0], [0, 2], [1, 1], [2, 0], [3, 0], [3, 2], [4, 1]])
    107       self.assertAllEqual(sp_tensor0.values.eval(), [0, 2, 11, 20, 30, 32, 41])
    108       self.assertAllEqual(sp_tensor0.dense_shape.eval(), [5, 3])
    109       self.assertAllEqual(sp_tensor1.indices.eval(),
    110                           [[0, 1], [1, 0], [1, 1], [2, 0], [3, 0], [4, 1]])
    111       self.assertAllEqual(sp_tensor1.values.eval(), [4, 13, 14, 23, 33, 44])
    112       self.assertAllEqual(sp_tensor1.dense_shape.eval(), [5, 2])
    113       self.assertAllEqual(sp_tensor2.indices.eval(),
    114                           [[0, 0], [1, 1], [2, 0], [3, 0], [4, 1]])
    115       self.assertAllEqual(sp_tensor2.values.eval(), [5, 16, 25, 35, 46])
    116       self.assertAllEqual(sp_tensor2.dense_shape.eval(), [5, 2])
    117 
    118       sp_tensor0 = sparse_ops.sparse_slice(sp_input, [0, 0], [5, 2])
    119       sp_tensor1 = sparse_ops.sparse_slice(sp_input, [0, 2], [5, 2])
    120       sp_tensor2 = sparse_ops.sparse_slice(sp_input, [0, 4], [5, 2])
    121       sp_tensor3 = sparse_ops.sparse_slice(sp_input, [0, 6], [5, 2])
    122       self.assertAllEqual(sp_tensor0.indices.eval(),
    123                           [[0, 0], [1, 1], [2, 0], [3, 0], [4, 1]])
    124       self.assertAllEqual(sp_tensor0.values.eval(), [0, 11, 20, 30, 41])
    125       self.assertAllEqual(sp_tensor0.dense_shape.eval(), [5, 2])
    126       self.assertAllEqual(sp_tensor1.indices.eval(),
    127                           [[0, 0], [1, 1], [2, 1], [3, 0], [3, 1]])
    128       self.assertAllEqual(sp_tensor1.values.eval(), [2, 13, 23, 32, 33])
    129       self.assertAllEqual(sp_tensor1.dense_shape.eval(), [5, 2])
    130       self.assertAllEqual(sp_tensor2.indices.eval(),
    131                           [[0, 0], [0, 1], [1, 0], [2, 1], [3, 1], [4, 0]])
    132       self.assertAllEqual(sp_tensor2.values.eval(), [4, 5, 14, 25, 35, 44])
    133       self.assertAllEqual(sp_tensor2.dense_shape.eval(), [5, 2])
    134       self.assertAllEqual(sp_tensor3.indices.eval(), [[1, 0], [4, 0]])
    135       self.assertAllEqual(sp_tensor3.values.eval(), [16, 46])
    136       self.assertAllEqual(sp_tensor3.dense_shape.eval(), [5, 1])
    137 
    138   def testSliceMatrixUnevenRows(self):
    139     with self.test_session(use_gpu=False):
    140       sp_input = self._SparseTensor_5x7()
    141       sp_tensor0 = sparse_ops.sparse_slice(sp_input, [0, 0], [3, 7])
    142       sp_tensor1 = sparse_ops.sparse_slice(sp_input, [3, 0], [3, 7])
    143       self.assertAllEqual(sp_tensor0.indices.eval(),
    144                           [[0, 0], [0, 2], [0, 4], [0, 5], [1, 1], [1, 3],
    145                            [1, 4], [1, 6], [2, 0], [2, 3], [2, 5]])
    146       self.assertAllEqual(sp_tensor0.values.eval(),
    147                           [0, 2, 4, 5, 11, 13, 14, 16, 20, 23, 25])
    148       self.assertAllEqual(sp_tensor0.dense_shape.eval(), [3, 7])
    149       self.assertAllEqual(
    150           sp_tensor1.indices.eval(),
    151           [[0, 0], [0, 2], [0, 3], [0, 5], [1, 1], [1, 4], [1, 6]])
    152       self.assertAllEqual(sp_tensor1.values.eval(),
    153                           [30, 32, 33, 35, 41, 44, 46])
    154       self.assertAllEqual(sp_tensor1.dense_shape.eval(), [2, 7])
    155 
    156       sp_tensor0 = sparse_ops.sparse_slice(sp_input, [0, 0], [2, 7])
    157       sp_tensor1 = sparse_ops.sparse_slice(sp_input, [2, 0], [2, 7])
    158       sp_tensor2 = sparse_ops.sparse_slice(sp_input, [4, 0], [2, 7])
    159       self.assertAllEqual(
    160           sp_tensor0.indices.eval(),
    161           [[0, 0], [0, 2], [0, 4], [0, 5], [1, 1], [1, 3], [1, 4], [1, 6]])
    162       self.assertAllEqual(sp_tensor0.values.eval(),
    163                           [0, 2, 4, 5, 11, 13, 14, 16])
    164       self.assertAllEqual(sp_tensor0.dense_shape.eval(), [2, 7])
    165 
    166       self.assertAllEqual(sp_tensor1.values.eval(),
    167                           [20, 23, 25, 30, 32, 33, 35])
    168       self.assertAllEqual(sp_tensor1.dense_shape.eval(), [2, 7])
    169       self.assertAllEqual(sp_tensor2.indices.eval(), [[0, 1], [0, 4], [0, 6]])
    170       self.assertAllEqual(sp_tensor2.values.eval(), [41, 44, 46])
    171       self.assertAllEqual(sp_tensor2.dense_shape.eval(), [1, 7])
    172     return
    173 
    174   def testSliceAllRows(self):
    175     with self.test_session(use_gpu=False):
    176       sp_input = self._SparseTensor_4x6()
    177       sp_tensor0 = sparse_ops.sparse_slice(sp_input, [0, 0], [1, 6])
    178       sp_tensor1 = sparse_ops.sparse_slice(sp_input, [1, 0], [1, 6])
    179       sp_tensor2 = sparse_ops.sparse_slice(sp_input, [2, 0], [1, 7])
    180       sp_tensor3 = sparse_ops.sparse_slice(sp_input, [3, 0], [2, 7])
    181       self.assertAllEqual(sp_tensor0.indices.eval(),
    182                           [[0, 0], [0, 2], [0, 4], [0, 5]])
    183       self.assertAllEqual(sp_tensor0.values.eval(), [0, 2, 4, 5])
    184       self.assertAllEqual(sp_tensor0.dense_shape.eval(), [1, 6])
    185       self.assertAllEqual(sp_tensor1.indices.eval(), [[0, 1], [0, 3], [0, 4]])
    186       self.assertAllEqual(sp_tensor1.values.eval(), [11, 13, 14])
    187       self.assertAllEqual(sp_tensor1.dense_shape.eval(), [1, 6])
    188       self.assertAllEqual(sp_tensor2.indices.eval(), [[0, 0], [0, 3], [0, 5]])
    189       self.assertAllEqual(sp_tensor2.values.eval(), [20, 23, 25])
    190       self.assertAllEqual(sp_tensor2.dense_shape.eval(), [1, 6])
    191       self.assertAllEqual(sp_tensor3.indices.eval(),
    192                           [[0, 0], [0, 2], [0, 3], [0, 5]])
    193       self.assertAllEqual(sp_tensor3.values.eval(), [30, 32, 33, 35])
    194       self.assertAllEqual(sp_tensor3.dense_shape.eval(), [1, 6])
    195 
    196   def testSliceColumns(self):
    197     with self.test_session(use_gpu=False):
    198       sp_input = self._SparseTensor_4x6()
    199       sparse_tensor0 = sparse_ops.sparse_slice(sp_input, [0, 0], [4, 2])
    200       sparse_tensor1 = sparse_ops.sparse_slice(sp_input, [0, 2], [5, 2])
    201       sparse_tensor2 = sparse_ops.sparse_slice(sp_input, [0, 4], [5, 3])
    202 
    203       self.assertAllEqual(sparse_tensor0.indices.eval(),
    204                           [[0, 0], [1, 1], [2, 0], [3, 0]])
    205       self.assertAllEqual(sparse_tensor0.values.eval(), [0, 11, 20, 30])
    206       self.assertAllEqual(sparse_tensor0.dense_shape.eval(), [4, 2])
    207       self.assertAllEqual(sparse_tensor1.indices.eval(),
    208                           [[0, 0], [1, 1], [2, 1], [3, 0], [3, 1]])
    209       self.assertAllEqual(sparse_tensor1.values.eval(), [2, 13, 23, 32, 33])
    210       self.assertAllEqual(sparse_tensor1.dense_shape.eval(), [4, 2])
    211       self.assertAllEqual(sparse_tensor2.indices.eval(),
    212                           [[0, 0], [0, 1], [1, 0], [2, 1], [3, 1]])
    213       self.assertAllEqual(sparse_tensor2.values.eval(), [4, 5, 14, 25, 35])
    214       self.assertAllEqual(sparse_tensor2.dense_shape.eval(), [4, 2])
    215 
    216   def testSliceAllColumns(self):
    217     with self.test_session(use_gpu=False):
    218       sp_input = self._SparseTensor_4x6()
    219       sparse_tensor0 = sparse_ops.sparse_slice(sp_input, [0, 0], [4, 1])
    220       sparse_tensor1 = sparse_ops.sparse_slice(sp_input, [0, 1], [4, 1])
    221       sparse_tensor2 = sparse_ops.sparse_slice(sp_input, [0, 2], [4, 1])
    222       sparse_tensor3 = sparse_ops.sparse_slice(sp_input, [0, 3], [4, 1])
    223       sparse_tensor4 = sparse_ops.sparse_slice(sp_input, [0, 4], [5, 1])
    224       sparse_tensor5 = sparse_ops.sparse_slice(sp_input, [0, 5], [6, 3])
    225       self.assertAllEqual(sparse_tensor0.indices.eval(),
    226                           [[0, 0], [2, 0], [3, 0]])
    227       self.assertAllEqual(sparse_tensor0.values.eval(), [0, 20, 30])
    228       self.assertAllEqual(sparse_tensor0.dense_shape.eval(), [4, 1])
    229       self.assertAllEqual(sparse_tensor1.indices.eval(), [[1, 0]])
    230       self.assertAllEqual(sparse_tensor1.values.eval(), [11])
    231       self.assertAllEqual(sparse_tensor1.dense_shape.eval(), [4, 1])
    232       self.assertAllEqual(sparse_tensor2.indices.eval(), [[0, 0], [3, 0]])
    233       self.assertAllEqual(sparse_tensor2.values.eval(), [2, 32])
    234       self.assertAllEqual(sparse_tensor2.dense_shape.eval(), [4, 1])
    235       self.assertAllEqual(sparse_tensor3.indices.eval(),
    236                           [[1, 0], [2, 0], [3, 0]])
    237       self.assertAllEqual(sparse_tensor3.dense_shape.eval(), [4, 1])
    238       self.assertAllEqual(sparse_tensor3.values.eval(), [13, 23, 33])
    239       self.assertAllEqual(sparse_tensor4.indices.eval(), [[0, 0], [1, 0]])
    240       self.assertAllEqual(sparse_tensor4.values.eval(), [4, 14])
    241       self.assertAllEqual(sparse_tensor4.dense_shape.eval(), [4, 1])
    242       self.assertAllEqual(sparse_tensor5.indices.eval(),
    243                           [[0, 0], [2, 0], [3, 0]])
    244       self.assertAllEqual(sparse_tensor5.values.eval(), [5, 25, 35])
    245       self.assertAllEqual(sparse_tensor5.dense_shape.eval(), [4, 1])
    246 
    247 
    248 if __name__ == '__main__':
    249   test.main()
    250