1783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower/* Copyright 2016 The TensorFlow Authors. All Rights Reserved.
2783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower
3783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlowerLicensed under the Apache License, Version 2.0 (the "License");
4783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFloweryou may not use this file except in compliance with the License.
5783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlowerYou may obtain a copy of the License at
6783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower
7783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower    http://www.apache.org/licenses/LICENSE-2.0
8783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower
9783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlowerUnless required by applicable law or agreed to in writing, software
10783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlowerdistributed under the License is distributed on an "AS IS" BASIS,
11783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlowerWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlowerSee the License for the specific language governing permissions and
13783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlowerlimitations under the License.
14783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower==============================================================================*/
15783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower#include "tensorflow/python/util/kernel_registry.h"
16783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower
17cf7c008ab150ac8e5edb3ed053d38b2919699796Yifei Feng#include "tensorflow/core/framework/node_def.pb.h"
18783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower#include "tensorflow/core/framework/node_def_util.h"
19783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower#include "tensorflow/core/framework/op.h"
20783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower#include "tensorflow/core/framework/op_kernel.h"
21783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower#include "tensorflow/core/framework/types.h"
22783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower#include "tensorflow/core/lib/core/status.h"
23783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower#include "tensorflow/core/util/device_name_utils.h"
24783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower
25783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlowernamespace tensorflow {
26783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlowernamespace swig {
27783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower
28783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlowerstring TryFindKernelClass(const string& serialized_node_def) {
29783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower  tensorflow::NodeDef node_def;
30783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower  if (!node_def.ParseFromString(serialized_node_def)) {
31783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower    LOG(WARNING) << "Error parsing node_def";
32783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower    return "";
33783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower  }
34783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower
35783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower  const tensorflow::OpRegistrationData* op_reg_data;
36783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower  auto status =
37783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower      tensorflow::OpRegistry::Global()->LookUp(node_def.op(), &op_reg_data);
38783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower  if (!status.ok()) {
39783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower    LOG(WARNING) << "Op " << node_def.op() << " not found: " << status;
40783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower    return "";
41783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower  }
42783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower  AddDefaultsToNodeDef(op_reg_data->op_def, &node_def);
43783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower
44783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower  tensorflow::DeviceNameUtils::ParsedName parsed_name;
45783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower  if (!tensorflow::DeviceNameUtils::ParseFullName(node_def.device(),
46783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower                                                  &parsed_name)) {
47783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower    LOG(WARNING) << "Failed to parse device from node_def: "
48783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower                 << node_def.ShortDebugString();
49783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower    return "";
50783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower  }
51783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower  string class_name = "";
52783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower  tensorflow::FindKernelDef(tensorflow::DeviceType(parsed_name.type.c_str()),
53bc225bfaa534acc25047fe844f19edc333b7a76aPeter Hawkins                            node_def, nullptr /* kernel_def */, &class_name)
54bc225bfaa534acc25047fe844f19edc333b7a76aPeter Hawkins      .IgnoreError();
55783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower  return class_name;
56783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower}
57783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower
58783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower}  // namespace swig
59783e8388db67f3fefc6c714d479615821a9dc5e7A. Unique TensorFlower}  // namespace tensorflow
60