statistic_helper.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. # Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. def sum_ranges(ranges):
  15. result = 0
  16. for time_range in ranges:
  17. result += time_range[1] - time_range[0]
  18. return result
  19. def merge_self_ranges(src_ranges, is_sorted=False):
  20. merged_ranges = []
  21. if len(src_ranges) > 0:
  22. if not is_sorted:
  23. src_ranges.sort(key=lambda x: x[0])
  24. cur_indx = 0
  25. merged_ranges.append((src_ranges[cur_indx][0], src_ranges[cur_indx][1]))
  26. for cur_indx in range(1, len(src_ranges)):
  27. if src_ranges[cur_indx][1] > merged_ranges[-1][1]:
  28. if src_ranges[cur_indx][0] <= merged_ranges[-1][1]:
  29. merged_ranges[-1] = (
  30. merged_ranges[-1][0],
  31. src_ranges[cur_indx][1],
  32. )
  33. else:
  34. merged_ranges.append(
  35. (src_ranges[cur_indx][0], src_ranges[cur_indx][1])
  36. )
  37. return merged_ranges
  38. def merge_ranges(range_list1, range_list2, is_sorted=False):
  39. merged_ranges = []
  40. if not is_sorted:
  41. range_list1 = merge_self_ranges(range_list1)
  42. range_list2 = merge_self_ranges(range_list2)
  43. len1 = len(range_list1)
  44. len2 = len(range_list2)
  45. if len1 == 0 and len2 == 0:
  46. return merged_ranges
  47. elif len1 == 0:
  48. return range_list2
  49. elif len2 == 0:
  50. return range_list1
  51. else:
  52. indx1 = 0
  53. indx2 = 0
  54. range1 = range_list1[indx1]
  55. range2 = range_list2[indx2]
  56. if range1[0] < range2[0]:
  57. merged_ranges.append(range1)
  58. indx1 += 1
  59. else:
  60. merged_ranges.append(range2)
  61. indx2 += 1
  62. while indx1 < len1 and indx2 < len2:
  63. range1 = range_list1[indx1]
  64. range2 = range_list2[indx2]
  65. if range1[0] < range2[0]:
  66. if range1[1] > merged_ranges[-1][1]:
  67. if range1[0] <= merged_ranges[-1][1]:
  68. merged_ranges[-1] = (merged_ranges[-1][0], range1[1])
  69. else:
  70. merged_ranges.append((range1[0], range1[1]))
  71. indx1 += 1
  72. else:
  73. indx1 += 1
  74. else:
  75. if range2[1] > merged_ranges[-1][1]:
  76. if range2[0] <= merged_ranges[-1][1]:
  77. merged_ranges[-1] = (merged_ranges[-1][0], range2[1])
  78. else:
  79. merged_ranges.append((range2[0], range2[1]))
  80. indx2 += 1
  81. else:
  82. indx2 += 1
  83. while indx1 < len1:
  84. range1 = range_list1[indx1]
  85. if range1[1] > merged_ranges[-1][1]:
  86. if range1[0] <= merged_ranges[-1][1]:
  87. merged_ranges[-1] = (merged_ranges[-1][0], range1[1])
  88. else:
  89. merged_ranges.append((range1[0], range1[1]))
  90. indx1 += 1
  91. else:
  92. indx1 += 1
  93. while indx2 < len2:
  94. range2 = range_list2[indx2]
  95. if range2[1] > merged_ranges[-1][1]:
  96. if range2[0] <= merged_ranges[-1][1]:
  97. merged_ranges[-1] = (merged_ranges[-1][0], range2[1])
  98. else:
  99. merged_ranges.append((range2[0], range2[1]))
  100. indx2 += 1
  101. else:
  102. indx2 += 1
  103. return merged_ranges
  104. def intersection_ranges(range_list1, range_list2, is_sorted=False):
  105. result_range = []
  106. if len(range_list1) == 0 or len(range_list2) == 0:
  107. return result_range
  108. if not is_sorted:
  109. range_list1 = merge_self_ranges(range_list1)
  110. range_list2 = merge_self_ranges(range_list2)
  111. len1 = len(range_list1)
  112. len2 = len(range_list2)
  113. indx1 = 0
  114. indx2 = 0
  115. range1 = range_list1[indx1]
  116. range2 = range_list2[indx2]
  117. while indx1 < len1 and indx2 < len2:
  118. if range2[1] <= range1[0]:
  119. indx2 += 1
  120. if indx2 == len2:
  121. break
  122. range2 = range_list2[indx2]
  123. elif range2[0] <= range1[0] and range2[1] < range1[1]:
  124. assert range2[1] > range1[0]
  125. result_range.append((range1[0], range2[1]))
  126. range1 = (range2[1], range1[1])
  127. indx2 += 1
  128. if indx2 == len2:
  129. break
  130. range2 = range_list2[indx2]
  131. elif range2[0] <= range1[0]:
  132. assert range2[1] >= range1[1]
  133. result_range.append(range1)
  134. range2 = (range1[1], range2[1])
  135. indx1 += 1
  136. if indx1 == len1:
  137. break
  138. range1 = range_list1[indx1]
  139. elif range2[1] < range1[1]:
  140. assert range2[0] > range1[0]
  141. result_range.append(range2)
  142. range1 = (range2[1], range1[1])
  143. indx2 += 1
  144. if indx2 == len2:
  145. break
  146. range2 = range_list2[indx2]
  147. elif range2[0] < range1[1]:
  148. assert range2[1] >= range1[1]
  149. result_range.append((range2[0], range1[1]))
  150. range2 = (range1[1], range2[1])
  151. indx1 += 1
  152. if indx1 == len1:
  153. break
  154. range1 = range_list1[indx1]
  155. else:
  156. assert range2[0] >= range1[1]
  157. indx1 += 1
  158. if indx1 == len1:
  159. break
  160. range1 = range_list1[indx1]
  161. return result_range
  162. def subtract_ranges(range_list1, range_list2, is_sorted=False):
  163. result_range = []
  164. if not is_sorted:
  165. range_list1 = merge_self_ranges(range_list1)
  166. range_list2 = merge_self_ranges(range_list2)
  167. if len(range_list1) == 0:
  168. return result_range
  169. if len(range_list2) == 0:
  170. return range_list1
  171. len1 = len(range_list1)
  172. len2 = len(range_list2)
  173. indx1 = 0
  174. indx2 = 0
  175. range1 = range_list1[indx1]
  176. range2 = range_list2[indx2]
  177. while indx1 < len(range_list1):
  178. if indx2 == len(range_list2):
  179. result_range.append(range1)
  180. indx1 += 1
  181. if indx1 == len1:
  182. break
  183. range1 = range_list1[indx1]
  184. elif range2[1] <= range1[0]:
  185. indx2 += 1
  186. if indx2 != len2:
  187. range2 = range_list2[indx2]
  188. elif range2[0] <= range1[0] and range2[1] < range1[1]:
  189. range1 = (range2[1], range1[1])
  190. indx2 += 1
  191. if indx2 != len2:
  192. range2 = range_list2[indx2]
  193. elif range2[0] <= range1[0]:
  194. assert range2[1] >= range1[1]
  195. range2 = (range1[1], range2[1])
  196. indx1 += 1
  197. if indx1 != len1:
  198. range1 = range_list1[indx1]
  199. elif range2[0] < range1[1]:
  200. assert range2[0] > range1[0]
  201. result_range.append((range1[0], range2[0]))
  202. range1 = (range2[0], range1[1])
  203. else:
  204. assert range2[0] >= range1[1]
  205. result_range.append(range1)
  206. indx1 += 1
  207. if indx1 != len1:
  208. range1 = range_list1[indx1]
  209. return result_range