class_docstr: Proximal operator of the nuclear norm, aka trace norm
  
  Parameters
  ----------
  strength : `float`
      Level of penalization
  
  n_rows : `int`
      Number of rows in the matrix on which we apply this
      penalization. The number of columns is then given by
      (start - end) / n_rows
  
  range : `tuple` of two `int`, default=`None`
      Range on which the prox is applied. If `None` then the prox is
      applied on the whole vector
  
  positive : `bool`, default=`False`
      If True, apply nuclear-norm penalization followed by a
      truncation to make all entries non-negative
  
  rank_max : `int`, default=`None`
      Maximum rank to be used in the SVD (not used yet...)
  
  Notes
  -----
  The coeffs on which we apply this prox must be flattened (using
  `np.ravel` for instance), and not two-dimensional.
  This operator is not usable from a solver with wrapped C++ code.
  It is based on `scipy.linalg.svd` SVD routine and is not intended
  for use on large matrices
code: def _call(self, coeffs: np.ndarray, step: float, out: np.ndarray):
      x = self._get_matrix(coeffs)
      u, s, v = svd(x, compute_uv=True, full_matrices=False)
      thresh = step * self.strength
      s = (s - thresh) * (s > thresh)
      x_new = u.dot(np.diag(s)).dot(v).ravel()
      if self.positive:
          x_new[x_new < 0.0] = 0.0
      range = self.range
      if range is None:
          start, end = 0, coeffs.shape[0]
      else:
          start, end = range
      out[start:end] = x_new
  
file_path: tick/tick/prox/prox_nuclear.py
imports: import numpy
  from numpy.linalg import svd
  from tick.prox.base import Prox
label_desc: Use image node_id 3 for calling the ProxNuclear obj's underlying member method code with example usage: obj._call(coeffs, step, out) without return types