import torch  # noqa

from nn import Module, Linear, Conv2d, MaxPool2d  # noqa
from functional import relu, view  # noqa

__all__ = ['ConvNet']


#################################################
# ConvNet
#################################################

class ConvNet(Module):
  """A deep convolutional neural network"""

  def __init__(self, in_channels, num_classes):
    super().__init__()
    # BEGIN SOLUTION
    raise NotImplementedError
    # END SOLUTION

  def forward(self, x, ctx=None):
    """Computes the forward function of the network.

    Note: `cross_entropy_loss` expects predictions BEFORE applying `softmax`.

    Args:
      x (torch.Tensor): The input tensor, has shape of `(batch_size, in_channels, height, width)`.
      ctx (List, optional): The autograd context. Defaults to None.

    Returns:
      y (torch.Tensor): The output tensor, has shape of `(batch_size, num_classes)`.
    """
    # BEGIN SOLUTION
    raise NotImplementedError
    # END SOLUTION
