'See parent class'

def step_fprop(self, state_below, mask=None, dpmask=None, state_before=None, no_noise_bias=False, use_noise=True):

    rval = []
    if (self.weight_noise and use_noise and self.noise_params):
        W_hhs = [(x + y) for (x, y) in zip(self.W_hhs, self.nW_hhs)]
        if (not no_noise_bias):
            b_hhs = [(x + y) for (x, y) in zip(self.b_hhs, self.nb_hhs)]
        else:
            b_hhs = self.b_hhs
        W_shp = [(x + y) for (x, y) in zip(self.W_shortp, self.nW_shortp)]
    else:
        W_hhs = self.W_hhs
        b_hhs = self.b_hhs
        W_shp = self.W_shortp
    h = self.activation[0]((TT.dot(state_before, W_hhs[0]) + b_hhs[0]))
    if (self.activ_noise and use_noise):
        h = (h + self.trng.normal(h.shape, avg=0, std=self.activ_noise, dtype=h.dtype))
    if (self.dropout < 1.0):
        if use_noise:
            if (h.ndim == 2):
                h = (h * dpmask[:, :h.shape[1]])
                dpidx = h.shape[1]
            else:
                h = (h * dpmask[:h.shape[0]])
                dpidx = h.shape[0]
        else:
            h = (h * self.dropout)
    rval += [h]
    for dx in xrange(1, (self.n_layers - 1)):
        h = self.activation[dx](((TT.dot(h, W_hhs[dx]) + TT.dot(state_before, W_shp[(dx - 1)])) + b_hhs[dx]))
        if (self.activ_noise and use_noise):
            h = (h + self.trng.normal(h.shape, avg=0, std=self.activ_noise, dtype=h.dtype))
        if (self.dropout < 1.0):
            if use_noise:
                if (h.ndim == 2):
                    h = (h * dpmask[:, dpidx:(dpidx + h.shape[1])])
                    dpidx = (dpidx + h.shape[1])
                else:
                    h = (h * dpmask[dpidx:(dpidx + h.shape[0])])
                    dpidx = (dpidx + h.shape[0])
            else:
                h = (h * self.dropout)
        rval += [h]
    h = self.activation[(-1)](((TT.dot(h, W_hhs[(-1)]) + TT.dot(state_before, W_shp[(-1)])) + state_below))
    if (self.activ_noise and use_noise):
        h = (h + self.trng.normal(h.shape, avg=0, std=self.activ_noise, dtype=h.dtype))
    if (self.dropout < 1.0):
        if use_noise:
            if (h.ndim == 2):
                h = (h * dpmask[:, :h.shape[1]])
                dpidx = h.shape[1]
            else:
                h = (h * dpmask[:h.shape[0]])
                dpidx = h.shape[0]
        else:
            h = (h * self.dropout)
    rval += [h]
    if (mask is not None):
        if ((h.ndim == 2) and (mask.ndim == 1)):
            mask = mask.dimshuffle(0, 'x')
        h = ((mask * h) + ((1 - mask) * state_before))
    rval += [h]
    return rval
