o
    Gi                     @   sh   d Z ddlZddlmZ ddlmZmZ ddlm	Z	 ddl
mZ eeZdd Zd	d
 ZdddZdS )z!PyTorch - Flax general utilities.    N)flatten_dictunflatten_dict)PRNGKey   )loggingc              	   C   s6   d}t || }|D ]}| |d|d} q
| S )Nz	\w+[.]\d+_.)refindallreplacejoinsplit)keyregexpatspat r   `/home/ubuntu/.local/lib/python3.10/site-packages/diffusers/models/modeling_flax_pytorch_utils.py
rename_key   s
   r   c                 C   s  | dd d }t | dkrGdD ]6\}}| d |krF| d }|dkr$dn|}| dd ||f }||v rF|| j|jjks?J ||jf  S qtd	d
 | D rv| d dkrv| dd d |vrv| dd d |v rv| dd d }||fS | d dv r| dd d |v r| dd d }||fS | d dkr| dd d |v r| dd d } ||fS | dd d }| d dkr|jdkr|dddd}||fS | dd d }| d dkr|j}||fS | dd d }| d dkr||fS | dd d }| d dkr||fS | |fS )zYRename PT weight names to corresponding Flax weight names and reshape tensor if necessaryN)scale   ))to_out_0	proj_attn)to_kr   )to_vvalue)to_qqueryweightkernelc                 s   s    | ]}d |v V  qdS )normNr   ).0str_r   r   r   	<genexpr>B   s    z0rename_key_and_reshape_tensor.<locals>.<genexpr>bias)r&   )r    gamma)	embedding)r!      r      r   )r    r'   beta)lenshapeTanyndim	transpose)pt_tuple_key	pt_tensorrandom_flax_state_dictrenamed_pt_tuple_keyrename_from	rename_toweight_namer   r   r   rename_key_and_reshape_tensor,   sN     r9   *   c              	   C   s   dd |   D } |t|}t|}i }|   D ]<\}}t|}t|d}	t|	||\}
}|
|v rO|j||
 jkrOt	d| d||
 j d|j dt
|||
< qt|S )Nc                 S   s   i | ]	\}}||  qS r   )numpy)r#   kvr   r   r   
<dictcomp>m   s    z6convert_pytorch_state_dict_to_flax.<locals>.<dictcomp>r   z1PyTorch checkpoint seems to be incorrect. Weight z was expected to be of shape z	, but is )itemsinit_weightsr   r   r   tupler   r9   r-   
ValueErrorjnpasarrayr   )pt_state_dict
flax_modelinit_keyrandom_flax_paramsr4   flax_state_dictpt_keyr3   renamed_pt_keyr2   flax_keyflax_tensorr   r   r   "convert_pytorch_state_dict_to_flaxk   s&   rN   )r:   )__doc__r	   	jax.numpyr;   rC   flax.traverse_utilr   r   
jax.randomr   utilsr   
get_logger__name__loggerr   r9   rN   r   r   r   r   <module>   s   
?