forked from huawei/mindspore2022
217 lines
9.6 KiB
C++
217 lines
9.6 KiB
C++
/**
|
|
* This is the C++ adaptation and derivative work of Myia (https://github.com/mila-iqia/myia/).
|
|
*
|
|
* Copyright 2019 Huawei Technologies Co., Ltd
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
#include "include/api/status.h"
|
|
#ifndef ENABLE_ANDROID
|
|
#include <thread>
|
|
#endif
|
|
#include <map>
|
|
#include <sstream>
|
|
|
|
namespace mindspore {
|
|
struct Status::Data {
|
|
enum StatusCode status_code = kSuccess;
|
|
std::string status_msg;
|
|
int line_of_code = -1;
|
|
std::string file_name;
|
|
std::string err_description;
|
|
};
|
|
|
|
Status::Status() : data_(std::make_shared<Data>()) {}
|
|
|
|
Status::Status(enum StatusCode status_code, const std::vector<char> &status_msg) : data_(std::make_shared<Data>()) {
|
|
if (data_ == nullptr) {
|
|
return;
|
|
}
|
|
|
|
data_->err_description = CharToString(status_msg);
|
|
data_->status_msg = CharToString(status_msg);
|
|
data_->status_code = status_code;
|
|
}
|
|
|
|
Status::Status(enum StatusCode code, int line_of_code, const char *file_name, const std::vector<char> &extra)
|
|
: data_(std::make_shared<Data>()) {
|
|
if (data_ == nullptr) {
|
|
return;
|
|
}
|
|
data_->status_code = code;
|
|
data_->line_of_code = line_of_code;
|
|
if (file_name != nullptr) {
|
|
data_->file_name = file_name;
|
|
}
|
|
data_->err_description = CharToString(extra);
|
|
|
|
std::ostringstream ss;
|
|
#ifndef ENABLE_ANDROID
|
|
#ifdef DEBUG
|
|
ss << "Thread ID " << std::this_thread::get_id() << " " << CodeAsString(code) << ". ";
|
|
#else
|
|
ss << CodeAsString(code) << ". ";
|
|
#endif
|
|
if (!data_->err_description.empty()) {
|
|
ss << data_->err_description;
|
|
}
|
|
ss << "\n";
|
|
#endif
|
|
|
|
ss << "Line of code : " << line_of_code << "\n";
|
|
if (file_name != nullptr) {
|
|
ss << "File : " << file_name << "\n";
|
|
}
|
|
data_->status_msg = ss.str();
|
|
}
|
|
|
|
enum StatusCode Status::StatusCode() const {
|
|
if (data_ == nullptr) {
|
|
return kSuccess;
|
|
}
|
|
return data_->status_code;
|
|
}
|
|
|
|
std::vector<char> Status::ToCString() const {
|
|
if (data_ == nullptr) {
|
|
return std::vector<char>();
|
|
}
|
|
return StringToChar(data_->status_msg);
|
|
}
|
|
|
|
int Status::GetLineOfCode() const {
|
|
if (data_ == nullptr) {
|
|
return -1;
|
|
}
|
|
return data_->line_of_code;
|
|
}
|
|
|
|
std::vector<char> Status::GetErrDescriptionChar() const {
|
|
if (data_ == nullptr) {
|
|
return std::vector<char>();
|
|
}
|
|
return StringToChar(data_->err_description);
|
|
}
|
|
|
|
std::vector<char> Status::CodeAsCString(enum StatusCode c) {
|
|
static std::map<enum StatusCode, std::string> info_map = {{kSuccess, "No error occurs."},
|
|
// Core
|
|
{kCoreFailed, "Common error code."},
|
|
// MD
|
|
{kMDOutOfMemory, "Out of memory"},
|
|
{kMDShapeMisMatch, "Shape is incorrect"},
|
|
{kMDInterrupted, "Interrupted system call"},
|
|
{kMDNoSpace, "No space left on device"},
|
|
{kMDPyFuncException, "Exception thrown from PyFunc"},
|
|
{kMDDuplicateKey, "Duplicate key"},
|
|
{kMDPythonInterpreterFailure, ""},
|
|
{kMDTDTPushFailure, "Unexpected error"},
|
|
{kMDFileNotExist, "Unexpected error"},
|
|
{kMDProfilingError, "Error encountered while profiling"},
|
|
{kMDBoundingBoxOutOfBounds, "Unexpected error"},
|
|
{kMDBoundingBoxInvalidShape, "Unexpected error"},
|
|
{kMDSyntaxError, "Syntax error"},
|
|
{kMDTimeOut, "Unexpected error"},
|
|
{kMDBuddySpaceFull, "BuddySpace full"},
|
|
{kMDNetWorkError, "Network error"},
|
|
{kMDNotImplementedYet, "Unexpected error"},
|
|
{kMDUnexpectedError, "Unexpected error"},
|
|
// ME
|
|
{kMEFailed, "Common error code."},
|
|
{kMEInvalidInput, "Invalid input."},
|
|
// MC
|
|
{kMCFailed, "Common error code."},
|
|
{kMCDeviceError, "Device error."},
|
|
{kMCInvalidInput, "Invalid input."},
|
|
{kMCInvalidArgs, "Invalid arguments."},
|
|
// Lite
|
|
{kLiteError, "Common error code."},
|
|
{kLiteNullptr, "NULL pointer returned."},
|
|
{kLiteParamInvalid, "Invalid parameter."},
|
|
{kLiteNoChange, "No change."},
|
|
{kLiteSuccessExit, "No error but exit."},
|
|
{kLiteMemoryFailed, "Fail to create memory."},
|
|
{kLiteNotSupport, "Fail to support."},
|
|
{kLiteThreadPoolError, "Thread pool error."},
|
|
{kLiteOutOfTensorRange, "Failed to check range."},
|
|
{kLiteInputTensorError, "Failed to check input tensor."},
|
|
{kLiteReentrantError, "Exist executor running."},
|
|
{kLiteGraphFileError, "Failed to verify graph file."},
|
|
{kLiteNotFindOp, "Failed to find operator."},
|
|
{kLiteInvalidOpName, "Invalid operator name."},
|
|
{kLiteInvalidOpAttr, "Invalid operator attr."},
|
|
{kLiteOpExecuteFailure, "Failed to execution operator."},
|
|
{kLiteFormatError, "Failed to checking tensor format."},
|
|
{kLiteInferError, "Failed to infer shape."},
|
|
{kLiteInferInvalid, "Invalid infer shape before runtime."},
|
|
{kLiteInputParamInvalid, "Invalid input param by user."}};
|
|
auto iter = info_map.find(c);
|
|
return StringToChar(iter == info_map.end() ? "Unknown error" : iter->second);
|
|
}
|
|
|
|
std::ostream &operator<<(std::ostream &os, const Status &s) {
|
|
os << s.ToString();
|
|
return os;
|
|
}
|
|
|
|
std::vector<char> Status::SetErrDescription(const std::vector<char> &err_description) {
|
|
if (data_ == nullptr) {
|
|
return std::vector<char>();
|
|
}
|
|
data_->err_description = CharToString(err_description);
|
|
std::ostringstream ss;
|
|
#ifndef ENABLE_ANDROID
|
|
#ifdef DEBUG
|
|
ss << "Thread ID " << std::this_thread::get_id() << " " << CodeAsString(data_->status_code) << ". ";
|
|
#else
|
|
ss << CodeAsString(data_->status_code) << ". ";
|
|
#endif
|
|
if (!data_->err_description.empty()) {
|
|
ss << data_->err_description;
|
|
}
|
|
ss << "\n";
|
|
#endif
|
|
|
|
if (data_->line_of_code > 0 && !data_->file_name.empty()) {
|
|
ss << "Line of code : " << data_->line_of_code << "\n";
|
|
ss << "File : " << data_->file_name << "\n";
|
|
}
|
|
data_->status_msg = ss.str();
|
|
return StringToChar(data_->status_msg);
|
|
}
|
|
|
|
bool Status::operator==(const Status &other) const {
|
|
if (data_ == nullptr && other.data_ == nullptr) {
|
|
return true;
|
|
}
|
|
|
|
if (data_ == nullptr || other.data_ == nullptr) {
|
|
return false;
|
|
}
|
|
|
|
return data_->status_code == other.data_->status_code;
|
|
}
|
|
|
|
bool Status::operator==(enum StatusCode other_code) const { return StatusCode() == other_code; }
|
|
bool Status::operator!=(const Status &other) const { return !operator==(other); }
|
|
bool Status::operator!=(enum StatusCode other_code) const { return !operator==(other_code); }
|
|
|
|
Status::operator bool() const { return (StatusCode() == kSuccess); }
|
|
Status::operator int() const { return static_cast<int>(StatusCode()); }
|
|
|
|
Status Status::OK() { return StatusCode::kSuccess; }
|
|
bool Status::IsOk() const { return (StatusCode() == StatusCode::kSuccess); }
|
|
bool Status::IsError() const { return !IsOk(); }
|
|
} // namespace mindspore
|