code: def split(
      self,
      ctx: Context,
      histogram_statistic_result,
      cur_layer_node,
      node_map,
      local_split=False,
      sk=None,
      coder=None,
      gh_pack=None,
      pack_info=None,
  ):
      if local_split:
          # Use local features only
          best_slits = self._local_split(
              ctx, histogram_statistic_result, node_map, cur_layer_node
          )
          return best_slits
      else:
          # For hetero-secureboost
          if ctx.is_on_guest:
              if sk is None or coder is None:
                  raise ValueError(
                      "sk or coder is None, not able to decode host split points"
                  )
              assert gh_pack is not None and isinstance(
                  gh_pack, bool
              ), "gh_pack should be bool, indicating if the gh is packed"
              if not gh_pack:
                  logger.info("not using gh pack to split")
              return self._guest_split(
                  ctx,
                  histogram_statistic_result,
                  cur_layer_node,
                  node_map,
                  sk,
                  coder,
                  gh_pack,
                  pack_info,
              )
          elif ctx.is_on_host:
              return self._host_split(
                  ctx, histogram_statistic_result, cur_layer_node
              )
          else:
              raise ValueError("illegal role {}".format(ctx.role))
  
imports: import torch
  import numpy
  import logging
  from fate.arch.dataframe import DataFrame
  from fate.arch import Context
  from fate.arch.histogram import DistributedHistogram
label_desc: Use image node_id 17 for calling the SBTSplitter obj's underlying member method code with example usage: obj.split(ctx, histogram_statistic_result, cur_layer_node, node_map, local_split, sk, coder, gh_pack, pack_info) and returns: best_slits, self, self