CoolFace
Modelpublic

OneScience-Group/GraphDOP

sourceHugging Faceapache-2.0updated 1mo agoView on Hugging Face
0likes16downloads
graphdop.cpython-311.pyc125 linesDownload Raw Back to __pycache__
12�`�j�+���ddlZddlZddlmZddlmcmZd�Zd�Zd�Z	d�Z3dd�ZGd�d	ej��Z
Gd4�dej��ZGd�d
ej��ZGd�dej��ZGd�dej��ZdS)�Nc�x�|\}}tjdd|��}tjddd|zz5|��}||fS)zCRegular lat/lon coordinates for a (H, W) grid, North-to-South rows.g�V@g�V��g�v@)�torch�linspace)�shape�H�W�lat�lons     �E/root/private_data/workspaces/zhaozhn/case/GraphDOP/model/graphdop.py�_latlon_gridr
sC���D�A�q�6�.��u�a�7(�8(�C�9�.��e�e�a�i�/��103�113�C���8�O�c	���d}tj|��}tj|��}tj||z12��}tj||z13��}tj|dz��dztj|��tj|��ztj|dz��dzzz}	d|ztjtj|	�dd������zS)z=Haversine distance in metres between points given in degrees.g�MXA�r�)r�deg2rad�sin�cos�asin�sqrt�clamp)14�lat1�lon1�lat2�lon2�R�p1�p2�dp�dl�as15          r�16_haversiner"%s����A�	��t�	�	�B�	��t�	�	�B�	��t�d�{�	#�	#�B�	��t�d�{�	#�	#�B�
�	�"�q�&���Q����2�����2���!>���2�PQ�6�AR�AR�VW�AW�!W�W�A��q�5�5�:�e�j�����A���7�7�8�8�8�8rc���tj|��}tj|��}tj||z17��}tj|��tj|��z}tj|��tj|��ztj|��tj|��ztj|��zz18}tj||��S)z;Initial forward bearing in radians from point 1 to point 2.)rrrr�atan2)	rrrrrrr �y�xs	         r�_bearingr'0s���	��t�	�	�B�	��t�	�	�B�	��t�d�{�	#�	#�B�
�	�"�
�
��	�"�
�
�%�A�
�	�"�
�
��	�"�
�
�%��	�"�
�
��	�"�
�
�(E��	�RT�
�
�(U�U�A��;�q�!���rc���|\}}t|��\}}|�dd���||��}|�dd���||��}ggg}}}t|��D�]}t|��D�]}	dD]�\}19}||20z|	|z|z}
}d|cxkr|ksn�"||z|	z}||z|
z}t	|||	f|||	f|||
f|||
f��dz}t|||	f|||	f|||
f|||
f��}|�|��|�|��|�tj|tj21z|dzg����������tjtj|��tj|��gd���}tj|��}||fS)z�22    Build a fixed 8-neighbourhood graph over a regular latent mesh.23    Longitude wraps around; edge features are (forward bearing [rad],24    haversine distance [km]).25    �����r))r)r))r)r)r)r)rr))rr)rr))rr)rrrg@�@��dim)r
�view�expand�ranger"r'�appendr�stack�math�pi�	as_tensor)�26mesh_shaperr	r27r�src_list�dst_list�	feat_list�i�j�di�dj�ni�nj�s�d�dist_km�bear�28edge_index�	edge_attrs                    r�build_mesh_graphrD:s���D�A�q��J�'�'�H�C��29
�(�(�2�q�/�/�3031 ��A�32&�33&�C�34
�(�(�1�b�/�/�3536 ��A�37&�38&�C�$&��B�	�h�H�
�1�X�X�R�R���q���	R�	R�A�`�39
R�40
R���B��R��!�b�&�A��B���R�����!��������E�A�I����F�R�K��$�S��A��Y��A�q�D�	�3�r�2�v�;��B�PR�F��T�T�W]�]����A�q�D�	�3�q�!�t�9�c�"�b�&�k�3�r�2�v�;�O�O������"�"�"�����"�"�"�� � ���d�T�W�n�g��>N�-O�!P�!P�Q�Q�Q�Q�41
R�	R���e�o�h�7�7����9R�9R�S�YZ�[�[�[�J���I�&�&�I��y� � rrc	�n�|g|g|dz42zz|gz}g}tt|��dz43��D]u}|�tj||||dz����|t|��dz44kr&|�tj�����vtj|�S)Nrr)r.�lenr/�nn�Linear�GELU�45Sequential)�in_dim�out_dim�46hidden_dim�n_layers�dims�layersr8s       r�_mlprQXs����8�z�l�h��l�3�3�w�i�?�D�
�F�
�3�t�9�9�q�=�
!�
!�%�%���
�
�b�i��Q���a�!�e��5�5�6�6�6��s�4�y�y�1�}����M�M�"�'�)�)�$�$�$��
�=�&�!�!rc�*��eZdZdZd�fd�	Zd�Z�xZS)�GNNLayerzDMessage-passing layer with edge features (mean-aggregate, residual).r�@c����t�����td|z|z||��|_t|||��|_tj|��|_dS)Nr)�super�__init__rQ�edge_mlp�node_mlprG�	LayerNorm�norm)�selfr+�edge_dimrM�	__class__s    �rrWzGNNLayer.__init__es]���
���������Q��W�x�/��j�A�A��
��S�#�z�2�2��
��L��%�%��	�	�	rc��|j\}}}|\}}tj||j���|z}	|�d��|	�|d��z�d��}47|�d��|	�|d��z�d��}|�d���|dd���d|�d����}|�||z|��}
|�	tj48|
|49|
||gd�����}tj|
��}|�d||��tj
|||z����d����d��}||z}|�|||��}|�||�|��z��S)N)�devicerrr)r*)�	minlength)�min)rr�aranger`�	unsqueezer,�reshaper-�sizerX�cat�50zeros_like�51index_add_�bincountrr[rY)r\r&rBrC�B�N�D�src�dst�offsets�src_b�dst_b�edge_attr_b�xb�msg�agg�cnts                 r�forwardzGNNLayer.forwardks����'���1�a����S��,�q���2�2�2�Q�6�����q�!�!�G�L�L��A�$6�$6�6�?�?��C�C�����q�!�!�G�L�L��A�$6�$6�6�?�?��C�C���)�)�!�,�,�3�3�A�r�2�>�>�F�F�r�9�>�>�Z[�K\�K\�]�]��
�Y�Y�q�1�u�a�
 �
 ���m�m�E�I�r�%�y�"�U�)�[�&I�q�Q�Q�Q�R�R����r�"�"�����q�%��%�%�%��n�U�a�!�e�4�4�4�:�:�q�:�A�A�K�K�A�N�N���C�i���k�k�!�Q��"�"���y�y��T�]�]�3�/�/�/�0�0�0r�rrT��__name__�52__module__�__qualname__�__doc__rWrx�
__classcell__�r^s@rrSrSbsR�������N�N�&�&�&�&�&�&�1�1�1�1�1�1�1rrSc�*��eZdZdZd�fd�	Zd�Z�xZS)�53ObsEncoderz�54    Maps the observation grid onto the latent mesh with a per-cell input MLP,55    an adaptive pooling to the mesh resolution, and graph message passing.56    rrTc�2����t�����||_t|����|_tj��fd�t|��D����|_||_	t|��\|_|_dS)Nc�2��g|]}t�������S�)rM�rS��.0�_rM�57latent_dims  ��r�58<listcomp>z'ObsEncoder.__init__.<locals>.<listcomp>��'���!i�!i�!i�RS�(�:�*�"M�"M�"M�!i�!i�!ir)
rVrW�in_channelsrQ�	input_mlprG�59ModuleListr.�gnnr4rDrBrC)r\r�r�r4�60num_layersrMr^s  `  `�rrWzObsEncoder.__init__�s������
��������&����k�:�z�B�B����=�!i�!i�!i�!i�!i�W\�]g�Wh�Wh�!i�!i�!i�j�j���$���*:�:�*F�*F�'������rc�V�|j\}}}}|�dddd���d|��}|�|���|||d���dddd��}t	j||j��}|�dddd���|d|�d����}|j�	|j61��|j�	|j62��}	}|jD]}63|64|||	��}�|S)Nrr�rr))
r�permuterer��F�adaptive_avg_pool2dr4rfrB�tor`rCr�)r\r&rk�Crr	�feat�meshrBrC�layers           rrxzObsEncoder.forward�s���W�65��1�a���y�y��A�q�!�$�$�,�,�R��3�3���~�~�d�#�#�+�+�A�q�!�R�8�8�@�@��A�q�!�L�L���$�T�4�?�;�;���|�|�A�q�!�Q�'�'�/�/��2�t�y�y��|�|�D�D�� $�� 2� 2�1�8� <� <�d�n�>O�>O�PQ�PX�>Y�>Y�I�66��X�	6�	6�E��5��z�9�5�5�D�D��rryrzr�s@rr�r�|s\���������67G�G�G�G�G�G�	�	�	�	�	�	�	rr�c�*��eZdZdZd�fd�	Zd�Z�xZS)�LatentProcessorzDTransformer over latent mesh tokens that advances the state in time.r��c	����t�����|d|dz}tjt	jd||����|_tj�|jd���tj	|||dddd����tj68�fd	�t|��D����|_dS)69Nrrg{�G�z�?)�stdr�geluT)�d_model�nhead�dim_feedforward�dropout�70activation�batch_first�71norm_firstc���g|]}���S�r�)r�r��blocks  �rr�z,LatentProcessor.__init__.<locals>.<listcomp>�s���$F�$F�$F�q�U�$F�$F�$Fr)
rVrWrG�	Parameterr�zeros�pos_emb�init�
trunc_normal_�TransformerEncoderLayerr�r.�blocks)	r\r�r4�72num_blocks�n_headsrM�n_nodesr�r^s	       @�rrWzLatentProcessor.__init__�s�����
���������Q�-�*�Q�-�/���|�E�K��7�J�$G�$G�H�H���73����d�l���5�5�5��*��g�z��F���74�75�76���m�$F�$F�$F�$F�E�*�4E�4E�$F�$F�$F�G�G����rc�D�||jz}|jD]
}||��}�|S�N)r�r�)r\r��tokensr�s    rrxzLatentProcessor.forward�s3�����$���[�	#�	#�E��U�6�]�]�F�F��
r)rr�r�rzr�s@rr�r��sX�������N�N�	H�	H�	H�	H�	H�	H�������rr�c�*��eZdZdZd�fd�	Zd�Z�xZS)�77ObsDecoderz�78    Maps the latent mesh back onto the target grid (bilinear upsample) and79    predicts per-channel observations with an output MLP.80    rrTc�2����t�����tj��fd�t	|��D����|_||_||_t|��\|_	|_81t�|���|_dS)Nc�2��g|]}t�������Sr�r�r�s  ��rr�z'ObsDecoder.__init__.<locals>.<listcomp>�r�r)
rVrWrGr�r.r��82grid_shaper4rDrBrCrQ�83output_mlp)r\r��out_channelsr�r4r�rMr^s `    `�rrWzObsDecoder.__init__�s������
���������=�!i�!i�!i�!i�!i�W\�]g�Wh�Wh�!i�!i�!i�j�j���$���$���*:�:�*F�*F�'������z�<��D�D����rc�^�|j\}}}|j�|j��}|j�|j��}|jD]}||||��}�|j\}}	|j\}84}|�dd���	|||85|��}tj||jdd���}|�dddd���	|||	z|��}|�
|���	|||	d���dddd��S)	Nrr�bilinearF)rf�mode�
align_cornersrr�r))rrBr�r`rCr�r�r4�	transposerer��interpolater�r�)
r\r�rkrlrmrBrCr�rr	�Hm�Wm�grids
             rrxzObsDecoder.forward�s"���*���1�a��_�'�'���4�4�86��N�%�%�d�k�2�2�	��X�	6�	6�E��5��z�9�5�5�D�D�����1�����B��~�~�a��#�#�+�+�A�q�"�b�9�9���}�T���j�X]�^�^�^���|�|�A�q�!�Q�'�'�/�/��1�q�5�!�<�<�����t�$�$�,�,�Q��1�b�9�9�A�A�!�Q��1�M�M�Mrryrzr�s@rr�r��sc���������87E�E�E�E�E�E�N�N�N�N�N�N�Nrr�c�J��eZdZdZ													d
�fd88�	Zd�Zd�Z�xZS)�GraphDOPa89    Config-driven GraphDOP wrapper.90 91    Args:92        in_channels: Number of observation channels per frame.93        out_channels: Number of forecast channels per frame.94        input_steps: Number of input (observation window) frames.95        output_steps: Number of forecast frames.96        grid_shape: Spatial shape of the (gridded) observation field.97        mesh_shape: Latent mesh resolution (each dimension, powers of two fine).98        latent_dim: Feature dimension of latent mesh tokens.99        num_encoder_layers / num_decoder_layers: GNN message-passing layers.100        num_processor_blocks: Transformer blocks in the processor.101        n_heads: Attention heads of the processor.102        channel_weights: Per-channel weights for the weighted MSE objective.103    �r�� r���r�rTrr�Nc104���t�����t|��|_t|��|_t|��|_t|��|_t|d��t|d��f|_t|d��t|d��f|_t|jt|��|jt|��t|�����|_105tt|��|jt|106��t|��t|�����|_tt|��|j|j|jt|	��t|�����|_|
�tj|j��}
|�dtj|
tj�����dS)Nrr)r�rM)r�r�rM�channel_weights)�dtype)rVrW�intr�r��input_steps�output_stepsr�r4r��encoderr��	processorr��decoderr�ones�register_bufferr3�float32)r\r�r�r�r�r�r4r��num_encoder_layers�num_decoder_layers�num_processor_blocksr�rMr�r^s              �rrWzGraphDOP.__init__�s���� 	���������{�+�+�����-�-����{�+�+�����-�-����z�!�}�-�-�s�:�a�=�/A�/A�B����z�!�}�-�-�s�:�a�=�/A�/A�B���!���c�*�o�o�t��3�Oa�Kb�Kb�or�s}�o~�o~�107�108�109���)��110�O�O�T�_��=Q�9R�9R�\_�`g�\h�\h�ux�zD�vE�vE�111�112�113���"��114�O�O�T�.������-�.�.�3�z�?�?�115�116�117���118�"�#�j��):�;�;�O����.����W\�Wd�0e�0e�0e�f�f�f�f�frc�t���tj��fd�t�j��D��d���}|�d���}g}t�j��D]?}��|��}|���|�����@tj|d���S)z�119        Args:120            x: Observation frames, shape [batch, input_steps, C, H, W].121        Returns:122            Forecast frames, shape [batch, output_steps, C, H, W].123        c�N��g|]!}���dd�|f����"Sr�)r�)r��tr\r&s  ��rr�z$GraphDOP.forward.<locals>.<listcomp>s1���V�V�V��t�|�|�A�a�a�a��d�G�4�4�V�V�Vrrr*r)	rr0r.r��meanr�r�r/r�)r\r&�latents�latent�outsr�s``    rrxzGraphDOP.forwards������+�V�V�V�V�V�e�D�DT�>U�>U�V�V�V�\]�^�^�^�����!��$�$�����t�(�)�)�	.�	.�A��^�^�F�+�+�F��K�K����V�,�,�-�-�-�-��{�4�Q�'�'�'�'rc��||z124dz}|j�dd|jdd��}||z���S)z;Weighted mean squared error objective (Eq. 1 of the paper).rr)r�r,r�r�)r\�pred�target�diff�ws     r�	wmse_losszGraphDOP.wmse_losssE���v�
�!�#��� �%�%�a��D�,=�q�!�D�D���q���� � � r)
r�r�rrr�r�rTrrrr�rTN)r{r|r}r~rWrxr�rr�s@rr�r��s����������&�������������%g�%g�%g�%g�%g�%g�N
(�
(�
(�!�!�!�!�!�!�!rr�)r)r1r�torch.nnrG�torch.nn.functional�125functionalr�r
r"r'rDrQ�ModulerSr�r�r�r�r�rr�<module>r�s���,��������������������������9�9�9����!�!�!�<"�"�"�"�1�1�1�1�1�r�y�1�1�1�4����������4�����b�i����*N�N�N�N�N���N�N�N�8L!�L!�L!�L!�L!�r�y�L!�L!�L!�L!�L!r