a ?Šf?ã@sNddlZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Z ddlmZmZmZe ej ¡rvdnd¡Zd#d d „ZGd d „d eƒZGd d„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„dejjƒZGdd „d e ƒZ Gd!d"„d"eƒZ!dS)$éN)Úic)Úpartial)ÚFunction)ÚModuleÚ ModuleListÚ SequentialÚcudaÚcpu绽×Ùß|Û=cCs||j|dS)N)Úmin)Úclamp)ÚnumÚdenÚeps©rútt|ƒ ¡||_||_||_||_d|_d|_|  ¡dS©N) ÚsuperrÚ__init__Úto_torchÚto_cudaÚto_floatÚ file_pathÚdataÚold_matÚ _load_file)Úselfrrrr©Ú __class__rrr/szMatReader.__init__cCs@ztj |j¡|_d|_Wn t |j¡|_d|_Yn0dS)NTF)ÚscipyÚioÚloadmatrrrÚh5pyÚFile©rrrrr<s  zMatReader._load_filecCs||_| ¡dSr)rr)rrrrrÚ load_fileDszMatReader.load_filecCsl|j|}|js8|d}tj|tt|jƒdddƒd}|jrJ| tj ¡}|j rht   |¡}|j rh| ¡}|S)Nrééÿÿÿÿ)Úaxes)rrÚnpÚ transposeÚrangeÚlenÚshaperÚastypeÚfloat32rÚtorchÚ from_numpyrr)rÚfieldÚxrrrÚ read_fieldHs    zMatReader.read_fieldcCs ||_dSr)r)rrrrrÚset_cudaZszMatReader.set_cudacCs ||_dSr)r)rrrrrÚ set_torch]szMatReader.set_torchcCs ||_dSr)r)rrrrrÚ set_float`szMatReader.set_float)TFT) Ú__name__Ú __module__Ú __qualname__rrr'r6r7r8r9Ú __classcell__rrrrr.s rcs@eZdZd ‡fdd„ Zdd„Zddd„Zd d „Zd d „Z‡ZS)ÚUnitGaussianNormalizerçñh㈵øä>cs4tt|ƒ ¡t |d¡|_t |d¡|_||_dS©Nr)rr>rr2ÚmeanÚstdr©rr5rrrrreszUnitGaussianNormalizer.__init__cCs||j|j|j}| ¡Sr)rArBrÚfloat©rr5rrrÚencodemszUnitGaussianNormalizer.encodeNcCs¨|dur|j|j}|j}nxt|jjƒt|djƒkrP|j||j}|j|}t|jjƒt|djƒkr”|jdd…|f|j}|jdd…|f}|||}| ¡Sr@)rBrrAr.r/rD)rr5Ú sample_idxrBrArrrÚdecodeqs   zUnitGaussianNormalizer.decodecCs|j ¡|_|j ¡|_dSr©rArrBr&rrrrs zUnitGaussianNormalizer.cudacCs|j ¡|_|j ¡|_dSr©rAr rBr&rrrr …s zUnitGaussianNormalizer.cpu)r?)N© r:r;r<rrFrHrr r=rrrrr>ds  r>cs@eZdZd ‡fdd„ Zdd„Zddd„Zd d „Zd d „Z‡ZS)ÚGaussianNormalizerr?cs0tt|ƒ ¡t |¡|_t |¡|_||_dSr)rrLrr2rArBrrCrrrr‹s  zGaussianNormalizer.__init__cCs||j|j|j}|Sr)rArBrrErrrrF’szGaussianNormalizer.encodeNcCs||j|j|j}|Sr)rBrrA)rr5rGrrrrH–szGaussianNormalizer.decodecCs|j ¡|_|j ¡|_dSrrIr&rrrršs zGaussianNormalizer.cudacCs|j ¡|_|j ¡|_dSrrJr&rrrr žs zGaussianNormalizer.cpu)r?)NrKrrrrrLŠs  rLcs.eZdZd ‡fdd„ Zdd„Zdd„Z‡ZS) ÚRangeNormalizerççð?csbtt|ƒ ¡t |d¡d d¡}t |d¡d d¡}|||||_|j |||_dS©Nrr)) rrMrr2r ÚviewÚmaxÚaÚb)rr5ÚlowÚhighZmyminZmymaxrrrr¥s zRangeNormalizer.__init__cCs6| ¡}| |dd¡}|j||j}| |¡}|SrP)ÚsizerQrSrT©rr5ÚsrrrrF­s  zRangeNormalizer.encodecCs6| ¡}| |dd¡}||j|j}| |¡}|SrP)rWrQrTrSrXrrrrH´s  zRangeNormalizer.decode)rNrO)r:r;r<rrFrHr=rrrrrM¤srMc@s&eZdZd dd„Zdd„Zdd„ZdS) ÚMomentum_ConservationTcCs||_||_dSr)Ú reductionÚ size_average)rr\r[rrrr½szMomentum_Conservation.__init__cCsJ| ¡d}| ¡d}| d¡}| ||d¡}| ||d¡}t |dd…dfd¡}t |dd…dfd¡}|dd…df|}|||} t |dd…dfd¡} t |dd…dfd¡} |dd…df|} | | | } t |  |d¡|  |d¡dd¡}t |  |d¡dd¡}|jrB|jr4t ||¡St  ||¡S||S)Nrr(r)ééé) rWrQr2ÚpowÚnormÚreshaper[r\rAÚsum)rÚtopor5ÚyÚ num_examplesÚ num_channelsZu2_xZv2_xZssh_xZx_Zu2_yZv2_yZssh_yZy_Ú diff_normsÚy_normsrrrÚcalcÁs(     "zMomentum_Conservation.calccCs| |||¡Sr)rj)rrdr5rerrrÚ__call__èszMomentum_Conservation.__call__N)TT)r:r;r<rrjrkrrrrrZ¼s 'rZcs.eZdZd ‡fdd„ Zdd„Zdd „Z‡ZS) ÚLpLoss_region_weightedrr]TcsJtt|ƒ ¡|dkr|dks"J‚||_||_||_||_||_||_dSr@) rrlrÚ region_idxÚ region_weightÚdÚpr[r\)rrmrnrorpr\r[rrrrìszLpLoss_region_weighted.__init__c CsÖ| ¡d}tj||jd}t |d|j¡}|j|dd…dd…|jd|jd…|jd|jd…f<||}||}~t | |d¡|j d¡}t | |d¡|j d¡}||}|j rÒ|j rÈt  |¡St  |¡S|S)Nr)Údevicer(r]r^r))rWr2Ú zeros_likerqÚaddrnrmrarbrpr[r\rArc) rr5rerfÚweightÚdiffrhriÚtmprrrÚrelùs :  zLpLoss_region_weighted.relcCs | ||¡Sr©rw©rr5rerrrrkszLpLoss_region_weighted.__call__)rr]r]TT©r:r;r<rrwrkr=rrrrrlës rlcs6eZdZd ‡fdd„ Zdd„Zdd„Zd d „Z‡ZS) ÚLpLossr]Tcs>tt|ƒ ¡|dkr|dks"J‚||_||_||_||_dSr@)rr{rrorpr[r\)rrorpr\r[rrrrs zLpLoss.__init__cCsx| ¡d}d| ¡dd}||j|jt | |d¡| |d¡|jd¡}|jrt|jrjt |¡St  |¡S|S©NrrOr(r)© rWrorpr2rarQr[r\rArc©rr5rerfÚhZ all_normsrrrÚabs#s 4  z LpLoss.abscCsx| ¡d}t | |d¡| |d¡|jd¡}t | |d¡|jd¡}|jrp|jrbt ||¡St ||¡S||S©Nrr)r(© rWr2rarbrpr[r\rArc©rr5rerfrhrirrrrw3s $z LpLoss.relcCs | ||¡SrrxryrrrrkBszLpLoss.__call__)r]r]TT©r:r;r<rr€rwrkr=rrrrr{s r{cs6eZdZd ‡fdd„ Zdd„Zdd „Zd d „Z‡ZS) Úchannel_wise_LpLossr]TFcsDtt|ƒ ¡|dkr|dks"J‚||_||_||_||_||_dSr@)rr…rrorpÚscaler[r\)rrorpr\r[r†rrrrFszchannel_wise_LpLoss.__init__cCsx| ¡d}d| ¡dd}||j|jt | |d¡| |d¡|jd¡}|jrt|jrjt |¡St  |¡S|Sr|r}r~rrrr€Rs 4  zchannel_wise_LpLoss.absc Cs\| ¡d}| ¡d}| ||d¡}| ||d¡}t | ||d¡| ||d¡|jd¡}t | ||d¡|jd¡}|jrP|jrî|jrÊt ||d¡}t ||¡}||} t | |¡} | || fSt ||d¡}t ||¡|fSn`|jr,t  ||d¡} | d| } t  | | ¡} | | | fSt  ||d¡} t  ||¡| fSn||SdS)Nrr(r)r]) rWrbr2rarpr[r\r†rArc) rr5rerfrgrhriZchannel_wise_meanZ channel_meanÚscale_wZ channel_scaleZ channel_sumZchannel_sum_scalerrrrwbs0  (   zchannel_wise_LpLoss.relcCs | ||¡Srrxryrrrrk†szchannel_wise_LpLoss.__call__)r]r]TTFr„rrrrr…Es $r…cs0eZdZd ‡fdd„ Zdd „Zd d d „Z‡ZS)ÚHsLossr]r(NFTcsbtt|ƒ ¡|dkr|dks"J‚||_||_||_||_||_||_|dkrXdg|}||_ dS)Nrr() rrˆrrorpÚkÚbalancedr[r\rS)rrorpr‰rSÚgroupr\r[rrrrŒs zHsLoss.__init__cCsx| ¡d}t | |d¡| |d¡|jd¡}t | |d¡|jd¡}|jrp|jrbt ||¡St ||¡S||Srr‚rƒrrrrws $z HsLoss.relc Cs„| ¡d}| ¡d}|j}|j}|j}| |jd||d¡}| |jd||d¡}t tjd|dddtj| ddddfd¡  |d¡  d|¡}t tjd|dddtj| ddddfd¡  d|¡  |d¡} t  |¡  d||d¡  |j ¡}t  | ¡  d||d¡  |j ¡} tjj|ddgd}tjj|ddgd}|dkrÔd} |dkrv| |dd|d| d7} |dkr´| |dd|dd|d| d| d7} t | ¡} | || || ¡} n¬| ||¡} |dkr |dt |d| d¡} | | || || ¡7} |dkrt|dt |dd|d| d| d¡} | | || || ¡7} | |d} | S) Nr(r]rr))ÚstartÚendÚstep)ÚdimFr_)rWr‰rŠrSrQr/r2ÚcatÚarangerbÚrepeatr€ÚtorqÚfftÚfftnÚsqrtrw) rr5rerSÚnxÚnyr‰rŠZk_xZk_yrtÚlossrrrrk¨s<  BB    4    2 zHsLoss.__call__)r]r]r(NFTT)Nrzrrrrrˆ‹s rˆcs&eZdZd‡fdd„ Zdd„Z‡ZS)ÚDenseNetNFc s¸tt|ƒ ¡t|ƒd|_|jdks*J‚t ¡|_t|jƒD]^}|j  t  ||||d¡¡||jdkr>|rŽ|j  t  ||d¡¡|j  |ƒ¡q>|dur´|j  |ƒ¡dS)Nr() rršrr.Ún_layersÚnnrÚlayersr-ÚappendÚLinearÚ BatchNorm1d)rrÚ nonlinearityZout_nonlinearityÚ normalizeÚjrrrrÏs  zDenseNet.__init__cCs t|jƒD]\}}||ƒ}q |Sr)Ú enumerater)rr5Ú_ÚlrrrÚforwardäs zDenseNet.forward)NF)r:r;r<rr§r=rrrrršÎsršc@s(eZdZdZedd„ƒZedd„ƒZdS)ÚLossScaleFunctionú refer to MetNet-3 cCs||_|jdksJ‚|S)Nr_)rÚndim)Úctxr5rrrrr§îszLossScaleFunction.forwardcCsV|jd}tt|jd}|d|jddddƒ}|||jdddƒ}|||}|dfS) Nr()rrOr]T)r)éþÿÿÿ)rpÚkeepdimr)r­r)r/rrrrarc)r«ÚgradsrgZ safe_div_rtZl1_normed_weightZ scaled_gradsrrrÚbackwardôs   zLossScaleFunction.backwardN)r:r;r<Ú__doc__Ú staticmethodr§r¯rrrrr¨ês  r¨cs*eZdZdZd‡fdd„ Zdd„Z‡ZS)Ú LossScalerr©r?cstƒ ¡||_dSr)rrr)rrrrrrs zLossScaler.__init__cCst ||j¡Sr)r¨ÚapplyrrErrrr§ szLossScaler.forward)r?)r:r;r<r°rr§r=rrrrr²sr²)r )"r2Únumpyr+Úscipy.ior!r$Útorch.nnrœÚicecreamrÚ functoolsrÚtorch.autogradrrrrrqrÚ is_availablerÚobjectrr>rLrMrZrlr{r…rˆršr¨r²rrrrÚs,      6&/,.FC