diff --git a/generator/README.md b/generator/README.md index 8faa725..89e5ad2 100644 --- a/generator/README.md +++ b/generator/README.md @@ -7,6 +7,33 @@ События уже есть: день-функция отдаёт по паре (зерно, D) упорядоченный поток pageview. Торговые события и запуск снаружи — за следующими тикетами. +## Как это работает + +> Раздел черновой. По сути он верен, но на понятность читателем со стороны не +> выверен: пишет его тот, кто держит устройство генератора в голове, а это +> худший судья понятности. Выверка — вместе с путеводителем, тикет #48. + +Цепочка одна и всегда та же: корневое зерно → подпотоки по позиции в дереве +→ когорта дня (кто впервые пришёл, сколько раз вернётся, чей паспорт какой) +→ аудитория дня, то есть когорта плюс возвраты когорт окна → визиты этих кук +→ строки событий. Мир при этом ленив: когорта считается по требованию, а до +D0 живёт предыстория, поэтому любой день собирается сам по себе — прожитая +история для него не нужна и на него не влияет. + +Главное правило для того, кто придёт следующим: **внутри подпотока порядок +бросков — часть контракта.** Броски раздаёт один генератор подряд, и k-й +бросок достаётся тому, кто спросил k-м. Приписать новый бросок в конец +функции безопасно: у прежних он ничего не отнимает. Вставить в середину — +значит сдвинуть все броски после него, а с ними и весь мир: события того же +дня станут другими, счётчики канонического мира разойдутся с манифестом, и +поймается это не ошибкой, а красным чеком. Ровно поэтому паспорта кук в +`plan.cohort` бросаются последними. + +Случайность целочисленная — только диапазоны и выбор по целым весам: готовые +распределения numpy расходятся между версиями и архитектурами, а обещано +побайтовое совпадение (спека, раздел 2). Отсюда `weights.py` вместо +`rng.choice` с вероятностями. + ## Что где лежит - `src/clickstream_generator/world.py` — конфигурация мира: все его числа