// Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. // // 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. #pragma once #include #include #include #include #include "lite/model_parser/desc_apis.h" #include "lite/utils/any.h" #include "lite/utils/varient.h" namespace paddle { namespace lite { namespace cpp { /* * The cpp::OpDesc is the internal representation for Op. All the internal * imprementation should use it, not the pb::OpDesc. */ class OpDesc : public OpDescAPI { public: using attrs_t = std::map; using attr_types_t = std::map; protected: std::string type_; std::map> inputs_; std::map> outputs_; std::map attrs_; std::map attr_types_; public: OpDesc() = default; std::string Type() const override { return type_; } void SetType(const std::string& x) override { type_ = x; } const std::map>& inputs() const { return inputs_; } const std::map>& outputs() const { return outputs_; } std::map>* mutable_inputs() { return &inputs_; } std::map>* mutable_outputs() { return &outputs_; } bool HasInput(const std::string& param) const { auto it = inputs_.find(param); return it != inputs_.end(); } std::vector Input(const std::string& param) const override; std::vector InputArgumentNames() const override; std::vector OutputArgumentNames() const override; std::vector input_vars() const; std::vector output_vars() const; bool HasOutput(const std::string& param) const; std::vector Output(const std::string& param) const override; void SetInput(const std::string& param, const std::vector& args) override { inputs_[param] = args; } void SetOutput(const std::string& param, const std::vector& args) override { outputs_[param] = args; } bool HasAttr(const std::string& name) const override { return attrs_.count(name); } AttrType GetAttrType(const std::string& name) const override { auto it = attr_types_.find(name); CHECK(it != attr_types_.end()); return it->second; } std::vector AttrNames() const override { std::vector res; for (const auto& x : attrs_) { res.push_back(x.first); } return res; } template void SetAttr(const std::string& name, const T& v) { attr_types_[name] = OpDescAPI::DataTypeTrait::AT; attrs_[name].set(v); } template T GetAttr(const std::string& name) const { auto it = attrs().find(name); CHECK(it != attrs().end()) << "No attributes called " << name << " found"; auto attr_it = attr_types().find(name); CHECK(attr_it != attr_types().end()); auto pair = std::make_pair(it, attr_it); CHECK(pair.second->second == OpDescAPI::DataTypeTrait::AT) << "required type is " << OpDescAPI::DataTypeTrait::ATN << " not match the true type"; return pair.first->second.get(); } const std::map& attrs() const { return attrs_; } const std::map& attr_types() const { return attr_types_; } }; } // namespace cpp } // namespace lite } // namespace paddle