def calc_fixed_bn(func, in_data, **kwargs):
    """[FixedBatchNormalization](https://docs.chainer.org/en/v4.3.0/reference/generated/chainer.functions.fixed_batch_normalization.html)

    Test-mode batch normalization.
    It consists of normalization part (using $\mu$ and $\sigma$) and
    bias part ($\\gamma$ and $\\beta$), both are composed of
    elementwise scale and shift. However this can actually be fused into single
    scale and shift operation.
    Therefore, regardless of existence of bias ($\\gamma$ and $\\beta$),
    computational cost is always $2 \|x\|$ FLOPs.

    Since scale-and-shift operation can be done by FMA,
    it becomes $\|x\|$ FLOPs if `fma_1flop` is set to `True`.

    Due to the same reason as explained above, reading learned scale and shift
    parameter is required only once (not twice) regardless of bias existence.
    Both are 1-dimensional array with $c_{\mathrm{in}}$ elements.

    | Item          | Value |
    |:--------------|:------|
    | FLOPs(FMA)    | $$ \| x \| $$ |
    | FLOPs(no-FMA) | $$ 2 \| x \| $$ |
    | mread         | $$ \|x\| + 2 c_{\mathrm{in}} $$ |
    | mwrite        | $$ \| x \| $$ |
    | params        | `eps`: epsilon for BN |
    """
    x, _, _, mean, var = in_data
    x = in_data[0]
    n_elements = len(x.flatten())
    if kwargs.get('fma_1flop'):
        flops = n_elements
    else:
        flops = n_elements * 2    # *2 <- scale and shift
    mread = n_elements + len(mean) + len(var)
    mwrite = n_elements
    return (flops, mread, mwrite, {'eps': func.eps})