callback later completes additional futures, those futures are
        not marked as completed with an error and the user is
        responsible for handling completion/waiting on those futures
        independently.
  Example::
     >>> def callback(fut):
     ...     print("This will run after the future has finished.")
     ...     print(fut.wait())
     >>> fut = torch.futures.Future()
     >>> fut.add_done_callback(callback)
     >>> fut.set_result(5)
     This will run after the future has finished.
     5

done()
  Return "True" if this "Future" is done. A "Future" is done if it
  has a result or an exception.

  If the value contains tensors that reside on GPUs,
  "Future.done()" will return "True" even if the asynchronous
  kernels that are populating those tensors haven't yet completed
  running on the device, because at such stage the result is
  already usable, provided one performs the appropriate
