@@ -51,6 +51,49 @@ def seed_everything(seed):
5151 random .seed (seed )
5252
5353seed_everything (42 )
54+
55+
56+ def finalize_locality_metrics (metric , request , hparams , model_name ):
57+ if not request .get ("locality" ):
58+ return
59+
60+ pre_locality = metric ["pre" ]["locality" ]
61+ post_locality = metric ["post" ]["locality" ]
62+ evaluation_type = getattr (hparams , "evaluation_type" , None )
63+ uses_generated_text = evaluation_type in ["LLM-judge" , "generate-text" ]
64+
65+ for locality_key in request ["locality" ]:
66+ if uses_generated_text :
67+ output_key = f"{ locality_key } _gen_content"
68+ else :
69+ output_key = f"{ locality_key } _output"
70+
71+ pre_outputs = pre_locality [output_key ]
72+ post_outputs = post_locality [output_key ]
73+ if len (pre_outputs ) != len (post_outputs ):
74+ raise ValueError (
75+ f"Locality output count mismatch for `{ locality_key } `: "
76+ f"{ len (pre_outputs )} pre-edit outputs and "
77+ f"{ len (post_outputs )} post-edit outputs."
78+ )
79+
80+ if uses_generated_text :
81+ locality_result = [
82+ float (pre_output == post_output )
83+ for pre_output , post_output in zip (pre_outputs , post_outputs )
84+ ]
85+ else :
86+ locality_result = [
87+ float (np .mean (np .equal (pre_output , post_output )))
88+ for pre_output , post_output in zip (pre_outputs , post_outputs )
89+ ]
90+
91+ post_locality [f"{ locality_key } _acc" ] = locality_result
92+ attach_metric_meta (
93+ metric ["post" ],
94+ f"locality.{ locality_key } " ,
95+ build_locality_metric_meta (locality_key , hparams , model_name ),
96+ )
5497
5598class BaseEditor :
5699 """Base editor for all methods"""
@@ -252,22 +295,12 @@ def batch_edit(self,
252295 restore_after_edit (self , edited_model , weights_copy )
253296
254297 for i , request in enumerate (record_chunks ):
255- if 'locality' in chunk_metrics [i ]['post' ].keys ():
256- for locality_key in request ['locality' ].keys ():
257- locality_result = []
258- if hasattr (self .hparams , 'evaluation_type' ) and self .hparams .evaluation_type == "LLM-judge" :
259- locality_result .append (float (chunk_metrics [i ]['post' ]['locality' ][f'{ locality_key } _output' ]== chunk_metrics [i ]['pre' ]['locality' ][f'{ locality_key } _output' ]))
260- else :
261- for ans , label in zip (chunk_metrics [i ]['post' ]['locality' ][f'{ locality_key } _output' ], chunk_metrics [i ]['pre' ]['locality' ][f'{ locality_key } _output' ]):
262- locality_result .append (np .mean (np .equal (ans , label )))
263- chunk_metrics [i ]['post' ]['locality' ][f'{ locality_key } _acc' ] = locality_result
264- attach_metric_meta (
265- chunk_metrics [i ]['post' ],
266- f"locality.{ locality_key } " ,
267- build_locality_metric_meta (locality_key , self .hparams , self .model_name ),
268- )
269- chunk_metrics [i ]['post' ]['locality' ].pop (f'{ locality_key } _output' )
270- chunk_metrics [i ]['pre' ].pop ('locality' )
298+ finalize_locality_metrics (
299+ chunk_metrics [i ],
300+ request ,
301+ self .hparams ,
302+ self .model_name ,
303+ )
271304
272305 if verbose :
273306 LOG .info (
@@ -356,22 +389,12 @@ def edit_evaluation(all_metrics, request, edited_model, idx, test_generation, ic
356389 })
357390 if "metric_kwargs" in kwargs :
358391 all_metrics [idx ].update (compute_sent_metric (self .model , edited_model , self .model_name , self .hparams , self .tok ,metric_kwargs = kwargs ["metric_kwargs" ][idx ], device = self .hparams .device ))
359- if 'locality' in all_metrics [idx ]['post' ].keys () and not hasattr (self .hparams , 'evaluation_type' ):
360- for locality_key in request ['locality' ].keys ():
361- locality_result = []
362- if hasattr (self .hparams , 'evaluation_type' ):
363- locality_result .append (float (all_metrics [idx ]['post' ]['locality' ][f'{ locality_key } _output' ]== all_metrics [idx ]['pre' ]['locality' ][f'{ locality_key } _output' ]))
364- else :
365- for ans , label in zip (all_metrics [idx ]['post' ]['locality' ][f'{ locality_key } _output' ], all_metrics [idx ]['pre' ]['locality' ][f'{ locality_key } _output' ]):
366- locality_result .append (np .mean (np .equal (ans , label )))
367- all_metrics [idx ]['post' ]['locality' ][f'{ locality_key } _acc' ] = locality_result
368- attach_metric_meta (
369- all_metrics [idx ]['post' ],
370- f"locality.{ locality_key } " ,
371- build_locality_metric_meta (locality_key , self .hparams , self .model_name ),
372- )
373- all_metrics [idx ]['post' ]['locality' ].pop (f'{ locality_key } _output' )
374- all_metrics [idx ]['pre' ].pop ('locality' )
392+ finalize_locality_metrics (
393+ all_metrics [idx ],
394+ request ,
395+ self .hparams ,
396+ self .model_name ,
397+ )
375398
376399 if verbose :
377400 LOG .info (f"{ idx } editing: { request ['prompt' ]} -> { request ['target_new' ]} \n \n { all_metrics [idx ]} " )
@@ -395,8 +418,7 @@ def edit_evaluation(all_metrics, request, edited_model, idx, test_generation, ic
395418
396419 if isinstance (edited_model , LORA ):
397420 edited_model = edited_model .model
398- if not hasattr (self .hparams , 'evaluation_type' ) or self .hparams .evaluation_type != "generate-text" :
399- summary_metrics (all_metrics )
421+ summary_metrics (all_metrics )
400422
401423 return all_metrics , edited_model , weights_copy
402424
0 commit comments