"""Temporal activation sequences (SPECTRAL D.4)."""
from typing import List, Tuple
from .modalities import Modality, ModalityEnergyHierarchy
[docs]
class TemporalSequencing:
"""Models the order in which modalities activate."""
def __init__(self, hierarchy: ModalityEnergyHierarchy):
self.hierarchy = hierarchy
[docs]
def activation_sequence(
self, pattern_energy: float, pattern_power: float, threshold: float = 0.1
) -> List[Tuple[Modality, float]]:
"""
Return list of (modality, activation_time) for all modalities
whose probability exceeds threshold, sorted by time.
"""
results = []
for mod in Modality:
prob = self.hierarchy.manifestation_probability(mod, pattern_energy, pattern_power)
if prob > threshold:
t_act = self.hierarchy.activation_time(mod, pattern_power)
results.append((mod, t_act))
# Sort by activation time
results.sort(key=lambda x: x[1])
return results
[docs]
def first_modality(self, pattern_energy: float, pattern_power: float) -> Modality:
"""Return the modality that appears first."""
seq = self.activation_sequence(pattern_energy, pattern_power)
if seq:
return seq[0][0]
return Modality.AFFECTIVE # default fallback
[docs]
def sequence_coherence(
self, observed_sequence: List[Modality], expected_sequence: List[Modality]
) -> float:
"""
Compute similarity between observed and expected sequences.
Uses normalized Levenshtein-like ratio.
"""
if not expected_sequence:
return 0.0
matches = 0
min_len = min(len(observed_sequence), len(expected_sequence))
for i in range(min_len):
if observed_sequence[i] == expected_sequence[i]:
matches += 1
return matches / len(expected_sequence)