__init__.py
1 # -*- coding: utf-8 -*- 2 """Knowledge base for PyOD's intelligent agent layer. 3 4 Loads structured JSON files containing algorithm metadata, 5 benchmark results, routing rules, and paper citations. 6 """ 7 # Author: Yue Zhao <yzhao062@gmail.com> 8 # License: BSD 2 clause 9 10 import json 11 import os 12 13 14 class KnowledgeBase: 15 """Loader and accessor for PyOD's structured knowledge base. 16 17 Reads JSON files from the knowledge directory and provides 18 query methods for algorithm metadata, benchmarks, and routing. 19 20 Parameters 21 ---------- 22 knowledge_dir : str or None 23 Path to knowledge directory. If None, uses the bundled 24 directory shipped with PyOD. 25 """ 26 27 def __init__(self, knowledge_dir=None): 28 if knowledge_dir is None: 29 knowledge_dir = os.path.dirname(__file__) 30 self._dir = knowledge_dir 31 self._algorithms = None 32 self._benchmarks = None 33 self._routing_rules = None 34 self._papers = None 35 36 def _load_json(self, filename): 37 path = os.path.join(self._dir, filename) 38 with open(path, 'r', encoding='utf-8') as f: 39 return json.load(f) 40 41 @property 42 def algorithms(self): 43 if self._algorithms is None: 44 self._algorithms = self._load_json('algorithms.json') 45 return self._algorithms 46 47 @property 48 def benchmarks(self): 49 if self._benchmarks is None: 50 self._benchmarks = self._load_json('benchmarks.json') 51 return self._benchmarks 52 53 @property 54 def routing_rules(self): 55 if self._routing_rules is None: 56 self._routing_rules = self._load_json('routing_rules.json') 57 return self._routing_rules 58 59 @property 60 def papers(self): 61 if self._papers is None: 62 self._papers = self._load_json('papers.json') 63 return self._papers 64 65 def get_algorithm(self, name): 66 """Get algorithm metadata by name. Returns None if not found.""" 67 return self.algorithms.get(name) 68 69 def list_by_data_type(self, data_type, status='shipped'): 70 """List algorithms supporting a given data type.""" 71 results = [] 72 for name, entry in self.algorithms.items(): 73 if data_type in entry.get('data_types', []): 74 if status == 'all' or entry.get('status') == status: 75 results.append({'name': name, **entry}) 76 return results 77 78 def list_by_status(self, status): 79 """List algorithms with a given status.""" 80 results = [] 81 for name, entry in self.algorithms.items(): 82 if entry.get('status') == status: 83 results.append({'name': name, **entry}) 84 return results