Модули топологии
regnets.topology предоставляет класс Topology, а
regnets.topology.lib — функции создания стандартных топологий.
Эти модули доступны при базовой установке пакета и не требуют PyTorch.
Принципы построения топологий и математические обозначения описаны в теории модульных сетей.
| Модуль | Назначение |
|---|---|
regnets.topology |
Класс Topology и типы Word, Permutation |
regnets.topology.lib |
Функции cooley_tukey, good, haar |
regnets.topology.io |
Чтение, проверка и сохранение JSON |
regnets.topology.graph |
Данные графа для визуализации |
regnets.topology.viz |
Экспорт SVG и PNG |
Примеры использования #
Генераторы топологий #
Каждая функция возвращает готовый Topology. Параметр p содержит
положительное целое число входов модуля для каждого слоя. Параметр g
задаёт число выходов в том же формате; при его отсутствии используется p.
from regnets.topology.lib import cooley_tukey, good, haar
topology = cooley_tukey((2, 2, 2))
frequency = cooley_tukey((2, 2, 2), decimation="frequency")
good_topology = good((2, 2, 2))
haar_topology = haar((2, 2, 2))
assert topology.n_layers == 3
assert topology.sizes == (8, 8, 8, 8)
У cooley_tukey параметр decimation принимает "time" или
"frequency". Все три функции принимают g=... и dual=True.
Сигнатуры и параметры перечислены в справочнике генераторов.
Создание Topology #
Конструктор принимает words, p, необязательный g и именованный
флаг dual. Списки копируются в неизменяемые кортежи.
from regnets.topology import Topology
topology = Topology(
[[1, 2], [-1, 2], [-1, -2]],
p=(2, 2),
)
assert topology.n_layers == 2
assert topology.p == topology.g == (2, 2)
words — последовательность списков целочисленных кодов. Размеры
списков и допустимые значения описаны в контракте JSON;
конструктор проверяет те же ограничения. Для стандартной топологии
используйте готовый генератор.
Нулевые и нецелые коды, повторения, неправильный состав списков,
неположительные или несовместимые размерности вызывают ValueError.
Логические значения не принимаются вместо целых чисел.
Свойства и методы #
| Обращение | Результат |
|---|---|
topology.words |
Неизменяемые кортежи кодов |
topology.p, topology.g |
Числа входов и выходов модуля по слоям |
topology.n_layers |
Число слоёв |
topology.sizes |
Число контактов на входе, между слоями и на выходе |
topology.n_modules(m) |
Число модулей слоя с индексом m |
topology.dual() |
Новый объект двойственной топологии |
topology.permutations() |
Кортежи целочисленных индексов для вычислений |
Индексы слоёв начинаются с нуля. n_modules(m) вызывает ValueError,
если индекс не является целым числом или выходит за пределы слоёв.
topology = cooley_tukey((2, 3), g=(2, 2))
assert topology.sizes == (6, 6, 4)
assert topology.n_modules(0) == 3
assert topology.n_modules(1) == 2
Метод dual #
dual() возвращает новый Topology, преобразуя words, p и g.
Исходный объект сохраняется. Повторный вызов восстанавливает исходную
топологию:
topology = good((2, 3), g=(3, 2))
dual_topology = topology.dual()
assert dual_topology.dual() == topology
Для создания такого объекта сразу используйте dual=True в конструкторе
или генераторе. Описание математической двойственности находится в
теории.
Метод permutations #
permutations() возвращает topology.n_layers + 1 кортежей
неотрицательных целых индексов в порядке применения: перед первым слоем,
между слоями и после последнего слоя.
Каждый кортеж указывает, из какой позиции исходного массива взять очередной элемент результата:
topology = cooley_tukey((2, 2))
indices = topology.permutations()[1]
source = [10, 11, 20, 21]
result = [source[index] for index in indices]
assert result == [10, 20, 11, 21]
Кортежи можно преобразовать в индексы выбранной вычислительной библиотеки.
При использовании ModularNet это выполняется автоматически.
Чтение и сохранение #
from regnets.topology.io import load_topology, save_topology
path = save_topology(topology, "topology.json", name="Пример")
spec = load_topology(path)
assert spec.topology == topology
assert spec.name == "Пример"
load_topology возвращает TopologySpec; объект Topology доступен
в поле spec.topology. save_topology перезаписывает файл назначения.
Параметры, возвращаемые значения и ошибки описаны в
справочнике ввода и вывода.
Ограничения интерфейса #
Topology хранит описание последовательных слоёв; произвольный граф
ветвлений и объединений этим классом не задаётся. Веса, вычислительные
ядра, устройство и состояние обучения задаются в
regnets.modular и regnets.kernels.
Полные сигнатуры класса и методов: справочник Topology.
Формат JSON v1 #
JSON версии 1 — основной формат хранения и обмена полным описанием топологии проекта. Полное описание включает числовые слова и размерности входов/выходов нейронных модулей каждого слоя. По этим данным восстанавливаются топология, число контактов и все перестановки для вычислений.
Файл имеет расширение .json, кодировку UTF-8 и содержит один объект:
{
"version": 1,
"name": "Моя топология",
"p": [2, 3],
"g": [3, 1],
"words": [
[1, 2],
[2, -1],
[-2, -1]
],
"dual": false
}
| Поле | Смысл и правила |
|---|---|
version |
Целое число 1, версия формата |
name |
Произвольная строка с названием топологии; может быть пустой |
p |
Массив n положительных целых чисел; p[m] — число входных контактов каждого модуля слоя m |
g |
Массив n положительных целых чисел; g[m] — число выходных контактов каждого модуля слоя m |
words |
Массив n+1 списков длины n с целочисленными кодами топологии |
dual |
Логическое значение; true выбирает двойственную топологию |
В канонической записи присутствуют все шесть полей. p и g всегда
записываются полностью, по одному значению на слой, даже если значения
одинаковы или p == g. Порядок полей объекта и форматирование несущественны;
порядок элементов массивов существенен. Число слоёв выводится как
n = len(words) - 1 и отдельно не записывается.
Пример описывает два слоя с ядрами 2 → 3 и 3 → 1:
на входе сети 6 контактов, после первого слоя — 9, на выходе — 3.
Числа контактов доступны через Topology.sizes, число модулей слоя —
через Topology.n_modules(m).
Коды. В списке с индексом m должны присутствовать отрицательные
коды от -m до -1 и положительные от m+1 до n, каждый ровно один раз.
Индексы списков начинаются с нуля. Коды — целые числа;
нули, повторы, неправильные знаки, строки, дробные и логические
значения вместо целых недопустимы. Для стандартных схем готовые данные
создают функции regnets.topology.lib.
Название. name — произвольная подпись, которая не определяет связи
и не проверяется на соответствие стандартному генератору. Связи задаются
только словами и размерностями. Интерфейс может построить слова по стандартной
схеме, но при чтении файла использует записанные слова независимо от имени.
При отсутствии name используется строковое поле scheme из прежних файлов,
а при отсутствии обоих — пустая строка. Если присутствуют оба поля, приоритет
имеет name. Сохранение всегда записывает только name.
Прежние версии программы прочитают слова и размерности нового файла, но не
распознают name и не сохранят его при повторной записи.
Двойственность. При dual: true поля words, p, g описывают
исходную топологию. После чтения один раз выполняется Topology.dual():
преобразуются words, p и g. Полученный объект используется
в вычислениях и визуализации. При сохранении записываются исходные данные
и флаг dual. Для совместимости с ранними файлами отсутствующее dual
читается как false. Записывающий код всегда выводит name и dual явно.
Производные представления. Кортежи Python, список числовых слов в TXT
и тензоры индексов — рабочие представления. TXT хранит только слова и
сам по себе не задаёт полную топологию: размерности p/g в нём отсутствуют.
Массивы перестановок вычисляются из JSON и не дублируются в основном файле.
Конфигурация нейронного ядра, size, режим разделения параметров, остаточные
связи и обученные веса относятся к вычислительной модели и хранятся отдельно.
Проверяются версия, тип имени и флага двойственности, типы и длины массивов, положительность размерностей и состав слов. Ограничения Web UI на число слоёв, размерности и размер загружаемого файла — ограничения приложения, а не формата JSON. Несовместимое изменение смысла полей требует новой версии формата. Примеры работы с классом и методами приведены в документации топологии. Математические основы описаны в теории модульных сетей.
Общая проверка и чтение формата выполняются в regnets.topology.io:
load_topology(path) возвращает TopologySpec с выбранным Topology
(слова и размерности), именем и исходным флагом двойственности;
parse_topology(data) проверяет уже прочитанный объект JSON.
save_topology(topology, path, name=...) записывает JSON версии 1 в UTF-8;
при передаче TopologySpec сохраняются её имя и исходный флаг двойственности,
а для Topology записывается текущее состояние с dual: false.
Ограничения Web UI применяются отдельно в приложении. Экспорт SVG/PNG
использует тот же формат; интерфейс описан в
руководстве визуализации.
regnets.topology #
Справочник публичного API Regnets 0.3.1. Сигнатуры, поля и описания получены из исходников при сборке. Имена в <factory: …> обозначают фабрики значений dataclass.
Класс Topology и типы Word, Permutation. Примеры использования.
Word #
type Word = tuple[int, ...]
Permutation #
type Permutation = tuple[int, ...]
Topology #
Topology(words: Sequence[Sequence[int]], p: Sequence[int], g: Sequence[int] | None=None, *, dual: bool=False)
Неизменяемая топология с кодами и размерностями модулей по слоям.
Списки копируются в кортежи. Для стандартных топологий можно использовать готовые функции из regnets.topology.lib.
Параметры
words: Списки целочисленных кодов согласно контракту JSON версии 1.p: Число входных контактов модуля, по одному положительному целому на слой.g: Число выходных контактов модуля. Если не задано, используется p.dual: Создать двойственную топологию.
Исключения
ValueError: Слова или размерности не задают допустимую топологию.
Поля #
| Имя | Тип | По умолчанию |
|---|---|---|
words |
tuple[Word, ...] |
Обязательно |
p |
tuple[int, ...] |
Обязательно |
g |
tuple[int, ...] |
Обязательно |
Topology.dual #
dual() -> 'Topology'
Вернуть новый объект двойственной топологии.
Topology.n_layers #
n_layers: int
Вернуть число вычислительных слоёв.
Topology.sizes #
sizes: tuple[int, ...]
Вернуть числа контактов на входе, между слоями и на выходе.
Topology.n_modules #
n_modules(m: int) -> int
Вернуть число модулей слоя с нумерацией от нуля.
Параметры
m: Индекс слоя.
Исключения
ValueError: Индекс не является целым числом или выходит за пределы сети.
Topology.permutations #
permutations() -> tuple[Permutation, ...]
Построить индексы выборки до, между и после слоёв.
Каждый кортеж применяется как [source[index] for index in indices]. Первый подготавливает входы первого слоя, промежуточные соединяют соседние слои, последний восстанавливает внешний порядок выхода.
Возвращает
n_layers + 1 перестановок обычных неотрицательных целых чисел.
regnets.topology.lib #
Справочник публичного API Regnets 0.3.1. Сигнатуры, поля и описания получены из исходников при сборке. Имена в <factory: …> обозначают фабрики значений dataclass.
Функции cooley_tukey, good и haar возвращают Topology. Параметры и примеры.
cooley_tukey #
cooley_tukey(p: Sequence[int], decimation: Literal['time', 'frequency']='time', *, g: Sequence[int] | None=None, dual: bool=False) -> Topology
Создать топологию Кули — Тьюки с прореживанием по времени или по частоте.
Параметры
p: Число входных контактов модуля, по одному на слой.decimation: Вариант схемы: "time" или "frequency".g: Число выходных контактов модуля или p, если не задано.dual: Вернуть двойственную топологию.
good #
good(p: Sequence[int], *, g: Sequence[int] | None=None, dual: bool=False) -> Topology
Создать объект Topology для схемы Гуда.
Параметры
p: Число входных контактов модуля, по одному на слой.g: Число выходных контактов модуля или p, если не задано.dual: Вернуть двойственную топологию.
haar #
haar(p: Sequence[int], *, g: Sequence[int] | None=None, dual: bool=False) -> Topology
Создать объект Topology для схемы Хаара.
Параметры
p: Число входных контактов модуля, по одному на слой.g: Число выходных контактов модуля или p, если не задано.dual: Вернуть двойственную топологию.
regnets.topology.io #
Справочник публичного API Regnets 0.3.1. Сигнатуры, поля и описания получены из исходников при сборке. Имена в <factory: …> обозначают фабрики значений dataclass.
load_topology возвращает TopologySpec; при dual=true её топология уже преобразована. save_topology перезаписывает файл и возвращает Path. Контракт JSON v1.
TopologySpec #
TopologySpec(name: str, topology: Topology, dual: bool = False)
Полученная топология, её имя в JSON и сведения о выборе двойственной модели.
Для проверки сериализованных данных используйте load_topology или parse_topology. При dual=true в topology уже задана двойственная модель.
Поля #
| Имя | Тип | По умолчанию |
|---|---|---|
name |
str |
Обязательно |
topology |
Topology |
Обязательно |
dual |
bool |
False |
TopologySpec.to_dict #
to_dict() -> dict
Вернуть канонические поля JSON, сохранив исходный флаг dual.
parse_topology #
parse_topology(data: dict) -> TopologySpec
Проверить поля JSON v1 и при необходимости однократно применить двойственное преобразование.
Параметры
data: Полное описание топологии согласно DESIGN.md.
Возвращает
Полученную топологию и размерности по слоям.
Исключения
ValueError: Недопустимые версия, имя, слова, размерности или флаг dual.
load_topology #
load_topology(path: str | Path) -> TopologySpec
Прочитать файл топологии JSON в UTF-8, допуская наличие UTF-8 BOM.
Исключения
ValueError: Файл не содержит допустимого описания топологии в JSON v1.OSError: Не удалось прочитать файл.
save_topology #
save_topology(topology: Topology | TopologySpec, path: str | Path, *, name: str | None=None) -> Path
Записать топологию или загруженное описание в каноническом JSON v1 с кодировкой UTF-8.
Описание сохраняет флаг выбора двойственной модели и имя, если новое имя не задано. Топология без описания сохраняется в текущем виде с dual=false.
Параметры
topology: Проверенная топология или описание для сохранения.path: Путь к файлу, который будет перезаписан, если он существует.name: Необязательное отображаемое имя, заменяющее имя в описании.
Возвращает
Путь к файлу назначения.
Исключения
TypeError: Топология не является экземпляром Topology или TopologySpec.ValueError: Недопустимое описание или отображаемое имя.OSError: Не удалось записать файл назначения.
regnets.topology.graph #
Справочник публичного API Regnets 0.3.1. Сигнатуры, поля и описания получены из исходников при сборке. Имена в <factory: …> обозначают фабрики значений dataclass.
build_graph возвращает пару (elements, info) для Cytoscape. Диапазон scope=[start, end] включителен; режим — contacts или modules. info содержит размеры рисунка, количество контактов, вершин и связей. Layer этого модуля описывает адреса, в отличие от вычислительного regnets.modular.Layer.
field_label #
field_label(m: int, n: int) -> str
Вернуть строковую подпись поля контактов для графа.
symbol #
symbol(code: int) -> str
Преобразовать целочисленный код слова в строковую подпись.
digits #
digits(address: int, radices: tuple[int, ...]) -> list[int]
Вернуть компоненты номера address для заданных размеров radices.
radices #
radices(word: tuple[int, ...], topology: Topology) -> tuple[int, ...]
Вернуть размеры, соответствующие кодам word, из топологии.
Layer #
Layer(inputs: tuple[tuple[int, ...], ...], outputs: tuple[tuple[int, ...], ...], module_word: tuple[int, ...], module_radices: tuple[int, ...])
Внешние адреса контактов, сгруппированные по нумерации модулей слоя.
Поля #
| Имя | Тип | По умолчанию |
|---|---|---|
inputs |
tuple[tuple[int, ...], ...] |
Обязательно |
outputs |
tuple[tuple[int, ...], ...] |
Обязательно |
module_word |
tuple[int, ...] |
Обязательно |
module_radices |
tuple[int, ...] |
Обязательно |
layer_contacts #
layer_contacts(topology: Topology, m: int) -> Layer
Вернуть Layer с входными и выходными контактами модулей слоя m.
estimate_elements #
estimate_elements(topology: Topology, mode: str, start: int, end: int) -> int
Ограничить общий объём работы до создания элементов графа.
module_port #
module_port(module: dict, index: int, *, output: bool=False) -> tuple[float, float]
Вернуть центр локального контакта на границе модуля.
build_graph #
build_graph(topology: Topology, mode: str='contacts', scope: list[int] | None=None, *, plot_height: float | None=None, name: str='') -> tuple[list[dict], dict]
Вернуть точные элементы графа и метаданные, при необходимости задав размер изображения.
regnets.topology.viz #
Справочник публичного API Regnets 0.3.1. Сигнатуры, поля и описания получены из исходников при сборке. Имена в <factory: …> обозначают фабрики значений dataclass.
render_topology читает полный JSON и возвращает путь SVG или PNG. Формат определяется расширением, а существующий рисунок перезаписывается. Параметры, ошибки и ограничения экспорта.
render_topology #
render_topology(source: str | Path, output: str | Path | None=None, *, mode: Literal['contacts', 'modules']='contacts', dpi: int=300) -> Path
Сохранить полную топологию из файла JSON в виде статического изображения.
Параметры
source: Файл топологии JSON v1 с размерностями p и g по слоям.output: Путь к SVG или PNG. Если не задан, расширение источника заменяется на .svg. Отсутствующие каталоги создаются. Существующее изображение перезаписывается.mode: Контакты и внутренние связи либо модули и межслойные связи.dpi: Разрешение PNG; векторная геометрия SVG от него не зависит.
Возвращает
Путь к сохранённому изображению.
Исключения
ValueError: Недопустимы данные, режим, формат или dpi; граф превышает 60000 элементов либо PNG превышает 40 миллионов пикселей или 65535 на сторону.OSError: Не удалось прочитать исходный или записать выходной файл.