core/tests/test_adr_0242_fibonacci.py
Shay bbd3b6678f feat(adr-0242): Drive V1 cert discipline + doc align five vectors
Close the gap between cohesion packing/search and Drive ADR-0242:

D0 — Expand ADR-0242 to five-vector + sovereignty thesis (title matches Drive).
D8 — Land docs/analysis/fibonacci_applications_in_core_substrate.md.
D1 — FibonacciSearchCertificate | OptimizationFailure (never bare float);
     content-addressed cert_id; dual-run stable digest.
D2 — propose_kappa_from_search / goldtether.propose_kappa_line_search;
     failure → baseline κ=1.0 (no state mutation).
D4 — ALLOCATOR_VERSION golden_angle_v1 + layout descriptor.

Fidelity §12 honest: V1/V3 green; V2 table-only; V4/V5 staged.
2026-07-14 21:08:02 -07:00

146 lines
4.1 KiB
Python

"""ADR-0242 V1 — evidence-gated Fibonacci section search."""
from __future__ import annotations
from core.physics.fibonacci_search import (
BASELINE_KAPPA,
BoundedUnimodalObjective,
FibonacciSearchCertificate,
OptimizationFailure,
fibonacci_section_search,
propose_kappa_from_search,
)
def test_fibonacci_search_returns_certificate_near_known_min():
objective = BoundedUnimodalObjective(
lower=0.1,
upper=2.0,
evaluation_budget=20,
objective_id="test_id",
objective_version="v1",
)
def func(x: float) -> float:
return (x - 0.789) ** 2
result = fibonacci_section_search(objective, func)
assert isinstance(result, FibonacciSearchCertificate)
assert abs(result.minimizer - 0.789) < 1e-3
assert result.evaluations == 20
assert len(result.ordered_points) == 20
assert len(result.ordered_values) == 20
assert result.cert_id
assert len(result.cert_id) == 64
def test_certificate_digest_stable_dual_run():
objective = BoundedUnimodalObjective(
lower=-5.0,
upper=5.0,
evaluation_budget=15,
objective_id="stable",
objective_version="v1",
)
def func(x: float) -> float:
return x**2
a = fibonacci_section_search(objective, func)
b = fibonacci_section_search(objective, func)
assert isinstance(a, FibonacciSearchCertificate)
assert isinstance(b, FibonacciSearchCertificate)
assert a.cert_id == b.cert_id
assert a.as_dict() == b.as_dict()
def test_fibonacci_search_eval_count_equals_budget():
objective = BoundedUnimodalObjective(
lower=-5.0,
upper=5.0,
evaluation_budget=15,
objective_id="test_id2",
objective_version="v1",
)
def func(x: float) -> float:
return x**2
result = fibonacci_section_search(objective, func)
assert isinstance(result, FibonacciSearchCertificate)
assert result.evaluations == 15
def test_fibonacci_search_nonfinite_returns_failure():
objective = BoundedUnimodalObjective(
lower=-1.0,
upper=1.0,
evaluation_budget=10,
objective_id="nan",
objective_version="v1",
)
def func(x: float) -> float:
return float("nan")
result = fibonacci_section_search(objective, func)
assert isinstance(result, OptimizationFailure)
assert "nonfinite" in result.reason
def test_fibonacci_search_unimodality_returns_failure():
objective = BoundedUnimodalObjective(
lower=-2.0,
upper=2.0,
evaluation_budget=10,
objective_id="multi",
objective_version="v1",
)
def func(x: float) -> float:
return x**4 - x**2
result = fibonacci_section_search(objective, func)
assert isinstance(result, OptimizationFailure)
assert "unimodality" in result.reason
def test_never_returns_bare_float():
objective = BoundedUnimodalObjective(
lower=0.0,
upper=1.0,
evaluation_budget=8,
objective_id="type",
objective_version="v1",
)
result = fibonacci_section_search(objective, lambda x: (x - 0.3) ** 2)
assert not isinstance(result, float)
assert isinstance(result, (FibonacciSearchCertificate, OptimizationFailure))
def test_propose_kappa_cert_uses_minimizer():
objective = BoundedUnimodalObjective(
lower=0.1,
upper=2.0,
evaluation_budget=16,
objective_id="kappa",
objective_version="v1",
)
result = fibonacci_section_search(objective, lambda x: (x - 0.5) ** 2)
kappa, outcome = propose_kappa_from_search(result)
assert isinstance(outcome, FibonacciSearchCertificate)
assert abs(kappa - 0.5) < 1e-2
def test_propose_kappa_failure_falls_back_to_baseline():
objective = BoundedUnimodalObjective(
lower=-2.0,
upper=2.0,
evaluation_budget=10,
objective_id="kappa_fail",
objective_version="v1",
)
result = fibonacci_section_search(objective, lambda x: x**4 - x**2)
kappa, outcome = propose_kappa_from_search(result)
assert isinstance(outcome, OptimizationFailure)
assert kappa == BASELINE_KAPPA