class_docstr: The feature propagation operator from the `"On the Unreasonable
  Effectiveness of Feature propagation in Learning on Graphs with Missing
  Node Features" <https://arxiv.org/abs/2111.12128>`_ paper
  (functional name: :obj:`feature_propagation`).
  
  .. math::
      \mathbf{X}^{(0)} &= (1 - \mathbf{M}) \cdot \mathbf{X}
  
      \mathbf{X}^{(\ell + 1)} &= \mathbf{X}^{(0)} + \mathbf{M} \cdot
      (\mathbf{D}^{-1/2} \mathbf{A} \mathbf{D}^{-1/2} \mathbf{X}^{(\ell)})
  
  where missing node features are inferred by known features via propagation.
  
  .. code-block:: python
  
      from torch_geometric.transforms import FeaturePropagation
  
      transform = FeaturePropagation(missing_mask=torch.isnan(data.x))
      data = transform(data)
  
  Args:
      missing_mask (torch.Tensor): Mask matrix
          :math:`\mathbf{M} \in {\{ 0, 1 \}}^{N\times F}` indicating missing
          node features.
      num_iterations (int, optional): The number of propagations.
          (default: :obj:`40`)
class_docstr_tok: ["The","feature","propagation","operator","from","the","`","``","On","the","Unreasonable","Effectiveness","of","Feature","propagation","in","Learning","on","Graphs","with","Missing","Node","Features","''","<","https",":","\/\/arxiv.org\/abs\/2111.12128",">","`","_","paper","(","functional","name",":",":","obj",":","`","feature_propagation","`",")",".","..","math",":",":","\\mathbf","{","X","}","^","{","(","0",")","}","&","=","(","1","-","\\mathbf","{","M","}",")","\\cdot","\\mathbf","{","X","}","\\mathbf","{","X","}","^","{","(","\\ell","+","1",")","}","&","=","\\mathbf","{","X","}","^","{","(","0",")","}","+","\\mathbf","{","M","}","\\cdot","(","\\mathbf","{","D","}","^","{","-1\/2","}","\\mathbf","{","A","}","\\mathbf","{","D","}","^","{","-1\/2","}","\\mathbf","{","X","}","^","{","(","\\ell",")","}",")","where","missing","node","features","are","inferred","by","known","features","via","propagation",".","..","code-block",":",":","python","from","torch_geometric.transforms","import","FeaturePropagation","transform","=","FeaturePropagation","(","missing_mask=torch.isnan","(","data.x",")",")","data","=","transform","(","data",")","Args",":","missing_mask","(","torch.Tensor",")",":","Mask","matrix",":","math",":","`","\\mathbf","{","M","}","\\in","{","\\","{","0",",","1","\\","}","}","^","{","N\\times","F","}","`","indicating","missing","node","features",".","num_iterations","(","int",",","optional",")",":","The","number","of","propagations",".","(","default",":",":","obj",":","`","40","`",")"]
code: def __repr__(self) -> str:
      na_values = (
          int(self.missing_mask.sum()) / self.missing_mask.numel()
      )
      return (
          f"{self.__class__.__name__}("
          f"missing_features={100 * na_values:.1f}%, "
          f"num_iterations={self.num_iterations})"
      )
  
file_path: pytorch_geometric/torch_geometric/transforms/feature_propagation.py
imports: from torch import Tensor
  import torch_geometric
  from torch_geometric.data import Data
  from torch_geometric.data.datapipes import functional_transform
  from torch_geometric.transforms import BaseTransform
  from torch_geometric.utils import is_torch_sparse_tensor, to_torch_csc_tensor
label_desc: Use image node_id 3 for calling the FeaturePropagation obj's underlying member method code with example usage: obj.__repr__() and returns: self, str, unknown, str, self, str