
     i.(                        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j        d	          Z G d
 d          Zd Zd Z G d de          Z G d de          Z G d de          Zd Z d Z!d Z"d Z#d Z$d Z%	 d dl&m'Z' e#Z(n"# e)$ r 	 d dl*m+Z+ e$Z(n# e)$ r e%Z(Y nw xY wY nw xY wd Z,d Z-d Z.dZ/d  Z0d! Z1 e2            d"d#Z3dS )$    )LerpGlyphSet)AbstractPenBasePenDecomposingPen)AbstractPointPenSegmentToPointPen)RecordingPenDecomposingRecordingPen)	Transform)defaultdictdeque)sqrtcopysignatan2piNzfontTools.varLib.interpolatablec                   j    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 )InterpolatableProblemnothingmissing	open_path
path_count
node_countnode_incompatibilitycontour_orderwrong_start_pointkinkunderweight
overweight                        	   
      N)__name__
__module____qualname__NOTHINGMISSING	OPEN_PATH
PATH_COUNT
NODE_COUNTNODE_INCOMPATIBILITYCONTOUR_ORDERWRONG_START_POINTKINKUNDERWEIGHT
OVERWEIGHTseverity     p/srv/www/vhosts/g4struct/public_html/venv/lib/python3.11/site-packages/fontTools/varLib/interpolatableHelpers.pyr   r      s        GGIJJ1#M+DKJ 	1AAaq1aQBHHHr:   r   c                 f    t          t          |                                 d d                    S )z6Sort problem groups by their most severe problem type.c                 B    t          d | d         D                        S )Nc              3   t   K   | ]3}t           j        |d                   |                    dd          z   V  4dS )type	tolerancer   N)r   r8   get).0ps     r;   	<genexpr>z2sort_problems.<locals>.<lambda>.<locals>.<genexpr>1   sV         +3AfI>{TUAVAVV     r:   r   )min)_s    r;   <lambda>zsort_problems.<locals>.<lambda>0   s5    3 qT     r:   T)keyreverse)dictsorteditems)problemss    r;   sort_problemsrN   +   sB    NN  		
 		
 		
  r:   c                 0    | | d         | d|          z   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.Nr9   )lks     r;   rot_listrR   ;   s"     aRSS6AcrcF?r:   c                   @    e Zd Zd
dZd Zd Zd Zd Zd Zd Z	d	 Z
dS )PerContourPenNc                 Z    t          j        | |           || _        d | _        g | _        d S N)r   __init___Pen_penvalue)selfPenglyphsets      r;   rW   zPerContourPen.__init__B   s.    x(((		


r:   c                 b    |                                   | j                            |           d S rV   )_newItemrY   moveTo)r[   p0s     r;   _moveTozPerContourPen._moveToH   s+    	r:   c                 :    | j                             |           d S rV   )rY   lineTo)r[   p1s     r;   _lineTozPerContourPen._lineToL   s    	r:   c                 <    | j                             ||           d S rV   )rY   qCurveTo)r[   re   p2s      r;   _qCurveToOnezPerContourPen._qCurveToOneO   s     	2r"""""r:   c                 >    | j                             |||           d S rV   )rY   curveTo)r[   re   ri   p3s       r;   _curveToOnezPerContourPen._curveToOneR   s"    	"b"%%%%%r:   c                 F    | j                                          d | _         d S rV   )rY   	closePathr[   s    r;   
_closePathzPerContourPen._closePathU   s!    				r:   c                 F    | j                                          d | _         d S rV   )rY   endPathrq   s    r;   _endPathzPerContourPen._endPathY   s!    				r:   c                 p    |                                  x| _        }| j                            |           d S rV   )rX   rY   rZ   append)r[   pens     r;   r_   zPerContourPen._newItem]   s2    ))++%	C
#r:   rV   )r*   r+   r,   rW   rb   rf   rj   rn   rr   ru   r_   r9   r:   r;   rT   rT   A   s               # # #& & &        r:   rT   c                       e Zd Zd ZdS )PerContourOrComponentPenc                 p    |                                   | j        d                             ||           d S )N)r_   rZ   addComponent)r[   	glyphNametransformations      r;   r}   z%PerContourOrComponentPen.addComponentc   s1    
2##I~>>>>>r:   N)r*   r+   r,   r}   r9   r:   r;   rz   rz   b   s#        ? ? ? ? ?r:   rz   c                   ,    e Zd Zd ZddZddZddZdS )	SimpleRecordingPointPenc                     g | _         d S rV   )rZ   rq   s    r;   rW   z SimpleRecordingPointPen.__init__i   s    


r:   Nc                     d S rV   r9   )r[   
identifierkwargss      r;   	beginPathz!SimpleRecordingPointPen.beginPathl       r:   returnc                     d S rV   r9   rq   s    r;   rt   zSimpleRecordingPointPen.endPatho   r   r:   c                 F    | j                             ||dndf           d S )NFT)rZ   rw   )r[   ptsegmentTypes      r;   addPointz SimpleRecordingPointPen.addPointr   s,    
2(;uuFGGGGGr:   rV   )r   N)r*   r+   r,   rW   r   rt   r   r9   r:   r;   r   r   h   se                H H H H H Hr:   r   c                 P    d}t          | |          D ]\  }}||z
  }|||z  z  }|S Nr   )zipv0v1sx0x1ds         r;   vdiff_hypot2r   v   s?    	Ab"++  BG	QU
Hr:   c                     d}t          | |          D ],\  }}||z
  }||j        |j        z  |j        |j        z  z   z  }-|S r   )r   realimagr   s         r;   vdiff_hypot2_complexr   ~   sS    	Ab"++ / /BG	QVaf_qv.. Hr:   c                 T     t           fdt          |          D                       S )Nc              3   :   K   | ]\  }}|         |         V  d S rV   r9   )rB   ijGs      r;   rD   z matching_cost.<locals>.<genexpr>   s/      7741aqtAw777777r:   )sum	enumerate)r   matchings   ` r;   matching_costr      s.    77779X#6#6777777r:   c                    t          |           }t          |           \  }}|t          t          |                    k                                    sJ t          d |D                       }t          |          t          | |          fS )Nc              3   4   K   | ]}t          |          V  d S rV   )int)rB   es     r;   rD   z<min_cost_perfect_bipartite_matching_scipy.<locals>.<genexpr>   s(      %%1A%%%%%%r:   )lenlinear_sum_assignmentlistrangeallr   )r   nrowscolss       r;   )min_cost_perfect_bipartite_matching_scipyr      s    AA&q))JD$DqNN"''))))) %%%%%%%D::}Q----r:   c                     t          |           }d g|z  }t                                          |           D ]
\  }}|||<   |t          | |          fS rV   )r   Munkrescomputer   )r   r   r   rowcols        r;   +min_cost_perfect_bipartite_matching_munkresr      s]    AA6A:DII%%a((  SS		q$''''r:   c                 D   t          |           }|dk    rt          d          t          j        t	          |                    }t          t          |                    }t          | |          }|D ])}t          | |          }||k     rt          |          |}}*||fS )Nr$   z4Install Python module 'munkres' or 'scipy >= 0.17.0')r   	Exception	itertoolspermutationsr   r   nextr   )r   r   r   best	best_costrC   costs          r;   .min_cost_perfect_bipartite_matching_bruteforcer      s    AA1uuNOOO )%((33L\""##Da&&I , ,Q"")"1ggt)D?r:   )r   )r   c                     t          t          | j                            }t          || j                  | j        | j        | j        dz  | j        dz  | j        |z  fS )Nr    )	r   absarear   meanXmeanYstddevXstddevYcorrelation)statssizes     r;   contour_vector_from_statsr      s[     EJ  D$$$D  r:   c                     t          |           }fd| D             t                    \  }}t          fdt          |          D                       }|||fS )Nc                 .    g | ]fd D             S )c                 0    g | ]}t          |          S r9   )r   )rB   r   r   s     r;   
<listcomp>z3matching_for_vectors.<locals>.<listcomp>.<listcomp>   s#    000rl2r""000r:   r9   )rB   r   m1s    @r;   r   z(matching_for_vectors.<locals>.<listcomp>   s/    >>>R0000R000>>>r:   c              3   4   K   | ]}|         |         V  d S rV   r9   )rB   r   costss     r;   rD   z'matching_for_vectors.<locals>.<genexpr>   s+      66a666666r:   )r   #min_cost_perfect_bipartite_matchingr   r   )m0r   r   r   r   identity_costr   s    `    @r;   matching_for_vectorsr      su    BA>>>>2>>>E 	,E226666U1XX66666M]M11r:   c                 D    d}t          |           D ]\  }}|dz  |z  }|S )Nr   r   )reversed)pointsbitsr   bs       r;   points_characteristic_bitsr      s6    D&!!  A	QKr:   r"   c                    g }| s|S d | D             } t          |           }t          dk    sJ |                     | d t          dz
                      t          |           t          k     r=|                     | d t          dz
                      t          |           t          k     =t          |          D ]}| |         }|                    |           | |dz            }||z
  }|                    |dz             | |dz            }||z
  }|                    ||z
             |j        |j        z  |j        |j        z  z
  }	t          t          t          |	                    |	          }	|                    |	dz             |S )Nc                 &    g | ]\  }}t          | S r9   )complex)rB   r   rF   s      r;   r   z)points_complex_vector.<locals>.<listcomp>   s     ///ur1grl///r:   r"   r   r!   r    )
r   $_NUM_ITEMS_PER_POINTS_COMPLEX_VECTORextendr   rw   r   r   r   r   r   )
r   vectorr   r   ra   re   d0ri   d1crosss
             r;   points_complex_vectorr      s   F /////FFA/14444
MM&C?!CCDEEE
f++<
<
<fGCaGGHIII f++<
<
<1XX ! ! AYb AE]"Wb1f AE]"Wb2g "'!BGbg$55c%jj))511eai    Mr:   c                    t          |           }t          |           }|r| d d d         } t          |           }n|}t          |           }t          |          |z  dk    sJ t          |          |z  }d|z  dz
  }t          |          D ]M}	|||	z
  z  |z  ||	z	  z  }
|
|k    r4|                    t          ||	 |z            |r|dz
  |	z
  n|	|f           Nd S )Nr|   r   r   )r   r   r   r   rw   rR   )r   isomorphismsrI   reference_bitsr   r   r   multmaskr   r   s              r;   add_isomorphismsr     s   /77NFA
  ")&11"6**Fv;;?av;;!DFa<D1XX  q1uo%$!)4&1"t),,7.Ia!eaii7S   r:   )discrete_axesc                   d gt          t          t          |           dz
                      z   }t          t          t          |                               }r+fdt                    D             }|r*t                              dt          |          |           nt                              d           	 ddlm} fdt          t                              D             }t                      D ])}
                    |                                           *t                    fdD             }	t          j        t          t                              d	          D ]u\  }
}fd
t          |	|
                   D             }fdt          |	|                   D             }||k    rPt!          |	|
         |	|                   ||
         |<   v ||d          }|                                \  }}t%          t                    }t          ||          D ];\  }}||                             |           ||                             |           <d gt                    z  }g }t                      }t)          |          }|rv|                                }
|                    |
           |                    |
           t          ||
                   D ] }||vr|
||<   |                    |           !|vt          |          t          |          k    s
J d            n# t.          $ r Y nw xY wt                              d|           t                              d|           ||fS )Nr   c                 t    g | ]4\  }}t          fd |                                D                       2|5S )c              3   2   K   | ]\  }}|v	|d k    V  dS r   Nr9   rB   rQ   vr   s      r;   rD   z4find_parents_and_order.<locals>.<listcomp>.<genexpr>/  s5      JJda1M3I3I163I3I3I3IJJr:   )r   rL   )rB   r   rP   r   s      r;   r   z*find_parents_and_order.<locals>.<listcomp>,  sX     
 
 
1JJJJaggiiJJJJJ

 
 
r:   zFound %s base masters: %szNo base master location foundr   )minimum_spanning_treec                 6    g | ]}d gt                    z  S )r   )r   )rB   rF   	locationss     r;   r   z*find_parents_and_order.<locals>.<listcomp>:  s&    IIIaaS3y>>)IIIr:   c                 H    g | ]t          fd D                       S )c              3   D   K   | ]}                     |d           V  dS r   )rA   )rB   rQ   rP   s     r;   rD   z4find_parents_and_order.<locals>.<listcomp>.<genexpr>?  s/      77QQUU1a[[777777r:   )tuple)rB   rP   axess    @r;   r   z*find_parents_and_order.<locals>.<listcomp>?  s7    KKKAu7777$77777KKKr:   r    c                 $    i | ]\  }}|v 	||S r9   r9   r   s      r;   
<dictcomp>z*find_parents_and_order.<locals>.<dictcomp>A  0     ' ' '!Qa=>P>PAq>P>P>Pr:   c                 $    i | ]\  }}|v 	||S r9   r9   r   s      r;   r   z*find_parents_and_order.<locals>.<dictcomp>D  r   r:   T)	overwritez.Not all masters are reachable; report an issuezParents: %sz	Order: %s)r   r   r   r   loginfowarningscipy.sparse.csgraphr   setupdatekeysrK   r   combinationsr   r   nonzeror   addr   popleftrw   ImportError)	glyphsetsr   r   parentsorderbasesr   graphrP   vectorsr   r   i_discrete_locationj_discrete_locationtreer   r   r   r   visitedqueuer   s    ``                  @r;   find_parents_and_orderr  '  s   ftE#i..1"455666Gs9~~&&''E =%
 
 
 
!),,
 
 

  	9HH0#e**eDDDDKK7888-	BBBBBBIIII5Y3H3HIIIE55D & &AFFHH%%%%$<<DKKKKKKKG!.uS^^/D/DaHH 	C 	C1' ' ' '%(wqz%:%:' ' '#' ' ' '%(wqz%:%:' ' '# '*===*71:wqzBBa(($???DJD$$$EdOO $ $Sc
s###c
s#### fs9~~-GEeeG%LLE (MMOOAQa)) ( (A''%&
Q  ( u::" "   ?     	 	 	D	 	(((e$$$E>s   JM 
MM)4fontTools.ttLib.ttGlyphSetr   fontTools.pens.basePenr   r   r   fontTools.pens.pointPenr   r   fontTools.pens.recordingPenr	   r
   fontTools.misc.transformr   collectionsr   r   mathr   r   r   r   r   logging	getLoggerr  r   rN   rR   rT   rz   r   r   r   r   r   r   r   scipy.optimizer   r   r  munkresr   r   r   r   r   r   r   r  r  r9   r:   r;   <module>r$     s   3 3 3 3 3 3 G G G G G G G G G G G G G G G G G G M M M M M M M M . . . . . . * * * * * * * * * * * * * * * * * * * *     g9::       8         G   B? ? ? ? ?} ? ? ?H H H H H. H H H    8 8 8. . .( ( (  (
444444*S'' 

 

 

	
###### 8 	,+  
 
 
: 	,++


  	2 	2 	2   () $! ! !H  6 CF#%% A A A A A A As6   #B, ,C2B;:C;CCCC
C