
    NgN                     Z    d dl Z d dlmZmZmZmZ d dlmZ d dlm	Z	  G d de	          Z
dS )    N)AnyCallableOptionalUnion)parse_json_markdown)StringEvaluatorc                   0    e Zd ZdZ	 	 ddeeeegef                  deeegef                  deddf fdZ	e
defd            Ze
defd	            Ze
defd
            Zdedeeedeeeef         fdZ	 	 ddedee         dee         dedef
dZ xZS )JsonEditDistanceEvaluatora  
    An evaluator that calculates the edit distance between JSON strings.

    This evaluator computes a normalized Damerau-Levenshtein distance between two JSON strings
    after parsing them and converting them to a canonical format (i.e., whitespace and key order are normalized).
    It can be customized with alternative distance and canonicalization functions.

    Args:
        string_distance (Optional[Callable[[str, str], float]]): A callable that computes the distance between two strings.
            If not provided, a Damerau-Levenshtein distance from the `rapidfuzz` package will be used.
        canonicalize (Optional[Callable[[Any], Any]]): A callable that converts a parsed JSON object into its canonical string form.
            If not provided, the default behavior is to serialize the JSON with sorted keys and no extra whitespace.
        **kwargs (Any): Additional keyword arguments.

    Attributes:
        _string_distance (Callable[[str, str], float]): The internal distance computation function.
        _canonicalize (Callable[[Any], Any]): The internal canonicalization function.

    Examples:
        >>> evaluator = JsonEditDistanceEvaluator()
        >>> result = evaluator.evaluate_strings(prediction='{"a": 1, "b": 2}', reference='{"a": 1, "b": 3}')
        >>> assert result["score"] is not None

    Raises:
        ImportError: If `rapidfuzz` is not installed and no alternative `string_distance` function is provided.

    Nstring_distancecanonicalizekwargsreturnc                     t                                                       ||| _        n6	 ddlm} n# t
          $ r t          d          w xY w|j        j        | _        |	|| _        d S d | _        d S )Nr   )distancezThe default string_distance operator for the  JsonEditDistanceEvaluator requires installation of the rapidfuzz package. Please install it with `pip install rapidfuzz`.c                 0    t          j        | dd          S )N),:T)
separators	sort_keys)jsondumps)xs    f/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain/evaluation/parsing/json_distance.py<lambda>z4JsonEditDistanceEvaluator.__init__.<locals>.<lambda>=   s     4:%, , ,     )	super__init___string_distance	rapidfuzzr   ImportErrorDamerauLevenshteinnormalized_distance_canonicalize)selfr   r   r   rfd	__class__s        r   r   z"JsonEditDistanceEvaluator.__init__&   s     	&$3D!!5555555   !F   %($:$ND!#!-D" "Ds	   4 Ac                     dS )NF r$   s    r   requires_inputz(JsonEditDistanceEvaluator.requires_inputC   s    ur   c                     dS )NTr(   r)   s    r   requires_referencez,JsonEditDistanceEvaluator.requires_referenceG   s    tr   c                     dS )Njson_edit_distancer(   r)   s    r   evaluation_namez)JsonEditDistanceEvaluator.evaluation_nameK   s    ##r   nodec                 N    t          |t                    rt          |          S |S )N)
isinstancestrr   )r$   r0   s     r   _parse_jsonz%JsonEditDistanceEvaluator._parse_jsonO   s'    dC   	-&t,,,r   
predictioninput	referencec                     |                      |                     |                    }|                      |                     |                    }|                     ||          }d|iS )Nscore)r#   r4   r   )r$   r5   r6   r7   r   parsedlabelr   s           r   _evaluate_stringsz+JsonEditDistanceEvaluator._evaluate_stringsT   sf     ##D$4$4Z$@$@AA""4#3#3I#>#>??((77""r   )NN)__name__
__module____qualname____doc__r   r   r3   floatr   r   propertyboolr*   r,   r/   r   dictlistintr4   r<   __classcell__)r&   s   @r   r
   r
   	   s        < BF7; !(C:u+<"=> xs
34 	
 
     :     X D    X $ $ $ $ X$ dD$tSRU.U(V      $#'	
# 
#
# }
# C=	
#
 
# 

# 
# 
# 
# 
# 
# 
# 
#r   r
   )r   typingr   r   r   r   langchain_core.utils.jsonr   langchain.evaluation.schemar   r
   r(   r   r   <module>rK      s     1 1 1 1 1 1 1 1 1 1 1 1 9 9 9 9 9 9 7 7 7 7 7 7U# U# U# U# U# U# U# U# U# U#r   