code: def _ica_par(X, tol, g, fun_args, max_iter, w_init):
      """Parallel FastICA.
  
      Used internally by FastICA --main loop
  
      """
      W = _sym_decorrelation(w_init)
      del w_init
      p_ = float(X.shape[1])
      for ii in moves.xrange(max_iter):
          gwtx, g_wtx = g(fast_dot(W, X), fun_args)
          W1 = _sym_decorrelation(
              fast_dot(gwtx, X.T) / p_ - g_wtx[:, np.newaxis] * W
          )
          del gwtx, g_wtx
          # builtin max, abs are faster than numpy counter parts.
          lim = max(abs(abs(np.diag(fast_dot(W1, W.T))) - 1))
          W = W1
          if lim < tol:
              break
      else:
          warnings.warn(
              "FastICA did not converge. Consider increasing "
              "tolerance or the maximum number of iterations."
          )
  
      return W, ii + 1
  
imports: import warnings
  import numpy
  from scipy import linalg
  from ..base import BaseEstimator, TransformerMixin
  from ..externals import six
  from ..externals.six import moves
  from ..utils import check_array, as_float_array, check_random_state
  from ..utils.extmath import fast_dot
  from ..utils.validation import check_is_fitted
  from ..utils.validation import FLOAT_DTYPES
label_desc: Use image node_id 4 for calling a global function with example usage: _ica_par(X, tol, g, fun_args, max_iter, w_init) and returns: W,  unknown