import numpy as np

def check_stability(levels, foam_metrics, tol=1e-6):
    """
    Проверяет условия теоремы устойчивости:
    - Φ_l* = 0 для всех l (с допуском)
    - ΔΦ_l = 0 для всех l (с допуском)
    - Δ²Φ_l > 0 для всех внутренних l
    Возвращает True, если все условия выполнены.
    """
    L = len(levels)
    foams = []
    for l in range(L):
        metric = foam_metrics[l] if isinstance(foam_metrics, list) else foam_metrics
        foams.append(metric.compute(levels[l].state, levels[l].context))

    # Проверка Φ ≈ 0
    if any(f > tol for f in foams):
        return False

    # ΔΦ = Φ_{l+1} - Φ_l
    dPhi = [foams[l+1] - foams[l] for l in range(L-1)]
    if any(abs(d) > tol for d in dPhi):
        return False

    # Δ²Φ = dPhi[l+1] - dPhi[l] = Φ_{l+2} - 2Φ_{l+1} + Φ_l
    for l in range(L-2):
        d2 = foams[l+2] - 2*foams[l+1] + foams[l]
        if d2 <= -tol:  # должно быть > 0 (выпуклость вверх, т.е. положительная кривизна)
            return False

    return True
