
    v5`B                         d dl mZ d dlmZ ddlmZ ddlmZ  ej                    Ze	                                  G d d          Z
 G d d	e
          Zd
S )    Counter)suppress   )	prototype)find_ngramsc                       e Zd ZddZd Zed             Zd Zd Zd Z	d	 Z
d
 Zd Zed             Zd Zd Zd Zd Zd Zd Zd ZdS )Base   Tc                 "    || _         || _        d S N)qvalexternal)selfr   r   s      <lib/python3.11/site-packages/textdistance/algorithms/base.py__init__zBase.__init__   s    	     c                     t           r   )NotImplementedErrorr   	sequencess     r   __call__zBase.__call__   s    !!r   c                  F    t          t          t          |                     S )z#Get maximum possible value
        )maxmaplen)r   s    r   maximumzBase.maximum   s     3sI&&'''r   c                      | | S )z'Get distance between sequences
         r   s     r   distancezBase.distance   s     tYr   c                 ,     | j         |  | j        | z
  S )zKGet sequences similarity.

        similarity = maximum - distance
        r   r    r   s     r   
similarityzBase.similarity!   s!    
 t|Y'-$-*CCCr   c                 @     | j         | }|dk    rdS  | j        | |z  S )z!Get distance from 0 to 1
        r   r"   )r   r   r   s      r   normalized_distancezBase.normalized_distance(   s4     $,	*a<<1t}i(722r   c                     d | j         | z
  S )z\Get similarity from 0 to 1

        normalized_similarity = 1 - normalized_distance
        r   )r%   r   s     r   normalized_similarityzBase.normalized_similarity0   s    
 +4+Y777r   c                    t          | dd          sdS t          | d          r| j        | j        urdS t                              | j        j                  }|D ]h} |j        | g|R  s|	                                s& |j
        | }t          t                    5   |j        | cddd           c S # 1 swxY w Y   idS )z9Try to get answer from known external libraries.
        r   FN	test_func)getattrhasattrr)   _ident	librariesget_libs	__class____name__check_conditionsget_functionpreparer   	Exceptionfunc)r   r   libslibprepared_sequencess        r   external_answerzBase.external_answer7   s=    tZ// 	F4%% 	$.*K*KF!!$."9:: 	5 	5C'3'9y999 ##%% !,i!8)$$ 5 5sx!345 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5	5 	5s   
B77B;	>B;	c                     |sdS t          |          dk    rdS  | j        | rdS t          |          s
 | j        | S  | j        | }||S dS )zTry to get answer quick without main implementation calling.

        If no sequences, 1 sequence or all sequences are equal then return 0.
        If any sequence are empty then return maximum.
        And in finish try to get external answer.
        r   r   N)r   r,   allr   r9   r   r   answers      r   quick_answerzBase.quick_answerO   s|      	1y>>Q14;	" 	19~~ 	,4<++%%y1M r   c                      	 t          t          |                     dk    S # t          $ r, t          | | dd                   D ]\  }}||k    r Y dS Y dS w xY w)z0Return True if all sequences are equal.
        r   NFT)r   set	TypeErrorzip)elementse1e2s      r   r,   zBase._identc   s~    	s8}}%%** 	 	 	h55 ! !B88 555 44	s   " .AAAc                 `      j         sd |D             S  j         dk    r|S  fd|D             S )zPrepare sequences.

        qval=None: split text by words
        qval=1: do not split sequences. For text this is mean comparing by letters.
        qval>1: split sequences by q-grams
        c                 6    g | ]}|                                 S r   )split.0ss     r   
<listcomp>z'Base._get_sequences.<locals>.<listcomp>z   s     111!AGGII111r   r   c                 :    g | ]}t          |j                  S r   )r   r   )rJ   rK   r   s     r   rL   z'Base._get_sequences.<locals>.<listcomp>   s%    ===aAty))===r   )r   r   s   ` r   _get_sequenceszBase._get_sequencesq   sN     y 	211y11119>>====9====r   c                 `    t          d |D                       r|S d  | j        | D             S )z6Prepare sequences and convert it to Counters.
        c              3   @   K   | ]}t          |t                    V  d S r   )
isinstancer   rI   s     r   	<genexpr>z%Base._get_counters.<locals>.<genexpr>   s,      99!z!W%%999999r   c                 ,    g | ]}t          |          S r   r   rI   s     r   rL   z&Base._get_counters.<locals>.<listcomp>   s    DDDq

DDDr   )r;   rN   r   s     r   _get_counterszBase._get_counters   sH     99y99999 	DD$7D$7$CDDDDr   c                 ^    |d                                          }|dd          D ]}||z  }|S Nr   r   copy)r   r   intersectionrK   s       r   _intersect_counterszBase._intersect_counters   s@     |((**122 	 	AALLr   c                 ^    |d                                          }|dd          D ]}||z  }|S rV   rW   )r   r   unionrK   s       r   _union_counterszBase._union_counters   s>    !!!##122 	 	AQJEEr   c                 ^    |d                                          }|dd          D ]}||z  }|S rV   rW   )r   r   resultrK   s       r   _sum_counterszBase._sum_counters   s>    1""$$122 	 	AaKFFr   c                     t          | dd          rt          t          |                    S t          |                                          S )z/Return all elements count from Counter
        as_setF)r*   r   r@   sumvalues)r   counters     r   _count_counterszBase._count_counters   sD     45)) 	)s7||$$$w~~''(((r   c                 ^    d                     t          |           j        | j                  S )Nz{name}({data}))namedata)formattyper0   __dict__)r   s    r   __repr__zBase.__repr__   s0    &&d$ ' 
 
 	
r   N)r   T)r0   
__module____qualname__r   r   staticmethodr   r    r#   r%   r'   r9   r>   r,   rN   rT   rZ   r]   r`   rf   rm   r   r   r   r
   r
      s6       ! ! ! !" " " ( ( \(
     
D D D3 3 38 8 85 5 50  (   \> > > E E E      ) ) )
 
 
 
 
r   r
   c                        e Zd Zd Zd Zd ZdS )BaseSimilarityc                 ,     | j         |  | j        | z
  S r   )r   r#   r   s     r   r    zBaseSimilarity.distance   s    t|Y'/$/9*EEEr   c                      | | S r   r   r   s     r   r#   zBaseSimilarity.similarity   s    tYr   c                     |s
 | j         | S t          |          dk    r
 | j         | S  | j        | r
 | j         | S t          |          sdS  | j        | }||S d S )Nr   r   )r   r   r,   r;   r9   r<   s      r   r>   zBaseSimilarity.quick_answer   s     	,4<++y>>Q4<++4;	" 	,4<++9~~ 	1%%y1M r   N)r0   rn   ro   r    r#   r>   r   r   r   rr   rr      sD        F F F         r   rr   N)collectionsr   
contextlibr   r-   r   utilsr   cloneoptimizer
   rr   r   r   r   <module>r{      s                " ! ! ! ! !       IO	 	     Y
 Y
 Y
 Y
 Y
 Y
 Y
 Y
x    T     r   