§
    ¡Jáj*  ã                   óp  — d Z ddlZddlZddlmZ ej                             dd¦  «         ej                             de 	                    dd¦  «        d         ¦  «         ddl
Z
ddlZddl
mZ ddlmZmZmZ d	Zd
Zd	ZdZdZd\  ZZd\  ZZd	ZdZdZdZi Zi Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%d„ Z&d„ Z'dd„Z(dd„Z)dS )aW  Prototype (bench only, the package is untouched): the slicer's topology by default, repaired from the neighbouring
layers, every contour fitted to the points.

Per layer three candidate sets of contours, all fitted to the layer's points (ringfit.py's slab: the points within a
spacing of the plane that reach it along the surface within SHIFT; x(t), y(t) with N from the point count):
  S  the slicer's rings, refitted (the default; never loses a layer);
  U  the contours the layer below ended with, carried up and refitted (bottom-up sweep);
  D  the same from the layer above (top-down sweep).
A contour takes the points within REACH spacings whose oriented normal agrees with its solid-outward normal (cos >= FACE:
a thin wall's two faces go to their own contours: B's idea), starts from its parameters on the guess curve (projection,
not an angle around a centre: A's idea), drops the points more than TRIM spacings off its fit and refits.
A carried set (U or D) replaces S on a layer when every contour in it has at least MIN_PTS points, lies within FIT
spacings of them (p90) and has points within COVER_D spacings along at least COVER of its length, the set explains at
least as many of the layer's points (within EXPLAIN_D spacings) as S minus SLACK, and its region does not exceed the
slicer's grown by GROW spacings, and it keeps every trusted slicer ring (one that fits its points as well as the
carried contours must: its own carried contour of the same kind covering MATCH of it, none merging two). With
gate=True a carried set is tried only on a suspicious layer: one with a slicer ring that cannot be trusted or a solid
sliver narrower than THIN spacings (a C, a wall fragment). When both pass, the one explaining more points; when none, S. A sweep carries the
layer's final contours on (so a repaired layer seeds the next).

    from hybrid import encode_hybrid
é    N©ÚcKDTreez/home/joao/code/fcp_devel/apiú/é   )Ú_rings)ÚPointSlicerÚcentresÚcheck_layersg       @g333333Ó?é   g      ð?)gffffffæ?ç      ø?)r   g¸…ëQ¸ž?gš™™™™™é?g      @c                 ó`  — t          j        | dd¦  «        t          j        | dd¦  «        z
  }t           j        |dd…df         |dd…df          f         t          j        t           j                             |dd¬¦  «        d¦  «        z  }|t          j        | ¦  «        dk    |k    rdndz  S )zMUnit solid-outward normals at the vertices of ring R (hole: R bounds a hole).éÿÿÿÿr   r   NT)ÚaxisÚkeepdimsçê-�™—q=)ÚnpÚrollÚc_ÚmaximumÚlinalgÚnormÚrfÚsigned_area)ÚRÚholeÚtÚns       ú</home/joao/code/data/meshes/fcp_2710_tests/scripts/hybrid.pyÚ_normals_outr   3   s¢   € å
Œ��2�qÑÔ�BœG A q¨!Ñ,Ô,Ñ,€AÝ
Œˆa����1�Œg˜˜!˜!˜!˜Q˜$œ�xÐÔ ¥2¤:­b¬i¯nªn¸QÀQÐQU¨nÑ.VÔ.VÐX]Ñ#^Ô#^Ñ^€AØ•b”n QÑ'Ô'¨!Ò+°Ò4Ð4��¸"Ñ=Ð=ó    c                 óÆ  ‡— | sg S ˆfd„| D ¦   «         }t          j        d„ t          |¦  «        D ¦   «         ¦  «        }t          j        d„ t	          ||¦  «        D ¦   «         ¦  «        }t          j        |¦  «        }t          |¦  «        }	|	                     |t          ‰z  ¦  «        }
t          j        t          |¦  «        d¦  «        }t          |
¦  «        D ]–\  }}|sŒt          j
        |¦  «        }|||         ||         z  t          k             }t          |¦  «        rK|t          j        t           j                             ||         ||         z
  d¬¦  «        ¦  «                 ||<   Œ—g }t          |¦  «        D �]Ú\  }}t          j        |dk    |t          j        |d¦  «                 |k    z  ¦  «        d         }t          |¦  «        t"          k     r|                     d¦  «         Œr||         }t'          j        |¦  «        ||         t          j        ||k    ¦  «        z
           }t'          j        ||¦  «        \  }}t          |¦  «                             |¦  «        d         }|t0          ‰z  k    }|                     ¦   «         t"          k    rz|                     ¦   «         sf||         }t'          j        |d	t           j        z  t          |¦  «                             |¦  «        d         z  t          |¦  «        z  ¦  «        \  }}t'          j        |¦  «        dk    t'          j        |¦  «        dk    k    r|ddd…         }t          t'          j        |d
‰z  ¦  «        ¦  «                             |¦  «        d         }t          |¦  «                             t'          j        |d‰z  ¦  «        ¦  «        d         }|                     t=          |||         |t?          t          j         |d¦  «        ‰z  ¦  «        t?          t          j!        |tD          ‰z  k    ¦  «        ¦  «        t          |¦  «        ¬¦  «        ¦  «         �ŒÜ|S )zjFit every guess contour to its own points. -> list of dicts (ring, hole, n, fit, cover) or None per guess.c                 óp   •— g | ]2}t          j        t          j        |t          ¦  «        d ‰z  ¦  «        ‘Œ3S )ç      Ð?)r   Ú	_resampler   ÚasarrayÚfloat©Ú.0r   Úss     €r   ú
<listcomp>zfit_set.<locals>.<listcomp>>   s5   ø€ ÐIÐIÐI¸a�RŒ\�"œ* Q­Ñ.Ô.°°q±Ñ9Ô9ÐIÐIÐIr    c                 óX   — g | ]'\  }}t          j        t          |¦  «        |¦  «        ‘Œ(S © )r   ÚfullÚlen)r(   ÚiÚDs      r   r*   zfit_set.<locals>.<listcomp>?   s.   € ÐJÐJÐJ±°°A�"œ'¥# a¡&¤&¨!Ñ,Ô,ÐJÐJÐJr    c                 ó4   — g | ]\  }}t          ||¦  «        ‘ŒS r,   )r   )r(   r0   Úhs      r   r*   zfit_set.<locals>.<listcomp>@   s&   € ÐFÐFÐF©D¨A¨q•\ ! QÑ'Ô'ÐFÐFÐFr    r   r   ©r   r   Né   r#   ç      à?éZ   )Úringr   r   ÚfitÚcoverÚnpts)#r   ÚconcatenateÚ	enumerateÚvstackÚzipr   Úquery_ball_pointÚREACHr-   r.   r%   ÚFACEÚargminr   r   Únonzeror   ÚMIN_PTSÚappendr   Úarc_tÚargmaxÚrefitÚqueryÚTRIMÚsumÚallÚpir   r$   Údictr&   Ú
percentileÚmeanÚCOVER_D)ÚguessÚholesÚQÚNQr)   ÚdenseÚownÚnrmÚallvÚtreeÚcandÚwhichÚpÚjsÚoutr/   r0   ÚselÚPr   ÚCr   ÚdÚkeepÚdPÚdCs       `                     r   Úfit_setrg   :   sÈ  ø€ àð Øˆ	ØIÐIÐIÐIÀ5ÐIÑIÔI€EÝ
Œ.ÐJÐJ½À5Ñ9IÔ9IÐJÑJÔJÑ
KÔ
K€CÝ
Œ)ÐFÐFµC¸¸uÑ4EÔ4EÐFÑFÔFÑ
GÔ
G€CÝŒ9�UÑÔ€DÝ�4‰=Œ=€Dà× Ò  ¥E¨A¡IÑ.Ô.€DÝŒG•C˜‘F”F˜BÑÔ€EÝ˜4‘”ð Nð N‰ˆˆ2Øð 	ØÝŒZ˜‰^Œ^ˆØ��R”˜2˜aœ5‘¥TÒ)Ô*ˆÝˆr‰7Œ7ð 	NØ�"œ)¥B¤I§N¢N°4¸´8¸aÀ¼d±?È NÑ$KÔ$KÑLÔLÔMˆE�!‰HøØ
€CÝ˜%Ñ Ô ð Oñ O‰ˆˆ1ÝŒj˜% 1š*¨­R¬Z¸¸qÑ-AÔ-AÔ)BÀaÒ)GÑHÑIÔIÈ!ÔLˆÝˆs‰8Œ8•gÒÐØ�JŠJ�tÑÔÐØØˆcŒFˆÝŒH�Q‰KŒK˜˜cœ
¥R¤Y¨s°aªxÑ%8Ô%8Ñ8Ô9ˆÝŒx˜˜1‰~Œ~‰ˆˆ1Ý�A‰JŒJ×Ò˜QÑÔ Ô"ˆØ•D˜1‘HŠ}ˆØ�8Š8‰:Œ:�Ò Ð ¨¯ª©¬Ð Ø�$”ˆAÝ”8˜A˜q¥2¤5™y­7°1©:¬:×+;Ò+;¸AÑ+>Ô+>¸qÔ+AÑAÅCÈÁFÄFÑJÑKÔK‰DˆAˆqÝŒN˜1ÑÔ Ò!¥r¤~°aÑ'8Ô'8¸1Ò'<Ò=Ð=Ø�$�$�B�$”ˆAÝ•R”\ ! T¨A¡XÑ.Ô.Ñ/Ô/×5Ò5°aÑ8Ô8¸Ô;ˆÝ�Q‰ZŒZ×Ò�bœl¨1¨c°A©gÑ6Ô6Ñ7Ô7¸Ô:ˆØ�
Š
•4˜Q U¨1¤X°½½b¼mÈBÐPRÑ>SÔ>SÐVWÑ>WÑ8XÔ8XÝ#¥B¤G¨Bµ'¸A±+Ò,=Ñ$>Ô$>Ñ?Ô?ÅcÈ!ÁfÄfðNñ Nô Nñ 	Oô 	Oð 	Oñ 	Oà€Jr    c           
      ó  ‡— | rt          |¦  «        sdS t          t          j        t	          t          j        ˆfd„| D ¦   «         ¦  «        ¦  «                             |¦  «        d         t          ‰z  k    ¦  «        ¦  «        S )Ng        c                 ód   •— g | ],}t          j        t          j        |¦  «        d ‰z  ¦  «        ‘Œ-S ©r5   ©r   r$   r   r%   r'   s     €r   r*   zexplained.<locals>.<listcomp>g   s2   ø€ Ð+`Ð+`Ð+`ÐUV­B¬L½¼ÀA¹¼ÈÈaÉÑ,PÔ,PÐ+`Ð+`Ð+`r    r   )r.   r&   r   rP   r   r=   rI   Ú	EXPLAIN_D)ÚringsrT   r)   s     `r   Ú	explainedrn   d   s�   ø€ Øð �˜A™œð ØˆsÝ•”�¥¤Ð+`Ð+`Ð+`Ð+`ÐZ_Ð+`Ñ+`Ô+`Ñ!aÔ!aÑbÔb×hÒhÐijÑkÔkÐlmÔnÕr{Ð~ÑrÒñ  Aô  Añ  Bô  Bð  Br    c                 óR   — t          | ¦  «        ot          d„ | D ¦   «         ¦  «        S )Nc              3   ó„   K  — | ];}|d uo2|d         t           k    o!|d         t          k    o|d         t          k    V — Œ<d S )Nr:   r8   r9   )rD   ÚFITÚCOVER©r(   Úfs     r   ú	<genexpr>zgood.<locals>.<genexpr>k   sU   è è € Ð{Ð{Ðst˜A T˜MÐn¨a°¬i½7Ò.BÐnÀqÈÄxÕSVÂÐnÐ[\Ð]dÔ[eÕinÒ[nÐ{Ð{Ð{Ð{Ð{Ð{r    )ÚboolrL   )Úfss    r   Úgoodrx   j   s+   € Ý�‰8Œ8Ð{�Ð{Ð{ÐxzÐ{Ñ{Ô{Ñ{Ô{Ð{r    c                 ó®   — | rt          j        | ¦  «        ng }t          | ||||¦  «        }d„ t          || ¦  «        D ¦   «         }d„ |D ¦   «         }|||fS )zËS: the slicer's rings refitted; a ring with too few points stays as the slicer drew it.
    -> rings, hole flags, and the rings that fit their points well (trusted: a carried set must keep each of them).c                 ó\   — g | ])\  }}|�|d         nt          j        |t          ¦  «        ‘Œ*S )Nr7   ©r   r%   r&   )r(   rt   r   s      r   r*   zslicer_set.<locals>.<listcomp>s   s4   € ÐZÐZÐZÁdÀaÈ˜!˜-ˆQˆvŒYˆY­R¬Z¸½5Ñ-AÔ-AÐZÐZÐZr    c                 ó|   — g | ]9}|d uo2|d         t           k    o!|d         t          k    o|d         t          k    ‘Œ:S )Nr8   r9   r:   )rq   rr   Ú	TRUST_PTSrs   s     r   r*   zslicer_set.<locals>.<listcomp>t   sG   € ÐpÐpÐpÐhiˆq˜ˆ}Ðc  5¤­S¢Ðc°Q°w´ZÅ5Ò5HÐcÈQÈvÌYÕZcÒMcÐpÐpÐpr    )r   Ú_holesrg   r>   )ÚslrT   rU   r)   rS   rw   rm   Útrusteds           r   Ú
slicer_setr�   n   sm   € ð  Ð'�BŒI�b‰MŒMˆM R€EÝ	��U˜A˜r 1Ñ	%Ô	%€BØZÐZÍcÐRTÐVXÉkÌkÐZÑZÔZ€EØpÐpÐmoÐpÑpÔp€GØ�%˜Ð Ð r    c                 óº  — t          | ||¦  «        D ]È\  }}}|s dS t          j        |¦  «        }t          j                             t          j        t          j        ||dd…         g¦  «        d¬¦  «        d¬¦  «                             ¦   «         }|sDdt          t          j
        |¦  «        ¦  «        z  t          |d¦  «        z  t          |z  k     r dS ŒÉdS )	zßThe slicer's layer looks wrong: a ring it cannot trust (too few points, a poor fit, not backed along its length)
    or a solid sliver (width 2 area / perimeter under THIN spacings: a wall opened into a C, a wall fragment).TNr   r   r3   r4   r   F)r>   r   r%   r   r   Údiffr=   rK   Úabsr   r   ÚmaxÚTHIN)rm   rS   r€   r)   r   r2   r   Úpers           r   Ú
suspiciousrˆ   x   sÐ   € õ �u˜e WÑ-Ô-ð ð ‰ˆˆ1ˆaØð 	Ø�4�4ÝŒJ�q‰MŒMˆÝŒi�nŠn�RœW¥R¤Y°°1°R°a°R´5¨zÑ%:Ô%:ÀÐCÑCÔCÈ!ˆnÑLÔL×PÒPÑRÔRˆØð 	�Q��Rœ^¨AÑ.Ô.Ñ/Ô/Ñ/µ#°c¸5±/´/ÑAÅDÈ1ÁHÒLÐLØ�4�4øØˆ5r    c                 óÌ  ‡‡‡‡— | st          |d         ¦  «         S ˆfd„| D ¦   «         }d„ |D ¦   «         }i }t          |d         |d         |d         ¦  «        D ]‡\  }Š}|sŒ	t          j        t	          j        |¦  «        d‰z  ¦  «        Šˆˆˆˆfd„t          |¦  «        D ¦   «         }	|	s dS |	D ].}
|                     |
d	¦  «        d
z   ||
<   ||
         d
k    r  dS Œ/ŒˆdS )z­Every trusted slicer ring is matched by a carried ring of the same kind (MATCH of its length within COVER_D
    spacings), and no carried ring matches two of them (a merge).r€   c                 ód   •— g | ],}t          j        t          j        |¦  «        d ‰z  ¦  «        ‘Œ-S rj   rk   r'   s     €r   r*   z!keeps_trusted.<locals>.<listcomp>Š   s1   ø€ ÐCÐCÐC¸�rŒ|�BœJ q™MœM¨3°©7Ñ3Ô3ÐCÐCÐCr    c                 ó,   — g | ]}t          |¦  «        ‘ŒS r,   r   )r(   Úxs     r   r*   z!keeps_trusted.<locals>.<listcomp>‹   s   € Ð)Ð)Ð)˜A�W�Q‰ZŒZÐ)Ð)Ð)r    rm   rS   r5   c                 ó¶   •— g | ]U\  }}‰|         ‰k    ¯t          j        |                     ‰¦  «        d          t          ‰z  k    ¦  «        t          k    ¯S|‘ŒVS )r   )r   rP   rI   rQ   ÚMATCH)r(   r/   r   r2   rS   r)   rŒ   s      €€€€r   r*   z!keeps_trusted.<locals>.<listcomp>‘   sZ   ø€ ÐrÐrÐr‘T�Q˜°°q´¸Q²°Å2Ä7È1Ï7Ê7ÐSTÉ:Ì:ÐVWÌ=Õ\cÐfgÑ\gÒKgÑChÔChÕlqÒCqÐCqˆqÐCqÐCqÐCqr    Fr   r   T)Úanyr>   r   r$   r   r%   r<   Úget)rm   rS   ÚSr)   ÚsamplesÚtreesÚusedr   ÚtrÚhitr/   r2   rŒ   s    ` `       @@r   Úkeeps_trustedr—   …   s4  øøøø€ ð ð %Ý�q˜”|Ñ$Ô$Ð$Ð$ØCÐCÐCÐC¸UÐCÑCÔC€GØ)Ð) Ð)Ñ)Ô)€EØ€DÝ˜˜'œ
 A g¤J°°)´Ñ=Ô=ð 
ð 
‰ˆˆ1ˆbØð 	ØÝŒL�œ A™œ¨¨a©Ñ0Ô0ˆØrÐrÐrÐrÐrÐrÐr�Y uÑ-Ô-ÐrÑrÔrˆØð 	Ø�5�5Øð 	ð 	ˆAØ—h’h˜q !‘n”n qÑ(ˆD�‰GØ�AŒw˜Š{ˆ{Ø�u�u�uð ð	ð ˆ4r    Fc           
      óF  — i d}}|D �]˜}||         \  }	}
d}|��:t          |	¦  «        t          k    �r!|r||         d         �rt          |d         |d         |	|
|¦  «        }t          |¦  «        rât	          d„ |D ¦   «         d„ |D ¦   «         ||         |¦  «        r¶d„ |D ¦   «         }ddlm} | |         r || |         ¦  «        nd}|duoW ||¦  «                             |                     t          |z  ¦  «        ¦  «        j
        d	t          |j
        d
¦  «        z  k    }|s+t          |d„ |D ¦   «         t          ||	|¦  «        ¬¦  «        }|||<   |�"|d         ||         d         t          z
  k    r|n||         }|d         r|d         |d         fnd}�Œš|S )zWOne sweep: per layer the carried set (fitted) when it passes, with its explained share.Nrˆ   r   r   c                 ó   — g | ]
}|d          ‘ŒS ©r7   r,   rs   s     r   r*   zsweep.<locals>.<listcomp>£   s   € Ð*AÐ*AÐ*A¸¨1¨V¬9Ð*AÐ*AÐ*Ar    c                 ó   — g | ]
}|d          ‘ŒS ©r   r,   rs   s     r   r*   zsweep.<locals>.<listcomp>£   s   € ÐCZÐCZÐCZÐRSÀAÀfÄIÐCZÐCZÐCZr    c                 ó   — g | ]
}|d          ‘ŒS rš   r,   rs   s     r   r*   zsweep.<locals>.<listcomp>¤   s   € Ð/Ð/Ð/ q˜˜6œÐ/Ð/Ð/r    )Ú_regiong{®Gáz”?r   c                 ó   — g | ]
}|d          ‘ŒS rœ   r,   rs   s     r   r*   zsweep.<locals>.<listcomp>©   s   € Ð2IÐ2IÐ2IÀ°1°V´9Ð2IÐ2IÐ2Ir    )rm   rS   rn   rn   rm   rS   )r.   rD   rg   rx   r—   Ú	neighbourrž   Ú
differenceÚbufferÚGROWÚarear…   rN   rn   ÚSLACK)ÚloopsÚslabsr)   Úorderr‘   Úgater_   ÚprevÚkrT   rU   Úresrw   rm   rž   Úreg_slÚgrownÚfinals                     r   Úsweepr°   ›   s  € à�Dˆ€CØð Lñ LˆØ�a”‰ˆˆ2ØˆØÑ¥ A¡¤­'Ò 1Ñ 1¸4Ð 1À1ÀQÄ4ÈÔCUÑ 1Ý˜˜aœ $ q¤'¨1¨b°!Ñ4Ô4ˆBÝ�B‰xŒxð m�MÐ*AÐ*A¸bÐ*AÑ*AÔ*AÐCZÐCZÐWYÐCZÑCZÔCZÐ\]Ð^_Ô\`ÐbcÑdÔdð mØ/Ð/¨BÐ/Ñ/Ô/�Ø-Ð-Ð-Ð-Ð-Ð-Ø.3°A¬hÐ@˜˜  q¤Ñ*Ô*Ð*¸D�Ø dÐ*ð  H¨w¨w°u©~¬~×/HÒ/HÈÏÊÕW[Ð^_ÑW_ÑI`ÔI`Ñ/aÔ/aÔ/fÐimÕpsÐtzÔtð  BGñ  qHô  qHñ  jHò  0H�Øð mÝ UÐ2IÐ2IÀbÐ2IÑ2IÔ2IÕU^Ð_dÐfgÐijÑUkÔUkÐlÑlÔl�CØˆˆA‰Ø�¨3¨{Ô+;¸qÀ¼tÀKÔ?PÕSXÑ?XÒ+XÐ+X��Ð^_Ð`aÔ^bˆØ38¸´>ÐK��g”  g¤Ð/Ð/Àtˆ‰Ø€Jr    é€   Úcudac                 óþ   ‡ ‡— t           j        }|fˆ ˆfd„	}|t           _        	 |dk    r"ddl}	 |	j        ‰ f|||dœ|¤Ž|t           _        S t	          j        ‰ f|||dœ|¤Ž|t           _        S # |t           _        w xY w)zÒcuts: None (the package's cut rule) or "pointtest" (pointfit.py's); gate: a carried set may replace a layer only
    where the slicer's layer is suspicious (`suspicious`); elsewhere the slicer's rings refitted.c                 óp  •‡‡‡‡‡‡— t          t          |¦  «        ¦  «        }| j        j                             t
          ¦  «        Št          j        ‰t
          ¦  «        | j        j        z
  | j        j	        z  Š|  
                    ¦   «         | j        j	        z  Št          | j        ¦  «        Šˆfd„|                      |¦  «        D ¦   «         }ˆˆˆfd„|‰d         z  D ¦   «         }i Št          t          |¦  «        ¦  «        D ]cŠt          |‰         g|‰         ¢‰‘R Ž \  }}}t!          |||t#          ||‰         d         ‰¦  «        t%          |||‰¦  «        ¬¦  «        ‰‰<   Œdt'          ||‰t)          t          t          |¦  «        ¦  «        ¦  «        ‰‰¦  «        }t'          ||‰t)          t          t          |¦  «        dz
  dd¦  «        ¦  «        ‰‰¦  «        }	g }
t*                               ddd¬¦  «         t.                               ¦   «          t          t          |¦  «        ¦  «        D ]áŠˆˆfd	„d
|‰         fd|	‰         ffD ¦   «         }|rt3          |d„ ¬¦  «        n	d‰‰         f\  }}t*          |xx         dz  cc<   t!          |‰         ‰‰         d         |‰         r|‰         d         nd |	‰         r|	‰         d         nd ||d         ¬¦  «        t.          ‰<   |
                     ˆfd„|d         D ¦   «         ¦  «         Œât7          j        |
| j        ¦  «        S )Nc                 ó,   •— g | ]}ˆfd „|D ¦   «         ‘ŒS )c                 óZ   •— g | ]'}t          j        |t          ¦  «        ‰d d…         z  ‘Œ(S ©Nr4   r{   )r(   ÚLÚscs     €r   r*   z<encode_hybrid.<locals>.slices.<locals>.<listcomp>.<listcomp>»   s2   ø€ Ð<Ð<Ð<°A•"”*˜Q¥Ñ&Ô&¨¨B¨Q¨B¬Ñ/Ð<Ð<Ð<r    r,   )r(   Úlsr¹   s     €r   r*   z1encode_hybrid.<locals>.slices.<locals>.<listcomp>»   s.   ø€ ÐUÐUÐUÀÐ<Ð<Ð<Ð<¸Ð<Ñ<Ô<ÐUÐUÐUr    c                 ó>   •— g | ]}t          j        ‰‰|‰¦  «        ‘ŒS r,   )r   Úslab)r(   ÚzkÚNXÚXr)   s     €€€r   r*   z1encode_hybrid.<locals>.slices.<locals>.<listcomp>¼   s)   ø€ Ð;Ð;Ð;¨2•”˜˜B  AÑ&Ô&Ð;Ð;Ð;r    r4   r   )rm   rS   r€   rn   rˆ   r   r   )r‘   ÚUr0   c                 ób   •— g | ]+\  }}|®|d         ‰‰         d         t           z
  k    ¯'||f‘Œ,S )Nrn   )r¥   )r(   r   Úor‘   r«   s      €€r   r*   z1encode_hybrid.<locals>.slices.<locals>.<listcomp>È   sn   ø€ ð  Dð  Dð  D™t˜q !ÀQÀ]ÐWXÐYdÔWeÐijÐklÔimÐnyÔizõ  ~Cñ  jCò  XCð  XC�Q˜�Fð  XCð  XCð  XCr    rÀ   r0   c                 ó   — | d         d         S )Nr   rn   r,   )rŒ   s    r   ú<lambda>z/encode_hybrid.<locals>.slices.<locals>.<lambda>É   s   € °°1´°kÔ1B€ r    )Úkeyr‘   rm   )Úslicerr‘   rÀ   r0   r”   r¯   c                 óˆ   •— g | ]>}t          j        |¦  «        ‰d d…         z                       t           j        ¦  «        ‘Œ?S r·   )r   r%   ÚastypeÚfloat32)r(   r   r¹   s     €r   r*   z1encode_hybrid.<locals>.slices.<locals>.<listcomp>Í   s>   ø€ Ð[Ð[Ð[È�œ A™œ¨¨B¨Q¨B¬Ñ/×7Ò7½¼
ÑCÔCÐ[Ð[Ð[r    )r	   r
   ÚposeÚscalerÈ   r&   r   r%   ÚcenterÚrotationÚworld_normalsÚspacingr¦   Úranger.   r�   rN   rn   rˆ   r°   ÚlistÚSTATSÚupdateÚDEBUGÚclearr…   rE   r   ÚslicesÚdevice)ÚselfÚlayersÚcr¦   r§   rm   rS   r€   rÀ   r0   ÚnewÚoptsÚnameÚpickr¾   r‘   r¿   r«   r)   r¹   ra   r©   s                 @@@@@@€€r   rÖ   zencode_hybrid.<locals>.slicesµ   sN  øøøøøøø€ Ý•L Ñ(Ô(Ñ)Ô)ˆØŒYŒ_×#Ò#¥EÑ*Ô*ˆÝŒZ˜�5Ñ!Ô! D¤IÔ$4Ñ4¸¼	Ô8JÑJˆØ×ÒÑ!Ô! D¤IÔ$6Ñ6ˆÝ�$”,ÑÔˆØUÐUÐUÐUÀtÇzÂzÐRSÁ}Ä}ÐUÑUÔUˆØ;Ð;Ð;Ð;Ð;Ð;°°R¸´U±Ð;Ñ;Ô;ˆØˆÝ•s˜1‘v”v‘”ð 	Ið 	IˆAÝ$.¨u°Q¬xÐ$F¸%À¼(Ð$FÀAÐ$FÐ$FÐ$FÑ!ˆE�5˜'Ý˜e¨5¸'ÍYÐW\Ð^cÐdeÔ^fÐghÔ^iÐklÑMmÔMmÝ#-¨e°U¸GÀQÑ#GÔ#GðIñ Iô IˆAˆa‰DˆDå�%˜ ¥4­­c°!©f¬f©¬Ñ#6Ô#6¸¸4Ñ@Ô@ˆÝ�%˜ ¥4­­c°!©f¬f°q©j¸"¸bÑ(AÔ(AÑ#BÔ#BÀAÀtÑLÔLˆØˆÝ�Š�q˜A ˆÑ#Ô#Ð#Ý�Š‰ŒˆÝ•s˜1‘v”v‘”ð 	]ð 	]ˆAð Dð  Dð  Dð  Dð  D¨¨a°¬d¨°c¸1¸Q¼4°[Ð'Að  Dñ  Dô  DˆDØGKÐ\�˜TÐ'BÐ'BÐCÑCÔCÐCÐRUÐWXÐYZÔW[ÐQ\‰JˆD�$Ý�$ˆKˆKŒK˜1ÑˆKˆK‰KÝ 5¨¤8¨q°¬t°G¬}ÐQRÐSTÔQUÐ@_ÀÀ!ÄÀWÄÀÐ[_Ø/0°¬tÐ=˜a œd 7œm˜m¸ÀDÐPTÐU\ÔP]ð_ñ _ô _�E�!‰Hà�JŠJÐ[Ð[Ð[Ð[ÈTÐRYÌ]Ð[Ñ[Ô[Ñ\Ô\Ð\Ð\ÝŒ}˜S $¤+Ñ.Ô.Ð.r    Ú	pointtestr   N)ÚuprÙ   r×   )r   rÖ   ÚpointfitÚencode_pointtestÚfcpÚencode)
ra   rà   rÙ   r×   Úcutsr©   ÚkwÚorigrÖ   rá   s
   `    `    r   Úencode_hybridrè   °   sÅ   øø€ õ Ô€Dà"ð /ð /ð /ð /ð /ð /ð /ð6  …KÔð"Ø�;ÒÐØˆOˆOˆOà,�8Ô,¨QÐZ°2¸fÈVÐZÐZÐWYÐZÐZð "�ÔÐõ Œz˜!ÐG ¨6¸&ÐGÐGÀBÐGÐGà!�ÔÐø˜T�ÔÐ!Ð!Ð!Ð!s   ¤A. ÁA. Á.A<)F)Nr±   r²   NF)*Ú__doc__ÚsysÚnumpyr   Úscipy.spatialr   ÚpathÚinsertÚ__file__Úrsplitrã   Úringfitr   r   Ú
fcp._slicer   r	   r
   r@   rA   rJ   rD   rq   rr   rQ   rl   r¥   r£   r}   rŽ   r†   rÒ   rÔ   r   rg   rn   rx   r�   rˆ   r—   r°   rè   r,   r    r   ú<module>ró      s©  ððð ð, €
€
€
à Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !à „‡‚�Ð2Ñ 3Ô 3Ð 3Ø „‡‚��8—?’? 3¨Ñ*Ô*¨1Ô-Ñ .Ô .Ð .Ø 
€
€
€
Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9à€Ø
€Ø
€Ø
€Ø	€Ø�€€wØÑ €	ˆ5Ø
€Ø€	Ø€Ø
€à
€Ø
€ð>ð >ð >ð'ð 'ð 'ðTBð Bð Bð|ð |ð |ð!ð !ð !ð
ð 
ð 
ðð ð ð,ð ð ð ð*("ð ("ð ("ð ("ð ("ð ("r    