class_docstr: Reserves storage for model to be sharded with heuristical calculation. The storage
  reservation is comprised of dense tensor storage, KJT storage, and an extra
  percentage of total storage.
  
  Args:
      percentage (float): extra storage percent to reserve that acts as a margin of
          error beyond heuristic calculation of storage.
      parameter_multiplier (float): heuristic multiplier for total parameter storage.
      dense_tensor_estimate (Optional[int]): storage estimate for dense tensors, uses
          default heuristic estimate if not provided.
class_docstr_tok: ["Reserves","storage","for","model","to","be","sharded","with","heuristical","calculation",".","The","storage","reservation","is","comprised","of","dense","tensor","storage",",","KJT","storage",",","and","an","extra","percentage","of","total","storage",".","Args",":","percentage","(","float",")",":","extra","storage","percent","to","reserve","that","acts","as","a","margin","of","error","beyond","heuristic","calculation","of","storage",".","parameter_multiplier","(","float",")",":","heuristic","multiplier","for","total","parameter","storage",".","dense_tensor_estimate","(","Optional","[","int","]",")",":","storage","estimate","for","dense","tensors",",","uses","default","heuristic","estimate","if","not","provided","."]
code: def __init__(
      self,
      percentage: float,
      # heuristic: 6 * dense parameter size
      # parameter + optimizer (~2x parameter) + ddp (~3x parameter)
      parameter_multiplier: float = 6.0,
      dense_tensor_estimate: Optional[int] = None,
  ) -> None:
      assert percentage >= 0 and percentage <= 1
      self._percentage: float = percentage
      self._parameter_multiplier = parameter_multiplier
      self._dense_tensor_estimate = dense_tensor_estimate
  
      self._dense_storage: Optional[Storage] = None
      self._kjt_storage: Optional[Storage] = None
  
imports: import copy
  import logging
  import math
  from typing import Dict, List, Optional, Set, Tuple
  from torch import nn
  from torchrec.distributed.planner.constants import BIGINT_DTYPE, POOLING_FACTOR
  from torchrec.distributed.planner.types import ParameterConstraints, PlannerError, PlannerErrorType, Storage, StorageReservation, Topology
  from torchrec.distributed.planner.utils import sharder_name, storage_repr_in_gb
  from torchrec.distributed.types import get_tensor_size_bytes, ModuleSharder
label_desc: Use image node_id 1 to create a new HeuristicalStorageReservation object from inherited base classes: StorageReservation with example: obj = HeuristicalStorageReservation(percentage, parameter_multiplier, dense_tensor_estimate)