def METHOD_NAME(self, level, inp):
    # Upper branch
    up1 = inp
    up1 = self._modules['b1_' + str(level)](up1)
    # Lower branch
    low1 = F.avg_pool2d(inp, 2, stride=2)
    low1 = self._modules['b2_' + str(level)](low1)
    if level > 1:
        low2 = self.METHOD_NAME(level - 1, low1)
    else:
        low2 = low1
        low2 = self._modules['b2_plus_' + str(level)](low2)
    low3 = low2
    low3 = self._modules['b3_' + str(level)](low3)
    # NOTE: for newer PyTorch (1.3~), it seems that training results are degraded due to implementation diff in F.grid_sample
    # if the pretrained model behaves weirdly, switch with the commented line.
    # NOTE: I also found that "bicubic" works better.
    up2 = F.interpolate(low3, scale_factor=2, mode='bicubic', align_corners=True)
    # up2 = F.interpolate(low3, scale_factor=2, mode='nearest)
    return up1 + up2