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)