class_docstr: GPU cached feature wrapping a fallback feature.
  
  Places the GPU cache to torch.cuda.current_device().
  
  Parameters
  ----------
  fallback_feature : Feature
      The fallback feature.
  cache_size : int
      The capacity of the GPU cache, the number of features to store.
  
  Examples
  --------
  >>> import torch
  >>> from dgl import graphbolt as gb
  >>> torch_feat = torch.arange(10).reshape(2, -1).to("cuda")
  >>> cache_size = 5
  >>> fallback_feature = gb.TorchBasedFeature(torch_feat)
  >>> feature = gb.GPUCachedFeature(fallback_feature, cache_size)
  >>> feature.read()
  tensor([[0, 1, 2, 3, 4],
          [5, 6, 7, 8, 9]], device='cuda:0')
  >>> feature.read(torch.tensor([0]).to("cuda"))
  tensor([[0, 1, 2, 3, 4]], device='cuda:0')
  >>> feature.update(torch.tensor([[1 for _ in range(5)]]).to("cuda"),
  ...                torch.tensor([1]).to("cuda"))
  >>> feature.read(torch.tensor([0, 1]).to("cuda"))
  tensor([[0, 1, 2, 3, 4],
          [1, 1, 1, 1, 1]], device='cuda:0')
  >>> feature.size()
  torch.Size([5])
docstr: Update the feature.
  
  Parameters
  ----------
  value : torch.Tensor
      The updated value of the feature.
  ids : torch.Tensor, optional
      The indices of the feature to update. If specified, only the
      specified indices of the feature will be updated. For the feature,
      the `ids[i]` row is updated to `value[i]`. So the indices and value
      must have the same length. If None, the entire feature will be
      updated.
docstr_tok: ["Update","the","feature",".","Parameters","--","--","--","--","--","value",":","torch.Tensor","The","updated","value","of","the","feature",".","ids",":","torch.Tensor",",","optional","The","indices","of","the","feature","to","update",".","If","specified",",","only","the","specified","indices","of","the","feature","will","be","updated",".","For","the","feature",",","the","`","ids","[","i","]","`","row","is","updated","to","`","value","[","i","]","`",".","So","the","indices","and","value","must","have","the","same","length",".","If","None",",","the","entire","feature","will","be","updated","."]
code: def update(self, value: torch.Tensor, ids: torch.Tensor = None):
      """Update the feature.
  
      Parameters
      ----------
      value : torch.Tensor
          The updated value of the feature.
      ids : torch.Tensor, optional
          The indices of the feature to update. If specified, only the
          specified indices of the feature will be updated. For the feature,
          the `ids[i]` row is updated to `value[i]`. So the indices and value
          must have the same length. If None, the entire feature will be
          updated.
      """
      if ids is None:
          self._fallback_feature.update(value)
          size = min(self.cache_size, value.shape[0])
          self._feature.replace(
              torch.arange(0, size, device="cuda"),
              value[:size].to("cuda").reshape(self.flat_shape),
          )
      else:
          self._fallback_feature.update(value, ids)
          self._feature.replace(
              ids.to("cuda"), value.to("cuda").reshape(self.flat_shape)
          )
  
file_path: dgl/python/dgl/graphbolt/impl/gpu_cached_feature.py
imports: import torch
  from dgl.cuda import GPUCache
  from ..feature_store import Feature
label_desc: Use image node_id 4 for calling the GPUCachedFeature obj's underlying member method code with example usage: obj.update(value, ids) without return types