Ë
    ÖEºj….  ã                  ó6  — d Z ddlmZ ddlZddlZddlmZ ddlZ ej                  d«       ddl	m
Z ddlZddlmZ ddlmZ ddlmZmZmZmZ  ee«      j1                  «       j2                  d	   Zed
z  ZdZdd„Zdd„Zdd„Zdd„Z dd„Z!e"dk(  r e!«        yy)zLBuild explicitly weak ME1a scan/CSV diagnostic targets on its own CAD graph.é    )ÚannotationsN)ÚPathÚAgg)ÚImage)ÚcKDTree)Úgeodesic_distanceÚheater_valuesÚinterpolate_between_heatersÚprovisional_heater_projectioné   zexperiments/ME1a_DTÚ14h06c                óf  — t        j                  | d¬«      }t         j                  j                  t        j                  | |z
  j
                  «      «      \  }}|d d …t        j                  |«      d d d…   f   }t         j                  j                  |«      dk  r|d d …dfxx   dz  cc<   ||fS )Nr   ©Úaxiséÿÿÿÿ)ÚnpÚmeanÚlinalgÚeighÚcovÚTÚargsortÚdet)ÚpointsÚcenterÚvaluesÚvectorsÚaxess        õ!   ì „ì²˜ë¦¬/prepare_me1a_targets.pyÚ	pca_framer       sŒ   € Ü�W‰W�V !Ô$€FÜ—i‘i—n‘n¤R§V¡V¨V°F©]×,=Ñ,=Ó%>Ó?�O€FˆGØ’1”b—j‘j Ó(©¨2¨Ñ.Ð.Ñ/€DÜ	‡y�y‡}�}�TÓ˜QÒ ¢Q¨ U£¨rÑ 1£Ø�4ˆ<Ðó    c                óÖ  — | j                  d«      |j                  d«      }}t        j                  j                  | |z
  j                  ||z
  z  «      \  }}}|j                  |j                  z  }t        j                  j                  |«      dk  r&|dxx   dz  cc<   |j                  |j                  z  }t        j                  d«      }||d d…d d…f<   |||z  z
  |d d…df<   |S )Nr   r   é   é   )r   r   r   Úsvdr   r   Úeye)	ÚsourceÚtargetÚaÚbÚuÚ_ÚvtÚrotationÚmatrixs	            r   Ú	rigid_fitr0      sÈ   € Ø�;‰;�q‹>˜6Ÿ;™; q›>€q€AÜ�y‰y�}‰}˜f Q™hŸ\™\¨V°A©XÑ6Ó7�H€A€qˆ"Ø�t‰t�a—c‘c‰z€HÜ	‡y�y‡}�}�XÓ Ò"Ø
ˆ2‹�"‰‹ §¡¨¯©¡�hÜ�V‰V�A‹Y€FØ€Fˆ2ˆAˆ2ˆr�ˆrˆ6�NØ˜ 1™Ñ$€Fˆ2ˆAˆ2ˆqˆ5�MØ€Mr!   c                óF   — | |d d…d d…f   j                   z  |d d…df   z   S )Nr$   )r   )r   r/   s     r   Ú	transformr2   +   s4   € Ø�F˜2˜A˜2˜r ˜r˜6‘N×$Ñ$Ñ$ v¨b¨q¨b°!¨e¡}Ñ4Ð4r!   c                óD  — | t        j                  dt        | «      dz
  t        dt        | «      «      t        ¬«         j                  t        «      }|j                  t        «      }t        |«      \  }}t        |«      \  }}t        |«      }g }	t        j                  t        d«      «      D �]"  }
t        j                  dd¬«      D �]  }t        j                  d«      d d …|
f   t        j                  |«      z  }t         j                  j!                  |«      dk  rŒY||z  |j"                  z  }t        j                  d«      }||d d…d d…f<   |||z  z
  |d d…df<   |j%                  t'        ||«      d	¬
«      d   }|	j)                  t        t        j*                  t        j,                  |d«      dz  «      dz  «      |
||f«       �Œ �Œ% |	j/                  d„ ¬«       g }|	d d D �]ÿ  \  }}
}}|j1                  «       }dD ]ü  }t        d«      D ]ì  }t'        ||«      }|j%                  |d	¬
«      \  }}|t        |t        t        j2                  |d«      «      «      k  }|j5                  «       dk  r Œtt7        ||   |||      «      }||z  }t         j                  j9                  |d d…df   «      dk  sŒªt         j                  j9                  |d d…d d…f   t        j                  d«      z
  «      dk  sŒì Œü Œþ |j%                  t'        ||«      d	¬
«      d   }|j)                  |t        t        j*                  t        j,                  |d«      dz  «      dz  «      t        t        j:                  |«      «      t        t        j2                  |d«      «      t        t         j                  j!                  |d d…d d…f   «      «      |
||j=                  «       dœ«       �Œ |j/                  d„ ¬«       t        j>                  |d   d   «      |fS )Nr   r   i€>  )Údtyper$   )r   r   )Úrepeatr#   r   ©ÚworkerséP   é   g      à?c                ó   — | d   S )Nr   © ©Úrows    r   Ú<lambda>zregister.<locals>.<lambda>>   s   €  C¨¢Fr!   )Úkeyé   )r8   é#   é   r@   é   çÍÌÌÌÌÌì?éd   g{®Gázt?gñhãˆµøä>gffffffî?)Úinitial_capped_rmse80_mmÚcapped_rmse80_mmÚnode_nn_median_mmÚnode_nn_p95_mmÚdeterminantÚpca_permutationÚ	pca_signsr2   c                ó   — | d   S )NrG   r;   r<   s    r   r>   zregister.<locals>.<lambda>S   s
   €  Ð%7Ò!8r!   r2   ) r   ÚlinspaceÚlenÚminÚintÚastypeÚfloatr    r   Ú	itertoolsÚpermutationsÚrangeÚproductr&   Údiagr   r   r   Úqueryr2   Úappendr   ÚminimumÚsortÚcopyÚquantileÚsumr0   ÚnormÚmedianÚtolistÚasarray)ÚscanÚcadr'   r(   ÚcsÚvsÚctr-   ÚtreeÚ
candidatesÚpermÚsignsÚbasisr.   r/   ÚdistÚreportsÚinitialÚ	thresholdr,   ÚmovedÚindexÚgoodÚchanges                           r   Úregisterrv   /   s�  € à”"—+‘+˜a¤ T£¨1¡¬c°%¼¸T»Ó.CÌ3ÔOÑP×WÑWÔX]Ó^€FØ�Z‰ZœÓ€FÜ�vÓ�F€Bˆ¬°6Ó):¡  BÜ�6‹?€DØ€JÜ×&Ñ&¤u¨Q£x×0ˆÜ×&Ñ& w°q×9Ð9ˆEÜ—F‘F˜1“Iša ˜gÑ&¬¯©°«Ñ7ˆEÜ�y‰y�}‰}˜UÓ# aÒ'¨Ø˜E‘z B§D¡DÑ(ˆHÜ—V‘V˜A“YˆF°  r¨ r¨2¨A¨2 v¡È2ÈhÐWYÉkÉ>¸6À"À1À"ÀaÀ%¹=Ø—:‘:œi¨°Ó7À�:ÓDÀQÑGˆDØ×Ñœu¤R§W¡W¬R¯Z©Z¸¸bÓ-AÀ1Ñ-DÓ%EÀrÑ%IÓJÈDÐRWÐY_Ð`Öaò :ð 1ð ‡O�OÑ*€OÔ+Ø€GØ(2°2°A¬Ñ$ˆ��u˜fØ—‘“ˆÛ(ˆIÜ˜2–Y�Ü! &¨&Ó1�Ø"Ÿj™j¨¸˜jÓ;‘��eØœc )¬U´2·;±;¸tÀSÓ3IÓ-JÓKÑK�Ø—8‘8“: Ò#¡UÜ" 5¨¡;°°u¸T±{Ñ0CÓD�Ø &™�Ü—9‘9—>‘> &¨¨!¨¨Q¨¡-Ó0°4Ó7¼B¿I¹I¿N¹NÈ6ÐRTÐSTÐRTÐUWÐVWÐUWÐRWÉ=ÔY[×Y_ÑY_Ð`aÓYbÑKbÓ<cÐfjÓ<jÙñ ð )ð �z‰zœ) F¨FÓ3¸RˆzÓ@ÀÑCˆØ�‰°GÜ,1´"·'±'¼"¿*¹*ÀTÈ"Ó:MÈqÑ:PÓ2QÐSUÑ2UÓ,VÜ-2´2·9±9¸T³?Ó-CÜ*/´·±¸DÀÓ0EÓ*FÜ',¬R¯Y©Y¯]©]¸6À"À1À"ÀRÀaÀRÀ%¹=Ó-IÓ'JØ+/¸eÐRX×R_ÑR_ÓRañcö 	dð )7ð& ‡L�LÑ8€LÔ9Ü�:‰:�g˜a‘j Ñ-Ó.°Ð7Ð7r!   c                 ó’  — t         dz  } t         dz  }t         dz  }|j                  dd¬«       |j                  dd¬«       t        j                  | dz  j	                  «       «      }t        j                  | dz  j	                  «       «      }t        j                  t         dz  d	¬
«      5 }|j                  D �ci c]  }|||   “Œ
 }}d d d «       t        j                  t         dz  d	¬
«      5 }|j                  D �ci c]  }|||   “Œ
 }}d d d «       t        j                  | t        › d�z  d	¬
«      5 }t        j                  |d   t
        j                  «      }	d d d «       d   }
|d   }t        	|
«      \  }}t        |	|«      j                  t
        j                  «      }t        |d   z  }|j                  d«      }t        j                  t!        j"                  |«      «      }t        j                  |d   d   «      }t        j                  |d   d   «      }|d   |d   z
  |j$                  d   dz
  z  }|d   |d   z
  |j$                  d   dz
  z  }|	d d t'        dt)        |	«      dz  «      …   }t        j*                  |d d …df   |d   z
  dz  «      j                  t,        «      }t        j*                  |d   |d d …df   z
  dz  «      j                  t,        «      }|dk\  ||j$                  d   k  z  |dk\  z  ||j$                  d   k  z  }t        j.                  t)        |«      t
        j0                  «      }|||   ||   f   ||<   ||dkD  z  }t        j2                  ||   ||df   z
  «      }g }|D �]{  }t-        t5        |d   «      «      t-        t5        |d   «      «      } }d|cxk  r|j$                  d   k  r.n n+d| cxk  r|j$                  d   k  rn nt5        || |f   «      nt
        j0                  }!t        j6                  |d   d|z  z   |d   d| z  z
  |!gt4        «      }"t        |"d    |«      d   }#t9        |
«      j;                  |#«      \  }$}%|j=                  |d   |d   || g|j?                  dd «      |j?                  d!d «      g|"jA                  «       |#jA                  «       t-        |%«      t5        |$«      tC        t        jD                  |!«      xr |!dkD  «      d"œ	«       �Œ~ |d#   }&|d$   d d …df   }'t        j                  g d%¢t
        j                  «      }(g })|D ]:  }|d&   sŒ	|d'   d(k  sŒ|)j=                  tG        t)        |
«      |&|'|d)   «      «       Œ< |)stI        d*«      ‚t        jJ                  t        jL                  |)«      d¬+«      }*|*d d …d f   |(d    k  }+t        jN                  d,|*d d …d f   |(d    z  dz  z  «      j                  t
        j                  «      },t9        |«      }-|-j;                  |
d-¬.«      \  }.}/||/   |
z
  }0t        jP                  d/|0|«      }1tS        d0   |d1   d   |d2   d   «      \  }2}3tU        |2«      \  }4}5tU        |3«      \  }6}7tW        |
|4|6«      \  }8}9}:};|t        › d3�z  }<t        jX                  |<fi d4t        j                  t        «      “d5|
“d6|“d7|&“d1|d1   d   “d2|d2   d   “d0|d0   “d8|	“d9|“d:|.j                  t
        j                  «      “d;|1j                  t
        j                  «      “d<t        j                  d=«      “d>t        j                  |D �=cg c]  }=|=d?   ‘Œ	 c}=t
        j                  «      “d@t        j                  |D �=cg c]  }=|=dA   ‘Œ	 c}=t
        j                  «      “dB|*“dC|(“dD|+“dE|,“dF|4“dG|6“dH|2“dI|3“dJ|5“dK|7“dL|8“dM|9“dN|:“dO|;“dPt        j                  d	«      “dQ|“dRt        j                  t
        jZ                  j]                  |d dS…d dS…f   «      «      “dTt        j                  d	«      “dUt        j^                  t)        |
«      tB        «      “Ž ta        jb                  ddSdVd¬W«      \  }>}?te        |?d   dX«      D ]§  \  }@\  }A}B|@jg                  |
d d d…|Af   |
d d d…|Bf   dYdZd[d¬\«       |@jg                  |d d d]…|Af   |d d d]…|Bf   d^d_d`d¬\«       |@ji                  da«       |@jk                  db|A   dcz   «       |@jm                  db|B   dcz   «       |@jo                  dd¬e«       Œ© |?df   jg                  |
d d …df   |
d d …df   d|,d d …df   dgddd¬h«       |?df   jq                  di«       |?dj   jg                  |
d d …df   |
d d …df   dt        jr                  |.d(«      dkdd(d¬h«       |?dj   jq                  dl«       |?dm   ju                  t        jv                  dn«      dz   |4do¬p«       |?dm   jy                  t        jv                  dn«      dz   |6dqdr¬p«       |?dm   jq                  ds«       |?dm   jo                  «        |?dd d…f   D ]5  }@|@ji                  da«       |@jk                  dt«       |@jm                  du«       Œ7 |>j{                  dv«       |>j}                  |dwz  dx¬y«       ta        j~                  |>«       t        |d   dz   |j$                  d   |j$                  d   gt5        |«      t5        |«      gt)        |«      t5        |j�                  «       «      t5        t        j‚                  |«      «      t5        t        j„                  |d{«      «      d|œ|d	|t)        |)«      t-        |+d d …df   j‡                  «       «      dt‰        |<j‹                  t         «      «      g d}¢d~œ}C|dz  j�                  t        jŽ                  |Cd	d¬€«      «       |d�z  j�                  t        jŽ                  t        |<j�                  dd‚dƒœgd„d…œd¬†«      «       t“        t        jŽ                  |d   d‡   |Cdˆ   d‰   t)        |)«      t-        |+d d …df   j‡                  «       «      dŠœd¬†«      «       y c c}w # 1 sw Y   �ŒËxY wc c}w # 1 sw Y   �Œ™xY w# 1 sw Y   �ŒUxY wc c}=w c c}=w )‹Nzanalysis/resultszdata_processed/pairedzresults/inspectionT)ÚparentsÚexist_okzsource_manifest.jsonzdefects.jsonz%data_processed/graphs/graph_12000.npzF)Úallow_picklez/data_processed/tabular/process_and_geometry.npzz_all_merge_pointcloud_full.npzr   Úpos_mmÚnormalÚ	fused_plyzMerged_Height.tifÚfused_checkÚmin_xyzÚmax_xyzr   r   i0u  gš™™™™™¹?i|üÿÿr9   ÚXÚYÚNoÚErrorÚWÚ ÚH)	Úcsv_noÚclassÚpixel_xyÚwidth_height_pxÚ
raw_xyz_mmÚ
cad_xyz_mmÚnearest_cad_nodeÚnearest_cad_node_mmÚvalid_heightÚ
edge_indexÚ	edge_attr)g      @g      $@g      4@r�   r�   é   rŽ   zLNo defect anchor is near the CAD; diagnostic training labels cannot be builtr   g      à¿r   r6   zij,ij->iÚprocess_feature_namesÚ	process_xÚprocess_feature_validz_cad_ply_targets.npzÚrun_idÚ
cad_pos_mmÚ
cad_normalÚcad_edge_indexÚscan_pos_raw_mmÚscan_pos_cad_mmÚcad_to_scan_distance_mmÚcad_to_scan_normal_residual_mmÚdefect_classÚmultiple_unvalidatedÚdefect_anchor_raw_mmrŒ   Údefect_anchor_cad_mmr�   Ú#geodesic_distance_to_defect_seed_mmÚweak_area_radii_mmÚweak_defect_maskÚweak_defect_probabilityÚheater_top_cÚheater_bottom_cÚheater_top_c_rawÚheater_bottom_c_rawÚheater_top_imputedÚheater_bottom_imputedÚheater_zone_index_zero_basedÚ%provisional_heater_top_c_per_cad_nodeÚ(provisional_heater_bottom_c_per_cad_nodeÚ'provisional_heater_delta_c_per_cad_nodeÚheater_projection_validÚtransform_raw_ply_to_cadÚtransform_determinantr$   Ú$registration_independently_validatedÚtraining_valid)é   r@   )ÚfigsizeÚconstrained_layout))r   r   )r   r9   ©r   r9   gš™™™™™Ù?z#234b69zME1a CAD)ÚsÚcÚlabelÚ
rasterizedé   g333333Ó?z#e38635z
fused scanÚequalÚXYZz mmr@   )Úmarkerscale)r   r   Úmagma)rº   r»   ÚcmapÚvminÚvmaxr½   z(6 CSV seeds, assumed 10 mm geodesic risk)r   r   Úviridisz0CAD to fused scan nearest distance, capped 30 mmr¹   é   Úupper)r¼   zo-Úlowerz,XLS heaters; zone position on CAD unverifiedz
CAD X (mm)z
CAD Z (mm)u>   ME1a visual inspection â€” proper rigid fit is diagnostic onlyzalignment_targets.pngé    )ÚdpiÚvertex_countrD   )Úsample_countÚvalid_fractionÚheight_abs_median_mmÚheight_abs_p90_mm)zVPCA/ICP pose is a best-fit diagnostic, not an independently verified scanner extrinsiczcCSV pixel convention inferred from raster geometry but defect identity and extent remain unreviewedz:Nearest surface residual is not material-point deformationzAAll model fits below are training-set weak-label diagnostics only)ÚrunÚfused_ply_verticesÚraster_size_xyÚinferred_pitch_xy_mmÚraster_mapping_checkÚregistration_candidatesÚ(selected_pose_is_independently_validatedÚanchorsÚanchors_within_30mmÚweak_10mm_positive_nodesÚtraining_valid_nodesÚ
paired_npzÚlimitationsztarget_review.json)Úensure_asciiÚindentz
index.jsonzdiagnostic, unvalidated)rÑ   ÚnpzrÛ   Ústatusz+../../results/inspection/target_review.json)ÚentriesÚreview)rß   rG   rÕ   rÐ   )Úpose_capped_rmse80_mmÚraster_height_p90_mmrÙ   rÚ   )JÚROOTÚmkdirÚjsonÚloadsÚ	read_textr   ÚloadÚfilesÚRUNrc   Úfloat32rv   r2   rR   ÚPROJECTÚ	with_namer   ÚopenÚshapeÚmaxrO   ÚrintrQ   ÚfullÚnanÚabsrS   Úarrayr   rY   rZ   Úgetrb   ÚboolÚisfiniter   ÚRuntimeErrorrP   ÚstackÚexpÚeinsumr	   r
   r   Úsavez_compressedr   r   ÚzerosÚpltÚsubplotsÚzipÚscatterÚ
set_aspectÚ
set_xlabelÚ
set_ylabelÚlegendÚ	set_titler[   ÚbarÚarangeÚplotÚsuptitleÚsavefigÚcloser   ra   r^   r_   ÚstrÚrelative_toÚ
write_textÚdumpsÚnameÚprint)Dr'   ÚoutputÚ
inspectionÚmanifestÚdefectsÚdÚkÚgraphÚtabrd   re   r|   r/   rj   Úscan_cadÚfusedÚrasterÚheightÚlowÚhighÚpitch_xÚpitch_yÚcheckÚixÚiyÚ	in_rasterÚraster_zrt   Úabs_zrØ   r=   ÚpxÚpyÚzÚrawÚmappedÚdistanceÚnodeÚedgeÚlengthÚradiiÚ	distancesr[   Ú	weak_maskÚweak_probabilityÚ	scan_treeÚcad_distanceÚ	cad_indexÚ	cad_deltaÚ
cad_signedÚtop_rawÚ
bottom_rawÚtopÚtop_imputedÚbottomÚbottom_imputedÚzoneÚnode_topÚnode_bottomÚ
node_deltaÚpairedr)   Úfigr   ÚaxÚiÚjrã   sD                                                                       r   ÚmainrN  W   s­  € ÜÐ&Ñ&€FÜÐ+Ñ+€FÜÐ,Ñ,€JØ
‡L�L˜¨€LÔ-¨z×/?Ñ/?ÈÐW[Ð/?Ô/\Ü�z‰z˜6Ð"8Ñ8×CÑCÓEÓF€HÜ�j‰j˜& Ñ/×:Ñ:Ó<Ó=€GÜ	�‰”Ð=Ñ=ÈEÕ	RÐVWØ!"§¢Ó)¡˜A��1�Q‘4‘ ˆÐ)÷ 
Sä	�‰”ÐGÑGÐV[Õ	\Ð`aØ ŸwšwÓ'™w˜!ˆq��1‘‰v˜wˆÐ'÷ 
]ä	�‰�œ3˜%Ð=Ð>Ñ>ÈUÕ	SÐWXÜ�z‰z˜!˜H™+¤r§z¡zÓ2ˆ÷ 
Tà
�‰/€C E¨(¡O˜6Ü! $¨Ó,Ñ€FˆJÜ˜˜vÓ&×-Ñ-¬b¯j©jÓ9€Hô �h˜{Ñ+Ñ+€EØ�_‰_Ð0Ó1€FÜ�Z‰ZœŸ
™
 6Ó*Ó+€FÜ
�*‰*�X˜mÑ,¨YÑ7Ó
8€CÜ�:‰:�h˜}Ñ-¨iÑ8Ó9€DØ�A‰w�s˜1‘v‰~ &§,¡,¨q¡/°!Ñ"3Ñ4€GØ�A‰w�s˜1‘v‰~ &§,¡,¨q¡/°!Ñ"3Ñ4€GØÑ*”3�qœ˜T› EÑ)Ó*Ð*Ñ+€EÜ	�‰�%š˜!˜‘*˜S ™VÑ# RÑ'Ó	(×	/Ñ	/´Ó	4€BÜ	�‰�$�q‘'˜%¢ ! ™*Ñ$ bÑ(Ó	)×	0Ñ	0´Ó	5€BØ�Q‘˜˜FŸL™L¨™OÑ+Ñ,¨b°!©eÑ4°b¸¿¹Àa¹Ñ6HÑI€IÜ�w‰w”s˜5“z¤2§6¡6Ó*€HØ   I¡¨r°)©}Ð!<Ñ=€HˆYÑØ˜ ™Ñ&€DÜ�F‰F�8˜D‘> %¨¨Q¨¡-Ñ/Ó0€EØ€GÜˆÜ”E˜#˜c™(“OÓ$¤S¬¨s°3©x«Ó%9ˆ2ˆØ$% rÔ$9¨&¯,©,°q©/Õ$9¸aÀÔ>SÀFÇLÁLÐQRÁOÕ>SŒE�&˜˜B˜‘-Ô ÔY[×Y_ÑY_ˆÜ�h‰h˜˜A™˜r "™u™ d¨1¡g¨b°©e¡m°QÐ7¼Ó>ˆÜ˜3˜t™9 VÓ,¨QÑ/ˆÜ ›×*Ñ*¨6Ó2‰ˆ�Ø�‰  T¡°3°w±<ÈBÈrÈ7Ø+.¯7©7°3¸Ó+;¸C¿G¹GÀCÈÓ<LÐ*MØ%(§Z¡Z£\¸v¿}¹}»Ü+.¨t«9Ì5ÐQYË?Ü'+¬B¯K©K¸«NÒ,E¸qÀ¹vÓ'Fñ	Hö 	Ið ð �Ñ€D¨¨{Ñ);ºA¸a¸CÑ)@ Ü�J‰J’|¤B§J¡JÓ/€EØ€IÛˆØˆ~Ó 3Ð'<Ñ#=ÀÓ#BØ×ÑÔ.¬s°3«x¸¸VÀCÐHZÑD[Ó\Õ]ð ñ ÜÐiÓjÐjÜ�f‰f”R—X‘X˜iÓ(¨aÔ0€GØš˜$˜‘ 5¨¡;Ñ.€IÜ—v‘v˜c 7ª1¨T¨6¡?°5¸±;Ñ#>ÀÑ"BÑBÓC×JÑJÌ2Ï:É:ÓVÐÜ˜Ó!€IØ&Ÿ_™_¨S¸˜_Ó<Ñ€L�Ø˜Ñ# CÑ'€IÜ—‘˜: i°Ó7€JÜ& sÐ+BÑ'CÀCÈÑDTÐUVÑDWÐX[Ð\sÑXtÐuvÑXwÓxÑ€GˆJÜ/°Ó8�O€CˆÜ5°jÓAÑ€Fˆ>Ü)FÀsÈ3ÈvÓ)VÑ(€Dˆ�+˜jØ”S�EÐ-Ð.Ñ.€FÜ×Ñ˜ò g¤b§j¡j´¤oð gÁð gÑPVð gÙðgØ&)¨+Ñ&6°qÒ&9ðgØPSÐTkÑPlÐmnÒPoðgà!Ð"9Ò:ðgáKOðgñ !ðgð :F×9LÑ9LÌRÏZÉZÔ9Xðgð (2×'8Ñ'8¼¿¹Ô'Dð	gô SU×R\ÑR\Ð]sÔRtð	gô
  ŸZ™ZÁ'Ó(JÁ'¸Q¨¨<«À'Ñ(JÌ2Ï:É:ÔVðgô  ŸZ™ZÁ'Ó(JÁ'¸Q¨¨<«À'Ñ(JÌ2Ï:É:ÔVðgñ -4ðgñ HMðgñ #ðgñ <Lðgñ ðgñ *0ðgñ BIðgñ ^hðgñ 'ðgñ >Lðgñ &*ðgñ QYðgñ 2=ðgñ 1;ðgô TV×S]ÑS]Ð^cÔSdðgñ "(ðgô ?A¿j¹jÌÏÉÏÉÐW]Ð^`Ð_`Ð^`ÐacÐbcÐacÐ^cÑWdÓIeÔ>fðgô .0¯Z©Z¸Ô->ðgô OQÏhÉhÔWZÐ[^ÓW_Ô`dÔNeñgô" �\‰\˜!˜A fÀÔE�H€CˆÜ˜˜Q™Ð 3Ö4‰ˆ‰5ˆAˆaØ
�
‰
�3‘s˜�s˜1�u‘:˜c¡# A # a %™j¨2°	À
ÐVZˆ
Ô[Ø
�
‰
�8™D˜b˜D ˜FÑ# H©T¨r¨T°!¨VÑ$4°r¸IÈLÐdhˆ
ÔiØ
�‰�gÔ˜rŸ}™}¨U°1©X°e©^Ô<¸R¿]¹]È5ÐQRÉ8ÐTYÉ>Ô=ZÐ[]×[dÑ[dÐqrÐ[dÕ[sð 5ð 	ˆ�I×Ñ�cš!˜A˜#‘h˜s¢1 Q 3™x¨!Ð.>ºqÀ¸sÑ.CÈÐVWÐ]^ÐjnÐÔoØˆ�I×ÑÐBÔCØˆ�I×Ñ�cš!˜A˜#‘h˜s¢1 Q 3™x¨!¬b¯j©j¸ÀbÓ.IÈyÐ^_ÐegÐswÐÔxØˆ�I×ÑÐJÔKØˆ�I‡M�M”"—)‘)˜B“- ‘/ #¨G€MÔ4°T¸#±Y·^±^ÄBÇIÁIÈbÃMÐRSÁOÐTZÐ[_Ðfm°^Ô5nØˆ�I×ÑÐFÔGÈÈSÉ	×HXÑHXÔHZØ�1�R�a�R�4Œjˆ˜Ÿ™ wÔ/°·±¸lÔ0KÈBÏMÉMÐZfÕLgˆjØ‡L�LÐQÔRØ‡K�K�
Ð2Ñ2°s€KÔ;¼C¿I¹IÀc¼Nä¨8°MÑ+BÀ>Ñ+RØŸ™ Q™¨¯©°Q©Ð8ÔQVÐW^ÓQ_Ô`eÐfmÓ`nÐPoÜ-0°«ZÌÈtÏyÉyË{ÓI[Ü5:¼2¿9¹9ÀUÓ;KÓ5LÔafÔgi×grÑgrÐsxÐy{Óg|Óa}ñà *ÐV[Ø¬c°)«nÜ!$ Yªq°¨s¡^×%7Ñ%7Ó%9Ó!:Ø¬C°×0BÑ0BÄ4Ó0HÓ,IòOñP€Fð Ð$Ñ$×0Ñ0´·±¸FÐPUÐ]^Ô1_Ô`ØˆLÑ×$Ñ$¤T§Z¡ZÄ3ÈVÏ[É[Ø Ð*Cñ=Eð <FØO|ñ1~ð FGô&Hô Iä	Œ$�*‰*¨j¸©mÐ<NÑ.OØ%Ð&<Ñ=Ð>QÑRÜ! )›nÌÈIÒVWÐXYÐVYÉN×L^ÑL^ÓL`ÓHañcàjkômõ nùòU *÷ 
SÑ	Rüò (÷ 
]Ñ	\úç	SÑ	Süòz )KùÚ(JsT   Â,rÂ;rÃrÃ0r%Ã?r Är%Ä7(r2Ý r?Þsòròrò r%ò%r/ò2r<Ú__main__)r   ú
np.ndarrayÚreturnztuple[np.ndarray, np.ndarray])r'   rP  r(   rP  rQ  rP  )r   rP  r/   rP  rQ  rP  )rd   rP  re   rP  rQ  ztuple[np.ndarray, list[dict]])rQ  ÚNone)#Ú__doc__Ú
__future__r   rT   rè   Úpathlibr   Ú
matplotlibÚuseÚmatplotlib.pyplotÚpyplotr  Únumpyr   ÚPILr   Úscipy.spatialr   Úmatch_targetsr   r	   r
   r   Ú__file__Úresolverx   rï   ræ   rí   r    r0   r2   rv   rN  Ú__name__r;   r!   r   Ú<module>ra     s’   ðá RÝ "ã Û Ý ã Ø €
‡�ˆuÔ Ý Û Ý Ý !ç vÓ vá
ˆx‹.×
 Ñ
 Ó
"×
*Ñ
*¨1Ñ
-€ØÐ&Ñ&€Ø€óó	ó5ó%8óPtnðn ˆZÒ™�Ðr!   