code: def _update_sample_pos(
      self,
      ctx,
      cur_layer_nodes: List[Node],
      sample_pos: DataFrame,
      data: DataFrame,
      node_map: dict,
  ):
      sitename = ctx.local.party[0] + "_" + ctx.local.party[1]
      data_with_pos = DataFrame.hstack([data, sample_pos])
      map_func = functools.partial(
          _update_sample_pos_on_local_nodes,
          cur_layer_node=cur_layer_nodes,
          node_map=node_map,
          sitename=sitename,
      )
      update_sample_pos = data_with_pos.apply_row(
          map_func, columns=["h_on_local", "h_node_idx"]
      )
  
      ctx.guest.put("updated_data", update_sample_pos)
      new_sample_pos = ctx.guest.get("new_sample_pos")
  
      return new_sample_pos
  
imports: from fate.ml.ensemble.learner.decision_tree.tree_core.decision_tree import DecisionTree, Node, _update_sample_pos_on_local_nodes, FeatureImportance
  from fate.ml.ensemble.learner.decision_tree.tree_core.hist import SBTHistogramBuilder, DistributedHistogram
  from fate.ml.ensemble.learner.decision_tree.tree_core.splitter import SBTSplitter
  from fate.ml.ensemble.learner.decision_tree.tree_core.decision_tree import ALL_FEAT, GUEST_FEAT_ONLY
  from fate.arch import Context
  from fate.arch.dataframe import DataFrame
  from typing import List
  import functools
  import logging
label_desc: Use image node_id 4 for calling the HeteroDecisionTreeHost obj's underlying member method code with example usage: obj._update_sample_pos(ctx, cur_layer_nodes, sample_pos, data, node_map) and returns: new_sample_pos