code: def eigh(nd, eigvals_only=False):
      """Performs an eigenvalue decomposition of a symmetric matrix.
  
      Parameters
      ----------
      nd : :class:`.NDArrayNumericExpression`
          A 2 dimensional ndarray, shape(N, N).
      eigvals_only: :class:`.bool`
          If False (default), compute the eigenvectors and eigenvalues. Otherwise, only compute eigenvalues.
  
      Returns
      -------
      - w: :class:`.NDArrayNumericExpression`
          The eigenvalues, shape(N).
      - v: :class:`.NDArrayNumericExpression`
          The eigenvectors, shape(N, N). Only returned if eigvals_only is false.
      """
      float_nd = nd.map(lambda x: hl.float64(x))
      ir = NDArrayEigh(float_nd._ir, eigvals_only)
  
      return_type = (
          tndarray(tfloat64, 1)
          if eigvals_only
          else ttuple(tndarray(tfloat64, 1), tndarray(tfloat64, 2))
      )
      return construct_expr(
          ir, return_type, nd._indices, nd._aggregations
      )
  
imports: from functools import reduce
  import hail
  from hail.expr.functions import _ndarray
  from hail.expr.functions import array
  from hail.expr.types import HailType, tfloat64, tfloat32, ttuple, tndarray
  from hail.typecheck import typecheck, nullable, oneof, tupleof, sequenceof
  from hail.expr.expressions import expr_int32, expr_int64, expr_tuple, expr_any, expr_array, expr_ndarray, expr_numeric, Int64Expression, cast_expr, construct_expr, expr_bool, unify_all
  from hail.expr.expressions.typed_expressions import NDArrayNumericExpression
  from hail.ir import NDArrayQR, NDArrayInv, NDArrayConcat, NDArraySVD, NDArrayEigh, Apply
label_desc: Use image node_id 13 for calling a global function with example usage: eigh(nd, eigvals_only) and returns: construct_expr