B
    -]€7  ã               @   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       	         sx   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Ú_proposal_mixture_components)	ÚselfÚlstm_dimÚ
lstm_depthZsample_embedding_dimZaddress_embedding_dimZdistribution_type_embedding_dimÚproposal_mixture_componentsÚargsÚkwargs)Ú	__class__© úa/global/project/projectdirs/dasrepo/etalumis/pyprob_saeid-dev/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)   r0   r0   r1   Ú_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|	| jd}
t|jj| jdd}n®t|tƒrt| j|	| jd}
t|jj| jdd}nzt|tƒrHt| j|	| jd}
t|jj| jdd}nFt|tƒr~t| 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 |r6t(dd„ |  )¡ D ƒƒ}t&d "t*| jƒt*| jƒ|¡ƒ | j+ ,|¡ | j- ,| j.¡ |S )NFr   )Úmixture_componentsr   )Ú
num_layersT)Úinput_is_one_hot_indexÚinput_one_hot_dimr9   z&Distribution currently unsupported: {})r2   z)New layers, address: {}, distribution: {}c             s   s   | ]}|  ¡ V  qd S )N)Únumel)Ú.0Úpr0   r0   r1   ú	<genexpr>H   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   r   Únum_categoriesÚRuntimeErrorÚformatr5   r6   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ÚvariablerB   rC   ZembÚvariable_shapeÚproposal_layerZsample_embedding_layerÚ
num_paramsr0   r0   r1   Ú
_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   rE   rF   rG   r%   r&   r'   r#   r"   r$   rB   rC   rJ   ÚdimÚ	unsqueezer   r   Úfloatr   rI   rP   rO   ÚcatÚ_infer_observe_embeddingr    r   Ú_total_train_iterationsr   Úforward)r)   r]   Ú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_inputr_   Úproposal_distributionr0   r0   r1   Ú_infer_stepN   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(Address unknown by inference network: {}Úredrc   )rd   )Fr   r   c                s    g | ]}|j ˆ d   j ¡ ‘qS )r   )rA   rJ   rg   )r=   Útrace)Ú	time_stepr0   r1   ú
<listcomp>¤   s    z.InferenceNetworkLSTM._loss.<locals>.<listcomp>c                s   g | ]}|j ˆ  ‘qS r0   )rA   )r=   r   )r‚   r0   r1   rƒ   ¿   s    c             S   s   g | ]
}|j ‘qS r0   )rJ   )r=   Úvr0   r0   r1   rƒ   À   s    z<Warning: NaN, -Inf, or Inf encountered in proposal log_prob.r~   ÚvaluesÚlog_probzFixing -Infz(Nan or Inf present in proposal log_prob.T)$r@   Ú_embed_observerT   ÚrangeÚlength_controlledrA   rB   r   rP   r   rO   rC   r   rI   r   rE   rF   rG   r%   r&   r'   Ústackr   rh   rV   r#   r"   r    r   rj   rk   r†   Úhas_nan_or_infÚreplace_negative_infrR   Úsize)$r)   rY   Ú
batch_lossr[   r\   Úobserve_embeddingZsub_batch_lengthÚsub_batch_lossr{   Zcurrent_variablerv   rw   rx   ry   ro   rp   rq   rl   rt   ru   ZsmpZlstm_input_time_stepÚbrz   rr   rs   r|   Ú_r]   rB   r}   Ú	variablesr…   r_   r~   r†   r0   )r‚   r1   Ú_loss„   sˆ    














zInferenceNetworkLSTM._loss)r   r   r   r   r   r   )NN)	Ú__name__Ú
__module__Ú__qualname__r   r7   ra   r   r”   Ú__classcell__r0   r0   )r/   r1   r   
   s
   -
6r   )rF   Útorch.nnr   Ú	termcolorr   Ú r   r   r   r   r   r	   r   Údistributionsr   r   r   r   r   r0   r0   r0   r1   Ú<module>   s    