B
    °#g\£6  ã               @   sx   d dl Z d dlmZ d dlmZ ddlmZmZmZm	Z	m
Z
mZ ddlmZ ddlmZmZmZmZ G dd	„ d	eƒZdS )
é    N)Úcoloredé   )ÚInferenceNetworkÚEmbeddingFeedForwardÚProposalNormalNormalMixtureÚ%ProposalUniformTruncatedNormalMixtureÚProposalCategoricalCategoricalÚ%ProposalPoissonTruncatedNormalMixtureé   )Úutil)ÚNormalÚUniformÚCategoricalÚPoissonc                   s@   e Zd Zd‡ fdd„	Zdd	„ Zd
d„ Zddd„Zdd„ Z‡  ZS )ÚInferenceNetworkLSTMé   r   é   é@   é   c                sr   t ƒ j|ddi|—Ž t ¡ | _t ¡ | _t ¡ | _t ¡ | _d | _	d | _
|| _|| _d | _|| _|| _|| _d S )NÚnetwork_typer   )ÚsuperÚ__init__ÚnnÚ
ModuleDictÚ_layers_proposalÚ_layers_sample_embeddingÚParameterDictÚ_layers_address_embeddingÚ#_layers_distribution_type_embeddingÚ_layers_lstmÚ_lstm_input_dimÚ	_lstm_dimÚ_lstm_depthÚ_infer_lstm_stateÚ_sample_embedding_dimÚ_address_embedding_dimÚ _distribution_type_embedding_dim)ÚselfZlstm_dimZ
lstm_depthZsample_embedding_dimZaddress_embedding_dimZdistribution_type_embedding_dimÚargsÚkwargs)Ú	__class__© ú^/global/project/projectdirs/dasrepo/etalumis/pyprob_master/pyprob/nn/inference_network_lstm.pyr      s    



zInferenceNetworkLSTM.__init__c             C   sH   | j | j d| j| j   | _t | j| j| j¡| _	| j	j
tjd d S )Nr
   )Údevice)Ú_observe_embedding_dimr$   r%   r&   r    r   ÚLSTMr!   r"   r   Útor   Ú_device)r'   r+   r+   r,   Ú_init_layers   s    z!InferenceNetworkLSTM._init_layersc          	   C   s(  d}xÈ|j D ]¼}|d }x¬|jD ] }|j}|j}|| jkrht t t	 
| j¡ ¡ ¡¡}|| j|< |j| jkrœt t t	 
| j¡ ¡ ¡¡}|| j|j< || jkr&|jj}	t|tƒrÚt| j|	ƒ}
t|jj| jdd}n¢t|tƒrt| j|	ƒ}
t|jj| jdd}ntt|tƒr6t| j|	ƒ}
t|jj| jdd}nFt|tƒrlt| j|jƒ}
t|jj| jd|jdd}nt d !|j¡ƒ‚|
j"tj#d |j"tj#d || j$|< |
| j|< d}t%d	 !t &|¡|j¡ƒ q&W qW |r$t'd
d„ |  (¡ D ƒƒ}t%d !t)| jƒt)| jƒ|¡ƒ | j* +|¡ | j, +| j-¡ |S )NFr   r   )Ú
num_layersT)Úinput_is_one_hot_indexÚinput_one_hot_dimr3   z&Distribution currently unsupported: {})r-   z)New layers, address: {}, distribution: {}c             s   s   | ]}|  ¡ V  qd S )N)Únumel)Ú.0Úpr+   r+   r,   ú	<genexpr>G   s    z2InferenceNetworkLSTM._polymorph.<locals>.<genexpr>zATotal addresses: {:,}, distribution types: {:,}, parameters: {:,}).Úsub_batchesÚvariables_controlledÚaddressÚdistributionr   r   Ú	Parameterr   Ú	to_tensorÚtorchÚzerosr%   Únormal_Únamer   r&   r   ÚvalueÚshapeÚ
isinstancer   r   r!   r   r$   r   r   r   r	   r   r   Únum_categoriesÚRuntimeErrorÚformatr0   r1   r   ÚprintÚtruncate_strÚsumÚ
parametersÚlenÚ_history_num_paramsÚappendÚ_history_num_params_traceÚ_total_train_traces)r'   ÚbatchÚlayers_changedÚ	sub_batchÚexample_traceÚvariabler<   r=   ZembÚvariable_shapeÚproposal_layerZsample_embedding_layerÚ
num_paramsr+   r+   r,   Ú
_polymorph    sN    





 zInferenceNetworkLSTM._polymorphNc             C   sú  d}|d kr€t  t d| j¡¡}t  t | j¡¡}t  t | j¡¡}t  t | jd| j¡¡}t  t | jd| j¡¡}	||	f| _	nn|j
}
|j}|j}| ¡ dkr¨| d¡}|
| jkrÜ| j|
 | ¡ ƒ}| j|
 }| j|j }ntd |
¡ƒ d}|j
}|j}|| jkr| j| }| j|j }ntd |¡ƒ d}|rØt | jd |d ||||g¡ d¡}| d¡}|  || j	¡\}| _	|d }| j| }|d k	rÆ|j|k rÆttd |j||¡dd	gd
ƒ |S | ||g¡}|S ttd |¡dd	gd
ƒ |S d S )NTr   r   zFWarning: address of previous variable unknown by inference network: {}FzEWarning: address of current variable unknown by inference network: {}zOWarning: using prior, proposal not sufficiently trained ({}/{}) for address: {}ÚyellowÚbold)Úattrsz0Warning: using prior as proposal for address: {})r   r?   r@   rA   r$   r%   r&   r"   r!   r#   r<   r=   rD   ÚdimÚ	unsqueezer   r   Úfloatr   rC   rJ   rI   ÚcatÚ_infer_observe_embeddingr   r   Ú_total_train_iterationsr   Úforward)r'   rW   Úprev_variableÚproposal_min_train_iterationsÚsuccessÚprev_sample_embeddingÚprev_address_embeddingÚ prev_distribution_type_embeddingÚh0Úc0Úprev_addressÚprev_distributionZ
prev_valueÚcurrent_addressÚcurrent_distributionÚcurrent_address_embeddingÚ#current_distribution_type_embeddingÚtÚ
lstm_inputÚlstm_outputÚproposal_inputrY   Úproposal_distributionr+   r+   r,   Ú_infer_stepM   sZ    






 z InferenceNetworkLSTM._infer_stepc       $         s6  d}x |j D ]}|d }|  |¡}t|ƒ}d}g }x€t|jƒD ]p‰ |jˆ  }	|	j}
|
| jkr‚tt	d 
|
¡ddgdƒ dS |	j}| j|
 }| j|j }ˆ dkràt t || j¡¡}t t | j¡¡}t t | j¡¡}n†|jˆ d  }|j}|| jkrtt	d	 
|¡ddgdƒ dS |j}t t ‡ fd
d„|D ƒ¡¡}| j| |ƒ}| j| }| j|j }g }x:t|ƒD ].}t || || ||||g¡}| |¡ qtW | t |¡¡ qDW t |¡}t t | j|| j¡¡}t t | j|| j¡¡}|  |||f¡\}}xt|jƒD ] ‰ |jˆ  }|j}|ˆ  }‡ fdd„|D ƒ}t dd„ |D ƒ¡} | j| }!|! jd7  _|! ||¡}"|" | ¡}#t  |#¡rtt	dddgdƒ td|"ƒ td| ƒ td|#ƒ tdƒ t !|#¡}#td|#ƒ t  |#¡rtt	dddgdƒ dS |t "|#¡ 7 }qW ||7 }qW d||j# fS )Nr   g        z>Unknown current address in pre-generated inference network: {}Úredr]   )r^   )Fr   r   z?Unknown previous address in pre-generated inference network: {}c                s    g | ]}|j ˆ d   j ¡ ‘qS )r   )r;   rD   ra   )r7   Útrace)Ú	time_stepr+   r,   ú
<listcomp>£   s    z.InferenceNetworkLSTM._loss.<locals>.<listcomp>c                s   g | ]}|j ˆ  ‘qS r+   )r;   )r7   r{   )r|   r+   r,   r}   ¾   s    c             S   s   g | ]
}|j ‘qS r+   )rD   )r7   Úvr+   r+   r,   r}   ¿   s    z<Warning: NaN, -Inf, or Inf encountered in proposal log_prob.rx   ÚvaluesÚlog_probzFixing -Infz(Nan or Inf present in proposal log_prob.T)$r:   Ú_embed_observerN   ÚrangeÚlength_controlledr;   r<   r   rJ   r   rI   r=   r   rC   r   r?   r@   rA   r$   r%   r&   Ústackr   rb   rP   r"   r!   r   r   rd   re   r€   Úhas_nan_or_infÚreplace_negative_infrL   Úsize)$r'   rS   Ú
batch_lossrU   rV   Úobserve_embeddingZsub_batch_lengthÚsub_batch_lossru   Zcurrent_variablerp   rq   rr   rs   ri   rj   rk   rf   rn   ro   ZsmpZlstm_input_time_stepÚbrt   rl   rm   rv   Ú_rW   r<   rw   Ú	variablesr   rY   rx   r€   r+   )r|   r,   Ú_lossƒ   sˆ    














zInferenceNetworkLSTM._loss)r   r   r   r   r   )NN)	Ú__name__Ú
__module__Ú__qualname__r   r2   r[   ry   rŽ   Ú__classcell__r+   r+   )r*   r,   r   
   s
   -
6r   )r@   Útorch.nnr   Ú	termcolorr   Ú r   r   r   r   r   r	   r   Údistributionsr   r   r   r   r   r+   r+   r+   r,   Ú<module>   s    