
    9e                        d dl mZ d dlmZ d dlmZ d dlmZmZ ddl	m
Z
 ddlmZ  e
j                         Z	e	j                           ed      Z G d	 d
      Z G d de      Zy)    )annotations)Counter)suppress)SequenceTypeVar   )	prototype)find_ngramsTc                      e Zd ZdddZddZedd       ZddZddZddZ	ddZ
ddZdd	Zedd
       ZddZddZddZddZddZddZddZy)Basec                     || _         || _        y N)qvalexternal)selfr   r   s      >/usr/lib/python3/dist-packages/textdistance/algorithms/base.py__init__zBase.__init__   s    	     c                    t         r   )NotImplementedErrorr   	sequencess     r   __call__zBase.__call__   s    !!r   c                 4    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     Y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                P     | j                   | }|dk(  ry | j                  | |z  S )z!Get distance from 0 to 1
        r   r$   )r   r   r   s      r   normalized_distancezBase.normalized_distance,   s4     $,,	*a<t}}i(722r   c                &    d | j                   | z
  S )z\Get similarity from 0 to 1

        normalized_similarity = 1 - normalized_distance
           )r'   r   s     r   normalized_similarityzBase.normalized_similarity4   s    
 +4++Y777r   c                   t        | dd      syt        | d| j                        }|| j                  uryt        j                  | j                  j
                        }|D ]W  } |j                  | g| s|j                         }|* |j                  | }t        t              5   || cddd       c S  y# 1 sw Y   dxY w)z9Try to get answer from known external libraries.
        r   FN	test_func)getattr_ident	librariesget_libs	__class____name__check_conditionsget_functionpreparer   	Exception)r   r   r,   libslibfuncprepared_sequencess          r   external_answerzBase.external_answer;   s     tZ/D+t{{;	DKK'!!$.."9"9: 	1C'3''9y9##%D|!,i!8)$ 1/01 1	1 1 1s   (B;;C	c                    |syt        |      dk(  ry | j                  | ryt        |      s | j                  | S  | j                  | 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)   )r   r.   allr   r;   r   s     r   quick_answerzBase.quick_answerU   sU     y>Q4;;	"9~4<<++#t##Y//r   c                     	 t        t        |             dk(  S # t        $ r" t        | | dd       D ]  \  }}||k7  s Y y Y yw xY w)z0Return True if all sequences are equal.
        r)   NFT)r   set	TypeErrorzip)elementse1e2s      r   r.   zBase._identg   sY    	s8}%** 	h5 !B8 ! 	s    #AA AAc                    | j                   s|D cg c]  }|j                          c}S | j                   dk(  rt        |      S |D cg c]  }t        || j                          c}S c c}w c c}w )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
        r)   )r   splitlistr
   r   r   ss      r   _get_sequenceszBase._get_sequencesu   s]     yy'01!AGGI1199>	?"3<=aAtyy)== 2
 >s   A)	A.c                    t        d |D              rt        |      S  | j                  | D cg c]  }t        |       c}S c c}w )z6Prepare sequences and convert it to Counters.
        c              3  <   K   | ]  }t        |t                y wr   )
isinstancer   ).0rJ   s     r   	<genexpr>z%Base._get_counters.<locals>.<genexpr>   s     9!z!W%9s   )r=   rH   rK   r   rI   s      r   _get_counterszBase._get_counters   sA     9y99	?"$7D$7$7$CDq
DDDs   Ac                J    |d   j                         }|dd  D ]  }||z  }	 |S Nr   r)   copy)r   r   intersectionrJ   s       r   _intersect_counterszBase._intersect_counters   s9     |((*12 	AAL	r   c                J    |d   j                         }|dd  D ]  }||z  }	 |S rS   rT   )r   r   unionrJ   s       r   _union_counterszBase._union_counters   s7    !!!#12 	AQJE	r   c                J    |d   j                         }|dd  D ]  }||z  }	 |S rS   rT   )r   r   resultrJ   s       r   _sum_counterszBase._sum_counters   s7    1""$12 	AaKF	r   c                v    t        | dd      rt        t        |            S t        |j	                               S )z/Return all elements count from Counter
        as_setF)r-   r   r@   sumvalues)r   counters     r   _count_counterszBase._count_counters   s1     45)s7|$$w~~'((r   c                b    dj                  t        |       j                  | j                        S )Nz{name}({data}))namedata)formattyper2   __dict__)r   s    r   __repr__zBase.__repr__   s.    &&d$$ ' 
 	
r   N)r)   T)r   intr   boolreturnNoner   Sequence[object]rm   floatr   rp   rm   zfloat | None)rC   objectrm   rl   )r   rp   rm   rH   )r   rp   rm   zlist[Counter])r   
Counter[T]rm   rt   )rb   r   rm   rk   )rm   str)r2   
__module____qualname__r   r   staticmethodr   r"   r%   r'   r*   r;   r>   r.   rK   rQ   rW   rZ   r]   rc   rj   r!   r   r   r   r      sw    !" ( (
 
D3840$  > E)
r   r   c                  $    e Zd ZddZddZddZy)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    Yr   c                    |s | j                   | S t        |      dk(  r | j                   | S  | j                  | r | j                   | S t        |      sy | j                  | S )Nr)   r   )r   r   r.   r=   r;   r   s     r   r>   zBaseSimilarity.quick_answer   so    4<<++y>Q4<<++4;;	"4<<++9~#t##Y//r   Nro   rr   )r2   rv   rw   r"   r%   r>   r!   r   r   rz   rz      s    F 
0r   rz   N)
__future__r   collectionsr   
contextlibr   typingr   r   r/   r	   utilsr
   cloneoptimizer   r   rz   r!   r   r   <module>r      sY    "    $ "  IOO	 	   CLY
 Y
x0T 0r   