TIMDR-Modal-Formalism

Pierwsza implementacja gałęzi K (modalnej) TIMDR jako kodu — dotąd istniały tylko aksjomaty (GIA-TIMDR/docs/theory/Axioms_K_TIMDR.md), bez żadnej realizacji numerycznej, w odróżnieniu od gałęzi M/S (TIMDR-Math-Formalism) i G (TIMDR-Geometry-Formalism).

Modalność (f,φ,A) — Aksjomat 3, dosłownie. Interferencja I(t)=ΣAᵢsin(2πfᵢt+φᵢ) — Aksjomat 4, dosłownie. Rezonans modalny |fᵢ-fⱼ|<ε_f ∧ |φᵢ-φⱼ|<ε_φ — Aksjomat 5, dosłownie. Plus jedna nowa funkcja, local_time_from_global: formalizacja postulatu z §7.3 głównego README GIA-TIMDR, “t_lokalne=f(τ_globalne)”, jako część Chronoprocesu Ξ=(T,x,Γ,φ) — pełny opis: GIA-TIMDR/docs/theory/TIMDR_Chronoprocess.md (§4).

🔀 Mapa synchronizacji faz f

Dwie modalności, “lokalna” i “globalna”. f znajduje taki czas lokalny, przy którym FAZA CHWILOWA (argument sinusa, θ(t)=2πft+φ) oscylatora lokalnego zrównuje się z fazą chwilową oscylatora globalnego w chwili τ_globalne:

t_lokalne = (f_globalne/f_lokalne)·τ_globalne
            + (φ_globalne-φ_lokalne)/(2π·f_lokalne)

Granica zakresu, jawnie: ta mapa jest AFINICZNA, bo Aksjomaty K3/K4 modelują każdą modalność jako oscylator o STAŁYCH parametrach, nie sprzężony (Kuramoto-style) oscylator o dynamicznie zmieniającej się częstotliwości. Pełniejsza, nieliniowa mapa synchronizacji wymagałaby ROZSZERZENIA Axioms_K o dynamikę sprzężenia — to jest jawnie NIE zrobione tutaj. To, co jest, jest poprawną, sprawdzalną formalizacją danego postulatu, przy aksjomatach dokładnie takich, jakie są dziś.

🔧 Instalacja

pip install -r requirements.txt

Wymaga tylko numpy (Python 3.9+).

🚀 Szybki start

from timdr_modal import Modality, local_time_from_global, is_resonant, interference

local = Modality(f=1.0, phi=0.0, A=1.0)
global_ = Modality(f=2.0, phi=0.0, A=1.0)

t_lokalne = local_time_from_global(local, global_, tau_global=1.0)
print(t_lokalne)  # 2.0 -- lokalny (wolniejszy) oscylator potrzebuje 2x
                   # wiecej czasu, zeby zamiesc te sama faze co globalny

print(is_resonant(local, global_, eps_f=0.5, eps_phi=0.1))  # False (f rozne o 1.0)

print(interference([local, global_], t=0.0))  # 0.0 (obie fazy = 0 w t=0)

🧪 Testy

pip install pytest
pytest tests/ -v

Testy używają ręcznie policzalnych przypadków (patrz komentarze w tests/test_phase_sync.py), plus test własności ogólnej: dla dowolnej pary modalności i dowolnego τ_globalne, θ_lokalne(f(τ_globalne)) == θ_globalne(τ_globalne) — to jest dokładnie definiująca właściwość mapy f, nie tylko przypadek brzegowy.

✅ Zweryfikowane. pytest tests/ -v — 17/17 testów przeszło. Jeden test (test_is_resonant_frequency_at_threshold_is_false) padł przy pierwszym uruchomieniu z powodu błędu w samym teście (float 1.0+1e-6 nie daje dokładnie różnicy 1e-6), nie w is_resonant() — naprawiony w tests/test_phase_sync.py.

🌍 Walidacja na realnych danych + kalibracja

timdr_modal/real_data_validation.py — pierwszy kontakt is_resonant() (Aksjomat 5) z prawdziwymi, zmierzonymi danymi (dotąd testowany wyłącznie na ręcznie dobranych liczbach syntetycznych — patrz tests/test_phase_sync.py). Dane: dwa prawdziwe, ciągłe ślady sejsmiczne (stacje CI.CLC i CI.RIO, kanał HHZ, 100 Hz) zarejestrowane podczas faktycznego trzęsienia ziemi M7.1 Ridgecrest 2019-07-06, pobrane przez autora z IRIS/EarthScope (patrz TIMDR-Earthquake-Core/real_waveform_test.py w repo siostrzanym). (f,φ,A) wydobywane są per 10-sekundowe okno przez szczyt FFT, z fazą przeliczoną na wspólny punkt odniesienia t=0 (obie stacje mają identyczny czas startu śladu). Test permutacyjny + kontrola pozytywna (wzorzec z GIA-TIMDR/docs/theory/Resonance_M_Operator_Empiryczny.md §3), oraz calibrate_epsilons(), która proponuje eps_f/eps_φ z rozkładu realnych różnic albo — uczciwie — zgłasza brak mocy statystycznej zamiast zgadywać liczby. Pełna metodologia i jawne zastrzeżenie o bardzo małej próbie (~36 okien z jednego zdarzenia) w docstringu modułu; testy w tests/test_real_data_validation.py.

Skrypty uruchomieniowe testów poniżej (_mars_das_k_run*.py, _grid_freq_k_run*.py) szukają danych w katalogu ze zmiennej środowiskowej TIMDR_DATA, domyślnie ../DATA obok repozytorium, i przed obliczeniami sprawdzają sha256 pliku. Zależności: pip install -r requirements-validation.txt.

Drugi test: prawdziwy sygnał ŚWIATŁOWODOWY (DAS), nie sejsmometryczny

docs/PREREG_K_MARS_DAS_v0.1.md + docs/RESULT_K_MARS_DAS_v0.1.md — pierwszy test is_resonant() na danych Distributed Acoustic Sensing: MARS/SeaFOAM, roczny eksperyment DAS na 52-km podmorskim kablu telekomunikacyjnym w Monterey Bay (publiczny zbiór PubDAS/Hugging Face, AI4EPS/quakeflow_das). Dwa kanały (skrajne końce ~14.8 km zarejestrowanego odcinka, reguła geometryczna zamrożona przed pobraniem) jako modalności — w odróżnieniu od Ridgecrest, wszystkie kanały DAS dzielą JEDEN zegar interrogatora, więc nie trzeba przeliczenia offsetu między stacjami. Wynik: kontrola pozytywna przechodzi (p≈0.0005, mechanika testu działa), ale test główny NOT SUPPORTED (p=0.365, 1/60 okien rezonansowych — wynik zgodny z losowym parowaniem okien). Uczciwy wynik negatywny, nie porażka metody — pełne ograniczenia i “co dalej” w RESULT_K_MARS_DAS_v0.1.md.

v0.2 (poprawka doboru kanałów): v0.1 użył skrajnych końców kabla (~14,8 km) — dla kabla JEDNOKIERUNKOWEGO (MARS: brzeg→węzeł, bez pętli) to wprowadza niedopasowanie czasowe: fala potrzebuje dziesiątek sekund, żeby dotrzeć z jednego końca na drugi, znacznie dłużej niż window_sec=1.0s, więc porównywane okna nie były tym samym fragmentem fali. v0.2 (docs/PREREG_K_MARS_DAS_v0.2.md + RESULT_K_MARS_DAS_v0.2.md) używa bliskich kanałów (0 i 7, 36,4 m — poniżej progu opóźnienia, powyżej długości bazy pomiarowej 20 m). Wynik: NOT SUPPORTED, jeszcze mocniej (0/60 okien, p=1.0) — poprawka nie ujawniła ukrytego rezonansu, wzmacnia wniosek negatywny zamiast go podważać.

Trzeci test: częstotliwość sieci elektroenergetycznej (fizycznie najsilniej umotywowany kandydat)

docs/PREREG_K_GRID_FREQ_v0.1.md + docs/RESULT_K_GRID_FREQ_v0.1.md — test na danych odchylenia częstotliwości 50 Hz (Jumar i in., KIT, arXiv:2006.01771) w JEDNYM obszarze synchronicznym (Continental Europe): Lizbona (PT) vs Stambuł (TR), ~3400 km, para wybrana PRZED pobraniem pliku jako najbardziej rygorystyczny test (największy dystans). W odróżnieniu od Ridgecrest/MARS, fizyka sieci AC z definicji wymusza niemal identyczną częstotliwość w całym obszarze synchronicznym — to najsilniejszy a priori argument za wyrównaniem częstotliwości spośród wszystkich testów K dotąd. Okno 600 s (konwencja literatury oscylacji międzyobszarowych), 398 okien z najdłuższego ciągłego odcinka o poprawnej jakości pomiaru (66.4 h). Wynik: INCONCLUSIVE — nie z powodu braku sygnału, tylko dlatego, że kalibracja eps_f (metoda percentylowa) zdegenerowała się do 0.0 (96.5% okien miało DOKŁADNIE równą częstotliwość szczytową PT/TR, bo siatka FFT przy 600 s ma tylko ~10-11 możliwych wartości), co przez ostrą nierówność w is_resonant() unieważniło nawet kontrolę pozytywną (kanał sparowany sam ze sobą). Sam fakt niemal-zawsze-identycznej częstotliwości jest sugestywny, ale nie przeszedł przez bramkę kontrolną, więc nie może być zgłoszony jako potwierdzony — pełna diagnoza mechanizmu w RESULT_K_GRID_FREQ_v0.1.md.

v0.2 (poprawka kalibracji — zero-padding FFT 16×): przewidywanie z prerejestracji v0.2, że drobniejsza siatka FFT usunie masę punktową w rozkładzie |Δf|, zostało sfałszowane — odsetek dokładnych wiązań spadł tylko nieznacznie (96.5%→94.7%), eps_f wciąż kalibruje się do 0.0, kontrola pozytywna wciąż nie przechodzi. Dodatkowa diagnoza: PT i TR trafiają w ten sam dominujący bin FFT w 94.7% okien mimo ~50 kandydujących binów (przy niezależnych kanałach oczekiwane ~43%, bo szczyty obu kanałów skupiają się w kilku najniższych binach; ~2% zakładałoby równomierny rozkład) — sugestywna silna zgodność widmowa, ale niezgłaszalna jako potwierdzenie, bo test zaprojektowany był do wykrywania ciągłej bliskości, nie dyskretnej identyczności. Naprawa wymaga przeprojektowania samej statystyki testu (nie kolejnego parametru) — pełne szczegóły w RESULT_K_GRID_FREQ_v0.2.md. Audyt twierdzeń (docs/audit/) pokazał, że skrypt v0.2 dopełnia zerami okno bez wcześniejszego odjęcia średniej; po odjęciu średniej przed dopełnieniem odsetek wiązań spada z 94.7% do 85.9% — część trwałości wiązań wynikała z implementacji dopełnienia, nie tylko z danych.

v0.3 (nowa statystyka — korelacja krzyżowa) — PIERWSZY SUPPORTED w tym repo: zamiast dyskretnej ekstrakcji (f,φ,A)+is_resonant(), korelacja Pearsona zero-lag między odtrendowanymi oknami PT/TR (398 okien po 600 s). Wynik: mean(r_w)=0.90 (mediana 0.91), z=78 względem null permutacyjnego, p=0.0005, kontrola pozytywna przeszła (to PT sparowany sam ze sobą, r = 1 z definicji — sprawdza mechanikę, nie czułość testu) — SUPPORTED. Kluczowe zastrzeżenie interpretacyjne: domena (częstotliwość sieci AC w jednym obszarze synchronicznym) została wybrana WŁAŚNIE dlatego, że fizyka energetyki a priori GWARANTUJE wyrównanie częstotliwości — to potwierdza, że formalizm K poprawnie wykrywa znane zjawisko, gdy jest ono fizycznie zagwarantowane, a nie odkrycie nowego rezonansu w otwartej hipotezie (jak Ridgecrest/MARS DAS, które pozostają bez zmian: niejednoznaczny / NOT SUPPORTED). Nie spełnia kryteriów statusu “ustalony (diagnostyka)” (brak syntetycznej kontroli, jedna para lokalizacji) — pełna uczciwa interpretacja w RESULT_K_GRID_FREQ_v0.3.md.

v0.4 (replika na niezależnym oknie) — replikacja potwierdzona: dokładnie ta sama statystyka co v0.3, uruchomiona na drugim, ciągłym i nienachodzącym oknie tego samego pliku (305 okien, 2019-08-11, 10 dni po oknie v0.3). Wynik: mean(r_w)=0.92 (mediana 0.92), z=63, p=0.0005, kontrola pozytywna przeszła — SUPPORTED, spójne z v0.3 (mediany i IQR obu okien praktycznie się pokrywają). To domyka zastrzeżenie “brak repliki” z v0.3 — ale tylko na wymiarze OKNA CZASOWEGO: oba okna pochodzą z tego samego 41-dniowego pliku i miesiąca (sierpień 2019), więc replika na innym roku/źródle/parze lokalizacji pozostaje otwarta. Pełne szczegóły w RESULT_K_GRID_FREQ_v0.4.md.

v0.5 (replika na niezależnym pliku źródłowym) — druga replikacja potwierdzona (trzeci wynik SUPPORTED): ta sama statystyka, uruchomiona na osobnych, surowych plikach per-stacja 10 Hz (PT_LI01_100ms.zip/TUR-IS01_100ms.zip, KIT Power Grid Frequency Database, udostępnione osobno 2023-04-21) — inny plik i 10× wyższa rozdzielczość niż SYNC01.csv, okno przesunięte o ~3 tygodnie (2019-07-11/12 vs sierpień). Wynik: mean(r_w)=0.88 (mediana 0.88, IQR 0.86-0.93), z=18.2 (niżej niż v0.3/v0.4 głównie przez mniej okien: 44 vs 398/305), p=0.0005, kontrola pozytywna przeszła — SUPPORTED. Uczciwe zastrzeżenie: mimo osobnych plików to wciąż ta sama kampania pomiarowa 2019 i ta sama para stacji — prawdziwa replika na innym roku/innym źródle/innej parze lokalizacji pozostaje otwarta. Pełne szczegóły, w tym tabela porównawcza v0.3/v0.4/v0.5, w RESULT_K_GRID_FREQ_v0.5.md. Pre-rejestracje v0.4 i v0.5 trafiły do gita w tych samych commitach co wyniki (v0.1–v0.3 i oba testy DAS — wcześniej), więc ich kolejność potwierdza tylko treść plików. Wszystkie liczby v0.3–v0.5 odtwarzają się z surowych danych niezależną implementacją — patrz docs/audit/.

⚓ Kotwica modalna i przejście K→G (timdr_modal/modal_anchor.py)

Galąź K użyta w praktyce, przeniesiona 1:1 z wersji walidowanych pre-rejestrowanymi testami w GIA-TIMDR (zgodność bit w bit sprawdzona testami wzorcowymi, tests/test_modal_anchor.py):

Funkcja Co robi Wynik walidacji (GIA-TIMDR docs/geometry/)
anchor_frequencies samokorygująca kotwica: szczyt ±4% wokół częstotliwości modelu, interpolacja paraboliczna most KW51: AUC 1,00 (= OMA/SSI autorów), AR 0,67 — SUPPORTED; rama LANL: ciężkość ρ −0,57 → +0,98 — SUPPORTED; most Hell Bridge (sama kotwica): 0,65 vs AR 0,79 — NOT SUPPORTED
mode_shapes przejście K→G: H = S_i,ref / S_ref,ref przy kotwicy, obrót θ = ½·arg ΣH², ψ = Re(H·e^{−iθ}) — kształt modu ze znakiem Hell Bridge: sam kształt 0,78 vs AR 0,80 — NOT SUPPORTED; jako wejście przerwy ciągłości (TIMDR-Structural-Health): uszkodzenia pionowe 0,93–0,94
anchor_coherence dobór kotwic: γ² kanałów z odniesieniem, mediana i p10 ≥ 0,8 reguła z PREREG_HBTA_MODAL_CURVATURE_v0_2; test na danych Hell Bridge odtwarza tę samą decyzję (8 kandydatów → 6)
n_cycles, coherence_cycles wykonalność: N_cyk < 10 → sito bez szans; L_koh < N_cyk → zmienić zegar reguła wykonalności (docs/theory/TIMDR_Parametry_Przejsc.md)
align_signs, mac znak umowny kształtu; MAC jako znany odpowiednik —

Obserwacja z testów: kotwica sama wygrywa, gdy uszkodzenie zmienia globalną sztywność (KW51, LANL); przy uszkodzeniu lokalnym potrzebny jest most K→G i szukanie przerwy w przestrzeni. Uczciwie: przy rekonstrukcji reguły doboru kotwic p10 dla 12,79 Hz wychodzi 0,62 (PREREG podaje 0,50 — pierwotne liczenie nie było zapisane w kodzie); decyzja jest ta sama. Moduł wymaga scipy.

⚠️ Czego to NIE robi

Nie implementuje sprzężenia oscylatorów (Kuramoto-style), nie rozszerza Axioms_K o nowe aksjomaty, nie zamyka gałęzi K jako całości — rezonans modalny (Aksjomat 5) tu tylko sprawdzony na dwóch modalnościach o stałych parametrach, hierarchiczna struktura warstw R₁⊆R₂⊆...⊆Rₙ (Aksjomaty 8-10) nie jest tu w ogóle poruszona. To jest pierwsza, wąska instancja galęzi K jako kodu — punkt startowy, nie domknięcie.