docs: def _refit(self):
          """Update the map :math:`\pi` keeping the output :math:`g` fixed
  
          Use Eq. (7) and below in [GR04]_
  
          """
          # temporary variables for manipulation
          mu_diff = np.empty_like(self.f.components[0].mu)
          sigma   = np.empty_like(self.f.components[0].sigma)
          mean    = np.empty_like(mu_diff)
          cov     = np.empty_like(sigma)
  
          for j, c in enumerate(self.g.components):
              # stop if inv_map is empty for j-th comp.
              if not self.inv_map[j]:
                  self.g.weights[j] = 0.
                  continue
  
              # (re-)initialize new mean/cov to zero
              mean[:] = 0.0
              cov[:] = 0.0
  
              # compute total weight and mean
              self.g.weights[j] = self.f.weights[self.inv_map[j]].sum()
              for i in self.inv_map[j]:
                  mean += self.f.weights[i] * self.f.components[i].mu
  
              # rescale by total weight
              mean /= self.g.weights[j]
  
              # update covariance
              for i in self.inv_map[j]:
                  # mu_diff = mu'_j - mu_i
                  mu_diff[:] = mean
                  mu_diff -= self.f.components[i].mu
  
                  # sigma = (mu'_j - mu_i) (mu'_j - mu_i)^T
                  sigma[:] = np.outer(mu_diff, mu_diff)
  
                  # sigma += sigma_i
                  sigma += self.f.components[i].sigma
  
                  # multiply with alpha_i
                  sigma *= self.f.weights[i]
  
                  # sigma_j += alpha_i * (sigma_i + (mu'_j - mu_i) (mu'_j - mu_i)^T
                  cov += sigma
  
              # 1 / beta_j
              cov /= self.g.weights[j]
  
              # update the Mixture
              c.update(mean, cov)