class_docstr: Computes the Normalized Surface Dice (NSD) for each batch sample and class of
  predicted segmentations `y_pred` and corresponding reference segmentations `y` according to equation :eq:`nsd`.
  This implementation is based on https://arxiv.org/abs/2111.05408 and supports 2D and 3D images.
  Be aware that by default (`use_subvoxels=False`), the computation of boundaries is different from DeepMind's
  implementation https://github.com/deepmind/surface-distance.
  In this implementation, the length/area of a segmentation boundary is
  interpreted as the number of its edge pixels. In DeepMind's implementation, the length of a segmentation boundary
  depends on the local neighborhood (cf. https://arxiv.org/abs/1809.04430).
  This issue is discussed here: https://github.com/Project-MONAI/MONAI/issues/4103.
  
  The class- and batch sample-wise NSD values can be aggregated with the function `aggregate`.
  
  Example of the typical execution steps of this metric class follows :py:class:`monai.metrics.metric.Cumulative`.
  
  Args:
      class_thresholds: List of class-specific thresholds.
          The thresholds relate to the acceptable amount of deviation in the segmentation boundary in pixels.
          Each threshold needs to be a finite, non-negative number.
      include_background: Whether to include NSD computation on the first channel of the predicted output.
          Defaults to ``False``.
      distance_metric: The metric used to compute surface distances.
          One of [``"euclidean"``, ``"chessboard"``, ``"taxicab"``].
          Defaults to ``"euclidean"``.
      reduction: define mode of reduction to the metrics, will only apply reduction on `not-nan` values,
          available reduction modes: {``"none"``, ``"mean"``, ``"sum"``, ``"mean_batch"``, ``"sum_batch"``,
          ``"mean_channel"``, ``"sum_channel"``}, default to ``"mean"``. if "none", will not do reduction.
      get_not_nans: whether to return the `not_nans` count.
          Defaults to ``False``.
          `not_nans` is the number of batch samples for which not all class-specific NSD values were nan values.
          If set to ``True``, the function `aggregate` will return both the aggregated NSD and the `not_nans` count.
          If set to ``False``, `aggregate` will only return the aggregated NSD.
      use_subvoxels: Whether to use subvoxel distances. Defaults to ``False``.
docstr: Args:
      y_pred: Predicted segmentation, typically segmentation model output.
          It must be a one-hot encoded, batch-first tensor [B,C,H,W] or [B,C,H,W,D].
      y: Reference segmentation.
          It must be a one-hot encoded, batch-first tensor [B,C,H,W] or [B,C,H,W,D].
      kwargs: additional parameters: ``spacing`` should be passed to correctly compute the metric.
          ``spacing``: spacing of pixel (or voxel). This parameter is relevant only
          if ``distance_metric`` is set to ``"euclidean"``.
          If a single number, isotropic spacing with that value is used for all images in the batch. If a sequence of numbers,
          the length of the sequence must be equal to the image dimensions.
          This spacing will be used for all images in the batch.
          If a sequence of sequences, the length of the outer sequence must be equal to the batch size.
          If inner sequence has length 1, isotropic spacing with that value is used for all images in the batch,
          else the inner sequence length must be equal to the image dimensions. If ``None``, spacing of unity is used
          for all images in batch. Defaults to ``None``.
          use_subvoxels: Whether to use subvoxel distances. Defaults to ``False``.
  
  
  Returns:
      Pytorch Tensor of shape [B,C], containing the NSD values :math:`\operatorname {NSD}_{b,c}` for each batch
      index :math:`b` and class :math:`c`.
docstr_tok: ["Args",":","y_pred",":","Predicted","segmentation",",","typically","segmentation","model","output",".","It","must","be","a","one-hot","encoded",",","batch-first","tensor","[","B",",","C",",","H",",","W","]","or","[","B",",","C",",","H",",","W",",","D","]",".","y",":","Reference","segmentation",".","It","must","be","a","one-hot","encoded",",","batch-first","tensor","[","B",",","C",",","H",",","W","]","or","[","B",",","C",",","H",",","W",",","D","]",".","kwargs",":","additional","parameters",":","``","spacing","``","should","be","passed","to","correctly","compute","the","metric",".","``","spacing","``",":","spacing","of","pixel","(","or","voxel",")",".","This","parameter","is","relevant","only","if","``","distance_metric","``","is","set","to","``","``","euclidean","''","``",".","If","a","single","number",",","isotropic","spacing","with","that","value","is","used","for","all","images","in","the","batch",".","If","a","sequence","of","numbers",",","the","length","of","the","sequence","must","be","equal","to","the","image","dimensions",".","This","spacing","will","be","used","for","all","images","in","the","batch",".","If","a","sequence","of","sequences",",","the","length","of","the","outer","sequence","must","be","equal","to","the","batch","size",".","If","inner","sequence","has","length","1",",","isotropic","spacing","with","that","value","is","used","for","all","images","in","the","batch",",","else","the","inner","sequence","length","must","be","equal","to","the","image","dimensions",".","If","``","None","``",",","spacing","of","unity","is","used","for","all","images","in","batch",".","Defaults","to","``","None","``",".","use_subvoxels",":","Whether","to","use","subvoxel","distances",".","Defaults","to","``","False","``",".","Returns",":","Pytorch","Tensor","of","shape","[","B",",","C","]",",","containing","the","NSD","values",":","math",":","`","\\operatorname","{","NSD","}","_","{","b",",","c","}","`","for","each","batch","index",":","math",":","`","b","`","and","class",":","math",":","`","c","`","."]
code: def _compute_tensor(self, y_pred: torch.Tensor, y: torch.Tensor, **kwargs: Any) -> torch.Tensor:  # type: ignore[override]
      r"""
      Args:
          y_pred: Predicted segmentation, typically segmentation model output.
              It must be a one-hot encoded, batch-first tensor [B,C,H,W] or [B,C,H,W,D].
          y: Reference segmentation.
              It must be a one-hot encoded, batch-first tensor [B,C,H,W] or [B,C,H,W,D].
          kwargs: additional parameters: ``spacing`` should be passed to correctly compute the metric.
              ``spacing``: spacing of pixel (or voxel). This parameter is relevant only
              if ``distance_metric`` is set to ``"euclidean"``.
              If a single number, isotropic spacing with that value is used for all images in the batch. If a sequence of numbers,
              the length of the sequence must be equal to the image dimensions.
              This spacing will be used for all images in the batch.
              If a sequence of sequences, the length of the outer sequence must be equal to the batch size.
              If inner sequence has length 1, isotropic spacing with that value is used for all images in the batch,
              else the inner sequence length must be equal to the image dimensions. If ``None``, spacing of unity is used
              for all images in batch. Defaults to ``None``.
              use_subvoxels: Whether to use subvoxel distances. Defaults to ``False``.
  
  
      Returns:
          Pytorch Tensor of shape [B,C], containing the NSD values :math:`\operatorname {NSD}_{b,c}` for each batch
          index :math:`b` and class :math:`c`.
      """
      return compute_surface_dice(
          y_pred=y_pred,
          y=y,
          class_thresholds=self.class_thresholds,
          include_background=self.include_background,
          distance_metric=self.distance_metric,
          spacing=kwargs.get("spacing"),
          use_subvoxels=self.use_subvoxels,
      )
  
file_path: MONAI/monai/metrics/surface_dice.py
imports: from __future__ import annotations
  from collections.abc import Sequence
  from typing import Any
  import numpy
  import torch
  from monai.metrics.utils import do_metric_reduction, get_edge_surface_distance, ignore_background, prepare_spacing
  from monai.utils import MetricReduction
  from .metric import CumulativeIterationMetric
label_desc: Use image node_id 2 for calling the SurfaceDiceMetric obj's underlying member method code with example usage: obj._compute_tensor(y_pred, y) and returns: compute_surface_dice