algo/applications/collatz/collatz_k_scripts/collatz_generate_coverage_proof.py
Nicolas Cantu 14ed1de36b Pipeline Collatz aligné sur commandes.md et reprise après interruption
**Motivations:**
- Implémenter le workflow complet de démonstration Collatz (commandes.md)
- Permettre la reprise après interruption au palier D20

**Evolutions:**
- Scripts 01-12 et run-full-workflow alignés sur commandes.md sections 1-10
- collatz_recover_noyau.py : recréation de noyau_post_D20 à partir du CSV candidats
- Option --resume-from D20 dans collatz_k_pipeline pour reprendre sans recalculer D18-D19-F15
- Détection automatique : si candidats_D20 existe sans noyau_post_D20, récupération puis poursuite
- Filtres --cible=critique et --modulo dans collatz_fusion_pipeline
- ROOT par défaut = collatz_k_scripts (plus data/source vide)

**Pages affectées:**
- .gitignore (__pycache__, out/)
- applications/collatz/collatz_k_scripts/*.py
- applications/collatz/scripts/*.sh
- applications/collatz/scripts/README.md
2026-03-02 02:49:23 +01:00

60 lines
1.8 KiB
Python

# -*- coding: utf-8 -*-
"""
collatz_generate_coverage_proof.py
Generate coverage proof document. Outputs Markdown; for PDF use pandoc.
Usage: python collatz_generate_coverage_proof.py --certificat JSON --output PATH
"""
from __future__ import annotations
import argparse
import json
from pathlib import Path
def main() -> None:
ap = argparse.ArgumentParser(description="Generate coverage proof from certificate")
ap.add_argument("--certificat", required=True, help="Path to certificate JSON")
ap.add_argument("--output", required=True, help="Output path (.md or .pdf)")
args = ap.parse_args()
data = json.loads(Path(args.certificat).read_text(encoding="utf-8"))
clauses = data.get("clauses", data.get("closed", []))
n = len(clauses)
lines = [
"# Preuve de couverture",
"",
"## Introduction",
"",
f"Le certificat contient {n} clauses.",
"",
"## Union des résidus",
"",
"L'union des classes de résidus couvertes par les clauses forme une partition",
"des entiers impairs modulo 2^m pour chaque palier m.",
"",
]
out_path = Path(args.output)
out_path.parent.mkdir(parents=True, exist_ok=True)
md_content = "\n".join(lines)
if out_path.suffix.lower() == ".pdf":
out_md = out_path.with_suffix(".md")
out_md.write_text(md_content, encoding="utf-8")
try:
import subprocess
subprocess.run(["pandoc", str(out_md), "-o", str(out_path)], check=True)
except (FileNotFoundError, subprocess.CalledProcessError):
out_path.write_text(md_content, encoding="utf-8")
else:
out_path.write_text(md_content, encoding="utf-8")
print(f"Wrote {out_path}")
if __name__ == "__main__":
main()