code: def save_used_properties(func):
      @functools.wraps(func)
      def wrapper(self, *args, **kwargs):
          # Save used_properties for mocking dataset when calling pretrained registry
          result = func(self, *args, **kwargs)
          if isinstance(result, torch.Tensor):
              self.used_properties[
                  func.__name__
              ] = result.numpy().tolist()
          elif isinstance(result, np.ndarray):
              self.used_properties[func.__name__] = result.tolist()
          else:
              self.used_properties[func.__name__] = result
          return result
  
      return wrapper
  
imports: import os
  from abc import ABC, abstractmethod
  import logging
  import functools
  from functools import partial
  import numpy
  import torch
  import torch_geometric
  from torch_geometric.transforms import Compose, FixedPoints
  import copy
  from torch_points3d.models import model_interface
  from torch_points3d.core.data_transform import instantiate_transforms, MultiScaleTransform
  from torch_points3d.core.data_transform import instantiate_filters
  from torch_points3d.datasets.batch import SimpleBatch
  from torch_points3d.datasets.multiscale_data import MultiScaleBatch
  from torch_points3d.utils.enums import ConvolutionFormat
  from torch_points3d.utils.config import ConvolutionFormatFactory
  from torch_points3d.utils.colors import COLORS, colored_print
label_desc: Use image node_id 2 for calling a global function with example usage: save_used_properties(func) and returns: wrapper, result