@@ -73,6 +73,8 @@ class SimpleDiffer(AbstractDiffer):
73
73
assigned_by_look_up_similarity : dict [
74
74
ParameterAssignment , dict [ParameterAssignment , float ]
75
75
]
76
+ previous_parameter_similarity : dict [str , dict [str , float ]] = {}
77
+ previous_function_similarity : dict [str , dict [str , float ]] = {}
76
78
77
79
def __init__ (self ) -> None :
78
80
distance_between_implicit_and_explicit = 0.3
@@ -217,6 +219,12 @@ def compute_attribute_similarity(
217
219
def compute_function_similarity (
218
220
self , function_a : Function , function_b : Function
219
221
) -> float :
222
+ if (
223
+ function_a .id in self .previous_function_similarity
224
+ and function_b .id in self .previous_function_similarity [function_a .id ]
225
+ ):
226
+ return self .previous_function_similarity [function_a .id ][function_b .id ]
227
+
220
228
code_similarity = self ._compute_code_similarity (
221
229
function_a .code , function_b .code
222
230
)
@@ -238,27 +246,38 @@ def are_parameters_similar(
238
246
239
247
id_similarity = self ._compute_id_similarity (function_a .id , function_b .id )
240
248
241
- return (
249
+ result = (
242
250
code_similarity + name_similarity + parameter_similarity + id_similarity
243
251
) / 4
252
+ if function_a .id not in self .previous_function_similarity :
253
+ self .previous_function_similarity [function_a .id ] = {}
254
+ self .previous_function_similarity [function_a .id ][function_b .id ] = result
255
+ return result
244
256
245
257
def _compute_code_similarity (self , code_a : str , code_b : str ) -> float :
246
258
mode = FileMode ()
247
259
try :
248
- code_a = format_str (code_a , mode = mode )
249
- code_b = format_str (code_b , mode = mode )
260
+ code_a_tmp = format_str (code_a , mode = mode )
261
+ code_b_tmp = format_str (code_b , mode = mode )
250
262
except CannotSplit :
251
263
pass
264
+ else :
265
+ code_a = code_a_tmp
266
+ code_b = code_b_tmp
252
267
split_a = code_a .split ("\n " )
253
268
split_b = code_b .split ("\n " )
254
- diff_code = distance_elements (split_a , split_b ) / max (
255
- len (split_a ), len (split_b ), 1
256
- )
269
+ diff_code = distance (split_a , split_b ) / max (len (split_a ), len (split_b ), 1 )
257
270
return 1 - diff_code
258
271
259
272
def compute_parameter_similarity (
260
273
self , parameter_a : Parameter , parameter_b : Parameter
261
274
) -> float :
275
+ if (
276
+ parameter_a .id in self .previous_parameter_similarity
277
+ and parameter_b .id in self .previous_parameter_similarity [parameter_a .id ]
278
+ ):
279
+ return self .previous_parameter_similarity [parameter_a .id ][parameter_b .id ]
280
+
262
281
normalize_similarity = 6
263
282
parameter_name_similarity = self ._compute_name_similarity (
264
283
parameter_a .name , parameter_b .name
@@ -289,14 +308,18 @@ def compute_parameter_similarity(
289
308
290
309
id_similarity = self ._compute_id_similarity (parameter_a .id , parameter_b .id )
291
310
292
- return (
311
+ result = (
293
312
parameter_name_similarity
294
313
+ parameter_type_similarity
295
314
+ parameter_assignment_similarity
296
315
+ parameter_default_value_similarity
297
316
+ parameter_documentation_similarity
298
317
+ id_similarity
299
318
) / normalize_similarity
319
+ if parameter_a .id not in self .previous_parameter_similarity :
320
+ self .previous_parameter_similarity [parameter_a .id ] = {}
321
+ self .previous_parameter_similarity [parameter_a .id ][parameter_b .id ] = result
322
+ return result
300
323
301
324
def _compute_type_similarity (
302
325
self , type_a : Optional [AbstractType ], type_b : Optional [AbstractType ]
@@ -393,9 +416,9 @@ def _compute_parameter_documentation_similarity(
393
416
description_a = re .split ("[\n ]" , documentation_a .description )
394
417
description_b = re .split ("[\n ]" , documentation_b .description )
395
418
396
- documentation_similarity = distance_elements (
397
- description_a , description_b
398
- ) / max ( len ( description_a ), len ( description_b ))
419
+ documentation_similarity = distance ( description_a , description_b ) / max (
420
+ len ( description_a ), len ( description_b )
421
+ )
399
422
return 1 - documentation_similarity
400
423
401
424
def _compute_id_similarity (self , id_a : str , id_b : str ) -> float :
0 commit comments