# Path: sacred/utils.py
# class MissingConfigError(SacredError):
#     """A config value that is needed by a captured function is not present in the provided config."""
# 
#     def __init__(
#         self,
#         message="Configuration values are missing:",
#         missing_configs=(),
#         print_traceback=False,
#         filter_traceback="default",
#         print_usage=True,
#     ):
#         message = "{} {}".format(message, missing_configs)
#         super().__init__(
#             message,
#             print_traceback=print_traceback,
#             filter_traceback=filter_traceback,
#             print_usage=print_usage,
#         )
# 
# class SignatureError(SacredError, TypeError):
#     """Error that is raised when the passed arguments do not match the functions signature."""
# 
#     def __init__(
#         self,
#         message,
#         print_traceback=True,
#         filter_traceback="always",
#         print_usage=False,
#     ):
#         super().__init__(message, print_traceback, filter_traceback, print_usage)


import inspect
from inspect import Parameter
from collections import OrderedDict
from sacred.utils import MissingConfigError, SignatureError
        unexpected_kwargs = set(kwargs) - set(expected_args)
        if unexpected_kwargs:
            raise SignatureError(
                "{} got unexpected kwarg(s): {}".format(
                    self.name, sorted(unexpected_kwargs)
                )
            )

    def _assert_no_duplicate_args(self, expected_args, args, kwargs):
        positional_arguments = expected_args[: len(args)]
        duplicate_arguments = [v for v in positional_arguments if v in kwargs]
        if duplicate_arguments:
            raise SignatureError(
                "{} got multiple values for argument(s) {}".format(
                    self.name, duplicate_arguments
                )
            )

    def _fill_in_options(self, args, kwargs, options, bound):
        free_params = self.get_free_parameters(args, kwargs, bound)
        new_kwargs = dict(kwargs) if free_params else kwargs
        for param in free_params:
            if param in options:
                new_kwargs[param] = options[param]
        return args, new_kwargs

    def _assert_no_missing_args(self, args, kwargs, bound):
        free_params = self.get_free_parameters(args, kwargs, bound)
        missing_args = [m for m in free_params if m not in self.kwargs]
        if missing_args:

# Path: sacred/utils.py
# class MissingConfigError(SacredError):
#     """A config value that is needed by a captured function is not present in the provided config."""
# 
#     def __init__(
#         self,
#         message="Configuration values are missing:",
#         missing_configs=(),
#         print_traceback=False,
#         filter_traceback="default",
#         print_usage=True,
#     ):
#         message = "{} {}".format(message, missing_configs)
#         super().__init__(
#             message,
#             print_traceback=print_traceback,
#             filter_traceback=filter_traceback,
#             print_usage=print_usage,
#         )
# 
# class SignatureError(SacredError, TypeError):
#     """Error that is raised when the passed arguments do not match the functions signature."""
# 
#     def __init__(
#         self,
#         message,
#         print_traceback=True,
#         filter_traceback="always",
#         print_usage=False,
#     ):
#         super().__init__(message, print_traceback, filter_traceback, print_usage)


# Path: sacred/config/signature.py
import inspect
from inspect import Parameter
from collections import OrderedDict
from sacred.utils import MissingConfigError, SignatureError

        unexpected_kwargs = set(kwargs) - set(expected_args)
        if unexpected_kwargs:
            raise SignatureError(
                "{} got unexpected kwarg(s): {}".format(
                    self.name, sorted(unexpected_kwargs)
                )
            )

    def _assert_no_duplicate_args(self, expected_args, args, kwargs):
        positional_arguments = expected_args[: len(args)]
        duplicate_arguments = [v for v in positional_arguments if v in kwargs]
        if duplicate_arguments:
            raise SignatureError(
                "{} got multiple values for argument(s) {}".format(
                    self.name, duplicate_arguments
                )
            )

    def _fill_in_options(self, args, kwargs, options, bound):
        free_params = self.get_free_parameters(args, kwargs, bound)
        new_kwargs = dict(kwargs) if free_params else kwargs
        for param in free_params:
            if param in options:
                new_kwargs[param] = options[param]
        return args, new_kwargs

    def _assert_no_missing_args(self, args, kwargs, bound):
        free_params = self.get_free_parameters(args, kwargs, bound)
        missing_args = [m for m in free_params if m not in self.kwargs]
        if missing_args:

            raise MissingConfigError(