o
    }oiU                     @   sV   d dl Z d dlZd dlm  mZ d dlmZmZ dd Z	dd Z
dd Zd	d
 ZdS )    N)chunked_cross_entropycompute_cross_entropyc                  C   s|   t jg dg dgt jd} t jddgt jd}tj| |dd}t| |}t j||dd	s<J d
|  d|  ddS )z
    Tests compute_cross_entropy with a small set of logits and targets.
    Verifies results match PyTorch's built-in cross_entropy.
    )       @g      ?g333333?)      ?r   g?dtyper      sum)	reductionư>atolExpected loss 
, but got .N	torchtensorfloat32longFcross_entropyr   allcloseitemlogitstargetsexpected_lossactual_loss r   X/home/ubuntu/.local/lib/python3.10/site-packages/tests/automodel/loss/test_chunked_ce.py test_compute_cross_entropy_basic   s   
r!   c                  C   s   t jddgddgddggt jd} t jg dt jd}tj| |ddd	}t| |dd
}t j||ddsBJ d|  d|  ddS )zs
    Tests compute_cross_entropy with ignore_index to ensure ignored targets
    don't contribute to the loss.
    g        r   g      @r   r   )r   r   r	   r"   )r
   ignore_indexr#   r   r   r   r   r   Nr   r   r   r   r    'test_compute_cross_entropy_ignore_index(   s   "r%   c            	      C   s   d} d}d}t ||}t d||f}t|||dk   }ddlm} |}t|||d}t j	||dd	sGJ d
|
  d|
  ddS )z
    Tests that chunked_cross_entropy produces the same result as compute_cross_entropy
    when the entire sequence is processed in one chunk.
             r   r"   )ceil)	chunk_lenr   r   Expected chunked loss r   r   N)r   randnrandintr   r	   detachmathr)   r   r   r   )	
batch_sizeseq_lennum_classesr   r   loss_refr)   r*   loss_chunkedr   r   r    8test_chunked_cross_entropy_matches_compute_cross_entropy;   s   r5   c            
      C   s   d} d}t | |}t d|| f}t dd| f}d|d< d}| }|||dk< t|||d}|||k   }d}t|||||d	}	t j|	|d
ds]J d|	  d|		  ddS )z
    Tests that chunked_cross_entropy properly ignores indices and respects masks.
    Verifies consistency with compute_cross_entropy.
    
      r      r   r"   r$      )maskr*   r#   r   r   r+   r   r   N)
r   r,   r-   cloner   r	   r.   r   r   r   )
r1   r2   r   r   r:   
ignore_idxmasked_targetsr3   r*   r4   r   r   r    0test_chunked_cross_entropy_ignore_index_and_maskV   s$   r>   )pytestr   torch.nn.functionalnn
functionalr   nemo.automodel.loss.chunked_cer   r   r!   r%   r5   r>   r   r   r   r    <module>   s   