U
    f                     @   s   d dl Zd dlmZ d dlmZmZmZmZm	Z	m
Z
mZmZmZmZ d dlmZ d dlmZ d dlmZ d dlZd dlZd dlZdejd< d	d
 Zdd Zdd Zdd ZdS )    N)	int_shape)
Input
Cropping1DaddConv1DGlobalAvgPool1DDenseAddConcatenateLambdaFlatten)Adam)Model)multinomial_nll0ZPYTHONHASHSEEDc                 C   s^   ddl m} ddlm} ttd}| | || }t|j}t	|D ]}d|j| _
qH|S )Nr   )
load_model)get_custom_objects)r   tfF)tensorflow.keras.modelsr   Ztensorflow.keras.utilsr   r   r   updatelenZlayersrangeZ	trainable)Z
model_hdf5r   r   Zcustom_objectsZpretrained_bias_modelZ
num_layersi r   K/tmp/pip-target-lpfmz8o1/lib/python/../../bin/chrombpnet_with_bias_model.pyload_pretrained_bias   s    

r   c              	   C   s  d}d}d}t |dfdd}t| |ddd	d
|}dd td|d D }	td|d D ]}
d|	|
d  }t| dddd|
 |d|}t|d }t|d }|| d dkstt|| d d|	|
d  d|}t||g}qXt||ddd|}tt|d d t|d  }|dks,tt|d d dksFtt|dd|}t	dd|}t
dd|}t|dd|}t|g||gdd}|S )N   K         sequenceshapenamevalidZreluZwo_bias_bpnet_1st_conv)kernel_sizepadding
activationr#   c                 S   s   g | ]}t |qS r   )str).0r   r   r   r   
<listcomp>+   s     zbpnet_model.<locals>.<listcomp>zwo_bias_bpnet_{}conv      )r%   r&   r'   Zdilation_rater#   r   zwo_bias_bpnet_{}cropr#   Zwo_bias_bpnet_prof_out_precrop)filtersr%   r&   r#   Z#wo_bias_bpnet_logitt_before_flattenZ(wo_bias_bpnet_logits_profile_predictionsgapZ"wo_bias_bpnet_logcount_predictionsmodel_wo_bias)inputsoutputsr#   )r   r   r   formatr   AssertionErrorr   r   intr   r   r   r   )r.   n_dil_layerssequence_lenout_pred_lenZconv1_kernel_sizeZprofile_kernel_sizeZ	num_tasksinpxZlayer_namesr   Zconv_layer_nameZconv_xZx_lenZ
conv_x_lenZprof_out_precropZcropsizeZprofprofile_outZgap_combined_conv	count_outmodelr   r   r   bpnet_model   sb    & r>   c                 C   s  d|  kstt|d }t|d }t|d }|d }t|d }t|d }t|}t||||}	| j}
tj|
 t	j
|
 t|
 t|dfdd	}||}|	|}t|d
 jdkstt|d jdkstt|d jdkstt|d
 jdkst|d
 jd
 d
ks$t|d jd
 |ks<ttdd|d |d g}tdd|d
 |d
 g}tdd dd|}t|g||gd}|jt| jdtdgd
|gd |S )Nbias_model_pathr.   r6   counts_loss_weightZinputlenZ	outputlenr   r    r!   r   r,   r   Zlogits_profile_predictionsr-   )axisc                 S   s   t jj| dddS )NrA   T)rB   Zkeepdims)r   mathZreduce_logsumexp)r:   r   r   r   <lambda>       z9getModelGivenModelOptionsAndWeightInits.<locals>.<lambda>Zlogcount_predictionsr1   r2   )learning_rateZmse)Z	optimizerZlossZloss_weights)keysr4   r5   floatr   r>   seednprandomr   Zset_seedrnr   r   r"   r	   r
   r   r   compiler   rG   r   )argsZmodel_paramsr.   r6   r@   r?   r7   r8   Z
bias_modelZbpnet_model_wo_biasrJ   r9   Zbias_outputZoutput_wo_biasr;   Zconcat_countsr<   r=   r   r   r   'getModelGivenModelOptionsAndWeightInits\   sF    
rP   c                 C   sF   |  dj}t|  dj|d |d gd}td ||d  d S )Nr0   r   r   rF   zsave model without biasz
_nobias.h5)Z	get_layeroutputr   r1   printsave)r=   Zoutput_prefixr0   Zmodel_without_biasr   r   r   save_model_without_bias   s     rT   )numpyrK   Ztensorflow.keras.backendr   Ztensorflow.keras.layersr   r   r   r   r   r   r	   r
   r   r   Ztensorflow.keras.optimizersr   r   r   Z chrombpnet.training.utils.lossesr   Z
tensorflowr   rL   rM   osenvironr   r>   rP   rT   r   r   r   r   <module>   s   0
A1