
    J-ju                       d Z ddlmZmZmZmZ dZddlZddlZddl	Z	ddl
Z
ddlZddlmZ ddlmZ ddlmZ dd	lmZ ej*                  Zej.                  Zd
Z	 dZ	  ed      Z	 dZ	 d Zd Zd Zd dZ d!dZ! G d dejD                        Z#da$i a%	 	 	 d"dZ&e&j                   e#jL                  j                   jO                  dd      d   z   e&_         d#dZ(d$dZ) G d de*      Z+ G d de*      Z,d Z-d Z.y)%z<logger class mainly to be used with `CMAEvolutionStrategy`

    )absolute_importdivisionprint_functionunicode_literalszNikolaus HansenN   )
interfaces)utils)math)restricted_gaussian_samplerF d   i  c                     | S N )xs    X/Users/jameslopez/projects/TradingBot25/.venv/lib/python3.12/site-packages/cma/logger.py_idr   !   s    H    c                 4   | }t        |dz        }|dk(  rd}|d|z  z  }t        |dz        }|d|z  z  }t        |dz        }||dz  z  }|rdj                  |||      S |rdj                  ||      S |rdj                  ||      S d	j                  |      S )
z1return `*d**h**` or `*h**` or `*m**s` or `*.*sec`iQ r   r   i  <   z{0}d{1:02d}h{2:02d}z{0}h{1:02d}z{0}m{1:02.0f}sz{0:.1f} sec)intformat)secsec_dhms        r   seconds2strr   $   s    DDIAAvIMDD4KAD1HDD2IAAFND$++Aq!44##Aq))&&q$//%%r   c                     ddl m}   |        }|j                         D ]  }|j                  t                |j
                  D ]   }|j
                  |   j                  d       " |j                  d       |j                         d   dk  r8|j                  d|j                         d   z  |j                         d          y|j                  d       y)zminimize space wasted below x=0r   )gcag       r   N)matplotlib.pyplotr    	get_linesset_clip_onclip_onspines
set_zorderset_ymarginget_xlimset_xlimset_xmargin)r    alinekeys       r   _fix_lower_xlim_and_clippingr.   7   s    %A! xx	  # MM!zz|Azz*qzz|A.

Q@ 	
ar   c                     |r| S t        j                  |       } t        j                  |       }|dk  }t        j                  |      s| S t        j                  |      d   D ]  }| |dz   dxxx ||   z  ccc  | S )zmake x monotone if ``not iabscissa``.

    Useful to plot restarted runs where the iteration is reset after
    each restart.

    TODO: handle same iteration number better, but how?
    Currently we assume it was written "on purpose" twice.
    r   r   N)npasarraydiffanynonzero)r   	iabscissar   idxsis        r   _monotone_abscissar8   G   ss     


1A

Aq5D66$<ZZa 	!A#$1Q4 !Hr   c                 r    |s| S | j                  |      r!| dt        |        } | j                  |      r!| S )z#remove trailing sequence repeatedlyN)endswithlen)sends     r   _remove_trailingr>   [   s8    
**S/jCyM **S/Hr   c                      e Zd ZdZdej
                  z   ZedddfdZed        Z	d)dZ
d*d	Zd*d
Zd+dZd Zd*dZd,dZd-dZd Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 d.dZ	 	 d/dZd0dZd1dZd2dZd3dZ	 	 d3dZd4dZd5dZed        Zd6dZd7dZed        Z ddd ddi fd!Z!d8d"Z"d9d#Z#d:d$Z$	 	 d;d%Z%d<d&Z&d=d'Z'd( Z(y)>CMADataLoggera  data logger for class `CMAEvolutionStrategy`.

    The logger is identified by its name prefix and (over-)writes or
    reads according data files. Therefore, the logger must be
    considered as *global* variable with unpredictable side effects,
    if two loggers with the same name and on the same working folder
    are used at the same time.

    Examples
    ========
    ::

        import cma

        es = cma.CMAEvolutionStrategy(12 * [3], 4)
        es.optimize(cma.ff.elli, callback=es.logger.plot)

    plots into the current `matplotlib` figure (or opens one if none
    exists) via a generic callback. ``es.optimize`` already adds by default
    ``es.logger.add`` to its callback list to add data to the logger. This
    call::

        x, es = cma.fmin2(cma.ff.elli, 12 * [3], 4, {'verb_plot': 1})

    is very similar, but plots hard-coded into figure number 324::

        es = cma.CMAEvolutionStrategy(...)
        logger = cma.CMADataLogger().register(es)
        while not es.stop():
            ...
            logger.add()  # add can also take an argument

        logger.plot() # or a short cut can be used:
        cma.plot()  # plot data from logger with default name into new figure

        logger2 = cma.CMADataLogger('just_another_filename_prefix').load()
        logger2.plot()
        logger2.disp()

        import cma
        from matplotlib.pylab import *
        res = cma.fmin(cma.ff.sphere, rand(10), 1e-0)
        logger = res[-1]  # the CMADataLogger
        logger.load()  # by "default" data are on disk
        semilogy(logger.f[:,0], logger.f[:,5])  # plot f versus iteration, see file header
        cma.s.figshow()

    Details
    =======
    After loading data, the logger has the attributes `xmean`, `xrecent`,
    `std`, `f`, `D` and `corrspec` corresponding to ``xmean``,
    ``xrecentbest``, ``stddev``, ``fit``, ``axlen`` and ``axlencorr``
    filename trails.

    :See: `disp` (), `plot` ()
outcmaesr   Fc                    |t         j                  }t        j                  j	                  |      r|j                  d      rt        d      t        j                  j                  t        j                  j                  t        j                  j                  |             | _
        |C|j                  t        j                  df      r"| j                  t        j                  z   | _
        d| _        	 d| _        d| _        	 d| _        d| _        	 d| _        	 d	| _        	 || _        	 || _        	 || _        	 d
| _        	 d
| _        d
| _        d| _        i | _        d| _        d| _        t;        j<                         | _        d| _         t;        jB                         jE                         | _#        t;        jB                         | _$        y)af  initialize logging of data from a `CMAEvolutionStrategy` instance.

        Default ``modulo=1`` means logging with each call of `add`. If
        ``append is True`` data is appended to already existing data of a
        logger with the same name. Additional eigendecompositions are
        allowed only every `expensive_modulo`-th logged iteration.
        N.tar.gzzCsorry, you need to unzip the file manually and pass the folder name/)axlen	axlencorr	axlenprecfitstddevsigvecxmeanxrecentbestzstoppings.json2zparameters.json2)DcorrspecprecspecfstdrJ   rK   xrecent)rQ   rJ   rK   rR   r   Fr         ?)%r@   default_prefixospathisfiler:   NotImplementedErrorabspathjoinsplitname_prefixsep
file_namesfile_stoppings	stoppingsfile_parameters
parameters	key_names_key_names_with_annotationmoduloappendexpensive_modulocounterlast_iterationlast_skipped_iteration
registeredlast_correlation_spectrum_eigen_counterskip_finalize_plottingr	   DictFromTagsInStringpersistent_communication_dict"relative_allowed_time_for_plottingElapsedWCTimepause
timer_plot	timer_all)selfr\   re   rf   rg   s        r   __init__zCMADataLogger.__init__   s    '66K77>>+&;+?+?	+J% 'B C C77??277<<{9S+TU"{';';RVVSM'J#//"&&8D3X/818`6*O'EI% 0i&&'#)+&&+#-2-G-G-I*2;/--/557,,.r   c                 j    i }| j                   D ]!  }| j                  j                  |d      ||<   # |S )zreturn dictionary with data.

        If data entries are None or incomplete, consider calling
        ``.load().data`` to (re-)load the data from files first.

        N)rc   __dict__get)rv   r   names      r   datazCMADataLogger.data   s6     NNDmm''d3AdG #r   Nc                 F    || _         ||| _        ||| _        d| _        | S )zregister a `CMAEvolutionStrategy` instance for logging,
        ``append=True`` appends to previous data logged under the same name,
        by default previous data are overwritten.

        T)esrf   re   rk   )rv   r~   rf   re   s       r   registerzCMADataLogger.register   s1      DK DKr   c           	      N   ||| _         	 | j                  }d| _        d| _        | j                   dk  r| S t
        j                  j                  | j                        r=	 t        j                  t
        j                  j                  | j                               | j                  dz   }	 t        |d      5 }|j                  t        t        |j                                     ddd       | j                  dz   }d	t-        |j.                  d
         dt1        j2                         }	 t        |d      5 }|j                  d|z   dz   | j4                  j6                  z   dz          ddd       | j                  dz   }	 t        |d      5 }|j                  d|z   dz          ddd       dD ]>  }| j                  |z   }	 t        |d      5 }|j                  d|z   dz          ddd       @ | j                  dz   }	 t        |d      5 }|j                  d|z   dz   | j4                  j6                  z   dz          ddd       | j                  dz   }	 t        |d      5 }|j                  d|z   dz   | j4                  j6                  z   dz          ddd       | j                  dz   }	 t        |d      5 }|j                  d|z   dz   | j4                  j6                  z          |j                  d       t9        j:                  |j<                  j>                        dkD  rC|j                  djA                  tC        t,        |j<                  j>                                     n.|j                  t-        |j<                  j>                               |j                  d       t9        j:                  |j<                  jD                        dkD  rC|j                  djA                  tC        t,        |j<                  jD                                     n.|j                  t-        |j<                  jD                               |j                  d       ddd       | j                  dz   }	 t        |d      5 }|j                  d|z   dz   | j4                  j6                  z   dz          ddd       | S # t        $ r 	 t        d      w xY w# t        $ r Y @w xY w# 1 sw Y   xY w# t         t        f$ r t#        d|z          Y t$        $ r8}t'        j(                  dj+                  t        |                   Y d}~Zd}~ww xY w# 1 sw Y   xY w# t         t        f$ r t#        d|z          Y 	w xY w# 1 sw Y   xY w# t         t        f$ r t#        d|z          Y w xY w# 1 sw Y   xY w# t         t        f$ r t#        d|z          Y -w xY w# 1 sw Y   xY w# t         t        f$ r t#        d|z          Y w xY w# 1 sw Y   xY w# t         t        f$ r t#        d|z          Y w xY w# 1 sw Y   xY w# t         t        f$ r t#        d|z          Y w xY w# 1 sw Y   | S xY w# t         t        f$ r t#        d|z          Y | S w xY w)zLreset logger, overwrite original files, `modulo`: log only every modulo callNz#call register() before initialize()r   x0.datwzcould not open file z2could not save `X0` due to this exception:
    {0}fit.datzseed=seed, z% # columns="iteration, evaluation, sigma, axis ratio, bestever, best, median, worst objective function value, interquartile range, 25%tile, current best feasible f-value, elapsed wallclock time [s], further/more values", 
	axlen.datz% # columns="iteration, evaluation, sigma, max axis length,  min axis length, all principal axes lengths  (sorted square roots of eigenvalues of C)", zcould not open/write file )axlencorr.dataxlenprec.datz% # columns="iteration, evaluation, min 25%tile 75%tile max correlation, correlation matrix principal axes lengths  (sorted square roots of eigenvalues of correlation matrix)", 
stddev.datzf% # columns="iteration, evaluation, sigma, void, void,  stds==sigma*sigma_vec.scaling*sqrt(diag(C))", 
sigvec.datzs% # columns="iteration, evaluation, sigma, beta, void,  sigvec==sigma_vec.scaling factors from diagonal decoding", 	xmean.datz>% # columns="iteration, evaluation, void, void, void, xmean", z # scaling_of_variables: r    z, typical_x: xrecentbest.datz4% # columns="iter, evals, sigma, 0, fitness, xbest" )#re   r~   AttributeErrorrh   ri   rU   rV   dirnamer\   makedirsOSErroropenwritereprlistx0IOErrorprint	Exceptionwarningswarnr   stroptstimeasctimerp   as_python_tagr0   sizegpscalesrZ   map	typical_x)rv   re   r~   fnrP   estrseedtimer{   s           r   
initializezCMADataLogger.initialize   s!    DK	HB
 ;;!K 77??4++,BGGOOD,<,<=>
 (	ab#!T"%%[)*  	)'*2776?';T\\^L	/b#! 1 $$   $AAOOP 	 	  +		5b#! H $	$
    7D!!D(B3"c]aGG ] (( !	! " # 7 ,	/b#! J#$   $AAOOP 	   ,	/b#! W#$   $AAOOP 	   +	5b#!X#$#AAOOP  3477255<<(1,GGCHHSbeell%;<=GGC-.(77255??+a/GGCHHSbeeoo%>?@GGC01 &  11	5b#!N#$#AAOOP    q  	H !FGG	H   ! 	/(2-. 	aMMOVVW[\]W^_``	a  ! 	/(2-.	/
  ! 	5.34	5
 #] W% 3,r123  ! 	/(2-.	/
  ! 	/(2-.	/
   ! 	5.34	5
   ! 	5.34	5s  R7  <S ,S- 8.S &S- .U :2U,U V V(V V?V2)V?W0 2W#W0 X! %2XX! /Y ;FYY /Z ;2Y6-Z 7S	SS S*%S- -UU-UUUU U>=U>VV V/.V/2V<	7V??W W #W-(W0 0XXXX! !YYY
Y Y32Y36Z ;Z  Z Z$#Z$c                 ^   |s| j                   }t        | j                        t        | j                        k(  sJ t	        |d      | j
                  z   }	 t        |d      5 }|j                         j                         | _	        ddd       t	        |d      dz   }	 t        |d      5 }|j                         j                         | _        ddd       t	        |d      | j$                  z   }	 t        |d      5 }|j                         j                         | _        ddd       	 ddl}|j+                  | j&                        | _        t-        t        | j                              D ]  }|| j                  |   z   dz   }	 t        j.                         5  t        j0                  d	t2        
       | j                  |   dv rt        j0                  d	       	 t5        t7        j8                  |ddgd            | j:                  | j                  |   <   ddd       t        |      5 }| jR                  jU                  |jW                                ddd       	 | j                  |   | j^                  v rH| j:                  | j                  |      jO                  | j:                  | j                  |      d          t7        j`                  | j:                  | j                  |            | j:                  | j                  |   <    | j                  D ][  }	 te        | |      }t        |      st        |jh                        dk(  s5tk        | ||jm                  dt        |      f             ] | S # 1 sw Y   xY w# t        $ rV}t        j                  j                  |      r%t        j                  dj!                  ||             d| _	        Y d}~Td}~ww xY w# 1 sw Y   xY w# t        $ rO}t        j                  j                  |      r%t        j                  dj!                  ||             Y d}~td}~ww xY w# 1 sw Y   4xY w# t        $ rV}t        j                  j                  |      r%t        j                  dj!                  ||             d| _        Y d}~d}~ww xY w# t        $ r;}t        j                  dj!                  | j&                  ||             Y d}~d}~ww xY w# t        $ r 	 t5        t7        j8                  |d            | j:                  | j                  |   <   nw# t<        $ rj t        |d      5 }|j?                         }ddd       n# 1 sw Y   nxY wddl}ddl }	D 
cg c]m  }
t        |
j                               rR|
jC                         jE                  d      s3|
jG                         D cg c]  }|j+                  |       nc c}w c}o nc c}}
w }}
}|	jI                  d |D              }t        |      dkD  rjtK        dj!                  ||             tM        |      }|D ]?  }t        |      |k  s|jO                  t6        jP                         t        |      |k  r.A || j:                  | j                  |   <   Y nw xY wY w xY w# 1 sw Y   xY w# 1 sw Y   xY w# tX        $ rV t[        j\                  d|z   dz   dd      }|xr t        j                  |       g | j:                  | j                  |   <   Y w xY w# t        $ r0 | j                  |   dk7  rt[        jb                  d|z  dd       Y w xY w# tf        $ r t[        jb                  d|z  dd       Y w xY w)a  load (or reload) data from output files, `load` is called in
        `plot` and `disp`.

        Argument `filenameprefix` is the filename prefix of data to be
        loaded (5-8 files), by default ``'outcmaes/'`` (where / stands
        for the OS-specific path seperator).

        Return self with (added) attributes `xrecent`, `xmean`,
        `f`, `D`, `std`, `corrspec`, `sigvec`.

        downrNz*reading from {0} failed with Exception {1}version.txtr   zDast.literal_eval("{0}") read from file {1} failed with Exception {2}.datignore)category)rF   rG   %#   )commentsndmin)r   )r   r   c              3   2   K   | ]  }t        |        y wr   r;   ).0rows     r   	<genexpr>z%CMADataLogger.load.<locals>.<genexpr>  s     9Sds#c(d   r   z;rows in {0} have different lengths {1}, filling in `np.nan`)string_zreading from file "z" failedloadr@   rJ   zno data for %szattribute %s missing)7r\   r;   r^   rc   r>   r_   r   readstripr`   r   rU   rV   rW   r   r   r   data_versionra   rb   astliteral_evalrangecatch_warningssimplefilterUserWarningr   r0   loadtxtry   
ValueError	readlinescollectionslstrip
startswithr[   Counterr   maxrf   nanrp   updatereadliner   r	   format_warningrd   r1   print_warninggetattrr   shapesetattrreshape)rv   filenameprefixr   rP   r   r   r7   f_linesr   r,   r<   r|   lengthslr   filer   r-   r   s                       r   r   zCMADataLogger.loadu  sP    !--N4??#s4>>'::::nf58K8KK	"b#!!"!1  nf5E	Zb#!$%FFHNN$4!  nf58L8LL	#b#!"#&&(.."2 	E!..t?DO s4??+,A$//!"44v=B#6,,.))([Iq)-GG --h7D;? "

2c
! L<NdnnQ&78 /6 "X66==(, > 9 1 >>!$(G(GGMM$.."34;;dnnQ&78<> JJt}}T^^A->?@ dnnQ/0Y -f >>CD#&
 1v#agg,!+c199aQ[#9: " u  	"ww~~b!JQQRTVWXY!DNN	"  	Zww~~b!JQQRTVWXY	Z  	#ww~~b!JQQRTVWXY"DOO	#  	Edkklpl{l{}  BC  D  E  E	E % DD?C "

2 <@>DMM$..*;<) D!%b#"(* "/305$y05TZZ\9JSWS^S^S`SkSklvSw CG**,$O,QS%5%5a%8,$O05$yD $y&1&9&99Sd9S&SG"7|a/ %&c'-vb'':!<$'L+/C*-c(Q,(+

266(: +.c(Q, ,0 @DDMM$..*;<D	D /.6 X  6(()>)Cj)P1232Ha8H35dnnQ/06  1??1%1''(82(=v /11 " ##$:S$@&$35s  N "$M;N O7 *$O*O7 0Q <$Q Q )$S ['A[=T[',+[[' B,]	^;N N 	O'AO""O'*O4/O7 7	Q AQ

QQQ 	R>(AR99R>	T
0T  T
[
:U[
[	%U?6	[	?V[	AX'X ?X
A)[	4-[	"[	 [
[	[
[	[

[[	['[$	[''A]]	5^^#^,+^,c                 .#   ||n| j                   }| xj                  dz  c_        |dk(  ry|	 | j                  }n| j                  s| j                  |       |j                         s"| j                  dkD  r| j                  dz
  |z  ry| j                  dk(  r2| j                  s&| j                   dk7  r| j                          d| _        |j                  }|j                  }|j                  j                  }|j                  }|j                  d   du s|j                  |j                  d   k  rH|j                   j"                  |j                  j$                  dz  z  }	t'        |	      t)        |	      z  }
n5|j*                  j'                         |j*                  j)                         z  }
|j,                  }d}d}	 |j.                  j0                  }|j2                  j2                  d   }|j2                  j2                  d	   }|j2                  j2                  t5        |j2                  j2                        d
z     }t6        j8                  j;                  |j2                  j2                  ddgd      \  }}||z  }t=        |dt>        j@                        }|t>        j@                  }djC                  | jD                  jF                        }	 |j.                  jH                  jJ                  }|j                  |j                   j"                  z  |j                  j$                  dz  z  }|j                  d   du s|j                  |j                  d   k  rvt'        |j                   |j                  j$                  dz  z        }t)        |j                   |j                  j$                  dz  z        }|j                  d   du rdgn|}ntM        |j                  tN        jP                        rtS        d|j                  j*                  z        tS        d|j                  jT                  dz   dz  z        z   }t'        |j                  jT                        dz   t)        |j                  jT                        dz   z  dz  }
t'        |j                  jT                        dz   dz  }t)        |j                  jT                        dz   dz  }|j                  j                  }ntM        |j                  tN        jV                        rDtS        d|j                  jX                  z        d|j                  jZ                  z  gz   }dx}}d}
n0	 |j                  j\                  dz  }t'        |      }t)        |      }|j                   j"                  }	 |j                  j^                  }d}ta        | d      sd| _1        | jd                  r	 |j                  jf                  }|g| jb                  || jd                  z  dk(  rI	 t>        jh                  jk                  |      | _1        t7        jl                  | jb                        | _1        |jx                  }t{        j|                         |_<        	 || j~                  kD  rH| j                  dz   }t        |d      5 } | j                  t        |      dz   t        |      z   dz   t        |      z   dz   t        |
      z   dz   t        t                    z   dz   dz  z   dz   t        t                    z   dz   t        t                    z   dz   t        t                    z   dz   t        t                    z   dz   t        t                    z   dz   |z   dz   dj                  d |D              z   dz   dj                  d |D              z   dz   dz          ddd       | j                  dz   }ddk  rt        |d      5 } | j                  t        |      dz   t        |      z   dz   t        |      z   dz   t        |      z   dz   t        |      z   dz   dj                  t        t        |            z   dz          ddd       | jd                  rd|gd| jb                  gfD ]  \  }!}"| j                  |!z   }|"t?        j                  |"      r/t5        |"      dkD  s>|!| j                  vs|| jd                  z  dk(  rRt         |j                  d   |"      d   dz        | j                  |!<   | xj                  |"| jb                  u z  c_J        t?        j                  |"      }#|#t?        j                  |#j                  d   d         }#ddk  rt?        j(                  |#      }$t?        j&                  |#      }%t?        j(                  t        |#            dk(  rd}&d}'n5d|#z  }(dt?        j(                  |(      z  }&dt?        j&                  |(      z  }'|%dk  rdx}%}'n	|$dk\  rdx}$}&t6        j8                  j;                  |#g d       \  }$}&}'}%ddk  rqd!dt?        j,                  t?        j                  | j                  |!               z  z
  })t?        j                  t        |#            }*d|*z   d|*z
  z  | j                  |!<   t        |d      5 } | j                  t        |      dz   t        |      z   dz   t        |$      z   dz   t        |&      z   dz   t        |'      z   dz   t        |%      z   dz   dj                  t        t        | j                  |!               z   dz          ddd        | j                  d"z   }t        |d      5 } | j                  t        |      dz   t        |      z   dz   t        |      z   dz   d#z   dj                  t        t        |            z   dz          ddd       t?        j                  |      dkD  r| j                  d$z   }t        |d      5 } | j                  t        |      dz   t        |      z   dz   t        |      z   dz   t        |      z   dz   d%z   dj                  t        t        |            z   dz          ddd       | j                  d&z   }t        |d      5 } | j                  t        |      dz   t        |      z   dz   d%z   t        |      z   dz   t        |      z   dz   dj                  t        t        |            z   dz          ddd       | j                  d'z   }|dkD  r|t        |d      5 } | j                  t        |      dz   t        |      z   dz   t        |      z   dz   d%z   t        t                    z   dz   dj                  t        t        |            z   dz          ddd       t        | j                  d(      | j                  z   }t        |d)      5 } 	 | j                  t        |j                  d*+                   ddd       ta        |d,      r| j                  |j                  j                  k7  rx|j                  j                  | _T        t        | j                  d(      | j                  z   }t        |d)      5 } 	 | j                  t        | j                               ddd       	 dd-lXmY}+ ta        |+d.      rPt        t        | j                  d(      d/z   d)      5 } | j                  t        |+j                               ddd       	 dd0lXm[}, t        t        | j                  d(      d1z   d)      5 } | j                  |,       ddd       || _?        y# t        $ r t        d      w xY w# t        $ r d}Y w xY w# t        $ r
 |dkD  r Y w xY w# t        $ r d}Y w xY w# t        $ r dg}Y 
~w xY w# t        $ r d}Y 
Mw xY w# t        $ rV |d
k  s)t?        jn                  t?        jp                  |      d      s$ts        jt                  djC                  |             Y 
w xY w# t        tv        f$ r Y 
$w xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   
xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y    xY w# t        $ r Y w xY w# 1 sw Y   xY w# t        $ r Y *w xY w# 1 sw Y   0xY w# 1 sw Y   xY w# t        $ r Y w xY w# 1 sw Y   xY w# t        $ r Y w xY w# t        t        f$ r; |dk  r,t{        j                  d2z  t        j                         f       Y || _?        yw xY w)3a  append some logging data from `CMAEvolutionStrategy` class instance `es`,
        if ``number_of_times_called % modulo`` equals to zero, never if ``modulo==0``.

        ``more_data`` is a list of additional data to be recorded where each
        data entry must have the same length.

        When used for a different optimizer class, this function can be
        (easily?) adapted by changing the assignments under INTERFACE
        in the implemention.

        Nr   r   zBcall `add` with argument `es` or ``register(es)`` before ``add()``   CMA_diagonalT      ?r   r      K   )sorted__last_feasible_fz{0:.1f}g      Y@{Gz?last_precision_matrixz@CMADataLogger failed to compute precision matrix (iteration {0})r   r+   r   z%.16ec              3   2   K   | ]  }t        |        y wr   r   r   r7   s     r   r   z$CMADataLogger.add.<locals>.<genexpr>m  s     &E}!s1v}r   c              3   2   K   | ]  }t        |        y wr   r   r   s     r   r   z$CMADataLogger.add.<locals>.<genexpr>n  s     &Ay!s1vyr   r   r   r   r   CMA_eigenmethod   )r   r   r   r   MbP?r   z0 0 r   z0 r   r   r   r   F)checksp)evolution_strategyall_stoppingszall_stoppings.json2)__version__r   zcould not open/write file %s: )are   rh   r~   r   rk   r   stoprf   r   
countevals	countitersmcount_eigenr   sigmar   	sigma_vecscaling	variancesr   minrM   meanbestrP   rH   r;   
_mathutilsMhprctiler   r0   r   r   ru   elapsedlastr   
isinstance_rgsGaussVkDSamplerr   SGaussVDSamplerdvecnorm_veigenspectrum_beta_diagonal_accelerationhasattrr   rg   correlation_matrixlinalginvto_correlation_matrix	remainderlog10r   r   rX   more_to_writer	   MoreToWriteri   r\   r   r   r   floatrZ   r   isscalarrl   sortedrm   r1   triu_indicesr   abslogr   r>   r_   r   rb   r   ry   ra   r   r   r   r   r   r   r   sysexc_info)-rv   r~   	more_datare   modevals	iterationeigen_decompositionsr   stdsaxratiorK   fmean_noise_freefmean	besteverfbestfworstfmedianfp25iqrangef	feasibleftime_rR   diagCmaxDminDdiagDdiagonal_scalingdiagonal_scaling_betar  r  r   rP   r{   matrixcc_minc_max
c_medminus	c_medpluscinv_KLcsr   r   s-                                                r   addzCMADataLogger.add  sJ    *f!8:kWW MM" wwyT\\A-4<<!3Cs2J<<1T[[T[[A5EOODL LL	$&EE$5$5!77>"d*bllbggn>U.U<<''"%%//3*>>D$i#d)+Gddhhj24488:-G			IFFJJqMEVVZZ^FffjjRVVZZA!56G&MM11"&&**r2hPT1UMCOH$6?I FF	   !7!78	ggllnnG 2<<///"%%//32FF77>"d*bllbggn>U.Ur||beeoos&::;Dr||beeoos&::;D77>2d:QCEt334ruuww'$truuww{S6H/H*IIEBEEGGq(S\A-=>DGL1$s*DL1$s*DEEKKEt223ruuzz)*dRUU\\.A-BBEOD4G++S0 u:Du:D<<//	&$&EE$E$E! "t45)-D&  %'UU%=%="%122:>RUYUjUj>jno>o@57YY]]CU5V25?5U5UVZVpVp5q2 (( ,,.Z	64...%%	1"c]aGGC	NS0!%j)+./!%j)+./ "'l+ .11 "%	"23	4 7:	:
 &o.
 144 "%.12 588 "%-01 477 "%/23 699 "%*o	. 14	4 "%	"23
4 7:
: $$ '** "hh&E}&EEF ILL  "hh&Ay&AA!B  EH!H" ### $ #( !!K/B1u"c]aGGC	NS0!%j)+./!%j)+./ "$i( +.. "$i	( +.	.
 "hhs378 ## $ # $$&57I%J&5t7Q7Q%R%TLD&))D0B* "F 3K!O (F(FF3d6K6KKqP &'Arww/@'A&'I!'Lc'Q R !::4@ //6T=W=W3WW/JJv.booaggaj!<=6$&FF1IE$&FF1IE!vvc!f~2-.
,-	'(1u-.-=
,-t,<	$z45 5	!&56 6
>Hmm>S>STUWg>h;z9e6"&rwwrvvd>\>\]a>b7c/d)d"dC!#F1I!6BDEFqSUvCVD::4@ ""c]aGGC	NS$8&)%j%136%7&)%j%136%7 '**o%6 9<%< '*)n	%5 8;	%;
 '*%j%1
 47%7 '*hhs3,0,J,J4,P0R 'S%S '+%+ , +]E%T\ !!L0Bb#!I,e*%'*+e*%'*+ !! ((3sE?3	4
     ww'(1,%%4"c]aGGC	NS0!%j)+./!%j)+./ ""789 <?? #	#
 "hhs30@'ABC ## $ # !!K/Bb#!I,e*%'*+  ./	0 36	6
 e*%
 (++ ((3sE?34     !!$55B1}!4"c]aGGC	NS0!%j)+./!%j)+./ ## "%,/	0 36	6
 "hhs3'89: ## $ # "$"2"2F;d>Q>QQBb#!GGDu!567 
 r4 T__%F"$%%..%d&6&6?$BVBVV"c]aT__ 56 #
0-?.t/?/?HK``befjk%7%E%E FG g)*4+;+;VD}TVYZ^_GGK( [ (} " k$%ijjk( 2.2*  	1} 	  	G	,    	&$%!	& % @$q=RXXi=PRS0T$MM*l*s*st}*~@ #$78  #], #]X +]  #]  #] !   %  #] gf  [Z ! 	6A~##%E%J%(\\^%5 6'		6s  ~ $~$ C.~6    1 6AA% AA@ 9+AE
 $D%AA;	(AE
 1A=AB.?AE
 .AE
 AE
 G3AE
 BAB&AE
 A"AB"';AE
 "A1AB/#AE
 6A1AB<'*AE
 A:AC	7AE
 AC&*AC.BAE
 /AD1$AC3AE
 5AD %AD8AD )AD: *AD-<AD: ~!$~32~36		.-.1A@ ?A@ @AAA"AAA% A!AA"A"AA% A%AA8A7AA8A;ABB AE
 BABBAE
 BAB	BAE
 B"AB,B'AE
 B/AB9B4AE
 B<ACCAE
 C	ACCAE
 C	AC#CAC&C"AC#C#AC&C&AC0C+AE
 C3	AD C<ADC?AD D ADDADDAE
 DADDAD D	AD*D&AE
 D)AD*D*AE
 D-AD7D2AD: D:	AEEAE
 EAEEAE
 E
A AFFAFc                 4    ddl m}  || j                         y )Nr   )close)r!   rC  	fighandle)rv   rC  s     r   figclosezCMADataLogger.figclose  s    +dnnr   c                      y)z0data are saved to disk the moment they are addedNr   )rv   r{   s     r   savezCMADataLogger.save  s    r   c                 R   |rt        j                  |      st        d      || j                  k(  rt        d|z   dz         || j                  k(  ryt
        j                  j                  t
        j                  j                  |      d         s5t        j                  t
        j                  j                  |      d          | j                  D ]J  }t        ||z   dz   d      j                  t        | j                  |z   dz         j                                L | j                  | j                          t        || j                   z   d      5 }	 |j                  t#        | j                               ddd       |r|| _        yy# t$        $ r Y w xY w# 1 sw Y   #xY w)zsaves logger data to a different set of files, for
        ``switch=True`` also the loggers name prefix is switched to
        the new value

        z*filename prefix must be a non-empty stringzcannot save to default name "z...", chose another nameNr   r   r   )r	   is_strr   rT   r\   rU   rV   existsr[   r   r^   r   r   r   rb   r   ra   r   r   )rv   
nameprefixswitchr{   rP   s        r   save_tozCMADataLogger.save_to  s[    j!9IJJ,,,<zILffgg)))ww~~bggmmJ7:;KKj1!45OODd"V+S177T=M=MPT=TW]=]8^8c8c8ef $ ??"IIK*t333S9QT__-. : )D    :9s*   F$F	FFFFF&c                    ddl }d
d}|| j                  }|j                  d      j                  t        j                  j
                        }|r|d ||du rdn|      z   z  }|dz  }|j                  |d	      5 }|j                  t        j                  j                  | j                               ddd       |S # 1 sw Y   |S xY w)aQ  write logger data to file ``filename [+ ...] + '.tar.gz'``.

        `filename` defaults to ``self.name_prefix``.

        When `unique` is true, `filename` is furnished with a unique time
        stamp.

        Return the path (relative or absolute) of the output file.

        This function does in essence just ``tar -czf filename.tar.gz folder``
        where ``folder`` defaults to the current plot data folder and
        ``filename`` is created to be unique.

        TODO: we may want to be able to add a time stamp to the folder name
        too, to prevent conficts later?
        r   Nr   c                     dt        |       z   dz   d| dk(  z  z   }t        j                  d      |j                  t        j                               j	                  d      d   z   S )z.a unique timestamp up to 1/10^decimals secondsz{0:.zf}.r   z%Y-%m-%dd%Hh%Mm%Ssr   )r   r   strftimer   r[   )decimalsr<   s     r   unique_time_stampz,CMADataLogger.zip.<locals>.unique_time_stamp3  s\    X&-x1}0EEA==!56HHTYY[)//4Q79 9r   rD   -TrC   zw:gz)r   )	tarfiler\   rstriprU   rV   r]   r   rA  relpath)rv   filenameuniquerU  rS  tars         r   zipzCMADataLogger.zip  s    & 		9 ''H??3'..rww{{;/Vt^PPPHI\\(F+sGGBGGOOD$4$456 ,  , s   <9B??C	c                 @    t        | j                  j                        )zto unzip use "tar -xf filename" in a system shell

        and afterwards::

            logger = cma.CMADataLogger(extacted_folder_name).plot()

        in a Python shell.
        )rX   _unzip__doc__)rv   rX  s     r   r]  zCMADataLogger._unzipE  s     "$++"5"566r   c                 0   | }|}|j                   t        |j                   dddf   D cg c]  }||v  c}      d   ddf   |_         |j                  t        |j                  dddf   D cg c]  }||v  c}      d   ddf   |_        	 t        |      }|j	                  |d          |j                  t        |j                  dddf   D cg c]  }||v  c}      d   ddf   |_        |j                  t        |j                  dddf   D cg c]  }||v  c}      d   ddf   |_        	 |j                  t        |j                  dddf   D cg c]  }||v  c}      d   ddf   |_	        	 t        |j                        rE|j                  t        |j                  dddf   D cg c]  }||v  c}      d   ddf   |_        	 t        |j                        rE|j                  t        |j                  dddf   D cg c]  }||v  c}      d   ddf   |_        | S c c}w c c}w # t
        $ r Y w xY wc c}w c c}w c c}w # t        $ r Y w xY wc c}w # t        $ r Y w xY wc c}w # t        $ r Y | S w xY w)z%keep only data of `iteration_indices`Nr   r   )rP   _whererM   r   rf   r   rQ   rK   r   rR   r   r;   rN   rO   )rv   iteration_indicesdatiteridxr   s        r   select_datazCMADataLogger.select_dataP  s   #fCEE!Q$K@Kqa7lK@A!DaGHfCEE!Q$K@Kqa7lK@A!DaGH	7mGNN72;' ''&-0WWQT]"<-: #$w,-:"< ==>@ABC DIIf141a4&B1@A '(7l1@&B CCDFGHI J		%%*-++ad*;(=*; :;W*;(= !>>?!ABC!D ECK	3<< "uuV-0\\!Q$-?-A-? ?@Q'\-?-A &BBC&EFG&H  I	3<< "uuV-0\\!Q$-?-A-? ?@Q'\-?-A &BBC&EFG&H  I 9 A@  		"<&B(= 		-A 		-A 		s   H7
/H<
I I
I
:%I  I
*I   :I4 :I/
I4 :J J
 J 	III   	I,+I,/I4 4	J ?J J 	JJc                 n   t        t                     a	 ddlm} ddlm}m}m} |j                  d|      }|r$t        j                  dj                  |             |d}t        | d      rV| j                  I|| j                  u r |       j                   }|d	urFd
|vrB|j#                  d      s|dz  }|dj                  | j                  j%                               z  }| j                  j%                         s| j                  j&                  | j(                  kD  r| j                  j&                  dk  sS| j*                  j,                  dk  s:| j.                  j0                  | j2                  | j*                  j0                  z  kD  r7| j.                  j5                          | j                  j&                  | _        | S | j*                  j6                   | j.                  j6                   |t8        dz  at8        }|dvrd}|xr | j;                          |d}| j<                  j>                  d   |kD  r>| jA                  d| j<                  j>                  d   |z  z          | j;                          |d	urDd
|vr@| jB                  r4|j#                  d      s|dz  }|dj                  | jB                        z  }| }|jD                  |_#        |s5tI        |jF                        dk  rtK        d       n|jL                  |_#        || jO                  |       tI        |j<                        dk  r/tK        dj                  tI        |j<                                     | S  ||       d	 |       jP                  _)        d| _+        | jY                  |        |       | _-        | jZ                  j]                           |dd|z   d       | jZ                  j_                         d   | jZ                  j_                         d   z  dd|z  z   k  r<| jZ                  ja                  dd|z  z   | jZ                  jc                         z         | je                  ||||       |jg                  d        |dd|z   d|z          | ji                  ||        |dd|z   d       |dv r|dk(  n|	}|dk(  s|s|r| jk                  ||||
       n| jm                  |||	|
       |jg                  d       |dk7  r|r |dd|z   d       | jk                  ||||
       |jg                  d        |dd|z   d|z   dz          to        jp                  | jr                        r| ju                  |       n| jw                  |       |dkD  r,t        |d      r  |dd|z   d       | jw                  |d !        |dd|z   d|z          | jy                  |||"       d	| _+        | j{                          | j.                  j5                          | S # t        $ r t        d       | cY S w xY w# tT        $ r Y w xY w)#a  plot data from a `CMADataLogger` using files written by the logger.

        Arguments
        ---------
        `fig`: figure number, by default starting from 325

        `iabscissa` or `abscissa`: ``0 ==>`` plot versus iteration count,
        ``1 ==>`` plot versus function evaluation number

        `iteridx`: the iteration indices to plot, e.g. ``range(100)`` for
        the first 100 evaluations.

        ``plot_mean in (True, False, 'log', 'lin', 'linear', 'only')`` indicates
        whether and how to plot the mean (possibly instead the current best)

        `foffset:float` a small value added to f values to improve log-plot
        appearance.

        `downsample_to`: number of data lines to use at most

        `x_opt`: plot x-values as a difference to another solution and/or
        select a subset of variables to plot.
            
        If `x_opt` is a nonnegative `int`, it is interpreted as
        iteration number and the difference of ``x`` to the respective
        (closest but not larger) iteration is plotted.

        If `x_opt` is a negative `int` the respective index rather than
        the iteration is used. Namely and in particular, ``x_opt=0``
        subtracts the initial solution ``X0`` and ``x_opt=-1``
        subtracts the final solution of the data.

        If ``len(x_opt) == dimension`` or `x_opt` is a float, the
        difference to `x_opt` is plotted.

        Otherwise: ``x_opt[0]`` defines the indices of the variables to
        be plotted where ``x_opt[1]``, if present, is subtracted.

        `xsemilog:bool`: customized semilog plot for x-values

        `xnormalize:bool`: divide x-values by standard deviations, may show stationary
            behavior when the optimum is in zero

        `xtransform:callable` is a function that returns transformed x-values,
        applied before `x_opt` is subtracted and `xnormalize` is done.

        `fshift:float` is added to all displayed fitness values

        `addcols:int` is the number of added columns for additional subplots

        `load:bool=True`: load/reload data before to try plotting. Useful
        as a `CMADataLogger` instance itself does not load data by default.

        `message:str`: a message text appearing in the plot
    
        `remove_sigma`: disregard `sigma` when plotting individual standard
        deviations.

        `normalize_scaling`: plot axis scaling normalized with the geometric
        average in each iteration.

        Return `CMADataLogger` itself.

        Example
        -------
        ::

            import cma
            logger = cma.CMADataLogger()  # with default name
            logger.plot()
            cma.s.figsave('fig325.png')  # save current figure
            logger.figclose()  # or cma.s.figclose()

        Details
        -------
        Data from codes in other languages (C, Java, Matlab, Scilab) have the same
        format and can be plotted just the same.

        Dependencies: matlabplotlib.pyplot

        :See: `cma.plot` alias `cma.logger.plot`
    r   pyplotfiguresubplotgcfIcould not find matplotlib.pyplot module, function plot() is not availableabscissazunrecognised kwargs={0}r   r~   Fzstop(r   z
stop()={0}r   g333333?r   r   r   r   z not enough data to plot recent xz%too few data to plot (len(dat.f)={0})Tgffffff?r   g?)fshiftmessage)	normalize)r  linlinearr  only)xsemilog
xnormalizerN      rO   )r{   )idxremove_sigma)>dictlocalslast_plot_arguments
matplotlibrg  r!   ri  rj  rk  ImportErrorpopr   r   r   r  r~   numberr:   r   r   rj   ru   r  rt   tocrq   rs   ticlast_figure_numberr   rP   r   downsamplingr`   rK   r   r;   r   rR   rd  canvasheader_visibler   rn   _enter_plottingrD  clearget_size_inchesset_figwidthget_figwidthplot_diversxlabelplot_axes_scaling	plot_meanplot_xrecentr0   r   rJ   plot_sigvecplot_correlations	plot_stds_finalize_plotting)rv   figr5   rc  r  foffsetx_optfontsizedownsample_toru  rv  
xtransformro  addcolsr   rp  ry  normalize_scalingkwargsrg  ri  rj  rk  rb  _semilogs                            r   plotzCMADataLogger.plotq  sf   B #68n	)>> JJz95	MM3::6BC?G4477#6dgg~elle#w(>''-tOG<..tww||~>>77<<>dgg&7&7$:U:U&U 77$$q(DNN,B,BT,IOO''$*Q*QTXTbTbTfTf*ffOO))+26''2C2CD/K;!#$CF"I?G66<<?]*a$&&,,q/]"BBCIIK%G7$:t~~##D)4|**4>>::G		355zA~89 W%suu:?9@@SUULMK 	s+0SU\\( '+#X&1w;"NN**,Q/$..2P2P2RST2UUC'M!"NN''TG^);t~~?Z?Z?\(\]GFGLb 	1w;G,y4EF 	1w;")26N)N9%T\w9NN9eh:NVijYb 7Aq7{A&NN9eh:NVMM" Aq7{AK!O4wwt{{#  +&&y1 {wsJ71w;*&&yz&B 	1w;G,ye,G&+#!{  	cdK	P $s#   X -X' X$#X$'	X43X4c                    t        j                  d       	 ddlm} ddlm}m}	m}
 |d}|dvrd	}| j                          | }|| j                  |       t        |j                        dk(  rt        d
       y ||       | j                  |        |
       | _        | j                  j!                          ddk  r |	ddd	       | j#                  ||       |j%                  d        |	ddd       | j'                  |       |j%                  d        |	ddd       | j)                  |        |	ddd       | j+                  ||       |j%                  d        |	ddd       | j-                  ||       |j%                  d        |	ddd       | j/                  ||       n |	ddd	       | j#                  ||       |j%                  d        |	ddd       | j/                  ||        |	ddd       | j'                  |       |j%                  d        |	ddd       | j)                  |        |	ddd       | j+                  ||       |j%                  d        |	ddd       | j-                  ||       | j1                          t        j                  d       | S # t        $ r t        d       Y yw xY w)zObsolete: plot data from a `CMADataLogger` (using the files written by the logger).

        Superseded by `CMADataLogger.plot`

        Arguments
        ---------
        See `CMADataLogger.plot`

        Return `CMADataLogger` itself.
        z'please use `plot` instead of `plot_all`r   rf  rh  rl  Ni  rn  r   nothing to plotr   r   r   r      rw     )rx  )r   r   r}  rg  r!   ri  rj  rk  r~  r   rd  r;   rP   r   r  rD  r  r  r  r  r  r  r  r  r  )rv   r  r5   rc  r  r  r  rg  ri  rj  rk  rb  s               r   plot_allzCMADataLogger.plot_allU  s    	?@	)>>
 ;CF"I		 W%suu:?#$ 	sX&6Aq!Y0MM" Aq!""9-MM" Aq!""9- Aq!i/MM"Aq!NN9e,MM" Aq!NN9%N0Aq!Y0MM" Aq!NN9%N0 Aq!""9-MM" Aq!""9- Aq!i/MM"Aq!NN9e,!?@m  	cd	s   J+ +KKc           
         ddl m} t        | d      s| j                          | }t	        j
                  |j                  d d dd f         t	        j                  |j                  d d dd f         k(  r=|j                  d|j                  d   dt        |j                  d         z  d       | S | j                          t         |j                  d	      t	        j                  d
d|j                  j                  d   dz
                    }t        |j                  d d |f   |      }|rl|j                  j!                         j"                  }t	        j$                  |dd d d f   d      }||d|j                  d   dz
  z  z  z  }|j"                  }n|j                  }t'        d|j                  j                  d         D ]'  }	|j)                  ||d d |	f   dt+        |             ) t-                t/        |j1                               }
|j1                  |
       |j3                  d       | j5                  |       | j7                          | S )Nr   rf  rM   r  r   r  z#all axes scaling values equal to %scenter)verticalalignmentplasma_rffffff?r   axisrT  )colorzPrincipal Axes Lengths)r}  rg  r  r   r0   r   rM   r   textr   r  iterget_cmaplinspacer   r8   copyTprodr   semilogynextsmartlogygridarrayr  title_xlabelr  )rv   r5   rq  rg  rb  r  _xdddivisorr7   axs              r   r  zCMADataLogger.plot_axes_scaling  s   %tS!IIK66#%%12,266#%%12,#77KK355<=ceeEl+,*2  4 K0V__Z0KKaQ!);<> ?al 3Y?BggbQia0G'A!q122BBBq#%%++a.)AOOB1a4tE{  4 * 	6;;=!B-.Y!r   c                 r   ddl m} t        | d      s| j                           G d d      } |       }t	        j
                  | j                  d      |_        | j                          	 t	        j                  |d         s|d   }t        |      |j                  j                  d   d	z
  k  r>|j                  d
d
t        t        d	            |D cg c]  }d	|z   	 c}z   f   |_        |rct	        j                  |j                  d
d
d	d
f   j                  |j                  d
d
df   j                  z        |j                  d
d
d	d
f<   t!        |j                  d
d
|f   |      }ddk  r7|j                  j                  d   dk  rt#        dd|d   z  z         }	|	|d<   t	        j$                  |j                  dd	d
f         }t	        j&                  t	        j(                  t	        j*                  |j                  d
d
d	d
f               t	        j(                  t	        j,                  |j                  d
d
d	d
f               |j                  j                  d   d	z
        |j                  dd	|z   f<   |	|d<   |j/                  ||j                  d
d
d	d
f   d       t        |j1                               }
t	        j$                  |j                  dd	d
f         }|j3                  t	        j4                  |d   ddg      t        |
d   dz  |
d   dz  g      d       | j6                  j9                  d      }|t        t        |            }t;        |      D ]9  \  }}|j=                  |d   |j                  dd	|z   f   dt?        |      z          ; n&|j/                  ||j                  d
d
d	d
f   d       tA                |jC                  djE                  |rdnd             | jG                  |       | jI                          | S c c}w # t        $ r Y Gw xY w)zL``iabscissa=1`` means vs function evaluations, `idx` picks variables to plotr   rf  rQ   c                       e Zd Zy)%CMADataLogger.plot_stds.<locals>._tmpN)__name__
__module____qualname__r   r   r   _tmpr    s    r   r  Tr  r   r  Nr   r   Q?r   rT  zo ?r   k-variable_annotationsr   z)Standard Deviations{0} in All Coordinatesz $\times$ $\sigma^{-1}$r   )%r}  rg  r  r   r0   r  rQ   r  r  r;   r   r   r   	TypeError	transposer  r8   r   argsortlogspacer  r   r   r  r  r  dotrp   rz   	enumerater  r   r  r  r   r  r  )rv   r5   rx  ry  rg  r  rb  r7   r  minxendr  annotationsr<   s                r   r  zCMADataLogger.plot_stds  su   %tU#IIKf((488$/	;;s1v&!f3x#''--*Q..''!T%(^c6Jcq1uc6J%J"JK \\#''!QR%.*:*:SWWQT]__*LMCGGAqrEN  9 5yAq5SWW]]1%+!dRVm+,GBrF**SWWRV_-C#%;;rxxswwq!"u~8N/OHHRVVCGGAqrEN%;<cggmmA>NQR>R$TCGGBCK  BrFOOB124v{{}%B **SWWRV_-C KKr"v1v.r!u12a5H3EFG <<@@AWXK"#CHo!+.1BrFCGGBAI$6#a&L* /
 OOB124AvL8bQ	S 	Y!k 7K 		s%   +A*P) P$
!P) $P) )	P65P6c                    ddl m} t        | d      s| j                          t	        j
                  | j                        s|j                  ddd       | S t	        j                  | j                  d      }| j                          |t        |      }t        t	        j                  |            dkD  r|d   }t        |      |j                  d   d	z
  k  r0|ddt        t        d	            |D cg c]  }d	|z   	 c}z   f   }n
||ddf   }	 t        |dd|f   |      }dd
k  r|j                  d   dk  rt!        dd|d   z  z         }||d<   t	        j"                  |dd	df         }t	        j$                  t	        j&                  t	        j(                  |ddd	df               t	        j&                  t	        j*                  |ddd	df               |j                  d   d	z
        |dd	|z   f<   ||d<   |j-                  ||ddd	df   d       t        |j/                               }t	        j"                  |dd	df         }|j1                  t	        j2                  |d   ddg      t        |d
   dz  |d   dz  g      d       | j4                  j7                  d      }	|	t        t        |            }	t9        |	      D ]/  \  }}
|j                  |d   |dd	|z   f   dt;        |
      z          1 n|j-                  ||ddd	df   d       |j1                  |dd d|dddf   z  dd       |j                  |d   d|d   z  d       |j=                  d       t?                |jA                  d       | jC                  |       | jE                          | S c c}w # t        $ r Y w xY w)zplot (outer) scaling from diagonal decoding.

        ``iabscissa=1`` plots vs function evaluations

        `idx` picks variables to plot if len(idx) < N, otherwise it picks
        iteration indices (in case, after downsampling).
        r   rf  rJ   r  Tr  Nr   r  r   r   r  r  r   rT  r  r   r  r  r   kz&$\beta=\max(2, \sqrt{cond(CORR)}) - 1$label)r  r   z	$1/\beta$333333?
framealphaz!Diagonal Decoding Scaling Factors)#r}  rg  r  r   r0   r   rJ   r  r  r  r   r;   r   r   r  r8   r   r  r  r  r   r   r  r  r  r  rp   rz   r  r   legendr  r  r  r  )rv   r5   rx  pltrb  r7   r  r  r  r  r<   s              r   r  zCMADataLogger.plot_sigvec$  sh    	-tX&IIKwwt{{#HHQ,-Khht{{.?Cy rxx}%)a&Cs8ciilQ..aeAh#2F#Q1q5#2F!FFGCc1f+C  AyL 19=q5SYYq\C'!dRVm+,GBrF**SQR[)C!{{288BFF3q!"u:4F+GHHRVVC12J%78#))A,:J LCAG BrFLLSABZ-sxxz"B **SQR[)CHHRVVBrFQF+r!u12a5H3EFG <<@@AWXK"#CHo!+.1BRQY#a&L* /
 LLSABZ-CR!c#2#q&k/3@ 	 	BBSZ6

c
"		67Y!Y 3G "d"s   
N8 4N3
8	OOc                     t        | d      s| j                          | j                  | _        ||d}| j	                  ||d|||       | j                  |       | S )NrK   Tr   r  ru  rv  )r  r   rK   r   _plot_xr  rv   r5   r  r  ru  rv  s         r   r  zCMADataLogger.plot_meanh  s_    tW%IIK 1HYv;&: 	 	?Yr   c                     t        | d      s| j                          | j                  | _        | j	                  ||d|||       | j                  |       | S )NrR   z	curr bestr  )r  r   rR   r   r  r  r  s         r   r  zCMADataLogger.plot_xrecentr  sO    tY'IIKY{&: 	 	?Yr   c           
      D   t        | |      s| j                          t        t        | |            dk  r| S ddlm} t        t        | |      dd|f   |      }t        | |      ddddf   }t        | |      ddddf   }ddlm}m	}m
}	m}
m} | j                          ddk  r< ||dd t        j                  |d	      t        j                   |d	      z  d
       dg}n> ||dd ddt        j"                  t        j$                  |      d	      z  z
  d
       dg}|ddk  r ||d	|dddf   z   d        ||d   d	|d   z   d        ||d	|dddf   z
  d        ||d   d	|d   z
  d        ||dd d	|dddf   z   d        ||d   d	|d   z   d        ||dd d	|dddf   z
  d        ||d   d	|d   z
  d       n&|ddddf   } ||d	|z   d	|z
  z  dd       |dgz  }|j'                  |d !       t)         |j+                  d"      t        j,                  d#d	|j.                  d	                     }t1        |j.                  d	         D ]  } |||dd|f   d$t3        |      d	%       ! t5                t7         |	             } |	|        |       j8                  j;                  d&        |       j8                  j=                           |
d'|j?                  d(      rd)nd*z         | jA                  |       | jC                          | S )+zSspectrum of correlation or precision matrix and percentiles of off-diagonal entriesr   r   rf  Nr  )r  r  r  r  r    r   r   r   -r
axis ratior   r   r  z$10^{-3}$ + KL(K || I) / D-br   r   r   z1 + min(corr)r  r  z1 - max(corr)-kr   r   z1 + max(neg corr)rw  )r   rw  z1 - min(pos corr)r9  	linewidthz*(1 + c) / (1 - c) of (0,25,75,100)-prctiler  r  r  r  rT  )r  zorderrightzSpectrum (roots) of %s matrixpreczwhite precisioncorrelation)"r  r   r;   r   r}  rg  r8   r!   r  r  r  r  r    r  r0   r   r   r   r  r  r  r  r  r   r   r  r  r  yaxisset_label_position
tick_rightr   r  r  )rv   r5   r{   rg  r   yysr  r  r  r  r    labelsminmaxcorrsr  r7   r  s                    r   r  zCMADataLogger.plot_correlations{  s   tT"IIKwtT"#a'K%wtT21i<@)LD$12&T4 BQB'FF6QqT266!Q<"&&A,6="^FQqT4#q	(B"BBDI89F>AvA1a4L$/QrUA5	M?;A1a4L$/QrUA5	M?;1q2ad8|T2QrUA5	M+>?1q2ad8|T2QrUA5	M+>? AaCjQ_[A3#&(GHHf-0V__Z0T145GGAJ2@ A Bqwwqz"AQ!Q$DKB #46]R&&w/ -dooV\F]1BcpqrY!r   c                    ddl m} ddlm}m}m}m}	 |j                  d   }
t        | d      s| j                          | j                  ddddfxx   |z  cc<   | }t        j                  |j                  d	         s$|j                  d
ddf   |j                  dddf<   t        |j                  dddf         D ];  \  }}t        j                  |      s|j                  d
|f   |j                  d|f<   = t        t        j                   |j                  dddf               }|j                  dddf   |z
  }t        j"                  ||dk  <   |j                  dddf   |j                  d   z
  }t        j"                  ||dk  <   | j%                          t'        |j                  dd|f   |      }|j                  j(                  d
   dkD  r) ||t+        |j                  ddddgf         |z   d       |j                  j(                  d
   dkD  rR ||t+        |j                  dddgf         |z   dd        |	|d   t+        |j                  d         |z   d|
       |j                  j(                  d
   dkD  rwt        j                  |j                  ddgf         rR ||t+        |j                  dddgf         |z   dd        |	|d   t+        |j                  d         |z   d|
       d}|j                  j(                  d
   dkD  rt        j,                  |j                  dddf   t        j.                  |j                  dddf         k7        rSt        j0                  d|j                  dddf   z  t        j.                  d|j                  dddf   z        k(        sRt        j0                  |j                  dddf   dk(        s)t        j0                  |j                  dddf   d k(        rd!}|j                  j(                  d
   |kD  r8 ||t        j*                  |j                  dd|df         d|z  z   d"d#       t3        |j                  dddf   dkD        d   } |||   |j                  |df   |z   d$       t5                 ||t+        |j                  dddf         |z   d%        |	|d   t+        |j                  d         |z   d&|
d'z          t        j6                  |j                  dddf         }d|t        j*                  |j                  dddf         dk  <   t3        |dk        d   } |||   t+        |j                  |df         |z   d(       t        j8                  |      }d
t3        |dk  |d
d dk  z        d   z   }d
t3        |dkD        d   z   }|d   dk  rt        j:                  dg|f      }|D ]A  }|||kD     }t=        |      r|d   nd}t?        ||r|n|j                  j(                  d         }t=        |      d
kD  r( |||   t+        |j                  |df         |z   d)       |dkD  r6 |||d
z
  |d
z    t+        |j                  |d
z
  |d
z   df         |z   d*       |r` |||d
z
  |d
z    t+        |j                  |d
z
  |d
z   df         |z   d*        |||   t+        |j                  |df         |z   d$d+        |||   t+        |j                  |df         |z   d,d+       D |d-g|d.gfD ]  \  }}t        j                  |      }t-        |      rt3        t        j@                  |            d   }t=        |      s |||   ||   d/       nSd}|D ]  }||kD  r |||| ||| d/       |d
z   } t=        |      |d   d
z   kD  r |||d   d
z   d ||d   d
z   d d/        |	|d   ||   d   ||
d'z          n8dd0k  r3t-        |      r( |||   ||   d/        |	|d   ||   d   d1|
d'z          dd0k  s|j                  d
ddf   |j                  dddf   z
  } ||d
d t        j*                  |      |z   d2       |dkD  } ||d
d |   t        j*                  ||         |z   d,        d3D ]  \  }} 	 t        jB                  |j                  dd|f         } |||   t        j*                  |j                  ||f         | d4+       t-        |      sj |||   |   t        jH                  ||            dz   | d4+        t'        |jJ                  dd|f         }! ||!dd t        jL                  tO        tQ        t        jR                  |jJ                  ddddf               tO        tQ        t        jT                  |jJ                  ddddf               g      jV                  d5d'        |	|!d   t        jR                  |jJ                  dddf         d6|
        |	|!d   t        jT                  |jJ                  dddf         d7|
        |||j                  ddd0f   d8        |||j                  ddd'f   d9        |	|d   |j                  d:   d;|
        |	|d   |j                  d<   d=z  d>|
d0z          tY         |             }" ||"        |	|"d   d?|"d
   |"d   z
  z  z   |"d'   |"d0   |"d'   z  d@z  z  |r|dAz   ndBdCj[                  t]        |j                  dD         t]        |j                  dE         t_        |            z          	 dB}#t=        |j                  d         dkD  rF|j                  dF   dz  t]        |j                  dF   dz        k(  rta        |j                  dF         }# |	|"d
   |"d0   dGj[                  |#      | jb                  z   d       | j                  ddddfxx   |z  cc<   t        jf                  |jh                        d
kD  rt'        |jh                  dd|f   |      } ||d
|jh                  ddd0f   z  dHdIJ        |	|d   d
|jh                  d:   z  dK        ||t        jR                  |jh                  ddddf   d
L      t        jT                  |jh                  ddddf   d
L      z  dMdNJ        |	|d   t        jR                  |jh                  dddf         t        jT                  |jh                  dddf         z  dO       tj        rt        jf                  |jl                        d
kD  rdP }$t'        |jl                  dd|f   |      } || |$|jl                  ddd'f         tj        dQJ        || |$|jl                  dddf         tj        dRJ        |	|d    |$t        jn                  |jl                  d<   g            dR        |	|d    |$t        jn                  |jl                  d   g            dS        |dT       | jq                  |       | js                          | S # tD        tF        f$ r
 |dk(  rY ߂ w xY w# td        $ r Y w xY w)Uzplot fitness, sigma, axis ratio...

        :param iabscissa: 0 means vs evaluations, 1 means vs iterations
        :param foffset: added to f-value after abs(f) is taken

        :See: `plot`

        r   rf  )r  r  r  r  	font.sizerP   Nr     )r   r  r   g\ߕ+r  g`P:   r  r  greyg      ?r  r  )r  r  zIQR(f)r  
   r   bg?)r  r  z
feasible fr   r   g   r  ffffff?z.br  z$|f_\mathsf{best}|$r   z.mr   z--m)
markersizez.rz#$f_\mathsf{best} - f_\mathsf{last}$z"$f_\mathsf{best} - f_\mathsf{min}$z-cr   z$f_\mathsf{best} - \min(f)$z.c))r  ro)r  rh	   z-mzmax stdzmin stdr  z-gr  r  r  g      ?z$\sigma$g~jth?r   r   r   zevals/iter={0}/{1} min($f$)={2})r   r   r   r   )r   r   z{0}
by vr  z$\beta=\sqrt{cond(CORR)} - 1$r  z#dd-damp$\approx1/\sqrt{cond(CORR)}$r  darkredzaxis ratio of diagonal decodingzdd-ARc                 d    | dz   | dz
  z  }d||dk     z  ||dk  <   t        |      dkD  r|S |d   S )Nr   r   r   r   )r9  ccs     r   c_oddsz)CMADataLogger.plot_divers.<locals>.c_odds  sF    !eA&"R!V*_26
 Wq[r3be3r   z$\min (c + 1) / (c - 1)$z$\max (c + 1) / (c - 1)$z$-{\min}^{-1} (c + 1)\dots$zV$|f_{\mathrm{best},\mathrm{med},\mathrm{worst}}|$, $f - \min(f)$, $\sigma$, axis ratio):r}  rg  r!   r  r  r  r  rcParamsr  r   rP   r0   isfiniter  isnanr  nanminr   r  r8   r   r  r3   roundallr`  r  signr2   concatenater;   r   logical_not	nanargmin
IndexErrorr   argminrQ   vstackr   r   r   r   r  r  r   r   r   r   r   r   r   rJ   corr_in_plot_divers_colorrN   r1   r  r  )%rv   r5   r  ro  rp  rg  r  r  r  r  r  rb  r7   valminfitdfit1dfit2r  remaining_idxrx  sgndsgn	start_idxstop_idxistartistopdfitr  idx_nani_starti_endicolsym_x_stdr  r1  r  s%                                        r   r  zCMADataLogger.plot_divers  s    	&	 	??;/tS!IIKq!A#v&  {{355;'55AB<CEE!QR%Lad,FAsxx}!eeAqDkad - ryyq!t-.adf$!vveemadceeEl*!vveemal 3Y?55;;q>ARSUU1q!f9-.8$? 55;;q>ARSUU1qc6]+g5vNBSUU5\*W4hR 55;;q>B2;;suuR"X#?RSUU1rd7^,w6tLBSUU6]+g5|hW 55;;q>BFF355#r?bhhsuuTcT2X.GGHrCEE$3$(O3rxxSUU4C4QS8_@T7UUVFF355B<1,-ae8L1M "55;;q>M) Ra&7 89BLH#Y\] SUU1a4[5()!,C#%%Q-'148Sq!t%/6RVSu&0#hl	< ggceeAqDk"+,BFF355A;%'(S1Woa C#ceeCFm,w6	 wws|qSWq[9:1==	vdQh'**q6A:Y'78IFX./E #E
E!HECEEKKNCC3x!|C#ceeCFm"4w"> zF1HVAX.SUU6!8F1H#4a#789 !"') E!GE!G,SUU5757?A#567 !"') ECeQh$8 %!"&16 RZSUU619%5!6""q2+  4 :;9:<KD% ++d#C3x !45a87|RWd3i6G!( 7?$R%6484GO"'!)	 ")
 4y72;?2 GBKMN!304WR[]^0DdLRVT#Yr]X\3 aCHC$s)T2RVT#Yr]3hlL AvuuQRU|ceeCRCFm3ABFF4L7*D21HABFF47Og-t5A<L 1ID#LLq$w0 RUBFF355D>2C "3xAS	"))DI*> ?! Q0 1$ $CGGAyL$9:DRVVSWWSbS!"W-=!>? RVVSWWSbS!"W-=!>?A BBC!Q	( 	VBZAB0)	 VBZAB0)	  	SUU1a4[$'SUU1a4[$'RVSUU5\=	 RVSUU5\C'qj	"46]RRUUbebem,,ber!uRU{T6I.I 'gnR.55SUU5\"Ce$5tF|EE		E3559~"suuV}r'9SvQSAS=T'T#CEE&M2A1{11%84;L;LLWXY 	q!A#v&  773::"#CJJq)|$<iHBRSZZ1--s:[\BSZZ..0WXR

1ab5 1:RVVCJJqRSRTuDU\]=^^%FHB

2qr6 23bffSZZAB=O6PPRYZ$)>)B4 $CLLI$>	JBRQT 23.6QSRQT 23.6QSB

CLL,?+@ ABD_`B

CLL,?+@ ABDbc 	gh 	Y!c 
+ 2:^  		s%   &zBz7 z42z47	{{c                    | j                   d   | j                          t        | j                   d   d         dz
  }t        j                  t        j
                  | j                   d   dddf         t        j                  dt        j
                  | j                   d   dddf               z        }|dz  dd|d	z  z  z
  z  }t        | j                   d         t        | j                   d
         z
  }t        dt        | j                   d   d               D cg c]2  }| j                   d
   dddf   || j                   d   |d|f   z  z  4 c}S c c}w )zPreturn for each coordinate ``len(self.data['f'][:, 0])`` sensitivities over timerQ   Nr   r  r   r   /$?r  r  rP   r  )r|   r   r;   r0   medianr2   maximumr   )rv   dimpopsize
normal_iqri0js         r   _sensitivitieszCMADataLogger._sensitivities  sC    99U#IIK$))E"1%&*))BGGDIIe$4QT$:;bjjBGGTXT]T]^cTdefhieiTjLk>llm#Xw})=!=>
5!"S3%88q#dii&6q&9":;=;A 		#q!t$
TYYu5Ebc1f5M(MN;= 	= =s   !7Ec                 
   | j                   d   | j                          d|z   |dvz   }t        | j                   d   d         dz
  }t        j                  t        j
                  | j                   d   dddf         t        j                  dt        j
                  | j                   d   dddf               z        }|dz  d	d
|dz  z  z
  z  }t        | j                   d         t        | j                   d         z
  }ddlm} |j                  t        j                  j                  d      dd|z  z   df       | j                          d}	|	dz  }	|j                  d||	       |j                  d       t        dt        | j                   d   d               D ]  }
| j                   d   dddf   || j                   d   |d|
f   z  z  }|j!                  | j                   d   dddf   |t#        |
dz
               |j%                  | j                   d   d   |d   |
dz
          
dk  xr |j'                          |j)                  d       |j+                  d       |j-                  dd       |r[|	dz  }	|j                  d||	       |j                  d       t        dt        | j                   d   d               D ]  }
| j                   d   dddf   }t        j.                  | j                   d   |d|
f         }|| j                   d   |d|
f   |   z  }|j1                  |||   t#        |
dz
               |j%                  |d   ||   d   |
dz
         |j%                  |d   ||   d   |
dz
          |
dk  xr |j'                          |j)                  d       |j+                  d       |j-                  dd       |r|	dz  }	|j                  d||	       |j                  d       |j!                  | j2                  dddf   | j2                  ddddf   D cg c]  }t        j4                   ||             c}       |j)                  d       |	dz  }	|j                  d||	       |j                  d        t        dt        | j                   d   d               D ]  }
| j                   d   dddf   || j                   d   |d|
f   z  z  }t        j.                  | j                   d   |d|
f         }|| j                   d   |d|
f   |   z  }|j1                  |||   t#        |
dz
               |j%                  |d   ||   d   |
dz
         |j%                  |d   ||   d   |
dz
          |
dk  xr |j'                          |j)                  d       |j+                  d!       |j-                  dd       |	dz  }	|j                  d||	       |j                  d"       t        j.                  | j                   d   ddd#f         }t        dt        | j                   d   d               D ]  }
| j                   d   dddf   || j                   d   |d|
f   z  z  }| j                   d   ddd#f   |   }|j1                  |||   t#        |
dz
               |j%                  |d   ||   d   |
dz
         |j%                  |d   ||   d   |
dz
          |
dk  xr |j'                          |j)                  d$       |j+                  d!       |j-                  dd       | j7                  d%       |j9                          yc c}w )&z[WIP] experimental

        Plot IQR(f) / IQR(std_i). The donimator is computed as 1.349 x
        std_i x sqrt(n). The sqrt(n) accounts for the effect of the
        changes in all other variables on f.
        rQ   Nr   )NFr   r  r   r   r*  r  r  rP   rf   rw  figsizez2Local sensitivities by coordinate versus iterationr  r  r  r      r$  z(IQR($f$) / $\widehat{\mathrm{IQR}}(x_i)$Tbothwhichz+IQR($f$) versus $\widehat{\text{IQR}}(x_i)$z?estimated IQR of coordinate $x_i$ ($\widehat{\text{IQR}}(x_i)$)zIQR($f$)zPartial derivativeszDLocal sensitivities by coordinate versus $\widehat{\text{IQR}}(x_i)$z&IQR($f$) / $\widehat{\text{IQR}}(x_i)$z3Local sensitivities by coordinate versus median $f$r  z
median $f$F)r|   r   r;   r0   r+  r2   r,  r}  rg  ri  randomrandintr  rj  r  r   r  r   r  r  r  ylabelgridr  loglogrK   r  r  tight_layout)rv   plot_absolutegradfcolumnsr-  r.  r/  r0  rg  r&  r1  	iqr_ratiorx  r&  r   rP   s                   r   plot_sensitivitiesz CMADataLogger.plot_sensitivities  s    99U#IIKm#uM'AB$))E"1%&*))BGGDIIe$4QT$:;bjjBGGTXT]T]^cTdefhieiTjLk>llm#Xw})=!=>
5!"S3%88%bii''01q7{?A:NO	q'4(JKq#dii.q123A		#q!t,
TYYu=MbcSTf=U0UVIOODIIcN1a40)3q1u:ONKK		#u-y}a!eD 4 	
B"6==?k"ABD'AIDNN1gt,LLGH1c$))E"21"567 IIcN1a40	jj5!1"#q&!9:!DIIe$4RS!V$<S$AAdIcN#a!e*EDHinR&8!a%@DGYs^A%6A> 8 F&v}}MM\]MM+&KKFK+AIDNN1gt,LL./OODJJq!t,TUVWVXTXIY.ZIYArvveAh/?IY.Z[MM+&	q'4(\]q#dii.q123A		#q!t,
TYYu=MbcSTf=U0UVI**TYYu-bc1f56C		% 0a 8 ==DMM$	#c!a%jMAKKR)C."4a!e<KKQ3!2AE: 4 	
B"6==?XY?@D'	q'4(KLjj31-.q#dii.q123A		#q!t,
TYYu=MbcSTf=U0UVI		#q!t$S)AMM!Ys^3q1u:M>KK"y~b11q59KK!inQ/Q7 4 	
B"6==?m$?@D'&C /[s   ="^ 
c           	      
   t        j                  | j                  |   dddf         t        j                  dt        j                  | j                  |   dddf               z  }|d   |d<   t        j                  |      S )z8return median popsize from iteration and evaluation dataNr   r   r  r   )r0   r2   r|   r,  r+  )rv   
data_fieldpopsizess      r   r.  zCMADataLogger.popsize  sr     77499Z0A67"**Q "		*(=ad(C D;F F|yy""r   c                     ddl m} 	  || j                  d         j                  }|S # t        $ rC}t        j                  dj                  |             | j                  d      dz  }Y d }~|S d }~ww xY w)Nr   )RecombinationWeightsweightszoobtaining ``RecombinationWeights(self.parameters['weights']).mueff`` failed with exception {0}, using popsize/3rQ   r   )	recombination_weightsrJ  rb   mueffr   r   r   r   r.  )rv   rJ  rM  r   s       r   rM  zCMADataLogger.mueff  sq    ?	,()CDJJE   	,MM R LL'!+E	,s   ) 	A58A00A5r  g?c                    |j                  dd       ddlm} ddl}| j	                          | j
                  d   | j                          ||j                  t              }nW|dk(  r| j                  dd	df   }n>t        j                  |      r)ddl}	|j                  |	j                  t        |            }t        | j
                  d   d         d	z
  }
t        d
|
|z  z         }|dd
k  rd|
dz  z  | j                   dz  z  }nt        j"                  | j
                  d   dddf         t        j$                  dt        j"                  | j
                  d   dddf               z  }|d   |d<   |
dz  d
z  t        j&                  |j)                  dd      d
|
z  dz         z  }|
dz  d
z  t        j&                  |j)                  dd      d
|
z  dz         z  }n ||
| j                         }|| j
                  d   ddd	df   z  }t        j*                  t        j"                  t        j,                  | j.                  ddd	df         d      d      t        j"                  t        j,                  | j.                  dddf               z   }|
dz  t1        j2                  ||      z  }t        j4                  |d   |g      }|j7                  t        j8                  j;                  d      d       d}|j=                  dd
d      }|j?                  d       |jA                  d       |jC                  d       |jE                  dd       |dk\  r| }d|||k  <   t+        |      r|t+        |      z  }tG        | jH                        D ]  \  }}|dd|f   }t        |      t        |      k7  rtJ        t        jL                  |      } |jN                  ||   ||   fd|i|}tQ        t        |            D ];  }||   s	|jO                  ||   ||   d|d   jS                         |||   z         =  n-|jU                         }|jA                  |       |jE                  d       tG        | jH                        D ]  \  }}|dd|f   }t        |      t        |      k7  rtJ        t        jL                  |      }|jW                  |       |jO                  ||   ||   |      }|jW                  |       |jY                  ||   ||   |d   jS                         dd         |jY                  t[              t+        |      gddgd!       |jW                  |       |
d"k  xr |j]                  d#d	d
|
z  z   $       |j=                  dd
d       |j?                  d%       |jC                  d&       |j_                         }|jU                          |jY                  | j.                  dddf   |d!|dd'       |j]                          |jW                  |       |ja                  | j
                  d   dddf   |       tG        |d         D ](  \  }}|jc                  | j
                  d   d(   ||       * |j=                  dd
d
       |j?                  d)je                  |d                |jC                  d&       tQ        t        | j
                  d   d         d	z
        D ]  }t        jf                  | j
                  d*   dd|d	z   f   ||   z
        }t        jf                  ||dd|f   z        }|ja                  | j
                  d   dddf   |ti        |             |jc                  | j
                  d   d(   |d   |        d"k  xr |j]                  d	d
|d
z   z  z   +       |jE                  dd,       |jU                          |jY                  | j.                  dddf   |d!|dd'       |j]                          | jk                  d-       |jm                          y).aJ  [WIP] experimental

        `multiplier` takes dimension and mueff as input and computes the error
        multiplier. The soon to be expired default value was ``dim**0.5 * 3
        / min((popsize, 3 * dim + 15))``.

        The trust is defined as ``-max_i(Delta log(sigma * D_ii))`` and is high when all axes diminish.
        r  rS   r   rf  NrQ   finalr  r  r   r   r   gUUUUUU?r   r      r  gףp=
?r4  )g      %@r   r5  z max$_i$ $\Delta$ log($\sigma_i$)zVariable sensitivitiesz2Sensitivity IQR($f$) / $\widehat{\text{IQR}}(x_i)$zestimated distance to optimumTr8  r  rP  )r  r   r  )r  r  r  r     
coordinate)r  r  z-Coordinate-Wise Estimated Distance to Optimumr$  )r  r  r  r  z(True Dx / Estimated Error (x_opt[0]={0})rK   r  r9  F)7
setdefaultr}  rg  r   r  r|   r   defaultdictr  rK   r0   r  	functoolspartialr;   r   rM  r2   r,  minimumr   r   r  rM   r  moving_averagehstackri  r;  r<  rj  r  r=  r  r>  r  r2  r   r  r?  r   	get_colortwinxscar  r   r  r    r  r  r   r  r   r  r@  )rv   r  markerscalerlog_thresholddim_exponent
multiplierplot_kwargsrg  r   rU  r-  average_windowrH  errorslogdiffstrust_labelax1sizesr7   senserrrx  pr1  ax2r  r  Dxerrorserrorss                                r   plot_estimated_errorsz#CMADataLogger.plot_estimated_errors  si    	{D1%99U#IIK=++E2EgJJr12v&E[[++I,=,=eU,KLE $))E"1%&*Ql!223 1us^djj3.??
 77499U#3AqD#9:RZZ277SWS\S\]bScdeghdhSiKj=kk'| #X\BJJx7G7GA7NPQTWPWZ\P\,]]
 #X\BJJx7G7GA7NPQTWPWZ\P\,]]
#C4Jdii.qr12v66 66"''"&&12"7a@qIBGGTVTZTZ[_[a[abcefbf[gThLii:
 9 9(N SS99hqk845bii''0)D9nnQ1%./KL56D&!AIE+,E%-'(5zU#$T%8%894QqSks8s4y($$jjo!FMM#c(DINQN+Ns3xAQxc!fd1gs!B%//BS/;E!H/D & F ) : ,,.CMM+&KK$T%8%894QqSks8s4y($$jjo

3MM#c(DIQM?

3CH$SM"#B%//"3B#  O : KKS3s8,q!fd;JJsObJV]]AcE	]Jq!QEFk"ZZ\DFF1Q3K  	 	. 	

2		%(Q/8fRj)DAqKK		%(/A6 * 	q!Q@uQx(	*k"s499U+A./!34A		'*12q1u95a@AB66"vad|"34LOODIIe,QRU3\QOPKK		%(/b1A1E	 5
 	
B66==!a1g+=6D'DFF1Q3KB# 	 	G 	&r   c                     ddl m} |j                  d   | _        |j                  d   |j                  d   k(  r||j                  d<   |j                          y)zassumes that a figure is open r   rf  r  N)r}  rg  r	  original_fontsizercParamsDefaultioff)rv   r  rg  s      r   r  zCMADataLogger._enter_plotting  sK    %!'!=??;'6+A+A++NN+3FOOK( 	r   c                 >   | j                   ry ddlm} |xr |j                  dddd       |j	                         j
                  j                          |j                          	 |j                          | j                  |j                  d<   y # t        $ r Y %w xY w)	Nr   rf  g
ףp=
?gQ?gQ?gffffff?)lefttopbottomr  r  )rn   r}  rg  subplots_adjustrk  r  drawionshowr   rp  r	  )rv   subplot_adjustrg  s      r   r  z CMADataLogger._finalize_plotting  s    &&%_611tdZ^1_

  "

	KKM
 (,'='=$	  		s   &B 	BBc                 T    ddl m} |j                  |dk(  rdnd       t                y )Nr   rf  
iterationszfunction evaluations)r}  rg  r  r.   )rv   r5   rg  s      r   r  zCMADataLogger._xlabel  s"    %i1nl1	3$&r   c                    t        | d      st        j                  ddd       y|| j                  j	                  d      }ddl}ddlm}m}	m	}
m
}m} | }t        t        j	                  d	d            r_|j                  j                         }t        j	                  d	      }t!        t#        |            D ]  } |||d
df         ||d
df<    n+|s||j                  j                         }n|j                  }t%        |t&              r\|dk(  rIddl}| j*                  dz   }	 t-        |d      5 }|j/                  |j1                               }ddd       n|dk  r| j                  |d
df   }ntA        jB                  | j                  dddf   |      }tA        jD                  | j                        d   }||k(  s1|dkD  r1|| j                  |dz
  df   z
  | j                  |df   |z
  k  r|dz  }| j                  |df   |k7  r6t7        j8                  dj;                  | j                  |df   |||             | j                  |d
df   }|ddd
dfxx   |z  cc<   n|	 |ddd
dfxx   |z  cc<   |r*|ddd
dfxx   |jH                  ddd
df   z  cc<   |d}|jD                  d   tJ        k  rt'        dd|d|f   z  z         }||d|f<   |s|I|rG|jM                  d      r6|dd
df   |dd
df<   tA        jN                  |jD                  d   d
z
        }ntA        jP                  |dd
df         }tA        jR                  tA        jT                  |ddd
df         tA        jV                  |ddd
df         |jD                  d   d
z
        |dd
|z   f<   nd}| jY                          t[        |dd|f   |      } |||ddd
df   d       |s||r|jM                  d      r|ddd
df   }tA        j\                  ||dk7           }t#        |      r^t        j^                  |j`                  d      dk\  r |	dtA        jT                  |             n |	dtA        jT                  |             tc        tA        jT                  |             |jD                  d   tJ        k  rte         |             } ||        |tA        jf                  |d   ddg      te        |d   dz   |d   dz
  g      d       th        D ]p  }|t#              k\  r n` |
|d   |dd
|z   f   |d tk        |      z   d!z   ntk        |      d"z   ||   z   d#z   t        jl                  |dd
|z   f   dd$%      z          r tc                d}|t#        |jn                        k  rj|jn                  |    d   |jn                  d   d   k(  rD|dz  }|t#        |jn                        k  r'|jn                  |    d   |jn                  d   d   k(  rDt#        |jn                  jp                  d         dkD  rs|jn                  d   d   |jn                  |    d   kD  rM|jn                  d   d   |jn                  |    d   z
  |jn                  d   d   |jn                  |    d   z
  z  nd}|jn                  d   d   |jn                  d   d   kD  rK|jn                  d   d   |jn                  d   d   z
  |jn                  d   d   |jn                  d   d   z
  z  nd} |d&||d'z   nd z   tk        |jD                  d   d
z
        z   d(z   |tk        t'        |            nd)||k7  r"d*tk        tA        jr                  |d            z   nd z   z   d+z          | ju                          y# 1 sw Y   _xY w# t2        t4        f$ r( t7        j8                  dj;                  |             Y t<        $ r8}t7        j8                  dj;                  t?        |                   Y d}~d}~ww xY w# tF        $ r d } |||      }Y w xY w),zsee def plot(...
        r   z<no x-attributed found, use methods plot_xrecent or plot_meanplot_xr@   Nr  r   )r  yscaler  r  r  r  r  r   r   z*could not open file {0} to subtract ``X0``z2could not read `X0` due to this exception:
    {0}r   zU
  Using iteration {0} (index={1}/{2}) instead of iteration {3} from `x_opt` argumentc                    d}t        j                  |d         s|d   }t        j                  |d         }| ddt        t	        d            |D cg c]  }d|z   	 c}z   f   } || ddddfxx   |z  cc<   | S c c}w )zFfirst row of `x_opt_idx` are indices, second (optional) row are valuesNr   r   r  )r0   r  r1   r   r   )dat_x	x_opt_idx
x_opt_valsr7   s       r   
apply_xoptz)CMADataLogger._plot_x.<locals>.apply_xopt  s    !%J;;y|4%.q\
$&JJy|$<	!!T%(^i6Piq1ui6P%P"PQE!-ae
2 L 7Qs   A>
Tr  r  r   r   rT  z3.3symlog)	linthresh)
linthreshyr   gư>r   r  r   z: :=rw  )significant_digitsdesired_lengthzObject Variables (r   z-D, popsize=NA|));r  r	   r   rp   rz   r}  r!   r  r  r  r  r  callabler|  r   r  r   r;   r  r   r   r\   r   r   r   r   r   r   r   r   r   r   r0   searchsortedr   r   rQ   (cma_logger_plot_x_annotation_lines_limitr   aranger  r  r   r   r  r8   r  version_diffr   r  r  r  cma_logger_plot_x_annotate_idxr   num2strrP   r  r  r  ) rv   r5   r  remarkr  ru  rv  r}  r  r  r  r  r  rb  r  tfr7   r   r   rP   r   _i_mr  r  rx  r  _d_d_posr  popsimpopsis                                    r   r  zCMADataLogger._plot_x  s    tS! !78@*, <<@@AWXKEE'++L$?@EEJJLE$((6B3u:& qtoad '5,EEJJLEEEEeS!z%%0ib#! # 0 0 : ' uaby)__TVVAqD\59XXdff%a(8FutvvbdAg6A9NN!GB66"a%=E)MM #L#)6$&&Q-R#GI r12v!QR%LE!L1ae% !QR%LCGGAqrEN*L ;;q>DD!dU2y=%999:G#*E"i- H,F<M<Mf<U %b!"fb!"fiiA 23jjr12v/%'[[ae1EFF5AB<0%++a.12D&Fb!c'k" Gal 3Y?Rq!"us#(V8I8I&8Qq!"uBVVBrQwK(F6{%%j&<&<eDI8rvvf~>8v?BFF6N3;;q>DDtvBH 2A'r!ut|RUT\23T; 4 C=RVU2q1u9-+6+>R#a&[4' Vc\KN:S@mmE"a!e)$47834667 4 	#cee*nr1r1!=FA #cee*nr1r1!= 
Oa'CEE"IaL355!9Q<,G %%)A,r1-#%%)A,r12MNMQ 	 UU2Yq\CEE!HQK/ 559Q<#%%(1+-#%%)A,q!2LM59 	""("4$">EKKNQ&'(*89 &+%6#c%j/D5;u_3RXXfa011"N  	 	!Q ') [MM"N"U"UVX"YZ  iMM"W"^"^_cde_f"ghhi&  1	! #5%01sH   )^? 5 ^2^? /`8 2^<7^? ?3`55`5=-`00`58aac                    | j                   dz   }| j                  D ]  }t        j                  j	                  | j                   |z   dz         s5t        j                  dj                  | j                   |z   dz                ht        ||z   dz   d      5 }d}d}	t        | j                   |z   dz         D ]+  }
|dz  }||k  s	||z  dk  s|j                  |
       |	dz  }	- ||z  dk\  r|j                  
       |	dz  }	ddd       |s|kD  st        d		z  d
z   |z   |z   dz           |r| xj                   dz  c_         | S # 1 sw Y   HxY w)a  
        rude downsampling of a `CMADataLogger` data file by `factor`,
        keeping also the first `first` entries. This function is a
        stump and subject to future changes. Return self.

        Arguments
        ---------
           - `factor` -- downsampling factor
           - `first` -- keep first `first` entries
           - `switch` -- switch the new logger to the downsampled logger
                original_name+'down'

        Details
        -------
        ``self.name_prefix+'down'`` files are written

        Example
        -------
        ::

            import cma
            cma.downsampling()  # takes outcma/cma* files
            cma.plot('outcma/cmadown')

        r   r   z.CMADataLogger.downsampling: file {0} not foundwtr   r   r   Nz%dz lines written in )r\   r^   rU   rV   rW   r   r   r   r   r   r   )rv   factorfirstrL  verbose	newprefixr{   rP   ilinecwrittenr,   s              r   r  zCMADataLogger.downsamplingA  sW   4 $$v-	OOD77>>$"2"2T"9F"BCN%vd&6&6&=&FGIi$&/6! !1!1D!86!ABDQJEu}(: A	 C
 6>Q&GGDMMH 7 55=dh'*>>JTQTZZ[# $$ & 76s   5E	6E		E	c                 .   t        j                  |      r|dk(  r| j                          y| j                  }d }t	        |      j                         }|j                  j                  d   }|d}t        j                  |      r:|r t        j                  dd||dz
  |ddf   }nt        j                  ddddf   }t        |      }|||k     }|| |k     }|j                  |df   }t        j                  |j                  ddd	f         }|j                  |df   }t        |      dk(  r |||d          n9| j                          |D ]  }	 |||	        | j                           |||       t        j                  j!                          y)
a  displays selected data from (files written by) the class
        `CMADataLogger`.

        Arguments
        ---------
           `idx`
               indices corresponding to rows in the data file;
               if idx is a scalar (int), the first two, then every idx-th,
               and the last three rows are displayed. Too large index
               values are removed. If ``idx=='header'``, the header
               line is printed.

        Example
        -------
        >>> import cma, numpy as np
        >>> res = cma.fmin(cma.ff.elli, 7 * [0.1], 1, {'verb_disp':1e9})  # generate data
        ...  #doctest: +ELLIPSIS
        (4...
        >>> assert res[1] < 1e-9
        >>> assert res[2] < 4400
        >>> l = cma.CMADataLogger()  # == res[-1], logger with default name, "points to" above data
        >>> l.disp([0,-1])  # first and last
        ...  #doctest: +ELLIPSIS
        Iterat Nfevals  function value    axis ratio maxstd  minstd...
        >>> l.disp(20)  # some first/last and every 20-th line
        ...  #doctest: +ELLIPSIS
        Iterat Nfevals  function value    axis ratio maxstd  minstd...
        >>> l.disp(np.r_[0:999999:100, -1]) # every 100-th and last
        ...  #doctest: +ELLIPSIS
        Iterat Nfevals  function value    axis ratio maxstd  minstd...
        >>> l.disp(np.r_[0, -10:0]) # first and ten last
        ...  #doctest: +ELLIPSIS
        Iterat Nfevals  function value    axis ratio maxstd  minstd...
        >>> cma.disp(l.name_prefix, np.r_[0:9999999:100, -10:])  # the same as l.disp(...)
        ...  #doctest: +ELLIPSIS
        Iterat Nfevals  function value    axis ratio maxstd  minstd...

        Details
        -------
        The data line with the best f-value is displayed as last line.

        Use `CMADataLogger.disp` if the logger does not have the default
        name.

        :See: `CMADataLogger.disp`, `CMADataLogger.disp`

        headerNc           
         t        | j                  dddf   |k(        d   d   }t        | j                  dddf   |k(        d   d   }t        dt	        | j                  |df         z  dt	        | j                  |df         z  z   d| j                  |df   z  z   d| j                  |d	f   z  z   d
t        | j                  |ddf         z  z   d
t        | j                  |ddf         z  z          y)zprint data of iteration iNr   z%5dz %6dr   z %.14er  z %5.1er   z %6.2e)r`  rP   rQ   r   r   r   r   )rb  r$  r7   r1  s       r   printdatarowz(CMADataLogger.disp.<locals>.printdatarow  s    suuQT{i/03A6Aswwq!t}	1215a8A%3suuQT{+,vSUU1a4[9I/JJXY\Y^Y^_`bc_cYdMeeceeAqDk*+c#''!QR%.1235=CGGAqrEN@S5ST Ur   r   r   r   r   r  )r	   rI  disp_headerr\   r@   r   rP   r   r0   r  r_r  r  r;   r  stdoutflush)
rv   rx  r   r  rb  ndataitersidxbestiterbestr7   s
             r   dispzCMADataLogger.dispu  sz   ` <<h  "))	U N+002A
 ;C;;seeAq#eai"3RT9:eeAq"Q$J'Cj#+3$%- c1f))CEE!Q$K(55!$u:?eAh'S!$ h'

r   c                     d}t        |       y )Nz;Iterat Nfevals  function value    axis ratio maxstd  minstd)r   )rv   headings     r   r  zCMADataLogger.disp_header  s    Ogr   NNr   )Nr   N)FNT)Nr   NFҶOɃ;Nr  g    cAFFNr   NTr   TF)Nr   Nr  Nr  )r   F)r   NT)r   N)r   NNNN)r   rN   )r   r  r   N)FN)rP   )r  )Tr   )r   NNNNF)r  r   TF)r   ))r  r  r  r^  rU   r]   rT   rw   propertyr|   r   r   r   rA  rE  rG  rM  r[  r]  rd  r  r  r  r  r  r  r  r  r  r2  rE  r.  rM  rn  r  r  r  r  r  r  r  r   r   r   r@   r@   b   sj   7p  "&&(N
 $2!E\] 3/h 
 
(~Bl\Q(f?*B%N	7 B 3712$bH 7;12gP"FCHCH	 AE/33hlZ = =Un# 
 
 +/Rtbc)-*,EN
>'
 7;<AE"L/h]|r   r@   iD  c                     |st         dz  a t         }t        |t        t        f      r|a  t	        |       j
                  ||j                  d|      f||d|S )a  plot data from files written by a `CMADataLogger`,

    see `cma.CMADataLogger.plot` to see all valid keyword arguments.

    ``cma.plot()`` plots the data from the default output folder (which is
    by default always overwritten). ``cma.plot(name, **argsdict)`` is a
    shortcut for ``cma.CMADataLogger(name).plot(**argsdict)``.

    `name` is the filename prefix of the logger, `None` evaluates to the
    default ``'outcmaes/'`` (hence writing in a subfolder).

    The explictly given arguments are for backwards compatibility of their
    default setting and may disappear. All arguments are documented in
    `CMADataLogger.plot`.
    r   r5   )r  rv  )r  r  r   r  r@   r  r  )r{   r  rm  r  rv  r  s         r   r  r    si    * a #U|$ #=##CK)J .2?/9. '-	. .r   r   c                 ^    t        | r| nt         j                        j                  ||      S )a  create tar file ``filename [+ ...] + '.tar.gz'`` of folder `name`.

    The resulting tar file serves to recreate the current `cma.plot`
    elsewhere.

    `name` defaults to the folder plotted with `cma.plot` by default.
    `filename` defaults to `name` while adding a unique time stamp if
    `unique` is true.

    Return the path of the created file (may be absolute or relative).

    Details
    =======

    This is a convenience replacement for executing ``tar -czf
    filename.tar.gz name`` in a system shell where ``name`` defaults to the
    default plot data folder and ``filename`` is created to be unique.

    This function calls `CMADataLogger.zip` to do the real work.
    )rX  rY  )r@   rT   r[  )r{   rX  rY  s      r   plot_zipr    s,    * =+G+G 33@Ar   c                 Z    t        | r| nt         j                        j                  |      S )a  displays selected data from (files written by) the class
    `CMADataLogger`.

    The call ``cma.disp(name, idx)`` is a shortcut for
    ``cma.CMADataLogger(name).disp(idx)``.

    Arguments
    ---------
    `name`
        name of the logger, filename prefix, `None` evaluates to
        the default ``'outcma/cma'``
    `idx`
        indices corresponding to rows in the data file; by
        default the first five, then every 100-th, and the last
        10 rows. Too large index values are removed.

    The best ever observed iteration is also printed by default.

    Examples
    --------
    ::

       import cma
       from numpy import r_
       # assume some data are available from previous runs
       cma.disp(None, r_[0, -1])  # first and last
       cma.disp(None, r_[0:int(1e9):100, -1]) # every 100-th and last
       cma.disp(idx=r_[0, -10:0]) # first and ten last
       cma.disp(idx=r_[0:int(1e9):1000, -10:0])

    :See: `CMADataLogger.disp`

    )r@   rT   r  )r{   rx  s     r   r  r  	  s'    D =+G+G 49%r   c                   P    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
ed	        Zd
 Zy)LoggerDummyz-use to fake a `Logger` in non-verbose settingc                 J    d| _         d | _        g | _        g | _        g | _        y Nr   )countr{   
attributes	callablesr  rv   argsr  s      r   rw   zLoggerDummy.__init__=	  s%    
	r   c                 "    | j                         S r   )pushr  s      r   __call__zLoggerDummy.__call__C	  s    yy{r   c                     | S r   r   r  s      r   rA  zLoggerDummy.addE	      r   c                     | S r   r   r  s      r   r  zLoggerDummy.pushG	  r  r   c                      y r   r   r  s      r   push_headerzLoggerDummy.push_headerI	  s    r   c                     g | _         | S r   )r|   r  s      r   r   zLoggerDummy.loadK	  s    	r   c                     d| _         y r  )r  rv   s    r   deletezLoggerDummy.deleteN	  s	    
r   c                      y)Nr   r   r  s    r   rX  zLoggerDummy.filenameP	  s    r   c                 .    t        j                  d       y )Nz;loggers is in dummy (silent) mode, there is nothing to plot)r   r   r  s      r   r  zLoggerDummy.plotS	  s     2 	3r   N)r  r  r  r^  rw   r  rA  r  r  r   r  r  rX  r  r   r   r   r  r  ;	  s?    7 3r   r  c                       e Zd ZdZdZddgZ	 	 	 	 ddZed        Zd Z	d	 Z
dd
Zd Zd ZddZd ZddZd Zd Zd Zd Zd ZdddeddfdZy)Loggera	  log an arbitrary number of data (a data row) per "timestep".

    The `add` method can be called several times per timestep, the `push`
    method must be called once per timestep. Callables are called in the
    `push` method and their output is logged. `push` finally also dumps the
    current data row to disk. `load` reads all logged data in and, like
    `plot`, will only work if the same number of data was pushed each and
    every time.

    To-be-logged "values" can be scalars or iterables (like lists
    or nparrays).

    The current data is saved to a file and cleared after each timestep.
    The `name` and `filename` attributes are based on either the name or
    the logged instance class as given as first argument. Only if a name
    was given, `push` overwrites the derived file if it exists.

    To append data, set `self.counter` > 0 or call `load` before to call
    `push` the first time (make sure that the `_name` attribute has the
    desired value either way). ``len(self.load().data)`` is the number of
    current data.

    A minimal practical example logging some nicely transformed attribute
    values of an object (looping over `Logger` and `LoggerDummy` for
    testing purpose only):

    >>> import numpy as np
    >>> import cma
    >>> for Logger in [cma.logger.Logger, cma.logger.LoggerDummy]:
    ...     es = cma.CMAEvolutionStrategy(3 * [1], 2, dict(maxiter=9, verbose=-9))
    ...     lg = Logger(es,  # es-instance serves as argument to callables and for attribute access
    ...                 callables=[lambda s: s.best.f,
    ...                            lambda s: np.log10(np.abs(s.best.f)),
    ...                            lambda s: np.log10(s.sigma),
    ...                           ],
    ...                 labels=['best f', 'lg(best f)', r'lg($\sigma$)'])
    ...     _ = es.optimize(cma.ff.sphere, callback=lg.push)
    ...     # lg.plot()  # caveat: requires matplotlib and clears current figure like gcf().clear()
    ...     lg2 = Logger(lg.name).load()  # same logger without callables assigned
    ...     lg3 = Logger(lg.filename).load()  # ditto
    ...     assert len(lg.load().data) == lg.count == 9 or isinstance(lg, cma.logger.LoggerDummy)
    ...     assert np.all(lg.data == lg2.data) and np.all(lg.data == lg3.data)
    ...     assert lg.labels == lg2.labels
    ...     lg.delete()  # delete data file, logger can still be (re-)used for new data

    z.logdatar  r  Nc	                 f   d| _         |t        |      k(  r%|#t        dt        |      dt        |            || _        || _        || _        || _        || _        | j                  |       | j                  t        j
                  j                  | j                        k7  r#| j                  |      | j                  z   | _	        |t        |      k7  r]| j                  | j                        }	| j                  | j                  |	      | _	        | j                  | j                  |	      | _        ddk  rKt        j
                  j                  | j                        r"t!        j"                  d| j                  z         |xs g | _        |xs g | _        |xs g | _        d| _        g | _        y)	a  `obj_or_name` is the instance that we want to observe,

        or a name, or an absolute path to a file.

        `attributes` are attribute names[:`str`] of `obj_or_name`, however

        `callables` are more general in their usage and hence recommended.
        They allow attribute access and transformations, for example like
        ``lambda es: np.log10(sum(es.mean**2)**0.5 / es.sigma)``.

        When a `callable` accepts an argument, it is called with
        `obj_or_name` as argument. The returned value of `callables` and
        the current values of `attributes` are logged each time when
        `push` is called.

        Details: `path` is not used if `obj_or_name` is an absolute path
        name, e.g. the `filename` attribute from another logger. If
        ``delete is True``, the data file is deleted when the instance is
        destructed. This can also be controlled or prevented by setting the
        boolean `_delete` attribute.
        z%.19eNzstring obj z has no attributes r   r   z7Logger uses existing file "%s" which may be overwrittenr   )r   r   r   objr{   rV   _deleteplot_transformations	_autoname_namerU   rY   _create_path_unique_name_addition_compose_namerW   r	   print_messager  r  r  r  current_data)
rv   obj_or_namer  r  rV   r{   r  r  r  ids
             r   rw   zLogger.__init__	  sd   0 #k**z/EK #j/3 4 4		$8!{#::44**404::=DJ#k**++DJJ7B++DJJ;DJ**499b9DI6bggnnTZZ0 !;=AZZ!H I %*"bl
r   c                     | j                   S )z<full filename as absolute path (stored in attribute `_name`))r  r  s    r   rX  zLogger.filename	  s     zzr   c                 P    t        j                  | j                         d| _        y)z0delete current data file and reset count to zeror   N)rU   remover  r  r  s    r   r  zLogger.delete	  s    
		$**
r   c                 B    | j                   du r| j                          y y r  )r  r  r  s    r   __del__zLogger.__del__	  s    <<4KKM  r   c                    |syt         j                  j                  t        j                  j                  t         j                  j	                  |      D cg c]  }|s|	 c}       }|j                  t         j                  df      r|t         j                  z   }t         j                  j                  |      r5	 t        j                  t         j                  j                  |             |S |S c c}w # t        $ r Y |S w xY w)z/return absolute path or '' if not `name_prefix`r   rD   )
rU   rV   rY   rZ   r[   r:   r]   r   r   r   )rv   r\   r+   rV   s       r   r  zLogger._create_path	  s    wwrww||{9S-Y9SAWXa9S-YZ[."&&=D77??4 BGGOOD12 t .Z  s   C5C5?2C: :	DDc                 H   t        |      |k(  r|| _        | j                  jt        |      }|j                  d      d   }|j                  d      d   }d|v r|j                  d      d   }d|v r|j                  d      d   }|| _        | j                  | _        t        j
                  j                  | j                        s]d| j                  vr| j                  | j                  z   | _        | j                  j                  d	      sd
| j                  z   | _        yyy)zset `name` and `_name` attributes.

        Loggers based on the same class are separted by calling
        `_unique_name_addition` afterwards.
        Nzclass r   rP  r   r   'r  ).__r  )	r   r{   r[   r  rU   rV   rW   	extensionr   )rv   r  r<   s      r   r  zLogger._autoname	  s     s8s?DI99CA!"%AR AaxGGCLOaxGGCL$DIYY
ww~~djj)$**$!ZZ$..8
::((5!DJJ.
 6 *r   c                 h    |j                  | j                        }|dk\  r|d| |z   ||d z   S ||z   S )z(add unique_id to name before ".logdata" r   N)findr  )rv   r{   	unique_idr7   s       r   r  zLogger._compose_name	  s@    IIdnn%23q&tBQx)#d12h.NdY>NNr   c                    || j                   }t        j                  j                  |      syd}t        j                  j                  | j	                  |t        |                  r>|dz  }t        j                  j                  | j	                  |t        |                  r>|dz  dk(  rt        j                  d||fz         t        |      S )z8return id:`str` that makes ``name or self._name`` uniquer   r   r   c   r   z%d Logger data files like %s found. 
Consider removing old data files and/or using the delete parameter to delete on destruction and/or
using the `delete` method to delete the current log.)r  rU   rV   rW   r  r   r	   r  )rv   r{   r7   s      r   r  zLogger._unique_name_addition	  s    <::Dww~~d#ggnnT//c!f=>FA ggnnT//c!f=>r6Q; !W $%d)	!, -
 1vr   c                     t        |t              r| xj                  |z  c_        y	 | xj                  |D cg c]  }| c}z  c_        yc c}w # t        $ r | xj                  |gz  c_        Y yw xY w)zcstack data into current row managing the different access...

        ...and type formats.
        N)r  r   r  r  )rv   r|   r   s      r   _stackzLogger._stack
  si    
 dD!%,!!%6Aa%66!%6 ,!!dV+!,s"   A 	A
A A A32A3c                 4    ||| _         | j                         S )zsee also method `push`.

        TODO: replacing `obj` here is somewhat inconsistent, but maybe
        an effective hack.
        )r  r  )rv   r  s     r   r  zLogger.__call__
  s     ?DHyy{r   c                 (    | j                  |       | S )zrdata may be a value, or a `list`, or a `numpy` array.

        See also `push` to complete the iteration.
        )r  )rv   r|   s     r   rA  z
Logger.add"
  s     	Dr   c                 &   | j                   D ])  }t        | j                  |      }| j                  |       + | j                  D ]$  }	 | j                   || j                               & | S # t
        $ r | j                   |              Y Jw xY w)zCadd data from registered attributes and callables, called by `push`)r  r   r  r  r  r  )rv   r{   r|   r  s       r   _add_defaultszLogger._add_defaults+
  s|    OOD488T*DKK $ H(HTXX./ '
   (HJ'(s   	!A..BBc                 `     j                           j                  dk(  r j                          t         j                  d      5 }|j                  dj                   fd j                  D              dz          ddd       g  _         xj                  dz  c_         S # 1 sw Y   'xY w)zScall ``stack()`` and finalize the current timestep, ignore
        input arguments.r   atr   c              3   <   K   | ]  }j                   |z    y wr   )r   )r   r  rv   s     r   r   zLogger.push.<locals>.<genexpr>>
  s"      !?,=S "&s!2,=s   r   Nr   )r  r  r  r   r  r   rZ   r  )rv   r  file_s   `  r   r  zLogger.push7
  s     	::?$**d#uKK !?,0,=,=!? ?AEF G $ 

a
 $#s   7B$$B-c                    | j                   rdnd}t        | j                  |      5 }| j                  D ];  }t	        | |d       s|j                  d|dt        t	        | |            d       = 	 d d d        y # 1 sw Y   y xY w)Nr  r  z# {'z': z}
)r  r   r  fields_readr   r   r   )rv   moder  r{   s       r   r  zLogger.push_headerD
  sd    zztt$**d#u((4t,KKD$wtT?R:S TU ) $##s   A<-A<<Bc                 D   dd l }t        j                  | j                        | _        t        | j                  d      5 }|j                         }|j                  d      r|j                  |dd  j                               }t        |t              r'| j                  D ]  }||v st        | |||           n|| _        |j                         }|j                  d      rd d d        | j                  dk(  rt!        | j                        | _        | S # 1 sw Y   4xY w)Nr   rtr   r   )r   r0   r   r  r|   r   r   r   r   r   r  rz  r  r   r  r  r;   )rv   r   r  r,   resr{   s         r   r   zLogger.loadK
  s    JJtzz*	$**d#u>>#D//#&&&QR(9;c4( $ 0 03;#D$D	: !1 #&DK~~' //#& $ ::?TYYDJ $#s   A'D';DDTplasmac           
         	 ddl m} t        |      sddlm} | j                          t        | j                        }		 t        | j                  d         }
|rj                         j                          || j                  }|
dk  rS |d   | j                        } |t        d|	dz          ||      fd|r| j                  r| j                  d   ndi| n+|r6t!         j#                  |      t%        j&                  dd	|
                  }nd}t        t        | j                              D cg c]&  }t)        ||
z  t        | j                        z        ( }}t        |      dkD  r|
dz
  |d
<   t!        | j                        }t        |
      D ]k  }| j                  dd|f   } ||   |      } |t        d|	dz          ||      f|rt+        |      nd|r||v rt+        |      nddd|
z  |
dz   z  z
  d| m | j                  rj-                  d       j/                  dd       |j1                         j2                  j5                          | S # t        $ r Y gw xY w# t        $ r d}
Y *w xY w# t        t        f$ r | j                  }Y w xY wc c}w # t        t        f$ r Y w xY w)a8  plot logged data using the `plot` function.

        If `clear`, this calls `matplotlib.pyplot.gca().clear()` before
        to plot in the current figure. The default value of `clear` may
        change in future.

        If ``transformations[i]`` is a `callable` it is used to transform the i-th
        data column like ``i_th_column = transformations[i](data[:,i])``.

        `smoothing` (over time) is applied to each data column, a light
        (though slow) smoothing would be
        ``functools.partial(cma.utilities.math.moving_average, w=1.1)``.
        r   rf  )r  Nr   r   r  r   g333333?r   r  r  )r  r  r  r  r  Tr8  r9  )r}  rg  r~  r  r!   r  r   r;   r|   r  r    r  r  r  r   r  r  r  r0   r  r   r  r  r>  rk  r  rx  )rv   r  r  transformations	smoothingr  r  r  r  nr   r|   colorsr7   
idx_labelscolumns                   r   r  zLogger.plot]
  sy   	!0~.				N	DIIaL!A GGIOO""77Oq5**4995q!a%)D/ ).4;;t{{1~D 1cll51"++dD!2LMNAFs4;;GWAXYAXA#a!ec$++&667AXJY:"!"Q
2$++&F1X1a40oa08VU1a!e_i&7 *0$v,d*/AO$v,#'QV"44 		  ;;JJ#J&V$	U  D   	A	 	*<499D< Z #I.44sL   I# I3 
J 7+J'0J,#	I0/I03JJJ$#J$,J?>J?)NNz	outcmaes/NNFNr   )r  r  r  r^  r  r  rw   r  rX  r  r  r  r  r  r  r  r  rA  r  r  r  r   r   r  r   r   r   r  r  W	  s    -\ I*K9?C59482j  
/2O
",
V$ D$(4;r   r  c                     	 ddl m} |j                  d       |j	                         }|j                         j                         }|j                  d      ry|j                  d      r=t        t        j                  |            | d   z  }|dk  r|j                  dd	
       y|d   |d   z  dk  r|j                  dd	
       t                y# t        $ r Y yw xY w# t        $ r Y yw xY w)z6turn on grid and also minor grid depending on y-limitsr   rf  NTrr  r  r  g     @@minorr9  r   g     j@)r}  rg  r~  r>  ylimr    
get_yscaler   r   r0   r  KeyErrorr.   )r  r  limsscaler<   s        r   r  r  
  s    ,HHTN88:DGGI  "E!RVVD\"VK%88Q 3wW-Awa3W% "   		 	s#   C *$C" 	CC"	C.-C.c                     ddl m}  | j                  d       | j                  ddd       | j                  dd       | j	                         j                         D cg c]  }|j                          }}t        |D cg c]  }|xr |j                  d	        c}      r| j                          yyc c}w c c}w )
z}reduce wasted margin area from 19.0% to 4.0% and make both grids default and

    show legend when labels are available.
    r   NTr  r   )r:  r  r   )r   r  r  )
r!   rg  r>  marginsr    r"   	get_labelr3   r   r  )r  r,   r  r  s       r   custom_default_matplotlibr  
  s    
 $HHTNHHTCH0KK#K+.779+>+>+@A+@4dnn+@FA
VDVEE/%**3///VDE

 F BDs   B7B<r  )r   )NNr   g     p@N)NNTr  )/r^  
__future__r   r   r   r   
__author__rU   r  r   r   numpyr0   r   r   	utilitiesr	   r
   r  r   r  r4   r`  r  r$   r  r   r  r  r   r   r.   r8   r>   BaseDataLoggerr@   r  r|  r  r[   r  r  objectr  r  r  r  r   r   r   <module>r     s   S R
 	 
      ) 1	

 A G!&s  H+/ ( 7&& (s!J-- s!nC   '(.> ||m0088>>tQGJJA0#%N3& 38AV AF
#*r   