code: def _calculate_storage_specific_sizes(
      storage: int,
      shape: torch.Size,
      shard_sizes: List[List[int]],
      sharding_type: str,
      optimizer_class: Optional[Type[torch.optim.Optimizer]] = None,
  ) -> List[int]:
      tensor_sizes: List[int] = [
          math.ceil(storage * prod(size) / prod(shape))
          if sharding_type != ShardingType.DATA_PARALLEL.value
          else storage
          for size in shard_sizes
      ]
      optimizer_multipler: float = _get_optimizer_multipler(
          optimizer_class, shape
      )
  
      optimizer_sizes: List[int] = [
          math.ceil(tensor_size * optimizer_multipler)
          for tensor_size in tensor_sizes
      ]
  
      return [
          tensor_size + optimizer_size
          for tensor_size, optimizer_size in zip(
              tensor_sizes, optimizer_sizes
          )
      ]
  
imports: import logging
  import math
  from typing import cast, Dict, List, Optional, Tuple, Type
  import torch
  import torchrec.optim
  from torch import nn
  from torchrec.distributed.embedding_types import EmbeddingComputeKernel
  from torchrec.distributed.planner.constants import BATCHED_COPY_PERF_FACTOR, BIGINT_DTYPE, DP_ELEMENTWISE_KERNELS_PERF_FACTOR, FULL_BLOCK_EMB_DIM, HALF_BLOCK_PENALTY, kernel_bw_lookup, QUARTER_BLOCK_PENALTY, UVM_CACHING_RATIO, WEIGHTED_KERNEL_MULTIPLIER
  from torchrec.distributed.planner.types import ParameterConstraints, Perf, PlannerError, ShardEstimator, ShardingOption, Storage, Topology
  from torchrec.distributed.planner.utils import prod, sharder_name
  from torchrec.distributed.types import CacheStatistics, CommOp, ModuleSharder, ShardingType
  from torchrec.modules.embedding_modules import EmbeddingBagCollectionInterface
label_desc: Use image node_id 15 for calling a global function with example usage: _calculate_storage_specific_sizes(storage, shape, shard_sizes, sharding_type, optimizer_class) and returns: unknown