/** * 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 "utils/anchor_utils.h" #include #include "debug/ge_util.h" #include "framework/common/debug/ge_log.h" namespace ge { GE_FUNC_DEV_VISIBILITY GE_FUNC_HOST_VISIBILITY Format AnchorUtils::GetFormat(const DataAnchorPtr &data_anchor) { if (data_anchor == nullptr) { GELOGE(GRAPH_FAILED, "The input data anchor is invalid."); return FORMAT_RESERVED; } return data_anchor->format_; } GE_FUNC_DEV_VISIBILITY GE_FUNC_HOST_VISIBILITY graphStatus AnchorUtils::SetFormat(const DataAnchorPtr &data_anchor, Format data_format) { if ((data_anchor == nullptr) || (data_format == FORMAT_RESERVED)) { GELOGE(GRAPH_FAILED, "The input data anchor or input data format is invalid ."); return GRAPH_FAILED; } data_anchor->format_ = data_format; return GRAPH_SUCCESS; } // Get anchor status GE_FUNC_DEV_VISIBILITY GE_FUNC_HOST_VISIBILITY AnchorStatus AnchorUtils::GetStatus(const DataAnchorPtr &data_anchor) { if (data_anchor == nullptr) { GELOGE(GRAPH_FAILED, "The input data anchor is invalid."); return ANCHOR_RESERVED; } return data_anchor->status_; } // Set anchor status GE_FUNC_DEV_VISIBILITY GE_FUNC_HOST_VISIBILITY graphStatus AnchorUtils::SetStatus(const DataAnchorPtr &data_anchor, AnchorStatus anchor_status) { if ((data_anchor == nullptr) || (anchor_status == ANCHOR_RESERVED)) { GELOGE(GRAPH_FAILED, "The input data anchor or input data format is invalid ."); return GRAPH_FAILED; } data_anchor->status_ = anchor_status; return GRAPH_SUCCESS; } bool AnchorUtils::HasControlEdge(const AnchorPtr &anchor) { auto control_anchor = Anchor::DynamicAnchorCast(anchor); if (control_anchor != nullptr) { return (control_anchor->GetPeerAnchors().size() != 0); } auto data_anchor = Anchor::DynamicAnchorCast(anchor); if (data_anchor) { for (const auto &peer : data_anchor->GetPeerAnchors()) { auto peer_cast = Anchor::DynamicAnchorCast(peer); if (peer_cast) { return true; } } return false; } GELOGE(GRAPH_FAILED, "the anchor is neither control anchor nor data anchor"); return false; } bool AnchorUtils::IsControlEdge(const AnchorPtr &src, const AnchorPtr &dst) { GE_CHK_BOOL_EXEC(src != nullptr, return false, "src is null."); GE_CHK_BOOL_RET_STATUS_NOLOG(src->IsLinkedWith(dst), false); auto src_control_anchor = Anchor::DynamicAnchorCast(src); auto dst_control_anchor = Anchor::DynamicAnchorCast(dst); return (src_control_anchor || dst_control_anchor); } GE_FUNC_DEV_VISIBILITY GE_FUNC_HOST_VISIBILITY int AnchorUtils::GetIdx(const AnchorPtr &anchor) { // Check if it can add edge between DataAnchor auto data_anchor = Anchor::DynamicAnchorCast(anchor); if (data_anchor != nullptr) { return data_anchor->GetIdx(); } // Check if it can add edge between ControlAnchor auto control_anchor = Anchor::DynamicAnchorCast(anchor); if (control_anchor != nullptr) { return control_anchor->GetIdx(); } return -1; } } // namespace ge