| 1571 | } |
| 1572 | |
| 1573 | static std::vector<dimension::sub> attach_empty_axis(std::vector<dimension::sub> tsubs) |
| 1574 | { |
| 1575 | // Inject additonal axis to compute transpose permutation better |
| 1576 | auto is_empty_axis = [](const auto& s) { return s.axis.empty(); }; |
| 1577 | group_find(tsubs.begin(), tsubs.end(), is_empty_axis, [&](auto start, auto last) { |
| 1578 | if(start == tsubs.begin()) |
| 1579 | return; |
| 1580 | auto base = std::prev(start); |
| 1581 | auto axis = base->axis; |
| 1582 | axis.push_back(0); |
| 1583 | std::for_each(start, last, [&](auto& s) { |
| 1584 | s.axis = axis; |
| 1585 | axis.back()++; |
| 1586 | }); |
| 1587 | }); |
| 1588 | return tsubs; |
| 1589 | } |
| 1590 | |
| 1591 | static std::vector<int64_t> find_permutation(const std::vector<dimension::sub>& subs) |
| 1592 | { |