Source code for axisfuzzy.fuzzifier.registry

#  Copyright (c) yibocat 2025 All Rights Reserved
#  Python: 3.12.7
#  Date: 2025/8/18 23:34
#  Author: yibow
#  Email: yibocat@yeah.net
#  Software: AxisFuzzy
from typing import Dict, Tuple, Type, Optional, List

from .strategy import FuzzificationStrategy


[docs] class FuzzificationStrategyRegistry: def __init__(self): # Strategy Registry: {(mtype, method): strategy_class} self._strategies: Dict[Tuple[str, str], Type[FuzzificationStrategy]] = {} self._default_methods: Dict[str, str] = {}
[docs] def register(self, mtype: str, method: str, strategy_cls: Type[FuzzificationStrategy], is_default: bool = False) -> None: """ Register a new fuzzification strategy. Args: mtype: The type of fuzzy number (e.g., 'qrofn'). method: The name of the strategy (e.g., 'expert', 'hesitation'). strategy_cls: The class implementing the strategy. is_default: Whether this should be the default method for the mtype. """ if not issubclass(strategy_cls, FuzzificationStrategy): raise TypeError(f"Registered strategy class must be a subclass of FuzzificationStrategy, " f"got {strategy_cls}") key = (mtype, method) if key in self._strategies: raise ValueError(f"Strategy for {key} is already registered.") self._strategies[key] = strategy_cls if is_default or mtype not in self._default_methods: self._default_methods[mtype] = method
[docs] def get_strategy(self, mtype: str, method: Optional[str] = None) -> Optional[Type[FuzzificationStrategy]]: if method is None: method = self.get_default_method(mtype) if method is None: return None return self._strategies.get((mtype, method))
[docs] def list_strategies(self, mtype: Optional[str] = None) -> List[Tuple[str, str]]: if mtype is None: return list(self._strategies.keys()) else: return [(mt, method) for mt, method in self._strategies.keys() if mt == mtype]
[docs] def get_available_mtypes(self) -> List[str]: """获取所有支持的模糊数类型""" return list(set(mtype for mtype, _ in self._strategies.keys()))
[docs] def get_available_methods(self, mtype: str) -> List[str]: """获取指定模糊数类型的所有可用方法""" return [method for mt, method in self._strategies.keys() if mt == mtype]
[docs] def get_default_method(self, mtype: str) -> Optional[str]: """获取指定模糊数类型的默认方法""" return self._default_methods.get(mtype)
[docs] def get_registry_info(self) -> Dict[str, any]: """获取注册表的详细信息""" return { 'total_strategies': len(self._strategies), 'supported_mtypes': self.get_available_mtypes(), 'default_methods': self._default_methods.copy(), 'strategies': { f"{mtype}.{method}": strategy_class.__name__ for (mtype, method), strategy_class in self._strategies.items() } }
_registry = FuzzificationStrategyRegistry()
[docs] def get_registry_fuzzify() -> FuzzificationStrategyRegistry: """获取全局模糊化注册表实例""" return _registry
[docs] def register_fuzzifier(is_default: bool = False): def decorator(strategy_cls: Type[FuzzificationStrategy]): get_registry_fuzzify().register( mtype=strategy_cls.mtype, method=strategy_cls.method, strategy_cls=strategy_cls, is_default=is_default ) return strategy_cls return decorator