11import logging
22import math
3- import statistics
43from typing import Any , Counter , Dict , List , Literal , Optional , Tuple , TypedDict
54
65from common .benchmark_time_series_api_model import BenchmarkTimeSeriesApiData
1514]
1615
1716
18- class BaselineItem (TypedDict ):
17+ class BaselineResult (TypedDict ):
1918 group_info : Dict [str , Any ]
19+ orignal_item : Dict [str , Any ]
2020 value : float
2121
2222
@@ -27,7 +27,7 @@ class BenchmarkValueItem(TypedDict):
2727
2828class PerGroupResult (TypedDict , total = True ):
2929 group_info : Dict [str , Any ]
30- baseline : Optional [float ]
30+ baseline_item : Optional [Dict [ str , Any ] ]
3131 points : List [Any ]
3232 label : RegressionClassifyLabel
3333 policy : Optional ["RegressionPolicy" ]
@@ -87,11 +87,11 @@ def detect_regressions_with_policies(
8787
8888 base_item = baseline_map .get (key )
8989 if not base_item :
90- logger .warning ("Skip. No baseline item found for %s" , gi )
90+ logger .warning ("Skip. No baseline item found for %s" , key )
9191 results .append (
9292 PerGroupResult (
9393 group_info = gi ,
94- baseline = None ,
94+ baseline_item = None ,
9595 points = [],
9696 label = "insufficient_data" ,
9797 policy = None ,
@@ -104,44 +104,50 @@ def detect_regressions_with_policies(
104104 results .append (
105105 PerGroupResult (
106106 group_info = gi ,
107- baseline = None ,
107+ baseline_item = None ,
108108 points = [],
109109 label = "insufficient_data" ,
110110 policy = None ,
111111 )
112112 )
113113 continue
114-
115114 baseline_aggre_mode = policy .baseline_aggregation
116- baseline_value = self ._get_baseline (base_item , baseline_aggre_mode )
117- if baseline_value is None or len (points ) == 0 :
115+ baseline_result = self ._get_baseline (base_item , baseline_aggre_mode )
116+ if (
117+ not baseline_result
118+ or not baseline_result ["orignal_item" ]
119+ or len (points ) == 0
120+ ):
118121 logger .warning (
119- "baseline_value is %s, len(points) == %s" ,
120- baseline_value ,
122+ "No valid baseline result found, baseline_item is %s, len(points) == %s" ,
123+ baseline_result ,
121124 len (points ),
122125 )
123126 results .append (
124127 PerGroupResult (
125128 group_info = gi ,
126- baseline = None ,
129+ baseline_item = None ,
127130 points = [],
128131 label = "insufficient_data" ,
129132 policy = policy ,
130133 )
131134 )
132135 continue
133136
137+ orignal_baseline_obj = baseline_result ["orignal_item" ]
138+
134139 # Per-point violations (True = regression)
135140 flags : List [bool ] = [
136- policy .is_violation (p ["value" ], baseline_value ["value" ]) for p in points
141+ policy .is_violation (p ["value" ], baseline_result ["value" ])
142+ for p in points
137143 ]
138144 label = self .classify_flags (flags , min_points = min_points )
139145
140146 enriched_points = [{** p , "flag" : f } for p , f in zip (points , flags )]
141147 results .append (
142148 PerGroupResult (
143149 group_info = gi ,
144- baseline = baseline_value [ "value" ] ,
150+ baseline_item = orignal_baseline_obj ,
145151 points = enriched_points ,
146152 label = label ,
147153 policy = policy ,
@@ -202,39 +208,33 @@ def _to_data_map(
202208 def _get_baseline (
203209 self ,
204210 data : BenchmarkValueItem ,
205- mode : str = "mean " ,
211+ mode : str = "max " ,
206212 field : str = "value" ,
207- ) -> Optional [BaselineItem ]:
213+ ) -> Optional [BaselineResult ]:
208214 """
209215 calculate the baseline value based on the mode
210216 mode: mean, p90, max, min, latest, p50, p95
211217 """
212- values = [float ( d [ field ]) for d in data ["values" ] if field in d ]
213- if not values :
218+ items = [d for d in data ["values" ] if field in d ]
219+ if not items :
214220 return None
215221
216- if mode == "mean" :
217- val = statistics .fmean (values )
218- elif mode == "p90" :
219- val = percentile (values , 0.9 )
220- elif mode == "max" :
221- val = max (values )
222+ if mode == "max" :
223+ baseline_obj = max (items , key = lambda d : float (d [field ]))
222224 elif mode == "min" :
223- val = min (values )
225+ baseline_obj = min (items , key = lambda d : float ( d [ field ]) )
224226 elif mode == "latest" :
225- val = values [- 1 ]
227+ baseline_obj = items [- 1 ]
226228 elif mode == "earliest" :
227- val = values [0 ]
228- elif mode == "p50" :
229- val = percentile (values , 0.5 )
230- elif mode == "p95" :
231- val = percentile (values , 0.95 )
229+ baseline_obj = items [0 ]
232230 else :
233231 logger .warning ("Unknown mode: %s" , mode )
234232 return None
235- result : BaselineItem = {
233+
234+ result : BaselineResult = {
236235 "group_info" : data ["group_info" ],
237- "value" : val ,
236+ "value" : float (baseline_obj [field ]),
237+ "orignal_item" : baseline_obj ,
238238 }
239239 return result
240240
0 commit comments