I tracked and printed the type of data, and the results:
print(type(data))    # <class 'torch.autograd.variable.Variable'>
output = net(data)

In models.py, ‘net’->forward:
    def forward(self, input):
        print(type(input))    # <class 'torch.autograd.variable.Variable'>
        out = self.comb(input)

In dynamic_fixed_point.py:
class Conv2d_func(torch.autograd.Function):

    @staticmethod
    def forward(ctx, input, weight, bias, strides, padding):
        ctx.save_for_backward(input, weight, bias)
        output = Function.conv2d(Variable(input), Variable(weight), Variable(bias),
                                 stride=strides[1], padding=1)
        print(type(input))    # also print <class 'torch.autograd.variable.Variable'>
        return output

class Conv2d_q(nn.Module):
    def __init__(self, name, bits, ksize, strides, padding=0, weight_decay=0):
        super(Conv2d_q, self).__init__()
        
        self.bits = bits
        self.ksize = ksize
        self.strides = strides
        self.padding = padding
        self.weight_decay = weight_decay

        # order: (out_channels, in_channels, H, W)
        self.weight = nn.Parameter(torch.Tensor(ksize[3], ksize[0], ksize[1], ksize[2]))
        self.bias = nn.Parameter(torch.Tensor(ksize[3]))
        # initialization
        self.weight.data.uniform_(-0.1, 0.1)
        self.bias.data.uniform_(-0.1, 0.1)

    def forward(self, input):       
        out = Conv2d_func.apply(input, self.weight, self.bias, self.strides, self.padding)
        print(type(out))    # <= it stopped here
        return out