code: def estimate_size(cls, ctx, op):
      chunk = op.outputs[0]
      if chunk.is_sparse():
          return super().estimate_size(ctx, op)
  
      # empirical value in real environments
      calc_usage = chunk.nbytes
  
      # add input sizes when sparse-to-dense is needed
      for inp in chunk.inputs:
          if inp.is_sparse():
              calc_usage += inp.nbytes
  
      ctx[chunk.key] = (chunk.nbytes, calc_usage)
  
imports: import itertools
  from collections.abc import Iterable
  import numpy
  from ...None import opcodes
  from ...serialization.serializables import FieldTypes, KeyField, TupleField
  from ...utils import has_unknown_shape
  from ..utils import unify_chunks
  from ..array_utils import as_same_device, device, is_sparse_module
  from ..operands import TensorOperand, TensorOperandMixin
  from ..arithmetic.utils import chunk_tree_add
  from ..datasource import tensor
  from ..core import TensorOrder
label_desc: Use image node_id 8 for calling the TensorTensorDot obj's underlying member method code with example usage: obj.estimate_size(cls, ctx, op) and returns: super