text: # -*- coding: utf-8 -*-
  """
  @created on: 12/7/19,
  @author: Shreesha N,
  @version: v0.0.1
  @system name: badgod
  Description:
  
  ..todo::
  
  """
  
  import torch.nn as nn
  import torch.nn.functional as F
  from curious_agent.models import Model
  
  class DQN(Model):
      """Initialize a deep Q-learning network
  
      Hints:
      -----
          Original paper for DQN
      https://storage.googleapis.com/deepmind-data/assets/papers/DeepMindNature14236Paper.pdf
      """
  
      def __init__(self, env, args):
          """
          You can add additional arguments as you need.
          In the constructor we instantiate modules and assign them as
          member variables.
          """
          super(DQN, self).__init__(env=env, args=args)
          self.conv1 = nn.Conv2d(4, 32, 8, 4)
          self.conv2 = nn.Conv2d(32, 64, 4, 2)
          self.conv3 = nn.Conv2d(64, 64, 3, 1)
          self.fc1 = nn.Linear(7 * 7 * 64, 512)
          self.fc2 = nn.Linear(512, 4)
  
      def forward(self, x):
          """
          In the forward function we accept a Tensor of input data and we must return
          a Tensor of output data. We can use Modules defined in the constructor as
          well as arbitrary operators on Tensors.
          """
          x = F.relu(self.conv1(x))
          x = F.relu(self.conv2(x))
          x = F.relu(self.conv3(x))
          x = x.view(-1, 7 * 7 * 64)
          x = F.relu(self.fc1(x))
          x = F.softmax(self.fc2(x))
          return x
  