a
    yhf                     @  st   d dl mZ dd Zdd ZG dd dZG dd	 d	ZG d
d dZG dd dZG dd dZG dd dZ	dS )    )annotationsc           
      C  sF  | sg S t | d dkr*t| || jS g }| D ]~}|\}}}||ksP||kr\d}t|||krx|dkrxd}t|||kr|dkrd}t||dkrq2|t||| q2tt |d D ]~}	||	d  j||	 jk s||	d  j	||	 j	k rd}t|||	d  j||	 jkr||	d  j	||	 j	krd	}t|q|S )
Nr      List of edit operations invalidinsertdeleteequal   z$List of edit operations out of orderzDuplicated edit operation)
lenOpcodes
as_editops_editops
ValueErrorappendEditoprangesrc_posdest_pos)
opssrc_lendest_lenblocksop	edit_typer   r   msgi r   ]/var/www/html/assistant/venv/lib/python3.9/site-packages/rapidfuzz/distance/_initialize_py.py_list_to_editops   s6    
20
r   c              	   C  s  | rt | d dkr&t| || jS g }| D ] }|\}}}}}	||ksR|	|kr^d}
t|
||k sn|	|k rzd}
t|
|dv r|| |	| ks||krd}
t|
|dkr||ks||	krd}
t|
|dkr||ks||	krd}
t|
|r:|d j|kr:|d j|kr:|d j|kr:||d _|	|d _q.|t	|||||	 q.|d j
dksr|d jdkr~d}
t|
|d j|ks|d j|krd	}
t|
tt |d
 D ]F}||d
  j
|| jks||d
  j|| jkrd}
t|
q|S )Nr      r   >   r   replacer   r   z4List of edit operations does not start at position 0z7List of edit operations does not end at the string endsr   z)List of edit operations is not continuous)r	   Editops
as_opcodes_opcodesr   tagsrc_enddest_endr   Opcode	src_start
dest_startr   )r   r   r   r   r   r   r(   r%   r)   r&   r   r   r   r   r   _list_to_opcodes2   sT    
 

  4r*   c                   @  s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )MatchingBlockz1
    Triple describing matching subsequences
    c                 C  s   || _ || _|| _d S Nabsize)selfr.   r/   r0   r   r   r   __init__m   s    zMatchingBlock.__init__c                 C  s   dS Nr   r   r1   r   r   r   __len__r   s    zMatchingBlock.__len__c                 C  s\   zBt |dkrW dS t|d | jko>|d | jko>|d | jkW S  tyV   Y dS 0 d S Nr   Fr   r      )r	   boolr.   r/   r0   	TypeErrorr1   otherr   r   r   __eq__u   s    0zMatchingBlock.__eq__c                 C  s:   |dv r| j S |dv r| jS |dv r*| jS d}t|d S )N   r      r      r7   r    z MatchingBlock index out of range)r.   r/   r0   
IndexErrorr1   r   r   r   r   r   __getitem__~   s    zMatchingBlock.__getitem__c                 c  s   t dD ]}| | V  qd S r3   r   r1   r   r   r   r   __iter__   s    zMatchingBlock.__iter__c                 C  s   d| j  d| j d| j dS )NzMatchingBlock(a=z, b=z, size=)r-   r4   r   r   r   __repr__   s    zMatchingBlock.__repr__N
__name__
__module____qualname____doc__r2   r5   r<   rD   rG   rI   r   r   r   r   r+   h   s   	r+   c                   @  s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )r   a  
    Tuple like object describing an edit operation.
    It is in the form (tag, src_pos, dest_pos)

    The tags are strings, with these meanings:

    +-----------+---------------------------------------------------+
    | tag       | explanation                                       |
    +===========+===================================================+
    | 'replace' | src[src_pos] should be replaced by dest[dest_pos] |
    +-----------+---------------------------------------------------+
    | 'delete'  | src[src_pos] should be deleted                    |
    +-----------+---------------------------------------------------+
    | 'insert'  | dest[dest_pos] should be inserted at src[src_pos] |
    +-----------+---------------------------------------------------+
    c                 C  s   || _ || _|| _d S r,   r$   r   r   )r1   r$   r   r   r   r   r   r2      s    zEditop.__init__c                 C  s   dS r3   r   r4   r   r   r   r5      s    zEditop.__len__c                 C  s\   zBt |dkrW dS t|d | jko>|d | jko>|d | jkW S  tyV   Y dS 0 d S r6   )r	   r8   r$   r   r   r9   r:   r   r   r   r<      s    0zEditop.__eq__c                 C  s:   |dv r| j S |dv r| jS |dv r*| jS d}t|d S )Nr=   r?   rA   zEditop index out of range)r$   r   r   rB   rC   r   r   r   rD      s    zEditop.__getitem__c                 c  s   t dD ]}| | V  qd S r3   rE   rF   r   r   r   rG      s    zEditop.__iter__c                 C  s   d| j d| j d| j dS )NzEditop(tag=z
, src_pos=z, dest_pos=rH   rO   r4   r   r   r   rI      s    zEditop.__repr__NrJ   r   r   r   r   r      s   	r   c                   @  s   e Zd ZdZd(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edd Zejdd Zedd Zejdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' ZdS ))r!   zH
    List like object of Editops describing how to turn s1 into s2.
    Nr   c                 C  s   || _ || _t|||| _d S r,   )_src_len	_dest_lenr   r   )r1   editopsr   r   r   r   r   r2      s    zEditops.__init__c                 C  s   |  S )z
        Create Editops from Opcodes

        Parameters
        ----------
        opcodes : Opcodes
            opcodes to convert to editops

        Returns
        -------
        editops : Editops
            Opcodes converted to Editops
        )r   )clsopcodesr   r   r   from_opcodes   s    zEditops.from_opcodesc           	   	   C  s  t t }| j|_| j|_g }d}d}d}|t| jk rV|| j| jk sZ|| j| jk r|t	d|| j| j|| j| j | j| j}| j| j}|}|}| j| j
}|t| jk r>| j| j
|kr>|| j| jkr>|| j| jkr>|dkr|d7 }|d7 }n&|dkr"|d7 }n|dkr4|d7 }|d7 }q|t	||||| q*|| jk sn|| jk r|t	d|| j|| j ||_|S )z
        Convert to Opcodes

        Returns
        -------
        opcodes : Opcodes
            Editops converted to Opcodes
        r   r   r   r   r   r   )r
   __new__rP   rQ   r	   r   r   r   r   r'   r$   r   r   r#   )	r1   xr   r   r   r   Z	src_beginZ
dest_beginr$   r   r   r   r"      sX    	
 

	





zEditops.as_opcodesc                 C  s  g }d}d}| D ]}||j k s(||jk rdt|j | |j| }|dkrX|t||| |j }|j}|jdkr|d7 }|d7 }q|jdkr|d7 }q|jdkr|d7 }q|| jk s|| jk rt| j| | j| }|dkr|t||| |t| j| jd |S )z
        Convert to matching blocks

        Returns
        -------
        matching blocks : list[MatchingBlock]
            Editops converted to matching blocks
        r   r   r   r   r   )r   r   minr   r+   r$   r   r   )r1   r   r   r   r   lengthr   r   r   as_matching_blocks   s.    	





zEditops.as_matching_blocksc                 C  s   dd | j D S )zr
        Convert Editops to a list of tuples.

        This is the equivalent of ``[x for x in editops]``
        c                 S  s   g | ]}t |qS r   tuple.0r   r   r   r   
<listcomp>J      z#Editops.as_list.<locals>.<listcomp>r   r4   r   r   r   as_listD  s    zEditops.as_listc                 C  s.   t t }| j|_| j|_| jdd |_|S )z*
        performs copy of Editops
        N)r!   rV   rP   rQ   r   r1   rW   r   r   r   copyL  s
    
zEditops.copyc                 C  sh   g }| D ]:}|j }|dkr d}n|dkr,d}|t||j|j qtt}| j|_| j	|_
||_|S )a  
        Invert Editops, so it describes how to transform the destination string to
        the source string.

        Returns
        -------
        editops : Editops
            inverted Editops

        Examples
        --------
        >>> from rapidfuzz.distance import Levenshtein
        >>> Levenshtein.editops('spam', 'park')
        [Editop(tag=delete, src_pos=0, dest_pos=0),
         Editop(tag=replace, src_pos=3, dest_pos=2),
         Editop(tag=insert, src_pos=4, dest_pos=3)]

        >>> Levenshtein.editops('spam', 'park').inverse()
        [Editop(tag=insert, src_pos=0, dest_pos=0),
         Editop(tag=replace, src_pos=2, dest_pos=3),
         Editop(tag=delete, src_pos=3, dest_pos=4)]
        r   r   )r$   r   r   r   r   r!   rV   r   rP   r   rQ   r   r1   r   r   r$   rW   r   r   r   inverseV  s    
zEditops.inversec                 C  s:  t t }| j|_| j|_t|t| kr6d}t|dgt| t|  |_d}d}d}|D ]}|t| kr|| j| kr| j| ||< ||  j|7  _|d7 }|d7 }qb|t| krd}t||jdkr|d7 }n|jdkr|d8 }|d7 }q^|t| kr6| j| ||< ||  j|7  _|d7 }|d7 }q|S )a#  
        remove a subsequence

        Parameters
        ----------
        subsequence : Editops
            subsequence to remove (has to be a subset of editops)

        Returns
        -------
        sequence : Editops
            a copy of the editops without the subsequence
        z subsequence is not a subsequenceNr   r   r   r   )	r!   rV   rP   rQ   r	   r   r   r   r$   )r1   Zsubsequenceresultr   offsetZop_posZ
result_posZsopr   r   r   remove_subsequence}  s<    






zEditops.remove_subsequencec                 C  s   d}d}| j D ]r}||jk r2||| 7 }|d7 }q|jdkrT|||j 7 }|d7 }q|jdkrn|||j 7 }q|jdkr|d7 }q|t|k r||| 7 }|d7 }q|S )at  
        apply editops to source_string

        Parameters
        ----------
        source_string : str | bytes
            string to apply editops to
        destination_string : str | bytes
            string to use for replacements / insertions into source_string

        Returns
        -------
        mod_string : str
            modified source_string

         r   r   r   r   r   )r   r   r$   r   r	   )r1   source_stringdestination_stringres_strr   r   r   r   r   apply  s"    








zEditops.applyc                 C  s   | j S r,   rP   r4   r   r   r   r     s    zEditops.src_lenc                 C  s
   || _ d S r,   ro   r1   valuer   r   r   r     s    c                 C  s   | j S r,   rQ   r4   r   r   r   r     s    zEditops.dest_lenc                 C  s
   || _ d S r,   rr   rp   r   r   r   r     s    c                 C  s2   t |tsdS | j|jko0| j|jko0| j|jkS NF)
isinstancer!   r   r   r   r:   r   r   r   r<     s    
zEditops.__eq__c                 C  s
   t | jS r,   )r	   r   r4   r   r   r   r5     s    zEditops.__len__c                 C  s   | j |= d S r,   ra   )r1   keyr   r   r   __delitem__  s    zEditops.__delitem__c                 C  sn   t |tr| j| S |t| j\}}}|dk r>d}t|tt}| j|_| j	|_	| j||| |_|S )Nr   z6step sizes below 0 lead to an invalid order of editops)
rt   intr   indicesr	   r   r!   rV   rP   rQ   )r1   ru   startstopstepr   rW   r   r   r   rD     s    


zEditops.__getitem__c                 c  s   | j E d H  d S r,   ra   r4   r   r   r   rG   
  s    zEditops.__iter__c                 C  s.   dd dd | D  d| j d| j d S )Nz	Editops([, c                 s  s   | ]}t |V  qd S r,   reprr]   r   r   r   	<genexpr>  r`   z#Editops.__repr__.<locals>.<genexpr>], src_len=, dest_len=rH   joinr   r   r4   r   r   r   rI     s    ,zEditops.__repr__)Nr   r   )rK   rL   rM   rN   r2   classmethodrU   r"   rZ   rb   rd   rf   ri   rn   propertyr   setterr   r<   r5   rv   rD   rG   rI   r   r   r   r   r!      s8      


9$
'9)



r!   c                   @  s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )r'   ai  
    Tuple like object describing an edit operation.
    It is in the form (tag, src_start, src_end, dest_start, dest_end)

    The tags are strings, with these meanings:

    +-----------+-----------------------------------------------------+
    | tag       | explanation                                         |
    +===========+=====================================================+
    | 'replace' | src[src_start:src_end] should be                    |
    |           | replaced by dest[dest_start:dest_end]               |
    +-----------+-----------------------------------------------------+
    | 'delete'  | src[src_start:src_end] should be deleted.           |
    |           | Note that dest_start==dest_end in this case.        |
    +-----------+-----------------------------------------------------+
    | 'insert'  | dest[dest_start:dest_end] should be inserted        |
    |           | at src[src_start:src_start].                        |
    |           | Note that src_start==src_end in this case.          |
    +-----------+-----------------------------------------------------+
    | 'equal'   | src[src_start:src_end] == dest[dest_start:dest_end] |
    +-----------+-----------------------------------------------------+

    Note
    ----
    Opcode is compatible with the tuples returned by difflib's SequenceMatcher to make them
    interoperable
    c                 C  s"   || _ || _|| _|| _|| _d S r,   r$   r(   r%   r)   r&   )r1   r$   r(   r%   r)   r&   r   r   r   r2   0  s
    zOpcode.__init__c                 C  s   dS Nr   r   r4   r   r   r   r5   7  s    zOpcode.__len__c                 C  sx   z^t |dkrW dS t|d | jkoZ|d | jkoZ|d | jkoZ|d | jkoZ|d | jkW S  tyr   Y dS 0 d S Nr   Fr   r   r7   r      )r	   r8   r$   r(   r%   r)   r&   r9   r:   r   r   r   r<   :  s    zOpcode.__eq__c                 C  sV   |dv r| j S |dv r| jS |dv r*| jS |dv r8| jS |dv rF| jS d}t|d S N>   r   >   r   >   r7   r>   >   r   r@   >   r   r    zOpcode index out of range)r$   r(   r%   r)   r&   rB   rC   r   r   r   rD   I  s    zOpcode.__getitem__c                 c  s   t dD ]}| | V  qd S r   rE   rF   r   r   r   rG   X  s    zOpcode.__iter__c                 C  s.   d| j d| j d| j d| j d| j dS )NzOpcode(tag=, src_start=
, src_end=, dest_start=, dest_end=rH   r   r4   r   r   r   rI   \  s    zOpcode.__repr__NrJ   r   r   r   r   r'     s   r'   c                   @  s   e Zd ZdZd$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ejdd Zedd Zejdd Zdd Zdd Zdd Zd d! Zd"d# ZdS )%r
   a  
    List like object of Opcodes describing how to turn s1 into s2.
    The first Opcode has src_start == dest_start == 0, and remaining tuples
    have src_start == the src_end from the tuple preceding it,
    and likewise for dest_start == the previous dest_end.
    Nr   c                 C  s   || _ || _t|||| _d S r,   )rP   rQ   r*   r#   )r1   rT   r   r   r   r   r   r2   k  s    zOpcodes.__init__c                 C  s   |  S )z
        Create Opcodes from Editops

        Parameters
        ----------
        editops : Editops
            editops to convert to opcodes

        Returns
        -------
        opcodes : Opcodes
            Editops converted to Opcodes
        )r"   )rS   rR   r   r   r   from_editopsu  s    zOpcodes.from_editopsc              	   C  s   t t }| j|_| j|_g }| D ]}|jdkrft|j|j D ]"}|t	d|j| |j
|  q@q"|jdkrt|j|j
 D ]}|t	d|j|j
|  qq"|jdkr"t|j|j D ]}|t	d|j| |j
 qq"||_|S )z
        Convert Opcodes to Editops

        Returns
        -------
        editops : Editops
            Opcodes converted to Editops
        r   r   r   )r!   rV   rP   rQ   r$   r   r%   r(   r   r   r)   r&   r   )r1   rW   r   r   jr   r   r   r     s     	

"

zOpcodes.as_editopsc                 C  sj   g }| D ]F}|j dkrt|j|j |j|j }|dkr|t|j|j| q|t| j| j	d |S )z
        Convert to matching blocks

        Returns
        -------
        matching blocks : list[MatchingBlock]
            Opcodes converted to matching blocks
        r   r   )
r$   rX   r%   r(   r&   r)   r   r+   r   r   )r1   r   r   rY   r   r   r   rZ     s    	
zOpcodes.as_matching_blocksc                 C  s   dd | j D S )z
        Convert Opcodes to a list of tuples, which is compatible
        with the opcodes of difflibs SequenceMatcher.

        This is the equivalent of ``[x for x in opcodes]``
        c                 S  s   g | ]}t |qS r   r[   r]   r   r   r   r_     r`   z#Opcodes.as_list.<locals>.<listcomp>r#   r4   r   r   r   rb     s    zOpcodes.as_listc                 C  s.   t t }| j|_| j|_| jdd |_|S )z*
        performs copy of Opcodes
        N)r
   rV   rP   rQ   r#   rc   r   r   r   rd     s
    
zOpcodes.copyc              	   C  sp   g }| D ]B}|j }|dkr d}n|dkr,d}|t||j|j|j|j qtt}| j	|_
| j|_||_|S )a  
        Invert Opcodes, so it describes how to transform the destination string to
        the source string.

        Returns
        -------
        opcodes : Opcodes
            inverted Opcodes

        Examples
        --------
        >>> from rapidfuzz.distance import Levenshtein
        >>> Levenshtein.opcodes('spam', 'park')
        [Opcode(tag=delete, src_start=0, src_end=1, dest_start=0, dest_end=0),
         Opcode(tag=equal, src_start=1, src_end=3, dest_start=0, dest_end=2),
         Opcode(tag=replace, src_start=3, src_end=4, dest_start=2, dest_end=3),
         Opcode(tag=insert, src_start=4, src_end=4, dest_start=3, dest_end=4)]

        >>> Levenshtein.opcodes('spam', 'park').inverse()
        [Opcode(tag=insert, src_start=0, src_end=0, dest_start=0, dest_end=1),
         Opcode(tag=equal, src_start=0, src_end=2, dest_start=1, dest_end=3),
         Opcode(tag=replace, src_start=2, src_end=3, dest_start=3, dest_end=4),
         Opcode(tag=delete, src_start=3, src_end=4, dest_start=4, dest_end=4)]
        r   r   )r$   r   r'   r)   r&   r(   r%   r
   rV   r   rP   r   rQ   r#   re   r   r   r   rf     s     
zOpcodes.inversec                 C  sR   d}| j D ]B}|jdkr.|||j|j 7 }q
|jdv r
|||j|j 7 }q
|S )at  
        apply opcodes to source_string

        Parameters
        ----------
        source_string : str | bytes
            string to apply opcodes to
        destination_string : str | bytes
            string to use for replacements / insertions into source_string

        Returns
        -------
        mod_string : str
            modified source_string

        rj   r   >   r   r   )r#   r$   r(   r%   r)   r&   )r1   rk   rl   rm   r   r   r   r   rn     s    


zOpcodes.applyc                 C  s   | j S r,   ro   r4   r   r   r   r     s    zOpcodes.src_lenc                 C  s
   || _ d S r,   ro   rp   r   r   r   r     s    c                 C  s   | j S r,   rr   r4   r   r   r   r     s    zOpcodes.dest_lenc                 C  s
   || _ d S r,   rr   rp   r   r   r   r     s    c                 C  s2   t |tsdS | j|jko0| j|jko0| j|jkS rs   )rt   r
   r   r   r#   r:   r   r   r   r<     s    
zOpcodes.__eq__c                 C  s
   t | jS r,   )r	   r#   r4   r   r   r   r5   !  s    zOpcodes.__len__c                 C  s$   t |tr| j| S d}t|d S )NzExpected index)rt   rw   r#   r9   )r1   ru   r   r   r   r   rD   $  s    

zOpcodes.__getitem__c                 c  s   | j E d H  d S r,   r   r4   r   r   r   rG   +  s    zOpcodes.__iter__c                 C  s.   dd dd | D  d| j d| j d S )Nz	Opcodes([r|   c                 s  s   | ]}t |V  qd S r,   r}   r]   r   r   r   r   0  r`   z#Opcodes.__repr__.<locals>.<genexpr>r   r   rH   r   r4   r   r   r   rI   .  s    ,zOpcodes.__repr__)Nr   r   )rK   rL   rM   rN   r2   r   r   r   rZ   rb   rd   rf   rn   r   r   r   r   r<   r5   rD   rG   rI   r   r   r   r   r
   c  s4   	   


	
)



r
   c                   @  s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )ScoreAlignmentz
    Tuple like object describing the position of the compared strings in
    src and dest.

    It indicates that the score has been calculated between
    src[src_start:src_end] and dest[dest_start:dest_end]
    c                 C  s"   || _ || _|| _|| _|| _d S r,   scorer(   r%   r)   r&   )r1   r   r(   r%   r)   r&   r   r   r   r2   =  s
    zScoreAlignment.__init__c                 C  s   dS r   r   r4   r   r   r   r5   K  s    zScoreAlignment.__len__c                 C  sx   z^t |dkrW dS t|d | jkoZ|d | jkoZ|d | jkoZ|d | jkoZ|d | jkW S  tyr   Y dS 0 d S r   )r	   r8   r   r(   r%   r)   r&   r9   r:   r   r   r   r<   N  s    zScoreAlignment.__eq__c                 C  sV   |dv r| j S |dv r| jS |dv r*| jS |dv r8| jS |dv rF| jS d}t|d S r   )r   r(   r%   r)   r&   rB   rC   r   r   r   rD   ]  s    zScoreAlignment.__getitem__c                 c  s   t dD ]}| | V  qd S r   rE   rF   r   r   r   rG   l  s    zScoreAlignment.__iter__c                 C  s.   d| j  d| j d| j d| j d| j dS )NzScoreAlignment(score=r   r   r   r   rH   r   r4   r   r   r   rI   p  s    zScoreAlignment.__repr__NrJ   r   r   r   r   r   4  s   r   N)

__future__r   r   r*   r+   r   r!   r'   r
   r   r   r   r   r   <module>   s   ,6)6  NP R