@@ -407,11 +407,22 @@ 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_ =
418+ memory_manager_->method_allocator ()->allocateList <bool >(n_input);
419+ if (input_set_ == nullptr ) {
420+ return Error::MemoryAllocationFailed;
421+ }
422+ for (size_t i = 0 ; i < n_input; ++i) {
423+ input_set_[i] = false ;
424+ }
425+ }
415426
416427 // Count the number of tensors marked as EXTERNAL for this method. The actual
417428 // number of external constants may be smaller, eg. if multiple tensors point
@@ -1076,26 +1087,22 @@ Method::set_input(const EValue& input_evalue, size_t input_idx) {
10761087 executorch::runtime::toString (t_src.scalar_type ()));
10771088 // Reset the shape for the Method's input as the size of forwarded input
10781089 // 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;
1090+ ET_CHECK_OK_OR_RETURN_ERROR (
1091+ resize_tensor (t_dst, t_src.sizes ()),
1092+ " Error resizing tensor at input %" ET_PRIsize_t,
1093+ input_idx);
10871094 auto tensor_meta = this ->method_meta ().input_tensor_meta (input_idx);
10881095 if (tensor_meta->is_memory_planned ()) {
1089- error = internal::copy_tensor_data (t_dst, t_src);
1096+ ET_CHECK_OK_OR_RETURN_ERROR (
1097+ internal::copy_tensor_data (t_dst, t_src),
1098+ " Error setting copying tensor data at input %" ET_PRIsize_t,
1099+ input_idx);
10901100 } else {
1091- error = internal::share_tensor_data (t_dst, t_src);
1101+ ET_CHECK_OK_OR_RETURN_ERROR (
1102+ internal::share_tensor_data (t_dst, t_src),
1103+ " Error setting sharing tensor data at input %" ET_PRIsize_t,
1104+ input_idx);
10921105 }
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));
10991106 // Prims have to be the same as what was traced
11001107 } else if (e.isInt ()) {
11011108 ET_CHECK_OR_RETURN_ERROR (
@@ -1163,35 +1170,16 @@ Method::set_input(const EValue& input_evalue, size_t input_idx) {
11631170
11641171 return Error::InvalidArgument;
11651172 }
1173+ input_set_[input_idx] = true ;
1174+
11661175 return Error::Ok;
11671176}
11681177
11691178ET_NODISCARD Error
11701179Method::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- }
1180+ const size_t n_input = inputs_size ();
1181+ for (size_t i = 0 ; i < n_input; ++i) {
1182+ ET_CHECK_OK_OR_RETURN_ERROR (set_input (input_evalues[i], i));
11951183 }
11961184 return Error::Ok;
11971185}
@@ -1284,20 +1272,18 @@ ET_NODISCARD Error Method::get_inputs(EValue* input_evalues, size_t length) {
12841272 initialized (),
12851273 InvalidState,
12861274 " Inputs can not be retrieved until method has been initialized." );
1287-
1275+ const size_t n_input = inputs_size ();
12881276 ET_CHECK_OR_RETURN_ERROR (
1289- length >= inputs_size () ,
1277+ length >= n_input ,
12901278 InvalidArgument,
12911279 " The given array is not large enough to hold all inputs." );
12921280
1293- for (size_t i = 0 ; i < inputs_size (); i++ ) {
1281+ for (size_t i = 0 ; i < n_input; ++i ) {
12941282 input_evalues[i] = values_[get_input_index (i)];
12951283 }
1296-
1297- for (size_t i = inputs_size (); i < length; i++) {
1284+ for (size_t i = n_input; i < length; ++i) {
12981285 input_evalues[i] = EValue ();
12991286 }
1300-
13011287 return Error::Ok;
13021288}
13031289
@@ -1545,6 +1531,14 @@ Error Method::execute() {
15451531 initialized (),
15461532 NotSupported,
15471533 " Cannot execute until method has been initialized." );
1534+ const size_t n_input = inputs_size ();
1535+ for (size_t i = 0 ; i < n_input; ++i) {
1536+ ET_CHECK_OR_RETURN_ERROR (
1537+ input_set_[i],
1538+ InvalidArgument,
1539+ " Input %" ET_PRIsize_t " has not been set." ,
1540+ i);
1541+ }
15481542 ET_LOG (Debug, " Executing method: %s." , method_meta ().name ());
15491543
15501544 // Chains are executed sequentially today, but future async designs may
0 commit comments