| 35 | inline namespace MIGRAPHX_INLINE_NS { |
| 36 | |
| 37 | static void update_op(const instruction_ref& input, const instruction_ref& ins, module& m) |
| 38 | { |
| 39 | auto op = ins->get_operator(); |
| 40 | auto val = op.to_value(); |
| 41 | auto op_padding = val.at("padding").to_vector<size_t>(); |
| 42 | |
| 43 | // skip if shape is dynamic |
| 44 | if(input->get_shape().dynamic()) |
| 45 | { |
| 46 | return; |
| 47 | } |
| 48 | |
| 49 | auto kdims = input->get_shape().lens().size() - 2; |
| 50 | if(std::equal(op_padding.begin(), |
| 51 | op_padding.begin() + kdims, |
| 52 | op_padding.begin() + kdims, |
| 53 | op_padding.end())) |
| 54 | return; |
| 55 | |
| 56 | std::vector<int64_t> padding(input->get_shape().lens().size() * 2, 0); |
| 57 | std::vector<size_t> pads_l(op_padding.begin(), op_padding.begin() + kdims); |
| 58 | std::vector<size_t> pads_r(op_padding.begin() + kdims, op_padding.end()); |
| 59 | op_padding = std::vector<size_t>(kdims * 2, 0); |
| 60 | op.from_value({{"padding", op_padding}}); |
| 61 | |
| 62 | std::copy(pads_l.begin(), pads_l.end(), padding.begin() + 2); |
| 63 | std::copy(pads_r.begin(), pads_r.end(), padding.begin() + kdims + 2 + 2); |
| 64 | |
| 65 | auto pad_op = m.insert_instruction(ins, op::pad{padding}, input); |
| 66 | |
| 67 | auto new_inputs = ins->inputs(); |
| 68 | new_inputs.front() = pad_op; |
| 69 | |
| 70 | m.replace_instruction(ins, op, new_inputs); |
| 71 | } |
| 72 | |
| 73 | static void update_pooling(const instruction_ref& input, const instruction_ref& ins, module& m) |
| 74 | { |
no test coverage detected