Структурные модели самоподобных сетей
Исходный код

Модули топологии

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.

python
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. Списки копируются в неизменяемые кортежи.

python
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, если индекс не является целым числом или выходит за пределы слоёв.

python
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. Исходный объект сохраняется. Повторный вызов восстанавливает исходную топологию:

python
topology = good((2, 3), g=(3, 2))
dual_topology = topology.dual()
assert dual_topology.dual() == topology

Для создания такого объекта сразу используйте dual=True в конструкторе или генераторе. Описание математической двойственности находится в теории.

Метод permutations #

permutations() возвращает topology.n_layers + 1 кортежей неотрицательных целых индексов в порядке применения: перед первым слоем, между слоями и после последнего слоя.

Каждый кортеж указывает, из какой позиции исходного массива взять очередной элемент результата:

python
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 это выполняется автоматически.

Чтение и сохранение #

python
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 и содержит один объект:

json
{
  "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 #

Исходный код

python
type Word = tuple[int, ...]

Permutation #

Исходный код

python
type Permutation = tuple[int, ...]

Topology #

Исходный код

python
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 #

python
dual() -> 'Topology'

Вернуть новый объект двойственной топологии.

Исходный код

Topology.n_layers #

python
n_layers: int

Вернуть число вычислительных слоёв.

Исходный код

Topology.sizes #

python
sizes: tuple[int, ...]

Вернуть числа контактов на входе, между слоями и на выходе.

Исходный код

Topology.n_modules #

python
n_modules(m: int) -> int

Вернуть число модулей слоя с нумерацией от нуля.

Параметры

  • m: Индекс слоя.

Исключения

  • ValueError: Индекс не является целым числом или выходит за пределы сети.

Исходный код

Topology.permutations #

python
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 #

Исходный код

python
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 #

Исходный код

python
good(p: Sequence[int], *, g: Sequence[int] | None=None, dual: bool=False) -> Topology

Создать объект Topology для схемы Гуда.

Параметры

  • p: Число входных контактов модуля, по одному на слой.
  • g: Число выходных контактов модуля или p, если не задано.
  • dual: Вернуть двойственную топологию.

haar #

Исходный код

python
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 #

Исходный код

python
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 #

python
to_dict() -> dict

Вернуть канонические поля JSON, сохранив исходный флаг dual.

Исходный код

parse_topology #

Исходный код

python
parse_topology(data: dict) -> TopologySpec

Проверить поля JSON v1 и при необходимости однократно применить двойственное преобразование.

Параметры

  • data: Полное описание топологии согласно DESIGN.md.

Возвращает

Полученную топологию и размерности по слоям.

Исключения

  • ValueError: Недопустимые версия, имя, слова, размерности или флаг dual.

load_topology #

Исходный код

python
load_topology(path: str | Path) -> TopologySpec

Прочитать файл топологии JSON в UTF-8, допуская наличие UTF-8 BOM.

Исключения

  • ValueError: Файл не содержит допустимого описания топологии в JSON v1.
  • OSError: Не удалось прочитать файл.

save_topology #

Исходный код

python
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 #

Исходный код

python
field_label(m: int, n: int) -> str

Вернуть строковую подпись поля контактов для графа.

symbol #

Исходный код

python
symbol(code: int) -> str

Преобразовать целочисленный код слова в строковую подпись.

digits #

Исходный код

python
digits(address: int, radices: tuple[int, ...]) -> list[int]

Вернуть компоненты номера address для заданных размеров radices.

radices #

Исходный код

python
radices(word: tuple[int, ...], topology: Topology) -> tuple[int, ...]

Вернуть размеры, соответствующие кодам word, из топологии.

Layer #

Исходный код

python
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 #

Исходный код

python
layer_contacts(topology: Topology, m: int) -> Layer

Вернуть Layer с входными и выходными контактами модулей слоя m.

estimate_elements #

Исходный код

python
estimate_elements(topology: Topology, mode: str, start: int, end: int) -> int

Ограничить общий объём работы до создания элементов графа.

module_port #

Исходный код

python
module_port(module: dict, index: int, *, output: bool=False) -> tuple[float, float]

Вернуть центр локального контакта на границе модуля.

build_graph #

Исходный код

python
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 #

Исходный код

python
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: Не удалось прочитать исходный или записать выходной файл.

Исходники раздела: docs/topology.md