
    ȗi"                        d Z ddlmZ ddlZddlZddlmZmZm	Z	 ddl
Z
 e
j                  e      Z	 	 	 	 	 	 d1dee   dee   dee   ded	ed
edeee      defdZ	 	 	 d2de	eee   f   de	eee   f   dee   dee	eee   f      def
dZ	 	 	 	 d3dededee   dedee   defdZedk(  r2ddlZ ej,                  d      Zej1                  dedd       ej1                  dedd        ej1                  d!edd"       ej1                  d#ed$d%       ej1                  d&edd'       ej1                  d(d)d*+       ej1                  d,d)d-+       ej3                         Z e
j6                  e
j8                  d./       ej:                  xr ej<                   Z eej@                  ejB                  ejD                  eejF                  ejH                  0       yy)4z*Plotting utilities for experiment results.    N)ListOptionalDictX  baselineoursoutput_pathtitlexlabelylabelpreference_weighteddpic                    t        t        dt        |       dz               }t        j                  d       t        j
                  || dddd       t        j
                  ||d	d
dd       |2t        |      t        |       k(  rt        j
                  ||dddd       t        j                  |d       t        j                  |d       t        j                  |dd       t        j                  d       t        j                  dd       t        j                  ddg       t        j                  dt        |       g       t        j                          |rFt        dt        |            }	t        j                   ||	d       t"        j%                  d|        nt        j&                          t        j(                          y)a  Plot learning curve comparing baseline, contrastive, and optionally preference-weighted methods.
    
    Args:
        baseline: List of accuracy scores for baseline method
        ours: List of accuracy scores for contrastive method
        output_path: Path to save plot (optional)
        title: Plot title
        xlabel: X-axis label
        ylabel: Y-axis label
        preference_weighted: Optional list of accuracy scores for preference-weighted method (2025-style)
       )
      figsizeb-oBaseline   r   label	linewidth
markersizer-sContrastiveNg-^Preference-Weighted (2025)   fontsize   boldr"   
fontweight   T333333?alphar   -  tightr   bbox_incheszPlot saved to )listrangelenpltfigureplotr   r   r
   legendgridylimxlimtight_layoutmaxintsavefigloggerinfoshowclose)
r   r   r	   r
   r   r   r   r   roundssafe_dpis
             M   /home/ubuntu/codebase/yexijia/保研/colocation_mvp/src/experiment/plotter.pyplot_learning_curverD      sI   * %3x=1,-.FJJwHHVXuJ!PQRHHVT5qQ&3/B+Cs8}+T,e;WcdqrsJJv#JJv#IIebV4JJHHTHHaVHHaX  sCH%KX7Cn[M23
IIK    baseline_metricscontrastive_metricspreference_weighted_metricsc           	         t        t        dt        | d         dz               }t        j                  ddd      \  }}|j                  ddd	       dd
|d   fdd|d   fdd|d   fdd|d   fg}|D ]j  \  }	}
}| |	   }||	   }|j                  ||dddd       |j                  ||dddd       |7|	|v r3||	   }t        |      t        |      k(  r|j                  ||dddd       |j                  dd        |j                  |
d        |j                  |
d!d	       |j                  d"        |j                  d#d$%       |j                  d&dg       |j                  dt        |      g       t        |      d&kD  s|j                  |d'   d(t        |      |d'   fd)d*d+d,-       |j                  |d'   d(t        |      |d'   fd)d.d+d,-       m t        j                          |rFt!        d/t#        |            }t        j$                  ||d01       t&        j)                  d2|        nt        j*                          t        j,                          y)3a  Plot all metrics (accuracy, precision, recall, F1) in subplots.
    
    Args:
        baseline_metrics: Dictionary with 'accuracy', 'precision', 'recall', 'f1' lists
        contrastive_metrics: Dictionary with 'accuracy', 'precision', 'recall', 'f1' lists
        output_path: Path to save plot (optional)
        preference_weighted_metrics: Optional third method metrics (2025-style)
    r   accuracyr   )r#   r   r   zEvaluation Metrics Comparison   r$   r%   Accuracy)r   r   	precision	Precision)r   r   recallRecall)r   r   f1zF1 Score)r   r   r   r      r   r   r   Nr   r   Interaction Roundr   r!   r    	   Tr(   r)   r   z.3fzoffset points)rR   r   left   )
textcoordsxytexthar"   )rR   ir+   r,   r-   zAll metrics plot saved to )r/   r0   r1   r2   subplotssuptitler4   
set_xlabel
set_ylabel	set_titler5   r6   set_ylimset_xlimannotater9   r:   r;   r<   r=   r>   r?   r@   )rF   rG   r	   rH   r   rA   figaxesmetrics
metric_keymetric_nameaxr   contrastivepwrB   s                   rC   plot_all_metrics_funcrk   E   st    %3/
;<q@ABFQ84ICLL02&LQ 
Zd,	k4:.	8T$Z(	z4:&	G (/#
K#J/)*5
%zQSTU
U-1YZ[&2zE`7`,Z8B2w#h-'E1MYZghi
)B7
kB/
[2&A
		1	
C 
QF
QH&' x=1KK8B<,Hx|/L"1&VVW  YKK;r?3/3{3C[QS_2U"1(vXY  [/ (/4 sCH%KX7C0>?
IIKrE   baseline_pathcontrastive_pathplot_all_metricspreference_weighted_pathc                 f   t        | d      5 }t        j                  |      }ddd       t        |d      5 }t        j                  |      }ddd       t        t              r	d|i}	di}
n|}	}
d}|r_t
        j                  j                  |      r@t        |d      5 }t        j                  |      }ddd       t        t              r|nd|i}|rd|	v rddl	m
}  ||	|
|||       y|r|d   nd}t        |	d   |
d   |||       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   qxY w)	a  Load results from JSON files and plot.
    
    Args:
        baseline_path: Path to baseline metrics JSON file
        contrastive_path: Path to contrastive metrics JSON file
        output_path: Path to save plot (optional)
        plot_all_metrics: If True, plot all metrics in subplots; if False, plot only accuracy
        preference_weighted_path: Optional path to preference-weighted metrics JSON (2025-style third method)
    rNrJ   rM   r   )rk   )rH   r   )r	   r   r   )openjsonload
isinstancer/   ospathisfiledictexperiment.plotterrk   rD   )rl   rm   r	   rn   ro   r   fbaseline_datacontrastive_datarF   rG   
pw_metricspw_datark   pw_accs                  rC   plot_from_jsonr      s0   " 
mS	!Q		! 
" 
	$99Q< 
% -&&6)+;<(.JBGGNN3K$L*C0AiilG 1 *7D 9W
G?T
K+;;<(2	
 ,6J'4Z(
+# &	
? 
"	! 
%	$ 10s"   DD!D'DD$'D0__main__zPlot learning curves)descriptionz
--baselinezresults/metrics_baseline.jsonzPath to baseline metrics JSON)typedefaulthelpz--contrastivez results/metrics_contrastive.jsonz Path to contrastive metrics JSONz--preference-weightedz@Path to preference-weighted metrics JSON (optional third method)z--outputzresults/learning_curve.tiffzOutput path for plotz--dpiz5Output resolution in DPI (must be >300; default: 600)z--accuracy-only
store_truezHOnly plot accuracy (single figure); default when not using --all-metrics)actionr   z--all-metricszBPlot all metrics (accuracy, precision, recall, F1) in 2x2 subplotsz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)levelformat)rn   ro   r   )NzLearning Curve ComparisonrS   rL   Nr   )NNr   )NFNr   )%__doc__matplotlib.pyplotpyplotr2   rs   rv   typingr   r   r   logging	getLogger__name__r=   floatstrr;   rD   rk   boolr   argparseArgumentParserparseradd_argument
parse_argsargsbasicConfigINFOall_metricsaccuracy_onlyplot_allr   ri   outputr   r    rE   rC   <module>r      s   0   	 ' ' 			8	$ "&,%1565k6
u+6 #6 	6
 6 6 "$u+.6 
6x "&DH>3U+,>c4;./> #> "*$sDK/?*@!A	>
 
>H "&".26
6
6
 #6
 	6

 'sm6
 
6
r z$X$$1GHF
38W;  =
c;]>  @
/c4^  `

6S2  4
c3S  U
),f  h
`  b DGllE :(:(:$:Ht''!!%!9!9HH	9 rE   