| 217 | } |
| 218 | |
| 219 | int64 ComputeSizeRatio(const TensorShapeProto& numerator, |
| 220 | const TensorShapeProto& denominator) { |
| 221 | if (numerator.unknown_rank() || denominator.unknown_rank()) { |
| 222 | return -1; |
| 223 | } |
| 224 | std::multiset<int> symbolic_dims; |
| 225 | int64 num = 1; |
| 226 | for (const auto& dim : numerator.dim()) { |
| 227 | if (dim.size() == -1) { |
| 228 | return -1; |
| 229 | } else if (dim.size() < -1) { |
| 230 | symbolic_dims.insert(dim.size()); |
| 231 | } else { |
| 232 | num *= dim.size(); |
| 233 | } |
| 234 | } |
| 235 | int64 denom = 1; |
| 236 | for (const auto& dim : denominator.dim()) { |
| 237 | if (dim.size() == -1) { |
| 238 | return -1; |
| 239 | } else if (dim.size() < -1) { |
| 240 | auto it = symbolic_dims.find(dim.size()); |
| 241 | if (it == symbolic_dims.end()) { |
| 242 | return -1; |
| 243 | } |
| 244 | symbolic_dims.erase(it); |
| 245 | } else { |
| 246 | denom *= dim.size(); |
| 247 | } |
| 248 | } |
| 249 | if (denom == 0) { |
| 250 | return -1; |
| 251 | } |
| 252 | if (!symbolic_dims.empty()) { |
| 253 | return -1; |
| 254 | } |
| 255 | return num / denom; |
| 256 | } |
| 257 | |
| 258 | } // end namespace grappler |
| 259 | } // end namespace tensorflow |