class_docstr: Raymarch using the Emission-Absorption (EA) algorithm.
  
  The algorithm independently renders each ray by analyzing density and
  feature values sampled at (typically uniformly) spaced 3D locations along
  each ray. The density values `rays_densities` are of shape
  `(..., n_points_per_ray)`, their values should range between [0, 1], and
  represent the opaqueness of each point (the higher the less transparent).
  The feature values `rays_features` of shape
  `(..., n_points_per_ray, feature_dim)` represent the content of the
  point that is supposed to be rendered in case the given point is opaque
  (i.e. its density -> 1.0).
  
  EA first utilizes `rays_densities` to compute the absorption function
  along each ray as follows::
  
      absorption = cumprod(1 - rays_densities, dim=-1)
  
  The value of absorption at position `absorption[..., k]` specifies
  how much light has reached `k`-th point along a ray since starting
  its trajectory at `k=0`-th point.
  
  Each ray is then rendered into a tensor `features` of shape `(..., feature_dim)`
  by taking a weighed combination of per-ray features `rays_features` as follows::
  
      weights = absorption * rays_densities
      features = (rays_features * weights).sum(dim=-2)
  
  Where `weights` denote a function that has a strong peak around the location
  of the first surface point that a given ray passes through.
  
  Note that for a perfectly bounded volume (with a strictly binary density),
  the `weights = cumprod(1 - rays_densities, dim=-1) * rays_densities`
  function would yield 0 everywhere. In order to prevent this,
  the result of the cumulative product is shifted `self.surface_thickness`
  elements along the ray direction.
docstr: Args:
      surface_thickness: Denotes the overlap between the absorption
          function and the density function.
docstr_tok: ["Args",":","surface_thickness",":","Denotes","the","overlap","between","the","absorption","function","and","the","density","function","."]
code: def __init__(self, surface_thickness: int = 1) -> None:
      """
      Args:
          surface_thickness: Denotes the overlap between the absorption
              function and the density function.
      """
      super().__init__()
      self.surface_thickness = surface_thickness
  
file_path: pytorch3d/pytorch3d/renderer/implicit/raymarching.py
imports: import warnings
  from typing import Optional, Tuple, Union
  import torch
label_desc: Use image node_id 1 to create a new EmissionAbsorptionRaymarcher object from inherited base classes: torch.nn with example: obj = EmissionAbsorptionRaymarcher(surface_thickness)