L i:j ddlZejZddlmZmZm Z ddl m Z m Z ee e fZ ee e fZee ZeeZe edfZeeZee ZdZej*ej,ej.ej.ej0ej0ej0ej0ej0ej0ej0 dede d ed e d ef d Zd ededefdZd edededefdZej*ej8ej,ej.ej.ej0ej0ej0ej0ej:ed edede de de f dZej,ej0ej0ej0ej0ej0ej0ej.e d$d edede defdZ ej,ej.ej.ej0ej.ej0eej0eddfd edede de fdZ!de"defdZ#deded efd!Z$ d%d edede defd"Z% d%d ededede def d#Z&y#eef$r ddlmZYwxYw)&N)cython)SequenceTupleUnion)IntegralReal) jnx1x2d1d2scalexdcoordsrc1rd1rc2rd2cddg}dD]}gx||<}||||||||f\}} } } || k(rt|t|k(sJd|vr|St|}t|Dcgc] \}}| | }}}|sdg|zSg}t|}t|}|dk7r;d|||df\} } } } |j t || | || || || || |j |||D][} | |z dkDr;|dz| || f\} } } } |j t || | || || || || |j || | }]||dz k7r>|dz|||df\} } } } |j t || | || || || || t|t|k(sJt|t|f|Scc}}w)zFor the contour given in `coords`, interpolate any missing delta values in delta vector `deltas`. Returns fully filled-out delta vector.N)rrrr)r enumerateiternextrr$r)r&rr ivindicesr itstarti1i2ri1ri2ends r# iup_contourr7[s v;#f+ %% % 6  F A&v.@TQ!-q@G@ x!| C gB HE zeUGBK7BS r" vc{F3KfSk  JJve}  ;?$qy#uc9 BC JJ2bM6#;s VC[&QT+  6#;  A~ 19a :BS r" vc{F3KfSk  v;#c( ";S[#c($;; " JKAs FFendsct||k(rt||r|ddznddzk(sJt|}||dz |dz |dz |dz gz}g}d}|D],}|dz }t||||||}|j||}.|S)zFor the outline given in `coords`, with contour endpoints given in sorted increasing order in `ends`, interpolate any missing delta values in delta vector `deltas`. Returns fully filled-out delta vector.r)rr)sortedrr7r)r&rr8r r r1r6contours r# iup_deltar?s $<4 CKDDHqLaST3T$TT T F A 1q5!a%QA. .D C E qfU3/c1BC 7  Jr%)r-r rypqr-r tolerancec||z dk\sJt||dz|||||||||}||dz|}tfdt||DS)zReturn true if the deltas for points at `i` and `j` (`i < j`) can be successfully used to interpolate deltas for points in between them within provided error tolerance.r<rc3lK|]+\\}}\}}tt||z ||z k-ywNabscomplex).0rr@rArBrCs r# z%can_iup_in_between..s> FQFQ GAE1q5 !"i/s14)r$allr)r&rr-r rCinterps ` r#can_iup_in_betweenrNst. q5A:: A*F1Ivay&)VTUY WF AEA F !&&1 r%)cjdjlcjldjncjndjforceforcedc<t|t|k(sJt|}t}tt|dz ddD]P}||dz ||dz }}||||} }|||z dz|||z dz} } dD]} | | } || }|| }|| }| | }| | }||kr ||}}||}}n||}}||}}d}||k(r"t||z |kDrt||kDrd}n|| cxkr|kr-nn*t |||z |cxkrt |||zksnnd}ni||k7rd| |kr0t||kDrQt||z |kDr@||z |k||kk7r2d}n/t||kDr!t||z |kDr|||zk||kk7rd}|s|j |PS|S)aThe forced set is a conservative set of points on the contour that must be encoded explicitly (ie. cannot be interpolated). Calculating this set allows for significantly speeding up the dynamic-programming, as well as resolve circularity in DP. The set is precise; that is, if an index is in the returned set, then there is no way that IUP can generate delta for that point, given `coords` and `deltas`. rr)rFT)rsetrangerHminmaxadd)r&rrCr rVr-ldlcrcndncr rOrPrQrRrSrTc1c2rrrUs r#_iup_contour_bound_forced_setrds( v;#f+ %% % F A UF 3v;?B +=Aq1u Bay&)1A "F1q519$5B8 A1B1BQ%CQ%CQ%CQ%CczcBcBcBcBERxrBw<)+B)0C ErRB i/2PRy9PP E 8BwGi/ #BG y 8"$y.2"527!C$(E Gi/ #BG y 8"$rI~"527!C$(E 1 q8  =~ Mr%)r-r best_costbest_jcostrVrClookbackc Zt|}||}t|t}ddi}ddi}td|D]r}||dz dz} | ||<|dz ||<|dz |vr#t|dz t ||z ddD]0} || dz} | | krt ||| ||r | x||<} | ||<| |vs0rt||fS)aStraightforward Dynamic-Programming. For each index i, find least-costly encoding of points 0 to i where i is explicitly encoded. We find this by considering all previous explicit points j and check whether interpolation can fill points between j and i. Note that solution always encodes last point explicitly. Higher-level is responsible for removing that restriction. As major speedup, we stop looking further whenever we see a "forced" point.Nr)rrr<)rrZ MAX_LOOKBACKrYr[rN) r&rrVrCrhr costschainr-rer rgs r#_iup_contour_optimize_dprn%s2 F A8\*H GE JE 1a[!a%L1$ aq5a q5F? q1uc!h,3R8 A8a.zs 9Q3w{ y ( 9s!Nrrc3(K|] }|k( ywrFru)rJrd0s r#rKz'iup_contour_optimize..s #q27 #sr)) rrLrdr[rrrvrnrXr\removerY)r&rrCr rVrprmrlsolutionr-best_solrer1rgrzs ` @r#iup_contour_optimizer~ks F A  9& 99vz Av  B #F ##ttfA&&&+669 EFUc&k !Av v61%61%&!Q'0 R u5 Em LLOaAm  !5FH#55!@EaI1qH}&)$6II6A2&< M30 VOVf_fi u#AE)1q5#e*q.1 9EuHAeai- QU#!Heai-EAI~U|eEAI&669$*2DiH 9 !5FH#55!@EaI1qH}&)$6II MAJ<Js G2G7c<t||k(rt||r|ddznddzk(sJt|}||dz |dz |dz |dz gz}g}d}|D]G}t|||dz|||dz|}t|||z dzk(sJ|j||dz}I|S)aFor the outline given in `coords`, with contour endpoints given in sorted increasing order in `ends`, optimize a set of delta values `deltas` within error `tolerance`. Returns delta vector that has most number of None items instead of the input delta. r)rrr:r;r<)r=rr~r) r&rr8rCr r r1r6r>s r#iup_delta_optimizers $<4 CKDDHqLaST3T$TT T F A 1q5!a%QA. .D C E& 537 #VEC!G%rs& ?? # tTz  tTz   VT\" |, h    jj jj }} }} }} }} -- mm mm 0 0 &0-30:@0GM0 0f1+1]1}1h )6>H4 jj jj mm mm mm mm     * }} }}    **  EFN N#0N=ANN Nb jj jjmm ::  mm 5 ) ) ) )  ))X####$$$$EHb b#0b=AbbR       [  $&%%&sJ!! J21J2