def _init_fixed_and_search_params(
        cls, config: dict[str, Any], default_config: dict[str, PassConfigParam]
    ) -> tuple[dict[str, Any], dict[str, SearchParameter]]:
        """Get the fixed and search parameters from the config."""
        param_order = order_search_parameters(config)

        # fixed parameters
        fixed_params = {}
        search_space = {}
        for key in param_order:
            value = config[key]
            if isinstance(value, SearchParameter):
                # resolve conditional parameters
                # if categorical with single choice, use that choice directly
                value = cls._resolve_search_parameter(value, fixed_params)
            if value == SpecialParamValue.INVALID:
                # TODO(jambayk): better error message, e.g. what the parent values were, how it was invalid
                raise ValueError(
                    f"Invalid value for parameter '{key}'. Either the parameter or its parents are not fixed."
                )
            if isinstance(value, SearchParameter):
                search_space[key] = value
            else:
                if (
                    default_config[key].category == ParamCategory.PATH
                    and value is not None
                    and not isinstance(value, ResourcePath)
                ):
                    value = str(Path(value).resolve())
                fixed_params[key] = value
        assert not cyclic_search_space(search_space), "Search space is cyclic."
        return fixed_params, search_space
Get the fixed and search parameters from the config.
olive/passes/olive_pass.py