| 63 | } |
| 64 | |
| 65 | bool parseInputShapes( |
| 66 | std::string s, |
| 67 | std::vector<std::map<std::string, megdnn::TensorShape>>& map_vec) { |
| 68 | if (s.empty()) |
| 69 | return false; |
| 70 | llvm::SmallVector<llvm::StringRef> shapes_group; |
| 71 | llvm::SplitString(s, shapes_group, ":"); |
| 72 | for (auto&& shape_str : shapes_group) { |
| 73 | llvm::SmallVector<llvm::StringRef> shapes; |
| 74 | llvm::SplitString(shape_str, shapes, ";"); |
| 75 | std::map<std::string, megdnn::TensorShape> map; |
| 76 | for (auto&& shape : shapes) { |
| 77 | llvm::StringRef nameString, shapeString; |
| 78 | std::tie(nameString, shapeString) = shape.split("="); |
| 79 | if (!shapeString.startswith("(") || !shapeString.endswith(")")) { |
| 80 | llvm::errs() << "invalid shape expression " << shape |
| 81 | << " the format of shape expression should be " |
| 82 | "tensor_name=(dim0, dim1, dim2)"; |
| 83 | return false; |
| 84 | } |
| 85 | llvm::SmallVector<llvm::StringRef> dims; |
| 86 | llvm::SplitString(shapeString.drop_front(1).drop_back(1), dims, ", "); |
| 87 | if (dims.empty() || dims.size() > megdnn::TensorShape::MAX_NDIM) { |
| 88 | llvm::errs() << "invalid dnn tensor shape " << shapeString << "\n"; |
| 89 | return false; |
| 90 | } |
| 91 | megdnn::TensorShape tshape; |
| 92 | tshape.ndim = dims.size(); |
| 93 | for (size_t i = 0; i < tshape.ndim; ++i) { |
| 94 | if (dims[i].getAsInteger(0, tshape[i])) { |
| 95 | llvm::errs() << "invalid dimension " << dims[i] << "\n"; |
| 96 | return false; |
| 97 | } |
| 98 | } |
| 99 | if (!map.emplace(nameString.str(), tshape).second) { |
| 100 | llvm::errs() << "duplicated tensor name " << nameString << "\n"; |
| 101 | return false; |
| 102 | } |
| 103 | } |
| 104 | if (map.size() > 0) { |
| 105 | llvm::outs() << "Model input tensor shape:\n"; |
| 106 | for (auto& it : map) { |
| 107 | llvm::outs() << " input name= " << it.first << ". "; |
| 108 | llvm::outs() << "shape= ["; |
| 109 | for (size_t dim = 0; dim < it.second.ndim; dim++) { |
| 110 | if (dim != 0) |
| 111 | llvm::outs() << ","; |
| 112 | llvm::outs() << it.second.shape[dim]; |
| 113 | } |
| 114 | llvm::outs() << "]\n"; |
| 115 | } |
| 116 | } |
| 117 | map_vec.push_back(map); |
| 118 | } |
| 119 | return true; |
| 120 | } |
| 121 | |
| 122 | bool parseInputData( |