Spaces:
Sleeping
Sleeping
| import time, sys | |
| from typing import Dict, List, Optional, Tuple, Any, Callable | |
| from core import extract_weights, verify_sigma, PRECOMPUTED, solve, run_hybrid_sa | |
| from algebraic import get_algebraic_proof, parse_domain, export_lean_proof | |
| class Domain: | |
| def __init__(self, name, n, k, m, fiber_map, tags, precomputed=None, group="", notes=""): | |
| self.name=name; self.n=n; self.k=k; self.m=m; self.fiber_map=fiber_map | |
| self.tags=tags; self.precomputed=precomputed; self.group=group; self.notes=notes | |
| class Engine: | |
| """ | |
| The Global Structure Engine provides a unified interface for classifying | |
| and solving combinatorial problems using the Short Exact Sequence framework. | |
| """ | |
| def register(self, domain: Domain): | |
| self.registry.append(domain) | |
| def print_results(self): | |
| print(f'\n--- Engine Registry: {len(self.registry)} Domains ---') | |
| for d in self.registry: | |
| print(f' {d.name:<40} (n={d.n}, k={d.k}, m={d.m})') | |
| def __init__(self): | |
| self.registry = [] | |
| """Initializes the discovery engine.""" | |
| pass | |
| def run(self, m: int, k: int, strategy: str = "standard") -> Dict[str, Any]: | |
| """ | |
| Runs the classification and optional search for a problem (m, k). | |
| Args: | |
| m: The group order (Z_m). | |
| k: The dimension (number of cycles). | |
| strategy: Search strategy ('standard', 'hybrid', 'equivariant'). | |
| Returns: | |
| A dictionary containing the status, proof steps, and solution if found. | |
| """ | |
| t0 = time.perf_counter() | |
| proof_obj = get_algebraic_proof(m, k) | |
| solution = None | |
| if proof_obj['exists'] == "PROVED_POSSIBLE": | |
| if (m, k) in PRECOMPUTED: | |
| solution = PRECOMPUTED[(m, k)] | |
| elif strategy == "hybrid": | |
| print(f" Running hybrid SA for m={m}, k={k}...") | |
| solution, stats = run_hybrid_sa(m, k=k) | |
| else: | |
| solution = solve(m, k) | |
| verified = bool(solution and verify_sigma(solution, m)) | |
| dt = time.perf_counter() - t0 | |
| return { | |
| "m": m, "k": k, "status": proof_obj['exists'], | |
| "theorem": proof_obj.get('theorem', ''), | |
| "proof": proof_obj.get('proof', []), | |
| "theorem_id": proof_obj.get("theorem_id"), | |
| "theorem_name": proof_obj.get("theorem_name"), | |
| "witness_hash": proof_obj.get('witness_hash', ''), | |
| "solution_found": verified, "elapsed_ms": dt * 1000 | |
| } | |
| def analyse_text(self, desc: str, strategy: str = "standard") -> Dict[str, Any]: | |
| """ | |
| Automatically parses a text description and classifies the domain. | |
| Args: | |
| desc: Text description of the problem. | |
| strategy: Search strategy to use. | |
| """ | |
| d = parse_domain(desc) | |
| res = self.run(d['m'], d['k'], strategy=strategy) | |
| res['parsed'] = d | |
| return res | |
| def simplify_problem(self, m: int, k: int) -> Dict[str, Any]: | |
| """ | |
| Uses categorical morphisms (Quotient, Product) to reduce a complex problem | |
| to smaller solvable components. | |
| """ | |
| suggested = get_suggested_morphisms(m, k) | |
| reduction = None | |
| for m_ in suggested: | |
| if m_.kind == "Quotient": | |
| # Check if quotient is solvable | |
| sub_res = self.run(int(m_.target.split('_')[-1]), k) | |
| if sub_res['status'] == "PROVED_POSSIBLE": | |
| reduction = { | |
| "kind": m_.kind, | |
| "source": m_.source, | |
| "target": m_.target, | |
| "status": "REDUCIBLE", | |
| "proof": f"Reduces to solvable quotient {m_.target}." | |
| } | |
| break | |
| return reduction or {"status": "IRREDUCIBLE"} | |
| def get_lean_export(self, m: int, k: int) -> str: | |
| """Generates Lean 4 source for the parity obstruction proof.""" | |
| return export_lean_proof(m, k) | |
| def get_suggested_morphisms(m: int, k: int) -> List[Any]: | |
| """Suggests ways to simplify or solve (m, k) using known components.""" | |
| class Morphism: | |
| def __init__(self, kind: str, source: str, target: str): | |
| self.kind = kind; self.source = source; self.target = target | |
| m_list = [] | |
| for q in range(2, m): | |
| if m % q == 0: | |
| m_list.append(Morphism("Lift", f"G_{q}", f"G_{m}")) | |
| m_list.append(Morphism("Quotient", f"G_{m}", f"G_{q}")) | |
| factors = [i for i in range(2, m) if m % i == 0] | |
| for f in factors: | |
| other = m // f | |
| if other > 1: | |
| m_list.append(Morphism("Product", f"G_{f} x G_{other}", f"G_{m}")) | |
| return m_list | |
| def check_remote_search_status() -> Dict[str, str]: | |
| """Checks the status of Kaggle search kernels if CLI is configured.""" | |
| import subprocess | |
| kernels = [ | |
| "hichambedrani/claudes-cycles-p1-equiv", | |
| "hichambedrani/claudes-cycles-p2-equiv" | |
| ] | |
| status = {} | |
| for k in kernels: | |
| try: | |
| res = subprocess.check_output(["kaggle", "kernels", "status", k], | |
| stderr=subprocess.STDOUT, text=True) | |
| status[k.split('/')[-1]] = res.strip() | |
| except: | |
| status[k.split('/')[-1]] = "Unknown (API not configured?)" | |
| return status | |
| if __name__ == "__main__": | |
| e = Engine() | |
| if "--remote" in sys.argv: | |
| stats = check_remote_search_status() | |
| print("\n--- Remote Kaggle Search Status ---") | |
| for k, v in stats.items(): | |
| print(f" {k}: {v}") | |
| elif "--parse" in sys.argv: | |
| idx = sys.argv.index("--parse") | |
| desc = " ".join(sys.argv[idx+1:]) | |
| strat = "hybrid" if "--hybrid" in sys.argv else "standard" | |
| res = e.analyse_text(desc, strategy=strat) | |
| print(f"\n--- Analysis for Domain: {res['parsed']['G']} ---") | |
| print(f"SES: {res['parsed']['SES']}") | |
| if res.get('theorem_id'): | |
| print(f"Applies Theorem {res['theorem_id']}: {res['theorem_name']}") | |
| print(f"Status: {res['status']}") | |
| print(f"Proof Steps:") | |
| for line in res['proof']: print(f" {line}") | |
| print(f"Classification Time: {res['elapsed_ms']:.2f}ms") | |
| if res['solution_found']: | |
| print(f"Solution: Found and Verified ✓") | |
| elif "--lean" in sys.argv: | |
| idx = sys.argv.index("--lean") | |
| m, k = int(sys.argv[idx+1]), int(sys.argv[idx+2]) | |
| print(e.get_lean_export(m, k)) | |
| elif "--morphisms" in sys.argv: | |
| m, k = int(sys.argv[sys.argv.index("--morphisms")+1]), int(sys.argv[sys.argv.index("--morphisms")+2]) | |
| morphs = get_suggested_morphisms(m, k) | |
| print(f"\n--- Suggested Morphisms for G_{m} (k={k}) ---") | |
| for morph in morphs: | |
| print(f" {morph.kind:10} : {morph.source:15} -> {morph.target}") | |
| else: | |
| for m, k in [(3,3), (4,3), (4,4), (6,3)]: | |
| res = e.run(m, k) | |
| print(f"G_{m}(k={k}): {res['status']} ({res['elapsed_ms']:.2f}ms)") | |