§
    ‚Štj²$  ã                   óœ   — d Z ddlZddlmZ ddlmZ  G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z G d	„ d
ej        ¦  «        Z	dS )a  

Generic interface to various configurations of the Perceiver Resampler, that simply takes in a series of (potentially
time-indexed) contextual embeddings, and "resamples" (compresses) them down to a pre-specified number of latents! Note
that the Perceiver in general resamples based solely off the *long-range* context; there's a nice opportunity here to
prime the Perceiver Resampler with say a single layer's worth of language embeddings (the target domain), and use that
to softly "retrieve & compress" what we need --> this would be a novel contribution we should explore.

References:
    - DeepMind's Flamingo: https://www.deepmind.com/blog/tackling-multiple-tasks-with-a-single-visual-language-model
    - Code borrowed w/ love from: https://github.com/lucidrains/flamingo-pytorch

é    Né   )ÚIdeficsConfigc                   ó`   ‡ — e Zd Zdededededededdfˆ fd	„Zd
ej        dej        fd„Zˆ xZ	S )ÚIdeficsPerceiverResamplerÚconfigÚ	embed_dimÚdepthÚn_headsÚhead_dimÚ	n_latentsÚreturnNc                 ó$  •‡ ‡— t          ¦   «                              ¦   «          ||||f\  ‰ _        ‰ _        ‰ _        ‰ _        ‰j        j        ‰ _        t          j
        t          j        ‰ j        ‰ j        ¦  «        d¬¦  «        ‰ _        t          ‰j        d¦  «        s
‰ j        dz  n‰j        j        dz  ‰ _        t          j        ˆˆ fd„t%          |¦  «        D ¦   «         ¦  «        ‰ _        t          j        ‰ j        ¦  «        ‰ _        dS )ao  
        Instantiates a Perceiver Resampler that operates over a sequence of embeddings (say from a ResNet or ViT or
        MAE) of a given dimension, performs `depth` blocks of cross-attention with a fixed `n_latents` inputs, then
        returns a Tensor of shape [bsz, n_latents, embed_dim]. :param embed_dim: Dimensionality of embeddings being fed
        to the Perceiver Resampler (also dimensionality of latent embeddings *returned* by the Perceiver Resampler.
        Could be e.g., VIT embed_dim, ResNet pool dim, and so on.

        Args:
            config (`IdeficsConfig`): config object
            embed_dim (`int`): The size of each embedding vector
            depth (`int`): Depth of the Perceiver Resampler (Transformer w/ cross attention). Should be shallow (< 3).
            n_heads (`int`): Number of heads in each Transformer block (for multi-headed self-attention).
            head_dim (`int`): Dimensionality of each head projection in the Transformer block.
            n_latents (`int`):
                Number of latent embeddings to resample ("compress") the input sequence to (usually < 128).

        T)Úrequires_gradr   é   c           
      óª   •— g | ]O}t          j        t          ‰j        ‰j        ‰j        ‰j        ¦  «        t          ‰j        ‰¦  «        g¦  «        ‘ŒPS © )	ÚnnÚ
ModuleListÚIdeficsPerceiverAttentionr   r
   r   Úqk_layer_normsÚ
IdeficsMLPÚintermediate_dim)Ú.0Ú_r   Úselfs     €€úc/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/models/idefics/perceiver.pyú
<listcomp>z6IdeficsPerceiverResampler.__init__.<locals>.<listcomp>Q   si   ø€ ð ð ð ð õ ”å1°$´.À$Ä,ÐPTÔP]Ð_cÔ_rÑsÔsÝ" 4Ô#8¸&ÑAÔAðñô ðð ð ó    N)ÚsuperÚ__init__r   r
   r   r   Úperceiver_configÚqk_layer_norms_perceiverr   r   Ú	ParameterÚtorchÚrandnÚlatentsÚhasattrÚvision_configr   r   ÚrangeÚblocksÚ	LayerNormÚ
layer_norm)r   r   r   r	   r
   r   r   Ú	__class__s   ``     €r   r    z"IdeficsPerceiverResampler.__init__/   s  øøø€ õ( 	‰Œ×ÒÑÔÐØFOÐQXÐZbÐdmÐFmÑCˆŒ˜œ d¤m°T´^Ø$Ô5ÔNˆÔõ ”|¥E¤K°´ÀÄÑ$OÔ$OÐ_cÐdÑdÔdˆŒõ ˜6Ô/°Ñ=Ô=ð4ˆDŒN˜QÑÐàÔ%Ô/°!Ñ3ð 	Ôõ ”mðð ð ð ð õ ˜u™œðñ ô ñ

ô 

ˆŒõ œ, t¤~Ñ6Ô6ˆŒˆˆr   Úcontextc                 óÎ   — | j                              |j        d         dd¦  «        }| j        D ]"\  }} |||¦  «        |z   } ||¦  «        |z   }Œ#|                      |¦  «        S )zWResample arbitrary length context & *compress* down to self.n_latents latent embeddingsr   r   )r&   ÚrepeatÚshaper*   r,   )r   r.   r&   ÚattnÚffs        r   Úforwardz!IdeficsPerceiverResampler.forward]   sw   € ð ”,×%Ò% g¤m°AÔ&6¸¸1Ñ=Ô=ˆð œð 	,ð 	,‰HˆD�"Ø�d˜7 GÑ,Ô,¨wÑ6ˆGØ�b˜‘k”k GÑ+ˆGˆGà�Š˜wÑ'Ô'Ð'r   )
Ú__name__Ú
__module__Ú__qualname__r   Úintr    r$   ÚTensorr4   Ú__classcell__©r-   s   @r   r   r   .   sœ   ø€ € € € € ð,7Ø#ð,7Ø03ð,7Ø<?ð,7ØJMð,7ØY\ð,7Øilð,7à	ð,7ð ,7ð ,7ð ,7ð ,7ð ,7ð\
(˜uœ|ð 
(°´ð 
(ð 
(ð 
(ð 
(ð 
(ð 
(ð 
(ð 
(r   r   c            
       óf   ‡ — e Zd Zdededededdf
ˆ fd„Zdej        d	ej        dej        fd
„Zˆ xZ	S )r   r   r
   r   r   r   Nc                 ó  •— t          ¦   «                              ¦   «          |||c| _        | _        | _        || _        t          j        | j        ¦  «        | _        t          j        | j        ¦  «        | _	        | j        r<t          j        | j        ¦  «        | _
        t          j        | j        ¦  «        | _        | j        dz  | _        t          j        | j        | j        | j        z  d¬¦  «        | _        t          j        | j        | j        | j        z  d¬¦  «        | _        t          j        | j        | j        | j        z  d¬¦  «        | _        t          j        | j        | j        z  |d¬¦  «        | _        dS )ziPerceiver Cross-Attention Module --> let long-form inputs be `context`, resampled embeddings be `latents`g      à¿F©ÚbiasN)r   r    r   r
   r   r   r   r+   Úcontext_layer_normÚlatents_layer_normÚq_layer_normÚk_layer_normÚqk_scaleÚLinearÚq_projÚk_projÚv_projÚoutput_proj)r   r   r
   r   r   r-   s        €r   r    z"IdeficsPerceiverAttention.__init__k   s7  ø€ å‰Œ×ÒÑÔÐØ6?ÀÈ(Ð3ˆŒ˜œ d¤mØ,ˆÔå"$¤,¨t¬~Ñ">Ô">ˆÔÝ"$¤,¨t¬~Ñ">Ô">ˆÔØÔð 	<Ý "¤¨T¬]Ñ ;Ô ;ˆDÔÝ "¤¨T¬]Ñ ;Ô ;ˆDÔàœ tÑ+ˆŒõ ”i ¤°´¸t¼}Ñ0LÐSXÐYÑYÔYˆŒÝ”i ¤°´¸t¼}Ñ0LÐSXÐYÑYÔYˆŒÝ”i ¤°´¸t¼}Ñ0LÐSXÐYÑYÔYˆŒåœ9 T¤\°D´MÑ%AÀ9ÐSXÐYÑYÔYˆÔÐÐr   r.   r&   c                 óH  ‡ ‡— ‰                       |¦  «        }‰                      |¦  «        }|j        dd…         \  Š}}‰                      |¦  «        }‰                      t          j        ||gd¬¦  «        ¦  «        }‰                      t          j        ||gd¬¦  «        ¦  «        }ˆˆ fd„|||fD ¦   «         \  }}}‰ j        r*‰  	                    |¦  «        }‰  
                    |¦  «        }t          j        d|‰ j        z  |¦  «        }||                     dd¬	¦  «                             ¦   «         z
  }	|	                     d¬¦  «        }
t          j        d
|
|¦  «        }‰                      |                     dd¦  «                             d¦  «        ¦  «        S )aF  
        Runs Perceiver Self-Attention, with special (context, latents) appended along the `seq` dimension!

        Args:
            context (`torch.Tensor`):
                Tensor of shape `[bsz, seq, embed_dim]` representing long-form context to resample.
            latents (`torch.Tensor`):
                Tensor of shape `[bsz, n_latents, embed_dim]` representing fixed length latents to compress to.

        Returns:
            `torch.Tensor`: Tensor of shape `[bsz, n_latents, embed_dim]` representing attention over latents w/ cross
            from context.
        Né   éþÿÿÿ)Údimc                 ó’   •— g | ]C}|                      ‰|j        d          ‰j        ‰j        ¦  «                             d d¦  «        ‘ŒDS )r   é   )Úreshaper1   r
   r   Ú	transpose)r   ÚxÚ
batch_sizer   s     €€r   r   z5IdeficsPerceiverAttention.forward.<locals>.<listcomp>›   sH   ø€ ÐuÐuÐuÐfg�1—9’9˜Z¨¬°¬°T´\À4Ä=ÑQÔQ×[Ò[Ð\]Ð_`ÑaÔaÐuÐuÐur   z... i d, ... j d -> ... i jéÿÿÿÿT)rM   Úkeepdimz... i j, ... j d -> ... i dr   rO   )r@   rA   r1   rF   rG   r$   ÚcatrH   r   rB   rC   ÚeinsumrD   ÚamaxÚdetachÚsoftmaxrI   rQ   Úflatten)r   r.   r&   Ú
seq_lengthr   ÚqÚkÚvÚscoresÚstabilized_scoresr2   Ú	resampledrS   s   `           @r   r4   z!IdeficsPerceiverAttention.forward€   s¡  øø€ ð ×)Ò)¨'Ñ2Ô2ˆØ×)Ò)¨'Ñ2Ô2ˆØ,3¬M¸"¸1¸"Ô,=Ñ)ˆ
�J 	ð �KŠK˜Ñ Ô ˆØ�KŠK�œ	 7¨GÐ"4¸"Ð=Ñ=Ô=Ñ>Ô>ˆØ�KŠK�œ	 7¨GÐ"4¸"Ð=Ñ=Ô=Ñ>Ô>ˆð
 vÐuÐuÐuÐuÐlmÐopÐrsÐktÐuÑuÔu‰ˆˆ1ˆaàÔð 	%Ø×!Ò! !Ñ$Ô$ˆAØ×!Ò! !Ñ$Ô$ˆAå”Ð;¸QÀÄÑ=NÐPQÑRÔRˆØ" f§k¢k°bÀ$ kÑ&GÔ&G×&NÒ&NÑ&PÔ&PÑQÐØ ×(Ò(¨RÐ(Ñ0Ô0ˆõ ”LÐ!>ÀÀaÑHÔHˆ	à×Ò 	× 3Ò 3°A°qÑ 9Ô 9× AÒ AÀ"Ñ EÔ EÑFÔFÐFr   )
r5   r6   r7   r8   Úboolr    r$   r9   r4   r:   r;   s   @r   r   r   j   s§   ø€ € € € € ðZ #ð Z°ð Z¸sð ZÐTXð ZÐ]að Zð Zð Zð Zð Zð Zð*(G˜uœ|ð (G°e´lð (GÀuÄ|ð (Gð (Gð (Gð (Gð (Gð (Gð (Gð (Gr   r   c                   óZ   ‡ — e Zd Zdefˆ fd„Zdeej                 dz  dej        fd„Zˆ xZ	S )r   r   c                 óZ  •— t          ¦   «                              ¦   «          |j        j        | _        t	          j        | j        ¦  «        | _        t	          j        | j        |d¬¦  «        | _        t	          j	        ¦   «         | _
        t	          j        || j        d¬¦  «        | _        dS )z:Simple MLP block with intermediate_size and embedding sizeFr>   N)r   r    r(   r   r   r+   ÚlnrE   ÚfcÚReLUÚactÚc_proj)r   Úintermediate_sizer   r-   s      €r   r    zIdeficsMLP.__init__¬   s€   ø€ å‰Œ×ÒÑÔÐØÔ-Ô7ˆŒÝ”,˜tœ~Ñ.Ô.ˆŒÝ”)˜DœNÐ,=ÀEÐJÑJÔJˆŒÝ”7‘9”9ˆŒÝ”iÐ 1°4´>ÈÐNÑNÔNˆŒˆˆr   Úhidden_statesNr   c                 ó®   — |                       |¦  «        }|                      |¦  «        }|                      |¦  «        }|                      |¦  «        }|S )N)rf   rg   ri   rj   )r   rl   s     r   r4   zIdeficsMLP.forwardµ   sL   € ØŸš Ñ.Ô.ˆØŸš Ñ.Ô.ˆØŸš Ñ/Ô/ˆØŸš MÑ2Ô2ˆàÐr   )
r5   r6   r7   r   r    Útupler$   ÚFloatTensorr4   r:   r;   s   @r   r   r   «   s}   ø€ € € € € ðO°-ð Oð Oð Oð Oð Oð Oð U¨5Ô+<Ô%=ÀÑ%Dð ÈÔIZð ð ð ð ð ð ð ð r   r   )
Ú__doc__r$   Útorch.nnr   Úconfiguration_ideficsr   ÚModuler   r   r   r   r   r   ú<module>rt      sÖ   ðð4ð ð €€€Ø Ð Ð Ð Ð Ð à 0Ð 0Ð 0Ð 0Ð 0Ð 0ð9(ð 9(ð 9(ð 9(ð 9( ¤	ñ 9(ô 9(ð 9(ðx>Gð >Gð >Gð >Gð >G ¤	ñ >Gô >Gð >GðBð ð ð ð �”ñ ô ð ð ð r   