forked from huawei/mindspore2022
307 lines
8.7 KiB
C++
307 lines
8.7 KiB
C++
/**
|
|
* Copyright 2019-2020 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 "ir/value.h"
|
|
|
|
#include <algorithm>
|
|
#include <memory>
|
|
#include <cmath>
|
|
#include <cfloat>
|
|
|
|
#include "utils/convert_utils_base.h"
|
|
|
|
namespace mindspore {
|
|
const ValuePtr ValueSequeue::operator[](const std::size_t &dim) const {
|
|
if (dim >= size()) {
|
|
MS_LOG(EXCEPTION) << "List index [" << dim << "] is out of range [" << size() << "].";
|
|
}
|
|
return elements_[dim];
|
|
}
|
|
|
|
bool ValueSequeue::erase(size_t idx) {
|
|
if (idx < size()) {
|
|
(void)elements_.erase(elements_.begin() + SizeToInt(idx));
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool BoolImm::operator==(const Value &other) const {
|
|
if (other.isa<BoolImm>()) {
|
|
auto other_ = static_cast<const BoolImm &>(other);
|
|
return *this == other_;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
bool BoolImm::operator==(const BoolImm &other) const { return v_ == other.v_; }
|
|
|
|
bool Int8Imm::operator==(const Value &other) const {
|
|
if (other.isa<Int8Imm>()) {
|
|
auto other_ = static_cast<const Int8Imm &>(other);
|
|
return *this == other_;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
bool Int8Imm::operator==(const Int8Imm &other) const { return v_ == other.v_; }
|
|
bool Int16Imm::operator==(const Value &other) const {
|
|
if (other.isa<Int16Imm>()) {
|
|
auto other_ = static_cast<const Int16Imm &>(other);
|
|
return *this == other_;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
bool Int16Imm::operator==(const Int16Imm &other) const { return v_ == other.v_; }
|
|
bool Int32Imm::operator==(const Value &other) const {
|
|
if (other.isa<Int32Imm>()) {
|
|
auto other_ = static_cast<const Int32Imm &>(other);
|
|
return *this == other_;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
bool Int32Imm::operator==(const Int32Imm &other) const { return v_ == other.v_; }
|
|
bool Int64Imm::operator==(const Value &other) const {
|
|
if (other.isa<Int64Imm>()) {
|
|
auto other_ = static_cast<const Int64Imm &>(other);
|
|
return *this == other_;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
bool Int64Imm::operator==(const Int64Imm &other) const { return v_ == other.v_; }
|
|
bool UInt8Imm::operator==(const Value &other) const {
|
|
if (other.isa<UInt8Imm>()) {
|
|
auto other_ = static_cast<const UInt8Imm &>(other);
|
|
return *this == other_;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
bool UInt8Imm::operator==(const UInt8Imm &other) const { return v_ == other.v_; }
|
|
bool UInt16Imm::operator==(const Value &other) const {
|
|
if (other.isa<UInt16Imm>()) {
|
|
auto other_ = static_cast<const UInt16Imm &>(other);
|
|
return *this == other_;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
bool UInt16Imm::operator==(const UInt16Imm &other) const { return v_ == other.v_; }
|
|
bool UInt32Imm::operator==(const Value &other) const {
|
|
if (other.isa<UInt32Imm>()) {
|
|
auto other_ = static_cast<const UInt32Imm &>(other);
|
|
return *this == other_;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
bool UInt32Imm::operator==(const UInt32Imm &other) const { return v_ == other.v_; }
|
|
bool UInt64Imm::operator==(const Value &other) const {
|
|
if (other.isa<UInt64Imm>()) {
|
|
auto other_ = static_cast<const UInt64Imm &>(other);
|
|
return *this == other_;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
bool UInt64Imm::operator==(const UInt64Imm &other) const { return v_ == other.v_; }
|
|
bool FP32Imm::operator==(const Value &other) const {
|
|
if (other.isa<FP32Imm>()) {
|
|
auto other_ = static_cast<const FP32Imm &>(other);
|
|
return *this == other_;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
bool FP32Imm::operator==(const FP32Imm &other) const {
|
|
if (std::isinf(v_) && std::isinf(other.v_)) {
|
|
return true;
|
|
}
|
|
return fabs(v_ - other.v_) < FLT_EPSILON;
|
|
}
|
|
bool FP64Imm::operator==(const Value &other) const {
|
|
if (other.isa<FP64Imm>()) {
|
|
auto other_ = static_cast<const FP64Imm &>(other);
|
|
return *this == other_;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
bool ValueSequeue::operator==(const Value &other) const {
|
|
if (other.isa<ValueSequeue>()) {
|
|
auto other_ = static_cast<const ValueSequeue &>(other);
|
|
return *this == other_;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
bool ValueSequeue::operator==(const ValueSequeue &other) const {
|
|
if (other.elements_.size() != elements_.size()) {
|
|
return false;
|
|
}
|
|
return std::equal(elements_.begin(), elements_.end(), other.elements_.begin(),
|
|
[](const ValuePtr &lhs, const ValuePtr &rhs) { return *lhs == *rhs; });
|
|
}
|
|
|
|
std::string ValueSequeue::ToString() const {
|
|
std::ostringstream buffer;
|
|
bool begin = true;
|
|
for (auto &attr : elements_) {
|
|
if (!begin) {
|
|
buffer << ", ";
|
|
} else {
|
|
begin = false;
|
|
}
|
|
MS_EXCEPTION_IF_NULL(attr);
|
|
buffer << attr->ToString();
|
|
}
|
|
return buffer.str();
|
|
}
|
|
|
|
std::string ValueSequeue::DumpText() const {
|
|
std::ostringstream oss;
|
|
for (size_t i = 0; i < elements_.size(); ++i) {
|
|
MS_EXCEPTION_IF_NULL(elements_[i]);
|
|
oss << (i > 0 ? ", " : "") << elements_[i]->DumpText();
|
|
}
|
|
return oss.str();
|
|
}
|
|
|
|
bool FP64Imm::operator==(const FP64Imm &other) const {
|
|
if (std::isinf(v_) && std::isinf(other.v_)) {
|
|
return true;
|
|
}
|
|
return fabs(v_ - other.v_) < DBL_EPSILON;
|
|
}
|
|
bool StringImm::operator==(const Value &other) const {
|
|
if (other.isa<StringImm>()) {
|
|
auto other_ = static_cast<const StringImm &>(other);
|
|
return *this == other_;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
bool StringImm::operator==(const StringImm &other) const { return str_ == other.str_; }
|
|
|
|
bool AnyValue::operator==(const Value &other) const {
|
|
if (other.isa<AnyValue>()) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
const ValuePtr kAnyValue = std::make_shared<AnyValue>();
|
|
|
|
std::size_t ValueSlice::hash() const {
|
|
MS_EXCEPTION_IF_NULL(start_);
|
|
MS_EXCEPTION_IF_NULL(stop_);
|
|
MS_EXCEPTION_IF_NULL(step_);
|
|
return hash_combine({tid(), start_->hash(), stop_->hash(), step_->hash()});
|
|
}
|
|
|
|
bool ValueSlice::operator==(const Value &other) const {
|
|
if (other.isa<ValueSlice>()) {
|
|
auto other_ = static_cast<const ValueSlice &>(other);
|
|
return *this == other_;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool ValueSlice::operator==(const ValueSlice &other) const {
|
|
MS_EXCEPTION_IF_NULL(start_);
|
|
MS_EXCEPTION_IF_NULL(stop_);
|
|
MS_EXCEPTION_IF_NULL(step_);
|
|
return (*start_ == *other.start_ && *stop_ == *other.stop_ && *step_ == *other.step_);
|
|
}
|
|
|
|
std::string ValueSlice::ToString() const {
|
|
MS_EXCEPTION_IF_NULL(start_);
|
|
MS_EXCEPTION_IF_NULL(stop_);
|
|
MS_EXCEPTION_IF_NULL(step_);
|
|
std::ostringstream buffer;
|
|
buffer << "Slice[";
|
|
buffer << start_->ToString() << " : ";
|
|
buffer << stop_->ToString() << " : ";
|
|
buffer << step_->ToString();
|
|
buffer << "]";
|
|
return buffer.str();
|
|
}
|
|
|
|
std::size_t KeywordArg::hash() const {
|
|
MS_EXCEPTION_IF_NULL(value_);
|
|
return hash_combine({tid(), std::hash<std::string>{}(key_), value_->hash()});
|
|
}
|
|
|
|
bool KeywordArg::operator==(const Value &other) const {
|
|
if (other.isa<KeywordArg>()) {
|
|
auto other_ = static_cast<const KeywordArg &>(other);
|
|
return *this == other_;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool KeywordArg::operator==(const KeywordArg &other) const { return (other.key_ == key_ && *other.value_ == *value_); }
|
|
|
|
std::string KeywordArg::ToString() const {
|
|
std::ostringstream buffer;
|
|
buffer << "KeywordArg[";
|
|
buffer << "key : " << key_;
|
|
MS_EXCEPTION_IF_NULL(value_);
|
|
buffer << ", value : " << value_->ToString();
|
|
buffer << "]";
|
|
return buffer.str();
|
|
}
|
|
|
|
const ValuePtr ValueDictionary::operator[](const std::string &key) const {
|
|
auto it = std::find_if(key_values_.begin(), key_values_.end(),
|
|
[key](const std::pair<std::string, ValuePtr> &item) { return item.first == key; });
|
|
if (it == key_values_.end()) {
|
|
MS_LOG(EXCEPTION) << "The key " << key << " is not in the map";
|
|
}
|
|
return it->second;
|
|
}
|
|
|
|
bool ValueDictionary::operator==(const Value &other) const {
|
|
if (other.isa<ValueDictionary>()) {
|
|
auto other_ = static_cast<const ValueDictionary &>(other);
|
|
return *this == other_;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool ValueDictionary::operator==(const ValueDictionary &other) const {
|
|
if (key_values_.size() != other.key_values_.size()) {
|
|
return false;
|
|
}
|
|
for (size_t index = 0; index < key_values_.size(); index++) {
|
|
if (key_values_[index].first != other.key_values_[index].first) {
|
|
return false;
|
|
}
|
|
if (!(*key_values_[index].second == *other.key_values_[index].second)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
} // namespace mindspore
|