class_docstr: This dimension is a member of a decomposition of the input dim.
  
  Note that input_dim itself could be a Flattened set of input dims.
code: def new(
      cls, dim: DimSpec, group_shape: Tuple[int, ...], idx: int
  ) -> DimSpec:
      assert len(group_shape) > 0
      if len(group_shape) == 1:
          # not really a group, just return the input dim back
          assert idx == 0
          return dim
      elif group_shape[idx] == 1:
          return Singleton()
      else:
          # remove singletons from group
          # group_mapping = [(new_index, (shape, old_index)) ...]
          group_mapping = list(
              enumerate(
                  (s, i) for i, s in enumerate(group_shape) if s != 1
              )
          )
          new_group_shape = tuple(m[1][0] for m in group_mapping)
          new_idx = next(
              filter(lambda x: x[1][1] == idx, group_mapping)
          )[0]
          return Split(dim, new_group_shape, new_idx)
  
imports: from dataclasses import dataclass
  from typing import Callable, cast, Dict, Iterable, Optional, Sequence, Set, Tuple, Union
  import torch
  from torch import Tensor
  from torch._subclasses.fake_tensor import unset_fake_temporarily
  from torch.distributed._tensor._utils import compute_local_shape
  from torch.distributed._tensor.api import Shard
  from torch.distributed._tensor.op_schema import OpSchema, OutputSharding, RuntimeSchemaInfo
  from torch.distributed._tensor.ops.utils import normalize_dim, normalize_dims, prod, register_prop_rule
  from torch.distributed._tensor.placement_types import DTensorSpec, Placement, Replicate
  from torch.fx.experimental.proxy_tensor import disable_proxy_modes_tracing
label_desc: Use image node_id 1 for calling the Split obj's underlying member method code with example usage: obj.new(cls, dim, group_shape, idx) and returns: dim, Singleton, Split