'Long short-term memory cell (LSTM).'

def __call__(self, inputs, state, scope=None):

    with tf.variable_scope((scope or type(self).__name__)):
        if self._state_is_tuple:
            (c, h) = state
        else:
            (c, h) = array_ops.split(1, 2, state)
        concat = _linear([inputs, h], (4 * self._num_units), True, 0.0, self.weights_init, self.trainable, self.restore, self.reuse)
        (i, j, f, o) = array_ops.split(value=concat, num_or_size_splits=4, axis=1)
        if (self.batch_norm == True):
            i = batch_normalization(i, gamma=0.1, trainable=self.trainable, restore=self.restore, reuse=self.reuse)
            j = batch_normalization(j, gamma=0.1, trainable=self.trainable, restore=self.restore, reuse=self.reuse)
            f = batch_normalization(f, gamma=0.1, trainable=self.trainable, restore=self.restore, reuse=self.reuse)
            o = batch_normalization(o, gamma=0.1, trainable=self.trainable, restore=self.restore, reuse=self.reuse)
        new_c = ((c * self._inner_activation((f + self._forget_bias))) + (self._inner_activation(i) * self._activation(j)))
        if (self.batch_norm == True):
            batch_norm_new_c = batch_normalization(new_c, gamma=0.1, trainable=self.trainable, restore=self.restore, reuse=self.reuse)
            new_h = (self._activation(batch_norm_new_c) * self._inner_activation(o))
        else:
            new_h = (self._activation(new_c) * self._inner_activation(o))
        if self._state_is_tuple:
            new_state = core_rnn_cell.LSTMStateTuple(new_c, new_h)
        else:
            new_state = array_ops.concat([new_c, new_h], 1)
        with tf.variable_scope('Linear', reuse=True):
            self.W = tf.get_variable('Matrix')
            self.b = tf.get_variable('Bias')
        return (new_h, new_state)
