def sequence_sum(self, value):
    """Implements `sequence_sum` as defined in `api/intrinsics.py`."""
    value = value_impl.to_value(value, None, self._context_stack)
    if isinstance(value.type_signature, computation_types.SequenceType):
      element_type = value.type_signature.element
    else:
      py_typecheck.check_type(value.type_signature,
                              computation_types.FederatedType)
      py_typecheck.check_type(value.type_signature.member,
                              computation_types.SequenceType)
      element_type = value.type_signature.member.element
    type_utils.check_is_sum_compatible(element_type)

    if isinstance(value.type_signature, computation_types.SequenceType):
      value = value_impl.ValueImpl.get_comp(value)
      return value_impl.ValueImpl(
          building_block_factory.create_sequence_sum(value),
          self._context_stack)
    elif isinstance(value.type_signature, computation_types.FederatedType):
      intrinsic_type = computation_types.FunctionType(
          value.type_signature.member, value.type_signature.member.element)
      intrinsic = building_blocks.Intrinsic(intrinsic_defs.SEQUENCE_SUM.uri,
                                            intrinsic_type)
      intrinsic_impl = value_impl.ValueImpl(intrinsic, self._context_stack)
      if value.type_signature.placement in [
          placements.SERVER, placements.CLIENTS
      ]:
        return self.federated_map(intrinsic_impl, value)
      else:
        raise TypeError('Unsupported placement {}.'.format(
            value.type_signature.placement))
    else:
      raise TypeError(
          'Cannot apply `tff.sequence_sum()` to a value of type {}.'.format(
              value.type_signature))
 def federated_sum(self, value):
   """Implements `federated_sum` as defined in `api/intrinsics.py`."""
   value = value_impl.to_value(value, None, self._context_stack)
   value = value_utils.ensure_federated_value(value, placements.CLIENTS,
                                              'value to be summed')
   type_utils.check_is_sum_compatible(value.type_signature)
   value = value_impl.ValueImpl.get_comp(value)
   comp = building_block_factory.create_federated_sum(value)
   return value_impl.ValueImpl(comp, self._context_stack)