forked from facebook/Ax
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_can_generate_candidates.py
More file actions
149 lines (141 loc) · 5.98 KB
/
test_can_generate_candidates.py
File metadata and controls
149 lines (141 loc) · 5.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
# pyre-strict
from datetime import datetime, timedelta
from ax.analysis.healthcheck.can_generate_candidates import (
CanGenerateCandidatesAnalysis,
)
from ax.analysis.healthcheck.healthcheck_analysis import HealthcheckStatus
from ax.core.trial_status import TrialStatus
from ax.utils.common.testutils import TestCase
from ax.utils.testing.core_stubs import get_branin_experiment
class TestCanGenerateCandidates(TestCase):
def test_passes_if_can_generate(self) -> None:
# GIVEN we can generate candidates
# WHEN we run the healthcheck
card = CanGenerateCandidatesAnalysis(
can_generate_candidates=True,
reason="No problems found.",
days_till_fail=0,
).compute(experiment=None, generation_strategy=None)
# THEN it is PASSES
self.assertEqual(card.get_status(), HealthcheckStatus.PASS)
self.assertEqual(card.name, "CanGenerateCandidatesAnalysis")
self.assertEqual(card.title, "Ax Candidate Generation Success")
self.assertEqual(
card.subtitle,
(
"The candidate generation health check notifies users if key "
"criteria for candidate generation are missing. No problems found."
),
)
self.assertEqual(card.get_status(), HealthcheckStatus.PASS)
self.assertDictEqual(
card.get_aditional_attrs(),
{
"status": HealthcheckStatus.PASS,
"reason": "No problems found.",
},
)
def test_warns_if_a_trial_was_recently_run(self) -> None:
# GIVEN an experiment with a recently run trial
experiment = get_branin_experiment(with_trial=True)
trial = experiment.trials[0]
trial.mark_running(no_runner_required=True)
trial._time_run_started = datetime.now() - timedelta(days=1)
# WHEN we run the healthcheck
card = CanGenerateCandidatesAnalysis(
can_generate_candidates=False,
reason="The data is borked.",
days_till_fail=2,
).compute(experiment=experiment, generation_strategy=None)
# THEN it is INFO
self.assertEqual(card.get_status(), HealthcheckStatus.INFO)
self.assertEqual(card.name, "CanGenerateCandidatesAnalysis")
self.assertEqual(card.title, "Ax Candidate Generation Info")
self.assertEqual(
card.subtitle,
(
"The candidate generation health check notifies users if key "
"criteria for candidate generation are missing. "
f"{CanGenerateCandidatesAnalysis.REASON_PREFIX}"
"The data is borked.\n\n"
"LAST TRIAL RUN: 1 day(s) ago"
),
)
self.assertEqual(card.get_status(), HealthcheckStatus.INFO)
self.assertDictEqual(
card.get_aditional_attrs(),
{
"status": HealthcheckStatus.INFO,
"reason": "The data is borked.",
},
)
def test_is_fail_no_trials_have_been_run(self) -> None:
# GIVEN an experiment with a candidate trial
experiment = get_branin_experiment(with_trial=True)
trial = experiment.trials[0]
self.assertEqual(trial.status, TrialStatus.CANDIDATE)
# WHEN we run the healthcheck
card = CanGenerateCandidatesAnalysis(
can_generate_candidates=False,
reason="The data is gone.",
days_till_fail=2,
).compute(experiment=experiment, generation_strategy=None)
# THEN it is an ERROR
self.assertEqual(card.get_status(), HealthcheckStatus.FAIL)
self.assertEqual(card.name, "CanGenerateCandidatesAnalysis")
self.assertEqual(card.title, "Ax Candidate Generation Failure")
self.assertEqual(
card.subtitle,
(
"The candidate generation health check notifies users if key "
"criteria for candidate generation are missing. "
f"{CanGenerateCandidatesAnalysis.REASON_PREFIX}The data is gone."
),
)
self.assertEqual(card.get_status(), HealthcheckStatus.FAIL)
self.assertDictEqual(
card.get_aditional_attrs(),
{
"status": HealthcheckStatus.FAIL,
"reason": "The data is gone.",
},
)
def test_is_fail_if_no_trial_was_recently_run(self) -> None:
# GIVEN an experiment with an old trial
experiment = get_branin_experiment(with_trial=True)
trial = experiment.trials[0]
trial.mark_running(no_runner_required=True)
trial._time_run_started = datetime.now() - timedelta(days=3)
trial.mark_completed()
# WHEN we run the healthcheck
card = CanGenerateCandidatesAnalysis(
can_generate_candidates=False,
reason="The data is old.",
days_till_fail=1,
).compute(experiment=experiment, generation_strategy=None)
# THEN it is an ERROR
self.assertEqual(card.get_status(), HealthcheckStatus.FAIL)
self.assertEqual(card.name, "CanGenerateCandidatesAnalysis")
self.assertEqual(card.title, "Ax Candidate Generation Failure")
self.assertEqual(
card.subtitle,
(
"The candidate generation health check notifies users if key "
"criteria for candidate generation are missing. "
f"{CanGenerateCandidatesAnalysis.REASON_PREFIX}"
"The data is old.\n\n"
"LAST TRIAL RUN: 3 day(s) ago"
),
)
self.assertEqual(card.get_status(), HealthcheckStatus.FAIL)
self.assertDictEqual(
card.get_aditional_attrs(),
{
"status": HealthcheckStatus.FAIL,
"reason": "The data is old.",
},
)