Ë
    ìU×j¯2  ã                  óH  — d Z ddlmZ ddlZddlZddlZddlZddlmZm	Z	 ddl
mZ edv rCej                  j                  d e ee«      j#                  «       j$                  d   «      «       ddlmZmZmZmZmZ dd	lmZ dd
lmZmZ d„ Zd„ Zd„ Z d„ Z!e"dk(  r e!«        yy)zURebuild averages, per-design scores, details and explanations from Summary JSON only.é    )ÚannotationsN)ÚCounterÚdefaultdict)ÚPath)NÚ é   )ÚROOTÚdumpÚreadÚ	stage_dirÚmodel_size_key)ÚMETRICS)Úweak_model_tablesÚweak_resultc                óÎ   — t         D ��ci c]I  }|| D �cg c]  }|d   j                  |«      €Œ|d   |   ‘Œ! c}x}rt        |«      t        |«      z  nd “ŒK c}}S c c}w c c}}w )NÚmetrics)r   ÚgetÚsumÚlen)ÚrecordsÚkeyÚrÚvaluess       ú@/workspace/moltex-experiments/poc_experiments_v2/Summary/main.pyÚaveragesr      s—   € åô Ù�ð ÑU\ó  :CÑU\ÐPQÐ`aÐbkÑ`l×`pÑ`pÐqtÓ`uñ  aB¸!¸I¹,ÀsÓ:KÐU\ñ  :Cð  0C¨vð  0C”�V“œs 6›{Ò*ð  JNñ  NØò ð  ùò  :Cùó  s   Š
A!”A®
A¸ A!ÁA!c                ó  — t        | «      } t        | dz  «      }t        | dz  j                  d«      «      D �cg c]  }t        |«      ‘Œ }}t	        t
        «      t	        t
        «      }}|D ]>  }||d   |d   f   j                  |«       ||d   |d   |d   f   j                  |«       Œ@ g }t        |j                  «       «      D ]t  \  \  }}	}
|
D �cg c]  }|d   dk(  sŒ|‘Œ }}|j                  ||	t        |«      t        |«      t        |
«      t        t        d	„ |
D «       «      «      d
|
d   d   dœ«       Œv t        |j                  «       «      D ��	��
��cg c]_  \  \  }}	}}
||	|t        |
D �cg c]  }|d   dk(  sŒ|‘Œ c}«      |
D ��cg c]"  }dD �ci c]  }||j                  |«      “Œ c}‘Œ$ c}}dœ‘Œa }}}
}}	}}dddddœ|j                  di «      j                  dd«      ddddddt        t        d„ |D «       «      «      |D ��cg c])  }|d   d vr d!D �ci c]  }||j                  |«      “Œ c}‘Œ+ c}}d"œ
}|d#   j                  d$i «      j                  d%«      r8d&|d'<   d(|d)<   d*|d+   d,<   d-|d.<   |d#   d$   j                  d/«      r
d0|d'<   d1|d.<   t	        t
        «      }|D ]E  }t        |«      sŒ|j                  d2«      rŒ!||d   |d   f   j                  t        |«      «       ŒG g }t        |j                  «       «      D ]«  \  \  }}	}
||	t        |
«      d3d4œ}|d#   j                  d$i «      j                  d5«      rt        |d#   d$   |«      |d6<   d7D ]D  }|
D �cg c]  }|j                  |«      €Œ||   ‘Œ }}|rt        |«      t        |«      z  nd ||<   ŒF |j                  |«       Œ­ t!        | d8z  |«       t!        | d9z  |«       t!        | d:z  |«       t!        | d;z  |«       |d#   |d   d<   |d   d=   t        |«      t        d>„ |D «       «      |||g d?¢d@œ	}ddAlm}  |||j                  dB«      «      |dC<   ||dD<   |d#   j                  d$i «      j                  dEg «      |dE<   |dE   dFdGœ|dH<   |d#   j                  d$i «      j                  dI«      r|d'xx   dJz  cc<   |d.xx   dKz  cc<   |d#   j                  d$i «      j                  dL«      r|dMxx   dNz  cc<   t!        | d;z  |«       t!        | dOz  |«       g }|D ]j  }|dP   }|d   |d   t'        |dQ   «      g}|dRD �cg c]  }||   €dSn||   dT›‘Œ c}z  }|j                  dUdVj)                  dW„ |D «       «      z   dXz   «       Œl |d#   }t*        j,                  j/                  t0        dYz  dZz  |d[   z  |d\   z  d]z  | «      }t*        j,                  j/                  t0        d^z  d]z  | «      d_|d[   › d`|d\   › �z   }dV}|rdat3        |«      z   }db|d#   d[   › dc|d#   d\   › dd|d<   › de|d=   › df|dg   › dh|dC   di   › dj|dC   dk   › dl|dC   dm   › dnt5        j6                  |«      › dot5        j6                  |«      › dp|› dqdVj)                  |«      › drt5        j6                  t'        |«      «      › ds�} | d]z  j9                  | dt¬u«       |S c c}w c c}w c c}w c c}w c c}}w c c}}}
}}	}w c c}w c c}}w c c}w c c}w )vNúdata_provenance.jsonÚresultsz*.jsonÚmodel_idÚprotocolÚ	design_idÚscore_statusÚscoredc              3  ó&   K  — | ]	  }|d    –— Œ y­w©ÚstatusN© ©Ú.0r   s     r   Ú	<genexpr>zrebuild.<locals>.<genexpr>%   s   è ø€ Ð1MÁuÀ!°!°Hµ+Áuùó   ‚zDunweighted mean across scored dataset records; null metrics excludedr   Ú
evaluation)r   r    Úmacro_average_scoresÚscored_datasetsÚtotal_result_recordsÚstatus_countsÚaggregationr,   )Ú
dataset_idÚfold_idr&   r"   r   Údetail)r   r    r!   ÚscoresÚdatasetsz{All records sharing a design-file SHA256 are held out together. Fit and preprocessing statistics use training records only.z^Fit each design's reviewed records and evaluate those same records. This is training fit only.zTFit all reviewed records and evaluate those same records. This is training fit only.zAUntrained actual-input forward passes. No accuracy is calculated.)Úleave_one_design_outÚ
per_designÚ	train_allÚ
diagnosticÚdataÚ	selectionzDCAD + Excel + PLY; CSV required for NG and optional for explicit OK.zhExternally reviewed common-CAD node risk; raw CSV pixel coordinates are not automatically mapped to CAD.zŠMAE/RMSE/Brier use reviewed probability targets; AP/AUC and confusion scores threshold reviewed targets. Null means unavailable/undefined.zTMacro means are per dataset, not per node. Unscored records never enter the average.znGP posterior standard deviations are available when fitted. Other models have no calibrated uncertainty claim.zdPhysics GNN deformation/type heads are not supervised by this node-risk contract and are not scored.z·Six distinct designs are the current holdout groups. All complete records are NG; OK without CSV is excluded. No pixel-to-CAD calibration or validated deformation target was supplied.c              3  ó&   K  — | ]	  }|d    –— Œ y­wr%   r'   r(   s     r   r*   zrebuild.<locals>.<genexpr>8   s   è ø€ Ð >±g°  8¥±gùr+   r&   )Ú	completedÚuntrained_diagnostic)r   r    r!   r2   r&   Úreason)
Úevaluation_protocolsÚdata_selectionÚtargetsr5   Ú	averagingÚuncertaintyÚdeformationÚlimitationsÚstatusesÚfailuresÚrunÚconfigÚallow_weak_labelszÁAutomatic scan_projected_weak CAD-node targets from CSV pixels, measured height rasters and proper rigid scan-to-CAD fits. Unannotated covered nodes outside defect buffers are assumed negative.rC   z·Independently reviewed accuracy is unavailable for weak supervision. Real optimizer epoch losses and checkpoints are saved; weak-label predictions never enter reviewed score averages.r5   z‘Experimental fit on eligible automatic scan-projected weak labels. Predictions are training-fit diagnostics, not independently reviewed accuracy.rA   r9   a
  Raster calibration and registration are inferred and unreviewed. CSV source conflicts and poor-overlap cases are recorded. Datasets with failed projection gates are excluded from weak training. All source records are NG; unannotated regions are not reviewed healthy.rG   Úuser_selected_fit_datasetszÝUser-selected scan/CAD pairs with recorded mirrored frames and CAD-supported scan regions. Node targets remain automatic weak CSV/raster projections; unannotated covered nodes outside guarded regions are assumed negative.zìUser confirmation applies to pair inclusion. CAD-node ground truth remains unreviewed. Rejected CSV rows and their nearby assumed negatives are masked; source choices, reflection, raw residuals and partial scan coverage remain recorded.Útraining_excludedF)r   r    r6   Úindependently_reviewedÚsize_named_outputsÚ
input_size)ÚbceÚaverage_precisionÚiouúavg_scores.jsonúindividual_scores.jsonúdetailed_scores.jsonúexplanations.jsonÚdataset_countÚdesign_countc              3  ó,   K  — | ]  }|d    dk(  –— Œ y­w)r"   r#   Nr'   r(   s     r   r*   zrebuild.<locals>.<genexpr>U   s   è ø€ Ð)YÑQXÈA¨!¨NÑ*;¸xÕ*GÑQXùs   ‚)r   rU   rV   rW   rX   zresults/**/*.json)	rJ   rY   rZ   Úresult_record_countÚscored_record_countÚaverage_scoresÚindividual_scoresÚexplanationsÚself_contained_files)Útraining_diagnosisÚpreparedrb   Úweak_model_checksÚexcluded_train_dataset_idszyExcluded from every model fit and model-check cohort; retained for inspection and separately marked held-out predictions.)Údataset_idsÚpolicyÚtraining_exclusionsÚinclude_ok_weak_labelsze Explicit OK production records provide weak healthy CAD-node targets without requiring a defect CSV.zv Production OK status is a weak part-level healthy assumption; it is not independently reviewed CAD-node ground truth.Úevaluation_reference_preparedrD   zg Size comparisons use frozen reference CAD-node positions, targets and masks, shared across every size.úsummary.jsonr-   r.   )ÚmaeÚrmserS   rT   Údiceu   â€”z.5fz<tr>r   c              3  óN   K  — | ]  }d t        j                  |«      › d�–— Œ y­w)z<td>z</td>N)ÚhtmlÚescape)r)   Úvalues     r   r*   zrebuild.<locals>.<genexpr>l   s&   è ø€ Ð$YÑSXÈ% t¬D¯K©K¸Ó,>Ð+?¸uÔ%EÑSXùs   ‚#%z</tr>ÚPlotsÚoutputsÚdateÚrun_idú
index.htmlÚ
Visualizerz?run=Ú/z—<h2>Model checks against weak labels</h2><p>Training fit and held-out-design agreement are separate; these are not independently reviewed accuracy.</p>u  <!doctype html><html lang="en"><meta charset="utf-8"><title>Moltex v2 summary</title>
<style>body{font:15px system-ui;margin:40px;max-width:1400px}table{border-collapse:collapse}td,th{padding:8px;border:1px solid #ddd}pre{white-space:pre-wrap}</style>
<h1>Moltex v2 â€” z / z	</h1>
<p>u    datasets Â· u    designs Â· r]   z0 scored records</p>
<p><strong>Training status: Útraining_statusu   </strong> Â· Útrained_prediction_recordsu    trained prediction records Â· Úfolds_with_epoch_lossesz) folds with epoch losses</p>
<p><a href="u?   ">PNG results, losses &amp; training diagnosis</a> Â· <a href="u£   ">CAD / scan / label / model-input visualizer</a></p>
<p>â€” = no valid score. Diagnostic and training-fit outputs are separate from unseen-design evaluation.</p>
zœ
<h2>Average scores</h2><table><tr><th>Model</th><th>Protocol</th><th>Scored datasets</th><th>MAE</th><th>RMSE</th><th>AP</th><th>IoU</th><th>Dice</th></tr>u
  </table>
<h2>Individual and detailed scores</h2><p><a href="individual_scores.json">Individual scores</a> Â· <a href="detailed_scores.json">Detailed predictions/targets</a> Â· <a href="data_provenance.json">Data and code provenance</a></p>
<h2>Explanations</h2><pre>z</pre></html>úutf-8©Úencoding)r   r   ÚsortedÚrglobr   ÚlistÚappendÚitemsr   r   Údictr   r   r   r   r   r
   Ú
Plots.mainrb   ÚstrÚjoinÚosÚpathÚrelpathr	   r   rp   rq   Ú
write_text)!Ú	directoryÚ
provenancerŠ   r   ÚgroupedÚdesignsÚrecordÚavgÚmodelr    Úgroupr   r#   ÚdidÚkÚ
individualr`   Úweak_groupsÚweak_checksÚentryÚmetricr   Úsummaryrb   Úrowsr   Úcellsr   rJ   Ú
plots_linkÚviewer_linkÚweak_sectionÚcontents!                                    r   Úrebuildr£      s	  € Ü�Y“€IÜ�iÐ"8Ñ8Ó9€JÜ&,¨i¸)Ñ.C×-JÑ-JÈ8Ó-TÔ&UÓVÑ&U˜dŒt�D�zÐ&U€GÐVÜ"¤4Ó(¬+´dÓ*;ˆW€GÛˆØ�˜
Ñ# V¨JÑ%7Ð8Ñ9×@Ñ@ÀÔHØ�˜
Ñ# V¨JÑ%7¸ÀÑ9LÐMÑN×UÑUÐV\Õ]ð ð €CÜ$*¨7¯=©=«?Ö$;Ñ Ñˆ�˜5Ù"ÓD™U˜ a¨Ñ&7¸8Ó&C’!˜UˆÐDØ�
‰
 °8ÔU]Ð^dÓUeÜ'*¨6£{ÌCÐPUËJÜ%)¬'Ñ1MÁuÓ1MÓ*MÓ%NØ#iØ"'¨¡(¨<Ñ"8ñ	:õ 	;ð %<ô 8>¸g¿m¹m»oÔ7N÷Pð Pñ 8OÑ3Ñ,�u˜h¨¨eð  %°(ÈÜ%±%Ó&Y±%¨Q¸1¸^Ñ;LÐPXÓ;X¢q°%Ñ&YÓZñ JOô   Pñ  JOð  EFÑ6~Ó Ñ6~°  A§E¡E¨!£H¡Ð6~Ó ð  JOò   PóQð 8Oð õ Pð
 !^ØvØkØYñ	-[ð
 %Ÿ.™.¨°Ó4×8Ñ8¸ð  GMó  NØ}ð _Økð HØ}ð QÜœÑ >±gÓ >Ó>Ó?á%ôcÙ%˜¨¨8©Ð<aÑ)añ ,sÓsÑ+r a�a˜Ÿ™˜q›‘kÐ+rÓsØ%òcñd€Lð �%Ñ×Ñ˜X rÓ*×.Ñ.Ð/BÔCð #fˆ�YÑð "[ˆ�XÑð =PˆÐ+Ñ,¨[Ñ9ð 'sˆ�]Ñ#Ø�eÑ˜XÑ&×*Ñ*Ð+GÔHð 'FˆL˜Ñ#ð +YˆL˜Ñ'ÜœdÓ#€KÛˆÜ�vÕ v§z¡zÐ2EÕ'FÈÐU[Ð\fÑUgÐioÐpzÑi{ÐT|ÑH}÷  IEñ  IEô  FQð  RXó  FYõ  IZð à€KÜ$*¨;×+<Ñ+<Ó+>Ö$?Ñ Ñˆ�˜5Ø"°ÄcÈ%ÃjÐlqÑrˆØ�eÑ× Ñ  ¨2Ó.×2Ñ2Ð3GÔHÜ"0°¸EÑ1BÀ8Ñ1LÈeÓ"TˆE�,ÑÛ9ˆFÙ).ÓL© A°!·%±%¸³-Ñ2K�a˜“i¨ˆFÐLÙ7=œC ›K¬¨F«Ò3À4ˆE�&ŠMð :ð 	×Ñ˜5Õ!ð %@ô 	ˆÐ&Ñ	&¨Ô,ÜˆÐ-Ñ	-¨zÔ:ÜˆÐ+Ñ	+¨WÔ5ÜˆÐ(Ñ	(¨,Ô7Ø  Ñ'¸*ÀVÑ:LÈ_Ñ:]Ø)¨&Ñ1°.ÑAÔZ]Ð^eÓZfÜ&)Ñ)YÑQXÓ)YÓ&YØ!$¸:ÐWcò(jñ	k€Gõ .Ù$6°wÀ
ÇÁÈzÓ@ZÓ$[€GÐ Ñ!Ø#.€GÐÑ Ø,6°uÑ,=×,AÑ,AÀ(ÈBÓ,O×,SÑ,SÐTpÐrtÓ,u€GÐ(Ñ)Ø:AÐB^Ñ:_ð Nñ+O€LÐ&Ñ'à�%Ñ×Ñ˜X rÓ*×.Ñ.Ð/GÔHØ�YÓð  $Kñ  	KÓØ�]Ó#ð  (`ñ  	`Ó#Ø�%Ñ×Ñ˜X rÓ*×.Ñ.Ð/NÔOØ�[Ó!ð  &Oñ  	OÓ!ÜˆÐ(Ñ	(¨,Ô7Üˆ�^Ñ	# WÔ-à€DÛˆØÐ/Ñ0ˆØ˜
Ñ# V¨JÑ%7¼¸VÐDUÑ=VÓ9WÐXˆØñ  WJó  Kñ  WJÈs˜7 3™<Ð/‘%¸À¹ÀSÐ7IÑJð  WJñ  Kñ  	KˆØ�‰�F˜RŸW™WÑ$YÑSXÓ$YÓYÑYÐ\cÑcÕdð	 ð
 �%‰.€CÜ—‘—‘¤¨¡°)Ñ!;¸cÀ&¹kÑ!IÈCÐPXÉMÑ!YÐ\hÑ!hÐjsÓt€JÜ—'‘'—/‘/¤$¨Ñ"5¸Ñ"DÀiÓPÐUZÐ[^Ð_eÑ[fÐZgÐghÐilÐmuÑivÐhwÐSxÑx€KØ€LÙðMÜO`ÐalÓOmñnˆðà˜5‘> &Ñ)Ð*¨#¨g°e©n¸XÑ.FÐ-Gð HØˆOÑÐ˜]¨7°>Ñ+BÐ*CÀ<ÐPWÐXmÑPnÐOoð pØ$Ð%9Ñ:Ð;LÑMÐNÈmÐ\cÐdxÑ\yð  {Wñ  ]Xð  \Yð  Yxð  y@ð  AUñ  yVð  Wpñ  yqð  xrð rÜ�[‰[˜Ó$Ð%Ð%dÔei×epÑepÐq|Óe}Ðd~ð à€ð \ð ]_÷  ]dñ  ]dð  eió  ]jð  \kð käŸ;™;¤s¨<Ó'8Ó9Ð:¸-ð
K€Gð �Ñ×)Ñ)¨'¸GÐ)ÔDØ€NùòK Wùò Eùò 'ZùÚ ùó   Pù÷Pùò" tùó cùò& Mùò> Ks}   ¹[Ã[Ã$[Å [/Å8[Æ[Æ
[/Æ	[)Æ[$$Æ7[)Æ<[/È[>È'[9É [>Í6\Î\Õ	\	Û[/Û$[)Û)[/Û9[>c           
     ó.  — t        d| «      }| ||t        t        | d   «      dz  «      t        t        | d   «      dz  «      dœ}t        |dz  |«       |d   D ]?  }t        |«      }|dz  |d	   z  |d
   z  |d   z  |d   z  |d   › d�z  }t        ||«       ŒA t	        |«      }	t
        dz  | d   z  | d   z  }
|
j                  dd¬«       |dz  j                  d¬«      }dD ]d  }|j                  t        j                  j                  t
        |z  |«      dz   t        j                  j                  t
        |z  |
«      dz   «      }Œf |
dz  j                  |d¬«       t        |
dz  |	«       dD ]  }t        |
|z  t        ||z  «      «       Œ |	|fS )NÚSummaryÚmanifest_dirzcode_provenance.jsonzdependencies.json)rJ   r;   rc   ÚcodeÚdependenciesr   Úmetric_filesr   r   r    r3   r!   r2   z.jsonÚreportsru   rv   T)ÚparentsÚexist_okrw   r}   r~   )rs   rx   ry   zresults.htmlrk   )rV   rW   r   )r   r   r   r
   r£   r	   ÚmkdirÚ	read_textÚreplacer‰   rŠ   r‹   rŒ   )rJ   Úmanifestrc   Úindexr�   rŽ   Úsourcer‘   rŠ   rœ   Ú
report_dirr¢   ÚstageÚnames                 r   Úcollectr¶   ƒ   sÇ  € Ü˜) SÓ)€IØ h¸HÜœt C¨Ñ$7Ó8Ð;QÑQÓRÜ"&¤t¨C°Ñ,?Ó'@ÐCVÑ'VÓ"WñY€Jô 	ˆÐ+Ñ	+¨ZÔ8Ø˜Ô'ˆÜ�f“ˆØ˜IÑ%¨¨zÑ(:Ñ:¸VÀJÑ=OÑOÐRXÐYbÑRcÑcØ˜Ñ%ñ&Ø+1°,Ñ+?Ð*@ÀÐ(FñGˆäˆT�6Õð	 (ô
 �iÓ €GÜ˜	Ñ! C¨¡KÑ/°#°h±-Ñ?€JØ×Ñ˜T¨DÐÔ1Ø˜<Ñ'×2Ñ2¸GÐ2ÓD€GÛ(ˆØ—/‘/¤"§'¡'§/¡/´$¸±,À	Ó"JÈSÑ"PÜ"$§'¡'§/¡/´$¸±,À
Ó"KÈcÑ"QóS‰ð )ð �.Ñ ×,Ñ,¨W¸wÐ,ÔGÜˆ�nÑ	$ gÔ.ãZˆÜˆZ˜$Ñ¤ Y°Ñ%5Ó 6Õ7ð [à�IÐÐó    c                 óî   — t        j                  t        ¬«      } | j                  dt        d¬«       | j                  «       }t        |j                  «      }t        d|d   › d|j                  › �«       y )N)Údescriptionz--summary-dirT)ÚtypeÚrequiredzRebuilt r\   z! records from Summary JSON only: )	ÚargparseÚArgumentParserÚ__doc__Úadd_argumentr   Ú
parse_argsr£   Úsummary_dirÚprint)ÚparserÚargsrœ   s      r   ÚmainrÅ   �   sj   € Ü×$Ñ$´Ô9€FØ
×Ñ˜¬d¸TÐÔBØ×ÑÓ€DÜ�d×&Ñ&Ó'€GÜ	ˆH�WÐ2Ñ3Ð4Ð4UÐVZ×VfÑVfÐUgÐ
hÕir·   Ú__main__)#r¾   Ú
__future__r   r¼   rp   r‰   ÚsysÚcollectionsr   r   Úpathlibr   Ú__package__rŠ   Úinsertr‡   Ú__file__Úresolver«   Úcommonr	   r
   r   r   r   ÚPostprocess.mainr   ÚSummary.model_checksr   r   r   r£   r¶   rÅ   Ú__name__r'   r·   r   Ú<module>rÓ      sˆ   ðÙ [Ý "ã Û Û 	Û 
ß ,Ý à�*ÑØ‡H�H‡O�O�A‘s™4 ›>×1Ñ1Ó3×;Ñ;¸AÑ>Ó?Ô@ç >Õ >Ý $ß ?ò ò
hòVò4jð ˆzÒ™4�6Ðr·   