o
    j2                     @  s  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 ej	
dd ddlmZ ddlmZ edZee jd	 d
 ZdZdZdZdhZded dddddded ddddddded dd ddddd!ed" dd ddddfZd#d$d%d&d'd(d)Zd*hZdhd-d.Zdid0d1Zdjd5d6Zdkd8d9Zdld=d>Z dld?d@Z!dmdCdDZ"dndGdHZ#dodKdLZ$dpdNdOZ%dqdRdSZ&dpdTdUZ'drdVdWZ(dsdYdZZ)dtd_d`Z*dudcddZ+didedfZ,e-dgkre,  dS dS )vz7Plot LongBench average curves for four model backbones.    )annotationsN)PathZMPLCONFIGDIRz/tmp/matplotlib-kv-llm)font_managerz3/home/scm/Project/kv-llm/evaluation/results/figures   ZpicsZ&longbench_average_model_comparison_1x4z0.00)z
Full Cache#9a9a9a-Zlongbench_treczQwen3-8Bz$longbench_average_qwen3_8b_data.json)0.500.750.800.850.88z0.90z0.95)              ?      ?皙?333333?)\(??ffffff?)r   g(\?g{Gz?g?gQ?gQ?gp=
ף?r   )z.95z.90.88.85.80.75.500)labelpathratiosx_ticksx_positionsx_labels_desczQwen2.5-7B-Instruct-1Mz)longbench_qwen25_7b_instruct_1m_data.json)r   r	   r
   r   r   	fastkvzip)r   r   r   r   r   r   )r   g?gRQ?gp=
ף?g(\?g=
ףp=?)r   r   r   r   r   r   )r   r   r   full_cache_methodr   r   r    z	Qwen3-14Bzlongbench_qwen3_14b_data.jsonsnapkvzLlama-3.1-8B-Instructz'longbench_llama31_8b_instruct_data.json)zHubKV(+ FastKVZip)#e41a1cor         ?)zHubKV(+ KVZip)#006400xr   r&   )Z	FastKVZipr$   r%   --(\?)ZKVZipr'   r(   r)   r*   )zExpected Attentionz#4f60ff+r   r   )ZSnapKVz#E69F00^r   r   )z%fastkvzip_head_nms_gated_k5_p0.5_mildz!kvzip_head_nms_gated_k5_p0.5_mildr!   ZkvzipZexpected_attentionr#   r%   returnstrc                  C  sh   t dt  d t  d f} | D ]}| r"tjt|  dS qdd tjjD }d|v r2dS dS )Nz"insights/fonts/Times New Roman.ttfz&.local/share/fonts/Times New Roman.ttfz$.local/share/fonts/TimesNewRoman.ttfzTimes New Romanc                 S  s   h | ]}|j qS  name).0Zfontr/   r/   8paper/scripts/plot_longbench_average_model_comparison.py	<setcomp>U   s    z"pick_serif_font.<locals>.<setcomp>zDejaVu Serif)r   homeexistsr   ZfontManagerZaddfontr.   Zttflist)
candidatesr   Z	availabler/   r/   r3   pick_serif_fontK   s   

r8   Nonec                  C  s   t  } tji d| d| gddddddd	dd
dddddddddddddddddddddddd d S )Nzfont.familyz
font.serifz	font.size   zaxes.titlesize
   zaxes.labelsize	   zxtick.labelsizezytick.labelsizezlegend.fontsizezaxes.linewidthr   zxtick.directioninzytick.directionzxtick.major.size   zytick.major.sizezxtick.major.widthzytick.major.widthz
figure.dpii,  zsavefig.dpi*   )zpdf.fonttypezps.fonttype)r8   pltZrcParamsupdate)Z
serif_fontr/   r/   r3   configure_style[   sR   	
rB   valueslist[float]floatc                 C  s*   dd | D }|st dt|t| S )Nc                 S     g | ]	}t |r|qS r/   mathZisfiniter2   valuer/   r/   r3   
<listcomp>w       zmean.<locals>.<listcomp>zCannot average an empty list)
ValueErrorsumlen)rC   finiter/   r/   r3   meanv   s   rQ   tuple[float, float]c           	      C  s   dd | D }t |}t|}t|| d}|dkrdnd}t|d |d }td	t|| | | }t d
t|| | | }||krNt d
|| }||fS )Nc                 S  rF   r/   rG   rI   r/   r/   r3   rK   ~   rL   zy_limits.<locals>.<listcomp>r&   r:   g       @g      @g{Gz?g?r   g      Y@)minmaxrH   ZfloorZceil)	rC   rP   lohispansteppadZy0Zy1r/   r/   r3   y_limits}   s   rZ   ratioconfigdictc           	      C  s   |d }|d }| |d kr|d S | |d kr|d S t |d d |dd  |d d |dd  D ]$\}}}}||   krC|krWn q3| | ||  }||||     S q3td|  )Nr   r   r   r   z'Ratio outside supported display scale: )ziprM   )	r[   r\   ZticksZ	positionsZ
left_ratioZright_ratioZleft_posZ	right_posalphar/   r/   r3   scaled_compression_ratio   s   (ra   c                 C  s   |d d t | | S )zADisplay high compression on the left and full cache on the right.r   r^   )ra   )r[   r\   r/   r/   r3   axis_position   s   rb   r   r   c                 C  s<   | j ddd}t|W  d    S 1 sw   Y  d S )Nrzutf-8)encoding)openjsonload)r   fr/   r/   r3   	load_json   s   $ri   per_datasetdict[str, float]c                 C  s   dd |   D }t|S )Nc                 S  s    g | ]\}}|t vrt|qS r/   )EXCLUDE_DATASETSrE   )r2   r1   rJ   r/   r/   r3   rK           z,average_from_per_dataset.<locals>.<listcomp>)itemsrQ   )rj   rC   r/   r/   r3   average_from_per_dataset   s   ro   datasetmethodc                 C  s4   |  di  |i  |tj}|d urt|S tjS )Nscores)getrH   nanrE   )rp   rq   r[   Z	raw_scorer/   r/   r3   score_at   s   ru   datac                 C  s   t t|d d d}g }dd |d D }t D ]C\}}||vr#qdd || d D }g }t| d	 td
dD ]}	||	}
|
d u rEq9||	t|
d d q9|r]||||d q| d ||dS )N
full_cacherj   r[   scorec                 S     i | ]}|d  |qS rq   r/   )r2   itemr/   r/   r3   
<dictcomp>       z+build_from_average_json.<locals>.<dictcomp>seriesc                 S  rz   r[   r/   r2   pointr/   r/   r3   r}      r~   pointsr   Tkeyreverserq   styler   r   r   rw   r   )FULL_CACHE_RATIOro   METHOD_STYLESrn   sortedrE   rs   append)r\   rv   rw   r   Z	by_methodrq   r   Zpoints_by_ratior   r[   r   r/   r/   r3   build_from_average_json   s&   
r   datasets
list[dict]c                   s^   |  dddg}|D ]  sq
 fdd|D }tdd |D r%   S q
td| d	  )
Nr"   r!   r#   c                      g | ]}t | tqS r/   ru   r   r2   rp   r{   r/   r3   rK          z,select_full_cache_method.<locals>.<listcomp>c                 s      | ]}t |V  qd S NrG   r2   ry   r/   r/   r3   	<genexpr>       z+select_full_cache_method.<locals>.<genexpr>z%No complete full-cache row found for r   )rs   allrM   )r\   r   r7   rr   r/   r{   r3   select_full_cache_method   s   r   c                   s   dd |d D }t | | tt fdd|D d}dd |d D }g }|D ]:g }t| d td	d
D ]fdd|D }tdd |D rU|t|d q6|rc|t |d q)| d ||dS )Nc                 S  s   g | ]
}|d  t vr|qS r0   )rl   r   r/   r/   r3   rK      s    z+build_from_dataset_json.<locals>.<listcomp>r   c                   r   r/   r   r   )r"   r/   r3   rK      r   rx   c                 S  s    g | ]}|d  t v r|d  qS r0   )r   )r2   rq   r/   r/   r3   rK      rm   methodsr   Tr   c                   s   g | ]}t | qS r/   )ru   r   )rq   r[   r/   r3   rK      r   c                 s  r   r   rG   r   r/   r/   r3   r      r   z*build_from_dataset_json.<locals>.<genexpr>r   r   r   )r   r   rQ   r   rE   r   r   r   )r\   rv   r   rw   Zavailable_methodsr   r   rr   r/   )r"   rq   r[   r3   build_from_dataset_json   s$   
r   c                 C  s>   t | d }|dg }|rt|d trt| |S t| |S )Nr   r   r   )ri   rs   
isinstancer.   r   r   )r\   rv   r   r/   r/   r3   build_panel   s
   

r   panelsc                 C  sJ   g }| D ]}| |d d  |d D ]}|dd |d D  qq|S )Nrw   ry   r   c                 s  s    | ]}|d  V  qdS )ry   Nr/   r   r/   r/   r3   r      s    z!collect_values.<locals>.<genexpr>r   )r   extend)r   rC   panelr   r/   r/   r3   collect_values   s   r   r   collect_legendbooltuple[list, list]c                   s  g }g }t \}}}|d }	| j|	d ||dd|dd}
|r'||
 || |d D ]Y}|d \}}}}} fd	d
|d D }dd
 |d D }|ttt  ||	d  | j|||||ddd|tv ro|dkrodn||||dd\}|r|| || q+| j|d ddd | 	d d d d  | 
 fdd
t d D  |  d  | d | jd d!d"d#d$d% | d  | j D ]}|d& q||fS )'Nrw   ry   r&   r   r   )color	linestyle	linewidthr`   r   zorderr   r   c                   s   g | ]}t t|d   qS r   )rb   rE   r   r\   r/   r3   rK   
  s    zplot_panel.<locals>.<listcomp>r   c                 S  s   g | ]}|d  qS )ry   r/   r   r/   r/   r3   rK         g?g333333@r   r)   Zwhite   )r   markerr   r   Z
markersizeZmarkeredgewidthZmarkerfacecolorZmarkeredgecolorr`   r   r   r      Zbold)rY   Z
fontweightgQr   r^   Q?c                   s   g | ]}t | qS r/   )rb   )r2   Ztickr   r/   r3   rK   #  r~   r   r    zCompression ratioTmajor)r   )r   r   r   r   )whichr   r   r   r   )FULL_CACHE_STYLEZaxhliner   rb   rE   r   plotHOLLOW_MARKERSZ	set_titleZset_xlimZ
set_xticksreversedZset_xticklabelsZ
set_xlabelZgridZset_axisbelowZspinesrC   Zset_linewidth)axr   r\   r   handleslabelsZ
full_labelZ
full_colorZfull_linestylerw   Z	full_liner   r   r   r   r   r`   Zx_valuesZy_valueslineZspiner/   r   r3   
plot_panel   sf   
	



 

r   
output_diroutput_stemc                 C  sF  t   | jddd dd tD }tt|}tjddddd\}}g }g }tt||tD ]'\}\}	}
}t	|	|
||d	kd
\}}|	j
|  |d	krU|}|}|	jddd q.|jdddddd |j||dddddddddd | | d }| | d }|j|ddd  |j|ddd  t| td!|  td!|  d S )"NT)parentsexist_okc                 S  s   g | ]}t |qS r/   )r   )r2   r\   r/   r/   r3   rK   1  r   zplot.<locals>.<listcomp>r      )g      (@g      @)ZfigsizeZshareyr   )r   zLongBench average score (%)r   )ZlabelpadgQ?gףp=
?g=
ףp=?gQ?g{Gz?)leftrightZbottomtopZwspacezupper center)gHzG?gQ?FZblackg @r   gffffff?)	locZbbox_to_anchorZncolZframeonZfancyboxZ	edgecolorZhandlelengthZcolumnspacingZhandletextpadz.pngz.pdfZtightr   )Zbbox_inchesZ
pad_incheszWrote )rB   mkdirMODEL_CONFIGSrZ   r   r@   Zsubplots	enumerater_   r   Zset_ylimZ
set_ylabelZsubplots_adjustZlegendZsavefigcloseprint)r   r   r   Zy_rangeZfigZaxesZlegend_handlesZlegend_labelsidxr   r   r\   r   r   Zpng_pathZpdf_pathr/   r/   r3   r   -  sH   

r   c                  C  sH   t jtd} | jdttdd | jdtdd |  }t|j	|j
 d S )N)descriptionz--output-dirzDirectory for figure outputs.)typedefaulthelpz--output-stemz'Output filename stem without extension.)r   r   )argparseArgumentParser__doc__add_argumentr   
OUTPUT_DIROUTPUT_STEM
parse_argsr   r   r   )parserargsr/   r/   r3   mainX  s
   r   __main__)r-   r.   )r-   r9   )rC   rD   r-   rE   )rC   rD   r-   rR   )r[   rE   r\   r]   r-   rE   )r   r   r-   r]   )rj   rk   r-   rE   )rp   r]   rq   r.   r[   r.   r-   rE   )r\   r]   rv   r]   r-   r]   )r\   r]   r   r   r-   r.   )r\   r]   r-   r]   )r   r   r-   rD   )r   r]   r\   r]   r   r   r-   r   )r   r   r   r.   r-   r9   ).r   Z
__future__r   r   rf   rH   osZpathlibr   environ
setdefaultZmatplotlib.pyplotZpyplotr@   Z
matplotlibr   ZDATA_DIR__file__Zresolver   r   r   r   r   rl   r   r   r   r8   rB   rQ   rZ   ra   rb   ri   ro   ru   r   r   r   r   r   r   r   r   __name__r/   r/   r/   r3   <module>   s   	

'














	
7
+
