Программа проживает жизнь индивида в условном мире и проверяет, непротиворечивы ли
механизмы, описанные в Causa Sui (графы, матрицы, способность рождать новое в агонии),
и что они меняют. Это замороженная эталонная версия: на ней получены все числа и рисунки
главы 32 книги 3. Это модель механизмов, а не субъект (см. главу 31). Описание алгоритма
простыми словами — docs/АЛГОРИТМ_RU.md (английский: docs/ALGORITHM_EN.md).
Код и комментарии в нём — на английском.
Что нужно
Python 3.11 или новее (проверено на 3.13), numpy (проверено 2.5), matplotlib (3.11, только для рисунков),
scipy (1.18, по желанию: критерий Уилкоксона). Graphviz dot — только чтобы перерисовать рисунок 32.0а.
pip install numpy matplotlib scipy
Файлы
| Файл | Что это |
|---|---|
world.py |
условный мир и тело индивида; паспорт мира (WorldParams) |
individual.py |
графы с памятью, графы без памяти (для сравнения), рождение графа в агонии, исполнитель |
main.py |
главный цикл: одна жизнь, один такт = один час |
signals.py, noise.py |
что передают друг другу части программы; аппаратный источник шума |
tests.py |
18 контрольных случаев с заранее известным ответом |
experiments/ |
опыты и рисунки главы 32 |
data/ |
опубликованные серии (жизни индивидов, по которым построены таблица 32.1 и рисунок 32.1) |
docs/ |
алгоритм простыми словами (RU, EN); исходники рисунков 32.0а, 32.0б |
figures/ |
рисунки 32.0а–32.3, русские и английские, под страницу A5 |
Проверить программу
python3 tests.py # должно пройти 18 из 18
python3 main.py # одна жизнь; журнал в journal.txt
Повторить главу 32 (запускать в папке experiments/)
Каждая жизнь получает свежий аппаратный шум, поэтому числа от серии к серии немного разные (примерно ±10 %); качественные результаты — нет.
| Глава 32 | Команда | Опубликованные значения |
|---|---|---|
| Сколько пережили первые–четвёртые трудные времена (таблица, рис. 32.1) | python3 hard_times.py memory 100; ... nomemory 100; ... nobirth 100 (опубликованные серии по 200 — два прогона по 100, сложенные вместе) |
находит своё и помнит (200): 60 / 86 / 88 / 88 %, дожили до конца срока 52 из 200; не помнит (200): 29–38 / 0 %; только подсмотренное (100): 47 / 38 / 0 % |
| Рисунок 32.1 | python3 figures.py survival ru / en (читает ../data или ваши hard_times_*.json) |
|
| Проверка мира | python3 birth_in_agony.py c1_good 100; c2_hard; c3_oracle |
в благополучии 100 из 100 доживают до старости; в трудные времена без нового первые не переживает никто (0 из 100); знающий выход заранее переживает первые 77 из 100, доживает до старости 37 из 100 |
| Рождение в агонии, прилив сил | python3 birth_in_agony.py full 100; insight; adrenaline; nostress; nobirth |
пережили первые / дожили до конца срока: 59/20, 61/22, 56/14, 57/8, 48/0 |
| Опыт или отбор | python3 experience_vs_selection.py 90 |
наибольший голод у одних и тех же индивидов: в первые 0,74, во вторые 0,25 (медианы); ниже у 24 из 33, критерий Уилкоксона p ≈ 7·10⁻⁵ |
| Рисунки 32.0а, 32.0б | cd ../docs; dot -Tpng -Gdpi=300 structure_ru.dot -o fig32_0a_structure_ru.png; python3 simplex_fig.py ru |
|
| Рисунки 32.2, 32.3 (иллюстрации) | python3 figures.py life ru; python3 figures.py lostlife ru (затем en: берётся та же жизнь) |
выбраны из нескольких жизней |
Программы рисунков сохраняют PNG в текущую папку; чтобы заменить опубликованные, перенесите их в figures/.
Проценты для каждых трудных времён считаются от индивидов, доживших до их начала, а не от исходной сотни (например, 86 % во вторые трудные времена — это 79 из 92).
Случайность
Шум берётся из аппаратной энтропии операционной системы (os.urandom). Повторить целую
жизнь в точности нельзя; отдельную часть программы — можно: записать её поток шума
(NoiseSource("hw", record=True)) и подать его снова (NoiseSource("replay", replay=...)).
Целостность
SHA256SUMS содержит контрольную сумму каждого файла: sha256sum -c SHA256SUMS.
Происхождение
Замороженная эталонная версия «3к» (мир v6, графы v6), 3–4 октября 2026 года. Эта английская редакция кода сверена с исходной: при одинаковых записанных потоках шума обе программы проживают побитно одинаковые жизни.