# tff.templates.IterativeProcess

<br />

|---|
| [![](https://www.tensorflow.org/images/GitHub-Mark-32px.png) View source on GitHub](https://github.com/tensorflow/federated/blob/v0.87.0 Version 2.0, January 2004 Licensed under the Apache License, Version 2.0 (the) |

A process that includes an initialization and iterated computation.

    tff.templates.IterativeProcess(
        initialize_fn: https://www.tensorflow.org/federated/api_docs/python/tff/Computation,
        next_fn: https://www.tensorflow.org/federated/api_docs/python/tff/Computation,
        next_is_multi_arg: Optional[bool] = None
    )

### Used in the notebooks

| Used in the tutorials |
|---|
| - [Building Your Own Federated Learning Algorithm](https://www.tensorflow.org/federated/tutorials/building_your_own_federated_learning_algorithm) - [Working with tff's ClientData.](https://www.tensorflow.org/federated/tutorials/working_with_client_data) |

An iterated process will usually be driven by a control loop like:

    def initialize_fn():
      ...

    def next_fn(state):
      ...

    iterative_process = IterativeProcess(initialize_fn, next_fn)
    state = iterative_process.initialize()
    for round in range(num_rounds):
      state = iterative_process.next(state)

The `initialize_fn` function must return an object which is expected as input
to and returned by the `next_fn` function. By convention, we refer to this
object as `state`.

The iteration step (`next_fn` function) can accept arguments in addition to
`state` (which must be the first argument), and return additional arguments,
with `state` being the first output argument:

    def next_fn(state, round_num):
      ...

    iterative_process = ...
    state = iterative_process.initialize()
    for round in range(num_rounds):
      state, output = iterative_process.next(state, round)

<br />

<br />

<br />

| ## Args ||
|---|---|
| `initialize_fn` | A no-arg [`tff.Computation`](https://www.tensorflow.org/federated/api_docs/python/tff/Computation) that returns the initial state of the iterative process. Let the type of this state be called `S`. |
| `next_fn` | A [`tff.Computation`](https://www.tensorflow.org/federated/api_docs/python/tff/Computation) that represents the iterated function. The first or only argument must be a type that is assignable from the state type `S` ([`tff.types.Type.is_assignable_from`](https://www.tensorflow.org/federated/api_docs/python/tff/types/Type#is_assignable_from) must return `True`). The first or only return value must also be assignable to the first or only argument, the same requirement as the `S` type. |
| `next_is_multi_arg` | An optional boolean indicating that `next_fn` will receive more than just the state argument (if `True`) or only the state argument (if `False`). This parameter is primarily used to provide better error messages. |

<br />

<br />

<br />

<br />

| ## Raises ||
|---|---|
| `TypeError` | If `initialize_fn` and `next_fn` are not instances of [`tff.Computation`](https://www.tensorflow.org/federated/api_docs/python/tff/Computation). |
| `TemplateInitFnParamNotEmptyError` | If `initialize_fn` has any input arguments. |
| `TemplateStateNotAssignableError` | If the `state` returned by either `initialize_fn` or `next_fn` is not assignable to the first input argument of `next_fn`. |

<br />

<br />

<br />

<br />

| ## Attributes ||
|---|---|
| `initialize` | A no-arg [`tff.Computation`](https://www.tensorflow.org/federated/api_docs/python/tff/Computation) that returns the initial state. |
| `next` | A [`tff.Computation`](https://www.tensorflow.org/federated/api_docs/python/tff/Computation) that produces the next state. <br /> Its first argument should always be the current state (originally produced by [`tff.templates.IterativeProcess.initialize`](https://www.tensorflow.org/federated/api_docs/python/tff/templates/IterativeProcess#initialize)), and the first (or only) returned value is the updated state. |
| `state_type` | The [`tff.Type`](https://www.tensorflow.org/federated/api_docs/python/tff/types/Type) of the state of the process. |

<br />