// Copyright (c) 2021 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 #if defined(_MSC_VER) #include typedef SSIZE_T ssize_t; #endif #include #include #include #include #include #include #include #include "paddle/fluid/framework/attribute.h" #include "paddle/fluid/framework/op_info.h" #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/framework/variable.h" #include "paddle/fluid/imperative/tracer.h" #include "paddle/fluid/imperative/type_defs.h" #include "paddle/fluid/pybind/imperative.h" namespace py = pybind11; namespace paddle { namespace pybind { bool PyObject_CheckBool(PyObject** obj); bool PyObject_CheckLong(PyObject* obj); bool PyObject_CheckDataType(PyObject* obj); int32_t PyObject_ToInt32(PyObject* obj); uint32_t PyObject_ToUInt32(PyObject* obj); int64_t PyObject_ToInt64(PyObject* obj); uint64_t PyObject_ToUInt64(PyObject* obj); size_t PyObject_ToSize_t(PyObject* obj); bool PyObject_CheckFloat(PyObject* obj); double PyObject_ToDouble(PyObject* obj); bool PyObject_CheckComplexOrToComplex(PyObject** obj); bool PyObject_CheckString(PyObject* obj); bool CastPyArg2Boolean(PyObject* obj, const std::string& op_type, ssize_t arg_pos); bool CastPyArg2Boolean(PyObject* obj, const std::string& op_type, ssize_t arg_pos, bool default_value); int CastPyArg2Int(PyObject* obj, const std::string& op_type, ssize_t arg_pos); int CastPyArg2Int(PyObject* obj, const std::string& op_type, ssize_t arg_pos, int default_value); int64_t CastPyArg2Long(PyObject* obj, const std::string& op_type, ssize_t arg_pos); int64_t CastPyArg2Long(PyObject* obj, const std::string& op_type, ssize_t arg_pos, int64_t default_value); float16 CastPyArg2Float16(PyObject* obj, const std::string& op_type, ssize_t arg_pos); float CastPyArg2Float(PyObject* obj, const std::string& op_type, ssize_t arg_pos); float CastPyArg2Float(PyObject* obj, const std::string& op_type, ssize_t arg_pos, float default_value); double CastPyArg2Double(PyObject* obj, const std::string& op_type, ssize_t arg_pos); double CastPyArg2Double(PyObject* obj, const std::string& op_type, ssize_t arg_pos, double default_value); phi::dtype::complex CastPyArg2Complex(PyObject* obj, const std::string& op_type, ssize_t arg_pos); phi::dtype::complex CastPyArg2Complex128(PyObject* obj, const std::string& op_type, ssize_t arg_pos); std::string CastPyArg2String(PyObject* obj, const std::string& op_type, ssize_t arg_pos); std::string CastPyArg2String(PyObject* obj, const std::string& op_type, ssize_t arg_pos, std::string default_value); std::vector CastPyArg2Booleans(PyObject* obj, const std::string& op_type, ssize_t arg_pos); std::vector CastPyArg2Booleans(PyObject* obj, const std::string& op_type, ssize_t arg_pos, std::vector default_value); std::vector CastPyArg2Ints(PyObject* obj, const std::string& op_type, ssize_t arg_pos); std::vector CastPyArg2Ints(PyObject* obj, const std::string& op_type, ssize_t arg_pos, std::vector default_value); std::vector CastPyArg2Longs(PyObject* obj, const std::string& op_type, ssize_t arg_pos); std::vector CastPyArg2Longs(PyObject* obj, const std::string& op_type, ssize_t arg_pos, std::vector default_value); std::vector CastPyArg2Floats(PyObject* obj, const std::string& op_type, ssize_t arg_pos); std::vector CastPyArg2Floats(PyObject* obj, const std::string& op_type, ssize_t arg_pos, std::vector default_value); std::vector CastPyArg2Float64s(PyObject* obj, const std::string& op_type, ssize_t arg_pos); std::vector CastPyArg2Float64s(PyObject* obj, const std::string& op_type, ssize_t arg_pos, std::vector default_value); std::vector CastPyArg2Strings(PyObject* obj, const std::string& op_type, ssize_t arg_pos); std::vector CastPyArg2Strings( PyObject* obj, const std::string& op_type, ssize_t arg_pos, std::vector default_value); std::vector CastPyArg2Scalars( PyObject* obj, const std::string& op_type, ssize_t arg_pos); void CastPyArg2AttrBoolean(PyObject* obj, paddle::framework::AttributeMap& attrs, // NOLINT const std::string& key, const std::string& op_type, ssize_t arg_pos); void CastPyArg2AttrInt(PyObject* obj, paddle::framework::AttributeMap& attrs, // NOLINT const std::string& key, const std::string& op_type, ssize_t arg_pos); void CastPyArg2AttrLong(PyObject* obj, paddle::framework::AttributeMap& attrs, // NOLINT const std::string& key, const std::string& op_type, ssize_t arg_pos); void CastPyArg2AttrFloat(PyObject* obj, paddle::framework::AttributeMap& attrs, // NOLINT const std::string& key, const std::string& op_type, ssize_t arg_pos); void CastPyArg2AttrDouble(PyObject* obj, paddle::framework::AttributeMap& attrs, // NOLINT const std::string& key, const std::string& op_type, ssize_t arg_pos); void CastPyArg2AttrString(PyObject* obj, paddle::framework::AttributeMap& attrs, // NOLINT const std::string& key, const std::string& op_type, ssize_t arg_pos); void CastPyArg2AttrScalar(PyObject* obj, paddle::framework::AttributeMap& attrs, // NOLINT const std::string& key, const std::string& op_type, ssize_t arg_pos); void CastPyArg2AttrBooleans(PyObject* obj, paddle::framework::AttributeMap& attrs, // NOLINT const std::string& key, const std::string& op_type, ssize_t arg_pos); void CastPyArg2AttrInts(PyObject* obj, paddle::framework::AttributeMap& attrs, // NOLINT const std::string& key, const std::string& op_type, ssize_t arg_pos); void CastPyArg2AttrLongs(PyObject* obj, paddle::framework::AttributeMap& attrs, // NOLINT const std::string& key, const std::string& op_type, ssize_t arg_pos); void CastPyArg2AttrFloats(PyObject* obj, paddle::framework::AttributeMap& attrs, // NOLINT const std::string& key, const std::string& op_type, ssize_t arg_pos); void CastPyArg2AttrFloat64s(PyObject* obj, paddle::framework::AttributeMap& attrs, // NOLINT const std::string& key, const std::string& op_type, ssize_t arg_pos); void CastPyArg2AttrScalars(PyObject* obj, paddle::framework::AttributeMap& attrs, // NOLINT const std::string& key, const std::string& op_type, ssize_t arg_pos); void CastPyArg2AttrStrings(PyObject* obj, paddle::framework::AttributeMap& attrs, // NOLINT const std::string& key, const std::string& op_type, ssize_t arg_pos); void CastPyArg2AttrBlock(PyObject* obj, paddle::framework::AttributeMap& attrs, // NOLINT const std::string& key, const std::string& op_type, ssize_t arg_pos); void ConstructAttrMapFromPyArgs( const std::string& op_type, PyObject* args, ssize_t attr_start, ssize_t attr_end, paddle::framework::AttributeMap& attrs); // NOLINT void ConstructAttrMapForLegacyRunProgram( const std::string& op_type, PyObject* args, ssize_t attr_start, ssize_t attr_end, paddle::framework::AttributeMap& attrs); // NOLINT void ConstructAttrMapForRunProgram( const std::string& op_type, PyObject* attrs_dict, paddle::framework::AttributeMap& attrs); // NOLINT PyObject* ConstructProgramAttrMapForRunProgram(PyObject* self, PyObject* args); void ConstructCudaGraphAttrMapForRunProgram( const std::string& op_type, PyObject* args, ssize_t arg_pos, paddle::framework::AttributeMap& attrs); // NOLINT unsigned long GetUnsignedLongFromArgs( // NOLINT const std::string& op_type, const std::string& arg_name, PyObject* args, ssize_t arg_idx, bool dispensable = false); void InitOpsAttrTypeMap(); ssize_t GetIdxFromCoreOpsInfoMap( const std::unordered_map>& core_ops_info_map, const std::string& op_type, const std::string& name); void BindOpFunctionCommon(PyObject* module); PyObject* GetItemFromArgsOrKWArgs(PyObject* args, int pos, PyObject* kwargs, const std::vector& keywords, int nargs, int* remaining_kwargs, bool dispensable = true); void CheckRemainingParamsValidity(PyObject* args, PyObject* kwargs, const int remaining_kwargs, const int nargs, bool inplace = false); static inline void CheckParamsCount(const int nargs, const int remaining_kwargs, const int max_args) { // To compatic the name and out parameter, we add 2 to max_args if (nargs + remaining_kwargs > max_args + 2 || nargs > max_args + 1) { PADDLE_THROW(common::errors::InvalidArgument( "Has too many arguments,support max values: %d , but got: %d ", max_args + 2, nargs + remaining_kwargs)); } } } // namespace pybind } // namespace paddle