
    n ia                     "   d Z ddlZddlZddlZddlZddlZddlZddlmZm	Z	m
Z
 ddlZ	 ddlZdZn# e$ r dZY nw xY wdZdZdZd	Zd
 Zd Zd Zd,dZd Z G d de          Z G d d          Z G d dee          Zd Z G d dee          Z G d de          Zd Z  G d de          Z! G d d e          Z" G d! d"e          Z# G d# d$e          Z$d% Z% G d& d'ej&                  Z' G d( d)e'          Z( G d* d+e'          Z)dS )-zSpecifications declare the expected variables layout of CTranslate2 models
that do not load a computation graph. The model converter should make sure that
each required variable of the specification is set.
    N)DictListOptionalTF
__optional   )int8int8_float32int8_float16int8_bfloat16int16float16bfloat16float32)rotary_scaling_long_factorrotary_scaling_short_factorc                     | s|S | d|S N/ )scopenames     \/var/www/html/auto_sub_bot/venv/lib/python3.11/site-packages/ctranslate2/specs/model_spec.py_join_scoper   )   s      eeTT""    c                 ,    |                      d          S r   )splitr   s    r   _split_scoper   /   s    ;;sr   c                 r    t          |           }|d d         |d         }} d                    |           |fS )Nr   )r   join)r   keysattrs      r   _parent_scoper$   3   s9    Dss)T"X4E88E??D  r    c                    t          | j                                                  D ]\  }}|                    d          rt	          |t                     r;t          |          D ]*\  }}t          ||t          |d||fz                       +kt	          |t                    r!t          ||t          ||                      || t          ||          |           dS )z Recursively visits a layer spec._%s_%dr   N)	list__dict__items
startswith
isinstance	enumerate
visit_specr   	LayerSpec)specfnr   r   valueielems          r   r/   r/   9   s   DM//1122 	6 	6e??3 	eT"" 	6$U++ T T44;ugq	>Q+R+RSSSSSTy)) 	6ubE4(@(@AAAAABt[--u5555	6 	6r   c                     |s| S t          |          }|D ]_}	 t          | |          } # t          $ r? |                    dd          \  }}t          | |          t	          |                   } Y \w xY w| S )Nr'      )r   getattrAttributeErrorrsplitint)r1   indexr"   keyr#   s        r   
index_specr>   G   s     D 3 3	34%%DD 	3 	3 	3**S!,,KD%4&&s5zz2DDD	3 Ks   *AA32A3c                        e Zd Z fdZ xZS )
FrozenMetac                 H     t                      j        |i |}d|_        |S )NT)super__call___frozen)selfargskwargsinstance	__class__s       r   rC   zFrozenMeta.__call__U   s+    #577#T4V44r   )__name__
__module____qualname__rC   __classcell__rI   s   @r   r@   r@   T   s8                r   r@   c                        e Zd Z fdZ xZS )
FrozenAttrc                     t          | d          r"t          | |          st          d|z            t                                          ||           d S )NrD   zAttribute %s does not exist)hasattrr9   rB   __setattr__)rE   r=   r3   rI   s      r   rS   zFrozenAttr.__setattr__\   s\    4## 	FGD#,>,> 	F !>!DEEEC'''''r   )rJ   rK   rL   rS   rM   rN   s   @r   rP   rP   [   s8        ( ( ( ( ( ( ( ( (r   rP   c            	       ~    e Zd ZdZddZ	 	 ddededeeej	        f         fd	Z
d
 Zd Zddee         ddfdZd ZdS )r0   zPA layer specification declares the weights that should be set by the converters.returnNc                     g fd}|                      |           r%t          dd                              z            dS )zVerify that the required weights are set.

        Raises:
          ValueError: If a required weight is not set in the specification.
        c                    |                     |           d S t          |t          j                  r5|j        t          j        k    r|                    t          j                  }nt          |t                    r(t          j        d          	                    |          }nt          |t                    r(t          j        d          	                    |          }nSt          |t                    r>|t          k    r3t          j        |                    d          t          j                  }t          |t          j                  st          |t          j                  rt#          |          }n0t$          r)t          |t&          j                  rt+          |          }t-          |          d         }t/          | ||           d S )Nr   r   utf-8)dtyper    )appendr-   npndarrayrY   float64astyper   floattypeboolstrOPTIONAL
frombufferencoder   genericNumpyVariabletorch_is_availabletorchTensorPyTorchVariabler   setattr)r1   r   r3   	attr_nameunset_attributess       r   _checkz"LayerSpec.validate.<locals>._checkm   s   } ''---%,, P;"*,,!LL44EE5)) P++0077E4(( P((--e44E3'' PH$$M%,,w*?*?rwOOOE%,, /
5"*0M0M /%e,,# /
5%,(G(G /'..$T**2.ID)U+++++r   z/Some required model attributes are not set:

%s
N)_visit
ValueErrorr!   )rE   ro   rn   s     @r   validatezLayerSpec.validatee   st     	, 	, 	, 	, 	,4 	F 	C)),--.  	 	r   r%   Fprefixorderedc                     i fd}|                      |           |r1t          t                                          d                     S S )a!  Recursively returns the weights from this layer and its children.

        Arguments:
          prefix: Prefix to prepend to all variable names.
          ordered: If set, an ordered list is returned instead.

        Returns:
          Dictionary mapping variables name to value.
        c                 r    t          |t                    r|t          k    rd S |t          |          <   d S N)r-   rb   rc   r   )r1   r   r3   rt   vars      r   _register_varz*LayerSpec.variables.<locals>._register_var   s>    %%% %8*;*;-2CFD))***r   c                     | d         S Nr   r   )xs    r   <lambda>z%LayerSpec.variables.<locals>.<lambda>   s
    !A$ r   )r=   )rq   r)   sortedr+   )rE   rt   ru   rz   ry   s    `  @r   	variableszLayerSpec.variables   sp     	3 	3 	3 	3 	3 	3
 	M""" 	Asyy{{???@@@
r   c                 J   |                      d          }t          |          D ]|\  }}|D ]t\  }}||k    r nht          |          \  }}|                                sA|                    |          r,|t
          vr#t          | |          }t          |||            nu}dS )z4Find duplicate variables in spec and create aliases.Tru   N)r   reversedr$   	is_scalarequalSKIP_CREATING_ALIASr>   rl   )	rE   r   r   r3   
other_nameother_valuer   rm   r1   s	            r   _alias_variableszLayerSpec._alias_variables   s     NN4N00	#I.. 	 	KD%+4  '
K:%%E $1#6#6 y))K00 ")<<< &dE22DD)Z888E	 	r   c                     5t           vr,t          dd                    t                               fd}|                     |           dS )z-Possibly quantizes the variable of the layer.Nz7 is not a valid quantization type. Accepted types are: , c                 j   t          |t                    r|                                rd S t          |          d         }d }t	          | d|z            }|j        dv }|rX	dk    r|                    d                                          }t          j	        dt          j
        t          j        |                    z            }||z  }t          j        |          }t          j        |t          j        t          j                  j        t          j        t          j                  j                  }|                    t          j                  }t'          |          }t'          |          }n	dv r |                    d                                          }d }t)          |j                  dk    r(|j        }|                    |j        d	         d          }t          j
        t          j        |          d
          }d||d	k    <   d|z  }|t          j        |d
          z  }t          j        |          }|                    t          j                  }|r|                    |          }t'          |          }t'          |          }ni	dv r|                    	          }nO|rM	dv r|                    d          }n3	dv r|                    d          }n	dv r|                    d          }t3          | ||           |t3          | d|z  |           d S d S )Nr    z%s_scale)r   r   r   r   r   i   )r   r	   r
   r      r   r7   )axisg     _@)r   r   r   )r   r
   r   )r   r   r   )r   r   r	   )r-   Variabler   r   rR   rY   tonumpyr[   r   amaxabsoluterintclipiinfor   minmaxr^   rg   lenshapereshapeexpand_dimsr   rl   )
r1   r   r3   r=   scaleis_quantizableis_convertible	old_shaper   quantizations
            r   	_quantizez&LayerSpec._quantize.<locals>._quantize   s   eX.. %//2C2C t$$R(CE$T:+;<<N"[,NNN .07**!HHY//5577E Jurwr{57I7I/J/J'JKKEUNEGENNEGrx115rx7I7I7M E "LL22E)%00E)%00EE! &   "HHY//5577E $I5;''1,,$)K	 %ek!nb A A72;u#5#5A>>>D&+DO!DLER^E1555EGENNE!LL11E  9 %i 8 8)%00E)%00EE!%GGG!HH\22E 0#>>>!HHY//EE!%BBB!HHZ00EE!%III!HHY//ED#u%%% j3.66666 ! r   )ACCEPTED_MODEL_TYPESrr   r!   rq   )rE   r   r   s    ` r   r   zLayerSpec._quantize   sy    #<P(P(P<<+?!@!@!@B  
;	7 ;	7 ;	7 ;	7 ;	7z 	Ir   r   c                 X    |                                   |                     |           dS )aR  Recursively applies some optimizations to this layer:

        * Alias variables with the same shape and value.
        * Quantize weights.

        Arguments:
          quantization: Weight quantization scheme (possible values are: int8, int8_float32,
            int8_float16, int8_bfloat16, int16, float16, bfloat16, float32).
        N)r   r   )rE   r   s     r   optimizezLayerSpec.optimize  s.     	|$$$$$r   c                 &    t          | |           dS )z/Recursively visits this layer and its children.N)r/   )rE   r2   s     r   rq   zLayerSpec._visit  s    4r   rU   N)r%   Frx   )rJ   rK   rL   __doc__rs   rb   ra   r   r[   r\   r   r   r   r   r   rq   r   r   r   r0   r0   b   s        ZZ( ( ( (X    
c2:o		   4  ,E E EN% %Xc] %d % % % %    r   r0   )	metaclassc                     d}	 |                     |           S # t          $ r( t          | dd                    |                    w xY w)N)r   r   r   int32r   r   z% is not in list of supported dtypes: r   )r<   rr   r!   )object_dtypedtypess     r   _dtype_to_type_idr     sh    IF
||L))) 
 
 
||TYYv...0
 
 	

s	    2Ac                   *    e Zd ZdZd Zd Zd Zd ZdS )ModelConfigz$Base class for model configurations.c                 \    |                                 D ]\  }}t          | ||           dS )z7Initializes the configuration with a set of parameters.N)r+   rl   )rE   rG   r=   r3   s       r   __init__zModelConfig.__init__'  s<     ,,.. 	& 	&JCD#u%%%%	& 	&r   c                 H    d | j                                         D             S )z*Returns the configuration as a dictionary.c                 D    i | ]\  }}|                     d           ||S )r'   )r,   ).0r=   r3   s      r   
<dictcomp>z'ModelConfig.to_dict.<locals>.<dictcomp>.  s@     
 
 
U>>#&&

 
 
r   )r*   r+   rE   s    r   to_dictzModelConfig.to_dict,  s1    
 
"m1133
 
 
 	
r   c                     || j         |<   d S rx   )r*   )rE   r=   r3   s      r   add_attributezModelConfig.add_attribute4  s    "cr   c                     t          |dd          5 }t          j        |                                 |dd           |                    d           ddd           dS # 1 swxY w Y   dS )	z'Saves the configuration as a JSON file.wrX   encoding   T)indent	sort_keysrp   N)openjsondumpr   write)rE   pathconfig_files      r   save_as_jsonzModelConfig.save_as_json7  s    $g... 	$+I	    d###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   A A  A$'A$N)rJ   rK   rL   r   r   r   r   r   r   r   r   r   r   $  sV        ..& & &

 
 
# # #	$ 	$ 	$ 	$ 	$r   r   c                       e Zd ZdZd Zed             Zed             Zed             Zd Z	dde
d	ee
         d
dfdZde
d
dfdZd ZdS )	ModelSpecz"The top level layer specification.c                 F    |                                  | _        i | _        dS )z$Initializes the model specification.N)get_default_config_config_filesr   s    r   r   zModelSpec.__init__F  s     ..00r   c                     t                      )z$The name of the model specification.NotImplementedErrorr   s    r   r   zModelSpec.nameK       "###r   c                     dS )zThe model specification revision.

        This value is incremented each time the weights layout of the model is
        changed (e.g. a weight is renamed).
        r7   r   r   s    r   revisionzModelSpec.revisionP  s	     qr   c                     | j         S )zThe model configuration.)r   r   s    r   configzModelSpec.configY  s     |r   c                     dS )z5Returns the default configuration used by this model.Nr   r   s    r   r   zModelSpec.get_default_config^  s    tr   Nr   filenamerU   c                     t           j                            |          st          d|z            |t           j                            |          }|| j        v rt          d|z            || j        |<   dS )z4Registers a file to be saved in the model directory.zFile %s does not existNz*A file with name %s was already registered)osr   isfilerr   basenamer   )rE   r   r   s      r   register_filezModelSpec.register_fileb  sz    w~~d## 	>5<===w''--Ht{""IHTUUU $Hr   
output_dirc                    |                      t          j                            |d                     | j        8| j                            t          j                            |d                     | j                                        D ]k\  }}t          j                            ||          }t          j                            |          rt          d|z            t          j        ||           ldS )zwSaves this model on disk.

        Arguments:
          output_dir: Output directory where the model is saved.
        z	model.binNzconfig.jsonz-File %s already exists in the model directory)
_serializer   r   r!   r   r   r   r+   existsRuntimeErrorshutilcopy)rE   r   r   r   destinations        r   savezModelSpec.savel  s     	Z==>>><#L%%bgll:}&M&MNNN"k//11 	+ 	+NHd',,z8<<Kw~~k** "CkQ   Kk****	+ 	+r   c           
      H   g }g }|                      d          D ]H}t          |d         t                    r|                    |           3|                    |           It	          |d          5 fd}                    t          j        dt                                || j	                                       t          j        d| j
                                                 t          j        dt          |                               |D ]\  }} ||                               t          j        dt          |j                                       |j        D ]*}                    t          j        d|                     +                    t          j        dt          |j                                                           t          j        d|                                                                         |                                                               t          j        dt          |                               |D ]\  }	}
 ||	            ||
           	 ddd           dS # 1 swxY w Y   dS )	zSerializes the model variables.Tr   r7   wbc                                         t          j        dt          |           dz                                             |                     d                                          t          j        dd                     d S )NHr7   rX   Br   )r   structpackr   re   )stringmodels    r   _write_stringz+ModelSpec._serialize.<locals>._write_string  sm    FKS[[1_==>>>FMM'22333FKQ//00000r   Ir   N)r   r-   rb   rZ   r   r   r   r   CURRENT_BINARY_VERSIONr   r   r   r   r   rY   	num_bytesto_bytes)rE   r   r   aliasesvariabler   r   r3   dimaliasvariable_namer   s              @r   r   zModelSpec._serialize~  s   	t44 	+ 	+H(1+s++ +x((((  ****$ 	-1 1 1 1 1
 KKC)?@@AAAM$)$$$KKC77888KKCY88999( . .ed###FKS-=-=>>??? ; 7 7CKKC 5 56666FK->u{-K-KLLMMMFKU__->->??@@@ENN,,----KKCW66777(/ - -$}e$$$m,,,,-)	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   5HJJJrx   )rJ   rK   rL   r   r   propertyr   r   r   r   rb   r   r   r   r   r   r   r   r   r   C  s        ,,  
 $ $ X$   X   X  % %# %# %$ % % % %+s +t + + + +$ -  -  -  -  -r   r   c              #      K   |                                  D ]H\  }}t          |          dk    r||d         fV  %t          |          D ]\  }}d||dz   fz  |fV  Id S )Nr7   r   r(   )r+   r   r.   )vocabulariesr   
vocabularyr4   vocabs        r   _flatten_vocabulariesr     s      (..00 5 5jz??a
1%%%%%%j11 5 55q1u-u444445	5 5r   c                   V     e Zd ZdZ	 	 	 	 	 	 ddededed	ee         d
edef fdZ xZS )SequenceToSequenceModelConfigz.Configuration for sequence-to-sequence models.<unk><s></s>F	unk_token	bos_token	eos_tokendecoder_start_tokenadd_source_bosadd_source_eosc           
      H     t                      j        d||||||d| dS )a  Initializes the configuration for sequence-to-sequence models.

        Args:
          unk_token: The unknown token.
          bos_token: The start of sentence token.
          eos_token: The end of sentence token.
          decoder_start_token: The decoder start token. If ``None``, the token should
            be passed by the user in the target prefix.
          add_source_bos: If ``True``, ``bos_token`` will be automatically added to
            the source input.
          add_source_eos: If ``True``, ``eos_token`` will be automatically added to
            the source input.
          **kwargs: Additional configuration.
        )r  r  r  r  r	  r
  Nr   rB   r   )	rE   r  r  r  r  r	  r
  rG   rI   s	           r   r   z&SequenceToSequenceModelConfig.__init__  sP    0 	 	
 3))	
 	
 	
 	
 	
 	
 	
r   )r  r  r  r  FF)	rJ   rK   rL   r   rb   r   ra   r   rM   rN   s   @r   r  r    s        88 !-2$$ 
  
 
  
 	 

 &c] 
  
  
  
  
  
  
  
  
  
  
  
r   r  c                        e Zd ZdZ fdZd Zej        d             Zej        d             Z	de
e         ddfd	Zde
e         ddfd
ZdeddfdZd fdZdeddf fdZ xZS )SequenceToSequenceModelSpecz3Base specification for sequence to sequence models.c                 \    t                                                       g g d| _        dS )z7Initializes a sequence to sequence model specification.sourcetargetN)rB   r   _vocabulariesrE   rI   s    r   r   z$SequenceToSequenceModelSpec.__init__  s4    
 
r   c                     t                      S rx   )r  r   s    r   r   z.SequenceToSequenceModelSpec.get_default_config  s    ,...r   c                     t                      )z9Returns the source vocabulary size expected by the model.r   r   s    r   get_source_vocabulary_sizez6SequenceToSequenceModelSpec.get_source_vocabulary_size  r   r   c                     t                      )z9Returns the target vocabulary size expected by the model.r   r   s    r   get_target_vocabulary_sizez6SequenceToSequenceModelSpec.get_target_vocabulary_size  r   r   tokensrU   Nc                 F    | j         d                             |           dS )znRegisters a source vocabulary of tokens.

        Arguments:
          tokens: List of source tokens.
        r  Nr  rZ   rE   r  s     r   register_source_vocabularyz6SequenceToSequenceModelSpec.register_source_vocabulary  &     	8$++F33333r   c                 F    | j         d                             |           dS )znRegisters a target vocabulary of tokens.

        Arguments:
          tokens: List of target tokens.
        r  Nr  r  s     r   register_target_vocabularyz6SequenceToSequenceModelSpec.register_target_vocabulary  r  r   r   c                 2    |                      |d           dS )zvRegisters a vocabulary mapping file.

        Arguments:
          path: Path to the vocabulary mapping file.
        zvmap.txtN)r   )rE   r   s     r   register_vocabulary_mappingz7SequenceToSequenceModelSpec.register_vocabulary_mapping  s      	4,,,,,r   c           
         t                                                       |                                 |                                 d}|                                D ]\  }}t          |t                    s|g}| j        |         }t          |          t          |          k    r/t          d|t          |          t          |          fz            t          t          ||                    D ]P\  }\  }}t          |          |k    r5t          d|                                |t          |          |fz            Qd S )Nr  zCIncorrect number of %s vocabularies: %d registered, but expected %dzK%s vocabulary %d has size %d but the model expected a vocabulary of size %d)rB   rs   r  r  r+   r-   r)   r  r   rr   r.   zip
capitalize)	rE   vocabulary_sizesr   sizesr   r4   r   expected_sizerI   s	           r   rs   z$SequenceToSequenceModelSpec.validate   sc    55775577
 

 ,1133 	 	KD%eT**  -d3L<  CJJ.. YS..E

;<   3<Ce<T<T2U2U  ..Jz??m33$%??,,aZ-PQ   4	 	r   r   c                 v   t          t          | j                            }t          |                                          t          fdD                       r
dd         i}|                                D ]\  }}t          |d|z  |           t                      	                    |           d S )Nc              3   0   K   | ]}|d          k    V  dS )r   Nr   )r   r   all_vocabulariess     r   	<genexpr>z3SequenceToSequenceModelSpec.save.<locals>.<genexpr>  s.      TTZz-a00TTTTTTr   sharedr   z%s_vocabulary)
dictr   r  r)   valuesallr+   _save_vocabularyrB   r   )rE   r   r   r   r  r,  rI   s        @r   r   z SequenceToSequenceModelSpec.save  s    1$2DEEFF 3 3 5 566TTTTCSTTTTT 	;$&6q&9:L(..00 	I 	ILD&Z4)?HHHH 	Z     r   r   )rJ   rK   rL   r   r   r   abcabstractmethodr  r  r   rb   r  r!  r#  rs   r   rM   rN   s   @r   r  r    sC       ==
 
 
 
 
/ / / 	$ $ $ 	$ $ $4c 4t 4 4 4 44c 4t 4 4 4 4- - - - - -     4!s !t ! ! ! ! ! ! ! ! ! !r   r  c                   8     e Zd ZdZ	 	 	 d	dededef fdZ xZS )
LanguageModelConfigz"Configuration for language models.r  r  r  r  r  r  c                 B     t                      j        d|||d| dS )a  Initializes the configuration for language models.

        Args:
          unk_token: The unknown token.
          bos_token: The start of sentence token.
          eos_token: The end of sentence token.
          **kwargs: Additional configuration.
        )r  r  r  Nr   r  )rE   r  r  r  rG   rI   s        r   r   zLanguageModelConfig.__init__+  sG     	 	
	
 	
 		
 	
 	
 	
 	
r   )r  r  r  )rJ   rK   rL   r   rb   r   rM   rN   s   @r   r6  r6  (  so        ,, !	
 

 
 	
 
 
 
 
 
 
 
 
 
r   r6  c                        e Zd ZdZ fdZd Zej        d             Zde	e
         ddfdZd fd	Zd
e
ddf fdZ xZS )LanguageModelSpecz'Base specification for language models.c                 V    t                                                       g | _        dS )z+Initializes a language model specification.N)rB   r   _vocabularyr  s    r   r   zLanguageModelSpec.__init__E  s'    r   c                     t                      S rx   )r6  r   s    r   r   z$LanguageModelSpec.get_default_configJ  s    "$$$r   c                     t                      )z2Returns the vocabulary size expected by the model.r   r   s    r   get_vocabulary_sizez%LanguageModelSpec.get_vocabulary_sizeM  r   r   r  rU   Nc                 .    t          |          | _        dS )zbRegisters the vocabulary of tokens.

        Arguments:
          tokens: List of tokens.
        N)r)   r;  r  s     r   register_vocabularyz%LanguageModelSpec.register_vocabularyR  s      <<r   c                     t                                                       |                                 }t          | j                  |k    r&t          dt          | j                  |fz            d S )NzEVocabulary has size %d but the model expected a vocabulary of size %d)rB   rs   r>  r   r;  rr   )rE   expected_vocabulary_sizerI   s     r   rs   zLanguageModelSpec.validateZ  sy    #'#;#;#=#= t  $<<<Wt'((*BCD   =<r   r   c                 v    t          |d| j                   t                                          |           d S )Nr   )r2  r;  rB   r   )rE   r   rI   s     r   r   zLanguageModelSpec.saved  s6    \43CDDD 	Z     r   r   )rJ   rK   rL   r   r   r   r3  r4  r>  r   rb   r@  rs   r   rM   rN   s   @r   r9  r9  B  s        11    
% % % 	$ $ $($s) ( ( ( ( (     !s !t ! ! ! ! ! ! ! ! ! !r   r9  c                     t           j                            | d|z            }t          |dd          5 }t	          j        ||d           d d d            d S # 1 swxY w Y   d S )Nz%s.jsonr   rX   r   r   )r   )r   r   r!   r   r   r   )r   r   r  vocabulary_pathvocabulary_files        r   r2  r2  l  s    gll:y4/?@@O	osW	5	5	5 5	&/!44445 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5s   AA"Ac                   ~   e Zd ZdZeej        dee         fd                        Z	de
fdZeej        defd                        Zdedd fdZej        dej        fd            Zde
fd	Zej        defd
            Zej        defd            Zej        dedd fd            Zej        de
fd            ZdS )r   z(Abstract base class for model variables.rU   c                     t                      rx   r   r   s    r   r   zVariable.shapev  r   r   c                 2    t          | j                  dk    S r|   )r   r   r   s    r   r   zVariable.is_scalar{  s    4:!##r   c                     t                      rx   r   r   s    r   rY   zVariable.dtype~  r   r   rY   c                 F    || j         k    r| S |                     |          S rx   )rY   _torE   rY   s     r   r   zVariable.to  s$    DJKxxr   c                     t                      rx   r   r   s    r   r   zVariable.numpy      !###r   c                 h    t          |           t          |          u o|                     |          S rx   )r`   _equalrE   others     r   r   zVariable.equal  s*    DzzT%[[(?T[[-?-??r   c                     t                      rx   r   r   s    r   r   zVariable.num_bytes  rO  r   c                     t                      rx   r   r   s    r   r   zVariable.to_bytes  rO  r   c                     t                      rx   r   rM  s     r   rL  zVariable._to  rO  r   c                     t                      rx   r   rR  s     r   rQ  zVariable._equal  rO  r   N)rJ   rK   rL   r   r   r3  r4  r   r;   r   ra   r   rb   rY   r   r[   r\   r   r   r   bytesr   rL  rQ  r   r   r   r   r   s  s       22$tCy $ $ $  X$$4 $ $ $ $ $s $ $ $  X$ 
    
 	$rz $ $ $ $@d @ @ @ @ 	$3 $ $ $ $ 	$% $ $ $ $ 	$ $ $ $ $ $ 	$t $ $ $ $ $ $r   r   c                       e Zd ZdZd Zedee         fd            Zede	fd            Z
dej        fdZdefdZdefdZd	e	defd
ZdefdZdS )rg   z Model variable as a Numpy array.c                     || _         d S rx   array)rE   r\  s     r   r   zNumpyVariable.__init__  s    


r   rU   c                     | j         j        S rx   )r\  r   r   s    r   r   zNumpyVariable.shape  s    zr   c                 $    | j         j        j        S rx   )r\  rY   r   r   s    r   rY   zNumpyVariable.dtype  s    z$$r   c                     | j         S rx   r[  r   s    r   r   zNumpyVariable.numpy  s
    zr   c                     | j         j        S rx   )r\  nbytesr   s    r   r   zNumpyVariable.num_bytes  s    z  r   c                 4    | j                                         S rx   )r\  tobytesr   s    r   r   zNumpyVariable.to_bytes  s    z!!###r   rY   c                    |dk    rHt           st          d          t                              | j                                      |          S t          j        |          }| j                            |          | _        | S )Nr   z5Converting to bfloat16 requires torch to be installed)	rh   r   rk   
from_numpyr\  r   r[   rY   r^   rM  s     r   rL  zNumpyVariable._to  sy    J% "K   #--dj99<<UCCCZ&&u--
r   c                     | j         }|j         }||u pP|j        |j        k    o@|j        |j        k    o0|j        d         |j        d         k    ot	          j        ||          S r|   )r\  rY   r   flatr[   array_equalrE   rS  abs       r   rQ  zNumpyVariable._equal  sm    JKAv 
Gqw %17"%q	QVAY&% q!$$		
r   N)rJ   rK   rL   r   r   r   r   r;   r   rb   rY   r[   r\   r   r   rX  r   r   rL  ra   rQ  r   r   r   rg   rg     s       **    tCy       X  %s % % % X%rz    !3 ! ! ! !$% $ $ $ $
 
 
 
 
 

t 
 
 
 
 
 
r   rg   c                       e Zd ZdZd Zed             Zedee	         fd            Z
edefd            Zdej        fdZde	fdZdefd	Zd
edefdZdefdZdS )rk   z#Model variable as a PyTorch tensor.c                     t          |t          j        j                  r|j        }|                                | _        d S rx   )r-   ri   nn	Parameterdata
contiguoustensor)rE   rr  s     r   r   zPyTorchVariable.__init__  s7    feh011 	![F''))r   c                 @    t          j        |          } | |          S rx   )ri   re  )clsr\  rr  s      r   re  zPyTorchVariable.from_numpy  s     !%((s6{{r   rU   c                 4    t          | j        j                  S rx   )r)   rr  r   r   s    r   r   zPyTorchVariable.shape  s    DK%&&&r   c                 \    t          | j        j                                      dd          S )Nztorch.r%   )rb   rr  rY   replacer   s    r   rY   zPyTorchVariable.dtype  s%    4;$%%--h;;;r   c                 X    | j                                                                         S rx   )rr  detachr   r   s    r   r   zPyTorchVariable.numpy  s"    {!!##))+++r   c                 h    | j                                         | j                                         z  S rx   )rr  numelelement_sizer   s    r   r   zPyTorchVariable.num_bytes  s)    {  ""T[%=%=%?%???r   c                     d}|                                  }d}d}|dk    rN||k    r|n|}t          j        | j                                        |z   |          }||z  }||z  }||z  }|dk    N|S )Nir   r   )r   ctypes	string_atrr  data_ptr)rE   max_sizer   outputoffset
chunk_sizechunks          r   r   zPyTorchVariable.to_bytes  s    NN$$	!mm%.%9%9yJ$T[%9%9%;%;f%DjQQEeOFj F#I !mm r   rY   c                 n    t          t          |          }| j                            |          | _        | S rx   )r8   ri   rr  r   rM  s     r   rL  zPyTorchVariable._to  s+    u%%knnU++r   c                 p    | j         }|j         }||u p$|j        |j        k    ot          j        ||          S rx   )rr  rY   ri   r   ri  s       r   rQ  zPyTorchVariable._equal  s9    KLAvC!'QW,BQ1B1BCr   N)rJ   rK   rL   r   r   classmethodre  r   r   r;   r   rb   rY   r[   r\   r   r   rX  r   r   rL  ra   rQ  r   r   r   rk   rk     s2       --* * *   [ 'tCy ' ' ' X' <s < < < X<,rz , , , ,@3 @ @ @ @%         
Dt D D D D D Dr   rk   )r%   )*r   r3  r~  r   r   r   r   typingr   r   r   r   r[   ri   rh   ImportErrorrc   r   r   r   r   r   r$   r/   r>   r`   r@   rP   r0   r   r   r   r   r  r  r6  r9  r2  ABCr   rg   rk   r   r   r   <module>r     s   
 


   				   ' ' ' ' ' ' ' ' ' '    LLL     	  T # # #  ! ! !6 6 6 6
 
 
       ( ( ( ( ( ( ( (s s s s s
j s s s sl	
 	
 	
$ $ $ $ $*
 $ $ $ $>[- [- [- [- [-	 [- [- [-|5 5 5#
 #
 #
 #
 #
K #
 #
 #
LU! U! U! U! U!) U! U! U!p
 
 
 
 
+ 
 
 
4'! '! '! '! '!	 '! '! '!T5 5 5*$ *$ *$ *$ *$sw *$ *$ *$Z+
 +
 +
 +
 +
H +
 +
 +
\1D 1D 1D 1D 1Dh 1D 1D 1D 1D 1Ds   1 ;;