o
    ci                     @   s:  d dl Z d dlmZ d dlmZ d dlZd dlZd dl	m
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lmZ d dlmZ d dl	mZ d dlZdZdZdZdZd	Z dZ!dZ"d
Z#dZ$e j%&dZ'd ddZ(dd Z)G dd de
j*Z+G dd de
j*Z,G dd de
j*Z-d!ddZ.dd Z/dd Z0dd Z1dS )"    N)entropy)Variable)
functional   @          d   g      ?   z~/.ray/models/mnist_cnn.pt~/datac                 C   sH   t j| dtttt tddgd}tj	j
j|tdtd}|S )NT)g(rw?)gKH?)rootdownload	transform)
batch_sizeshufflenum_workers)dsetMNIST
transformsComposeResize
image_sizeToTensor	Normalizetorchutilsdata
DataLoaderr   workers)data_dirdataset
dataloader r"   \/home/ubuntu/.local/lib/python3.10/site-packages/ray/tune/examples/pbt_dcgan_mnist/common.pyget_data_loader-   s   
r$   c                 C   sj   | j j}|ddkrtj| jjdd d S |ddkr3tj| jjdd tj| j	jd d S d S )NConvg        g{Gz?	BatchNormg      ?r   )
	__class____name__findnninitnormal_weightr   	constant_bias)m	classnamer"   r"   r#   weights_initD   s   r3   c                       $   e Zd Z fddZdd Z  ZS )	Generatorc                    s   t t|   ttjttd dddddttd t	dtjtd td dddddttd t	dtjtd tdddddttt	dtjtt
dddddt | _d S )N   r   r   Fr0   Tr   )superr5   __init__r+   
SequentialConvTranspose2dnzngfBatchNorm2dReLUncTanhmainselfr(   r"   r#   r9   O   s   
zGenerator.__init__c                 C   
   |  |S NrB   rD   inputr"   r"   r#   forward`      
zGenerator.forwardr)   
__module____qualname__r9   rK   __classcell__r"   r"   rE   r#   r5   N   s    r5   c                       r4   )Discriminatorc                    s   t t|   ttjttdddddtjdddtjttd dddddt	td tjdddtjtd td dddddt	td tjdddtjtd dddd	ddt
 
| _d S )
Nr6   r   r   Fr7   g?T)inplacer   )r8   rQ   r9   r+   r:   Conv2dr@   ndf	LeakyReLUr>   SigmoidrB   rC   rE   r"   r#   r9   e   s   
zDiscriminator.__init__c                 C   rF   rG   rH   rI   r"   r"   r#   rK   t   rL   zDiscriminator.forwardrM   r"   r"   rE   r#   rQ   d   s    rQ   c                       s(   e Zd ZdZ fddZdd Z  ZS )NetzB
    LeNet for MNist classification, used for inception_score
    c                    s\   t t|   tjdddd| _tjdddd| _t | _t	dd| _
t	dd| _d S )Nr   
   r
   )kernel_size   @  2   )r8   rW   r9   r+   rS   conv1conv2	Dropout2d
conv2_dropLinearfc1fc2rC   rE   r"   r#   r9      s   
zNet.__init__c              	   C   sz   t t | |d}t t | | |d}|dd}t | |}t j|| j	d}| 
|}t j|ddS )Nr   r&   r[   )trainingr   )dim)Frelu
max_pool2dr]   r`   r^   viewrb   dropoutrd   rc   log_softmax)rD   xr"   r"   r#   rK      s   
zNet.forward)r)   rN   rO   __doc__r9   rK   rP   r"   r"   rE   r#   rW   |   s    rW   c                    sR  t | }tj}tjjj| |d}t| tj	ddd
| fdd}t|df}t|dD ]!\}	}
|

|}
t|
}|
 d }||||	| |	| | < q2g }t|D ]D}||||  |d	 ||  d d f }tj|dd
}g }t|jd D ]}	||	d d f }|t|| q|tt| qZt|t|fS )N)r   )   rn   bilinear)sizemodec                    s$   | }  | } t | j  S rG   )rf   softmaxr   cpunumpy)rl   cmupr"   r#   get_pred   s   z!inception_score.<locals>.get_predrX   r   r   )axis)lenr   FloatTensorr   r   r   raygetr+   Upsampletypenpzeros	enumerater   rp   rangemeanshapeappendr   expstd)imgsmnist_model_refr   splitsNdtyper!   rx   predsibatchbatchvbatch_size_isplit_scoreskpartpyscorespyxr"   ru   r#   inception_score   s,   

(r   c	                 C   s  d}	d}
t |dD ]\}}|tkr n|   |d |}|d}tj|f|	tj|d}| |d}|||}|	  |
  }tj|tdd|d}||}||
 | | d}|||}|	  |
  }|| }|  |  ||	 | |d}|||}|	  |
  }|  t||\}}|d dkrtd|t|| | ||||f  q	| | |fS )Nr   r   )r   devicer&   )r   rX   zX[%d/%d]	Loss_D: %.4f	Loss_G: %.4f	D(x): %.4f	D(G(z)): %.4f / %.4f 	Inception score: %.4f)r   train_iterations_per_step	zero_gradtorp   r   fullfloatri   backwardr   itemrandnr<   fill_detachstepr   printrz   )netDnetGoptimGoptimD	criterionr!   	iterationr   r   
real_label
fake_labelr   r   real_cpub_sizelabeloutput	errD_realD_xnoisefake	errD_fakeD_G_z1errDerrGD_G_z2is_scoreis_stdr"   r"   r#   
train_func   s\   





r   c              	   C   sf   t t| }tjdd td td ttt	j
|d d d ddd	 d
 t  d S )N   r   figsizeoffzOriginal Imagesr   r   r   Tpadding	normalizer   r   r   )nextiterpltfigurery   titleimshowr   	transposevutils	make_gridrs   show)r!   
real_batchr"   r"   r#   plot_images   s   

r   c           
   	   C   s   g }t dtdd}| D ]=}t tj|d}t }||d  t 	  ||
  }W d    n1 s9w   Y  |tj|ddd qtjdd	}td
 dd |D }tj||dddd}	|	jdddd t  d S )Nr   r   zcheckpoint.pt	netGmodelr   Tr   r   r   r   c                 S   s$   g | ]}t jt|d ddgqS )r   T)animated)r   r   r   r   ).0r   r"   r"   r#   
<listcomp>  s   $ zdemo_gan.<locals>.<listcomp>i  )intervalrepeat_delayblitz./generated.gifimagemagickH   )writerdpi)r   r   r<   loadospathjoinr5   load_state_dictno_gradr   rs   r   r   r   r   r   ry   	animationArtistAnimationsaver   )
checkpoint_pathsimg_listfixed_noiser   checkpoint_dictloadedGr   figimsanir"   r"   r#   demo_gan
  s$   


r   )r   )r   r   )2r   matplotlib.animationr   matplotlib.pyplotpyplotr   rt   r   r   torch.nnr+   torch.nn.paralleltorch.utils.datatorchvision.datasetsdatasetsr   torchvision.transformsr   torchvision.utilsr   r   scipy.statsr   torch.autogradr   r   rf   r|   r   r   r   r@   r<   r=   rT   beta1r   r   
expanduser
MODEL_PATHr$   r3   Moduler5   rQ   rW   r   r   r   r   r"   r"   r"   r#   <module>   sD    


$C