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).
fDwie 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ś.
pip install -r requirements.txt
Wymaga tylko numpy (Python 3.9+).
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)
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.
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.
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ć.
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/.
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.
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.