Source code for mercurial.spectral.sequencing

"""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)