Skip to content

Commit ad9cfbf

Browse files
shrutipatel31facebook-github-bot
authored andcommitted
Route AnalysisNotApplicableStateError to NotApplicableAnalysisCard (#5051)
Summary: Update error_card_from_analysis_e() in analysis.py to route AnalysisNotApplicableStateError exceptions to NotApplicableStateAnalysisCard instead of ErrorAnalysisCard. Differential Revision: D96248248
1 parent 08f3118 commit ad9cfbf

File tree

3 files changed

+41
-3
lines changed

3 files changed

+41
-3
lines changed

ax/analysis/analysis.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
AnalysisCardBase,
2020
AnalysisCardGroup,
2121
ErrorAnalysisCard,
22+
NotApplicableStateAnalysisCard,
2223
)
2324
from ax.core.experiment import Experiment
2425
from ax.exceptions.analysis import AnalysisNotApplicableStateError
@@ -29,6 +30,12 @@
2930

3031
logger: Logger = get_logger(__name__)
3132

33+
NOT_APPLICABLE_STATE_SUBTITLE: str = (
34+
"This analysis is temporarily unavailable. It will become available "
35+
"as your experiment progresses (e.g., after collecting more data, "
36+
"running more trials, or fitting a model)."
37+
)
38+
3239

3340
class Analysis(Protocol):
3441
"""
@@ -202,7 +209,7 @@ def display_cards(
202209

203210
def error_card_from_analysis_e(
204211
analysis_e: AnalysisE,
205-
) -> ErrorAnalysisCard:
212+
) -> ErrorAnalysisCard | NotApplicableStateAnalysisCard:
206213
analysis_name = analysis_e.analysis.__class__.__name__
207214
exception_name = analysis_e.exception.__class__.__name__
208215

@@ -213,6 +220,18 @@ def error_card_from_analysis_e(
213220
if (exception_message := str(analysis_e.exception))
214221
else f"{exception_name} encountered while computing {analysis_name}."
215222
)
223+
if isinstance(analysis_e.exception, AnalysisNotApplicableStateError):
224+
# AnalysisNotApplicableStateError gets rendered as a
225+
# NotApplicableStateAnalysisCard
226+
return NotApplicableStateAnalysisCard(
227+
name=analysis_name,
228+
title=f"{analysis_name} -- Not Available Yet",
229+
subtitle=NOT_APPLICABLE_STATE_SUBTITLE,
230+
df=pd.DataFrame(),
231+
blob=exception_message
232+
if exception_message
233+
else f"{exception_name} encountered.",
234+
)
216235

217236
return ErrorAnalysisCard(
218237
name=analysis_name,

ax/analysis/tests/test_analysis.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#!/usr/bin/env python3
12
# Copyright (c) Meta Platforms, Inc. and affiliates.
23
#
34
# This source code is licensed under the MIT license found in the
@@ -7,6 +8,8 @@
78

89
from ax.analysis.analysis import AnalysisE, error_card_from_analysis_e
910
from ax.analysis.plotly.parallel_coordinates import ParallelCoordinatesPlot
11+
from ax.core.analysis_card import NotApplicableStateAnalysisCard
12+
from ax.exceptions.analysis import AnalysisNotApplicableStateError
1013
from ax.utils.common.testutils import TestCase
1114

1215

@@ -35,3 +38,17 @@ def test_error_card_from_analysis_e(self) -> None:
3538
self.assertEqual(card.title, "ParallelCoordinatesPlot Error")
3639
self.assertEqual(card.subtitle, expected_subtitle)
3740
self.assertIn("ValueError", card.blob)
41+
42+
def test_not_applicable_error_produces_not_applicable_state_card(self) -> None:
43+
analysis_e = AnalysisE(
44+
message="Analysis not applicable",
45+
exception=AnalysisNotApplicableStateError("Experiment has no data."),
46+
analysis=ParallelCoordinatesPlot(),
47+
)
48+
49+
card = error_card_from_analysis_e(analysis_e)
50+
51+
self.assertIsInstance(card, NotApplicableStateAnalysisCard)
52+
self.assertEqual(card.name, "ParallelCoordinatesPlot")
53+
self.assertEqual(card.title, "ParallelCoordinatesPlot -- Not Available Yet")
54+
self.assertEqual(card.blob, "Experiment has no data.")

ax/api/tests/test_client.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1278,10 +1278,12 @@ def test_compute_analyses(self) -> None:
12781278

12791279
self.assertEqual(len(cards), 1)
12801280
self.assertEqual(cards[0].name, "ParallelCoordinatesPlot")
1281-
self.assertEqual(cards[0].title, "ParallelCoordinatesPlot Error")
1281+
self.assertEqual(cards[0].title, "ParallelCoordinatesPlot -- Not Available Yet")
12821282
self.assertEqual(
12831283
cards[0].subtitle,
1284-
"AnalysisNotApplicableStateError: Experiment has no trials.",
1284+
"This analysis is temporarily unavailable. It will become available as "
1285+
"your experiment progresses (e.g., after collecting more data, running "
1286+
"more trials, or fitting a model).",
12851287
)
12861288

12871289
for trial_index, _ in client.get_next_trials(max_trials=1).items():

0 commit comments

Comments
 (0)