code: def hwe_normalized_pca(
      call_expr, k=10, compute_loadings=False
  ) -> Tuple[List[float], Table, Table]:
      r"""Run principal component analysis (PCA) on the Hardy-Weinberg-normalized
      genotype call matrix.
  
      Examples
      --------
  
      >>> eigenvalues, scores, loadings = hl.hwe_normalized_pca(dataset.GT, k=5)
  
      Notes
      -----
      This method specializes :func:`.pca` for the common use case
      of PCA in statistical genetics, that of projecting samples to a small
      number of ancestry coordinates. Variants that are all homozygous reference
      or all homozygous alternate are unnormalizable and removed before
      evaluation. See :func:`.pca` for more details.
  
      Users of PLINK/GCTA should be aware that Hail computes the GRM slightly
      differently with regard to missing data. In Hail, the
      :math:`ij` entry of the GRM :math:`MM^T` is simply the dot product of rows
      :math:`i` and :math:`j` of :math:`M`; in terms of :math:`C` it is
  
      .. math::
  
        \frac{1}{m}\sum_{l\in\mathcal{C}_i\cap\mathcal{C}_j}\frac{(C_{il}-2p_l)(C_{jl} - 2p_l)}{2p_l(1-p_l)}
  
      where :math:`\mathcal{C}_i = \{l \mid C_{il} \text{ is non-missing}\}`. In
      PLINK/GCTA the denominator :math:`m` is replaced with the number of terms in
      the sum :math:`\lvert\mathcal{C}_i\cap\mathcal{C}_j\rvert`, i.e. the
      number of variants where both samples have non-missing genotypes. While this
      is arguably a better estimator of the true GRM (trading shrinkage for
      noise), it has the drawback that one loses the clean interpretation of the
      loadings and scores as features and projections
  
      Separately, for the PCs PLINK/GCTA output the eigenvectors of the GRM, i.e.
      the left singular vectors :math:`U_k` instead of the component scores
      :math:`U_k S_k`. The scores have the advantage of representing true
      projections of the data onto features with the variance of a score
      reflecting the variance explained by the corresponding feature. In PC
      bi-plots this amounts to a change in aspect ratio; for use of PCs as
      covariates in regression it is immaterial.
  
      Parameters
      ----------
      call_expr : :class:`.CallExpression`
          Entry-indexed call expression.
      k : :obj:`int`
          Number of principal components.
      compute_loadings : :obj:`bool`
          If ``True``, compute row loadings.
  
      Returns
      -------
      (:obj:`list` of :obj:`float`, :class:`.Table`, :class:`.Table`)
          List of eigenvalues, table with column scores, table with row loadings.
      """
      from hail.backend.service_backend import ServiceBackend
  
      if isinstance(hl.current_backend(), ServiceBackend):
          return _hwe_normalized_blanczos(
              call_expr, k, compute_loadings
          )
  
      return pca(hwe_normalize(call_expr), k, compute_loadings)
  
imports: from typing import List, Tuple
  import hail
  import hail.expr.aggregators
  from hail.expr.expressions import construct_expr
  from hail.expr import expr_float64, expr_call, raise_unless_entry_indexed, matrix_table_source
  from hail import ir
  from hail.table import Table
  from hail.typecheck import typecheck, oneof, nullable
  from hail.utils import FatalError
  from hail.utils.java import Env, info
  from hail.experimental import mt_to_table_of_ndarray
label_desc: Use image node_id 2 for calling a global function with example usage: hwe_normalized_pca(call_expr, k, compute_loadings) and returns: pca, _hwe_normalized_blanczos