code: def node_feat_mask(self, data, h):
      # print(data.x[:,1])
      logits = self.node_feat_mask_mlp(h)
      sample_logits = logits.detach() * self.temperature
      mask = Bernoulli(logits=sample_logits).sample()
  
      if self.magnitude is not None:
          keep_mask = (
              torch.empty(data.x.shape, dtype=torch.float32).uniform_(
                  0, 1
              )
              > self.magnitude
          )
          mask[keep_mask] = 0.0
  
      x = data.x.detach().clone()
      if self.mask_type == MaskType.ZERO:
          x = x * (1.0 - mask)
      elif self.mask_type == MaskType.GAUSSIAN:
          mask = mask.bool()
          x[mask] = x[mask].normal_(0.0, 0.5)
  
      new_data = Data(x=x, edge_index=data.edge_index, y=data.y)
  
      if self.training:
          log_likelihood = -F.binary_cross_entropy_with_logits(
              logits * self.temperature, mask, reduction="sum"
          )
          return new_data, log_likelihood
  
      return new_data, None
  
file_path: DIG/dig/auggraph/method/GraphAug/aug/node_fm.py
imports: import torch
  import torch.nn.functional
  from torch.distributions.bernoulli import Bernoulli
  from torch_geometric.data import Data
  from ..constants import *
label_desc: Use image node_id 4 for calling the NodeFM obj's underlying member method code with example usage: obj.node_feat_mask(data, h) and returns: new_data,  None, new_data,  log_likelihood