code: def test_custom_arm_ids(self, name, cls):
      # arm 0 earns no rewards, so we specify arm_ids 1,...,N explicitly
      n_arms = 5
      b = cls(n_arms=n_arms)
      n_obs_per_arm = torch.randint(0, 100, size=(n_arms - 1,)).float()
      n_success_per_arm = torch.rand(size=(n_arms - 1,)) * n_obs_per_arm
      b.add_batch_observations(
          n_obs_per_arm,
          n_success_per_arm,
          n_success_per_arm,
          arm_ids=list(map(str, range(1, n_arms))),
      )
  
      self.assertEqual(b.total_n_obs_per_arm[0], 0)
      npt.assert_array_equal(
          n_obs_per_arm.numpy(), b.total_n_obs_per_arm[1:].numpy()
      )
      npt.assert_array_equal(
          n_success_per_arm.numpy(),
          b.total_sum_reward_per_arm[1:].numpy(),
      )
      npt.assert_array_equal(
          n_success_per_arm.numpy(),
          b.total_sum_reward_squared_per_arm[1:].numpy(),
      )
  
imports: import unittest
  from io import BytesIO
  from itertools import cycle
  from unittest import mock
  import numpy
  import numpy.testing
  import torch
  from parameterized.parameterized import parameterized
  from pytorch_lightning import seed_everything
  from reagent.mab.mab_algorithm import get_arm_indices, place_values_at_indices, randomized_argmax, reindex_multiple_tensors
  from reagent.mab.simulation import BernoilliMAB, compare_bandit_algos, multiple_evaluations_bandit_algo, single_evaluation_bandit_algo
  from reagent.mab.thompson_sampling import BaseThompsonSampling, BernoulliBetaThompson, NormalGammaThompson
  from reagent.mab.ucb import BaseUCB, MetricUCB, UCB1, UCBTuned
label_desc: Use image node_id 6 for calling the TestMAB obj's underlying member method code with example usage: obj.test_custom_arm_ids(name, cls) without return types