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"""Tests for partitioned_variables.py."""
165866e065bc95c1d7de8a27413b368016941889a6Justine Tunney
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 TensorFlower
245866e065bc95c1d7de8a27413b368016941889a6Justine Tunneyfrom tensorflow.python.framework import constant_op
255866e065bc95c1d7de8a27413b368016941889a6Justine Tunneyfrom tensorflow.python.framework import dtypes
265866e065bc95c1d7de8a27413b368016941889a6Justine Tunneyfrom tensorflow.python.framework import ops
275866e065bc95c1d7de8a27413b368016941889a6Justine Tunneyfrom tensorflow.python.ops import array_ops
285866e065bc95c1d7de8a27413b368016941889a6Justine Tunneyfrom tensorflow.python.ops import init_ops
295866e065bc95c1d7de8a27413b368016941889a6Justine Tunneyfrom tensorflow.python.ops import partitioned_variables
305866e065bc95c1d7de8a27413b368016941889a6Justine Tunneyfrom tensorflow.python.ops import random_ops
315866e065bc95c1d7de8a27413b368016941889a6Justine Tunneyfrom tensorflow.python.ops import variable_scope
325866e065bc95c1d7de8a27413b368016941889a6Justine Tunneyfrom tensorflow.python.ops import variables
335866e065bc95c1d7de8a27413b368016941889a6Justine Tunneyfrom tensorflow.python.platform import test
3404654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
355866e065bc95c1d7de8a27413b368016941889a6Justine Tunney
365866e065bc95c1d7de8a27413b368016941889a6Justine Tunneyclass PartitionerCreatorsTest(test.TestCase):
3704654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
38a54aa42d4e1d5b60782bcee9ac346d7509195567Illia Polosukhin  def testFixedSizePartitioner(self):
39a54aa42d4e1d5b60782bcee9ac346d7509195567Illia Polosukhin    with self.test_session():
405866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      partitioner = partitioned_variables.fixed_size_partitioner(5, axis=0)
415866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      with variable_scope.variable_scope("root", partitioner=partitioner):
425866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        v0 = variable_scope.get_variable(
435866e065bc95c1d7de8a27413b368016941889a6Justine Tunney            "v0", dtype=dtypes.float32, shape=(10, 10))
44a54aa42d4e1d5b60782bcee9ac346d7509195567Illia Polosukhin        v0_list = v0._get_variable_list()
45a54aa42d4e1d5b60782bcee9ac346d7509195567Illia Polosukhin        v0_part = v0._get_partitions()
46a54aa42d4e1d5b60782bcee9ac346d7509195567Illia Polosukhin        self.assertEqual(len(v0_list), 5)
47a54aa42d4e1d5b60782bcee9ac346d7509195567Illia Polosukhin        self.assertAllEqual(v0_part, (5, 1))
48a54aa42d4e1d5b60782bcee9ac346d7509195567Illia Polosukhin
492091f50c4a6549256233157f47bfb54023476938Alexandre Passos  def testFixedSizePartitionerInt64(self):
502091f50c4a6549256233157f47bfb54023476938Alexandre Passos    with self.test_session():
512091f50c4a6549256233157f47bfb54023476938Alexandre Passos      partitioner = partitioned_variables.fixed_size_partitioner(4, axis=0)
522091f50c4a6549256233157f47bfb54023476938Alexandre Passos      with variable_scope.variable_scope("root", partitioner=partitioner):
53aee7f95a027accc94f1f9130f0cfaecd9399bc1dYifei Feng        v0 = variable_scope.get_variable("v0", dtype=dtypes.int64, shape=[20])
542091f50c4a6549256233157f47bfb54023476938Alexandre Passos        v0_list = v0._get_variable_list()
552091f50c4a6549256233157f47bfb54023476938Alexandre Passos        self.assertEqual(len(v0_list), 4)
562091f50c4a6549256233157f47bfb54023476938Alexandre Passos
57170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower  def testResourceFixedSizePartitioner(self):
58170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower    with self.test_session():
59170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower      partitioner = partitioned_variables.fixed_size_partitioner(5, axis=0)
60170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower      with variable_scope.variable_scope(
61170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower          "root", partitioner=partitioner, use_resource=True):
62170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower        v0 = variable_scope.get_variable(
63170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower            "v0", dtype=dtypes.float32, shape=(10, 10))
64170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower        v0_list = v0._get_variable_list()
65170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower        v0_part = v0._get_partitions()
66170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower        self.assertEqual(len(v0_list), 5)
67170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower        self.assertAllEqual(v0_part, (5, 1))
68170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower
695866e065bc95c1d7de8a27413b368016941889a6Justine Tunney  def _testVariableAxisSizePartitioner(self,
705866e065bc95c1d7de8a27413b368016941889a6Justine Tunney                                       name,
715866e065bc95c1d7de8a27413b368016941889a6Justine Tunney                                       axis,
725866e065bc95c1d7de8a27413b368016941889a6Justine Tunney                                       max_shard_bytes,
735b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                       expected_axis_shards,
745b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                       expected_partitions,
755b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower                                       max_shards=None):
765866e065bc95c1d7de8a27413b368016941889a6Justine Tunney    partitioner = partitioned_variables.variable_axis_size_partitioner(
775b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower        axis=axis, max_shard_bytes=max_shard_bytes, max_shards=max_shards)
785b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower
795866e065bc95c1d7de8a27413b368016941889a6Justine Tunney    with variable_scope.variable_scope("root", partitioner=partitioner):
805866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      v0 = variable_scope.get_variable(
815866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          name, dtype=dtypes.float32, shape=(4, 8, 16, 32))
82775a7490047299f2b64bf4fafcb6504852b8082dWei Ho      v0_list = v0._get_variable_list()
83775a7490047299f2b64bf4fafcb6504852b8082dWei Ho      v0_part = v0._get_partitions()
845b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      self.assertEqual(len(v0_list), expected_axis_shards)
855b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      self.assertAllEqual(v0_part, expected_partitions)
865b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower
8704654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo  def testVariableAxisSizePartitioner(self):
8804654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo    with self.test_session():
8904654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo      # Create a partitioned variable of shape (4, 8, 16, 32) type float32
9004654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo      # Bytes per slice along the given axes:
9104654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
9204654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo      # 8 * 16 * 32 * sizeof(float32) = 16384 / slice on axis 0
9304654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo      # 4 * 16 * 32 * sizeof(float32) = 8192 / slice on axis 1
9404654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo      # 4 * 8 * 32 * sizeof(float32) = 4096 / slice on axis 2
9504654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo      # 4 * 8 * 16 * sizeof(float32) = 2048 / slice on axis 3
9604654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
9704654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo      # Now partition it in different ways...
9804654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
995b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # No need to slice: bytes_per_slice * dim0 = 65536 < max_shard_bytes
1005866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._testVariableAxisSizePartitioner(
1015866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          "v0",
1025866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          axis=0,
1035866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_shard_bytes=131072,
1045866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_axis_shards=1,
1055866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_partitions=(1, 1, 1, 1))
1065b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower
1075b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # Slice exactly once: bytes_per_slice * dim1 = 65536 = max_shard_bytes
1085866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._testVariableAxisSizePartitioner(
1095866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          "v1",
1105866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          axis=1,
1115866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_shard_bytes=65536,
1125866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_axis_shards=1,
1135866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_partitions=(1, 1, 1, 1))
1145b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower
1155b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # Slice into 2 parts:
1165b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # bytes_per_slice = 4096
1175b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # slices_per_shard = 32768 / 4096 = 8
1185b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # axis_shards = 16 / 8 = 2
1195866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._testVariableAxisSizePartitioner(
1205866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          "v2",
1215866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          axis=2,
1225866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_shard_bytes=32768,
1235866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_axis_shards=2,
1245866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_partitions=(1, 1, 2, 1))
1255b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower
1265b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # This partitioner makes sure we maximize the number of shards along
1275b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # axis 3. Slice it into 32 parts:
1285b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # bytes_per_slice = 2048
1295b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # slices_per_shard = 2048 / 2048 = 1
1305b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # axis_shards = 32 / 1 = 32
1315866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._testVariableAxisSizePartitioner(
1325866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          "v3a",
1335866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          axis=3,
1345866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_shard_bytes=2048,
1355866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_axis_shards=32,
1365866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_partitions=(1, 1, 1, 32))
13704654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
1382ec20cda397ca5ba23838261c4c9526b8506af67A. Unique TensorFlower      # This partitioner makes sure we do not go past the bound of allowable
1395b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # number of shards along axis 3.
1405b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # Slice into 32 parts:
1415b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # bytes_per_slice = 2048
1425b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # slices_per_shard = max(1, 1024 / 2048) = 1
1435b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # axis_shards = 32 / 1 = 32
1445b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # Slice into max of 32 parts because: max_shard_bytes < bytes_per_slice
1455866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._testVariableAxisSizePartitioner(
1465866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          "v3b",
1475866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          axis=3,
1485866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_shard_bytes=1024,
1495866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_axis_shards=32,
1505866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_partitions=(1, 1, 1, 32))
1515b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower
1525b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # Specify max_shards so that it won't affect sharding.
1535866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._testVariableAxisSizePartitioner(
1545866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          "v3c",
1555866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          axis=3,
1565866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_shard_bytes=1024,
1575866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_axis_shards=32,
1585866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_partitions=(1, 1, 1, 32),
1595866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_shards=33)
1605b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower
1615b4ee6df47f40ba49eadc8b97435d232f0f83c0eA. Unique TensorFlower      # Specify max_shards so that it will affect sharding.
1625866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._testVariableAxisSizePartitioner(
1635866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          "v3d",
1645866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          axis=3,
1655866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_shard_bytes=1024,
1665866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_axis_shards=2,
1675866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_partitions=(1, 1, 1, 2),
1685866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_shards=2)
16904654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
17004654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo      # Use the partitioner with strings
171aee7f95a027accc94f1f9130f0cfaecd9399bc1dYifei Feng      partitioner_axis3_str = partitioned_variables.variable_axis_size_partitioner(  # pylint: disable=line-too-long
172aee7f95a027accc94f1f9130f0cfaecd9399bc1dYifei Feng          axis=3,
173aee7f95a027accc94f1f9130f0cfaecd9399bc1dYifei Feng          max_shard_bytes=32768,
174aee7f95a027accc94f1f9130f0cfaecd9399bc1dYifei Feng          bytes_per_string_element=8)
17504654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
1765866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      with variable_scope.variable_scope(
1775866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          "root", partitioner=partitioner_axis3_str):
1785866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        v3str = variable_scope.get_variable(
17904654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo            "v3str",
180775a7490047299f2b64bf4fafcb6504852b8082dWei Ho            initializer=np.array([""] * 4 * 8 * 16 * 32).reshape(4, 8, 16, 32),
1815866e065bc95c1d7de8a27413b368016941889a6Justine Tunney            dtype=dtypes.string,
182775a7490047299f2b64bf4fafcb6504852b8082dWei Ho            shape=(4, 8, 16, 32))
183775a7490047299f2b64bf4fafcb6504852b8082dWei Ho        v3str_list = v3str._get_variable_list()
184775a7490047299f2b64bf4fafcb6504852b8082dWei Ho        v3str_part = v3str._get_partitions()
18504654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
1862ec20cda397ca5ba23838261c4c9526b8506af67A. Unique TensorFlower        # Now the estimated bytes_per_slice = 4*8*16*bytes_per_string_element
1872ec20cda397ca5ba23838261c4c9526b8506af67A. Unique TensorFlower        # which is equal to 4096.  Setting a max_shard_bytes of 32768
18804654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo        # and we should get a split of 4.
1892ec20cda397ca5ba23838261c4c9526b8506af67A. Unique TensorFlower        # Slice into 4 parts:
1902ec20cda397ca5ba23838261c4c9526b8506af67A. Unique TensorFlower        # bytes_per_slice = 4096
1912ec20cda397ca5ba23838261c4c9526b8506af67A. Unique TensorFlower        # slices_per_shard = 32768 / 4096 = 8
1922ec20cda397ca5ba23838261c4c9526b8506af67A. Unique TensorFlower        # axis_shards = 32 / 8 = 4
19304654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo        self.assertEqual(len(v3str_list), 4)
19404654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo        self.assertAllEqual(v3str_part, (1, 1, 1, 4))
19504654ab6734a81c6bf491c370218f9173484a2f0Eugene Brevdo
196f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower  def _testMinMaxVariablePartitioner(self, max_partitions, axis, min_slice_size,
1975866e065bc95c1d7de8a27413b368016941889a6Justine Tunney                                     var_name, var_shape, expected_axis_shards,
1985866e065bc95c1d7de8a27413b368016941889a6Justine Tunney                                     expected_partitions):
1995866e065bc95c1d7de8a27413b368016941889a6Justine Tunney    partitioner = partitioned_variables.min_max_variable_partitioner(
2005866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        max_partitions=max_partitions, axis=axis, min_slice_size=min_slice_size)
2015866e065bc95c1d7de8a27413b368016941889a6Justine Tunney    with variable_scope.variable_scope("root", partitioner=partitioner):
2025866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      v0 = variable_scope.get_variable(
2035866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_name, dtype=dtypes.float32, shape=var_shape)
204f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      v0_list = v0._get_variable_list()
205f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      v0_part = v0._get_partitions()
206f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      self.assertEqual(len(v0_list), expected_axis_shards)
207f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      self.assertAllEqual(v0_part, expected_partitions)
208f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower
209f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower  def testMinMaxVariablePartitioner(self):
210f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower    with self.test_session():
211f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      # Partitioning a variable of shape=[2048] with a minimum of 2K per slice.
2125866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._testMinMaxVariablePartitioner(
2135866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_partitions=100,
2145866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          axis=0,
2155866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          min_slice_size=2 << 10,
2165866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_name="v0_0",
2175866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_shape=[2048],
2185866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_axis_shards=4,
2195866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_partitions=[4])
220f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower
221f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      # Partitioning a variable of shape=[2048, 1024] with a minimum of 256K per
222f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      # slice.
2235866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._testMinMaxVariablePartitioner(
2245866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_partitions=100,
2255866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          axis=0,
2265866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          min_slice_size=256 << 10,
2275866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_name="v0",
2285866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_shape=[2048, 1024],
2295866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_axis_shards=32,
2305866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_partitions=[32, 1])
231f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower
232f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      # max_partitions restricts partitioning of the variable.
2335866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._testMinMaxVariablePartitioner(
2345866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_partitions=16,
2355866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          axis=0,
2365866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          min_slice_size=256 << 10,
2375866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_name="v1_max",
2385866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_shape=[2048, 1024],
2395866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_axis_shards=16,
2405866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_partitions=[16, 1])
2415866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._testMinMaxVariablePartitioner(
2425866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_partitions=1,
2435866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          axis=0,
2445866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          min_slice_size=256 << 10,
2455866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_name="v2_max",
2465866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_shape=[2048, 1024],
2475866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_axis_shards=1,
2485866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_partitions=[1, 1])
249f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower
250f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      # Reducing/Increasing min_slice_size proportionately increases/reduces the
251f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      # number of partitions.
2525866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._testMinMaxVariablePartitioner(
2535866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_partitions=100,
2545866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          axis=0,
2555866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          min_slice_size=128 << 10,
2565866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_name="v3_slice",
2575866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_shape=[2048, 1024],
2585866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_axis_shards=64,
2595866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_partitions=[64, 1])
2605866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._testMinMaxVariablePartitioner(
2615866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_partitions=100,
2625866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          axis=0,
2635866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          min_slice_size=512 << 10,
2645866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_name="v4_slice",
2655866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_shape=[2048, 1024],
2665866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_axis_shards=16,
2675866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_partitions=[16, 1])
268f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower
269f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      # Partitioning the variable along a different axis.
2705866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._testMinMaxVariablePartitioner(
2715866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_partitions=100,
2725866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          axis=1,
2735866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          min_slice_size=256 << 10,
2745866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_name="v5_axis",
2755866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_shape=[64, 1024, 1, 3],
2765866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_axis_shards=3,
2775866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_partitions=[1, 3, 1, 1])
2785866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._testMinMaxVariablePartitioner(
2795866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_partitions=100,
2805866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          axis=3,
2815866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          min_slice_size=256 << 10,
2825866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_name="v6_axis",
2835866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_shape=[64, 1024, 1, 3],
2845866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_axis_shards=3,
2855866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_partitions=[1, 1, 1, 3])
286f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower
287f2d00a47fd40c1006bc08b53be6bcbad7983dfd8A. Unique TensorFlower      # Can not partition the variable more than what its shape allows.
2885866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._testMinMaxVariablePartitioner(
2895866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_partitions=100,
2905866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          axis=0,
2915866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          min_slice_size=256 << 10,
2925866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_name="v7_shape",
2935866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_shape=[16, 128, 1024],
2945866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_axis_shards=16,
2955866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_partitions=[16, 1, 1])
2965866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._testMinMaxVariablePartitioner(
2975866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          max_partitions=100,
2985866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          axis=0,
2995866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          min_slice_size=256 << 10,
3005866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_name="v8_shape",
3015866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          var_shape=[4, 512, 1024],
3025866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_axis_shards=4,
3035866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          expected_partitions=[4, 1, 1])
3045866e065bc95c1d7de8a27413b368016941889a6Justine Tunney
3055866e065bc95c1d7de8a27413b368016941889a6Justine Tunney
3065866e065bc95c1d7de8a27413b368016941889a6Justine Tunneydef _IotaInitializer(shape, dtype=dtypes.float32, partition_info=None):
3075866e065bc95c1d7de8a27413b368016941889a6Justine Tunney  assert dtype == dtypes.float32
30803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  if len(shape) == 1:
30903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    return range(shape[0])
31003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  else:
31103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    val = _IotaInitializer(shape[1:], dtype)
3125866e065bc95c1d7de8a27413b368016941889a6Justine Tunney    return [[(10**i) * v for v in val] for i in range(shape[0])]
31303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
31403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
3155866e065bc95c1d7de8a27413b368016941889a6Justine Tunneyclass PartitionedVariablesTestCase(test.TestCase):
31603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
31703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def _TestSaveSpec(self, slices, expected_specs):
31803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    self.assertEqual(len(expected_specs), len(slices))
31903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    for i in xrange(len(expected_specs)):
32003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEquals(expected_specs[i], slices[i]._save_slice_info.spec)
32103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
32203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testVecConstantInit(self):
32303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
3245866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      rnd_par = constant_op.constant([1, 2, 3, 4])
3255866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      vs = partitioned_variables.create_partitioned_variables([4], [4], rnd_par)
3265866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      variables.global_variables_initializer().run()
3270e226af7eed5e2764aa8acb825af4cd3e06d2452A. Unique TensorFlower      val = array_ops.concat(vs, 0).eval()
32803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd = rnd_par.eval()
32903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertAllClose(rnd, val)
3305866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self.assertEqual([dtypes.int32] * 4, [v.dtype.base_dtype for v in vs])
33103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self._TestSaveSpec(vs, ["4 0,1", "4 1,1", "4 2,1", "4 3,1"])
33203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
33303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testConstantInit(self):
33403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
3355866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      rnd_par = constant_op.constant([[1, 2, 3, 4], [5, 6, 7, 8]])
3365866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      vs = partitioned_variables.create_partitioned_variables([2, 4], [1, 2],
3375866e065bc95c1d7de8a27413b368016941889a6Justine Tunney                                                              rnd_par)
3385866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      variables.global_variables_initializer().run()
3390e226af7eed5e2764aa8acb825af4cd3e06d2452A. Unique TensorFlower      val = array_ops.concat(vs, 1).eval()
34003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd = rnd_par.eval()
34103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertAllClose(rnd, val)
3425866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self.assertEqual([dtypes.int32] * 2, [v.dtype.base_dtype for v in vs])
34303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self._TestSaveSpec(vs, ["2 4 0,2:0,2", "2 4 0,2:2,2"])
34403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
345170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower  def _testNameHelper(self, use_resource=False):
34603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
3475866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      rnd_par = constant_op.constant([[1, 2, 3, 4], [5, 6, 7, 8]])
348170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower      with variable_scope.variable_scope("hi", use_resource=use_resource):
3495866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        vs1 = partitioned_variables.create_partitioned_variables([2, 4], [1, 2],
3505866e065bc95c1d7de8a27413b368016941889a6Justine Tunney                                                                 rnd_par)
3515866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        vs2 = partitioned_variables.create_partitioned_variables([2, 4], [1, 2],
3525866e065bc95c1d7de8a27413b368016941889a6Justine Tunney                                                                 rnd_par)
3535866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      variables.global_variables_initializer().run()
35403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      var1_name = vs1[0]._save_slice_info.full_name
35503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      var2_name = vs2[0]._save_slice_info.full_name
35603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual("hi/PartitionedVariable", var1_name)
35703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual("hi/PartitionedVariable_1", var2_name)
35803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var1_name + "/part_0:0", vs1[0].name)
35903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var1_name + "/part_1:0", vs1[1].name)
36003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var2_name + "/part_0:0", vs2[0].name)
36103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var2_name + "/part_1:0", vs2[1].name)
36203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    # Test same variable.
36303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
3645866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      rnd_par = constant_op.constant([[1, 2, 3, 4], [5, 6, 7, 8]])
365170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower      with variable_scope.variable_scope(
366170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower          "hola", use_resource=use_resource) as vs:
3675866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        vs1 = partitioned_variables.create_partitioned_variables(
3685866e065bc95c1d7de8a27413b368016941889a6Justine Tunney            [2, 4], [1, 2], rnd_par, dtype=dtypes.int32)
369170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower      with variable_scope.variable_scope(
370170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower          vs, reuse=True, use_resource=use_resource):
3715866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        vs2 = partitioned_variables.create_partitioned_variables(
3725866e065bc95c1d7de8a27413b368016941889a6Justine Tunney            [2, 4], [1, 2], rnd_par, dtype=dtypes.int32)
3735866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      variables.global_variables_initializer().run()
37403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      var1_name = vs1[0]._save_slice_info.full_name
37503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      var2_name = vs2[0]._save_slice_info.full_name
37603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual("hola/PartitionedVariable", var1_name)
37703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual("hola/PartitionedVariable", var2_name)
37803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var1_name + "/part_0:0", vs1[0].name)
37903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var1_name + "/part_1:0", vs1[1].name)
38003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var2_name + "/part_0:0", vs2[0].name)
38103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var2_name + "/part_1:0", vs2[1].name)
38203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    # Test name_scope
38303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
3845866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      rnd_par = constant_op.constant([[1, 2, 3, 4], [5, 6, 7, 8]])
3855866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      with ops.name_scope("ola"):
3865866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        vs1 = partitioned_variables.create_partitioned_variables([2, 4], [1, 2],
3875866e065bc95c1d7de8a27413b368016941889a6Justine Tunney                                                                 rnd_par)
3885866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        vs2 = partitioned_variables.create_partitioned_variables([2, 4], [1, 2],
3895866e065bc95c1d7de8a27413b368016941889a6Justine Tunney                                                                 rnd_par)
3905866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      variables.global_variables_initializer().run()
39103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      var1_name = vs1[0]._save_slice_info.full_name
39203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      var2_name = vs2[0]._save_slice_info.full_name
39303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      # Currently, the name scope 'ola' has no effect.
39403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual("PartitionedVariable", var1_name)
39503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual("PartitionedVariable_1", var2_name)
39603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var1_name + "/part_0:0", vs1[0].name)
39703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var1_name + "/part_1:0", vs1[1].name)
39803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var2_name + "/part_0:0", vs2[0].name)
39903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertEqual(var2_name + "/part_1:0", vs2[1].name)
40003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
401170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower  def testName(self):
402170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower    self._testNameHelper(use_resource=False)
403170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower
404170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower  def testResourceName(self):
405170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower    self._testNameHelper(use_resource=True)
406170e97418ede711b5c5ef7f848e2608baea452edA. Unique TensorFlower
40703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testRandomInitValue(self):
40803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
4095866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      rnd = variables.Variable(random_ops.random_uniform([200, 40]))
4105866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      vs = partitioned_variables.create_partitioned_variables(
41103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          rnd.get_shape(), [1, 10], rnd.initialized_value())
4125866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      variables.global_variables_initializer().run()
4130e226af7eed5e2764aa8acb825af4cd3e06d2452A. Unique TensorFlower      val = array_ops.concat(vs, 1).eval()
41403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd = rnd.eval()
41503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertAllClose(rnd, val)
4165866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self.assertEqual([dtypes.float32] * 10, [v.dtype.base_dtype for v in vs])
4175866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._TestSaveSpec(vs, [
4185866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          "200 40 0,200:0,4", "200 40 0,200:4,4", "200 40 0,200:8,4",
4195866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          "200 40 0,200:12,4", "200 40 0,200:16,4", "200 40 0,200:20,4",
4205866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          "200 40 0,200:24,4", "200 40 0,200:28,4", "200 40 0,200:32,4",
4215866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          "200 40 0,200:36,4"
4225866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      ])
42303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
42403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testRandomInitUnevenPartitions(self):
42503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
4265866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      rnd = variables.Variable(
427aee7f95a027accc94f1f9130f0cfaecd9399bc1dYifei Feng          random_ops.random_uniform([20, 43], dtype=dtypes.float64))
42803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      var_lists = [
4295866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          partitioned_variables.create_partitioned_variables(
4305866e065bc95c1d7de8a27413b368016941889a6Justine Tunney              rnd.get_shape(), [1, i], rnd.initialized_value())
4315866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          for i in xrange(1, 10)
4325866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      ]
4335866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      variables.global_variables_initializer().run()
43403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd_val = rnd.eval()
43503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      # Only check the slice save specs for the first 5 tf.
43603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      save_specs = [
43703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          # One slice
43803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          ["20 43 0,20:0,43"],
43903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          # Two slices
4405866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          ["20 43 0,20:0,22", "20 43 0,20:22,21"],
44103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          # Three slices
4425866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          ["20 43 0,20:0,15", "20 43 0,20:15,14", "20 43 0,20:29,14"],
44303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          # Four slices
4445866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          [
4455866e065bc95c1d7de8a27413b368016941889a6Justine Tunney              "20 43 0,20:0,11", "20 43 0,20:11,11", "20 43 0,20:22,11",
4465866e065bc95c1d7de8a27413b368016941889a6Justine Tunney              "20 43 0,20:33,10"
4475866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          ],
44803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          # Five slices
4495866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          [
4505866e065bc95c1d7de8a27413b368016941889a6Justine Tunney              "20 43 0,20:0,9", "20 43 0,20:9,9", "20 43 0,20:18,9",
4515866e065bc95c1d7de8a27413b368016941889a6Justine Tunney              "20 43 0,20:27,8", "20 43 0,20:35,8"
4525866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          ]
4535866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      ]
45403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      for i, vs in enumerate(var_lists):
4550e226af7eed5e2764aa8acb825af4cd3e06d2452A. Unique TensorFlower        var_val = array_ops.concat(vs, 1).eval()
45603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower        self.assertAllClose(rnd_val, var_val)
4575866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        self.assertEqual([dtypes.float64] * len(vs),
4585866e065bc95c1d7de8a27413b368016941889a6Justine Tunney                         [v.dtype.base_dtype for v in vs])
45903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower        if i < len(save_specs):
46003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          self._TestSaveSpec(vs, save_specs[i])
46103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
46203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testDegenerate(self):
46303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
4645866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      rnd = variables.Variable(random_ops.random_uniform([10, 43]))
4655866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      vs = partitioned_variables.create_partitioned_variables(
46603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          rnd.get_shape(), [1, 1], rnd.initialized_value())
4675866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      variables.global_variables_initializer().run()
4680e226af7eed5e2764aa8acb825af4cd3e06d2452A. Unique TensorFlower      val = array_ops.concat(vs, 0).eval()
46903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd = rnd.eval()
47003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertAllClose(rnd, val)
47103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self._TestSaveSpec(vs, ["10 43 0,10:0,43"])
47203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
47303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testSliceSizeOne(self):
47403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
4755866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      rnd = variables.Variable(random_ops.random_uniform([10, 43]))
4765866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      vs = partitioned_variables.create_partitioned_variables(
47703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower          rnd.get_shape(), [10, 1], rnd.initialized_value())
4785866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      variables.global_variables_initializer().run()
4790e226af7eed5e2764aa8acb825af4cd3e06d2452A. Unique TensorFlower      val = array_ops.concat(vs, 0).eval()
48003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      rnd = rnd.eval()
48103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertAllClose(rnd, val)
4825866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._TestSaveSpec(vs, [
4835866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          "10 43 0,1:0,43", "10 43 1,1:0,43", "10 43 2,1:0,43",
4845866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          "10 43 3,1:0,43", "10 43 4,1:0,43", "10 43 5,1:0,43",
4855866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          "10 43 6,1:0,43", "10 43 7,1:0,43", "10 43 8,1:0,43", "10 43 9,1:0,43"
4865866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      ])
48703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
48803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testIotaInitializer(self):
48903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    self.assertAllClose([0., 1., 2., 3.], _IotaInitializer([4]))
49003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    self.assertAllClose([[0., 1.], [0., 10.], [0., 100.], [0., 1000.]],
49103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower                        _IotaInitializer([4, 2]))
49203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
4935866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      vs = partitioned_variables.create_partitioned_variables([13, 5], [3, 1],
4945866e065bc95c1d7de8a27413b368016941889a6Justine Tunney                                                              _IotaInitializer)
4955866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      variables.global_variables_initializer().run()
49603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      slice0 = _IotaInitializer([5, 5])
49703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      slice1 = _IotaInitializer([4, 5])
49803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      slice2 = _IotaInitializer([4, 5])
4990e226af7eed5e2764aa8acb825af4cd3e06d2452A. Unique TensorFlower      val = array_ops.concat(vs, 0).eval()
50003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertAllClose(slice0 + slice1 + slice2, val)
5015866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      self._TestSaveSpec(vs, ["13 5 0,5:0,5", "13 5 5,4:0,5", "13 5 9,4:0,5"])
50203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
50303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testRandomInitializer(self):
50403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    # Sanity check that the slices uses a different seed when using a random
50503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    # initializer function.
50603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
5075866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      var0, var1 = partitioned_variables.create_partitioned_variables(
5085866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          [20, 12], [1, 2], init_ops.random_uniform_initializer())
5095866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      variables.global_variables_initializer().run()
51003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      val0, val1 = var0.eval().flatten(), var1.eval().flatten()
51103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertTrue(np.linalg.norm(val0 - val1) > 1e-6)
51203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    # Negative test that proves that slices have the same values if
51303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    # the random initializer uses a seed.
51403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
5155866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      var0, var1 = partitioned_variables.create_partitioned_variables(
5165866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          [20, 12], [1, 2], init_ops.random_uniform_initializer(seed=201))
5175866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      variables.global_variables_initializer().run()
51803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      val0, val1 = var0.eval().flatten(), var1.eval().flatten()
51903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      self.assertAllClose(val0, val1)
52003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
52103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower  def testSomeErrors(self):
52203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower    with self.test_session():
5235866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      rnd = variables.Variable(random_ops.random_uniform([10, 43]))
52403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      with self.assertRaises(ValueError):
5255866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        partitioned_variables.create_partitioned_variables(
5265866e065bc95c1d7de8a27413b368016941889a6Justine Tunney            [10], [1, 1], rnd.initialized_value())
52703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      with self.assertRaises(ValueError):
5285866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        partitioned_variables.create_partitioned_variables(
5295866e065bc95c1d7de8a27413b368016941889a6Justine Tunney            [10, 20], [1], rnd.initialized_value())
53003869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      with self.assertRaises(ValueError):
5315866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        partitioned_variables.create_partitioned_variables(
5325866e065bc95c1d7de8a27413b368016941889a6Justine Tunney            [10, 43], [1], rnd.initialized_value())
53303869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      with self.assertRaises(ValueError):
5345866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        partitioned_variables.create_partitioned_variables(
53503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower            [10, 43], [1, 2, 3], rnd.initialized_value())
53603869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      with self.assertRaises(ValueError):
5375866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        partitioned_variables.create_partitioned_variables(
53803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower            [10, 43], [11, 1], rnd.initialized_value())
53903869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      with self.assertRaises(ValueError):
5405866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        partitioned_variables.create_partitioned_variables(
54103869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower            [10, 43], [20, 1], rnd.initialized_value())
54203869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower      with self.assertRaises(ValueError):
5435866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        partitioned_variables.create_partitioned_variables(
54403869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower            [10, 43], [1, 50], rnd.initialized_value())
54503869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
546dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower  def testControlDepsNone(self):
547dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower    with self.test_session() as session:
5485866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      c = constant_op.constant(1.0)
5495866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      with ops.control_dependencies([c]):
550dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower        # d get the control dependency.
5515866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        d = constant_op.constant(2.0)
552dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower        # Partitioned variables do not.
5535866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        var_x = variable_scope.get_variable(
554dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower            "x",
555cfb2280d3f6ced298681bd1141479a59a06abde8Olivia Nordquist            shape=[2],
5565866e065bc95c1d7de8a27413b368016941889a6Justine Tunney            initializer=init_ops.ones_initializer(),
5575866e065bc95c1d7de8a27413b368016941889a6Justine Tunney            partitioner=partitioned_variables.variable_axis_size_partitioner(4))
558dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower
559dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower        ops_before_read = session.graph.get_operations()
560dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower        var_x.as_tensor()  # Caches the ops for subsequent reads.
5615866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        reading_ops = [
5625866e065bc95c1d7de8a27413b368016941889a6Justine Tunney            op for op in session.graph.get_operations()
5635866e065bc95c1d7de8a27413b368016941889a6Justine Tunney            if op not in ops_before_read
5645866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        ]
565dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower
566dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      self.assertEqual([c.op], d.op.control_inputs)
567dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      # Tests that no control dependencies are added to reading a partitioned
568dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      # variable which is similar to reading a variable.
569dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      for op in reading_ops:
570dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower        self.assertEqual([], op.control_inputs)
571dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower
572dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower  def testConcat(self):
573dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower    with self.test_session() as session:
5745866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      var_x = variable_scope.get_variable(
575dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower          "x",
5765866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          initializer=constant_op.constant([1., 2.]),
5775866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          partitioner=partitioned_variables.variable_axis_size_partitioner(4))
578dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower
5795866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      c = constant_op.constant(1.0)
5805866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      with ops.control_dependencies([c]):
581dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower        ops_before_concat = session.graph.get_operations()
5826de77d7f296c2fce09afa0f86c5237a5d42be153Eugene Brevdo        value = var_x._concat()  # pylint: disable=protected-access
5835866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        concat_ops = [
5845866e065bc95c1d7de8a27413b368016941889a6Justine Tunney            op for op in session.graph.get_operations()
5855866e065bc95c1d7de8a27413b368016941889a6Justine Tunney            if op not in ops_before_concat
5865866e065bc95c1d7de8a27413b368016941889a6Justine Tunney        ]
5875866e065bc95c1d7de8a27413b368016941889a6Justine Tunney
5885866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      concat_control_inputs = [
5895866e065bc95c1d7de8a27413b368016941889a6Justine Tunney          ci for op in concat_ops for ci in op.control_inputs
5905866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      ]
591dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      self.assertTrue(
592dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower          c.op in concat_control_inputs,
5936de77d7f296c2fce09afa0f86c5237a5d42be153Eugene Brevdo          "var_x._concat() should get control dependencies from its scope.")
5945866e065bc95c1d7de8a27413b368016941889a6Justine Tunney      variables.global_variables_initializer().run()
595dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower      self.assertAllClose(value.eval(), var_x.as_tensor().eval())
596dd56e71952b73f4ab1158f8343812cbccd5c1c8dA. Unique TensorFlower
59703869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlower
59803869e6e9cfac85d3e0f87ded01f4dd8de10ed67A. Unique TensorFlowerif __name__ == "__main__":
5995866e065bc95c1d7de8a27413b368016941889a6Justine Tunney  test.main()
600