docs: def _update_ps(self, es):
          """update the isotropic evolution path
  
          :type es: CMAEvolutionStrategy
          """
          if not self.is_initialized_base:
              self.initialize_base(es)
          if self._ps_updated_iteration == es.countiter:
              return
          if es.countiter <= es.itereigenupdated:
              # es.B and es.D must/should be those from the last iteration
              assert es.countiter >= es.itereigenupdated
              _print_warning('distribution transformation (B and D) have been updated before ps could be computed',
                            '_update_ps', 'CMAAdaptSigmaBase')
          z = dot(es.B, (1. / es.D) * dot(es.B.T, (es.mean - es.mean_old) / es.sigma_vec))
          z *= es.sp.mueff**0.5 / es.sigma / es.sp.cmean
          self.ps = (1 - self.cs) * self.ps + sqrt(self.cs * (2 - self.cs)) * z
          self._ps_updated_iteration = es.countiter