diff --git a/qulab/scan/optimize.py b/qulab/scan/optimize.py index 6b061024..bce79b91 100644 --- a/qulab/scan/optimize.py +++ b/qulab/scan/optimize.py @@ -37,8 +37,11 @@ def __init__(self, variables, **kwds): self.config['method'])(self.instrum, budget=self.config['budget']) - def suggest(self, *args, **kwds): - self.opt.suggest(*args, **kwds) + def suggest(self, *suggested): + suggested = [ + space.transform(x) for x, space in zip(suggested, self.dimensions) + ] + self.opt.suggest(*suggested) def ask(self): tmp = self.opt.ask() @@ -50,9 +53,9 @@ def ask(self): def tell(self, suggested: Sequence, value: Any): self._all_x.append(suggested) self._all_y.append(value) - suggested = [ + suggested = tuple([ space.transform(x) for x, space in zip(suggested, self.dimensions) - ] + ]) # self.opt.suggest(*suggested) # x = self.opt.ask() x = self.instrum.spawn_child(new_value=(suggested, {})) diff --git a/qulab/scan/scan.py b/qulab/scan/scan.py index e0e7394c..922032a6 100644 --- a/qulab/scan/scan.py +++ b/qulab/scan/scan.py @@ -481,7 +481,8 @@ def search(self, elif isinstance(space, OptimizeSpace): space.name = name space.optimizer.dimensions[name] = space.space - space.optimizer.suggestions[name] = space.suggestions + if space.suggestions: + space.optimizer.suggestions[name] = space.suggestions self._add_search_space(name, space.optimizer.level, space) self.add_depends(space.optimizer.name, [name]) else: diff --git a/qulab/scan/space.py b/qulab/scan/space.py index 6da81560..d56d697c 100644 --- a/qulab/scan/space.py +++ b/qulab/scan/space.py @@ -1,3 +1,4 @@ +import itertools from typing import Type import numpy as np @@ -107,6 +108,9 @@ def __init__(self, optimizer: 'Optimizer', space, suggestions=None): self.optimizer = optimizer self.space = space self.name = None + if suggestions is not None and not isinstance( + suggestions, (list, tuple, np.ndarray)): + suggestions = [suggestions] self.suggestions = suggestions def __len__(self): @@ -135,8 +139,17 @@ def __init__(self, def create(self): opt = self.method(list(self.dimensions.values()), **self.kwds) - for suggestion in zip([self.suggestions[key] for key in self.dimensions]): - opt.suggest(*suggestion) + + def rvs(space): + while True: + yield space.rvs()[0] + + if self.suggestions: + for suggestion in zip(*[ + self.suggestions.get(key, rvs(space)) + for key, space in self.dimensions.items() + ]): + opt.suggest(*suggestion) return opt def Categorical(self,