@@ -407,11 +407,21 @@ Error Method::parse_values(const NamedDataMap* external_data_map) {
407407 auto flatbuffer_values = serialization_plan_->values ();
408408 ET_CHECK_OR_RETURN_ERROR (
409409 flatbuffer_values != nullptr , InvalidProgram, " Missing values" );
410- size_t n_value = flatbuffer_values->size ();
410+ const size_t n_value = flatbuffer_values->size ();
411411 values_ = memory_manager_->method_allocator ()->allocateList <EValue>(n_value);
412412 if (values_ == nullptr ) {
413413 return Error::MemoryAllocationFailed;
414414 }
415+ const size_t n_input = inputs_size ();
416+ if (n_input > 0 ) {
417+ input_set_ = memory_manager_->method_allocator ()->allocateList <bool >(n_input);
418+ if (input_set_ == nullptr ) {
419+ return Error::MemoryAllocationFailed;
420+ }
421+ for (size_t i = 0 ; i < n_input; ++i) {
422+ input_set_[i] = false ;
423+ }
424+ }
415425
416426 // Count the number of tensors marked as EXTERNAL for this method. The actual
417427 // number of external constants may be smaller, eg. if multiple tensors point
@@ -1076,26 +1086,21 @@ Method::set_input(const EValue& input_evalue, size_t input_idx) {
10761086 executorch::runtime::toString (t_src.scalar_type ()));
10771087 // Reset the shape for the Method's input as the size of forwarded input
10781088 // tensor for shape dynamism. Also is a safety check if need memcpy.
1079- Error err = resize_tensor (t_dst, t_src.sizes ());
1080- ET_CHECK_OR_RETURN_ERROR (
1081- err == Error::Ok,
1082- InvalidArgument,
1083- " Error setting input %" ET_PRIsize_t " : 0x%" PRIx32,
1084- input_idx,
1085- static_cast <uint32_t >(err));
1086- Error error;
1089+ ET_CHECK_OK_OR_RETURN_ERROR (
1090+ resize_tensor (t_dst, t_src.sizes ()),
1091+ " Error resizing tensor at input %" ET_PRIsize_t, input_idx);
10871092 auto tensor_meta = this ->method_meta ().input_tensor_meta (input_idx);
10881093 if (tensor_meta->is_memory_planned ()) {
1089- error = internal::copy_tensor_data (t_dst, t_src);
1094+ ET_CHECK_OK_OR_RETURN_ERROR (
1095+ internal::copy_tensor_data (t_dst, t_src),
1096+ " Error setting copying tensor data at input %" ET_PRIsize_t, input_idx
1097+ );
10901098 } else {
1091- error = internal::share_tensor_data (t_dst, t_src);
1099+ ET_CHECK_OK_OR_RETURN_ERROR (
1100+ internal::share_tensor_data (t_dst, t_src),
1101+ " Error setting sharing tensor data at input %" ET_PRIsize_t, input_idx
1102+ );
10921103 }
1093- ET_CHECK_OR_RETURN_ERROR (
1094- error == Error::Ok,
1095- InvalidArgument,
1096- " Error setting data_ptr %" ET_PRIsize_t " : 0x%" PRIx32,
1097- input_idx,
1098- static_cast <uint32_t >(error));
10991104 // Prims have to be the same as what was traced
11001105 } else if (e.isInt ()) {
11011106 ET_CHECK_OR_RETURN_ERROR (
@@ -1163,35 +1168,16 @@ Method::set_input(const EValue& input_evalue, size_t input_idx) {
11631168
11641169 return Error::InvalidArgument;
11651170 }
1171+ input_set_[input_idx] = true ;
1172+
11661173 return Error::Ok;
11671174}
11681175
11691176ET_NODISCARD Error
11701177Method::set_inputs (const executorch::aten::ArrayRef<EValue>& input_evalues) {
1171- ET_CHECK_OR_RETURN_ERROR (
1172- initialized (),
1173- InvalidState,
1174- " Inputs can not be set until method has been initialized." );
1175-
1176- ET_CHECK_OR_RETURN_ERROR (
1177- step_state_.instr_idx == 0 && step_state_.chain_idx == 0 ,
1178- InvalidState,
1179- " Inputs can not be set mid execution." );
1180-
1181- size_t input_size = inputs_size ();
1182- ET_CHECK_OR_RETURN_ERROR (
1183- input_size == input_evalues.size (),
1184- InvalidArgument,
1185- " The length of given input array (%" ET_PRIsize_t
1186- " ) must be same as the number of inputs in method (%" ET_PRIsize_t " )." ,
1187- input_evalues.size (),
1188- input_size);
1189-
1190- for (size_t i = 0 ; i < input_size; i++) {
1191- Error status = set_input (input_evalues[i], i);
1192- if (status != Error::Ok) {
1193- return status;
1194- }
1178+ const size_t n_input = inputs_size ();
1179+ for (size_t i = 0 ; i < n_input; ++i) {
1180+ ET_CHECK_OK_OR_RETURN_ERROR (set_input (input_evalues[i], i));
11951181 }
11961182 return Error::Ok;
11971183}
@@ -1284,20 +1270,18 @@ ET_NODISCARD Error Method::get_inputs(EValue* input_evalues, size_t length) {
12841270 initialized (),
12851271 InvalidState,
12861272 " Inputs can not be retrieved until method has been initialized." );
1287-
1273+ const size_t n_input = inputs_size ();
12881274 ET_CHECK_OR_RETURN_ERROR (
1289- length >= inputs_size () ,
1275+ length >= n_input ,
12901276 InvalidArgument,
12911277 " The given array is not large enough to hold all inputs." );
12921278
1293- for (size_t i = 0 ; i < inputs_size (); i++ ) {
1279+ for (size_t i = 0 ; i < n_input; ++i ) {
12941280 input_evalues[i] = values_[get_input_index (i)];
12951281 }
1296-
1297- for (size_t i = inputs_size (); i < length; i++) {
1282+ for (size_t i = n_input; i < length; ++i) {
12981283 input_evalues[i] = EValue ();
12991284 }
1300-
13011285 return Error::Ok;
13021286}
13031287
@@ -1545,6 +1529,14 @@ Error Method::execute() {
15451529 initialized (),
15461530 NotSupported,
15471531 " Cannot execute until method has been initialized." );
1532+ const size_t n_input = inputs_size ();
1533+ for (size_t i = 0 ; i < n_input; ++i) {
1534+ ET_CHECK_OR_RETURN_ERROR (
1535+ input_set_[i],
1536+ InvalidArgument,
1537+ " Input %" ET_PRIsize_t " has not been set." , i
1538+ );
1539+ }
15481540 ET_LOG (Debug, " Executing method: %s." , method_meta ().name ());
15491541
15501542 // Chains are executed sequentially today, but future async designs may
0 commit comments