19ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower/* Copyright 2017 The TensorFlow Authors. All Rights Reserved.
29ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
39ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerLicensed under the Apache License, Version 2.0 (the "License");
49ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFloweryou may not use this file except in compliance with the License.
59ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerYou may obtain a copy of the License at
69ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
79ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    http://www.apache.org/licenses/LICENSE-2.0
89ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
99ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerUnless required by applicable law or agreed to in writing, software
109ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerdistributed under the License is distributed on an "AS IS" BASIS,
119ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
129ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerSee the License for the specific language governing permissions and
139ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerlimitations under the License.
149ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower==============================================================================*/
159ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
169ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/cc/ops/const_op.h"
179ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/cc/ops/image_ops.h"
189ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/cc/ops/nn_ops.h"
199ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/cc/ops/standard_ops.h"
209ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/common_runtime/function.h"
219ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/framework/tensor_shape.h"
229ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/framework/tensor_testutil.h"
239ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/graph/default_device.h"
249ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/graph/node_builder.h"
259ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/graph/testlib.h"
26d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower#include "tensorflow/core/kernels/i_remote_fused_graph_executor.h"
279ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/kernels/remote_fused_graph_execute_op_test_utils.h"
289ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/kernels/remote_fused_graph_execute_utils.h"
299ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/lib/core/status_test_util.h"
309ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/platform/test.h"
319ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/core/public/session.h"
329ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower#include "tensorflow/tools/graph_transforms/transform_utils.h"
339ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
349ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowernamespace tensorflow {
359ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowernamespace graph_transforms {
369ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
379ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower// Declared here so we don't have to put it in a public header.
389ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerStatus FuseRemoteGraph(const GraphDef& input_graph_def,
399ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower                       const TransformFuncContext& context,
409ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower                       GraphDef* output_graph_def);
419ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
421c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlowerStatus PlaceRemoteGraphArguments(const GraphDef& input_graph_def,
431c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower                                 const TransformFuncContext& context,
441c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower                                 GraphDef* output_graph_def);
451c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower
469ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowernamespace {
479ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerconstexpr const char* const REMOTE_FUSED_GRAPH_EXECUTOR_NAME =
489ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    "remote_fused_graph_executor_name";
499ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerconstexpr const char* const REMOTE_FUSED_GRAPH_NODE_NAME =
509ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    "remote_fused_graph_node_name";
51d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlowerconstexpr const char* const REMOTE_FUSED_EXECUTOR_NAME0 =
52d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower    "fuse_test_remote_fused_graph_executor0";
53d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlowerconstexpr const char* const REMOTE_FUSED_EXECUTOR_NAME1 =
54d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower    "fuse_test_remote_fused_graph_executor1";
55d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower
56d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlowerStatus BuildRemoteFusedGraphExecutor0(
57d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower    std::unique_ptr<IRemoteFusedGraphExecutor>* executor) {
58d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower  executor->reset(
59d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower      new TestRemoteFusedGraphExecutor({"Mul"}, REMOTE_FUSED_EXECUTOR_NAME0));
60d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower  return Status::OK();
61d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower}
62d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower
63d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlowerStatus BuildRemoteFusedGraphExecutor1(
64d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower    std::unique_ptr<IRemoteFusedGraphExecutor>* executor) {
65d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower  executor->reset(new TestRemoteFusedGraphExecutor(
66d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower      {"Const", "Mul"}, REMOTE_FUSED_EXECUTOR_NAME1));
67d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower  return Status::OK();
68d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower}
699ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
709ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerclass FuseRemoteGraphMultipleAddOpsRewriterTest : public ::testing::Test {
719ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower protected:
729ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  void SetUp() final {
739ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    TF_ASSERT_OK(RemoteFusedGraphExecuteOpTestUtils::BuildMultipleAddGraph(
749ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower        &input_graph_def_));
751c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower    RemoteFusedGraphExecuteUtils::ExecutorBuildRegistrar
76d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower        hexagon_remote_fused_graph_executor_build(
771c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower            REMOTE_FUSED_GRAPH_EXECUTOR_NAME,
781c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower            [](std::unique_ptr<IRemoteFusedGraphExecutor>* executor) -> Status {
791c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower              return Status::OK();
801c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower            });
81d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower    RemoteFusedGraphExecuteUtils::ExecutorBuildRegistrar
82d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower        test_remote_fused_graph_executor_build0(REMOTE_FUSED_EXECUTOR_NAME0,
83d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower                                                BuildRemoteFusedGraphExecutor0);
84d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower
85d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower    RemoteFusedGraphExecuteUtils::ExecutorBuildRegistrar
86d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower        test_remote_fused_graph_executor_build1(REMOTE_FUSED_EXECUTOR_NAME1,
87d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower                                                BuildRemoteFusedGraphExecutor1);
889ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  }
899ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
909ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  void TearDown() final {}
919ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
921c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  Status Fuse() { return FuseInternal(/*only_place_args=*/false); }
931c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower
941c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  Status PlaceFuseArgs() { return FuseInternal(/*only_place_args*/ true); }
951c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower
961c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  Status FuseWithPlacedArgs() {
971c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower    const std::vector<std::pair<string, Tensor>> input_tensors{
981c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower        {"A", {DT_FLOAT, {1, 1, 1, 1}}}};
991c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower    return RemoteFusedGraphExecuteUtils::FuseRemoteGraphByPlacedArguments(
1001c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower        input_graph_def_with_fuse_args_, input_tensors, &output_graph_def_);
1011c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  }
1021c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower
1031c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  Status FuseInternal(bool only_place_args) {
1049ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    TransformFuncContext context;
1059ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    context.input_names = inputs_;
1069ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    context.output_names = outputs_;
1079ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
1089ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    if (!input_types_.empty()) {
1099ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower      context.params.insert(std::pair<string, std::vector<string>>(
1109ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower          {RemoteFusedGraphExecuteUtils::TRANSFORM_ARG_INPUT_TYPES,
1119ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower           {input_types_}}));
1129ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    }
1139ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    if (!input_shapes_.empty()) {
1149ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower      context.params.insert(std::pair<string, std::vector<string>>(
1159ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower          {RemoteFusedGraphExecuteUtils::TRANSFORM_ARG_INPUT_SHAPES,
1169ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower           {input_shapes_}}));
1179ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    }
1189ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    if (!fused_node_names_str_.empty()) {
1199ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower      context.params.insert(std::pair<string, std::vector<string>>(
1209ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower          {RemoteFusedGraphExecuteUtils::TRANSFORM_ARG_FUSED_NODES,
1219ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower           {fused_node_names_str_}}));
1229ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    }
1239ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
1249ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    if (!border_inputs_str_.empty()) {
1259ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower      context.params.insert(std::pair<string, std::vector<string>>(
1269ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower          {RemoteFusedGraphExecuteUtils::TRANSFORM_ARG_BORDER_INPUTS,
1279ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower           {border_inputs_str_}}));
1289ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    }
1299ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    if (!border_outputs_str_.empty()) {
1309ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower      context.params.insert(std::pair<string, std::vector<string>>(
1319ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower          {RemoteFusedGraphExecuteUtils::TRANSFORM_ARG_BORDER_OUTPUTS,
1329ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower           {border_outputs_str_}}));
1339ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    }
1349ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
135f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower    if (!fused_op_types_str_.empty()) {
136f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower      context.params.insert(std::pair<string, std::vector<string>>(
137f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower          {RemoteFusedGraphExecuteUtils::TRANSFORM_ARG_FUSED_OP_TYPES,
138f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower           {fused_op_types_str_}}));
139f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower    }
140f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower
141d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower    if (fuse_by_executor_) {
142d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower      context.params.insert(std::pair<string, std::vector<string>>(
143d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower          {RemoteFusedGraphExecuteUtils::TRANSFORM_ARG_FUSE_BY_EXECUTOR,
144d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower           {"true"}}));
145d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower    }
146d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower
1479ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    context.params.insert(std::pair<string, std::vector<string>>(
1489ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower        {RemoteFusedGraphExecuteUtils::
1499ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower             TRANSFORM_ARG_REMOTE_FUSED_GRAPH_EXECUTOR_NAME,
150d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower         {remote_fused_graph_executor_name_}}));
1519ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    context.params.insert(std::pair<string, std::vector<string>>(
1529ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower        {RemoteFusedGraphExecuteUtils::
1539ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower             TRANSFORM_ARG_REMOTE_FUSED_GRAPH_NODE_NAME,
1549ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower         {REMOTE_FUSED_GRAPH_NODE_NAME}}));
1559ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
1561c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower    if (only_place_args) {
1571c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower      return PlaceRemoteGraphArguments(input_graph_def_, context,
1581c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower                                       &input_graph_def_with_fuse_args_);
1591c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower    } else {
1601c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower      return FuseRemoteGraph(input_graph_def_, context, &output_graph_def_);
1611c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower    }
1629ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  }
1639ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
1649ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  void SetInputShapeType() {
1659ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    input_types_ = "float";
1669ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    input_shapes_ = "1,1,1,1";
1679ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  }
1689ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
169f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  void ReplaceOpType(const std::unordered_set<string>& op_name,
170f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower                     const string& new_op_type) {
171f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower    for (NodeDef& node_def : *input_graph_def_.mutable_node()) {
172f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower      if (op_name.count(node_def.name()) > 0) {
173f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower        node_def.set_op(new_op_type);
174f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower      }
175f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower    }
176f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  }
177f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower
1789ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  void CheckGraph(int expected_node_count, int expected_cluster_count) {
1799ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    EXPECT_EQ(expected_node_count, output_graph_def_.node_size());
1809ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
1819ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    int cluster_count = 0;
1829ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    for (const NodeDef& node_def : output_graph_def_.node()) {
1839ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower      const string& name = node_def.name();
1849ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower      if (StringPiece(name).starts_with(REMOTE_FUSED_GRAPH_NODE_NAME)) {
1859ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower        ++cluster_count;
1869ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower        RemoteFusedGraphExecuteInfo info;
1879ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower        string serialized_proto;
1889ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower        TF_ASSERT_OK(
1899ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower            GetNodeAttr(node_def,
1909ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower                        RemoteFusedGraphExecuteUtils::
1919ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower                            ATTR_SERIALIZED_REMOTE_FUSED_GRAPH_EXECUTE_INFO,
1929ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower                        &serialized_proto));
1939ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower        info.ParseFromString(serialized_proto);
194d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower        CHECK_EQ(remote_fused_graph_executor_name_, info.executor_name());
1959ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower      }
1969ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    }
1979ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower    EXPECT_EQ(expected_cluster_count, cluster_count);
1989ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  }
1999ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
2009ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower public:
2019ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  const std::vector<string> inputs_{"A"};
2029ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  const std::vector<string> outputs_{"K"};
2039ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  GraphDef input_graph_def_;
2049ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  string input_types_;
2059ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  string input_shapes_;
2061c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  GraphDef input_graph_def_with_fuse_args_;
2079ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  GraphDef output_graph_def_;
2089ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  string fused_node_names_str_;
2099ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  string border_inputs_str_;
2109ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  string border_outputs_str_;
211f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  string fused_op_types_str_;
212d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower  string remote_fused_graph_executor_name_{REMOTE_FUSED_GRAPH_EXECUTOR_NAME};
213d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower  bool fuse_by_executor_{false};
2149ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower};
2159ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
2169ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest,
2179ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower       FuseRemoteGraphByNodesWithShapeType_HIJ) {
2189ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  SetInputShapeType();
2199ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  fused_node_names_str_ = "H,I,J";
2209ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  TF_ASSERT_OK(Fuse());
2219ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  CheckGraph(9, 1);
2229ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower}
2239ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
2249ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest,
2259ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower       FuseRemoteGraphByNodesWithoutShapeType_HIJ) {
2269ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  fused_node_names_str_ = "H,I,J";
2279ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  TF_ASSERT_OK(Fuse());
2289ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  CheckGraph(9, 1);
2299ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower}
2309ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
2319ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest,
2329ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower       FuseRemoteGraphByNodesWithShapeType_ABCDEFGHIJK) {
2339ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  SetInputShapeType();
2349ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  fused_node_names_str_ = "A,B,C,D,E,F,G,H,I,J,K";
2359ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  TF_ASSERT_OK(Fuse());
2369ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  CheckGraph(3, 1);
2379ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower}
2389ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
2399ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest,
2409ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower       FuseRemoteGraphByNodesWithoutShapeType_ABCDEFGHIJK) {
2419ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  fused_node_names_str_ = "A,B,C,D,E,F,G,H,I,J,K";
2429ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  TF_ASSERT_OK(Fuse());
2439ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  CheckGraph(3, 1);
2449ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower}
2459ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
2469ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest,
2479ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower       FuseRemoteGraphByBorderWithShapeType_FCG_J) {
2489ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  SetInputShapeType();
2499ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  border_inputs_str_ = "F:0,C:0,G";
2509ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  border_outputs_str_ = "J:0";
2519ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  TF_ASSERT_OK(Fuse());
2529ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  CheckGraph(9, 1);
2539ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower}
2549ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
2559ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest,
2569ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower       FuseRemoteGraphByBorderWithoutShapeType_FCG_J) {
2579ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  border_inputs_str_ = "F:0,C:0,G";
2589ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  border_outputs_str_ = "J:0";
2599ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  TF_ASSERT_OK(Fuse());
2609ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  CheckGraph(9, 1);
2619ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower}
2629ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
2639ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest,
2649ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower       FuseRemoteGraphByBorderWithShapeType_ABCDE_K) {
2659ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  SetInputShapeType();
2669ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  border_inputs_str_ = "A,B,C,D,E";
2679ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  border_outputs_str_ = "K";
2689ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  TF_ASSERT_OK(Fuse());
2699ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  CheckGraph(7, 1);
2709ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower}
2719ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
2729ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest,
2739ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower       FuseRemoteGraphByBorderWithoutShapeType_ABCDE_K) {
2749ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  border_inputs_str_ = "A,B,C,D,E";
2759ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  border_outputs_str_ = "K";
2769ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  TF_ASSERT_OK(Fuse());
2779ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower  CheckGraph(7, 1);
2789ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower}
2799ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower
280f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest,
281f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower       FuseRemoteGraphByOpTypes_HIJ) {
282f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  ReplaceOpType({"H", "I", "J"}, "Mul");
283f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  fused_op_types_str_ = "Mul";
284f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  TF_ASSERT_OK(Fuse());
285f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  CheckGraph(9, 1);
286f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower}
287f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower
288f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest,
289f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower       FuseRemoteGraphByOpTypes_FGHIJ) {
290f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  ReplaceOpType({"F", "G", "H", "I", "J"}, "Mul");
291f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  fused_op_types_str_ = "Const,Mul";
292f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  TF_ASSERT_OK(Fuse());
293f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  CheckGraph(3, 1);
294f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower}
295f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower
296d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest,
297d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower       FuseRemoteGraphByExecutor_HIJ) {
298d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower  ReplaceOpType({"H", "I", "J"}, "Mul");
299d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower  remote_fused_graph_executor_name_ = REMOTE_FUSED_EXECUTOR_NAME0;
300d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower  fuse_by_executor_ = true;
301d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower  TF_ASSERT_OK(Fuse());
302d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower  CheckGraph(9, 1);
303d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower}
304d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower
305d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest,
306d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower       FuseRemoteGraphByExecutor_FGHIJ) {
307d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower  ReplaceOpType({"F", "G", "H", "I", "J"}, "Mul");
308d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower  remote_fused_graph_executor_name_ = REMOTE_FUSED_EXECUTOR_NAME1;
309d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower  fuse_by_executor_ = true;
310d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower  TF_ASSERT_OK(Fuse());
311d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower  CheckGraph(3, 1);
312d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower}
313d5f4d9bbac520ad9eae6614fe678e9d1568435a4A. Unique TensorFlower
3141c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, PlaceAndFuse_HIJ) {
3151c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  fused_node_names_str_ = "H,I,J";
3161c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  TF_ASSERT_OK(PlaceFuseArgs());
3171c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  TF_ASSERT_OK(FuseWithPlacedArgs());
3181c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  CheckGraph(9, 1);
3191c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower}
3201c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower
3211c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, PlaceAndFuse_ABCDEFGHIJK) {
3221c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  fused_node_names_str_ = "A,B,C,D,E,F,G,H,I,J,K";
3231c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  TF_ASSERT_OK(PlaceFuseArgs());
3241c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  TF_ASSERT_OK(FuseWithPlacedArgs());
3251c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  CheckGraph(3, 1);
3261c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower}
3271c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower
3281c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, PlaceAndFuse_FCG_J) {
3291c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  border_inputs_str_ = "F:0,C:0,G";
3301c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  border_outputs_str_ = "J:0";
3311c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  TF_ASSERT_OK(PlaceFuseArgs());
3321c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  TF_ASSERT_OK(FuseWithPlacedArgs());
3331c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  CheckGraph(9, 1);
3341c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower}
3351c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower
3361c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, PlaceAndFuse_ABCDE_K) {
3371c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  SetInputShapeType();
3381c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  border_inputs_str_ = "A,B,C,D,E";
3391c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  border_outputs_str_ = "K";
3401c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  TF_ASSERT_OK(PlaceFuseArgs());
3411c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  TF_ASSERT_OK(FuseWithPlacedArgs());
3421c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower  CheckGraph(7, 1);
3431c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower}
3441c5715078cf726411fc3f5667c503ab33c9f1612A. Unique TensorFlower
345f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest, PlaceAndFuse_MUL_HIJ) {
346f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  SetInputShapeType();
347f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  ReplaceOpType({"H", "I", "J"}, "Mul");
348f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  fused_op_types_str_ = "Mul";
349f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower
350f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  TF_ASSERT_OK(PlaceFuseArgs());
351f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  TF_ASSERT_OK(FuseWithPlacedArgs());
352f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  CheckGraph(9, 1);
353f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower}
354f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower
355f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlowerTEST_F(FuseRemoteGraphMultipleAddOpsRewriterTest,
356f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower       PlaceAndFuse_CONST_MUL_FGHIJ) {
357f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  SetInputShapeType();
358f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  ReplaceOpType({"F", "G", "H", "I", "J"}, "Mul");
359f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  fused_op_types_str_ = "Const,Mul";
360f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower
361f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  TF_ASSERT_OK(PlaceFuseArgs());
362f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  TF_ASSERT_OK(FuseWithPlacedArgs());
363f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower  CheckGraph(3, 1);
364f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower}
365f39dd926259bee979915df2edaeb2369eebeefcbA. Unique TensorFlower
3669ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower}  // namespace
3679ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower}  // namespace graph_transforms
3689ad851e54d014532dd3b3c8308396769f9a7aeeeA. Unique TensorFlower}  // namespace tensorflow
369