o
    i6	                     @  sZ   d Z ddlmZ ddlmZmZ ddlZddlm  m	Z
 dddZddddddZdS )z<Shared sampling helpers for talker and predictor generation.    )annotations)IterableOptionalNlogitstorch.Tensortoken_historyrepetition_penaltyfloatreturnc                 C  sR   |dks
|  dkr| S | }| d|f }t|dk|| || | d|f< | S )a  Apply repetition penalty to logits in-place and return them.

    Args:
        logits: Tensor shaped [1, 1, vocab] or [1, vocab].
        token_history: 1-D tensor of previously generated token ids.
        repetition_penalty: HF-style repetition penalty (>1.0).
          ?r   .)numeluniquetorchwhere)r   r   r   unique_toks
tok_logits r   M/home/ubuntu/.local/lib/python3.10/site-packages/faster_qwen3_tts/sampling.pyapply_repetition_penalty
   s   r   )suppress_masksuppress_tokenstemperaturetop_kinttop_p	do_sampleboolr   Optional[torch.Tensor]r   Optional[Iterable[int]]c                C  s,  |   } |durtd| d|f< |rtd| dt|f< |s%tj| ddS | | } |dkrPt| t|| d\}}t| |dddf k t	| td| } |dk rtj
| dd	\}	}
tj|	dd}tj|dd}||k}d
|d< td|	|< t	| td} | d|
|	 ttj| ddddS )zlSample a token from logits.

    Mirrors HF order: suppress -> temperature -> top-k -> top-p -> sample.
    Nz-inf.)dimr   r   T)
descendingF).r      )cloner	   listr   argmaxtopkminsizer   	full_likesortFsoftmaxcumsumscatter_multinomialsqueeze)r   r   r   r   r   r   r   	topk_vals_sorted_logitssorted_indicesprobscumulative_probssorted_indices_to_remover   r   r   sample_logits    s*   *r8   )r   r   r   r   r   r	   r
   r   )r   r   r   r	   r   r   r   r	   r   r   r   r   r   r   r
   r   )__doc__
__future__r   typingr   r   r   torch.nn.functionalnn
functionalr+   r   r8   r   r   r   r   <module>   s    
