Source code for elasticai.creator.nn.sequential.layer

from collections.abc import Iterator
from typing import cast

import torch

from elasticai.creator.nn.design_creator_module import DesignCreatorModule
from elasticai.creator.vhdl.design.design import Design

from .design import Sequential as _SequentialDesign


[docs] class Sequential(DesignCreatorModule, torch.nn.Sequential): def __init__(self, *submodules: DesignCreatorModule): super().__init__(*submodules)
[docs] def create_design(self, name: str) -> Design: registry = _Registry() submodules = [cast(DesignCreatorModule, m) for m in self.children()] for module in submodules: registry.register(module.__class__.__name__.lower(), module) subdesigns = list(registry.build_designs()) return _SequentialDesign( sub_designs=subdesigns, name=name, )
class _Registry: def __init__(self) -> None: self._nodes: dict[str, DesignCreatorModule] = {} self._name_counters: dict[str, int] = {} def _make_name_unique(self, name: str) -> str: return f"{name}_{self._get_counter_for_name(name)}" def _get_counter_for_name(self, name: str) -> int: if name in self._name_counters: return self._name_counters[name] else: return 0 def _increment_name_counter(self, name: str): self._name_counters[name] = 1 + self._get_counter_for_name(name) def register(self, name: str, d: DesignCreatorModule): unique_name = self._make_name_unique(name) self._nodes[unique_name] = d self._increment_name_counter(name) def build_designs(self) -> Iterator[Design]: for name, module in self._nodes.items(): yield module.create_design(name)