def __init__(self, layer_count, code_depth, name=None):
        super(LayerPrediction, self).__init__(name)

        self._layer_count = layer_count

        # No previous layer.
        self._layer_state = None
        self._current_layer = 0

        with self._BlockScope():
            # Layers used to do the conditional code prediction.
            self._brnn_predictors = []
            for _ in xrange(layer_count):
                self._brnn_predictors.append(BrnnPredictor(code_depth))

            # Layers used to generate the input of the LSTM operating on the
            # iteration/depth domain.
            hidden_depth = 2 * code_depth
            self._state_blocks = []
            for _ in xrange(layer_count):
                self._state_blocks.append(
                    blocks.CompositionOperator([
                        blocks.Conv2D(hidden_depth, [3, 3], [1, 1],
                                      'SAME',
                                      bias=blocks.Bias(0),
                                      act=tf.tanh),
                        blocks.Conv2D(code_depth, [3, 3], [1, 1],
                                      'SAME',
                                      bias=blocks.Bias(0),
                                      act=tf.tanh)
                    ]))

            # Memory of the RNN is equivalent to the size of 2 layers of binary
            # codes.
            hidden_depth = 2 * code_depth
            self._layer_rnn = blocks.CompositionOperator([
                blocks.Conv2DLSTM(depth=hidden_depth,
                                  filter_size=[1, 1],
                                  hidden_filter_size=[1, 1],
                                  strides=[1, 1],
                                  padding='SAME'),
                blocks.Conv2D(hidden_depth, [1, 1], [1, 1],
                              'SAME',
                              bias=blocks.Bias(0),
                              act=tf.tanh),
                blocks.Conv2D(code_depth, [1, 1], [1, 1],
                              'SAME',
                              bias=blocks.Bias(0),
                              act=tf.tanh)
            ])
    def __init__(self, code_depth, name=None):
        super(BrnnPredictor, self).__init__(name)

        with self._BlockScope():
            hidden_depth = 2 * code_depth

            # What is coming from the previous layer/iteration
            # is going through a regular Conv2D layer as opposed to the binary codes
            # of the current layer/iteration which are going through a masked
            # convolution.
            self._adaptation0 = blocks.RasterScanConv2D(hidden_depth, [7, 7],
                                                        [1, 1],
                                                        'SAME',
                                                        strict_order=True,
                                                        bias=blocks.Bias(0),
                                                        act=tf.tanh)
            self._adaptation1 = blocks.Conv2D(hidden_depth, [3, 3], [1, 1],
                                              'SAME',
                                              bias=blocks.Bias(0),
                                              act=tf.tanh)
            self._predictor = blocks.CompositionOperator([
                blocks.LineOperator(
                    blocks.RasterScanConv2DLSTM(depth=hidden_depth,
                                                filter_size=[1, 3],
                                                hidden_filter_size=[1, 3],
                                                strides=[1, 1],
                                                padding='SAME')),
                blocks.Conv2D(hidden_depth, [1, 1], [1, 1],
                              'SAME',
                              bias=blocks.Bias(0),
                              act=tf.tanh),
                blocks.Conv2D(code_depth, [1, 1], [1, 1],
                              'SAME',
                              bias=blocks.Bias(0),
                              act=tf.tanh)
            ])