docstr: Computes a new set of features going from the query resolution position to the support
  resolution position
  Args:
      - query: data structure that holds the low res data (position + features)
      - support: data structure that holds the position to which we will interpolate
  Returns:
      - torch.tensor: interpolated features
docstr_tok: ["Computes","a","new","set","of","features","going","from","the","query","resolution","position","to","the","support","resolution","position","Args",":","-","query",":","data","structure","that","holds","the","low","res","data","(","position","+","features",")","-","support",":","data","structure","that","holds","the","position","to","which","we","will","interpolate","Returns",":","-","torch.tensor",":","interpolated","features"]
code: def __call__(self, query, support, precomputed: Data = None):
      """Computes a new set of features going from the query resolution position to the support
      resolution position
      Args:
          - query: data structure that holds the low res data (position + features)
          - support: data structure that holds the position to which we will interpolate
      Returns:
          - torch.tensor: interpolated features
      """
      if precomputed:
          num_points = support.pos.size(0)
          if num_points != precomputed.num_nodes:
              raise ValueError(
                  "Precomputed indices do not match with the data given to the transform"
              )
  
          x = query.x
          x_idx, y_idx, weights, normalisation = (
              precomputed.x_idx,
              precomputed.y_idx,
              precomputed.weights,
              precomputed.normalisation,
          )
          y = scatter_add(
              x[x_idx] * weights, y_idx, dim=0, dim_size=num_points
          )
          y = y / normalisation
          return y
  
      x, pos = query.x, query.pos
      pos_support = support.pos
      if hasattr(support, "batch"):
          batch_support = support.batch
      else:
          batch_support = torch.zeros(
              (support.num_nodes,), dtype=torch.long
          )
      if hasattr(query, "batch"):
          batch = query.batch
      else:
          batch = torch.zeros((query.num_nodes,), dtype=torch.long)
  
      return knn_interpolate(
          x, pos, pos_support, batch, batch_support, k=self.k
      )
  
imports: import torch
  from torch_geometric.nn import knn_interpolate, knn
  from torch_scatter import scatter_add
  from torch_geometric.data import Data
label_desc: Use image node_id 3 for calling the KNNInterpolate obj's underlying member method code with example usage: obj.__call__(query, support, precomputed) and returns: knn_interpolate, y