xref: /aosp_15_r20/external/executorch/runtime/executor/method.h (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Worker /*
2*523fa7a6SAndroid Build Coastguard Worker  * Copyright (c) Meta Platforms, Inc. and affiliates.
3*523fa7a6SAndroid Build Coastguard Worker  * All rights reserved.
4*523fa7a6SAndroid Build Coastguard Worker  *
5*523fa7a6SAndroid Build Coastguard Worker  * This source code is licensed under the BSD-style license found in the
6*523fa7a6SAndroid Build Coastguard Worker  * LICENSE file in the root directory of this source tree.
7*523fa7a6SAndroid Build Coastguard Worker  */
8*523fa7a6SAndroid Build Coastguard Worker 
9*523fa7a6SAndroid Build Coastguard Worker #pragma once
10*523fa7a6SAndroid Build Coastguard Worker 
11*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/core/evalue.h>
12*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/core/event_tracer.h>
13*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/core/exec_aten/exec_aten.h>
14*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/core/span.h>
15*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/executor/memory_manager.h>
16*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/executor/method_meta.h>
17*523fa7a6SAndroid Build Coastguard Worker #include <executorch/runtime/platform/compiler.h>
18*523fa7a6SAndroid Build Coastguard Worker 
19*523fa7a6SAndroid Build Coastguard Worker // Forward declare flatbuffer types. This is a public header and must not
20*523fa7a6SAndroid Build Coastguard Worker // include the generated flatbuffer header.
21*523fa7a6SAndroid Build Coastguard Worker namespace executorch_flatbuffer {
22*523fa7a6SAndroid Build Coastguard Worker struct Chain;
23*523fa7a6SAndroid Build Coastguard Worker struct ExecutionPlan;
24*523fa7a6SAndroid Build Coastguard Worker struct EValue;
25*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch_flatbuffer
26*523fa7a6SAndroid Build Coastguard Worker 
27*523fa7a6SAndroid Build Coastguard Worker namespace executorch {
28*523fa7a6SAndroid Build Coastguard Worker namespace runtime {
29*523fa7a6SAndroid Build Coastguard Worker 
30*523fa7a6SAndroid Build Coastguard Worker // Forward declare Program to avoid a circular reference.
31*523fa7a6SAndroid Build Coastguard Worker class Program;
32*523fa7a6SAndroid Build Coastguard Worker 
33*523fa7a6SAndroid Build Coastguard Worker // Forward declare internal types.
34*523fa7a6SAndroid Build Coastguard Worker class BackendDelegate;
35*523fa7a6SAndroid Build Coastguard Worker struct Chain;
36*523fa7a6SAndroid Build Coastguard Worker class KernelRuntimeContext;
37*523fa7a6SAndroid Build Coastguard Worker using OpFunction = void (*)(KernelRuntimeContext&, EValue**);
38*523fa7a6SAndroid Build Coastguard Worker /// A list of pointers into the master values table that together compose the
39*523fa7a6SAndroid Build Coastguard Worker /// argument list for a single instruction
40*523fa7a6SAndroid Build Coastguard Worker using InstructionArgs = Span<EValue*>;
41*523fa7a6SAndroid Build Coastguard Worker 
42*523fa7a6SAndroid Build Coastguard Worker /**
43*523fa7a6SAndroid Build Coastguard Worker  * An executable method of an executorch program. Maps to a python method like
44*523fa7a6SAndroid Build Coastguard Worker  * `forward()` on the original nn.Module.
45*523fa7a6SAndroid Build Coastguard Worker  */
46*523fa7a6SAndroid Build Coastguard Worker class Method final {
47*523fa7a6SAndroid Build Coastguard Worker  public:
48*523fa7a6SAndroid Build Coastguard Worker   /**
49*523fa7a6SAndroid Build Coastguard Worker    * Move ctor. Takes ownership of resources previously owned by `rhs`,
50*523fa7a6SAndroid Build Coastguard Worker    * and leaves `rhs` in an uninitialized state.
51*523fa7a6SAndroid Build Coastguard Worker    */
Method(Method && rhs)52*523fa7a6SAndroid Build Coastguard Worker   Method(Method&& rhs) noexcept
53*523fa7a6SAndroid Build Coastguard Worker       : step_state_(rhs.step_state_),
54*523fa7a6SAndroid Build Coastguard Worker         program_(rhs.program_),
55*523fa7a6SAndroid Build Coastguard Worker         memory_manager_(rhs.memory_manager_),
56*523fa7a6SAndroid Build Coastguard Worker         temp_allocator_(rhs.temp_allocator_),
57*523fa7a6SAndroid Build Coastguard Worker         serialization_plan_(rhs.serialization_plan_),
58*523fa7a6SAndroid Build Coastguard Worker         event_tracer_(rhs.event_tracer_),
59*523fa7a6SAndroid Build Coastguard Worker         n_value_(rhs.n_value_),
60*523fa7a6SAndroid Build Coastguard Worker         values_(rhs.values_),
61*523fa7a6SAndroid Build Coastguard Worker         n_delegate_(rhs.n_delegate_),
62*523fa7a6SAndroid Build Coastguard Worker         delegates_(rhs.delegates_),
63*523fa7a6SAndroid Build Coastguard Worker         n_chains_(rhs.n_chains_),
64*523fa7a6SAndroid Build Coastguard Worker         chains_(rhs.chains_),
65*523fa7a6SAndroid Build Coastguard Worker         init_state_(rhs.init_state_) {
66*523fa7a6SAndroid Build Coastguard Worker     // Required: clear out fields that the dtor looks at, so that we don't free
67*523fa7a6SAndroid Build Coastguard Worker     // anything twice.
68*523fa7a6SAndroid Build Coastguard Worker     rhs.n_value_ = 0;
69*523fa7a6SAndroid Build Coastguard Worker     rhs.values_ = nullptr;
70*523fa7a6SAndroid Build Coastguard Worker     rhs.n_delegate_ = 0;
71*523fa7a6SAndroid Build Coastguard Worker     rhs.delegates_ = nullptr;
72*523fa7a6SAndroid Build Coastguard Worker 
73*523fa7a6SAndroid Build Coastguard Worker     // Helpful: Try to ensure that any other interactions with the old object
74*523fa7a6SAndroid Build Coastguard Worker     // result in failures.
75*523fa7a6SAndroid Build Coastguard Worker     rhs.init_state_ = InitializationState::Uninitialized;
76*523fa7a6SAndroid Build Coastguard Worker     rhs.step_state_ = {};
77*523fa7a6SAndroid Build Coastguard Worker     rhs.program_ = nullptr;
78*523fa7a6SAndroid Build Coastguard Worker     rhs.memory_manager_ = nullptr;
79*523fa7a6SAndroid Build Coastguard Worker     rhs.serialization_plan_ = nullptr;
80*523fa7a6SAndroid Build Coastguard Worker     rhs.event_tracer_ = nullptr;
81*523fa7a6SAndroid Build Coastguard Worker     rhs.n_chains_ = 0;
82*523fa7a6SAndroid Build Coastguard Worker     rhs.chains_ = nullptr;
83*523fa7a6SAndroid Build Coastguard Worker   }
84*523fa7a6SAndroid Build Coastguard Worker 
85*523fa7a6SAndroid Build Coastguard Worker   /**
86*523fa7a6SAndroid Build Coastguard Worker    * Sets the internal input value to be equivalent to the to the provided
87*523fa7a6SAndroid Build Coastguard Worker    * value.
88*523fa7a6SAndroid Build Coastguard Worker    *
89*523fa7a6SAndroid Build Coastguard Worker    * @param[in] input_evalue The evalue to copy into the method input. If the
90*523fa7a6SAndroid Build Coastguard Worker    *     evalue is a tensor, the data is copied in most cases, so the tensor
91*523fa7a6SAndroid Build Coastguard Worker    *     passed in here does not always need to outlive this call. But there is
92*523fa7a6SAndroid Build Coastguard Worker    *     a case where the Method will keep a pointer to the tensor's data.
93*523fa7a6SAndroid Build Coastguard Worker    *     Based on the memory plan of the method, the inputs may not have
94*523fa7a6SAndroid Build Coastguard Worker    *     buffer space pre-allocated for them. In this case the executor will
95*523fa7a6SAndroid Build Coastguard Worker    *     alias the memory of the tensors provided as inputs here rather then
96*523fa7a6SAndroid Build Coastguard Worker    *     deepcopy the input into the memory planned arena.
97*523fa7a6SAndroid Build Coastguard Worker    *
98*523fa7a6SAndroid Build Coastguard Worker    * @param[in] input_idx Zero-based index of the input to set. Must be less
99*523fa7a6SAndroid Build Coastguard Worker    *     than the value returned by inputs_size().
100*523fa7a6SAndroid Build Coastguard Worker    *
101*523fa7a6SAndroid Build Coastguard Worker    * @returns Error::Ok on success, non-Ok on failure.
102*523fa7a6SAndroid Build Coastguard Worker    */
103*523fa7a6SAndroid Build Coastguard Worker   ET_NODISCARD Error set_input(const EValue& input_evalue, size_t input_idx);
104*523fa7a6SAndroid Build Coastguard Worker 
105*523fa7a6SAndroid Build Coastguard Worker   /**
106*523fa7a6SAndroid Build Coastguard Worker    * Sets the values of all method inputs.
107*523fa7a6SAndroid Build Coastguard Worker    *
108*523fa7a6SAndroid Build Coastguard Worker    * See set_input() for a more detailed description of the behavior.
109*523fa7a6SAndroid Build Coastguard Worker    *
110*523fa7a6SAndroid Build Coastguard Worker    * @param[in] input_evalues The new values for all of the method inputs. The
111*523fa7a6SAndroid Build Coastguard Worker    *     type of each element must match the type of corresponding input. If the
112*523fa7a6SAndroid Build Coastguard Worker    *     value of an element is a tensor, attempts to allow dynamic shape, but
113*523fa7a6SAndroid Build Coastguard Worker    *     the dtype must always agree.
114*523fa7a6SAndroid Build Coastguard Worker    *
115*523fa7a6SAndroid Build Coastguard Worker    * @returns Error::Ok on success, non-Ok on failure.
116*523fa7a6SAndroid Build Coastguard Worker    */
117*523fa7a6SAndroid Build Coastguard Worker   ET_NODISCARD Error
118*523fa7a6SAndroid Build Coastguard Worker   set_inputs(const executorch::aten::ArrayRef<EValue>& input_evalues);
119*523fa7a6SAndroid Build Coastguard Worker 
120*523fa7a6SAndroid Build Coastguard Worker   /**
121*523fa7a6SAndroid Build Coastguard Worker    * Sets the data buffer of the specified method output to the provided value.
122*523fa7a6SAndroid Build Coastguard Worker    *
123*523fa7a6SAndroid Build Coastguard Worker    * NOTE: Based on the memory plan of the method, the output tensors may not
124*523fa7a6SAndroid Build Coastguard Worker    * have buffer space pre-allocated for them, in this case the executor will
125*523fa7a6SAndroid Build Coastguard Worker    * point those tensors to the buffer provided here, so the user should take
126*523fa7a6SAndroid Build Coastguard Worker    * care that the life span of this memory outlasts the executor forward.
127*523fa7a6SAndroid Build Coastguard Worker    *
128*523fa7a6SAndroid Build Coastguard Worker    * @param[in] buffer The block of memory to point the specified tensor at.
129*523fa7a6SAndroid Build Coastguard Worker    *
130*523fa7a6SAndroid Build Coastguard Worker    * @param[in] size the length of buffer in bytes, must be >= the nbytes of the
131*523fa7a6SAndroid Build Coastguard Worker    * specified tensor.
132*523fa7a6SAndroid Build Coastguard Worker    *
133*523fa7a6SAndroid Build Coastguard Worker    * @param[in] output_idx The index of the output to set the data_ptr for. Must
134*523fa7a6SAndroid Build Coastguard Worker    *     correspond to a tensor, and that tensor must not have had a buffer
135*523fa7a6SAndroid Build Coastguard Worker    *     allocated by the memory plan.
136*523fa7a6SAndroid Build Coastguard Worker    *
137*523fa7a6SAndroid Build Coastguard Worker    * @returns Error::Ok on success, non-Ok on failure.
138*523fa7a6SAndroid Build Coastguard Worker    */
139*523fa7a6SAndroid Build Coastguard Worker   ET_NODISCARD Error
140*523fa7a6SAndroid Build Coastguard Worker   set_output_data_ptr(void* buffer, size_t size, size_t output_idx);
141*523fa7a6SAndroid Build Coastguard Worker 
142*523fa7a6SAndroid Build Coastguard Worker   /**
143*523fa7a6SAndroid Build Coastguard Worker    * Copies the method's outputs into the provided array.
144*523fa7a6SAndroid Build Coastguard Worker    *
145*523fa7a6SAndroid Build Coastguard Worker    * WARNING: The output contains shallow copies of internal tensor outputs.
146*523fa7a6SAndroid Build Coastguard Worker    * Please do not mutate returned Tensor elements.
147*523fa7a6SAndroid Build Coastguard Worker    *
148*523fa7a6SAndroid Build Coastguard Worker    * TODO(T139259264): Add checks to detect output mutation, or deep-copy
149*523fa7a6SAndroid Build Coastguard Worker    * outputs.
150*523fa7a6SAndroid Build Coastguard Worker    *
151*523fa7a6SAndroid Build Coastguard Worker    * @param[in] output_evalues The array to copy the outputs into. The first
152*523fa7a6SAndroid Build Coastguard Worker    *     `outputs_size()` elements will be set to the corresponding output
153*523fa7a6SAndroid Build Coastguard Worker    *     values. The rest of the array will be set to the EValue value None.
154*523fa7a6SAndroid Build Coastguard Worker    * @param[in] length The size of the `output_evalues` array in elements. Must
155*523fa7a6SAndroid Build Coastguard Worker    *     be greater than or equal to `outputs_size()`.
156*523fa7a6SAndroid Build Coastguard Worker    *
157*523fa7a6SAndroid Build Coastguard Worker    * @returns Error::Ok on success, non-Ok on failure.
158*523fa7a6SAndroid Build Coastguard Worker    */
159*523fa7a6SAndroid Build Coastguard Worker   ET_NODISCARD Error get_outputs(EValue* output_evalues, size_t length);
160*523fa7a6SAndroid Build Coastguard Worker 
161*523fa7a6SAndroid Build Coastguard Worker   /**
162*523fa7a6SAndroid Build Coastguard Worker    * Copies the method's inputs into the provided array.
163*523fa7a6SAndroid Build Coastguard Worker    *
164*523fa7a6SAndroid Build Coastguard Worker    * WARNING: The input contains shallow copies of internal tensor inputs.
165*523fa7a6SAndroid Build Coastguard Worker    * Please do not mutate returned Tensor elements.
166*523fa7a6SAndroid Build Coastguard Worker    *
167*523fa7a6SAndroid Build Coastguard Worker    * @param[in] input_evalues The array to copy the inputs into. The first
168*523fa7a6SAndroid Build Coastguard Worker    *     `inputs_size()` elements will be set to the corresponding input
169*523fa7a6SAndroid Build Coastguard Worker    *     values. The rest of the array will be set to the EValue value None.
170*523fa7a6SAndroid Build Coastguard Worker    * @param[in] length The size of the `input_evalues` array in elements. Must
171*523fa7a6SAndroid Build Coastguard Worker    *     be greater than or equal to `inputs_size()`.
172*523fa7a6SAndroid Build Coastguard Worker    *
173*523fa7a6SAndroid Build Coastguard Worker    * @returns Error::Ok on success, non-Ok on failure.
174*523fa7a6SAndroid Build Coastguard Worker    */
175*523fa7a6SAndroid Build Coastguard Worker   ET_NODISCARD Error get_inputs(EValue* input_evalues, size_t length);
176*523fa7a6SAndroid Build Coastguard Worker 
177*523fa7a6SAndroid Build Coastguard Worker   /**
178*523fa7a6SAndroid Build Coastguard Worker    * Execute the method.
179*523fa7a6SAndroid Build Coastguard Worker    *
180*523fa7a6SAndroid Build Coastguard Worker    * NOTE: Will fail if the method has been partially executed using the
181*523fa7a6SAndroid Build Coastguard Worker    * `step()` api.
182*523fa7a6SAndroid Build Coastguard Worker    *
183*523fa7a6SAndroid Build Coastguard Worker    * @returns Error::Ok on success, non-Ok on failure.
184*523fa7a6SAndroid Build Coastguard Worker    */
185*523fa7a6SAndroid Build Coastguard Worker   ET_NODISCARD Error execute();
186*523fa7a6SAndroid Build Coastguard Worker 
187*523fa7a6SAndroid Build Coastguard Worker   /**
188*523fa7a6SAndroid Build Coastguard Worker    * EXPERIMENTAL: Advances/executes a single instruction in the method.
189*523fa7a6SAndroid Build Coastguard Worker    *
190*523fa7a6SAndroid Build Coastguard Worker    * @retval Error::Ok step succeeded
191*523fa7a6SAndroid Build Coastguard Worker    * @retval non-Ok step failed
192*523fa7a6SAndroid Build Coastguard Worker    * @retval Error::EndOfMethod method finished executing successfully
193*523fa7a6SAndroid Build Coastguard Worker    */
194*523fa7a6SAndroid Build Coastguard Worker   ET_EXPERIMENTAL ET_NODISCARD Error step();
195*523fa7a6SAndroid Build Coastguard Worker 
196*523fa7a6SAndroid Build Coastguard Worker   /// DEPRECATED: Use `step()` instead.
197*523fa7a6SAndroid Build Coastguard Worker   ET_DEPRECATED ET_NODISCARD Error experimental_step();
198*523fa7a6SAndroid Build Coastguard Worker 
199*523fa7a6SAndroid Build Coastguard Worker   /**
200*523fa7a6SAndroid Build Coastguard Worker    * EXPERIMENTAL: Resets execution state to the start of the Method. For use
201*523fa7a6SAndroid Build Coastguard Worker    * with the `step()` API.
202*523fa7a6SAndroid Build Coastguard Worker    *
203*523fa7a6SAndroid Build Coastguard Worker    * @retval Error:Ok on success
204*523fa7a6SAndroid Build Coastguard Worker    * @retval Error::InvalidState if called before step-based execution reached
205*523fa7a6SAndroid Build Coastguard Worker    *     the end of the Method. This means it is not possible to recover a
206*523fa7a6SAndroid Build Coastguard Worker    *     Method that failed mid-execution.
207*523fa7a6SAndroid Build Coastguard Worker    */
208*523fa7a6SAndroid Build Coastguard Worker   ET_EXPERIMENTAL ET_NODISCARD Error reset_execution();
209*523fa7a6SAndroid Build Coastguard Worker 
210*523fa7a6SAndroid Build Coastguard Worker   /// DEPRECATED: Use `reset_execution()` instead.
211*523fa7a6SAndroid Build Coastguard Worker   ET_DEPRECATED ET_NODISCARD Error experimental_reset_execution();
212*523fa7a6SAndroid Build Coastguard Worker 
213*523fa7a6SAndroid Build Coastguard Worker   /**
214*523fa7a6SAndroid Build Coastguard Worker    * Returns the MethodMeta that corresponds to the calling Method.
215*523fa7a6SAndroid Build Coastguard Worker    */
216*523fa7a6SAndroid Build Coastguard Worker   MethodMeta method_meta() const;
217*523fa7a6SAndroid Build Coastguard Worker 
218*523fa7a6SAndroid Build Coastguard Worker   /**
219*523fa7a6SAndroid Build Coastguard Worker    * Returns the number of inputs the Method expects.
220*523fa7a6SAndroid Build Coastguard Worker    */
221*523fa7a6SAndroid Build Coastguard Worker   size_t inputs_size() const;
222*523fa7a6SAndroid Build Coastguard Worker 
223*523fa7a6SAndroid Build Coastguard Worker   /**
224*523fa7a6SAndroid Build Coastguard Worker    * Returns the number of outputs the Method returns.
225*523fa7a6SAndroid Build Coastguard Worker    */
226*523fa7a6SAndroid Build Coastguard Worker   size_t outputs_size() const;
227*523fa7a6SAndroid Build Coastguard Worker 
228*523fa7a6SAndroid Build Coastguard Worker   /**
229*523fa7a6SAndroid Build Coastguard Worker    * Retrieves the output at the specified index.
230*523fa7a6SAndroid Build Coastguard Worker    */
231*523fa7a6SAndroid Build Coastguard Worker   const EValue& get_output(size_t i) const;
232*523fa7a6SAndroid Build Coastguard Worker 
233*523fa7a6SAndroid Build Coastguard Worker   EventTracer* get_event_tracer();
234*523fa7a6SAndroid Build Coastguard Worker 
235*523fa7a6SAndroid Build Coastguard Worker   /// DEPRECATED: Use MethodMeta instead to access metadata, and set_input to
236*523fa7a6SAndroid Build Coastguard Worker   /// update Method inputs.
237*523fa7a6SAndroid Build Coastguard Worker   ET_DEPRECATED const EValue& get_input(size_t i) const;
238*523fa7a6SAndroid Build Coastguard Worker   /// DEPRECATED: Use MethodMeta instead to access metadata, and set_input to
239*523fa7a6SAndroid Build Coastguard Worker   /// update Method inputs.
240*523fa7a6SAndroid Build Coastguard Worker   ET_DEPRECATED EValue& mutable_input(size_t i);
241*523fa7a6SAndroid Build Coastguard Worker   /// DEPRECATED: Use MethodMeta instead to access metadata, and get_output to
242*523fa7a6SAndroid Build Coastguard Worker   /// retrieve Method outputs.
243*523fa7a6SAndroid Build Coastguard Worker   ET_DEPRECATED EValue& mutable_output(size_t i);
244*523fa7a6SAndroid Build Coastguard Worker 
245*523fa7a6SAndroid Build Coastguard Worker   ~Method();
246*523fa7a6SAndroid Build Coastguard Worker 
247*523fa7a6SAndroid Build Coastguard Worker  private:
248*523fa7a6SAndroid Build Coastguard Worker   // Delete other rule-of-five methods.
249*523fa7a6SAndroid Build Coastguard Worker   Method(const Method&) = delete;
250*523fa7a6SAndroid Build Coastguard Worker   Method& operator=(const Method&) noexcept = delete;
251*523fa7a6SAndroid Build Coastguard Worker   Method& operator=(Method&&) = delete;
252*523fa7a6SAndroid Build Coastguard Worker 
253*523fa7a6SAndroid Build Coastguard Worker   // Let Program call load().
254*523fa7a6SAndroid Build Coastguard Worker   friend class Program;
255*523fa7a6SAndroid Build Coastguard Worker   // Let Executor call the ctor and init().
256*523fa7a6SAndroid Build Coastguard Worker   friend class Executor;
257*523fa7a6SAndroid Build Coastguard Worker 
258*523fa7a6SAndroid Build Coastguard Worker   enum class InitializationState : uint8_t {
259*523fa7a6SAndroid Build Coastguard Worker     Uninitialized,
260*523fa7a6SAndroid Build Coastguard Worker     Initialized,
261*523fa7a6SAndroid Build Coastguard Worker     InitializationFailed,
262*523fa7a6SAndroid Build Coastguard Worker   };
263*523fa7a6SAndroid Build Coastguard Worker 
264*523fa7a6SAndroid Build Coastguard Worker   /// Tracks what step in program execution we are on
265*523fa7a6SAndroid Build Coastguard Worker   struct StepState {
266*523fa7a6SAndroid Build Coastguard Worker     size_t chain_idx;
267*523fa7a6SAndroid Build Coastguard Worker     size_t instr_idx;
268*523fa7a6SAndroid Build Coastguard Worker   };
269*523fa7a6SAndroid Build Coastguard Worker 
Method(const Program * program,MemoryManager * memory_manager,EventTracer * event_tracer,MemoryAllocator * temp_allocator)270*523fa7a6SAndroid Build Coastguard Worker   Method(
271*523fa7a6SAndroid Build Coastguard Worker       const Program* program,
272*523fa7a6SAndroid Build Coastguard Worker       MemoryManager* memory_manager,
273*523fa7a6SAndroid Build Coastguard Worker       EventTracer* event_tracer,
274*523fa7a6SAndroid Build Coastguard Worker       MemoryAllocator* temp_allocator)
275*523fa7a6SAndroid Build Coastguard Worker       : step_state_(),
276*523fa7a6SAndroid Build Coastguard Worker         program_(program),
277*523fa7a6SAndroid Build Coastguard Worker         memory_manager_(memory_manager),
278*523fa7a6SAndroid Build Coastguard Worker         temp_allocator_(temp_allocator),
279*523fa7a6SAndroid Build Coastguard Worker         serialization_plan_(nullptr),
280*523fa7a6SAndroid Build Coastguard Worker         event_tracer_(event_tracer),
281*523fa7a6SAndroid Build Coastguard Worker         n_value_(0),
282*523fa7a6SAndroid Build Coastguard Worker         values_(nullptr),
283*523fa7a6SAndroid Build Coastguard Worker         n_delegate_(0),
284*523fa7a6SAndroid Build Coastguard Worker         delegates_(nullptr),
285*523fa7a6SAndroid Build Coastguard Worker         n_chains_(0),
286*523fa7a6SAndroid Build Coastguard Worker         chains_(nullptr),
287*523fa7a6SAndroid Build Coastguard Worker         init_state_(InitializationState::Uninitialized) {}
288*523fa7a6SAndroid Build Coastguard Worker 
289*523fa7a6SAndroid Build Coastguard Worker   /// Static factory used by Program.
290*523fa7a6SAndroid Build Coastguard Worker   ET_NODISCARD static Result<Method> load(
291*523fa7a6SAndroid Build Coastguard Worker       executorch_flatbuffer::ExecutionPlan* s_plan,
292*523fa7a6SAndroid Build Coastguard Worker       const Program* program,
293*523fa7a6SAndroid Build Coastguard Worker       MemoryManager* memory_manager,
294*523fa7a6SAndroid Build Coastguard Worker       EventTracer* event_tracer);
295*523fa7a6SAndroid Build Coastguard Worker 
296*523fa7a6SAndroid Build Coastguard Worker   /**
297*523fa7a6SAndroid Build Coastguard Worker    * Initialize the method from its serialized representation.
298*523fa7a6SAndroid Build Coastguard Worker    *
299*523fa7a6SAndroid Build Coastguard Worker    * @returns Error::Ok on success, non-Ok on failure.
300*523fa7a6SAndroid Build Coastguard Worker    */
301*523fa7a6SAndroid Build Coastguard Worker   ET_NODISCARD Error init(executorch_flatbuffer::ExecutionPlan* s_plan);
302*523fa7a6SAndroid Build Coastguard Worker 
303*523fa7a6SAndroid Build Coastguard Worker   /// Returns true if the Method was successfully initialized.
initialized()304*523fa7a6SAndroid Build Coastguard Worker   inline bool initialized() const {
305*523fa7a6SAndroid Build Coastguard Worker     return init_state_ == InitializationState::Initialized;
306*523fa7a6SAndroid Build Coastguard Worker   }
307*523fa7a6SAndroid Build Coastguard Worker 
308*523fa7a6SAndroid Build Coastguard Worker   const EValue& get_value(size_t i) const;
309*523fa7a6SAndroid Build Coastguard Worker   EValue& mutable_value(size_t i);
310*523fa7a6SAndroid Build Coastguard Worker   size_t get_input_index(size_t i) const;
311*523fa7a6SAndroid Build Coastguard Worker   size_t get_output_index(size_t i) const;
312*523fa7a6SAndroid Build Coastguard Worker 
313*523fa7a6SAndroid Build Coastguard Worker   // Executes a single instruction using the state in step_state_
314*523fa7a6SAndroid Build Coastguard Worker   ET_NODISCARD Error execute_instruction();
315*523fa7a6SAndroid Build Coastguard Worker 
316*523fa7a6SAndroid Build Coastguard Worker   StepState step_state_;
317*523fa7a6SAndroid Build Coastguard Worker   const Program* program_;
318*523fa7a6SAndroid Build Coastguard Worker   MemoryManager* memory_manager_;
319*523fa7a6SAndroid Build Coastguard Worker   MemoryAllocator* temp_allocator_;
320*523fa7a6SAndroid Build Coastguard Worker   executorch_flatbuffer::ExecutionPlan* serialization_plan_;
321*523fa7a6SAndroid Build Coastguard Worker   EventTracer* event_tracer_;
322*523fa7a6SAndroid Build Coastguard Worker 
323*523fa7a6SAndroid Build Coastguard Worker   size_t n_value_;
324*523fa7a6SAndroid Build Coastguard Worker   EValue* values_;
325*523fa7a6SAndroid Build Coastguard Worker 
326*523fa7a6SAndroid Build Coastguard Worker   size_t n_delegate_;
327*523fa7a6SAndroid Build Coastguard Worker   BackendDelegate* delegates_;
328*523fa7a6SAndroid Build Coastguard Worker 
329*523fa7a6SAndroid Build Coastguard Worker   size_t n_chains_;
330*523fa7a6SAndroid Build Coastguard Worker   Chain* chains_;
331*523fa7a6SAndroid Build Coastguard Worker 
332*523fa7a6SAndroid Build Coastguard Worker   InitializationState init_state_;
333*523fa7a6SAndroid Build Coastguard Worker 
334*523fa7a6SAndroid Build Coastguard Worker   /**
335*523fa7a6SAndroid Build Coastguard Worker    * Parses the elements of the values_ array. On error, n_value_ will be set to
336*523fa7a6SAndroid Build Coastguard Worker    * the number of successfully-initialized entries so that ~Method doesn't try
337*523fa7a6SAndroid Build Coastguard Worker    * to clean up uninitialized entries.
338*523fa7a6SAndroid Build Coastguard Worker    */
339*523fa7a6SAndroid Build Coastguard Worker   ET_NODISCARD Error parse_values();
340*523fa7a6SAndroid Build Coastguard Worker 
341*523fa7a6SAndroid Build Coastguard Worker   ET_NODISCARD Error resolve_operator(
342*523fa7a6SAndroid Build Coastguard Worker       int32_t op_index,
343*523fa7a6SAndroid Build Coastguard Worker       OpFunction* kernels,
344*523fa7a6SAndroid Build Coastguard Worker       size_t kernel_index,
345*523fa7a6SAndroid Build Coastguard Worker       InstructionArgs args,
346*523fa7a6SAndroid Build Coastguard Worker       size_t n_args);
347*523fa7a6SAndroid Build Coastguard Worker 
348*523fa7a6SAndroid Build Coastguard Worker   void log_outputs();
349*523fa7a6SAndroid Build Coastguard Worker };
350*523fa7a6SAndroid Build Coastguard Worker 
351*523fa7a6SAndroid Build Coastguard Worker } // namespace runtime
352*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch
353*523fa7a6SAndroid Build Coastguard Worker 
354*523fa7a6SAndroid Build Coastguard Worker namespace torch {
355*523fa7a6SAndroid Build Coastguard Worker namespace executor {
356*523fa7a6SAndroid Build Coastguard Worker // TODO(T197294990): Remove these deprecated aliases once all users have moved
357*523fa7a6SAndroid Build Coastguard Worker // to the new `::executorch` namespaces.
358*523fa7a6SAndroid Build Coastguard Worker using ::executorch::runtime::Method;
359*523fa7a6SAndroid Build Coastguard Worker } // namespace executor
360*523fa7a6SAndroid Build Coastguard Worker } // namespace torch
361