o
    j(                     @  sf  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ZdZdZdZdZdddddddZdhZdddddd d!d"d#d$d%
Zd&d'd&d(d'd&d&d&d'd'd%
Z dPd,d-Z!dPd.d/Z"dQd1d2Z#dRd4d5Z$dSd9d:Z%dTd>d?Z&dUdBdCZ'dVdFdGZ(dWdKdLZ)dRdMdNZ*e+dOkre*  dS dS )Xz-Plot the Qwen3-14B LongBench appendix figure.    )annotationsN)PathZMPLCONFIGDIRz/tmp/matplotlib-kv-llm)font_managerzQ/home/scm/Project/kv-llm/evaluation/results/figures/longbench_qwen3_14b_data.json   ZpicsZ qwen3_14b_longbench_appendix_2x5z0.00snapkv)z
Full Cache#9a9a9a-)z0.50z0.75z0.80z0.85z0.88)              ?      ?皙?g333333?g)\(?)r	   g?RQ?gp=
ף?g(\?g=
ףp=?)z.88z.85z.80z.75z.500)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_mildZ	fastkvzipZkvzipZexpected_attentionr   r   Z2WikiMQAZ	GovReportZHotpotQAZLCCZ	MultiNewsZMultiFieldQAZMuSiQueZQasperZQMSumZSAMSum)
Zlongbench_2wikimqaZlongbench_gov_reportZlongbench_hotpotqaZlongbench_lccZlongbench_multi_newsZlongbench_multifieldqa_enZlongbench_musiqueZlongbench_qasperZlongbench_qmsumZlongbench_samsumzF1 (%)zROUGE-L (%)zSimilarity (%)ratiofloatreturnc                 C  s   | t d kr
td S | t d krtd S tt dd t dd tdd tdd D ]$\}}}}||   kr;|krOn q+| | ||  }||||     S q+td|  )zCMap true compression ratios to the display scale used in the paper.r   Nr   z'Ratio outside supported display scale: )X_TICKSX_TICK_POSITIONSzip
ValueError)r   Z
left_ratioZright_ratioZleft_posZ	right_posalpha r!   2paper/scripts/plot_qwen3_14b_longbench_appendix.pyscaled_compression_ratioG   s   (r#   c                 C  s   t d t|  S )zADisplay high compression on the left and full cache on the right.r   )r   r#   r   r!   r!   r"   axis_positionV   s   r%   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 r!   name).0Zfontr!   r!   r"   	<setcomp>e   s    z"pick_serif_font.<locals>.<setcomp>zDejaVu Serif)r   homeexistsr   ZfontManagerZaddfontr&   Zttflist)Z
candidatespathZ	availabler!   r!   r"   pick_serif_font[   s   

r.   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.labelsizezxtick.labelsize   zytick.labelsizezlegend.fontsize	   z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)r.   pltZrcParamsupdate)Z
serif_fontr!   r!   r"   configure_stylek   sR   	
r9   valueslist[float]tuple[float, float]c           	      C  s   dd | D }t |}t|}t|| d}|dkrd}n|dkr$d}n|dkr+d}n	|d	kr2d
}nd}t|d |d }tdt|| | | }t dt|| | | }||krdt d|| }||fS )Nc                 S  s   g | ]	}t |r|qS r!   )mathisfinite)r)   valuer!   r!   r"   
<listcomp>   s    zy_limits.<locals>.<listcomp>r      r
   r0      g       @2   g      @g      $@g{Gz?g{Gz?r	   g      Y@)minmaxr=   ZfloorZceil)	r:   ZfinitelohispansteppadZy0Zy1r!   r!   r"   y_limits   s&   rK   r-   r   dictc                 C  sZ   | j ddd}t|}W d    n1 sw   Y  d|vs$|d s+td|  |S )Nrzutf-8)encodingdatasetszNo datasets found in )openjsonloadr   )r-   fdatar!   r!   r"   	load_data   s   rU   datasetmethodc                 C  s4   |  di  |i  |tj}|d urt|S tjS )NZscores)getr=   nanr   )rV   rW   r   Z	raw_scorer!   r!   r"   score_at   s   rZ   rT   
list[dict]c                   s   dd | d D }g }| d D ]8  d }|dkrqt  tt}g }|D ] fddtttdd	D }||d
 q$||||d q|S )Nc                 S  s    g | ]}|d  t v r|d  qS r'   )METHOD_STYLES)r)   rW   r!   r!   r"   r@      s     z build_panels.<locals>.<listcomp>methodsrO   r(   Zlongbench_trecc                   s0   g | ]}t t |r|t |d qS ))r   score)r=   r>   rZ   )r)   r   rV   rW   r!   r"   r@      s    T)keyreverse)rW   points)r(   
full_cacheseries)rZ   FULL_CACHE_METHODFULL_CACHE_RATIOsortedCOMPRESSION_RATIOSr   append)rT   r]   panelsr(   rc   rd   rb   r!   r_   r"   build_panels   s   rk   	data_path
output_diroutput_stemc                 C  s  t   |jddd t| }t|}t|dkr!tdt| tjdddd\}}g }g }tt	|j
|D ]\}	\}
}g }t|d	 ro||d	  t\}}}|
j|d	 ||d
d|dd}|	dkro|| || |d D ]h}|d }t| \}}}}}dd |d D }dd |d D }t|d	 r|ttt ||d	  || |
j|||||ddd|tv r|dkrdn||||dd\}|	dkr|| || qs|d }|
jt||ddd |
dtd d  |
d d ttD  |
t  |
!d! |
j"t#|d"d#d$d% |
j$t%|  |
j&dd&d'd(d)d* |
'd |
j() D ]}|*d) q3q7|j+d+d,d-d)d.d/d0 |j,||d1d2d3dd4d5d6d
d7d8 || d9 }|| d: }|j-|d;dd< |j-|d;dd< t.| t/d=|  t/d=|  d S )>NT)parentsexist_okr1   z9Expected 10 LongBench panels after excluding TREC, found    r5   )g      %@gffffff@)ZnrowsZncolsZfigsizerc   r   r   r   )color	linestyle	linewidthr    labelzorderrd   rW   c                 S  s   g | ]
}t t|d  qS r$   )r%   r   r)   Zpointr!   r!   r"   r@      s    zplot.<locals>.<listcomp>rb   c                 S  s   g | ]}|d  qS )r^   r!   rw   r!   r!   r"   r@          g      ?g      @g?r   Zwhite)rr   markerrs   rt   Z
markersizeZmarkeredgewidthZmarkerfacecolorZmarkeredgecolorr    ru   rv   r(   Zbold)rJ   Z
fontweightgQr   gQ?c                 S  s   g | ]}t |qS r!   )r%   )r)   Ztickr!   r!   r"   r@      rx   zCompression ratioz	Score (%)r3   g      ?)ZfontsizeZlabelpadmajor)r   )r      r   r   )whichrs   rr   rt   g{Gz?gףp=
?g
ףp=
?r
   r   )leftrightZbottomtopZhspaceZwspacezupper center)g?gX9v?r{   FZblackg @gffffff?)	locZbbox_to_anchorZncolZframeonZfancyboxZ	edgecolorZhandlelengthZcolumnspacingZhandletextpadz.pngz.pdfZtight)Zbbox_inchesZ
pad_incheszWrote )0r9   mkdirrU   rk   lenr   r7   Zsubplots	enumerater   Zflatr=   r>   ri   FULL_CACHE_STYLEZaxhliner\   r%   r   rf   extendplotHOLLOW_MARKERSZ	set_title	TITLE_MAPrX   Zset_xlimr   Z
set_xticksreversedr   Zset_xticklabelsX_TICK_LABELS_DESCZ
set_xlabelZ
set_ylabelMETRIC_LABELSZset_ylimrK   ZgridZset_axisbelowZspinesr:   Zset_linewidthZsubplots_adjustZlegendZsavefigcloseprint)rl   rm   rn   rT   rj   ZfigZaxesZlegend_handlesZlegend_labelsZ	panel_idxZaxZpanelr:   Z
full_labelZ
full_colorZfull_linestyleZ	full_linerd   rW   ru   rr   ry   rs   r    Zx_valuesZy_valuesliner(   ZspineZpng_pathZpdf_pathr!   r!   r"   r      s   
	








r   c                  C  s^   t jtd} | jdttdd | jdttdd | jdtdd	 |  }t	|j
|j|j d S )
N)descriptionz--datazPath to the exported data JSON.)typedefaulthelpz--output-dirzDirectory for figure outputs.z--output-stemz'Output filename stem without extension.)r   r   )argparseArgumentParser__doc__add_argumentr   	DATA_PATH
OUTPUT_DIROUTPUT_STEM
parse_argsr   rT   rm   rn   )parserargsr!   r!   r"   main#  s   r   __main__)r   r   r   r   )r   r&   )r   r/   )r:   r;   r   r<   )r-   r   r   rL   )rV   rL   rW   r&   r   r&   r   r   )rT   rL   r   r[   )rl   r   rm   r   rn   r&   r   r/   ),r   Z
__future__r   r   rQ   r=   osZpathlibr   environ
setdefaultZmatplotlib.pyplotZpyplotr7   Z
matplotlibr   r   __file__Zresolvero   r   r   rf   re   r   rh   r   r   r   r\   r   r   r   r#   r%   r.   r9   rK   rU   rZ   rk   r   r   __name__r!   r!   r!   r"   <module>   s   









a

