a
    —Æàgè,  ã                   @   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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 nB e+�yn   zd d$l,m-Z- e&Z*W n e+�yh   e'Z*Y n0 Y n0 d%d&„ Z.d'd(„ Z/d)d*„ Z0d+Z1d,d-„ Z2d.d/„ Z3e4ƒ d0œd1d2„Z5d6d4d5„Z6d	S )7é    )ÚLerpGlyphSet)ÚAbstractPenÚBasePenÚDecomposingPen)ÚAbstractPointPenÚSegmentToPointPen)ÚRecordingPenÚDecomposingRecordingPen)Ú	Transform)ÚdefaultdictÚdeque)ÚsqrtÚcopysignÚatan2Úpi)ÚEnumNz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$   ú_/var/www/sistema_ama/venv/lib/python3.9/site-packages/fontTools/varLib/interpolatableHelpers.pyr      s.   õr   c                 C   s   t t|  ¡ dd„ dd�ƒS )zGSort problems by severity, then by glyph name, then by problem message.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>2   s   ÿz2sort_problems.<locals>.<lambda>.<locals>.<genexpr>r   )Úmin)Ú_r$   r$   r%   Ú<lambda>1   s   þÿzsort_problems.<locals>.<lambda>T)ÚkeyÚreverse)ÚdictÚsortedÚitems)Úproblemsr$   r$   r%   Úsort_problems,   s    øÿr4   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    r7   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__Z	_glyphsetÚ_PenÚ_penÚvalue)ÚselfZPenZglyphsetr$   r$   r%   r:   C   s
    zPerContourPen.__init__c                 C   s   |   ¡  | j |¡ d S r9   )Ú_newItemr<   ZmoveTo)r>   Úp0r$   r$   r%   Ú_moveToJ   s    zPerContourPen._moveToc                 C   s   | j  |¡ d S r9   )r<   ZlineTo)r>   Úp1r$   r$   r%   Ú_lineToN   s    zPerContourPen._lineToc                 C   s   | j  ||¡ d S r9   )r<   ZqCurveTo)r>   rB   Úp2r$   r$   r%   Ú_qCurveToOneQ   s    zPerContourPen._qCurveToOnec                 C   s   | j  |||¡ d S r9   )r<   ZcurveTo)r>   rB   rD   Zp3r$   r$   r%   Ú_curveToOneT   s    zPerContourPen._curveToOnec                 C   s   | j  ¡  d | _ d S r9   )r<   Z	closePath©r>   r$   r$   r%   Ú
_closePathW   s    
zPerContourPen._closePathc                 C   s   | j  ¡  d | _ d S r9   )r<   ÚendPathrG   r$   r$   r%   Ú_endPath[   s    
zPerContourPen._endPathc                 C   s   |   ¡  | _}| j |¡ d S r9   )r;   r<   r=   Úappend)r>   Zpenr$   r$   r%   r?   _   s    zPerContourPen._newItem)N)r   r    r!   r:   rA   rC   rE   rF   rH   rJ   r?   r$   r$   r$   r%   r8   B   s   
r8   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%   rN   e   s    z%PerContourOrComponentPen.addComponentN)r   r    r!   rN   r$   r$   r$   r%   rL   d   s   rL   c                   @   s6   e Zd Zdd„ Zddd„Zddœdd„Zdd	d
„ZdS )ÚSimpleRecordingPointPenc                 C   s
   g | _ d S r9   )r=   rG   r$   r$   r%   r:   k   s    z SimpleRecordingPointPen.__init__Nc                 K   s   d S r9   r$   )r>   Ú
identifierÚkwargsr$   r$   r%   Ú	beginPathn   s    z!SimpleRecordingPointPen.beginPath)Úreturnc                 C   s   d S r9   r$   rG   r$   r$   r%   rI   q   s    zSimpleRecordingPointPen.endPathc                 C   s    | j  ||d u rdndf¡ d S )NFT)r=   rK   )r>   ÚptZsegmentTyper$   r$   r%   ÚaddPointt   s    z SimpleRecordingPointPen.addPoint)N)N)r   r    r!   r:   rR   rI   rU   r$   r$   r$   r%   rO   j   s   
rO   c                 C   s0   d}t | |ƒD ]\}}|| }||| 7 }q|S ©Nr   )Úzip©Úv0Úv1ÚsZx0Úx1Údr$   r$   r%   Úvdiff_hypot2x   s
    r^   c                 C   s@   d}t | |ƒD ],\}}|| }||j|j |j|j  7 }q|S rV   )rW   ÚrealÚimagrX   r$   r$   r%   Úvdiff_hypot2_complex€   s
    ra   c                    s   t ‡ fdd„t|ƒD ƒƒS )Nc                 3   s   | ]\}}ˆ | | V  qd S r9   r$   )r(   ÚiÚj©ÚGr$   r%   r*   ‹   ó    z matching_cost.<locals>.<genexpr>)ÚsumÚ	enumerate)re   Úmatchingr$   rd   r%   Úmatching_costŠ   s    rj   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 r9   )Úint)r(   Úer$   r$   r%   r*   ”   rf   z<min_cost_perfect_bipartite_matching_scipy.<locals>.<genexpr>)ÚlenÚlinear_sum_assignmentÚlistÚrangeÚallrj   )re   ÚnÚrowsÚcolsr$   r$   r%   Ú)min_cost_perfect_bipartite_matching_scipyŽ   s
    ru   c                 C   s>   t | ƒ}d g| }tƒ  | ¡D ]\}}|||< q|t| |ƒfS r9   )rm   ÚMunkresZcomputerj   )re   rr   rt   ÚrowÚcolr$   r$   r%   Ú+min_cost_perfect_bipartite_matching_munkres˜   s
    

ry   c                 C   sn   t | ƒ}|dkrtdƒ‚t t|ƒ¡}tt|ƒƒ}t| |ƒ}|D ]$}t| |ƒ}||k r@t|ƒ| }}q@||fS )Nr   z4Install Python module 'munkres' or 'scipy >= 0.17.0')rm   Ú	ExceptionÚ	itertoolsÚpermutationsrp   ro   Únextrj   )re   rr   r|   ÚbestZ	best_costr)   Zcostr$   r$   r%   Ú.min_cost_perfect_bipartite_matching_bruteforce    s    

r   )rn   )rv   c                 C   s<   t t| jƒƒ}t|| jƒ| j| j| jd | jd | j| fS )Nr   )	r   ÚabsÚarear   ÚmeanXÚmeanYZstddevXZstddevYZcorrelation)ÚstatsÚsizer$   r$   r%   Úcontour_vector_from_statsÂ   s    
úr†   c                    sV   t | ƒ}t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$   )r^   )r(   rZ   ©rY   r$   r%   Ú
<listcomp>Ö   rf   z3matching_for_vectors.<locals>.<listcomp>.<listcomp>r$   ©r(   )Úm1r‡   r%   rˆ   Ö   rf   z(matching_for_vectors.<locals>.<listcomp>c                 3   s   | ]}ˆ | | V  qd S r9   r$   )r(   rb   )Úcostsr$   r%   r*   Û   rf   z'matching_for_vectors.<locals>.<genexpr>)rm   ro   rp   Ú#min_cost_perfect_bipartite_matchingrg   )Zm0rŠ   rr   Zidentity_matchingri   rj   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ÚbitsrT   Ú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 rh|  | d td … ¡ qDt|ƒD ]’}| | }| |¡ | |d  }|| }| |d ¡ | |d  }|| }| || ¡ |j|j |j|j  }	ttt	|	ƒƒ|	ƒ}	| |	d ¡ qp|S )Nc                 S   s   g | ]\}}t |Ž ‘qS r$   )Úcomplex)r(   rT   r,   r$   r$   r%   rˆ   í   rf   z)points_complex_vector.<locals>.<listcomp>r   r   r   r   )
rm   Ú$_NUM_ITEMS_PER_POINTS_COMPLEX_VECTORÚextendrp   rK   r_   r`   r   r   r€   )
r�   Úvectorrr   rb   r@   rB   Zd0rD   Úd1Zcrossr$   r$   r%   Úpoints_complex_vectoré   s,    
r˜   c                 C   sÂ   t | ƒ}t| ƒ}|r,| d d d… } t | ƒ}n|}t| ƒ}t|ƒ| dksLJ ‚t|ƒ| }d|> d }t|ƒD ]P}	|||	 > |@ ||	? B }
|
|krl| t||	 | ƒ|r²|d |	 n|	|f¡ qld S )NrM   r   r   )r’   rm   r˜   rp   rK   r7   )r�   Zisomorphismsr/   Zreference_bitsrr   r�   r–   ZmultÚmaskrb   r‘   r$   r$   r%   Úadd_isomorphisms  s     
$ÿrš   ©Údiscrete_axesc                   s`  d gt tt| ƒd ƒƒ }t tt| ƒƒƒ}ˆ�rX‡fdd„tˆƒD ƒ}|r^t dt|ƒ|¡ n
t d¡ �zÀddlm} ‡fdd„ttˆƒƒD ƒ}t	ƒ ‰ ˆD ]}ˆ  
| ¡ ¡ qœtˆ ƒ‰ ‡ fd	d„ˆD ƒ}	t ttˆƒƒd
¡D ]f\}
}‡fdd„tˆ |	|
 ƒD ƒ}‡fdd„tˆ |	| ƒD ƒ}||k�r*qÞt|	|
 |	| ƒ||
 |< qÞ||dd�}| ¡ \}}tt	ƒ}t||ƒD ]&\}}||  |¡ ||  |¡ �qpd gtˆƒ }g }t	ƒ }t|ƒ}|�r| ¡ }
| |
¡ | |
¡ t||
 ƒD ]"}||v�ræ|
||< | |¡ �qæ�q¸t|ƒt|ƒk�s(J dƒ‚W n t�y>   Y n0 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(   r6   Úvr›   r$   r%   r*   0  rf   ú4find_parents_and_order.<locals>.<listcomp>.<genexpr>)rq   r2   )r(   rb   r5   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   )rm   )r(   r,   )Ú	locationsr$   r%   rˆ   ;  rf   c                    s"   g | ]‰ t ‡ fd d„ˆD ƒƒ‘qS )c                 3   s   | ]}ˆ   |d ¡V  qdS r�   )r'   )r(   r6   ©r5   r$   r%   r*   @  rf   r    )Útupler‰   )Úaxesr£   r%   rˆ   @  rf   r   c                    s   i | ]\}}|ˆ v r||“qS r$   r$   rž   r›   r$   r%   Ú
<dictcomp>B  s   z*find_parents_and_order.<locals>.<dictcomp>c                    s   i | ]\}}|ˆ v r||“qS r$   r$   rž   r›   r$   r%   r¦   E  s   T)Ú	overwritez.Not all masters are reachable; report an issuezParents: %sz	Order: %s)ro   rp   rm   rh   ÚloggingÚinfoÚwarningZscipy.sparse.csgraphr¡   ÚsetÚupdateÚkeysr1   r{   ÚcombinationsrW   r^   Znonzeror   Úaddr   ÚpopleftrK   ÚImportErrorÚlog)Z	glyphsetsr¢   rœ   ÚparentsÚorderÚbasesr¡   Úgraphr5   Zvectorsrb   rc   Zi_discrete_locationZj_discrete_locationÚtreers   rt   rw   rx   ÚvisitedÚqueuer$   )r¥   rœ   r¢   r%   Úfind_parents_and_order(  sn    
þ

ÿ
ÿ



ÿ
þrº   Fc           
      C   sþ   | j }| j}| j}|| d d ||  d }|| d | }|| d | }|dkrdt|| |ƒn||k rttd nd}tƒ }	|dk rŠd}|rÌ|	 | j | j ¡}	|	 	| ¡}	|	 
dt|ƒ dt|ƒ ¡}	n.|	 
t|ƒt|ƒ¡}	|	 	|¡}	|	 | j| j¡}	|	S )Ng      à?r   r   r   )Z	varianceXZ
covarianceZ	varianceYr   r   r
   Ú	translater‚   rƒ   ÚrotateZscaler   )
r„   ZinverseÚar‘   ÚcÚdeltaZlambda1Zlambda2ÚthetaZtransr$   r$   r%   Útransform_from_statsl  s$    *	
rÁ   )F)7Z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   Úenumr   r{   r¨   Ú	getLoggerr²   r   r4   r7   r8   rL   rO   r^   ra   rj   ru   ry   r   Zscipy.optimizern   rŒ   r±   Zmunkresrv   r†   r�   r’   r”   r˜   rš   r«   rº   rÁ   r$   r$   r$   r%   Ú<module>   sR   
"

ÿÿ$D