docstr: Securely computes c = op(mpc_tensor, tensor_1), where:
      1. mpc_tensor is a shared tensor that belongs to rank_a and rank_b.
      2. tensor_1 is a tensor that belongs to rank_1.
      3. c is a shared tensor that belongs to rank_a and rank_b.
docstr_tok: ["Securely","computes","c","=","op","(","mpc_tensor",",","tensor_1",")",",","where",":","1.","mpc_tensor","is","a","shared","tensor","that","belongs","to","rank_a","and","rank_b",".","2.","tensor_1","is","a","tensor","that","belongs","to","rank_1",".","3.","c","is","a","shared","tensor","that","belongs","to","rank_a","and","rank_b","."]
code: def smm_mpc_tensor(
      cls,
      ctx: Context,
      group,
      *,
      op: typing.Callable[[torch.Tensor, torch.Tensor], torch.Tensor],
      mpc_tensor: ArithmeticSharedTensor,
      rank_1: int,
      tensor_1: torch.Tensor,
      rank_2: int,
      cipher_2: "PHECipher",
  ):
      """
      Securely computes c = op(mpc_tensor, tensor_1), where:
          1. mpc_tensor is a shared tensor that belongs to rank_a and rank_b.
          2. tensor_1 is a tensor that belongs to rank_1.
          3. c is a shared tensor that belongs to rank_a and rank_b.
  
      """
      ga = cls.smm(
          ctx,
          group,
          op=lambda a, b: op(a, b),
          rank_1=rank_2,
          tensor_1=ctx.mpc.cond_call(
              lambda: mpc_tensor.share, lambda: None, rank_2
          ),
          cipher_1=ctx.mpc.option(cipher_2, dst=rank_2),
          rank_2=rank_1,
          tensor_2=ctx.mpc.option(tensor_1, rank_1),
      )
      if ctx.rank == rank_1:
          ga.share += op(mpc_tensor.share, tensor_1)
      return ga
  
file_path: FATE/python/fate/arch/protocol/mpc/primitives/sshe.py
imports: import typing
  import torch
  from fate.arch.context import Context
  from fate.arch.tensor import DTensor
  from fate.arch.protocol.mpc.common.rng import generate_random_ring_element
  from fate.arch.protocol.mpc.primitives.arithmetic import ArithmeticSharedTensor
  from fate.arch.protocol.mpc.primitives.beaver import IgnoreEncodings
  from fate.arch.trace import auto_trace
label_desc: Use image node_id 3 for calling the SSHE obj's underlying member method code with example usage: obj.smm_mpc_tensor(cls, ctx, group) and returns: ga