UnweightedAggregationFactory for discrete Fourier transform.

Inherits From: UnweightedAggregationFactory

The created tff.templates.AggregationProcess takes an input structure and applies the randomized discrete Fourier transform (using TF's fast Fourier transform implementation tf.signal.fft/ifft) to each tensor in the structure, reshaped to a rank-1 tensor in O(d*log(d)) time, where d is the number of elements of the tensor.


Specifically, for each tensor, the following operations are first performed at tff.CLIENTS:

  1. Flattens the tensor into a rank-1 tensor.
  2. Pads the tensor with zeros to an even number of elements (i.e. pad at most one zero).
  3. Packs the real valued tensor into a tensor with a complex dtype with d/2 elements, by filling the real and imaginary values with two halves of the tensor.
  4. Randomly rotates each coordinate of the complex tensor.
  5. Applies the discrete Fourier transform.
  6. Unpacks the complex tensor back to a real tensor with length d.
  7. Normalizes the tensor by 1 / sqrt(d/2). Steps 4 and 5 are repeated multiple times with independent randomness, if num_repeats > 1.

The resulting tensors are passed to the inner_agg_factory. After aggregation, at tff.SEREVR, inverses of these steps are applied in reverse order.

The allowed input dtypes are integers and floats. However, the dtype passed to the inner_agg_factory will always be a float.



View source

Creates a tff.aggregators.AggregationProcess without weights.

The provided value_type is a non-federated tff.Type, that is, not a tff.FederatedType.

The returned tff.aggregators.AggregationProcess will be created for aggregation of values matching value_type placed at tff.CLIENTS. That is, its next method will expect type <S@SERVER, {value_type}@CLIENTS>, where S is the unplaced return type of its initialize method.

value_type A non-federated tff.Type.

A tff.templates.AggregationProcess.