Skip to content

Commit

Permalink
Ensure new arm names do not match a different name on the experiment
Browse files Browse the repository at this point in the history
Summary:
>
In Experiment._name_and_store_arm_if_not_exists (pointer)`, ensure that no other arm with a different signature (but same name) exists on the experiment before adding.

This change checks for signature conflict by arm name in Experiment._name_and_store_arm_if_not_exists

Differential Revision: D62130255
  • Loading branch information
mgrange1998 authored and facebook-github-bot committed Sep 3, 2024
1 parent 98c2140 commit d85c0ea
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 0 deletions.
11 changes: 11 additions & 0 deletions ax/core/experiment.py
Original file line number Diff line number Diff line change
Expand Up @@ -1362,6 +1362,17 @@ def _name_and_store_arm_if_not_exists(self, arm: Arm, proposed_name: str) -> Non
proposed_name: The name to assign if it doesn't have one already.
"""

# Check for signature conflict by arm name/proposed name
search_name = proposed_name if not arm.has_name else arm.name
if (
search_name in self.arms_by_name
and arm.signature != self.arms_by_name[search_name].signature
):
raise ValueError(
f"Arm with name {search_name} already exists on experiment "
f"with different signature."
)

# If arm is identical to an existing arm, return that
# so that the names match.
if arm.signature in self.arms_by_signature:
Expand Down
40 changes: 40 additions & 0 deletions ax/core/tests/test_experiment.py
Original file line number Diff line number Diff line change
Expand Up @@ -1541,3 +1541,43 @@ class TestAuxiliaryExperimentPurpose(AuxiliaryExperimentPurpose):
],
},
)

def test_name_and_store_arm_if_not_exists_same_name_different_signature(
self,
) -> None:
experiment = self.experiment
shared_name = "shared_name"

arm_1 = Arm({"x1": -1.0, "x2": 1.0}, name=shared_name)
arm_2 = Arm({"x1": -1.7, "x2": 0.2, "x3": 1})
self.assertNotEqual(arm_1.signature, arm_2.signature)

experiment._register_arm(arm=arm_1)
with self.assertRaisesRegex(
ValueError,
f"Arm with name {shared_name} already exists on experiment "
f"with different signature.",
):
experiment._name_and_store_arm_if_not_exists(
arm=arm_2, proposed_name=shared_name
)

def test_name_and_store_arm_if_not_exists_same_proposed_name_different_signature(
self,
) -> None:
experiment = self.experiment
shared_name = "shared_name"

arm_1 = Arm({"x1": -1.0, "x2": 1.0}, name=shared_name)
arm_2 = Arm({"x1": -1.7, "x2": 0.2, "x3": 1}, name=shared_name)
self.assertNotEqual(arm_1.signature, arm_2.signature)

experiment._register_arm(arm=arm_1)
with self.assertRaisesRegex(
ValueError,
f"Arm with name {shared_name} already exists on experiment "
f"with different signature.",
):
experiment._name_and_store_arm_if_not_exists(
arm=arm_2, proposed_name="different proposed name"
)

0 comments on commit d85c0ea

Please sign in to comment.