code: def _assemble_tree(self, tree):
      if "leaf_value" in tree:
          return ast.NumVal(tree["leaf_value"])
  
      threshold = ast.NumVal(tree["threshold"])
      feature_ref = ast.FeatureRef(tree["split_feature"])
  
      op = ast.CompOpType.from_str_op(tree["decision_type"])
      assert op == ast.CompOpType.LTE, "Unexpected comparison op"
  
      missing_type = tree["missing_type"]
  
      if missing_type not in {"NaN", "None"}:
          raise ValueError(f"Unknown missing_type: {missing_type}")
  
      reverse_condition = missing_type == "NaN" and tree["default_left"]
      reverse_condition |= (
          missing_type == "None" and tree["threshold"] >= 0
      )
      if reverse_condition:
          op = ast.CompOpType.GT
          true_child = tree["right_child"]
          false_child = tree["left_child"]
      else:
          true_child = tree["left_child"]
          false_child = tree["right_child"]
  
      return ast.IfExpr(
          ast.CompExpr(feature_ref, threshold, op),
          self._assemble_tree(true_child),
          self._assemble_tree(false_child),
      )
  
imports: import json
  import math
  import numpy
  from m2cgen import ast
  from m2cgen.assemblers import utils
  from m2cgen.assemblers.base import ModelAssembler
  from m2cgen.assemblers.linear import _linear_to_ast
label_desc: Use image node_id 11 for calling the LightGBMModelAssembler obj's underlying member method code with example usage: obj._assemble_tree(tree) and returns: ast, ast