a
     ɝh+                     @   s  d dl Z d dlZd dlZd dlZ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lmZ d dlmZ d dlmZ d dlmZ ejdZejed	Zdadae jd
dZejdddeddd ejddd eddd ejdddd ejdddeddd e ej!dd a"t"j# o2ej$% t"_$dd Z&d d! Z'd1d#d$Z(G d%d& d&e)Z*d'd( Z+d)d* Z,G d+d, d,e)Z-d2d.d/Z.e/d0kre'  dS )3    N)metrics)Variable)
DataLoader)CIFData)collate_pool)CrystalGraphConvNet.zpre-trained.pth.tarzCrystal gated neural networks)descriptionz-bz--batch-size   Nzmini-batch size (default: 256))defaulttypemetavarhelpz-jz	--workersz+number of data loading workers (default: 0)z--disable-cuda
store_truezDisable CUDA)actionr   z--print-freqz-p
   zprint frequency (default: 10)   c                  C   sz   t jtrdtdt tjtdd d} tj	f i | d a
tdt t
jdkr\dnd	ad
S tdt dS dS )zInitialize model parametersz=> loading model params '{}'c                 S   s   | S N storagelocr   r   !/var/www/html/AI4Kappa/predict.py<lambda>/       z'initialize_model_args.<locals>.<lambda>Zmap_locationargsz=> loaded model params '{}'
regressiong    _Br   Tz => no model params found at '{}'FN)ospathisfile
model_pathprintformattorchloadargparse	Namespace
model_argstaskbest_mae_error)Zmodel_checkpointr   r   r   initialize_model_args(   s    r,   c              	   C   sV  t st sd S | }t|}t}t|tjdtj|tjd}|d \}}}|d j	d }|d j	d }t
||t jt jt jt jt jdkrdndd}	tjr|	  t jdkrt nt }
ttd	}tjtr.td
t tjtdd d}|	j|d dd ||d  tdt|d |d  ntdt d S t||	|
|dd d S )NT)
batch_sizeshufflenum_workers
collate_fnZ
pin_memoryr   r   classificationF)atom_fea_lenn_conv	h_fea_lenn_hr2      z=> loading model '{}'c                 S   s   | S r   r   r   r   r   r   r   `   r   zmain.<locals>.<lambda>r   
state_dict)strict
normalizerz.=> loaded model '{}' (epoch {}, validation {})epochr+   z=> no model found at '{}')test)r)   r,   r   r   r   r   r-   workerscudashaper   r3   r4   r5   r6   r*   nnZNLLLossZMSELoss
Normalizerr%   zerosr   r    r!   r"   r#   r$   r&   load_state_dictvalidate)root_dir_pathcif_pathdatasetr0   Ztest_loader
structures_Zorig_atom_fea_lenZnbr_fea_lenmodel	criterionr:   
checkpointr   r   r   main:   sR    
rM   Fc           (      C   sL  t  }t  }tjdkrt  }nt  }t  }	t  }
t  }t  }|rLg }g }g }|  t }t| D ],\}\}}}t  tj	rt
|d j	ddt
|d j	dd|d j	dddd |d	 D f}n$t
|d t
|d |d |d	 f}W d    n1 s0    Y  tjdkr(||}n|d
 }t 2 tj	rZt
|j	dd}nt
|}W d    n1 sx0    Y  || }|||}tjdkr,t||j |}||j  |d |||d |r||j }|}||d
 7 }||d
 7 }||7 }nt|j |\}}}} }!||j  |d |||d |	||d |
||d || |d ||!|d |rt|j }|}|jd dksJ ||d d df  7 }||d
 7 }||7 }|t |  t }|tj dkrdtjdkrntdj|t| |||d qdtdj|t| ||||	|
||d	 qd|rd}"dd l}#tddD}$|#|$}%t |||D ]\}&}}'|%!|&||'f qW d    n1 s0    Y  nd}"tjdkr0tdj|"|d |j"S tdj|"|d |j"S d S )Nr   r   TZnon_blockingr      c                 S   s   g | ]}|j d dqS )TrN   )r>   ).0Zcrys_idxr   r   r   
<listcomp>   r   zvalidate.<locals>.<listcomp>r7   r1   zTest: [{0}/{1}]	Time {batch_time.val:.3f} ({batch_time.avg:.3f})	Loss {loss.val:.4f} ({loss.avg:.4f})	MAE {mae_errors.val:.3f} ({mae_errors.avg:.3f}))
batch_timeloss
mae_errorsa   Test: [{0}/{1}]	Time {batch_time.val:.3f} ({batch_time.avg:.3f})	Loss {loss.val:.4f} ({loss.avg:.4f})	Accu {accu.val:.3f} ({accu.avg:.3f})	Precision {prec.val:.3f} ({prec.avg:.3f})	Recall {recall.val:.3f} ({recall.avg:.3f})	F1 {f1.val:.3f} ({f1.avg:.3f})	AUC {auc.val:.3f} ({auc.avg:.3f}))rR   rS   Zaccuprecrecallf1aucz**ztest_results.csvw*z  {star} MAE {mae_errors.avg:.3f})starrT   z {star} AUC {auc.avg:.3f})r[   rX   )#AverageMeterr)   r*   evaltime	enumerater%   Zno_gradr   r>   r   normviewlongmaedenormdatacpuupdateitemsizetolist
class_evalexpr?   Z
print_freqr#   r$   lencsvopenwriterzipwriterowavg)(Z
val_loaderrJ   rK   r:   r<   rR   ZlossesrT   Z
accuraciesZ
precisionsZrecallsZfscoresZ
auc_scoresZtest_targetsZ
test_predsZtest_cif_idsendiinputtargetZbatch_cif_idsZ	input_varZtarget_normedZ
target_varoutputrS   Z	mae_errorZ	test_predZtest_targetaccuracy	precisionrV   fscore	auc_scoreZ
star_labelrn   frp   Zcif_idpredr   r   r   rD   m   s    



$
(




6rD   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )rA   z)Normalize a Tensor and restore it later. c                 C   s   t || _t || _dS )z9tensor is taken as a sample to calculate the mean and stdN)r%   meanstdselftensorr   r   r   __init__   s    zNormalizer.__init__c                 C   s   || j  | j S r   r   r   r   r   r   r   r`      s    zNormalizer.normc                 C   s   || j  | j S r   )r   r   )r   Znormed_tensorr   r   r   rd      s    zNormalizer.denormc                 C   s   | j | jdS )Nr   r   r   r   r   r   r8      s    zNormalizer.state_dictc                 C   s   |d | _ |d | _d S )Nr   r   r   )r   r8   r   r   r   rC      s    
zNormalizer.load_state_dictN)	__name__
__module____qualname____doc__r   r`   rd   r8   rC   r   r   r   r   rA      s   rA   c                 C   s   t t ||  S )z
    Computes the mean absolute error between prediction and target

    Parameters
    ----------

    prediction: torch.Tensor (N, 1)
    target: torch.Tensor (N, 1)
    )r%   r   abs)
predictionrw   r   r   r   rc      s    
rc   c           
      C   s   t |  } | }t j| dd}t |}| jd dkrztj||dd\}}}}t|| d d df }t	||}	nt
|	||||fS )Nr   )axisrO   binary)average)nprl   numpyargmaxsqueezer?   r   Zprecision_recall_fscore_supportZroc_auc_scoreZaccuracy_scoreNotImplementedError)
r   rw   Z
pred_labelZtarget_labelrz   rV   r{   rI   r|   ry   r   r   r   rk     s    
rk   c                   @   s*   e Zd ZdZdd Zdd Zd
ddZd	S )r\   z1Computes and stores the average and current valuec                 C   s   |    d S r   )resetr   r   r   r   r     s    zAverageMeter.__init__c                 C   s   d| _ d| _d| _d| _d S )Nr   )valrs   sumcountr   r   r   r   r     s    zAverageMeter.resetr   c                 C   s8   || _ |  j|| 7  _|  j|7  _| j| j | _d S r   )r   r   r   rs   )r   r   nr   r   r   rg   !  s    zAverageMeter.updateN)r   )r   r   r   r   r   r   rg   r   r   r   r   r\     s   r\   checkpoint.pth.tarc                 C   s    t | | |rt|d d S )Nzmodel_best.pth.tar)r%   saveshutilcopyfile)stateZis_bestfilenamer   r   r   save_checkpoint(  s    r   __main__)F)r   )0r'   r   r   sysr^   r   r   r%   Ztorch.nnr@   Zsklearnr   Ztorch.autogradr   Ztorch.utils.datar   Z
cgcnn.datar   r   Zcgcnn.modelr   r    abspathsource_pathjoinr"   r)   r+   ArgumentParserparseradd_argumentint
parse_argsargvr   Zdisable_cudar>   is_availabler,   rM   rD   objectrA   rc   rk   r\   r   r   r   r   r   r   <module>   sT   3
w

