/ pyod / utils / knowledge / __init__.py
__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