code: def convex_conj(self):
          r
          if self.operator is None:
              tmp = IndicatorZero(space=self.domain, constant=-self.constant)
              if self.vector is None:
                  return tmp
              else:
                  return tmp.translated(self.vector)
  
          if self.vector is None:
              # Handle trivial case separately
              return QuadraticForm(operator=self.operator.inverse,
                                   constant=-self.constant)
          else:
              # Compute the needed variables
              opinv = self.operator.inverse
              vector = -opinv.adjoint(self.vector) - opinv(self.vector)
              constant = self.vector.inner(opinv(self.vector)) - self.constant
  
              # Create new quadratic form
              return QuadraticForm(operator=opinv,
                                   vector=vector,
                                   constant=constant)
docs: r"""The convex conjugate functional of the quadratic form.
  
          Notes
          -----
          The convex conjugate of the quadratic form :math:`<x, Ax> + <b, x> + c`
          is given by
  
          .. math::
              (<x, Ax> + <b, x> + c)^* (x) =
              <(x - b), A^-1 (x - b)> - c =
              <x , A^-1 x> - <x, A^-* b> - <x, A^-1 b> + <b, A^-1 b> - c.
  
          If the quadratic part of the functional is zero it is instead given
          by a translated indicator function on zero, i.e., if
  
          .. math::
              f(x) = <b, x> + c,
  
          then
  
          .. math::
              f^*(x^*) =
              \begin{cases}
                  -c & \text{if } x^* = b \\
                  \infty & \text{else.}
              \end{cases}
  
          See Also
          --------
          IndicatorZero