Source code for ontolearn.learners.ocel

# -----------------------------------------------------------------------------
# MIT License
#
# Copyright (c) 2024 Ontolearn Team
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
# -----------------------------------------------------------------------------

from .celoe import CELOE
from typing import Optional
import owlapy
from ..abstracts import AbstractScorer, BaseRefinement, AbstractHeuristic, AbstractKnowledgeBase
from ..search import OENode, LBLNode
from owlapy.class_expression import OWLClassExpression
from ..heuristics import OCELHeuristic
from ..utils.static_funcs import concept_len


[docs] class OCEL(CELOE): """A limited version of CELOE. Attributes: best_descriptions (EvaluatedDescriptionSet[OENode, QualityOrderedNode]): Best hypotheses ordered. best_only (bool): If False pick only nodes with quality < 1.0, else pick without quality restrictions. calculate_min_max (bool): Calculate minimum and maximum horizontal expansion? Statistical purpose only. heuristic_func (AbstractHeuristic): Function to guide the search heuristic. heuristic_queue (SortedSet[OENode]): A sorted set that compares the nodes based on Heuristic. iter_bound (int): Limit to stop the algorithm after n refinement steps are done. kb (AbstractKnowledgeBase): The knowledge base that the concept learner is using. max_child_length (int): Limit the length of concepts generated by the refinement operator. max_he (int): Maximal value of horizontal expansion. max_num_of_concepts_tested (int) Limit to stop the algorithm after n concepts tested. max_runtime (int): Limit to stop the algorithm after n seconds. min_he (int): Minimal value of horizontal expansion. name (str): Name of the model = 'ocel_python'. _number_of_tested_concepts (int): Yes, you got it. This stores the number of tested concepts. operator (BaseRefinement): Operator used to generate refinements. quality_func (AbstractScorer) The quality function to be used. reasoner (AbstractOWLReasoner): The reasoner that this model is using. search_tree (Dict[OWLClassExpression, TreeNode[OENode]]): Dict to store the TreeNode for a class expression. start_class (OWLClassExpression): The starting class expression for the refinement operation. start_time (float): The time when :meth:`fit` starts the execution. Used to calculate the total time :meth:`fit` takes to execute. terminate_on_goal (bool): Whether to stop the algorithm if a perfect solution is found. """ __slots__ = () name = 'ocel_python' def __init__(self, knowledge_base: AbstractKnowledgeBase, reasoner: Optional[owlapy.abstracts.AbstractOWLReasoner] = None, refinement_operator: Optional[BaseRefinement[OENode]] = None, quality_func: Optional[AbstractScorer] = None, heuristic_func: Optional[AbstractHeuristic] = None, terminate_on_goal: Optional[bool] = None, iter_bound: Optional[int] = None, max_num_of_concepts_tested: Optional[int] = None, max_runtime: Optional[int] = None, max_results: int = 10, best_only: bool = False, calculate_min_max: bool = True): """ Create a new instance of OCEL. Args: best_only (bool): If False pick only nodes with quality < 1.0, else pick without quality restrictions. Defaults to False. calculate_min_max (bool): Calculate minimum and maximum horizontal expansion? Statistical purpose only. Defaults to True. refinement_operator (BaseRefinement[OENode]): Operator used to generate refinements. Defaults to `ModifiedCELOERefinement`. heuristic_func (AbstractHeuristic): Function to guide the search heuristic. Defaults to `OCELHeuristic`. iter_bound (int): Limit to stop the algorithm after n refinement steps are done. Defaults to 10'000. knowledge_base (AbstractKnowledgeBase): The knowledge base that the concept learner is using. max_num_of_concepts_tested (int) Limit to stop the algorithm after n concepts tested. Defaults to 10'000. max_runtime (int): Limit to stop the algorithm after n seconds. Defaults to 5. max_results (int): Maximum hypothesis to store. Defaults to 10. quality_func (AbstractScorer) The quality function to be used. Defaults to `F1`. reasoner (AbstractOWLReasoner): Optionally use a different reasoner. If reasoner=None, the reasoner of the :attr:`knowledge_base` is used. terminate_on_goal (bool): Whether to stop the algorithm if a perfect solution is found. Defaults to True. """ if heuristic_func is None: heuristic_func = OCELHeuristic() super().__init__(knowledge_base=knowledge_base, reasoner=reasoner, refinement_operator=refinement_operator, quality_func=quality_func, heuristic_func=heuristic_func, terminate_on_goal=terminate_on_goal, iter_bound=iter_bound, max_num_of_concepts_tested=max_num_of_concepts_tested, max_runtime=max_runtime, max_results=max_results, best_only=best_only, calculate_min_max=calculate_min_max)
[docs] def make_node(self, c: OWLClassExpression, parent_node: Optional[OENode] = None, is_root: bool = False) -> OENode: """ Create a node for OCEL. Args: c: The class expression of this node. parent_node: Parent node. is_root: Is this the root node? Returns: OENode: The node. """ assert parent_node is None or isinstance(parent_node, LBLNode) r = LBLNode(c, concept_len(c), self.kb.individuals_set(c), parent_node=parent_node, is_root=is_root) if parent_node is not None: parent_node.add_child(r) return r