
    Iuia                        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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jL                        Z' G d' d(e'      Z( G d) d*e'      Z)y# e$ r dZY w xY w),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     N/opt/pipecat/venv/lib/python3.12/site-packages/ctranslate2/specs/model_spec.py_join_scoper   )   s    T""    c                 $    | j                  d      S r   )splitr   s    r   _split_scoper   /   s    ;;sr   c                 R    t        |       }|d d |d   }} dj                  |       |fS )Nr   )r   join)r   keysattrs      r   _parent_scoper$   3   s2    Ds)T"X4E88E?D  r   c                 z   t        | j                  j                               D ]  \  }}|j                  d      rt	        |t               r1t        |      D ]"  \  }}t        ||t        |d||fz               $ Yt	        |t              rt        ||t        ||              || t        ||      |        y)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 	6e??3eT"$U+ T44;ugq	>Q+RSTy)ubE4(@At[-u5	6r   c                     |s| S t        |      }|D ]  }	 t        | |      }  | S # t        $ r0 |j                  dd      \  }}t        | |      t	        |         } Y Lw xY w)Nr&      )r   getattrAttributeErrorrsplitint)r0   indexr"   keyr#   s        r   
index_specr=   G   su    D 3	34%D3 K  	3**S!,KD%4&s5z2D	3s   &6AAc                        e Zd Z fdZ xZS )
FrozenMetac                 4    t        |   |i |}d|_        |S )NT)super__call___frozen)selfargskwargsinstance	__class__s       r   rB   zFrozenMeta.__call__U   s$    7#T4V4r   )__name__
__module____qualname__rB   __classcell__rH   s   @r   r?   r?   T   s     r   r?   c                        e Zd Z fdZ xZS )
FrozenAttrc                 r    t        | d      rt        | |      st        d|z        t        |   ||       y )NrC   zAttribute %s does not exist)hasattrr8   rA   __setattr__)rD   r<   r2   rH   s      r   rR   zFrozenAttr.__setattr__\   s6    4#GD#,> !>!DEEC'r   )rI   rJ   rK   rR   rL   rM   s   @r   rO   rO   [   s    ( (r   rO   c            	       z    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y)r/   zPA layer specification declares the weights that should be set by the converters.returnNc                 t    g fd}| j                  |       rt        ddj                        z        y)zVerify that the required weights are set.

        Raises:
          ValueError: If a required weight is not set in the specification.
        c                 V   |j                  |       y t        |t        j                        r=|j                  t        j
                  k(  r|j                  t        j                        }nt        |t              r%t        j                  d      j                  |      }nt        |t              r%t        j                  d      j                  |      }nMt        |t              r=|t        k7  r4t        j                  |j                  d      t        j                        }t        |t        j                        st        |t        j                         rt#        |      }n+t$        r%t        |t&        j(                        rt+        |      }t-        |      d   }t/        | ||       y )Nr   r   utf-8)dtyper    )appendr,   npndarrayrX   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   _checkz"LayerSpec.validate.<locals>._checkm   s   } ''-%,;;"**,!LL4EE5)+007E4((--e4E3'H$MM%,,w*?rwwOE%,
5"**0M%e,#
5%,,(G'.$T*2.ID)U+r   z/Some required model attributes are not set:

%s
N)_visit
ValueErrorr!   )rD   rn   rm   s     @r   validatezLayerSpec.validatee   sH     	,4 	FC)),-.  r   prefixorderedc                     i fd}| j                  |       |r%t        t        j                         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                 X    t        |t              r
|t        k(  ry |t        |      <   y N)r,   ra   rb   r   )r0   r   r2   rs   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<   )rp   r(   sortedr*   )rD   rs   rt   ry   rx   s    `  @r   	variableszLayerSpec.variables   s=     	3
 	M"syy{?@@
r   c                    | j                  d      }t        |      D ]j  \  }}|D ]`  \  }}||k(  r t        |      \  }}|j                         r,|j	                  |      s>|t
        vsGt        | |      }t        |||        j l y)z4Find duplicate variables in spec and create aliases.Trt   N)r   reversedr$   	is_scalarequalSKIP_CREATING_ALIASr=   rk   )	rD   r   r   r2   
other_nameother_valuer   rl   r0   s	            r   _alias_variableszLayerSpec._alias_variables   s     NN4N0	#I. 	KD%+4 '
K:% $1#6 y)K0!)<< &dE2DD)Z8	r   c                     +t         vr#t        ddj                  t                     fd}| j                  |       y)z-Possibly quantizes the variable of the layer.Nz7 is not a valid quantization type. Accepted types are: , c                 
   t        |t              r|j                         ry t        |      d   }d }t	        | d|z        }|j
                  dv }|rN	dk(  r|j                  d      j                         }t        j                  dt        j                  t        j                  |            z        }||z  }t        j                  |      }t        j                  |t        j                  t        j                        j                   t        j                  t        j                        j"                        }|j%                  t        j                        }t'        |      }t'        |      }np	dv r|j                  d      j                         }d }t)        |j*                        dk(  r+|j*                  }|j-                  |j*                  d	   d      }t        j                  t        j                  |      d
      }d||d	k(  <   d|z  }|t        j.                  |d
      z  }t        j                  |      }|j%                  t        j0                        }|r|j-                  |      }t'        |      }t'        |      }nY	dv rU|j                  	      }nC|rA	dv r|j                  d      }n+	dv r|j                  d      }n	dv r|j                  d      }t3        | ||       |t3        | d|z  |       y y )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   rQ   rX   tonumpyrZ   r   amaxabsoluterintclipiinfor   minmaxr]   rf   lenshapereshapeexpand_dimsr   rk   )
r0   r   r2   r<   scaleis_quantizableis_convertible	old_shaper   quantizations
            r   	_quantizez&LayerSpec._quantize.<locals>._quantize   s{   eX.%//2Ct$R(CE$T:+;<N"[[,NNN7*!HHY/557E JJurwwr{{57I/J'JKEUNE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D#u% j3.6 !r   )ACCEPTED_MODEL_TYPESrq   r!   rp   )rD   r   r   s    ` r   r   zLayerSpec._quantize   sG    #<P(P+?!@B 
;	7z 	Ir   r   c                 F    | j                          | j                  |       y)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   )rD   r   s     r   optimizezLayerSpec.optimize  s     	|$r   c                     t        | |       y)z/Recursively visits this layer and its children.N)r.   )rD   r1   s     r   rp   zLayerSpec._visit  s    4r   rT   N) Frw   )rI   rJ   rK   __doc__rr   ra   r`   r   rZ   r[   r   r   r   r   r   rp   r   r   r   r/   r/   b   si    Z(X   
c2::o		4,EN%Xc] %d %r   r/   )	metaclassc                     d}	 |j                  |       S # t        $ r  t        | ddj                  |            w xY w)N)r   r   r   int32r   r   z% is not in list of supported dtypes: r   )r;   rq   r!   )object_dtypedtypess     r   _dtype_to_type_idr     sJ    IF
||L)) 
TYYv.0
 	

s    )>c                   (    e Zd ZdZd Zd Zd Zd Zy)ModelConfigz$Base class for model configurations.c                 N    |j                         D ]  \  }}t        | ||        y)z7Initializes the configuration with a set of parameters.N)r*   rk   )rD   rF   r<   r2   s       r   __init__zModelConfig.__init__'  s'     ,,. 	&JCD#u%	&r   c                     | j                   j                         D ci c]  \  }}|j                  d      s|| c}}S c c}}w )z*Returns the configuration as a dictionary.r&   )r)   r*   r+   rD   r<   r2   s      r   to_dictzModelConfig.to_dict,  sE     #mm113
U>>#& J
 	
 
s   A c                 "    || j                   |<   y rw   )r)   r   s      r   add_attributezModelConfig.add_attribute4  s    "cr   c                     t        |dd      5 }t        j                  | j                         |dd       |j	                  d       ddd       y# 1 sw Y   yxY w)	z'Saves the configuration as a JSON file.wrW   encoding   T)indent	sort_keysro   N)openjsondumpr   write)rD   pathconfig_files      r   save_as_jsonzModelConfig.save_as_json7  sS    $g. 	$+II	 d#	$ 	$ 	$s   9AAN)rI   rJ   rK   r   r   r   r   r   r   r   r   r   r   $  s    .&

#	$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y)	ModelSpecz"The top level layer specification.c                 <    | j                         | _        i | _        y)z$Initializes the model specification.N)get_default_config_config_filesrD   s    r   r   zModelSpec.__init__F  s    ..0r   c                     t               )z$The name of the model specification.NotImplementedErrorr   s    r   r   zModelSpec.nameK       "##r   c                      y)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   revisionzModelSpec.revisionP  s     r   c                     | j                   S )zThe model configuration.)r   r   s    r   configzModelSpec.configY  s     ||r   c                      y)z5Returns the default configuration used by this model.Nr   r   s    r   r   zModelSpec.get_default_config^  s    r   Nr   filenamerT   c                     t         j                  j                  |      st        d|z        |t         j                  j	                  |      }|| j
                  v rt        d|z        || j
                  |<   y)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   isfilerq   basenamer   )rD   r   r   s      r   register_filezModelSpec.register_fileb  sh    ww~~d#5<==ww''-Ht{{"IHTUU $Hr   
output_dirc                    | j                  t        j                  j                  |d             | j                  9| j                  j                  t        j                  j                  |d             | j                  j                         D ]h  \  }}t        j                  j                  ||      }t        j                  j                  |      rt        d|z        t        j                  ||       j y)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)rD   r   r   r   destinations        r   savezModelSpec.savel  s     	Z=><<#LL%%bggll:}&MN"kk//1 	+NHd'',,z8<Kww~~k*"CkQ  KKk*	+r   c           
         g }g }| j                  d      D ]8  }t        |d   t              r|j                  |       (|j                  |       : t	        |d      5 fd}j                  t        j                  dt                      || j                         j                  t        j                  d| j                               j                  t        j                  dt        |                   |D ]  \  }} ||       j                  t        j                  dt        |j                                     |j                  D ]'  }j                  t        j                  d|             ) j                  t        j                  dt        |j                                     j                  t        j                  d|j                                      j                  |j!                                	 j                  t        j                  dt        |                   |D ]  \  }	}
 ||	        ||
        	 ddd       y# 1 sw Y   yxY w)	zSerializes the model variables.Tr   r6   wbc                     j                  t        j                  dt        |       dz                j                  | j	                  d             j                  t        j                  dd             y )NHr6   rW   Br   )r   structpackr   rd   )stringmodels    r   _write_stringz+ModelSpec._serialize.<locals>._write_string  sN    FKKS[1_=>FMM'23FKKQ/0r   Ir   N)r   r,   ra   rY   r   r   r   r   CURRENT_BINARY_VERSIONr   r   r   r   r   rX   	num_bytesto_bytes)rD   r   r   aliasesvariabler   r   r2   dimaliasvariable_namer   s              @r   r   zModelSpec._serialize~  s   	t4 	+H(1+s+x(  *		+ $ 	-1
 KKC)?@A$))$KKC78KKCY89( .ed#FKKS-=>? ;; 7CKKC 567FKK->u{{-KLMFKKU__->?@ENN,-. KKCW67(/ -$}e$m,-)	- 	- 	-s   G2II$rw   )rI   rJ   rK   r   r   propertyr   r   r   r   ra   r   r   r   r   r   r   r   r   r   C  s    ,
 $ $    %# %# %$ %+s +t +$ -r   r   c              #      K   | j                         D ]>  \  }}t        |      dk(  r
||d   f t        |      D ]  \  }}d||dz   fz  |f  @ y w)Nr6   r   r'   )r*   r   r-   )vocabulariesr   
vocabularyr3   vocabs        r   _flatten_vocabulariesr     sn     (..0 5jz?a
1%%%j1 55q1u-u445	5s   AAc                   P     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_token	bos_token	eos_tokendecoder_start_tokenadd_source_bosadd_source_eosc           
      2    t        |   d||||||d| y)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   rA   r   )	rD   r   r  r  r  r  r  rF   rH   s	           r   r   z&SequenceToSequenceModelConfig.__init__  s3    0 	 	
 3))	
 	
r   )<unk><s></s>r	  FF)	rI   rJ   rK   r   ra   r   r`   r   rL   rM   s   @r   r   r     sb    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                 6    t         |           g g d| _        y)z7Initializes a sequence to sequence model specification.sourcetargetN)rA   r   _vocabulariesrD   rH   s    r   r   z$SequenceToSequenceModelSpec.__init__  s    
r   c                     t               S rw   )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   tokensrT   Nc                 @    | j                   d   j                  |       y)znRegisters a source vocabulary of tokens.

        Arguments:
          tokens: List of source tokens.
        r  Nr  rY   rD   r  s     r   register_source_vocabularyz6SequenceToSequenceModelSpec.register_source_vocabulary       	8$++F3r   c                 @    | j                   d   j                  |       y)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                 (    | j                  |d       y)zvRegisters a vocabulary mapping file.

        Arguments:
          path: Path to the vocabulary mapping file.
        zvmap.txtN)r   )rD   r   s     r   register_vocabulary_mappingz7SequenceToSequenceModelSpec.register_vocabulary_mapping  s     	4,r   c           
         t         |           | j                         | j                         d}|j	                         D ]  \  }}t        |t              s|g}| j                  |   }t        |      t        |      k7  r#t        d|t        |      t        |      fz        t        t        ||            D ]?  \  }\  }}t        |      |k7  st        d|j                         |t        |      |fz          y )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)rA   rr   r  r  r*   r,   r(   r  r   rq   r-   zip
capitalize)	rD   vocabulary_sizesr   sizesr   r3   r   expected_sizerH   s	           r   rr   z$SequenceToSequenceModelSpec.validate   s
    557557

 ,113 	KD%eT*--d3L< CJ. YS.E
;<  3<Ce<T2U ..Jz?m3$%??,aZ-PQ 	r   r   c                    t        t        | j                              }t        |j	                               t        fdD              rdd   i}|j                         D ]  \  }}t        |d|z  |        t        | %  |       y )Nc              3   .   K   | ]  }|d    k(    yw)r   Nr   ).0r   all_vocabulariess     r   	<genexpr>z3SequenceToSequenceModelSpec.save.<locals>.<genexpr>  s     TZz-a00Ts   sharedr   z%s_vocabulary)
dictr   r  r(   valuesallr*   _save_vocabularyrA   r   )rD   r   r   r   r  r+  rH   s        @r   r   z SequenceToSequenceModelSpec.save  s    1$2D2DEF 3 3 56TCSTT$&6q&9:L(..0 	ILD&Z4)?H	I 	Z r   r   )rI   rJ   rK   r   r   r   abcabstractmethodr  r  r   ra   r  r  r!  rr   r   rL   rM   s   @r   r  r    s    =
/ 	$ $ 	$ $4c 4t 44c 4t 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  c                 ,    t        |   d|||d| y)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  )rD   r   r  r  rF   rH   s        r   r   zLanguageModelConfig.__init__+  s*     	 	
	
 		
r   )r  r	  r
  )rI   rJ   rK   r   ra   r   rL   rM   s   @r   r5  r5  (  s7    , !	

 
 	
 
r   r5  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                 0    t         |           g | _        y)z+Initializes a language model specification.N)rA   r   _vocabularyr  s    r   r   zLanguageModelSpec.__init__E  s    r   c                     t               S rw   )r5  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  rT   Nc                 $    t        |      | _        y)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         |           | j                         }t        | j                        |k7  r#t        dt        | j                        |fz        y )NzEVocabulary has size %d but the model expected a vocabulary of size %d)rA   rr   r=  r   r:  rq   )rD   expected_vocabulary_sizerH   s     r   rr   zLanguageModelSpec.validateZ  s`    #'#;#;#= t $<<Wt''(*BCD  =r   r   c                 R    t        |d| j                         t        |   |       y )Nr   )r1  r:  rA   r   )rD   r   rH   s     r   r   zLanguageModelSpec.saved  s#    \43C3CD 	Z r   r   )rI   rJ   rK   r   r   r   r2  r3  r=  r   ra   r?  rr   r   rL   rM   s   @r   r8  r8  B  s^    1
% 	$ $($s) ( (!s !t ! !r   r8  c                     t         j                  j                  | d|z        }t        |dd      5 }t	        j
                  ||d       d d d        y # 1 sw Y   y xY w)Nz%s.jsonr   rW   r   r   )r   )r   r   r!   r   r   r   )r   r   r  vocabulary_pathvocabulary_files        r   r1  r1  l  sN    ggll:y4/?@O	osW	5 5		&/!45 5 5s   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y)r   z(Abstract base class for model variables.rT   c                     t               rw   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               rw   r   r   s    r   rX   zVariable.dtype~  r   r   rX   c                 F    || j                   k(  r| S | j                  |      S rw   )rX   _torD   rX   s     r   r   zVariable.to  s!    DJJKxxr   c                     t               rw   r   r   s    r   r   zVariable.numpy      !##r   c                 T    t        |       t        |      u xr | j                  |      S rw   )r_   _equalrD   others     r   r   zVariable.equal  s#    DzT%[(?T[[-??r   c                     t               rw   r   r   s    r   r   zVariable.num_bytes  rN  r   c                     t               rw   r   r   s    r   r   zVariable.to_bytes  rN  r   c                     t               rw   r   rL  s     r   rK  zVariable._to  rN  r   c                     t               rw   r   rQ  s     r   rP  zVariable._equal  rN  r   N)rI   rJ   rK   r   r   r2  r3  r   r:   r   r`   r   ra   rX   r   rZ   r[   r   r   r   bytesr   rK  rP  r   r   r   r   r   s  s6   2$tCy $  $$4 $ $s $  $ 
 
 	$rzz $ $@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y)rf   z Model variable as a Numpy array.c                     || _         y rw   array)rD   r[  s     r   r   zNumpyVariable.__init__  s	    
r   rT   c                 .    | j                   j                  S rw   )r[  r   r   s    r   r   zNumpyVariable.shape  s    zzr   c                 B    | j                   j                  j                  S rw   )r[  rX   r   r   s    r   rX   zNumpyVariable.dtype  s    zz$$$r   c                     | j                   S rw   rZ  r   s    r   r   zNumpyVariable.numpy  s    zzr   c                 .    | j                   j                  S rw   )r[  nbytesr   s    r   r   zNumpyVariable.num_bytes  s    zz   r   c                 6    | j                   j                         S rw   )r[  tobytesr   s    r   r   zNumpyVariable.to_bytes  s    zz!!##r   rX   c                     |dk(  r?t         st        d      t        j                  | j                        j                  |      S t        j                  |      }| j                  j                  |      | _        | S )Nr   z5Converting to bfloat16 requires torch to be installed)	rg   r   rj   
from_numpyr[  r   rZ   rX   r]   rL  s     r   rK  zNumpyVariable._to  sg    J%"K  #--djj9<<UCCZZ&&u-
r   c                    | j                   }|j                   }||u xsm |j                  |j                  k(  xrR |j                  |j                  k(  xr7 |j                  d   |j                  d   k(  xr t	        j
                  ||      S r{   )r[  rX   r   flatrZ   array_equalrD   rR  abs       r   rP  zNumpyVariable._equal  s|    JJKKAv 
GGqww %177"%q	QVVAY&% q!$		
r   N)rI   rJ   rK   r   r   r   r   r:   r   ra   rX   rZ   r[   r   r   rW  r   r   rK  r`   rP  r   r   r   rf   rf     s    *  tCy     %s % %rzz !3 !$% $
 
 

t 
r   rf   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y)rj   z#Model variable as a PyTorch tensor.c                     t        |t        j                  j                        r|j                  }|j                         | _        y rw   )r,   rh   nn	Parameterdata
contiguoustensor)rD   rq  s     r   r   zPyTorchVariable.__init__  s/    fehh001[[F'')r   c                 <    t        j                  |      } | |      S rw   )rh   rd  )clsr[  rq  s      r   rd  zPyTorchVariable.from_numpy  s    !!%(6{r   rT   c                 @    t        | j                  j                        S rw   )r(   rq  r   r   s    r   r   zPyTorchVariable.shape  s    DKK%%&&r   c                 `    t        | j                  j                        j                  dd      S )Nztorch.r   )ra   rq  rX   replacer   s    r   rX   zPyTorchVariable.dtype  s$    4;;$$%--h;;r   c                 R    | j                   j                         j                         S rw   )rq  detachr   r   s    r   r   zPyTorchVariable.numpy  s    {{!!#))++r   c                 l    | j                   j                         | j                   j                         z  S rw   )rq  numelelement_sizer   s    r   r   zPyTorchVariable.num_bytes  s'    {{  "T[[%=%=%???r   c                     d}| j                         }d}d}|dkD  rO||kD  r|n|}t        j                  | j                  j	                         |z   |      }||z  }||z  }||z  }|dkD  rO|S )Nir   r   )r   ctypes	string_atrq  data_ptr)rD   max_sizer   outputoffset
chunk_sizechunks          r   r   zPyTorchVariable.to_bytes  s    NN$	!m%.%9yJ$$T[[%9%9%;f%DjQEeOFj F#I !m r   rX   c                 f    t        t        |      }| j                  j                  |      | _        | S rw   )r7   rh   rq  r   rL  s     r   rK  zPyTorchVariable._to  s'    u%kknnU+r   c                     | j                   }|j                   }||u xs1 |j                  |j                  k(  xr t        j                  ||      S rw   )rq  rX   rh   r   rh  s       r   rP  zPyTorchVariable._equal  s@    KKLLAvC!''QWW,BQ1BCr   N)rI   rJ   rK   r   r   classmethodrd  r   r   r:   r   ra   rX   rZ   r[   r   r   rW  r   r   rK  r`   rP  r   r   r   rj   rj     s    -*   'tCy ' ' <s < <,rzz ,@3 @%   
Dt Dr   rj   )r   )*r   r2  r}  r   r   r   r   typingr   r   r   r   rZ   rh   rg   ImportErrorrb   r   r   r   r   r   r$   r.   r=   r_   r?   rO   r/   r   r   r   r   r   r  r5  r8  r1  ABCr   rf   rj   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-