B
    zd!                 @   s   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gZ
e jddd	G d
d deZe jddG dd deZdS )    N)instance_of)RandomState   )utilEnsembleEnsembleConfigurationT)slotsfrozenc               @   s,   e Zd Ze Ze Ze Ze ZdS )r   N)	__name__
__module____qualname__attribadaptation_lagadaptation_timescale_factor	evaluator r   r   ]/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/ptemcee/ensemble.pyr      s   )r   c               @   sn  e Zd ZdZejeeedZeje	j
ejdZeje	j
e	jdZeje	j
ddZeje	j
ddZejeeddZejeeeedZejed	Zejedd
dZejeddZejeddZejeddZeje	j
dddZeje	j
dddZeje	j
dddZeje	j
dddZ ej!dd Z"ej!dd Z#dd Z$dd Z%dd Z&dd Z'dddZ(dd Z)dd Z*dS ) r   z
    This contains as little contextual information as it can.  It represents an ensemble.py that performs steps in the
    parameter space.

    )type	validator)r   	converterN)r   defaultF)r   r   r   )r   r   factory)r   r   )r   initr   )r   r   c             C   s   t |std|jd S )Nz{} must be callable.)callable
ValueErrorformatname)self	attributevaluer   r   r   _is_callable5   s    zEnsemble._is_callablec             C   s   t |t | jkrtdd S )Nz>Number of temperatures not consistent with starting positions.)lenxr   )r   r    r!   r   r   r   _is_consistent:   s    zEnsemble._is_consistentc             C   s   | j j\| _| _| _t| j| jf| _t| jd | j| _	| j
d ksR| jd krx| | j \}}| || | _
|| _| j
tj k rtdd S )Nr   z;Attempting to start with samples outside posterior support.)r$   shapentempsnwalkersndimnpZonesjumps_proposedfullswaps_proposedlogPlogl	_evaluate_tempered_likelihoodinfanyr   )r   r/   Zlogpr   r   r   __attrs_post_init__?   s    zEnsemble.__attrs_post_init__c             C   s   |  | j| j| j | | j| j| j| _| j| j }| jr| jdkr| 	| j
| j|}|  j|7  _|  j| j| j|d7  _|  j
d7  _
d S )Nr   )betas)_stretchr$   r.   r/   _temperature_swapsswaps_acceptedr-   adaptiver'   _get_ladder_adjustmenttimer5   r1   )r   ratiosZdbetasr   r   r   stepN   s    zEnsemble.stepc          
   C   sd  t | j| jf| _| jd }| j}| j}t | jj}x$dD ]}|}	|d d }
|dd|	ddddf }|dd|
ddddf }t 	| j
j| |||fd}t |||f}xt|D ]|}| j
jd||d}|||ddf ||ddf |df||ddddf |||ddf    ||ddddf< qW | |\}}| || }|t | | |dd|	ddf  }t | j
jdd||fd}||k }| }|d|f|ddf |d|f|ddf< |d	| |dd|	ddf d	|< |d	| |dd|	ddf d	|< |||f| jdd|	ddf< q@W dS )
zI
        Perform the stretch-move proposal on each ensemble.py.

           )r   r   r   N)lowhighsizer   )r@   rA   )rB   )r*   Zzerosr'   r(   jumps_acceptedr)   log_configr   exp_randomuniformemptyrangerandintreshaper0   r1   flatten)r   r$   r.   r/   wdtZlogajZj_updateZj_sampleZx_updateZx_samplezykjsZy_loglZy_logpZy_logPZlogp_acceptZlogrZacceptsr   r   r   r6   ]   s6    
B(0**zEnsemble._stretchc             C   sj   |j dd }|d| jf}t|}tj| | jj	|}t
|td| |d }tt
|dS )zi
        Evaluate the log likelihood and log prior functions at the specified walker positions.

        NrB   r>   )r>   )r&   rL   r)   r#   	itertoolschainfrom_iterable_mapperrE   r   r*   ZfromiterfloattupleZrollaxis)r   r$   r&   valueslengthresultsarrayr   r   r   r0      s    zEnsemble._evaluatec          	   C   sP   |dkr| j }tjdd ||dddf  }W dQ R X tj |t|< |S )a  
        Compute tempered log likelihood.  This is usually a mundane multiplication, except for the special case where
        beta == 0 *and* we're outside the likelihood support.

        Here, we find a singularity that demands more careful attention; we allow the likelihood to dominate the
        temperature, since wandering outside the likelihood support causes a discontinuity.

        Nignore)invalid)r5   r*   Zerrstater2   isnan)r   r/   r5   ZloglTr   r   r   r1      s    
zEnsemble._tempered_likelihoodc       	      C   s   |  }| jj|| jj  }|| jj }||dd |dd   }td|dd  }|t|9 }dt|d|d    |dd< || S )z
        Execute temperature adjustment according to dynamics outlined in
        `arXiv:1501.05823 <http://arxiv.org/abs/1501.05823>`_.

        NrB   r   r   )copyrE   r   r   r*   diffrF   Zcumsum)	r   r;   Zbetas0r<   r5   ZdecaykappaZdSsZdeltaTsr   r   r   r:      s    "zEnsemble._get_ladder_adjustmentc             C   s  | j }t| j}t|d | _xt|d ddD ]}| j| }| j|d  }|| }	| j|}
| j|}t	| jj
|d}|	|||
f ||d |f   }||k}t|| j|d < t|||
| ddf }t|||
| f }t|||
| f }||d || ddf |||
| ddf< ||d || f |||
| f< ||d || f |	||d || f   |||
| f< |||d || ddf< |||d || f< ||	|  ||d || f< q4W |S )z|
        Perform parallel-tempering temperature swaps on the state in ``x`` with associated ``logP`` and ``logl``.

        r   r   rB   )rA   N)r(   r#   r5   r*   rI   r8   rJ   rG   ZpermutationrD   rH   sumrc   )r   r$   r.   r/   r(   r'   iZbiZbi1ZdbetaZipermZi1permZracceptZpacceptselZx_tempZ	logl_tempZ	logP_tempr   r   r   r7      s.    

 , 8 zEnsemble._temperature_swaps)N)+r
   r   r   __doc__r   r   r   r   rE   r*   Zndarrayr   Z_ladderr5   r_   r$   r.   r/   boolr9   r   rG   maprY   intr;   r(   r'   r)   r+   rC   r-   r8   r   r"   r%   r4   r=   r6   r0   r1   r:   r7   r   r   r   r   r      s4   *
)r   numpyr*   rV   Zattr.validatorsr   Znumpy.random.mtrandr    r   __all__sobjectr   r   r   r   r   r   <module>   s   