@@ -23,6 +23,10 @@ def mlos_core_optimizer(tunable_groups: TunableGroups) -> MlosCoreOptimizer:
23
23
"optimizer_type" : "FLAML" ,
24
24
"max_suggestions" : 10 ,
25
25
"seed" : SEED ,
26
+ "optimization_targets" : {
27
+ "latency" : "min" ,
28
+ "throughput" : "max" ,
29
+ },
26
30
}
27
31
return MlosCoreOptimizer (tunable_groups , test_opt_config )
28
32
@@ -74,3 +78,85 @@ def test_df(mlos_core_optimizer: MlosCoreOptimizer, mock_configs: List[dict]) ->
74
78
"vmSize" : "Standard_B2s" ,
75
79
},
76
80
]
81
+
82
+
83
+ def test_df_str (mlos_core_optimizer : MlosCoreOptimizer , mock_configs : List [dict ]) -> None :
84
+ """Test `MlosCoreOptimizer._to_df()` type coercion on tunables with string
85
+ values.
86
+ """
87
+ df_config_orig = mlos_core_optimizer ._to_df (mock_configs )
88
+ df_config_str = mlos_core_optimizer ._to_df (
89
+ [{key : str (val ) for (key , val ) in config .items ()} for config in mock_configs ]
90
+ )
91
+ assert df_config_orig .equals (df_config_str )
92
+
93
+
94
+ def test_adjust_signs_df (mlos_core_optimizer : MlosCoreOptimizer ) -> None :
95
+ """Test `MlosCoreOptimizer._adjust_signs_df()` on different types of inputs."""
96
+ df_scores_input = pandas .DataFrame (
97
+ {
98
+ "latency" : [88.88 , 66.66 , 99.99 , None ],
99
+ "throughput" : [111 , 222 , 333 , None ],
100
+ }
101
+ )
102
+
103
+ df_scores_output = pandas .DataFrame (
104
+ {
105
+ "latency" : [88.88 , 66.66 , 99.99 , float ("NaN" )],
106
+ "throughput" : [- 111 , - 222 , - 333 , float ("NaN" )],
107
+ }
108
+ )
109
+
110
+ # Make sure we adjust the signs for minimization.
111
+ df_scores = mlos_core_optimizer ._adjust_signs_df (df_scores_input )
112
+ assert df_scores .equals (df_scores_output )
113
+
114
+ # Check that the same operation works for string inputs.
115
+ df_scores = mlos_core_optimizer ._adjust_signs_df (df_scores_input .astype (str ))
116
+ assert df_scores .equals (df_scores_output )
117
+
118
+
119
+ def test_adjust_signs_df_nan (mlos_core_optimizer : MlosCoreOptimizer ) -> None :
120
+ """Test `MlosCoreOptimizer._adjust_signs_df()` handling None, NaN, and Inf
121
+ values.
122
+ """
123
+ df_scores = mlos_core_optimizer ._adjust_signs_df (
124
+ pandas .DataFrame (
125
+ {
126
+ "latency" : ["88.88" , "NaN" , "Inf" , "-Inf" , None ],
127
+ "throughput" : ["111" , "NaN" , "Inf" , "-Inf" , None ],
128
+ }
129
+ )
130
+ )
131
+
132
+ assert df_scores .equals (
133
+ pandas .DataFrame (
134
+ {
135
+ "latency" : [88.88 , float ("NaN" ), float ("Inf" ), float ("-Inf" ), float ("NaN" )],
136
+ "throughput" : [- 111 , float ("NaN" ), float ("-Inf" ), float ("Inf" ), float ("NaN" )],
137
+ }
138
+ )
139
+ )
140
+
141
+
142
+ def test_adjust_signs_df_invalid (mlos_core_optimizer : MlosCoreOptimizer ) -> None :
143
+ """Test `MlosCoreOptimizer._adjust_signs_df()` on invalid inputs."""
144
+ with pytest .raises (ValueError ):
145
+ mlos_core_optimizer ._adjust_signs_df (
146
+ pandas .DataFrame (
147
+ {
148
+ "latency" : ["INVALID" ],
149
+ "throughput" : ["no input" ],
150
+ }
151
+ )
152
+ )
153
+
154
+ with pytest .raises (ValueError ):
155
+ mlos_core_optimizer ._adjust_signs_df (
156
+ pandas .DataFrame (
157
+ {
158
+ "latency" : ["88.88" , "" ],
159
+ "throughput" : ["111" , "" ],
160
+ }
161
+ )
162
+ )
0 commit comments