Files
cleveragents-core/benchmarks/uko_load_bench.py
T
khyari hamza ad53a659de
CI / lint (pull_request) Successful in 14s
CI / quality (pull_request) Successful in 15s
CI / security (pull_request) Successful in 30s
CI / typecheck (pull_request) Successful in 35s
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 14s
CI / unit_tests (pull_request) Successful in 2m8s
CI / integration_tests (pull_request) Successful in 3m36s
CI / docker (pull_request) Successful in 39s
CI / coverage (pull_request) Successful in 5m19s
CI / lint (push) Successful in 14s
CI / typecheck (push) Successful in 49s
CI / quality (push) Successful in 16s
CI / security (push) Successful in 1m15s
CI / build (push) Successful in 14s
CI / unit_tests (push) Successful in 3m25s
CI / integration_tests (push) Successful in 4m53s
CI / benchmark-regression (push) Has been skipped
CI / coverage (push) Successful in 6m6s
CI / benchmark-publish (push) Successful in 15m16s
CI / docker (push) Successful in 39s
CI / benchmark-regression (pull_request) Successful in 34m22s
feat(uko): add UKO ontology scaffolding
Add UKO Layer 0-3 ontology skeleton (RDF/TTL) with base URI, version IRI,
and prefix conventions. Python loaders handle URI parsing, inheritance
resolution, versioning metadata, and validation of undefined prefixes and
missing rdf:type. Includes Behave BDD scenarios, Robot Framework integration
tests, ASV benchmarks, and reference documentation.

- Resolve rdfs:domain and rdfs:range values to full URIs in parser
- Fix type: ignore in Robot helper with proper Callable typing
- Export UKO models from core/__init__.py
- Add parent-URI existence validation in validate()
- Rename scenario to clarify parser-skips vs validation-rejects
- Add scenario testing validation with injected typeless node
- Add Scenario Outline for multi-layer node count assertions

- TTL: Layer 0 classes (InformationUnit, Container, Atom, Annotation,
  Boundary) with contains/references/dependsOn properties. Layer 1
  uko-code: classes (Module, Callable, TypeDefinition, TestCase, Import)
  with hasReturnType/hasParameters/testsCallable. Layer 2 uko-oo: classes
  (Class, Interface, Method, Attribute) with inheritsFrom/implements and
  rdfs:subPropertyOf. New URI scheme cleveragents.ai/ontology/uko#.
- TTL: uko-oo:Class has dual rdfs:subClassOf (TypeDefinition + Container),
  uko-oo:Interface has dual rdfs:subClassOf (TypeDefinition + Boundary).
- Model: UKONode.parent_uri replaced with parent_uris: tuple[str, ...]
  to support multi-parent rdfs:subClassOf.
- Loader: prefix regex supports hyphenated names (uko-code, uko-oo).
  Semantic domain prefix maps (_LAYER_PREFIXES, _LAYER_IRI_PREFIXES).
  Comma-separated rdfs:subClassOf parsing. rdfs:domain/range/subPropertyOf
  URI resolution. BFS DAG traversal with DFS cycle detection for
  resolve_inheritance. HTTP URI skip in validation (D-1 fix). Duplicate
  error guard (B-1 fix). Consistent quoting (M-1 fix).
- Services __init__: export UKOLoader and UKOValidationError.
- Tests: 24 Behave scenarios (multi-parent, domain/range resolution,
  non-existent parent validation). 4 Robot smoke tests. Consolidated
  context attributes (T-3 fix).
- Docs: uko.md written for spec-aligned structure.

- Namespace prefix match in parent-URI validation includes a
delimiter guard (# or /) preventing false positives on URIs that share
the UKO prefix string (e.g. ukobogus:, ukoo:).

ISSUES CLOSED: #189
2026-03-04 22:40:34 +00:00

81 lines
2.3 KiB
Python

"""ASV benchmarks for UKO ontology loader performance.
Suites:
- UKOLoadSuite: time_load_ttl, time_parse_prefixes, time_parse_nodes
- UKOValidationSuite: time_validate_ontology, time_resolve_inheritance
- UKOLayerSuite: time_get_layer_0, time_get_layer_3
"""
from __future__ import annotations
import importlib
import sys
from pathlib import Path
_SRC = str(Path(__file__).resolve().parents[1] / "src")
if _SRC not in sys.path:
sys.path.insert(0, _SRC)
import cleveragents # noqa: E402
importlib.reload(cleveragents)
from cleveragents.application.services.uko_loader import UKOLoader # noqa: E402
_TTL_PATH = Path(__file__).resolve().parents[1] / "docs" / "ontology" / "uko.ttl"
_TTL_TEXT = _TTL_PATH.read_text(encoding="utf-8")
class UKOLoadSuite:
"""Benchmark TTL loading and parsing throughput."""
def setup(self) -> None:
self.loader = UKOLoader()
def time_load_ttl(self) -> None:
"""Benchmark loading uko.ttl from disk."""
self.loader.load(_TTL_PATH)
def time_parse_prefixes(self) -> None:
"""Benchmark prefix-line parsing."""
self.loader._parse_prefixes(_TTL_TEXT)
def time_parse_nodes(self) -> None:
"""Benchmark full string parsing."""
self.loader.load_from_string(_TTL_TEXT)
class UKOValidationSuite:
"""Benchmark validation and inheritance resolution."""
def setup(self) -> None:
self.loader = UKOLoader()
self.ontology = self.loader.load(_TTL_PATH)
def time_validate_ontology(self) -> None:
"""Benchmark ontology validation."""
self.loader.validate(self.ontology)
def time_resolve_inheritance(self) -> None:
"""Benchmark uko-oo:Class inheritance chain resolution."""
self.loader.resolve_inheritance(
self.ontology,
"https://cleveragents.ai/ontology/uko/oo#Class",
)
class UKOLayerSuite:
"""Benchmark layer-filtered node retrieval."""
def setup(self) -> None:
self.loader = UKOLoader()
self.ontology = self.loader.load(_TTL_PATH)
def time_get_layer_0(self) -> None:
"""Benchmark Layer 0 node retrieval."""
self.loader.get_layer_nodes(self.ontology, 0)
def time_get_layer_3(self) -> None:
"""Benchmark Layer 3 node retrieval."""
self.loader.get_layer_nodes(self.ontology, 3)