Skip to content

Commit 9a204c4

Browse files
vertex-sdk-botcopybara-github
authored andcommitted
fix: Fixed INTEGER and BOOL parameters casting issue. Fix conversion bug where INTEGER and BOOL parameters are not cast to the correct type.
PiperOrigin-RevId: 586483856
1 parent ae2271d commit 9a204c4

File tree

3 files changed

+51
-2
lines changed

3 files changed

+51
-2
lines changed

google/cloud/aiplatform/vizier/pyvizier/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
except ImportError:
3434
raise ImportError(
3535
"Google-vizier is not installed, and is required to use Vizier client."
36-
'Please install the SDK using "pip install google-vizier==0.0.4"'
36+
'Please install the SDK using "pip install google-vizier"'
3737
)
3838

3939
from google.cloud.aiplatform.vizier.pyvizier.proto_converters import TrialConverter

google/cloud/aiplatform/vizier/pyvizier/proto_converters.py

+11
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from google.protobuf import struct_pb2
88
from google.protobuf import timestamp_pb2
99
from google.cloud.aiplatform.compat.types import study as study_pb2
10+
from google.cloud.aiplatform.vizier.pyvizier import ExternalType
1011
from google.cloud.aiplatform.vizier.pyvizier import ScaleType
1112
from google.cloud.aiplatform.vizier.pyvizier import ParameterType
1213
from google.cloud.aiplatform.vizier.pyvizier import ParameterValue
@@ -122,12 +123,14 @@ def from_proto(
122123
ValueError: See the "strict_validtion" arg documentation.
123124
"""
124125
feasible_values = []
126+
external_type = ExternalType.INTERNAL
125127
oneof_name = proto._pb.WhichOneof("parameter_value_spec")
126128
if oneof_name == "integer_value_spec":
127129
bounds = (
128130
int(proto.integer_value_spec.min_value),
129131
int(proto.integer_value_spec.max_value),
130132
)
133+
external_type = ExternalType.INTEGER
131134
elif oneof_name == "double_value_spec":
132135
bounds = (
133136
proto.double_value_spec.min_value,
@@ -139,10 +142,17 @@ def from_proto(
139142
elif oneof_name == "categorical_value_spec":
140143
bounds = None
141144
feasible_values = proto.categorical_value_spec.values
145+
# Boolean values are encoded as categoricals, check for the special
146+
# hard-coded values.
147+
boolean_values = ["False", "True"]
148+
if sorted(list(feasible_values)) == boolean_values:
149+
external_type = ExternalType.BOOLEAN
142150

143151
default_value = None
144152
if getattr(proto, oneof_name).default_value:
145153
default_value = getattr(proto, oneof_name).default_value
154+
if external_type == ExternalType.INTEGER:
155+
default_value = int(default_value)
146156

147157
if proto.conditional_parameter_specs:
148158
children = []
@@ -166,6 +176,7 @@ def from_proto(
166176
children=children,
167177
scale_type=scale_type,
168178
default_value=default_value,
179+
external_type=external_type,
169180
)
170181
except ValueError as e:
171182
raise ValueError(

tests/unit/aiplatform/test_vizier.py

+39-1
Original file line numberDiff line numberDiff line change
@@ -1046,7 +1046,10 @@ def test_integer_config_to_proto_with_children(self):
10461046

10471047

10481048
class TestParameterConfigConverterFromProto:
1049-
def test_creates_from_good_proto(self):
1049+
"""Test ParameterConfigConverter.from_proto."""
1050+
1051+
def test_from_proto_discrete(self):
1052+
"""Test from_proto."""
10501053
proto = study_pb2.StudySpec.ParameterSpec(
10511054
parameter_id="name",
10521055
discrete_value_spec=study_pb2.StudySpec.ParameterSpec.DiscreteValueSpec(
@@ -1061,3 +1064,38 @@ def test_creates_from_good_proto(self):
10611064
assert parameter_config.bounds == (1.0, 3.0)
10621065
assert parameter_config.feasible_values == [1.0, 2.0, 3.0]
10631066
assert parameter_config.default_value == 2.0
1067+
assert parameter_config.external_type == pyvizier.ExternalType.INTERNAL
1068+
1069+
def test_from_proto_integer(self):
1070+
"""Test from_proto."""
1071+
proto = study_pb2.StudySpec.ParameterSpec(
1072+
parameter_id="name",
1073+
integer_value_spec=study_pb2.StudySpec.ParameterSpec.IntegerValueSpec(
1074+
default_value=2, min_value=1, max_value=3
1075+
),
1076+
)
1077+
1078+
parameter_config = proto_converters.ParameterConfigConverter.from_proto(proto)
1079+
1080+
assert parameter_config.name == proto.parameter_id
1081+
assert parameter_config.type == pyvizier.ParameterType.INTEGER
1082+
assert parameter_config.bounds == (1, 3)
1083+
assert parameter_config.default_value == 2
1084+
assert parameter_config.external_type == pyvizier.ExternalType.INTEGER
1085+
1086+
def test_from_proto_bool(self):
1087+
"""Test from_proto."""
1088+
proto = study_pb2.StudySpec.ParameterSpec(
1089+
parameter_id="name",
1090+
categorical_value_spec=study_pb2.StudySpec.ParameterSpec.CategoricalValueSpec(
1091+
default_value="True", values=["True", "False"]
1092+
),
1093+
)
1094+
1095+
parameter_config = proto_converters.ParameterConfigConverter.from_proto(proto)
1096+
1097+
assert parameter_config.name == proto.parameter_id
1098+
assert parameter_config.type == pyvizier.ParameterType.CATEGORICAL
1099+
assert parameter_config.feasible_values == ["False", "True"]
1100+
assert parameter_config.default_value == "True"
1101+
assert parameter_config.external_type == pyvizier.ExternalType.BOOLEAN

0 commit comments

Comments
 (0)