class_docstr: Multiobjective CMA-ES strategy based on the paper [Voss2010]_. It
  is used similarly as the standard CMA-ES strategy with a generate-update
  scheme.
  
  :param population: An initial population of individual.
  :param sigma: The initial step size of the complete system.
  :param mu: The number of parents to use in the evolution. When not
             provided it defaults to the length of *population*. (optional)
  :param lambda_: The number of offspring to produce at each generation.
                  (optional, defaults to 1)
  :param indicator: The indicator function to use. (optional, default to
                    :func:`~deap.tools.hypervolume`)
  
  Other parameters can be provided as described in the next table
  
  +----------------+---------------------------+----------------------------+
  | Parameter      | Default                   | Details                    |
  +================+===========================+============================+
  | ``d``          | ``1.0 + N / 2.0``         | Damping for step-size.     |
  +----------------+---------------------------+----------------------------+
  | ``ptarg``      | ``1.0 / (5 + 1.0 / 2.0)`` | Target success rate.       |
  +----------------+---------------------------+----------------------------+
  | ``cp``         | ``ptarg / (2.0 + ptarg)`` | Step size learning rate.   |
  +----------------+---------------------------+----------------------------+
  | ``cc``         | ``2.0 / (N + 2.0)``       | Cumulation time horizon.   |
  +----------------+---------------------------+----------------------------+
  | ``ccov``       | ``2.0 / (N**2 + 6.0)``    | Covariance matrix learning |
  |                |                           | rate.                      |
  +----------------+---------------------------+----------------------------+
  | ``pthresh``    | ``0.44``                  | Threshold success rate.    |
  +----------------+---------------------------+----------------------------+
  
  .. [Voss2010] Voss, Hansen, Igel, "Improved Step Size Adaptation
     for the MO-CMA-ES", 2010.
class_docstr_tok: ["Multiobjective","CMA-ES","strategy","based","on","the","paper","[","Voss2010","]","_",".","It","is","used","similarly","as","the","standard","CMA-ES","strategy","with","a","generate-update","scheme",".",":","param","population",":","An","initial","population","of","individual",".",":","param","sigma",":","The","initial","step","size","of","the","complete","system",".",":","param","mu",":","The","number","of","parents","to","use","in","the","evolution",".","When","not","provided","it","defaults","to","the","length","of","*","population","*",".","(","optional",")",":","param","lambda_",":","The","number","of","offspring","to","produce","at","each","generation",".","(","optional",",","defaults","to","1",")",":","param","indicator",":","The","indicator","function","to","use",".","(","optional",",","default","to",":","func",":","`","~deap.tools.hypervolume","`",")","Other","parameters","can","be","provided","as","described","in","the","next","table","+","--","--","--","--","--","--","--","--","+","--","--","--","--","--","--","--","--","--","--","--","--","--","-+","--","--","--","--","--","--","--","--","--","--","--","--","--","--","+","|","Parameter","|","Default","|","Details","|","+================+===========================+============================+","|","``","d","``","|","``","1.0","+","N","\/","2.0","``","|","Damping","for","step-size",".","|","+","--","--","--","--","--","--","--","--","+","--","--","--","--","--","--","--","--","--","--","--","--","--","-+","--","--","--","--","--","--","--","--","--","--","--","--","--","--","+","|","``","ptarg","``","|","``","1.0","\/","(","5","+","1.0","\/","2.0",")","``","|","Target","success","rate",".","|","+","--","--","--","--","--","--","--","--","+","--","--","--","--","--","--","--","--","--","--","--","--","--","-+","--","--","--","--","--","--","--","--","--","--","--","--","--","--","+","|","``","cp","``","|","``","ptarg","\/","(","2.0","+","ptarg",")","``","|","Step","size","learning","rate",".","|","+","--","--","--","--","--","--","--","--","+","--","--","--","--","--","--","--","--","--","--","--","--","--","-+","--","--","--","--","--","--","--","--","--","--","--","--","--","--","+","|","``","cc","``","|","``","2.0","\/","(","N","+","2.0",")","``","|","Cumulation","time","horizon",".","|","+","--","--","--","--","--","--","--","--","+","--","--","--","--","--","--","--","--","--","--","--","--","--","-+","--","--","--","--","--","--","--","--","--","--","--","--","--","--","+","|","``","ccov","``","|","``","2.0","\/","(","N","*","*","2","+","6.0",")","``","|","Covariance","matrix","learning","|","|","|","|","rate",".","|","+","--","--","--","--","--","--","--","--","+","--","--","--","--","--","--","--","--","--","--","--","--","--","-+","--","--","--","--","--","--","--","--","--","--","--","--","--","--","+","|","``","pthresh","``","|","``","0.44","``","|","Threshold","success","rate",".","|","+","--","--","--","--","--","--","--","--","+","--","--","--","--","--","--","--","--","--","--","--","--","--","-+","--","--","--","--","--","--","--","--","--","--","--","--","--","--","+","..","[","Voss2010","]","Voss",",","Hansen",",","Igel",",","``","Improved","Step","Size","Adaptation","for","the","MO-CMA-ES","''",",","2010","."]
docstr: Update the current covariance matrix strategies from the
  *population*.
  
  :param population: A list of individuals from which to update the
                     parameters.
docstr_tok: ["Update","the","current","covariance","matrix","strategies","from","the","*","population","*",".",":","param","population",":","A","list","of","individuals","from","which","to","update","the","parameters","."]
code: def update(self, population):
      """Update the current covariance matrix strategies from the
      *population*.
  
      :param population: A list of individuals from which to update the
                         parameters.
      """
      chosen, not_chosen = self._select(population + self.parents)
  
      cp, cc, ccov = self.cp, self.cc, self.ccov
      d, ptarg, pthresh = self.d, self.ptarg, self.pthresh
  
      # Make copies for chosen offspring only
      last_steps = [
          self.sigmas[ind._ps[1]] if ind._ps[0] == "o" else None
          for ind in chosen
      ]
      sigmas = [
          self.sigmas[ind._ps[1]] if ind._ps[0] == "o" else None
          for ind in chosen
      ]
      invCholesky = [
          self.invCholesky[ind._ps[1]].copy()
          if ind._ps[0] == "o"
          else None
          for ind in chosen
      ]
      A = [
          self.A[ind._ps[1]].copy() if ind._ps[0] == "o" else None
          for ind in chosen
      ]
      pc = [
          self.pc[ind._ps[1]].copy() if ind._ps[0] == "o" else None
          for ind in chosen
      ]
      psucc = [
          self.psucc[ind._ps[1]] if ind._ps[0] == "o" else None
          for ind in chosen
      ]
  
      # Update the internal parameters for successful offspring
      for i, ind in enumerate(chosen):
          t, p_idx = ind._ps
  
          # Only the offspring update the parameter set
          if t == "o":
              # Update (Success = 1 since it is chosen)
              psucc[i] = (1.0 - cp) * psucc[i] + cp
              sigmas[i] = sigmas[i] * exp(
                  (psucc[i] - ptarg) / (d * (1.0 - ptarg))
              )
  
              if psucc[i] < pthresh:
                  xp = numpy.array(ind)
                  x = numpy.array(self.parents[p_idx])
                  pc[i] = (1.0 - cc) * pc[i] + sqrt(cc * (2.0 - cc)) * (
                      xp - x
                  ) / last_steps[i]
                  invCholesky[i], A[i] = self._rankOneUpdate(
                      invCholesky[i], A[i], 1 - ccov, ccov, pc[i]
                  )
              else:
                  pc[i] = (1.0 - cc) * pc[i]
                  pc_weight = cc * (2.0 - cc)
                  invCholesky[i], A[i] = self._rankOneUpdate(
                      invCholesky[i],
                      A[i],
                      1 - ccov + pc_weight,
                      ccov,
                      pc[i],
                  )
  
              self.psucc[p_idx] = (1.0 - cp) * self.psucc[p_idx] + cp
              self.sigmas[p_idx] = self.sigmas[p_idx] * exp(
                  (self.psucc[p_idx] - ptarg) / (d * (1.0 - ptarg))
              )
  
      # It is unnecessary to update the entire parameter set for not chosen individuals
      # Their parameters will not make it to the next generation
      for ind in not_chosen:
          t, p_idx = ind._ps
  
          # Only the offspring update the parameter set
          if t == "o":
              self.psucc[p_idx] = (1.0 - cp) * self.psucc[p_idx]
              self.sigmas[p_idx] = self.sigmas[p_idx] * exp(
                  (self.psucc[p_idx] - ptarg) / (d * (1.0 - ptarg))
              )
  
      # Make a copy of the internal parameters
      # The parameter is in the temporary variable for offspring and in the original one for parents
      self.parents = chosen
      self.sigmas = [
          sigmas[i] if ind._ps[0] == "o" else self.sigmas[ind._ps[1]]
          for i, ind in enumerate(chosen)
      ]
      self.invCholesky = [
          invCholesky[i]
          if ind._ps[0] == "o"
          else self.invCholesky[ind._ps[1]]
          for i, ind in enumerate(chosen)
      ]
      self.A = [
          A[i] if ind._ps[0] == "o" else self.A[ind._ps[1]]
          for i, ind in enumerate(chosen)
      ]
      self.pc = [
          pc[i] if ind._ps[0] == "o" else self.pc[ind._ps[1]]
          for i, ind in enumerate(chosen)
      ]
      self.psucc = [
          psucc[i] if ind._ps[0] == "o" else self.psucc[ind._ps[1]]
          for i, ind in enumerate(chosen)
      ]
  
imports: import copy
  from math import sqrt, log, exp
  from itertools import cycle
  import warnings
  import numpy
  from .None import tools
label_desc: Use image node_id 5 for calling the StrategyMultiObjective obj's underlying member method code with example usage: obj.update(population) without return types