| from __future__ import annotations |
|
|
| import importlib.util |
| import itertools |
| import json |
| from pathlib import Path |
|
|
| import numpy as np |
| import pytest |
|
|
| from cascade.interface import DataGenerator |
| from cascade.interface.generator import check_series |
| from cascade.interface.static_guard import scan_file |
| from cascade.interface.validation import ( |
| check_config, |
| check_repo_layout, |
| check_requirements_hash_locked, |
| ) |
| from cascade.miner.verify import verify_repo |
| from cascade.shared.config import load_chain_config |
|
|
|
|
| ROOT = Path(__file__).resolve().parents[1] |
| CASCADE = Path("/root/91/cascade") |
| HEAT_BUDGET = 6_660_000_000 |
| FINAL_BUDGET = 39_960_000_000 |
|
|
|
|
| def _module(): |
| spec = importlib.util.spec_from_file_location( |
| "fullclock_zero_cleanroom_generator", ROOT / "generator.py" |
| ) |
| module = importlib.util.module_from_spec(spec) |
| assert spec.loader is not None |
| spec.loader.exec_module(module) |
| return module |
|
|
|
|
| def _rows(seed: int, n: int, root: Path = ROOT): |
| return list(_module().Generator(str(root), seed=seed).generate(n)) |
|
|
|
|
| def test_contract_exact_partial_chunk_and_determinism(): |
| module = _module() |
| gen = module.Generator(str(ROOT), seed=73) |
| assert isinstance(gen, DataGenerator) |
| n = gen._chunk_size + 3 |
| first = list(gen.generate(n)) |
| second = list(module.Generator(str(ROOT), seed=73).generate(n)) |
| assert len(first) == len(second) == n |
| for index, (left, right) in enumerate(zip(first, second, strict=True)): |
| check_series( |
| left, min_length=64, max_length=4096, max_channels=1, index=index |
| ) |
| assert left.shape == (4096,) |
| assert left.flags.c_contiguous |
| assert np.array_equal(left, right) |
| assert np.isfinite(left).all() |
| assert np.ptp(left) > 0.0 |
| keys = {row.tobytes() for row in first} |
| assert len(keys) == n |
|
|
|
|
| def test_huge_request_is_bounded_by_fixed_chunk(monkeypatch): |
| module = _module() |
| gen = module.Generator(str(ROOT), seed=91) |
| observed: list[int] = [] |
| original = gen._family_batch |
|
|
| def wrapped(rng, family, count): |
| observed.append(int(count)) |
| return original(rng, family, count) |
|
|
| monkeypatch.setattr(gen, "_family_batch", wrapped) |
| rows = list(itertools.islice(gen.generate(624_375_002), gen._chunk_size + 1)) |
| assert len(rows) == gen._chunk_size + 1 |
| assert observed and max(observed) <= gen._chunk_size |
|
|
|
|
| def test_seed_changes_corpus(): |
| left = _rows(10, 32) |
| right = _rows(11, 32) |
| assert any( |
| not np.array_equal(a, b) |
| for a, b in zip(left, right, strict=True) |
| ) |
|
|
|
|
| def test_rng_resets_partial_restart_and_global_state_is_untouched(): |
| module = _module() |
| gen = module.Generator(str(ROOT), seed=104) |
| first = list(itertools.islice(gen.generate(104_062_502), 67)) |
| second = list(itertools.islice(gen.generate(104_062_502), 67)) |
| assert all( |
| np.array_equal(left, right) |
| for left, right in zip(first, second, strict=True) |
| ) |
| np.random.seed(611) |
| expected = np.random.random(8) |
| np.random.seed(611) |
| list(itertools.islice(gen.generate(104_062_502), 5)) |
| assert np.array_equal(np.random.random(8), expected) |
|
|
|
|
| def test_component_lanes_cannot_advance_each_other(): |
| gen = _module().Generator(str(ROOT), seed=902) |
| direct = gen._rng(0x0401) |
| expected = [gen._source_batch(direct, 1, size)[0] for size in (2, 5, 3)] |
|
|
| stock = gen._rng(0x0400) |
| market = gen._rng(0x0401) |
| actual = [] |
| for index, size in enumerate((2, 5, 3)): |
| gen._source_batch(stock, 0, index + 1) |
| actual.append(gen._source_batch(market, 1, size)[0]) |
| assert all( |
| np.array_equal(left, right) |
| for left, right in zip(actual, expected, strict=True) |
| ) |
|
|
|
|
| def test_zero_and_enabled_source_configs_share_every_unselected_base_row(tmp_path): |
| cfg = json.loads((ROOT / "config.json").read_text(encoding="utf-8")) |
| cfg["source_rate_start"] = { |
| "stock_flow": 0.004, |
| "market": 0.0, |
| "weather_load": 0.003, |
| "weekly_count": 0.003, |
| } |
| cfg["source_rate_final"] = { |
| "stock_flow": 0.032, |
| "market": 0.024, |
| "weather_load": 0.016, |
| "weekly_count": 0.008, |
| } |
| (tmp_path / "config.json").write_text(json.dumps(cfg), encoding="utf-8") |
| module = _module() |
| disabled = module.Generator(str(ROOT), seed=814) |
| enabled = module.Generator(str(tmp_path), seed=814) |
| n = 512 |
| left = list(enabled.generate(n)) |
| right = list(disabled.generate(n)) |
| kinds = enabled._select_sources(enabled._rng(0x0300), 0, n, n) |
| assert np.any(kinds >= 0) |
| assert all( |
| np.array_equal(left[index], right[index]) |
| for index in np.flatnonzero(kinds < 0) |
| ) |
|
|
|
|
| def test_every_family_and_source_is_finite_nonconstant_and_integer_when_marked(): |
| module = _module() |
| gen = module.Generator(str(ROOT), seed=512) |
| for family in range(module.FAMILY_COUNT): |
| values, integer = gen._family_batch( |
| gen._rng(0x7000 + family), family, 8 |
| ) |
| assert values.shape == (8, 4096) |
| assert np.isfinite(values).all() |
| assert np.all(np.ptp(values, axis=1) > 0.0) |
| if integer: |
| assert np.array_equal(values, np.rint(values)) |
| for kind in range(4): |
| values, integer = gen._source_batch(gen._rng(0x7100 + kind), kind, 32) |
| assert values.shape == (32, 4096) |
| assert np.isfinite(values).all() |
| assert np.all(np.ptp(values, axis=1) > 0.0) |
| integer_rows = np.full(32, integer) if np.ndim(integer) == 0 else integer |
| if np.any(integer_rows): |
| assert np.array_equal( |
| values[integer_rows], np.rint(values[integer_rows]) |
| ) |
|
|
|
|
| def test_market_source_returns_per_row_integer_mask(): |
| gen = _module().Generator(str(ROOT), seed=902) |
| values, integer_rows = gen._source_batch(gen._rng(0x999), 1, 64) |
| assert isinstance(integer_rows, np.ndarray) |
| assert integer_rows.dtype == np.bool_ |
| assert integer_rows.shape == (64,) |
| assert np.any(integer_rows) and np.any(~integer_rows) |
| assert np.array_equal( |
| values[integer_rows], np.rint(values[integer_rows]) |
| ) |
| assert np.any(values[~integer_rows] != np.rint(values[~integer_rows])) |
|
|
|
|
| def test_pointwise_sanitizer_and_linear_filters_are_prefix_causal(): |
| module = _module() |
| prefix = np.asarray([1.2, np.nan, 5.7, np.inf, -4.2]) |
| left = module._causal_sanitize( |
| np.concatenate((prefix, np.ones(10))), cap=100.0 |
| ) |
| right = module._causal_sanitize( |
| np.concatenate((prefix, np.full(10, -99.0))), cap=100.0 |
| ) |
| assert np.array_equal(left[: prefix.size], right[: prefix.size]) |
|
|
| rng = np.random.default_rng(8) |
| forcing = rng.normal(size=(7, 256)) |
| altered = forcing.copy() |
| altered[:, 111:] = rng.normal(size=altered[:, 111:].shape) |
| initial = rng.normal(size=7) |
| phi = rng.uniform(-0.3, 0.9, size=7) |
| a = module._ar1_rows(forcing, phi, initial) |
| b = module._ar1_rows(altered, phi, initial) |
| assert np.array_equal(a[:, :111], b[:, :111]) |
|
|
|
|
| @pytest.mark.parametrize( |
| ("budget", "upper", "consumed", "terminal_row"), |
| [ |
| ( |
| HEAT_BUDGET, |
| 104_062_502, |
| 1_625_977, |
| 1_056_885, |
| ), |
| ( |
| FINAL_BUDGET, |
| 624_375_002, |
| 9_755_860, |
| 6_341_309, |
| ), |
| ], |
| ) |
| def test_exact_public_source_and_base_clock_contract( |
| budget, upper, consumed, terminal_row |
| ): |
| gen = _module().Generator(str(ROOT), seed=4) |
| assert budget // 64 + 2 == upper |
| assert gen._estimated_consumed_rows(upper) == consumed |
| assert (budget + 4095) // 4096 == consumed |
| assert gen._progress(terminal_row - 1, upper) < 1.0 |
| assert gen._progress(terminal_row, upper) == 1.0 |
| assert gen._source_progress(terminal_row - 1, upper) < 1.0 |
| assert gen._source_progress(terminal_row, upper) == 1.0 |
| assert gen._progress(consumed - 1, upper) == 1.0 |
| assert gen._progress(terminal_row, upper) == gen._source_progress( |
| terminal_row, upper |
| ) |
| assert np.array_equal(gen._source_rates(0, upper), gen._rate_start) |
| assert np.array_equal( |
| gen._source_rates(terminal_row, upper), gen._rate_final |
| ) |
| probe = np.asarray([0, 1, terminal_row - 1, terminal_row]) |
| source_vector = gen._source_progress_chunk(0, terminal_row + 1, upper)[ |
| probe |
| ] |
| base_vector = gen._progress_chunk(0, terminal_row + 1, upper)[probe] |
| source_scalar = np.asarray( |
| [gen._source_progress(int(row), upper) for row in probe] |
| ) |
| base_scalar = np.asarray([gen._progress(int(row), upper) for row in probe]) |
| assert np.array_equal(source_vector, source_scalar) |
| assert np.array_equal(base_vector, base_scalar) |
| assert np.array_equal(base_vector, source_vector) |
|
|
|
|
| def test_zero_overlay_component_mapping_and_rates(): |
| cfg = json.loads((ROOT / "config.json").read_text(encoding="utf-8")) |
| assert list(cfg["source_rate_start"]) == [ |
| "stock_flow", |
| "market", |
| "weather_load", |
| "weekly_count", |
| ] |
| assert list(cfg["source_rate_start"].values()) == [ |
| 0.0, |
| 0.0, |
| 0.0, |
| 0.0, |
| ] |
| assert list(cfg["source_rate_final"].values()) == [ |
| 0.0, |
| 0.0, |
| 0.0, |
| 0.0, |
| ] |
| assert sum(cfg["source_rate_start"].values()) == 0.0 |
| assert sum(cfg["source_rate_final"].values()) == 0.0 |
| gen = _module().Generator(str(ROOT), seed=3) |
| kinds = gen._select_sources(gen._rng(0x0300), 0, 8192, 104_062_502) |
| assert np.all(kinds == -1) |
|
|
|
|
| @pytest.mark.parametrize("value", [0, -1, 4097, 1.5, True]) |
| def test_rejects_invalid_chunk_size(tmp_path, value): |
| cfg = json.loads((ROOT / "config.json").read_text(encoding="utf-8")) |
| cfg["chunk_size"] = value |
| (tmp_path / "config.json").write_text(json.dumps(cfg), encoding="utf-8") |
| with pytest.raises(ValueError, match="chunk_size"): |
| _module().Generator(str(tmp_path), seed=1) |
|
|
|
|
| def test_static_cascade_validation(): |
| cfg = load_chain_config(CASCADE / "chain.toml") |
| assert check_repo_layout(ROOT).ok |
| assert check_config(ROOT).ok |
| assert check_requirements_hash_locked( |
| ROOT / "requirements.txt", |
| allowed=cfg.dependencies.allowed, |
| max_packages=cfg.dependencies.max_packages, |
| ).ok |
| assert scan_file(ROOT / "generator.py", cfg.static_guard.blocked).ok |
| report = verify_repo(ROOT, cfg, skip_runtime=True) |
| assert report.ok and report.runtime_skipped |
|
|