arp.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import numpy as np
  2. def arp_tensor_result(tensor_data, dis_matrix, first_id):
  3. # TODO 适配tensor 格式
  4. result_list_id = []
  5. unsorted_testcase_id_set = set()
  6. distance_list = {} # min distance between each unsorted test case and test case in result_list_id
  7. for i in range(len(tensor_data)):
  8. unsorted_testcase_id_set.add(i)
  9. distance_list[i] = float('inf')
  10. while len(unsorted_testcase_id_set) > 1:
  11. if len(unsorted_testcase_id_set) == len(tensor_data):
  12. current_testcase_id = first_id
  13. else:
  14. current_testcase_id = max_distance_to_unsorted(distance_list)
  15. result_list_id.append(current_testcase_id)
  16. unsorted_testcase_id_set.remove(current_testcase_id)
  17. distance_list.pop(current_testcase_id)
  18. for temp_testcase_id in unsorted_testcase_id_set:
  19. if dis_matrix[current_testcase_id, temp_testcase_id] < distance_list[temp_testcase_id]:
  20. distance_list[temp_testcase_id] = dis_matrix[current_testcase_id, temp_testcase_id]
  21. return result_list_id
  22. def max_distance_to_unsorted(distance_list):
  23. max_distance = float('-inf')
  24. max_unsorted_id = None
  25. for testcase_id, distance in distance_list.items():
  26. if distance > max_distance:
  27. max_distance = distance
  28. max_unsorted_id = testcase_id
  29. if max_unsorted_id is None:
  30. max_unsorted_id = list(distance_list.keys())[0]
  31. return max_unsorted_id
  32. def get_distance_matrix_tensor(tensor_list, option):
  33. t = len(tensor_list)
  34. dis_matrix = np.zeros((t, t))
  35. for i in range(len(tensor_list)):
  36. for j in range(i + 1, len(tensor_list)):
  37. x = tensor_list[i]
  38. y = tensor_list[j]
  39. dis_matrix[i, j] = compute_distance(option, x, y)
  40. dis_matrix[j, i] = dis_matrix[i, j]
  41. return dis_matrix
  42. def euclidean_distance(x, y):
  43. return np.sqrt(np.sum(np.square(x - y)))
  44. def cosine_distance(x, y):
  45. temp = np.linalg.norm(x) * (np.linalg.norm(y))
  46. if temp == 0:
  47. return 1
  48. else:
  49. return 1 - np.dot(x, y) / temp
  50. def compute_distance(distance_option, x, y):
  51. if distance_option == "e":
  52. return euclidean_distance(x, y)
  53. elif distance_option == "c":
  54. return cosine_distance(x, y)