"""Temporary functionality for backward compatibility."""from__future__importannotationsimportwarningsfromtypingimportTYPE_CHECKINGfromcattrsimportoverridefromcattrs.genimportmake_dict_structure_fnfrombaybe.serializationimportconverterfrombaybe.targets.baseimportTargetfrombaybe.utils.basicimportget_subclassesfrombaybe.utils.booleanimportis_abstractifTYPE_CHECKING:frombaybe.objectives.baseimportObjective
[docs]defstructure_objective(val:dict,cls:type)->Objective:"""A structure hook that automatically determines an objective fallback type."""# noqa: D401 (imperative mood)frombaybe.objectiveimportObjectiveasOldObjectivefrombaybe.objectives.baseimportObjectivefrombaybe.objectives.desirabilityimportDesirabilityObjectivefrombaybe.objectives.singleimportSingleTargetObjectiveval=val.copy()# Use the specified objective typetry:ifis_abstract(cls):_type=val.pop("type")try:cls=next(clforclinget_subclasses(Objective)ifcl.__name__==_type)exceptStopIterationasex:raiseValueError(f"Unknown subclass '{_type}'.")fromexfun=make_dict_structure_fn(cls,converter,_cattrs_forbid_extra_keys=True,_target=override(rename="target"),_targets=override(rename="targets"),)# type: ignorereturnfun(val,cls)# If no type is provided, determine the type by the number of targets givenexceptKeyError:n_targets=len(val["targets"])ifn_targets==0:raiseValueError("No targets are specified.")elifn_targets==1:cls=SingleTargetObjectiveelse:cls=DesirabilityObjectivewarnings.warn(f"An objective has been specified without a corresponding type. "f"Since {n_targets} target(s) have been provided, "f"'{cls.__name__}' is used as a fallback. "f"However, this behavior is deprecated and will be disabled in "f"a future version.",DeprecationWarning,)val["targets"]=converter.structure(val["targets"],list[Target])returnOldObjective(**val)