code: def __init__(
      self,
      ctx: Context,
      in_features_a,
      in_features_b,
      out_features,
      rank_a,
      rank_b,
      wa_init_fn: typing.Callable[[typing.Tuple], torch.Tensor],
      wb_init_fn: typing.Callable[[typing.Tuple], torch.Tensor],
      precision_bits=None,
      sync_shape=True,
      cipher_options=None,
  ):
      self.ctx = ctx
      self.rank_a = rank_a
      self.rank_b = rank_b
      self.group = ctx.mpc.communicator.new_group(
          [rank_a, rank_b],
          f"{ctx.namespace.federation_tag}.sshe_aggregator_layer",
      )
  
      if sync_shape:
          ctx.mpc.option_assert(
              in_features_a is not None,
              "in_features_a must be specified",
              dst=rank_a,
          )
          ctx.mpc.option_assert(
              in_features_b is None,
              "in_features_b must be None when sync_shape is True",
              dst=rank_a,
          )
          ctx.mpc.option_assert(
              in_features_b is not None,
              "in_features_b must be specified",
              dst=rank_b,
          )
          ctx.mpc.option_assert(
              in_features_a is None,
              "in_features_a must be None when sync_shape is True",
              dst=rank_b,
          )
          in_features_a = ctx.mpc.communicator.broadcast_obj(
              obj=in_features_a, src=rank_a
          )
          in_features_b = ctx.mpc.communicator.broadcast_obj(
              obj=in_features_b, src=rank_b
          )
      else:
          ctx.mpc.option_assert(
              in_features_a is not None,
              "in_features_a must be specified when sync_shape is False",
              dst=rank_a,
          )
          ctx.mpc.option_assert(
              in_features_b is not None,
              "in_features_b must be specified when sync_shape is False",
              dst=rank_b,
          )
  
      self.wa = ctx.mpc.init_tensor(
          shape=(in_features_a, out_features),
          init_func=wa_init_fn,
          src=rank_a,
      )
      self.wb = ctx.mpc.init_tensor(
          shape=(in_features_b, out_features),
          init_func=wb_init_fn,
          src=rank_b,
      )
      self.phe_cipher = ctx.cipher.phe.setup(options=cipher_options)
      self.precision_bits = precision_bits
  
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 1 to create a new SSHELinearRegressionLayer object  with example: obj = SSHELinearRegressionLayer(ctx, in_features_a, in_features_b, out_features, rank_a, rank_b, wa_init_fn, wb_init_fn, precision_bits, sync_shape, cipher_options)