
    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                   | st          |          S dt          |           z  dz
  }d}d}d}t          |           }dt          |           dz
  z  }i }|j        }	d}
| D ]} |	|d          |
z  ||<   |
dz  }
|D ]s} |	|d          }| |z  dz  |z  }||z  |z   |z  |z  |z  }||z  }|||z   z  }||z  }|||z  dk    z  }|||z  dk    z  }|dz  dz  }|dz  }|||z   z  }||z  }|}t|S )N   r   )lenget)r   r
   VPVND0PM_j_oldcurrDistmaskblock	block_getxch1ch2PM_jTRHPHNs                    ]/home/feoh/.local/pipx/venvs/poetry/lib/python3.11/site-packages/rapidfuzz/distance/OSA_py.py_osa_distance_hyrroe2003r!      su    2ww
s2ww,!	B	
B	
BH2wwHR1D!#E	I	A  YsA&&*c
	a  ya  t|!X-r	R2%-2"W BG*_"W 	R$Y1$$R$Y1$$ Ag]1WBG*_"WO    N)	processorscore_cutoffr#   (Callable[..., Sequence[Hashable]] | Noner$   
int | Nonec               p    | ||           }  ||          }t          | |          }|||k    r|n|dz   S )a  
    Calculates the optimal string alignment (OSA) 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 OSA distance between two strings:

    >>> from rapidfuzz.distance import OSA
    >>> OSA.distance("CA", "AC")
    2
    >>> OSA.distance("CA", "ABC")
    3
    Nr   )r!   )r   r
   r#   r$   dists        r    distancer)   6   sS    P Yr]]Yr]]#B++D (DL,@,@44|VWGWWr"   c                   | ||           }  ||          }t          t          |           t          |                    }t          | |          }||z
  }|||k    r|ndS )a5  
    Calculates the optimal string alignment (OSA) 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   )maxr   r)   )r   r
   r#   r$   maximumr(   sims          r    
similarityr.   f   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 )aM  
    Calculates a normalized optimal string alignment (OSA) 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   r)   )r   r
   r#   r$   r,   r(   	norm_dists          r    normalized_distancer4      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 )aE  
    Calculates a normalized optimal string alignment (OSA) 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        Nr2   r   )r   r4   )r   r
   r#   r$   r3   norm_sims         r    normalized_similarityr7      su    > r{{ gbkk sYr]]Yr]]#B++IYH$,L0H0H88qPr"   )r   r	   r
   r	   r   r   )
r   r	   r
   r	   r#   r%   r$   r&   r   r   )
r   r	   r
   r	   r#   r%   r$   r/   r   r0   )
__future__r   typingr   r   r   rapidfuzz._utilsr   r!   r)   r.   r4   r7    r"   r    <module>r<      s   # " " " " " / / / / / / / / / / $ $ $ $ $ $( ( ( (^ ;?#-X -X -X -X -X -Xh ;?#'G 'G 'G 'G 'G 'G\ ;?!%)S )S )S )S )S )S` ;?!%(Q (Q (Q (Q (Q (Q (Q (Qr"   