operator.cc 3.9 KB
Newer Older
Q
Qiao Longfei 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */

Y
Yan Chunwei 已提交
15 16
#include <algorithm>

Q
Qiao Longfei 已提交
17 18 19 20 21
#include "paddle/framework/operator.h"

namespace paddle {
namespace framework {

Q
qijun 已提交
22
template <>
Q
qijun 已提交
23
Eigen::DefaultDevice* KernelContext::GetEigenDevice<
Q
qijun 已提交
24 25
    platform::CPUPlace, Eigen::DefaultDevice>() const {
  return device_context_.get_eigen_device<Eigen::DefaultDevice>();
Q
qijun 已提交
26 27 28 29
}

#ifndef PADDLE_ONLY_CPU
template <>
Q
qijun 已提交
30 31
Eigen::GpuDevice*
KernelContext::GetEigenDevice<platform::GPUPlace, Eigen::GpuDevice>() const {
Q
qijun 已提交
32
  return device_context_.get_eigen_device<Eigen::GpuDevice>();
Q
qijun 已提交
33 34 35
}
#endif

Y
Yan Chunwei 已提交
36
const std::string& OperatorBase::Input(const std::string& name) const {
Y
Yu Yang 已提交
37 38
  PADDLE_ENFORCE(in_out_idxs_ != nullptr,
                 "Input Output Indices could not be nullptr");
Y
Yu Yang 已提交
39 40 41
  auto it = in_out_idxs_->find(name);
  PADDLE_ENFORCE(it != in_out_idxs_->end(), "no key [%s] in in_out_idxs_",
                 name);
Y
Yan Chunwei 已提交
42
  if (attrs_.count("input_format") == 0) {
Y
Yu Yang 已提交
43
    return inputs_.at((size_t)it->second);
Y
Yan Chunwei 已提交
44 45 46
  } else {
    const auto& input_format = GetAttr<std::vector<int>>("input_format");
    int idx = input_format[it->second];
Y
Yu Yang 已提交
47
    return inputs_.at((size_t)idx);
Y
Yan Chunwei 已提交
48 49 50 51
  }
}

std::vector<std::string> OperatorBase::Inputs(const std::string& name) const {
Y
Yu Yang 已提交
52
  PADDLE_ENFORCE(in_out_idxs_ != nullptr, "IO Idx could not be nullptr");
Y
Yan Chunwei 已提交
53
  auto input_format = GetAttr<std::vector<int>>("input_format");
Y
Yu Yang 已提交
54
  auto offset = in_out_idxs_->at(name);
Y
Yu Yang 已提交
55 56
  PADDLE_ENFORCE(input_format.at((size_t)offset + 1) <= inputs_.size(),
                 "Input Out Of Range");
Y
Yan Chunwei 已提交
57 58 59 60 61 62 63

  return std::vector<std::string>{
      inputs_.begin() + input_format.at(offset),
      inputs_.begin() + input_format.at(offset + 1)};
}

const std::string& OperatorBase::Output(const std::string& name) const {
Y
Yu Yang 已提交
64
  PADDLE_ENFORCE(in_out_idxs_ != nullptr, "InOut Indice could not be nullptr");
Y
Yu Yang 已提交
65 66 67
  auto it = in_out_idxs_->find(name);
  PADDLE_ENFORCE(it != in_out_idxs_->end(), "no key [%s] in in_out_idxs_",
                 name);
Y
Yan Chunwei 已提交
68
  if (attrs_.count("output_format") == 0) {
Y
Yu Yang 已提交
69
    return outputs_.at((size_t)it->second);
Y
Yan Chunwei 已提交
70 71 72
  } else {
    const auto& output_format = GetAttr<std::vector<int>>("output_format");
    int idx = output_format[it->second];
Y
Yu Yang 已提交
73
    return outputs_.at((size_t)idx);
Y
Yan Chunwei 已提交
74 75 76 77
  }
}

std::vector<std::string> OperatorBase::Outputs(const std::string& name) const {
Y
Yu Yang 已提交
78
  PADDLE_ENFORCE(in_out_idxs_ != nullptr, "InOut Indice could not be nullptr");
Y
Yan Chunwei 已提交
79
  auto output_format = GetAttr<std::vector<int>>("output_format");
Y
Yu Yang 已提交
80
  auto offset = in_out_idxs_->at(name);
Y
Yu Yang 已提交
81 82
  PADDLE_ENFORCE(output_format.at((size_t)offset + 1) <= outputs_.size(),
                 "Output Out of Range");
Y
Yan Chunwei 已提交
83 84 85 86 87
  return std::vector<std::string>{
      outputs_.begin() + output_format.at(offset),
      outputs_.begin() + output_format.at(offset + 1)};
}

Q
Qiao Longfei 已提交
88 89
std::string OperatorBase::DebugString() const {
  std::stringstream ss;
90
  ss << "Op(" << type_ << "), inputs:(";
91 92 93 94 95
  for (size_t i = 0; i < inputs_.size(); ++i) {
    ss << inputs_[i];
    if (i != inputs_.size() - 1) {
      ss << ", ";
    }
Q
Qiao Longfei 已提交
96
  }
97 98 99 100 101 102
  ss << "), outputs:(";
  for (size_t i = 0; i < outputs_.size(); ++i) {
    ss << outputs_[i];
    if (i != outputs_.size() - 1) {
      ss << ", ";
    }
Q
Qiao Longfei 已提交
103
  }
104
  ss << ").";
Q
Qiao Longfei 已提交
105 106 107
  return ss.str();
}

D
dongzhihong 已提交
108 109 110 111 112 113
void OperatorBase::Rename(const std::string& old_name,
                          const std::string& new_name) {
  std::replace(inputs_.begin(), inputs_.end(), old_name, new_name);
  std::replace(outputs_.begin(), outputs_.end(), old_name, new_name);
}

Q
Qiao Longfei 已提交
114
}  // namespace framework
L
liaogang 已提交
115
}  // namespace paddle