U
    Q»{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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 nF e+k
�rr   zd d$l,m-Z- e&Z*W n e+k
�rl   e'Z*Y nX Y nX 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$   úe/var/www/html/bwave/python/venv/lib/python3.8/site-packages/fontTools/varLib/interpolatableHelpers.pyr      sD              õ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>   Ú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%   rO   e   s    z%PerContourOrComponentPen.addComponentN)r   r    r!   rO   r$   r$   r$   r%   rM   d   s   rM   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 k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:   rS   rI   rV   r$   r$   r$   r%   rP   j   s   
rP   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 rW   )rX   ÚrealÚimagrY   r$   r$   r%   Úvdiff_hypot2_complex€   s
    rb   c                    s   t ‡ fdd„t|ƒD ƒƒS )Nc                 3   s   | ]\}}ˆ | | V  qd S r9   r$   )r(   ÚiÚj©ÚGr$   r%   r*   ‹   s     z matching_cost.<locals>.<genexpr>)ÚsumÚ	enumerate)rf   Úmatchingr$   re   r%   Úmatching_costŠ   s    rj   c                 C   sP   t | ƒ}t| ƒ\}}|tt|ƒƒk ¡ s,t‚tdd„ |D ƒƒ}t|ƒt| |ƒfS )Nc                 s   s   | ]}t |ƒV  qd S r9   )Úint)r(   Úer$   r$   r%   r*   ”   s     z<min_cost_perfect_bipartite_matching_scipy.<locals>.<genexpr>)ÚlenÚlinear_sum_assignmentÚlistÚrangeÚallÚAssertionErrorrj   )rf   ÚnÚrowsÚcolsr$   r$   r%   Ú)min_cost_perfect_bipartite_matching_scipyŽ   s
    rv   c                 C   s>   t | ƒ}d g| }tƒ  | ¡D ]\}}|||< q|t| |ƒfS r9   )rm   ÚMunkresZcomputerj   )rf   rs   ru   ÚrowÚcolr$   r$   r%   Ú+min_cost_perfect_bipartite_matching_munkres˜   s
    

rz   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   )rf   rs   r}   ÚbestZ	best_costr)   Zcostr$   r$   r%   Ú.min_cost_perfect_bipartite_matching_bruteforce    s    

r€   )rn   )rw   c                 C   s<   t t| jƒƒ}t|| jƒ| j| j| jd | jd | j| fS )Nr   )	r   ÚabsZ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(   r[   ©rZ   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 r9   r$   )r(   rc   )Úcostsr$   r%   r*   Û   s     z'matching_for_vectors.<locals>.<genexpr>)rm   ro   rp   Ú#min_cost_perfect_bipartite_matchingrg   )Zm0rŠ   rs   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ÚbitsrU   Úbr$   r$   r%   Úpoints_characteristic_bitsß   s    r’   r   c           
      C   s  g }| s|S dd„ | D ƒ} t | ƒ}tdks.t‚|  | 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(   rU   r,   r$   r$   r%   rˆ   í   s     z)points_complex_vector.<locals>.<listcomp>r   r   r   r   )rm   Ú$_NUM_ITEMS_PER_POINTS_COMPLEX_VECTORrr   Úextendrp   rK   r`   ra   r   r   r�   )
r�   Úvectorrs   rc   r@   rB   Zd0rD   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sLt‚t|ƒ| }d|> d }t|ƒD ]P}	|||	 > |@ ||	? B }
|
|krl| t||	 | ƒ|r²|d |	 n|	|f¡ qld S )NrN   r   r   )r’   rm   r˜   rr   rp   rK   r7   )r�   Zisomorphismsr/   Zreference_bitsrs   r�   r–   ZmultÚmaskrc   r‘   r$   r$   r%   Úadd_isomorphisms  s     
$ÿrš   ©Údiscrete_axesc                   sb  d gt tt| ƒd ƒƒ }t tt| ƒƒƒ}ˆ�rZ‡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 ]"}||k�ræ|
||< | |¡ �qæ�q¸t|ƒt|ƒk�s(tdƒ‚W n tk
�r@   Y nX t d|¡ t d|¡ ||fS )Nr   c                    s.   g | ]&\}}t ‡ fd d„| ¡ D ƒƒr|‘qS )c                 3   s"   | ]\}}|ˆ kr|d kV  qdS ©r   Nr$   ©r(   r6   Úvr›   r$   r%   r*   0  s      ú4find_parents_and_order.<locals>.<listcomp>.<genexpr>)rq   r2   )r(   rc   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ˆ   ;  s     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*   @  s     r    )Útupler‰   )Úaxesr£   r%   rˆ   @  s     r   c                    s   i | ]\}}|ˆ kr||“qS r$   r$   rž   r›   r$   r%   Ú
<dictcomp>B  s      z*find_parents_and_order.<locals>.<dictcomp>c                    s   i | ]\}}|ˆ k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|   ÚcombinationsrX   r_   Znonzeror   Úaddr   ÚpopleftrK   rr   ÚImportErrorÚlog)Z	glyphsetsr¢   rœ   ÚparentsÚorderÚbasesr¡   Úgraphr5   Zvectorsrc   rd   Zi_discrete_locationZj_discrete_locationÚtreert   ru   rx   ry   Ú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ƒ   ÚrotateÚ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   rM   rP   r_   rb   rj   rv   rz   r€   Zscipy.optimizern   rŒ   r±   Zmunkresrw   r†   r�   r’   r”   r˜   rš   r«   rº   rÂ   r$   r$   r$   r%   Ú<module>   sR   
"

ÿÿ$D