Source code for domid.algos.zoo_algos
"""
chain of responsibility pattern for algorithm selection
"""
from domainlab.utils.u_import import import_path
from domid.algos.builder_ae import NodeAlgoBuilderAE
from domid.algos.builder_dec import NodeAlgoBuilderDEC
from domid.algos.builder_m2yd import NodeAlgoBuilderM2YD
from domid.algos.builder_sdcn import NodeAlgoBuilderSDCN
from domid.algos.builder_vade import NodeAlgoBuilderVaDE
[docs]class AlgoBuilderChainNodeGetter:
"""
1. Hardcoded chain
3. Return selected node
"""
[docs] def __init__(self, model, apath):
self.model = model
self.apath = apath
#
self._list_str_model = model.split("_")
self.model = self._list_str_model.pop(0)
[docs] def register_external_node(self, chain):
"""
if the user specify an external python file to implement the algorithm
"""
if self.apath is None:
return chain
node_module = import_path(self.apath)
node_fun = node_module.get_node_na()
newchain = node_fun(chain)
return newchain
def __call__(self):
"""
1. construct the chain, filter out responsible node, create heavy-weight business object
2. hard code seems to be the best solution
"""
chain = NodeAlgoBuilderSDCN(None)
chain = NodeAlgoBuilderDEC(chain)
chain = NodeAlgoBuilderVaDE(chain)
chain = NodeAlgoBuilderAE(chain)
chain = NodeAlgoBuilderM2YD(chain)
chain = self.register_external_node(chain)
node = chain.handle(self.model)
head = node
while self._list_str_model:
self.model = self._list_str_model.pop(0)
node2decorate = self.__call__()
head.extend(node2decorate)
head = node2decorate
return node