
    j                         d dl mZmZmZmZmZ d dlmZ d dlm	Z	m
Z
 	 d dlmZ eeee      ee   gef   Z G d de	j$                        Zy# e$ r dZY 1w xY w)    )AnyCallableOptionalSequenceUnion)MetricComputationError)base_metricscore_result)
gleu_scoreNc                        e Zd ZdZ	 	 	 	 	 	 ddee   dededededee   d	df fd
Z	dede
eee   f   ded	ej                  fdZ xZS )GLEUa  
    Sentence-level GLEU metric powered by ``nltk.translate.gleu_score``.

    References:
      - NLTK Reference Documentation on GLEU
        https://www.nltk.org/api/nltk.translate.gleu_score.html
      - OECD Catalogue of Tools & Metrics for Trustworthy AI
        https://oecd.ai/en/catalogue/metrics/google-bleu-gleu
      - Hugging Face Evaluate: Google BLEU (GLEU) metric overview
        https://huggingface.co/spaces/evaluate-metric/google_bleu

    Args:
        gleu_fn: Optional custom scoring callable compatible with
            ``nltk.translate.gleu_score.sentence_gleu``. Useful for testing.
        min_len: Minimum n-gram size considered.
        max_len: Maximum n-gram size considered.
        name: Display name for the metric result.
        track: Whether to automatically track metric results.
        project_name: Optional tracking project name.

    Example:
        >>> from opik.evaluation.metrics import GLEU
        >>> metric = GLEU(min_len=1, max_len=4)
        >>> result = metric.score(
        ...     output="The cat sat on the mat",
        ...     reference="The cat is on the mat",
        ... )
        >>> round(result.value, 3)  # doctest: +SKIP
        0.816
    Ngleu_fnmin_lenmax_lennametrackproject_namereturnc                    dk  sdk  rt        d      kD  rt        d      t        | 	  |||       ||| _        y t        t        d      dt        t        t              dt        t           dt        ffd	}|| _        y )
Nr   z.min_len and max_len must be positive integers.zmin_len cannot exceed max_len.)r   r   r   zfGLEU metric requires the optional 'nltk' package. Install via `pip install nltk` or provide `gleu_fn`.
references
hypothesisr   c                 H    t        t        j                  | |            S )N)r   r   )floatnltk_gleu_scoresentence_gleu)r   r   r   r   s     /Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/opik/evaluation/metrics/heuristics/gleu.py_scorerzGLEU.__init__.<locals>._scorerH   s,     #11"" ' '	     )	
ValueErrorsuper__init___gleu_fnr   ImportErrorr   strr   )	selfr   r   r   r   r   r   r   	__class__s	     ``    r   r!   zGLEU.__init__/   s     a<7a<MNNW=>>d%lK#DM&!@ 

$Xc]3
AI#

 $DMr   output	referenceignored_kwargsc                    |j                         st        d      |j                         }t        |t              r|j                         g}n5t        |      }|st        d      |D cg c]  }|j                          }}t        d |D              rt        d      | j                  ||      }t        j                  t        |      | j                  dt        |      d      S c c}w )Nz!Candidate is empty (GLEU metric).z!Reference is empty (GLEU metric).c              3   8   K   | ]  }t        |      d k(    yw)r   N)len).0refs     r   	<genexpr>zGLEU.score.<locals>.<genexpr>g   s     3
s3x1}
s   z/Reference contains empty segment (GLEU metric).zGLEU score: z.4f)valuer   reason)stripr   split
isinstancer$   listanyr"   r
   ScoreResultr   r   )	r%   r'   r(   r)   hypothesis_tokensr   ref_listr.   scores	            r   r:   z
GLEU.scoreV   s     ||~()LMM"LLNi%#//+,JIH,-PQQ19:##))+J:3
33(A  j*;<'',!%,s!34
 	
 ;s   *C*)N      gleu_metricTN)__name__
__module____qualname____doc__r   GleuFnintr$   boolr!   r   r   r   r
   r7   r:   __classcell__)r&   s   @r   r   r      s    B %)!&*%$&!%$ %$ 	%$
 %$ %$ sm%$ 
%$N

 hsm+,
 	

 
	!	!
r   r   )typingr   r   r   r   r   opik.exceptionsr   opik.evaluation.metricsr	   r
   nltk.translater   r   r#   r$   r   rB   
BaseMetricr    r   r   <module>rL      sf    ; ; 2 =<
 
8HSM*HSM:EA	Bb
;!! b
  Os   A AA