Source code for pyod.utils.knowledge

# -*- coding: utf-8 -*-
"""Knowledge base for PyOD's intelligent agent layer.

Loads structured JSON files containing algorithm metadata,
benchmark results, routing rules, and paper citations.
"""
# Author: Yue Zhao <yzhao062@gmail.com>
# License: BSD 2 clause

import json
import os


[docs] class KnowledgeBase: """Loader and accessor for PyOD's structured knowledge base. Reads JSON files from the knowledge directory and provides query methods for algorithm metadata, benchmarks, and routing. Parameters ---------- knowledge_dir : str or None Path to knowledge directory. If None, uses the bundled directory shipped with PyOD. """ def __init__(self, knowledge_dir=None): if knowledge_dir is None: knowledge_dir = os.path.dirname(__file__) self._dir = knowledge_dir self._algorithms = None self._benchmarks = None self._routing_rules = None self._papers = None def _load_json(self, filename): path = os.path.join(self._dir, filename) with open(path, 'r', encoding='utf-8') as f: return json.load(f) @property def algorithms(self): if self._algorithms is None: self._algorithms = self._load_json('algorithms.json') return self._algorithms @property def benchmarks(self): if self._benchmarks is None: self._benchmarks = self._load_json('benchmarks.json') return self._benchmarks @property def routing_rules(self): if self._routing_rules is None: self._routing_rules = self._load_json('routing_rules.json') return self._routing_rules @property def papers(self): if self._papers is None: self._papers = self._load_json('papers.json') return self._papers
[docs] def get_algorithm(self, name): """Get algorithm metadata by name. Returns None if not found.""" return self.algorithms.get(name)
[docs] def list_by_data_type(self, data_type, status='shipped'): """List algorithms supporting a given data type.""" results = [] for name, entry in self.algorithms.items(): if data_type in entry.get('data_types', []): if status == 'all' or entry.get('status') == status: results.append({'name': name, **entry}) return results
[docs] def list_by_status(self, status): """List algorithms with a given status.""" results = [] for name, entry in self.algorithms.items(): if entry.get('status') == status: results.append({'name': name, **entry}) return results