code: def __init__(
      self,
      max_depth=3,
      valid_features=None,
      use_missing=False,
      zero_as_missing=False,
      goss=False,
      l1=0.1,
      l2=0,
      min_impurity_split=1e-2,
      min_sample_split=2,
      min_leaf_node=1,
      min_child_weight=1,
      objective=None,
      gh_pack=True,
      split_info_pack=True,
      hist_sub=True,
      tree_mode=ALL_FEAT,
  ):
      super().__init__(
          max_depth,
          use_missing=use_missing,
          zero_as_missing=zero_as_missing,
          valid_features=valid_features,
      )
      self.host_sitenames = None
      self._tree_node_num = 0
      self.hist_builder = None
      self.splitter = None
  
      # feature control
      self._tree_mode = tree_mode
      assert self._tree_mode in [
          ALL_FEAT,
          GUEST_FEAT_ONLY,
      ], "tree mode {} not supported".format(self._tree_mode)
      # is local tree
      if self._tree_mode == GUEST_FEAT_ONLY:
          self._is_local_tree = True
      elif self._tree_mode == ALL_FEAT:
          self._is_local_tree = False
  
      # regularization
      self.l1 = l1
      self.l2 = l2
      self.min_impurity_split = min_impurity_split
      self.min_sample_split = min_sample_split
      self.min_leaf_node = min_leaf_node
      self.min_child_weight = min_child_weight
  
      # goss
      self.goss = goss
  
      # other
      self._valid_features = valid_features
      self._hist_sub = hist_sub
  
      # homographic encryption
      self._encrypt_kit = None
      self._sk = None
      self._pk = None
      self._coder = None
      self._evaluator = None
      self._encryptor = None
      self._decryptor = None
  
      # for g, h packing
      self._en_key_length = None
      self._gh_pack = gh_pack
      self._split_info_pack = split_info_pack
      self._g_offset = 0
      self._g_abs_max = 0
      self._h_abs_max = 0
      self._objective = objective
      if gh_pack:
          if objective is None:
              raise ValueError(
                  "objective must be specified when gh_pack is True"
              )
      self._pack_info = {}
  
      # param checking
      assert (
          l1 >= 0 and l2 >= 0
      ), "l1 and l2 should be non-negative, got l1: {}, l2: {}".format(
          l1, l2
      )
  
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 1 to create a new HeteroDecisionTreeGuest object from inherited base classes: DecisionTree with example: obj = HeteroDecisionTreeGuest(max_depth, valid_features, use_missing, zero_as_missing, goss, l1, l2, min_impurity_split, min_sample_split, min_leaf_node, min_child_weight, objective, gh_pack, split_info_pack, hist_sub, tree_mode)