WL i#HddlmZddlmZmZddlmZddlZddl m Z m Z m Z ddl mZmZmZmZmZmZerddlmZddZ ddZdd Zdd Zdd Zd d Z d!d Zd"dZ d#dZ d#dZ d"dZ!d$dZ"d%dZ#d&dZ$d'dZ%d dZ&d(dZ'd)dZ( d*dZ)d+dZ*y),) annotations)chainpairwise) TYPE_CHECKINGN)check_code_arraycheck_offset_arraycheck_point_array) CLOSEPOLYLINETOMOVETO code_dtype offset_dtype point_dtypect||d}tj|tt}t ||dd<t ||dddz <|S)zSDetermine codes from offsets, assuming they all correspond to closed polygons. dtypeN)rnpfullr r r r )offsetsncodess U/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/contourpy/array.pycodes_from_offsetsrsPw A GGAvZ 0E E'#2,&E'!"+/ Lc t|t|tjt |t t }t||dd<|dddz }tj||dd||k(d}t|||<|S)zDetermine codes from offsets and points, using the equality of the start and end points of each line to determine if lines are closed or not. rNrraxis) rr rrlenr r r allr )rpointsr end_offsetscloseds rcodes_from_offsets_and_pointsr%swf GGCKz :E E'#2,!"+/K VVF73B<(F;,??a HF!*E+f  Lrct|t|}tj|tt }t |d<tj|d|dk(r t|d<|S)zDetermine codes for a single line, using the equality of the start and end points to determine if the line is closed or not. rrr) r r rrr r r r!r )r"rrs rcodes_from_pointsr'/sWf F A GGAvZ 0EE!H vvfQi6":%&b LrcR|s tdtj|tS)zAConcatenate a list of codes arrays into a single code array. z!Empty list passed to concat_codesr) ValueErrorr concatenater ) list_of_codess r concat_codesr,=s$ <== >>-z ::rcL|Dcgc]}|| }}|r t|Sycc}w)zQConcatenate a list of codes arrays or None into a single code array or None. N)r,)list_of_codes_or_nonerr+s rconcat_codes_or_noner/Fs3)>SuARUSMSM** T!!c s tdt}tjDcgc]}|d c}ttj dgfdt |dz Dt}|Scc}w)zEConcatenate a list of offsets arrays into a single offset array. z#Empty list passed to concat_offsetsrrrc3@K|]}|dzdd|zyw)rN).0i cumulativelist_of_offsetss r z!concat_offsets..Ys*\Aqs3AB7*Q-G\sr)r)r rcumsumrr*range)r7rrretr6s` @rconcat_offsetsr<Ps~ >?? OAGGGBKG|\J>>  ]\QVWXYZWZQ[\]C J Hs BcL|Dcgc]}|| }}|r t|Sycc}w)zUConcatenate a list of offsets arrays or None into a single offset array or None. N)r<)list_of_offsets_or_nonerr7s rconcat_offsets_or_noner?_s4 /F]7I\w]O]o.. ^r0cR|s tdtj|tS)zBConcatenate a list of point arrays into a single point array. z"Empty list passed to concat_pointsr)r)rr*r)list_of_pointss r concat_pointsrBks$ =>> >>. <.s'TAQ'TsN) r)r rrnanrlistrrB)rArNs @rrHrHs FGG >aa  WWVRVV;? (+X'TPQPRAS'T UVX^,,rc2t|t|t|dkr|Stjtj tj gt }tj||ddjtj|dS)zNInsert NaNs into a point array at locations specified by an offset array. rKrrrrr) r rr rarrayrOrinsertastypeint64)r"rrNs rinsert_nan_at_offsetsrVsmfw 7|q XXrvvrvv.kB yy2!5!5bhh!?RSTTrct|tjtj|tk(dt |j tS)zBDetermine offsets from codes using locations of MOVETO codes. r)rrappendnonzeror r rTr)rs roffsets_from_codesrZs>U 99RZZ03SZ @ G G UUrc |s tdtjdg|Dcgc] }t|c}ztScc}w)z4Determine offsets from lengths of point arrays. z)Empty list passed to offsets_from_lengthsrrr)rr9r r)rAlines roffsets_from_lengthsr^s= DEE 99aS.A$CIAA VVAsA c |s tdtjdg|Dcgc]}tj|tk( c}zt Scc}w)zHDetermine outer offsets from codes using locations of MOVETO codes. z5Empty list passed to outer_offsets_from_list_of_codesrr)r)rr9 count_nonzeror r)r+rs r outer_offsets_from_list_of_codesrasM PQQ 99aS=Y%B,,Uf_=YY' ))Ys#A c |s tdtjdg|Dcgc]}t|dz c}ztScc}w)z4Determine outer offsets from a list of offsets. z7Empty list passed to outer_offsets_from_list_of_offsetsrrrr\)r7rs r"outer_offsets_from_list_of_offsetsrcsB RSS 99aS/JwCLNJJR^ __JsA ct|tjtj|dddfd}t |dk(r(|tj dt |gt fStj||d}|tjt |z}tjt |dzt }d|d<||ddt ||d<||fS)z^Remove NaN from a points array, also return the offsets corresponding to the NaN removed. NrrrrKrr) r rrYisnanr rRrdeletearangeempty)r" nan_offsetsrs r remove_nanrjsf**RXXfQTl34Q7K ;1rxxCK 0 EEE6;Q7ryy[!122 #%88C ,l#S #" &k wrct|t|t|dkDrtj||ddS|gS)z]Split a code array at locations specified by an offset array into a list of code arrays. rKrr)rrr rsplit)rrs rsplit_codes_by_offsetsrms>Uw 7|axxwq}--wrct|t|t|dkDrtj||ddS|gS)z_Split a point array at locations specified by an offset array into a list of point arrays. rKrr)r rr rrl)r"rs rsplit_points_by_offsetsros> fw 7|axx" ..xrc8t|tjtj|dddfd}t |dk(r|gStj dg|t |gf}t |Dcgc] \}}||dz|c}}Scc}}w)z>Split a points array at NaNs into a list of point arrays. Nrrr)r rrYrer r*r)r"rises rsplit_points_at_nanrssf**RXXfQTl34Q7K ;1xnnrdK#f+%GH *2;*?@$!Qqs1 @@@sB)rcpy.OffsetArrayreturn cpy.CodeArray)rrtr"cpy.PointArrayrurv)r"rwrurv)r+list[cpy.CodeArray]rurv)r.zlist[cpy.CodeArray | None]ruzcpy.CodeArray | None)r7zlist[cpy.OffsetArray]rurt)r>zlist[cpy.OffsetArray | None]ruzcpy.OffsetArray | None)rAlist[cpy.PointArray]rurw)rEzlist[cpy.PointArray | None]ruzcpy.PointArray | None)r"rwrrtrurw)rrvrurt)rAryrurt)r+rxrurt)r"rwruz&tuple[cpy.PointArray, cpy.OffsetArray])rrvrrtrurx)r"rwrrtrury)r"rwrury)+ __future__r itertoolsrrtypingrnumpyrcontourpy.typecheckrrr contourpy.typesr r r r rrcontourpy._contourpy _contourpycpyrr%r'r,r/r<r?rBrFrIrHrVrZr^rarcrjrmrorsr3rrrs"% WW\\&   ( ;  9  = 7   7   - UVW)`$        Ar