| @@ -899,6 +899,23 @@ Status ProcessNetoutputNodeDynShape(NodePtr &node) { | |||||
| } | } | ||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| long StringToLongNoThrow(const string &str) { | |||||
| try { | |||||
| return std::stol(str); | |||||
| } catch (const std::invalid_argument) { | |||||
| GELOGE(PARAM_INVALID, | |||||
| "Parse shape range of input failed when transfer from string to int64. Given %s, while correct example: " | |||||
| "\"[1~20,3,3~6,-1],[1~20,3,3~6,-1]\"", | |||||
| str.c_str()); | |||||
| return PARAM_INVALID; | |||||
| } catch (const std::out_of_range) { | |||||
| GELOGE(PARAM_INVALID, | |||||
| "Parse shape range of input failed when transfer from string to int64. Given %s, while correct example: " | |||||
| "\"[1~20,3,3~6,-1],[1~20,3,3~6,-1]\"", | |||||
| str.c_str()); | |||||
| return PARAM_INVALID; | |||||
| } | |||||
| } | |||||
| /** | /** | ||||
| * Parser shape_range from string to vector | * Parser shape_range from string to vector | ||||
| * shape_range from option normally is "[1~20,3,3~6,-1],[1~20,3,3~6,-1]" | * shape_range from option normally is "[1~20,3,3~6,-1],[1~20,3,3~6,-1]" | ||||
| @@ -910,7 +927,7 @@ Status ParseDynamicInputShapeRange(const std::string &shape_range, | |||||
| GELOGE(PARAM_INVALID, "Shape range %s is invalid.", shape_range.c_str()); | GELOGE(PARAM_INVALID, "Shape range %s is invalid.", shape_range.c_str()); | ||||
| return PARAM_INVALID; | return PARAM_INVALID; | ||||
| } | } | ||||
| // different shape_ragne of single input are split by ']' | |||||
| // different shape_range of single input are split by ']' | |||||
| vector<string> shape_range_set = ge::StringUtils::Split(shape_range, ']'); | vector<string> shape_range_set = ge::StringUtils::Split(shape_range, ']'); | ||||
| if (shape_range_set.empty()) { | if (shape_range_set.empty()) { | ||||
| GELOGE(PARAM_INVALID, "Shape range %s is not valid. Correct example: \"[1~20,3,3~6,-1],[1~20,3,3~6,-1]\"", | GELOGE(PARAM_INVALID, "Shape range %s is not valid. Correct example: \"[1~20,3,3~6,-1],[1~20,3,3~6,-1]\"", | ||||
| @@ -919,22 +936,16 @@ Status ParseDynamicInputShapeRange(const std::string &shape_range, | |||||
| } | } | ||||
| for (auto &shape_range_str : shape_range_set) { | for (auto &shape_range_str : shape_range_set) { | ||||
| if (shape_range_str.empty()) { | if (shape_range_str.empty()) { | ||||
| GELOGE(PARAM_INVALID, | |||||
| "Shape range of input is empty. Given %s, while correct example: \"[1~20,3,3~6,-1],[1~20,3,3~6,-1]\"", | |||||
| shape_range.c_str()); | |||||
| return PARAM_INVALID; | |||||
| continue; | |||||
| } | } | ||||
| // trim start bytes, after that, single input should be "1~20,3,3~6,-1" | // trim start bytes, after that, single input should be "1~20,3,3~6,-1" | ||||
| if (ge::StringUtils::StartWith(shape_range_str, "[")) { | if (ge::StringUtils::StartWith(shape_range_str, "[")) { | ||||
| shape_range_str = shape_range_str.substr(1, shape_range_str.size()); | shape_range_str = shape_range_str.substr(1, shape_range_str.size()); | ||||
| } else if (ge::StringUtils::StartWith(shape_range_str, ",")) { | |||||
| } | |||||
| if (ge::StringUtils::StartWith(shape_range_str, ",")) { | |||||
| shape_range_str = shape_range_str.substr(2, shape_range_str.size()); | shape_range_str = shape_range_str.substr(2, shape_range_str.size()); | ||||
| } else { | |||||
| GELOGE(PARAM_INVALID, | |||||
| "Shape range of input is invalid. Given %s, while correct example: \"[1~20,3,3~6,-1],[1~20,3,3~6,-1]\"", | |||||
| shape_range.c_str()); | |||||
| return PARAM_INVALID; | |||||
| } | } | ||||
| // parse shape_range of single input. eg. "1~20,3,3~6,-1" | // parse shape_range of single input. eg. "1~20,3,3~6,-1" | ||||
| std::vector<std::pair<int64_t, int64_t>> range_of_single_input; | std::vector<std::pair<int64_t, int64_t>> range_of_single_input; | ||||
| vector<string> dim_range_set = ge::StringUtils::Split(shape_range_str, ','); | vector<string> dim_range_set = ge::StringUtils::Split(shape_range_str, ','); | ||||
| @@ -943,26 +954,17 @@ Status ParseDynamicInputShapeRange(const std::string &shape_range, | |||||
| pair<int64_t, int64_t> range_pair; | pair<int64_t, int64_t> range_pair; | ||||
| if (range_pair_set.size() == 1) { | if (range_pair_set.size() == 1) { | ||||
| // fix dim | // fix dim | ||||
| auto range_value = std::stol(range_pair_set.at(0).c_str()); | |||||
| auto range_value = StringToLongNoThrow(range_pair_set.at(0).c_str()); | |||||
| if (range_value < 0) { | if (range_value < 0) { | ||||
| range_pair = std::make_pair(1, range_value); | |||||
| range_pair = std::make_pair(0, range_value); | |||||
| } else { | } else { | ||||
| range_pair = std::make_pair(range_value, range_value); | range_pair = std::make_pair(range_value, range_value); | ||||
| } | } | ||||
| } else if (range_pair_set.size() == 2) { | } else if (range_pair_set.size() == 2) { | ||||
| // unknown dim, should get range. | // unknown dim, should get range. | ||||
| try { | |||||
| auto range_left = std::stol(range_pair_set.at(0).c_str()); | |||||
| auto range_right = std::stol(range_pair_set.at(1).c_str()); | |||||
| range_pair = std::make_pair(range_left, range_right); | |||||
| } catch (const std::invalid_argument) { | |||||
| GELOGE( | |||||
| PARAM_INVALID, | |||||
| "Parse shape range of input failed when transfer from string to int64. Given %s, while correct example: " | |||||
| "\"[1~20,3,3~6,-1],[1~20,3,3~6,-1]\"", | |||||
| shape_range.c_str()); | |||||
| return PARAM_INVALID; | |||||
| } | |||||
| auto range_left = StringToLongNoThrow(range_pair_set.at(0).c_str()); | |||||
| auto range_right = StringToLongNoThrow(range_pair_set.at(1).c_str()); | |||||
| range_pair = std::make_pair(range_left, range_right); | |||||
| } else { | } else { | ||||
| GELOGE(PARAM_INVALID, | GELOGE(PARAM_INVALID, | ||||
| "Shape range of input is invalid. Given %s, while correct example: \"[1~20,3,3~6,-1],[1~20,3,3~6,-1]\"", | "Shape range of input is invalid. Given %s, while correct example: \"[1~20,3,3~6,-1],[1~20,3,3~6,-1]\"", | ||||