@@ -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