docstr: Performs the constrained search for the linear parameters `f` after
  the estimation of `x` is done. Estimation of the linear parameters `f`
  is a constrained linear least-squares optimization problem solved by
  using a convex optimizer from cvxpy. The IVIM equation contains two
  parameters that depend on the same volume fraction. Both are estimated
  as separately in the convex optimizer.
  
  Parameters
  ----------
  phi : array
      Returns an array calculated from :func: `phi`.
  
  signal : array
      The signal values measured for this model.
  
  Returns
  -------
  f1, f2 (volume fractions)
  
  Notes
  -----
  cost function for differential evolution algorithm:
  
  .. math::
  
      minimize(norm((signal)- (phi*f)))
code: def cvx_fit(self, signal, phi):
      """
      Performs the constrained search for the linear parameters `f` after
      the estimation of `x` is done. Estimation of the linear parameters `f`
      is a constrained linear least-squares optimization problem solved by
      using a convex optimizer from cvxpy. The IVIM equation contains two
      parameters that depend on the same volume fraction. Both are estimated
      as separately in the convex optimizer.
  
      Parameters
      ----------
      phi : array
          Returns an array calculated from :func: `phi`.
  
      signal : array
          The signal values measured for this model.
  
      Returns
      -------
      f1, f2 (volume fractions)
  
      Notes
      -----
      cost function for differential evolution algorithm:
  
      .. math::
  
          minimize(norm((signal)- (phi*f)))
      """
  
      # Create four scalar optimization variables.
      f = cvxpy.Variable(2)
      # Constraints have been set similar to the MIX paper's
      # Supplementary Note 2: Synthetic Data Experiments, experiment 2
      constraints = [
          cvxpy.sum(f) == 1,
          f[0] >= 0.011,
          f[1] >= 0.011,
          f[0] <= self.bounds[1][0],
          f[1] <= 0.89,
      ]
  
      # Form objective.
      obj = cvxpy.Minimize(cvxpy.sum(cvxpy.square(phi @ f - signal)))
  
      # Form and solve problem.
      prob = cvxpy.Problem(obj, constraints)
      prob.solve()  # Returns the optimal value.
      return np.array(f.value)
  
imports: import warnings
  import numpy
  from scipy.optimize import least_squares, differential_evolution
  from dipy.reconst.base import ReconstModel
  from dipy.reconst.multi_voxel import multi_voxel_fit
  from dipy.utils.optpkg import optional_package
label_desc: Use image node_id 5 for calling the IvimModelVP obj's underlying member method code with example usage: obj.cvx_fit(signal, phi) and returns: np