
    g,                        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j4                  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*d Z.d Z/d Z0d Z1d! Z2d" Z3 e4       d#d$Z5d&d%Z6y	# e+$ r 	 d dl,m-Z- e&Z*n# e+$ r e'Z*Y nw xY wY ?w xY w)'    )LerpGlyphSet)AbstractPenBasePenDecomposingPen)AbstractPointPenSegmentToPointPen)RecordingPenDecomposingRecordingPen)	Transform)defaultdictdeque)sqrtcopysignatan2pi)EnumNzfontTools.varLib.interpolatablec                   h    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y)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     ~/home/viktor/gitlab-persoonlijk/factuur-applicatie/venv/lib/python3.12/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Hr;   r   c                 N    t        t        | j                         d d            S )zGSort problems by severity, then by glyph name, then by problem message.c                 .    t        d | d   D               S )Nc              3   n   K   | ]-  }t         j                  |d       |j                  dd      z    / yw)type	tolerancer   N)r   r9   get).0ps     r<   	<genexpr>z2sort_problems.<locals>.<lambda>.<locals>.<genexpr>2   s8       +33AfI>{TUAVVs   35r    )min)_s    r<   <lambda>zsort_problems.<locals>.<lambda>1   s!    3qT  r;   T)keyreverse)dictsorteditems)problemss    r<   sort_problemsrO   ,   s+    NN 		
 r;   c                     | | 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.Nr:   )lks     r<   rot_listrS   <   s     aRS6AcrF?r;   c                   >    e Zd Zd
dZd Zd Zd Zd Zd Zd Z	d	 Z
y)PerContourPenNc                 h    t        j                  | |       || _        || _        d | _        g | _        y N)r   __init__	_glyphset_Pen_penvalue)selfPenglyphsets      r<   rX   zPerContourPen.__init__C   s.    x(!		
r;   c                 Z    | j                          | j                  j                  |       y rW   )_newItemr[   moveTo)r]   p0s     r<   _moveTozPerContourPen._moveToJ   s    		r;   c                 :    | j                   j                  |       y rW   )r[   lineTo)r]   p1s     r<   _lineTozPerContourPen._lineToN   s    		r;   c                 <    | j                   j                  ||       y rW   )r[   qCurveTo)r]   rg   p2s      r<   _qCurveToOnezPerContourPen._qCurveToOneQ   s    		2r"r;   c                 >    | j                   j                  |||       y rW   )r[   curveTo)r]   rg   rk   p3s       r<   _curveToOnezPerContourPen._curveToOneT   s    		"b"%r;   c                 F    | j                   j                          d | _         y rW   )r[   	closePathr]   s    r<   
_closePathzPerContourPen._closePathW   s    			r;   c                 F    | j                   j                          d | _         y rW   )r[   endPathrs   s    r<   _endPathzPerContourPen._endPath[   s    			r;   c                 h    | j                         x| _        }| j                  j                  |       y rW   )rZ   r[   r\   append)r]   pens     r<   ra   zPerContourPen._newItem_   s&    ))+%	C

#r;   rW   )r+   r,   r-   rX   rd   rh   rl   rp   rt   rw   ra   r:   r;   r<   rU   rU   B   s*    #&r;   rU   c                       e Zd Zd Zy)PerContourOrComponentPenc                 b    | j                          | j                  d   j                  ||       y )N)ra   r\   addComponent)r]   	glyphNametransformations      r<   r   z%PerContourOrComponentPen.addComponente   s#    

2##I~>r;   N)r+   r,   r-   r   r:   r;   r<   r|   r|   d   s    ?r;   r|   c                   *    e Zd Zd ZddZddZddZy)SimpleRecordingPointPenc                     g | _         y rW   )r\   rs   s    r<   rX   z SimpleRecordingPointPen.__init__k   s	    
r;   Nc                      y rW   r:   )r]   
identifierkwargss      r<   	beginPathz!SimpleRecordingPointPen.beginPathn       r;   c                      y rW   r:   rs   s    r<   rv   zSimpleRecordingPointPen.endPathq   r   r;   c                 R    | j                   j                  ||df       y df       y )NFT)r\   ry   )r]   ptsegmentTypes      r<   addPointz SimpleRecordingPointPen.addPointt   s&    

2(;uFGFGr;   rW   )returnN)r+   r,   r-   rX   r   rv   r   r:   r;   r<   r   r   j   s    Hr;   r   c                 L    d}t        | |      D ]  \  }}||z
  }|||z  z  } |S Nr   )zipv0v1sx0x1ds         r<   vdiff_hypot2r   x   s=    	Ab"+ BG	QU
 Hr;   c                     d}t        | |      D ]@  \  }}||z
  }||j                  |j                  z  |j                  |j                  z  z   z  }B |S r   )r   realimagr   s         r<   vdiff_hypot2_complexr      sW    	Ab"+ /BG	QVVaff_qvv../
 Hr;   c                 >     t         fdt        |      D              S )Nc              3   4   K   | ]  \  }}|   |     y wrW   r:   )rC   ijGs      r<   rE   z matching_cost.<locals>.<genexpr>   s     741aqtAw7s   )sum	enumerate)r   matchings   ` r<   matching_costr      s    79X#6777r;   c                     t        |       }t        |       \  }}|t        t        |            k(  j	                         sJ t        d |D              }t        |      t        | |      fS )Nc              3   2   K   | ]  }t        |        y wrW   )int)rC   es     r<   rE   z<min_cost_perfect_bipartite_matching_scipy.<locals>.<genexpr>   s     %1A%s   )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N"''))) %%%D:}Q---r;   c                     t        |       }d g|z  }t               j                  |       D ]
  \  }}|||<    |t        | |      fS rW   )r   Munkrescomputer   )r   r   r   rowcols        r<   +min_cost_perfect_bipartite_matching_munkresr      sQ    AA6A:DI%%a( SS	q$'''r;   c                    t        |       }|dkD  rt        d      t        j                  t	        |            }t        t        |            }t        | |      }|D ]!  }t        | |      }||k  st        |      |}}# ||fS )Nr%   z4Install Python module 'munkres' or 'scipy >= 0.17.0')r   	Exception	itertoolspermutationsr   r   nextr   )r   r   r   best	best_costrD   costs          r<   .min_cost_perfect_bipartite_matching_bruteforcer      s    AA1uNOO ))%(3L\"#Da&I ,Q")"1gt)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      sb     EJJ D$$D  r;   c                   	 t        |       }t        t        |            }| D cg c]  }|D cg c]  }t        ||       c} c}}	t	        	      \  }}t        	fdt        |      D              }|||fS c c}w c c}}w )Nc              3   .   K   | ]  }|   |     y wrW   r:   )rC   r   costss     r<   rE   z'matching_for_vectors.<locals>.<genexpr>   s     6a6s   )r   r   r   r   #min_cost_perfect_bipartite_matchingr   )
m0m1r   identity_matchingr   r   r   r   identity_costr   s
            @r<   matching_for_vectorsr      sz    BAU1X;=>RR0rl2r"0>E 	,E26U1X66M]M11 1>s   	B A;B ;B c                 @    d}t        |       D ]  \  }}|dz  |z  } |S )Nr   r    )reversed)pointsbitsr   bs       r<   points_characteristic_bitsr      s1    D&! A	QKr;   r#   c                    g }| s|S | D cg c]  \  }}t        |  } }}t        |       }t        dk(  sJ | j                  | d t        dz
          t        |       t        k  r.| j                  | d t        dz
          t        |       t        k  r.t	        |      D ]  }| |   }|j                  |       | |dz      }||z
  }|j                  |dz         | |dz      }	|	|z
  }
|j                  |
|z
         |j                  |
j                  z  |j                  |
j                  z  z
  }t        t        t        |            |      }|j                  |dz          |S c c}}w )Nr#   r    r"   r!   )complexr   $_NUM_ITEMS_PER_POINTS_COMPLEX_VECTORextendr   ry   r   r   r   r   r   )r   vectorr   rG   r   r   rc   rg   d0rk   d1crosss               r<   points_complex_vectorr      sb   F(./ur1grl/F/FA/1444
MM&C?!CDE
f+<
<fGCaGHI f+<
<1X ! AYb AE]"Wb1f AE]"Wb2g "''!BGGbgg$55c%j)51eai +!. M; 0s   E!c                 n   t        |       }t        |       }|r| d d d   } t        |       }n|}t        |       }t        |      |z  dk(  sJ t        |      |z  }d|z  dz
  }t        |      D ]E  }	|||	z
  z  |z  ||	z	  z  }
|
|k(  s|j	                  t        ||	 |z        |r|dz
  |	z
  n|	|f       G y )Nr~   r   r    )r   r   r   r   ry   rS   )r   isomorphismsrJ   reference_bitsr   r   r   multmaskr   r   s              r<   add_isomorphismsr     s    /7NFA
 ")&1"6*Fv;?av;!DFa<D1X q1uo%$!)4&1"t),7a!eai7Sr;   )discrete_axesc          	         d gt        t        t        |       dz
              z   }t        t        t        |                   }|rt        |      D cg c])  \  }}t	        fd|j                         D              r|+ }}}|r!t        j                  dt        |      |       nt        j                  d       	 ddl	m
} t        t        |            D 	cg c]  }	dgt        |      z   }
}	t               }|D ]!  |j                  j                                # t        |      }|D cg c]  t        fd|D               }}t!        j"                  t        t        |            d      D ]q  \  }}t%        |||         D ci c]  \  }}|v s|| }}}t%        |||         D ci c]  \  }}|v s|| }}}||k7  rZt'        ||   ||         |
|   |<   s  ||
d	
      }|j)                         \  }}t+        t              }
t%        ||      D ]-  \  }}|
|   j-                  |       |
|   j-                  |       / d gt        |      z  }g }t               }t/        |      }|rc|j1                         }|j-                  |       |j3                  |       t        |
|         D ]  }||vs|||<   |j3                  |        |rct        |      t        |      k(  sJ d       	 t6        j                  d|       t6        j                  d|       ||fS c c}}w c c}	w c c}w c c}}w c c}}w # t4        $ r Y Ww xY w)Nr    c              3   8   K   | ]  \  }}|vs|d k(    ywr   Nr:   )rC   rR   vr   s      r<   rE   z)find_parents_and_order.<locals>.<genexpr>0  s      Jda1M3I16Js   
zFound %s base masters: %szNo base master location foundr   )minimum_spanning_treec              3   B   K   | ]  }j                  |d         ywr   )rB   )rC   rR   rQ   s     r<   rE   z)find_parents_and_order.<locals>.<genexpr>@  s     7QQUU1a[7s   r!   T)	overwritez.Not all masters are reachable; report an issuezParents: %sz	Order: %s)r   r   r   r   r   rM   logginginfowarningscipy.sparse.csgraphr   setupdatekeysrL   tupler   combinationsr   r   nonzeror   addr   popleftry   ImportErrorlog)	glyphsets	locationsr   parentsorderr   rQ   basesr   rG   graphaxesvectorsr   rR   r   i_discrete_locationj_discrete_locationtreer   r   r   r   visitedqueues     `   `                  r<   find_parents_and_orderr  (  sB   ftE#i.1"4566Gs9~&'E "),
1JaggiJJ 
 

 LL4c%j%HOO;<-	B38Y3HIaaS3y>)IEI5D &AFFH%&$<DAJKAu7$77KGK!..uS^/DaH 	C1%(wqz%:'!Qa=>PAqD'# ' &)wqz%:'!Qa=>PAqD'# ' '*==*71:wqzBa	C )$?DJD$$EdO $Sc
s#c
s#$
 fs9~-GEeG%LEMMOAQa) (A'%&
Q(	  u:"  @?@  	(e$E>y
 J
 L''>  		si   .L.?M
 L41AM
 3L9AM
 L>L>"M
 7MM	C:M
 M
 M
 4M
 
	MMc                    | j                   }| j                  }| j                  }||z
  dz  dz  ||z  z   dz  }||z   dz  |z   }||z   dz  |z
  }|dk7  rt        ||z
  |      n||k  r	t        dz  nd}t               }	|dk  rd}|rf|	j                  | j                   | j                         }	|	j                  |       }	|	j                  dt        |      z  dt        |      z        }	|	S |	j                  t        |      t        |            }	|	j                  |      }	|	j                  | j                  | j                        }	|	S )Ng      ?r!   r   r    )	varianceX
covariance	varianceYr   r   r   	translater   r   rotatescaler   )
r   inversear   cdeltalambda1lambda2thetatranss
             r<   transform_from_statsr   l  s9   AAA1um!AE)c1E1ume#G1ume#G%&!VE'A+q!a!e"s(EKE{ u{{l;eV$AW-q4=/@A L	 DM4=9U#U[[9Lr;   )F)7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   enumr   r   r   	getLoggerr  r   rO   rS   rU   r|   r   r   r   r   r   r   r   scipy.optimizer   r   r  munkresr   r   r   r   r   r   r   r   r  r   r:   r;   r<   <module>r,     s   3 G G G M . * * *   g9: 8 G D?} ?H. H8.("
4*S'2 () $!H6 CF% AH o  

	
# 8 	,  
: 	,


s6   C C'CC'C!C' C!!C'&C'