o suÑeŸ>ã@s0ddlZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Z e ej ¡r1dnd¡ZGdd„deƒZGd d „d eƒZGd d „d eƒZGd d„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„dejjƒZGdd„de ƒZGdd„deƒZdS)éN)Úic)Úpartial)ÚFunctionÚcudaÚcpucsNeZdZd‡fdd„ Zdd„Zdd„Zd d „Zd d „Zd d„Zdd„Z ‡Z S)Ú MatReaderTFcs>tt|ƒ ¡||_||_||_||_d|_d|_|  ¡dS©N) ÚsuperrÚ__init__Úto_torchÚto_cudaÚto_floatÚ file_pathÚdataÚold_matÚ _load_file)Úselfrr r r ©Ú __class__©ú?/home/bingxing2/home/scx6115/Ocean_AI_model/utils/darcy_loss.pyr +s zMatReader.__init__cCs>ztj |j¡|_d|_WdSt |j¡|_d|_YdS)NTF)ÚscipyÚioÚloadmatrrrÚh5pyÚFile©rrrrr8s   zMatReader._load_filecCs||_| ¡dSr)rr)rrrrrÚ load_file@s zMatReader.load_filecCsl|j|}|js|d}tj|tt|jƒdddƒd}|jr%| tj ¡}|j r4t   |¡}|j r4| ¡}|S)Nrééÿÿÿÿ)Úaxes)rrÚnpÚ transposeÚrangeÚlenÚshaper ÚastypeÚfloat32r ÚtorchÚ from_numpyr r)rÚfieldÚxrrrÚ read_fieldDs    zMatReader.read_fieldcCó ||_dSr)r )rr rrrÚset_cudaVó zMatReader.set_cudacCr-r)r )rr rrrÚ set_torchYr/zMatReader.set_torchcCr-r)r )rr rrrÚ set_float\r/zMatReader.set_float)TFT) Ú__name__Ú __module__Ú __qualname__r rrr,r.r0r1Ú __classcell__rrrrr*s rcó@eZdZd ‡fdd„ Zdd„Zddd„Zd d „Zd d „Z‡ZS)ÚUnitGaussianNormalizerçñh㈵øä>cs4tt|ƒ ¡t |d¡|_t |d¡|_||_dS©Nr)r r7r r(ÚmeanÚstdÚeps©rr+r<rrrr as zUnitGaussianNormalizer.__init__cCs||j|j|j}| ¡Sr)r:r;r<Úfloat©rr+rrrÚencodeiszUnitGaussianNormalizer.encodeNcCs¨|dur|j|j}|j}n)rr+Ú sample_idxr;r:rrrÚdecodems   zUnitGaussianNormalizer.decodecCó|j ¡|_|j ¡|_dSr©r:rr;rrrrr}ó zUnitGaussianNormalizer.cudacCrCr©r:rr;rrrrrrEzUnitGaussianNormalizer.cpu©r8r© r2r3r4r r@rBrrr5rrrrr7`s  r7cr6)ÚGaussianNormalizerr8cs0tt|ƒ ¡t |¡|_t |¡|_||_dSr)r rIr r(r:r;r<r=rrrr ‡s   zGaussianNormalizer.__init__cCs||j|j|j}|Sr)r:r;r<r?rrrr@ŽózGaussianNormalizer.encodeNcCs||j|j|j}|Sr)r;r<r:)rr+rArrrrB’rJzGaussianNormalizer.decodecCrCrrDrrrrr–rEzGaussianNormalizer.cudacCrCrrFrrrrršrEzGaussianNormalizer.cpurGrrHrrrrrI†s  rIcs.eZdZd ‡fdd„ Zdd„Zdd„Z‡ZS) ÚRangeNormalizerççð?csbtt|ƒ ¡t |d¡d d¡}t |d¡d d¡}|||||_|j |||_dS©Nrr) r rKr r(ÚminÚviewÚmaxÚaÚb)rr+ÚlowÚhighZmyminZmymaxrrrr ¡s zRangeNormalizer.__init__cCs6| ¡}| |dd¡}|j||j}| |¡}|SrN)ÚsizerPrRrS©rr+Úsrrrr@©ó  zRangeNormalizer.encodecCs6| ¡}| |dd¡}||j|j}| |¡}|SrN)rVrPrSrRrWrrrrB°rYzRangeNormalizer.decode)rLrM)r2r3r4r r@rBr5rrrrrK srKc@s&eZdZd dd„Zdd„Zdd„ZdS) ÚMomentum_ConservationTcCs||_||_dSr)Ú reductionÚ size_average)rr\r[rrrr ¹s zMomentum_Conservation.__init__cCsF| ¡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¡}|jrŸ|jr˜t ||¡St  ||¡S||S)Nrrrééé) rVrPr(ÚpowÚnormÚreshaper[r\r:Úsum)rÚtopor+ÚyÚ num_examplesÚ num_channelsZu2_xZv2_xZssh_xÚx_Zu2_yZv2_yZssh_yÚy_Ú diff_normsÚy_normsrrrÚcalc½s(     "zMomentum_Conservation.calccCs| |||¡Sr)rl)rrdr+rerrrÚ__call__äózMomentum_Conservation.__call__N)TT)r2r3r4r rlrmrrrrrZ¸s  'rZcs.eZdZd ‡fdd„ Zdd„Zdd „Z‡ZS) ÚLpLoss_region_weightedrr]TcsJtt|ƒ ¡|dkr|dksJ‚||_||_||_||_||_||_dSr9) r ror Ú region_idxÚ region_weightÚdÚpr[r\)rrprqrrrsr\r[rrrr ès zLpLoss_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 ri|j rdt  |¡St  |¡S|S)Nr)Údevicerr]r^r)rVr(Ú zeros_likertÚaddrqrprarbrsr[r\r:rc) rr+rerfÚweightÚdiffrjrkÚtmprrrÚrelõs :  zLpLoss_region_weighted.relcCó | ||¡Sr©rz©rr+rerrrrmó zLpLoss_region_weighted.__call__)rr]r]TT©r2r3r4r rzrmr5rrrrroçs rocs6eZdZd ‡fdd„ Zdd„Zdd„Zd d „Z‡ZS) ÚLpLossr]Tcs>tt|ƒ ¡|dkr|dksJ‚||_||_||_||_dSr9)r r€r rrrsr[r\)rrrrsr\r[rrrr s  zLpLoss.__init__cCóx| ¡d}d| ¡dd}||j|jt | |d¡| |d¡|jd¡}|jr:|jr5t |¡St  |¡S|S©NrrMrr© rVrrrsr(rarPr[r\r:rc©rr+rerfÚhZ all_normsrrrÚabsó 4  z LpLoss.abscCóx| ¡d}t | |d¡| |d¡|jd¡}t | |d¡|jd¡}|jr8|jr1t ||¡St ||¡S||S©Nrrr© rVr(rarbrsr[r\r:rc©rr+rerfrjrkrrrrz/s $z LpLoss.relcCr{rr|r}rrrrm>r~zLpLoss.__call__)r]r]TT©r2r3r4r r†rzrmr5rrrrr€s  r€cs6eZdZd ‡fdd„ Zdd„Zdd „Zd d „Z‡ZS) Úchannel_wise_LpLossr]TFcsDtt|ƒ ¡|dkr|dksJ‚||_||_||_||_||_dSr9)r rr rrrsÚscaler[r\)rrrrsr\r[rŽrrrr Bs zchannel_wise_LpLoss.__init__cCrr‚rƒr„rrrr†Nr‡zchannel_wise_LpLoss.absc CsP| ¡d}| ¡d}| ||d¡}| ||d¡}t | ||d¡| ||d¡|jd¡}t | ||d¡|jd¡}|jr¤|jru|jrdt ||d¡}t ||¡}||} t | |¡} | || fSt ||d¡}t ||¡|fS|jr“t  ||d¡} | d| } t  | | ¡} | | | fSt  ||d¡} t  ||¡| fS||S)Nrrrr]) rVrbr(rarsr[r\rŽr:rc) rr+rerfrgrjrkZchannel_wise_meanZ channel_meanÚscale_wZ channel_scaleZ channel_sumZchannel_sum_scalerrrrz^s0  (   zchannel_wise_LpLoss.relcCr{rr|r}rrrrm‚r~zchannel_wise_LpLoss.__call__)r]r]TTFrŒrrrrrAs  $rcs0eZdZd ‡fdd„ Zdd „Zd d d „Z‡ZS)ÚHsLossr]rNFTcsbtt|ƒ ¡|dkr|dksJ‚||_||_||_||_||_||_|dkr,dg|}||_ dS)Nrr) r rr rrrsÚkÚbalancedr[r\rR)rrrrsr‘rRÚgroupr\r[rrrr ˆs  zHsLoss.__init__cCrˆr‰rŠr‹rrrrz™s $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} |dkr¹| |dd|d| d7} |dkr×| |dd|dd|d| d| d7} t | ¡} | || || ¡} | S| ||¡} |dkr|dt |d| d¡} | | || || ¡7} |dkr8|dt |dd|d| d| d¡} | | || || ¡7} | |d} | S) Nrr]rr)ÚstartÚendÚstep)ÚdimFr_)rVr‘r’rRrPr%r(ÚcatÚarangerbÚrepeatr†ÚtortÚfftÚfftnÚsqrtrz) rr+rerRÚnxÚnyr‘r’Zk_xZk_yrwÚlossrrrrm¤s>  BB 4  ÷  2 zHsLoss.__call__)r]r]rNFTTrrrrrrr‡s rcs&eZdZd‡fdd„ Zdd„Z‡ZS)ÚDenseNetNFc s¼tt|ƒ ¡t|ƒd|_|jdksJ‚t ¡|_t|jƒD]/}|j  t  ||||d¡¡||jdkrN|rG|j  t  ||d¡¡|j  |ƒ¡q|dur\|j  |ƒ¡dSdS)Nr) r r¢r r$Ún_layersÚnnÚ ModuleListÚlayersr#ÚappendÚLinearÚ BatchNorm1d)rr¦Ú nonlinearityZout_nonlinearityÚ normalizeÚjrrrr Ës  €ÿzDenseNet.__init__cCs t|jƒD]\}}||ƒ}q|Sr)Ú enumerater¦)rr+Ú_ÚlrrrÚforwardàs zDenseNet.forward)NF)r2r3r4r r°r5rrrrr¢Êsr¢c@s(eZdZdZedd„ƒZedd„ƒZdS)ÚLossScaleFunctionú refer to MetNet-3 cCs||_|jdks J‚|S)Nr_)r<Úndim)Úctxr+r<rrrr°êszLossScaleFunction.forwardcCsV|jd}tt|jd}|d|jddddƒ}|||jdddƒ}|||}|dfS) Nr)r<rMr]T)réþÿÿÿ)rsÚkeepdimr—)r¶r—)r%rZsafe_divr<rarc)r´ÚgradsrgZ safe_div_rwZl1_normed_weightZ scaled_gradsrrrÚbackwardðs  zLossScaleFunction.backwardN)r2r3r4Ú__doc__Ú staticmethodr°r¸rrrrr±æs  r±cs*eZdZdZd‡fdd„ Zdd„Z‡ZS)Ú LossScalerr²r8cstƒ ¡||_dSr)r r r<)rr<rrrr s  zLossScaler.__init__cCst ||j¡Sr)r±Úapplyr<r?rrrr°rnzLossScaler.forwardrG)r2r3r4r¹r r°r5rrrrr»ýsr»)r(Únumpyr!Úscipy.iorrÚtorch.nnr¤ÚicecreamrÚ functoolsrZtorch.autogradrrtrÚ is_availableÚobjectrr7rIrKrZror€rrÚModuler¢r±r»rrrrÚs*     6&/,.FC