code: def backward(self, loss):
      if self._guest_direct_backward:
          # send error to hosts & guest side direct backward
          if isinstance(self._agg_layer, SSHEAggLayerGuest):
              loss.backward()  # sshe has independent optimizer
              self._agg_layer.step()
          else:
              self._agg_layer.backward(loss)
              loss.backward()
      else:
          # backward are split into parts
          loss.backward()  # update top
          agg_error = self._agg_fw_rg.grad
          self._agg_fw_rg = None
          bottom_error = self._agg_layer.backward(
              agg_error
          )  # compute bottom error & update hetero
          if bottom_error is not None:
              bottom_loss = backward_loss(self._bottom_fw, bottom_error)
              bottom_loss.backward()
          self._bottom_fw = False
  
imports: import torch
  import torch
  from fate.arch import Context
  from fate.ml.nn.model_zoo.agg_layer.agg_layer import AggLayerGuest, AggLayerHost
  from fate.ml.nn.model_zoo.agg_layer.fedpass.agg_layer import FedPassAggLayerGuest, FedPassAggLayerHost, get_model
  from fate.ml.nn.model_zoo.agg_layer.sshe.agg_layer import SSHEAggLayerHost, SSHEAggLayerGuest
  from typing import Any, Dict, List, Union, Callable, Literal
  from dataclasses import dataclass, fields
  from enum import Enum
  import logging
  from torch import device
label_desc: Use image node_id 8 for calling the HeteroNNModelGuest obj's underlying member method code with example usage: obj.backward(loss) without return types