| Total Complexity | 4 |
| Total Lines | 28 |
| Duplicated Lines | 0 % |
| Changes | 0 | ||
| 1 | from ._result import Result |
||
| 2 | |||
| 3 | |||
| 4 | class ObjectiveAdapter: |
||
| 5 | """Maps *pos* → (score, metrics, params).""" |
||
| 6 | |||
| 7 | def __init__(self, conv, objective): |
||
| 8 | self._conv = conv |
||
| 9 | self._objective = objective # user callable |
||
| 10 | |||
| 11 | def _call_objective(self, pos): |
||
| 12 | """Run the underlying objective and normalise outputs.""" |
||
| 13 | params = self._conv.value2para(self._conv.position2value(pos)) |
||
| 14 | out = self._objective(params) |
||
| 15 | |||
| 16 | if isinstance(out, tuple): |
||
| 17 | score, metrics = out |
||
| 18 | else: |
||
| 19 | score, metrics = float(out), {} |
||
| 20 | |||
| 21 | result = Result(score, metrics) |
||
| 22 | |||
| 23 | return result, params |
||
| 24 | |||
| 25 | # keep one public entry point so subclasses can override cleanly |
||
| 26 | def __call__(self, pos): |
||
| 27 | return self._call_objective(pos) |
||
| 28 |