# Path: lcs/representations/UBR.py
# class UBR:
#     """
#     Real-value representation for unordered-bounded values.
#     """
#     x1: int
#     x2: int
# 
#     @property
#     def lower_bound(self) -> int:
#         return min(self.x1, self.x2)
# 
#     @property
#     def upper_bound(self) -> int:
#         return max(self.x1, self.x2)
# 
#     @property
#     def bound_span(self) -> int:
#         return sum(1 for _ in range(self.lower_bound, self.upper_bound + 1))
# 
#     def incorporates(self, other: UBR) -> bool:
#         """
#         Checks whether current UBR incorporates other.
# 
#         Parameters
#         ----------
#         other: UBR
#             Other real-value representation
# 
#         Returns
#         -------
#         bool
#             True if `other` is contained in this UBR, False otherwise
#         """
#         return self.lower_bound <= other.lower_bound and \
#             self.upper_bound >= other.upper_bound
# 
#     def __contains__(self, item):
#         return self.lower_bound <= item <= self.upper_bound
# 
#     def __hash__(self):
#         return hash((self.lower_bound, self.upper_bound))
# 
#     def __eq__(self, o) -> bool:
#         return self.lower_bound == o.lower_bound \
#             and self.upper_bound == o.upper_bound


from typing import Callable, Optional
from lcs.representations import UBR
        self.gamma: float = kwargs.get('gamma', 0.95)
        self.theta_i: float = kwargs.get('theta_i', 0.1)
        self.theta_r: float = kwargs.get('theta_r', 0.9)
        self.epsilon: float = kwargs.get('epsilon', 0.5)
        self.biased_exploration: float = kwargs.get('biased_exploration', 0.5)

        # Max range of uniform noise distribution that can alter
        # the perception during covering U[0, cover_noise]
        self.cover_noise: float = kwargs.get('cover_noise', 0.1)
        self.u_max: int = kwargs.get('u_max', 100000)
        self.do_subsumption: bool = kwargs.get('do_subsumption', True)
        self.do_ga: bool = kwargs.get('do_ga', False)
        self.mu: float = kwargs.get('mu', 0.3)

        # Max range of uniform noise distribution that can broaden the
        # phenotype interval range.
        self.mutation_noise: float = kwargs.get('mutation_noise', 0.1)
        self.chi: float = kwargs.get('chi', 0.8)
        self.theta_exp: int = kwargs.get('theta_exp', 20)
        self.theta_ga: int = kwargs.get('theta_ga', 100)
        self.theta_as: int = kwargs.get('theta_as', 20)

        self.metrics_trial_frequency: int = kwargs.get(
            'metrics_trial_frequency', 5)
        self.user_metrics_collector_fcn: Optional[Callable] = kwargs.get(
            'user_metrics_collector_fcn', None)
        self.model_checkpoint_freq: Optional[int] = kwargs.get(
            'model_checkpoint_frequency', None)

        self.oktypes = (UBR,)

# Path: lcs/representations/UBR.py
# class UBR:
#     """
#     Real-value representation for unordered-bounded values.
#     """
#     x1: int
#     x2: int
# 
#     @property
#     def lower_bound(self) -> int:
#         return min(self.x1, self.x2)
# 
#     @property
#     def upper_bound(self) -> int:
#         return max(self.x1, self.x2)
# 
#     @property
#     def bound_span(self) -> int:
#         return sum(1 for _ in range(self.lower_bound, self.upper_bound + 1))
# 
#     def incorporates(self, other: UBR) -> bool:
#         """
#         Checks whether current UBR incorporates other.
# 
#         Parameters
#         ----------
#         other: UBR
#             Other real-value representation
# 
#         Returns
#         -------
#         bool
#             True if `other` is contained in this UBR, False otherwise
#         """
#         return self.lower_bound <= other.lower_bound and \
#             self.upper_bound >= other.upper_bound
# 
#     def __contains__(self, item):
#         return self.lower_bound <= item <= self.upper_bound
# 
#     def __hash__(self):
#         return hash((self.lower_bound, self.upper_bound))
# 
#     def __eq__(self, o) -> bool:
#         return self.lower_bound == o.lower_bound \
#             and self.upper_bound == o.upper_bound


# Path: lcs/agents/racs/Configuration.py
from typing import Callable, Optional
from lcs.representations import UBR

        self.gamma: float = kwargs.get('gamma', 0.95)
        self.theta_i: float = kwargs.get('theta_i', 0.1)
        self.theta_r: float = kwargs.get('theta_r', 0.9)
        self.epsilon: float = kwargs.get('epsilon', 0.5)
        self.biased_exploration: float = kwargs.get('biased_exploration', 0.5)

        # Max range of uniform noise distribution that can alter
        # the perception during covering U[0, cover_noise]
        self.cover_noise: float = kwargs.get('cover_noise', 0.1)
        self.u_max: int = kwargs.get('u_max', 100000)
        self.do_subsumption: bool = kwargs.get('do_subsumption', True)
        self.do_ga: bool = kwargs.get('do_ga', False)
        self.mu: float = kwargs.get('mu', 0.3)

        # Max range of uniform noise distribution that can broaden the
        # phenotype interval range.
        self.mutation_noise: float = kwargs.get('mutation_noise', 0.1)
        self.chi: float = kwargs.get('chi', 0.8)
        self.theta_exp: int = kwargs.get('theta_exp', 20)
        self.theta_ga: int = kwargs.get('theta_ga', 100)
        self.theta_as: int = kwargs.get('theta_as', 20)

        self.metrics_trial_frequency: int = kwargs.get(
            'metrics_trial_frequency', 5)
        self.user_metrics_collector_fcn: Optional[Callable] = kwargs.get(
            'user_metrics_collector_fcn', None)
        self.model_checkpoint_freq: Optional[int] = kwargs.get(
            'model_checkpoint_frequency', None)

        self.oktypes = (UBR,)

        self.classifier_wildcard = UBR(*self.encoder.range)