code: def _check_assign_result(
      self, sample_pos: DataFrame, cur_layer_node: List[Node]
  ):
      # debugging function
      sample_pos_df = sample_pos.as_pd_df()
      sample_pos_count = (
          sample_pos_df.groupby("node_idx")
          .count()
          .to_dict()["sample_id"]
      )
      for node in cur_layer_node:
          nid = node.nid
          sample_count_0 = node.sample_num
          sample_count_1 = sample_pos_count[nid]
          if sample_count_0 != sample_count_1:
              parent_nid = node.parent_nodeid
              for i in self._nodes:
                  if i.nid == parent_nid:
                      logger.info("parent node {}".format(i))
              raise ValueError(
                  "node {} sample count not match, {} vs {}, node details {}".format(
                      nid, sample_count_0, sample_count_1, node
                  )
              )
  
imports: from fate.ml.ensemble.learner.decision_tree.tree_core.decision_tree import DecisionTree, Node, _update_sample_pos_on_local_nodes, _merge_sample_pos
  from fate.ml.ensemble.learner.decision_tree.tree_core.hist import SBTHistogramBuilder
  from fate.ml.ensemble.learner.decision_tree.tree_core.splitter import SBTSplitter
  from fate.ml.ensemble.learner.decision_tree.tree_core.loss import get_task_info
  from fate.ml.ensemble.learner.decision_tree.tree_core.decision_tree import ALL_FEAT, GUEST_FEAT_ONLY
  from fate.ml.utils.predict_tools import BINARY, MULTI, REGRESSION
  from fate.arch import Context
  from fate.arch.dataframe import DataFrame
  from typing import List
  import functools
  import logging
  import pandas
  import torch
  import math
label_desc: Use image node_id 9 for calling the HeteroDecisionTreeGuest obj's underlying member method code with example usage: obj._check_assign_result(sample_pos, cur_layer_node) without return types