-
Notifications
You must be signed in to change notification settings - Fork 0
/
registry.py
71 lines (63 loc) · 3.2 KB
/
registry.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
from __future__ import annotations
from typing import Mapping
from logikon.analysts.base import AbstractArtifactAnalyst, AbstractScoreAnalyst, Analyst
from logikon.analysts.export.htmlsunburst_exporter import HTMLSunburstExporter
from logikon.analysts.export.networkx_exporter import RelevanceNetworkNXExporter
from logikon.analysts.export.svgmap_exporter import SVGMapExporter
from logikon.analysts.reconstruction.fuzzy_argmap_builder import FuzzyArgMapBuilder
from logikon.analysts.reconstruction.issue_builder_lmql import IssueBuilderLMQL
from logikon.analysts.reconstruction.pros_cons_builder_lmql import ProsConsBuilderLMQL
from logikon.analysts.reconstruction.relevance_network_builder_lmql import RelevanceNetworkBuilderLMQL
from logikon.analysts.score.argmap_graph_scores import (
ArgMapGraphAttackRatioScorer,
ArgMapGraphAvgKatzCScorer,
ArgMapGraphSizeScorer,
ArgMapRootCountScorer,
MeanReasonStrengthScorer,
)
from logikon.analysts.score.balance_scores import (
GlobalBalanceScorer,
MeanAbsRootSupportScorer,
MeanRootSupportScorer,
)
# TODO: set up a product registry for storing product_kw/product_cls mapping
# First class is treated as default analyst
_ANALYST_REGISTRY: Mapping[str, list[type[Analyst]]] = {
"issue": [IssueBuilderLMQL],
"proscons": [ProsConsBuilderLMQL],
"relevance_network": [RelevanceNetworkBuilderLMQL],
"relevance_network_nx": [RelevanceNetworkNXExporter],
"fuzzy_argmap_nx": [FuzzyArgMapBuilder],
"svg_argmap": [SVGMapExporter],
"html_sunburst": [HTMLSunburstExporter],
"argmap_size": [ArgMapGraphSizeScorer],
"n_root_nodes": [ArgMapRootCountScorer],
"argmap_avg_katz_centrality": [ArgMapGraphAvgKatzCScorer],
"argmap_attack_ratio": [ArgMapGraphAttackRatioScorer],
"mean_root_support": [MeanRootSupportScorer],
"mean_absolute_root_support": [MeanAbsRootSupportScorer],
"global_balance": [GlobalBalanceScorer],
"mean_reason_strength": [MeanReasonStrengthScorer],
}
def get_analyst_registry() -> Mapping[str, list[type[Analyst]]]:
"""Get the analyst registry."""
# sanity checks
for keyword, analysts in _ANALYST_REGISTRY.items():
if not analysts:
msg = f"No analysts registered for {keyword}."
raise ValueError(msg)
if not all(issubclass(d, Analyst) for d in analysts):
msg = f"Not all analysts registered for {keyword} are subclasses of Analyst."
raise ValueError(msg)
if not all(d.get_product() == keyword for d in analysts):
msg = f"Not all analysts registered for {keyword} have the correct product type."
raise ValueError(msg)
if issubclass(analysts[0], AbstractArtifactAnalyst):
if not all(issubclass(d, AbstractArtifactAnalyst) for d in analysts):
msg = f"Not all analysts registered for {keyword} are subclasses of AbstractArtifactAnalyst."
raise ValueError(msg)
if issubclass(analysts[0], AbstractScoreAnalyst):
if not all(issubclass(d, AbstractScoreAnalyst) for d in analysts):
msg = f"Not all analysts registered for {keyword} are subclasses of AbstractScoreAnalyst."
raise ValueError(msg)
return _ANALYST_REGISTRY