Skip to content

Commit fdaf7e9

Browse files
shrutipatel31meta-codesync[bot]
authored andcommitted
Register NotApplicableStateAnalysisCard in JSON store registry (#5163)
Summary: Pull Request resolved: #5163 Register `NotApplicableStateAnalysisCard` in the JSON store encoder/decoder registries for completeness and consistency with other AnalysisCard subclasses. The JSON store registry uses exact type matching, so every concrete AnalysisCard subclass needs its own entry. This was not needed until now because analysis cards are persisted exclusively through the SQA store (which uses `isinstance()` checks and does not rely on this registry). Adding the registration ensures the JSON store can correctly round-trip `NotApplicableStateAnalysisCard`, keeping it consistent with sibling subclasses like `ErrorAnalysisCard` and guarding against future use cases that may serialize analysis cards via JSON. Reviewed By: Cesar-Cardoso Differential Revision: D100189187 fbshipit-source-id: 44374b22d3b088ac70b7c5fb2833726009d92023
1 parent 5642476 commit fdaf7e9

3 files changed

Lines changed: 48 additions & 4 deletions

File tree

ax/storage/json_store/registry.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@
2828
from ax.benchmark.benchmark_result import AggregatedBenchmarkResult, BenchmarkResult
2929
from ax.benchmark.benchmark_trial_metadata import BenchmarkTrialMetadata
3030
from ax.core import Experiment, ObservationFeatures
31-
from ax.core.analysis_card import AnalysisCard, AnalysisCardGroup, ErrorAnalysisCard
31+
from ax.core.analysis_card import (
32+
AnalysisCard,
33+
AnalysisCardGroup,
34+
ErrorAnalysisCard,
35+
NotApplicableStateAnalysisCard,
36+
)
3237
from ax.core.arm import Arm
3338
from ax.core.auxiliary import AuxiliaryExperiment, AuxiliaryExperimentPurpose
3439
from ax.core.batch_trial import AbandonedArm, BatchTrial
@@ -220,6 +225,7 @@
220225
ExpressionDerivedMetric: metric_to_dict,
221226
DerivedParameter: derived_parameter_to_dict,
222227
ErrorAnalysisCard: analysis_card_to_dict,
228+
NotApplicableStateAnalysisCard: analysis_card_to_dict,
223229
Experiment: experiment_to_dict,
224230
FactorialMetric: metric_to_dict,
225231
FixedParameter: fixed_parameter_to_dict,
@@ -345,6 +351,7 @@
345351
"DerivedParameter": DerivedParameter,
346352
"DomainType": DomainType,
347353
"ErrorAnalysisCard": ErrorAnalysisCard,
354+
"NotApplicableStateAnalysisCard": NotApplicableStateAnalysisCard,
348355
"Experiment": Experiment,
349356
"ExperimentStatus": ExperimentStatus,
350357
"FactorialMetric": FactorialMetric,

ax/storage/json_store/tests/test_json_store.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,12 @@
3737
get_benchmark_result,
3838
get_benchmark_time_varying_metric,
3939
)
40-
from ax.core.analysis_card import AnalysisCard, AnalysisCardGroup, ErrorAnalysisCard
40+
from ax.core.analysis_card import (
41+
AnalysisCard,
42+
AnalysisCardGroup,
43+
ErrorAnalysisCard,
44+
NotApplicableStateAnalysisCard,
45+
)
4146
from ax.core.auxiliary import AuxiliaryExperimentPurpose
4247
from ax.core.data import Data
4348
from ax.core.generator_run import GeneratorRun
@@ -473,6 +478,16 @@
473478
blob="digraph {}",
474479
),
475480
),
481+
(
482+
"NotApplicableStateAnalysisCard",
483+
lambda: NotApplicableStateAnalysisCard(
484+
name="TestNA",
485+
title="Not Applicable",
486+
subtitle="na subtitle",
487+
df=pd.DataFrame(),
488+
blob="Not enough data.",
489+
),
490+
),
476491
(
477492
"AnalysisCardGroup",
478493
lambda: AnalysisCardGroup(

ax/storage/sqa_store/tests/test_sqa_store.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@
2424
choose_generation_strategy,
2525
GenerationStrategyDispatchStruct,
2626
)
27-
from ax.core.analysis_card import AnalysisCard, AnalysisCardGroup
27+
from ax.core.analysis_card import (
28+
AnalysisCard,
29+
AnalysisCardGroup,
30+
NotApplicableStateAnalysisCard,
31+
)
2832
from ax.core.arm import Arm
2933
from ax.core.auxiliary import (
3034
AuxiliaryExperiment,
@@ -3030,14 +3034,26 @@ def test_analysis_card(self) -> None:
30303034
df=test_df,
30313035
blob=pio.to_json(go.Figure()),
30323036
)
3037+
na_card = NotApplicableStateAnalysisCard(
3038+
name="test_na_card",
3039+
title="test_title",
3040+
subtitle="test_subtitle",
3041+
df=test_df,
3042+
blob="Not enough data.",
3043+
)
30333044

30343045
# Create two groups which hold the leaf cards
30353046
# Add the same analysis card multiple times to test _unique_id logic
30363047
small_group = AnalysisCardGroup(
30373048
name="small_group",
30383049
title="Small Group",
30393050
subtitle="This is a small group with just a few cards",
3040-
children=[base_analysis_card, markdown_analysis_card, plotly_analysis_card],
3051+
children=[
3052+
base_analysis_card,
3053+
markdown_analysis_card,
3054+
plotly_analysis_card,
3055+
na_card,
3056+
],
30413057
)
30423058
big_group = AnalysisCardGroup(
30433059
name="big_group",
@@ -3099,6 +3115,12 @@ def test_analysis_card(self) -> None:
30993115
self.assertEqual(loaded_small_group_plotly.name, plotly_analysis_card.name)
31003116
self.assertEqual(loaded_small_group_plotly.blob, plotly_analysis_card.blob)
31013117

3118+
loaded_na = assert_is_instance(
3119+
loaded_small_group.children[3], NotApplicableStateAnalysisCard
3120+
)
3121+
self.assertEqual(loaded_na.name, na_card.name)
3122+
self.assertEqual(loaded_na.blob, na_card.blob)
3123+
31023124
def test_delete_generation_strategy(self) -> None:
31033125
# GIVEN an experiment with a generation strategy
31043126
experiment = get_branin_experiment()

0 commit comments

Comments
 (0)