Skip to content
Draft
Show file tree
Hide file tree
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@ examples/simple.txt
experiments/*/
coverage.xml
.venv/
*.pyc
11 changes: 10 additions & 1 deletion experitur/configurators/skopt.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,17 @@ def convert_trial(
if include_duration:
result = (result, (time_end - time_start).total_seconds())

parameters = {k: v for k, v in parameters.items() if k in space}

missing_keys = set(space.keys()) - set(parameters.keys())

if missing_keys:
print(f"Parameters missing in {trial.id}: {sorted(missing_keys)}.")
return None

point = skopt.utils.point_aslist(
space, {k: v for k, v in parameters.items() if k in space},
space,
parameters,
)

return (point, result)
Expand Down
55 changes: 55 additions & 0 deletions experitur/core/configurators.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from typing_extensions import final

from experitur.helpers.merge_dicts import merge_dicts
import fnmatch


class BaseConfigurationSampler(metaclass=ABCMeta):
Expand Down Expand Up @@ -477,6 +478,60 @@ def sample(self, exclude: Optional[Set] = None) -> Iterator[Mapping]:
yield merge_dicts(parent_configuration, parameters=values)


class Reset(Configurator):
"""
Reset parameters to unspecified.

Parameters:
names: The parameters to be reset.

Example:
.. code-block:: python

from experitur import Experiment, Trial
from experitur.configurators import Const, Reset

@Const({"a": 1, "b": 2}, c=3)
@Reset("c")
@Experiment()
def example1(parameters: Trial):
# Raises: KeyError("c")
print(parameters["a"], parameters["b"], parameters["c"])
"""

__str_attrs__ = ("values",)

def __init__(self, *names):
self.names = names

@property
def parameter_values(self) -> Mapping[str, Container]:
return {}

class _Sampler(ConfigurationSampler):
configurator: "Reset"

def sample(self, exclude: Optional[Set] = None) -> Iterator[Mapping]:

for parent_configuration in self.parent.sample(exclude=exclude):
parent_configuration = parent_configuration.copy()

parent_configuration["parameters"] = {
k: v
for k, v in parent_configuration["parameters"].items()
if not self._matches(k)
}

yield parent_configuration

def _matches(self, k):
for n in self.configurator.names:
if fnmatch.fnmatch(k, n):
return True

return False


class ZeroConfigurator(Configurator):
"""
Empty parameter configurator.
Expand Down
17 changes: 16 additions & 1 deletion experitur/core/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,10 @@ class Context:
}

def __init__(
self, wdir: str = None, config: Optional[Mapping] = None, writable: bool = False
self,
wdir: Optional[str] = None,
config: Optional[Mapping] = None,
writable: bool = False,
):
self.registered_experiments = []

Expand Down Expand Up @@ -158,6 +161,18 @@ def run(self, experiments=None):
# Clear stop
self.stop(False)

@contextlib.contextmanager
def config_context(self, config: Optional[Mapping] = None, **kwargs):
if config is None:
config = {}

old_config = self.config.copy()
self.config = {**self.config, **config, **kwargs}

yield self

self.config = old_config

def collect(self, results_fn: Union[str, Path], failed=False):
"""
Collect the results of all trials in this context.
Expand Down
10 changes: 9 additions & 1 deletion experitur/core/trial.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@


def _get_object_name(obj):
if obj is None:
return "None"

try:
return obj.__name__
except AttributeError:
Expand Down Expand Up @@ -640,7 +643,12 @@ def choice(

entry_name = self[parameter_name]

return mapping[entry_name]
try:
return mapping[entry_name]
except KeyError:
raise ValueError(
f"Unknown option {entry_name!r}. Options are: {sorted(mapping.keys())!r}"
)

# TODO: Rework logging: channels, log to storage, ...
def log(self, values=None, **kwargs):
Expand Down
Loading