def forward(self, inputs, dt):
        """
        inputs : (L, B, M)
        dt     : (L, B, M)
        output : (L, B, M, N) [length, batch, size, order]
        # TODO this puts the unsqueeze inside here rather than outside, should make RNN versions the same
        """

        L, B, M = inputs.shape
        I = self.e.repeat((L, B, M, 1)) # (L, B, M, N)
        # I = self.e.repeat(inputs.shape+(1,)) # (L, B, M, N)
        As = self.transition.bilinear(dt, I, torch.zeros_like(dt)) # (L, B, M, N)
        # Bs = self.transition.bilinear(dt, torch.zeros_like(I), torch.ones_like(dt)) # (L, B, M, N)
        Bs = self.transition.bilinear(dt, torch.zeros_like(I), inputs) # (L, B, M, N)
        output = unroll.variable_unroll_toeplitz(As, Bs, pad=False)
        # print("HERE")
        return output

        inputs : (L, B, M)
        dt     : (L, B, M)
        output : (L, B, M, N) [length, batch, size, order]
        # TODO this puts the unsqueeze inside here rather than outside, should make RNN versions the same
        
analyze/convnexts4nd/src/models/sequence/rnns/qrnn.py