partitioned_variables_test.py revision dd56e71952b73f4ab1158f8343812cbccd5c1c8d
10cf9ed3a719c0782695154d5a0bca260001cec15A. Unique TensorFlower# Copyright 2015 The TensorFlow Authors. All Rights Reserved.
203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower#
303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower# Licensed under the Apache License, Version 2.0 (the "License");
403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower# you may not use this file except in compliance with the License.
503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower# You may obtain a copy of the License at
603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower#
703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower#     http://www.apache.org/licenses/LICENSE-2.0
803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower#
903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower# Unless required by applicable law or agreed to in writing, software
1003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower# distributed under the License is distributed on an "AS IS" BASIS,
1103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower# See the License for the specific language governing permissions and
1303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower# limitations under the License.
1403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower# ==============================================================================
1503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
1603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower"""Tests for partitioned_variables.py."""
1703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlowerfrom __future__ import absolute_import
1803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlowerfrom __future__ import division
1903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlowerfrom __future__ import print_function
2003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
2103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlowerimport numpy as np
2203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlowerfrom six.moves import xrange  # pylint: disable=redefined-builtin
2303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlowerimport tensorflow as tf
2403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
2504654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
2604654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdoclass PartitionerCreatorsTest(tf.test.TestCase):
2704654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
285b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower  def _testVariableAxisSizePartitioner(self, name, axis, max_shard_bytes,
295b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                       expected_axis_shards,
305b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                       expected_partitions,
315b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                       max_shards=None):
325b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower    partitioner = tf.variable_axis_size_partitioner(
335b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower        axis=axis, max_shard_bytes=max_shard_bytes, max_shards=max_shards)
345b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower
355b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower    with tf.variable_scope("root", partitioner=partitioner):
36775a7490047299f2b64bf4fafcb6504852b8082dWei Ho      v0 = tf.get_variable(name, dtype=tf.float32, shape=(4, 8, 16, 32))
37775a7490047299f2b64bf4fafcb6504852b8082dWei Ho      v0_list = v0._get_variable_list()
38775a7490047299f2b64bf4fafcb6504852b8082dWei Ho      v0_part = v0._get_partitions()
395b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      self.assertEqual(len(v0_list), expected_axis_shards)
405b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      self.assertAllEqual(v0_part, expected_partitions)
415b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower
4204654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo  def testVariableAxisSizePartitioner(self):
4304654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo    with self.test_session():
4404654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo      # Create a partitioned variable of shape (4, 8, 16, 32) type float32
4504654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo      # Bytes per slice along the given axes:
4604654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
4704654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo      # 8 * 16 * 32 * sizeof(float32) = 16384 / slice on axis 0
4804654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo      # 4 * 16 * 32 * sizeof(float32) = 8192 / slice on axis 1
4904654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo      # 4 * 8 * 32 * sizeof(float32) = 4096 / slice on axis 2
5004654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo      # 4 * 8 * 16 * sizeof(float32) = 2048 / slice on axis 3
5104654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
5204654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo      # Now partition it in different ways...
5304654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
545b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # No need to slice: bytes_per_slice * dim0 = 65536 < max_shard_bytes
555b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      self._testVariableAxisSizePartitioner("v0", axis=0,
565b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            max_shard_bytes=131072,
575b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            expected_axis_shards=1,
585b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            expected_partitions=(1, 1, 1, 1))
595b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower
605b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # Slice exactly once: bytes_per_slice * dim1 = 65536 = max_shard_bytes
615b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      self._testVariableAxisSizePartitioner("v1", axis=1,
625b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            max_shard_bytes=65536,
635b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            expected_axis_shards=1,
645b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            expected_partitions=(1, 1, 1, 1))
655b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower
665b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # Slice into 2 parts:
675b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # bytes_per_slice = 4096
685b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # slices_per_shard = 32768 / 4096 = 8
695b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # axis_shards = 16 / 8 = 2
705b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      self._testVariableAxisSizePartitioner("v2", axis=2,
715b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            max_shard_bytes=32768,
725b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            expected_axis_shards=2,
735b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            expected_partitions=(1, 1, 2, 1))
745b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower
755b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # This partitioner makes sure we maximize the number of shards along
765b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # axis 3. Slice it into 32 parts:
775b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # bytes_per_slice = 2048
785b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # slices_per_shard = 2048 / 2048 = 1
795b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # axis_shards = 32 / 1 = 32
805b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      self._testVariableAxisSizePartitioner("v3a", axis=3,
815b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            max_shard_bytes=2048,
825b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            expected_axis_shards=32,
835b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            expected_partitions=(1, 1, 1, 32))
8404654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
852ec20cda397ca5ba23838261c4c9526b8506af67A. Unique TensorFlower      # This partitioner makes sure we do not go past the bound of allowable
865b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # number of shards along axis 3.
875b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # Slice into 32 parts:
885b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # bytes_per_slice = 2048
895b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # slices_per_shard = max(1, 1024 / 2048) = 1
905b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # axis_shards = 32 / 1 = 32
915b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # Slice into max of 32 parts because: max_shard_bytes < bytes_per_slice
925b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      self._testVariableAxisSizePartitioner("v3b", axis=3,
935b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            max_shard_bytes=1024,
945b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            expected_axis_shards=32,
955b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            expected_partitions=(1, 1, 1, 32))
965b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower
975b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # Specify max_shards so that it won't affect sharding.
985b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      self._testVariableAxisSizePartitioner("v3c", axis=3,
995b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            max_shard_bytes=1024,
1005b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            expected_axis_shards=32,
1015b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            expected_partitions=(1, 1, 1, 32),
1025b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            max_shards=33)
1035b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower
1045b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # Specify max_shards so that it will affect sharding.
1055b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      self._testVariableAxisSizePartitioner("v3d", axis=3,
1065b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            max_shard_bytes=1024,
1075b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            expected_axis_shards=2,
1085b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            expected_partitions=(1, 1, 1, 2),
1095b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                            max_shards=2)
11004654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
11104654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo      # Use the partitioner with strings
11204654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo      partitioner_axis3_str = tf.variable_axis_size_partitioner(
1132ec20cda397ca5ba23838261c4c9526b8506af67A. Unique TensorFlower          axis=3, max_shard_bytes=32768, bytes_per_string_element=8)
11404654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
11504654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo      with tf.variable_scope("root", partitioner=partitioner_axis3_str):
116775a7490047299f2b64bf4fafcb6504852b8082dWei Ho        v3str = tf.get_variable(
11704654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo            "v3str",
118775a7490047299f2b64bf4fafcb6504852b8082dWei Ho            initializer=np.array([""] * 4 * 8 * 16 * 32).reshape(4, 8, 16, 32),
119775a7490047299f2b64bf4fafcb6504852b8082dWei Ho            dtype=tf.string,
120775a7490047299f2b64bf4fafcb6504852b8082dWei Ho            shape=(4, 8, 16, 32))
121775a7490047299f2b64bf4fafcb6504852b8082dWei Ho        v3str_list = v3str._get_variable_list()
122775a7490047299f2b64bf4fafcb6504852b8082dWei Ho        v3str_part = v3str._get_partitions()
12304654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
1242ec20cda397ca5ba23838261c4c9526b8506af67A. Unique TensorFlower        # Now the estimated bytes_per_slice = 4*8*16*bytes_per_string_element
1252ec20cda397ca5ba23838261c4c9526b8506af67A. Unique TensorFlower        # which is equal to 4096.  Setting a max_shard_bytes of 32768
12604654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo        # and we should get a split of 4.
1272ec20cda397ca5ba23838261c4c9526b8506af67A. Unique TensorFlower        # Slice into 4 parts:
1282ec20cda397ca5ba23838261c4c9526b8506af67A. Unique TensorFlower        # bytes_per_slice = 4096
1292ec20cda397ca5ba23838261c4c9526b8506af67A. Unique TensorFlower        # slices_per_shard = 32768 / 4096 = 8
1302ec20cda397ca5ba23838261c4c9526b8506af67A. Unique TensorFlower        # axis_shards = 32 / 8 = 4
13104654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo        self.assertEqual(len(v3str_list), 4)
13204654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo        self.assertAllEqual(v3str_part, (1, 1, 1, 4))
13304654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
134f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower  def _testMinMaxVariablePartitioner(self, max_partitions, axis, min_slice_size,
135f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                     var_name, var_shape,
136f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                     expected_axis_shards, expected_partitions):
137f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower    partitioner = tf.min_max_variable_partitioner(max_partitions=max_partitions,
138f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                                  axis=axis,
139f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                                  min_slice_size=min_slice_size)
140f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower    with tf.variable_scope("root", partitioner=partitioner):
141f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      v0 = tf.get_variable(var_name, dtype=tf.float32, shape=var_shape)
142f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      v0_list = v0._get_variable_list()
143f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      v0_part = v0._get_partitions()
144f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      self.assertEqual(len(v0_list), expected_axis_shards)
145f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      self.assertAllEqual(v0_part, expected_partitions)
146f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower
147f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower  def testMinMaxVariablePartitioner(self):
148f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower    with self.test_session():
149f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      # Partitioning a variable of shape=[2048] with a minimum of 2K per slice.
150f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      self._testMinMaxVariablePartitioner(max_partitions=100, axis=0,
151f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          min_slice_size=2 << 10,
152f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          var_name="v0_0", var_shape=[2048],
153f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_axis_shards=4,
154f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_partitions=[4])
155f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower
156f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      # Partitioning a variable of shape=[2048, 1024] with a minimum of 256K per
157f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      # slice.
158f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      self._testMinMaxVariablePartitioner(max_partitions=100, axis=0,
159f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          min_slice_size=256 << 10,
160f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          var_name="v0", var_shape=[2048, 1024],
161f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_axis_shards=32,
162f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_partitions=[32, 1])
163f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower
164f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      # max_partitions restricts partitioning of the variable.
165f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      self._testMinMaxVariablePartitioner(max_partitions=16, axis=0,
166f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          min_slice_size=256 << 10,
167f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          var_name="v1_max",
168f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          var_shape=[2048, 1024],
169f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_axis_shards=16,
170f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_partitions=[16, 1])
171f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      self._testMinMaxVariablePartitioner(max_partitions=1, axis=0,
172f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          min_slice_size=256 << 10,
173f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          var_name="v2_max",
174f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          var_shape=[2048, 1024],
175f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_axis_shards=1,
176f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_partitions=[1, 1])
177f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower
178f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      # Reducing/Increasing min_slice_size proportionately increases/reduces the
179f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      # number of partitions.
180f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      self._testMinMaxVariablePartitioner(max_partitions=100, axis=0,
181f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          min_slice_size=128 << 10,
182f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          var_name="v3_slice",
183f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          var_shape=[2048, 1024],
184f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_axis_shards=64,
185f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_partitions=[64, 1])
186f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      self._testMinMaxVariablePartitioner(max_partitions=100, axis=0,
187f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          min_slice_size=512 << 10,
188f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          var_name="v4_slice",
189f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          var_shape=[2048, 1024],
190f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_axis_shards=16,
191f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_partitions=[16, 1])
192f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower
193f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      # Partitioning the variable along a different axis.
194f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      self._testMinMaxVariablePartitioner(max_partitions=100, axis=1,
195f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          min_slice_size=256 << 10,
196f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          var_name="v5_axis",
197f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          var_shape=[64, 1024, 1, 3],
198f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_axis_shards=3,
199f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_partitions=[1, 3, 1, 1])
200f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      self._testMinMaxVariablePartitioner(max_partitions=100, axis=3,
201f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          min_slice_size=256 << 10,
202f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          var_name="v6_axis",
203f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          var_shape=[64, 1024, 1, 3],
204f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_axis_shards=3,
205f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_partitions=[1, 1, 1, 3])
206f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower
207f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      # Can not partition the variable more than what its shape allows.
208f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      self._testMinMaxVariablePartitioner(max_partitions=100, axis=0,
209f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          min_slice_size=256 << 10,
210f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          var_name="v7_shape",
211f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          var_shape=[16, 128, 1024],
212f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_axis_shards=16,
213f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_partitions=[16, 1, 1])
214f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      self._testMinMaxVariablePartitioner(max_partitions=100, axis=0,
215f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          min_slice_size=256 << 10,
216f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          var_name="v8_shape",
217f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          var_shape=[4, 512, 1024],
218f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_axis_shards=4,
219f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower                                          expected_partitions=[4, 1, 1])
220f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower
22103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
22203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlowerdef _IotaInitializer(shape, dtype=tf.float32):
22303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  assert dtype == tf.float32
22403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  if len(shape) == 1:
22503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    return range(shape[0])
22603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  else:
22703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    val = _IotaInitializer(shape[1:], dtype)
22803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    return [[(10 ** i) * v for v in val] for i in range(shape[0])]
22903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
23003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
23103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlowerclass PartitionedVariablesTestCase(tf.test.TestCase):
23203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
23303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def _TestSaveSpec(self, slices, expected_specs):
23403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    self.assertEqual(len(expected_specs), len(slices))
23503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    for i in xrange(len(expected_specs)):
23603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEquals(expected_specs[i], slices[i]._save_slice_info.spec)
23703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
23803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testVecConstantInit(self):
23903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
24003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd_par = tf.constant([1, 2, 3, 4])
24103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      vs = tf.create_partitioned_variables([4], [4], rnd_par)
24203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      tf.initialize_all_variables().run()
24303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      val = tf.concat(0, vs).eval()
24403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd = rnd_par.eval()
24503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertAllClose(rnd, val)
24603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual([tf.int32] * 4, [v.dtype.base_dtype for v in vs])
24703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self._TestSaveSpec(vs, ["4 0,1", "4 1,1", "4 2,1", "4 3,1"])
24803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
24903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testConstantInit(self):
25003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
25103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd_par = tf.constant([[1, 2, 3, 4], [5, 6, 7, 8]])
25203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      vs = tf.create_partitioned_variables([2, 4], [1, 2], rnd_par)
25303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      tf.initialize_all_variables().run()
25403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      val = tf.concat(1, vs).eval()
25503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd = rnd_par.eval()
25603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertAllClose(rnd, val)
25703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual([tf.int32] * 2, [v.dtype.base_dtype for v in vs])
25803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self._TestSaveSpec(vs, ["2 4 0,2:0,2", "2 4 0,2:2,2"])
25903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
26003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testName(self):
26103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
26203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd_par = tf.constant([[1, 2, 3, 4], [5, 6, 7, 8]])
26303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      with tf.variable_scope("hi"):
26403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower        vs1 = tf.create_partitioned_variables([2, 4], [1, 2], rnd_par)
26503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower        vs2 = tf.create_partitioned_variables([2, 4], [1, 2], rnd_par)
26603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      tf.initialize_all_variables().run()
26703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      var1_name = vs1[0]._save_slice_info.full_name
26803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      var2_name = vs2[0]._save_slice_info.full_name
26903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual("hi/PartitionedVariable", var1_name)
27003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual("hi/PartitionedVariable_1", var2_name)
27103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var1_name + "/part_0:0", vs1[0].name)
27203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var1_name + "/part_1:0", vs1[1].name)
27303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var2_name + "/part_0:0", vs2[0].name)
27403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var2_name + "/part_1:0", vs2[1].name)
27503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    # Test same variable.
27603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
27703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd_par = tf.constant([[1, 2, 3, 4], [5, 6, 7, 8]])
27803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      with tf.variable_scope("hola") as vs:
279775a7490047299f2b64bf4fafcb6504852b8082dWei Ho        vs1 = tf.create_partitioned_variables(
280775a7490047299f2b64bf4fafcb6504852b8082dWei Ho            [2, 4], [1, 2], rnd_par, dtype=tf.int32)
28103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      with tf.variable_scope(vs, reuse=True):
282775a7490047299f2b64bf4fafcb6504852b8082dWei Ho        vs2 = tf.create_partitioned_variables(
283775a7490047299f2b64bf4fafcb6504852b8082dWei Ho            [2, 4], [1, 2], rnd_par, dtype=tf.int32)
28403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      tf.initialize_all_variables().run()
28503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      var1_name = vs1[0]._save_slice_info.full_name
28603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      var2_name = vs2[0]._save_slice_info.full_name
28703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual("hola/PartitionedVariable", var1_name)
28803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual("hola/PartitionedVariable", var2_name)
28903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var1_name + "/part_0:0", vs1[0].name)
29003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var1_name + "/part_1:0", vs1[1].name)
29103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var2_name + "/part_0:0", vs2[0].name)
29203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var2_name + "/part_1:0", vs2[1].name)
29303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    # Test name_scope
29403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
29503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd_par = tf.constant([[1, 2, 3, 4], [5, 6, 7, 8]])
29603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      with tf.name_scope("ola"):
29703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower        vs1 = tf.create_partitioned_variables([2, 4], [1, 2], rnd_par)
29803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower        vs2 = tf.create_partitioned_variables([2, 4], [1, 2], rnd_par)
29903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      tf.initialize_all_variables().run()
30003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      var1_name = vs1[0]._save_slice_info.full_name
30103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      var2_name = vs2[0]._save_slice_info.full_name
30203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      # Currently, the name scope 'ola' has no effect.
30303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual("PartitionedVariable", var1_name)
30403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual("PartitionedVariable_1", var2_name)
30503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var1_name + "/part_0:0", vs1[0].name)
30603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var1_name + "/part_1:0", vs1[1].name)
30703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var2_name + "/part_0:0", vs2[0].name)
30803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var2_name + "/part_1:0", vs2[1].name)
30903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
31003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testRandomInitValue(self):
31103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
31203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd = tf.Variable(tf.random_uniform([200, 40]))
31303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      vs = tf.create_partitioned_variables(
31403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          rnd.get_shape(), [1, 10], rnd.initialized_value())
31503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      tf.initialize_all_variables().run()
31603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      val = tf.concat(1, vs).eval()
31703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd = rnd.eval()
31803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertAllClose(rnd, val)
31903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual([tf.float32] * 10, [v.dtype.base_dtype for v in vs])
32003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self._TestSaveSpec(vs, ["200 40 0,200:0,4",
32103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "200 40 0,200:4,4",
32203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "200 40 0,200:8,4",
32303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "200 40 0,200:12,4",
32403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "200 40 0,200:16,4",
32503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "200 40 0,200:20,4",
32603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "200 40 0,200:24,4",
32703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "200 40 0,200:28,4",
32803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "200 40 0,200:32,4",
32903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "200 40 0,200:36,4"])
33003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
33103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testRandomInitUnevenPartitions(self):
33203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
33303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd = tf.Variable(
33403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          tf.random_uniform([20, 43], dtype=tf.float64))
33503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      var_lists = [
33603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          tf.create_partitioned_variables(
33703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower              rnd.get_shape(), [1, i],
33803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower              rnd.initialized_value())
33903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          for i in xrange(1, 10)]
34003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      tf.initialize_all_variables().run()
34103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd_val = rnd.eval()
34203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      # Only check the slice save specs for the first 5 tf.
34303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      save_specs = [
34403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          # One slice
34503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          ["20 43 0,20:0,43"],
34603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          # Two slices
34703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          ["20 43 0,20:0,22",
34803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower           "20 43 0,20:22,21"],
34903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          # Three slices
35003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          ["20 43 0,20:0,15",
35103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower           "20 43 0,20:15,14",
35203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower           "20 43 0,20:29,14"],
35303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          # Four slices
35403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          ["20 43 0,20:0,11",
35503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower           "20 43 0,20:11,11",
35603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower           "20 43 0,20:22,11",
35703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower           "20 43 0,20:33,10"],
35803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          # Five slices
35903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          ["20 43 0,20:0,9",
36003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower           "20 43 0,20:9,9",
36103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower           "20 43 0,20:18,9",
36203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower           "20 43 0,20:27,8",
36303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower           "20 43 0,20:35,8"]]
36403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      for i, vs in enumerate(var_lists):
36503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower        var_val = tf.concat(1, vs).eval()
36603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower        self.assertAllClose(rnd_val, var_val)
36703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower        self.assertEqual(
36803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower            [tf.float64] * len(vs), [v.dtype.base_dtype for v in vs])
36903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower        if i < len(save_specs):
37003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          self._TestSaveSpec(vs, save_specs[i])
37103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
37203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testDegenerate(self):
37303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
37403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd = tf.Variable(tf.random_uniform([10, 43]))
37503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      vs = tf.create_partitioned_variables(
37603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          rnd.get_shape(), [1, 1], rnd.initialized_value())
37703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      tf.initialize_all_variables().run()
37803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      val = tf.concat(0, vs).eval()
37903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd = rnd.eval()
38003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertAllClose(rnd, val)
38103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self._TestSaveSpec(vs, ["10 43 0,10:0,43"])
38203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
38303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testSliceSizeOne(self):
38403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
38503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd = tf.Variable(tf.random_uniform([10, 43]))
38603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      vs = tf.create_partitioned_variables(
38703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          rnd.get_shape(), [10, 1], rnd.initialized_value())
38803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      tf.initialize_all_variables().run()
38903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      val = tf.concat(0, vs).eval()
39003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd = rnd.eval()
39103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertAllClose(rnd, val)
39203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self._TestSaveSpec(vs, ["10 43 0,1:0,43",
39303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "10 43 1,1:0,43",
39403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "10 43 2,1:0,43",
39503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "10 43 3,1:0,43",
39603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "10 43 4,1:0,43",
39703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "10 43 5,1:0,43",
39803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "10 43 6,1:0,43",
39903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "10 43 7,1:0,43",
40003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "10 43 8,1:0,43",
40103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "10 43 9,1:0,43"])
40203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
40303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testIotaInitializer(self):
40403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    self.assertAllClose([0., 1., 2., 3.], _IotaInitializer([4]))
40503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    self.assertAllClose([[0., 1.], [0., 10.], [0., 100.], [0., 1000.]],
40603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                        _IotaInitializer([4, 2]))
40703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
40803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      vs = tf.create_partitioned_variables([13, 5], [3, 1], _IotaInitializer)
40903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      tf.initialize_all_variables().run()
41003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      slice0 = _IotaInitializer([5, 5])
41103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      slice1 = _IotaInitializer([4, 5])
41203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      slice2 = _IotaInitializer([4, 5])
41303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      val = tf.concat(0, vs).eval()
41403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertAllClose(slice0 + slice1 + slice2, val)
41503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self._TestSaveSpec(vs, ["13 5 0,5:0,5",
41603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "13 5 5,4:0,5",
41703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                              "13 5 9,4:0,5"])
41803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
41903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testRandomInitializer(self):
42003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    # Sanity check that the slices uses a different seed when using a random
42103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    # initializer function.
42203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
42303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      var0, var1 = tf.create_partitioned_variables(
42403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          [20, 12], [1, 2], tf.random_uniform_initializer())
42503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      tf.initialize_all_variables().run()
42603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      val0, val1 = var0.eval().flatten(), var1.eval().flatten()
42703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertTrue(np.linalg.norm(val0 - val1) > 1e-6)
42803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    # Negative test that proves that slices have the same values if
42903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    # the random initializer uses a seed.
43003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
43103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      var0, var1 = tf.create_partitioned_variables(
43203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          [20, 12], [1, 2], tf.random_uniform_initializer(seed=201))
43303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      tf.initialize_all_variables().run()
43403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      val0, val1 = var0.eval().flatten(), var1.eval().flatten()
43503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertAllClose(val0, val1)
43603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
43703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testSomeErrors(self):
43803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
43903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd = tf.Variable(tf.random_uniform([10, 43]))
44003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      with self.assertRaises(ValueError):
44103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower        tf.create_partitioned_variables([10], [1, 1], rnd.initialized_value())
44203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      with self.assertRaises(ValueError):
44303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower        tf.create_partitioned_variables([10, 20], [1], rnd.initialized_value())
44403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      with self.assertRaises(ValueError):
44503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower        tf.create_partitioned_variables([10, 43], [1], rnd.initialized_value())
44603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      with self.assertRaises(ValueError):
44703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower        tf.create_partitioned_variables(
44803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower            [10, 43], [1, 2, 3], rnd.initialized_value())
44903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      with self.assertRaises(ValueError):
45003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower        tf.create_partitioned_variables(
45103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower            [10, 43], [11, 1], rnd.initialized_value())
45203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      with self.assertRaises(ValueError):
45303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower        tf.create_partitioned_variables(
45403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower            [10, 43], [20, 1], rnd.initialized_value())
45503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      with self.assertRaises(ValueError):
45603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower        tf.create_partitioned_variables(
45703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower            [10, 43], [1, 50], rnd.initialized_value())
45803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
459dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower  def testControlDepsNone(self):
460dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower    with self.test_session() as session:
461dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      c = tf.constant(1.0)
462dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      with tf.control_dependencies([c]):
463dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower        # d get the control dependency.
464dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower        d = tf.constant(2.0)
465dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower        # Partitioned variables do not.
466dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower        var_x = tf.get_variable(
467dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower            "x",
468dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower            initializer=tf.ones_initializer([2]),
469dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower            partitioner=tf.variable_axis_size_partitioner(4))
470dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower
471dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower        ops_before_read = session.graph.get_operations()
472dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower        var_x.as_tensor()  # Caches the ops for subsequent reads.
473dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower        reading_ops = [op for op in session.graph.get_operations()
474dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower                       if op not in ops_before_read]
475dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower
476dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      self.assertEqual([c.op], d.op.control_inputs)
477dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      # Tests that no control dependencies are added to reading a partitioned
478dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      # variable which is similar to reading a variable.
479dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      for op in reading_ops:
480dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower        self.assertEqual([], op.control_inputs)
481dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower
482dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower  def testConcat(self):
483dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower    with self.test_session() as session:
484dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      var_x = tf.get_variable(
485dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower          "x",
486dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower          initializer=tf.constant([1., 2.]),
487dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower          partitioner=tf.variable_axis_size_partitioner(4))
488dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower
489dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      c = tf.constant(1.0)
490dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      with tf.control_dependencies([c]):
491dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower        ops_before_concat = session.graph.get_operations()
492dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower        value = var_x.concat()
493dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower        concat_ops = [op for op in session.graph.get_operations()
494dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower                      if op not in ops_before_concat]
495dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower
496dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      concat_control_inputs = [ci for op in concat_ops
497dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower                               for ci in op.control_inputs]
498dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      self.assertTrue(
499dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower          c.op in concat_control_inputs,
500dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower          "var_x.concat() should get control dependencies from its scope.")
501dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      tf.initialize_all_variables().run()
502dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      self.assertAllClose(value.eval(), var_x.as_tensor().eval())
503dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower
50403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
50503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlowerif __name__ == "__main__":
50603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  tf.test.main()
507