
    v5`                         d dl mZ d dlmZ ddlmZmZ 	 d dlm	Z	 n# e
$ r	 d dlmZ	 Y nw xY w	 d dlZn# e
$ r dZY nw xY wg dZ G d	 d
e          Z G d de          Z e            Z e            ZdS )    )defaultdict)groupby   )BaseBaseSimilarity)zip_longest)izip_longestN)MRAEditexmraeditexc                   $    e Zd ZdZd Zd Zd ZdS )r
   zWestern Airlines Surname Match Rating Algorithm comparison rating
    https://en.wikipedia.org/wiki/Match_rating_approach
    https://github.com/Yomguithereal/talisman/blob/master/src/metrics/distance/mra.js
    c                 d      fd|D             }t          t          t          |                    S )Nc                 T    g | ]$}t                              |                    %S  list	_calc_mra.0sselfs     @lib/python3.11/site-packages/textdistance/algorithms/phonetic.py
<listcomp>zMRA.maximum.<locals>.<listcomp>    -    @@@T$..++,,@@@    )maxmaplenr   	sequencess   ` r   maximumzMRA.maximum   s4    @@@@i@@@	3sI&&'''r   c                 >   |s|S |                                 }|d         d                    d |dd          D                       z   }d                    d t          |          D                       }t          |          dk    r|d d         |dd          z   S |S )	Nr    c              3   "   K   | ]
}|d v|V  dS )AEIOUNr   )r   cs     r   	<genexpr>z MRA._calc_mra.<locals>.<genexpr>'   s,       I Iq8H8H8H8H8H8H I Ir   r   c              3       K   | ]	\  }}|V  
d S Nr   )r   char_s      r   r(   z MRA._calc_mra.<locals>.<genexpr>)   s&      99at999999r         )upperjoinr   r   )r   words     r   r   zMRA._calc_mra#   s     	Kzz||Aw I IDH I I IIIIww9974==99999t99q==8d233i''r   c                    	 t          |          sdS  fd|D             }t          t          t          |                    }t          |          }t	          |          }t          |t          |          z
            |k    rdS t          |          D ]}g }t          |          	t          | D ]!}  j	        | s|
                    |           "t          t          t          |           }t          ||t                                }	fd|D             }t          t          t          |                    }|s|S |t	          |          z
  S )Nr   c                 T    g | ]$}t                              |                    %S r   r   r   s     r   r   z MRA.__call__.<locals>.<listcomp>1   r   r   )	fillvaluec                 0    g | ]\  }}||d          z   S r*   r   )r   s1s2minlens      r   r   z MRA.__call__.<locals>.<listcomp>A   s*    ;;;fb"bk);;;r   )allr   r   r   r   absminrangezip_identappendr   )
r   r!   lengthscount
max_lengthr,   new_sequencescharsssr9   s
   `        @r   __call__zMRA.__call__.   s[   9~~ 	1@@@@i@@@	s3	**++G\\
zCLL())E111u 	0 	0AM\\Fi 0 0"t{E* 0!((///c=&9::M]IHHHB;;;;;;;I3sI..//GG 	CLL((r   N)__name__
__module____qualname____doc__r"   r   rG   r   r   r   r
   r
      sK         
( ( (	 	 	) ) ) ) )r   r
   c                      e Zd ZdZ ed           ed           ed           ed           ed           ed           ed           ed	           ed
           ed          f
Z ed          Z	 	 ddZd Zd Z	d Z
d ZdS )r   al  
    https://anhaidgroup.github.io/py_stringmatching/v0.3.x/Editex.html
    http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.14.3856&rep=rep1&type=pdf
    http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.18.2138&rep=rep1&type=pdf
    https://github.com/chrislit/blob/master/abydos/distance/_editex.py
    https://habr.com/ru/post/331174/ (RUS)
    AEIOUYBPCKQDTLRMNGJFPVSXZCSZHWFr   r      NTc                     || _         || _        || _        || _        || _        ||t          d          || _        || _        t          j	        | j         | _
        t          | d          r| j        | _        d S d S )Nz+`ungrouped` argument required with `groups`letter_groups)
match_cost
group_costmismatch_costlocalexternal
ValueErrorgroups	ungrouped	frozensetuniongroupedhasattrrZ   )r   r^   r[   r\   r]   ra   rb   r_   s           r   __init__zEditex.__init__`   s    $$*
   !NOOO DK&DN 4 4)) 	-,DKKK	- 	-r   c                 V    t          t          t          |                    | j        z  S r*   )r   r   r   r]   r    s     r   r"   zEditex.maximums   s"    3sI&&''$*<<<r   c                        j         | r j        S t          t           fd|                    r j        S  j        D ]+t          t          fd|                    r	 j        c S , j        S )Nc                     | j         vS r*   )re   )xr   s    r   <lambda>zEditex.r_cost.<locals>.<lambda>y   s    Qdl2 r   c                     | v S r*   r   )rk   groups    r   rl   zEditex.r_cost.<locals>.<lambda>|   s    e r   )r?   r[   anyr   r]   ra   r:   r\   )r   elementsrn   s   ` @r   r_costzEditex.r_costv   s    4;! 	#?"s2222H==>> 	&%%[ 	' 	'E3++++X6677 '&&&'!!r   c                 V     | j         | s|d         | j        v r| j        S  | j        | S )Nr   )r?   rb   r\   rq   )r   rp   s     r   d_costzEditex.d_cost   s:    t{H% 	#(1+*G*G?"t{H%%r   c                    |                      ||          }||S d|                                z   }d|                                z   }t          |          dz
  }t          |          dz
  }t          r)t          j        |dz   |dz   ft          j                  }nt          d           }| j        sVt          d|dz             D ]B}||dz
           d         | 	                    ||dz
           ||                   z   ||         d<   Ct          d|dz             D ]B}|d         |dz
           | 	                    ||dz
           ||                   z   |d         |<   Ct          t          ||dd                    d          D ]\  }\  }	}
t          t          ||dd                    d          D ]\  }\  }}t          ||dz
           |         | 	                    |	|
          z   ||         |dz
           | 	                    ||          z   ||dz
           |dz
           |                     |
|          z             ||         |<   ||         |         S )N r   )dtypec                  *    t          t                    S r*   )r   intr   r   r   rl   z!Editex.__call__.<locals>.<lambda>   s    C(8(8 r   r   )start)quick_answerr0   r   numpyzerosrx   r   r^   r=   rs   	enumerater>   r<   rq   )r   r7   r8   resultlen_s1len_s2d_matijcs1_prevcs1_currcs2_prevcs2_currs                r   rG   zEditex.__call__   sg   ""2r**M 288::288::R1R1 	:K!VaZ 8	JJJEE 8 899Ez 	N1fqj)) N N#AEl1oBq1uIr!u0M0MMaq&1*%% 	J 	JA(1q5/DKK1q5	2a5,I,IIE!HQKK'0RABB'J'J'J 	 	#A#(+4SRV__A+N+N+N  ''Hh!!a%LOdkk(H&E&EE!HQUOdkk(H&E&EE!a%LQ'$++h*I*II a V}V$$r   )Fr   r   rX   NNT)rH   rI   rJ   rK   rc   ra   rb   rg   r"   rq   rs   rG   r   r   r   r   r   J   s         		(	$	%	$	$	$	$	%	%	%F 	$INO7;- - - -&= = =" " "& & &
% % % % %r   r   )collectionsr   	itertoolsr   baser   _Baser   _BaseSimilarityr   ImportErrorr	   r{   __all__r
   r   r   r   r   r   r   <module>r      sP   # # # # # #       C B B B B B B B6%%%%%%% 6 6 6555555556LLLL   EEE  .) .) .) .) .)/ .) .) .)bY% Y% Y% Y% Y%U Y% Y% Y%x 
cee	s    ++4 >>