fix(generator): правки по двум линиям ревью плана состава
- Зачем:
- ревью нашло два места, где код и документы говорили неправду, и
несколько мест, где имена или комментарии вводили в заблуждение.
- Что:
- обещание докстроки `seeds.py` подкреплено тестом: адрес в дереве
даёт тот же подпоток, что цепочка `spawn`.
- в тесте гарантии пар убран сторож-тавтология, вместо него проверка,
что заказы назначены с двух разных кук.
- `Cohort.visitors_on` — «кто пришёл в день D» спрашивается у когорты,
а не собирается снаружи из четырёх её массивов.
- имена: `CLIENT_ID_LIMIT`, `_RETURN_*_CUMULATIVE`, `first_of_day`,
`WEEKLY_PROFILE_PERCENT` — профиль недели один на весь мир, по нему
же пойдёт трафик дня-функции (#39).
- спека: в дерево зёрен внесена ветвь предыстории; окно активности —
от первого визита человека, общее на обе куки (иначе загляд назад
ленивой формы удваивается); оценка накопленной аудитории больше не
спорит с измерением.
- CONTEXT.md: «подпоток» и «конфигурация мира».
- Проверка:
- make test (296), make lint, make typecheck; мутации перепроверены
после переноса среза дня в `Cohort`.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -141,7 +141,7 @@ def test_every_pair_orders_from_both_cookies_on_the_axis(day: int):
|
||||
for cookies, days in zip(
|
||||
cohort.pair_cookies.tolist(), cohort.pair_order_days.tolist(), strict=True
|
||||
):
|
||||
assert len(set(days)) == len(days) or cookies[0] != cookies[1]
|
||||
assert cookies[0] != cookies[1], "заказы пары — с двух разных кук"
|
||||
for cookie, order_day in zip(cookies, days, strict=True):
|
||||
assert order_day >= 0
|
||||
assert (cookie, order_day) in visits
|
||||
@@ -168,8 +168,8 @@ def test_the_influx_breathes_with_the_week():
|
||||
counters = plan.counters(CANONICAL_SEED, SNAPSHOT_DAYS)
|
||||
weekdays = [size for day, size in enumerate(counters.new_cookies) if day % 7 < 5]
|
||||
weekend = [size for day, size in enumerate(counters.new_cookies) if day % 7 >= 5]
|
||||
expected = mean(world.WEEKLY_INFLUX_PERCENT[5:]) / mean(
|
||||
world.WEEKLY_INFLUX_PERCENT[:5]
|
||||
expected = mean(world.WEEKLY_PROFILE_PERCENT[5:]) / mean(
|
||||
world.WEEKLY_PROFILE_PERCENT[:5]
|
||||
)
|
||||
assert abs(mean(weekend) / mean(weekdays) - expected) < 0.03
|
||||
|
||||
|
||||
@@ -25,6 +25,22 @@ def test_canonical_seed_is_a_repository_constant():
|
||||
assert isinstance(CANONICAL_SEED, int)
|
||||
|
||||
|
||||
def test_addressing_a_subtree_equals_spawning_down_to_it():
|
||||
"""Свойство numpy, на котором стоит вся раздача зерна.
|
||||
|
||||
Потомок определяется парой (зерно, позиция в дереве): выписанный руками
|
||||
`spawn_key` даёт тот же подпоток, что цепочка `spawn`. Иначе результат
|
||||
зависел бы от порядка вычислений, и «параллельно равно последовательно»
|
||||
не выполнялось бы.
|
||||
"""
|
||||
chained = np.random.SeedSequence(CANONICAL_SEED).spawn(1)[0].spawn(4)[3]
|
||||
addressed = np.random.SeedSequence(CANONICAL_SEED, spawn_key=(0, 3))
|
||||
assert chained.spawn_key == addressed.spawn_key
|
||||
assert first_draws(np.random.Generator(np.random.PCG64(chained))) == first_draws(
|
||||
np.random.Generator(np.random.PCG64(addressed))
|
||||
)
|
||||
|
||||
|
||||
def test_stream_is_a_position_in_the_tree_not_an_order_of_calls():
|
||||
straight = first_draws(cohort_stream(CANONICAL_SEED, 5))
|
||||
cohort_stream(CANONICAL_SEED, 0)
|
||||
|
||||
@@ -21,8 +21,8 @@ def test_origin_is_a_monday():
|
||||
|
||||
|
||||
def test_weekly_profile_covers_a_week_and_averages_to_one():
|
||||
assert len(world.WEEKLY_INFLUX_PERCENT) == 7
|
||||
assert sum(world.WEEKLY_INFLUX_PERCENT) == 700
|
||||
assert len(world.WEEKLY_PROFILE_PERCENT) == 7
|
||||
assert sum(world.WEEKLY_PROFILE_PERCENT) == 700
|
||||
|
||||
|
||||
def test_returning_share_matches_the_spec():
|
||||
|
||||
Reference in New Issue
Block a user