From 3e71ce7b48a1d353780b935034b144dfedfddb23 Mon Sep 17 00:00:00 2001 From: "Christopher M. Pierce" Date: Mon, 22 Sep 2025 23:45:54 -0700 Subject: [PATCH] remove vocs from base level xopt, reference from generator instead --- xopt/base.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/xopt/base.py b/xopt/base.py index 1a8b01505..8328d90d9 100644 --- a/xopt/base.py +++ b/xopt/base.py @@ -37,9 +37,6 @@ class Xopt(XoptBaseModel): Parameters ---------- - vocs : VOCS - VOCS object for defining the problem's variables, objectives, constraints, and - statics. generator : SerializeAsAny[Generator] An object responsible for generating candidates for optimization. evaluator : SerializeAsAny[Evaluator] @@ -92,7 +89,6 @@ class Xopt(XoptBaseModel): Serializes the Xopt configuration to a JSON string. """ - vocs: VOCS = Field(description="VOCS object for Xopt") generator: SerializeAsAny[Generator] = Field( description="generator object for Xopt" ) @@ -129,26 +125,25 @@ def validate_model(cls, data: Any): Validate the Xopt model by checking the generator and evaluator. """ if isinstance(data, dict): - # validate vocs + # Grab VOCS object and validate if isinstance(data["vocs"], dict): - data["vocs"] = VOCS(**data["vocs"]) + vocs = VOCS.model_validate(data.pop("vocs")) + else: + vocs = data.pop("vocs") - # validate generator + # Validate generator if isinstance(data["generator"], dict): name = data["generator"].pop("name") generator_class = get_generator(name) data["generator"] = generator_class.model_validate( - {**data["generator"], "vocs": data["vocs"]} + {**data["generator"], "vocs": vocs} ) elif isinstance(data["generator"], str): generator_class = get_generator(data["generator"]) - data["generator"] = generator_class.model_validate( - {"vocs": data["vocs"]} - ) + data["generator"] = generator_class.model_validate({"vocs": vocs}) # make a copy of the generator / vocs objects to avoid modifying the original - data["vocs"] = deepcopy(data["vocs"]) data["generator"] = deepcopy(data["generator"]) return data @@ -554,6 +549,7 @@ def dict(self, **kwargs) -> Dict: """ result = super().model_dump(**kwargs) result["generator"] = {"name": self.generator.name} | result["generator"] + result["vocs"] = self.generator.vocs.model_dump(**kwargs) return result def json(self, **kwargs) -> str: @@ -580,6 +576,9 @@ def json(self, **kwargs) -> str: json.loads(self.data.to_json()) if self.data is not None else None ) + # Xopt data uses vocs in top level of JSON object + dict_result["vocs"] = json.loads(self.vocs.to_json()) + # TODO: implement version checking # dict_result["xopt_version"] = __version__ @@ -622,3 +621,11 @@ def __str__(self): """ return self.__repr__() + + @property + def vocs(self): + return self.generator.vocs + + @vocs.setter + def vocs(self, value): + self.generator.vocs = value