a
    v5`B                     @   sb   d dl mZ d dlmZ ddlmZ ddlmZ e Ze	  G dd dZ
G dd	 d	e
Zd
S )    Counter)suppress   )	prototype)find_ngramsc                   @   s   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d%S )'Base   Tc                 C   s   || _ || _d S N)qvalexternal)selfr   r    r   ;lib/python3.9/site-packages/textdistance/algorithms/base.py__init__   s    zBase.__init__c                 G   s   t d S r
   )NotImplementedErrorr   	sequencesr   r   r   __call__   s    zBase.__call__c                  G   s   t tt| S )z#Get maximum possible value
        )maxmaplen)r   r   r   r   maximum   s    zBase.maximumc                 G   s   | | S )z'Get distance between sequences
        r   r   r   r   r   distance   s    zBase.distancec                 G   s   | j | | j|  S )zKGet sequences similarity.

        similarity = maximum - distance
        r   r   r   r   r   r   
similarity!   s    zBase.similarityc                 G   s$   | j | }|dkrdS | j| | S )z!Get distance from 0 to 1
        r   r   )r   r   r   r   r   r   normalized_distance(   s    
zBase.normalized_distancec                 G   s   d| j |  S )z\Get similarity from 0 to 1

        normalized_similarity = 1 - normalized_distance
        r	   )r   r   r   r   r   normalized_similarity0   s    zBase.normalized_similarityc              	   G   s   t | ddsdS t| dr*| j| jur*dS t| jj}|D ]b}|j| g|R  sTq<|	 s^q<|j
| }tt |j| W  d     S 1 s0    Y  q<dS )z9Try to get answer from known external libraries.
        r   FN	test_func)getattrhasattrr   _ident	librariesZget_libs	__class____name__Zcheck_conditionsZget_functionZpreparer   	Exceptionfunc)r   r   ZlibslibZprepared_sequencesr   r   r   external_answer7   s    

zBase.external_answerc                 G   sR   |sdS t |dkrdS | j| r&dS t|s8| j| S | j| }|durN|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   r(   r   r   Zanswerr   r   r   quick_answerO   s    


zBase.quick_answerc                  G   sX   zt t| dkW S  tyR   t| | dd D ]\}}||kr2 Y dS q2Y dS 0 dS )z0Return True if all sequences are equal.
        r	   NFT)r   set	TypeErrorzip)elementse1e2r   r   r   r!   c   s    
zBase._identc                    s4    j sdd |D S  j dkr"|S  fd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                 S   s   g | ]}|  qS r   )split.0sr   r   r   
<listcomp>z       z'Base._get_sequences.<locals>.<listcomp>r	   c                    s   g | ]}t | jqS r   )r   r   r3   r   r   r   r6      r7   )r   r   r   r8   r   _get_sequencesq   s
    
zBase._get_sequencesc                 G   s*   t dd |D r|S dd | j| D S )z6Prepare sequences and convert it to Counters.
        c                 s   s   | ]}t |tV  qd S r
   )
isinstancer   r3   r   r   r   	<genexpr>   r7   z%Base._get_counters.<locals>.<genexpr>c                 S   s   g | ]}t |qS r   r   r3   r   r   r   r6      r7   z&Base._get_counters.<locals>.<listcomp>)r)   r9   r   r   r   r   _get_counters   s    zBase._get_countersc                 G   s*   |d   }|dd  D ]}||M }q|S Nr   r	   copy)r   r   intersectionr5   r   r   r   _intersect_counters   s    
zBase._intersect_countersc                 G   s*   |d   }|dd  D ]}||O }q|S r=   r>   )r   r   unionr5   r   r   r   _union_counters   s    
zBase._union_countersc                 G   s*   |d   }|dd  D ]}||7 }q|S r=   r>   )r   r   resultr5   r   r   r   _sum_counters   s    
zBase._sum_countersc                 C   s(   t | ddrtt|S t| S dS )z/Return all elements count from Counter
        Zas_setFN)r   r   r,   sumvalues)r   Zcounterr   r   r   _count_counters   s    zBase._count_countersc                 C   s   dj t| j| jdS )Nz{name}({data}))namedata)formattyper$   __dict__r8   r   r   r   __repr__   s    zBase.__repr__N)r	   T)r$   
__module____qualname__r   r   staticmethodr   r   r   r   r   r(   r+   r!   r9   r<   rA   rC   rE   rH   rN   r   r   r   r   r      s&   


r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )BaseSimilarityc                 G   s   | j | | j|  S r
   )r   r   r   r   r   r   r      s    zBaseSimilarity.distancec                 G   s   | | S r
   r   r   r   r   r   r      s    zBaseSimilarity.similarityc                 G   s^   |s| j | S t|dkr$| j | S | j| r8| j | S t|sDdS | j| }|d urZ|S d S )Nr	   r   )r   r   r!   r)   r(   r*   r   r   r   r+      s    




zBaseSimilarity.quick_answerN)r$   rO   rP   r   r   r+   r   r   r   r   rR      s   rR   N)collectionsr   
contextlibr   r"   r   Zutilsr   Zcloneoptimizer   rR   r   r   r   r   <module>   s    