B
    zdJ%                 @   s   d dl mZmZmZmZ ddgZd dlZd dlZd dlZ	d dl
mZ ddlmZmZmZ dddZejd	d	d
G dd deZejd	d	d
G dd deZdS )    )divisionprint_functionabsolute_importunicode_literalsmake_ladderSamplerN)RandomState   )utilchainensemblec          f   C   s"  t | tks| dk rtd|dkr4|dkr4td|dk	rL|dkrLtd|dk	rpt |tksh|dk rptdtddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjgd}| |jdk krvdldmttdn t|   }n|| d  }do}|tjkrdp}d}|d }|dk	r|dkr||d  }n.|dkrtdqtt|t| dr }t	dkt
| |}|rt|dkgf}|S )sa  
    Returns a ladder of :math:`\beta \equiv 1/T` under a geometric spacing that is determined by the
    arguments ``ntemps`` and ``Tmax``.  The temperature selection algorithm works as follows:

    Ideally, ``Tmax`` should be specified such that the tempered posterior looks like the prior at
    this temperature.  If using adaptive parallel tempering, per `arXiv:1501.05823
    <http://arxiv.org/abs/1501.05823>`_, choosing ``Tmax = inf`` is a safe bet, so long as
    ``ntemps`` is also specified.

    :param ndim:
        The number of dimensions in the parameter space.

    :param ntemps: (optional)
        If set, the number of temperatures to generate.

    :param Tmax: (optional)
        If set, the maximum temperature for the ladder.

    Temperatures are chosen according to the following algorithm:

    * If neither ``ntemps`` nor ``Tmax`` is specified, raise an exception (insufficient
      information).
    * If ``ntemps`` is specified but not ``Tmax``, return a ladder spaced so that a Gaussian
      posterior would have a 25% temperature swap acceptance ratio.
    * If ``Tmax`` is specified but not ``ntemps``:

      * If ``Tmax = inf``, raise an exception (insufficient information).
      * Else, space chains geometrically as above (for 25% acceptance) until ``Tmax`` is reached.

    * If ``Tmax`` and ``ntemps`` are specified:

      * If ``Tmax = inf``, place one chain at ``inf`` and ``ntemps-1`` in a 25% geometric spacing.
      * Else, use the unique geometric spacing defined by ``ntemps`` and ``Tmax``.

    r	   z'Invalid number of dimensions specified.Nz,Must specify one of ``ntemps`` and ``Tmax``.z ``Tmax`` must be greater than 1.z)Invalid number of temperatures specified.ggj+F9@g      @gȓk@g|a2U0@g:#J{/@g @g!@gԕ@gBs@gm@gY/rb @gEb?g£#?g>"D?gbg?gpwn?g	3mJ?g46<?gffffff?g?g`ME?g=W?g_L?g?gP1߄?gq@H?g!q?g*?gF?gz?gYnM?gN^$?g72?gףp=
?gl	g?gek}?grK!q?gQOIR?g %4?gjt?gZڊ?gs?g\?gPLۿ?g	ܺ?gh\8?g#0p?g$([?gHzG?g0Bx4?gR8!?gVy?g|?gt?gZGUD?gvOj?gup?gWc#?g-?gOn?g?ܵ?gH0[w?g|ʄ_j?g=;k]?g'XQ?g#EdXE?g}9?gЖs).?gPS"?g+5{?gKTo?gPn?gzNz?g;ǀ?g%P6?gyܝ?g_Yi?gQ?g8J^c?g%?gv?g-i?g%䃞?gfL2r?giq?gaۢ̆?gkC8?gH`w?g8gDiop?gY9i?g\].b?g%7[?gj&kT?gsM?g%G?gT@?g|S:?gPf4?g5v-?g+'?r   g      ?g       @g      @FTz:Must specify at least one of ``ntemps and finite ``Tmax``.   )typeint
ValueErrornparrayshapesqrtloginfZlogspacelog10Zconcatenate)ndimZntempsZTmaxZtstepZ	appendInfbetas r   \/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/ptemcee/sampler.pyr      s^    %

















$


T)slotsfrozenc               @   sX   e Zd ZdZe Ze ZejedZ	ejedZ
ejedZejedZdd ZdS )LikePriorEvaluatorz+
    Wrapper class for logl and logp.

    )factoryc             C   sn   | j |f| j| j}t|r(td|tdkr:d}n,| j|f| j| j	}t|
 rftd||fS )NzPrior function returned NaN.z-infr   z%Log likelihood function returned NaN.)logp	logp_argslogp_kwargsr   isnanr   floatlogl	logl_argslogl_kwargsany)selfxZlpllr   r   r   __call__   s    
zLikePriorEvaluator.__call__N)__name__
__module____qualname____doc__attribr%   r    listr&   r!   dictr'   r"   r,   r   r   r   r   r   w   s   r   c               @   sB  e Zd ZejedZejedZe Ze Z	eje
e
dZeje
e
dZejeedZejeedZejddZejeddZejeddZejeddZejed	dZejedZejeddd
Zejejddd
Zejdd Zejdd Z ejdd Z!eje	jdd Z"dd Z#dddZ$dddZ%dddZ&dS )r   )	converter)r5   r   N)defaultF)r5   r6   i'  d   r   )r   initr6   c             C   s.   |d dkrt d|d| j k r*t dd S )Nr   r   z#The number of walkers must be even.z9The number of walkers must be greater than 2 * dimension.)r   r   )r)   	attributevaluer   r   r   _validate_nwalkers   s    zSampler._validate_nwalkersc             C   s   |dk rt dd S )Nr	   z&Number of dimensions must be positive.)r   )r)   r9   r:   r   r   r   _validate_ndim   s    zSampler._validate_ndimc             C   s,   t |dk rtd|dk  r(tdd S )Nr	   zNeed at least one temperature!r   z"Temperatures must be non-negative.)lenr   r(   )r)   r9   r:   r   r   r   _validate_betas   s    zSampler._validate_betasc             C   s   t |std|jd S )Nz{} must be callable)callable	TypeErrorformatname)r)   r9   r:   r   r   r   _is_callable   s    zSampler._is_callablec             C   sz   | j d krt| j}n(t| j tr2t| j| j }nt| j }t| d| t| dt	| j
| j| j| j| j| jd d S )Nr   
_evaluator)r%   r    r&   r!   r'   r"   )r   r   r   
isinstancer   r
   Z_ladderobject__setattr__r   r%   r    r&   r!   r'   r"   )r)   r   r   r   r   __attrs_post_init__   s    
zSampler.__attrs_post_init__c             C   s\   |d krt  }nt|t s"tdtj| j| j| j| jd}tj	|| j
 || j|| jdS )NzInvalid random state.)adaptation_lagadaptation_timescale_factorZ	evaluator)r*   r   configadaptiverandomZmapper)r   rE   r@   r   ZEnsembleConfigurationrI   rJ   rK   rD   ZEnsembler   copyrM   _mapper)r)   r*   rN   rL   r   r   r   r      s    

zSampler.ensemblec             c   sB   |dkrd}|  ||}x$xt|D ]}|  q$W |V  qW dS )z/
        Return a stateless iterator.

        Nr	   )r   rangestep)r)   r*   rN   thin_byr   _r   r   r   sample   s    zSampler.samplec             C   s   t | |||S )zC
        Create a stateful chain that stores its history.

        )r   ZChainr   )r)   r*   rN   rS   r   r   r   r      s    zSampler.chain)N)NN)NN)'r-   r.   r/   r1   r2   r   Znwalkersr   r%   r    r3   r&   r!   r4   r'   r"   r   boolrM   rI   rJ   r$   rK   maprP   r   rD   r   Zndarray_data	validatorr;   r<   r>   rC   rH   r   rU   r   r   r   r   r   r      s2   

)NN)
__future__r   r   r   r   __all__r1   	itertoolsnumpyr   Znumpy.random.mtrandr    r
   r   r   r   srF   r   r   r   r   r   r   <module>   s   
f