"""Test level transition operator."""
import numpy as np
from mercurial.core.patterns import Constraints, Pattern, StabilityRegime
from mercurial.hierarchy.transition import LevelTransitionOperator
# Create a low-level pattern (e.g., quantum fluctuations)
low_state = np.random.normal(0, 0.1, size=(100, 1))
low_pattern = Pattern(low_state, Constraints(), StabilityRegime(), "quantum")
# Target constraints for macroscopic level (e.g., positivity)
[docs]
def positivity(v):
return np.sum(np.maximum(0, -v.flatten())) # penalize negative values
macro_constraints = Constraints(inequality=[positivity])
# Transition operator
trans = LevelTransitionOperator(coupling_strength=0.2)
# Apply transition from low level (≈2) to macroscopic level (≈7)
# We don't know exact levels, so use current_level=None
macro_pattern = trans.apply_transition(
low_pattern, target_level=7, target_constraints=macro_constraints, current_level=2
)
print("Source pattern (low level):")
print(f" Shape: {low_pattern.V.shape}")
print(f" Mean: {np.mean(low_pattern.V):.4f}, Std: {np.std(low_pattern.V):.4f}")
print(f" Min: {np.min(low_pattern.V):.4f}, Max: {np.max(low_pattern.V):.4f}")
print("\nTransferred pattern (macroscopic level):")
print(f" Shape: {macro_pattern.V.shape}")
print(f" Mean: {np.mean(macro_pattern.V):.4f}, Std: {np.std(macro_pattern.V):.4f}")
print(f" Min: {np.min(macro_pattern.V):.4f}, Max: {np.max(macro_pattern.V):.4f}")
# Check positivity constraint
violation = macro_constraints.violation_norm(macro_pattern.V.flatten())
print(f"\nConstraint violation after transition: {violation:.6f}")