2323from sympy import lambdify , symbols
2424
2525from deepcave .evaluators .ablation import Ablation as Evaluator
26+ from deepcave .evaluators .epm .random_forest_surrogate import RandomForestSurrogate
2627from deepcave .runs import AbstractRun
2728from deepcave .runs .converters .deepcave import DeepCAVERun
2829from deepcave .runs .converters .smac3v2 import SMAC3v2Run
@@ -37,8 +38,9 @@ class PolynomialSurrogateModel:
3738 """
3839
3940 def __init__ (
40- self , n : int , max_degree : int = 2 , seed : int = 42 , coeffs : Optional [np .ndarray ] = None
41+ self , n : int , max_degree : int = 1 , seed : int = 42 , coeffs : Optional [np .ndarray ] = None
4142 ):
43+ self .ground_truth : np .ndarray
4244 self ._polynomial (n , max_degree , seed , coeffs )
4345
4446 def fit (self , X : np .ndarray , y : np .ndarray ) -> np .ndarray :
@@ -83,7 +85,6 @@ def _polynomial(
8385 np.ndarray
8486 The fitting polynomial structure with random variables.
8587 """
86-
8788 x = symbols (f"x1:{ n + 1 } " )
8889
8990 terms = []
@@ -110,12 +111,12 @@ def _polynomial(
110111
111112 if coeffs is None :
112113 np .random .seed (seed )
113- input_values = np .random .randint (1 , 5 , size = len (coeff_symb ))
114+ self . ground_truth = np .random .uniform (1 , 5 , size = len (coeff_symb ))
114115
115116 else :
116- input_values = coeffs
117+ self . ground_truth = coeffs
117118
118- input_mapping = dict (zip (coeff_symb , input_values ))
119+ input_mapping = dict (zip (coeff_symb , self . ground_truth ))
119120 partial_expr = expr .subs (input_mapping )
120121
121122 variables = sorted (partial_expr .free_symbols , key = lambda s : str (s ))
@@ -134,10 +135,12 @@ def test(self):
134135 objective = self .run .get_objective (0 )
135136
136137 # Calculate
137- self .evaluator .calculate (objective , budget , seed = 0 )
138+ model_1 = RandomForestSurrogate (self .run .configspace , seed = 0 )
139+ self .evaluator .calculate (objective , budget , model = model_1 )
138140 importances = self .evaluator .get_ablation_performances ()
139141
140- self .evaluator .calculate (objective , budget , seed = 42 )
142+ model_2 = RandomForestSurrogate (self .run .configspace , seed = 42 )
143+ self .evaluator .calculate (objective , budget , model = model_2 )
141144 importances2 = self .evaluator .get_ablation_performances ()
142145
143146 # Different seed: Different results
@@ -152,10 +155,12 @@ def test_seed(self):
152155 objective = self .run .get_objective (0 )
153156
154157 # Calculate
155- self .evaluator .calculate (objective , budget , seed = 0 )
158+ model_1 = RandomForestSurrogate (self .run .configspace , seed = 0 )
159+ self .evaluator .calculate (objective , budget , model = model_1 )
156160 importances = self .evaluator .get_ablation_performances ()
157161
158- self .evaluator .calculate (objective , budget , seed = 0 )
162+ model_2 = RandomForestSurrogate (self .run .configspace , seed = 0 )
163+ self .evaluator .calculate (objective , budget , model = model_2 )
159164 importances2 = self .evaluator .get_ablation_performances ()
160165
161166 # Same seed: Same results
@@ -174,9 +179,17 @@ def test_polynomial(self):
174179 self .evaluator .calculate (objectives = objective , budget = budget , model = model )
175180
176181 # Evaluate the final ablation path
177- # performances = self.evaluator.get_ablation_performances()
178- # importances = self.evaluator.get_ablation_improvements()
179- # TODO: evaluation
182+ importances = self .evaluator .get_ablation_improvements ()
183+ sorted_importances = np .array (
184+ [
185+ round (float (value [0 ]), 8 )
186+ for key , value in sorted (importances .items ())
187+ if key != "default"
188+ ]
189+ )
190+ ground_truth = model .ground_truth [1 :]
191+
192+ assert np .allclose (sorted_importances , ground_truth , rtol = 1e-5 , atol = 1e-8 )
180193
181194
182195if __name__ == "__main__" :
0 commit comments