
    eThY                        S SK r S SKrS SKJr  S SKJr  S SKJr  SSK	J
r
  SSKJr  \" \5      rSr " S S5      r " S	 S
5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S \5      r " S! S"\5      rg)#    N)sparse   )add_start_docstrings)
get_loggerad  
    Args:
        input_ids (`jnp.ndarray` of shape `(batch_size, sequence_length)`):
            Indices of input sequence tokens in the vocabulary.

            Indices can be obtained using [`PreTrainedTokenizer`]. See [`PreTrainedTokenizer.encode`] and
            [`PreTrainedTokenizer.__call__`] for details.

            [What are input IDs?](../glossary#input-ids)
        scores (`jnp.ndarray` of shape `(batch_size, config.vocab_size)`):
            Prediction scores of a language modeling head. These can be logits for each vocabulary when not using beam
            search or log softmax for each vocabulary token when using beam search
        kwargs (`Dict[str, Any]`, *optional*):
            Additional logits processor specific kwargs.

    Return:
        `jnp.ndarray` of shape `(batch_size, config.vocab_size)`: The processed prediction scores.

c                       \ rS rSrSr\" \5      S\R                  S\R                  S\R                  4S j5       r	Sr
g)	FlaxLogitsProcessor3   zSAbstract base class for all logit processors that can be applied during generation.	input_idsscoresreturnc                 2    [        U R                   S35      e)z"Flax method for processing logits.H is an abstract class. Only classes inheriting this class can be called.NotImplementedError	__class__selfr
   r   s      c/var/www/auris/envauris/lib/python3.13/site-packages/transformers/generation/flax_logits_process.py__call__FlaxLogitsProcessor.__call__6   !     "~~fg
 	
     N__name__
__module____qualname____firstlineno____doc__r   !LOGITS_PROCESSOR_INPUTS_DOCSTRINGjnpndarrayr   __static_attributes__r   r   r   r   r   3   s>    ];<
#++ 
s{{ 
s{{ 
 =
r   r   c                       \ rS rSrSr\" \5      S\R                  S\R                  S\R                  4S j5       r	Sr
g)	FlaxLogitsWarper>   zjAbstract base class for all logit warpers that can be applied during generation with multinomial sampling.r
   r   r   c                 2    [        U R                   S35      e)zFlax method for warping logits.r   r   r   s      r   r   FlaxLogitsWarper.__call__A   r   r   r   Nr   r   r   r   r%   r%   >   s>    t;<
#++ 
s{{ 
s{{ 
 =
r   r%   c            	           \ rS rSrSr\" \5      S\R                  S\R                  S\	S\R                  4S j5       r
Srg	)
FlaxLogitsProcessorListI   a  
This class can be used to create a list of [`FlaxLogitsProcessor`] or [`FlaxLogitsWarper`] to subsequently process
a `scores` input tensor. This class inherits from list and adds a specific *__call__* method to apply each
[`FlaxLogitsProcessor`] or [`FlaxLogitsWarper`] to the inputs.
r
   r   cur_lenr   c                   ^ U  H  n[         R                  " UR                  5      R                  n[	        U5      S:  as  [        U4S j[        UR                  5       5      SS   5       5      (       d3  [        S[        UR                  5       5       SUR                   S35      eU" XU40 TD6nM  U" XU5      nM     U$ )N   c              3   ,   >#    U  H	  oT;   v   M     g 7fNr   ).0argkwargss     r   	<genexpr>3FlaxLogitsProcessorList.__call__.<locals>.<genexpr>U   s     S4RS&=4Rs   r   z,Make sure that all the required parameters: z for z$ are passed to the logits processor.)
inspect	signaturer   
parameterslenalllistkeys
ValueErrorr   )r   r
   r   r,   r3   	processorfunction_argss       `  r   r    FlaxLogitsProcessorList.__call__P   s    I#--i.@.@ALLM=!A%SD9K9K9M4Nqr4RSSS$FtML^L^L`GaFbbg$..//SU  #9gHH"9g>  r   r   N)r   r   r   r   r   r   r    r!   r"   intr   r#   r   r   r   r*   r*   I   sL     ;<#++ s{{ S _b_j_j  =r   r*   c                   |    \ rS rSrSrS\4S jrS\R                  S\R                  S\	S\R                  4S	 jr
S
rg)FlaxTemperatureLogitsWarper`   z
[`FlaxLogitsWarper`] for temperature (exponential scaling output probability distribution).

Args:
    temperature (`float`):
        The value used to module the logits distribution.
temperaturec                 b    [        U[        5      (       a  US:  d  [        SU 35      eXl        g )Nr   z:`temperature` has to be a strictly positive float, but is )
isinstancefloatr=   rE   )r   rE   s     r   __init__$FlaxTemperatureLogitsWarper.__init__i   s0    +u--kAoYZeYfghh&r   r
   r   r,   r   c                 "    X R                   -  nU$ r0   rE   r   r
   r   r,   s       r   r   $FlaxTemperatureLogitsWarper.__call__o   s    ***r   rL   N)r   r   r   r   r   rH   rI   r!   r"   rA   r   r#   r   r   r   rC   rC   `   sC    'E '#++ s{{ S UXU`U` r   rC   c                       \ rS rSrSr\" S5      * S4S\S\S\4S jjrS	\R                  S
\R                  S\S\R                  4S jr
Srg)FlaxTopPLogitsWarpert   a  
[`FlaxLogitsWarper`] that performs top-p, i.e. restricting to top tokens summing to prob_cut_off <= prob_cut_off.

Args:
    top_p (`float`):
        If set to < 1, only the smallest set of most probable tokens with probabilities that add up to `top_p` or
        higher are kept for generation.
    filter_value (`float`, *optional*, defaults to -inf):
        All filtered values will be set to this float value.
    min_tokens_to_keep (`int`, *optional*, defaults to 1):
        Minimum number of tokens that cannot be filtered.
Inf   top_pfilter_valuemin_tokens_to_keepc                     [        U[        5      (       a  US:  d  US:  a  [        SU 35      e[        U[        5      (       a  US:  a  [        SU 35      eXl        X l        X0l        g )Nr   g      ?z.`top_p` has to be a float > 0 and < 1, but is rS   z:`min_tokens_to_keep` has to be a positive integer, but is )rG   rH   r=   rA   rT   rU   rV   )r   rT   rU   rV   s       r   rI   FlaxTopPLogitsWarper.__init__   sj    %''EAIMeWUVV,c227IA7MYZlYmnoo
("4r   r
   r   r,   r   c                 F   [         R                  " X"R                  S   5      u  pE[        R                  " X R
                  5      n[        R                  R                  USS9R                  SS9nXpR                  :  n[        R                  " US5      nXR                  S S 2S4   R                  S5      -  nUR                  S S 2S U R                  24   R                  S5      n[        R                  " XU5      n	[        R                   R!                  XY5      S   n
U
$ )NaxisrS   r   T)laxtop_kshaper!   	full_likerU   jaxnnsoftmaxcumsumrT   rollatsetrV   wheresort_key_val)r   r
   r   r,   topk_scorestopk_indicesmask_scorescumulative_probs
score_masktopk_next_scoresnext_scoress              r   r   FlaxTopPLogitsWarper.__call__   s    $'IIfll26F$G!mmF,=,=>66>>+B>?FFBFO%

2
 XXj!,
mmAqD)--d33
  ]]1&?(?(?&?#?@DDTJ
99ZkJgg**<J2Nr   )rU   rV   rT   Nr   r   r   r   r   rH   rA   rI   r!   r"   r   r#   r   r   r   rP   rP   t   sa     =B%L=de 5e 55 5^a 5#++ s{{ S UXU`U` r   rP   c                       \ rS rSrSr\" S5      * S4S\S\S\4S jjrS	\R                  S
\R                  S\S\R                  4S jr
Srg)FlaxTopKLogitsWarper   a  
[`FlaxLogitsWarper`] that performs top-k, i.e. restricting to the k highest probability elements.

Args:
    top_k (`int`):
        The number of highest probability vocabulary tokens to keep for top-k-filtering.
    filter_value (`float`, *optional*, defaults to -inf):
        All filtered values will be set to this float value.
    min_tokens_to_keep (`int`, *optional*, defaults to 1):
        Minimum number of tokens that cannot be filtered.
rR   rS   r^   rU   rV   c                     [        U[        5      (       a  US::  a  [        SU 35      e[        X5      U l        X l        g )Nr   z6`top_k` has to be a strictly positive integer, but is )rG   rA   r=   maxr^   rU   )r   r^   rU   rV   s       r   rI   FlaxTopKLogitsWarper.__init__   s<    %%%!UV[U\]^^3
(r   r
   r   r,   r   c                 
   UR                   u  pE[        R                  " XE-  U R                  5      n[	        U R
                  UR                   S   5      n[        R
                  " X'5      u  p[        R                  " [        R                  " U5      U-  S S 2S 4   XG45      R                  5       n
UR                  5       nU	R                  5       U
-   nUR                  U   R                  U5      nUR                  XE5      nU$ )NrZ   )r_   r!   fullrU   minr^   r]   broadcast_toarangeflattenrf   rg   reshape)r   r
   r   r,   
batch_size
vocab_sizenext_scores_flattopkrj   rk   shifttopk_scores_flattopk_indices_flatrp   s                 r   r   FlaxTopKLogitsWarper.__call__   s    !'
88J$;T=N=NO4::v||B/0$'IIf$;!  #**Z"8:"Eq$w!OR\Qcdlln&..0(002U:+../@AEEFVW&..zFr   )rU   r^   Nrr   r   r   r   rt   rt      sa    
 ;@,bc )c ) )\_ )#++ s{{ S UXU`U` r   rt   c                   |    \ rS rSrSrS\4S jrS\R                  S\R                  S\S\R                  4S	 jr	S
r
g)!FlaxForcedBOSTokenLogitsProcessor   z
[`FlaxLogitsProcessor`] that enforces the specified token as the first generated token.

Args:
    bos_token_id (`int`):
        The id of the token to force as the first generated token.
bos_token_idc                     Xl         g r0   r   )r   r   s     r   rI   *FlaxForcedBOSTokenLogitsProcessor.__init__   s    (r   r
   r   r,   r   c                    [         R                  " UR                  [        S5      * 5      nS[         R                  " US-
  5      -
  n[         R
                  " XTR                  S S 2U R                  4   R                  S5      U5      nU$ NinfrS   r   )	r!   rz   r_   rH   bool_rh   rf   r   rg   r   r
   r   r,   
new_scoresapply_penaltys         r   r   *FlaxForcedBOSTokenLogitsProcessor.__call__   si    XXfllU5\M:
CIIgk22=--4;L;L8L*M*Q*QRS*TV\]r   r   Nr   r   r   r   r   rA   rI   r!   r"   r   r#   r   r   r   r   r      sC    )S )#++ s{{ S UXU`U` r   r   c                       \ rS rSrSrS\S\4S jrS\R                  S\R                  S\S	\R                  4S
 jr	Sr
g)!FlaxForcedEOSTokenLogitsProcessor   aI  
[`FlaxLogitsProcessor`] that enforces the specified token as the last generated token when `max_length` is reached.

Args:
    max_length (`int`):
        The maximum length of the sequence to be generated.
    eos_token_id (`int`):
        The id of the token to force as the last generated token when `max_length` is reached.

max_lengtheos_token_idc                     Xl         X l        g r0   )r   r   )r   r   r   s      r   rI   *FlaxForcedEOSTokenLogitsProcessor.__init__   s    $(r   r
   r   r,   r   c                 .   [         R                  " UR                  [        S5      * 5      nS[         R                  " X0R
                  -
  S-   5      -
  n[         R                  " XTR                  S S 2U R                  4   R                  S5      U5      nU$ r   )
r!   rz   r_   rH   r   r   rh   rf   r   rg   r   s         r   r   *FlaxForcedEOSTokenLogitsProcessor.__call__   sq    XXfllU5\M:
CIIg&?!&CDD=--4;L;L8L*M*Q*QRS*TV\]r   )r   r   Nr   r   r   r   r   r      sJ    )3 )c )#++ s{{ S UXU`U` r   r   c                       \ rS rSrSrS\S\4S jrS\R                  S\R                  S\S	\R                  4S
 jr	Sr
g)FlaxMinLengthLogitsProcessor   a  
[`FlaxLogitsProcessor`] enforcing a min-length by setting EOS probability to 0.

Args:
    min_length (`int`):
        The minimum length below which the score of `eos_token_id` is set to `-float("Inf")`.
    eos_token_id (`int`):
        The id of the *end-of-sequence* token.

min_lengthr   c                     [        U[        5      (       a  US:  a  [        SU 35      e[        U[        5      (       a  US:  a  [        SU 35      eXl        X l        g )Nr   z2`min_length` has to be a positive integer, but is z4`eos_token_id` has to be a positive integer, but is )rG   rA   r=   r   r   )r   r   r   s      r   rI   %FlaxMinLengthLogitsProcessor.__init__   s^    *c**j1nQR\Q]^__,,,q0@ST`Sabcc$(r   r
   r   r,   r   c                     S[         R                  " X0R                  -
  SS5      -
  n[         R                  " XBR                  S S 2U R
                  4   R                  [        S5      * 5      U5      nU$ )NrS   r   r   )r!   clipr   rh   rf   r   rg   rH   r   r
   r   r,   r   s        r   r   %FlaxMinLengthLogitsProcessor.__call__  s\    CHHW%>1EE=))At7H7H4H*I*M*MuUZ|m*\^der   )r   r   Nr   r   r   r   r   r      sJ    )3 )c )#++ s{{ S UXU`U` r   r   c                   ,    \ rS rSrSrS rS\4S jrSrg)(FlaxSuppressTokensAtBeginLogitsProcessori  a  
[`FlaxLogitsProcessor`] suppressing a list of tokens as soon as the `generate` function starts generating using
`begin_index` tokens. This should ensure that the tokens defined by `begin_suppress_tokens` are not sampled at the
beginning of the generation.

Args:
    begin_suppress_tokens (`List[int]`):
        Tokens to not sample.
    begin_index (`int`):
        Index where the tokens are suppressed.
c                 0    [        U5      U l        X l        g r0   )r;   begin_suppress_tokensbegin_index)r   r   r   s      r   rI   1FlaxSuppressTokensAtBeginLogitsProcessor.__init__  s    %)*?%@"&r   r,   c                     S[         R                  " X0R                  -
  5      -
  n[         R                  " XBR                  S S 2U R
                  4   R                  [        S5      * 5      U5      nU$ )NrS   r   )r!   r   r   rh   rf   r   rg   rH   r   s        r   r   1FlaxSuppressTokensAtBeginLogitsProcessor.__call__!  s]    CIIg0@0@&@AA=))At7Q7Q4Q*R*V*VX]^cXdWd*egmnr   )r   r   N)	r   r   r   r   r   rI   rA   r   r#   r   r   r   r   r     s    
'3 r   r   c                   |    \ rS rSrSrS\4S jrS\R                  S\R                  S\	S\R                  4S	 jr
S
rg)!FlaxSuppressTokensLogitsProcessori)  z
[`FlaxLogitsProcessor`] suppressing a list of tokens at each decoding step. The processor will set their log probs
to be `-inf` so they are not sampled.

Args:
    suppress_tokens (`list`):
        Tokens to not sample.
suppress_tokensc                 $    [        U5      U l        g r0   )r;   r   )r   r   s     r   rI   *FlaxSuppressTokensLogitsProcessor.__init__3  s    #O4r   r
   r   r,   r   c                 n    UR                   SU R                  4   R                  [        S5      * 5      nU$ )N.r   )rf   r   rg   rH   rM   s       r   r   *FlaxSuppressTokensLogitsProcessor.__call__6  s1    3 4 445995<-Hr   )r   N)r   r   r   r   r   r;   rI   r!   r"   rA   r   r#   r   r   r   r   r   )  sC    5 5#++ s{{ S UXU`U` r   r   c                   t    \ rS rSrSrS rS\R                  S\R                  S\S\R                  4S jr	S	r
g
)FlaxForceTokensLogitsProcessori<  a  
[`FlaxLogitsProcessor`] that takes a list of pairs of integers which indicates a mapping from generation indices to
token indices that will be forced before sampling. The processor will set their log probs to 0 and all other tokens
to `-inf` so that they are sampled at their corresponding index.

Args:
    force_token_map (`list`):
        Map giving token ids and indices where they will be forced to be sampled.
c                 H   [        U5      n[        R                  " [        UR	                  5       5      S-   [        R
                  S9S-  nUR                  5        H(  u  p4Uc  M
  UR                  U   R                  U5      nM*     [        R
                  " U5      U l	        g )NrS   dtyperZ   )
dictr!   onesrw   r<   int32itemsrf   rg   force_token_array)r   force_token_mapr   indextokens        r   rI   'FlaxForceTokensLogitsProcessor.__init__G  s    /  HHc/*>*>*@&AA&EciiX[]]+113LE $5$8$8$?$C$CE$J! 4 "%+<!=r   r
   r   r,   r   c                    ^ ^^^ UU 4S jm[         R                  " TT R                  R                  S   :  U4S jUUUU 4S j5      mT$ )Nc                   > TR                   S   nTR                  U    n[        R                  " TTR                  S9[        S5      * -  n[        R                  " US4TR                  S9n[        R                  " X4SU45      nU$ )Nr   r   r   rS   )	r_   r   r!   	ones_liker   rH   zerosr]   dynamic_update_slice)generation_idxr   current_tokenr   updatesr   r   s        r   _force_token=FlaxForceTokensLogitsProcessor.__call__.<locals>._force_tokenS  st    aJ 22>BMvV\\BeEl]RJiiQv||DG11*=GYZJr   r   c                     > T $ r0   r   r   s   r   <lambda>9FlaxForceTokensLogitsProcessor.__call__.<locals>.<lambda>_  s    Fr   c                  f   > [         R                  " TR                  T   S:  U U4S jU4S j5      $ )Nr   c                     > T " T5      $ r0   r   )r   r,   s   r   r   KFlaxForceTokensLogitsProcessor.__call__.<locals>.<lambda>.<locals>.<lambda>d  s
    W-r   c                     > T $ r0   r   r   s   r   r   r   f  s    r   )r]   condr   )r   r,   r   r   s   r   r   r   a  s'    CHH&&w/14-r   )r]   r   r   r_   )r   r
   r   r,   r   s   ` ``@r   r   'FlaxForceTokensLogitsProcessor.__call__R  s@    	 t--33A66
 r   )r   N)r   r   r   r   r   rI   r!   r"   rA   r   r#   r   r   r   r   r   <  s<    	>#++ s{{ S UXU`U` r   r   c                   $    \ rS rSrSrS rS rSrg)#FlaxWhisperTimeStampLogitsProcessoril  aG  
Whisper specific Processor. This processor can be used to force a list of tokens. The processor will set their log
probs to `inf` so that they are sampled at their corresponding index.

Args:
    generate_config (`GenerateConfig`):
        The generate config used to generate the output. The following parameters are required:
            eos_token_id (`int`, *optional*, defaults to 50257):
                The id of the *end-of-sequence* token.
            no_timestamps_token_id (`int`, *optional*, defaults to 50363):
                The id of the `"<|notimestamps|>"` token.
            max_initial_timestamp_index (`int`, *optional*, defaults to 1):
                Used to set the maximum value of the initial timestamp. This is used to prevent the model from
                predicting timestamps that are too far in the future.
c                 v   UR                   U l         UR                  U l        UR                  S-   U l        US-   U l        UR                  (       a  U =R                  S-  sl        [        US5      (       a  UR                  U l        OUR                  U l        U R                  c  UR                  U l        g g )NrS   r   max_initial_timestamp_index)r   no_timestamps_token_idtimestamp_beginr   is_multilingualhasattrr   r   )r   generate_configmodel_configdecoder_input_lengths       r   rI   ,FlaxWhisperTimeStampLogitsProcessor.__init__}  s    +88&5&L&L#.EEI/!3**!?$ABB/>/Z/ZD,/;/F/FD,++3/;/F/FD, 4r   c                   ^ ^ UR                   S S 2T R                  4   R                  [        S5      * 5      nUU 4S jn[        R
                  " U5      " X5      n[        R                  " TT R                  :H  SS5      n[        R                  " T R                  S LUS5      nT R                  T R                  -   n[        R                  " UUR                   S S 2US-   S 24   R                  [        S5      * 5      U5      n[        R                  R                  USS9nU 4S jn[        R
                  " U5      " Xr5      nU$ )	Nr   c                 r  > [         R                  " TTR                  -
  S:  SS5      n[         R                  " U TS-
     TR                  :  US5      n[         R                  " TTR                  -
  S:  SS5      n[         R                  " U TS-
     TR                  :  SU5      n[         R                  " U[         R                  " US:  UR                  TR                  S  R                  [        S5      * 5      UR                  S TR                   R                  [        S5      * 5      5      U5      $ )NrS   TFr   r   r   )r!   rh   r   r   rf   rg   rH   r   )input_ids_kscores_klast_was_timestamppenultimate_was_timestampr,   r   s       r   handle_pairsBFlaxWhisperTimeStampLogitsProcessor.__call__.<locals>.handle_pairs  s"   !$Gd6F6F,F1+LdTY!Z!$GaK(D,@,@@+" ),		7T=M=M3MQR2RTXZ_(`%(+		GaK(D,@,@@))% 99"		-1KK 4 4 67;;U5\MJKK 3$"3"3488%,G
  r   TFrS   rZ   r[   c                 4  > [         R                  R                  U TR                  S  SS9n[        R
                  " U S TR                   5      n[        R                  " X#:  UR                  S TR                   R                  [        S5      * 5      U5      $ )NrZ   r[   r   )
ra   rb   	logsumexpr   r!   rw   rh   rf   rg   rH   )
logprobs_kr   timestamp_logprobmax_text_token_logprobr   s       r   handle_cumulative_probsMFlaxWhisperTimeStampLogitsProcessor.__call__.<locals>.handle_cumulative_probs  s     # 0 0D<P<P<R1SZ\ 0 ]%(WWZ8N$:N:N-O%P"99!:2d22377uF r   )rf   r   rg   rH   ra   vmapr!   rh   r   r   r   rb   log_softmax)	r   r
   r   r,   r   apply_max_initial_timestamplast_allowedlogprobsr   s	   `  `     r   r   ,FlaxWhisperTimeStampLogitsProcessor.__call__  s   1d999:>>e}M	2 ,'	:&)ii4;K;K0KTSX&Y#&)ii,,D80'
# ++d.N.NN'IIa)++,00%,?
 66%%f2%6	 128Dr   )r   r   r   r   r   N)r   r   r   r   r   rI   r   r#   r   r   r   r   r   l  s     G"<r   r   c                       \ rS rSrSrS\4S jrS\R                  S\S\4S jr	S	\R                  S
\R                  4S jr
S\R                  S\R                  S\S
\R                  4S jrSrg) FlaxNoRepeatNGramLogitsProcessori  a!  
[`FlaxLogitsProcessor`] that enforces no repetition of n-grams. See
[Fairseq](https://github.com/pytorch/fairseq/blob/a07cb6f40480928c9e0548b737aadd36ee66ac76/fairseq/sequence_generator.py#L345).

Args:
    ngram_size (`int`):
        All ngrams of size `ngram_size` can only occur once.

ngram_sizec                 b    [        U[        5      (       a  US::  a  [        SU 35      eXl        g )Nr   z;`ngram_size` has to be a strictly positive integer, but is )rG   rA   r=   r   )r   r   s     r   rI   )FlaxNoRepeatNGramLogitsProcessor.__init__  s/    *c**jAoZ[eZfghh$r   r
   r   r,   c           
        ^ ^^ TR                   u  mnUT R                  S-
  -
  nUT R                  S-
  -
  nUUU 4S jnTU-  T R                  S-   4n[        R                  R	                  STU-  U[
        R                  " UTR                  S95      n	[
        R                  " TU-  5      TU-  :  R                  S5      n
[        R                  " X4T4U4T R                  -  -   S9$ )z
get a matrix of size (batch_size,) + (vocab_size,)*n (for n-grams) that
represent the n-grams that occurred previously.
The BCOO representation allow to store only the few non-zero entries, instead of the full (huge) matrix
rS   c                   > U T-  nU T-  nUR                   U    R                  [        R                  " U/[	        TR
                  5       Vs/ s H   n[        R                  " T5      X#U-   4   PM"     sn-   5      5      $ s  snf r0   )rf   rg   r!   arrayranger   )ivalbposjr   r
   r   s        r   body_funFFlaxNoRepeatNGramLogitsProcessor.get_previous_ngrams.<locals>.body_fun  s    JAz/C66!9==		 BGtAWXAWAsyy+AQwJ7AWXY 
 Ys   'Br   r   float32)r_   )r_   r   ra   r]   	fori_loopr!   r   r   r}   astyper   BCOO)r   r
   r   r,   seq_len
seq_ngrams
cur_ngramsr  r_   all_update_indicesdatar   s   ``         @r   get_previous_ngrams4FlaxNoRepeatNGramLogitsProcessor.get_previous_ngrams  s     (oo
G! 34
! 34

	 j($//A*=> WW..zJ&#))E2Y

 

:
23j:6MMUUV_`{{D5j]j]]a]l]lMl=lmmr   latest_tokensr   c                     [         R                  [        R                  S 5       5       n[         R                  " U" X5      5      $ )z\
Determines which tokens must be banned given latest tokens and the previously seen
ngrams.
c                     U[        U 5         $ r0   )tuple)r  previous_ngramss     r   inner_fnIFlaxNoRepeatNGramLogitsProcessor.get_banned_tokens_mask.<locals>.inner_fn  s     #5#788r   )r   sparsifyra   r   bcoo_todense)r   r  r  r  s       r   get_banned_tokens_mask7FlaxNoRepeatNGramLogitsProcessor.get_banned_tokens_mask  s>     
		9 
 
	9 ""8M#KLLr   r   c                    ^ ^^^ UUUU 4S jn[         R                  R                  TT R                  S-
  :  UU4S j5      nU$ )Nc            
        > TR                   u  pTR                  TUT5      n[        R                  " TR                   S   TR                  S-
  4TR
                  S9n[        R                  R                  U[        R                  R                  TSTTR                  S-
  -
  4TR                   S   TR                  S-
  45      S5      nTR                  X25      R                  S5      n[        R                  " U[        S5      * T5      $ )Nr   rS   r   )r   r   boolr   )r_   r  r!   r   r   r   ra   r]   r   dynamic_slicer!  r  rh   rH   )	_r   r  r  banned_tokens_indices_maskr,   r
   r   r   s	        r   true_fn:FlaxNoRepeatNGramLogitsProcessor.__call__.<locals>.true_fn  s    "LLMA"66y*gVO  IIyq'94??Q;N&OW`WfWfgMGG88%%7doo.A#BCiooVWFX[_[j[jmn[nEp M *.)D)D])d)k)klr)s&997%,OOr   rS   c                     > T $ r0   r   r   s   r   r   ;FlaxNoRepeatNGramLogitsProcessor.__call__.<locals>.<lambda>  s    QWr   )ra   r]   r   r   )r   r
   r   r,   r)  outputs   ````  r   r   )FlaxNoRepeatNGramLogitsProcessor.__call__  s:    	P 	P& w$//A*==Xr   )r   N)r   r   r   r   r   rA   rI   r!   r"   r  r!  r   r#   r   r   r   r   r     s    %3 %
 nS[[  nc  nTW  nDMCKK MUXU`U` M#++ s{{ S UXU`U` r   r   )r6   ra   jax.laxr]   	jax.numpynumpyr!   jax.experimentalr   utilsr   utils.loggingr   r   loggerr    r   r%   r;   r*   rC   rP   rt   r   r   r   r   r   r   r   r   r   r   r   <module>r6     s      
   # ( & 
H	% !*
 

 
d ."2 ()+ )X +  F(; ,(; 2#6 </B 2(; &-%8 -`^*= ^BS': Sr   