# The `IfElse` Operator

PaddlePaddle’s `IfElse` operator differs from TensorFlow’s:

- the TensorFlow version takes a scalar boolean value as the condition so that the whole mini-batch goes to either the true or the false branch, whereas
- the PaddlePaddle version takes a vector of boolean value as the condition, and instances corresponding to true values go to the true branch, those corresponding to false values go to the false branch.

## Example

The following PaddlePaddle program shows the usage of the IfElse operator:

    import paddle as pd

    x = minibatch([10, 20, 30]) # shape=[None, 1]
    y = var(1) # shape=[1], value=1
    z = minibatch([10, 20, 30]) # shape=[None, 1]
    cond = larger_than(x, 15) # [false, true, true]

    ie = pd.ifelse()
    with ie.true_block():
        d = pd.layer.add(x, y)
        ie.output(d, pd.layer.softmax(d))
    with ie.false_block():
        d = pd.layer.fc(z)
        ie.output(d, d+1)
    o1, o2 = ie(cond)

A challenge to implement the `IfElse` operator is to infer those variables to be split, or, say, to identify the variable of the mini-batch or those derived from the mini-batch.

An equivalent C++ program is as follows:

    namespace pd = paddle;

    int x = 10;
    int y = 1;
    int z = 10;
    bool cond = false;
    int o1, o2;
    if (cond) {
      int d = x + y;
      o1 = z;
      o2 = pd::layer::softmax(z);
    } else {
      int d = pd::layer::fc(z);
      o1 = d;
      o2 = d+1;
    }