322 lines
13 KiB
C++
322 lines
13 KiB
C++
// 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 <BaseTsd.h>
|
|
typedef SSIZE_T ssize_t;
|
|
#endif
|
|
|
|
#include <pybind11/chrono.h>
|
|
#include <pybind11/complex.h>
|
|
#include <pybind11/functional.h>
|
|
#include <pybind11/stl.h>
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#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<float> CastPyArg2Complex(PyObject* obj,
|
|
const std::string& op_type,
|
|
ssize_t arg_pos);
|
|
phi::dtype::complex<double> 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<bool> CastPyArg2Booleans(PyObject* obj,
|
|
const std::string& op_type,
|
|
ssize_t arg_pos);
|
|
std::vector<bool> CastPyArg2Booleans(PyObject* obj,
|
|
const std::string& op_type,
|
|
ssize_t arg_pos,
|
|
std::vector<bool> default_value);
|
|
std::vector<int> CastPyArg2Ints(PyObject* obj,
|
|
const std::string& op_type,
|
|
ssize_t arg_pos);
|
|
std::vector<int> CastPyArg2Ints(PyObject* obj,
|
|
const std::string& op_type,
|
|
ssize_t arg_pos,
|
|
std::vector<int> default_value);
|
|
std::vector<int64_t> CastPyArg2Longs(PyObject* obj,
|
|
const std::string& op_type,
|
|
ssize_t arg_pos);
|
|
std::vector<int64_t> CastPyArg2Longs(PyObject* obj,
|
|
const std::string& op_type,
|
|
ssize_t arg_pos,
|
|
std::vector<int64_t> default_value);
|
|
std::vector<float> CastPyArg2Floats(PyObject* obj,
|
|
const std::string& op_type,
|
|
ssize_t arg_pos);
|
|
std::vector<float> CastPyArg2Floats(PyObject* obj,
|
|
const std::string& op_type,
|
|
ssize_t arg_pos,
|
|
std::vector<float> default_value);
|
|
std::vector<double> CastPyArg2Float64s(PyObject* obj,
|
|
const std::string& op_type,
|
|
ssize_t arg_pos);
|
|
std::vector<double> CastPyArg2Float64s(PyObject* obj,
|
|
const std::string& op_type,
|
|
ssize_t arg_pos,
|
|
std::vector<double> default_value);
|
|
std::vector<std::string> CastPyArg2Strings(PyObject* obj,
|
|
const std::string& op_type,
|
|
ssize_t arg_pos);
|
|
std::vector<std::string> CastPyArg2Strings(
|
|
PyObject* obj,
|
|
const std::string& op_type,
|
|
ssize_t arg_pos,
|
|
std::vector<std::string> default_value);
|
|
|
|
std::vector<paddle::experimental::Scalar> 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<std::string, std::vector<std::string>>&
|
|
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<std::string>& 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
|