Skip to content

Commit 1545a0e

Browse files
bug fix running portfolio selector
1 parent c2c853e commit 1545a0e

File tree

4 files changed

+30
-10
lines changed

4 files changed

+30
-10
lines changed

src/sparkle/CLI/run_portfolio_selector.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ def main(argv: list[str]) -> None:
7373
test_case_path.mkdir(exist_ok=True)
7474
feature_dataframe = FeatureDataFrame(test_case_path / "feature_data.csv")
7575
feature_dataframe.remove_instances(feature_dataframe.instances)
76+
print(feature_dataframe.extractors)
7677
for extractor_name in selector_scenario.feature_extractors:
7778
extractor = resolve_object_name(
7879
extractor_name,

src/sparkle/structures/feature_dataframe.py

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -111,19 +111,33 @@ def add_extractor(
111111
values: Initial values of the Extractor per instance in the dataframe.
112112
Defaults to FeatureDataFrame.missing_value.
113113
"""
114+
if extractor in self.extractors:
115+
print(
116+
f"WARNING: Tried adding already existing extractor {extractor} to "
117+
f"Feature DataFrame: {self.csv_filepath}"
118+
)
119+
return
114120
if values is None:
115121
values = [self.missing_value] * len(
116122
extractor_features
117123
) # Single missing value for each feature
124+
extractor_dim = self.columns.get_level_values(FeatureDataFrame.extractor_dim)
118125
# Unfold to indices to lists
119126
for index, (feature_group, feature) in enumerate(extractor_features):
120127
self[(extractor, feature_group, feature)] = values[index]
121-
if (
122-
self.num_extractors == 2 and str(math.nan) in self.extractors
123-
): # Upon successfull adding of the extractor, remove the nan extractor
124-
self.drop(
125-
str(math.nan), axis=1, level=FeatureDataFrame.extractor_dim, inplace=True
126-
)
128+
if self.num_extractors > 1:
129+
# Upon successfull adding of the extractor, remove the nan extractor
130+
if str(math.nan) in extractor_dim:
131+
self.drop(
132+
str(math.nan),
133+
axis=1,
134+
level=FeatureDataFrame.extractor_dim,
135+
inplace=True,
136+
)
137+
elif math.nan in extractor_dim:
138+
self.drop(
139+
math.nan, axis=1, level=FeatureDataFrame.extractor_dim, inplace=True
140+
)
127141

128142
def add_instances(
129143
self: FeatureDataFrame, instance: str | list[str], values: list[float] = None
@@ -144,7 +158,7 @@ def remove_extractor(self: FeatureDataFrame, extractor: str) -> None:
144158
# if self.num_extractors == 0:
145159
if self.num_extractors == 0: # make sure we have atleast one 'extractor'
146160
self.add_extractor(
147-
FeatureDataFrame.missing_value,
161+
str(FeatureDataFrame.missing_value),
148162
[(FeatureDataFrame.missing_value, FeatureDataFrame.feature_name_dim)],
149163
)
150164

@@ -276,8 +290,13 @@ def instances(self: FeatureDataFrame) -> list[str]:
276290
@property
277291
def extractors(self: FeatureDataFrame) -> list[str]:
278292
"""Returns all unique extractors in the DataFrame."""
279-
# return self.index.get_level_values("Extractor").unique().to_list()
280-
return self.columns.get_level_values("Extractor").unique().to_list()
293+
return [
294+
x
295+
for x in self.columns.get_level_values(
296+
FeatureDataFrame.extractor_dim
297+
).unique()
298+
if str(x) != str(FeatureDataFrame.missing_value)
299+
]
281300

282301
@property
283302
def num_features(self: FeatureDataFrame) -> int:
Binary file not shown.

tests/CLI/test_run_portfolio_selector.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def test_run_portfolio_selector_command(
7171
# Run set test slurm
7272
scenario = (
7373
"Output/Selection/MultiClassClassifier_RandomForestClassifier/"
74-
"CSCCSat_MiniSAT_PbO-CCSAT-Generic/scenario.txt"
74+
"CSCCSat_PbO-CCSAT-Generic/scenario.txt"
7575
)
7676
with pytest.raises(SystemExit) as pytest_wrapped_e:
7777
run_portfolio_selector.main(

0 commit comments

Comments
 (0)