
    d                    z    d dl mZ d dlmZmZmZ d dlmZ dd	Zd
d
dddZ	d
d
dddZ
d
d
dddZd
d
dddZd
S )    )annotations)CallableHashableSequence)is_nones1Sequence[Hashable]s2returnintc                   t          t          |           t          |                    dz   }i }|j        }t          |          dz   }|g|z  }|g|z  }d t          |          D             }||d<   t          dt          |           dz             D ]/}	||}}d}
|d         }|	|d<   |}t          dt          |          dz             D ]}||dz
           | |	dz
           ||dz
           k    z   }||dz
           dz   }||         dz   }t	          |||          }| |	dz
           ||dz
           k    r|}
||dz
           ||<   |}n` |||dz
           d          }|
}||z
  dk    r||         |	|z
  z   }t	          ||          }n!|	|z
  dk    r|||z
  z   }t	          ||          }||         }|||<   |	|| |	dz
           <   1|t          |                   }|S )N      c                    g | ]}|S  r   ).0xs     l/home/feoh/.local/pipx/venvs/poetry/lib/python3.11/site-packages/rapidfuzz/distance/DamerauLevenshtein_py.py
<listcomp>z6_damerau_levenshtein_distance_zhao.<locals>.<listcomp>   s       q       r   )maxlengetrangemin)r   r
   maxVallast_row_idlast_row_id_getsizeFRR1Rilast_col_id	last_i2l1Tjdiagleftuptempkl	transposedists                         r   "_damerau_levenshtein_distance_zhaor1      s#    R#b''""Q&F')K!oOr77Q;D
DB
DB  E$KK   AAbE1c"ggk"" # #A2aD	!q#b''A+&& 	 	Aa!e91q5	RAY 67DQU8a<DABtT2&&D!a%yBq1uI%%1q5	1#OBq1uIr22Ea<< "1QItY//DD!e\\ !QUItY//D!IAaDD!"Bq1uISWW:DKr   N)	processorscore_cutoffr2   (Callable[..., Sequence[Hashable]] | Noner3   
int | Nonec               p    | ||           }  ||          }t          | |          }|||k    r|n|dz   S )a  
    Calculates the Damerau-Levenshtein distance.

    Parameters
    ----------
    s1 : Sequence[Hashable]
        First string to compare.
    s2 : Sequence[Hashable]
        Second string to compare.
    processor: callable, optional
        Optional callable that is used to preprocess the strings before
        comparing them. Default is None, which deactivates this behaviour.
    score_cutoff : int, optional
        Maximum distance between s1 and s2, that is
        considered as a result. If the distance is bigger than score_cutoff,
        score_cutoff + 1 is returned instead. Default is None, which deactivates
        this behaviour.

    Returns
    -------
    distance : int
        distance between s1 and s2

    Examples
    --------
    Find the Damerau-Levenshtein distance between two strings:

    >>> from rapidfuzz.distance import DamerauLevenshtein
    >>> DamerauLevenshtein.distance("CA", "ABC")
    2
    Nr   )r1   )r   r
   r2   r3   r0   s        r   distancer7   <   sS    L Yr]]Yr]]-b"55D (DL,@,@44|VWGWWr   c                   | ||           }  ||          }t          t          |           t          |                    }t          | |          }||z
  }|||k    r|ndS )a*  
    Calculates the Damerau-Levenshtein similarity in the range [max, 0].

    This is calculated as ``max(len1, len2) - distance``.

    Parameters
    ----------
    s1 : Sequence[Hashable]
        First string to compare.
    s2 : Sequence[Hashable]
        Second string to compare.
    processor: callable, optional
        Optional callable that is used to preprocess the strings before
        comparing them. Default is None, which deactivates this behaviour.
    score_cutoff : int, optional
        Maximum distance between s1 and s2, that is
        considered as a result. If the similarity is smaller than score_cutoff,
        0 is returned instead. Default is None, which deactivates
        this behaviour.

    Returns
    -------
    similarity : int
        similarity between s1 and s2
    Nr   )r   r   r7   )r   r
   r2   r3   maximumr0   sims          r   
similarityr;   j   sq    @ Yr]]Yr]]#b''3r77##GBD
D.C'3,+>+>33QFr   float | Nonefloatc                  t          |           st          |          rdS | ||           }  ||          }t          t          |           t          |                    }t          | |          }|r||z  nd}|||k    r|ndS )aB  
    Calculates a normalized Damerau-Levenshtein similarity in the range [1, 0].

    This is calculated as ``distance / max(len1, len2)``.

    Parameters
    ----------
    s1 : Sequence[Hashable]
        First string to compare.
    s2 : Sequence[Hashable]
        Second string to compare.
    processor: callable, optional
        Optional callable that is used to preprocess the strings before
        comparing them. Default is None, which deactivates this behaviour.
    score_cutoff : float, optional
        Optional argument for a score threshold as a float between 0 and 1.0.
        For norm_dist > score_cutoff 1.0 is returned instead. Default is 1.0,
        which deactivates this behaviour.

    Returns
    -------
    norm_dist : float
        normalized distance between s1 and s2 as a float between 0 and 1.0
          ?Nr   r   )r   r   r   r7   )r   r
   r2   r3   r9   r0   	norm_dists          r   normalized_distancerA      s    > r{{ gbkk sYr]]Yr]]#b''3r77##GBD")0wqI%-l1J1J99QRRr   c                   t          |           st          |          rdS | ||           }  ||          }t          | |          }d|z
  }|||k    r|ndS )a:  
    Calculates a normalized Damerau-Levenshtein similarity in the range [0, 1].

    This is calculated as ``1 - normalized_distance``

    Parameters
    ----------
    s1 : Sequence[Hashable]
        First string to compare.
    s2 : Sequence[Hashable]
        Second string to compare.
    processor: callable, optional
        Optional callable that is used to preprocess the strings before
        comparing them. Default is None, which deactivates this behaviour.
    score_cutoff : float, optional
        Optional argument for a score threshold as a float between 0 and 1.0.
        For norm_sim < score_cutoff 0 is returned instead. Default is 0,
        which deactivates this behaviour.

    Returns
    -------
    norm_sim : float
        normalized similarity between s1 and s2 as a float between 0 and 1.0
    g        Nr?   r   )r   rA   )r   r
   r2   r3   r@   norm_sims         r   normalized_similarityrD      su    > r{{ gbkk sYr]]Yr]]#B++IYH$,L0H0H88qPr   )r   r	   r
   r	   r   r   )
r   r	   r
   r	   r2   r4   r3   r5   r   r   )
r   r	   r
   r	   r2   r4   r3   r<   r   r=   )
__future__r   typingr   r   r   rapidfuzz._utilsr   r1   r7   r;   rA   rD   r   r   r   <module>rH      s   # " " " " " / / / / / / / / / / $ $ $ $ $ $. . . .j ;?#+X +X +X +X +X +Xd ;?#'G 'G 'G 'G 'G 'G\ ;?!%)S )S )S )S )S )S` ;?!%(Q (Q (Q (Q (Q (Q (Q (Qr   