class_docstr: Write me
      
code: def compute_output_shape(self, input_shape):
      if len(input_shape) != 3:
          raise RuntimeError("Expects 3 inputs: L, mu, a")
      for i, shape in enumerate(input_shape):
          if len(shape) != 2:
              raise RuntimeError(
                  "Input {} has {} dimensions but should have 2".format(
                      i, len(shape)
                  )
              )
      assert self.mode in ("full", "diag")
      if self.mode == "full":
          expected_elements = (
              self.nb_actions * self.nb_actions + self.nb_actions
          ) // 2
      elif self.mode == "diag":
          expected_elements = self.nb_actions
      else:
          expected_elements = None
      assert expected_elements is not None
      if input_shape[0][1] != expected_elements:
          raise RuntimeError(
              "Input 0 (L) should have {} elements but has {}".format(
                  input_shape[0][1]
              )
          )
      if input_shape[1][1] != self.nb_actions:
          raise RuntimeError(
              "Input 1 (mu) should have {} elements but has {}".format(
                  self.nb_actions, input_shape[1][1]
              )
          )
      if input_shape[2][1] != self.nb_actions:
          raise RuntimeError(
              "Input 2 (action) should have {} elements but has {}".format(
                  self.nb_actions, input_shape[1][1]
              )
          )
      return input_shape[0][0], 1
  
imports: from __future__ import division
  import warnings
  import keras.backend
  from keras.models import Model
  from keras.layers import Lambda, Input, Layer, Dense
  from rl.core import Agent
  from rl.policy import EpsGreedyQPolicy, GreedyQPolicy
  from rl.util import *
label_desc: Use image node_id 4 for calling the NAFLayer obj's underlying member method code with example usage: obj.compute_output_shape(input_shape) and returns: input_shape,  int