| 53 | } |
| 54 | |
| 55 | SmallVector<TensorPtr> apply_on_physical_tensor( |
| 56 | const OpDef& def, SmallVector<TensorPtr> inputs, |
| 57 | SmallVector<LogicalTensorDesc>& output_descs, const bool& validated) { |
| 58 | SmallVector<LogicalTensorDesc> input_descs; |
| 59 | for (auto&& input : inputs) { |
| 60 | input_descs.push_back({input->layout(), input->comp_node()}); |
| 61 | } |
| 62 | auto subgraph = def.trait()->make_forward_graph(def, input_descs); |
| 63 | auto apply_functor = [&output_descs]( |
| 64 | const std::shared_ptr<OpDef>& op, |
| 65 | const SmallVector<TensorPtr>& inputs, |
| 66 | size_t nr_outputs) { |
| 67 | auto&& constraints = OpDef::get_input_layout_constraint(*op, inputs); |
| 68 | for (size_t idx = 0; idx < inputs.size(); ++idx) { |
| 69 | auto&& layout_checker = constraints[idx]; |
| 70 | if (layout_checker) { |
| 71 | inputs[idx]->to_contiguous_inplace(layout_checker); |
| 72 | } |
| 73 | } |
| 74 | // do not use infered output_desc in subgraph |
| 75 | return OpDef::apply_on_physical_tensor(*op, inputs, output_descs, false); |
| 76 | }; |
| 77 | auto const_functor = [&](const TensorPtr& value) { return value; }; |
| 78 | auto outputs = subgraph.apply<TensorPtr>(inputs, apply_functor, const_functor); |
| 79 | return outputs; |
| 80 | } |
| 81 | |
| 82 | SmallVector<LayoutConstraintCallback> get_input_layout_constraint( |
| 83 | const OpDef& def, const SmallVector<TensorPtr>& inputs) { |
nothing calls this directly
no test coverage detected