
    -ji83                         S SK Jr  S SKrS SKJr  S SKJs  Jr	  S SK
Jr  S SKJr  S SKJr  SSKJr  SSKJr  SS	KJr   " S
 S5      rg)    )PathN)track)Table)Tensor   )Settings)Model)printc                   :    \ rS rSrS\S\S\S\4S jrS rS r	S	r
g
)Analyzer   settingsmodelgood_residualsbad_residualsc                 4    Xl         X l        X0l        X@l        g )N)r   r   r   r   )selfr   r   r   r   s        J/home/james-whalen/.local/lib/python3.13/site-packages/heretic/analyzer.py__init__Analyzer.__init__   s     !
,*    c                 n    SSK Jn  SSKJn  [        5         [        S5        [        5       nUR                  SSS9  UR                  S	SS9  UR                  S
SS9  UR                  SSS9  UR                  SSS9  UR                  SSS9  UR                  SSS9  UR                  SSS9  UR                  SSS9  UR                  SSS9  UR                  SSS9  UR                  SSS9  UR                  SSS9  UR                  SSS9  U R                  R                  SS9n[        R                  " [        [        U R                  R                  5       5      S-   5       Vs/ s HE  nU" U R                  S S 2US S 24   R!                  5       R#                  5       5      R$                  PMG     sn5      nU R&                  R                  SS9n[        R                  " [        [        U R                  R                  5       5      S-   5       Vs/ s HE  nU" U R&                  S S 2US S 24   R!                  5       R#                  5       5      R$                  PMG     sn5      nXt-
  n	X-
  n
[(        R*                  " XGSS9n[(        R*                  " XhSS9n[(        R*                  " XISS9n[(        R*                  " XjSS9n[(        R*                  " XySS9n[(        R*                  " XSS9n[,        R.                  " USS9n[,        R.                  " USS9n[,        R.                  " USS9n[,        R.                  " USS9n[,        R.                  " U	SS9n[,        R.                  " U
SS9n[        R0                  " U R                  U R&                  /SS9R!                  5       R#                  5       R3                  5       nS/[        U R                  5      -  S/[        U R&                  5      -  -   n[        [        U R                  R                  5       5      S-   5       Vs/ s H  nU" US S 2US S 24   U5      PM     nn[        S[        U R                  R                  5       5      S-   5       GH  nUR5                  U X   R7                  5       S X   R7                  5       S X   R7                  5       S X   R7                  5       S X   R7                  5       S UU   R7                  5       S UU   R7                  5       S UU   R7                  5       S UU   R7                  5       S UU   R7                  5       S UU   R7                  5       S UU   R7                  5       S UU   S 5        GM
     [        5         [        S5        [        U5        [        S5        [        S5        [        S5        [        S5        [        S 5        [        S!5        [        S"5        [        S#5        [        S$5        g ! [         a    [        5         [        S5         g f = fs  snf s  snf s  snf )%Nr   compute_geometric_median)silhouette_scorez[red]Research dependencies not found. Printing residual geometry requires installing Heretic with the optional research feature, i.e., using "pip install -U heretic-llm\[research]".[/]zComputing residual geometry...Layerright)justifyzS(g,b)zS(g*,b*)zS(g,r)zS(g*,r*)zS(b,r)zS(b*,r*)z|g|z|g*|z|b|z|b*|z|r|z|r*|Silh)dimr   z.4fz.2fz[bold]Residual Geometry[/]z6[bold]g[/] = mean of residual vectors for good promptszC[bold]g*[/] = geometric median of residual vectors for good promptsz5[bold]b[/] = mean of residual vectors for bad promptszB[bold]b*[/] = geometric median of residual vectors for bad promptsz?[bold]r[/] = refusal direction for means (i.e., [bold]b - g[/])zN[bold]r*[/] = refusal direction for geometric medians (i.e., [bold]b* - g*[/])z@[bold]S(x,y)[/] = cosine similarity of [bold]x[/] and [bold]y[/]z$[bold]|x|[/] = L2 norm of [bold]x[/]zN[bold]Silh[/] = Mean silhouette coefficient of residuals for good/bad clusters)geom_median.torchr   sklearn.metricsr   ImportErrorr
   r   
add_columnr   meantorchstackrangelenr   
get_layersdetachcpumedianr   Fcosine_similarityLAvector_normcatnumpyadd_rowitem)r   r   r   tableglayer_indexg_starbb_starrr_starg_b_similaritiesg_star_b_star_similaritiesg_r_similaritiesg_star_r_star_similaritiesb_r_similaritiesb_star_r_star_similaritiesg_normsg_star_normsb_normsb_star_normsr_normsr_star_norms	residualslabelssilhouettess                             r   print_residual_geometry Analyzer.print_residual_geometry   s    	B8 	./'273W573W573W50101011$$$+
 $)TZZ-B-B-D)E)I#J	 $KK )'';(9:AACGGI& $K	
 ###*
 $)TZZ-B-B-D)E)I#J	 $KK )&&q+q'89@@BFFH& $K	
 E..q<%&%8%8R%P"..q<%&%8%8R%P"..q<%&%8%8R%P"..+~~f"5..+~~f"5..+~~f"5 II''&&  VXSUUW 	 s4..//1#D<N<N8O2OO  %S)>)>)@%AA%EF
F Yq+q'896BF 	 

 !C

(=(=(?$@1$DEKMM-#0557<-:??A#F#0557<-:??A#F#0557<-k:??A#F;',,.s3,113C8;',,.s3,113C8;',,.s3,113C8{+C0 F$ 	*+eFGSTEFRSOP\	
 	PQ45\	
e  		GI 		@J
s%   X 'AX(AX-$X2X%$X%c           	         ^ ^$  SS K Jn  SS KJm$  SS KnSSKJn  SSKJn  SSK	J
n  SnSnSn[        5         [        S	5        / n	S n
[        [        S
[        T R                   R#                  5       5      S
-   5      SS9 GHo  nT R$                  S S 2US S 24   R'                  5       R)                  5       R	                  5       nT R*                  S S 2US S 24   R'                  5       R)                  5       R	                  5       nUR-                  X45      nU" SSS9nUR/                  XS9nUn
UR0                  S   nUS U nUUS  nU" U5      R2                  nU" U5      R2                  nUU-
  nUR5                  US
   US   5      * nUR7                  U5      nUR9                  U5      nUR;                  UU* /UU//5      nUUR<                  -  nUS U nUUS  nU	R?                  UU45        GMr     T$R@                  RC                  T RD                  RF                  5        S[H        S[J        SUSU4U$U 4S jjn[I        T RD                  RL                  5      T RD                  R                   RO                  SS5      RO                  SS5      -  nURQ                  SSS9  / n/ n[S        [        U	SS9S
5       H  u  nu  nnUSUS S3-  nU" UUUU5        UR?                  URU                  U5      5        UR?                  U5        U[        U	5      :  d  M`  [        S
U5       H  n USUS SU S S3-  nU U-  n!UU!X   S   U-
  -  -   n"UU!X   S
   U-
  -  -   n#U" UUU"U#5        UR?                  URU                  U5      5        UR?                  U5        URW                  5         M     M     [        S 5        URY                  US!-  UUSS"9  [        S#UR[                  5        S$35        g ! [         a    [        5         [        S5         g f = f)%Nr   r   )NDArray)PaCMAPz[red]Research dependencies not found. Plotting residuals requires installing Heretic with the optional research feature, i.e., using "pip install -U heretic-llm\[research]".[/]i     2   zPlotting residual vectors...r   z!* Computing PaCMAP projections...)description      )n_componentsn_neighbors)init
image_pathr9   good_residuals_2dbad_residuals_2dc           	      l  > TR                  SS9u  pEUR                  US S 2S4   US S 2S4   STR                  R                  R                  STR                  R                  R
                  S9  UR                  US S 2S4   US S 2S4   STR                  R                  R                  STR                  R                  R
                  S9  UR                  TR                  R                  SS	9  UR                  S
S9  UR                  S5        UR                  / 5        UR                  / 5        UR                  SSTR                  R                  SSSS9  UR                  SSSUS 3SSSS9  UR                  5         UR!                  SS9  UR#                  U SS9  TR%                  U5        g )N)      )figsizer   r   
   g      ?)scalphalabel   )padzupper right)locFg;On?g{Gz?leftbottom   )havafontsizegCl?zLayer 03r   g{Gz?)rk   d   )dpi)subplotsscatterr   good_promptsresidual_plot_colorresidual_plot_labelbad_prompts	set_titleresidual_plot_titlelegendgrid
set_xticks
set_ytickstextr   tight_layoutsubplots_adjustsavefigclose)r[   r9   r\   r]   figaxpltr   s         r   plot%Analyzer.plot_residuals.<locals>.plot   s    ll6l2GCJJ!!Q$'!!Q$'--,,@@mm00DD   JJ A& A&--++??mm//CC   LL::LCII-I(GGENMM"MM"HH##   HHR()   t,KK
K,IIcNr   /_\T)parentsexist_okz* Generating plots...layer_rp   z.png_frame_z* Generating animation...zanimation.gif)durationloopz* Plots saved to [bold]z[/].).
imageio.v3v3matplotlib.pyplotpyplotr4   geom_median.numpyr   numpy.typingrQ   pacmaprR   r$   r
   r   r)   r*   r   r+   r   r,   r-   r   vstackfit_transformshaper.   arctan2cossinarrayTappendstyleuser   residual_plot_styler   intresidual_plot_pathreplacemkdir	enumerateimreadunlinkimwriteresolve)%r   iionpr   rQ   rR   LAYER_FRAME_DURATIONN_TRANSITION_FRAMESTRANSITION_FRAME_DURATIONlayer_residuals_2dpacmap_initr9   r   r   rK   	embeddingresiduals_2dn_good_residualsr\   r]   good_anchor
bad_anchor	directionanglecosinesinerotation_matrixr   	base_pathimages	durationsr[   frame_indexprogressgood_residuals_2d_interpolatedbad_residuals_2d_interpolatedr   s%   `                                   @r   plot_residualsAnalyzer.plot_residuals   s   	$+B,%  $ $&!,- !S..01A56;
K
 ##A{A$56==?CCEKKM  !..q+q/@AHHJNNPVVXM		>"ABIA2>I$2292OL&K-33A6 ,->.> ?+,<,=> 33DELLK12BCJJJ #[0IZZ	!il;;EVVE]F66%=D hh$$'HIO'/*;*;;L ,->.> ?+,<,=>%%'8:J&KLM
P 			dmm7784	4	4	  '4	 &	4	 4	l MM,,
MM''
 '

	 	t4	
 "3 

K 
 #vk"-=T%BBJ[*;=MNMM#**Z0112S!344
 $),?#@K!f[,<GKPRCSSW$XX   +-@@H5F*7:=NNJ 62 5Ex*7:=MMH 51 "#65	 MM#**Z"89$$%>?
 %%'7 $A'
` 	)*'	 	 	
 	'	(9(9(;'<DABA  		GI 		s   "O+ +PP)r   r   r   r   N)__name__
__module____qualname____firstlineno__r   r	   r   r   rN   r   __static_attributes__ r   r   r   r      s;    
+
+ 
+ 	
+
 
+x
tHCr   r   )pathlibr   r'   torch.linalglinalgr1   torch.nn.functionalnn
functionalr/   rich.progressr   
rich.tabler   r   configr   r   r	   utilsr
   r   r   r   r   <module>r      s6              OC OCr   