# Нейросеть из кубиков · v1.2.1

Готовый статический модуль проекта «Поле и наблюдатель». Один входной куб, 19 кубов-параметров, настоящая сеть 4→2→3 и покоординатное обучение. Все вычисления выполняются в браузере. Учебные данные не отправляются на сервер.

## Открыть

В каталоге выпуска выполните одну команду:

```sh
python3 -m http.server 8903 --bind 127.0.0.1 --directory dist
```

Откройте `http://127.0.0.1:8903/`. Интернет для работы не нужен. Python здесь только раздаёт неизменяемые файлы, не вычисляет сеть. Остановка сервера: Ctrl+C. Прямой `file://` не поддерживается: браузеру нужен HTTP для ES-модулей и сохранённой записи.

Из каталога исходного проекта можно аналогично запустить `python3 -m http.server 8903 --bind 127.0.0.1 --directory web`.

## Дополнение 1.2.1: общая схема рядом с кубами

В шаге «Кубы на схеме» над разбором узла постоянно показана полная сеть 4 → 2 → 3: четыре входа, один скрытый слой с двумя узлами, три выходные оценки и общий softmax. Это прежняя схема из v1.1, с тем же оформлением.

Нажатие на связь или смещение выбирает соответствующий куб и его формулу ниже. Выбор куба выделяет его место в общей сети. Нажатие на узел показывает его разбор; вход подсвечивает свои связи с обоими скрытыми узлами. Кнопка под описанием прокручивает страницу к кубам выбранного участка. Схемы показывают одну и ту же текущую модель, включая пробу кандидата.

## Новое в редакции 1.2

В учебном разделе добавлен седьмой шаг «Кубы на схеме». Он открыт сразу. Предыдущие шесть шагов от четырёх входов до полного ответа сохранены.

Сверху собраны все 19 параметров по пяти вычислительным узлам. Нажмите W11, b1, UA1, UB2, cO или любое другое имя. Ниже появится соответствующий узел: исходное число → реальный куб с именем, кодом и значением → произведение → сумма со смещением → результат. Для скрытого узла видны четыре входа и ReLU; для выхода — два скрытых значения и все три оценки перед softmax.

Имя выбранного куба одновременно выделяется в карте, на связи, в формуле и в основной сцене. Расшифровка объясняет порядок индексов: сначала куда, затем откуда. UA1 — вес связи h₁ → sA; cA — добавка к сумме выхода A. Результаты — sA/sB/sO, после softmax — pA/pB/pO. O — буква «о» от OTHER, а не ноль.

В самой схеме можно изменить код выбранного параметра. Куб совершает допустимые повороты, сеть пересчитывается; вход и остальные 18 параметров сохраняются. Из основной сцены кнопка «Показать этот куб на схеме» возвращает к его разбору. SVG сохраняет схему вместе с изображениями кубов.

Для наглядного примера нажмите «Загрузить обученный пример», затем «Рисунок A» и UA1. Получится h₁=2, h₂=0; sA=1,75×2+(−2)×0+(−2)=1,5. Загрузка явно меняет параметры. Простое переключение схем и выбор элемента не меняют модель.

Схема читает результаты того же forward(), что и основная сцена. Изображения используют тот же канонический рендер, реальные позы и обзорную камеру. Пробная модель и принятая модель подписаны отдельно. При повороте показывается последний устойчивый расчёт.

Математическая модель и формат JSON остаются версии 1.0: прежние проекты совместимы. Версия интерфейса — 1.2.1. Выпуски source/output v1.0.0, v1.1.0 и v1.2.0 сохранены.

## Первые действия

1. «Распознавание»: выберите A, B или иной рисунок, либо поверните вход по X/Y/Z. Все параметры заморожены. Датчик читает верхнюю грань независимо от обзорной камеры.
2. Нажмите «Откуда эти числа?». Раскройте десять операций прямого прохода. Подчёркнутое число открывает своё происхождение.
3. Нажмите куб-параметр. В ручном режиме поверните его или выберите достижимый код. Вход сохраняется. Новый ручной снимок начинает отдельный запуск.
4. «Обучение»: одна кнопка показывает очередного кандидата, другая завершает выбор параметра. В каждой проверке сравниваются все 16 кодов при остальных 18 фиксированных параметрах. Пробный снимок подписан отдельно.
5. «Запустить / продолжить» считает потери заново. Эталонный seed=1 использует сохранённые начальные коды и порядок параметров Python, но не готовые ответы или потери. Свободный старт использует xorshift32. Seed=0 показывает реальную остановку без полного распознавания.
6. «Повтор / модель» явно загружает результат либо воспроизводит сохранённый журнал Python. Это отдельные действия.
7. Сохраните JSON и откройте его в новой сессии. Восстанавливается принятая модель, геометрические позы и оптимизатор, включая уже вычисленные пробы. Анимация не сохраняется как промежуточная модель. После импорта расчёт на паузе. PNG сохраняет обзор и дополнительный разбор выбранного режима.

## Модель

Вход x — четыре идеальных бита в порядке верхний левый, верхний правый, нижний левый, нижний правый. Учитель назначает A рисунку 1010, B рисунку 0101, OTHER остальным 14. `forward(x, codes)` не получает метку, номер позы или ID грани.

- `a = Wx+b`, `h=max(0,a)`; W размера 2×4, b размера 2.
- `s=Uh+c`; U размера 3×2, c размера 3.
- `p=exp(s−max(s))/sum(exp(s−max(s)))`.
- Ответ — первый максимум в порядке A, B, OTHER. При равенстве интерфейс показывает технический выбор.
- Каждый из 19 кодов q целый, 0…15. Единственный декодер `θ=(q−8)/4`.
- Общая потеря: `(ℓA+ℓB+mean(ℓOTHER))/3`, где `ℓ=−ln(p правильного класса)`.

Алгоритм сравнивает все 16 кандидатных кодов одного параметра. Выбирает первый минимум по возрастанию q и принимает его только при `Lновое < Lстарое − 1e−12`. Параметры обходятся по воспроизводимым перестановкам. Остановка: полный проход без улучшения либо 60 проходов. Расчёт разбит на небольшие порции с возвратом управления браузеру. Скорость рендера не влияет на порядок вычислений.

Все 16 рисунков входят в обучение. 16/16 — полный контроль этой конечной задачи, а не независимый тест и не доказательство обобщения на фотографии или шум. Softmax не проверен на калибровку. OTHER — конкретный обучаемый класс. Постоянный OTHER даёт 87,5% общей точности, но не узнаёт A и B.

## Геометрия и наследование

Источник базисов и рендера: `site_package/scripts/cubes.js`. Палитра и типографика: `control/design_tokens.json` и `site_package/styles/main.css`. Атлас OBJ-02, страницы 2–3, визуально сверён с заданием. Старые сцены не изменяются.

В старом коде FACE хранит числовые рисунки атласа напрямую. Здесь при инициализации отдельной копии применяется явное дополнение `qFO=15−qатлас`. В дальнейшем рисунки неизменны. U/D: 15/0, L/R: 14/1, F/B: 10/9. Никакой динамической перекраски. Базисы наследованы, не выданы за вновь найденную независимую модель.

Оси мира: X вправо, Y от зрителя, Z вверх. Положительное вращение соответствует правилу правой руки. Матрица позы переводит координаты тела в мировые. Сенсор всегда смотрит по −Z. Обзорная камера применяется только в рендере. 24 поворотные матрицы получаются обходом графа четверть-оборотов. Верхний код вычисляется по нормали и координатам четырёх секторов. К целевому коду строится кратчайший путь допустимых поворотов. Между устойчивыми позами новые наблюдения и веса не возникают.

Рендер использует существующую геометрическую 3D-проекцию на Canvas 2D. WebGL не требуется. Если Canvas недоступен, выводится сообщение об ошибке, а фиктивный результат не показывается. Уменьшение движения учитывает системную настройку. Вращение фона отсутствует.

## Исходники и сборка

- `web/geometry.js`: канон, сенсор, граф 24 поз, пути и рендер.
- `web/model.js`: чистый прямой проход и декодер параметров.
- `web/evaluator.js`: отдельный учитель, коллекция, потеря и метрики.
- `web/optimizer.js`: PRNG, реальные пробы, решения и остановка.
- `web/storage.js`: версионированный JSON и проверка журнала повторным расчётом до изменения сцены.
- `web/trace.js`: пояснения текущих вычислений.
- `web/parameter-map.js`: единая карта кубов, параметров, связей и текущего расчёта.
- `web/network-guide.js`: семь последовательных учебных представлений.
- `web/app.js`: единое состояние, управление, анимация, экспорт и журнал действий.
- `web/data/reference.json`: воспроизведённые полные журналы seed=1 и seed=0, в том числе отклонения.

Внешних зависимостей у веб-модуля нет. Нет CDN, API, аккаунтов, ключей или экспортируемых файлов шрифтов. CSS использует доступные системные DIN Condensed / Arial Narrow / Arial, Georgia и запасные варианты.

Из корня проекта:

```sh
python3 source/cube_neural/v1.2.1/tools/build.py
node source/cube_neural/v1.2.1/tests/core.mjs
```

Сборка копирует проверяемые исходники без минификации. Проверка Python дополнительно требует NumPy 2.3.5 и исходную вычислительную заготовку в `inputs/cube_neural/v1.0.0/`. Браузерные тесты требуют Playwright и Chrome; версии фактически использованной среды указаны в QA_REPORT.md. Веб-выпуск их не требует.

## Сохранение и пределы

JSON содержит версии схемы/сети/канона/кодировки/задачи, начальные и текущие коды, 20 физических поз, PRNG и его начальное/текущее состояние, текущую пробу, порядок обхода, все решения и метрики. Максимум 1140 решений и 18240 проб за один запуск. Управляющий журнал хранит последние 500 событий; до пяти последних снимков запусков остаются в экспортированном сеансе для справки. Активный запуск восстанавливается и пересчитывается при импорте. Лимит файла — 12 МБ. Импорт ничего не исполняет и не допускает несогласованные позы, коды или журнал.

Страница ничего не сохраняет скрытно между сессиями. Используйте «Сохранить JSON». При импорте, сбросе и переключении режима старые асинхронные операции теряют право менять текущий проект. Пауза завершает уже начатый поворот и затем останавливает работу.

## Размещение и откат

`dist/` можно разместить в любом вложенном пути: все ресурсы относительные. Для существующей оболочки подготовлен `publish/simulators/cube-neural/`. Используется уже принятая в локальном приложении структура `simulators/<scene>/index.html`. Главная страница и реестр старых сцен не перезаписываются. `integration/` содержит запись для каталога, фрагмент ссылки и страницу для проверки iframe.

Публичный корень раздела и доступный канал записи не подтверждены. Статус этого выпуска: локально проверен, готов к размещению; не опубликован. Предложенный маршрут `/field-and-observer/simulators/cube-neural/` не выдаётся за существующую страницу.

Публикующий агент должен разместить только новую папку в подтверждённом корне раздела и проверить HTTPS, MIME, отсутствие 404, поворот, обучение и JSON. При конфликте существующего каталога сначала сравнить SHA256; не перезаписывать его автоматически. Для отката удалить только добавленную папку и отдельно добавленную ссылку. Пример безопасной изоляции — iframe с `allow="fullscreen"`; CSS остаётся внутри документа сцены.
