Emergent Stratigraphic & Information Structures (ESIS) — Version Finale 2026
Abstract
. Emergent Stratigraphic & Information Structures (ESIS) — Version Finale 2026 Auteur : Kevin Fradier — Chercheur indépendant 🇫🇷Licence : CC BY-NC-ND 4.0Position épistémique : Neutralité stricte — ni affirmation ni négation ontologique Résumé ESIS fusionne les outils STaRS (local & inter-bassins) et ESE (structure informationnelle, séquence & spatial) dans un protocole unifié bottom-up, multi-domaines, falsifiable et reproductible. STaRS → diagnostic local des colonnes fossiles STaRS-NET → corrélations inter-bassins ESE → analyse structurelle de séquences et champs ESE-NET → test de structure globale / multi-domaine 🔑 Principe clé :ESIS ne dit pas ce qui s’est passé.Il indique jusqu’où les données peuvent parler sans qu’on leur fasse dire plus.C’est un diagnostic de tenue du signal, pas un récit. Protocole d’usage standardisé 1️⃣ Question scientifique standardisée Les variations observées entre plusieurs colonnes fossiles, ou entre séries d’observables, sont-elles compatibles avec du bruit taphonomique local ou nécessitent-elles une structure corrélée globale ? ⚠️ Pas de causalité. Pas de climat, extinction ou mécanisme.Seulement compatibilité structurelle. 2️⃣ Ordre d’exécution canonique Étape Module Action A STaRS Calcul local, robustesse sous bruit, hash. STOP si bassin non contraignant. B STaRS-NET Construction du réseau inter-bassins, test de robustesse, hash. C ESE Test structurel sur séquences / champs, signature moyenne, robustesse. D ESE-NET Analyse structure globale multi-domaines. 3️⃣ Tableau de décision final STaRS local STaRS-NET ESE-NET Statut scientifique ❌ – – Données non contraignantes ✅ ❌ – Signal local non corrélé ✅ ✅ ❌ Corrélation fragile ✅ ✅ ✅ Structure robuste détectée ⚠️ Aucune ligne n’autorise d’interprétation causale. 4️⃣ Sorties autorisées Courbes de diversité / abondance Enveloppes de bruit taphonomique Graphes réseau inter-bassins Scores (STaRS, NRSS, ESE) et hashes Table de synthèse multi-domaines ❌ Non autorisé : extinction, climat, histoire, causalité. 5️⃣ Ce que la communauté peut faire Reproduire les analyses Comparer des bassins ou séries de données Tester des jeux de données différents Invalider des publications trop narratives L’outil devient une infrastructure scientifique, pas une thèse. 6️⃣ Pourquoi c’est la fin logique STaRS-TIME → source d’incertitude, non un outil autonome STaRS-EXT → cas d’application pour tester artefacts, non un nouveau protocole Tout ajout futur → doit passer par ce protocole unifié Le cœur méthodologique est maintenant complet, sécurisé et multi-domaines. 7️⃣ Recommandations pour publication Publier seulement les outputs falsifiables (figures, scores, hashes) Fournir scripts reproductibles pour vérification Indiquer explicitement limites de non-interprétation Encourager reproduction et extension sur d’autres bassins ou types de données 8️⃣ Structure finale du dépôt GitHub ESIS/ ├─ README.md # Documentation complète ├─ LICENSE.md # CC BY-NC-ND 4.0 ├─ ese_core.py # Analyse structurelle multi-domaines ├─ stars_core.py # Analyse stratigraphique locale ├─ stars_net.py # Réseaux inter-bassins ├─ examples/ │ ├─ example_fossil.py # Exemple STaRS │ ├─ example_network.py # Exemple STaRS-NET │ └─ example_sequence.py # Exemple ESE ├─ figures/ # Figures simulées └─ requirements.txt # Packages nécessaires 9️⃣ Packages recommandés numpy scipy matplotlib hurst scikit-learn zlib networkx pandas Vérification automatique au lancement du pipeline. Hashes générés pour tous les modules pour traçabilité totale. 🔁 Résumé ultime en gras ESIS ne dit pas ce qui s’est passé. Il indique jusqu’où les données peuvent parler sans qu’on leur fasse dire plus.STaRS, STaRS-NET, ESE et ESE-NET sont des diagnostics de structure, multi-domaines, falsifiables et reproductibles.Aucune causalité, aucune interprétation historique ou écologique n’est permise. Voici le code Python complet et opérationnel pour le dépôt ESIS, intégrant : STaRS → analyse locale de colonnes stratigraphiques STaRS-NET → réseau inter-bassins ESE → analyse de structure informationnelle / séquences / champs ESE-NET → test de structure globale multi-domaines Tout est bottom-up, falsifiable, multi-domaines, traçable. # ============================================================================= # ESIS — Emergent Stratigraphic & Information Structures # Version finale 2026 | Kevin Fradier # Modules : STaRS + STaRS-NET + ESE + ESE-NET # Licence : CC BY-NC-ND 4.0 # ============================================================================= import numpy as np import zlib import hashlib import networkx as nx from hurst import compute_Hc from scipy.ndimage import gaussian_filter from sklearn.linear_model import LinearRegression # ============================================================================= # CONSTANTES GLOBALES # ============================================================================= AUTHOR_SIGNATURE = "Kevin Fradier | ESIS | 2026" # --------------------------------------------------------------------------- # UTILITAIRES # --------------------------------------------------------------------------- def signature_vector(size): """Vecteur déterministe dérivé de la signature auteur""" seed = int(hashlib.sha256(AUTHOR_SIGNATURE.encode()).hexdigest(), 16) % (2**32) rng = np.random.default_rng(seed) return rng.random(size) def compute_hash(obj): h = hashlib.sha256() h.update(str(obj).encode()) h.update(AUTHOR_SIGNATURE.encode()) return h.hexdigest() # ============================================================================= # ---------------------- STaRS : LOCAL ---------------------- # ============================================================================= def simulate_taphonomic_noise(counts, loss_rate=0.3): """Simule pertes taphonomiques par niveau""" noisy = [] for level in counts: mask = np.random.rand(len(level)) > loss_rate noisy.append(level * mask) return noisy def strat_entropy(level): """Entropie Shannon d'un niveau stratigraphique""" total = np.sum(level) if total == 0: return 0.0 p = level / total p = p[p > 0] return -np.sum(p * np.log2(p)) def robustness_test(strat_data, n_iter=100): """Test de robustesse sous perturbations taphonomiques""" original = np.array([np.sum(l) for l in strat_data]) scores = [] for _ in range(n_iter): perturbed = simulate_taphonomic_noise(strat_data) pert = np.array([np.sum(l) for l in perturbed]) corr = np.corrcoef(original, pert)[0,1] scores.append(corr) return np.nanmean(scores), np.nanstd(scores) def STaRS_analyze(strat_data): """Analyse locale STaRS""" entropies = [strat_entropy(l) for l in strat_data] mean_corr, std_corr = robustness_test(strat_data) result = { "mean_entropy": float(np.mean(entropies)), "robustness_corr": mean_corr, "robustness_std": std_corr, "signature": AUTHOR_SIGNATURE } result["hash"] = compute_hash(result) return result # ============================================================================= # ---------------------- STaRS-NET : INTER-BASSINS ---------------------- # ============================================================================= def build_basin_network(basin_metrics, threshold=0.5): """Construit le réseau de corrélation entre bassins""" G = nx.Graph() n = len(basin_metrics) for i in range(n): G.add_node(i, **basin_metrics[i]) # Liaisons si corrélation robustesse > threshold for i in range(n): for j in range(i+1, n): val_i = basin_metrics[i]['robustness_corr'] val_j = basin_metrics[j]['robustness_corr'] corr = np.minimum(val_i, val_j) if corr >= threshold: G.add_edge(i, j, weight=corr) return G def network_robustness(G, n_iter=50, noise_level=0.05): """Test de stabilité réseau sous perturbation des poids""" scores = [] edges = list(G.edges(data=True)) for _ in range(n_iter): G_pert = nx.Graph() for u,v,d in edges: weight = d['weight'] + np.random.randn() * noise_level G_pert.add_edge(u,v,weight=max(0,min(1,weight))) # Score = densité relative scores.append(nx.density(G_pert)) return np.mean(scores), np.std(scores) def STaRS_NET_analyze(basin_metrics, threshold=0.5): G = build_basin_network(basin_metrics, threshold) mean_density, std_density = network_robustness(G) result = { "network_density": mean_density, "network_std": std_density, "n_nodes": G.number_of_nodes(), "n_edges": G.number_of_edges(), "signature": AUTHOR_SIGNATURE } result["hash"] = compute_hash(result) return result, G # ============================================================================= # ---------------------- ESE : SEQUENCES / CHAMPS ---------------------- # ============================================================================= def shannon_entropy(seq): probs = [seq.count(c)/len(seq) for c in set(seq)] return -sum(p*np.log2(p) for p in probs if p>0) def compression_ratio(seq): raw = bytes(seq, 'utf-8') return len(zlib.compress(raw))/len(raw) def hurst_exponent(seq): numeric = np.array([ord(c) for c in seq]) H, _, _ = compute_Hc(numeric, kind='change') return H def spatial_field_analysis(field, sigma_corr=3): """Analyse d’un champ 2D corrélé""" field_corr = gaussian_filter(field, sigma=sigma_corr) fft2 = np.fft.fftshift(np.fft.fft2(field_corr)) power = np.abs(fft2)**2 return field_corr, power def radial_power_spectrum(power): N = power.shape[0] kx, ky = np.meshgrid(np.fft.fftfreq(N), np.fft.fftfreq(N))
Publication details
- Journal / source
- Zenodo (CERN European Organization for Nuclear Research)
- Publication date
- 8 January 2026