メインコンテンツへスキップ
見出し画像
Photo byakanekofuku

【技術記録】2000ノード全結合イジングモデル(QUBO)のベンチマーク / Enchan(cosmic) on Cloud Run


    物理ベース最適化エンジン「Enchan(cosmic)」のCloud Run環境(API)における、高負荷ベンチマークの実行記録です。

    対象はN=2000の完全グラフ(全結合/エッジ数1,999,000)。

    これをイジングモデル(Ising Model)およびQUBO(Quadratic Unconstrained Binary Optimization)の最大カット問題として定式化し、理論最適値(最適解)への収束性と処理速度を計測しました。

    以下、検証用コードと実行ログ(生データ含む)を記載します。

    1. 検証環境

    • Engine: Enchan (cosmic)

    • Infrastructure: Google Cloud Run (2 vCPU / 1GB Memory)

    • Model: Ising Model / QUBO formulation (Max-Cut)

    • Problem Scale: N=2000, Density=1.0 (Full Mesh), Unweighted (J_{ij} = -1)

    2. 再現コード (fcmc_benchmark.py)

    本ベンチマークは、Python環境があれば誰でも再現可能です。 以下の手順でスクリプトを作成し、実行してください。

    1. ローカル環境に fcmc_benchmark.py という新規ファイルを作成します。

    2. 以下のコードをコピー&ペーストして保存します。

    3. コンソール(ターミナルまたはコマンドプロンプト)で
      python fcmc_benchmark.py を実行します。

    ※リクエストは、現在試験的に無料一般公開されている Enchan API (Public Beta) のエンドポイントへ送信され、実際のCloud Run環境上で計算が行われます。
    ※本APIでは density=1.0 を指定した場合、自己ループを除く完全グラフがサーバ側で生成され、全エッジの結合係数は J_ij = -1 として扱われます。

    import requests
    import time
    import json
    
    # --- Enchan API: Quantum-Transcendence Challenge ---
    API_URL = "https://enchan-api-82345546010.us-central1.run.app/v1/solve"
    
    def run_extreme_challenge():
        # ══════════════════════════════════════════════════
        #  ENCHAN EXTREME BENCHMARK CONFIGURATION
        # ══════════════════════════════════════════════════
        N = 2000
        DENSITY = 1.0
        TOTAL_TIME = 35.0
    
        payload = {
            "graph": {"N": N, "density": DENSITY},
            "control": {"total_time": TOTAL_TIME}, 
            "seed": 777
        }
    
        total_edges = int(N * (N - 1) / 2)
    
        print(f"🔥 Launching Extreme Challenge: N={N} (Fully Connected)...")
        print(f"📡 Processing {total_edges:,} interactions on Cloud Run...")
        
        start_wall = time.perf_counter()
        
        try:
            response = requests.post(API_URL, json=payload, timeout=300)
            response.raise_for_status()
            
            end_wall = time.perf_counter()
            
            # --- データ抽出 ---
            data = response.json()
    
            # ▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
            # ★ サーバーからの生データを表示
            print("\n=== [DEBUG] RAW SERVER RESPONSE (PROOF OF TRUTH) ===")
            debug_view = {
                "metrics": data.get("metrics"),
                # もしサーバーがグラフ情報を返していればここに表示されます
                "graph_summary": data.get("graph", "Not included in response"),
                "TIMING": data.get("TIMING"),
                "audit": data.get("audit")
            }
            print(json.dumps(debug_view, indent=2))
            print("====================================================\n")
            # ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
    
            metrics = data.get("metrics", {})
            timing = data.get("TIMING", {})
            env_root = data.get("ENV", {})
            runtime = env_root.get("runtime", {})
            audit = data.get("audit", {})
            audit_env = audit.get("ENV", {}) 
    
            # --- 計算 ---
            total_latency = end_wall - start_wall
            pure_solve_time = timing.get("total_wall_time", 0.0)
            overhead = total_latency - pure_solve_time
            
            cut_score = int(metrics.get("cut", 0))
            expected_random = total_edges * 0.5
            gain_percent = 0.0
            if expected_random > 0:
                gain_percent = (cut_score / expected_random * 100) - 100
    
            # 整形
            mem_used = runtime.get("memory_used_MB", "N/A")
            mem_total = runtime.get("memory_total_MB", "N/A")
            mem_str = f"{mem_used} / {mem_total} MB" if mem_used != "N/A" else "N/A"
            cpu_count = runtime.get("cpu_count", "N/A")
            numpy_ver = audit_env.get("numpy", "Hidden")
            numba_ver = audit_env.get("numba", "Hidden")
            s_hash = audit.get("HASH", {}).get("S", "Hidden")
    
            # --- 📝 THE ARTIFACT REPORT ---
            print("\n" + "═" * 55)
            print("   ENCHAN ADVANCED SYSTEM & PHYSICS REPORT (Extreme)")
            print("═" * 55)
            
            print(f" [MODEL]       Ising / QUBO (Max-Cut Formulation)")
            print(f" [NODES]       {N:,} nodes")
            print(f" [DENSITY]     {DENSITY*100:.1f}% (Full Mesh)")
            print(f" [EDGES]       {total_edges:,} edges")
            print(f" [TOTAL TIME]  {TOTAL_TIME:.1f} virtual sec")
            print("-" * 55)
    
            print(f" [PYTHON]      {runtime.get('python_version', 'N/A')}")
            print(f" [PLATFORM]    {runtime.get('os_info', 'Cloud Run')}")
            print(f" [NUMPY]       {numpy_ver}")
            print(f" [NUMBA]       {numba_ver}")
            print(f" [CPU]         {cpu_count} vCPU")
            print(f" [MEMORY]      {mem_str}")
            print("-" * 55)
    
            print(f" [LATENCY]     {total_latency:.3f}s (Round Trip)")
            print(f" [SOLVE TIME]  {pure_solve_time:.3f}s (Core Physics Engine)")
            print(f" [OVERHEAD]    {overhead:.3f}s (Network/IO)")
            print("-" * 55)
    
            print(f" [RESULT]      Max-Cut Score: {cut_score:,}")
            print(f" [GAIN]        {gain_percent:+.2f}% vs expected baseline")
            print(f" [S-HASH]      {s_hash}")
            print("═" * 55 + "\n")
    
        except Exception as e:
            print(f"\n❌ Benchmark Failed: {e}")
    
    if __name__ == "__main__":
        run_extreme_challenge()

    3. 実行結果ログ

    🔥 Launching Extreme Challenge: N=2000 (Fully Connected)...
    📡 Processing 1,999,000 interactions on Cloud Run...
    
    === [DEBUG] RAW SERVER RESPONSE (PROOF OF TRUTH) ===
    {
      "metrics": {
        "cut": 1000000.0,
        "plus_ratio": 0.5
      },
      "graph_summary": "Not included in response",
      "TIMING": {
        "total_wall_time": 6.023942232131958
      },
      "audit": {
        "ENCHAN": {
          "name": "ENCHAN(cosmic)",
          "tower": "TimeTowerAPI",
          "seed": 777,
          "problem_name": "solve_from_edges",
          "adapter": "partition_cut"
        },
        "ENV": {
          "python": "3.12.12",
          "platform": "Linux-4.4.0-x86_64-with-glibc2.41",
          "numpy": "2.3.5",
          "numba": "0.63.1"
        },
        "TIMING": {
          "solve_seconds": 5.565818624999963
        },
        "POLICY": {
          "public_guardian_keys": [
            "dt",
            "total_time"
          ],
          "ignored_guardian_keys": []
        },
        "HASH": {
          "config_guardian_effective": "e7c83df2f9fd5bde461d1b91ea2a9d51677e77d35e583fe6e07606229622ba2c",
          "config_guardian_raw": "e7c83df2f9fd5bde461d1b91ea2a9d51677e77d35e583fe6e07606229622ba2c",
          "config_adapter": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a",
          "graph_indptr": "93ba453214184fff230d17c7aae317e39ba4b5874446612c439d51947f47c0e4",
          "graph_indices": "aa25d66734d7e33e14b4af091d801cb0ff2fd532f58baf0d446e9808a2c41a42",
          "graph_deg": "2f8bd76acb376462fef4d68336875b89cc8392c9ebf6cab2633f8aae307d0508",
          "graph_weights": null,
          "S": "aeafbc1f44e5c216d6b50109832d958308d8d2b81aa23be0770711dcd676b0db"
        },
        "GUARDIAN": {
          "steps": 700,
          "dt": 0.05,
          "total_time": 35.0,
          "sigma": 9.0,
          "g_c": 1.6,
          "m": 1.5,
          "a0_norm": 1.0,
          "total_edge_visits": 2798600000,
          "active_edges_per_step": 3998000,
          "warm_start": false,
          "inertia_preserved": false
        },
        "ADAPTER": {
          "name": "partition_cut",
          "sage": {
            "role": "SAGE",
            "threshold_used": -0.02,
            "thresholds_tested": 5,
            "local_passes": 1,
            "local_flips": 999,
            "collapse_guard": true,
            "score_mode": "cut",
            "best_score": 1000000.0,
            "sage_gain": 1.3200000524520874
          }
        }
      }
    }
    ====================================================
    
    
    ═══════════════════════════════════════════════════════
       ENCHAN ADVANCED SYSTEM & PHYSICS REPORT (Extreme)
    ═══════════════════════════════════════════════════════
     [MODEL]       Ising / QUBO (Max-Cut Formulation)
     [NODES]       2,000 nodes
     [DENSITY]     100.0% (Full Mesh)
     [EDGES]       1,999,000 edges
     [TOTAL TIME]  35.0 virtual sec
    -------------------------------------------------------
     [PYTHON]      3.12.12
     [PLATFORM]    Linux-4.4.0-x86_64-with-glibc2.41
     [NUMPY]       2.3.5
     [NUMBA]       0.63.1
     [CPU]         2 vCPU
     [MEMORY]      504.92 / 1073.74 MB
    -------------------------------------------------------
     [LATENCY]     9.300s (Round Trip)
     [SOLVE TIME]  6.024s (Core Physics Engine)
     [OVERHEAD]    3.276s (Network/IO)
    -------------------------------------------------------
     [RESULT]      Max-Cut Score: 1,000,000
     [GAIN]        +0.05% vs expected baseline
     [S-HASH]      aeafbc1f44e5c216d6b50109832d958308d8d2b81aa23be0770711dcd676b0db
    ═══════════════════════════════════════════════════════

    結果概要

    • 完全グラフ K2000 の Max-Cut における理論最適値(1,000,000)と一致する解に到達。

    • 28億回近い相互作用計算 (total_edge_visits: 2798600000) を約6秒(SOLVE TIME)で完遂。

    • QUBOソルバとしての高いスケーラビリティを確認。

     
     

    Enchan

     
     
    グラフィックデザイナー。ファンタジー作家。独立研究者。「Enchan Theory」の提唱者。 Kobayashi Mitsuhiro https://enchanfield.com/

    あなたへのおすすめ