o
    j.(                     @   s  d dl mZ d dlmZmZmZ d dlmZmZ d dl	m
Z
mZ d dlmZ d dlmZmZ d dlmZmZmZmZ d dlZd dlZed	ZG d
d dZdd Zdd ZG dd deZG dd deZG dd deZdd Z dd Z!dd Z"dd Z#dd Z$d d! Z%z
d d"l&m'Z' e#Z(W n e)y   z
d d#l*m+Z+ e$Z(W n e)y   e%Z(Y nw Y nw d$d% Z,d&d' Z-d(d) Z.d*Z/d+d, Z0d-d. Z1e2 d/d0d1Z3dS )2    )LerpGlyphSet)AbstractPenBasePenDecomposingPen)AbstractPointPenSegmentToPointPen)RecordingPenDecomposingRecordingPen)	Transform)defaultdictdeque)sqrtcopysignatan2piNzfontTools.varLib.interpolatablec                   @   sh   e Zd ZdZdZdZdZdZdZdZ	dZ
d	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ediZdS )InterpolatableProblemZnothingmissingZ	open_pathZ
path_countZ
node_countZnode_incompatibilityZcontour_orderZwrong_start_pointZkinkZunderweightZ
overweight                        	   
      N)__name__
__module____qualname__ZNOTHINGMISSINGZ	OPEN_PATHZ
PATH_COUNTZ
NODE_COUNTZNODE_INCOMPATIBILITYZCONTOUR_ORDERZWRONG_START_POINTZKINKZUNDERWEIGHTZ
OVERWEIGHTseverity r#   r#   g/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/fontTools/varLib/interpolatableHelpers.pyr      s0    r   c                 C   s   t t|  dd ddS )z6Sort problem groups by their most severe problem type.c                 S   s   t dd | d D  S )Nc                 s   s*    | ]}t j|d   |dd V  qdS )typeZ	tolerancer   N)r   r"   get).0pr#   r#   r$   	<genexpr>1   s
    
z2sort_problems.<locals>.<lambda>.<locals>.<genexpr>r   )min)_r#   r#   r$   <lambda>0   s
    zsort_problems.<locals>.<lambda>T)keyreverse)dictsorteditems)problemsr#   r#   r$   sort_problems+   s   r3   c                 C   s   | | d | d|   S )z{Rotate list by k items forward.  Ie. item at position 0 will be
    at position k in returned list.  Negative k is allowed.Nr#   )lkr#   r#   r$   rot_list;   s   r6   c                   @   sN   e Zd Zd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 )PerContourPenNc                 C   s"   t | | || _d | _g | _d S N)r   __init___Pen_penvalue)selfZPenZglyphsetr#   r#   r$   r9   B   s   
zPerContourPen.__init__c                 C   s   |    | j| d S r8   )_newItemr;   ZmoveTo)r=   p0r#   r#   r$   _moveToH   s   zPerContourPen._moveToc                 C   s   | j | d S r8   )r;   ZlineTo)r=   p1r#   r#   r$   _lineToL   s   zPerContourPen._lineToc                 C   s   | j || d S r8   )r;   ZqCurveTo)r=   rA   p2r#   r#   r$   _qCurveToOneO   s   zPerContourPen._qCurveToOnec                 C   s   | j ||| d S r8   )r;   ZcurveTo)r=   rA   rC   Zp3r#   r#   r$   _curveToOneR   s   zPerContourPen._curveToOnec                 C      | j   d | _ d S r8   )r;   Z	closePathr=   r#   r#   r$   
_closePathU      

zPerContourPen._closePathc                 C   rF   r8   )r;   endPathrG   r#   r#   r$   _endPathY   rI   zPerContourPen._endPathc                 C   s   |    | _}| j| d S r8   )r:   r;   r<   append)r=   penr#   r#   r$   r>   ]   s   zPerContourPen._newItemr8   )r   r   r    r9   r@   rB   rD   rE   rH   rK   r>   r#   r#   r#   r$   r7   A   s    
r7   c                   @   s   e Zd Zdd ZdS )PerContourOrComponentPenc                 C   s   |    | jd || d S )N)r>   r<   addComponent)r=   Z	glyphNameZtransformationr#   r#   r$   rP   c   s   z%PerContourOrComponentPen.addComponentN)r   r   r    rP   r#   r#   r#   r$   rN   b   s    rN   c                   @   s2   e Zd Zdd ZdddZdddZdd	d
ZdS )SimpleRecordingPointPenc                 C   s
   g | _ d S r8   )r<   rG   r#   r#   r$   r9   i   s   
z SimpleRecordingPointPen.__init__Nc                 K      d S r8   r#   )r=   
identifierkwargsr#   r#   r$   	beginPathl      z!SimpleRecordingPointPen.beginPathreturnc                 C   rR   r8   r#   rG   r#   r#   r$   rJ   o   rV   zSimpleRecordingPointPen.endPathc                 C   s    | j ||d u r
dndf d S )NFT)r<   rL   )r=   ptZsegmentTyper#   r#   r$   addPointr   s    z SimpleRecordingPointPen.addPointr8   )rW   N)r   r   r    r9   rU   rJ   rY   r#   r#   r#   r$   rQ   h   s
    

rQ   c                 C   s0   d}t | |D ]\}}|| }||| 7 }q|S Nr   )zipv0v1sZx0x1dr#   r#   r$   vdiff_hypot2v   s
   rb   c                 C   s@   d}t | |D ]\}}|| }||j|j |j|j  7 }q|S rZ   )r[   realimagr\   r#   r#   r$   vdiff_hypot2_complex~   s
   re   c                    s   t  fddt|D S )Nc                 3   s     | ]\}} | | V  qd S r8   r#   )r'   ijGr#   r$   r)      s    z matching_cost.<locals>.<genexpr>)sum	enumerate)ri   matchingr#   rh   r$   matching_cost   s   rm   c                 C   sP   t | }t| \}}|tt|k sJ tdd |D }t|t| |fS )Nc                 s   s    | ]}t |V  qd S r8   )int)r'   er#   r#   r$   r)      s    z<min_cost_perfect_bipartite_matching_scipy.<locals>.<genexpr>)lenlinear_sum_assignmentlistrangeallrm   )ri   nrowscolsr#   r#   r$   )min_cost_perfect_bipartite_matching_scipy   s
   rx   c                 C   s>   t | }d g| }t | D ]\}}|||< q|t| |fS r8   )rp   MunkresZcomputerm   )ri   ru   rw   rowcolr#   r#   r$   +min_cost_perfect_bipartite_matching_munkres   s
   

r|   c                 C   sn   t | }|dkrtdtt|}tt|}t| |}|D ]}t| |}||k r2t||}}q ||fS )Nr   z4Install Python module 'munkres' or 'scipy >= 0.17.0')rp   	Exception	itertoolspermutationsrs   rr   nextrm   )ri   ru   r   bestZ	best_costr(   Zcostr#   r#   r$   .min_cost_perfect_bipartite_matching_bruteforce   s   

r   )rq   )ry   c                 C   s<   t t| j}t|| j| j| j| jd | jd | j| fS )Nr   )	r   absZarear   ZmeanXZmeanYZstddevXZstddevYZcorrelation)statssizer#   r#   r$   contour_vector_from_stats   s   
r   c                    sJ   t | }fdd| D  t \}}t fddt|D }|||fS )Nc                    s   g | ]  fd dD qS )c                    s   g | ]}t  |qS r#   )rb   )r'   r^   r]   r#   r$   
<listcomp>   s    z3matching_for_vectors.<locals>.<listcomp>.<listcomp>r#   r'   )m1r   r$   r      s    z(matching_for_vectors.<locals>.<listcomp>c                 3   s    | ]	} | | V  qd S r8   r#   )r'   rf   )costsr#   r$   r)          z'matching_for_vectors.<locals>.<genexpr>)rp   #min_cost_perfect_bipartite_matchingrj   rs   )Zm0r   ru   rl   rm   Zidentity_costr#   )r   r   r$   matching_for_vectors   s   
r   c                 C   s&   d}t | D ]
\}}|d> |B }q|S )Nr   r   )reversed)pointsbitsrX   br#   r#   r$   points_characteristic_bits   s   r   r   c           
      C   s  g }| s|S dd | D } t | }tdksJ | | d td   t | tk r9| | d td   t | tk s(t|D ]I}| | }|| | |d  }|| }||d  | |d  }|| }|||  |j|j |j|j  }	ttt	|	|	}	||	d  q=|S )Nc                 S   s   g | ]\}}t | qS r#   )complex)r'   rX   r+   r#   r#   r$   r      s    z)points_complex_vector.<locals>.<listcomp>r   r   r   r   )
rp   $_NUM_ITEMS_PER_POINTS_COMPLEX_VECTORextendrs   rL   rc   rd   r   r   r   )
r   vectorru   rf   r?   rA   Zd0rC   Zd1crossr#   r#   r$   points_complex_vector   s.   
r   c                 C   s   t | }t| }|r| d d d } t | }n|}t| }t|| dks&J t|| }d|> d }t|D ](}	|||	 > |@ ||	? B }
|
|kr^|t||	 | |rY|d |	 n|	|f q6d S )NrO   r   r   )r   rp   r   rs   rL   r6   )r   Zisomorphismsr.   Zreference_bitsru   r   r   Zmultmaskrf   r   r#   r#   r$   add_isomorphisms  s$   
$r   discrete_axesc                   sV  d gt tt| d  }t tt| }r'fddtD }|r/tdt|| ntd zddlm} fddttD }t	  D ]	} 
|  qMt   fd	dD }	tttd
D ]2\}
}fddt |	|
 D }fddt |	| D }||krqnt|	|
 |	| ||
 |< qn||dd}| \}}tt	}t||D ]\}}|| | || | qd gt }g }t	 }t|}|r| }
||
 ||
 t||
 D ]}||vr|
||< || q|st|t|ksJ dW n
 ty   Y nw td| td| ||fS )Nr   c                    s.   g | ]\}}t  fd d| D r|qS )c                 3   s$    | ]\}}| vr|d kV  qdS r   Nr#   r'   r5   vr   r#   r$   r)   /  s   " 4find_parents_and_order.<locals>.<listcomp>.<genexpr>)rt   r1   )r'   rf   r4   r   r#   r$   r   ,  s    z*find_parents_and_order.<locals>.<listcomp>zFound %s base masters: %szNo base master location foundr   )minimum_spanning_treec                    s   g | ]	}d gt   qS )r   )rp   )r'   r+   )	locationsr#   r$   r   :  s    c                    s"   g | ] t  fd dD qS )c                 3   s    | ]	}  |d V  qdS r   )r&   )r'   r5   r4   r#   r$   r)   ?  r   r   )tupler   )axesr   r$   r   ?  s   " r   c                       i | ]\}}| v r||qS r#   r#   r   r   r#   r$   
<dictcomp>A      z*find_parents_and_order.<locals>.<dictcomp>c                    r   r#   r#   r   r   r#   r$   r   D  r   T)	overwritez.Not all masters are reachable; report an issuezParents: %sz	Order: %s)rr   rs   rp   rk   loginfowarningZscipy.sparse.csgraphr   setupdatekeysr0   r~   combinationsr[   rb   Znonzeror   addr   popleftrL   ImportError)Z	glyphsetsr   r   parentsorderbasesr   graphr4   Zvectorsrf   rg   Zi_discrete_locationZj_discrete_locationtreerv   rw   rz   r{   visitedqueuer#   )r   r   r   r$   find_parents_and_order'  st   







r   )4ZfontTools.ttLib.ttGlyphSetr   ZfontTools.pens.basePenr   r   r   ZfontTools.pens.pointPenr   r   ZfontTools.pens.recordingPenr   r	   ZfontTools.misc.transformr
   collectionsr   r   mathr   r   r   r   r~   logging	getLoggerr   r   r3   r6   r7   rN   rQ   rb   re   rm   rx   r|   r   Zscipy.optimizerq   r   r   Zmunkresry   r   r   r   r   r   r   r   r   r#   r#   r#   r$   <module>   sV    
!

$