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