Source code for brica1.module

# -*- coding: utf-8 -*-

"""
module.py
=====

This module contains the class `Module` and `Agent` which serve
as abstractions for distict areas in the brain or sub-regions of those areas.
`Module`s together with `Component`s are collectively reffered to as `Unit`s.

"""

__all__ = ["Module", "Agent"]

# BriCA imports
from .component import Component
from .unit import Unit


[docs]class Module(Unit): """ A `Module` may not have an implementation and may only exchange `numpy.ndarray` of the type `numpy.short` through in/out ports with another module. """ def __init__(self): """ Create a new `Module` instance. Args: None. Returns: Module: a new `Module` instance. """ super(Module, self).__init__() self.components = {} self.submodules = {}
[docs] def add_submodule(self, id, submodule): """ Add a `Module` to this `Module`. Args: id (str): a string ID. submodule (Module): a module to add for `id`. Returns: None. """ if not isinstance(submodule, Module): raise AssertionError("Not a Module instance") return if id in self.components: raise LookupError("There is already a component of the same name") return self.submodules[id] = submodule
[docs] def get_submodule(self, id): """ Get a `Module` for a given `id`. Args: id (str): a string ID. Returns: Module: a module for the given `id`. """ array = id.split(".") head = array.pop(0) child = self.submodules[head] if len(array) == 0: return child return child.get_submodule(".".join(array))
[docs] def get_all_submodules(self): """ Get all `Module`s recursively. Args: None. Returns: array: a array of all `Module`s. """ array = list(self.submodules.values()) for submodule in array: array.extend(submodule.get_all_submodules()) return list(set(array))
[docs] def remove_submodule(self, id): """ Remove a module from this `Module`. Args: id (str): a string ID. Returns: None. """ del self.submodules[id]
[docs] def add_component(self, id, component): """ Add a `Component` to this `Module`. Args: id (str): a string ID. component (Component): a component to add for `id`. Returns: None. """ if not isinstance(component, Component): raise AssertionError("Not a Component instance") return if id in self.submodules: raise LookupError("There is already a submodule of the same name") return self.components[id] = component
[docs] def get_component(self, id): """ Get a `Component` for a given `id`. Args: id (str): a string ID. Returns: Component: a component for the given `id`. """ return self.components[id]
[docs] def get_all_components(self): """ Get all `Component`s of all `Module`s. Args: None. Returns: array: a array of all `Component`s. """ array = list(self.components.values()) for submodule in self.get_all_submodules(): array.extend(submodule.get_all_components()) return list(set(array))
[docs] def remove_component(self, id): """ Remove a component from this `Module`. Args: id (str): a string ID. Returns: None. """ del self.components[id]
[docs]class Agent(Module): """ A `Agent` is a `Module` which serves as a top-level container for functional `Module`s. """ def __init__(self): """ Create a new `Agent` instance. Args: None. Returns: Agent: a new `Agent` instance. """ super(Agent, self).__init__()