Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 19 additions & 12 deletions xopt/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down Expand Up @@ -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"
)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand All @@ -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__

Expand Down Expand Up @@ -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
Loading