S.T.a.R.S × ESE. Pipeline unifié 2026
Abstract
. """ STaRS × ESE — Pipeline unifié 2026 Auteur : Kevin Fradier — Chercheur indépendant 🇫🇷 Licence : CC BY-NC-ND 4.0 Statut : Opérationnel · Testable · Falsifiable · Multi-domaines """ import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import FancyBboxPatch, ConnectionPatch import hashlib from scipy.ndimage import gaussian_filter from hurst import compute_Hc # ----------------------------- # SIGNATURE ET HASH # ----------------------------- AUTHOR_SIGNATURE = "Kevin Fradier | STaRS-ESE-Pipeline | 2026" def generate_hash(result): h = hashlib.sha256() h.update(str(result).encode()) h.update(AUTHOR_SIGNATURE.encode()) return h.hexdigest() # ----------------------------- # MODULE STaRS (local) # ----------------------------- def simulate_taphonomic_noise(counts, loss_rate=0.3): noisy = [] for level in counts: mask = np.random.rand(len(level)) > loss_rate noisy.append(level * mask) return noisy def strat_entropy(level): s = np.sum(level) if s == 0: return 0.0 p = level / s p = p[p>0] return -np.sum(p * np.log2(p)) def robustness_test(data, n_iter=100): original = np.array([np.sum(l) for l in data]) scores = [] for _ in range(n_iter): perturbed = simulate_taphonomic_noise(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_local(strat_data): 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"] = generate_hash(result) return result # ----------------------------- # MODULE STaRS-NET (inter-bassins) # ----------------------------- def build_network(bassins_data): """ bassins_data: liste de listes de counts retourne : matrice corrélation normalisée (NRSS) """ nb = len(bassins_data) NRSS = np.zeros((nb, nb)) for i in range(nb): for j in range(nb): counts_i = np.array([np.sum(l) for l in bassins_data[i]]) counts_j = np.array([np.sum(l) for l in bassins_data[j]]) if np.std(counts_i)>0 and np.std(counts_j)>0: NRSS[i,j] = np.corrcoef(counts_i, counts_j)[0,1] else: NRSS[i,j] = 0.0 return NRSS def STaRS_NET(bassins_data): NRSS = build_network(bassins_data) mean_corr = np.nanmean(NRSS) result = { "NRSS_matrix": NRSS, "network_mean_corr": mean_corr, "signature": AUTHOR_SIGNATURE } result["hash"] = generate_hash(result) return result # ----------------------------- # MODULE ESE-NET (multi-domaines) # ----------------------------- 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): import zlib 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): 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 perturbation_stability(field, n_iter=10, noise_level=0.05): results = [] for _ in range(n_iter): perturbed = field + noise_level*np.random.randn(*field.shape) results.append(np.mean(perturbed)) return np.mean(results), np.std(results) def ESE_NET(sequence=None, spatial_field=None): result = {"signature": AUTHOR_SIGNATURE} if sequence is not None: result.update({ "entropy": shannon_entropy(sequence), "compression": compression_ratio(sequence), "hurst": hurst_exponent(sequence) }) if spatial_field is not None: field_corr, power = spatial_field_analysis(spatial_field) mean, std = perturbation_stability(spatial_field) result.update({ "mean_field": mean, "std_field": std, "field_corr": field_corr.tolist() }) result["hash"] = generate_hash(result) return result # ----------------------------- # FIGURE PIPELINE CONDENSEE # ----------------------------- def plot_pipeline(): plt.figure(figsize=(14, 16)) ax = plt.gca() ax.set_xlim(0, 12) ax.set_ylim(0, 18) ax.axis('off') blocks = [ {"text": "1️⃣ DONNÉES BRUTES\n- Colonnes stratigraphiques\n- Comptage de taxons\n- Séquences, champs, réseaux", "xy": (6,17), "color":"#fef3c7"}, {"text": "2️⃣ STaRS (LOCAL)\n- Bruit taphonomique réaliste\n- Robustesse locale\n- SRS / Entropie / Hash\n❌ STOP si signal faible", "xy": (6,14), "color":"#fcd34d"}, {"text": "3️⃣ STaRS-NET (INTER-BASSINS)\n- Construction du réseau\n- NRSS / Corrélations\n- Robustesse réseau\nRéseau vide → pas de structure globale", "xy": (6,11), "color":"#fbbf24"}, {"text": "4️⃣ ESE-NET (MULTI-DOMAINES)\n- Hurst / Entropie / Compression\n- Perturbations contrôlées\n- Signature / Hash\n✅ Structure robuste détectée", "xy": (6,8), "color":"#f59e0b"}, {"text": "5️⃣ RÉSULTATS PUBLIABLES\n- Courbes observées\n- Enveloppes de bruit\n- Graphes réseaux\n- Scores (STaRS, NRSS, ESE)\n- Hashes / Signatures\n❌ Pas de mécanismes ou causes", "xy": (6,5), "color":"#f97316"}, {"text": "⚠️ MÉTHODOLOGIE BOTTOM-UP\n- Reproductible\n- Falsifiable\n- Multi-domaines\n- Immunité critique maximale\n\n**STaRS et ESE ne disent pas ce qui s’est passé.**\n**Ils indiquent jusqu’où les données peuvent parler.**", "xy": (6,2), "color":"#ea580c"} ] for block in blocks: x,y = block["xy"] bbox = FancyBboxPatch((x-5,y-1.5),10,3,boxstyle="round,pad=0.3", facecolor=block["color"], edgecolor="black", linewidth=2) ax.add_patch(bbox) ax.text(x,y,block["text"], ha="center", va="center", fontsize=11, linespacing=1.2, weight='bold') arrow_props = dict(arrowstyle="->", color="black", linewidth=2) for i in range(len(blocks)-1): xyA = blocks[i]["xy"] xyB = blocks[i+1]["xy"] con = ConnectionPatch(xyA=(xyA[0], xyA[1]-1.5), xyB=(xyB[0], xyB[1]+1.5), coordsA="data", coordsB="data", axesA=ax, axesB=ax, **arrow_props) ax.add_artist(con) plt.tight_layout() plt.show() # ----------------------------- # EXEMPLE D'USAGE RAPIDE # ----------------------------- if __name__ == "__main__": # STaRS local strat_data = [np.random.randint(0,10,5) for _ in range(10)] stars_result = STaRS_local(strat_data) print("STaRS local :", stars_result) # STaRS-NET bassins_data = [ [np.random.randint(0,10,5) for _ in range(10)] for _ in range(3)] stars_net_result = STaRS_NET(bassins_data) print("STaRS-NET :", stars_net_result) # ESE-NET sequence seq = "AGCTTAGGCTA"*10 ese_result = ESE_NET(sequence=seq) print("ESE-NET sequence :", ese_result) # ESE-NET spatial field = np.random.randn(64,64) ese_spatial_result = ESE_NET(spatial_field=field) print("ESE-NET spatial :", ese_spatial_result) # Figure condensée plot_pipeline() ✅ Ce fichier fait tout en un : Analyse locale des colonnes stratigraphiques (STaRS). Corrélation inter-bassins (STaRS-NET). Analyse multi-domaines (ESE-NET) pour séquences et champs. Génération automatique de la figure condensée publication-ready. Hashes pour reproductibilité et traçabilité. Tu peux l’exécuter directement, il produit : Scores STaRS / NRSS / ESE Visualisation pipeline condensée Signature et hash pour chaque module : 📦 Emergent Paleontology Pipeline — STaRS × ESE Auteur : Kevin Fradier — Chercheur indépendant 🇫🇷Licence : © 2026 Kevin Fradier — CC BY-NC-ND 4.0Statut : Opérationnel · Testable · Falsifiable · Multi-domainesPosition épistémique : Neutralité stricte 📜 Description Ce dépôt contient le pipeline complet pour l’analyse de données stratigraphiques et multi-domaines : STaRS — Analyse locale de colonnes stratigraphiques (robustesse, SRS). STaRS-NET — Corrélations inter-bassins (NRSS, robustesse réseau). ESE-NET — Analyse multi-domaines (séquences symboliques, champs spatiaux). Figure condensée publication-ready intégrant tout le pipeline. Important : STaRS et ESE ne disent pas ce qui s’est passé.Ils indiquent jusqu’où les données peuvent parler sans interprétation causale. 📂 Structure du dépôt EmergentPaleoPipeline/ ├─ README.md ├─ LICENSE.md ├─ stars_ese_pipeline.py # Code principal prêt à exécuter ├─ examples/ │ ├─ example_strat.py # Exemples STaRS local │ ├─ example_net.py # Exemples STaRS-NET │ ├─ example_ese.py # Exemples ESE-NET └─ figures/ └─ pipeline_condensed.png # Figure pipeline condensée ⚙️ Installation git clone https://github.com/ton-compte/EmergentPaleoPipeline.git cd EmergentPaleoPipeline pip install numpy matplotlib scipy hurst 🧭 Usage rapide from stars_ese_pipeline import STaRS_local, STaRS_NET, ESE_NET, plot_pipeline import numpy as np # --- STaRS local strat_data = [np.random.randint(0,10,5) for _ in range(10)] stars_result = STaRS_local(strat_data) print("STaRS local :", stars_result) # --- STaRS-NET bassins_data = [[np.random.randint(0,10,5) for _ in range(10)] for _ in range(3)] stars_net_result = STaRS_NET(bassins_data) print("STaRS-NET :", stars_net_result) # --- ESE-NET séquence seq = "AGCTTAGGCTA"*10 ese_result = ESE_NET(sequence=seq) print("ESE-NET sequence :", ese_result) # --- ESE-NET spatial field = np.random.randn(64,64) ese_spatial_result = ESE_NET(spatial_field=field) print("ESE-NET spatial
Publication details
- Journal / source
- Zenodo (CERN European Organization for Nuclear Research)
- Publication date
- 8 January 2026