
    J-jg                         d Z ddlmZmZmZ eZddlZddlm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlmZ [[[dd	lmZ eZdd
lmZ ddZd Zd Z G d de      ZdZ	 dZ	  G d de      Z e       Zy)zversatile container for test objective functions.

For the time being this is probably best used like::

    from cma.fitness_functions import ff

    )absolute_importdivisionprint_functionN)arraydotisscalarsum   )Rotation)utilsrglenbbobbenchmarks)rotatec                     t        |t        j                  t        |             t        |       dz
  dz   z  z  t        j                  |       dz  z        S )zunbound test function, needed to test multiprocessor, as long
    as the other test functions are defined within a class and
    only accessable via the class instancer
   g&.>   )r	   nparangelenasarray)xconds     c/Users/jameslopez/projects/TradingBot25/.venv/lib/python3.12/site-packages/cma/fitness_functions.pyellir   $   sF     tbiiA'3q6A:+<=>APQAQQRR    c                 D    t        t        j                  |       dz        S Nr   )r	   r   r   r   s    r   spherer    )   s    rzz!}a  r   c                     t        |       } t        t        |       dz        }t        dt        |       z  dz        }| |   | |   z
  S )N      )sortedintr   )r   i1i3s      r   _iqrr(   ,   sD    q	A	SVaZB	Qs1vX\	BR51R5=r   c                      e Zd ZdZdZd Zed        Zej                  e_        dXdZ
dYdZdd	 fd
Zd Zd Zd Zd ZdZdZdZdZd Zd Zd Zd ZdgfdZd Zd[dZd Zdd fdZd Zd Zd Zd Zd  Z d! Z!ed"d#fd$Z"ed"dfd%Z#d\d&Z$d' Z%d]d(Z&d^d)Z'd* Z(d+ Z)d_d-Z*d]d.Z+d]d/Z,d0 Z-d1 Z.d`d2Z/dad3Z0d4 Z1d5 Z2dbd6Z3dcd7Z4ddd8Z5ddd9Z6d: Z7ddd;Z8d< Z9ded=Z:d> Z;dfd?Z<dZd@Z=dgdAZ>dB Z?dC Z@dD ZAdE ZBdF ZCdG ZDdH ZEdI ZFdJ ZGdhdKZHdL ZIdM ZJdidNZKdjdOZLdP ZMdQ ZNdR ZOdS ZPdkdTZQeRdbdU       ZSeRdbdV       ZTeRdbdW       ZUy,# e	$ r Y )w xY w)lFitnessFunctionsz(collection of objective functions.

    r   c                      y) N selfs    r   __init__zFitnessFunctions.__init__7   s    r   c                     t         S Nr   r.   s    r   BBOBzFitnessFunctions.BBOB9   s    r   r
   c           	          t        t        j                  t        |                  dkD  r.g }|D ]%  }|j	                  | j                  ||||             ' |S |r |t        |g|       S  ||      S )zLreturns ``fun(rotation(x), *args)``, ie. `fun` applied to a rotated argumentr
   )r   r   shaper   appendrotr   )r/   r   funr7   argsress         r   r7   zFitnessFunctions.rot?   sl    rxxa!"Q&C

488AsC67 Jva'$'((q6Mr   c                 v    t         j                  j                  d      |k  rt         j                  S  ||      S )z*returns sometimes np.nan, otherwise fun(x)r
   )r   randomrandnan)r/   r   r8   ps       r   somenanzFitnessFunctions.somenanK   s)    99>>!q 66Mq6Mr   gHz>c                 0    t        t        |       dz        S N      ?r%   r   r   s    r   <lambda>zFitnessFunctions.<lambda>R   s    3s1vs{3Cr   c                     fdS )Nc                 ^     | d  |              t        j                  | dz        z  z   S r   r   mean)r   Neffepsr8   s    r   rE   z)FitnessFunctions.epslow.<locals>.<lambda>S   s*    QxQ[)C"''!Q$-,??r   r-   )r/   r8   rK   rJ   s    ```r   epslowzFitnessFunctions.epslowR   s	    ??r   c                 F    t         j                  j                  d      d   S )zRandom test objective functionr
   r   )r   r<   r/   r   s     r   r=   zFitnessFunctions.randU   s    yy"1%%r   c                     |d    S )Nr   r-   rN   s     r   linearzFitnessFunctions.linearX   s    !ur   c                    ddk  r't        t        |      dk        rt        j                  S ddk  r>t	        t        |      D cg c]  }d|z   ||   z   c}      dkD  rt        j                  S t	        |       S c c}w )Nr
   r#   r   
   g     j@)anyr   r   r>   r	   r   )r/   r   is      r   lineardzFitnessFunctions.lineardZ   sl    q5SqA&66Mq5S58<8a26QqT/8<=D66MAw =s   A<c                 $    t        |dz   dz        S )-Sphere (squared norm) test objective functionr   r   r	   rN   s     r   r    zFitnessFunctions.sphere`   s     AEA:r   c                     t        |t        |      z  dz         }t        j                  |      t        j                  j                  t        |            d|    }t        |dz        S )z	
        r
   Nr   )r%   r   r   r   r<   permutationr	   )r/   r   visible_ratioms       r   subspace_spherez FitnessFunctions.subspace_sphered   sV    
 A&*+JJqM"))//A7;<1a4yr   c                 P    t        t        j                  |      |z        d|z  z  S )N      ?)r	   r   abs)r/   r   r?   s      r   pnormzFitnessFunctions.pnorml   s"    266!9a< 2a4((r   c                 2    dt        j                  |      z  S r   r   r   r/   r   r9   s      r   grad_spherezFitnessFunctions.grad_spheren   s    Ar   c                 2    t        j                  |      dz
  S Nr
   rc   rd   s      r   grad_to_onezFitnessFunctions.grad_to_onep   s    zz!}q  r   c                 f    d}|d   |k  rt         j                  S |dz   t        |dz   dz        z   S )rW           r   r   )r   r>   r	   )r/   r   cs      r   
sphere_poszFitnessFunctions.sphere_posr   s:     Q4!866M1usAEA:&&r   c                 T    |d   dkD  rt        |dz   dz        S t        j                  S )Nr   r
   r   )r	   r   r>   rN   s     r   spherewithoneconstraintz(FitnessFunctions.spherewithoneconstrainty   s'    "#A$(sAEA:66r   c                 x    t        t        |      |   dkD        r| j                  |      S t        j                  S rg   )allr   ellirotr   r>   r/   r   idxs      r   elliwithoneconstraintz&FitnessFunctions.elliwithoneconstraint{   s-    "%eAhsma&7"8t||ADbffDr   c                 r    t        t        |      dkD        rt        |dz   dz        S t        j                  S Nr
   r   r   )rq   r   r	   r   r>   rN   s     r   spherewithnconstraintsz'FitnessFunctions.spherewithnconstraints~   s,    "%eAhl"3sAEA:??r   c                     | j                  ||      t        j                  d|t        j                  j	                         z  t        |      z  z         z  |t        j                  j                         z  z   S )zWnoise=10 does not work with default popsize, ``cma.NoiseHandler(dimension, 1e7)`` helpsr   r   )r   r   expr<   randnr   r=   )r/   r   noiser   noise_offsets        r   noisyspherezFitnessFunctions.noisysphere   s_    yyy&EBIIOO<M4MPSTUPV4V0V)WWZfikiririwiwiyZyyyr   c                 Z    d|d   z  t        |d         dz  t        |dd dz        z  z   S )z>Sphere (squared norm) with sum x_i = 1 test objective functiong{Gzr   r
   Nr   )r`   r	   rN   s     r   spherewzFitnessFunctions.spherew   s6     qt|c!A$imc!AB%(m;;;r   c                 0    t        t        |       dz        S rB   rD   r   s    r   rE   zFitnessFunctions.<lambda>   s    s3q63;7Gr   c                 |    t        j                  |d ||       dz        |t        j                  |dz        z  z   S )zTODO: define as wrapperNr   rH   )r/   r   rK   rJ   s       r   epslowspherezFitnessFunctions.epslowsphere   s5    wwq$q'{A~&rwwq!t})<<<r   c                 
   | xj                   dz  c_         t        |      }t        t        d|z        D cg c]
  }|||z      c}      }d}t	        |t
        j                  j                  ||         dz        }|S c c}w )rW   r
   r      )size)evaluationsr   r   ranger	   r   r<   randint)r/   r   dimrT   Nfs         r   
partspherezFitnessFunctions.partsphere   s~    A!fuQW~6~!1QW:~67 "))##Ca#01145 7s   B c                 N    t        |dz        dt        ||dk     dz        z  z   S )z8asymmetric Sphere (squared norm) test objective functionr   g    ~.Ar   rX   rN   s     r   sectorspherezFitnessFunctions.sectorsphere   s+    1a4yGs1QU8Q;'7777r   c                     t        |      dz
  }t        |d| dk        rt        j                  S t	        |dz        |z
  S )zFSphere (squared norm) test objective function constraint to the cornerr   Nr
   r   )r   rS   r   r>   r	   )r/   r   nconstrs      r   cornerspherezFitnessFunctions.cornersphere   s=    a&1*q'{Q66M1a4y7""r   c                     t        |dk        rt        j                  S | j                  |      | j                  t        j                  t        |                  z
  S  r
   )rS   r   r>   r   onesr   rN   s     r   
cornerellizFitnessFunctions.cornerelli   s>    q1u:66Myy|diiA888r   c                 `    t        |dk        rt        j                  S | j                  |      S r   )rS   r   r>   rr   rN   s     r   cornerellirotzFitnessFunctions.cornerellirot   s$    q1u:66M||Ar   c                 d    t         j                  j                  d      d   dz  }|dk  r||z  }|S rw   )r   r<   r|   )r/   r   r   s      r   
normalSkewzFitnessFunctions.normalSkew   s3    IIOOAq!1$q5AAr   rR   皙?c                      || |      }t         j                  j                  d      d   t         j                  j                  d      d   z  }t        d|t	        |      t        |      z  ||z  z  |z  z         S )Nr
   r   gҶOɃ;)r   r<   r|   maxfloatr   )r/   r   funcfacexponr   r   s          r   noiseCzFitnessFunctions.noiseC   sh    qMIIOOAq!BIIOOA$6q$995!uSzCF2ah>BBCCr   c                      || |      }t        j                  |      |t        dt        j                  |      z
        z  t         j                  j	                  d      d   z  z   }|d|z  z   S )NrR   r
   r   )r   log10r`   r<   r=   )r/   r   r   r   r   r   Rs          r   r}   zFitnessFunctions.noise   s]    qMHHQK%#b288A;&6"77"))..:KA:NNN 2q5yr   c           
      T   |rt        |      }t        |d         r|gn|}|D cg c]d  }|d   dz  |t        |dd dz        z  z   t        j                  |t        j
                  j                  d      d   z  t        |      z        z  f }}t        |      dkD  r|S |d   S c c}w )zCigar test objective functionr   r   r
   N)r   r   r	   r   r{   r<   r|   r   )r/   r   r7   r   r}   r   s         r   cigarzFitnessFunctions.cigar   s    q	AAaD>QCqhijhicdadAgs1QR5!8},,uryyq?QRS?T7TWZ[\W]7]0^^hijFQJq(AaD( ks   A)B%c                 P    dt        j                  |      z  }|dxx   dz  cc<   |S )Ng    >Ar       .Ar   r   r/   r   r9   grads       r   
grad_cigarzFitnessFunctions.grad_cigar   s&    !$Q3r   c                     t        j                  t        |            t        |      dz  z  }t        ||      |z  }t	        |dz        }||t	        ||z
  dz        z  z  }|S )NrC   r   )r   r   r   r   r	   )r/   r   r   axisprojss         r   diagonal_cigarzFitnessFunctions.diagonal_cigar   s^    wws1vQ,4|d"aL	TCTA&&&r   c           	         t        j                  |      }|r|t        j                  urt	        |      }t        |d         r|gn|}|D cg c]  }||d   dz  z  t        |dd dz        z   ! }}t        |      dkD  r|S |d   S c c}w )zTablet test objective functionr   r   r
   N)r   r   fftabletr   r   r	   r   )r/   r   r   r7   r   s        r   r   zFitnessFunctions.tablet   s    JJqM3bii'q	AAaD>QCq567QTAaD!G^c!AB%(m+Q7FQJq(AaD( 8s   $Bc                 P    dt        j                  |      z  }|dxx   dz  cc<   |S )Nr   r   r   r   r   s       r   grad_tabletzFitnessFunctions.grad_tablet   s%    288A;Q3r   c           	          t        |d         r|gn|}|D cg c]+  }d|d   dz  z  d|d   dz  z  z   t        |dd dz        z   - }}t        |      dkD  r|S |d   S c c}w )Cigtab test objective functionr   g-C6?r        @r
   Nr   r	   r   )r/   yXr   r   s        r   cigtabzFitnessFunctions.cigtab   sx    AaD>QCqEFGQTAaD!G^cAaD!Gm+c!AB%(m;QGFQJq(AaD( H   0ANc                     |xs dt        |      dz  z   }t        j                  |      }t        |||  dz        }||dz  t        |d| dz        z  z  }||dz  t        || d dz        z  z  }|S )zcigtab with 1 + 5% long and short axes.

        `n_axes: int`, if > 0, sets the number of long as well as short
        axes to `n_axes`, respectively.
        r
      r   rC   Ng      )r   r   r   r	   )r/   r   	conditionn_axesr\   r   s         r   cigtab2zFitnessFunctions.cigtab2   s     &a#a&B,&JJqM!QB
O	Y^c!BQ%(m++	Y_s1aRS619~--r   c           	          t        |d         r|gn|}t        |d         dz  }|D cg c](  }|t        |d| dz        z  t        ||d dz        z   * }}t        |      dkD  r|S |d   S c c}w )r   r   r   Nr
   )r   r   r	   )r/   r   r   r   N2r   r   s          r   twoaxeszFitnessFunctions.twoaxes   s    AaD>QCq1Y!^>?@aTC!B
O#c!BC&!)n4a@FQJq(AaD( As   -A-c                 X    t         j                  t        j                  |      d|      S )Nr
   rz   )r   r   r   r   )r/   r   r   s      r   rr   zFitnessFunctions.ellirot   s    wwrzz!}adw33r   c                 h    t        |      }t        t        j                  d|dz         |z  dz        S )Nr
   r   r   r	   r   r   )r/   r   r   s      r   	hyperellizFitnessFunctions.hyperelli   s/    FBIIaQ'!+a/00r   c                 t    t        |      dz  }| j                  |d |       }|dt        ||d  dz        z  z   S )Nr   :0yE>)r   r   r	   )r/   r   lfellis       r   halfellizFitnessFunctions.halfelli   sA    FaK		!BQ% tc!AB%(m+++r   c                 z   t        |d         s%|D cg c]  }| j                  |||||||       c}S t        j                  |      }t	        |      }	|rt        |      }|r%||t        j                  j                  |	      z  z   }|	dkD  r0t        |t        j                  |	      |	dz
  z  z  ||z   dz  z        n
|d   |z   dz  }
|dk(  r|
S dd|	z  z   }t        j                  j                         |z  |
z  t        dd|
dz   z  |t        j                  j                         z  z        z  }|r||
fS |S c c}w )z!Ellipsoid test objective functionr   r
   r_   r   g\(\?g    eAg>N}a+)r   r   r   r   r   r   r<   r|   r	   r   r=   r   )r/   r   r7   xoffsetr   actuator_noise
beta_noisebothxxr   ftruealphar   s                r   r   zFitnessFunctions.elli   sC   !~bcdbc\^DIIb#wnjRVWbcddJJqMFq	ANRYY__Q%777A q5 D299Q<1r623q7{Q6FFG tg~1 	 ?LrAv		 *,u4A%%-0EBIINN<L4LMNO5>!' es   D8c           	          t        dt        |t        |      z        f      }t        |      |k  rd}n0t        |      |z
  dk(  r	|d   dz  }n| j                  ||d |      }|| j                  |d| d|      z   S )zMreturn ellirot(x[:N2]) + elli(x[N2:]) where ``N2`` is roughly ``frac*len(x)``r   r   r
   ro   Nrz   )r7   r   )r   r%   r   r   )r/   r   fraccond1cond2r   r   s          r   ellihalfrotzFitnessFunctions.ellihalfrot  s    !SA'()q6R<AVb[A"qA		!BC&u	-A499QqW!%9888r   c                     d}t        |      }d|t        j                  |      |dz
  z  z  z  t        j                  |      z  S )Nr   r   r_   )r   r   r   r   )r/   r   r9   r   r   s        r   	grad_ellizFitnessFunctions.grad_elli  s>    F4"))A,!b&122RZZ]BBr   c                 H    |d   }t        |      dkD  r|dd nd} ||g| S )z``fun_as_arg(x, fun, *more_args)`` calls ``fun(x, *more_args)``.

        Use case::

            fmin(cma.fun_as_arg, args=(fun,), gradf=grad_numerical)

        calls fun_as_args(x, args) and grad_numerical(x, fun, args=args)

        r   r
   Nr-   )r   )r/   r   r9   r8   	more_argss        r   
fun_as_argzFitnessFunctions.fun_as_arg!  s4     1g #D	ADH2	1!y!!r   c                 (   |ddt        |      z   z  n|}t        j                  t        |            }t        j                  t        |            }t	        |      D ]2  }||   ||<    |||z          |||z
        z
  d||   z  z  ||<   d||<   4 |S )zsymmetric gradientr   r
   r   r   )r`   r   zerosr   r   )r/   r   r   epsilonrK   r   eirT   s           r   grad_numericalzFitnessFunctions.grad_numerical.  s    %,_da#a&j!'xxAXXc!fqAFBqEAF|d1r6l2qQx@DGBqE  r   c                 <   t        |      }t        |t        j                  |      ddd   |dz
  z  z  |dz  z        }|d   dz   |d   dz   d|d   z  z   |d   dz   d|d   z  z
  f}|r||t        d |D              z  z  }|S ||t        d |D              z  z  }|S )	z5ellipsoid test objective function with "constraints" ro   Nr
   r   r   d   c              3   4   K   | ]  }t        d |        yw)r   Nr   .0rk   s     r   	<genexpr>z2FitnessFunctions.elliconstraint.<locals>.<genexpr>@  s     5u!C1Ius   c              3   @   K   | ]  }t        d |dz         dz    yw)r   gMbP?r   Nr   r   s     r   r   z2FitnessFunctions.elliconstraint.<locals>.<genexpr>B  s!     ?AC1t8,a/s   r   )r/   r   cfactoughr   r   r   cvalss           r   elliconstraintzFitnessFunctions.elliconstraint8  s    Fryy|BFF+q1u56A=>11C!A$J&1C!A$J&( 5u5555A  ?????Ar   c           
          t        |d         r|gn|}t        j                  |      }|D cg c]+  }t        ||dd dz  |dd z
  dz  z  d|dd z
  dz  z         - }}t	        |      dkD  r|S |d   S c c}w )z(Rosenbrock test objective function, x0=0r   Nro   r   r
   r_   )r   r   r   r	   r   r/   r   r   r   s       r   rosenzFitnessFunctions.rosenD  s    AaD>QCqJJqMMNOQS!CR&!)ae+a//2#2;2BBCQOFQJq(AaD( Ps   0A4c                     t        j                  |      dz   }t        ||dd dz  |dd z
  dz  z  d|dd z
  dz  z         S )zCRosenbrock test objective function with optimum in all-zeros, x0=-1r
   Nro   r   r_   )r   r   r	   )r/   r   r   s      r   rosen0zFitnessFunctions.rosen0J  sR    JJqMA5AcrFAI!"-11R!CR&[14DDEEr   c                    t        |      }t        j                  |      }d|d   dz
  z  d|d   |d   dz  z
  z  dz  |d   z  z   |d<   t        j                  d|dz
        }d||   dz
  z  d||dz      ||   dz  z
  z  ||   z  z
  d||   ||dz
     dz  z
  z  z   ||<   d||dz
     ||dz
     dz  z
  z  ||dz
  <   |S )Nr   r   r
      r   i  )r   r   r   r   )r/   r   r9   r   r   rT   s         r   
grad_rosenzFitnessFunctions.grad_rosenN  s    Fxx{qtax.3!A$1q.#9B#>1#EEQIIaQqtax.3!AaC&1Q47*:#;ad#BBSAaDSTUVWXUXSY[\S\L\E]]Q1QqS6AacFAI-.QqS	r   c                     t        |d         r|gn|}|D cg c]+  }d|d   z
  dz  t        ||d d dz  |dd  z
  dz  z        z   - }}t        |      dkD  r|S |d   S c c}w )Nr   r_   r   ro   r
   r   r   s       r   rosen_chainedzFitnessFunctions.rosen_chainedV  s}    AaD>QCqKLM1ab1Q4i!^c%1Sb619qu+<q*@"@AA1MFQJq(AaD( Nr   c                     t        j                  |      }t        j                  dt        |            }|d   dz
  dz  t        j                  |dz   d||   dz  z  ||dz
     z
  dz        z   S )aH  Dixon-Price function.

        The function has a local attractor at ``[1/3, 0, ..., 0]`` which
        starts to dominate for dimensions larger than about five. The
        global optimum is ``[1, 0.70710678, ...]`` with the limit of 1/2
        for increasing index.

        >>> import cma
        >>> def xstar(n):
        ...     return [2**-((2**i - 2) / 2**i) for i in range(1, n + 1)]
        >>> assert cma.ff.dixonprice(xstar(4)) < 1e-11, cma.ff.dixonprice(xstar(4))

        see https://al-roomi.org/benchmarks/unconstrained/n-dimensions/236-dixon-price-s-function
        r
   r   r   )r   r   r   r   r   rs   s      r   
dixonpricezFitnessFunctions.dixonpriceZ  si     JJqMii3q6"!q1}rvvcAgAcFAI#a%0H1/LMMMr   c                     t        |      }|rt        |      }t        t        j                  |      ddt        j
                  |      z  |dz
  z  z   z        dz  S )zDiffpow test objective function       @g      @r_   rC   )r   r   r	   r   r`   r   )r/   r   r7   r   s       r   diffpowzFitnessFunctions.diffpowl  sN    Fq	A266!9rBryy|Oq2v$>>?@#EEr   c                     t        |      }t        |dz   dz        }| j                  |d |       | j                  ||d  d      z   S )Nr
   r   rz   )r   r%   r   r   )r/   r   r   Nhalfs       r   	rosenellizFitnessFunctions.rosenellir  sJ    FQUaK zz!FU)$tyy56y'CCCr   c           
          t        |d         r|gn|}|D cg c],  }|d   dt        j                  |dd  dz        |dz  z  z  z   . }}t        |      dkD  r|S |d   S c c}w )Nr   r   r
   r   r  )r   r   r	   r   )r/   r   expor   s       r   ridgezFitnessFunctions.ridgev  sr    AaD>QCqABCAQqTC"&&12*TBY777CFQJq(AaD( Ds   1A c                 z    t        |      }t        |dz        }||z
  dz  |dz  z  ||z  z   t        |      |z  z   S )zka difficult sharp ridge type function.

        A modified implementation of HG Beyers `happycat`.
        r   r   r	   )r/   r   r
  ar   s        r   ridgecirclezFitnessFunctions.ridgecirclez  sG    
 F1IQ
dQh'!a%/#a&1*<<r   c                     t        |dz        }|t        |      z
  dz  |z  |dz  t        |      z   t        |      z  z   dz   S )zNa difficult sharp ridge type function.

        Proposed by HG Beyer.
        r   rC   )r	   r   )r/   r   r   r   s       r   happycatzFitnessFunctions.happycat  sG    
 1ISVa%'1q53q6>SV*CCcIIr   c                      yrg   )r   r<   r=   r   rN   s     r   flatzFitnessFunctions.flat  s    r   c                    |d   }|d   dz   }|d|dz  z  dz  t         j                  dz  z  z
  d|z  t         j                  z  z   dz
  dz  ddd	t         j                  z  z
  z  t        j                  |      z  z   dz   d
z
  S )Nr
   r      gffffff@r   r"      rR         ?g:<v?)r   picos)r/   r   r   s      r   braninzFitnessFunctions.branin  s    aDaD1HC!Q$JNRUUAX--A=AAEaRWZ\Z_Z_R_N_H`cecicijkclHlloqq  uL  L  	Lr   c                    |d   }|d   }d||z   dz   dz  dd|z  z
  d|dz  z  z   d|z  z
  d|z  |z  z   d|dz  z  z   z  z   dd|z  d|z  z
  dz  d	d
|z  z
  d|dz  z  z   d|z  z   d|z  |z  z
  d|dz  z  z   z  z   z  dz
  S )Nr   r
   r         r#   r               0   $      r-   )r/   r   x1x2s       r   goldsteinpricezFitnessFunctions.goldsteinprice  s    qTqTR"Wq[1$R"Wq2q5y(@27(JQQSVVX[(X[\_acd_d[d(deea"fq2vo)R"r'\BQJ-Fb-PSUXZSZ]_S_-_bdgiklglbl-lmmoqrs 	sr   c                     d|z  }dt        j                  t        j                  |t        j                  dt        j                  t        |            z         z              z
  t        |dz        dz  z   S )Ng      ^@r
   r_   r   g     @@)r   prodr  sqrtr   r   r	   rN   s     r   griewankzFitnessFunctions.griewank  s[    N277266!bggb299SV3D.D&E"EFGG#aQRd)VY/YYr   c           
         dt        j                  |      dz
  dz  z   }~t        j                  t         j                  |d   z        dz  }||d   dz
  dz  dt        j                  dt         j                  z  |d   z        dz  z   z  z  }|dd }|t	        |dz
  dz  ddt        j                  t         j                  |z  dz         dz  z  z   z        z   S )zPa rather benign multimodal function.

        xopt == ones, fopt == 0.0
        r
   r"   r   r   ro   rR   )r   r   sinr  r	   )r/   r   wr   s       r   levyzFitnessFunctions.levy  s    
 A"a''FF2551Q4< !#	aeai!^q266!bee)ae*;#<a#??@@aG3AzQbffRUUQY].CQ.F)F%FGHHHr   c                     t        j                  |      }t        t        j                  |      dz  dt        j                  |dz        z  z         }|t        |      dz  z   S )zAmultimodal function with the global optimum at x_i = -1.152740846r   r  r#   g\@)r   r   r	   r`   r-  r   )r/   r   r   s      r   
absplussinzFitnessFunctions.absplussin  sP    JJqMq	3RVVAqD\!1123q68999r   c                 z   t        |d         s]t        |d         }|D cg c]C  }d|z  t        |dz  dt        j                  dt        j
                  z  |z        z  z
        z   E c}S t        |      }d|z  t        |dz  dt        j                  dt        j
                  z  |z        z  z
        z   S c c}w )z!Rastrigin test objective functionr   rR   r   )r   r   r	   r   r  r  )r/   r   r   xis       r   	rastriginzFitnessFunctions.rastrigin  s    !~AaD	APQRPQ"BFSQbffQY^.D)D!DEEPQRRFAvAqD2q255y1}(=#==>>> Ss   AB8c                     t        |      }|d|dz
   dz  |d| dz  z   }t        |dz  t        j                  d|dz  z        dz  dz   z        S )z$ Schaffer function x0 in [-100..100]r   r
   r         ?2   皙?)r   r	   r   r-  )r/   r   r   r   s       r   schafferzFitnessFunctions.schaffer  s\    FaAJMAaFAI%1d7bffR!S&[114q89::r   c                 N    d}d}t        |      D ]  }|||   z  }||dz  z  } |S )Nr   r   r   )r/   r   r   r   rT   s        r   schwefelellizFitnessFunctions.schwefelelli  s;    qA1IAAIA  r   c                    t        |d         r|gn|}t        |d         }t        |D cg c]r  }d|z  d|z  z
  t        |t	        j
                  t	        j                  |      dz        z        z
  |t        t        |      dkD  t        |      dz
  dz  z        z  z   t c}      }t        |      dkD  r|S |d   S c c}w )z2multimodal Schwefel function with domain -500..500r   gгY/z@g3r]>rC   i  r   r
   )r   r   r   r	   r   r-  r`   )r/   r   pen_facr   r   r   s         r   schwefelmultzFitnessFunctions.schwefelmult  s    AaD>QCq!IMNPMN a<-!"33c!bffRVVAYPS^>T:T6UUCQ##a&3,1B BCCDMNP QFQJq(AaD(Ps   A7B>c                     t        t        j                  |            t        j                  t        j                  |            z   S )zSchwefel 2.22 function)r	   r   r`   r)  rN   s     r   schwefel2_22zFitnessFunctions.schwefel2_22  s*    266!9~q	 222r   c                     t        j                  t        |            dz   }||z  d|z
  |dz
  z  z  }t        d|z
        S rg   )r   r   r   r	   )r/   r   nr   s       r   optprobzFitnessFunctions.optprob  sB    IIc!f!EQUa!e$$1q5zr   c                 N    |d   dk  rt         j                  S ||d   z  |d   z   S )z5ridge like linear function with one linear constraintr   r
   )r   r>   )r/   r   thetas      r   linconzFitnessFunctions.lincon  s-    Q4!866Mqt|ad""r   c           	      n    d|d   dz
  dz  z  }||t        |dd d|dd dz  z  z
  dz   dz        z  z  }|S )zneeds exponential number of steps in a non-increasing
        f-sequence.

        x_0 = (-1,1,...,1)
        See Jarre (2011) "On Nesterov's Smooth Chebyshev-Rosenbrock
        Function"

        r6  r   r
   r   Nro   rX   )r/   r   rhor   s       r   rosen_nesterovzFitnessFunctions.rosen_nesterov  sV     AaD1Hq= 	S3!"AcrFAI-1A5666r   c           	      v    t        j                  fdt        dt              dz
        D              }d|z   S )Nc              3      K   | ]]  }|d z
     d|   z  z   dz  d|d z      |dz      z
  dz  z  z   |   d|d z      z  z
  dz  z   d|d z
     |dz      z
  dz  z  z    _ yw)r
   rR   r   r  r"   Nr-   )r   rT   r   s     r   r   z2FitnessFunctions.powel_singular.<locals>.<genexpr>  s      42 Ahad*Q.aAh1q56IA5M1MMdQ1q5\)A-.02aAh1q56IA5M0MN2s   A#A&r
   r   )r   r	   r   r   )r/   r   r:   s    ` r   powel_singularzFitnessFunctions.powel_singular  s8    ff 4#As1vz24 4 3wr   c                 f    dt        |      z  dz  t        |dz  d|dz  z  z
  d|z  z         dz  z   S )z\in [-5, 5]
        found also in Lazar and Jarre 2016, optimum in f(-2.903534...)=0
        g!DC@r
   r"      r   r  r  rN   s     r   styblinski_tangz FitnessFunctions.styblinski_tang  sF     3SV;a?1a4"q!t)#a!e+,q01 	1r   c                 N    t        |dz
  dz        t        |d d |dd  z        z
  S )Nr
   r   ro   rX   rN   s     r   tridzFitnessFunctions.trid  s.    AaC!8}s1Sb6AabE>222r   c           	      "   d}t        dt        |      z   dz        D ]o  }|d|z     }|t        d|z  dz   t        |      dz
  f         }|dt        j                  |d|dz  z  z
        dz  z  dt        j                  |dz         z  z   z  }q |S )zBukin function from Wikipedia, generalized simplistically from 2-D.

        http://en.wikipedia.org/wiki/Test_functions_for_optimizationr   r
   r   r   {Gz?rC   rR   )r   r   minr   r`   )r/   r   r   kzr   s         r   bukinzFitnessFunctions.bukin  s     #a&Q'A!a%A#qsQwAq)*+Arvva$A+o.33dRVVAF^6KKKA ( r   c           
      P   t        j                  |      }t        j                  t        j                  |            t        j                  t        j                  t        j
                  t        j                  |                         z  }|r|dk  r|dt        |      z  z  }|S )a  a multimodal function which is rather unsolvable in larger dimension.

        >>> import functools
        >>> import numpy as np
        >>> import cma
        >>> f = functools.partial(cma.ff.xinsheyang2, termination_friendly=False)
        >>> X = [(i * [0] + (4 - i) * [1.24]) for i in range(5)]
        >>> for x in X: print(x)
        [1.24, 1.24, 1.24, 1.24]
        [0, 1.24, 1.24, 1.24]
        [0, 0, 1.24, 1.24]
        [0, 0, 0, 1.24]
        [0, 0, 0, 0]
        >>> ' '.join(['{0:.3}'.format(f(x)) for x in X])  # [np.round(f(x), 3) for x in X]
        '0.091 0.186 0.336 0.456 0.0'

        One needs to solve a trinary deceptive function where f-value (to
        be minimized) is monotonuously decreasing with increasing distance
        to the global optimum >= 1. That is, the global optimum is
        surrounded by 3^n - 1 local optima that have the better values the
        further they are away from the global optimum.

        Conclusion: it is a rather suspicious sign if an algorithm finds the global
        optimum of this function in larger dimension.

        See also http://benchmarkfcns.xyz/benchmarkfcns/xinsheyangn2fcn.html
    r
   r_   )r   r   r	   r`   r{   r-  squarer   )r/   r   termination_friendlyvals       r   xinsheyang2zFitnessFunctions.xinsheyang2  sr    8 JJqMffRVVAY"&&"&&		!1E*F)F"GGC!GBQKC
r   c                 f    t         t        fdt        |       D              }|r|S |t        S |S )a}  return ``sum_i(0 if (optimum[0] <= x[i] <= optimum[1]) else 2**i)``

        to be minimized and add `binary_foffset` at the optimum.

        Details: the result is computed as `int`, because in dimension > 54
        a `float` representation can not account for the least sensitive
        bit anymore. Because we minimize, this is not necessarily a big
        problem.
        c              3   Z   K   | ]"  \  }}d    |cxk  rd   k  rn nd nd|z   $ yw)r   r
   r   Nr-   )r   rT   r[  optimums      r   r   z*FitnessFunctions.binval.<locals>.<genexpr>,  s:      -+VQ ajC571:51a4?+s   (+)binary_optimum_intervalsum_	enumeratebinary_foffsetr   foffsetr   r_  s      @r   binvalzFitnessFunctions.binval   s;     * -(|- -qIW_>I'Ir   c                     t         }t        |       }| D ]  }|d   |cxk  r|d   k  r	n n|dz  } n |r|S |t        S |S )zreturn ``len(x) - nb of leading-ones-in-x`` to be minimized,

        where only values in [optimum[0], optimum[1]] are considered to be
        "equal to" 1 and add `binary_foffset` at the optimum.

        r   r
   )r`  r   rc  )r   re  r_  r   r3  s        r   leadingoneszFitnessFunctions.leadingones/  sU     *FBqzR-71:-Q	 
 qIW_>I'Ir   c                 T    t         t        fd| D              }|r|S |t        S |S )zreturn ``sum_i(0 if (optimum[0] <= x[i] <= optimum[1]) else 1)``

        to be minimized and add `binary_foffset` at the optimum.
        c              3   N   K   | ]  }d    |cxk  rd   k  rn nd nd  yw)r   r
   Nr-   )r   r[  r_  s     r   r   z*FitnessFunctions.onemax.<locals>.<genexpr>F  s+     JgajC571:51<s   "%)r`  ra  rc  rd  s      @r   onemaxzFitnessFunctions.onemax?  s0     *JJJqIW_>I'Ir   )r
   r-   )r8  )rC   )g	">r_   r8  )r   r   r   r   )r   r   )    חAN)r   r   r   rj   r   F)rC   r   r   r2   )rm  Tr   )g      Y@)r   )r   )r  )r   )rS  )r   )T)V__name__
__module____qualname____doc__r   r0   propertyr3   r   	Exceptionr7   r@   rL   r=   rP   rU   r    r]   ra   re   rh   rl   rn   ru   rx   r   r   r   r   r   r   r   r   r   r   r}   r   r   r   r   r   r   r   r   rr   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r'  r+  r/  r1  r4  r9  r;  r>  r@  rC  rF  rI  rL  rO  rQ  rW  r\  staticmethodrf  rh  rk  r-   r   r   r*   r*   2   s#    K &.. #)C @&)!'7,.4 E@z< #'-G =
8#9


 $3 D #! 	)))
)41,.	9C"	)F)N$FD)=J(L
s
Z
I:?;)3#
13	 D J J J J J JG ds   E EEr*   )rC   g      ?rj   c                   r    e Zd ZdZddZd Zd Zd Zed        Z	ed        Z
ed        Zdd
Zed        Zy	)	_coco_F_0a  return a "normalized" BBOB function, funID=1..24 when suite='bbob'.

    The `fun` attribute is the original function which also provides the
    `fun.final_target_hit` attribute. The `suite` attribute contains all
    nonnormalized problems from the standard full suite with the given
    `funID` and 15 instances with numbers ``>= instance``.

    `self.x_add` is the additional x-offset and can be set to zero to recover
    the orginal x-offset and optimum.
    c                    t        d t        t               j                               D              | _        ddl}||j                  vr%t        dj                  ||j                              |j                  |dj                  ||dz         dt        |      z         | _        | j                  j                  |||      | _        | j                          | j                  j                  |||      | _        y)z$initialize or re-initialize ``self``c              3   0   K   | ]  }|d    dk7  r|  yw)r   r/   Nr-   )r   r   s     r   r   z%_coco_F_0.__init__.<locals>.<genexpr>c  s#      &91GA)*1 '(1Gs   r   Nz0Sorry, suite '{0}' is not known, choices are {1}zinstances: {0}-{1}r  zfunction_indices: )dictlistlocalsitems_input_parameterscocoexknown_suite_names
ValueErrorformatSuitestrsuite*get_problem_by_function_dimension_instancer8   set_opt)r/   funID	dimensionr  instancer~  s         r   r0   z_coco_F_0.__init__a  s    !% &9fhnn6F1G &9 "9000O$fUF,D,DEG G\\%,33HhmL,s5z9;
 ::HH9h(::HH9h(r   c                 N    |dk(  rt        d      t        | j                  |      S )N_best_parameterz+_coco_F_0 has not attribute _best_parameter)AttributeErrorgetattrr8   )r/   names     r   __getattr__z_coco_F_0.__getattr__q  s(    $$ !NOOtxx&&r   c                     | j                   j                  d       t        j                  d      | _        | j                  | _        | j                  | j                        | _        | j                   | _        y )Nprintz!._bbob_problem_best_parameter.txt)r8   r  r   loadtxtx_optx_addf_optf_addr.   s    r   r  z_coco_F_0.set_optu  sQ      )ZZ CD
ZZ
XXdjj)
jj[
r   c                 X    | j                  | j                  |z         | j                  z   S r2   )r8   r  r  rN   s     r   __call__z_coco_F_0.__call__{  s"    xx

Q'$**44r   c                 H    | j                   j                  | j                  z
  S r2   )r8   lower_boundsr  r.   s    r   r  z_coco_F_0.lower_bounds}      xx$$tzz11r   c                 H    | j                   j                  | j                  z
  S r2   )r8   upper_boundsr  r.   s    r   r  z_coco_F_0.upper_bounds  r  r   c                 H    | j                   j                  | j                  z
  S r2   )r8   initial_solutionr  r.   s    r   r  z_coco_F_0.initial_solution  s    xx((4::55r   Nc                 R    | j                   j                  |      | j                  z
  S r2   )r8   initial_solution_proposalr  )r/   restart_numbers     r   r  z#_coco_F_0.initial_solution_proposal  s     xx11.ADJJNNr   c                 .    | j                   j                  S r2   )r8   final_target_hitr.   s    r   r  z_coco_F_0.final_target_hit  s    xx(((r   )rR   bbobr
   r2   )rn  ro  rp  rq  r0   r  r  r  rr  r  r  r  r  r  r-   r   r   rv  rv  V  si    	( '!52 22 26 6O) )r   rv  rl  ) rq  
__future__r   r   r   r	   ra  numpyr   r   r   r   transformationsr   	utilitiesr   utilities.utilsr   r,   r   r3   fitness_transformationsr   r   r    r(   objectr*   r`  rc  rv  r   r-   r   r   <module>r     s    
   , + %  "~  +S
!UJv UJn %  #4) 4)n r   