
    C1ia                        S r SSKrSSKrSSKrSSKrSSKrSSKrSSKJrJ	r	J
r
  SSKr SSKrSrSrSrSrS	rS
 rS rS rS+S jrS r " S S\5      r " S S5      r " S S\\S9rS r " S S\\S9r " S S\5      rS r  " S S\5      r! " S S\5      r" " S  S!\5      r# " S" S#\5      r$S$ r% " S% S&\RL                  5      r' " S' S(\'5      r( " S) S*\'5      r)g! \ a    Sr Nf = f),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                 &    U (       d  U$ U < SU< 3$ N/ )scopenames     V/home/james-whalen/.local/lib/python3.13/site-packages/ctranslate2/specs/model_spec.py_join_scoper   )   s    T""    c                 $    U R                  S5      $ r   )splitr   s    r   _split_scoper   /   s    ;;sr   c                 P    [        U 5      nUS S US   p SR                  U 5      U4$ )Nr   )r   join)r   keysattrs      r   _parent_scoper$   3   s0    Ds)T"X488E?D  r   c                    [        U R                  R                  5       5       H  u  p4UR                  S5      (       a  M  [	        U[         5      (       a.  [        U5       H  u  pV[        Xa[        USX54-  5      S9  M     M`  [	        U[        5      (       a  [        XA[        X#5      S9  M  U" U [        X#5      U5        M     g)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    DMM//12??3eT""$U+4;ug	>Q+RS ,y))uE(@At[-u5 3r   c                     U(       d  U $ [        U5      nU H  n [        X5      n M     U $ ! [         a/    UR                  SS5      u  pA[        X5      [	        U5         n  MM  f = f)Nr&      )r   getattrAttributeErrorrsplitint)r0   indexr"   keyr#   s        r   
index_specr=   G   sj    D	34%D  K  	3**S!,KD4&s5z2D	3s   ,5A%$A%c                   (   ^  \ rS rSrU 4S jrSrU =r$ )
FrozenMetaT   c                 6   > [         TU ]  " U0 UD6nSUl        U$ )NT)super__call___frozen)selfargskwargsinstance	__class__s       r   rC   FrozenMeta.__call__U   s$    7#T4V4r   r   )__name__
__module____qualname____firstlineno__rC   __static_attributes____classcell__rI   s   @r   r?   r?   T   s     r   r?   c                   (   ^  \ rS rSrU 4S jrSrU =r$ )
FrozenAttr[   c                    > [        U S5      (       a  [        X5      (       d  [        SU-  5      e[        TU ]  X5        g )NrD   zAttribute %s does not exist)hasattrr8   rB   __setattr__)rE   r<   r2   rI   s      r   rW   FrozenAttr.__setattr__\   s8    4##GD,>,> !>!DEEC'r   r   )rK   rL   rM   rN   rW   rO   rP   rQ   s   @r   rS   rS   [   s    ( (r   rS   c            	           \ rS rSrSrSS jr  SS\S\S\\\	R                  4   4S jjrS	 rS
 rSS\\   SS4S jjrS rSrg)r/   b   zPA layer specification declares the weights that should be set by the converters.returnNc                    ^ / mU4S jnU R                  U5        T(       a  [        SSR                  T5      -  5      eg)zwVerify that the required weights are set.

Raises:
  ValueError: If a required weight is not set in the specification.
c                   > Uc  TR                  U5        g [        U[        R                  5      (       a>  UR                  [        R
                  :X  a  UR                  [        R                  5      nO[        U[        5      (       a&  [        R                  " S5      R                  U5      nO[        U[        5      (       a&  [        R                  " S5      R                  U5      nOQ[        U[        5      (       a<  U[        :w  a2  [        R                  " UR                  S5      [        R                  S9n[        U[        R                  5      (       d  [        U[        R                   5      (       a  [#        U5      nO5[$        (       a*  [        U[&        R(                  5      (       a  [+        U5      n[-        U5      S   n[/        XU5        g )Nr   r   utf-8)dtyper    )appendr,   npndarrayr_   float64astyper   floattypeboolstrOPTIONAL
frombufferencoder   genericNumpyVariabletorch_is_availabletorchTensorPyTorchVariabler   setattr)r0   r   r2   	attr_nameunset_attributess       r   _check"LayerSpec.validate.<locals>._checkm   s/   } ''-%,,;;"**,!LL4EE5))+007E4(((--e4E3''H$MM%,,w*?rwwOE%,,
5"**0M0M%e,##
5%,,(G(G'.$T*2.IDU+r   z/Some required model attributes are not set:

%s
N)_visit
ValueErrorr!   )rE   ru   rt   s     @r   validateLayerSpec.validatee   sH     	,4 	FC)),-.  r   prefixorderedc                    ^^ 0 mUU4S jnU R                  U5        U(       a"  [        [        TR                  5       S S95      $ T$ )zRecursively 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                 d   > [        U[        5      (       a  U[        :X  a  g UT[        TU5      '   g N)r,   rh   ri   r   )r0   r   r2   r|   vars      r   _register_var*LayerSpec.variables.<locals>._register_var   s+    %%%%8*;-2CFD)*r   c                     U S   $ Nr   r   )xs    r   <lambda>%LayerSpec.variables.<locals>.<lambda>   s    !A$r   )r<   )rx   r(   sortedr*   )rE   r|   r}   r   r   s    `  @r   	variablesLayerSpec.variables   s=     	3
 	M"syy{?@@
r   c                 0   U R                  SS9n[        U5       Hx  u  p#U Hm  u  pEX$:X  a    M  [        U5      u  pgUR                  5       (       a  M1  UR	                  U5      (       d  MI  U[
        ;  d  MU  [        X5      n[        XU5          Mv     Mz     g)z4Find duplicate variables in spec and create aliases.Tr}   N)r   reversedr$   	is_scalarequalSKIP_CREATING_ALIASr=   rr   )	rE   r   r   r2   
other_nameother_valuer   rs   r0   s	            r   _alias_variablesLayerSpec._alias_variables   s     NN4N0	#I.KD+4'
% $1#6 ))K00!)<< &d2DDZ8 ,5 /r   c                    ^ Tb/  T[         ;  a%  [        T< SSR                  [         5      < 35      eU4S jnU R                  U5        g)z-Possibly quantizes the variable of the layer.Nz7 is not a valid quantization type. Accepted types are: , c                 b  > [        U[        5      (       a  UR                  5       (       a  g [        U5      S   nS n[	        U SU-  5      nUR
                  S;   nU(       Ga_  T	S:X  Ga!  UR                  S5      R                  5       n[        R                  " S[        R                  " [        R                  " U5      5      -  5      nX$-  n[        R                  " U5      n[        R                  " U[        R                  " [        R                  5      R                   [        R                  " [        R                  5      R"                  5      nUR%                  [        R                  5      n['        U5      n['        U5      nGOT	S;   Ga  UR                  S5      R                  5       nS n[)        UR*                  5      S:X  a+  UR*                  nUR-                  UR*                  S	   S5      n[        R                  " [        R                  " U5      S
S9nSXS	:H  '   SU-  nU[        R.                  " US
5      -  n[        R                  " U5      nUR%                  [        R0                  5      nU(       a  UR-                  U5      n['        U5      n['        U5      nOfT	S;   a  UR                  T	5      nONU(       aG  T	S;   a  UR                  S5      nO/T	S;   a  UR                  S5      nOT	S;   a  UR                  S5      n[3        XU5        Ub  [3        U SU-  U5        g g )Nr    z%s_scale)r   r   r   r   r   i   )r   r	   r
   r      r   r6   )axisg     _@)r   r   r   )r   r
   r   )r   r   r   )r   r   r	   )r,   Variabler   r   rV   r_   tonumpyra   r   amaxabsoluterintclipiinfor   minmaxrd   rm   lenshapereshapeexpand_dimsr   rr   )
r0   r   r2   r<   scaleis_quantizableis_convertible	old_shaper   quantizations
            r   	_quantize&LayerSpec._quantize.<locals>._quantize   s|   eX..%//2C2Ct$R(CE$T:+;<N"[[,NNN7*!HHY/557E JJurwwr{{57I/J'JKENEGGENEGGrxx155rxx7I7M7ME "LL2E)%0E)%0E! &  "HHY/557E $I5;;'1,$)KK	 %ekk!nb A772;;u#5A>D&+DO!DLER^^E155EGGENE!LL1E  %i 8)%0E)%0E!%GG!HH\2E#>>!HHY/E!%BB!HHZ0E!%II!HHY/EDu% j3.6 !r   )ACCEPTED_MODEL_TYPESry   r!   rx   )rE   r   r   s    ` r   r   LayerSpec._quantize   sG    #<P(P+?!@B 
;	7z 	Ir   r   c                 F    U R                  5         U R                  U5        g)a"  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   optimizeLayerSpec.optimize  s     	|$r   c                     [        X5        g)z/Recursively visits this layer and its children.N)r.   )rE   r1   s     r   rx   LayerSpec._visit  s
    4r   r   r[   N) Fr   )rK   rL   rM   rN   __doc__rz   rh   rg   r   ra   rb   r   r   r   r   r   rx   rO   r   r   r   r/   r/   b   si    Z(X   
c2::o		4,EN%Xc] %d %r   r/   )	metaclassc                     Sn UR                  U 5      $ ! [         a"    [        U < SSR                  U5      < 35      ef = f)N)r   r   r   int32r   r   z% is not in list of supported dtypes: r   )r;   ry   r!   )object_dtypedtypess     r   _dtype_to_type_idr     sJ    IF
||L)) 
TYYv.0
 	

s	    ,Ac                   0    \ rS rSrSrS rS rS rS rSr	g)	ModelConfigi$  z$Base class for model configurations.c                 N    UR                  5        H  u  p#[        XU5        M     g)z7Initializes the configuration with a set of parameters.N)r*   rr   )rE   rG   r<   r2   s       r   __init__ModelConfig.__init__'  s     ,,.JCDu% )r   c                     U R                   R                  5        VVs0 s H  u  pUR                  S5      (       a  M  X_M!     snn$ s  snnf )z*Returns the configuration as a dictionary.r&   )r)   r*   r+   rE   r<   r2   s      r   to_dictModelConfig.to_dict,  sH     #mm113
3
>>#& CJ3
 	
 
s
   AAc                      X R                   U'   g r   )r)   r   s      r   add_attributeModelConfig.add_attribute4  s    "cr   c                     [        USSS9 n[        R                  " U R                  5       USSS9  UR	                  S5        SSS5        g! , (       d  f       g= f)	z'Saves the configuration as a JSON file.wr^   encoding   T)indent	sort_keysrw   N)openjsondumpr   write)rE   pathconfig_files      r   save_as_jsonModelConfig.save_as_json7  sJ    $g.+II	 d# /..s   7A
Ar   N)
rK   rL   rM   rN   r   r   r   r   r   rO   r   r   r   r   r   $  s    .&

#	$r   r   c                       \ rS rSrSrS r\S 5       r\S 5       r\S 5       r	S r
SS	\S
\\   SS4S jjrS\SS4S jrS rSrg)	ModelSpeciC  z"The top level layer specification.c                 <    U R                  5       U l        0 U l        g)z$Initializes the model specification.N)get_default_config_config_filesrE   s    r   r   ModelSpec.__init__F  s    ..0r   c                     [        5       e)z$The name of the model specification.NotImplementedErrorr   s    r   r   ModelSpec.nameK       "##r   c                     g)zThe model specification revision.

This value is incremented each time the weights layout of the model is
changed (e.g. a weight is renamed).
r6   r   r   s    r   revisionModelSpec.revisionP  s     r   c                     U R                   $ )zThe model configuration.)r   r   s    r   configModelSpec.configY  s     ||r   c                     g)z5Returns the default configuration used by this model.Nr   r   s    r   r   ModelSpec.get_default_config^  s    r   Nr   filenamer[   c                    [         R                  R                  U5      (       d  [        SU-  5      eUc  [         R                  R	                  U5      nX R
                  ;   a  [        SU-  5      eXR
                  U'   g)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   isfilery   basenamer   )rE   r   r   s      r   register_fileModelSpec.register_fileb  sg    ww~~d##5<==ww''-H{{"IHTUU $Hr   
output_dirc                    U R                  [        R                  R                  US5      5        U R                  b9  U R                  R                  [        R                  R                  US5      5        U R                  R                  5        Hl  u  p#[        R                  R                  X5      n[        R                  R                  U5      (       a  [        SU-  5      e[        R                  " X45        Mn     g)z_Saves 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   saveModelSpec.savel  s     	Z=><<#LL%%bggll:}&MN"kk//1NH'',,z<Kww~~k**"CkQ  KK* 2r   c           
        ^ / n/ nU R                  SS9 H?  n[        US   [        5      (       a  UR                  U5        M.  UR                  U5        MA     [	        US5       mU4S jnTR                  [        R                  " S[        5      5        U" U R                  5        TR                  [        R                  " SU R                  5      5        TR                  [        R                  " S[        U5      5      5        U GH  u  pgU" U5        TR                  [        R                  " S[        UR                  5      5      5        UR                   H)  nTR                  [        R                  " SU5      5        M+     TR                  [        R                  " S[        UR                  5      5      5        TR                  [        R                  " SUR                  5       5      5        TR                  UR!                  5       5        GM     TR                  [        R                  " S[        U5      5      5        U H  u  pU" U	5        U" U
5        M     SSS5        g! , (       d  f       g= f)	zSerializes the model variables.Tr   r6   wbc                    > TR                  [        R                  " S[        U 5      S-   5      5        TR                  U R	                  S5      5        TR                  [        R                  " SS5      5        g )NHr6   r^   Br   )r   structpackr   rk   )stringmodels    r   _write_string+ModelSpec._serialize.<locals>._write_string  sN    FKKS[1_=>FMM'23FKKQ/0r   Ir  N)r   r,   rh   r`   r   r   r  r  CURRENT_BINARY_VERSIONr   r   r   r   r   r_   	num_bytesto_bytes)rE   r   r   aliasesvariabler
  r   r2   dimaliasvariable_namer	  s              @r   r   ModelSpec._serialize~  s   	t4H(1+s++x(  *	 5 $1
 KKC)?@A$))$KKC78KKCY89(d#FKKS-=>? ;;CKKC 56 'FKK->u{{-KLMFKKU__->?@ENN,-  ) KKCW67(/$e$m, )0) s   $G?I,,
I:)r   r   r   )rK   rL   rM   rN   r   r   propertyr   r   r   r   rh   r   r   r   r   rO   r   r   r   r   r   C  s    ,
 $ $    %# %# %$ %+s +t +$ -r   r   c              #      #    U R                  5        H?  u  p[        U5      S:X  a
  XS   4v   M  [        U5       H  u  p4SXS-   4-  U4v   M     MA     g 7f)Nr6   r   r'   )r*   r   r-   )vocabulariesr   
vocabularyr3   vocabs        r   _flatten_vocabulariesr    s[     (..0z?a1%%%j11u-u44 2	 1s   AAc                   ^   ^  \ rS rSrSr      SS\S\S\S\\   S\S\4U 4S	 jjjrS
r	U =r
$ )SequenceToSequenceModelConfigi  z.Configuration for sequence-to-sequence models.	unk_token	bos_token	eos_tokendecoder_start_tokenadd_source_bosadd_source_eosc           
      4   > [         TU ]  " SUUUUUUS.UD6  g)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   &SequenceToSequenceModelConfig.__init__  s3    0 	 	
 3))	
 	
r   r   )<unk><s></s>r(  FF)rK   rL   rM   rN   r   rh   r   rg   r   rO   rP   rQ   s   @r   r  r    sb    8 !-2$$ 
 
  
 	 

 &c] 
  
  
  
r   r  c                      ^  \ rS rSrSrU 4S jrS r\R                  S 5       r	\R                  S 5       r
S\\   SS	4S
 jrS\\   SS	4S jrS\SS	4S jrSU 4S jjrS\SS	4U 4S jjrSrU =r$ )SequenceToSequenceModelSpeci  z3Base specification for sequence to sequence models.c                 6   > [         TU ]  5         / / S.U l        g)z7Initializes a sequence to sequence model specification.sourcetargetN)rB   r   _vocabulariesrE   rI   s    r   r   $SequenceToSequenceModelSpec.__init__  s    
r   c                     [        5       $ r   )r  r   s    r   r   .SequenceToSequenceModelSpec.get_default_config  s    ,..r   c                     [        5       e)z9Returns the source vocabulary size expected by the model.r   r   s    r   get_source_vocabulary_size6SequenceToSequenceModelSpec.get_source_vocabulary_size  r   r   c                     [        5       e)z9Returns the target vocabulary size expected by the model.r   r   s    r   get_target_vocabulary_size6SequenceToSequenceModelSpec.get_target_vocabulary_size  r   r   tokensr[   Nc                 @    U R                   S   R                  U5        g)zVRegisters a source vocabulary of tokens.

Arguments:
  tokens: List of source tokens.
r.  Nr0  r`   rE   r;  s     r   register_source_vocabulary6SequenceToSequenceModelSpec.register_source_vocabulary       	8$++F3r   c                 @    U R                   S   R                  U5        g)zVRegisters a target vocabulary of tokens.

Arguments:
  tokens: List of target tokens.
r/  Nr=  r>  s     r   register_target_vocabulary6SequenceToSequenceModelSpec.register_target_vocabulary  rA  r   r   c                 (    U R                  US5        g)z^Registers a vocabulary mapping file.

Arguments:
  path: Path to the vocabulary mapping file.
zvmap.txtN)r   )rE   r   s     r   register_vocabulary_mapping7SequenceToSequenceModelSpec.register_vocabulary_mapping  s     	4,r   c           
      
  > [         TU ]  5         U R                  5       U R                  5       S.nUR	                  5        H  u  p#[        U[        5      (       d  U/nU R                  U   n[        U5      [        U5      :w  a#  [        SU[        U5      [        U5      4-  5      e[        [        XC5      5       H@  u  nu  pg[        U5      U:w  d  M  [        SUR                  5       U[        U5      U4-  5      e   M     g )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   rz   r6  r9  r*   r,   r(   r0  r   ry   r-   zip
capitalize)	rE   vocabulary_sizesr   sizesr  r3   r  expected_sizerI   s	           r   rz   $SequenceToSequenceModelSpec.validate   s     557557

 ,113KDeT**--d3L< CJ. YS.E
;<  3<C<T2U..Jz?m3$%??,aZ-PQ  3V 4r   r   c                 (  >^ [        [        U R                  5      5      n[        UR	                  5       5      m[        U4S jT 5       5      (       a  STS   0nUR                  5        H  u  p4[        USU-  U5        M     [        TU ]%  U5        g )Nc              3   2   >#    U  H  oTS    :H  v   M     g7f)r   Nr   ).0r  all_vocabulariess     r   	<genexpr>3SequenceToSequenceModelSpec.save.<locals>.<genexpr>  s     TCSZ-a00CSs   sharedr   z%s_vocabulary)
dictr  r0  r(   valuesallr*   _save_vocabularyrB   r   )rE   r   r  r   r;  rR  rI   s        @r   r    SequenceToSequenceModelSpec.save  s    1$2D2DEF 3 3 56TCSTTT$&6q&9:L(..0LDZ4)?H 1 	Z r   )r0  r   )rK   rL   rM   rN   r   r   r   abcabstractmethodr6  r9  r   rh   r?  rC  rF  rz   r   rO   rP   rQ   s   @r   r+  r+    s    =
/ 	$ $ 	$ $4c 4t 44c 4t 4- - -4!s !t ! !r   r+  c                   F   ^  \ rS rSrSr   SS\S\S\4U 4S jjjrSrU =r$ )	LanguageModelConfigi(  z"Configuration for language models.r  r  r   c                 .   > [         TU ]  " SUUUS.UD6  g)zInitializes 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   LanguageModelConfig.__init__+  s*     	 	
	
 		
r   r   )r'  r(  r)  )	rK   rL   rM   rN   r   rh   r   rO   rP   rQ   s   @r   r^  r^  (  s7    , !	

 
 	
 
r   r^  c                      ^  \ rS rSrSrU 4S jrS r\R                  S 5       r	S\
\   SS4S	 jrSU 4S
 jjrS\SS4U 4S jjrSrU =r$ )LanguageModelSpeciB  z'Base specification for language models.c                 0   > [         TU ]  5         / U l        g)z+Initializes a language model specification.N)rB   r   _vocabularyr1  s    r   r   LanguageModelSpec.__init__E  s    r   c                     [        5       $ r   )r^  r   s    r   r   $LanguageModelSpec.get_default_configJ  s    "$$r   c                     [        5       e)z2Returns the vocabulary size expected by the model.r   r   s    r   get_vocabulary_size%LanguageModelSpec.get_vocabulary_sizeM  r   r   r;  r[   Nc                 $    [        U5      U l        g)zJRegisters the vocabulary of tokens.

Arguments:
  tokens: List of tokens.
N)r(   rd  r>  s     r   register_vocabulary%LanguageModelSpec.register_vocabularyR  s      <r   c                    > [         TU ]  5         U R                  5       n[        U R                  5      U:w  a#  [        S[        U R                  5      U4-  5      eg )NzEVocabulary has size %d but the model expected a vocabulary of size %d)rB   rz   ri  r   rd  ry   )rE   expected_vocabulary_sizerI   s     r   rz   LanguageModelSpec.validateZ  s`    #'#;#;#= t $<<Wt''(*BCD  =r   r   c                 R   > [        USU R                  5        [        TU ]  U5        g )Nr  )rY  rd  rB   r   )rE   r   rI   s     r   r   LanguageModelSpec.saved  s#    \43C3CD 	Z r   )rd  r   )rK   rL   rM   rN   r   r   r   r[  r\  ri  r   rh   rl  rz   r   rO   rP   rQ   s   @r   rb  rb  B  s^    1
% 	$ $($s) ( (!s !t ! !r   rb  c                     [         R                  R                  U SU-  5      n[        USSS9 n[        R
                  " X$SS9  S S S 5        g ! , (       d  f       g = f)Nz%s.jsonr   r^   r   r   )r   )r   r   r!   r   r   r   )r   r   r;  vocabulary_pathvocabulary_files        r   rY  rY  l  sC    ggll:y4/?@O	osW	5		&!4 
6	5	5s   A
Ac                      \ rS rSrSr\\R                  S\\	   4S j5       5       r
S\4S jr\\R                  S\4S j5       5       rS\SS 4S jr\R                  S\R"                  4S	 j5       rS\4S
 jr\R                  S\	4S j5       r\R                  S\4S j5       r\R                  S\SS 4S j5       r\R                  S\4S j5       rSrg)r   is  z(Abstract base class for model variables.r[   c                     [        5       er   r   r   s    r   r   Variable.shapev  r   r   c                 2    [        U R                  5      S:H  $ r   )r   r   r   s    r   r   Variable.is_scalar{  s    4::!##r   c                     [        5       er   r   r   s    r   r_   Variable.dtype~  r   r   r_   c                 F    XR                   :X  a  U $ U R                  U5      $ r   )r_   _torE   r_   s     r   r   Variable.to  s    JJKxxr   c                     [        5       er   r   r   s    r   r   Variable.numpy      !##r   c                 ^    [        U 5      [        U5      L =(       a    U R                  U5      $ r   )rf   _equalrE   others     r   r   Variable.equal  s#    DzT%[(?T[[-??r   c                     [        5       er   r   r   s    r   r  Variable.num_bytes  r  r   c                     [        5       er   r   r   s    r   r  Variable.to_bytes  r  r   c                     [        5       er   r   r  s     r   r~  Variable._to  r  r   c                     [        5       er   r   r  s     r   r  Variable._equal  r  r   r   N)rK   rL   rM   rN   r   r  r[  r\  r   r:   r   rg   r   rh   r_   r   ra   rb   r   r   r  bytesr  r~  r  rO   r   r   r   r   r   s  s6   2$tCy $  $$4 $ $s $  $ 
 
 	$rzz $ $@d @ 	$3 $ $ 	$% $ $ 	$ $ $ $ 	$t $ $r   r   c                       \ rS rSrSrS r\S\\   4S j5       r	\S\
4S j5       rS\R                  4S jrS\4S jrS\4S	 jrS
\
S\4S jrS\4S jrSrg)rm   i  z Model variable as a Numpy array.c                     Xl         g r   array)rE   r  s     r   r   NumpyVariable.__init__  s    
r   r[   c                 .    U R                   R                  $ r   )r  r   r   s    r   r   NumpyVariable.shape  s    zzr   c                 B    U R                   R                  R                  $ r   )r  r_   r   r   s    r   r_   NumpyVariable.dtype  s    zz$$$r   c                     U R                   $ r   r  r   s    r   r   NumpyVariable.numpy  s    zzr   c                 .    U R                   R                  $ r   )r  nbytesr   s    r   r  NumpyVariable.num_bytes  s    zz   r   c                 6    U R                   R                  5       $ r   )r  tobytesr   s    r   r  NumpyVariable.to_bytes  s    zz!!##r   r_   c                    US:X  aD  [         (       d  [        S5      e[        R                  U R                  5      R                  U5      $ [        R                  " U5      nU R                  R                  U5      U l        U $ )Nr   z5Converting to bfloat16 requires torch to be installed)	rn   r   rq   
from_numpyr  r   ra   r_   rd   r  s     r   r~  NumpyVariable._to  sj    J%%"K  #--djj9<<UCCZZ&&u-
r   c                 >   U R                   nUR                   nX#L =(       d|    UR                  UR                  :H  =(       a\    UR                  UR                  :H  =(       a<    UR                  S   UR                  S   :H  =(       a    [        R
                  " X#5      $ r   )r  r_   r   flatra   array_equalrE   r  abs       r   r  NumpyVariable._equal  sx    JJKKv 
GGqww %177"%q	QVVAY&% q$		
r   r  N)rK   rL   rM   rN   r   r   r  r   r:   r   rh   r_   ra   rb   r   r  r  r  r   r~  rg   r  rO   r   r   r   rm   rm     s    *  tCy     %s % %rzz !3 !$% $
 
 

t 
r   rm   c                       \ rS rSrSrS r\S 5       r\S\	\
   4S j5       r\S\4S j5       rS\R                  4S jrS\
4S	 jrS\4S
 jrS\S\4S jrS\4S jrSrg)rq   i  z#Model variable as a PyTorch tensor.c                     [        U[        R                  R                  5      (       a  UR                  nUR                  5       U l        g r   )r,   ro   nn	Parameterdata
contiguoustensor)rE   r  s     r   r   PyTorchVariable.__init__  s2    fehh0011[[F'')r   c                 >    [         R                  " U5      nU " U5      $ r   )ro   r  )clsr  r  s      r   r  PyTorchVariable.from_numpy  s    !!%(6{r   r[   c                 @    [        U R                  R                  5      $ r   )r(   r  r   r   s    r   r   PyTorchVariable.shape  s    DKK%%&&r   c                 `    [        U R                  R                  5      R                  SS5      $ )Nztorch.r   )rh   r  r_   replacer   s    r   r_   PyTorchVariable.dtype  s$    4;;$$%--h;;r   c                 R    U R                   R                  5       R                  5       $ r   )r  detachr   r   s    r   r   PyTorchVariable.numpy  s    {{!!#))++r   c                 l    U R                   R                  5       U R                   R                  5       -  $ r   )r  numelelement_sizer   s    r   r  PyTorchVariable.num_bytes  s'    {{  "T[[%=%=%???r   c                     SnU R                  5       nSnSnUS:  aO  X!:  a  UOUn[        R                  " U R                  R	                  5       U-   U5      nX6-  nXE-  nX%-  nUS:  a  MO  U$ )Nir   r   )r  ctypes	string_atr  data_ptr)rE   max_sizer  outputoffset
chunk_sizechunks          r   r  PyTorchVariable.to_bytes  s{    NN$	!m%.%9yJ$$T[[%9%9%;f%DjQEOF F#I !m r   r_   c                 f    [        [        U5      nU R                  R                  U5      U l        U $ r   )r7   ro   r  r   r  s     r   r~  PyTorchVariable._to  s'    u%kknnU+r   c                     U R                   nUR                   nX#L =(       d6    UR                  UR                  :H  =(       a    [        R                  " X#5      $ r   )r  r_   ro   r   r  s       r   r  PyTorchVariable._equal  s<    KKLLvC!''QWW,BQ1BCr   )r  N)rK   rL   rM   rN   r   r   classmethodr  r  r   r:   r   rh   r_   ra   rb   r   r  r  r  r   r~  rg   r  rO   r   r   r   rq   rq     s    -*   'tCy ' ' <s < <,rzz ,@3 @%   
Dt Dr   rq   )r   )*r   r[  r  r   r   r   r  typingr   r   r   r   ra   ro   rn   ImportErrorri   r  r   r   r   r   r$   r.   r=   rf   r?   rS   r/   r   r   r   r  r  r+  r^  rb  rY  ABCr   rm   rq   r   r   r   <module>r     s8  
    	   ' '   	  T #!6
 ( (s
j sl	
$*
 $>[-	 [-|5#
K #
LU!) U!p
+ 
4'!	 '!T5*$sww *$Z+
H +
\1Dh 1Ds  s   C C)(C)