Граф N = 50 000: BA-подложка (личные связи, хвост хабов) + 3 460 плантированных клик с перекрытием (Telegram-чаты, широкие мосты Centola). Complex contagion (k = 2) против simple (k = 1); проверка GTM-гипотезы «посев в хабы бьёт случайный при равном бюджете». Реализация SPEC v1.3 (sim2/SPEC.md), seed = 42, полный детерминизм.
CHANGELOG-факт: v1.0 (независимая посадка клик) блокировала complex полностью — штатный стоп «p* не существует»; v1.1 (посадка с перекрытием) оживила механику, но провалила T3(б) из-за категориальной ошибки метрика/порог; v1.2 перевела T3 на P_macro — полный PASS и публикация; v1.3 — по аудиту красной команды (вердикт: принять, отзываемых чисел нет) добавлен контроль интерпретации хабов top-BA и декомпозиция union-степени. Детали — SPEC.md, CHANGELOG.
python3 sim2/tonify_graph_sim.py # numpy + scipy + networkx + matplotlib + pillow
Полный прогон ≈ 36 с (M-серия); stdout детерминирован (два прогона — идентичный diff); числа стратегий 0–2 воспроизводят v1.2 байт-в-байт. Фигуры кладутся в figures/.
| Параметр | Значение | Источник / флаг |
|---|---|---|
| N узлов; BA m; seed | 50 000; 3; 42 | ТЗ (HANDOFF); Barabási & Albert 1999 |
| Размер клики | LogNormal(μ=ln 12, σ=0,6), клип [5, 40] | границы — ТЗ; μ, σ — допущение (медиана 12 = малый групповой чат; статистики приватных групп Telegram нет) |
| Число клик C | 3 460 | калибровка на покрытие q = 0,50 |
| Покрытие q | 0,50 | допущение: консервативная середина, доля юзеров в ≥1 приватной группе не публикуется |
| Перекрытие чатов | n_par = 2 родителя, o = 2 общих узла | допущение (минимальность): o=2 — минимальная ширина широкого моста (Centola 2010); перекрывающиеся сообщества — Palla et al., Nature 2005; признание конструкции — §9.6 |
| Пороги k | complex 2; simple 1 | ТЗ; Centola & Macy 2007, Centola 2010; Granovetter 1973 |
| Share rate p | сетка 0,05…1,00, шаг 0,05 | ТЗ: ось фазовой диаграммы |
| Рабочая точка p* | min{p: mean охват(k=2) ≥ 5 % N} | правило-конструкция на измеренной фазовой; mean = P(розжиг)×условный охват — единственный агрегат, монотонный при бимодальности |
| p_seed | 1 | допущение (GTM-реализм): посев = оплаченное размещение |
| Память касаний | бессрочная в каскаде | Centola & Macy 2007; ограничение §9.1 |
| Бюджеты B | {1, 2, 5, 10, 20, 50, 100, 200, 500} | конструкция: лог-сетка до 1 % N; равный бюджет = равное число узлов (ТЗ) |
| Прогоны | A 30; B 40; C 40 | допущение: бюджет рантайма; разрыв, не видимый поверх SEM, не GTM-аргумент |
| Посев B и C | один случайный чат 10–14 (факт: 970 кандидатов = 28 % C) | Centola 2010 (посев соседства); окно убирает дисперсию размера |
| Посев C на G_BA | узел deg ≥ 11 + 11 соседей (12) | конструкция: симметрия протокола |
| R_eff; P_macro | пулированные поколения (G₂+G₃+G₄)/(G₁+G₂+G₃), условно на G₁≥1; P_macro = P(охват ≥ 5 % N) | конструкция: декомпозиция бимодальности розжиг × распространение |
| Точка C и T3: p_C | max(p*, 0,7) | глубоко в сверхкритике обеих механик (аналитики 0,018 и 0,526) |
| Хабы | топ-B по степени G (BA + клики); контроль v1.3 — top-BA по степени чистого G_BA | ТЗ; оговорка §9.10; контроль — аудит красной команды |
| GIF | N_gif 4 000; C_gif 277 | ТЗ; пропорция клик сохранена |
T1 хвост степеней G_BA: MLE Ньюмана, k_min=15: γ̂ = 2.913 допуск γ̂ ∈ [2,60; 3,40] PASS
T2 размеры клик: медиана : 12.0 допуск ∈ [11; 13] PASS
T2 размеры клик: среднее : 14.20 допуск ∈ [13,30; 15,00] PASS
T2 размеры клик: P(s=5) : 0.101 допуск ≤ 0,12 PASS
T2 размеры клик: P(s=40) : 0.025 допуск ≤ 0,04 PASS
T2b покрытие: доля узлов в ≥1 чате : 0.504 допуск ∈ [0,45; 0,55] PASS
T2c мостовой слой: доля чатов c≥1 с ≥1 мостом : 1.0000 допуск ≥ 0,99 PASS
T2c мостовой слой: средняя степень d̄(B_chat) : 4.62 допуск ∈ [4,0; 5,5] PASS
T3 G_BA, simple k=1: P_macro : 1.000 допуск ≥ 0,75 PASS
T3 G_BA, complex k=2: P_macro : 0.150 допуск ≤ 0,25 PASS
T3 G, complex k=2: P_macro : 1.000 допуск ≥ 0,75 PASS
11/11 PASS. Справочно: G_BA 149 991 рёбер (⟨k⟩ = 6,00); G 586 182 рёбер (⟨k⟩ = 23,45); членств 0,98/узел, 1,95/покрытого; B_chat связен (1 компонента, по построению); выходов по T_max = 100: ноль на все 2 841 каскад. Пороги T3 фиксированы в SPEC v1.2 с признанием пост-хок-контекста (процессное правило §CHANGELOG v1.3); PASS воспроизведён аудитом на независимых батчах сидов (P_macro G_BA complex = 0,150/0,075/0,125 — всюду ≤ 0,25).
Метрика мишени T3 — P_macro = P(охват ≥ 5 % N):
| P_macro | simple k=1 | complex k=2 |
|---|---|---|
| G (BA + клики) | 1,000 | 1,000 |
| G_BA (без клик) | 1,000 | 0,150 |
Mean-охват, % N (справочно):
| mean, % N | simple k=1 | complex k=2 |
|---|---|---|
| G (BA + клики) | 99,4 | 93,7 |
| G_BA (без клик) | 98,6 | 12,54 |
Чтение (Centola 2010 / Centola & Macy 2007): simple проводится слабыми связями и живёт на обоих графах; complex на графе без чатов зажигается лишь в 15 % посевов — «теория рукопожатий» Granovetter работает для информации и ломается на поведении. Чаты возвращают complex надёжность: P_macro 0,15 → 1,00.
Rich-club-находка (§9.12, запрет оверклейма). «Ломается» — вероятностно, НЕ абсолютно: даже на чистом BA плотное ядро высокостепенных узлов в ~15 % посевов собирает второй источник, и зажёгшийся каскад доходит до 82–84 % N (степени центров розжига 11–257 — это не хабовый артефакт посева). Клики меняют не возможность макрокаскада, а его НАДЁЖНОСТЬ: P(макрокаскад) 1,00 против 0,15. Формулировка «без чатов complex невозможен» запрещена валидацией: mean-охват G_BA complex = 12,54 % N именно из-за этого хвоста.
Mean reach-per-seed = (охват − B)/B ± 1 SEM, 30 прогонов/точку. top-BA — контрольная стратегия v1.3 (топ-B по степени ЧИСТОГО G_BA), в критерий фальсификатора §6 не входит:
| B | random | top-hubs | random-cliques | top-BA (контроль) |
|---|---|---|---|---|
| 1 | 0,0 ± 0,0 | 0,0 ± 0,0 | 0,0 ± 0,0 | 0,0 ± 0,0 |
| 2 | 0,0 ± 0,0 | 1 856,7 ± 764,2 | 1 111,8 ± 612,9 | 1 895,0 ± 780,9 |
| 5 | 0,0 ± 0,0 | 4 509,1 ± 16,7 | 1 016,1 ± 339,7 | 4 225,0 ± 206,8 |
| 10 | 0,8 ± 0,4 | 2 269,4 ± 8,2 | 1 101,8 ± 203,7 | 2 273,0 ± 7,3 |
| 20 | 145,5 ± 68,6 | 1 150,6 ± 3,6 | 733,1 ± 95,5 | 1 170,3 ± 2,8 |
| 50 | 322,9 ± 36,0 | 484,1 ± 1,4 | 441,0 ± 1,5 | 488,7 ± 1,3 |
| 100 | 220,0 ± 0,9 | 251,0 ± 0,5 | 222,8 ± 0,8 | 255,1 ± 0,6 |
| 200 | 111,2 ± 0,4 | 130,0 ± 0,2 | 113,0 ± 0,4 | 135,3 ± 0,3 |
| 500 | 46,5 ± 0,1 | 55,4 ± 0,1 | 47,3 ± 0,1 | 59,4 ± 0,1 |
ВЕРДИКТ ФАЛЬСИФИКАТОРА GTM (SPEC §6, дословно из прогона): «гипотеза хабов подтверждена на всех бюджетах B ∈ [2; 500]: mean reach-per-seed(top-hubs) > random на всей сетке (B=1 исключён как вырожденный, §6)».
Контроль top-BA («каналы vs чат-хопперы», v1.3): top-BA бьёт random на всех B ∈ [2; 500] и на B ≥ 10 систематически ≥ top-hubs (2 273,0 vs 2 269,4; 1 170,3 vs 1 150,6; 488,7 vs 484,1; 255,1 vs 251,0; 135,3 vs 130,0; 59,4 vs 55,4) — union-определение хабов ЗАНИЖАЛО канальное преимущество, а не создавало его. Вывод аудита подтверждён в основном прогоне.
Декомпозиция хабов (§4.1 v1.3, справочно): у топ-500 по union-степени 81,6 % степени — кликовые рёбра; пересечение |H₅₀₀ ∩ H₅₀₀^BA| = 84/500; членства топ-500 union: медиана 8, максимум 42. «Хабы» union-определения — в большинстве чат-хопперы; контроль top-BA показывает, что вердикт §6 от этого загрязнения не зависит.
Механика малых B (аудит v1.2, §8): на B ≤ 20 выигрыш хабов смешан с эффектом плотности посева вообще — cliques тоже бьют random (733,1–1 111,8 против 0,0–145,5); чистый хаб-эффект изолируется на B ≥ 100, где cliques сходятся к random (при B = 100: 222,8 vs 220,0; при B = 500: 47,3 vs 46,5), а хабы держат преимущество: +14–19 % у union-хабов, до +27,7 % у top-BA (251,0/255,1 против 220,0 при B = 100; 55,4/59,4 против 46,5 при B = 500).
Факты прогона: полный пайплайн 36 с; 2 841 каскад (B 1 600 + A 1 080 + C 160 + gif); stdout двух прогонов идентичен; fig9/fig10 байтово идентичны публикации v1.2 (эксперимент B и gif не менялись — md5 совпадают); gif — 20 логических кадров (14 раундов + посев + 5 финальных; в ориентире 15–40 SPEC §7 v1.3; PIL склеивает неотличимые кадры — 15 физических, длительности сохранены; файл 2,3 МБ), охват показанного каскада 48,3 % N_gif.
figures/fig8_reach_per_seed.png — эксперимент A, 4 стратегии (181 КБ)figures/fig9_phase_diagram.png — эксперимент B, две панели (200 КБ)figures/fig10_cascade.gif — complex-каскад на N_gif = 4 000 (2,3 МБ)sim2/tonify_graph_sim.py — вся симуляция; python3 sim2/tonify_graph_sim.pyMIT.