Compute cardinality for loguniform with precision #635
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
[Fixes #633]
Why:
With loguniform the number of possible values is limited if precision is
used. Cardinality computation should account for this otherwise
algorithms may get stuck in suggest(). It happened to a user with a
prior loguniform(1e-4, 1e-2, precision=2). This gives only 181 possible
values.
How:
If real dimension has precision and prior loguniform, then compute
cardinality.
There is a problem with transformed space however. A linearized
dimension for instance would attempt to compute the cardinality with the
linearized bounds. What matters is the smallest cardinality between the
transformed space and the original space. The only case where
cardinality is smaller in transformed space is when real values are
discretized. Therefore, we only compute cardinality of transformed
dimensions if transformation lead to integer, otherwise we use the
cardinality of the original dimension.
Also: Add single executor for debugging
We cannot use python debugger (or pytest.set_trace()) during the
execution of the workers with joblib backend. We should have a simple
executor backend that is not using multithreading or multi-processing to
enable simple debugging. Also, since client's
workon()
helper functiondoes not support parallelism, it should use this simple executor.
How:
Use functools.partial to wrap submitted functions for future execution.