class_docstr: A 'planar' bijective transform with equation,
  
      :math:`\mathbf{y} = \mathbf{x} + \mathbf{u}\tanh(\mathbf{w}^T\mathbf{z}+b)`
  
  where :math:`\mathbf{x}` are the inputs, :math:`\mathbf{y}` are the outputs,
  and the learnable parameters are :math:`b\in\mathbb{R}`,
  :math:`\mathbf{u}\in\mathbb{R}^D`, :math:`\mathbf{w}\in\mathbb{R}^D` for
  input dimension :math:`D`. For this to be an invertible transformation, the
  condition :math:`\mathbf{w}^T\mathbf{u}>-1` is enforced.
  
  Together with :class:`~pyro.distributions.TransformedDistribution` this provides
  a way to create richer variational approximations.
  
  Example usage:
  
  >>> base_dist = dist.Normal(torch.zeros(10), torch.ones(10))
  >>> transform = Planar(10)
  >>> pyro.module("my_transform", transform)  # doctest: +SKIP
  >>> flow_dist = dist.TransformedDistribution(base_dist, [transform])
  >>> flow_dist.sample()  # doctest: +SKIP
  
  The inverse of this transform does not possess an analytical solution and is
  left unimplemented. However, the inverse is cached when the forward operation is
  called during sampling, and so samples drawn using the planar transform can be
  scored.
  
  :param input_dim: the dimension of the input (and output) variable.
  :type input_dim: int
  
  References:
  
  [1] Danilo Jimenez Rezende, Shakir Mohamed. Variational Inference with
  Normalizing Flows. [arXiv:1505.05770]
code: def _params(self):
      return self.bias, self.u, self.w
  
imports: import math
  from functools import partial
  import torch
  import torch.nn
  import torch.nn.functional
  from torch.distributions import Transform, constraints
  from pyro.nn import DenseNN
  from ..conditional import ConditionalTransformModule
  from ..torch_transform import TransformModule
  from ..util import copy_docs_from
label_desc: Use image node_id 2 for calling the Planar obj's underlying member method code with example usage: obj._params() and returns: self,  self,  self