code: def test_batch(self):
      x = torch.tensor([1])
      pos = x
      d1 = Data(x=x, pos=pos)
      d2 = Data(x=4 * x, pos=4 * pos)
      data1 = MultiScaleData(x=x, pos=pos, multiscale=[d1, d2])
  
      x = torch.tensor([2])
      pos = x
      d1 = Data(x=x, pos=pos)
      d2 = Data(x=4 * x, pos=4 * pos)
      data2 = MultiScaleData(x=x, pos=pos, multiscale=[d1, d2])
  
      batch = MultiScaleBatch.from_data_list([data1, data2])
      tt.assert_allclose(batch.x, torch.tensor([1, 2]))
      tt.assert_allclose(batch.batch, torch.tensor([0, 1]))
  
      ms_batches = batch.multiscale
      tt.assert_allclose(ms_batches[0].batch, torch.tensor([0, 1]))
      tt.assert_allclose(ms_batches[1].batch, torch.tensor([0, 1]))
      tt.assert_allclose(ms_batches[1].x, torch.tensor([4, 8]))
  
file_path: torch-points3d/test/test_msdata.py
imports: import unittest
  import torch
  import torch.testing
  from torch_geometric.data import Data
  from torch_points3d.datasets.multiscale_data import MultiScaleBatch, MultiScaleData
label_desc: Use image node_id 2 for calling the TestMSData obj's underlying member method code with example usage: obj.test_batch() without return types