code: def __call__(self, dz):
      xa, xb = self.ctx.mpc.split_variable(
          self.x, self.rank_a, self.rank_b
      )
  
      xa_encoded_t = self.ctx.mpc.cond_call(
          lambda: self.encoder.encode(xa).T,
          lambda: None,
          dst=self.rank_a,
      )
      xb_encoded_t = self.ctx.mpc.cond_call(
          lambda: self.encoder.encode(xb).T,
          lambda: None,
          dst=self.rank_b,
      )
  
      # update wa
      # <d.T> @ [xa|rank_a]
      ga = self.ctx.mpc.sshe.smm_mpc_tensor(
          ctx=self.ctx,
          group=self.group,
          op=lambda a, b: b.matmul(a),
          mpc_tensor=dz,
          rank_1=self.rank_a,
          tensor_1=xa_encoded_t,
          rank_2=self.rank_b,
          cipher_2=self.phe_cipher,
      )
      with IgnoreEncodings([ga]):
          ga = ga.div_(self.encoder.scale)
  
      # <d.T> @ [xb|rank_b]
      gb = self.ctx.mpc.sshe.smm_mpc_tensor(
          ctx=self.ctx,
          group=self.group,
          op=lambda a, b: b.matmul(a),
          mpc_tensor=dz,
          rank_1=self.rank_b,
          tensor_1=xb_encoded_t,
          rank_2=self.rank_a,
          cipher_2=self.phe_cipher,
      )
      with IgnoreEncodings([gb]):
          gb = gb.div_(self.encoder.scale)
  
      self.wa.grad = ga
      self.wb.grad = gb
  
imports: import typing
  import torch
  from fate.arch.context import Context
  from fate.arch.protocol.mpc.common.encoding import IgnoreEncodings
  from fate.arch.protocol.mpc.mpc import FixedPointEncoder
  from fate.arch.trace import auto_trace
label_desc: Use image node_id 2 for calling the SSHELogisticRegressionLayerBackwardFunction obj's underlying member method code with example usage: obj.__call__(dz) without return types