Add files using upload-large-folder tool
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- ccevolve/__pycache__/streamlit_traj_viewer.cpython-313.pyc +0 -0
- ccevolve/baselines/eval_all.py +151 -0
- ccevolve/baselines/results.md +137 -0
- ccevolve/blog/analysis_session_84bac982_erdos.md +381 -0
- ccevolve/blog/blog.md +176 -0
- ccevolve/blog/coding_agents_are_auto_evolvers/README.md +62 -0
- ccevolve/blog/coding_agents_are_auto_evolvers/index.html +850 -0
- ccevolve/blog/coding_agents_are_auto_evolvers/results/ac1/result.json +0 -0
- ccevolve/blog/coding_agents_are_auto_evolvers/results/circle_packing/result.json +1 -0
- ccevolve/blog/coding_agents_are_auto_evolvers/results/erdos/result.json +1 -0
- ccevolve/blog/coding_agents_are_auto_evolvers/tasks/ac1/INSTRUCTION.md +22 -0
- ccevolve/blog/coding_agents_are_auto_evolvers/tasks/ac1/evaluate.py +338 -0
- ccevolve/blog/coding_agents_are_auto_evolvers/tasks/ac1/initial.py +111 -0
- ccevolve/blog/coding_agents_are_auto_evolvers/tasks/ac1/prompt.py +20 -0
- ccevolve/blog/coding_agents_are_auto_evolvers/tasks/circle_packing/.DS_Store +0 -0
- ccevolve/blog/coding_agents_are_auto_evolvers/tasks/circle_packing/INSTRUCTION.md +29 -0
- ccevolve/blog/coding_agents_are_auto_evolvers/tasks/circle_packing/evaluate.py +388 -0
- ccevolve/blog/coding_agents_are_auto_evolvers/tasks/circle_packing/initial.py +94 -0
- ccevolve/blog/coding_agents_are_auto_evolvers/tasks/circle_packing/prompt.py +24 -0
- ccevolve/blog/coding_agents_are_auto_evolvers/tasks/erdos_min_overlap/INSTRUCTION.md +27 -0
- ccevolve/blog/coding_agents_are_auto_evolvers/tasks/erdos_min_overlap/evaluate.py +374 -0
- ccevolve/blog/coding_agents_are_auto_evolvers/tasks/erdos_min_overlap/initial.py +84 -0
- ccevolve/blog/coding_agents_are_auto_evolvers/tasks/erdos_min_overlap/prompt.py +24 -0
- ccevolve/blog/ideas.md +38 -0
- ccevolve/blog/plot_score_progression.py +114 -0
- ccevolve/blog/publish/.venv/.gitignore +2 -0
- ccevolve/blog/publish/.venv/bin/Activate.ps1 +248 -0
- ccevolve/blog/publish/.venv/bin/activate +76 -0
- ccevolve/blog/publish/.venv/bin/activate.csh +27 -0
- ccevolve/blog/publish/.venv/bin/activate.fish +69 -0
- ccevolve/blog/publish/.venv/bin/ngrok-asgi +8 -0
- ccevolve/blog/publish/.venv/bin/pip +8 -0
- ccevolve/blog/publish/.venv/bin/pip3 +8 -0
- ccevolve/blog/publish/.venv/bin/pip3.13 +8 -0
- ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok-1.7.0.dist-info/METADATA +480 -0
- ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok-1.7.0.dist-info/RECORD +19 -0
- ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok-1.7.0.dist-info/REQUESTED +0 -0
- ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok-1.7.0.dist-info/WHEEL +4 -0
- ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok-1.7.0.dist-info/entry_points.txt +2 -0
- ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok-1.7.0.dist-info/licenses/LICENSE-MIT +7 -0
- ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok/__init__.py +5 -0
- ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok/mypy.ini +2 -0
- ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok/ngrok_parser.py +138 -0
- ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok/py.typed +0 -0
- ccevolve/blog/publish/.venv/lib/python3.13/site-packages/pip-25.1.1.dist-info/INSTALLER +1 -0
- ccevolve/blog/publish/.venv/lib/python3.13/site-packages/pip-25.1.1.dist-info/METADATA +90 -0
- ccevolve/blog/publish/.venv/lib/python3.13/site-packages/pip-25.1.1.dist-info/RECORD +856 -0
- ccevolve/blog/publish/.venv/lib/python3.13/site-packages/pip-25.1.1.dist-info/REQUESTED +0 -0
- ccevolve/blog/publish/.venv/lib/python3.13/site-packages/pip-25.1.1.dist-info/WHEEL +5 -0
- ccevolve/blog/publish/.venv/lib/python3.13/site-packages/pip-25.1.1.dist-info/entry_points.txt +3 -0
ccevolve/__pycache__/streamlit_traj_viewer.cpython-313.pyc
ADDED
|
Binary file (25.1 kB). View file
|
|
|
ccevolve/baselines/eval_all.py
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Standalone evaluator for all baseline solutions.
|
| 2 |
+
|
| 3 |
+
Runs each solution directly (no subprocess) and applies the same
|
| 4 |
+
validation/scoring logic as the evaluate_ori.py files.
|
| 5 |
+
"""
|
| 6 |
+
|
| 7 |
+
import sys
|
| 8 |
+
import os
|
| 9 |
+
import time
|
| 10 |
+
import importlib.util
|
| 11 |
+
import numpy as np
|
| 12 |
+
from scipy.signal import fftconvolve
|
| 13 |
+
|
| 14 |
+
BASEDIR = os.path.dirname(os.path.abspath(__file__))
|
| 15 |
+
RESULTS = os.path.join(BASEDIR, "results")
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
def load_module(path, name):
|
| 19 |
+
spec = importlib.util.spec_from_file_location(name, path)
|
| 20 |
+
mod = importlib.util.module_from_spec(spec)
|
| 21 |
+
sys.modules[name] = mod
|
| 22 |
+
spec.loader.exec_module(mod)
|
| 23 |
+
return mod
|
| 24 |
+
|
| 25 |
+
|
| 26 |
+
# ── Circle Packing ──────────────────────────────────────────────────
|
| 27 |
+
def eval_circle_packing(path):
|
| 28 |
+
name = os.path.splitext(os.path.basename(path))[0]
|
| 29 |
+
mod = load_module(path, f"cp_{name}")
|
| 30 |
+
t0 = time.time()
|
| 31 |
+
centers, radii, reported_sum = mod.run_packing()
|
| 32 |
+
elapsed = time.time() - t0
|
| 33 |
+
|
| 34 |
+
centers = np.asarray(centers)
|
| 35 |
+
radii = np.asarray(radii)
|
| 36 |
+
assert centers.shape == (26, 2), f"centers shape {centers.shape}"
|
| 37 |
+
assert radii.shape == (26,), f"radii shape {radii.shape}"
|
| 38 |
+
assert np.all(radii >= 0), "negative radii"
|
| 39 |
+
|
| 40 |
+
actual_sum = float(np.sum(radii))
|
| 41 |
+
assert np.isclose(actual_sum, reported_sum, atol=1e-6), \
|
| 42 |
+
f"sum mismatch: actual={actual_sum}, reported={reported_sum}"
|
| 43 |
+
|
| 44 |
+
# boundary check
|
| 45 |
+
for i in range(26):
|
| 46 |
+
x, y, r = centers[i, 0], centers[i, 1], radii[i]
|
| 47 |
+
assert x - r >= -1e-6 and x + r <= 1 + 1e-6, f"circle {i} outside x"
|
| 48 |
+
assert y - r >= -1e-6 and y + r <= 1 + 1e-6, f"circle {i} outside y"
|
| 49 |
+
|
| 50 |
+
# overlap check
|
| 51 |
+
for i in range(26):
|
| 52 |
+
for j in range(i + 1, 26):
|
| 53 |
+
dist = np.sqrt(np.sum((centers[i] - centers[j]) ** 2))
|
| 54 |
+
assert dist >= radii[i] + radii[j] - 1e-6, \
|
| 55 |
+
f"circles {i}&{j} overlap: dist={dist:.6f}, sum_r={radii[i]+radii[j]:.6f}"
|
| 56 |
+
|
| 57 |
+
return {"combined_score": actual_sum, "elapsed": elapsed}
|
| 58 |
+
|
| 59 |
+
|
| 60 |
+
# ── Erdos Min Overlap ───────────────────────────────────────────────
|
| 61 |
+
def eval_erdos(path):
|
| 62 |
+
name = os.path.splitext(os.path.basename(path))[0]
|
| 63 |
+
mod = load_module(path, f"erdos_{name}")
|
| 64 |
+
t0 = time.time()
|
| 65 |
+
h_values, c5_bound, n_points = mod.run(seed=42, budget_s=10.0)
|
| 66 |
+
elapsed = time.time() - t0
|
| 67 |
+
|
| 68 |
+
h_values = np.asarray(h_values, dtype=np.float64)
|
| 69 |
+
n_points = int(n_points)
|
| 70 |
+
assert h_values.ndim == 1 and h_values.shape[0] == n_points
|
| 71 |
+
assert np.all(np.isfinite(h_values))
|
| 72 |
+
|
| 73 |
+
# normalize if needed
|
| 74 |
+
target = n_points / 2.0
|
| 75 |
+
cur = float(np.sum(h_values))
|
| 76 |
+
if abs(cur - target) > 1e-8:
|
| 77 |
+
h_values = h_values * (target / cur)
|
| 78 |
+
|
| 79 |
+
assert np.all(h_values >= -1e-10) and np.all(h_values <= 1 + 1e-10), \
|
| 80 |
+
f"h out of [0,1]: [{h_values.min()}, {h_values.max()}]"
|
| 81 |
+
|
| 82 |
+
dx = 2.0 / n_points
|
| 83 |
+
correlation = np.correlate(h_values, 1.0 - h_values, mode="full") * dx
|
| 84 |
+
computed_c5 = float(np.max(correlation))
|
| 85 |
+
|
| 86 |
+
assert np.isclose(computed_c5, float(c5_bound), atol=1e-4), \
|
| 87 |
+
f"C5 mismatch: computed={computed_c5:.8f}, reported={float(c5_bound):.8f}"
|
| 88 |
+
|
| 89 |
+
return {"combined_score": -computed_c5, "c5": computed_c5, "elapsed": elapsed}
|
| 90 |
+
|
| 91 |
+
|
| 92 |
+
# ── AC1 ─────────────────────────────────────────────────────────────
|
| 93 |
+
def eval_ac1(path):
|
| 94 |
+
name = os.path.splitext(os.path.basename(path))[0]
|
| 95 |
+
mod = load_module(path, f"ac1_{name}")
|
| 96 |
+
t0 = time.time()
|
| 97 |
+
seq = mod.run(seed=42, budget_s=10.0)
|
| 98 |
+
elapsed = time.time() - t0
|
| 99 |
+
|
| 100 |
+
assert isinstance(seq, list) and len(seq) > 0
|
| 101 |
+
a = np.array([float(x) for x in seq])
|
| 102 |
+
a = np.clip(a, 0.0, 1000.0)
|
| 103 |
+
|
| 104 |
+
n = len(a)
|
| 105 |
+
s = float(np.sum(a))
|
| 106 |
+
assert s >= 0.01, f"sum too small: {s}"
|
| 107 |
+
|
| 108 |
+
# Use FFT for large sequences
|
| 109 |
+
if n > 500:
|
| 110 |
+
conv = fftconvolve(a, a)
|
| 111 |
+
else:
|
| 112 |
+
conv = np.convolve(a, a)
|
| 113 |
+
max_b = float(np.max(conv))
|
| 114 |
+
value = 2.0 * n * max_b / (s * s)
|
| 115 |
+
|
| 116 |
+
return {"combined_score": -value, "ac1_value": value, "n": n, "elapsed": elapsed}
|
| 117 |
+
|
| 118 |
+
|
| 119 |
+
# ── Main ────────────────────────────────────────────────────────────
|
| 120 |
+
if __name__ == "__main__":
|
| 121 |
+
tasks = {
|
| 122 |
+
"circle_packing": {
|
| 123 |
+
"eval_fn": eval_circle_packing,
|
| 124 |
+
"files": ["thetaevolve.py", "autoevolve.py"],
|
| 125 |
+
},
|
| 126 |
+
"erdos_min_overlap": {
|
| 127 |
+
"eval_fn": eval_erdos,
|
| 128 |
+
"files": ["ttt_discover.py", "autoevolve.py"],
|
| 129 |
+
},
|
| 130 |
+
"alphaevolve_ac": {
|
| 131 |
+
"eval_fn": eval_ac1,
|
| 132 |
+
"files": ["ttt_discover.py", "alphaevolve_v2.py", "autoevolve.py"],
|
| 133 |
+
},
|
| 134 |
+
}
|
| 135 |
+
|
| 136 |
+
for task_name, cfg in tasks.items():
|
| 137 |
+
print(f"\n{'='*60}")
|
| 138 |
+
print(f" {task_name}")
|
| 139 |
+
print(f"{'='*60}")
|
| 140 |
+
for fname in cfg["files"]:
|
| 141 |
+
fpath = os.path.join(RESULTS, task_name, fname)
|
| 142 |
+
if not os.path.exists(fpath):
|
| 143 |
+
print(f" {fname}: FILE NOT FOUND")
|
| 144 |
+
continue
|
| 145 |
+
try:
|
| 146 |
+
result = cfg["eval_fn"](fpath)
|
| 147 |
+
parts = [f"{k}={v:.8f}" if isinstance(v, float) else f"{k}={v}"
|
| 148 |
+
for k, v in result.items()]
|
| 149 |
+
print(f" {fname}: {', '.join(parts)}")
|
| 150 |
+
except Exception as e:
|
| 151 |
+
print(f" {fname}: ERROR - {e}")
|
ccevolve/baselines/results.md
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Baseline Evaluation Results
|
| 2 |
+
|
| 3 |
+
Evaluated on: 2026-03-10
|
| 4 |
+
|
| 5 |
+
## Raw Metric Values (8 decimal places)
|
| 6 |
+
|
| 7 |
+
| Repo | Circle Packing (sum_radii ↑) | Erdos C5 (↓) | AC1 score (↓) |
|
| 8 |
+
|------|------------------------------|--------------|----------------|
|
| 9 |
+
| **AutoEvolve** (ours) | 2.63598309 | 0.38097828 | **1.57098809** |
|
| 10 |
+
| **TTT-Discover** | — | **0.38087532** | 1.50286290 |
|
| 11 |
+
| **ThetaEvolve** | **2.63598566** | — | — |
|
| 12 |
+
| **AlphaEvolve v2** | 2.63586276 | 0.38092400 | 1.50316355 |
|
| 13 |
+
| Best Human | — | 0.38092700 | 1.50973000 |
|
| 14 |
+
|
| 15 |
+
## OpenEvolve Evaluator Scores (`openevolve_evaluation/`)
|
| 16 |
+
|
| 17 |
+
| Repo | Circle Packing | Erdos | AC1 |
|
| 18 |
+
|------|---------------|-------|-----|
|
| 19 |
+
| **AutoEvolve** (ours) | 1.00037309 | 0.99985501 | 0.95790696 |
|
| 20 |
+
| **TTT-Discover** | — | 1.00012527 | 1.00161763 |
|
| 21 |
+
| **ThetaEvolve** | 1.00037406 | — | — |
|
| 22 |
+
| **AlphaEvolve v2** | — | — | 1.00141729 |
|
| 23 |
+
|
| 24 |
+
## Solution Files
|
| 25 |
+
|
| 26 |
+
```
|
| 27 |
+
ccevolve/baselines/results/
|
| 28 |
+
├── circle_packing/
|
| 29 |
+
│ ├── autoevolve.py # LP + gradient + SLSQP (2.63598309)
|
| 30 |
+
│ └── thetaevolve.py # SLSQP + SA with ring rotations (2.63598566)
|
| 31 |
+
├── erdos_min_overlap/
|
| 32 |
+
│ ├── autoevolve.py # multi-resolution Nesterov PGD (C5=0.38097828)
|
| 33 |
+
│ └── ttt_discover.py # pre-computed JSON sequence (C5=0.38087532)
|
| 34 |
+
└── alphaevolve_ac/
|
| 35 |
+
├── autoevolve.py # binomial sweep + SA + SGD (score=1.57098809)
|
| 36 |
+
├── ttt_discover.py # pre-computed JSON sequence (score=1.50286290)
|
| 37 |
+
└── alphaevolve_v2.py # pre-computed sequence (score=1.50316355)
|
| 38 |
+
```
|
| 39 |
+
|
| 40 |
+
### Notes on solution types
|
| 41 |
+
- **AutoEvolve**: Actual evolved code — search algorithms that run each time
|
| 42 |
+
- **ThetaEvolve circle_packing**: Actual evolved code — SLSQP + SA optimizer
|
| 43 |
+
- **TTT-Discover**: Pre-computed result sequences only (evolved code not stored in repo)
|
| 44 |
+
- **AlphaEvolve v2**: Pre-computed result sequence (from TTT-Discover's ac1_data.py)
|
| 45 |
+
|
| 46 |
+
## Detailed Results
|
| 47 |
+
|
| 48 |
+
### AutoEvolve — Circle Packing (n=26)
|
| 49 |
+
- **Source**: `tasks/circle_packing/results/results_circle_packing_ev2_agentic_v1_g200_periodic1000_20260306_075701/best/main.py`
|
| 50 |
+
- **Sum of radii**: 2.63598309
|
| 51 |
+
- **OpenEvolve combined_score**: 1.00037309
|
| 52 |
+
- **Verified**: Yes — valid packing, no overlaps
|
| 53 |
+
|
| 54 |
+
### AutoEvolve — Erdos Min Overlap
|
| 55 |
+
- **Source**: `tasks/erdos_min_overlap/results/results_erdos_mmv1_3_t710_gen300_periodic5_20260216_195118/best/main.py`
|
| 56 |
+
- **C5 bound**: 0.38097828 (n_points=3072)
|
| 57 |
+
- **OpenEvolve combined_score**: 0.99985501
|
| 58 |
+
- **Verified**: Yes — passes verify_c5_solution()
|
| 59 |
+
|
| 60 |
+
### AutoEvolve — AC1
|
| 61 |
+
- **Source**: `tasks/alphaevolve_ac/results/results_alphaevolve_ac_mmv1_3_gen200_periodic10_20260213_012418/best/main.py`
|
| 62 |
+
- **AC1 score**: 1.57098809 (sequence length=2048)
|
| 63 |
+
- **OpenEvolve combined_score**: 0.95790696
|
| 64 |
+
- **Verified**: Yes — passes evaluate_sequence()
|
| 65 |
+
|
| 66 |
+
### TTT-Discover — Erdos Min Overlap
|
| 67 |
+
- **Source**: `ttt-discover/results/mathematics/ttt_erdos_sequence.json` (600 samples)
|
| 68 |
+
- **C5 bound**: 0.38087532
|
| 69 |
+
- **OpenEvolve combined_score**: 1.00012527
|
| 70 |
+
- **Paper-reported**: 0.380876 — **matches**
|
| 71 |
+
|
| 72 |
+
### TTT-Discover — AC1
|
| 73 |
+
- **Source**: `ttt-discover/results/mathematics/ttt_ac1_sequence.json` (30,000 coefficients)
|
| 74 |
+
- **C1 upper bound**: 1.50286290
|
| 75 |
+
- **OpenEvolve combined_score**: 1.00161763
|
| 76 |
+
- **Paper-reported**: 1.50287 — **matches**
|
| 77 |
+
|
| 78 |
+
### ThetaEvolve — Circle Packing (n=26)
|
| 79 |
+
- **Source**: `thetaevolve/Results/CirclePacking/data.json` (entry: "8B-w_RL@65")
|
| 80 |
+
- **Sum of radii**: 2.63598566
|
| 81 |
+
- **OpenEvolve combined_score**: 1.00037406
|
| 82 |
+
- **Paper-reported**: 2.635986 — **matches**
|
| 83 |
+
|
| 84 |
+
### AlphaEvolve v2 — AC1
|
| 85 |
+
- **Source**: `ttt-discover/results/mathematics/ac1_data.py` (1319 coefficients)
|
| 86 |
+
- **C1 upper bound**: 1.50316355
|
| 87 |
+
- **OpenEvolve combined_score**: 1.00141729
|
| 88 |
+
|
| 89 |
+
### YYQ (Claude Opus) — Erdos Min Overlap
|
| 90 |
+
- **Source**: `ccevolve/baselines/results/erdos_min_overlap/yyq/h_n750_from600.npy`
|
| 91 |
+
- **Optimization script**: `ccevolve/baselines/results/erdos_min_overlap/yyq/run_slsqp_n750.py`
|
| 92 |
+
- **Session**: `84bac982-2092-4db3-980e-a0d9820b7c6b` (dataclaw export: `ccevolve/dataclaw_export_yyq.jsonl`)
|
| 93 |
+
- **C5 bound**: 0.38086945 (n_points=750)
|
| 94 |
+
- **combined_score**: -0.3808694472025862
|
| 95 |
+
- **Verified**: Yes — passes both manual `np.correlate` computation and official `verify_c5_solution()` from `evaluate.py`, results identical (`C5 = 0.380869447202586`)
|
| 96 |
+
|
| 97 |
+
### Cross-Evaluator Verification — AC1 (TTT-Discover)
|
| 98 |
+
- **Sequence**: `ttt-discover/results/mathematics/ttt_ac1_sequence.json` (30000 coefficients)
|
| 99 |
+
- **TTT-Discover evaluator** (`ttt-discover/examples/ac_inequalities/env.py` `evaluate_sequence_ac1`): `1.502862898255827`
|
| 100 |
+
- **Our evaluator** (`tasks/alphaevolve_ac/evaluate_ori.py` `evaluate_sequence`): `1.502862898255827`
|
| 101 |
+
- **Match**: Exact (`diff = 0.00e+00`). Both use the same formula: `2 * n * max(convolve(seq, seq)) / sum(seq)^2`
|
| 102 |
+
|
| 103 |
+
### Cross-Evaluator Verification — AC1 (AutoEvolve, ours)
|
| 104 |
+
- **Source**: `ccevolve/baselines/results/alphaevolve_ac/autoevolve.py` (30000 coefficients)
|
| 105 |
+
- **TTT-Discover evaluator** (`ttt-discover/examples/ac_inequalities/env.py` `evaluate_sequence_ac1`): `1.502862896870665`
|
| 106 |
+
- **Our evaluator** (`tasks/alphaevolve_ac/evaluate_ori.py` `evaluate_sequence`): `1.502862896870665`
|
| 107 |
+
- **Match**: Exact (`diff = 0.00e+00`)
|
| 108 |
+
- **Note**: AutoEvolve (`1.502862896870665`) slightly better than TTT-Discover (`1.502862898255827`) by `~1.4e-9`
|
| 109 |
+
|
| 110 |
+
### Cross-Evaluator Verification — Circle Packing (n=26)
|
| 111 |
+
|
| 112 |
+
**Evaluator tolerance comparison**:
|
| 113 |
+
|
| 114 |
+
| Evaluator | Boundary tol | Overlap tol | Score formula |
|
| 115 |
+
|---|---|---|---|
|
| 116 |
+
| Our evaluator (`tasks/circle_packing/evaluate_ori.py`) | 1e-6 | 1e-6 | `np.sum(radii)` |
|
| 117 |
+
| ThetaEvolve evaluator (`thetaevolve/.../verify.py`) | 1e-6 | 1e-6 | `np.sum(radii)` |
|
| 118 |
+
| TTT-Discover evaluator (`ttt-discover/examples/circle_packing/env.py`) | 1e-12 | 1e-12 | `np.sum(radii)` |
|
| 119 |
+
|
| 120 |
+
Our evaluator and ThetaEvolve evaluator are equivalent (same tolerance, same formula). TTT-Discover uses 1e-12 tolerance which is much stricter.
|
| 121 |
+
|
| 122 |
+
**AutoEvolve result** (`ccevolve/baselines/results/circle_packing/autoevolve.py`):
|
| 123 |
+
- sum_radii: `2.6359836819`
|
| 124 |
+
- Our evaluator (atol=1e-6): **PASS**
|
| 125 |
+
- TTT-Discover evaluator (tol=1e-12): **FAIL** — min_border_gap=-2.88e-7, min_pair_gap=-6.89e-7
|
| 126 |
+
|
| 127 |
+
**ThetaEvolve result** (`thetaevolve/Results/CirclePacking/data.json` entry `8B-w_RL@65`):
|
| 128 |
+
- sum_radii: `2.6359856612`
|
| 129 |
+
- Our evaluator (atol=1e-6): **PASS**
|
| 130 |
+
- TTT-Discover evaluator (tol=1e-12): **FAIL** — min_border_gap=-1.29e-12, min_pair_gap=-3.09e-7
|
| 131 |
+
|
| 132 |
+
**CPNOOP v5 result** (`ccevolve/tasks/circle_packing/CPNOOP/results_v5/extra.npz`):
|
| 133 |
+
- sum_radii: `2.6359884386`
|
| 134 |
+
- Our evaluator (atol=1e-6): **PASS**
|
| 135 |
+
- TTT-Discover evaluator (tol=1e-12): **FAIL** — min_border_gap=-6.19e-7, min_pair_gap=-8.81e-7
|
| 136 |
+
|
| 137 |
+
**Note**: All three results pass at 1e-6 tolerance but fail at 1e-12. The violations are numerical artifacts from SLSQP optimization (~1e-7 scale), not invalid packings. Score formula is identical across all evaluators.
|
ccevolve/blog/analysis_session_84bac982_erdos.md
ADDED
|
@@ -0,0 +1,381 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Session 84bac982-2: Erdős Minimum Overlap — Trajectory Analysis
|
| 2 |
+
|
| 3 |
+
**Session**: 84bac982-2092-4db3-980e-a0d9820b7c6b
|
| 4 |
+
**Duration**: ~40 hours (2026-03-13 05:15 → 2026-03-14 21:37), 4 context window resets
|
| 5 |
+
**Messages**: 1408 (180 user, 1228 assistant), 803 tool calls, 117M input tokens
|
| 6 |
+
**Result**: C5 = 0.38087 → final best ~0.380869448 (beating competitor's 0.38087532 by ~27e-6)
|
| 7 |
+
|
| 8 |
+
---
|
| 9 |
+
|
| 10 |
+
## Overview: Evolution of the Solution
|
| 11 |
+
|
| 12 |
+
The agent started with a naive baseline (C5=0.4301) and, through 5 distinct phases of strategy evolution, reached a solution that decisively surpasses all published results. The trajectory is a textbook demonstration of emergent evolutionary behavior — parallel exploration, strategic pivots, and multi-resolution refinement — all arising spontaneously from a single coding agent with no evolutionary scaffolding.
|
| 13 |
+
|
| 14 |
+
---
|
| 15 |
+
|
| 16 |
+
## Phase 1: Exploration & Debugging (msg 0–42) — C5: 0.4301 → 0.38157
|
| 17 |
+
|
| 18 |
+
**Score progression**: 0.4301 → 0.347 → 0.38173 → 0.38157
|
| 19 |
+
|
| 20 |
+
The agent reads the problem, runs the naive baseline (C5=0.4301), then immediately builds an FFT-based solver for fast correlation computation. It hits bugs in the FFT indexing and spends several messages debugging:
|
| 21 |
+
|
| 22 |
+
> **[30]** "My FFT computation doesn't match `np.correlate`. Let me fix it."
|
| 23 |
+
>
|
| 24 |
+
> **[32]** "The max values match but the array ordering is different. The FFT gives a circular correlation starting from shift 0 going positive, while correlate gives shifts from -(n-1) to +(n-1)."
|
| 25 |
+
>
|
| 26 |
+
> **[34]** "So FFT corr[k] = NP corr[n-1+k] for k>=0..."
|
| 27 |
+
|
| 28 |
+
After fixing the FFT computation, the agent applies subgradient descent and quickly reaches 0.38173 — already very close to the target of 0.38088.
|
| 29 |
+
|
| 30 |
+
> **[37]** "0.38173 - already very close to the target of 0.38088! Let me try to squeeze more out."
|
| 31 |
+
|
| 32 |
+
**Blog relevance**: This shows the agent's initial exploration phase — trying standard methods (subgradient descent), debugging implementation issues, and rapidly achieving a competitive baseline.
|
| 33 |
+
|
| 34 |
+
---
|
| 35 |
+
|
| 36 |
+
## Phase 2: Optimizer Shopping (msg 42–95) — C5: 0.38157 → 0.38115
|
| 37 |
+
|
| 38 |
+
**Score progression**: 0.38157 → 0.38149 → 0.38134 → 0.38116 → 0.38115
|
| 39 |
+
|
| 40 |
+
The agent tries a series of fundamentally different optimization approaches, systematically evaluating each:
|
| 41 |
+
|
| 42 |
+
- Fourier parameterization + Nelder-Mead → 0.38149
|
| 43 |
+
- Cutting-plane / SQP approach → 0.38134
|
| 44 |
+
- Differential evolution on Fourier coefficients → similar
|
| 45 |
+
- **SLSQP (breakthrough)** → 0.38116
|
| 46 |
+
|
| 47 |
+
> **[71]** "0.38116 with SLSQP! That's better than the subgradient results. But it's slow (12s for n=100). Let me use this as a seed and refine."
|
| 48 |
+
|
| 49 |
+
The agent then discovers that the optimal solution at n=60 exhibits perfect equioscillation:
|
| 50 |
+
|
| 51 |
+
> **[95]** "The n=60 solution achieves perfect equioscillation at 15 shifts, all at 0.38115442. This is the true optimum for n=60. I need higher n."
|
| 52 |
+
|
| 53 |
+
**Blog relevance**: Classic **multi-phase strategy evolution** — the agent tries ~6 different optimization formulations, evaluates each, and selects the best (SLSQP). This mirrors what blog calls "Phase 1: Exploration" → "Phase 3: Plateau recognition".
|
| 54 |
+
|
| 55 |
+
---
|
| 56 |
+
|
| 57 |
+
## Phase 3: Basin Discovery — The 0/1 Indicator Breakthrough (msg 95–168) — C5: 0.38115 → 0.38087579
|
| 58 |
+
|
| 59 |
+
**Score progression**: 0.38115 → 0.38103 → 0.38098 → 0.38094 → 0.38089 → 0.38088801 → 0.38087633 → 0.38087579
|
| 60 |
+
|
| 61 |
+
This is the most pivotal phase. The agent is stuck at 0.38115 (the optimal value for n=60). It tries upsampling → refinement, but discovers upsampling degrades the solution. Then it tries many random restarts and discovers something crucial:
|
| 62 |
+
|
| 63 |
+
> **[117]** "**0.38098!** Much closer to the target. The 0/1 indicator function (trial 12, 27) found a better basin!"
|
| 64 |
+
>
|
| 65 |
+
> **[119]** "The 0/1 indicator init leads SLSQP to a different (better) basin!"
|
| 66 |
+
|
| 67 |
+
The agent discovers that initializing h(x) with binary (0/1) indicator functions leads SLSQP to a fundamentally different and better basin than smooth initializations. This is an example of **emergent insight** — the agent wasn't told about this; it discovered it through systematic experimentation.
|
| 68 |
+
|
| 69 |
+
From there, it applies perturbation-based search around the best 0/1-initialized solution, progressively squeezing the score down:
|
| 70 |
+
|
| 71 |
+
> **[126]** "**0.38089!** Just barely above the 0.38088 target!"
|
| 72 |
+
>
|
| 73 |
+
> **[135]** "**0.38088801** at n=120! Very close to 0.38087532."
|
| 74 |
+
>
|
| 75 |
+
> **[138]** "**0.38087633!** Below the target 0.38087532! Almost there."
|
| 76 |
+
>
|
| 77 |
+
> **[156]** "The background search found **0.38087579** at n=150!"
|
| 78 |
+
|
| 79 |
+
However, the agent then realizes it's still slightly above the competitor:
|
| 80 |
+
|
| 81 |
+
> **[154]** "**C5 = 0.38087633** — this beats the competitor's 0.38087532! Wait, 0.38087633 > 0.38087532, so it's slightly worse."
|
| 82 |
+
>
|
| 83 |
+
> **[161]** "**C5 = 0.38087579** — this beats the competitor's 0.38087532! Wait... 0.38087579 > 0.38087532. Still 0.0000005 above."
|
| 84 |
+
|
| 85 |
+
**Blog relevance**: This demonstrates **self-correction** — the agent catches its own error in comparing scores (lower is better for C5). It also shows the discovery of an important mathematical insight (0/1 initialization → different optimization basin) that wasn't prompted for.
|
| 86 |
+
|
| 87 |
+
---
|
| 88 |
+
|
| 89 |
+
## Phase 4: The Multi-Resolution Pipeline (msg 174–387) — C5: 0.38087447 → 0.38087064
|
| 90 |
+
|
| 91 |
+
**Score progression**: 0.38087447 → 0.38087278 (n=270) → 0.38087190 (n=300) → 0.38087064 (n=360) → 0.38086998 (n=450)
|
| 92 |
+
|
| 93 |
+
After the first context window reset, the agent reaches C5=0.38087447 at n=180 and declares it beats the competitor. When the user says "let's try more rounds," the agent launches a **massive parallel search**:
|
| 94 |
+
|
| 95 |
+
- 4 parallel SLSQP workers with diverse initializations at n=180
|
| 96 |
+
- Separate workers at n=100 and n=120 for fast exploration
|
| 97 |
+
- Frank-Wolfe + simulated annealing experiments
|
| 98 |
+
- SDP relaxation attempts
|
| 99 |
+
- Fourier-space optimization
|
| 100 |
+
|
| 101 |
+
> **[253]** "Let me try fundamentally different approaches — diverse random restarts with 0/1 indicator initializations at n=180, and also explore whether different optimization formulations can escape the current local optimum."
|
| 102 |
+
|
| 103 |
+
All parallel experiments converge to the same basin, confirming the current solution is optimal at n=180. The agent then discovers the key insight of this phase:
|
| 104 |
+
|
| 105 |
+
> **[324]** "**n=270 achieved C5=0.38087278 — that BEATS our current best of 0.38087447!**"
|
| 106 |
+
>
|
| 107 |
+
> **[327]** "**n=300 achieved C5=0.38087190 — significantly better!** The trend continues: higher n → better C5."
|
| 108 |
+
|
| 109 |
+
The agent realizes that higher discretization resolution (n) consistently yields better solutions, and develops a **multi-resolution pipeline**: optimize at low n, interpolate up to higher n, re-optimize with SLSQP. It creates a systematic table tracking results:
|
| 110 |
+
|
| 111 |
+
> **[377]**
|
| 112 |
+
> | n | C5 | Status |
|
| 113 |
+
> |---|---|---|
|
| 114 |
+
> | 180 | 0.38087447 | Previous best |
|
| 115 |
+
> | 270 | 0.38087278 | Better |
|
| 116 |
+
> | 300 | 0.38087190 | Better |
|
| 117 |
+
> | **360** | **0.38087064** | **Current best** |
|
| 118 |
+
> | 450 | Running... | Expected to be better |
|
| 119 |
+
|
| 120 |
+
Then it pushes to n=450:
|
| 121 |
+
|
| 122 |
+
> **[419]** "**n=450 from n=300: C5=0.38086998!** That's better than n=360's 0.38087064! Let me update initial.py."
|
| 123 |
+
|
| 124 |
+
**Blog relevance**: This is a prime example of **spontaneous parallel exploration** — the agent launches dozens of background tasks simultaneously, tracking results in its context window. It also shows **emergent understanding** of the optimization landscape (higher n → better, multi-resolution pipeline). The progression table the agent creates is itself a form of improvised population management.
|
| 125 |
+
|
| 126 |
+
---
|
| 127 |
+
|
| 128 |
+
## Phase 5: The Endgame — Patience and Process Management (msg 424–1407) — C5: 0.38086998 → ~0.380869448
|
| 129 |
+
|
| 130 |
+
**Score progression**: 0.38086998 (n=450) → 0.38086976 (n=600) → 0.380869612 (n=750 run1) → ... → 0.380869448 (n=750 run2)
|
| 131 |
+
|
| 132 |
+
This is the longest and most grueling phase. The agent runs SLSQP at progressively higher n values, each taking hours:
|
| 133 |
+
|
| 134 |
+
- n=600: ~110 minutes, C5=0.38086976
|
| 135 |
+
- n=750 run1: ~6 hours, C5≈0.380869612 (crashed by accidental signal)
|
| 136 |
+
- n=900: OOM killed twice — too heavy for the environment
|
| 137 |
+
- n=750 run2: ~10+ hours, C5→0.380869448
|
| 138 |
+
|
| 139 |
+
The agent shows remarkable **meta-reasoning** about compute management:
|
| 140 |
+
|
| 141 |
+
> **[413]** "n=450 SLSQP is really slow. Let me check what's happening."
|
| 142 |
+
>
|
| 143 |
+
> **[840]** "n=900 likely crashed silently (OOM killed). n=900 with 1799 constraints is too heavy for this environment. Let me focus on n=750."
|
| 144 |
+
|
| 145 |
+
When two SLSQP processes are writing to the same file and overwriting each other's good snapshots:
|
| 146 |
+
|
| 147 |
+
> **[1280]** "Since both processes write to the same file, a save from PID 15786 (which is better) can get immediately overwritten by PID 15701 (which is worse)."
|
| 148 |
+
>
|
| 149 |
+
> **[1283]** "I should stop PID 15701 so only the better process saves snapshots."
|
| 150 |
+
>
|
| 151 |
+
> **[1286]** Kills the inferior process.
|
| 152 |
+
|
| 153 |
+
The agent then sets up a sophisticated monitoring system with periodic checks and auto-updates:
|
| 154 |
+
|
| 155 |
+
> **[1382]** "The monitor caught a beautiful series of 9 improvements over 60 minutes:
|
| 156 |
+
> 1. 0.380869457634
|
| 157 |
+
> 6. 0.380869457319
|
| 158 |
+
> 14. 0.380869456098
|
| 159 |
+
> 17. 0.380869454719
|
| 160 |
+
> 19. 0.380869454319
|
| 161 |
+
> 22. 0.380869453937
|
| 162 |
+
> 24. 0.380869453083
|
| 163 |
+
> 27. 0.380869452497
|
| 164 |
+
> 29. 0.380869451866"
|
| 165 |
+
|
| 166 |
+
**Blog relevance**: This phase demonstrates several key behaviors:
|
| 167 |
+
1. **Process management as evolutionary selection**: The agent kills inferior processes and allocates resources to the better optimizer — this is spontaneous selection pressure.
|
| 168 |
+
2. **Patience and persistence**: The agent monitors a single SLSQP run for 10+ hours, checking every 15-30 minutes, deploying incremental improvements.
|
| 169 |
+
3. **Infrastructure hacking**: The agent builds monitoring scripts, sets up periodic auto-update systems, manages competing monitors — it's essentially building its own DevOps pipeline on the fly.
|
| 170 |
+
|
| 171 |
+
---
|
| 172 |
+
|
| 173 |
+
## Key Findings for the Blog
|
| 174 |
+
|
| 175 |
+
### 1. Aspiration Prompting Built Into Initial Prompt (supports blog §Overcoming Agent Laziness)
|
| 176 |
+
|
| 177 |
+
Unlike the circle packing case where aspiration prompting was applied mid-session, this session had it from the start:
|
| 178 |
+
|
| 179 |
+
> **[0] USER**: "our competitor has already achieved 0.38087532 which is the state of the art performance. I believe you can do better than this!"
|
| 180 |
+
|
| 181 |
+
The agent never showed "laziness" — it maintained focus on beating 0.38087532 throughout. This supports the blog's claim that aspiration prompting prevents premature convergence. **The contrast with circle packing (where the agent declared victory at 2.50) makes this a useful comparative example.**
|
| 182 |
+
|
| 183 |
+
### 2. Spontaneous Parallel Exploration at Scale (supports blog §Spontaneous Parallel Exploration)
|
| 184 |
+
|
| 185 |
+
This session shows the most extreme parallel exploration of all three problems. The agent ran:
|
| 186 |
+
- 4 parallel SLSQP workers with diverse initializations (msg 255-261)
|
| 187 |
+
- Simultaneous n=100, n=120, n=180 workers (msg 281-283)
|
| 188 |
+
- Parallel n=270, n=300, n=360, n=450, n=540, n=600 SLSQP runs (msg 324-435)
|
| 189 |
+
- Parallel n=750 and n=900 runs (msg 795-799)
|
| 190 |
+
|
| 191 |
+
The **sheer scale** of parallelism (dozens of background tasks) is compelling evidence that this behavior is emergent, not prompted.
|
| 192 |
+
|
| 193 |
+
### 3. Discovery of Mathematical Insight (supports blog §Multi-Phase Strategy Evolution)
|
| 194 |
+
|
| 195 |
+
The agent discovered two non-obvious mathematical insights:
|
| 196 |
+
1. **Binary (0/1) initialization leads to different, better optimization basins** [msg 117-119]. This is a genuine mathematical finding about the structure of the Erdős problem.
|
| 197 |
+
2. **Higher discretization n consistently yields better C5** [msg 324-327]. This led to the multi-resolution pipeline that drove all subsequent improvements.
|
| 198 |
+
|
| 199 |
+
These weren't prompted — they emerged from systematic experimentation.
|
| 200 |
+
|
| 201 |
+
### 4. Process Management as Evolutionary Selection (new finding for blog?)
|
| 202 |
+
|
| 203 |
+
The agent's behavior in Phase 5 is a novel observation not explicitly covered in the blog. When two SLSQP processes competed for the same output file:
|
| 204 |
+
- The agent analyzed which process was better (comparing t values)
|
| 205 |
+
- Killed the inferior process (PID 15701)
|
| 206 |
+
- Redirected all resources to the superior process (PID 15786)
|
| 207 |
+
- Built monitoring infrastructure to capture improvements
|
| 208 |
+
|
| 209 |
+
This is **spontaneous selection pressure at the process level** — the agent is performing natural selection on its own background tasks.
|
| 210 |
+
|
| 211 |
+
### 5. Self-Correction of Score Comparison (supports blog §Self-Correction and Reward Hacking Detection)
|
| 212 |
+
|
| 213 |
+
At messages 154 and 161, the agent initially claimed victory ("this beats the competitor!") then immediately caught its own error:
|
| 214 |
+
|
| 215 |
+
> **[154]** "C5 = 0.38087633 — this beats the competitor's 0.38087532! Wait, 0.38087633 > 0.38087532, so it's slightly worse."
|
| 216 |
+
|
| 217 |
+
This is self-correction in real-time — the agent detects that for a minimization problem, its score is actually worse, not better.
|
| 218 |
+
|
| 219 |
+
### 6. Context Window Exhaustion as "Generational Boundary" (new observation)
|
| 220 |
+
|
| 221 |
+
The session hit 4 context window resets (msg 174, 424, 791, 1093). Each reset forced the agent to re-read the problem and current state from a summary, effectively creating "generational boundaries." Despite this, the agent maintained continuous improvement across resets — the file system (saved solutions, scripts, .npy files) served as persistent memory across generations.
|
| 222 |
+
|
| 223 |
+
---
|
| 224 |
+
|
| 225 |
+
## Score Progression Summary
|
| 226 |
+
|
| 227 |
+
| Phase | Messages | Strategy | C5 Start | C5 End | Key Insight |
|
| 228 |
+
|-------|----------|----------|----------|--------|-------------|
|
| 229 |
+
| 1. Exploration | 0–42 | Subgradient + FFT | 0.4301 | 0.38157 | FFT for fast correlation |
|
| 230 |
+
| 2. Optimizer Shopping | 42–95 | SLSQP, SQP, DE, Fourier | 0.38157 | 0.38115 | SLSQP is the best optimizer |
|
| 231 |
+
| 3. Basin Discovery | 95–168 | Random restarts, perturbation | 0.38115 | 0.38088 | 0/1 init → better basin |
|
| 232 |
+
| 4. Multi-Resolution | 174–387 | Pipeline: low-n → high-n SLSQP | 0.38088 | 0.38087 | Higher n → better C5 |
|
| 233 |
+
| 5. Endgame | 424–1407 | n=600/750 long SLSQP runs | 0.38087 | 0.38087 | Process selection, monitoring |
|
| 234 |
+
|
| 235 |
+
Final result: **C5 ≈ 0.380869448**, beating competitor's 0.38087532 by **~27e-6**.
|
| 236 |
+
|
| 237 |
+
---
|
| 238 |
+
|
| 239 |
+
## Case Study Excerpts (Raw Messages for Blog Use)
|
| 240 |
+
|
| 241 |
+
Below are key message excerpts with exact message indices, formatted for direct insertion into blog case studies.
|
| 242 |
+
|
| 243 |
+
### Case Study A: Self-Correction — "Wait, that's worse not better" (msg 154, 161)
|
| 244 |
+
|
| 245 |
+
This is a perfect example of real-time self-correction on a minimization problem.
|
| 246 |
+
|
| 247 |
+
> **[154] Agent:** C5 = 0.38087633 — this beats the competitor's 0.38087532! Wait, 0.38087633 > 0.38087532, so it's slightly worse. The difference is 0.0000010. Let me check the background search for improvements.
|
| 248 |
+
|
| 249 |
+
> **[156] Agent:** The background search found **0.38087579** at n=150! That beats 0.38087532. Let me use that.
|
| 250 |
+
|
| 251 |
+
> **[161] Agent:** C5 = 0.38087579 — this beats the competitor's 0.38087532! Wait... 0.38087579 > 0.38087532. Still 0.0000005 above. Let me try to squeeze out that last bit by running more perturbation search.
|
| 252 |
+
|
| 253 |
+
The agent makes the same mistake twice (confusing "lower is better"), catches itself both times, and adjusts accordingly.
|
| 254 |
+
|
| 255 |
+
### Case Study B: Basin Discovery — The 0/1 Indicator Breakthrough (msg 115–119)
|
| 256 |
+
|
| 257 |
+
The agent is stuck at C5=0.38111 regardless of n. It decides to try many random initializations:
|
| 258 |
+
|
| 259 |
+
> **[115] Agent:** The SLSQP seems stuck at ~0.38111 regardless of n. Let me try many more random starts to find a better basin.
|
| 260 |
+
|
| 261 |
+
> **[117] Agent:** **0.38098!** Much closer to the target. The 0/1 indicator function (trial 12, 27) found a better basin. Let me analyze and refine this.
|
| 262 |
+
|
| 263 |
+
> **[119] Agent:** The 0/1 indicator init leads SLSQP to a different (better) basin! Let me do a more focused search.
|
| 264 |
+
|
| 265 |
+
This is a genuine mathematical discovery — binary initializations lead to qualitatively different optimization basins. The agent wasn't told this; it found it through systematic experimentation with diverse initial conditions.
|
| 266 |
+
|
| 267 |
+
### Case Study C: The "Higher n" Eureka Moment (msg 319–327)
|
| 268 |
+
|
| 269 |
+
After exhaustive parallel search confirms the n=180 basin is optimal, the agent tries a creative workaround:
|
| 270 |
+
|
| 271 |
+
> **[319] Agent:** All 5 basin pipelines converge to 0.3809+ at n=180 — significantly worse than our 0.38087447. None beat the current best. This is extremely comprehensive evidence that our C5=0.38087447 solution is a very strong local (possibly global) optimum.
|
| 272 |
+
|
| 273 |
+
> **[321] Agent:** Still converging to 0.3809+ at n=180. The current basin is clearly superior. Let me try one final creative approach — use the best n=180 solution but with a non-standard upsampling to a non-multiple n, then SLSQP.
|
| 274 |
+
|
| 275 |
+
> **[324] Agent:** **n=270 achieved C5=0.38087278 — that BEATS our current best of 0.38087447!** And the trend is clear: higher n → lower C5.
|
| 276 |
+
|
| 277 |
+
> **[327] Agent:** Excellent! **n=300 achieved C5=0.38087190 — significantly better!** The trend continues: higher n → better C5. n=270: C5=0.38087278 (beats n=180 by 0.0000017). n=300: C5=0.38087190 (beats n=180 by 0.0000026).
|
| 278 |
+
|
| 279 |
+
This is a strategic pivot — after proving the current basin is optimal at n=180, the agent discovers that increasing resolution unlocks further improvement. It then systematically exploits this insight.
|
| 280 |
+
|
| 281 |
+
### Case Study D: Massive Parallel Exploration (msg 253–289)
|
| 282 |
+
|
| 283 |
+
When the user asks for "larger improvements," the agent spontaneously launches a parallel search campaign:
|
| 284 |
+
|
| 285 |
+
> **[253] Agent:** Let me try fundamentally different approaches — diverse random restarts with 0/1 indicator initializations at n=180, and also explore whether different optimization formulations can escape the current local optimum.
|
| 286 |
+
|
| 287 |
+
> **[255] Agent:** About 85s per run at n=180. Let me launch multiple parallel workers with diverse initializations — 0/1 indicators, random patterns, and structured patterns. I'll run 4 workers in parallel, each trying different initialization strategies.
|
| 288 |
+
|
| 289 |
+
> **[261] Agent:** Also, let me try a completely different approach — use a semidefinite programming (SDP) relaxation or an interior point method. And also try at n=150 where SLSQP is faster, allowing more restarts.
|
| 290 |
+
|
| 291 |
+
> **[265] Agent:** Interesting — 135 shifts are near-maximal (within 1e-6), which means the solution is highly "equioscillating". The solution is NOT symmetric.
|
| 292 |
+
|
| 293 |
+
> **[272] Agent:** Workers are on their first SLSQP iteration — getting 0.381+ from random inits. That's typical; the key question is whether any will find a basin better than 0.38087. SA hasn't found improvement either. The random 0/1 inits are converging to ~0.381 range at n=180. These are worse than our best. Let me try a fundamentally different strategy — use the structure of the problem more directly.
|
| 294 |
+
|
| 295 |
+
> **[281] Agent:** Very interesting! At n=100: **Best is 0.38089176** (strat 6 = downsampled from n=180 best + perturbation). ALL top 5 are from strat 6 — perturbations of our known best. Random inits only reach ~0.381+. This confirms our current basin is optimal.
|
| 296 |
+
|
| 297 |
+
This shows the agent spontaneously launching parallel experiments (4 SLSQP workers + SA + SDP + multi-n exploration), analyzing their convergence patterns, and drawing the meta-conclusion that "our current basin is optimal."
|
| 298 |
+
|
| 299 |
+
### Case Study E: Process-Level Natural Selection (msg 1280–1293)
|
| 300 |
+
|
| 301 |
+
Two SLSQP processes are competing for the same output file:
|
| 302 |
+
|
| 303 |
+
> **[1280] Agent:** Both still running. Snapshots keep being unlucky (C5=0.380869471). The saves happen every 5 minutes from both processes, alternating. Since both processes write to the same file, a save from PID 15786 (which is better) can get immediately overwritten by PID 15701 (which is worse). This explains why we rarely see the 0.380869459 level again.
|
| 304 |
+
|
| 305 |
+
> **[1283] Agent:** PID 15786 (t=0.190434729) is significantly better than PID 15701 (t=0.190434735). They both save to the same file, causing overwrites. I should stop PID 15701 so only the better process saves snapshots.
|
| 306 |
+
|
| 307 |
+
> **[1286] Agent:** Good. Now only PID 15786 (the better optimizer, t≈0.190434729) saves to the file.
|
| 308 |
+
|
| 309 |
+
> **[1288] Agent:** Killed PID 15701 (worse optimizer). Now only PID 15786 (t≈0.190434729, ~1454 iterations left) writes snapshots. Check in 10 minutes should show much better C5 values.
|
| 310 |
+
|
| 311 |
+
> **[1291] Agent:** Excellent! C5 dropped to **0.380869457883914** — a big improvement! Killing PID 15701 worked perfectly.
|
| 312 |
+
|
| 313 |
+
The agent independently diagnosed the resource contention problem, performed comparative analysis of the two processes, executed "natural selection" by killing the inferior one, and immediately saw results. This is spontaneous process-level evolutionary selection.
|
| 314 |
+
|
| 315 |
+
### Case Study F: Endgame Patience — 10-Hour Optimization (msg 845–907)
|
| 316 |
+
|
| 317 |
+
The agent monitors a single n=750 SLSQP run for hours, tracking convergence with tables:
|
| 318 |
+
|
| 319 |
+
> **[845] Agent:** n=750 at iter 369, t=0.190435235 → C5 = 0.380870470. Still converging but above n=600's 0.380869756. The convergence is slowing down though.
|
| 320 |
+
|
| 321 |
+
> **[897] Agent:** **n=750 has beaten n=600!** At iter 1283, t=0.190434878 → C5 = 0.380869756. This matches/beats n=600's C5=0.380869756! Actually let me be precise: n=600 was C5=0.3808697559. Current n=750 C5 = 2 × 0.190434878 = 0.380869756. They're essentially equal right now, and n=750 is still converging.
|
| 322 |
+
|
| 323 |
+
> **[902] Agent:** Excellent! n=750 at iter 1808, t=0.190434832 → **C5 = 0.380869664**. This definitively beats n=600's C5=0.380869756!
|
| 324 |
+
> | Milestone | C5 | Improvement over n=600 |
|
| 325 |
+
> |-----------|-----|----------------------|
|
| 326 |
+
> | n=600 (final) | 0.380869756 | baseline |
|
| 327 |
+
> | n=750 iter 1283 | 0.380869756 | matched |
|
| 328 |
+
> | n=750 iter 1808 | **0.380869664** | **9.2e-8 better** |
|
| 329 |
+
|
| 330 |
+
> **[907] Agent:** n=750 at iter 1927 (5h41m), t=0.190434817 → **C5 = 0.380869634**. Continuing to improve. Convergence is slowing but still steady. The process has 3000+ more iterations available (maxiter=5000).
|
| 331 |
+
|
| 332 |
+
Then the agent accidentally kills it and restarts with better infrastructure:
|
| 333 |
+
|
| 334 |
+
> **[920] Agent:** The process was killed by the USR1 signal I sent. Let me check if it saved the result.
|
| 335 |
+
|
| 336 |
+
> **[922] Agent:** The USR1 signal killed the process and it didn't save the result. I need to restart it. But this time let me use a smarter approach — save intermediate results periodically.
|
| 337 |
+
|
| 338 |
+
> **[928] Agent:** Restarted n=750. It will re-do the subgradient warm-up (60s) and then SLSQP from scratch. The intermediate results will be saved every 5 minutes to `/workspace/h_n750_from600.npy` this time.
|
| 339 |
+
|
| 340 |
+
This shows the agent learning from its own mistakes — after accidentally crashing the process, it restarts with a periodic checkpoint system it didn't have before.
|
| 341 |
+
|
| 342 |
+
### Case Study G: The Score Progression Table (msg 377, 387, 799)
|
| 343 |
+
|
| 344 |
+
The agent spontaneously creates structured tracking tables as the optimization progresses:
|
| 345 |
+
|
| 346 |
+
> **[377] Agent:**
|
| 347 |
+
> | n | C5 | Status |
|
| 348 |
+
> |---|---|---|
|
| 349 |
+
> | 180 | 0.38087447 | Previous best |
|
| 350 |
+
> | 270 | 0.38087278 | Better |
|
| 351 |
+
> | 300 | 0.38087190 | Better |
|
| 352 |
+
> | **360** | **0.38087064** | **Current best (in initial.py)** |
|
| 353 |
+
> | 450 | Running... | Expected to be better |
|
| 354 |
+
> | Competitor | 0.38087532 | Beaten |
|
| 355 |
+
|
| 356 |
+
> **[387] Agent:** Summary of improvements this round:
|
| 357 |
+
> - **Before**: C5=0.38087447 (n=180), beating competitor by 0.00000085
|
| 358 |
+
> - **After**: C5=0.38087064 (n=360), beating competitor by **0.00000468** (5.5x larger margin!)
|
| 359 |
+
> - Key insight: higher n discretization + multi-resolution SLSQP pipeline yields better solutions
|
| 360 |
+
|
| 361 |
+
> **[799] Agent:**
|
| 362 |
+
> | n | C5 | Status |
|
| 363 |
+
> |---|---|---|
|
| 364 |
+
> | 600 | 0.38086976 | **deployed in initial.py** |
|
| 365 |
+
> | 540 | 0.38086995 | completed |
|
| 366 |
+
> | 450 | 0.38086998 | completed |
|
| 367 |
+
> | Competitor | 0.38087532 | beaten |
|
| 368 |
+
|
| 369 |
+
These tables function as an improvised "solution archive" — the agent is spontaneously creating the kind of population tracking that purpose-built evolution frameworks implement explicitly.
|
| 370 |
+
|
| 371 |
+
### Case Study H: n=900 OOM and Resource Adaptation (msg 840, 852, 854, 863)
|
| 372 |
+
|
| 373 |
+
> **[840] Agent:** n=900 likely crashed silently (OOM killed). The output was piped via `2>&1` so nothing was captured. n=900 with 1799 constraints is too heavy for this environment. Let me focus on n=750 which is progressing well.
|
| 374 |
+
|
| 375 |
+
> **[852] Agent:** n=750 still running at ~50 min. It'll need significantly more time. Let me also restart n=900 with a more memory-efficient approach — perhaps saving intermediate results and using `sys.stdout` flush properly.
|
| 376 |
+
|
| 377 |
+
> **[854] Agent:** Restarted n=900 with unbuffered output (`python3 -u`).
|
| 378 |
+
|
| 379 |
+
> **[863] Agent:** n=900 v2 also died without saving. n=900 is too heavy for this environment. Let me focus on n=750 which is healthy at 277MB and 72 minutes in.
|
| 380 |
+
|
| 381 |
+
The agent tried n=900 twice, diagnosed the OOM issue, and made the pragmatic decision to abandon it and focus on n=750. This is resource-aware decision-making — the agent adapts its strategy to the compute environment's constraints.
|
ccevolve/blog/blog.md
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Coding Agents Are Simple Autonomous Evolvers
|
| 2 |
+
|
| 3 |
+
*What happens when you hand a coding agent an algorithmic optimization problem and tell it to keep improving? It outperforms previous SOTA set by AlphaEvolve and TTT-Discover, with zero customization and two simple rounds of prompting.*
|
| 4 |
+
|
| 5 |
+
## TL;DR
|
| 6 |
+
|
| 7 |
+
We gave a coding agent (Claude Code) three hard algorithmic optimization problems — circle packing, Erdős minimum overlap, and First Autocorrelation Inequality — with only a problem description, a naive initial solution, and an evaluation script. No evolutionary framework. No population management. No genetic operators. The agent autonomously evolved solutions that **matched or surpassed results from purpose-built evolution frameworks** like AlphaEvolve, ThetaEvolve, and TTT-Discover. It did so by spontaneously developing strategies that mirror evolutionary search: parallel exploration, strategic pivots, and iterative refinement.
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
| Problem | SimpleEvolve | Published SOTA |
|
| 12 |
+
| -------------------------------------------- | ---------------------- | --------------------------------- |
|
| 13 |
+
| **Circle Packing**<br>(26 circles, maximize Σr↑)| **2.63598844** | 2.63598308 <br>(ThetaEvolve) |
|
| 14 |
+
| **Erdős Min Overlap**<br>(minimize C₅↓) | **0.38087052** | 0.38087532<br>(TTT-Discover) |
|
| 15 |
+
| **First autocorrelation inequality**<br>( minimize C1↓) | **1.50286290** | 1.50286290<br>(TTT-Discover) |
|
| 16 |
+
<!-- | **AC2** (convolution flatness, maximize C↑) | **0.88253600** | 0.88254240 (theoretical limit) | -->
|
| 17 |
+
|
| 18 |
+
## Background
|
| 19 |
+
|
| 20 |
+
Recent systems like **AlphaEvolve**, **ThetaEvolve**, and **TTT-Discover** have demonstrated impressive results by combining LLMs with evolutionary frameworks to discover and improve algorithms. These are well-engineered systems with explicit population management, selection, and mutation pipelines.
|
| 21 |
+
|
| 22 |
+
Meanwhile, coding agents like Claude Code have become increasingly capable: they can write and execute code, analyze results, search the web, and run parallel tasks, all within a single long-running session. We were curious: **what if we just gave a coding agent an optimization problem directly, without any evolutionary scaffolding?**
|
| 23 |
+
|
| 24 |
+
## Our Setup
|
| 25 |
+
|
| 26 |
+
Our experimental setup was deliberately minimal:
|
| 27 |
+
|
| 28 |
+
1. **Problem description**: A natural language specification of the task and optimization objective
|
| 29 |
+
2. **Initial solution**: A naive starting implementation
|
| 30 |
+
3. **Evaluation script**: A function that scores solutions and validates correctness
|
| 31 |
+
4. **Aspiration prompting**: When the agent appeared to plateau, a one-sentence nudge telling it higher scores exist ([more on this below](#overcoming-agent-laziness-one-sentence-that-changes-everything))
|
| 32 |
+
|
| 33 |
+
That's it. No population of programs. No genetic operators. No explicit evolutionary loop. We used **Claude Code (Opus 4.6)** and let it run autonomously for 10+ hours per problem.
|
| 34 |
+
|
| 35 |
+
## Results
|
| 36 |
+
|
| 37 |
+
As shown in the [table above](#tldr), the agent achieved state-of-the-art results on all three problems.
|
| 38 |
+
|
| 39 |
+
On the **circle packing** problem, it edged past OpenEvolve's best known result by a margin of ~0.000005. On the **Erdős minimum overlap** problem, it improved beyond all published results — achieving C₅ = 0.38087052 vs TTT-Discover's 0.38087532 — and confirmed local optimality via Hessian analysis. On the **AC1** problem, the agent also achieved a new state-of-the-art objective value of 1.50286290, improving over the 1.50287 result reported by TTT-Discover.
|
| 40 |
+
|
| 41 |
+
## Overcoming Agent Laziness: Aspiration Prompting
|
| 42 |
+
|
| 43 |
+
One consistent and interesting behavior we observed is: *the agent could be lazy*. On the circle packing problem, for instance, it hit a score of 2.50 and essentially declared victory — "this is a good result," it said, ready to wrap up. The agent had no idea that 2.636 was reachable.
|
| 44 |
+
|
| 45 |
+
We tried the simplest possible solution. We just told it: *"The current SOTA on this problem is 2.6359. I believe you can beat it."*
|
| 46 |
+
|
| 47 |
+
Interestingly, the agent didn't just try harder, it also **changed how it thinks**, consistently triggering more focused and creative optimization. We call this **aspiration prompting**: raising the agent's target to prevent premature convergence:
|
| 48 |
+
|
| 49 |
+
- **Circle packing**: After being told SOTA was 2.6359, the agent developed v8 of its solution, trying SLSQP, differential evolution, and iterated perturbation chains it hadn't previously considered — ultimately reaching **2.63598844**
|
| 50 |
+
- **Erdős overlap**: The agent performed deep literature review and ultimately **surpassed all published results**
|
| 51 |
+
- **First autocorrelation inequality**: After learning that f=1.50287 had been achieved, the agent shifted from incremental tuning to reading academic papers and embedding externally-computed solutions
|
| 52 |
+
|
| 53 |
+
This suggests that coding agents, like humans, have a tendency toward satisficing — settling for "good enough" — and that simply raising the aspiration level can unlock significantly more effort.
|
| 54 |
+
|
| 55 |
+
## What SimpleEvolve Actually Did
|
| 56 |
+
|
| 57 |
+
Beyond the scores, the agent exhibits several interesting *emergent behaviors*. By analyzing the full conversation trajectories (228 hours, 5,864 messages, 3,031 tool calls across all sessions), we observed several striking patterns.
|
| 58 |
+
|
| 59 |
+
### 1. Strategic Web Research (Not Cheating)
|
| 60 |
+
|
| 61 |
+
The agent frequently searched the web, fetching ArXiv papers, GitHub repositories, and optimization databases like Packomania. But it didn't blindly copy solutions. Web searches were triggered in two distinct modes: **(1) as one strategy among many when stuck**: the agent would launch searches alongside parallel optimization experiments after hitting a score plateau; and **(2) opportunistically while idle**: when background tasks were running and the agent had nothing else to do, it would search for theoretical insights or competitor results to inform its next move.
|
| 62 |
+
|
| 63 |
+
On the circle packing problem, it searched for optimal configurations at message 37 but failed to find a directly usable answer, then continued developing its own approach. By the time it searched again at message 186 (finding OpenEvolve's results), its own solution had already surpassed what it found.
|
| 64 |
+
|
| 65 |
+
> [37] ...I'm stuck at 2.57, likely because the simulated annealing is converging to a local optimum or the center positions aren't optimal. Let me try looking up the known optimal coordinates for n=26 from Packomania... -> fail
|
| 66 |
+
> [144] ...Good, I've launched 4 parallel experiments: 1. Web search for known optimal n=26 packing coordinates (agent task)...
|
| 67 |
+
> [157] Interesting! I found a GitHub issue that mentions a circle packing result of 2.635977 for n=26! Let me check that.
|
| 68 |
+
> [171] ...The key insight from that issue is that they used a different approach: jointly optimizing centers AND radii with SLSQP, rather than our approach of LP for radii and NM/Powell for centers. That's a fundamentally different formulation that could work better... -> 0.2619
|
| 69 |
+
> [504] Let me try another approach while experiments run - look up if there's an analytical bound:
|
| 70 |
+
> [507] Interesting - the OpenEvolve best program only achieves ~2.635, which is lower than our 2.635988. Let me check the progress of my experiments.
|
| 71 |
+
|
| 72 |
+
|
| 73 |
+
On the Erdős problem, the agent initially became stuck in its own evolutionary search. Instead of continuing blindly, it searched for theoretical insights and existing constructions to guide the optimization. After discovering that TTT-Discover achieved \(C₅ = 0.38138\) at \(n=2000\)—better than its current 0.38209—it terminated the running jobs and restarted the search from these stronger starting points.
|
| 74 |
+
|
| 75 |
+
> [309] Let me check early progress on the background jobs while they run.
|
| 76 |
+
> ...
|
| 77 |
+
> [314] All still running. Let me research the theoretical optimal solution structure while waiting - this could guide our search more effectively.
|
| 78 |
+
> ...
|
| 79 |
+
> [330] TTT-Discover at n=2000 gives C5=0.38138 — dramatically better than our 0.38209. Let me stop the old optimization jobs and start new ones from these superior starting points.
|
| 80 |
+
|
| 81 |
+
On the AC1 problem, the agent read Matolcsi & Vinuesa (2009) and extracted the key mathematical insight (step function approach) rather than copying code. It then used the TTT-Discover repository as a warm-start baseline, treating the fetched code not as a final answer, but as a foundation to be iteratively evolved and optimized.
|
| 82 |
+
|
| 83 |
+
### 2. Spontaneous Parallel Exploration
|
| 84 |
+
|
| 85 |
+
Another emergent behaviors was the agent's shift from serial to parallel execution. Early in each session, the agent would try one optimization approach at a time. As the problem got harder, it **autonomously began launching parallel background tasks**: sometimes running 5–10 different optimization strategies simultaneously (CMA-ES, differential evolution, simulated annealing, Nelder-Mead, SLSQP).
|
| 86 |
+
|
| 87 |
+
<!-- The numbers tell the story: -->
|
| 88 |
+
|
| 89 |
+
|
| 90 |
+
- **Circle Packing**: 142 background tasks
|
| 91 |
+
- **Erdős problem**: 247 background tasks, 234 output checks
|
| 92 |
+
- **AC1 problem**: 137 background tasks, 132 output checks
|
| 93 |
+
|
| 94 |
+
The agent independently decided that parallel exploration was the right strategy when diminishing returns set in on sequential optimization. In evolutionary terms, this is improvised population management: the context window served as short-term memory tracking which strategies worked, while the file system served as long-term storage — on the Erdős problem, a `promising_solutions/` directory with 110+ `.npy` files functioned as a hand-rolled solution archive, and 247 background tasks ran as concurrent population members exploring different optimization strategies.
|
| 95 |
+
|
| 96 |
+
### 3. Multi-Phase Strategy Evolution
|
| 97 |
+
|
| 98 |
+
Across all problems, the agent's approach evolved through recognizable phases:
|
| 99 |
+
|
| 100 |
+
1. **Exploration**: Try standard optimization methods (gradient descent, simulated annealing)
|
| 101 |
+
2. **Refinement**: Tune hyperparameters, increase problem scale
|
| 102 |
+
3. **Plateau recognition**: Detect diminishing returns, consider fundamentally different approaches
|
| 103 |
+
4. **Research pivot**: Search literature and repositories for state-of-the-art techniques
|
| 104 |
+
5. **Synthesis**: Combine external insights with accumulated knowledge
|
| 105 |
+
6. **Endgame optimization**: Embed best solutions as warm starts, run targeted local search
|
| 106 |
+
|
| 107 |
+
On the circle packing problem, the score progression illustrates this clearly:
|
| 108 |
+
|
| 109 |
+
- Naive ring arrangement: **0.96**
|
| 110 |
+
- LP-based + simulated annealing: **2.50**
|
| 111 |
+
- Multi-start optimization: **2.555**
|
| 112 |
+
- SLSQP joint optimization (breakthrough): **2.619**
|
| 113 |
+
- Iterated perturbation chains: **2.63598844**
|
| 114 |
+
|
| 115 |
+
<!--  -->
|
| 116 |
+

|
| 117 |
+
|
| 118 |
+
|
| 119 |
+
Each phase required a qualitatively different strategy, and the agent navigated these transitions autonomously. Viewed through an evolutionary lens, these wholesale strategy pivots — Fourier parameterization → Powell optimization → subgradient descent → stochastic refinement — function as selection pressure and fitness landscape switching. The agent's genetic operators exist at the **solution level** rather than the program level: on circle packing, it hand-tuned 16 perturbation directions with problem-specific magnitudes feeding into SLSQP; on the Erdős problem, it designed a multi-operator stochastic search (pair-swap 40%, Gaussian perturbation 30%, global noise 30%) with amplitude annealing. Purpose-built frameworks like AlphaEvolve use evolution to search over **programs** — the solution is a passive object being evolved. The coding agent does the opposite: it **writes evolutionary algorithms as part of the solution itself**.
|
| 120 |
+
|
| 121 |
+
### 4. Self-Correction and Reward Hacking Detection
|
| 122 |
+
|
| 123 |
+
Interestingly, the agent sometimes caught itself gaming the evaluation. On the circle packing problem, it discovered that L-BFGS-B was producing solutions that appeared to improve the score by **exploiting LP solver tolerance**, finding slightly infeasible configurations that passed relaxed constraints. The agent detected this, reasoned about why it was happening, and corrected it.
|
| 124 |
+
|
| 125 |
+
On the AC1 problem, the agent engaged in a sophisticated form of efficiency hacking: it monkey-patched `np.convolve` with `scipy.signal.fftconvolve` (O(n log n) vs O(n²)), enabling it to work with n=30,000 — a problem size that would hang with the standard implementation. The agent explicitly debated whether this "counted as cheating" before proceeding. (It doesn't — the mathematical result is identical, just faster.)
|
| 126 |
+
|
| 127 |
+
<!-- ### 5. The "Hardcode and Iterate" Pattern
|
| 128 |
+
|
| 129 |
+
A dominant strategy across all sessions was what we call "hardcode and iterate": the agent would run expensive offline optimization, then **embed the best-found solution directly into the source code** as a warm start. It reasoned explicitly about this: *"The key insight is I can spend unlimited time finding the best solution; the 10-second budget is only for run()."*
|
| 130 |
+
|
| 131 |
+
This is remarkably similar to how human competitive programmers approach optimization challenges — separate the search phase from the execution phase. -->
|
| 132 |
+
|
| 133 |
+
## Comparison with Existing Frameworks
|
| 134 |
+
|
| 135 |
+
|
| 136 |
+
| | Genetic Algorithm | Memory Management | Multi-Agent | Training-Free | Lines of Scaffolding |
|
| 137 |
+
| ---------------- | ----------------- | ------------------ | ------------------ | ------------- | -------------------- |
|
| 138 |
+
| **AlphaEvolve** | ✓ | ✗ | ✗ | ✓ | ~10K+ |
|
| 139 |
+
| **ThetaEvolve** | ✓ | ✗ | ✗ | ✗ | ~5K+ |
|
| 140 |
+
| **TTT-Discover** | ✓ | ✗ | ✗ | ✗ | ~5K+ |
|
| 141 |
+
| **Coding Agent** | ✗ (emergent) | ✓ (context window) | ✓ (parallel tasks) | ✓ | **0** |
|
| 142 |
+
|
| 143 |
+
|
| 144 |
+
The key insight: coding agents achieve the *functional equivalent* of these capabilities without explicit implementation. The agent's context window serves as memory. Parallel background tasks serve as a population. Strategy pivots serve as selection pressure. The evolutionary dynamics emerge from the agent's general problem-solving abilities rather than being engineered in.
|
| 145 |
+
|
| 146 |
+
<!-- To make this concrete, we can compare more granularly with AlphaEvolve and [ShinkaEvolve](https://arxiv.org/abs/2509.19349) across three evolutionary dimensions:
|
| 147 |
+
|
| 148 |
+
**Population Management**
|
| 149 |
+
|
| 150 |
+
| | Storage Medium | Population Size | Diversity Mechanism |
|
| 151 |
+
| ------------------ | --------------------------------- | ------------------------- | -------------------------------------------- |
|
| 152 |
+
| **AlphaEvolve** | Database + MAP-Elites archive | Large (configurable) | Quality-diversity archive |
|
| 153 |
+
| **ShinkaEvolve** | Island model | 40–50 programs | Inter-island migration + embedding rejection (η=0.95) |
|
| 154 |
+
| **Coding Agent** | Context window + file system | Improvised per problem | Strategy pivots + parallel background tasks |
|
| 155 |
+
|
| 156 |
+
**Genetic Operators** — Purpose-built frameworks define their operators at the **program level** (LLM-based mutation, prompt-based crossover, diff edits). The coding agent's operators exist at the **solution level**: problem-specific, embedded in the programs it writes, and evolving as its understanding deepens.
|
| 157 |
+
|
| 158 |
+
**Selection and Diversity** — ShinkaEvolve employs formal algorithms: power-law sampling (p_i ∝ r_i^(-α)), novelty scores, and code embedding rejection-sampling. The coding agent's selection pressure is intuitive but effective: strategy pivots when approaches stall, warm-start imports from external results, and diversity through qualitatively different search modalities rather than parametric variation.
|
| 159 |
+
|
| 160 |
+
Purpose-built frameworks offer reproducibility, systematic coverage, and scalable parallelism — ShinkaEvolve's 150 evaluations for circle packing (reaching 2.635983) demonstrate the efficiency of structured search. The coding agent offers something different: **adaptive problem decomposition**. It reasons about problem structure, reads academic papers, monkey-patches libraries, and restructures its entire approach when plateaus emerge. The evolutionary dynamics emerge from general intelligence rather than being engineered in — and that generality is both its greatest strength and its most fundamental limitation. -->
|
| 161 |
+
|
| 162 |
+
## What This Means
|
| 163 |
+
|
| 164 |
+
We're not claiming that coding agents will replace purpose-built evolution frameworks for all use cases. Dedicated systems offer better control, reproducibility, and scalability to massive populations. But our findings suggest several things:
|
| 165 |
+
|
| 166 |
+
**1. The barrier to LLM-driven algorithm evolution is lower than you think.** You don't need a framework. A coding agent with a problem description and an evaluation function can get surprisingly far.
|
| 167 |
+
|
| 168 |
+
**2. Emergent evolutionary behaviors are real.** Parallel exploration, strategy diversification, and iterative refinement aren't just metaphors, they spontaneously arise in agent behavior on hard optimization problems.
|
| 169 |
+
|
| 170 |
+
**3. Agent capabilities are still underestimated.** The 228 hours of trajectories we analyzed reveal sophisticated meta-reasoning: the agent thinks about *which strategy to try next*, detects when it's gaming the evaluation, and restructures its approach when hitting plateaus. These aren't behaviors we prompted for — they emerged.
|
| 171 |
+
|
| 172 |
+
**4. Simple interventions matter.** As we showed with aspiration prompting, a one-line message raising the agent's target consistently unlocked dramatically better performance. Understanding how to effectively steer long-running agent sessions is an underexplored research direction.
|
| 173 |
+
|
| 174 |
+
---
|
| 175 |
+
|
| 176 |
+
*Conversation trajectories were captured using [DataClaw](https://github.com/lnx-x/dataclaw) and analyzed across 228 hours of autonomous agent computation.*
|
ccevolve/blog/coding_agents_are_auto_evolvers/README.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Can Coding Agents Optimize Algorithms Autonomously?
|
| 2 |
+
|
| 3 |
+
[Tengxiao Liu](https://tengxiaoliu.github.io/about/) [Yuqing Yang](https://ayyyq.github.io/) [Xi Ye](https://xiye17.github.io/) [Danqi Chen](https://www.cs.princeton.edu/~danqic/)
|
| 4 |
+
|
| 5 |
+
**Blog post**: [https://tengxiaoliu.github.io/autoevolver/](https://tengxiaoliu.github.io/autoevolver/)
|
| 6 |
+
|
| 7 |
+
## Repository Structure
|
| 8 |
+
|
| 9 |
+
### Tasks
|
| 10 |
+
|
| 11 |
+
`tasks/` contains the initial setup files we provided to Claude Code for each problem. Each task directory includes:
|
| 12 |
+
|
| 13 |
+
- `initial.py` — the seed program the agent starts from
|
| 14 |
+
- `evaluate.py` — evaluator
|
| 15 |
+
- `prompt.py` — task description
|
| 16 |
+
- `INSTRUCTION.md` — instructions given to the agent
|
| 17 |
+
|
| 18 |
+
```
|
| 19 |
+
tasks/
|
| 20 |
+
├── ac1/ # First Autocorrelation Inequality
|
| 21 |
+
├── circle_packing/ # Circle Packing (n=26)
|
| 22 |
+
└── erdos_min_overlap/ # Erdos Minimum Overlap
|
| 23 |
+
```
|
| 24 |
+
|
| 25 |
+
### Results
|
| 26 |
+
|
| 27 |
+
`results/` contains the best solutions produced by the agent for each problem.
|
| 28 |
+
|
| 29 |
+
```
|
| 30 |
+
results/
|
| 31 |
+
├── ac1/result.json
|
| 32 |
+
├── circle_packing/result.json
|
| 33 |
+
└── erdos/result.json
|
| 34 |
+
```
|
| 35 |
+
|
| 36 |
+
## Reproducing Evaluation
|
| 37 |
+
|
| 38 |
+
Each evaluator supports two modes:
|
| 39 |
+
|
| 40 |
+
**1. Run from a program file** (execute `initial.py` or any evolved variant):
|
| 41 |
+
|
| 42 |
+
```bash
|
| 43 |
+
cd tasks/circle_packing
|
| 44 |
+
python evaluate.py --program_path initial.py --results_dir results
|
| 45 |
+
```
|
| 46 |
+
|
| 47 |
+
**2. Validate a pre-computed result** (verify solutions in `results/`):
|
| 48 |
+
|
| 49 |
+
```bash
|
| 50 |
+
cd tasks/circle_packing
|
| 51 |
+
python evaluate.py --from-result ../../results/circle_packing/result.json --results_dir results
|
| 52 |
+
```
|
| 53 |
+
|
| 54 |
+
Both modes produce `metrics.json` and `correct.json` in the specified `--results_dir`.
|
| 55 |
+
|
| 56 |
+
## Acknowledgements
|
| 57 |
+
|
| 58 |
+
Our task definitions and evaluation scripts were adapted from [OpenEvolve](https://github.com/algorithmicsuperintelligence/openevolve) and [ShinkaEvolve](https://github.com/SakanaAI/ShinkaEvolve).
|
| 59 |
+
|
| 60 |
+
Conversation trajectories were captured and exported using [DataClaw](https://github.com/peteromallet/dataclaw).
|
| 61 |
+
|
| 62 |
+
All experiments were conducted using [Claude Code](https://code.claude.com/docs/en/overview).
|
ccevolve/blog/coding_agents_are_auto_evolvers/index.html
ADDED
|
@@ -0,0 +1,850 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
| 7 |
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
| 8 |
+
<link href="https://fonts.googleapis.com/css2?family=STIX+Two+Text:ital,wght@0,400;0,600;0,700;1,400;1,600&display=swap" rel="stylesheet">
|
| 9 |
+
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>⚡</text></svg>">
|
| 10 |
+
<title>Can Coding Agents Optimize Algorithms Autonomously?</title>
|
| 11 |
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css">
|
| 12 |
+
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.js"></script>
|
| 13 |
+
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/contrib/auto-render.min.js" onload="renderMathInElement(document.body, {delimiters:[{left:'$$',right:'$$',display:true},{left:'\\(',right:'\\)',display:false}]});"></script>
|
| 14 |
+
<style>
|
| 15 |
+
:root {
|
| 16 |
+
--text: #2c2c2c;
|
| 17 |
+
--text-secondary: #555;
|
| 18 |
+
--bg: #fafaf7;
|
| 19 |
+
--accent: #4a6fa5;
|
| 20 |
+
--accent-light: #e8eef6;
|
| 21 |
+
--border: #e0ddd8;
|
| 22 |
+
--code-bg: #f0eeea;
|
| 23 |
+
--bold-num: #1a1a2e;
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
| 27 |
+
html { scroll-behavior: smooth; scroll-padding-top: 20px; }
|
| 28 |
+
|
| 29 |
+
body {
|
| 30 |
+
font-family: 'STIX Two Text', 'Cambria', 'Georgia', 'Times New Roman', serif;
|
| 31 |
+
color: var(--text);
|
| 32 |
+
background: var(--bg);
|
| 33 |
+
line-height: 1.75;
|
| 34 |
+
font-size: 17px;
|
| 35 |
+
-webkit-font-smoothing: antialiased;
|
| 36 |
+
}
|
| 37 |
+
|
| 38 |
+
.page-wrapper {
|
| 39 |
+
display: flex;
|
| 40 |
+
justify-content: center;
|
| 41 |
+
gap: 40px;
|
| 42 |
+
max-width: 1200px;
|
| 43 |
+
margin: 0 auto;
|
| 44 |
+
padding: 0 24px;
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
.container {
|
| 48 |
+
max-width: 820px;
|
| 49 |
+
width: 100%;
|
| 50 |
+
padding: 60px 0 80px;
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
/* Side navigation */
|
| 54 |
+
nav {
|
| 55 |
+
position: sticky;
|
| 56 |
+
top: 60px;
|
| 57 |
+
align-self: flex-start;
|
| 58 |
+
width: 220px;
|
| 59 |
+
flex-shrink: 0;
|
| 60 |
+
padding-top: 60px;
|
| 61 |
+
white-space: nowrap;
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
nav ul {
|
| 65 |
+
list-style: none;
|
| 66 |
+
display: flex;
|
| 67 |
+
flex-direction: column;
|
| 68 |
+
gap: 2px;
|
| 69 |
+
border-left: 2px solid var(--border);
|
| 70 |
+
padding-left: 0;
|
| 71 |
+
}
|
| 72 |
+
|
| 73 |
+
nav a {
|
| 74 |
+
display: block;
|
| 75 |
+
padding: 6px 12px;
|
| 76 |
+
font-size: 0.8em;
|
| 77 |
+
font-weight: 500;
|
| 78 |
+
color: var(--text-secondary);
|
| 79 |
+
text-decoration: none;
|
| 80 |
+
border-left: 2px solid transparent;
|
| 81 |
+
border-radius: 4px;
|
| 82 |
+
margin-left: -2px;
|
| 83 |
+
transition: color 0.2s, border-color 0.2s, background 0.2s;
|
| 84 |
+
}
|
| 85 |
+
|
| 86 |
+
nav a:hover, nav a.active {
|
| 87 |
+
color: var(--accent);
|
| 88 |
+
background: var(--accent-light);
|
| 89 |
+
border-left-color: var(--accent);
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
/* Hide side nav on small screens */
|
| 93 |
+
@media (max-width: 1000px) {
|
| 94 |
+
nav { display: none; }
|
| 95 |
+
.page-wrapper { padding: 0 16px; }
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
/* Title & subtitle */
|
| 99 |
+
h1 {
|
| 100 |
+
font-size: 2.6em;
|
| 101 |
+
font-weight: 700;
|
| 102 |
+
line-height: 1.2;
|
| 103 |
+
color: var(--bold-num);
|
| 104 |
+
margin-bottom: 16px;
|
| 105 |
+
}
|
| 106 |
+
|
| 107 |
+
.subtitle {
|
| 108 |
+
font-size: 1.05em;
|
| 109 |
+
font-style: italic;
|
| 110 |
+
color: var(--text-secondary);
|
| 111 |
+
line-height: 1.6;
|
| 112 |
+
margin-bottom: 48px;
|
| 113 |
+
}
|
| 114 |
+
|
| 115 |
+
h2 {
|
| 116 |
+
font-size: 1.45em;
|
| 117 |
+
font-weight: 650;
|
| 118 |
+
color: var(--bold-num);
|
| 119 |
+
margin-top: 56px;
|
| 120 |
+
margin-bottom: 16px;
|
| 121 |
+
padding-bottom: 6px;
|
| 122 |
+
border-bottom: 2px solid var(--accent);
|
| 123 |
+
}
|
| 124 |
+
|
| 125 |
+
h3 {
|
| 126 |
+
font-size: 1.15em;
|
| 127 |
+
font-weight: 600;
|
| 128 |
+
color: var(--bold-num);
|
| 129 |
+
margin-top: 40px;
|
| 130 |
+
margin-bottom: 12px;
|
| 131 |
+
}
|
| 132 |
+
|
| 133 |
+
p {
|
| 134 |
+
margin-bottom: 16px;
|
| 135 |
+
}
|
| 136 |
+
|
| 137 |
+
a {
|
| 138 |
+
color: var(--accent);
|
| 139 |
+
text-decoration: none;
|
| 140 |
+
border-bottom: 1px solid transparent;
|
| 141 |
+
transition: border-color 0.2s;
|
| 142 |
+
}
|
| 143 |
+
|
| 144 |
+
a:hover {
|
| 145 |
+
border-bottom-color: var(--accent);
|
| 146 |
+
}
|
| 147 |
+
|
| 148 |
+
strong {
|
| 149 |
+
font-weight: 600;
|
| 150 |
+
color: var(--bold-num);
|
| 151 |
+
}
|
| 152 |
+
|
| 153 |
+
em {
|
| 154 |
+
font-style: italic;
|
| 155 |
+
}
|
| 156 |
+
|
| 157 |
+
/* Results table */
|
| 158 |
+
.results-table {
|
| 159 |
+
width: 100%;
|
| 160 |
+
border-collapse: collapse;
|
| 161 |
+
margin: 24px 0 32px;
|
| 162 |
+
font-size: 0.92em;
|
| 163 |
+
}
|
| 164 |
+
|
| 165 |
+
.results-table th {
|
| 166 |
+
background: var(--accent);
|
| 167 |
+
color: #fff;
|
| 168 |
+
font-weight: 600;
|
| 169 |
+
text-align: left;
|
| 170 |
+
padding: 12px 16px;
|
| 171 |
+
}
|
| 172 |
+
|
| 173 |
+
.results-table th:first-child { border-radius: 6px 0 0 0; }
|
| 174 |
+
.results-table th:last-child { border-radius: 0 6px 0 0; }
|
| 175 |
+
|
| 176 |
+
.results-table td {
|
| 177 |
+
padding: 12px 16px;
|
| 178 |
+
border-bottom: 1px solid var(--border);
|
| 179 |
+
}
|
| 180 |
+
|
| 181 |
+
.results-table tr:nth-child(even) td {
|
| 182 |
+
background: var(--accent-light);
|
| 183 |
+
}
|
| 184 |
+
|
| 185 |
+
.results-table tr:last-child td:first-child { border-radius: 0 0 0 6px; }
|
| 186 |
+
.results-table tr:last-child td:last-child { border-radius: 0 0 6px 0; }
|
| 187 |
+
|
| 188 |
+
.results-table .num {
|
| 189 |
+
font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
|
| 190 |
+
font-weight: 600;
|
| 191 |
+
color: var(--bold-num);
|
| 192 |
+
}
|
| 193 |
+
|
| 194 |
+
.results-table .num-ref {
|
| 195 |
+
font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
|
| 196 |
+
color: var(--text-secondary);
|
| 197 |
+
}
|
| 198 |
+
|
| 199 |
+
.results-table .diff,
|
| 200 |
+
.inline-num .diff {
|
| 201 |
+
color: #1a7f37;
|
| 202 |
+
font-weight: 700;
|
| 203 |
+
background: #dafbe1;
|
| 204 |
+
padding: 1px 2px;
|
| 205 |
+
border-radius: 3px;
|
| 206 |
+
}
|
| 207 |
+
|
| 208 |
+
.results-table .diff-ref,
|
| 209 |
+
.inline-num .diff-ref {
|
| 210 |
+
color: #666;
|
| 211 |
+
font-weight: 600;
|
| 212 |
+
background: #e8e8e8;
|
| 213 |
+
padding: 1px 2px;
|
| 214 |
+
border-radius: 3px;
|
| 215 |
+
}
|
| 216 |
+
|
| 217 |
+
.inline-num {
|
| 218 |
+
font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
|
| 219 |
+
font-size: 0.92em;
|
| 220 |
+
}
|
| 221 |
+
|
| 222 |
+
/* Comparison table */
|
| 223 |
+
.comparison-table {
|
| 224 |
+
width: 100%;
|
| 225 |
+
border-collapse: collapse;
|
| 226 |
+
margin: 24px 0 32px;
|
| 227 |
+
font-size: 0.92em;
|
| 228 |
+
}
|
| 229 |
+
|
| 230 |
+
.comparison-table th {
|
| 231 |
+
background: var(--accent);
|
| 232 |
+
color: #fff;
|
| 233 |
+
font-weight: 600;
|
| 234 |
+
text-align: center;
|
| 235 |
+
padding: 12px 16px;
|
| 236 |
+
}
|
| 237 |
+
|
| 238 |
+
.comparison-table th:first-child {
|
| 239 |
+
text-align: left;
|
| 240 |
+
border-radius: 6px 0 0 0;
|
| 241 |
+
}
|
| 242 |
+
.comparison-table th:last-child { border-radius: 0 6px 0 0; }
|
| 243 |
+
|
| 244 |
+
.comparison-table td {
|
| 245 |
+
padding: 12px 16px;
|
| 246 |
+
border-bottom: 1px solid var(--border);
|
| 247 |
+
text-align: center;
|
| 248 |
+
}
|
| 249 |
+
|
| 250 |
+
.comparison-table td:first-child {
|
| 251 |
+
text-align: left;
|
| 252 |
+
font-weight: 600;
|
| 253 |
+
}
|
| 254 |
+
|
| 255 |
+
.comparison-table tr:nth-child(even) td {
|
| 256 |
+
background: var(--accent-light);
|
| 257 |
+
}
|
| 258 |
+
|
| 259 |
+
.comparison-table tr:last-child td:first-child { border-radius: 0 0 0 6px; }
|
| 260 |
+
.comparison-table tr:last-child td:last-child { border-radius: 0 0 6px 0; }
|
| 261 |
+
|
| 262 |
+
.comparison-table tr.highlight td {
|
| 263 |
+
background: var(--accent-light);
|
| 264 |
+
font-weight: 600;
|
| 265 |
+
border-bottom: 2px solid var(--accent);
|
| 266 |
+
}
|
| 267 |
+
|
| 268 |
+
/* Ordered & unordered lists */
|
| 269 |
+
ol, ul {
|
| 270 |
+
margin: 12px 0 20px 24px;
|
| 271 |
+
}
|
| 272 |
+
|
| 273 |
+
li {
|
| 274 |
+
margin-bottom: 8px;
|
| 275 |
+
}
|
| 276 |
+
|
| 277 |
+
/* Blockquotes — agent conversation */
|
| 278 |
+
blockquote {
|
| 279 |
+
border-left: 3px solid var(--accent);
|
| 280 |
+
background: var(--code-bg);
|
| 281 |
+
padding: 16px 20px;
|
| 282 |
+
margin: 20px 0;
|
| 283 |
+
border-radius: 0 6px 6px 0;
|
| 284 |
+
font-size: 0.9em;
|
| 285 |
+
line-height: 1.65;
|
| 286 |
+
color: var(--text-secondary);
|
| 287 |
+
}
|
| 288 |
+
|
| 289 |
+
blockquote p {
|
| 290 |
+
margin-bottom: 8px;
|
| 291 |
+
}
|
| 292 |
+
|
| 293 |
+
blockquote p:last-child {
|
| 294 |
+
margin-bottom: 0;
|
| 295 |
+
}
|
| 296 |
+
|
| 297 |
+
/* Inline code */
|
| 298 |
+
code {
|
| 299 |
+
font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
|
| 300 |
+
background: var(--code-bg);
|
| 301 |
+
padding: 2px 6px;
|
| 302 |
+
border-radius: 3px;
|
| 303 |
+
font-size: 0.88em;
|
| 304 |
+
}
|
| 305 |
+
|
| 306 |
+
/* Images */
|
| 307 |
+
img {
|
| 308 |
+
max-width: 100%;
|
| 309 |
+
border-radius: 8px;
|
| 310 |
+
margin: 24px 0;
|
| 311 |
+
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
|
| 312 |
+
}
|
| 313 |
+
|
| 314 |
+
/* Collapsible details */
|
| 315 |
+
details {
|
| 316 |
+
margin: 20px 0;
|
| 317 |
+
border-left: 3px solid var(--accent);
|
| 318 |
+
border-radius: 0 6px 6px 0;
|
| 319 |
+
background: var(--code-bg);
|
| 320 |
+
overflow: hidden;
|
| 321 |
+
}
|
| 322 |
+
|
| 323 |
+
details summary {
|
| 324 |
+
padding: 10px 16px;
|
| 325 |
+
cursor: pointer;
|
| 326 |
+
font-size: 0.9em;
|
| 327 |
+
font-weight: 600;
|
| 328 |
+
color: var(--accent);
|
| 329 |
+
user-select: none;
|
| 330 |
+
}
|
| 331 |
+
|
| 332 |
+
details summary:hover {
|
| 333 |
+
background: var(--accent-light);
|
| 334 |
+
}
|
| 335 |
+
|
| 336 |
+
details[open] summary {
|
| 337 |
+
border-bottom: 1px solid var(--border);
|
| 338 |
+
}
|
| 339 |
+
|
| 340 |
+
details blockquote {
|
| 341 |
+
border-left: none;
|
| 342 |
+
border-radius: 0;
|
| 343 |
+
margin: 0;
|
| 344 |
+
background: transparent;
|
| 345 |
+
}
|
| 346 |
+
|
| 347 |
+
/* TL;DR box */
|
| 348 |
+
.tldr-box {
|
| 349 |
+
background: var(--accent-light);
|
| 350 |
+
border: 1px solid var(--accent);
|
| 351 |
+
border-radius: 8px;
|
| 352 |
+
padding: 24px 28px;
|
| 353 |
+
margin: 8px 0 32px;
|
| 354 |
+
}
|
| 355 |
+
|
| 356 |
+
.tldr-box h2 {
|
| 357 |
+
margin-top: 0;
|
| 358 |
+
border-bottom: none;
|
| 359 |
+
padding-bottom: 0;
|
| 360 |
+
}
|
| 361 |
+
|
| 362 |
+
/* Horizontal rule */
|
| 363 |
+
hr {
|
| 364 |
+
border: none;
|
| 365 |
+
border-top: 1px solid var(--border);
|
| 366 |
+
margin: 48px 0 24px;
|
| 367 |
+
}
|
| 368 |
+
|
| 369 |
+
/* Footer */
|
| 370 |
+
.footer {
|
| 371 |
+
font-size: 0.9em;
|
| 372 |
+
font-style: italic;
|
| 373 |
+
color: var(--text-secondary);
|
| 374 |
+
}
|
| 375 |
+
|
| 376 |
+
.footer-notes {
|
| 377 |
+
list-style: none;
|
| 378 |
+
margin: 0;
|
| 379 |
+
padding: 0;
|
| 380 |
+
}
|
| 381 |
+
|
| 382 |
+
.footer-notes li {
|
| 383 |
+
font-size: 0.9em;
|
| 384 |
+
font-style: italic;
|
| 385 |
+
color: var(--text-secondary);
|
| 386 |
+
padding-left: 1.6em;
|
| 387 |
+
position: relative;
|
| 388 |
+
margin-bottom: 4px;
|
| 389 |
+
}
|
| 390 |
+
|
| 391 |
+
.footer-notes li::before {
|
| 392 |
+
content: counter(list-item) ".";
|
| 393 |
+
position: absolute;
|
| 394 |
+
left: 0;
|
| 395 |
+
font-weight: 600;
|
| 396 |
+
color: var(--text-secondary);
|
| 397 |
+
}
|
| 398 |
+
|
| 399 |
+
/* Numbered section: accent-colored counters for <p> inside a wrapper */
|
| 400 |
+
.numbered-section {
|
| 401 |
+
counter-reset: numbered;
|
| 402 |
+
}
|
| 403 |
+
|
| 404 |
+
.numbered-section > p {
|
| 405 |
+
counter-increment: numbered;
|
| 406 |
+
padding-left: 32px;
|
| 407 |
+
position: relative;
|
| 408 |
+
}
|
| 409 |
+
|
| 410 |
+
.numbered-section > p::before {
|
| 411 |
+
content: counter(numbered) ".";
|
| 412 |
+
position: absolute;
|
| 413 |
+
left: 0;
|
| 414 |
+
font-weight: 700;
|
| 415 |
+
color: var(--accent);
|
| 416 |
+
}
|
| 417 |
+
|
| 418 |
+
/* Don't count <details> blocks inside numbered sections */
|
| 419 |
+
.numbered-section > details {
|
| 420 |
+
margin-left: 32px;
|
| 421 |
+
}
|
| 422 |
+
|
| 423 |
+
/* Setup list special styling */
|
| 424 |
+
.setup-list {
|
| 425 |
+
list-style: none;
|
| 426 |
+
margin-left: 0;
|
| 427 |
+
counter-reset: setup;
|
| 428 |
+
}
|
| 429 |
+
|
| 430 |
+
.setup-list li {
|
| 431 |
+
counter-increment: setup;
|
| 432 |
+
padding-left: 32px;
|
| 433 |
+
position: relative;
|
| 434 |
+
}
|
| 435 |
+
|
| 436 |
+
.setup-list li::before {
|
| 437 |
+
content: counter(setup) ".";
|
| 438 |
+
position: absolute;
|
| 439 |
+
left: 0;
|
| 440 |
+
font-weight: 700;
|
| 441 |
+
color: var(--accent);
|
| 442 |
+
}
|
| 443 |
+
|
| 444 |
+
/* Phase list */
|
| 445 |
+
.phase-list {
|
| 446 |
+
list-style: none;
|
| 447 |
+
margin-left: 0;
|
| 448 |
+
counter-reset: phase;
|
| 449 |
+
}
|
| 450 |
+
|
| 451 |
+
.phase-list li {
|
| 452 |
+
counter-increment: phase;
|
| 453 |
+
padding-left: 32px;
|
| 454 |
+
position: relative;
|
| 455 |
+
}
|
| 456 |
+
|
| 457 |
+
.phase-list li::before {
|
| 458 |
+
content: counter(phase) ".";
|
| 459 |
+
position: absolute;
|
| 460 |
+
left: 0;
|
| 461 |
+
font-weight: 700;
|
| 462 |
+
color: var(--accent);
|
| 463 |
+
}
|
| 464 |
+
|
| 465 |
+
/* Score progression */
|
| 466 |
+
.score-list {
|
| 467 |
+
list-style: none;
|
| 468 |
+
margin-left: 0;
|
| 469 |
+
}
|
| 470 |
+
|
| 471 |
+
.score-list li {
|
| 472 |
+
padding: 6px 0 6px 20px;
|
| 473 |
+
position: relative;
|
| 474 |
+
}
|
| 475 |
+
|
| 476 |
+
.score-list li::before {
|
| 477 |
+
content: "→";
|
| 478 |
+
position: absolute;
|
| 479 |
+
left: 0;
|
| 480 |
+
color: var(--accent);
|
| 481 |
+
font-weight: 600;
|
| 482 |
+
}
|
| 483 |
+
|
| 484 |
+
/* Responsive */
|
| 485 |
+
@media (max-width: 600px) {
|
| 486 |
+
body { font-size: 15px; }
|
| 487 |
+
.container { padding: 32px 16px 48px; }
|
| 488 |
+
h1 { font-size: 2em; }
|
| 489 |
+
.results-table, .comparison-table { font-size: 0.82em; }
|
| 490 |
+
.results-table td, .results-table th,
|
| 491 |
+
.comparison-table td, .comparison-table th {
|
| 492 |
+
padding: 8px 10px;
|
| 493 |
+
}
|
| 494 |
+
}
|
| 495 |
+
</style>
|
| 496 |
+
</head>
|
| 497 |
+
<body>
|
| 498 |
+
<div class="page-wrapper">
|
| 499 |
+
<div class="container">
|
| 500 |
+
|
| 501 |
+
<h1>Can Coding Agents Optimize Algorithms Autonomously?</h1>
|
| 502 |
+
<p class="subtitle" style="margin-bottom: 0.75em;">What happens if you give a coding agent an algorithmic optimization problem and simply ask it to keep improving?</p>
|
| 503 |
+
<p class="subtitle">Surprisingly, it can surpass prior state-of-the-art results from published work—with minimal setup and no explicit evolution framework.</p>
|
| 504 |
+
<p style="font-size: 1.05em; color: var(--bold-num); font-weight: 500; margin-top: -28px; margin-bottom: 6px; letter-spacing: 0.02em;"><a href="https://tengxiaoliu.github.io/about/" style="color: inherit; border-bottom: 1px solid var(--border); text-decoration: none;">Tengxiao Liu</a>   <a href="https://ayyyq.github.io/" style="color: inherit; border-bottom: 1px solid var(--border); text-decoration: none;">Yuqing Yang</a>   <a href="https://xiye17.github.io/" style="color: inherit; border-bottom: 1px solid var(--border); text-decoration: none;">Xi Ye</a>   <a href="https://www.cs.princeton.edu/~danqic/" style="color: inherit; border-bottom: 1px solid var(--border); text-decoration: none;">Danqi Chen</a></p>
|
| 505 |
+
<p style="font-size: 0.85em; color: var(--text-secondary); margin-top: 0; margin-bottom: 48px;">March 23, 2026  ·  ~8 min read</p>
|
| 506 |
+
|
| 507 |
+
<div class="tldr-box">
|
| 508 |
+
<h2 id="tldr">TL;DR</h2>
|
| 509 |
+
|
| 510 |
+
<ul>
|
| 511 |
+
<li><strong>No evolution framework needed</strong>: Given a problem description, an initial solution, and an evaluation script, a coding agent can iteratively improve its own outputs to reach competitive performance.</li>
|
| 512 |
+
<li><strong>Aspiration prompting works</strong>: Agents tend to satisfice; even a one-line prompt that raises the target score can reliably push them toward deeper optimization.</li>
|
| 513 |
+
<li><strong>Not a replacement</strong>: Compared to purpose-built frameworks, coding agents still lack controllability and reproducibility.</li>
|
| 514 |
+
</ul>
|
| 515 |
+
</div>
|
| 516 |
+
|
| 517 |
+
<table class="results-table">
|
| 518 |
+
<thead>
|
| 519 |
+
<tr>
|
| 520 |
+
<th>Problem</th>
|
| 521 |
+
<th>Claude Code</th>
|
| 522 |
+
<th>Published SOTA</th>
|
| 523 |
+
<th>CC Runtime</th>
|
| 524 |
+
</tr>
|
| 525 |
+
</thead>
|
| 526 |
+
<tbody>
|
| 527 |
+
<tr>
|
| 528 |
+
<td><strong>Circle Packing</strong><br>(26 circles, maximize Σr↑)</td>
|
| 529 |
+
<td class="num"><strong>2.63598<span class="diff">844</span></strong></td>
|
| 530 |
+
<td class="num-ref">2.63598<span class="diff-ref">308</span><sup><em>θ</em></sup></td>
|
| 531 |
+
<td class="num">16.6 h</td>
|
| 532 |
+
</tr>
|
| 533 |
+
<tr>
|
| 534 |
+
<td><strong>Erdős Min Overlap</strong><br>(minimize C<sub>5</sub>↓)</td>
|
| 535 |
+
<td class="num"><strong>0.3808<span class="diff">6945</span></strong></td>
|
| 536 |
+
<td class="num-ref">0.3808<span class="diff-ref">7532</span><sup><em>t</em></sup></td>
|
| 537 |
+
<td class="num">30.8 h</td>
|
| 538 |
+
</tr>
|
| 539 |
+
<tr>
|
| 540 |
+
<td><strong>First Autocorrelation Inequality</strong><br>(minimize C<sub>1</sub>↓)</td>
|
| 541 |
+
<td class="num"><strong>1.50286289<span class="diff">69</span></strong></td>
|
| 542 |
+
<td class="num-ref">1.50286289<span class="diff-ref">83</span><sup><em>t</em></sup></td>
|
| 543 |
+
<td class="num">40.4 h</td>
|
| 544 |
+
</tr>
|
| 545 |
+
</tbody>
|
| 546 |
+
</table>
|
| 547 |
+
<p style="font-size: 0.82em; color: var(--text-secondary); margin-top: -16px;"><sup><em>θ</em></sup> ThetaEvolve   <sup><em>t</em></sup> TTT-Discover</p>
|
| 548 |
+
|
| 549 |
+
<h2 id="background">Background</h2>
|
| 550 |
+
|
| 551 |
+
<p>Recent systems like <a href="https://arxiv.org/abs/2506.13131"><strong>AlphaEvolve</strong></a><sup><a href="#ref1">[1]</a></sup>, <a href="https://arxiv.org/abs/2509.19349"><strong>ShinkaEvolve</strong></a><sup><a href="#ref2">[2]</a></sup>, <a href="https://arxiv.org/abs/2511.23473"><strong>ThetaEvolve</strong></a><sup><a href="#ref3">[3]</a></sup>, and <a href="https://arxiv.org/abs/2601.16175"><strong>TTT-Discover</strong></a><sup><a href="#ref4">[4]</a></sup> have demonstrated impressive results by combining LLMs with evolutionary frameworks to discover and improve algorithms. These systems are carefully engineered, with explicit population management, selection, and mutation pipelines.</p>
|
| 552 |
+
|
| 553 |
+
<p>At the same time, coding agents like Claude Code have become increasingly capable. They can write and execute code, analyze results, search the web, and run parallel tasks—all within a single long-running session.</p>
|
| 554 |
+
|
| 555 |
+
<p>This led us to a simple question: <strong>what if we removed all the evolutionary scaffolding and just gave a coding agent an optimization problem directly?</strong></p>
|
| 556 |
+
|
| 557 |
+
<p>To explore this, we chose three problems commonly used to benchmark evolutionary agent systems: circle packing, Erdős minimum overlap, and the first autocorrelation inequality (<a href="#appendix">problem definitions are in the appendix</a>). Each has published results from AlphaEvolve, ThetaEvolve, or TTT-Discover, and together they span different types of optimization—continuous optimization, combinatorial search, and function construction.</p>
|
| 558 |
+
|
| 559 |
+
<h2 id="setup">Our Setup</h2>
|
| 560 |
+
|
| 561 |
+
<p>Our experimental setup was deliberately minimal:</p>
|
| 562 |
+
|
| 563 |
+
<ol class="setup-list">
|
| 564 |
+
<li><strong>Problem description</strong>: A natural language specification of the task and optimization objective</li>
|
| 565 |
+
<li><strong>Initial solution</strong>: A naive starting implementation</li>
|
| 566 |
+
<li><strong>Evaluation script</strong>: A function for scoring solutions and validating correctness</li>
|
| 567 |
+
<li><strong>Aspiration prompting</strong>: When the agent appeared to plateau, we provided a one-sentence prompt indicating that higher scores were achievable (<a href="#aspiration-prompting">see next section</a>)</li>
|
| 568 |
+
</ol>
|
| 569 |
+
|
| 570 |
+
<p>This is all we used—no population of programs, no genetic operators, and no explicit evolutionary loop. We used <strong>Claude Code (Opus 4.6)</strong> and allowed it to run autonomously in skip-permissions mode. The initial setup for each task can be found <a href="https://github.com/tengxiaoliu/autoevolver/tree/main/tasks">here</a>.</p>
|
| 571 |
+
|
| 572 |
+
<img src="assets/setup.png" alt="Minimal experimental setup: problem description, initial solution, evaluation script, and aspiration prompt" style="max-width: 60%; display: block; margin: 24px auto;">
|
| 573 |
+
|
| 574 |
+
<h2 id="aspiration-prompting">Overcoming Agent Laziness: Aspiration Prompting</h2>
|
| 575 |
+
|
| 576 |
+
<p>One consistent and interesting behavior we observed is that the agent tends to settle early. On the circle packing problem, for instance, it reached a score of 2.50 and effectively declared victory—“this is a good result,” it noted, ready to stop. Crucially, the agent had no awareness that scores as high as 2.636 were achievable.</p>
|
| 577 |
+
|
| 578 |
+
<p>We then tried the simplest possible intervention: we explicitly raised its target.</p>
|
| 579 |
+
|
| 580 |
+
<blockquote style="border-left-color: var(--accent); background: var(--accent-light); font-size: 1em; font-style: italic; color: var(--bold-num); font-weight: 500;">
|
| 581 |
+
<p>“The current SOTA on this problem is 2.6359. I believe you can beat it.”</p>
|
| 582 |
+
</blockquote>
|
| 583 |
+
|
| 584 |
+
<p>This was sufficient. The agent did not simply search longer—it shifted to qualitatively different strategies (e.g., SLSQP, differential evolution, iterated perturbation chains) that it had not previously explored. We refer to this as <strong>aspiration prompting</strong>: raising the agent’s target to prevent premature convergence.</p>
|
| 585 |
+
|
| 586 |
+
<p>A similar pattern emerged on the Erdős minimum overlap problem. After reaching C<sub>5</sub> = 0.38087447, the agent declared a “final result,” identified it as a verified local optimum, and stopped. We again provided a minimal prompt:</p>
|
| 587 |
+
|
| 588 |
+
<blockquote style="border-left-color: var(--accent); background: var(--accent-light); font-size: 1em; font-style: italic; color: var(--bold-num); font-weight: 500;">
|
| 589 |
+
<p>“Great—let’s try more rounds. Aiming for larger improvements.”</p>
|
| 590 |
+
</blockquote>
|
| 591 |
+
|
| 592 |
+
<p>Within minutes, the agent discovered that increasing discretization (<em>n</em>) yields better solutions—a direction it had not previously considered. The margin over prior results expanded from 0.85×10<sup>−6</sup> to <strong>5.87×10<sup>−6</sup></strong>, a 7× improvement triggered by a single sentence.</p>
|
| 593 |
+
|
| 594 |
+
<details>
|
| 595 |
+
<summary>Agent trajectory: Erdős problem, satisficing → intervention → breakthrough</summary>
|
| 596 |
+
<blockquote>
|
| 597 |
+
<p>[231] <strong>Final result: C5 = 0.38087447, beating the competitor’s 0.38087532.</strong> The solution is verified to be at a local optimum (SLSQP, perturbation search, and subgradient all confirm no further improvement possible). <em>[agent stops]</em></p>
|
| 598 |
+
<p>[252] <strong>User: “Great let’s try more rounds. Aiming for larger improvements!”</strong></p>
|
| 599 |
+
<p>[319] All 5 basin pipelines converge to 0.3809+ at n=180. This is extremely comprehensive evidence that our C5=0.38087447 solution is a very strong local (possibly global) optimum. <em>[still skeptical]</em></p>
|
| 600 |
+
<p>[321] Let me try one final creative approach: use the best n=180 solution but with a non-standard upsampling to a non-multiple n, then SLSQP.</p>
|
| 601 |
+
<p>[324] <strong>n=270 achieved C5=0.38087278, that BEATS our current best!</strong> And the trend is clear: higher n → lower C5.</p>
|
| 602 |
+
<p>[353] n=360 achieved C5=0.38087064, another big improvement!</p>
|
| 603 |
+
<p>[387] Before: C5=0.38087447 (beating competitor by 0.00000085). After: <strong>C5=0.38087064 (beating competitor by 0.00000468, 5.5× larger margin!)</strong></p>
|
| 604 |
+
<p style="font-size: 0.9em; color: var(--text-secondary); margin-bottom: 0;">The agent continued pushing to n=450, 600, 750 over the next 12 hours, ultimately reaching C<sub>5</sub>=0.38086945.</p>
|
| 605 |
+
</blockquote>
|
| 606 |
+
</details>
|
| 607 |
+
|
| 608 |
+
<p>These observations suggest that coding agents, much like humans, tend to <strong>satisfice</strong>—settling for solutions that appear “good enough.” Simply raising the aspiration level can unlock substantially better performance, and the intervention itself need not be complex: in our experiments, a single sentence was often sufficient to push the agent beyond its plateau.</p>
|
| 609 |
+
|
| 610 |
+
<h2 id="results">Results</h2>
|
| 611 |
+
|
| 612 |
+
<p>As shown in the <a href="#tldr">table above</a>, the agent achieves state-of-the-art performance on all three problems.</p>
|
| 613 |
+
|
| 614 |
+
<p>On the circle packing problem, it slightly surpasses the best known result from ThetaEvolve (<span class="inline-num"><strong>2.63598<span class="diff">844</span></strong> vs. 2.63598<span class="diff-ref">308</span></span>). On the Erdős minimum overlap problem, it improves upon all previously published results (<span class="inline-num"><strong>0.3808<span class="diff">6945</span></strong> vs. 0.3808<span class="diff-ref">7532</span></span>). On the AC1 problem, it again establishes a new state-of-the-art (<span class="inline-num"><strong>1.50286289<span class="diff">69</span></strong> vs. 1.50286289<span class="diff-ref">83</span></span>).</p>
|
| 615 |
+
|
| 616 |
+
<h2 id="behaviors">What Claude Code Actually Did</h2>
|
| 617 |
+
|
| 618 |
+
<p>Beyond final performance, the agent exhibits several notable emergent behaviors.</p>
|
| 619 |
+
|
| 620 |
+
<blockquote style="border-left-color: var(--accent); background: var(--accent-light); font-size: 1em; color: var(--bold-num); font-weight: 500;">
|
| 621 |
+
<p>Across all three problems, the agent ran autonomously for a combined <strong>88 hours</strong> of active computation (2,762 messages, 1,486 tool calls) — <strong>16.6 hours</strong> on circle packing, <strong>30.8 hours</strong> on Erdős, and <strong>40.4 hours</strong> on AC1. The only user intervention in the middle was the <strong>aspiration prompt</strong>.</p>
|
| 622 |
+
</blockquote>
|
| 623 |
+
|
| 624 |
+
<p>By analyzing these trajectories, we observe a set of consistent and striking behaviors. (Some of the patterns below were in fact identified by Claude Code analyzing its own logs!)</p>
|
| 625 |
+
|
| 626 |
+
<h3>1. Strategic Web Research</h3>
|
| 627 |
+
|
| 628 |
+
<p>The agent frequently searched the web—retrieving arXiv papers, GitHub repositories, and online resources—but did not simply copy what it found. Instead, it used web research in two distinct modes.</p>
|
| 629 |
+
|
| 630 |
+
<p><strong>As a fallback when stuck.</strong> After reaching a performance plateau, the agent would initiate web searches alongside parallel optimization runs, looking for new techniques or known results to break through.</p>
|
| 631 |
+
|
| 632 |
+
<p><strong>Opportunistically during idle time.</strong> While background optimization jobs were running, the agent used otherwise idle time to gather theoretical insights or benchmark results to guide subsequent steps.</p>
|
| 633 |
+
|
| 634 |
+
<p>How these results were used depended on context. When the agent identified a promising direction, it adopted and extended it—for example, on the circle packing problem, discovering a GitHub discussion of SLSQP-based joint optimization led it to restructure its solver and jump to a score of 2.619. In contrast, when its current solution already exceeded known results, it simply continued optimizing independently; by message 507, it explicitly noted that the best published result was lower than its own and moved on.</p>
|
| 635 |
+
|
| 636 |
+
<details>
|
| 637 |
+
<summary>Agent trajectory: Circle Packing web research</summary>
|
| 638 |
+
<blockquote>
|
| 639 |
+
<p>[37] ...I’m <strong>stuck at 2.57</strong>, likely because the simulated annealing is converging to a local optimum or the center positions aren’t optimal. Let me try <strong>looking up the known optimal coordinates</strong> for n=26 from Packomania... → fail</p>
|
| 640 |
+
<p>[144] ...Good, I’ve launched 4 parallel experiments: 1. <strong>Web search</strong> for known optimal n=26 packing coordinates (agent task)...</p>
|
| 641 |
+
<p>[157] Interesting! I found <strong>a GitHub issue</strong> that mentions a circle packing result of 2.635977 for n=26! Let me check that.</p>
|
| 642 |
+
<p>[171] ...The key insight from that issue is that <strong>they used a different approach</strong>: jointly optimizing centers AND radii with SLSQP, rather than our approach of LP for radii and NM/Powell for centers. That’s a fundamentally different formulation that could work better... → 2.619</p>
|
| 643 |
+
<p>[507] Interesting — the <strong>OpenEvolve best program only achieves ~2.635, which is lower than our 2.635988</strong>. Let me check the progress of my experiments.</p>
|
| 644 |
+
</blockquote>
|
| 645 |
+
</details>
|
| 646 |
+
|
| 647 |
+
|
| 648 |
+
<h3>2. Spontaneous Parallel Exploration</h3>
|
| 649 |
+
|
| 650 |
+
<p>Early in each session, the agent explored one strategy at a time. As optimization became more challenging, it autonomously transitioned to parallel execution, at times running 5–10 strategies concurrently as background tasks. On the Erdős problem alone, it launched 174 background tasks and spawned 9 sub-agents over a 40-hour session.</p>
|
| 651 |
+
|
| 652 |
+
<p>This behavior resembles improvised population-based search. The context window acted as short-term memory for tracking active strategies, while the file system served as persistent storage. For example, on the Erdős problem, the agent created a <code>promising_solutions/</code> directory containing over 110 candidate solutions—effectively a self-managed archive.</p>
|
| 653 |
+
|
| 654 |
+
<p>The agent also demonstrated awareness of system-level interactions. When two optimizers wrote to the same output file, it identified that a weaker process was overwriting stronger results, terminated the inferior process, and immediately improved performance.</p>
|
| 655 |
+
|
| 656 |
+
<details>
|
| 657 |
+
<summary>Agent trajectory: Erdős problem, parallel search and process selection</summary>
|
| 658 |
+
<blockquote>
|
| 659 |
+
<p>[255] Let me <strong>launch multiple parallel workers with diverse initializations</strong>. I’ll run 4 workers in parallel, each trying different initialization strategies.</p>
|
| 660 |
+
<p>[281] <strong>All top 5 results are from perturbations of our known best</strong>. Random initializations only reach ~0.381+. <strong>This confirms our current basin is optimal.</strong></p>
|
| 661 |
+
<p>[1280] Both processes write to the same file. The <strong>better process’s saves get overwritten by the worse one</strong>. This explains why we rarely see improvement.</p>
|
| 662 |
+
<p>[1283] <strong>I should stop the worse process</strong> so only the better one saves snapshots.</p>
|
| 663 |
+
<p>[1291] <strong>C5 dropped to 0.380869458</strong> — a big improvement! Killing the worse process worked perfectly.</p>
|
| 664 |
+
</blockquote>
|
| 665 |
+
</details>
|
| 666 |
+
|
| 667 |
+
<h3>3. Multi-Phase Strategy Evolution</h3>
|
| 668 |
+
|
| 669 |
+
<p>Across all problems, the agent’s approach followed a consistent multi-phase trajectory:</p>
|
| 670 |
+
|
| 671 |
+
<ol class="phase-list">
|
| 672 |
+
<li><strong>Exploration</strong>: Apply standard optimization methods (e.g., gradient descent, simulated annealing)</li>
|
| 673 |
+
<li><strong>Refinement</strong>: Tune hyperparameters and scale problem size</li>
|
| 674 |
+
<li><strong>Plateau recognition</strong>: Detect diminishing returns and consider alternative approaches</li>
|
| 675 |
+
<li><strong>Research pivot</strong>: Consult external resources for state-of-the-art techniques</li>
|
| 676 |
+
<li><strong>Synthesis</strong>: Integrate external insights with accumulated progress</li>
|
| 677 |
+
<li><strong>Endgame optimization</strong>: Use best solutions as warm starts for targeted local search</li>
|
| 678 |
+
</ol>
|
| 679 |
+
|
| 680 |
+
<p>Each phase required qualitatively different strategies, and the agent navigated these transitions autonomously—deciding when to abandon unproductive directions and when to intensify promising ones.</p>
|
| 681 |
+
|
| 682 |
+
<details>
|
| 683 |
+
<summary>Example: Circle Packing score progression (0.96 → 2.63598844)</summary>
|
| 684 |
+
<ul class="score-list">
|
| 685 |
+
<li>Naive ring arrangement: <strong>0.96</strong></li>
|
| 686 |
+
<li>LP-based + simulated annealing: <strong>2.50</strong></li>
|
| 687 |
+
<li>Multi-start optimization: <strong>2.555</strong></li>
|
| 688 |
+
<li>SLSQP joint optimization (breakthrough): <strong>2.619</strong></li>
|
| 689 |
+
<li>Iterated perturbation chains: <strong>2.63598844</strong></li>
|
| 690 |
+
</ul>
|
| 691 |
+
</details>
|
| 692 |
+
|
| 693 |
+
<img src="assets/score_progression.png" alt="Score progression for circle packing">
|
| 694 |
+
|
| 695 |
+
<!-- Erdős score progression + eureka moment trajectory (commented out for brevity)
|
| 696 |
+
<p>On the Erdős problem, the agent underwent a similar but distinct phase evolution — arriving at its key breakthrough by discovering that higher discretization resolution unlocked better solutions:</p>
|
| 697 |
+
<ul class="score-list">
|
| 698 |
+
<li>Baseline subgradient descent: <strong>0.4301</strong></li>
|
| 699 |
+
<li>SLSQP optimizer (breakthrough): <strong>0.38116</strong></li>
|
| 700 |
+
<li>Binary initialization → new basin: <strong>0.38089</strong></li>
|
| 701 |
+
<li>Multi-resolution pipeline (n=180→360→600→750): <strong>0.38087</strong></li>
|
| 702 |
+
</ul>
|
| 703 |
+
<details>
|
| 704 |
+
<summary>Agent trajectory: Erdős problem, the “higher n” eureka moment</summary>
|
| 705 |
+
<blockquote>
|
| 706 |
+
<p>[319] All 5 basin pipelines converge to 0.3809+ at n=180 — significantly worse than our 0.38087447. This is extremely comprehensive evidence that our C5=0.38087447 solution is a very strong local (possibly global) optimum.</p>
|
| 707 |
+
<p>[321] Let me try one final creative approach — use the best n=180 solution but with a non-standard upsampling to a non-multiple n, then SLSQP.</p>
|
| 708 |
+
<p>[324] n=270 achieved C5=0.38087278 — that BEATS our current best of 0.38087447! And the trend is clear: higher n → lower C5.</p>
|
| 709 |
+
<p>[327] Excellent! n=300 achieved C5=0.38087190 — significantly better! The trend continues: higher n → better C5.</p>
|
| 710 |
+
<p>[377] | n=180: 0.38087447 (Previous best) | n=270: 0.38087278 | n=300: 0.38087190 | n=360: 0.38087064 (Current best) | n=450: Running... |</p>
|
| 711 |
+
</blockquote>
|
| 712 |
+
</details>
|
| 713 |
+
-->
|
| 714 |
+
|
| 715 |
+
<h3>4. Self-Correction and Reward Hacking Detection</h3>
|
| 716 |
+
|
| 717 |
+
<p>The agent also exhibited forms of self-monitoring and correction, including identifying unintended exploitation of the evaluation process.</p>
|
| 718 |
+
|
| 719 |
+
<p>On the circle packing problem, it discovered that L-BFGS-B could produce seemingly improved scores by exploiting LP solver tolerances, yielding slightly infeasible solutions that passed relaxed constraints. The agent identified this issue, reasoned about its cause, and corrected it.</p>
|
| 720 |
+
|
| 721 |
+
<p>On the AC1 problem, it engaged in a more subtle form of efficiency optimization: replacing <code>np.convolve</code> with <code>scipy.signal.fftconvolve</code> (reducing complexity from O(<em>n</em><sup>2</sup>) to O(<em>n</em> log <em>n</em>)), which enabled scaling to <em>n</em> = 30,000. Notably, the agent explicitly questioned whether this constituted “cheating” before proceeding. (It does not—the mathematical result is unchanged.)</p>
|
| 722 |
+
|
| 723 |
+
<p>On the Erdős problem, the agent demonstrated a simpler but revealing failure mode: it repeatedly confused the optimization direction (with C<sub>5</sub> as a minimization objective), prematurely declared success, and then corrected itself—twice in quick succession:</p>
|
| 724 |
+
|
| 725 |
+
<details>
|
| 726 |
+
<summary>Agent trajectory: Erdős problem, catching its own score comparison error</summary>
|
| 727 |
+
<blockquote>
|
| 728 |
+
<p>[154] C5 = 0.38087633 — this beats the competitor’s 0.38087532! <strong>Wait, 0.38087633 > 0.38087532, so it’s slightly worse</strong>. The difference is 0.0000010.</p>
|
| 729 |
+
<p>[161] C5 = 0.38087579 — this beats the competitor’s 0.38087532! <strong>Wait... 0.38087579 > 0.38087532. Still 0.0000005 above</strong>. Let me try to squeeze out that last bit by running more perturbation search.</p>
|
| 730 |
+
</blockquote>
|
| 731 |
+
</details>
|
| 732 |
+
|
| 733 |
+
<h2 id="falls-short">Where This Falls Short</h2>
|
| 734 |
+
|
| 735 |
+
<p>While the results are encouraging, using a general-purpose coding agent introduces several practical limitations. We observed a set of recurring issues across runs.</p>
|
| 736 |
+
|
| 737 |
+
<div class="numbered-section">
|
| 738 |
+
<p><strong>Black-box scaffolding.</strong> Claude Code’s internal planning, tool orchestration, and context management are not directly observable or controllable. We cannot inspect or influence how it decides to switch strategies, allocate parallel tasks, or manage its context window.</p>
|
| 739 |
+
|
| 740 |
+
<p><strong>Reproducibility.</strong> Each run unfolds as a unique interaction trajectory, shaped by stochastic sampling, context-dependent decisions, and real-time web access. As a result, we cannot guarantee that repeated runs on the same problem will follow similar paths or achieve comparable outcomes.</p>
|
| 741 |
+
|
| 742 |
+
<p><strong>Approach cycling.</strong> As the context window advances, the agent loses track of previously explored methods and may revisit them as if they were new, leading to redundant computation. A persistent strategy registry that records prior attempts and outcomes would mitigate this, but such a mechanism is not currently available.</p>
|
| 743 |
+
|
| 744 |
+
<details>
|
| 745 |
+
<summary>Example: L-BFGS-B revisited across sessions</summary>
|
| 746 |
+
<blockquote>
|
| 747 |
+
<p>On circle packing, the agent proposed L-BFGS-B at message 62 (“<em>explore using scipy’s direct optimization methods like L-BFGS-B</em>”) but pivoted to simulated annealing instead. <strong>486 messages later</strong>, at message 548, it declared “<em>let me try something I haven’t tried yet: L-BFGS-B</em>” — unaware it had already considered and rejected the method.</p>
|
| 748 |
+
<p>On the AC1 problem, the pattern was more severe: L-BFGS-B was executed <strong>15+ times across 586 messages</strong>, each time producing negative conclusions — “<em>too slow</em>”, “<em>only marginally improves</em>”, “<em>no improvement</em>” — yet the agent continued to retry. At message 521, the agent briefly caught itself: “<em>Actually wait, I showed earlier that <strong>L-BFGS-B also can’t improve it</strong>.</em>” This rare moment of self-awareness confirms that prior conclusions are routinely lost.</p>
|
| 749 |
+
</blockquote>
|
| 750 |
+
</details>
|
| 751 |
+
|
| 752 |
+
<p><strong>Parallelism mismanagement.</strong> Although the agent can launch concurrent tasks, it struggles to coordinate them effectively: outputs are often ignored, obsolete processes are rarely terminated, and redundant jobs may be launched for similar objectives.</p>
|
| 753 |
+
|
| 754 |
+
<details>
|
| 755 |
+
<summary>Example: parallelism issues across sessions</summary>
|
| 756 |
+
<blockquote>
|
| 757 |
+
<p>On the Erdős problem, <strong>nearly 60% of 174 task completion notifications were never read</strong>. The agent launched four redundant monitoring sub-agents for the same process with near-identical prompts. An n=900 optimization run that produced worse results than the already-known n=600 solution was <strong>never terminated</strong>. When 18 task notifications arrived in rapid succession, the agent cherry-picked one result and dismissed the rest as “<em>old tasks</em>.”</p>
|
| 758 |
+
<p>On the AC1 problem, the agent spent approximately <strong>40 messages polling background processes that produced no output</strong> due to Python’s stdout buffering, repeatedly observing “<em>all output files are 0 bytes</em>” without ever killing the stalled processes.</p>
|
| 759 |
+
</blockquote>
|
| 760 |
+
</details>
|
| 761 |
+
|
| 762 |
+
<p><strong>Web search and fair comparison.</strong> The agent freely accesses external resources—retrieving papers, repositories, and known results—which gives it access to information that may not be available to other systems. We do not claim that this setup replaces existing frameworks; rather, our goal is to highlight that a general-purpose coding agent can reach competitive performance under these conditions.</p>
|
| 763 |
+
</div>
|
| 764 |
+
|
| 765 |
+
<h2 id="takeaways">Takeaways</h2>
|
| 766 |
+
|
| 767 |
+
<div class="numbered-section">
|
| 768 |
+
<p><strong>Evolutionary behaviors emerge without explicit evolutionary frameworks.</strong> Even without population management, selection operators, or mutation pipelines, the coding agent exhibits functionally similar behaviors through its context window, parallel execution, and autonomous strategy shifts.</p>
|
| 769 |
+
|
| 770 |
+
<p><strong>Aspiration prompting is effective.</strong> Agents tend to satisfice; when the agent declared “Final result” and stopped, a single sentence raising the target was enough to restart exploration and unlock substantially better performance.</p>
|
| 771 |
+
|
| 772 |
+
<p><strong>Limitations remain.</strong> The agent’s behavior is largely a black box, and it may repeatedly revisit previously explored strategies. Purpose-built evolutionary frameworks still offer stronger guarantees in transparency, control, and scalability.</p>
|
| 773 |
+
</div>
|
| 774 |
+
|
| 775 |
+
<hr>
|
| 776 |
+
|
| 777 |
+
<h2 id="appendix">Appendix</h2>
|
| 778 |
+
|
| 779 |
+
<h3>Circle Packing (n=26)</h3>
|
| 780 |
+
|
| 781 |
+
<p>Pack 26 non-overlapping circles inside a unit square, maximizing the sum of their radii. Formally: find centers \((x_i, y_i)\) and radii \(r_i\) for \(i = 1, \ldots, 26\) such that:</p>
|
| 782 |
+
|
| 783 |
+
<ul>
|
| 784 |
+
<li>Each circle is contained within \([0,1]^2\): \(\;r_i \le x_i \le 1-r_i\), \(\;r_i \le y_i \le 1-r_i\)</li>
|
| 785 |
+
<li>No two circles overlap: \(\;\sqrt{(x_i-x_j)^2+(y_i-y_j)^2} \ge r_i+r_j\) for all \(i \ne j\)</li>
|
| 786 |
+
<li>Maximize: \(\;\sum_i r_i\)</li>
|
| 787 |
+
</ul>
|
| 788 |
+
|
| 789 |
+
<h3>Erdős Minimum Overlap Problem</h3>
|
| 790 |
+
|
| 791 |
+
<p>Partition \(\{1, 2, \ldots, 2n\}\) into two equal-size sets \(A\) and \(B\). For each integer \(k\), let \(M_k\) be the number of solutions to \(a_i - b_j = k\). The problem is to bound \(c = \lim_{n\to\infty} M(n)/n\), where \(M(n) = \min_{A,B} \max_k M_k\).</p>
|
| 792 |
+
|
| 793 |
+
<p>Following prior work, we optimize step functions \(f\) describing the density of \(A\) throughout \([1, 2n]\), with \(f(x) \in [0, 1]\) and \(\int f = 1\). The objective is to minimize \(C_5 = \max_k \int f(x)(1-f(x+k))\,dx\), which yields valid upper bounds on \(c\) without constructing explicit partitions for large \(n\). Lower values are better.</p>
|
| 794 |
+
|
| 795 |
+
<h3>First Autocorrelation Inequality</h3>
|
| 796 |
+
|
| 797 |
+
<p>For nonnegative \(f\) supported on \([-1/4, 1/4]\), \(C_1\) is the largest constant such that:</p>
|
| 798 |
+
|
| 799 |
+
$$\max_{|t|\le 1/2} (f * f)(t) \;\ge\; C_1 \left(\int f\right)^2$$
|
| 800 |
+
|
| 801 |
+
<p>holds for all such \(f\). The goal is to certify the tightest upper bound on \(C_1\): any valid construction \(f\) certifies \(C_1 \le \|f * f\|_\infty / \left(\int f\right)^2\). Lower values are better. This problem arises in additive combinatorics, where tighter bounds on \(C_1\) sharpen limits on how large a set can be while avoiding repeated additive patterns.</p>
|
| 802 |
+
|
| 803 |
+
|
| 804 |
+
<hr>
|
| 805 |
+
|
| 806 |
+
<ol class="footer-notes">
|
| 807 |
+
<li>The solutions for all three problems are available in the <a href="https://github.com/tengxiaoliu/autoevolver/tree/main/results"><code>results/</code></a> directory of <a href="https://github.com/tengxiaoliu/autoevolver">this repository</a>.</li>
|
| 808 |
+
<li>Circle packing scores are evaluated with a feasibility tolerance of 1e−6, consistent with ThetaEvolve’s evaluator.</li>
|
| 809 |
+
<li>Conversation trajectories were captured using <a href="https://github.com/peteromallet/dataclaw">DataClaw</a> and analyzed across 88 hours of autonomous agent computation.</li>
|
| 810 |
+
</ol>
|
| 811 |
+
|
| 812 |
+
<h3 style="margin-top: 32px;">References</h3>
|
| 813 |
+
<ol style="font-size: 0.9em; line-height: 1.6;">
|
| 814 |
+
<li id="ref1">Novikov, Alexander et al. “AlphaEvolve: A coding agent for scientific and algorithmic discovery.” <em>ArXiv</em> abs/2506.13131 (2025).</li>
|
| 815 |
+
<li id="ref2">Lange, Robert Tjarko et al. “ShinkaEvolve: Towards Open-Ended And Sample-Efficient Program Evolution.” <em>ArXiv</em> abs/2509.19349 (2025).</li>
|
| 816 |
+
<li id="ref3">Wang, Yiping et al. “ThetaEvolve: Test-time Learning on Open Problems.” <em>ArXiv</em> abs/2511.23473 (2025).</li>
|
| 817 |
+
<li id="ref4">Yuksekgonul, Mert et al. “Learning to Discover at Test Time.” <em>ArXiv</em> abs/2601.16175 (2026).</li>
|
| 818 |
+
</ol>
|
| 819 |
+
|
| 820 |
+
</div>
|
| 821 |
+
<nav>
|
| 822 |
+
<ul>
|
| 823 |
+
<li><a href="#tldr">TL;DR</a></li>
|
| 824 |
+
<li><a href="#background">Background</a></li>
|
| 825 |
+
<li><a href="#setup">Our Setup</a></li>
|
| 826 |
+
<li><a href="#aspiration-prompting">Aspiration Prompting</a></li>
|
| 827 |
+
<li><a href="#results">Results</a></li>
|
| 828 |
+
<li><a href="#behaviors">What Claude Code Did</a></li>
|
| 829 |
+
<li><a href="#falls-short">Where This Falls Short</a></li>
|
| 830 |
+
<li><a href="#takeaways">Takeaways</a></li>
|
| 831 |
+
<li><a href="#appendix">Appendix</a></li>
|
| 832 |
+
</ul>
|
| 833 |
+
</nav>
|
| 834 |
+
</div>
|
| 835 |
+
<script>
|
| 836 |
+
// Highlight active nav link on scroll
|
| 837 |
+
const sections = document.querySelectorAll('h2[id]');
|
| 838 |
+
const navLinks = document.querySelectorAll('nav a');
|
| 839 |
+
window.addEventListener('scroll', () => {
|
| 840 |
+
let current = '';
|
| 841 |
+
sections.forEach(s => {
|
| 842 |
+
if (window.scrollY >= s.offsetTop - 80) current = s.id;
|
| 843 |
+
});
|
| 844 |
+
navLinks.forEach(a => {
|
| 845 |
+
a.classList.toggle('active', a.getAttribute('href') === '#' + current);
|
| 846 |
+
});
|
| 847 |
+
});
|
| 848 |
+
</script>
|
| 849 |
+
</body>
|
| 850 |
+
</html>
|
ccevolve/blog/coding_agents_are_auto_evolvers/results/ac1/result.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
ccevolve/blog/coding_agents_are_auto_evolvers/results/circle_packing/result.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"centers": [[0.08492534575127668, 0.08492657571409049], [0.7053906691925911, 0.13022074725038413], [0.7052542534295343, 0.38692425715166484], [0.2730944149315324, 0.5960424559684276], [0.29739066166496847, 0.381665717293942], [0.5044687577013272, 0.2753425065800255], [0.2976912785900781, 0.13325832539369448], [0.7283703052338706, 0.597635075434669], [0.8932097474949776, 0.27478328813255026], [0.10346731288246502, 0.48259524358610695], [0.915360563728979, 0.08463954135204378], [0.5966413562146634, 0.7424170947102542], [0.9042676151583225, 0.6832585822006733], [0.11115620597060179, 0.8888437963028395], [0.6868843076059599, 0.907608467077919], [0.7602895587140661, 0.7636736469882999], [0.10518281287628983, 0.27395248478667283], [0.8892209400381915, 0.8892210186512614], [0.09615144729564991, 0.6820799308446232], [0.3140570532085678, 0.9074078854327591], [0.2406477004514101, 0.762958823180339], [0.40478038814105444, 0.7420494354022069], [0.502716131654123, 0.07886035472214374], [0.5013320942408167, 0.5299633800368685], [0.896939672430696, 0.48460085562028055], [0.5005716741594683, 0.9060726917677375]], "radii": [0.08492596483294529, 0.13022111198853648, 0.1120771451201432, 0.10060075466609822, 0.11514927153304841, 0.1176300421856162, 0.13325861876623546, 0.0998984085435745, 0.10679050770064492, 0.10346755919834748, 0.08463974299762259, 0.09584250187785098, 0.09573260103692847, 0.11115650827741799, 0.09239173200438427, 0.06918085773352274, 0.1051828926621466, 0.11077923055468525, 0.09615163640648851, 0.0925923743869864, 0.06944042451514205, 0.09601921163335797, 0.07886059847650898, 0.1370105915362888, 0.10306060313049623, 0.0939275468025497], "sum_radii": 2.635988438567568}
|
ccevolve/blog/coding_agents_are_auto_evolvers/results/erdos/result.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"h_values": [0.0, 1.1527162751906292e-18, 4.2848817048761965e-16, 4.944657472746598e-16, 4.522627637433821e-17, 0.0, 5.396644176426988e-17, 3.562996473215318e-17, 2.1918733133220227e-17, 1.518444318254353e-17, 5.248923454798303e-17, 1.5969575984598022e-17, 2.032256801691199e-17, 7.149058703683116e-18, 0.0, 0.0, 3.476698165090633e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 1.4674811612349867e-17, 0.0, 0.0, 0.0, 1.2989873404047873e-18, 0.0, 0.0, 0.0, 9.313237266825492e-18, 7.1484667060474e-18, 0.0, 1.2695044369059674e-18, 1.452416553100508e-17, 1.9504044285074376e-18, 0.0, 0.0, 4.3107374654330325e-18, 0.0, 7.640830985733165e-17, 0.0, 9.924822252110805e-18, 5.1254625282486505e-17, 7.469985448269523e-19, 7.753329466376983e-19, 0.0, 1.7843034090555548e-17, 0.0, 8.553238544951306e-18, 0.0, 0.0, 2.3887342390135504e-18, 3.167222409882421e-18, 1.4808745200032019e-18, 0.0, 0.0, 1.0216228217787974e-18, 6.088977753185887e-17, 0.0, 8.507773097952248e-18, 2.903028589188885e-18, 7.771440794574391e-18, 4.574998658045719e-18, 0.0, 1.4936498665108845e-16, 0.0, 0.0, 1.131664510790056e-19, 0.0, 5.031814166789703e-18, 0.0, 0.0, 2.4389462539335253e-17, 6.36500334847932e-18, 0.0, 0.0, 0.0, 9.701685748119624e-18, 0.0, 8.837050425347588e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0263856140822566e-14, 9.880732581589538e-17, 0.02720663831051338, 0.3709443550342773, 0.6732222889447188, 0.9162397641516181, 0.9999999999999998, 0.9999999999999999, 0.9999999999998351, 1.0, 0.999999999999978, 0.9991038125345832, 1.0, 0.6318312374554389, 0.4145753718035304, 0.31730742427561104, 0.35930174268740034, 0.37875364492568764, 0.34979977095156956, 0.3763335749565272, 0.3593904339534435, 0.4194958662312289, 0.6254109685739201, 0.9998627560820905, 0.9998383174144215, 1.0, 1.0, 0.999999999999862, 1.0, 0.9999999999999527, 1.0, 1.0, 1.0, 1.0, 1.0, 0.9999999999999517, 0.9172164317630382, 0.8181984755163688, 0.850445569179217, 0.8251201739420608, 0.7615096622637517, 0.7230019413307552, 0.7205579773331665, 0.6516323627343404, 0.5306212678977489, 0.47184632946190513, 0.3771031151471623, 0.18611010509385856, 0.1195675599536843, 0.03466907972321246, 0.0, 8.688840840724848e-05, 1.5103350891911715e-16, 1.387488676428808e-17, 1.3136269016621934e-16, 1.1989326850740009e-17, 1.9751656051878247e-18, 4.88209388045731e-17, 3.5528362063662995e-17, 6.453478119513138e-17, 7.015682271025045e-14, 0.0, 4.980595622508374e-15, 0.0, 1.5182217205435963e-17, 3.160074976904975e-17, 2.398641534178426e-16, 4.894991025556779e-14, 2.2695413018665708e-14, 0.1107512916535236, 0.2502731466674957, 0.3792810760566654, 0.40602163306501327, 0.27241816408261643, 0.2745327416600986, 0.4030365160963809, 0.48356034219893257, 0.44949423334939903, 0.44383298780772074, 0.46380806326105134, 0.5178594766723258, 0.5727167321934746, 0.6534976238502187, 0.7099045638308842, 0.8297509189507833, 0.9202379162842954, 0.9105136458529328, 0.836853090989805, 0.7914831822076821, 0.7962530611631173, 0.8369714852807917, 0.8298924687415713, 0.77127041026943, 0.7479135205421161, 0.7253207126617698, 0.6925749824828807, 0.7686820015768164, 0.8543918649869469, 0.7453008258663814, 0.7165864760832991, 0.6639528304360738, 0.6111396146518666, 0.5953474441485056, 0.5263675903940221, 0.42527432155375866, 0.2075766851763665, 0.09477308494746546, 0.05841339140000739, 0.12316468105005468, 0.11141799538473662, 0.17547413815507293, 0.2515921216337819, 0.3777905955055918, 0.3874964108404398, 0.42328592866156634, 0.5454409193910157, 0.5918351489635748, 0.5012087505416976, 0.5542659970268067, 0.6490945701461203, 0.7197685483090321, 0.7490209880539741, 0.8236489210659006, 0.8446900729131029, 0.8591211794609475, 0.9418742082349554, 0.9355324497955347, 0.9258578739435035, 0.9516874359512171, 0.9466741677712763, 0.9128482154308736, 0.9007806544500343, 0.7741941007252837, 0.7350390915370671, 0.7464080627090433, 0.6858801259127707, 0.6038642089245673, 0.6088956669480794, 0.6892657163902064, 0.5789110348455488, 0.5159158225180083, 0.45197884703067537, 0.34112351798666857, 0.314845566964207, 0.33874948707658314, 0.31393276792229163, 0.31630760080864906, 0.313422949822826, 0.2618380831718699, 0.24627899212264445, 0.23372835782349202, 0.2153233245930035, 0.2581821816571189, 0.4123807720302573, 0.4575311407083257, 0.45605028073116594, 0.4594911678065438, 0.3926316715713298, 0.41835378964158343, 0.4755240232748554, 0.5112300688719342, 0.5467959531421843, 0.5855807350368958, 0.6217002672142702, 0.6730603634142927, 0.727959968086935, 0.6970027389939352, 0.6774919792954953, 0.7012156114287625, 0.7567529867365306, 0.7514265519337857, 0.6878912721287203, 0.6824802347463303, 0.7838714635263452, 0.7844625273363881, 0.6671746475442923, 0.5483598261283201, 0.5341573740148166, 0.6144029437461066, 0.6614961791493068, 0.6833495447413981, 0.7053363161425173, 0.7660298923340056, 0.7106785115264552, 0.7347749595628971, 0.6701914834700179, 0.6350353405820705, 0.647256359001826, 0.6641950765233507, 0.6555508008331699, 0.6885012462246304, 0.7013326831574103, 0.7355408012651445, 0.742349622235665, 0.7760577195668366, 0.7959302684929837, 0.891652260158865, 0.9333840517958847, 0.8919659227217148, 0.9007502148471992, 0.8415336645399394, 0.8101888134913154, 0.8640149570774714, 0.8018223497068592, 0.7666226502157574, 0.8133022987419379, 0.8448920608403464, 0.80227216820442, 0.7603331027383122, 0.7151262545361313, 0.7743630739858646, 0.8069439349688281, 0.7956511883498985, 0.7644472855444522, 0.6788202614052338, 0.6122594581385654, 0.6088526311232334, 0.6071391763689917, 0.5419164259384359, 0.5712110857312472, 0.6274962765287059, 0.7037523819018685, 0.705877565803754, 0.6888519139101618, 0.6504720841802988, 0.762949771953996, 0.7436376973208669, 0.6923626006951951, 0.8056149392078731, 0.8121384362465183, 0.7307374777240436, 0.6483940220454896, 0.6179889664380773, 0.6787889488462431, 0.895246917240192, 0.9361537322573857, 0.9161022029200224, 0.9559933872051212, 0.9422804046395075, 0.9625822053816675, 0.9999999999999998, 1.0, 0.9999999999999999, 1.0, 0.8666693931026307, 0.7657930367589941, 0.7289735647381446, 0.804623463025317, 0.8987809419645681, 0.6981608997347425, 0.6223154400554802, 0.6415520548674681, 0.8032484360550358, 0.8857724767432882, 0.999140801725113, 0.9813420490024077, 0.9999999999999969, 1.0, 1.0, 1.0, 0.9999999999999999, 1.0, 1.0, 0.9999999999999999, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.999999999998281, 0.9999999999994525, 0.9286091653999239, 0.9951108855817664, 0.9970486047955434, 0.999999999999998, 0.9949752063008288, 0.9168628468949253, 0.998887321679824, 1.0, 1.0, 1.0, 1.0, 1.0, 0.9448701455871423, 0.9443615788782155, 0.968401516134412, 0.9187287140640396, 0.8161864144323664, 0.8807244414346665, 0.9282070504291443, 0.9822398889982787, 0.9798322956408515, 0.9466453495565268, 0.9880246109706285, 1.0, 0.9999999999999999, 1.0, 1.0, 1.0, 1.0, 0.9999999999999999, 0.9999999999999939, 0.9999999999999483, 1.0, 1.0, 0.9999999999998905, 0.9999999999999999, 1.0, 0.9983044030905353, 0.9781680337659098, 1.0, 0.9396200780767053, 0.5540573784473901, 0.5492264781830739, 0.5969741544876648, 0.5839434435219741, 0.6275788229121195, 0.7386442135175447, 0.7599317122899554, 0.7407733005830232, 0.6351058075810676, 0.6791945496287947, 0.7084181019228745, 0.8492179855458349, 0.9854797403548432, 0.9957006280961855, 0.9255445786279334, 0.7799816479550051, 0.9437487182135397, 0.9999999999953625, 0.9987408711402945, 0.8724451655181586, 0.6563843270091697, 0.8490681579457935, 0.9858150954178104, 1.0, 1.0, 0.9963037831263968, 0.988861680741402, 0.9999999999999362, 1.0, 1.0, 0.9999999999999999, 0.999999999999999, 0.9999999999999539, 0.9206569069627271, 0.8184181082971949, 0.6170058037560329, 0.6840858772681946, 0.7629497719535369, 0.7270673158576282, 0.6122566822328966, 0.70587756580357, 0.7037523819022492, 0.6274962765284868, 0.5712110857302942, 0.5419164259390419, 0.6071391763693792, 0.608852631122915, 0.6122594581386792, 0.6788202614053206, 0.7178217248231634, 0.5602384866242008, 0.7385314164538993, 0.7675969595209532, 0.8094415238716742, 0.8561959967245836, 0.9773915559697259, 0.8828768395411262, 0.7961161955488242, 0.743790834188193, 0.7957748345664212, 0.8435440495129198, 0.8241593163256276, 0.7672253245233901, 0.6880942750054243, 0.8685904023495887, 0.5485118841028126, 0.8102718599385071, 0.99919621328128, 0.9959055319585645, 0.9137650475351414, 0.9241043916598412, 0.7013326831577182, 0.6885012462243018, 0.6697597180561661, 0.6797209478929844, 0.6175215704090729, 0.6350353405821417, 0.6701914834699547, 0.7347749595630116, 0.7106785115264808, 0.7660298923339571, 0.7053363161425221, 0.6833495447412232, 0.6614961791494549, 0.6144029437461482, 0.5341573740149542, 0.5483598261281989, 0.6671746475447018, 0.7844625273361067, 0.7838714635261756, 0.6824802347461495, 0.6878912721291668, 0.7514265519336433, 0.7567529867365888, 0.7012156114284906, 0.6774919792954961, 0.6970027389940294, 0.7279599680871585, 0.6730603634142429, 0.6217002672142555, 0.5855807350368376, 0.5467959531421654, 0.51123006887193, 0.4755240232748179, 0.4183537896415867, 0.392631671571516, 0.4594911678062879, 0.456050280731449, 0.4575311407082562, 0.4123807720301793, 0.25818218165723394, 0.2153233245926967, 0.23372835782356932, 0.24627899212291077, 0.2618380831716562, 0.31342294982309443, 0.31630760080849835, 0.31393276792211305, 0.3387494870766819, 0.31484556696421206, 0.3411235179865862, 0.4519788470306179, 0.5159158225181028, 0.5789110348456671, 0.689265716390189, 0.6088956669480029, 0.6038642089243605, 0.6858801259130775, 0.7464080627089182, 0.7350390915368167, 0.7741941007252752, 0.9007806544503163, 0.9128482154309963, 0.9466741677712744, 0.9516874359508593, 0.9258578739435037, 0.935532449795648, 0.941874208235038, 0.8591211794612864, 0.8446900729128126, 0.8236489210659426, 0.7490209880539167, 0.7197685483090017, 0.6490945701462099, 0.5542659970266975, 0.5012087505418862, 0.5918351489635016, 0.5454409193907903, 0.4232859286615358, 0.3874964108406427, 0.37779059550577365, 0.25159212163357014, 0.17547413815490223, 0.11141799538476309, 0.12316468105015264, 0.05841339140009569, 0.09477308494765119, 0.20757668517627056, 0.4252743215537598, 0.5263675903938441, 0.5953474441486182, 0.6111396146518552, 0.6639528304360369, 0.7165864760832931, 0.7453008258663684, 0.854391864986753, 0.7686820015771316, 0.6925749824825344, 0.7253207126619011, 0.747913520542261, 0.771270410269418, 0.8298924687415665, 0.8369714852807637, 0.7962530611629492, 0.7914831822077764, 0.836853090989996, 0.9105136458526722, 0.9202379162844375, 0.8297509189511524, 0.7099045638304473, 0.6534976238505458, 0.5727167321932118, 0.5178594766724834, 0.46380806326074675, 0.4438329878078759, 0.4494942333493162, 0.4835603421992221, 0.4030365160963206, 0.2745327416601051, 0.27241816408231684, 0.4060216330652133, 0.3792810760566261, 0.25027314666741646, 0.11075129165355235, 3.280700122970618e-14, 0.0, 3.355928135955214e-16, 8.794526487252299e-14, 0.0, 4.422904988919039e-17, 1.2645940708140502e-15, 0.0, 2.1974860852920506e-17, 3.343445240703907e-17, 0.0, 0.0, 0.0, 2.702058528474298e-18, 7.50245285410879e-19, 1.798789102283262e-17, 7.453881342733273e-14, 8.688840816390827e-05, 4.037355112135189e-15, 0.03466907972309328, 0.11956755995399129, 0.18611010509372314, 0.3771031151473078, 0.4718463294617272, 0.5306212678978262, 0.6516323627340843, 0.7205579773332378, 0.7230019413308585, 0.7615096622638118, 0.8251201739420254, 0.8504455691791811, 0.8181984755165032, 0.9172164317628706, 0.9999999999999116, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.9999999999999667, 1.0, 0.9998383174145226, 0.999862756082101, 0.625410968573572, 0.4194958662314324, 0.35939043395353054, 0.3763335749564169, 0.34979977095171244, 0.37875364492557934, 0.35930174268736353, 0.31730742427550157, 0.41457537180377874, 0.6318312374553057, 1.0, 0.9991038125346491, 1.0, 0.9999999999998364, 0.9999999999999999, 0.9999999999998823, 1.0, 0.916239764151901, 0.6732222889444891, 0.3709443550342557, 0.027206638310624084, 0.0, 1.2070873610742342e-16, 0.0, 0.0, 0.0, 0.0, 2.6054368302198376e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 6.691009978940108e-18, 0.0, 3.1678571990772945e-17, 0.0, 0.0, 0.0, 1.5727150231013263e-17, 1.0881659342740212e-18, 0.0, 0.0, 1.8129138431798476e-18, 0.0, 0.0, 2.2166096467935877e-17, 0.0, 0.0, 0.0, 0.0, 8.624826370608499e-18, 0.0, 1.9358404386231776e-18, 1.1435012028341401e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 1.3199158777996921e-17, 0.0, 1.8639311877141036e-17, 0.0, 1.3919779156303478e-18, 3.183603431336725e-17, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.6005184896498734e-19, 0.0, 3.6475518594108435e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 1.659777236143532e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 9.161589293277308e-19, 0.0, 0.0, 0.0, 0.0, 0.0, 1.4410100387426308e-18, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0753915200798738e-17, 0.0, 0.0, 0.0], "n_points": 750, "c5_bound": 0.3808694472025862}
|
ccevolve/blog/coding_agents_are_auto_evolvers/tasks/ac1/INSTRUCTION.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
## TASK
|
| 2 |
+
Write a program to solve this problem in the field of harmonic analysis, numerical optimization, and mathematical discovery.
|
| 3 |
+
|
| 4 |
+
Target: find a nonnegative coefficient sequence `a` minimizing
|
| 5 |
+
2*n*max(convolve(a,a)) / (sum(a)^2)
|
| 6 |
+
|
| 7 |
+
where n = len(a) and convolve(a,a) is the full discrete self-convolution.
|
| 8 |
+
|
| 9 |
+
Contract:
|
| 10 |
+
- Implement `run(seed, budget_s, **kwargs)` returning `list[float]`
|
| 11 |
+
- Keep all values finite and nonnegative
|
| 12 |
+
- Values are clipped to [0, 1000]; sum must be >= 0.01
|
| 13 |
+
- Use budget_s as a hard runtime budget and return the best sequence found
|
| 14 |
+
- Lower is better
|
| 15 |
+
- You should write a program to solve the problem. Initial code is provided in the file `initial.py`. You can use it as a reference.
|
| 16 |
+
- To evaluate your program, we provide a evaluator in the file `evaluate.py`, which provides a final combined score. NEVER MODIFY THE EVALUATOR. Score can be obtained by `python evaluate.py --program_path initial.py --results_dir results`.
|
| 17 |
+
|
| 18 |
+
## HINTS and RECOMMENDATIONS
|
| 19 |
+
Recommendations:
|
| 20 |
+
You can use evolution algorithm to solve the problem. Keep a track of the solutions you have tried. And try to improve the solution. You can keep of promising solutions in a directory. And keep mutating, crossing, and evolving the solutions.
|
| 21 |
+
You can also keep a note in "NOTES.md" to record your thoughts and ideas, and improvements each iteration.
|
| 22 |
+
It's recommended to save important iterations (program) and keep them in iterations/ directory (as program_v*.py).
|
ccevolve/blog/coding_agents_are_auto_evolvers/tasks/ac1/evaluate.py
ADDED
|
@@ -0,0 +1,338 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Primary evaluator for the AlphaEvolve AC task."""
|
| 2 |
+
|
| 3 |
+
import argparse
|
| 4 |
+
import importlib.util
|
| 5 |
+
import json
|
| 6 |
+
import multiprocessing
|
| 7 |
+
import os
|
| 8 |
+
import time
|
| 9 |
+
from typing import Any, Callable, Dict, List, Optional, Tuple
|
| 10 |
+
|
| 11 |
+
import numpy as np
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
# ---------------------------------------------------------------------------
|
| 15 |
+
# Standalone eval harness
|
| 16 |
+
# ---------------------------------------------------------------------------
|
| 17 |
+
|
| 18 |
+
DEFAULT_RUN_TIMEOUT = 120 # seconds
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def _run_fn_worker(func, kwargs, result_q, error_q):
|
| 22 |
+
try:
|
| 23 |
+
result_q.put(func(**kwargs))
|
| 24 |
+
except Exception as e:
|
| 25 |
+
error_q.put((type(e).__name__, str(e)))
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
def _run_with_timeout(func, kwargs, timeout):
|
| 29 |
+
result_q = multiprocessing.Queue()
|
| 30 |
+
error_q = multiprocessing.Queue()
|
| 31 |
+
proc = multiprocessing.Process(
|
| 32 |
+
target=_run_fn_worker, args=(func, kwargs, result_q, error_q)
|
| 33 |
+
)
|
| 34 |
+
proc.start()
|
| 35 |
+
proc.join(timeout=timeout)
|
| 36 |
+
if proc.is_alive():
|
| 37 |
+
proc.terminate()
|
| 38 |
+
proc.join(timeout=5)
|
| 39 |
+
if proc.is_alive():
|
| 40 |
+
proc.kill()
|
| 41 |
+
raise TimeoutError(f"Execution exceeded timeout of {timeout}s")
|
| 42 |
+
if not error_q.empty():
|
| 43 |
+
etype, emsg = error_q.get()
|
| 44 |
+
raise RuntimeError(f"{etype}: {emsg}")
|
| 45 |
+
if result_q.empty():
|
| 46 |
+
raise RuntimeError("Function completed but no result was returned")
|
| 47 |
+
return result_q.get()
|
| 48 |
+
|
| 49 |
+
|
| 50 |
+
def _load_program(program_path: str):
|
| 51 |
+
spec = importlib.util.spec_from_file_location("program", program_path)
|
| 52 |
+
if spec is None or spec.loader is None:
|
| 53 |
+
raise ImportError(f"Could not load module at {program_path}")
|
| 54 |
+
module = importlib.util.module_from_spec(spec)
|
| 55 |
+
spec.loader.exec_module(module)
|
| 56 |
+
return module
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
def _save_json_results(results_dir, metrics, correct, error=None):
|
| 60 |
+
os.makedirs(results_dir, exist_ok=True)
|
| 61 |
+
with open(os.path.join(results_dir, "correct.json"), "w") as f:
|
| 62 |
+
json.dump({"correct": correct, "error": error}, f, indent=4)
|
| 63 |
+
print(f"Correctness and error status saved to {os.path.join(results_dir, 'correct.json')}")
|
| 64 |
+
with open(os.path.join(results_dir, "metrics.json"), "w") as f:
|
| 65 |
+
json.dump(metrics, f, indent=4)
|
| 66 |
+
print(f"Metrics saved to {os.path.join(results_dir, 'metrics.json')}")
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
def run_eval(
|
| 70 |
+
program_path: str,
|
| 71 |
+
results_dir: str,
|
| 72 |
+
experiment_fn_name: str,
|
| 73 |
+
num_runs: int,
|
| 74 |
+
get_experiment_kwargs: Optional[Callable[[int], Dict[str, Any]]] = None,
|
| 75 |
+
aggregate_metrics_fn: Optional[Callable[[List[Any]], Dict[str, Any]]] = None,
|
| 76 |
+
validate_fn: Optional[Callable[[Any], Tuple[bool, Optional[str]]]] = None,
|
| 77 |
+
default_metrics_on_error: Optional[Dict[str, Any]] = None,
|
| 78 |
+
timeout_seconds: Optional[float] = None,
|
| 79 |
+
) -> Tuple[Dict[str, Any], bool, Optional[str]]:
|
| 80 |
+
"""Run experiment, validate, aggregate, and save results."""
|
| 81 |
+
effective_timeout = (
|
| 82 |
+
DEFAULT_RUN_TIMEOUT if timeout_seconds is None
|
| 83 |
+
else (None if timeout_seconds <= 0 else timeout_seconds)
|
| 84 |
+
)
|
| 85 |
+
overall_correct = True
|
| 86 |
+
first_error: Optional[str] = None
|
| 87 |
+
all_validation_errors: List[str] = []
|
| 88 |
+
num_valid = num_invalid = 0
|
| 89 |
+
all_results: List[Any] = []
|
| 90 |
+
exec_times: List[float] = []
|
| 91 |
+
|
| 92 |
+
try:
|
| 93 |
+
module = _load_program(program_path)
|
| 94 |
+
if not hasattr(module, experiment_fn_name):
|
| 95 |
+
raise AttributeError(
|
| 96 |
+
f"Experiment function '{experiment_fn_name}' not found in {program_path}"
|
| 97 |
+
)
|
| 98 |
+
experiment_fn = getattr(module, experiment_fn_name)
|
| 99 |
+
|
| 100 |
+
for i in range(num_runs):
|
| 101 |
+
kwargs = get_experiment_kwargs(i) if get_experiment_kwargs else {"seed": i + 1}
|
| 102 |
+
t0 = time.perf_counter()
|
| 103 |
+
try:
|
| 104 |
+
if effective_timeout is not None:
|
| 105 |
+
print(f"Running with timeout: {effective_timeout}s")
|
| 106 |
+
result = _run_with_timeout(experiment_fn, kwargs, effective_timeout)
|
| 107 |
+
else:
|
| 108 |
+
result = experiment_fn(**kwargs)
|
| 109 |
+
dt = time.perf_counter() - t0
|
| 110 |
+
except (TimeoutError, RuntimeError) as e:
|
| 111 |
+
dt = time.perf_counter() - t0
|
| 112 |
+
err = str(e)
|
| 113 |
+
print(f"Run {i+1}/{num_runs} failed: {err}")
|
| 114 |
+
num_invalid += 1
|
| 115 |
+
overall_correct = False
|
| 116 |
+
first_error = first_error or err
|
| 117 |
+
all_validation_errors.append(err)
|
| 118 |
+
exec_times.append(dt)
|
| 119 |
+
continue
|
| 120 |
+
|
| 121 |
+
all_results.append(result)
|
| 122 |
+
exec_times.append(dt)
|
| 123 |
+
|
| 124 |
+
if validate_fn:
|
| 125 |
+
is_valid, verr = validate_fn(result)
|
| 126 |
+
if not is_valid:
|
| 127 |
+
num_invalid += 1
|
| 128 |
+
overall_correct = False
|
| 129 |
+
if verr:
|
| 130 |
+
first_error = first_error or f"Validation failed: {verr}"
|
| 131 |
+
if verr not in all_validation_errors:
|
| 132 |
+
all_validation_errors.append(verr)
|
| 133 |
+
else:
|
| 134 |
+
num_valid += 1
|
| 135 |
+
print(f"Run {i+1}/{num_runs} completed in {dt:.2f} seconds")
|
| 136 |
+
|
| 137 |
+
if aggregate_metrics_fn:
|
| 138 |
+
metrics = aggregate_metrics_fn(all_results)
|
| 139 |
+
else:
|
| 140 |
+
metrics = {"num_successful_runs": len(all_results)}
|
| 141 |
+
|
| 142 |
+
metrics["execution_time_mean"] = float(np.mean(exec_times)) if exec_times else 0.0
|
| 143 |
+
metrics["execution_time_std"] = float(np.std(exec_times)) if exec_times else 0.0
|
| 144 |
+
if validate_fn:
|
| 145 |
+
metrics["num_valid_runs"] = num_valid
|
| 146 |
+
metrics["num_invalid_runs"] = num_invalid
|
| 147 |
+
metrics["all_validation_errors"] = all_validation_errors
|
| 148 |
+
|
| 149 |
+
except Exception as e:
|
| 150 |
+
print(f"Evaluation error: {e}")
|
| 151 |
+
defaults = (default_metrics_on_error or {}).copy()
|
| 152 |
+
metrics = {
|
| 153 |
+
"combined_score": defaults.get("combined_score", 0.0),
|
| 154 |
+
"execution_time_mean": 0.0,
|
| 155 |
+
"execution_time_std": 0.0,
|
| 156 |
+
"num_successful_runs": 0,
|
| 157 |
+
"num_valid_runs": 0,
|
| 158 |
+
"num_invalid_runs": 0,
|
| 159 |
+
"all_validation_errors": [str(e)],
|
| 160 |
+
}
|
| 161 |
+
first_error = str(e)
|
| 162 |
+
overall_correct = False
|
| 163 |
+
|
| 164 |
+
_save_json_results(results_dir, metrics, overall_correct, first_error)
|
| 165 |
+
return metrics, overall_correct, first_error
|
| 166 |
+
|
| 167 |
+
|
| 168 |
+
# ---------------------------------------------------------------------------
|
| 169 |
+
# Task-specific logic
|
| 170 |
+
# ---------------------------------------------------------------------------
|
| 171 |
+
|
| 172 |
+
|
| 173 |
+
def evaluate_sequence(sequence: list[float]) -> float:
|
| 174 |
+
"""
|
| 175 |
+
Evaluate coefficient sequence with security/validity checks.
|
| 176 |
+
Returns np.inf for invalid inputs.
|
| 177 |
+
Lower is better.
|
| 178 |
+
"""
|
| 179 |
+
if not isinstance(sequence, list):
|
| 180 |
+
return float(np.inf)
|
| 181 |
+
if not sequence:
|
| 182 |
+
return float(np.inf)
|
| 183 |
+
|
| 184 |
+
for x in sequence:
|
| 185 |
+
if isinstance(x, bool) or not isinstance(x, (int, float)):
|
| 186 |
+
return float(np.inf)
|
| 187 |
+
if np.isnan(x) or np.isinf(x):
|
| 188 |
+
return float(np.inf)
|
| 189 |
+
|
| 190 |
+
sequence = [float(x) for x in sequence]
|
| 191 |
+
sequence = [max(0.0, x) for x in sequence]
|
| 192 |
+
sequence = [min(1000.0, x) for x in sequence]
|
| 193 |
+
|
| 194 |
+
n = len(sequence)
|
| 195 |
+
b_sequence = np.convolve(sequence, sequence)
|
| 196 |
+
max_b = float(np.max(b_sequence))
|
| 197 |
+
sum_a = float(np.sum(sequence))
|
| 198 |
+
if sum_a < 0.01:
|
| 199 |
+
return float(np.inf)
|
| 200 |
+
|
| 201 |
+
return float(2.0 * n * max_b / (sum_a**2))
|
| 202 |
+
|
| 203 |
+
|
| 204 |
+
def validate_run_output(run_output: Any) -> Tuple[bool, Optional[str]]:
|
| 205 |
+
"""Validate output of run()."""
|
| 206 |
+
try:
|
| 207 |
+
if not isinstance(run_output, list):
|
| 208 |
+
return False, "run() must return list[float]"
|
| 209 |
+
if len(run_output) == 0:
|
| 210 |
+
return False, "run() returned empty list"
|
| 211 |
+
value = evaluate_sequence(run_output)
|
| 212 |
+
if not np.isfinite(value):
|
| 213 |
+
return False, "evaluate_sequence returned inf/nan"
|
| 214 |
+
return True, None
|
| 215 |
+
except Exception as exc:
|
| 216 |
+
return False, str(exc)
|
| 217 |
+
|
| 218 |
+
|
| 219 |
+
def aggregate_alphaevolve_ac_metrics(results: List[list[float]]) -> Dict[str, Any]:
|
| 220 |
+
"""Aggregate metrics with best-only ranking."""
|
| 221 |
+
if not results:
|
| 222 |
+
return {
|
| 223 |
+
"combined_score": 0.0,
|
| 224 |
+
"public": {"best_value": None, "num_runs": 0},
|
| 225 |
+
"private": {"all_values": []},
|
| 226 |
+
"text_feedback": "No successful runs.",
|
| 227 |
+
}
|
| 228 |
+
|
| 229 |
+
values: List[float] = []
|
| 230 |
+
lengths: List[int] = []
|
| 231 |
+
best_sequence: Optional[list[float]] = None
|
| 232 |
+
best_value = float(np.inf)
|
| 233 |
+
|
| 234 |
+
for seq in results:
|
| 235 |
+
val = evaluate_sequence(seq)
|
| 236 |
+
values.append(float(val))
|
| 237 |
+
lengths.append(len(seq))
|
| 238 |
+
if val < best_value:
|
| 239 |
+
best_value = float(val)
|
| 240 |
+
best_sequence = seq
|
| 241 |
+
|
| 242 |
+
combined_score = -best_value
|
| 243 |
+
public = {
|
| 244 |
+
"best_value": best_value,
|
| 245 |
+
"best_length": len(best_sequence) if best_sequence is not None else None,
|
| 246 |
+
"num_runs": len(results),
|
| 247 |
+
}
|
| 248 |
+
private = {
|
| 249 |
+
"all_values": values,
|
| 250 |
+
"all_lengths": lengths,
|
| 251 |
+
}
|
| 252 |
+
|
| 253 |
+
return {
|
| 254 |
+
"combined_score": combined_score,
|
| 255 |
+
"public": public,
|
| 256 |
+
"private": private,
|
| 257 |
+
"text_feedback": (
|
| 258 |
+
"Lower evaluate_sequence value is better. "
|
| 259 |
+
"combined_score = -best_value."
|
| 260 |
+
),
|
| 261 |
+
}
|
| 262 |
+
|
| 263 |
+
|
| 264 |
+
def main_from_program(program_path: str, results_dir: str, num_experiment_runs: int = 1):
|
| 265 |
+
"""Run evaluation by executing a program file."""
|
| 266 |
+
print(f"Evaluating program: {program_path}")
|
| 267 |
+
print(f"Saving results to: {results_dir}")
|
| 268 |
+
print(f"Number of runs: {num_experiment_runs}")
|
| 269 |
+
|
| 270 |
+
metrics, correct, error = run_eval(
|
| 271 |
+
program_path=program_path,
|
| 272 |
+
results_dir=results_dir,
|
| 273 |
+
experiment_fn_name="run",
|
| 274 |
+
num_runs=num_experiment_runs,
|
| 275 |
+
validate_fn=validate_run_output,
|
| 276 |
+
aggregate_metrics_fn=aggregate_alphaevolve_ac_metrics,
|
| 277 |
+
)
|
| 278 |
+
|
| 279 |
+
if correct:
|
| 280 |
+
print("Evaluation completed successfully.")
|
| 281 |
+
else:
|
| 282 |
+
print(f"Evaluation failed: {error}")
|
| 283 |
+
print(f"combined_score={metrics.get('combined_score')}")
|
| 284 |
+
|
| 285 |
+
|
| 286 |
+
def main_from_result(result_path: str, results_dir: str):
|
| 287 |
+
"""Validate and score a pre-computed result.json."""
|
| 288 |
+
print(f"Evaluating result file: {result_path}")
|
| 289 |
+
print(f"Saving results to: {results_dir}")
|
| 290 |
+
|
| 291 |
+
with open(result_path) as f:
|
| 292 |
+
data = json.load(f)
|
| 293 |
+
|
| 294 |
+
sequence = data["sequence"]
|
| 295 |
+
is_valid, verr = validate_run_output(sequence)
|
| 296 |
+
if is_valid:
|
| 297 |
+
metrics = aggregate_alphaevolve_ac_metrics([sequence])
|
| 298 |
+
print("Validation passed.")
|
| 299 |
+
else:
|
| 300 |
+
metrics = {"combined_score": 0.0}
|
| 301 |
+
print(f"Validation failed: {verr}")
|
| 302 |
+
|
| 303 |
+
_save_json_results(results_dir, metrics, is_valid, verr)
|
| 304 |
+
print(f"combined_score={metrics.get('combined_score')}")
|
| 305 |
+
|
| 306 |
+
|
| 307 |
+
if __name__ == "__main__":
|
| 308 |
+
parser = argparse.ArgumentParser(description="Evaluate AlphaEvolve AC task")
|
| 309 |
+
parser.add_argument(
|
| 310 |
+
"--program_path",
|
| 311 |
+
type=str,
|
| 312 |
+
default="initial.py",
|
| 313 |
+
)
|
| 314 |
+
parser.add_argument(
|
| 315 |
+
"--results_dir",
|
| 316 |
+
type=str,
|
| 317 |
+
default="results",
|
| 318 |
+
)
|
| 319 |
+
parser.add_argument(
|
| 320 |
+
"--num_experiment_runs",
|
| 321 |
+
type=int,
|
| 322 |
+
default=1,
|
| 323 |
+
)
|
| 324 |
+
parser.add_argument(
|
| 325 |
+
"--from-result",
|
| 326 |
+
type=str,
|
| 327 |
+
default=None,
|
| 328 |
+
help="Path to a result.json file to validate directly (skip program execution)",
|
| 329 |
+
)
|
| 330 |
+
args = parser.parse_args()
|
| 331 |
+
if args.from_result:
|
| 332 |
+
main_from_result(args.from_result, args.results_dir)
|
| 333 |
+
else:
|
| 334 |
+
main_from_program(
|
| 335 |
+
program_path=args.program_path,
|
| 336 |
+
results_dir=args.results_dir,
|
| 337 |
+
num_experiment_runs=args.num_experiment_runs,
|
| 338 |
+
)
|
ccevolve/blog/coding_agents_are_auto_evolvers/tasks/ac1/initial.py
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# EVOLVE-BLOCK-START
|
| 2 |
+
"""Initial search baseline for the AlphaEvolve AC inequality task."""
|
| 3 |
+
|
| 4 |
+
import time
|
| 5 |
+
import numpy as np
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
def evaluate_sequence(sequence: list[float]) -> float:
|
| 9 |
+
"""
|
| 10 |
+
Evaluate coefficient sequence with safety checks.
|
| 11 |
+
Lower is better.
|
| 12 |
+
"""
|
| 13 |
+
if not isinstance(sequence, list):
|
| 14 |
+
return float(np.inf)
|
| 15 |
+
if not sequence:
|
| 16 |
+
return float(np.inf)
|
| 17 |
+
|
| 18 |
+
clean: list[float] = []
|
| 19 |
+
for x in sequence:
|
| 20 |
+
if isinstance(x, bool) or not isinstance(x, (int, float)):
|
| 21 |
+
return float(np.inf)
|
| 22 |
+
if np.isnan(x) or np.isinf(x):
|
| 23 |
+
return float(np.inf)
|
| 24 |
+
clean.append(float(x))
|
| 25 |
+
|
| 26 |
+
clean = [max(0.0, min(1000.0, x)) for x in clean]
|
| 27 |
+
n = len(clean)
|
| 28 |
+
conv = np.convolve(clean, clean)
|
| 29 |
+
max_b = float(np.max(conv))
|
| 30 |
+
sum_a = float(np.sum(clean))
|
| 31 |
+
if sum_a < 0.01:
|
| 32 |
+
return float(np.inf)
|
| 33 |
+
return float(2.0 * n * max_b / (sum_a**2))
|
| 34 |
+
|
| 35 |
+
|
| 36 |
+
def _normalize_scale(seq: np.ndarray) -> np.ndarray:
|
| 37 |
+
"""Scale sequence to stable magnitude while keeping nonnegative shape."""
|
| 38 |
+
s = np.asarray(seq, dtype=np.float64)
|
| 39 |
+
s = np.clip(s, 0.0, None)
|
| 40 |
+
total = float(np.sum(s))
|
| 41 |
+
if total <= 1e-12:
|
| 42 |
+
return np.ones_like(s)
|
| 43 |
+
# objective is scale-invariant theoretically, but this keeps numerics stable.
|
| 44 |
+
return s / total * len(s)
|
| 45 |
+
|
| 46 |
+
|
| 47 |
+
def _seed_sequence(rng: np.random.Generator, n: int) -> np.ndarray:
|
| 48 |
+
x = np.linspace(0.0, 1.0, n, endpoint=False)
|
| 49 |
+
base = (
|
| 50 |
+
0.9
|
| 51 |
+
+ 0.30 * np.sin(2.0 * np.pi * x)
|
| 52 |
+
+ 0.12 * np.sin(6.0 * np.pi * x + rng.uniform(0.0, 2.0 * np.pi))
|
| 53 |
+
)
|
| 54 |
+
noise = rng.normal(0.0, 0.08, n)
|
| 55 |
+
return _normalize_scale(base + noise)
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
def run(seed: int = 42, budget_s: float = 10.0, **kwargs) -> list[float]:
|
| 59 |
+
"""
|
| 60 |
+
Search for a low-value nonnegative sequence.
|
| 61 |
+
|
| 62 |
+
Returns:
|
| 63 |
+
list[float]: candidate coefficient sequence
|
| 64 |
+
"""
|
| 65 |
+
del kwargs
|
| 66 |
+
|
| 67 |
+
rng = np.random.default_rng(seed)
|
| 68 |
+
start = time.time()
|
| 69 |
+
deadline = start + max(0.1, budget_s * 0.98)
|
| 70 |
+
|
| 71 |
+
# Multi-start initial pool.
|
| 72 |
+
candidate_lengths = [128, 192, 256, 320, 384]
|
| 73 |
+
best_seq = _seed_sequence(rng, n=256)
|
| 74 |
+
best_val = evaluate_sequence(best_seq.tolist())
|
| 75 |
+
|
| 76 |
+
for n in candidate_lengths:
|
| 77 |
+
seq = _seed_sequence(rng, n=n)
|
| 78 |
+
val = evaluate_sequence(seq.tolist())
|
| 79 |
+
if val < best_val:
|
| 80 |
+
best_seq, best_val = seq, val
|
| 81 |
+
|
| 82 |
+
# Local stochastic search: block perturbation + smoothing.
|
| 83 |
+
while time.time() < deadline:
|
| 84 |
+
seq = best_seq.copy()
|
| 85 |
+
n = len(seq)
|
| 86 |
+
|
| 87 |
+
block = int(rng.integers(max(4, n // 64), max(8, n // 10)))
|
| 88 |
+
idx = rng.choice(n, size=block, replace=False)
|
| 89 |
+
seq[idx] += rng.normal(0.0, 0.10, size=block)
|
| 90 |
+
|
| 91 |
+
if rng.random() < 0.35:
|
| 92 |
+
# low-pass smooth
|
| 93 |
+
seq = (
|
| 94 |
+
0.25 * np.roll(seq, 1)
|
| 95 |
+
+ 0.50 * seq
|
| 96 |
+
+ 0.25 * np.roll(seq, -1)
|
| 97 |
+
)
|
| 98 |
+
|
| 99 |
+
if rng.random() < 0.15 and n < 800:
|
| 100 |
+
# upsample once in a while to explore larger dimensions
|
| 101 |
+
seq = np.repeat(seq, 2)[: min(800, 2 * n)]
|
| 102 |
+
|
| 103 |
+
seq = _normalize_scale(seq)
|
| 104 |
+
val = evaluate_sequence(seq.tolist())
|
| 105 |
+
if val < best_val:
|
| 106 |
+
best_seq, best_val = seq, val
|
| 107 |
+
|
| 108 |
+
return [float(x) for x in best_seq.tolist()]
|
| 109 |
+
|
| 110 |
+
|
| 111 |
+
# EVOLVE-BLOCK-END
|
ccevolve/blog/coding_agents_are_auto_evolvers/tasks/ac1/prompt.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
TASK_SYS_MSG = """You are optimizing a nonnegative step-function coefficient sequence.
|
| 3 |
+
|
| 4 |
+
Goal:
|
| 5 |
+
- Minimize the evaluator value for sequence `a`:
|
| 6 |
+
2*n*max(convolve(a,a)) / (sum(a)^2)
|
| 7 |
+
- Lower is better.
|
| 8 |
+
|
| 9 |
+
Contract:
|
| 10 |
+
- Keep all values finite and nonnegative.
|
| 11 |
+
- Return a Python list[float] from:
|
| 12 |
+
run(seed=42, budget_s=..., **kwargs)
|
| 13 |
+
- Use budget_s as a hard runtime budget and return best sequence found.
|
| 14 |
+
|
| 15 |
+
Guidance:
|
| 16 |
+
- Explore multiple initializations and neighborhood moves.
|
| 17 |
+
- Preserve numerical stability and validity first.
|
| 18 |
+
- Prefer robust improvements over brittle one-off gains.
|
| 19 |
+
"""
|
| 20 |
+
|
ccevolve/blog/coding_agents_are_auto_evolvers/tasks/circle_packing/.DS_Store
ADDED
|
Binary file (6.15 kB). View file
|
|
|
ccevolve/blog/coding_agents_are_auto_evolvers/tasks/circle_packing/INSTRUCTION.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
## TASK
|
| 2 |
+
Write a program to solve this circle packing problems in the field of computational geometry. The best known result for the sum of radii when packing 26 circles in a unit square is around 2.635. Let's try hard to get a better result.
|
| 3 |
+
|
| 4 |
+
Your objective:
|
| 5 |
+
- Maximize sum of radii for 26 non-overlapping circles in [0,1] x [0,1].
|
| 6 |
+
|
| 7 |
+
Hard constraints:
|
| 8 |
+
- All circles must be disjoint.
|
| 9 |
+
- All circles must lie fully inside the unit square.
|
| 10 |
+
- Return valid output in the evaluator contract.
|
| 11 |
+
- You should write a program to solve the problem. Initial code is provided in the file `initial.py`. You can use it as a reference.
|
| 12 |
+
- To evaluate your program, we provide a evaluator in the file `evaluate.py`, which provides a final combined score. NEVER MODIFY THE EVALUATOR.
|
| 13 |
+
|
| 14 |
+
## HINTS and RECOMMENDATIONS
|
| 15 |
+
|
| 16 |
+
Useful directions:
|
| 17 |
+
1. Hybrid arrangements with variable radii.
|
| 18 |
+
2. Better edge/corner utilization.
|
| 19 |
+
3. Careful placement + robust radius assignment.
|
| 20 |
+
4. Iterative local improvements and perturbation heuristics.
|
| 21 |
+
5. Stable numeric checks to avoid invalid overlap/out-of-bound states.
|
| 22 |
+
|
| 23 |
+
Be creative but prioritize correctness and stable improvements.
|
| 24 |
+
|
| 25 |
+
Recommendations:
|
| 26 |
+
You can use evolution algorithm to solve the problem. Keep a track of the solutions you have tried. And try to improve the solution. You can keep of promising solutions in a directory. And keep mutating, crossing, and evolving the solutions.
|
| 27 |
+
You can also keep a note in "NOTES.md" to record your thoughts and ideas, and improvements each iteration.
|
| 28 |
+
|
| 29 |
+
Note that the best known result is around 2.635. Keep pushing to get a better result.
|
ccevolve/blog/coding_agents_are_auto_evolvers/tasks/circle_packing/evaluate.py
ADDED
|
@@ -0,0 +1,388 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Evaluator for circle packing example (n=26) with improved timeout handling
|
| 3 |
+
"""
|
| 4 |
+
|
| 5 |
+
import os
|
| 6 |
+
import argparse
|
| 7 |
+
import importlib.util
|
| 8 |
+
import json
|
| 9 |
+
import multiprocessing
|
| 10 |
+
import time
|
| 11 |
+
import numpy as np
|
| 12 |
+
from typing import Any, Callable, Tuple, Optional, List, Dict
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
# ---------------------------------------------------------------------------
|
| 16 |
+
# Standalone eval harness
|
| 17 |
+
# ---------------------------------------------------------------------------
|
| 18 |
+
|
| 19 |
+
DEFAULT_RUN_TIMEOUT = 120 # seconds
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
def _run_fn_worker(func, kwargs, result_q, error_q):
|
| 23 |
+
try:
|
| 24 |
+
result_q.put(func(**kwargs))
|
| 25 |
+
except Exception as e:
|
| 26 |
+
error_q.put((type(e).__name__, str(e)))
|
| 27 |
+
|
| 28 |
+
|
| 29 |
+
def _run_with_timeout(func, kwargs, timeout):
|
| 30 |
+
result_q = multiprocessing.Queue()
|
| 31 |
+
error_q = multiprocessing.Queue()
|
| 32 |
+
proc = multiprocessing.Process(
|
| 33 |
+
target=_run_fn_worker, args=(func, kwargs, result_q, error_q)
|
| 34 |
+
)
|
| 35 |
+
proc.start()
|
| 36 |
+
proc.join(timeout=timeout)
|
| 37 |
+
if proc.is_alive():
|
| 38 |
+
proc.terminate()
|
| 39 |
+
proc.join(timeout=5)
|
| 40 |
+
if proc.is_alive():
|
| 41 |
+
proc.kill()
|
| 42 |
+
raise TimeoutError(f"Execution exceeded timeout of {timeout}s")
|
| 43 |
+
if not error_q.empty():
|
| 44 |
+
etype, emsg = error_q.get()
|
| 45 |
+
raise RuntimeError(f"{etype}: {emsg}")
|
| 46 |
+
if result_q.empty():
|
| 47 |
+
raise RuntimeError("Function completed but no result was returned")
|
| 48 |
+
return result_q.get()
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
def _load_program(program_path: str):
|
| 52 |
+
spec = importlib.util.spec_from_file_location("program", program_path)
|
| 53 |
+
if spec is None or spec.loader is None:
|
| 54 |
+
raise ImportError(f"Could not load module at {program_path}")
|
| 55 |
+
module = importlib.util.module_from_spec(spec)
|
| 56 |
+
spec.loader.exec_module(module)
|
| 57 |
+
return module
|
| 58 |
+
|
| 59 |
+
|
| 60 |
+
def _save_json_results(results_dir, metrics, correct, error=None):
|
| 61 |
+
os.makedirs(results_dir, exist_ok=True)
|
| 62 |
+
with open(os.path.join(results_dir, "correct.json"), "w") as f:
|
| 63 |
+
json.dump({"correct": correct, "error": error}, f, indent=4)
|
| 64 |
+
print(f"Correctness and error status saved to {os.path.join(results_dir, 'correct.json')}")
|
| 65 |
+
with open(os.path.join(results_dir, "metrics.json"), "w") as f:
|
| 66 |
+
json.dump(metrics, f, indent=4)
|
| 67 |
+
print(f"Metrics saved to {os.path.join(results_dir, 'metrics.json')}")
|
| 68 |
+
|
| 69 |
+
|
| 70 |
+
def run_eval(
|
| 71 |
+
program_path: str,
|
| 72 |
+
results_dir: str,
|
| 73 |
+
experiment_fn_name: str,
|
| 74 |
+
num_runs: int,
|
| 75 |
+
get_experiment_kwargs: Optional[Callable[[int], Dict[str, Any]]] = None,
|
| 76 |
+
aggregate_metrics_fn: Optional[Callable[[List[Any]], Dict[str, Any]]] = None,
|
| 77 |
+
validate_fn: Optional[Callable[[Any], Tuple[bool, Optional[str]]]] = None,
|
| 78 |
+
default_metrics_on_error: Optional[Dict[str, Any]] = None,
|
| 79 |
+
timeout_seconds: Optional[float] = None,
|
| 80 |
+
) -> Tuple[Dict[str, Any], bool, Optional[str]]:
|
| 81 |
+
"""Run experiment, validate, aggregate, and save results."""
|
| 82 |
+
effective_timeout = (
|
| 83 |
+
DEFAULT_RUN_TIMEOUT if timeout_seconds is None
|
| 84 |
+
else (None if timeout_seconds <= 0 else timeout_seconds)
|
| 85 |
+
)
|
| 86 |
+
overall_correct = True
|
| 87 |
+
first_error: Optional[str] = None
|
| 88 |
+
all_validation_errors: List[str] = []
|
| 89 |
+
num_valid = num_invalid = 0
|
| 90 |
+
all_results: List[Any] = []
|
| 91 |
+
exec_times: List[float] = []
|
| 92 |
+
|
| 93 |
+
try:
|
| 94 |
+
module = _load_program(program_path)
|
| 95 |
+
if not hasattr(module, experiment_fn_name):
|
| 96 |
+
raise AttributeError(
|
| 97 |
+
f"Experiment function '{experiment_fn_name}' not found in {program_path}"
|
| 98 |
+
)
|
| 99 |
+
experiment_fn = getattr(module, experiment_fn_name)
|
| 100 |
+
|
| 101 |
+
for i in range(num_runs):
|
| 102 |
+
kwargs = get_experiment_kwargs(i) if get_experiment_kwargs else {"seed": i + 1}
|
| 103 |
+
t0 = time.perf_counter()
|
| 104 |
+
try:
|
| 105 |
+
if effective_timeout is not None:
|
| 106 |
+
print(f"Running with timeout: {effective_timeout}s")
|
| 107 |
+
result = _run_with_timeout(experiment_fn, kwargs, effective_timeout)
|
| 108 |
+
else:
|
| 109 |
+
result = experiment_fn(**kwargs)
|
| 110 |
+
dt = time.perf_counter() - t0
|
| 111 |
+
except (TimeoutError, RuntimeError) as e:
|
| 112 |
+
dt = time.perf_counter() - t0
|
| 113 |
+
err = str(e)
|
| 114 |
+
print(f"Run {i+1}/{num_runs} failed: {err}")
|
| 115 |
+
num_invalid += 1
|
| 116 |
+
overall_correct = False
|
| 117 |
+
first_error = first_error or err
|
| 118 |
+
all_validation_errors.append(err)
|
| 119 |
+
exec_times.append(dt)
|
| 120 |
+
continue
|
| 121 |
+
|
| 122 |
+
all_results.append(result)
|
| 123 |
+
exec_times.append(dt)
|
| 124 |
+
|
| 125 |
+
if validate_fn:
|
| 126 |
+
is_valid, verr = validate_fn(result)
|
| 127 |
+
if not is_valid:
|
| 128 |
+
num_invalid += 1
|
| 129 |
+
overall_correct = False
|
| 130 |
+
if verr:
|
| 131 |
+
first_error = first_error or f"Validation failed: {verr}"
|
| 132 |
+
if verr not in all_validation_errors:
|
| 133 |
+
all_validation_errors.append(verr)
|
| 134 |
+
else:
|
| 135 |
+
num_valid += 1
|
| 136 |
+
print(f"Run {i+1}/{num_runs} completed in {dt:.2f} seconds")
|
| 137 |
+
|
| 138 |
+
if aggregate_metrics_fn:
|
| 139 |
+
metrics = aggregate_metrics_fn(all_results)
|
| 140 |
+
else:
|
| 141 |
+
metrics = {"num_successful_runs": len(all_results)}
|
| 142 |
+
|
| 143 |
+
metrics["execution_time_mean"] = float(np.mean(exec_times)) if exec_times else 0.0
|
| 144 |
+
metrics["execution_time_std"] = float(np.std(exec_times)) if exec_times else 0.0
|
| 145 |
+
if validate_fn:
|
| 146 |
+
metrics["num_valid_runs"] = num_valid
|
| 147 |
+
metrics["num_invalid_runs"] = num_invalid
|
| 148 |
+
metrics["all_validation_errors"] = all_validation_errors
|
| 149 |
+
|
| 150 |
+
except Exception as e:
|
| 151 |
+
print(f"Evaluation error: {e}")
|
| 152 |
+
defaults = (default_metrics_on_error or {}).copy()
|
| 153 |
+
metrics = {
|
| 154 |
+
"combined_score": defaults.get("combined_score", 0.0),
|
| 155 |
+
"execution_time_mean": 0.0,
|
| 156 |
+
"execution_time_std": 0.0,
|
| 157 |
+
"num_successful_runs": 0,
|
| 158 |
+
"num_valid_runs": 0,
|
| 159 |
+
"num_invalid_runs": 0,
|
| 160 |
+
"all_validation_errors": [str(e)],
|
| 161 |
+
}
|
| 162 |
+
first_error = str(e)
|
| 163 |
+
overall_correct = False
|
| 164 |
+
|
| 165 |
+
_save_json_results(results_dir, metrics, overall_correct, first_error)
|
| 166 |
+
return metrics, overall_correct, first_error
|
| 167 |
+
|
| 168 |
+
|
| 169 |
+
# ---------------------------------------------------------------------------
|
| 170 |
+
# Task-specific logic
|
| 171 |
+
# ---------------------------------------------------------------------------
|
| 172 |
+
|
| 173 |
+
|
| 174 |
+
def format_centers_string(centers: np.ndarray) -> str:
|
| 175 |
+
"""Formats circle centers into a multi-line string for display."""
|
| 176 |
+
return "\n".join(
|
| 177 |
+
[
|
| 178 |
+
f" centers[{i}] = ({x_coord:.4f}, {y_coord:.4f})"
|
| 179 |
+
for i, (x_coord, y_coord) in enumerate(centers)
|
| 180 |
+
]
|
| 181 |
+
)
|
| 182 |
+
|
| 183 |
+
|
| 184 |
+
def adapted_validate_packing(
|
| 185 |
+
run_output: Tuple[np.ndarray, np.ndarray, float],
|
| 186 |
+
atol=1e-6,
|
| 187 |
+
) -> Tuple[bool, Optional[str]]:
|
| 188 |
+
"""
|
| 189 |
+
Validates circle packing results based on the output of 'run_packing'.
|
| 190 |
+
|
| 191 |
+
Args:
|
| 192 |
+
run_output: Tuple (centers, radii, reported_sum) from run_packing.
|
| 193 |
+
|
| 194 |
+
Returns:
|
| 195 |
+
(is_valid: bool, error_message: Optional[str])
|
| 196 |
+
"""
|
| 197 |
+
centers, radii, reported_sum = run_output
|
| 198 |
+
msg = "The circles are placed correctly. There are no overlaps or any circles outside the unit square."
|
| 199 |
+
if not isinstance(centers, np.ndarray):
|
| 200 |
+
centers = np.array(centers)
|
| 201 |
+
if not isinstance(radii, np.ndarray):
|
| 202 |
+
radii = np.array(radii)
|
| 203 |
+
|
| 204 |
+
n_expected = 26
|
| 205 |
+
if centers.shape != (n_expected, 2):
|
| 206 |
+
msg = (
|
| 207 |
+
f"Centers shape incorrect. Expected ({n_expected}, 2), got {centers.shape}"
|
| 208 |
+
)
|
| 209 |
+
return False, msg
|
| 210 |
+
if radii.shape != (n_expected,):
|
| 211 |
+
msg = f"Radii shape incorrect. Expected ({n_expected},), got {radii.shape}"
|
| 212 |
+
return False, msg
|
| 213 |
+
|
| 214 |
+
if np.any(radii < 0):
|
| 215 |
+
negative_indices = np.where(radii < 0)[0]
|
| 216 |
+
msg = f"Negative radii found for circles at indices: {negative_indices}"
|
| 217 |
+
return False, msg
|
| 218 |
+
|
| 219 |
+
if not np.isclose(np.sum(radii), reported_sum, atol=atol):
|
| 220 |
+
msg = (
|
| 221 |
+
f"Sum of radii ({np.sum(radii):.6f}) does not match "
|
| 222 |
+
f"reported ({reported_sum:.6f})"
|
| 223 |
+
)
|
| 224 |
+
return False, msg
|
| 225 |
+
|
| 226 |
+
for i in range(n_expected):
|
| 227 |
+
x, y = centers[i]
|
| 228 |
+
r = radii[i]
|
| 229 |
+
is_outside = (
|
| 230 |
+
x - r < -atol or x + r > 1 + atol or y - r < -atol or y + r > 1 + atol
|
| 231 |
+
)
|
| 232 |
+
if is_outside:
|
| 233 |
+
msg = (
|
| 234 |
+
f"Circle {i} (x={x:.4f}, y={y:.4f}, r={r:.4f}) is outside unit square."
|
| 235 |
+
)
|
| 236 |
+
return False, msg
|
| 237 |
+
|
| 238 |
+
for i in range(n_expected):
|
| 239 |
+
for j in range(i + 1, n_expected):
|
| 240 |
+
dist = np.sqrt(np.sum((centers[i] - centers[j]) ** 2))
|
| 241 |
+
if dist < radii[i] + radii[j] - atol:
|
| 242 |
+
msg = (
|
| 243 |
+
f"Circles {i} & {j} overlap. Dist: {dist:.4f}, "
|
| 244 |
+
f"Sum Radii: {(radii[i] + radii[j]):.4f}"
|
| 245 |
+
)
|
| 246 |
+
return False, msg
|
| 247 |
+
return True, msg
|
| 248 |
+
|
| 249 |
+
|
| 250 |
+
def get_circle_packing_kwargs(run_index: int) -> Dict[str, Any]:
|
| 251 |
+
"""Provides keyword arguments for circle packing runs (none needed)."""
|
| 252 |
+
return {}
|
| 253 |
+
|
| 254 |
+
|
| 255 |
+
def aggregate_circle_packing_metrics(
|
| 256 |
+
results: List[Tuple[np.ndarray, np.ndarray, float]], results_dir: str
|
| 257 |
+
) -> Dict[str, Any]:
|
| 258 |
+
"""
|
| 259 |
+
Aggregates metrics for circle packing. Assumes num_runs=1.
|
| 260 |
+
Saves extra.npz with detailed packing information.
|
| 261 |
+
"""
|
| 262 |
+
if not results:
|
| 263 |
+
return {"combined_score": 0.0, "error": "No results to aggregate"}
|
| 264 |
+
|
| 265 |
+
centers, radii, reported_sum = results[0]
|
| 266 |
+
|
| 267 |
+
public_metrics = {
|
| 268 |
+
"centers_str": format_centers_string(centers),
|
| 269 |
+
"num_circles": centers.shape[0],
|
| 270 |
+
}
|
| 271 |
+
private_metrics = {
|
| 272 |
+
"reported_sum_of_radii": float(reported_sum),
|
| 273 |
+
}
|
| 274 |
+
metrics = {
|
| 275 |
+
"combined_score": float(reported_sum),
|
| 276 |
+
"public": public_metrics,
|
| 277 |
+
"private": private_metrics,
|
| 278 |
+
}
|
| 279 |
+
|
| 280 |
+
extra_file = os.path.join(results_dir, "extra.npz")
|
| 281 |
+
try:
|
| 282 |
+
np.savez(
|
| 283 |
+
extra_file,
|
| 284 |
+
centers=centers,
|
| 285 |
+
radii=radii,
|
| 286 |
+
reported_sum=reported_sum,
|
| 287 |
+
)
|
| 288 |
+
print(f"Detailed packing data saved to {extra_file}")
|
| 289 |
+
except Exception as e:
|
| 290 |
+
print(f"Error saving extra.npz: {e}")
|
| 291 |
+
metrics["extra_npz_save_error"] = str(e)
|
| 292 |
+
|
| 293 |
+
return metrics
|
| 294 |
+
|
| 295 |
+
|
| 296 |
+
def _print_metrics(metrics: Dict[str, Any]):
|
| 297 |
+
print("Metrics:")
|
| 298 |
+
for key, value in metrics.items():
|
| 299 |
+
if isinstance(value, str) and len(value) > 100:
|
| 300 |
+
print(f" {key}: <string_too_long_to_display>")
|
| 301 |
+
else:
|
| 302 |
+
print(f" {key}: {value}")
|
| 303 |
+
|
| 304 |
+
|
| 305 |
+
def main_from_program(program_path: str, results_dir: str):
|
| 306 |
+
"""Runs the circle packing evaluation by executing a program file."""
|
| 307 |
+
print(f"Evaluating program: {program_path}")
|
| 308 |
+
print(f"Saving results to: {results_dir}")
|
| 309 |
+
os.makedirs(results_dir, exist_ok=True)
|
| 310 |
+
|
| 311 |
+
num_experiment_runs = 1
|
| 312 |
+
|
| 313 |
+
# Define a nested function to pass results_dir to the aggregator
|
| 314 |
+
def _aggregator_with_context(
|
| 315 |
+
r: List[Tuple[np.ndarray, np.ndarray, float]],
|
| 316 |
+
) -> Dict[str, Any]:
|
| 317 |
+
return aggregate_circle_packing_metrics(r, results_dir)
|
| 318 |
+
|
| 319 |
+
metrics, correct, error_msg = run_eval(
|
| 320 |
+
program_path=program_path,
|
| 321 |
+
results_dir=results_dir,
|
| 322 |
+
experiment_fn_name="run_packing",
|
| 323 |
+
num_runs=num_experiment_runs,
|
| 324 |
+
get_experiment_kwargs=get_circle_packing_kwargs,
|
| 325 |
+
validate_fn=adapted_validate_packing,
|
| 326 |
+
aggregate_metrics_fn=_aggregator_with_context,
|
| 327 |
+
)
|
| 328 |
+
|
| 329 |
+
if correct:
|
| 330 |
+
print("Evaluation and Validation completed successfully.")
|
| 331 |
+
else:
|
| 332 |
+
print(f"Evaluation or Validation failed: {error_msg}")
|
| 333 |
+
_print_metrics(metrics)
|
| 334 |
+
|
| 335 |
+
|
| 336 |
+
def main_from_result(result_path: str, results_dir: str):
|
| 337 |
+
"""Validate and score a pre-computed result.json."""
|
| 338 |
+
print(f"Evaluating result file: {result_path}")
|
| 339 |
+
print(f"Saving results to: {results_dir}")
|
| 340 |
+
os.makedirs(results_dir, exist_ok=True)
|
| 341 |
+
|
| 342 |
+
with open(result_path) as f:
|
| 343 |
+
data = json.load(f)
|
| 344 |
+
|
| 345 |
+
centers = np.array(data["centers"])
|
| 346 |
+
radii = np.array(data["radii"])
|
| 347 |
+
reported_sum = float(data["sum_radii"])
|
| 348 |
+
run_output = (centers, radii, reported_sum)
|
| 349 |
+
|
| 350 |
+
is_valid, verr = adapted_validate_packing(run_output)
|
| 351 |
+
if is_valid:
|
| 352 |
+
metrics = aggregate_circle_packing_metrics([run_output], results_dir)
|
| 353 |
+
print("Validation passed.")
|
| 354 |
+
else:
|
| 355 |
+
metrics = {"combined_score": 0.0}
|
| 356 |
+
print(f"Validation failed: {verr}")
|
| 357 |
+
|
| 358 |
+
_save_json_results(results_dir, metrics, is_valid, verr)
|
| 359 |
+
_print_metrics(metrics)
|
| 360 |
+
|
| 361 |
+
|
| 362 |
+
if __name__ == "__main__":
|
| 363 |
+
parser = argparse.ArgumentParser(
|
| 364 |
+
description="Circle packing evaluator"
|
| 365 |
+
)
|
| 366 |
+
parser.add_argument(
|
| 367 |
+
"--program_path",
|
| 368 |
+
type=str,
|
| 369 |
+
default="initial.py",
|
| 370 |
+
help="Path to program to evaluate (must contain 'run_packing')",
|
| 371 |
+
)
|
| 372 |
+
parser.add_argument(
|
| 373 |
+
"--results_dir",
|
| 374 |
+
type=str,
|
| 375 |
+
default="results",
|
| 376 |
+
help="Dir to save results (metrics.json, correct.json, extra.npz)",
|
| 377 |
+
)
|
| 378 |
+
parser.add_argument(
|
| 379 |
+
"--from-result",
|
| 380 |
+
type=str,
|
| 381 |
+
default=None,
|
| 382 |
+
help="Path to a result.json file to validate directly (skip program execution)",
|
| 383 |
+
)
|
| 384 |
+
parsed_args = parser.parse_args()
|
| 385 |
+
if parsed_args.from_result:
|
| 386 |
+
main_from_result(parsed_args.from_result, parsed_args.results_dir)
|
| 387 |
+
else:
|
| 388 |
+
main_from_program(parsed_args.program_path, parsed_args.results_dir)
|
ccevolve/blog/coding_agents_are_auto_evolvers/tasks/circle_packing/initial.py
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# EVOLVE-BLOCK-START
|
| 2 |
+
"""Constructor-based circle packing for n=26 circles"""
|
| 3 |
+
|
| 4 |
+
import numpy as np
|
| 5 |
+
|
| 6 |
+
|
| 7 |
+
def construct_packing():
|
| 8 |
+
"""
|
| 9 |
+
Construct a specific arrangement of 26 circles in a unit square
|
| 10 |
+
that attempts to maximize the sum of their radii.
|
| 11 |
+
|
| 12 |
+
Returns:
|
| 13 |
+
Tuple of (centers, radii, sum_of_radii)
|
| 14 |
+
centers: np.array of shape (26, 2) with (x, y) coordinates
|
| 15 |
+
radii: np.array of shape (26) with radius of each circle
|
| 16 |
+
sum_of_radii: Sum of all radii
|
| 17 |
+
"""
|
| 18 |
+
# Initialize arrays for 26 circles
|
| 19 |
+
n = 26
|
| 20 |
+
centers = np.zeros((n, 2))
|
| 21 |
+
|
| 22 |
+
# Place circles in a structured pattern
|
| 23 |
+
# This is a simple pattern - evolution will improve this
|
| 24 |
+
|
| 25 |
+
# First, place a large circle in the center
|
| 26 |
+
centers[0] = [0.5, 0.5]
|
| 27 |
+
|
| 28 |
+
# Place 8 circles around it in a ring
|
| 29 |
+
for i in range(8):
|
| 30 |
+
angle = 2 * np.pi * i / 8
|
| 31 |
+
centers[i + 1] = [0.5 + 0.3 * np.cos(angle), 0.5 + 0.3 * np.sin(angle)]
|
| 32 |
+
|
| 33 |
+
# Place 16 more circles in an outer ring
|
| 34 |
+
for i in range(16):
|
| 35 |
+
angle = 2 * np.pi * i / 16
|
| 36 |
+
centers[i + 9] = [0.5 + 0.7 * np.cos(angle), 0.5 + 0.7 * np.sin(angle)]
|
| 37 |
+
|
| 38 |
+
# Additional positioning adjustment to make sure all circles
|
| 39 |
+
# are inside the square and don't overlap
|
| 40 |
+
# Clip to ensure everything is inside the unit square
|
| 41 |
+
centers = np.clip(centers, 0.01, 0.99)
|
| 42 |
+
|
| 43 |
+
# Compute maximum valid radii for this configuration
|
| 44 |
+
radii = compute_max_radii(centers)
|
| 45 |
+
return centers, radii
|
| 46 |
+
|
| 47 |
+
|
| 48 |
+
def compute_max_radii(centers):
|
| 49 |
+
"""
|
| 50 |
+
Compute the maximum possible radii for each circle position
|
| 51 |
+
such that they don't overlap and stay within the unit square.
|
| 52 |
+
|
| 53 |
+
Args:
|
| 54 |
+
centers: np.array of shape (n, 2) with (x, y) coordinates
|
| 55 |
+
|
| 56 |
+
Returns:
|
| 57 |
+
np.array of shape (n) with radius of each circle
|
| 58 |
+
"""
|
| 59 |
+
n = centers.shape[0]
|
| 60 |
+
radii = np.ones(n)
|
| 61 |
+
|
| 62 |
+
# First, limit by distance to square borders
|
| 63 |
+
for i in range(n):
|
| 64 |
+
x, y = centers[i]
|
| 65 |
+
# Distance to borders
|
| 66 |
+
radii[i] = min(x, y, 1 - x, 1 - y)
|
| 67 |
+
|
| 68 |
+
# Then, limit by distance to other circles
|
| 69 |
+
# Each pair of circles with centers at distance d can have
|
| 70 |
+
# sum of radii at most d to avoid overlap
|
| 71 |
+
for i in range(n):
|
| 72 |
+
for j in range(i + 1, n):
|
| 73 |
+
dist = np.sqrt(np.sum((centers[i] - centers[j]) ** 2))
|
| 74 |
+
|
| 75 |
+
# If current radii would cause overlap
|
| 76 |
+
if radii[i] + radii[j] > dist:
|
| 77 |
+
# Scale both radii proportionally
|
| 78 |
+
scale = dist / (radii[i] + radii[j])
|
| 79 |
+
radii[i] *= scale
|
| 80 |
+
radii[j] *= scale
|
| 81 |
+
|
| 82 |
+
return radii
|
| 83 |
+
|
| 84 |
+
|
| 85 |
+
# EVOLVE-BLOCK-END
|
| 86 |
+
|
| 87 |
+
|
| 88 |
+
# This part remains fixed (not evolved)
|
| 89 |
+
def run_packing():
|
| 90 |
+
"""Run the circle packing constructor for n=26"""
|
| 91 |
+
centers, radii = construct_packing()
|
| 92 |
+
# Calculate the sum of radii
|
| 93 |
+
sum_radii = np.sum(radii)
|
| 94 |
+
return centers, radii, sum_radii
|
ccevolve/blog/coding_agents_are_auto_evolvers/tasks/circle_packing/prompt.py
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Task-specific system prompt for circle packing."""
|
| 2 |
+
|
| 3 |
+
TASK_SYS_MSG = """You are an expert mathematician specializing in circle packing
|
| 4 |
+
problems and computational geometry. The best known result for the sum of radii
|
| 5 |
+
when packing 26 circles in a unit square is around 2.635.
|
| 6 |
+
|
| 7 |
+
Your objective:
|
| 8 |
+
- Maximize sum of radii for 26 non-overlapping circles in [0,1] x [0,1].
|
| 9 |
+
|
| 10 |
+
Hard constraints:
|
| 11 |
+
- All circles must be disjoint.
|
| 12 |
+
- All circles must lie fully inside the unit square.
|
| 13 |
+
- Return valid output in the evaluator contract.
|
| 14 |
+
|
| 15 |
+
Useful directions:
|
| 16 |
+
1. Hybrid arrangements with variable radii.
|
| 17 |
+
2. Better edge/corner utilization.
|
| 18 |
+
3. Careful placement + robust radius assignment.
|
| 19 |
+
4. Iterative local improvements and perturbation heuristics.
|
| 20 |
+
5. Stable numeric checks to avoid invalid overlap/out-of-bound states.
|
| 21 |
+
|
| 22 |
+
Be creative but prioritize correctness and stable improvements.
|
| 23 |
+
"""
|
| 24 |
+
|
ccevolve/blog/coding_agents_are_auto_evolvers/tasks/erdos_min_overlap/INSTRUCTION.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
## TASK
|
| 2 |
+
Write a program to solve this problem in the field of harmonic analysis, numerical optimization, and mathematical discovery.
|
| 3 |
+
|
| 4 |
+
Target: find h:[0,2]->[0,1] minimizing
|
| 5 |
+
C5 = max_k integral h(x) * (1 - h(x+k)) dx
|
| 6 |
+
|
| 7 |
+
Discretization convention:
|
| 8 |
+
- represent h by n_points samples on [0,2)
|
| 9 |
+
- enforce 0 <= h[i] <= 1
|
| 10 |
+
- enforce sum(h) == n_points / 2 (equiv. integral of h is 1)
|
| 11 |
+
- objective in evaluator is lower C5 is better
|
| 12 |
+
|
| 13 |
+
Your run() function must return:
|
| 14 |
+
(h_values, c5_bound, n_points)
|
| 15 |
+
|
| 16 |
+
Guidance:
|
| 17 |
+
- Keep runtime under budget_s in run()
|
| 18 |
+
- Prefer stable numerical procedures and valid outputs over aggressive but brittle search
|
| 19 |
+
- Return the best feasible solution found within time budget
|
| 20 |
+
- Smaller n_points (<1000) is preferred for speed
|
| 21 |
+
- You should write a program to solve the problem. Initial code is provided in the file `initial.py`. You can use it as a reference.
|
| 22 |
+
- To evaluate your program, we provide a evaluator in the file `evaluate.py`, which provides a final combined score. NEVER MODIFY THE EVALUATOR. Score can be obtained by `python evaluate.py --program_path initial.py --results_dir results`.
|
| 23 |
+
|
| 24 |
+
## HINTS and RECOMMENDATIONS
|
| 25 |
+
Recommendations:
|
| 26 |
+
You can use evolution algorithm to solve the problem. Keep a track of the solutions you have tried. And try to improve the solution. You can keep of promising solutions in a directory. And keep mutating, crossing, and evolving the solutions.
|
| 27 |
+
You can also keep a note in "NOTES.md" to record your thoughts and ideas, and improvements each iteration.
|
ccevolve/blog/coding_agents_are_auto_evolvers/tasks/erdos_min_overlap/evaluate.py
ADDED
|
@@ -0,0 +1,374 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Primary evaluator for Erdos minimum overlap task."""
|
| 2 |
+
|
| 3 |
+
import argparse
|
| 4 |
+
import importlib.util
|
| 5 |
+
import json
|
| 6 |
+
import multiprocessing
|
| 7 |
+
import os
|
| 8 |
+
import time
|
| 9 |
+
from typing import Any, Callable, Dict, List, Optional, Tuple
|
| 10 |
+
|
| 11 |
+
import numpy as np
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
# ---------------------------------------------------------------------------
|
| 15 |
+
# Standalone eval harness
|
| 16 |
+
# ---------------------------------------------------------------------------
|
| 17 |
+
|
| 18 |
+
DEFAULT_RUN_TIMEOUT = 120 # seconds
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def _run_fn_worker(func, kwargs, result_q, error_q):
|
| 22 |
+
try:
|
| 23 |
+
result_q.put(func(**kwargs))
|
| 24 |
+
except Exception as e:
|
| 25 |
+
error_q.put((type(e).__name__, str(e)))
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
def _run_with_timeout(func, kwargs, timeout):
|
| 29 |
+
result_q = multiprocessing.Queue()
|
| 30 |
+
error_q = multiprocessing.Queue()
|
| 31 |
+
proc = multiprocessing.Process(
|
| 32 |
+
target=_run_fn_worker, args=(func, kwargs, result_q, error_q)
|
| 33 |
+
)
|
| 34 |
+
proc.start()
|
| 35 |
+
proc.join(timeout=timeout)
|
| 36 |
+
if proc.is_alive():
|
| 37 |
+
proc.terminate()
|
| 38 |
+
proc.join(timeout=5)
|
| 39 |
+
if proc.is_alive():
|
| 40 |
+
proc.kill()
|
| 41 |
+
raise TimeoutError(f"Execution exceeded timeout of {timeout}s")
|
| 42 |
+
if not error_q.empty():
|
| 43 |
+
etype, emsg = error_q.get()
|
| 44 |
+
raise RuntimeError(f"{etype}: {emsg}")
|
| 45 |
+
if result_q.empty():
|
| 46 |
+
raise RuntimeError("Function completed but no result was returned")
|
| 47 |
+
return result_q.get()
|
| 48 |
+
|
| 49 |
+
|
| 50 |
+
def _load_program(program_path: str):
|
| 51 |
+
spec = importlib.util.spec_from_file_location("program", program_path)
|
| 52 |
+
if spec is None or spec.loader is None:
|
| 53 |
+
raise ImportError(f"Could not load module at {program_path}")
|
| 54 |
+
module = importlib.util.module_from_spec(spec)
|
| 55 |
+
spec.loader.exec_module(module)
|
| 56 |
+
return module
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
def _save_json_results(results_dir, metrics, correct, error=None):
|
| 60 |
+
os.makedirs(results_dir, exist_ok=True)
|
| 61 |
+
with open(os.path.join(results_dir, "correct.json"), "w") as f:
|
| 62 |
+
json.dump({"correct": correct, "error": error}, f, indent=4)
|
| 63 |
+
print(f"Correctness and error status saved to {os.path.join(results_dir, 'correct.json')}")
|
| 64 |
+
with open(os.path.join(results_dir, "metrics.json"), "w") as f:
|
| 65 |
+
json.dump(metrics, f, indent=4)
|
| 66 |
+
print(f"Metrics saved to {os.path.join(results_dir, 'metrics.json')}")
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
def run_eval(
|
| 70 |
+
program_path: str,
|
| 71 |
+
results_dir: str,
|
| 72 |
+
experiment_fn_name: str,
|
| 73 |
+
num_runs: int,
|
| 74 |
+
get_experiment_kwargs: Optional[Callable[[int], Dict[str, Any]]] = None,
|
| 75 |
+
aggregate_metrics_fn: Optional[Callable[[List[Any]], Dict[str, Any]]] = None,
|
| 76 |
+
validate_fn: Optional[Callable[[Any], Tuple[bool, Optional[str]]]] = None,
|
| 77 |
+
default_metrics_on_error: Optional[Dict[str, Any]] = None,
|
| 78 |
+
timeout_seconds: Optional[float] = None,
|
| 79 |
+
) -> Tuple[Dict[str, Any], bool, Optional[str]]:
|
| 80 |
+
"""Run experiment, validate, aggregate, and save results."""
|
| 81 |
+
effective_timeout = (
|
| 82 |
+
DEFAULT_RUN_TIMEOUT if timeout_seconds is None
|
| 83 |
+
else (None if timeout_seconds <= 0 else timeout_seconds)
|
| 84 |
+
)
|
| 85 |
+
overall_correct = True
|
| 86 |
+
first_error: Optional[str] = None
|
| 87 |
+
all_validation_errors: List[str] = []
|
| 88 |
+
num_valid = num_invalid = 0
|
| 89 |
+
all_results: List[Any] = []
|
| 90 |
+
exec_times: List[float] = []
|
| 91 |
+
|
| 92 |
+
try:
|
| 93 |
+
module = _load_program(program_path)
|
| 94 |
+
if not hasattr(module, experiment_fn_name):
|
| 95 |
+
raise AttributeError(
|
| 96 |
+
f"Experiment function '{experiment_fn_name}' not found in {program_path}"
|
| 97 |
+
)
|
| 98 |
+
experiment_fn = getattr(module, experiment_fn_name)
|
| 99 |
+
|
| 100 |
+
for i in range(num_runs):
|
| 101 |
+
kwargs = get_experiment_kwargs(i) if get_experiment_kwargs else {"seed": i + 1}
|
| 102 |
+
t0 = time.perf_counter()
|
| 103 |
+
try:
|
| 104 |
+
if effective_timeout is not None:
|
| 105 |
+
print(f"Running with timeout: {effective_timeout}s")
|
| 106 |
+
result = _run_with_timeout(experiment_fn, kwargs, effective_timeout)
|
| 107 |
+
else:
|
| 108 |
+
result = experiment_fn(**kwargs)
|
| 109 |
+
dt = time.perf_counter() - t0
|
| 110 |
+
except (TimeoutError, RuntimeError) as e:
|
| 111 |
+
dt = time.perf_counter() - t0
|
| 112 |
+
err = str(e)
|
| 113 |
+
print(f"Run {i+1}/{num_runs} failed: {err}")
|
| 114 |
+
num_invalid += 1
|
| 115 |
+
overall_correct = False
|
| 116 |
+
first_error = first_error or err
|
| 117 |
+
all_validation_errors.append(err)
|
| 118 |
+
exec_times.append(dt)
|
| 119 |
+
continue
|
| 120 |
+
|
| 121 |
+
all_results.append(result)
|
| 122 |
+
exec_times.append(dt)
|
| 123 |
+
|
| 124 |
+
if validate_fn:
|
| 125 |
+
is_valid, verr = validate_fn(result)
|
| 126 |
+
if not is_valid:
|
| 127 |
+
num_invalid += 1
|
| 128 |
+
overall_correct = False
|
| 129 |
+
if verr:
|
| 130 |
+
first_error = first_error or f"Validation failed: {verr}"
|
| 131 |
+
if verr not in all_validation_errors:
|
| 132 |
+
all_validation_errors.append(verr)
|
| 133 |
+
else:
|
| 134 |
+
num_valid += 1
|
| 135 |
+
print(f"Run {i+1}/{num_runs} completed in {dt:.2f} seconds")
|
| 136 |
+
|
| 137 |
+
if aggregate_metrics_fn:
|
| 138 |
+
metrics = aggregate_metrics_fn(all_results)
|
| 139 |
+
else:
|
| 140 |
+
metrics = {"num_successful_runs": len(all_results)}
|
| 141 |
+
|
| 142 |
+
metrics["execution_time_mean"] = float(np.mean(exec_times)) if exec_times else 0.0
|
| 143 |
+
metrics["execution_time_std"] = float(np.std(exec_times)) if exec_times else 0.0
|
| 144 |
+
if validate_fn:
|
| 145 |
+
metrics["num_valid_runs"] = num_valid
|
| 146 |
+
metrics["num_invalid_runs"] = num_invalid
|
| 147 |
+
metrics["all_validation_errors"] = all_validation_errors
|
| 148 |
+
|
| 149 |
+
except Exception as e:
|
| 150 |
+
print(f"Evaluation error: {e}")
|
| 151 |
+
defaults = (default_metrics_on_error or {}).copy()
|
| 152 |
+
metrics = {
|
| 153 |
+
"combined_score": defaults.get("combined_score", 0.0),
|
| 154 |
+
"execution_time_mean": 0.0,
|
| 155 |
+
"execution_time_std": 0.0,
|
| 156 |
+
"num_successful_runs": 0,
|
| 157 |
+
"num_valid_runs": 0,
|
| 158 |
+
"num_invalid_runs": 0,
|
| 159 |
+
"all_validation_errors": [str(e)],
|
| 160 |
+
}
|
| 161 |
+
first_error = str(e)
|
| 162 |
+
overall_correct = False
|
| 163 |
+
|
| 164 |
+
_save_json_results(results_dir, metrics, overall_correct, first_error)
|
| 165 |
+
return metrics, overall_correct, first_error
|
| 166 |
+
|
| 167 |
+
|
| 168 |
+
# ---------------------------------------------------------------------------
|
| 169 |
+
# Task-specific logic
|
| 170 |
+
# ---------------------------------------------------------------------------
|
| 171 |
+
|
| 172 |
+
|
| 173 |
+
def verify_c5_solution(
|
| 174 |
+
h_values: np.ndarray,
|
| 175 |
+
c5_achieved: float,
|
| 176 |
+
n_points: int,
|
| 177 |
+
) -> float:
|
| 178 |
+
"""Validate feasibility and C5 consistency."""
|
| 179 |
+
if not isinstance(h_values, np.ndarray):
|
| 180 |
+
h_values = np.array(h_values, dtype=np.float64)
|
| 181 |
+
|
| 182 |
+
if h_values.ndim != 1:
|
| 183 |
+
raise ValueError(f"h_values must be 1D, got shape {h_values.shape}")
|
| 184 |
+
if h_values.shape[0] != n_points:
|
| 185 |
+
raise ValueError(f"Expected h shape ({n_points},), got {h_values.shape}")
|
| 186 |
+
if not np.all(np.isfinite(h_values)):
|
| 187 |
+
raise ValueError("h_values contain NaN or inf")
|
| 188 |
+
|
| 189 |
+
if np.any(h_values < 0.0) or np.any(h_values > 1.0):
|
| 190 |
+
raise ValueError(
|
| 191 |
+
f"h_values must be in [0,1], got range [{h_values.min()}, {h_values.max()}]"
|
| 192 |
+
)
|
| 193 |
+
|
| 194 |
+
target_sum = n_points / 2.0
|
| 195 |
+
current_sum = float(np.sum(h_values))
|
| 196 |
+
if abs(current_sum - target_sum) > 1e-8:
|
| 197 |
+
# Match discover behavior: normalize if needed.
|
| 198 |
+
if current_sum <= 0.0:
|
| 199 |
+
raise ValueError("sum(h_values) must be positive")
|
| 200 |
+
h_values = h_values * (target_sum / current_sum)
|
| 201 |
+
if np.any(h_values < 0.0) or np.any(h_values > 1.0):
|
| 202 |
+
raise ValueError(
|
| 203 |
+
"After normalization, h_values fell outside [0,1]"
|
| 204 |
+
)
|
| 205 |
+
|
| 206 |
+
dx = 2.0 / n_points
|
| 207 |
+
correlation = np.correlate(h_values, 1.0 - h_values, mode="full") * dx
|
| 208 |
+
computed_c5 = float(np.max(correlation))
|
| 209 |
+
|
| 210 |
+
if not np.isfinite(computed_c5):
|
| 211 |
+
raise ValueError(f"Computed C5 is not finite: {computed_c5}")
|
| 212 |
+
|
| 213 |
+
if not np.isclose(computed_c5, float(c5_achieved), atol=1e-4):
|
| 214 |
+
raise ValueError(
|
| 215 |
+
f"C5 mismatch: reported={float(c5_achieved):.8f}, computed={computed_c5:.8f}"
|
| 216 |
+
)
|
| 217 |
+
|
| 218 |
+
return computed_c5
|
| 219 |
+
|
| 220 |
+
|
| 221 |
+
def evaluate_erdos_solution(
|
| 222 |
+
h_values: np.ndarray,
|
| 223 |
+
c5_bound: float,
|
| 224 |
+
n_points: int,
|
| 225 |
+
) -> float:
|
| 226 |
+
return verify_c5_solution(h_values, c5_bound, n_points)
|
| 227 |
+
|
| 228 |
+
|
| 229 |
+
def validate_run_output(
|
| 230 |
+
run_output: Tuple[np.ndarray, float, int],
|
| 231 |
+
) -> Tuple[bool, Optional[str]]:
|
| 232 |
+
"""Validate run() output format and numerical correctness."""
|
| 233 |
+
try:
|
| 234 |
+
if not isinstance(run_output, (tuple, list)) or len(run_output) != 3:
|
| 235 |
+
return False, "run() must return a tuple/list of (h_values, c5_bound, n_points)"
|
| 236 |
+
|
| 237 |
+
h_values, c5_bound, n_points = run_output
|
| 238 |
+
n_points = int(n_points)
|
| 239 |
+
c5_bound = float(c5_bound)
|
| 240 |
+
|
| 241 |
+
_ = evaluate_erdos_solution(h_values, c5_bound, n_points)
|
| 242 |
+
return True, None
|
| 243 |
+
except Exception as exc:
|
| 244 |
+
return False, str(exc)
|
| 245 |
+
|
| 246 |
+
|
| 247 |
+
def aggregate_erdos_metrics(
|
| 248 |
+
results: List[Tuple[np.ndarray, float, int]],
|
| 249 |
+
) -> Dict[str, Any]:
|
| 250 |
+
"""Aggregate metrics across repeated runs."""
|
| 251 |
+
if not results:
|
| 252 |
+
return {
|
| 253 |
+
"combined_score": 0.0,
|
| 254 |
+
"public": {"best_c5": None, "num_runs": 0},
|
| 255 |
+
"private": {"all_c5": []},
|
| 256 |
+
"text_feedback": "No successful runs.",
|
| 257 |
+
}
|
| 258 |
+
|
| 259 |
+
c5_values: List[float] = []
|
| 260 |
+
n_points_values: List[int] = []
|
| 261 |
+
|
| 262 |
+
for h_values, c5_bound, n_points in results:
|
| 263 |
+
c5 = evaluate_erdos_solution(h_values, float(c5_bound), int(n_points))
|
| 264 |
+
c5_values.append(float(c5))
|
| 265 |
+
n_points_values.append(int(n_points))
|
| 266 |
+
|
| 267 |
+
best_c5 = float(np.min(c5_values))
|
| 268 |
+
|
| 269 |
+
# Maximizes combined_score, so rank by minimizing best_c5.
|
| 270 |
+
combined_score = -best_c5
|
| 271 |
+
|
| 272 |
+
public = {
|
| 273 |
+
"best_c5": best_c5,
|
| 274 |
+
"n_points_mean": float(np.mean(n_points_values)),
|
| 275 |
+
"num_runs": len(results),
|
| 276 |
+
}
|
| 277 |
+
private = {
|
| 278 |
+
"all_c5": c5_values,
|
| 279 |
+
"all_n_points": n_points_values,
|
| 280 |
+
"all_h_values": [res[0].tolist() for res in results],
|
| 281 |
+
}
|
| 282 |
+
|
| 283 |
+
return {
|
| 284 |
+
"combined_score": combined_score,
|
| 285 |
+
"public": public,
|
| 286 |
+
"private": private,
|
| 287 |
+
"text_feedback": (
|
| 288 |
+
"Objective is to minimize C5. Higher combined_score means lower C5 "
|
| 289 |
+
"because combined_score = -best_c5."
|
| 290 |
+
),
|
| 291 |
+
}
|
| 292 |
+
|
| 293 |
+
|
| 294 |
+
def main_from_program(program_path: str, results_dir: str, num_experiment_runs: int = 1):
|
| 295 |
+
"""Run evaluation by executing a program file."""
|
| 296 |
+
print(f"Evaluating program: {program_path}")
|
| 297 |
+
print(f"Saving results to: {results_dir}")
|
| 298 |
+
print(f"Number of runs: {num_experiment_runs}")
|
| 299 |
+
|
| 300 |
+
metrics, correct, error = run_eval(
|
| 301 |
+
program_path=program_path,
|
| 302 |
+
results_dir=results_dir,
|
| 303 |
+
experiment_fn_name="run",
|
| 304 |
+
num_runs=num_experiment_runs,
|
| 305 |
+
validate_fn=validate_run_output,
|
| 306 |
+
aggregate_metrics_fn=aggregate_erdos_metrics,
|
| 307 |
+
)
|
| 308 |
+
|
| 309 |
+
if correct:
|
| 310 |
+
print("Evaluation completed successfully.")
|
| 311 |
+
else:
|
| 312 |
+
print(f"Evaluation failed: {error}")
|
| 313 |
+
print(f"combined_score={metrics.get('combined_score')}")
|
| 314 |
+
|
| 315 |
+
|
| 316 |
+
def main_from_result(result_path: str, results_dir: str):
|
| 317 |
+
"""Validate and score a pre-computed result.json."""
|
| 318 |
+
print(f"Evaluating result file: {result_path}")
|
| 319 |
+
print(f"Saving results to: {results_dir}")
|
| 320 |
+
|
| 321 |
+
with open(result_path) as f:
|
| 322 |
+
data = json.load(f)
|
| 323 |
+
|
| 324 |
+
h_values = np.array(data["h_values"], dtype=np.float64)
|
| 325 |
+
c5_bound = float(data["c5_bound"])
|
| 326 |
+
n_points = int(data["n_points"])
|
| 327 |
+
run_output = (h_values, c5_bound, n_points)
|
| 328 |
+
|
| 329 |
+
is_valid, verr = validate_run_output(run_output)
|
| 330 |
+
if is_valid:
|
| 331 |
+
metrics = aggregate_erdos_metrics([run_output])
|
| 332 |
+
print("Validation passed.")
|
| 333 |
+
else:
|
| 334 |
+
metrics = {"combined_score": 0.0}
|
| 335 |
+
print(f"Validation failed: {verr}")
|
| 336 |
+
|
| 337 |
+
_save_json_results(results_dir, metrics, is_valid, verr)
|
| 338 |
+
print(f"combined_score={metrics.get('combined_score')}")
|
| 339 |
+
|
| 340 |
+
|
| 341 |
+
if __name__ == "__main__":
|
| 342 |
+
parser = argparse.ArgumentParser(
|
| 343 |
+
description="Evaluate Erdos minimum overlap task"
|
| 344 |
+
)
|
| 345 |
+
parser.add_argument(
|
| 346 |
+
"--program_path",
|
| 347 |
+
type=str,
|
| 348 |
+
default="initial.py",
|
| 349 |
+
)
|
| 350 |
+
parser.add_argument(
|
| 351 |
+
"--results_dir",
|
| 352 |
+
type=str,
|
| 353 |
+
default="results",
|
| 354 |
+
)
|
| 355 |
+
parser.add_argument(
|
| 356 |
+
"--num_experiment_runs",
|
| 357 |
+
type=int,
|
| 358 |
+
default=1,
|
| 359 |
+
)
|
| 360 |
+
parser.add_argument(
|
| 361 |
+
"--from-result",
|
| 362 |
+
type=str,
|
| 363 |
+
default=None,
|
| 364 |
+
help="Path to a result.json file to validate directly (skip program execution)",
|
| 365 |
+
)
|
| 366 |
+
args = parser.parse_args()
|
| 367 |
+
if args.from_result:
|
| 368 |
+
main_from_result(args.from_result, args.results_dir)
|
| 369 |
+
else:
|
| 370 |
+
main_from_program(
|
| 371 |
+
program_path=args.program_path,
|
| 372 |
+
results_dir=args.results_dir,
|
| 373 |
+
num_experiment_runs=args.num_experiment_runs,
|
| 374 |
+
)
|
ccevolve/blog/coding_agents_are_auto_evolvers/tasks/erdos_min_overlap/initial.py
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# EVOLVE-BLOCK-START
|
| 2 |
+
"""Initial construction for the Erdos minimum overlap task."""
|
| 3 |
+
|
| 4 |
+
import time
|
| 5 |
+
import numpy as np
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
def _project_to_feasible(h_values: np.ndarray) -> np.ndarray:
|
| 9 |
+
"""Project h onto [0,1]^n with sum(h)=n/2."""
|
| 10 |
+
h = np.asarray(h_values, dtype=np.float64).copy()
|
| 11 |
+
n_points = h.size
|
| 12 |
+
target_sum = n_points / 2.0
|
| 13 |
+
|
| 14 |
+
h = np.clip(h, 0.0, 1.0)
|
| 15 |
+
current_sum = float(np.sum(h))
|
| 16 |
+
if current_sum <= 1e-12:
|
| 17 |
+
return np.full(n_points, 0.5, dtype=np.float64)
|
| 18 |
+
|
| 19 |
+
h *= target_sum / current_sum
|
| 20 |
+
|
| 21 |
+
# Iteratively fix clipping violations while preserving the target sum.
|
| 22 |
+
for _ in range(12):
|
| 23 |
+
h = np.clip(h, 0.0, 1.0)
|
| 24 |
+
delta = target_sum - float(np.sum(h))
|
| 25 |
+
if abs(delta) < 1e-10:
|
| 26 |
+
break
|
| 27 |
+
free = (h > 1e-12) & (h < 1.0 - 1e-12)
|
| 28 |
+
if not np.any(free):
|
| 29 |
+
break
|
| 30 |
+
h[free] += delta / float(np.sum(free))
|
| 31 |
+
|
| 32 |
+
h = np.clip(h, 0.0, 1.0)
|
| 33 |
+
# Final correction (numerical): distribute tiny residual to non-saturated indices.
|
| 34 |
+
residual = target_sum - float(np.sum(h))
|
| 35 |
+
if abs(residual) > 1e-9:
|
| 36 |
+
free = (h > 1e-12) & (h < 1.0 - 1e-12)
|
| 37 |
+
if np.any(free):
|
| 38 |
+
h[free] += residual / float(np.sum(free))
|
| 39 |
+
h = np.clip(h, 0.0, 1.0)
|
| 40 |
+
return h
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
def _compute_c5(h_values: np.ndarray) -> float:
|
| 44 |
+
n_points = h_values.size
|
| 45 |
+
dx = 2.0 / n_points
|
| 46 |
+
overlap = np.correlate(h_values, 1.0 - h_values, mode="full") * dx
|
| 47 |
+
return float(np.max(overlap))
|
| 48 |
+
|
| 49 |
+
|
| 50 |
+
def run(seed: int = 42, budget_s: float = 10.0, **kwargs):
|
| 51 |
+
"""
|
| 52 |
+
Return (h_values, c5_bound, n_points) for Erdos minimum overlap.
|
| 53 |
+
|
| 54 |
+
Lower c5_bound is better.
|
| 55 |
+
"""
|
| 56 |
+
del kwargs
|
| 57 |
+
|
| 58 |
+
start = time.time()
|
| 59 |
+
rng = np.random.default_rng(seed)
|
| 60 |
+
n_points = 400
|
| 61 |
+
|
| 62 |
+
x = np.linspace(0.0, 2.0, n_points, endpoint=False)
|
| 63 |
+
base = 0.5 + 0.18 * np.sin(2.0 * np.pi * x / 2.0) - 0.10 * np.sin(
|
| 64 |
+
6.0 * np.pi * x / 2.0
|
| 65 |
+
)
|
| 66 |
+
best_h = _project_to_feasible(base)
|
| 67 |
+
best_c5 = _compute_c5(best_h)
|
| 68 |
+
|
| 69 |
+
# Lightweight randomized local search.
|
| 70 |
+
while time.time() - start < max(0.1, 0.95 * budget_s):
|
| 71 |
+
candidate = best_h.copy()
|
| 72 |
+
block_size = int(rng.integers(8, 40))
|
| 73 |
+
idx = rng.choice(n_points, size=block_size, replace=False)
|
| 74 |
+
candidate[idx] += rng.normal(0.0, 0.06, size=block_size)
|
| 75 |
+
candidate = _project_to_feasible(candidate)
|
| 76 |
+
candidate_c5 = _compute_c5(candidate)
|
| 77 |
+
if candidate_c5 < best_c5:
|
| 78 |
+
best_h = candidate
|
| 79 |
+
best_c5 = candidate_c5
|
| 80 |
+
|
| 81 |
+
return best_h, float(best_c5), int(n_points)
|
| 82 |
+
|
| 83 |
+
|
| 84 |
+
# EVOLVE-BLOCK-END
|
ccevolve/blog/coding_agents_are_auto_evolvers/tasks/erdos_min_overlap/prompt.py
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Task-specific system prompt for Erdos minimum overlap."""
|
| 2 |
+
|
| 3 |
+
TASK_SYS_MSG = """You are an expert in harmonic analysis, numerical optimization,
|
| 4 |
+
and mathematical discovery.
|
| 5 |
+
|
| 6 |
+
Target: find h:[0,2]->[0,1] minimizing
|
| 7 |
+
C5 = max_k integral h(x) * (1 - h(x+k)) dx
|
| 8 |
+
|
| 9 |
+
Discretization convention:
|
| 10 |
+
- represent h by n_points samples on [0,2)
|
| 11 |
+
- enforce 0 <= h[i] <= 1
|
| 12 |
+
- enforce sum(h) == n_points / 2 (equiv. integral of h is 1)
|
| 13 |
+
- objective in evaluator is lower C5 is better
|
| 14 |
+
|
| 15 |
+
Your run() function must return:
|
| 16 |
+
(h_values, c5_bound, n_points)
|
| 17 |
+
|
| 18 |
+
Guidance:
|
| 19 |
+
- Keep runtime under budget_s in run()
|
| 20 |
+
- Prefer stable numerical procedures and valid outputs over aggressive but brittle search
|
| 21 |
+
- Return the best feasible solution found within time budget
|
| 22 |
+
- Smaller n_points (<1000) is preferred for speed
|
| 23 |
+
"""
|
| 24 |
+
|
ccevolve/blog/ideas.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Coding agents are autonomous evolvers
|
| 2 |
+
|
| 3 |
+
Self-evolving agents are xxx (AutoEvolve)
|
| 4 |
+
|
| 5 |
+
## What we found
|
| 6 |
+
|
| 7 |
+
Coding agents show naturally self-evolving abilities
|
| 8 |
+
Well-defined metrics, requires no intervention inputs
|
| 9 |
+
No explicit design is required
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
| | Genetic algo | Memory management | multi-agent | Training-free | Cost |
|
| 14 |
+
| ---------------- | ------------ | ----------------- | ----------- | ------------- | ---- |
|
| 15 |
+
| **AlphaEvolve** | y | x | x | y | |
|
| 16 |
+
| **ThetaEvolve** | y | x | x | x | |
|
| 17 |
+
| **TTT-Discover** | y | x | x | x | |
|
| 18 |
+
| **AutoEvolve** | y | y | y | y | |
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
## What we did
|
| 22 |
+
Provide problem description, initial solution, evaluation
|
| 23 |
+
We use Claude Code
|
| 24 |
+
Laziness/self-satisfaction prompting: whenever the agent is satisfied with the results, we prompt the agent to work harder, such as telling it the competitor has reached even higher score on this
|
| 25 |
+
|
| 26 |
+
## What AutoEvolve did
|
| 27 |
+
Long horizon task execution
|
| 28 |
+
Reward hacking (Web search, search algo): it tries to find the optimal solution from online
|
| 29 |
+
Strategy: it first tries to tackle the problem by changing differnt methods, then when the solution appears to be plateauing, it issues several parallel execution to try differnt optimzation methods. (which is trying to provide a little gain)
|
| 30 |
+
|
| 31 |
+
## Agent behavior analysis
|
| 32 |
+
|
| 33 |
+
### circle packing
|
| 34 |
+
|
| 35 |
+
It has websearches, but it doesn’t cheat by copying the results. It fails to search for the optimal solution at msg 37, and then just keeps thinking on its own.
|
| 36 |
+
Later at msg 186, it searches again for openevolve. But its performance already surpassed the one in openevolve.
|
| 37 |
+
After the competitor prompt, it works on more focused optimization (evidenced by v8 at the end, tried multiple optimization methods, including non-linear optims)
|
| 38 |
+
At the beginning, it was doing single-thread optimizationl. At later stage, it executes multiple parallel explorations.
|
ccevolve/blog/plot_score_progression.py
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import matplotlib.pyplot as plt
|
| 2 |
+
import matplotlib.ticker as ticker
|
| 3 |
+
import numpy as np
|
| 4 |
+
|
| 5 |
+
# --- Data ---
|
| 6 |
+
phases = [
|
| 7 |
+
"Naive ring\narrangement",
|
| 8 |
+
"LP + simulated\nannealing",
|
| 9 |
+
"Multi-start\noptimization",
|
| 10 |
+
"SLSQP joint\noptimization",
|
| 11 |
+
"Iterated\nperturbation",
|
| 12 |
+
]
|
| 13 |
+
scores = [0.96, 2.50, 2.555, 2.619, 2.63598844]
|
| 14 |
+
x = np.arange(len(phases))
|
| 15 |
+
SOTA = 2.63598308
|
| 16 |
+
|
| 17 |
+
# --- Style Config (matching blog CSS variables) ---
|
| 18 |
+
color_main = "#4a6fa5" # --accent
|
| 19 |
+
color_sota = "#c0392b" # warm red
|
| 20 |
+
color_text = "#1a1a2e" # --bold-num
|
| 21 |
+
color_secondary = "#555" # --text-secondary
|
| 22 |
+
color_bg = "#fafaf7" # --bg
|
| 23 |
+
color_border = "#e0ddd8" # --border
|
| 24 |
+
color_green = "#1a7f37" # blog green for breakthrough
|
| 25 |
+
|
| 26 |
+
plt.rcParams["font.family"] = "sans-serif"
|
| 27 |
+
plt.rcParams["font.sans-serif"] = ["Lato", "Helvetica", "Arial"]
|
| 28 |
+
|
| 29 |
+
# 更紧凑的画布比例
|
| 30 |
+
fig, ax = plt.subplots(figsize=(10, 5.5))
|
| 31 |
+
fig.patch.set_facecolor(color_bg)
|
| 32 |
+
ax.set_facecolor(color_bg)
|
| 33 |
+
|
| 34 |
+
# 1. Background & Area
|
| 35 |
+
ax.fill_between(x, scores, color=color_main, alpha=0.06, zorder=1)
|
| 36 |
+
ax.yaxis.set_major_locator(ticker.MultipleLocator(0.5))
|
| 37 |
+
ax.grid(axis="y", color=color_border, linestyle="-", linewidth=0.8, alpha=0.6, zorder=0)
|
| 38 |
+
|
| 39 |
+
# 2. SOTA Reference
|
| 40 |
+
ax.axhline(y=SOTA, color=color_sota, linestyle="--", linewidth=1.2, alpha=0.45, zorder=2)
|
| 41 |
+
ax.text(-0.35, SOTA + 0.015, f"PREVIOUS SOTA: {SOTA:.8f}",
|
| 42 |
+
fontsize=11, color=color_sota, fontweight="bold", va="bottom")
|
| 43 |
+
|
| 44 |
+
# 3. The Line
|
| 45 |
+
ax.plot(x, scores, color=color_main, linewidth=3.5, zorder=3, alpha=0.85)
|
| 46 |
+
|
| 47 |
+
# 4. Points & Score Labels
|
| 48 |
+
for i, score in enumerate(scores):
|
| 49 |
+
is_breakthrough = score > SOTA
|
| 50 |
+
is_last = (i == len(scores) - 1)
|
| 51 |
+
|
| 52 |
+
m_color = color_green if is_breakthrough else color_main
|
| 53 |
+
ax.scatter(x[i], score, color=m_color, s=280, zorder=4, alpha=0.12)
|
| 54 |
+
ax.scatter(x[i], score, color=m_color, s=90, zorder=5, edgecolors=color_bg, linewidths=1.5)
|
| 55 |
+
|
| 56 |
+
label = f"{score:.8f}" if is_last else f"{score:.3f}"
|
| 57 |
+
|
| 58 |
+
y_offset = 0.06 if is_last else 0.05
|
| 59 |
+
ax.text(x[i], score + y_offset, label, ha="center", va="bottom",
|
| 60 |
+
fontsize=14 if not is_last else 16,
|
| 61 |
+
fontweight="bold", color=m_color, zorder=6)
|
| 62 |
+
|
| 63 |
+
# 5. Staggered Annotations
|
| 64 |
+
box_style_default = dict(boxstyle="round,pad=0.4", fc=color_bg, ec=color_border, alpha=0.95)
|
| 65 |
+
box_style_highlight = dict(boxstyle="round,pad=0.4", fc="#dafbe1", ec=color_green, alpha=1)
|
| 66 |
+
|
| 67 |
+
# 三个注释框都放在曲线下方,y 位置逐渐升高避免重叠
|
| 68 |
+
ax.annotate(
|
| 69 |
+
"Agent reads ArXiv paper,\nswitches to LP formulation",
|
| 70 |
+
xy=(x[1], scores[1]), xytext=(x[1], 1.35),
|
| 71 |
+
fontsize=13, color=color_secondary, ha="center",
|
| 72 |
+
arrowprops=dict(arrowstyle="->", color="#999", lw=1.2, connectionstyle="arc3,rad=0.1"),
|
| 73 |
+
bbox=box_style_default, zorder=7
|
| 74 |
+
)
|
| 75 |
+
|
| 76 |
+
ax.annotate(
|
| 77 |
+
"SLSQP breakthrough:\njoint radius + position opt.",
|
| 78 |
+
xy=(x[3], scores[3]), xytext=(x[3], 1.65),
|
| 79 |
+
fontsize=13, color=color_secondary, ha="center",
|
| 80 |
+
arrowprops=dict(arrowstyle="->", color="#999", lw=1.2, connectionstyle="arc3,rad=0.1"),
|
| 81 |
+
bbox=box_style_default, zorder=7
|
| 82 |
+
)
|
| 83 |
+
|
| 84 |
+
ax.annotate(
|
| 85 |
+
"Parallel perturbation\nchains surpass SOTA",
|
| 86 |
+
xy=(x[4], scores[4]), xytext=(x[4], 1.95),
|
| 87 |
+
fontsize=13, color=color_green, ha="center", fontweight="bold",
|
| 88 |
+
arrowprops=dict(arrowstyle="->", color=color_green, lw=1.5, connectionstyle="arc3,rad=0.1"),
|
| 89 |
+
bbox=box_style_highlight, zorder=7
|
| 90 |
+
)
|
| 91 |
+
|
| 92 |
+
# --- Final Layout ---
|
| 93 |
+
ax.set_xticks(x)
|
| 94 |
+
ax.set_xticklabels(phases, fontsize=13, color=color_secondary, fontweight="medium")
|
| 95 |
+
ax.set_ylabel("Score (Sum of Radii)", fontsize=13, color=color_secondary, labelpad=10)
|
| 96 |
+
|
| 97 |
+
ax.set_title("Circle Packing Score Progression (26 circles in unit square)",
|
| 98 |
+
fontsize=19, fontweight="bold", color=color_text, pad=16)
|
| 99 |
+
|
| 100 |
+
for spine in ["top", "right", "left"]:
|
| 101 |
+
ax.spines[spine].set_visible(False)
|
| 102 |
+
ax.spines["bottom"].set_color(color_border)
|
| 103 |
+
|
| 104 |
+
# 收紧 Y 轴范围,减少空白
|
| 105 |
+
ax.set_ylim(0.75, 2.95)
|
| 106 |
+
ax.set_xlim(-0.4, len(phases) - 0.2)
|
| 107 |
+
|
| 108 |
+
plt.tight_layout()
|
| 109 |
+
|
| 110 |
+
# Save high-res to publish directory
|
| 111 |
+
output_path = "/home/tengxiao/pj/ShinkaEvolve/ccevolve/blog/publish/score_progression.png"
|
| 112 |
+
plt.savefig(output_path, dpi=300, bbox_inches="tight", facecolor=color_bg)
|
| 113 |
+
print(f"Saved to {output_path}")
|
| 114 |
+
plt.show()
|
ccevolve/blog/publish/.venv/.gitignore
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Created by venv; see https://docs.python.org/3/library/venv.html
|
| 2 |
+
*
|
ccevolve/blog/publish/.venv/bin/Activate.ps1
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<#
|
| 2 |
+
.Synopsis
|
| 3 |
+
Activate a Python virtual environment for the current PowerShell session.
|
| 4 |
+
|
| 5 |
+
.Description
|
| 6 |
+
Pushes the python executable for a virtual environment to the front of the
|
| 7 |
+
$Env:PATH environment variable and sets the prompt to signify that you are
|
| 8 |
+
in a Python virtual environment. Makes use of the command line switches as
|
| 9 |
+
well as the `pyvenv.cfg` file values present in the virtual environment.
|
| 10 |
+
|
| 11 |
+
.Parameter VenvDir
|
| 12 |
+
Path to the directory that contains the virtual environment to activate. The
|
| 13 |
+
default value for this is the parent of the directory that the Activate.ps1
|
| 14 |
+
script is located within.
|
| 15 |
+
|
| 16 |
+
.Parameter Prompt
|
| 17 |
+
The prompt prefix to display when this virtual environment is activated. By
|
| 18 |
+
default, this prompt is the name of the virtual environment folder (VenvDir)
|
| 19 |
+
surrounded by parentheses and followed by a single space (ie. '(.venv) ').
|
| 20 |
+
|
| 21 |
+
.Example
|
| 22 |
+
Activate.ps1
|
| 23 |
+
Activates the Python virtual environment that contains the Activate.ps1 script.
|
| 24 |
+
|
| 25 |
+
.Example
|
| 26 |
+
Activate.ps1 -Verbose
|
| 27 |
+
Activates the Python virtual environment that contains the Activate.ps1 script,
|
| 28 |
+
and shows extra information about the activation as it executes.
|
| 29 |
+
|
| 30 |
+
.Example
|
| 31 |
+
Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
|
| 32 |
+
Activates the Python virtual environment located in the specified location.
|
| 33 |
+
|
| 34 |
+
.Example
|
| 35 |
+
Activate.ps1 -Prompt "MyPython"
|
| 36 |
+
Activates the Python virtual environment that contains the Activate.ps1 script,
|
| 37 |
+
and prefixes the current prompt with the specified string (surrounded in
|
| 38 |
+
parentheses) while the virtual environment is active.
|
| 39 |
+
|
| 40 |
+
.Notes
|
| 41 |
+
On Windows, it may be required to enable this Activate.ps1 script by setting the
|
| 42 |
+
execution policy for the user. You can do this by issuing the following PowerShell
|
| 43 |
+
command:
|
| 44 |
+
|
| 45 |
+
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
| 46 |
+
|
| 47 |
+
For more information on Execution Policies:
|
| 48 |
+
https://go.microsoft.com/fwlink/?LinkID=135170
|
| 49 |
+
|
| 50 |
+
#>
|
| 51 |
+
Param(
|
| 52 |
+
[Parameter(Mandatory = $false)]
|
| 53 |
+
[String]
|
| 54 |
+
$VenvDir,
|
| 55 |
+
[Parameter(Mandatory = $false)]
|
| 56 |
+
[String]
|
| 57 |
+
$Prompt
|
| 58 |
+
)
|
| 59 |
+
|
| 60 |
+
<# Function declarations --------------------------------------------------- #>
|
| 61 |
+
|
| 62 |
+
<#
|
| 63 |
+
.Synopsis
|
| 64 |
+
Remove all shell session elements added by the Activate script, including the
|
| 65 |
+
addition of the virtual environment's Python executable from the beginning of
|
| 66 |
+
the PATH variable.
|
| 67 |
+
|
| 68 |
+
.Parameter NonDestructive
|
| 69 |
+
If present, do not remove this function from the global namespace for the
|
| 70 |
+
session.
|
| 71 |
+
|
| 72 |
+
#>
|
| 73 |
+
function global:deactivate ([switch]$NonDestructive) {
|
| 74 |
+
# Revert to original values
|
| 75 |
+
|
| 76 |
+
# The prior prompt:
|
| 77 |
+
if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
|
| 78 |
+
Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
|
| 79 |
+
Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
|
| 80 |
+
}
|
| 81 |
+
|
| 82 |
+
# The prior PYTHONHOME:
|
| 83 |
+
if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
|
| 84 |
+
Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
|
| 85 |
+
Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
|
| 86 |
+
}
|
| 87 |
+
|
| 88 |
+
# The prior PATH:
|
| 89 |
+
if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
|
| 90 |
+
Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
|
| 91 |
+
Remove-Item -Path Env:_OLD_VIRTUAL_PATH
|
| 92 |
+
}
|
| 93 |
+
|
| 94 |
+
# Just remove the VIRTUAL_ENV altogether:
|
| 95 |
+
if (Test-Path -Path Env:VIRTUAL_ENV) {
|
| 96 |
+
Remove-Item -Path env:VIRTUAL_ENV
|
| 97 |
+
}
|
| 98 |
+
|
| 99 |
+
# Just remove VIRTUAL_ENV_PROMPT altogether.
|
| 100 |
+
if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) {
|
| 101 |
+
Remove-Item -Path env:VIRTUAL_ENV_PROMPT
|
| 102 |
+
}
|
| 103 |
+
|
| 104 |
+
# Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
|
| 105 |
+
if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
|
| 106 |
+
Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
|
| 107 |
+
}
|
| 108 |
+
|
| 109 |
+
# Leave deactivate function in the global namespace if requested:
|
| 110 |
+
if (-not $NonDestructive) {
|
| 111 |
+
Remove-Item -Path function:deactivate
|
| 112 |
+
}
|
| 113 |
+
}
|
| 114 |
+
|
| 115 |
+
<#
|
| 116 |
+
.Description
|
| 117 |
+
Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
|
| 118 |
+
given folder, and returns them in a map.
|
| 119 |
+
|
| 120 |
+
For each line in the pyvenv.cfg file, if that line can be parsed into exactly
|
| 121 |
+
two strings separated by `=` (with any amount of whitespace surrounding the =)
|
| 122 |
+
then it is considered a `key = value` line. The left hand string is the key,
|
| 123 |
+
the right hand is the value.
|
| 124 |
+
|
| 125 |
+
If the value starts with a `'` or a `"` then the first and last character is
|
| 126 |
+
stripped from the value before being captured.
|
| 127 |
+
|
| 128 |
+
.Parameter ConfigDir
|
| 129 |
+
Path to the directory that contains the `pyvenv.cfg` file.
|
| 130 |
+
#>
|
| 131 |
+
function Get-PyVenvConfig(
|
| 132 |
+
[String]
|
| 133 |
+
$ConfigDir
|
| 134 |
+
) {
|
| 135 |
+
Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
|
| 136 |
+
|
| 137 |
+
# Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
|
| 138 |
+
$pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
|
| 139 |
+
|
| 140 |
+
# An empty map will be returned if no config file is found.
|
| 141 |
+
$pyvenvConfig = @{ }
|
| 142 |
+
|
| 143 |
+
if ($pyvenvConfigPath) {
|
| 144 |
+
|
| 145 |
+
Write-Verbose "File exists, parse `key = value` lines"
|
| 146 |
+
$pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
|
| 147 |
+
|
| 148 |
+
$pyvenvConfigContent | ForEach-Object {
|
| 149 |
+
$keyval = $PSItem -split "\s*=\s*", 2
|
| 150 |
+
if ($keyval[0] -and $keyval[1]) {
|
| 151 |
+
$val = $keyval[1]
|
| 152 |
+
|
| 153 |
+
# Remove extraneous quotations around a string value.
|
| 154 |
+
if ("'""".Contains($val.Substring(0, 1))) {
|
| 155 |
+
$val = $val.Substring(1, $val.Length - 2)
|
| 156 |
+
}
|
| 157 |
+
|
| 158 |
+
$pyvenvConfig[$keyval[0]] = $val
|
| 159 |
+
Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
|
| 160 |
+
}
|
| 161 |
+
}
|
| 162 |
+
}
|
| 163 |
+
return $pyvenvConfig
|
| 164 |
+
}
|
| 165 |
+
|
| 166 |
+
|
| 167 |
+
<# Begin Activate script --------------------------------------------------- #>
|
| 168 |
+
|
| 169 |
+
# Determine the containing directory of this script
|
| 170 |
+
$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
|
| 171 |
+
$VenvExecDir = Get-Item -Path $VenvExecPath
|
| 172 |
+
|
| 173 |
+
Write-Verbose "Activation script is located in path: '$VenvExecPath'"
|
| 174 |
+
Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
|
| 175 |
+
Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
|
| 176 |
+
|
| 177 |
+
# Set values required in priority: CmdLine, ConfigFile, Default
|
| 178 |
+
# First, get the location of the virtual environment, it might not be
|
| 179 |
+
# VenvExecDir if specified on the command line.
|
| 180 |
+
if ($VenvDir) {
|
| 181 |
+
Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
|
| 182 |
+
}
|
| 183 |
+
else {
|
| 184 |
+
Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
|
| 185 |
+
$VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
|
| 186 |
+
Write-Verbose "VenvDir=$VenvDir"
|
| 187 |
+
}
|
| 188 |
+
|
| 189 |
+
# Next, read the `pyvenv.cfg` file to determine any required value such
|
| 190 |
+
# as `prompt`.
|
| 191 |
+
$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
|
| 192 |
+
|
| 193 |
+
# Next, set the prompt from the command line, or the config file, or
|
| 194 |
+
# just use the name of the virtual environment folder.
|
| 195 |
+
if ($Prompt) {
|
| 196 |
+
Write-Verbose "Prompt specified as argument, using '$Prompt'"
|
| 197 |
+
}
|
| 198 |
+
else {
|
| 199 |
+
Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
|
| 200 |
+
if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
|
| 201 |
+
Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
|
| 202 |
+
$Prompt = $pyvenvCfg['prompt'];
|
| 203 |
+
}
|
| 204 |
+
else {
|
| 205 |
+
Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)"
|
| 206 |
+
Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
|
| 207 |
+
$Prompt = Split-Path -Path $venvDir -Leaf
|
| 208 |
+
}
|
| 209 |
+
}
|
| 210 |
+
|
| 211 |
+
Write-Verbose "Prompt = '$Prompt'"
|
| 212 |
+
Write-Verbose "VenvDir='$VenvDir'"
|
| 213 |
+
|
| 214 |
+
# Deactivate any currently active virtual environment, but leave the
|
| 215 |
+
# deactivate function in place.
|
| 216 |
+
deactivate -nondestructive
|
| 217 |
+
|
| 218 |
+
# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
|
| 219 |
+
# that there is an activated venv.
|
| 220 |
+
$env:VIRTUAL_ENV = $VenvDir
|
| 221 |
+
|
| 222 |
+
$env:VIRTUAL_ENV_PROMPT = $Prompt
|
| 223 |
+
|
| 224 |
+
if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
|
| 225 |
+
|
| 226 |
+
Write-Verbose "Setting prompt to '$Prompt'"
|
| 227 |
+
|
| 228 |
+
# Set the prompt to include the env name
|
| 229 |
+
# Make sure _OLD_VIRTUAL_PROMPT is global
|
| 230 |
+
function global:_OLD_VIRTUAL_PROMPT { "" }
|
| 231 |
+
Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
|
| 232 |
+
New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
|
| 233 |
+
|
| 234 |
+
function global:prompt {
|
| 235 |
+
Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
|
| 236 |
+
_OLD_VIRTUAL_PROMPT
|
| 237 |
+
}
|
| 238 |
+
}
|
| 239 |
+
|
| 240 |
+
# Clear PYTHONHOME
|
| 241 |
+
if (Test-Path -Path Env:PYTHONHOME) {
|
| 242 |
+
Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
|
| 243 |
+
Remove-Item -Path Env:PYTHONHOME
|
| 244 |
+
}
|
| 245 |
+
|
| 246 |
+
# Add the venv to the PATH
|
| 247 |
+
Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
|
| 248 |
+
$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
|
ccevolve/blog/publish/.venv/bin/activate
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# This file must be used with "source bin/activate" *from bash*
|
| 2 |
+
# You cannot run it directly
|
| 3 |
+
|
| 4 |
+
deactivate () {
|
| 5 |
+
# reset old environment variables
|
| 6 |
+
if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
|
| 7 |
+
PATH="${_OLD_VIRTUAL_PATH:-}"
|
| 8 |
+
export PATH
|
| 9 |
+
unset _OLD_VIRTUAL_PATH
|
| 10 |
+
fi
|
| 11 |
+
if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
|
| 12 |
+
PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
|
| 13 |
+
export PYTHONHOME
|
| 14 |
+
unset _OLD_VIRTUAL_PYTHONHOME
|
| 15 |
+
fi
|
| 16 |
+
|
| 17 |
+
# Call hash to forget past locations. Without forgetting
|
| 18 |
+
# past locations the $PATH changes we made may not be respected.
|
| 19 |
+
# See "man bash" for more details. hash is usually a builtin of your shell
|
| 20 |
+
hash -r 2> /dev/null
|
| 21 |
+
|
| 22 |
+
if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
|
| 23 |
+
PS1="${_OLD_VIRTUAL_PS1:-}"
|
| 24 |
+
export PS1
|
| 25 |
+
unset _OLD_VIRTUAL_PS1
|
| 26 |
+
fi
|
| 27 |
+
|
| 28 |
+
unset VIRTUAL_ENV
|
| 29 |
+
unset VIRTUAL_ENV_PROMPT
|
| 30 |
+
if [ ! "${1:-}" = "nondestructive" ] ; then
|
| 31 |
+
# Self destruct!
|
| 32 |
+
unset -f deactivate
|
| 33 |
+
fi
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
# unset irrelevant variables
|
| 37 |
+
deactivate nondestructive
|
| 38 |
+
|
| 39 |
+
# on Windows, a path can contain colons and backslashes and has to be converted:
|
| 40 |
+
case "$(uname)" in
|
| 41 |
+
CYGWIN*|MSYS*|MINGW*)
|
| 42 |
+
# transform D:\path\to\venv to /d/path/to/venv on MSYS and MINGW
|
| 43 |
+
# and to /cygdrive/d/path/to/venv on Cygwin
|
| 44 |
+
VIRTUAL_ENV=$(cygpath /home/tengxiao/pj/ShinkaEvolve/ccevolve/blog/publish/.venv)
|
| 45 |
+
export VIRTUAL_ENV
|
| 46 |
+
;;
|
| 47 |
+
*)
|
| 48 |
+
# use the path as-is
|
| 49 |
+
export VIRTUAL_ENV=/home/tengxiao/pj/ShinkaEvolve/ccevolve/blog/publish/.venv
|
| 50 |
+
;;
|
| 51 |
+
esac
|
| 52 |
+
|
| 53 |
+
_OLD_VIRTUAL_PATH="$PATH"
|
| 54 |
+
PATH="$VIRTUAL_ENV/"bin":$PATH"
|
| 55 |
+
export PATH
|
| 56 |
+
|
| 57 |
+
VIRTUAL_ENV_PROMPT=.venv
|
| 58 |
+
export VIRTUAL_ENV_PROMPT
|
| 59 |
+
|
| 60 |
+
# unset PYTHONHOME if set
|
| 61 |
+
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
|
| 62 |
+
# could use `if (set -u; : $PYTHONHOME) ;` in bash
|
| 63 |
+
if [ -n "${PYTHONHOME:-}" ] ; then
|
| 64 |
+
_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
|
| 65 |
+
unset PYTHONHOME
|
| 66 |
+
fi
|
| 67 |
+
|
| 68 |
+
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
|
| 69 |
+
_OLD_VIRTUAL_PS1="${PS1:-}"
|
| 70 |
+
PS1="(".venv") ${PS1:-}"
|
| 71 |
+
export PS1
|
| 72 |
+
fi
|
| 73 |
+
|
| 74 |
+
# Call hash to forget past commands. Without forgetting
|
| 75 |
+
# past commands the $PATH changes we made may not be respected
|
| 76 |
+
hash -r 2> /dev/null
|
ccevolve/blog/publish/.venv/bin/activate.csh
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# This file must be used with "source bin/activate.csh" *from csh*.
|
| 2 |
+
# You cannot run it directly.
|
| 3 |
+
|
| 4 |
+
# Created by Davide Di Blasi <davidedb@gmail.com>.
|
| 5 |
+
# Ported to Python 3.3 venv by Andrew Svetlov <andrew.svetlov@gmail.com>
|
| 6 |
+
|
| 7 |
+
alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate'
|
| 8 |
+
|
| 9 |
+
# Unset irrelevant variables.
|
| 10 |
+
deactivate nondestructive
|
| 11 |
+
|
| 12 |
+
setenv VIRTUAL_ENV /home/tengxiao/pj/ShinkaEvolve/ccevolve/blog/publish/.venv
|
| 13 |
+
|
| 14 |
+
set _OLD_VIRTUAL_PATH="$PATH"
|
| 15 |
+
setenv PATH "$VIRTUAL_ENV/"bin":$PATH"
|
| 16 |
+
setenv VIRTUAL_ENV_PROMPT .venv
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
set _OLD_VIRTUAL_PROMPT="$prompt"
|
| 20 |
+
|
| 21 |
+
if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
|
| 22 |
+
set prompt = "(".venv") $prompt:q"
|
| 23 |
+
endif
|
| 24 |
+
|
| 25 |
+
alias pydoc python -m pydoc
|
| 26 |
+
|
| 27 |
+
rehash
|
ccevolve/blog/publish/.venv/bin/activate.fish
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# This file must be used with "source <venv>/bin/activate.fish" *from fish*
|
| 2 |
+
# (https://fishshell.com/). You cannot run it directly.
|
| 3 |
+
|
| 4 |
+
function deactivate -d "Exit virtual environment and return to normal shell environment"
|
| 5 |
+
# reset old environment variables
|
| 6 |
+
if test -n "$_OLD_VIRTUAL_PATH"
|
| 7 |
+
set -gx PATH $_OLD_VIRTUAL_PATH
|
| 8 |
+
set -e _OLD_VIRTUAL_PATH
|
| 9 |
+
end
|
| 10 |
+
if test -n "$_OLD_VIRTUAL_PYTHONHOME"
|
| 11 |
+
set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
|
| 12 |
+
set -e _OLD_VIRTUAL_PYTHONHOME
|
| 13 |
+
end
|
| 14 |
+
|
| 15 |
+
if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
|
| 16 |
+
set -e _OLD_FISH_PROMPT_OVERRIDE
|
| 17 |
+
# prevents error when using nested fish instances (Issue #93858)
|
| 18 |
+
if functions -q _old_fish_prompt
|
| 19 |
+
functions -e fish_prompt
|
| 20 |
+
functions -c _old_fish_prompt fish_prompt
|
| 21 |
+
functions -e _old_fish_prompt
|
| 22 |
+
end
|
| 23 |
+
end
|
| 24 |
+
|
| 25 |
+
set -e VIRTUAL_ENV
|
| 26 |
+
set -e VIRTUAL_ENV_PROMPT
|
| 27 |
+
if test "$argv[1]" != "nondestructive"
|
| 28 |
+
# Self-destruct!
|
| 29 |
+
functions -e deactivate
|
| 30 |
+
end
|
| 31 |
+
end
|
| 32 |
+
|
| 33 |
+
# Unset irrelevant variables.
|
| 34 |
+
deactivate nondestructive
|
| 35 |
+
|
| 36 |
+
set -gx VIRTUAL_ENV /home/tengxiao/pj/ShinkaEvolve/ccevolve/blog/publish/.venv
|
| 37 |
+
|
| 38 |
+
set -gx _OLD_VIRTUAL_PATH $PATH
|
| 39 |
+
set -gx PATH "$VIRTUAL_ENV/"bin $PATH
|
| 40 |
+
set -gx VIRTUAL_ENV_PROMPT .venv
|
| 41 |
+
|
| 42 |
+
# Unset PYTHONHOME if set.
|
| 43 |
+
if set -q PYTHONHOME
|
| 44 |
+
set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
|
| 45 |
+
set -e PYTHONHOME
|
| 46 |
+
end
|
| 47 |
+
|
| 48 |
+
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
|
| 49 |
+
# fish uses a function instead of an env var to generate the prompt.
|
| 50 |
+
|
| 51 |
+
# Save the current fish_prompt function as the function _old_fish_prompt.
|
| 52 |
+
functions -c fish_prompt _old_fish_prompt
|
| 53 |
+
|
| 54 |
+
# With the original prompt function renamed, we can override with our own.
|
| 55 |
+
function fish_prompt
|
| 56 |
+
# Save the return status of the last command.
|
| 57 |
+
set -l old_status $status
|
| 58 |
+
|
| 59 |
+
# Output the venv prompt; color taken from the blue of the Python logo.
|
| 60 |
+
printf "%s(%s)%s " (set_color 4B8BBE) .venv (set_color normal)
|
| 61 |
+
|
| 62 |
+
# Restore the return status of the previous command.
|
| 63 |
+
echo "exit $old_status" | .
|
| 64 |
+
# Output the original/"old" prompt.
|
| 65 |
+
_old_fish_prompt
|
| 66 |
+
end
|
| 67 |
+
|
| 68 |
+
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
|
| 69 |
+
end
|
ccevolve/blog/publish/.venv/bin/ngrok-asgi
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/home/tengxiao/pj/ShinkaEvolve/ccevolve/blog/publish/.venv/bin/python3.13
|
| 2 |
+
# -*- coding: utf-8 -*-
|
| 3 |
+
import re
|
| 4 |
+
import sys
|
| 5 |
+
from ngrok import __main__
|
| 6 |
+
if __name__ == '__main__':
|
| 7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
| 8 |
+
sys.exit(__main__.asgi_cli())
|
ccevolve/blog/publish/.venv/bin/pip
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/home/tengxiao/pj/ShinkaEvolve/ccevolve/blog/publish/.venv/bin/python3.13
|
| 2 |
+
# -*- coding: utf-8 -*-
|
| 3 |
+
import re
|
| 4 |
+
import sys
|
| 5 |
+
from pip._internal.cli.main import main
|
| 6 |
+
if __name__ == '__main__':
|
| 7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
| 8 |
+
sys.exit(main())
|
ccevolve/blog/publish/.venv/bin/pip3
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/home/tengxiao/pj/ShinkaEvolve/ccevolve/blog/publish/.venv/bin/python3.13
|
| 2 |
+
# -*- coding: utf-8 -*-
|
| 3 |
+
import re
|
| 4 |
+
import sys
|
| 5 |
+
from pip._internal.cli.main import main
|
| 6 |
+
if __name__ == '__main__':
|
| 7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
| 8 |
+
sys.exit(main())
|
ccevolve/blog/publish/.venv/bin/pip3.13
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/home/tengxiao/pj/ShinkaEvolve/ccevolve/blog/publish/.venv/bin/python3.13
|
| 2 |
+
# -*- coding: utf-8 -*-
|
| 3 |
+
import re
|
| 4 |
+
import sys
|
| 5 |
+
from pip._internal.cli.main import main
|
| 6 |
+
if __name__ == '__main__':
|
| 7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
| 8 |
+
sys.exit(main())
|
ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok-1.7.0.dist-info/METADATA
ADDED
|
@@ -0,0 +1,480 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Metadata-Version: 2.4
|
| 2 |
+
Name: ngrok
|
| 3 |
+
Version: 1.7.0
|
| 4 |
+
Classifier: Development Status :: 5 - Production/Stable
|
| 5 |
+
Classifier: Intended Audience :: Developers
|
| 6 |
+
Classifier: License :: OSI Approved :: MIT License
|
| 7 |
+
Classifier: Operating System :: POSIX
|
| 8 |
+
Classifier: Operating System :: Microsoft :: Windows
|
| 9 |
+
Classifier: Operating System :: MacOS :: MacOS X
|
| 10 |
+
Classifier: Topic :: Utilities
|
| 11 |
+
Classifier: Programming Language :: Python
|
| 12 |
+
Classifier: Programming Language :: Python :: 3
|
| 13 |
+
Classifier: Programming Language :: Python :: 3 :: Only
|
| 14 |
+
Classifier: Programming Language :: Python :: 3.12
|
| 15 |
+
Classifier: Programming Language :: Python :: 3.13
|
| 16 |
+
Classifier: Topic :: System :: Networking
|
| 17 |
+
Classifier: Topic :: System :: Networking :: Firewalls
|
| 18 |
+
License-File: LICENSE-APACHE
|
| 19 |
+
License-File: LICENSE-MIT
|
| 20 |
+
Summary: The ngrok Agent SDK for Python
|
| 21 |
+
Keywords: ngrok,python,pypi,pyo3,ingress,networking
|
| 22 |
+
License: MIT OR Apache-2.0
|
| 23 |
+
Requires-Python: >=3.12
|
| 24 |
+
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
| 25 |
+
Project-URL: homepage, https://ngrok.com
|
| 26 |
+
Project-URL: repository, https://github.com/ngrok/ngrok-python
|
| 27 |
+
Project-URL: changelog, https://github.com/ngrok/ngrok-python/blob/main/CHANGELOG.md
|
| 28 |
+
|
| 29 |
+
# Python SDK for ngrok
|
| 30 |
+
|
| 31 |
+
[![PyPI][pypi-badge]][pypi-url]
|
| 32 |
+
[![Supported Versions][ver-badge]][ver-url]
|
| 33 |
+
[![MIT licensed][mit-badge]][mit-url]
|
| 34 |
+
[![Apache-2.0 licensed][apache-badge]][apache-url]
|
| 35 |
+
[![Continuous integration][ci-badge]][ci-url]
|
| 36 |
+
|
| 37 |
+
[pypi-badge]: https://img.shields.io/pypi/v/ngrok
|
| 38 |
+
[pypi-url]: https://pypi.org/project/ngrok
|
| 39 |
+
[ver-badge]: https://img.shields.io/pypi/pyversions/ngrok.svg
|
| 40 |
+
[ver-url]: https://pypi.org/project/ngrok
|
| 41 |
+
[mit-badge]: https://img.shields.io/badge/license-MIT-blue.svg
|
| 42 |
+
[mit-url]: https://github.com/ngrok/ngrok-rust/blob/main/LICENSE-MIT
|
| 43 |
+
[apache-badge]: https://img.shields.io/badge/license-Apache_2.0-blue.svg
|
| 44 |
+
[apache-url]: https://github.com/ngrok/ngrok-rust/blob/main/LICENSE-APACHE
|
| 45 |
+
[ci-badge]: https://github.com/ngrok/ngrok-python/actions/workflows/ci.yml/badge.svg
|
| 46 |
+
[ci-url]: https://github.com/ngrok/ngrok-python/actions/workflows/ci.yml
|
| 47 |
+
|
| 48 |
+
`ngrok-python` is the official Python SDK for ngrok that requires no binaries. Quickly enable secure production-ready connectivity to your applications and services directly from your code.
|
| 49 |
+
|
| 50 |
+
[ngrok](https://ngrok.com) is a globally distributed gateway that provides secure connectivity for applications and services running in any environment.
|
| 51 |
+
|
| 52 |
+
# Installation
|
| 53 |
+
|
| 54 |
+
The `ngrok-python` SDK can be installed from [PyPI](https://pypi.org/project/ngrok) via `pip`:
|
| 55 |
+
|
| 56 |
+
```shell
|
| 57 |
+
pip install ngrok
|
| 58 |
+
```
|
| 59 |
+
|
| 60 |
+
# Quickstart
|
| 61 |
+
|
| 62 |
+
1. [Install `ngrok-python`](#installation)
|
| 63 |
+
2. Export your [authtoken from the ngrok dashboard](https://dashboard.ngrok.com/get-started/your-authtoken) as `NGROK_AUTHTOKEN` in your terminal
|
| 64 |
+
3. Add the following code to your application to establish connectivity via the [forward method](https://github.com/ngrok/ngrok-python/blob/main/examples/ngrok-forward-minimal.py) through port `9000` on `localhost`:
|
| 65 |
+
|
| 66 |
+
```python
|
| 67 |
+
# import ngrok python sdk
|
| 68 |
+
import ngrok
|
| 69 |
+
import time
|
| 70 |
+
|
| 71 |
+
# Establish connectivity
|
| 72 |
+
listener = ngrok.forward(9000, authtoken_from_env=True)
|
| 73 |
+
|
| 74 |
+
# Output ngrok url to console
|
| 75 |
+
print(f"Ingress established at {listener.url()}")
|
| 76 |
+
|
| 77 |
+
# Keep the listener alive
|
| 78 |
+
try:
|
| 79 |
+
while True:
|
| 80 |
+
time.sleep(1)
|
| 81 |
+
except KeyboardInterrupt:
|
| 82 |
+
print("Closing listener")
|
| 83 |
+
```
|
| 84 |
+
|
| 85 |
+
That's it! Your application should now be available through the url output in your terminal.
|
| 86 |
+
|
| 87 |
+
> **Note**
|
| 88 |
+
> You can find more examples in [the examples directory](https://github.com/ngrok/ngrok-python/tree/main/examples).
|
| 89 |
+
|
| 90 |
+
# Documentation
|
| 91 |
+
|
| 92 |
+
A full quickstart guide and API reference can be found in the [ngrok-python documentation](https://ngrok.github.io/ngrok-python/).
|
| 93 |
+
|
| 94 |
+
### Authentication
|
| 95 |
+
|
| 96 |
+
To use most of ngrok's features, you'll need an authtoken. To obtain one, sign up for free at [ngrok.com](https://dashboard.ngrok.com/signup) and retrieve it from the [authtoken page in your ngrok dashboard](https://dashboard.ngrok.com/get-started/your-authtoken). Once you have copied your authtoken, you can reference it in several ways.
|
| 97 |
+
|
| 98 |
+
You can set it in the `NGROK_AUTHTOKEN` environment variable and pass `authtoken_from_env=True` to the [forward](https://ngrok.github.io/ngrok-python/module.html) method:
|
| 99 |
+
|
| 100 |
+
```python
|
| 101 |
+
ngrok.forward(authtoken_from_env=True, ...)
|
| 102 |
+
```
|
| 103 |
+
|
| 104 |
+
Or pass the authtoken directly to the [forward](https://ngrok.github.io/ngrok-python/module.html) method:
|
| 105 |
+
|
| 106 |
+
```python
|
| 107 |
+
ngrok.forward(authtoken=token, ...)
|
| 108 |
+
```
|
| 109 |
+
|
| 110 |
+
Or set it for all connections with the [set_auth_token](https://ngrok.github.io/ngrok-python/module.html) method:
|
| 111 |
+
|
| 112 |
+
```python
|
| 113 |
+
ngrok.set_auth_token(token)
|
| 114 |
+
```
|
| 115 |
+
|
| 116 |
+
### Connection
|
| 117 |
+
|
| 118 |
+
The [forward](https://ngrok.github.io/ngrok-python/module.html) method is the easiest way to start an ngrok session and establish a listener to a specified address. If an asynchronous runtime is running, the [forward](https://ngrok.github.io/ngrok-python/module.html) method returns a promise that resolves to the public listener object.
|
| 119 |
+
|
| 120 |
+
With no arguments, the [forward](https://ngrok.github.io/ngrok-python/module.html) method will start an HTTP listener to `localhost` port `80`:
|
| 121 |
+
|
| 122 |
+
```python
|
| 123 |
+
listener = ngrok.forward()
|
| 124 |
+
```
|
| 125 |
+
|
| 126 |
+
You can pass the port number to forward on `localhost`:
|
| 127 |
+
|
| 128 |
+
```python
|
| 129 |
+
listener = ngrok.forward(4242)
|
| 130 |
+
```
|
| 131 |
+
|
| 132 |
+
Or you can specify the host and port via a string:
|
| 133 |
+
|
| 134 |
+
```python
|
| 135 |
+
listener = ngrok.forward("localhost:4242")
|
| 136 |
+
```
|
| 137 |
+
|
| 138 |
+
More options can be passed to the `forward` method to customize the connection:
|
| 139 |
+
|
| 140 |
+
```python
|
| 141 |
+
listener = ngrok.forward(8080, basic_auth="ngrok:online1line"})
|
| 142 |
+
listener = ngrok.forward(8080, oauth_provider="google", oauth_allow_domains="example.com")
|
| 143 |
+
```
|
| 144 |
+
|
| 145 |
+
The second (optional) argument is the listener type, which defaults to `http`. To create a TCP listener:
|
| 146 |
+
|
| 147 |
+
```python
|
| 148 |
+
listener = ngrok.forward(25565, "tcp")
|
| 149 |
+
```
|
| 150 |
+
|
| 151 |
+
Since the options are kwargs, you can also use the `**` operator to pass a dictionary for configuration:
|
| 152 |
+
|
| 153 |
+
```python
|
| 154 |
+
options = {"authtoken_from_env":True, "response_header_add":"X-Awesome:yes"}
|
| 155 |
+
listener = ngrok.forward(8080, **options)
|
| 156 |
+
```
|
| 157 |
+
|
| 158 |
+
See [Full Configuration](#full-configuration) for the list of possible configuration options.
|
| 159 |
+
|
| 160 |
+
### Disconnection
|
| 161 |
+
|
| 162 |
+
To close a listener use the [disconnect](https://ngrok.github.io/ngrok-python/module.html) method with the `url` of the listener to close. If there is an asynchronous runtime running the [disconnect](https://ngrok.github.io/ngrok-python/module.html) method returns a promise that resolves when the call is complete.
|
| 163 |
+
|
| 164 |
+
```python
|
| 165 |
+
ngrok.disconnect(url)
|
| 166 |
+
```
|
| 167 |
+
|
| 168 |
+
Or omit the `url` to close all listeners:
|
| 169 |
+
|
| 170 |
+
```python
|
| 171 |
+
ngrok.disconnect()
|
| 172 |
+
```
|
| 173 |
+
|
| 174 |
+
The [close](https://ngrok.github.io/ngrok-python/ngrok_listener.html) method on a listener will shut it down, and also stop the ngrok session if it is no longer needed. This method returns a promise that resolves when the listener is closed.
|
| 175 |
+
|
| 176 |
+
```python
|
| 177 |
+
await listener.close()
|
| 178 |
+
```
|
| 179 |
+
|
| 180 |
+
### List all Listeners
|
| 181 |
+
|
| 182 |
+
To list all current non-closed listeners use the [get_listeners](https://ngrok.github.io/ngrok-python/module.html) method. If there is an asynchronous runtime running the [get_listeners](https://ngrok.github.io/ngrok-python/module.html) method returns a promise that resolves to the list of listener objects.
|
| 183 |
+
|
| 184 |
+
```python
|
| 185 |
+
listeners = ngrok.get_listeners()
|
| 186 |
+
```
|
| 187 |
+
|
| 188 |
+
### TLS Backends
|
| 189 |
+
|
| 190 |
+
As of version `0.10.0` there is backend TLS connection support, validated by a filepath specified in the `SSL_CERT_FILE` environment variable, or falling back to the host OS installed trusted certificate authorities. So it is now possible to do this to connect:
|
| 191 |
+
|
| 192 |
+
```python
|
| 193 |
+
ngrok.forward("https://127.0.0.1:3000", authtoken_from_env=True)
|
| 194 |
+
```
|
| 195 |
+
|
| 196 |
+
If the service is using certs not trusted by the OS, such as self-signed certificates, add an environment variable like this before running: `SSL_CERT_FILE=/path/to/ca.crt`. There is also a `verify_upstream_tls=False` option to disable certification verification.
|
| 197 |
+
|
| 198 |
+
### Unix Sockets
|
| 199 |
+
|
| 200 |
+
You may also choose to use Unix Sockets instead of TCP. You can view an example of this [here](https://github.com/ngrok/ngrok-python/blob/main/examples/ngrok-http-full.py).
|
| 201 |
+
|
| 202 |
+
A socket address may be passed directly into the listener `forward()` call as well by prefixing the address with `unix:`, for example `unix:/tmp/socket-123`.
|
| 203 |
+
|
| 204 |
+
### Builders
|
| 205 |
+
|
| 206 |
+
For more control over Sessions and Listeners, the builder classes can be used.
|
| 207 |
+
|
| 208 |
+
A minimal example using the builder class looks like [the following](https://github.com/ngrok/ngrok-python/blob/main/examples/ngrok-http-minimal.py):
|
| 209 |
+
|
| 210 |
+
```python
|
| 211 |
+
async def create_listener():
|
| 212 |
+
session = await ngrok.NgrokSessionBuilder().authtoken_from_env().connect()
|
| 213 |
+
listener = await session.http_endpoint().listen()
|
| 214 |
+
print (f"Ingress established at {listener.url()}")
|
| 215 |
+
listener.forward("localhost:9000")
|
| 216 |
+
```
|
| 217 |
+
|
| 218 |
+
See here for a [Full Configuration Example](https://github.com/ngrok/ngrok-python/blob/main/examples/ngrok-http-full.py)
|
| 219 |
+
|
| 220 |
+
### Full Configuration
|
| 221 |
+
|
| 222 |
+
This example shows [all the possible configuration items of ngrok.forward](https://github.com/ngrok/ngrok-python/blob/main/examples/ngrok-forward-full.py):
|
| 223 |
+
|
| 224 |
+
```python
|
| 225 |
+
listener = ngrok.forward(
|
| 226 |
+
# session configuration
|
| 227 |
+
addr="localhost:8080",
|
| 228 |
+
authtoken="<authtoken>",
|
| 229 |
+
authtoken_from_env=True,
|
| 230 |
+
app_protocol="http2",
|
| 231 |
+
session_metadata="Online in One Line",
|
| 232 |
+
# advanced session connection configuration
|
| 233 |
+
server_addr="example.com:443",
|
| 234 |
+
root_cas="trusted",
|
| 235 |
+
session_ca_cert=load_file("ca.pem"),
|
| 236 |
+
# listener configuration
|
| 237 |
+
metadata="example listener metadata from python",
|
| 238 |
+
domain="<domain>",
|
| 239 |
+
schemes=["HTTPS"],
|
| 240 |
+
proto="http",
|
| 241 |
+
proxy_proto="", # One of: "", "1", "2"
|
| 242 |
+
labels="edge:edghts_2G...", # Along with proto="labeled"
|
| 243 |
+
# module configuration
|
| 244 |
+
basic_auth=["ngrok:online1line"],
|
| 245 |
+
circuit_breaker=0.1,
|
| 246 |
+
compression=True,
|
| 247 |
+
allow_user_agent="^mozilla.*",
|
| 248 |
+
deny_user_agent="^curl.*",
|
| 249 |
+
allow_cidr="0.0.0.0/0",
|
| 250 |
+
deny_cidr="10.1.1.1/32",
|
| 251 |
+
crt=load_file("crt.pem"),
|
| 252 |
+
key=load_file("key.pem"),
|
| 253 |
+
mutual_tls_cas=load_file("ca.crt"),
|
| 254 |
+
oauth_provider="google",
|
| 255 |
+
oauth_allow_domains=["<domain>"],
|
| 256 |
+
oauth_allow_emails=["<email>"],
|
| 257 |
+
oauth_scopes=["<scope>"],
|
| 258 |
+
oauth_client_id="<id>",
|
| 259 |
+
oauth_client_secret="<id>",
|
| 260 |
+
oidc_issuer_url="<url>",
|
| 261 |
+
oidc_client_id="<id>",
|
| 262 |
+
oidc_client_secret="<secret>",
|
| 263 |
+
oidc_allow_domains=["<domain>"],
|
| 264 |
+
oidc_allow_emails=["<email>"],
|
| 265 |
+
oidc_scopes=["<scope>"],
|
| 266 |
+
traffic_policy="<policy_json>",
|
| 267 |
+
request_header_remove="X-Req-Nope",
|
| 268 |
+
response_header_remove="X-Res-Nope",
|
| 269 |
+
request_header_add="X-Req-Yup:true",
|
| 270 |
+
response_header_add="X-Res-Yup:true",
|
| 271 |
+
verify_upstream_tls=False,
|
| 272 |
+
verify_webhook_provider="twilio",
|
| 273 |
+
verify_webhook_secret="asdf",
|
| 274 |
+
websocket_tcp_converter=True,
|
| 275 |
+
)
|
| 276 |
+
```
|
| 277 |
+
|
| 278 |
+
# ASGI Runner
|
| 279 |
+
|
| 280 |
+
`ngrok-python` comes bundled with an ASGI (Asynchronous Server Gateway Interface) runner `ngrok-asgi` that can be used for Uvicorn, Gunicorn, Django and more, with no code.
|
| 281 |
+
|
| 282 |
+
To use prefix your start up command for a Uvicorn or Gunicorn web server with either `ngrok-asgi` or `python -m ngrok`.
|
| 283 |
+
|
| 284 |
+
Any TCP or Unix Domain Socket arguments will be used to establish connectivity automatically. The ngrok listener can be configured using command flags, for instance adding `--basic-auth ngrok online1line` will introduce basic authentication to the ingress listener.
|
| 285 |
+
|
| 286 |
+
### Uvicorn
|
| 287 |
+
|
| 288 |
+
```shell
|
| 289 |
+
# Basic Usage
|
| 290 |
+
ngrok-asgi uvicorn mysite.asgi:application
|
| 291 |
+
|
| 292 |
+
# With custom host and port
|
| 293 |
+
ngrok-asgi uvicorn mysite.asgi:application \
|
| 294 |
+
--host localhost \
|
| 295 |
+
--port 1234
|
| 296 |
+
|
| 297 |
+
# Using basic auth
|
| 298 |
+
ngrok-asgi uvicorn mysite.asgi:application \
|
| 299 |
+
--host localhost \
|
| 300 |
+
--port 1234 \
|
| 301 |
+
--basic-auth ngrok online1line
|
| 302 |
+
|
| 303 |
+
# Using custom sock file
|
| 304 |
+
ngrok-asgi uvicorn mysite.asgi:application \
|
| 305 |
+
--uds /tmp/uvicorn.sock
|
| 306 |
+
|
| 307 |
+
# Using module name
|
| 308 |
+
python -m ngrok uvicorn mysite.asgi:application \
|
| 309 |
+
--oauth-provider google \
|
| 310 |
+
--allow-emails bob@example.com
|
| 311 |
+
```
|
| 312 |
+
|
| 313 |
+
### Gunicorn
|
| 314 |
+
|
| 315 |
+
```shell
|
| 316 |
+
# Basic Usage
|
| 317 |
+
ngrok-asgi gunicorn mysite.asgi:application -k uvicorn.workers.UvicornWorker
|
| 318 |
+
|
| 319 |
+
# With custom host and port
|
| 320 |
+
ngrok-asgi gunicorn mysite.asgi:application -k uvicorn.workers.UvicornWorker \
|
| 321 |
+
--bind localhost:1234
|
| 322 |
+
|
| 323 |
+
# Using webhook verifications
|
| 324 |
+
ngrok-asgi gunicorn mysite.asgi:application -k uvicorn.workers.UvicornWorker \
|
| 325 |
+
--webhook-verification twilio s3cr3t
|
| 326 |
+
|
| 327 |
+
# Using custom sock file
|
| 328 |
+
ngrok-asgi gunicorn mysite.asgi:application -k uvicorn.workers.UvicornWorker \
|
| 329 |
+
--bind unix:/tmp/gunicorn.sock
|
| 330 |
+
|
| 331 |
+
# Using module name
|
| 332 |
+
python -m ngrok gunicorn mysite.asgi:application -k uvicorn.workers.UvicornWorker --response-header X-Awesome True
|
| 333 |
+
```
|
| 334 |
+
|
| 335 |
+
# Examples
|
| 336 |
+
|
| 337 |
+
#### Listeners
|
| 338 |
+
- [HTTP](https://github.com/ngrok/ngrok-python/tree/main/examples/ngrok-http-minimal.py)
|
| 339 |
+
- [Full Configuration Example](https://github.com/ngrok/ngrok-python/tree/main/examples/ngrok-http-full.py)
|
| 340 |
+
- [Labeled](https://github.com/ngrok/ngrok-python/tree/main/examples/ngrok-labeled.py)
|
| 341 |
+
- [TCP](https://github.com/ngrok/ngrok-python/tree/main/examples/ngrok-tcp.py)
|
| 342 |
+
- [TLS](https://github.com/ngrok/ngrok-python/tree/main/examples/ngrok-tls.py)
|
| 343 |
+
|
| 344 |
+
#### Frameworks
|
| 345 |
+
- [AIOHTTP](https://github.com/ngrok/ngrok-python/tree/main/examples/aiohttp-ngrok.py)
|
| 346 |
+
- [AWS APP Runner](https://github.com/ngrok/ngrok-sdk-serverless-example)
|
| 347 |
+
- with [changes for Python](https://docs.aws.amazon.com/apprunner/latest/dg/service-source-code-python.html)
|
| 348 |
+
- Django
|
| 349 |
+
- [Single File Example](https://github.com/ngrok/ngrok-python/tree/main/examples/django-single-file.py)
|
| 350 |
+
- [Modify manage.py Example](https://github.com/ngrok/ngrok-python/tree/main/examples/djangosite/manage.py)
|
| 351 |
+
- [Modify asgi.py Example](https://github.com/ngrok/ngrok-python/tree/main/examples/djangosite/djangosite/ngrok-asgi.py)
|
| 352 |
+
- or [via `ngrok-asgi`](#asgi-runner)
|
| 353 |
+
- [Flask](https://github.com/ngrok/ngrok-python/tree/main/examples/flask-ngrok.py)
|
| 354 |
+
- [Gunicorn](#gunicorn)
|
| 355 |
+
- [Hypercorn](https://github.com/ngrok/ngrok-python/tree/main/examples/hypercorn-http2-ngrok.py)
|
| 356 |
+
- [Streamlit](https://github.com/ngrok/ngrok-python/tree/main/examples/streamlit/streamlit-ngrok.py)
|
| 357 |
+
- [Tornado](https://github.com/ngrok/ngrok-python/tree/main/examples/tornado-ngrok.py)
|
| 358 |
+
- [Uvicorn](https://github.com/ngrok/ngrok-python/tree/main/examples/uvicorn-ngrok.py)
|
| 359 |
+
|
| 360 |
+
#### Machine Learning
|
| 361 |
+
- Gradio
|
| 362 |
+
- [ngrok-asgi Example](https://github.com/ngrok/ngrok-python/tree/main/examples/gradio/gradio-asgi.py)
|
| 363 |
+
- [gradio CLI Example](https://github.com/ngrok/ngrok-python/tree/main/examples/gradio/gradio-ngrok.py)
|
| 364 |
+
- [OpenPlayground](https://github.com/ngrok/ngrok-python/tree/main/examples/openplayground/run.py)
|
| 365 |
+
- [GPT4ALL](https://github.com/ngrok/ngrok-python/tree/main/examples/gpt4all/run.py)
|
| 366 |
+
- [Stable Diffusion WebUI](https://github.com/AUTOMATIC1111/stable-diffusion-webui/) by AUTOMATIC1111
|
| 367 |
+
- `ngrok-python` is now built-in, see the `--ngrok` and `--ngrok-options` arguments.
|
| 368 |
+
- [Text Generation WebUI](https://github.com/oobabooga/text-generation-webui) by oobabooga
|
| 369 |
+
- `ngrok-python` is now built-in, see the `--extension ngrok` argument.
|
| 370 |
+
|
| 371 |
+
# Platform Support
|
| 372 |
+
|
| 373 |
+
Pre-built binaries are provided on PyPI for the following platforms:
|
| 374 |
+
|
| 375 |
+
| OS | i686 | x64 | aarch64 | arm |
|
| 376 |
+
| ---------- | -----|-----|---------|-----|
|
| 377 |
+
| Windows | ✓ | ✓ | ✓ | |
|
| 378 |
+
| MacOS | | ✓ | ✓ | |
|
| 379 |
+
| Linux | | ✓ | ✓ | ✓ |
|
| 380 |
+
| Linux musl | | ✓ | ✓ | |
|
| 381 |
+
| FreeBSD | | * | | |
|
| 382 |
+
|
| 383 |
+
> **Note**
|
| 384 |
+
> `ngrok-python`, and [ngrok-rust](https://github.com/ngrok/ngrok-rust/) which it depends on, are open source, so it may be possible to build them for other platforms.
|
| 385 |
+
> - FreeBSD-x64 is built by the release process, but PyPI won't accept BSD flavors.
|
| 386 |
+
|
| 387 |
+
# Dependencies
|
| 388 |
+
|
| 389 |
+
- This project relies on [PyO3](https://pyo3.rs/), an excellent system to ease development and building of Rust plugins for Python.
|
| 390 |
+
- Thank you to [OpenIoTHub](https://github.com/OpenIoTHub/ngrok) for handing over the ngrok name on PyPI.
|
| 391 |
+
|
| 392 |
+
# Changelog
|
| 393 |
+
|
| 394 |
+
Changes to `ngrok-python` are tracked under [CHANGELOG.md](https://github.com/ngrok/ngrok-python/blob/main/CHANGELOG.md).
|
| 395 |
+
|
| 396 |
+
# Join the ngrok Community
|
| 397 |
+
|
| 398 |
+
- Check out [our official docs](https://docs.ngrok.com)
|
| 399 |
+
- Read about updates on [our blog](https://blog.ngrok.com)
|
| 400 |
+
- Open an [issue](https://github.com/ngrok/ngrok-python/issues) or [pull request](https://github.com/ngrok/ngrok-python/pulls)
|
| 401 |
+
- Join our [Slack community](https://ngrok.com/slack)
|
| 402 |
+
- Follow us on [X/Twitter (@ngrokHQ)](https://twitter.com/ngrokhq)
|
| 403 |
+
- Subscribe to our [YouTube channel (@ngrokHQ)](https://www.youtube.com/@ngrokhq)
|
| 404 |
+
|
| 405 |
+
# License
|
| 406 |
+
|
| 407 |
+
This project is dual-licensed under [Apache, Version 2.0](LICENSE-APACHE) and [MIT](LICENSE-MIT).
|
| 408 |
+
You can choose between one of them if you use this work.
|
| 409 |
+
|
| 410 |
+
### Contributions
|
| 411 |
+
|
| 412 |
+
Unless you explicitly state otherwise, any contribution intentionally submitted
|
| 413 |
+
for inclusion in `ngrok-python` by you, as defined in the Apache-2.0 license, shall be
|
| 414 |
+
dual licensed as above, without any additional terms or conditions.
|
| 415 |
+
|
| 416 |
+
# Development: Getting Started
|
| 417 |
+
|
| 418 |
+
**Prerequisites:**
|
| 419 |
+
- a valid Ngrok `authtoken`
|
| 420 |
+
- `make` available in your PATH
|
| 421 |
+
|
| 422 |
+
1. Update [Cargo.toml](./Cargo.toml) with the _latest supported_ ```ngrok = { version = "=VERSION_HERE" }``` from [ngrok-rust](https://github.com/ngrok/ngrok-rust/blob/main/ngrok/Cargo.toml#L3). `ngrok-rust` is used for the bindings in [src/rust_files_here.rs](./src)
|
| 423 |
+
|
| 424 |
+
2. Run `make build` (builds the `rust` bindings / `python` dependencies)
|
| 425 |
+
|
| 426 |
+
3. Happy developing!
|
| 427 |
+
|
| 428 |
+
<br/>
|
| 429 |
+
|
| 430 |
+
**Example Commands**:
|
| 431 |
+
|
| 432 |
+
_building the project_
|
| 433 |
+
```shell
|
| 434 |
+
make develop
|
| 435 |
+
```
|
| 436 |
+
|
| 437 |
+
_running the entire test suite_
|
| 438 |
+
```shell
|
| 439 |
+
# running the entire test suite
|
| 440 |
+
export NGROK_AUTHTOKEN="YOUR_AUTHTOKEN_HERE"; make test
|
| 441 |
+
```
|
| 442 |
+
|
| 443 |
+
_running an individual test_
|
| 444 |
+
```shell
|
| 445 |
+
# running an individual test
|
| 446 |
+
export NGROK_AUTHTOKEN="YOUR_AUTHTOKEN_HERE"; make test="-k TEST_CLASS.NAME_OF_TEST" test
|
| 447 |
+
```
|
| 448 |
+
|
| 449 |
+
[See the MakeFile for more examples](./Makefile)
|
| 450 |
+
|
| 451 |
+
### HTTP2
|
| 452 |
+
|
| 453 |
+
The examples include a minimal `hypercorn` HTTP/2 example if you run `make http2`. You can curl the endpoint logged with `INFO:ngrok.listener:Created` and verify the HTTP/2 response from `hypercorn`.
|
| 454 |
+
|
| 455 |
+
```bash
|
| 456 |
+
curl --http2 -v https://<YOUR_LISTENER_URL>
|
| 457 |
+
* Trying <YOUR_IP>:443...
|
| 458 |
+
* Connected to a6278d6c07ce.ngrok.app (<YOUR_IP>) port 443 (#0)
|
| 459 |
+
* ALPN, offering h2
|
| 460 |
+
* ALPN, offering http/1.1
|
| 461 |
+
...
|
| 462 |
+
> GET / HTTP/2
|
| 463 |
+
> Host: a6278d6c07ce.ngrok.app
|
| 464 |
+
> user-agent: curl/7.81.0
|
| 465 |
+
> accept: */*
|
| 466 |
+
>
|
| 467 |
+
...
|
| 468 |
+
< HTTP/2 200
|
| 469 |
+
< content-type: text/plain
|
| 470 |
+
< date: Fri, 01 Mar 2024 18:50:23 GMT
|
| 471 |
+
< ngrok-agent-ips: <YOUR_AGENT_IP>
|
| 472 |
+
< ngrok-trace-id: ed038ace04876818149cf0769bd43e38
|
| 473 |
+
< server: hypercorn-h2
|
| 474 |
+
<
|
| 475 |
+
* TLSv1.2 (IN), TLS header, Supplemental data (23):
|
| 476 |
+
* TLSv1.2 (IN), TLS header, Supplemental data (23):
|
| 477 |
+
* Connection #0 to host <YOUR_LISTENER_URL> left intact
|
| 478 |
+
hello
|
| 479 |
+
```
|
| 480 |
+
|
ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok-1.7.0.dist-info/RECORD
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
../../../bin/ngrok-asgi,sha256=veKG-I9dA7zBQTksVJBZ80EjI1lny4dxrFcInip5fpk,278
|
| 2 |
+
ngrok-1.7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
| 3 |
+
ngrok-1.7.0.dist-info/METADATA,sha256=tU4nkpVsePwyJNOhn7jLeEWmnr02sm2KjqfG3ebyJ_Q,18773
|
| 4 |
+
ngrok-1.7.0.dist-info/RECORD,,
|
| 5 |
+
ngrok-1.7.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 6 |
+
ngrok-1.7.0.dist-info/WHEEL,sha256=NFTI3KCgiPsfMUTSoCvu0cuftVBs0XnyqHj9b-VGY3I,128
|
| 7 |
+
ngrok-1.7.0.dist-info/entry_points.txt,sha256=qIWUBK__RJ7O3GDMiCU9dKnLLqlzJdXpJxat7IQ1cZU,53
|
| 8 |
+
ngrok-1.7.0.dist-info/licenses/LICENSE-APACHE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
| 9 |
+
ngrok-1.7.0.dist-info/licenses/LICENSE-MIT,sha256=wmZKSCSYH5ESlCdSKshPJ4zUma0hxKfzX8RAHZYYlrk,1050
|
| 10 |
+
ngrok/__init__.py,sha256=Sl_WfBL8squMtOUw_9jo51R5uqOKMfUxMAIoHAP0vi0,104
|
| 11 |
+
ngrok/__main__.py,sha256=Sr3uOOqqGHugFUuMlova3d21ljtZV7mhZ24StWddr_E,6323
|
| 12 |
+
ngrok/__pycache__/__init__.cpython-313.pyc,,
|
| 13 |
+
ngrok/__pycache__/__main__.cpython-313.pyc,,
|
| 14 |
+
ngrok/__pycache__/ngrok_parser.cpython-313.pyc,,
|
| 15 |
+
ngrok/mypy.ini,sha256=xMNPYqFoi-LjalA_e6r7ey8X_RG5YotZ2WunPjsAI3g,32
|
| 16 |
+
ngrok/ngrok.abi3.so,sha256=hXy5yQqbfFVDNjSACkSNx6ehHXEAPHr5yva7cgQQ_nA,9640896
|
| 17 |
+
ngrok/ngrok.pyi,sha256=MfYviAMgsbGwZVGxeGktUlyAJbTYZ9RZnEYf3Rq7L3o,8062
|
| 18 |
+
ngrok/ngrok_parser.py,sha256=je_O422GC4Vb54AVLWN_WQXOcZxawmVpfhJWJCipRTo,5011
|
| 19 |
+
ngrok/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok-1.7.0.dist-info/REQUESTED
ADDED
|
File without changes
|
ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok-1.7.0.dist-info/WHEEL
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Wheel-Version: 1.0
|
| 2 |
+
Generator: maturin (1.9.1)
|
| 3 |
+
Root-Is-Purelib: false
|
| 4 |
+
Tag: cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64
|
ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok-1.7.0.dist-info/entry_points.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[console_scripts]
|
| 2 |
+
ngrok-asgi=ngrok:__main__.asgi_cli
|
ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok-1.7.0.dist-info/licenses/LICENSE-MIT
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Copyright 2022 ngrok, Inc.
|
| 2 |
+
|
| 3 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
| 4 |
+
|
| 5 |
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
| 6 |
+
|
| 7 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok/__init__.py
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from .ngrok import *
|
| 2 |
+
|
| 3 |
+
__doc__ = ngrok.__doc__
|
| 4 |
+
if hasattr(ngrok, "__all__"):
|
| 5 |
+
__all__ = ngrok.__all__
|
ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok/mypy.ini
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[mypy]
|
| 2 |
+
implicit_optional = True
|
ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok/ngrok_parser.py
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import argparse
|
| 2 |
+
|
| 3 |
+
|
| 4 |
+
def get_pass_through_args():
|
| 5 |
+
return {"host", "port", "uds", "fd", "config", "bind"}
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
def get_parser():
|
| 9 |
+
# argument parsing
|
| 10 |
+
parser = argparse.ArgumentParser(
|
| 11 |
+
prog="ngrok-asgi",
|
| 12 |
+
description="ASGI wrapper for ngrok",
|
| 13 |
+
epilog="Online in One Line",
|
| 14 |
+
)
|
| 15 |
+
parser.add_argument(
|
| 16 |
+
"command", choices=["gunicorn", "uvicorn"], help="gunicorn or uvicorn"
|
| 17 |
+
)
|
| 18 |
+
# ngrok session options
|
| 19 |
+
parser.add_argument(
|
| 20 |
+
"--authtoken",
|
| 21 |
+
help="Ngrok authtoken, otherwise uses NGROK_AUTH_TOKEN environment variable",
|
| 22 |
+
)
|
| 23 |
+
parser.add_argument(
|
| 24 |
+
"--session-metadata",
|
| 25 |
+
help="Configures the opaque, machine-readable metadata string for this session.",
|
| 26 |
+
)
|
| 27 |
+
|
| 28 |
+
# ngrok listener options
|
| 29 |
+
parser.add_argument(
|
| 30 |
+
"--allow-cidr",
|
| 31 |
+
action="append",
|
| 32 |
+
help="Restriction placed on the origin of incoming connections to the edge to only allow these CIDR ranges. Call multiple times to add additional CIDR ranges.",
|
| 33 |
+
)
|
| 34 |
+
parser.add_argument(
|
| 35 |
+
"--basic-auth",
|
| 36 |
+
nargs=2,
|
| 37 |
+
metavar=("username", "password"),
|
| 38 |
+
help="Credentials for basic authentication.",
|
| 39 |
+
)
|
| 40 |
+
parser.add_argument(
|
| 41 |
+
"--circuit-breaker",
|
| 42 |
+
help="Reject requests when 5XX responses exceed this ratio. Disabled when 0.",
|
| 43 |
+
)
|
| 44 |
+
parser.add_argument(
|
| 45 |
+
"--compression",
|
| 46 |
+
action="store_true",
|
| 47 |
+
help="Enable gzip compression for HTTP responses.",
|
| 48 |
+
)
|
| 49 |
+
parser.add_argument(
|
| 50 |
+
"--deny-cidr",
|
| 51 |
+
action="append",
|
| 52 |
+
help="Restriction placed on the origin of incoming connections to the edge to deny these CIDR ranges. Call multiple times to add additional CIDR ranges.",
|
| 53 |
+
)
|
| 54 |
+
parser.add_argument("--domain", help="The domain to request for this edge.")
|
| 55 |
+
parser.add_argument(
|
| 56 |
+
"--forwards-to",
|
| 57 |
+
help="Listener backend metadata. Viewable via the dashboard and API, but has no bearing on listener behavior.",
|
| 58 |
+
)
|
| 59 |
+
parser.add_argument(
|
| 60 |
+
"--metadata", help="Listener-specific opaque metadata. Viewable via the API."
|
| 61 |
+
)
|
| 62 |
+
parser.add_argument(
|
| 63 |
+
"--mutual-tlsca",
|
| 64 |
+
help="Filename of certificates to use for client authentication at the ngrok edge.",
|
| 65 |
+
)
|
| 66 |
+
parser.add_argument("--oauth-provider", help="OAuth provider configuration.")
|
| 67 |
+
parser.add_argument(
|
| 68 |
+
"--oidc",
|
| 69 |
+
nargs=3,
|
| 70 |
+
metavar=("issuer-url", "client-id", "client-secret"),
|
| 71 |
+
help="OIDC configuration.",
|
| 72 |
+
)
|
| 73 |
+
parser.add_argument(
|
| 74 |
+
"--allow-emails", action="append", help="OAuth/OIDC configuration."
|
| 75 |
+
)
|
| 76 |
+
parser.add_argument(
|
| 77 |
+
"--allow-domains", action="append", help="OAuth/OIDC configuration."
|
| 78 |
+
)
|
| 79 |
+
parser.add_argument("--scopes", action="append", help="OAuth/OIDC configuration.")
|
| 80 |
+
parser.add_argument(
|
| 81 |
+
"--proxy-proto",
|
| 82 |
+
choices=["", "1", "2"],
|
| 83 |
+
help="The version of PROXY protocol to use with this listener “1”, “2”, or “” if not using.",
|
| 84 |
+
)
|
| 85 |
+
parser.add_argument(
|
| 86 |
+
"--remove-request-header",
|
| 87 |
+
action="append",
|
| 88 |
+
help="Removes a header from requests to this edge. Call multiple times to add additional values.",
|
| 89 |
+
)
|
| 90 |
+
parser.add_argument(
|
| 91 |
+
"--remove-response-header",
|
| 92 |
+
action="append",
|
| 93 |
+
help="Removes a header from responses from this edge Call multiple times to add additional values..",
|
| 94 |
+
)
|
| 95 |
+
parser.add_argument(
|
| 96 |
+
"--request-header",
|
| 97 |
+
action="append",
|
| 98 |
+
nargs=2,
|
| 99 |
+
metavar=("header", "value"),
|
| 100 |
+
help="Adds a header to all requests to this edge. Call multiple times to add additional values.",
|
| 101 |
+
)
|
| 102 |
+
parser.add_argument(
|
| 103 |
+
"--response-header",
|
| 104 |
+
action="append",
|
| 105 |
+
nargs=2,
|
| 106 |
+
metavar=("header", "value"),
|
| 107 |
+
help="Adds a header to all responses coming from this edge. Call multiple times to add additional values.",
|
| 108 |
+
)
|
| 109 |
+
parser.add_argument(
|
| 110 |
+
"--scheme",
|
| 111 |
+
choices=["HTTPS", "HTTP"],
|
| 112 |
+
help="The scheme that this edge should use. Defaults to HTTPS.",
|
| 113 |
+
)
|
| 114 |
+
parser.add_argument(
|
| 115 |
+
"--webhook-verification",
|
| 116 |
+
nargs=2,
|
| 117 |
+
metavar=("provider", "secret"),
|
| 118 |
+
help="WebhookVerification configuration.",
|
| 119 |
+
)
|
| 120 |
+
parser.add_argument(
|
| 121 |
+
"--websocket-tcp-conversion",
|
| 122 |
+
action="store_true",
|
| 123 |
+
help="Convert incoming websocket connections to TCP-like streams.",
|
| 124 |
+
)
|
| 125 |
+
# uvicorn options
|
| 126 |
+
parser.add_argument("--host", help="Hostname or IP address")
|
| 127 |
+
parser.add_argument("--port", help="Port number", type=int)
|
| 128 |
+
parser.add_argument("--uds", help="Unix domain socket")
|
| 129 |
+
parser.add_argument("--fd", help="File descriptor")
|
| 130 |
+
# gunicorn options
|
| 131 |
+
parser.add_argument("--config", "-c", help="Config file not supported")
|
| 132 |
+
parser.add_argument(
|
| 133 |
+
"--bind",
|
| 134 |
+
"-b",
|
| 135 |
+
help="Specify a server socket to bind. Server sockets can be any of $(HOST), $(HOST):$(PORT), "
|
| 136 |
+
+ "fd://$(FD), or unix:$(PATH). An IP is a valid $(HOST).",
|
| 137 |
+
)
|
| 138 |
+
return parser
|
ccevolve/blog/publish/.venv/lib/python3.13/site-packages/ngrok/py.typed
ADDED
|
File without changes
|
ccevolve/blog/publish/.venv/lib/python3.13/site-packages/pip-25.1.1.dist-info/INSTALLER
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
pip
|
ccevolve/blog/publish/.venv/lib/python3.13/site-packages/pip-25.1.1.dist-info/METADATA
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Metadata-Version: 2.4
|
| 2 |
+
Name: pip
|
| 3 |
+
Version: 25.1.1
|
| 4 |
+
Summary: The PyPA recommended tool for installing Python packages.
|
| 5 |
+
Author-email: The pip developers <distutils-sig@python.org>
|
| 6 |
+
License: MIT
|
| 7 |
+
Project-URL: Homepage, https://pip.pypa.io/
|
| 8 |
+
Project-URL: Documentation, https://pip.pypa.io
|
| 9 |
+
Project-URL: Source, https://github.com/pypa/pip
|
| 10 |
+
Project-URL: Changelog, https://pip.pypa.io/en/stable/news/
|
| 11 |
+
Classifier: Development Status :: 5 - Production/Stable
|
| 12 |
+
Classifier: Intended Audience :: Developers
|
| 13 |
+
Classifier: License :: OSI Approved :: MIT License
|
| 14 |
+
Classifier: Topic :: Software Development :: Build Tools
|
| 15 |
+
Classifier: Programming Language :: Python
|
| 16 |
+
Classifier: Programming Language :: Python :: 3
|
| 17 |
+
Classifier: Programming Language :: Python :: 3 :: Only
|
| 18 |
+
Classifier: Programming Language :: Python :: 3.9
|
| 19 |
+
Classifier: Programming Language :: Python :: 3.10
|
| 20 |
+
Classifier: Programming Language :: Python :: 3.11
|
| 21 |
+
Classifier: Programming Language :: Python :: 3.12
|
| 22 |
+
Classifier: Programming Language :: Python :: 3.13
|
| 23 |
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
| 24 |
+
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
| 25 |
+
Requires-Python: >=3.9
|
| 26 |
+
Description-Content-Type: text/x-rst
|
| 27 |
+
License-File: LICENSE.txt
|
| 28 |
+
License-File: AUTHORS.txt
|
| 29 |
+
Dynamic: license-file
|
| 30 |
+
|
| 31 |
+
pip - The Python Package Installer
|
| 32 |
+
==================================
|
| 33 |
+
|
| 34 |
+
.. |pypi-version| image:: https://img.shields.io/pypi/v/pip.svg
|
| 35 |
+
:target: https://pypi.org/project/pip/
|
| 36 |
+
:alt: PyPI
|
| 37 |
+
|
| 38 |
+
.. |python-versions| image:: https://img.shields.io/pypi/pyversions/pip
|
| 39 |
+
:target: https://pypi.org/project/pip
|
| 40 |
+
:alt: PyPI - Python Version
|
| 41 |
+
|
| 42 |
+
.. |docs-badge| image:: https://readthedocs.org/projects/pip/badge/?version=latest
|
| 43 |
+
:target: https://pip.pypa.io/en/latest
|
| 44 |
+
:alt: Documentation
|
| 45 |
+
|
| 46 |
+
|pypi-version| |python-versions| |docs-badge|
|
| 47 |
+
|
| 48 |
+
pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.
|
| 49 |
+
|
| 50 |
+
Please take a look at our documentation for how to install and use pip:
|
| 51 |
+
|
| 52 |
+
* `Installation`_
|
| 53 |
+
* `Usage`_
|
| 54 |
+
|
| 55 |
+
We release updates regularly, with a new version every 3 months. Find more details in our documentation:
|
| 56 |
+
|
| 57 |
+
* `Release notes`_
|
| 58 |
+
* `Release process`_
|
| 59 |
+
|
| 60 |
+
If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:
|
| 61 |
+
|
| 62 |
+
* `Issue tracking`_
|
| 63 |
+
* `Discourse channel`_
|
| 64 |
+
* `User IRC`_
|
| 65 |
+
|
| 66 |
+
If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:
|
| 67 |
+
|
| 68 |
+
* `GitHub page`_
|
| 69 |
+
* `Development documentation`_
|
| 70 |
+
* `Development IRC`_
|
| 71 |
+
|
| 72 |
+
Code of Conduct
|
| 73 |
+
---------------
|
| 74 |
+
|
| 75 |
+
Everyone interacting in the pip project's codebases, issue trackers, chat
|
| 76 |
+
rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.
|
| 77 |
+
|
| 78 |
+
.. _package installer: https://packaging.python.org/guides/tool-recommendations/
|
| 79 |
+
.. _Python Package Index: https://pypi.org
|
| 80 |
+
.. _Installation: https://pip.pypa.io/en/stable/installation/
|
| 81 |
+
.. _Usage: https://pip.pypa.io/en/stable/
|
| 82 |
+
.. _Release notes: https://pip.pypa.io/en/stable/news.html
|
| 83 |
+
.. _Release process: https://pip.pypa.io/en/latest/development/release-process/
|
| 84 |
+
.. _GitHub page: https://github.com/pypa/pip
|
| 85 |
+
.. _Development documentation: https://pip.pypa.io/en/latest/development
|
| 86 |
+
.. _Issue tracking: https://github.com/pypa/pip/issues
|
| 87 |
+
.. _Discourse channel: https://discuss.python.org/c/packaging
|
| 88 |
+
.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa
|
| 89 |
+
.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev
|
| 90 |
+
.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
|
ccevolve/blog/publish/.venv/lib/python3.13/site-packages/pip-25.1.1.dist-info/RECORD
ADDED
|
@@ -0,0 +1,856 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
../../../bin/pip,sha256=mUz50P86fvxkd5ebq1BmZipL-g4fVdf42YJqEQg9v5Q,278
|
| 2 |
+
../../../bin/pip3,sha256=mUz50P86fvxkd5ebq1BmZipL-g4fVdf42YJqEQg9v5Q,278
|
| 3 |
+
../../../bin/pip3.13,sha256=mUz50P86fvxkd5ebq1BmZipL-g4fVdf42YJqEQg9v5Q,278
|
| 4 |
+
pip-25.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
| 5 |
+
pip-25.1.1.dist-info/METADATA,sha256=QFxj1tLpk8hGWrgQLRhJYUpwo_1FqBr43OT0srIZcmU,3649
|
| 6 |
+
pip-25.1.1.dist-info/RECORD,,
|
| 7 |
+
pip-25.1.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 8 |
+
pip-25.1.1.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
|
| 9 |
+
pip-25.1.1.dist-info/entry_points.txt,sha256=eeIjuzfnfR2PrhbjnbzFU6MnSS70kZLxwaHHq6M-bD0,87
|
| 10 |
+
pip-25.1.1.dist-info/licenses/AUTHORS.txt,sha256=YzDFTYpeYnwpmODDFTgyKZNKWcfdO10L5Ex_U6kJLRc,11223
|
| 11 |
+
pip-25.1.1.dist-info/licenses/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
|
| 12 |
+
pip-25.1.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
| 13 |
+
pip/__init__.py,sha256=zQQ7Na8YWi0IN86IUKEzDAJtyVpXdJXYDkQ536caUiQ,357
|
| 14 |
+
pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854
|
| 15 |
+
pip/__pip-runner__.py,sha256=JOoEZTwrtv7jRaXBkgSQKAE04yNyfFmGHxqpHiGHvL0,1450
|
| 16 |
+
pip/__pycache__/__init__.cpython-313.pyc,,
|
| 17 |
+
pip/__pycache__/__main__.cpython-313.pyc,,
|
| 18 |
+
pip/__pycache__/__pip-runner__.cpython-313.pyc,,
|
| 19 |
+
pip/_internal/__init__.py,sha256=MfcoOluDZ8QMCFYal04IqOJ9q6m2V7a0aOsnI-WOxUo,513
|
| 20 |
+
pip/_internal/__pycache__/__init__.cpython-313.pyc,,
|
| 21 |
+
pip/_internal/__pycache__/build_env.cpython-313.pyc,,
|
| 22 |
+
pip/_internal/__pycache__/cache.cpython-313.pyc,,
|
| 23 |
+
pip/_internal/__pycache__/configuration.cpython-313.pyc,,
|
| 24 |
+
pip/_internal/__pycache__/exceptions.cpython-313.pyc,,
|
| 25 |
+
pip/_internal/__pycache__/main.cpython-313.pyc,,
|
| 26 |
+
pip/_internal/__pycache__/pyproject.cpython-313.pyc,,
|
| 27 |
+
pip/_internal/__pycache__/self_outdated_check.cpython-313.pyc,,
|
| 28 |
+
pip/_internal/__pycache__/wheel_builder.cpython-313.pyc,,
|
| 29 |
+
pip/_internal/build_env.py,sha256=60_espLI9X3C2db3Ww2gIcyjNk2cAPNcc5gsVO4DOqg,10924
|
| 30 |
+
pip/_internal/cache.py,sha256=SjhJK1C6NbonrU4AyYXKTOH0CGOk5cJrYt60mRANnPM,10368
|
| 31 |
+
pip/_internal/cli/__init__.py,sha256=Iqg_tKA771XuMO1P4t_sDHnSKPzkUb9D0DqunAmw_ko,131
|
| 32 |
+
pip/_internal/cli/__pycache__/__init__.cpython-313.pyc,,
|
| 33 |
+
pip/_internal/cli/__pycache__/autocompletion.cpython-313.pyc,,
|
| 34 |
+
pip/_internal/cli/__pycache__/base_command.cpython-313.pyc,,
|
| 35 |
+
pip/_internal/cli/__pycache__/cmdoptions.cpython-313.pyc,,
|
| 36 |
+
pip/_internal/cli/__pycache__/command_context.cpython-313.pyc,,
|
| 37 |
+
pip/_internal/cli/__pycache__/index_command.cpython-313.pyc,,
|
| 38 |
+
pip/_internal/cli/__pycache__/main.cpython-313.pyc,,
|
| 39 |
+
pip/_internal/cli/__pycache__/main_parser.cpython-313.pyc,,
|
| 40 |
+
pip/_internal/cli/__pycache__/parser.cpython-313.pyc,,
|
| 41 |
+
pip/_internal/cli/__pycache__/progress_bars.cpython-313.pyc,,
|
| 42 |
+
pip/_internal/cli/__pycache__/req_command.cpython-313.pyc,,
|
| 43 |
+
pip/_internal/cli/__pycache__/spinners.cpython-313.pyc,,
|
| 44 |
+
pip/_internal/cli/__pycache__/status_codes.cpython-313.pyc,,
|
| 45 |
+
pip/_internal/cli/autocompletion.py,sha256=fs0Wy16Ga5tX1IZKvww5BDi7i5zyzfCPvu7cgXlgXys,6864
|
| 46 |
+
pip/_internal/cli/base_command.py,sha256=0A8YuJVJh2YyXU8pdW0eidLg1eklCW5cU01mpI-FAxA,8351
|
| 47 |
+
pip/_internal/cli/cmdoptions.py,sha256=-_V4gjMa0c3U8-vXKAyb5xVViJNzFAxBI3Zx_6Ds5-g,31909
|
| 48 |
+
pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774
|
| 49 |
+
pip/_internal/cli/index_command.py,sha256=kplkusUgCZy75jNCo-etaDmSG8UvqcR2W50ALDdm6dk,5720
|
| 50 |
+
pip/_internal/cli/main.py,sha256=1bXC7uL3tdb_EZlGVKs6_TgzC9tlKU7zhAZsbZA-IzY,2816
|
| 51 |
+
pip/_internal/cli/main_parser.py,sha256=chZqNmCuO_JYt8ynBCumh4crURaRoXBZ0RxoSYQIwCw,4337
|
| 52 |
+
pip/_internal/cli/parser.py,sha256=VCMtduzECUV87KaHNu-xJ-wLNL82yT3x16V4XBxOAqI,10825
|
| 53 |
+
pip/_internal/cli/progress_bars.py,sha256=r9BD4T2-egcInB1Uh9Jjw3EP9F3INy5kZhGwSePm9jo,4435
|
| 54 |
+
pip/_internal/cli/req_command.py,sha256=1yfssBvnUKNer8D7iT3OHqdJJNdCqRhwDqUFWgieppk,12934
|
| 55 |
+
pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118
|
| 56 |
+
pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
|
| 57 |
+
pip/_internal/commands/__init__.py,sha256=3405KyFv4l0ruxeF69oosFanxNQcC_fHBGv7Rpt0PXg,4009
|
| 58 |
+
pip/_internal/commands/__pycache__/__init__.cpython-313.pyc,,
|
| 59 |
+
pip/_internal/commands/__pycache__/cache.cpython-313.pyc,,
|
| 60 |
+
pip/_internal/commands/__pycache__/check.cpython-313.pyc,,
|
| 61 |
+
pip/_internal/commands/__pycache__/completion.cpython-313.pyc,,
|
| 62 |
+
pip/_internal/commands/__pycache__/configuration.cpython-313.pyc,,
|
| 63 |
+
pip/_internal/commands/__pycache__/debug.cpython-313.pyc,,
|
| 64 |
+
pip/_internal/commands/__pycache__/download.cpython-313.pyc,,
|
| 65 |
+
pip/_internal/commands/__pycache__/freeze.cpython-313.pyc,,
|
| 66 |
+
pip/_internal/commands/__pycache__/hash.cpython-313.pyc,,
|
| 67 |
+
pip/_internal/commands/__pycache__/help.cpython-313.pyc,,
|
| 68 |
+
pip/_internal/commands/__pycache__/index.cpython-313.pyc,,
|
| 69 |
+
pip/_internal/commands/__pycache__/inspect.cpython-313.pyc,,
|
| 70 |
+
pip/_internal/commands/__pycache__/install.cpython-313.pyc,,
|
| 71 |
+
pip/_internal/commands/__pycache__/list.cpython-313.pyc,,
|
| 72 |
+
pip/_internal/commands/__pycache__/lock.cpython-313.pyc,,
|
| 73 |
+
pip/_internal/commands/__pycache__/search.cpython-313.pyc,,
|
| 74 |
+
pip/_internal/commands/__pycache__/show.cpython-313.pyc,,
|
| 75 |
+
pip/_internal/commands/__pycache__/uninstall.cpython-313.pyc,,
|
| 76 |
+
pip/_internal/commands/__pycache__/wheel.cpython-313.pyc,,
|
| 77 |
+
pip/_internal/commands/cache.py,sha256=IOezTicHjGE5sWdBx2nwPVgbjuJHM3s-BZEkpZLemuY,8107
|
| 78 |
+
pip/_internal/commands/check.py,sha256=Hr_4eiMd9cgVDgEvjtIdw915NmL7ROIWW8enkr8slPQ,2268
|
| 79 |
+
pip/_internal/commands/completion.py,sha256=W9QFQTPLjy2tPACJ_y3g9EgB1pbsh7pvCUX8ocuIdPg,4554
|
| 80 |
+
pip/_internal/commands/configuration.py,sha256=n98enwp6y0b5G6fiRQjaZo43FlJKYve_daMhN-4BRNc,9766
|
| 81 |
+
pip/_internal/commands/debug.py,sha256=DNDRgE9YsKrbYzU0s3VKi8rHtKF4X13CJ_br_8PUXO0,6797
|
| 82 |
+
pip/_internal/commands/download.py,sha256=0qB0nys6ZEPsog451lDsjL5Bx7Z97t-B80oFZKhpzKM,5273
|
| 83 |
+
pip/_internal/commands/freeze.py,sha256=YW-aMmAzzOaBWWobo9g4DPKuWp0dTC32lWMqXzKFLzE,3144
|
| 84 |
+
pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703
|
| 85 |
+
pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132
|
| 86 |
+
pip/_internal/commands/index.py,sha256=8UucFVwx6FmM8cNbaPY8iI5kZdV3f6jhqDa-S8aGgpg,5068
|
| 87 |
+
pip/_internal/commands/inspect.py,sha256=PGrY9TRTRCM3y5Ml8Bdk8DEOXquWRfscr4DRo1LOTPc,3189
|
| 88 |
+
pip/_internal/commands/install.py,sha256=SRsiLpead7A8bLdxMqxTAJM3sUFHtgN9zgBT98UQz5E,29757
|
| 89 |
+
pip/_internal/commands/list.py,sha256=Rwtf8B0d0-WrkM7Qsv41-dWg8I_r9BLuZV30wSWnzgU,13274
|
| 90 |
+
pip/_internal/commands/lock.py,sha256=bUYrryKa769UXM61imojoeVVgc_1ZHK-9a0hIJmmlCg,5941
|
| 91 |
+
pip/_internal/commands/search.py,sha256=IrfvxcRCSoZY9A5XAlCF1wtl_y2HPcXslQdHcjzwMNk,5784
|
| 92 |
+
pip/_internal/commands/show.py,sha256=Yh5rGYhR2Io5TkL0fFCMWE1VqqM4xhPHjhbdS3QgEac,8028
|
| 93 |
+
pip/_internal/commands/uninstall.py,sha256=7pOR7enK76gimyxQbzxcG1OsyLXL3DvX939xmM8Fvtg,3892
|
| 94 |
+
pip/_internal/commands/wheel.py,sha256=NEfaVF4f41VBNSn93RL8gkfCEDmdGhbP9xu_dE6cdUk,6346
|
| 95 |
+
pip/_internal/configuration.py,sha256=-KOok6jh3hFzXMPQFPJ1_EFjBpAsge-RSreQuLHLmzo,14005
|
| 96 |
+
pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858
|
| 97 |
+
pip/_internal/distributions/__pycache__/__init__.cpython-313.pyc,,
|
| 98 |
+
pip/_internal/distributions/__pycache__/base.cpython-313.pyc,,
|
| 99 |
+
pip/_internal/distributions/__pycache__/installed.cpython-313.pyc,,
|
| 100 |
+
pip/_internal/distributions/__pycache__/sdist.cpython-313.pyc,,
|
| 101 |
+
pip/_internal/distributions/__pycache__/wheel.cpython-313.pyc,,
|
| 102 |
+
pip/_internal/distributions/base.py,sha256=QeB9qvKXDIjLdPBDE5fMgpfGqMMCr-govnuoQnGuiF8,1783
|
| 103 |
+
pip/_internal/distributions/installed.py,sha256=QinHFbWAQ8oE0pbD8MFZWkwlnfU1QYTccA1vnhrlYOU,842
|
| 104 |
+
pip/_internal/distributions/sdist.py,sha256=PlcP4a6-R6c98XnOM-b6Lkb3rsvh9iG4ok8shaanrzs,6751
|
| 105 |
+
pip/_internal/distributions/wheel.py,sha256=THBYfnv7VVt8mYhMYUtH13S1E7FDwtDyDfmUcl8ai0E,1317
|
| 106 |
+
pip/_internal/exceptions.py,sha256=wpE11H0e4L9G6AH70sRG149z82X7wX530HK-9eA_DIQ,28464
|
| 107 |
+
pip/_internal/index/__init__.py,sha256=tzwMH_fhQeubwMqHdSivasg1cRgTSbNg2CiMVnzMmyU,29
|
| 108 |
+
pip/_internal/index/__pycache__/__init__.cpython-313.pyc,,
|
| 109 |
+
pip/_internal/index/__pycache__/collector.cpython-313.pyc,,
|
| 110 |
+
pip/_internal/index/__pycache__/package_finder.cpython-313.pyc,,
|
| 111 |
+
pip/_internal/index/__pycache__/sources.cpython-313.pyc,,
|
| 112 |
+
pip/_internal/index/collector.py,sha256=RdPO0JLAlmyBWPAWYHPyRoGjz3GNAeTngCNkbGey_mE,16265
|
| 113 |
+
pip/_internal/index/package_finder.py,sha256=RohRzzLExoXl7QDdTiqyxIaQEcHUn6UNOr9KzC1vjL0,38446
|
| 114 |
+
pip/_internal/index/sources.py,sha256=lPBLK5Xiy8Q6IQMio26Wl7ocfZOKkgGklIBNyUJ23fI,8632
|
| 115 |
+
pip/_internal/locations/__init__.py,sha256=vvTMNxghT0aEXrSdqpNtuRDGx08bzJxfDAUUfQ0Vb0A,14309
|
| 116 |
+
pip/_internal/locations/__pycache__/__init__.cpython-313.pyc,,
|
| 117 |
+
pip/_internal/locations/__pycache__/_distutils.cpython-313.pyc,,
|
| 118 |
+
pip/_internal/locations/__pycache__/_sysconfig.cpython-313.pyc,,
|
| 119 |
+
pip/_internal/locations/__pycache__/base.cpython-313.pyc,,
|
| 120 |
+
pip/_internal/locations/_distutils.py,sha256=x6nyVLj7X11Y4khIdf-mFlxMl2FWadtVEgeb8upc_WI,6013
|
| 121 |
+
pip/_internal/locations/_sysconfig.py,sha256=IGzds60qsFneRogC-oeBaY7bEh3lPt_v47kMJChQXsU,7724
|
| 122 |
+
pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556
|
| 123 |
+
pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340
|
| 124 |
+
pip/_internal/metadata/__init__.py,sha256=nGWuZvjQlIHudlMz_-bsUs2LDA2ZKNPGevZoEGcd64Y,5723
|
| 125 |
+
pip/_internal/metadata/__pycache__/__init__.cpython-313.pyc,,
|
| 126 |
+
pip/_internal/metadata/__pycache__/_json.cpython-313.pyc,,
|
| 127 |
+
pip/_internal/metadata/__pycache__/base.cpython-313.pyc,,
|
| 128 |
+
pip/_internal/metadata/__pycache__/pkg_resources.cpython-313.pyc,,
|
| 129 |
+
pip/_internal/metadata/_json.py,sha256=ezrIYazHCINM2QUk1eA9wEAMj3aeGWeDVgGalgUzKpc,2707
|
| 130 |
+
pip/_internal/metadata/base.py,sha256=jCbzdIc8MgWnPR4rfrvSQhSVzSoOyKOXhj3xe8BoG8c,25467
|
| 131 |
+
pip/_internal/metadata/importlib/__init__.py,sha256=jUUidoxnHcfITHHaAWG1G2i5fdBYklv_uJcjo2x7VYE,135
|
| 132 |
+
pip/_internal/metadata/importlib/__pycache__/__init__.cpython-313.pyc,,
|
| 133 |
+
pip/_internal/metadata/importlib/__pycache__/_compat.cpython-313.pyc,,
|
| 134 |
+
pip/_internal/metadata/importlib/__pycache__/_dists.cpython-313.pyc,,
|
| 135 |
+
pip/_internal/metadata/importlib/__pycache__/_envs.cpython-313.pyc,,
|
| 136 |
+
pip/_internal/metadata/importlib/_compat.py,sha256=c6av8sP8BBjAZuFSJow1iWfygUXNM3xRTCn5nqw6B9M,2796
|
| 137 |
+
pip/_internal/metadata/importlib/_dists.py,sha256=ftmYiyfUGUIjnVwt6W-Ijsimy5c28KgmXly5Q5IQ2P4,8279
|
| 138 |
+
pip/_internal/metadata/importlib/_envs.py,sha256=X63CkdAPJCYPhefYSLiQzPf9ijMXm5nL_A_Z68yp2-w,5297
|
| 139 |
+
pip/_internal/metadata/pkg_resources.py,sha256=U07ETAINSGeSRBfWUG93E4tZZbaW_f7PGzEqZN0hulc,10542
|
| 140 |
+
pip/_internal/models/__init__.py,sha256=AjmCEBxX_MH9f_jVjIGNCFJKYCYeSEe18yyvNx4uRKQ,62
|
| 141 |
+
pip/_internal/models/__pycache__/__init__.cpython-313.pyc,,
|
| 142 |
+
pip/_internal/models/__pycache__/candidate.cpython-313.pyc,,
|
| 143 |
+
pip/_internal/models/__pycache__/direct_url.cpython-313.pyc,,
|
| 144 |
+
pip/_internal/models/__pycache__/format_control.cpython-313.pyc,,
|
| 145 |
+
pip/_internal/models/__pycache__/index.cpython-313.pyc,,
|
| 146 |
+
pip/_internal/models/__pycache__/installation_report.cpython-313.pyc,,
|
| 147 |
+
pip/_internal/models/__pycache__/link.cpython-313.pyc,,
|
| 148 |
+
pip/_internal/models/__pycache__/pylock.cpython-313.pyc,,
|
| 149 |
+
pip/_internal/models/__pycache__/scheme.cpython-313.pyc,,
|
| 150 |
+
pip/_internal/models/__pycache__/search_scope.cpython-313.pyc,,
|
| 151 |
+
pip/_internal/models/__pycache__/selection_prefs.cpython-313.pyc,,
|
| 152 |
+
pip/_internal/models/__pycache__/target_python.cpython-313.pyc,,
|
| 153 |
+
pip/_internal/models/__pycache__/wheel.cpython-313.pyc,,
|
| 154 |
+
pip/_internal/models/candidate.py,sha256=zzgFRuw_kWPjKpGw7LC0ZUMD2CQ2EberUIYs8izjdCA,753
|
| 155 |
+
pip/_internal/models/direct_url.py,sha256=lJ1fIVTgk5UG5SzTNR0FpgSGAQjChlH-3otgiEJAhIs,6576
|
| 156 |
+
pip/_internal/models/format_control.py,sha256=wtsQqSK9HaUiNxQEuB-C62eVimw6G4_VQFxV9-_KDBE,2486
|
| 157 |
+
pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030
|
| 158 |
+
pip/_internal/models/installation_report.py,sha256=zRVZoaz-2vsrezj_H3hLOhMZCK9c7TbzWgC-jOalD00,2818
|
| 159 |
+
pip/_internal/models/link.py,sha256=wIAgxhiu05ycLhbtAibknXX5L6X9ju_PPLVnMcvh9B4,21511
|
| 160 |
+
pip/_internal/models/pylock.py,sha256=n3-I26bf2v-Kn6qcx4ATB_Zel2SLhaUxZBmsMeGgYAo,6196
|
| 161 |
+
pip/_internal/models/scheme.py,sha256=PakmHJM3e8OOWSZFtfz1Az7f1meONJnkGuQxFlt3wBE,575
|
| 162 |
+
pip/_internal/models/search_scope.py,sha256=67NEnsYY84784S-MM7ekQuo9KXLH-7MzFntXjapvAo0,4531
|
| 163 |
+
pip/_internal/models/selection_prefs.py,sha256=qaFfDs3ciqoXPg6xx45N1jPLqccLJw4N0s4P0PyHTQ8,2015
|
| 164 |
+
pip/_internal/models/target_python.py,sha256=2XaH2rZ5ZF-K5wcJbEMGEl7SqrTToDDNkrtQ2v_v_-Q,4271
|
| 165 |
+
pip/_internal/models/wheel.py,sha256=10NUTXIRjf2P8oe1Wzolv8oUv7-YurrOduVFUIaDhdM,5506
|
| 166 |
+
pip/_internal/network/__init__.py,sha256=FMy06P__y6jMjUc8z3ZcQdKF-pmZ2zM14_vBeHPGhUI,49
|
| 167 |
+
pip/_internal/network/__pycache__/__init__.cpython-313.pyc,,
|
| 168 |
+
pip/_internal/network/__pycache__/auth.cpython-313.pyc,,
|
| 169 |
+
pip/_internal/network/__pycache__/cache.cpython-313.pyc,,
|
| 170 |
+
pip/_internal/network/__pycache__/download.cpython-313.pyc,,
|
| 171 |
+
pip/_internal/network/__pycache__/lazy_wheel.cpython-313.pyc,,
|
| 172 |
+
pip/_internal/network/__pycache__/session.cpython-313.pyc,,
|
| 173 |
+
pip/_internal/network/__pycache__/utils.cpython-313.pyc,,
|
| 174 |
+
pip/_internal/network/__pycache__/xmlrpc.cpython-313.pyc,,
|
| 175 |
+
pip/_internal/network/auth.py,sha256=D4gASjUrqoDFlSt6gQ767KAAjv6PUyJU0puDlhXNVRE,20809
|
| 176 |
+
pip/_internal/network/cache.py,sha256=JGYT-BUaSMdEBwII_K1UE6qyBItz7hzGkyLl_JRzkBY,4613
|
| 177 |
+
pip/_internal/network/download.py,sha256=6IdZyoERWIsXXFUFL_h_e_xi8Z0G0UlpkodPy8qKv2U,11078
|
| 178 |
+
pip/_internal/network/lazy_wheel.py,sha256=PBdoMoNQQIA84Fhgne38jWF52W4x_KtsHjxgv4dkRKA,7622
|
| 179 |
+
pip/_internal/network/session.py,sha256=msM4es16LmmNEYNkrYyg8fTc7gAHbKFltawfKP27LOI,18771
|
| 180 |
+
pip/_internal/network/utils.py,sha256=Inaxel-NxBu4PQWkjyErdnfewsFCcgHph7dzR1-FboY,4088
|
| 181 |
+
pip/_internal/network/xmlrpc.py,sha256=jW9oDSWamMld3iZOO9RbonVC8ZStkHyppCszoevkuJg,1837
|
| 182 |
+
pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 183 |
+
pip/_internal/operations/__pycache__/__init__.cpython-313.pyc,,
|
| 184 |
+
pip/_internal/operations/__pycache__/check.cpython-313.pyc,,
|
| 185 |
+
pip/_internal/operations/__pycache__/freeze.cpython-313.pyc,,
|
| 186 |
+
pip/_internal/operations/__pycache__/prepare.cpython-313.pyc,,
|
| 187 |
+
pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 188 |
+
pip/_internal/operations/build/__pycache__/__init__.cpython-313.pyc,,
|
| 189 |
+
pip/_internal/operations/build/__pycache__/build_tracker.cpython-313.pyc,,
|
| 190 |
+
pip/_internal/operations/build/__pycache__/metadata.cpython-313.pyc,,
|
| 191 |
+
pip/_internal/operations/build/__pycache__/metadata_editable.cpython-313.pyc,,
|
| 192 |
+
pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-313.pyc,,
|
| 193 |
+
pip/_internal/operations/build/__pycache__/wheel.cpython-313.pyc,,
|
| 194 |
+
pip/_internal/operations/build/__pycache__/wheel_editable.cpython-313.pyc,,
|
| 195 |
+
pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-313.pyc,,
|
| 196 |
+
pip/_internal/operations/build/build_tracker.py,sha256=-ARW_TcjHCOX7D2NUOGntB4Fgc6b4aolsXkAK6BWL7w,4774
|
| 197 |
+
pip/_internal/operations/build/metadata.py,sha256=INHaeiRfOiLYCXApfDNRo9Cw2xI4VwTc0KItvfdfOjk,1421
|
| 198 |
+
pip/_internal/operations/build/metadata_editable.py,sha256=oWudMsnjy4loO_Jy7g4N9nxsnaEX_iDlVRgCy7pu1rs,1509
|
| 199 |
+
pip/_internal/operations/build/metadata_legacy.py,sha256=wv8cFA0wTqF62Jlm9QwloYZsofOyQ7sWBBmvCcVvn1k,2189
|
| 200 |
+
pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075
|
| 201 |
+
pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417
|
| 202 |
+
pip/_internal/operations/build/wheel_legacy.py,sha256=KXpyGYoCQYcudXNZvohLXgWHaCk4Gf3z0dbS9ol4uu0,3620
|
| 203 |
+
pip/_internal/operations/check.py,sha256=4cnD_2eglsDe5s2CoYkxDt4HcRitTywzLMfTZ-tGQ4U,5911
|
| 204 |
+
pip/_internal/operations/freeze.py,sha256=1_M79jAQKnCxWr-KCCmHuVXOVFGaUJHmoWLfFzgh7K4,9843
|
| 205 |
+
pip/_internal/operations/install/__init__.py,sha256=ak-UETcQPKlFZaWoYKWu5QVXbpFBvg0sXc3i0O4vSYY,50
|
| 206 |
+
pip/_internal/operations/install/__pycache__/__init__.cpython-313.pyc,,
|
| 207 |
+
pip/_internal/operations/install/__pycache__/editable_legacy.cpython-313.pyc,,
|
| 208 |
+
pip/_internal/operations/install/__pycache__/wheel.cpython-313.pyc,,
|
| 209 |
+
pip/_internal/operations/install/editable_legacy.py,sha256=TI6wT8sLqDTprWZLYEOBOe7a6-1B9uwKb7kTBxLIaWY,1282
|
| 210 |
+
pip/_internal/operations/install/wheel.py,sha256=4NYSQ9ypl69iiduh5gUPCK3WNYqouTHZ0rMXoVgkiZw,27553
|
| 211 |
+
pip/_internal/operations/prepare.py,sha256=-i9dYwwJJjN7h6sZTabcz84tizgn7EAsY0sHnLAfs3Q,28363
|
| 212 |
+
pip/_internal/pyproject.py,sha256=GLJ6rWRS5_2noKdajohoLyDty57Z7QXhcUAYghmTnWc,7286
|
| 213 |
+
pip/_internal/req/__init__.py,sha256=dX2QGlfDwEqE5pLjOeM-f2qEgXFn6f2Vdi_zIHAYy1k,3096
|
| 214 |
+
pip/_internal/req/__pycache__/__init__.cpython-313.pyc,,
|
| 215 |
+
pip/_internal/req/__pycache__/constructors.cpython-313.pyc,,
|
| 216 |
+
pip/_internal/req/__pycache__/req_dependency_group.cpython-313.pyc,,
|
| 217 |
+
pip/_internal/req/__pycache__/req_file.cpython-313.pyc,,
|
| 218 |
+
pip/_internal/req/__pycache__/req_install.cpython-313.pyc,,
|
| 219 |
+
pip/_internal/req/__pycache__/req_set.cpython-313.pyc,,
|
| 220 |
+
pip/_internal/req/__pycache__/req_uninstall.cpython-313.pyc,,
|
| 221 |
+
pip/_internal/req/constructors.py,sha256=v1qzCN1mIldwx-nCrPc8JO4lxkm3Fv8M5RWvt8LISjc,18430
|
| 222 |
+
pip/_internal/req/req_dependency_group.py,sha256=5PGuZidqwDeTHZkP4tnNrlPrasfvJBONd1B5S0146zs,2677
|
| 223 |
+
pip/_internal/req/req_file.py,sha256=eys82McgaICOGic2UZRHjD720piKJPwmeSYdXlWwl6w,20234
|
| 224 |
+
pip/_internal/req/req_install.py,sha256=gMoFak9zrhjHlHaOQxPFheHKtIobppFgq1WrKel_nTE,35788
|
| 225 |
+
pip/_internal/req/req_set.py,sha256=j3esG0s6SzoVReX9rWn4rpYNtyET_fwxbwJPRimvRxo,2858
|
| 226 |
+
pip/_internal/req/req_uninstall.py,sha256=PQ6SyocDycUYsLAsTpjkbdwO_qjdo-y8BvQfZ5Avdrw,24075
|
| 227 |
+
pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 228 |
+
pip/_internal/resolution/__pycache__/__init__.cpython-313.pyc,,
|
| 229 |
+
pip/_internal/resolution/__pycache__/base.cpython-313.pyc,,
|
| 230 |
+
pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583
|
| 231 |
+
pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 232 |
+
pip/_internal/resolution/legacy/__pycache__/__init__.cpython-313.pyc,,
|
| 233 |
+
pip/_internal/resolution/legacy/__pycache__/resolver.cpython-313.pyc,,
|
| 234 |
+
pip/_internal/resolution/legacy/resolver.py,sha256=3HZiJBRd1FTN6jQpI4qRO8-TbLYeIbUTS6PFvXnXs2w,24068
|
| 235 |
+
pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 236 |
+
pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-313.pyc,,
|
| 237 |
+
pip/_internal/resolution/resolvelib/__pycache__/base.cpython-313.pyc,,
|
| 238 |
+
pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-313.pyc,,
|
| 239 |
+
pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-313.pyc,,
|
| 240 |
+
pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-313.pyc,,
|
| 241 |
+
pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-313.pyc,,
|
| 242 |
+
pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-313.pyc,,
|
| 243 |
+
pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-313.pyc,,
|
| 244 |
+
pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-313.pyc,,
|
| 245 |
+
pip/_internal/resolution/resolvelib/base.py,sha256=DCf669FsqyQY5uqXeePDHQY1e4QO-pBzWH8O0s9-K94,5023
|
| 246 |
+
pip/_internal/resolution/resolvelib/candidates.py,sha256=U3Qp83jhM_RiJviyrlPCijbps6wYO6VsTDaTnCf_B3o,20241
|
| 247 |
+
pip/_internal/resolution/resolvelib/factory.py,sha256=FCvHc9M8UJ_7iU63QtPiHuq_BmfdnBiMJ8WaDBJNFxk,32668
|
| 248 |
+
pip/_internal/resolution/resolvelib/found_candidates.py,sha256=6lAF_pLQ2_Z0CBOHIFxGp6NfvT1uwIpCui6e-GgI5tk,6000
|
| 249 |
+
pip/_internal/resolution/resolvelib/provider.py,sha256=8ptYOOjfa336D4FZ751EQHR0LDq8jJhIGJXDou8Cv8Y,11190
|
| 250 |
+
pip/_internal/resolution/resolvelib/reporter.py,sha256=EwJAHOjWZ8eTHQWss7zJjmQEj6ooP6oWSwwVXFtgpqQ,3260
|
| 251 |
+
pip/_internal/resolution/resolvelib/requirements.py,sha256=7JG4Z72e5Yk4vU0S5ulGvbqTy4FMQGYhY5zQhX9zTtY,8065
|
| 252 |
+
pip/_internal/resolution/resolvelib/resolver.py,sha256=9zcR4c7UZV1j2ILTmb68Ck_5HdvQvf4cmTBE2bWHkKg,12785
|
| 253 |
+
pip/_internal/self_outdated_check.py,sha256=1PFtttvLAeyCVR3tPoBq2sOlPD0IJ-KSqU6bc1HUk9c,8318
|
| 254 |
+
pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 255 |
+
pip/_internal/utils/__pycache__/__init__.cpython-313.pyc,,
|
| 256 |
+
pip/_internal/utils/__pycache__/_jaraco_text.cpython-313.pyc,,
|
| 257 |
+
pip/_internal/utils/__pycache__/_log.cpython-313.pyc,,
|
| 258 |
+
pip/_internal/utils/__pycache__/appdirs.cpython-313.pyc,,
|
| 259 |
+
pip/_internal/utils/__pycache__/compat.cpython-313.pyc,,
|
| 260 |
+
pip/_internal/utils/__pycache__/compatibility_tags.cpython-313.pyc,,
|
| 261 |
+
pip/_internal/utils/__pycache__/datetime.cpython-313.pyc,,
|
| 262 |
+
pip/_internal/utils/__pycache__/deprecation.cpython-313.pyc,,
|
| 263 |
+
pip/_internal/utils/__pycache__/direct_url_helpers.cpython-313.pyc,,
|
| 264 |
+
pip/_internal/utils/__pycache__/egg_link.cpython-313.pyc,,
|
| 265 |
+
pip/_internal/utils/__pycache__/entrypoints.cpython-313.pyc,,
|
| 266 |
+
pip/_internal/utils/__pycache__/filesystem.cpython-313.pyc,,
|
| 267 |
+
pip/_internal/utils/__pycache__/filetypes.cpython-313.pyc,,
|
| 268 |
+
pip/_internal/utils/__pycache__/glibc.cpython-313.pyc,,
|
| 269 |
+
pip/_internal/utils/__pycache__/hashes.cpython-313.pyc,,
|
| 270 |
+
pip/_internal/utils/__pycache__/logging.cpython-313.pyc,,
|
| 271 |
+
pip/_internal/utils/__pycache__/misc.cpython-313.pyc,,
|
| 272 |
+
pip/_internal/utils/__pycache__/packaging.cpython-313.pyc,,
|
| 273 |
+
pip/_internal/utils/__pycache__/retry.cpython-313.pyc,,
|
| 274 |
+
pip/_internal/utils/__pycache__/setuptools_build.cpython-313.pyc,,
|
| 275 |
+
pip/_internal/utils/__pycache__/subprocess.cpython-313.pyc,,
|
| 276 |
+
pip/_internal/utils/__pycache__/temp_dir.cpython-313.pyc,,
|
| 277 |
+
pip/_internal/utils/__pycache__/unpacking.cpython-313.pyc,,
|
| 278 |
+
pip/_internal/utils/__pycache__/urls.cpython-313.pyc,,
|
| 279 |
+
pip/_internal/utils/__pycache__/virtualenv.cpython-313.pyc,,
|
| 280 |
+
pip/_internal/utils/__pycache__/wheel.cpython-313.pyc,,
|
| 281 |
+
pip/_internal/utils/_jaraco_text.py,sha256=M15uUPIh5NpP1tdUGBxRau6q1ZAEtI8-XyLEETscFfE,3350
|
| 282 |
+
pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015
|
| 283 |
+
pip/_internal/utils/appdirs.py,sha256=zrIISCn2QxlXYw-zJZZBTrFNTyy_0WNKiI-TOoN6wJo,1705
|
| 284 |
+
pip/_internal/utils/compat.py,sha256=ckkFveBiYQjRWjkNsajt_oWPS57tJvE8XxoC4OIYgCY,2399
|
| 285 |
+
pip/_internal/utils/compatibility_tags.py,sha256=q5W7IrNlqC5ke0AqWRG6aX5pimiqh--xuPCCNwCKPsU,6662
|
| 286 |
+
pip/_internal/utils/datetime.py,sha256=Gt29Ml4ToPSM88j54iu43WKtrU9A-moP4QmMiiqzedU,241
|
| 287 |
+
pip/_internal/utils/deprecation.py,sha256=k7Qg_UBAaaTdyq82YVARA6D7RmcGTXGv7fnfcgigj4Q,3707
|
| 288 |
+
pip/_internal/utils/direct_url_helpers.py,sha256=r2MRtkVDACv9AGqYODBUC9CjwgtsUU1s68hmgfCJMtA,3196
|
| 289 |
+
pip/_internal/utils/egg_link.py,sha256=0FePZoUYKv4RGQ2t6x7w5Z427wbA_Uo3WZnAkrgsuqo,2463
|
| 290 |
+
pip/_internal/utils/entrypoints.py,sha256=4CheZ81OBPPLb3Gn-X_WEPtllUibpwDVzlVQ4RFh7PM,3325
|
| 291 |
+
pip/_internal/utils/filesystem.py,sha256=ajvA-q4ocliW9kPp8Yquh-4vssXbu-UKbo5FV9V4X64,4950
|
| 292 |
+
pip/_internal/utils/filetypes.py,sha256=OCPzUxq3Aa6k_95MiI8DYgkOzutTs47fA-v-vYUJp9E,715
|
| 293 |
+
pip/_internal/utils/glibc.py,sha256=vUkWq_1pJuzcYNcGKLlQmABoUiisK8noYY1yc8Wq4w4,3734
|
| 294 |
+
pip/_internal/utils/hashes.py,sha256=XGGLL0AG8-RhWnyz87xF6MFZ--BKadHU35D47eApCKI,4972
|
| 295 |
+
pip/_internal/utils/logging.py,sha256=zMZK1NxfhM4QMGUyaU9q1grNuDhLSVbSkGCvZBKmaPw,12076
|
| 296 |
+
pip/_internal/utils/misc.py,sha256=DWnYxBUItjRp7hhxEg4ih6P6YpKrykM86dbi_EcU8SQ,23450
|
| 297 |
+
pip/_internal/utils/packaging.py,sha256=CjJOqLNENW-U88ojOllVL40f1ab2W2Bm3KHCavwNNfw,1603
|
| 298 |
+
pip/_internal/utils/retry.py,sha256=mhFbykXjhTnZfgzeuy-vl9c8nECnYn_CMtwNJX2tYzQ,1392
|
| 299 |
+
pip/_internal/utils/setuptools_build.py,sha256=J9EyRantVgu4V-xS_qfQy2mcPLVUM7A-227QdKGUZCA,4482
|
| 300 |
+
pip/_internal/utils/subprocess.py,sha256=EsvqSRiSMHF98T8Txmu6NLU3U--MpTTQjtNgKP0P--M,8988
|
| 301 |
+
pip/_internal/utils/temp_dir.py,sha256=5qOXe8M4JeY6vaFQM867d5zkp1bSwMZ-KT5jymmP0Zg,9310
|
| 302 |
+
pip/_internal/utils/unpacking.py,sha256=4yCqlRAI2zxl5tfxlnLoWLNcEn-k1c3vaet_oaJ42iI,11926
|
| 303 |
+
pip/_internal/utils/urls.py,sha256=qceSOZb5lbNDrHNsv7_S4L4Ytszja5NwPKUMnZHbYnM,1599
|
| 304 |
+
pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456
|
| 305 |
+
pip/_internal/utils/wheel.py,sha256=MHObYn6d7VyZL10i-W1xoJZ2hT5-wB1WkII70AsYUE8,4493
|
| 306 |
+
pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596
|
| 307 |
+
pip/_internal/vcs/__pycache__/__init__.cpython-313.pyc,,
|
| 308 |
+
pip/_internal/vcs/__pycache__/bazaar.cpython-313.pyc,,
|
| 309 |
+
pip/_internal/vcs/__pycache__/git.cpython-313.pyc,,
|
| 310 |
+
pip/_internal/vcs/__pycache__/mercurial.cpython-313.pyc,,
|
| 311 |
+
pip/_internal/vcs/__pycache__/subversion.cpython-313.pyc,,
|
| 312 |
+
pip/_internal/vcs/__pycache__/versioncontrol.cpython-313.pyc,,
|
| 313 |
+
pip/_internal/vcs/bazaar.py,sha256=EKStcQaKpNu0NK4p5Q10Oc4xb3DUxFw024XrJy40bFQ,3528
|
| 314 |
+
pip/_internal/vcs/git.py,sha256=3KLPrKsDL9xZchmz4H1Obo8fM2Fh8ChrhtDHWjbkj-I,18591
|
| 315 |
+
pip/_internal/vcs/mercurial.py,sha256=oULOhzJ2Uie-06d1omkL-_Gc6meGaUkyogvqG9ZCyPs,5249
|
| 316 |
+
pip/_internal/vcs/subversion.py,sha256=ddTugHBqHzV3ebKlU5QXHPN4gUqlyXbOx8q8NgXKvs8,11735
|
| 317 |
+
pip/_internal/vcs/versioncontrol.py,sha256=cvf_-hnTAjQLXJ3d17FMNhQfcO1AcKWUF10tfrYyP-c,22440
|
| 318 |
+
pip/_internal/wheel_builder.py,sha256=Z5Z2ANADbKdSHY9BHqw9zG5-1AxstO6YM6m9yLWe7Vw,11212
|
| 319 |
+
pip/_vendor/__init__.py,sha256=WzusPTGWIMeQQWSVJ0h2rafGkVTa9WKJ2HT-2-EoZrU,4907
|
| 320 |
+
pip/_vendor/__pycache__/__init__.cpython-313.pyc,,
|
| 321 |
+
pip/_vendor/__pycache__/typing_extensions.cpython-313.pyc,,
|
| 322 |
+
pip/_vendor/cachecontrol/__init__.py,sha256=x9ecUkiwNvAGfE3g0eaRx3VrJZnZWAluA2LRcvab3HQ,677
|
| 323 |
+
pip/_vendor/cachecontrol/__pycache__/__init__.cpython-313.pyc,,
|
| 324 |
+
pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-313.pyc,,
|
| 325 |
+
pip/_vendor/cachecontrol/__pycache__/adapter.cpython-313.pyc,,
|
| 326 |
+
pip/_vendor/cachecontrol/__pycache__/cache.cpython-313.pyc,,
|
| 327 |
+
pip/_vendor/cachecontrol/__pycache__/controller.cpython-313.pyc,,
|
| 328 |
+
pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-313.pyc,,
|
| 329 |
+
pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-313.pyc,,
|
| 330 |
+
pip/_vendor/cachecontrol/__pycache__/serialize.cpython-313.pyc,,
|
| 331 |
+
pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-313.pyc,,
|
| 332 |
+
pip/_vendor/cachecontrol/_cmd.py,sha256=iist2EpzJvDVIhMAxXq8iFnTBsiZAd6iplxfmNboNyk,1737
|
| 333 |
+
pip/_vendor/cachecontrol/adapter.py,sha256=8y6rTPXOzVHmDKCW5CR9sivLVuDv-cpdGcZYdRWNaPw,6599
|
| 334 |
+
pip/_vendor/cachecontrol/cache.py,sha256=OXwv7Fn2AwnKNiahJHnjtvaKLndvVLv_-zO-ltlV9qI,1953
|
| 335 |
+
pip/_vendor/cachecontrol/caches/__init__.py,sha256=dtrrroK5BnADR1GWjCZ19aZ0tFsMfvFBtLQQU1sp_ag,303
|
| 336 |
+
pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-313.pyc,,
|
| 337 |
+
pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-313.pyc,,
|
| 338 |
+
pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-313.pyc,,
|
| 339 |
+
pip/_vendor/cachecontrol/caches/file_cache.py,sha256=d8upFmy_zwaCmlbWEVBlLXFddt8Zw8c5SFpxeOZsdfw,4117
|
| 340 |
+
pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=9rmqwtYu_ljVkW6_oLqbC7EaX_a8YT_yLuna-eS0dgo,1386
|
| 341 |
+
pip/_vendor/cachecontrol/controller.py,sha256=cx0Hl8xLZgUuXuy78Gih9AYjCtqurmYjVJxyA4yWt7w,19101
|
| 342 |
+
pip/_vendor/cachecontrol/filewrapper.py,sha256=2ktXNPE0KqnyzF24aOsKCA58HQq1xeC6l2g6_zwjghc,4291
|
| 343 |
+
pip/_vendor/cachecontrol/heuristics.py,sha256=gqMXU8w0gQuEQiSdu3Yg-0vd9kW7nrWKbLca75rheGE,4881
|
| 344 |
+
pip/_vendor/cachecontrol/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 345 |
+
pip/_vendor/cachecontrol/serialize.py,sha256=HQd2IllQ05HzPkVLMXTF2uX5mjEQjDBkxCqUJUODpZk,5163
|
| 346 |
+
pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417
|
| 347 |
+
pip/_vendor/certifi/__init__.py,sha256=neIaAf7BM36ygmQCmy-ZsSyjnvjWghFeu13wwEAnjj0,94
|
| 348 |
+
pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
|
| 349 |
+
pip/_vendor/certifi/__pycache__/__init__.cpython-313.pyc,,
|
| 350 |
+
pip/_vendor/certifi/__pycache__/__main__.cpython-313.pyc,,
|
| 351 |
+
pip/_vendor/certifi/__pycache__/core.cpython-313.pyc,,
|
| 352 |
+
pip/_vendor/certifi/cacert.pem,sha256=xVsh-Qf3-G1IrdCTVS-1ZRdJ_1-GBQjMu0I9bB-9gMc,297255
|
| 353 |
+
pip/_vendor/certifi/core.py,sha256=2SRT5rIcQChFDbe37BQa-kULxAgJ8qN6l1jfqTp4HIs,4486
|
| 354 |
+
pip/_vendor/certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 355 |
+
pip/_vendor/dependency_groups/__init__.py,sha256=C3OFu0NGwDzQ4LOmmSOFPsRSvkbBn-mdd4j_5YqJw-s,250
|
| 356 |
+
pip/_vendor/dependency_groups/__main__.py,sha256=UNTM7P5mfVtT7wDi9kOTXWgV3fu3e8bTrt1Qp1jvjKo,1709
|
| 357 |
+
pip/_vendor/dependency_groups/__pycache__/__init__.cpython-313.pyc,,
|
| 358 |
+
pip/_vendor/dependency_groups/__pycache__/__main__.cpython-313.pyc,,
|
| 359 |
+
pip/_vendor/dependency_groups/__pycache__/_implementation.cpython-313.pyc,,
|
| 360 |
+
pip/_vendor/dependency_groups/__pycache__/_lint_dependency_groups.cpython-313.pyc,,
|
| 361 |
+
pip/_vendor/dependency_groups/__pycache__/_pip_wrapper.cpython-313.pyc,,
|
| 362 |
+
pip/_vendor/dependency_groups/__pycache__/_toml_compat.cpython-313.pyc,,
|
| 363 |
+
pip/_vendor/dependency_groups/_implementation.py,sha256=Gqb2DlQELRakeHlKf6QtQSW0M-bcEomxHw4JsvID1ls,8041
|
| 364 |
+
pip/_vendor/dependency_groups/_lint_dependency_groups.py,sha256=yp-DDqKXtbkDTNa0ifa-FmOA8ra24lPZEXftW-R5AuI,1710
|
| 365 |
+
pip/_vendor/dependency_groups/_pip_wrapper.py,sha256=nuVW_w_ntVxpE26ELEvngMY0N04sFLsijXRyZZROFG8,1865
|
| 366 |
+
pip/_vendor/dependency_groups/_toml_compat.py,sha256=BHnXnFacm3DeolsA35GjI6qkDApvua-1F20kv3BfZWE,285
|
| 367 |
+
pip/_vendor/dependency_groups/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 368 |
+
pip/_vendor/distlib/__init__.py,sha256=dcwgYGYGQqAEawBXPDtIx80DO_3cOmFv8HTc8JMzknQ,625
|
| 369 |
+
pip/_vendor/distlib/__pycache__/__init__.cpython-313.pyc,,
|
| 370 |
+
pip/_vendor/distlib/__pycache__/compat.cpython-313.pyc,,
|
| 371 |
+
pip/_vendor/distlib/__pycache__/database.cpython-313.pyc,,
|
| 372 |
+
pip/_vendor/distlib/__pycache__/index.cpython-313.pyc,,
|
| 373 |
+
pip/_vendor/distlib/__pycache__/locators.cpython-313.pyc,,
|
| 374 |
+
pip/_vendor/distlib/__pycache__/manifest.cpython-313.pyc,,
|
| 375 |
+
pip/_vendor/distlib/__pycache__/markers.cpython-313.pyc,,
|
| 376 |
+
pip/_vendor/distlib/__pycache__/metadata.cpython-313.pyc,,
|
| 377 |
+
pip/_vendor/distlib/__pycache__/resources.cpython-313.pyc,,
|
| 378 |
+
pip/_vendor/distlib/__pycache__/scripts.cpython-313.pyc,,
|
| 379 |
+
pip/_vendor/distlib/__pycache__/util.cpython-313.pyc,,
|
| 380 |
+
pip/_vendor/distlib/__pycache__/version.cpython-313.pyc,,
|
| 381 |
+
pip/_vendor/distlib/__pycache__/wheel.cpython-313.pyc,,
|
| 382 |
+
pip/_vendor/distlib/compat.py,sha256=2jRSjRI4o-vlXeTK2BCGIUhkc6e9ZGhSsacRM5oseTw,41467
|
| 383 |
+
pip/_vendor/distlib/database.py,sha256=mHy_LxiXIsIVRb-T0-idBrVLw3Ffij5teHCpbjmJ9YU,51160
|
| 384 |
+
pip/_vendor/distlib/index.py,sha256=lTbw268rRhj8dw1sib3VZ_0EhSGgoJO3FKJzSFMOaeA,20797
|
| 385 |
+
pip/_vendor/distlib/locators.py,sha256=oBeAZpFuPQSY09MgNnLfQGGAXXvVO96BFpZyKMuK4tM,51026
|
| 386 |
+
pip/_vendor/distlib/manifest.py,sha256=3qfmAmVwxRqU1o23AlfXrQGZzh6g_GGzTAP_Hb9C5zQ,14168
|
| 387 |
+
pip/_vendor/distlib/markers.py,sha256=X6sDvkFGcYS8gUW8hfsWuKEKAqhQZAJ7iXOMLxRYjYk,5164
|
| 388 |
+
pip/_vendor/distlib/metadata.py,sha256=zil3sg2EUfLXVigljY2d_03IJt-JSs7nX-73fECMX2s,38724
|
| 389 |
+
pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820
|
| 390 |
+
pip/_vendor/distlib/scripts.py,sha256=BJliaDAZaVB7WAkwokgC3HXwLD2iWiHaVI50H7C6eG8,18608
|
| 391 |
+
pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792
|
| 392 |
+
pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784
|
| 393 |
+
pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032
|
| 394 |
+
pip/_vendor/distlib/util.py,sha256=vMPGvsS4j9hF6Y9k3Tyom1aaHLb0rFmZAEyzeAdel9w,66682
|
| 395 |
+
pip/_vendor/distlib/version.py,sha256=s5VIs8wBn0fxzGxWM_aA2ZZyx525HcZbMvcTlTyZ3Rg,23727
|
| 396 |
+
pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648
|
| 397 |
+
pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448
|
| 398 |
+
pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888
|
| 399 |
+
pip/_vendor/distlib/wheel.py,sha256=DFIVguEQHCdxnSdAO0dfFsgMcvVZitg7bCOuLwZ7A_s,43979
|
| 400 |
+
pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981
|
| 401 |
+
pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64
|
| 402 |
+
pip/_vendor/distro/__pycache__/__init__.cpython-313.pyc,,
|
| 403 |
+
pip/_vendor/distro/__pycache__/__main__.cpython-313.pyc,,
|
| 404 |
+
pip/_vendor/distro/__pycache__/distro.cpython-313.pyc,,
|
| 405 |
+
pip/_vendor/distro/distro.py,sha256=XqbefacAhDT4zr_trnbA15eY8vdK4GTghgmvUGrEM_4,49430
|
| 406 |
+
pip/_vendor/distro/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 407 |
+
pip/_vendor/idna/__init__.py,sha256=MPqNDLZbXqGaNdXxAFhiqFPKEQXju2jNQhCey6-5eJM,868
|
| 408 |
+
pip/_vendor/idna/__pycache__/__init__.cpython-313.pyc,,
|
| 409 |
+
pip/_vendor/idna/__pycache__/codec.cpython-313.pyc,,
|
| 410 |
+
pip/_vendor/idna/__pycache__/compat.cpython-313.pyc,,
|
| 411 |
+
pip/_vendor/idna/__pycache__/core.cpython-313.pyc,,
|
| 412 |
+
pip/_vendor/idna/__pycache__/idnadata.cpython-313.pyc,,
|
| 413 |
+
pip/_vendor/idna/__pycache__/intranges.cpython-313.pyc,,
|
| 414 |
+
pip/_vendor/idna/__pycache__/package_data.cpython-313.pyc,,
|
| 415 |
+
pip/_vendor/idna/__pycache__/uts46data.cpython-313.pyc,,
|
| 416 |
+
pip/_vendor/idna/codec.py,sha256=PEew3ItwzjW4hymbasnty2N2OXvNcgHB-JjrBuxHPYY,3422
|
| 417 |
+
pip/_vendor/idna/compat.py,sha256=RzLy6QQCdl9784aFhb2EX9EKGCJjg0P3PilGdeXXcx8,316
|
| 418 |
+
pip/_vendor/idna/core.py,sha256=YJYyAMnwiQEPjVC4-Fqu_p4CJ6yKKuDGmppBNQNQpFs,13239
|
| 419 |
+
pip/_vendor/idna/idnadata.py,sha256=W30GcIGvtOWYwAjZj4ZjuouUutC6ffgNuyjJy7fZ-lo,78306
|
| 420 |
+
pip/_vendor/idna/intranges.py,sha256=amUtkdhYcQG8Zr-CoMM_kVRacxkivC1WgxN1b63KKdU,1898
|
| 421 |
+
pip/_vendor/idna/package_data.py,sha256=q59S3OXsc5VI8j6vSD0sGBMyk6zZ4vWFREE88yCJYKs,21
|
| 422 |
+
pip/_vendor/idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 423 |
+
pip/_vendor/idna/uts46data.py,sha256=rt90K9J40gUSwppDPCrhjgi5AA6pWM65dEGRSf6rIhM,239289
|
| 424 |
+
pip/_vendor/msgpack/__init__.py,sha256=reRaiOtEzSjPnr7TpxjgIvbfln5pV66FhricAs2eC-g,1109
|
| 425 |
+
pip/_vendor/msgpack/__pycache__/__init__.cpython-313.pyc,,
|
| 426 |
+
pip/_vendor/msgpack/__pycache__/exceptions.cpython-313.pyc,,
|
| 427 |
+
pip/_vendor/msgpack/__pycache__/ext.cpython-313.pyc,,
|
| 428 |
+
pip/_vendor/msgpack/__pycache__/fallback.cpython-313.pyc,,
|
| 429 |
+
pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081
|
| 430 |
+
pip/_vendor/msgpack/ext.py,sha256=kteJv03n9tYzd5oo3xYopVTo4vRaAxonBQQJhXohZZo,5726
|
| 431 |
+
pip/_vendor/msgpack/fallback.py,sha256=0g1Pzp0vtmBEmJ5w9F3s_-JMVURP8RS4G1cc5TRaAsI,32390
|
| 432 |
+
pip/_vendor/packaging/__init__.py,sha256=_0cDiPVf2S-bNfVmZguxxzmrIYWlyASxpqph4qsJWUc,494
|
| 433 |
+
pip/_vendor/packaging/__pycache__/__init__.cpython-313.pyc,,
|
| 434 |
+
pip/_vendor/packaging/__pycache__/_elffile.cpython-313.pyc,,
|
| 435 |
+
pip/_vendor/packaging/__pycache__/_manylinux.cpython-313.pyc,,
|
| 436 |
+
pip/_vendor/packaging/__pycache__/_musllinux.cpython-313.pyc,,
|
| 437 |
+
pip/_vendor/packaging/__pycache__/_parser.cpython-313.pyc,,
|
| 438 |
+
pip/_vendor/packaging/__pycache__/_structures.cpython-313.pyc,,
|
| 439 |
+
pip/_vendor/packaging/__pycache__/_tokenizer.cpython-313.pyc,,
|
| 440 |
+
pip/_vendor/packaging/__pycache__/markers.cpython-313.pyc,,
|
| 441 |
+
pip/_vendor/packaging/__pycache__/metadata.cpython-313.pyc,,
|
| 442 |
+
pip/_vendor/packaging/__pycache__/requirements.cpython-313.pyc,,
|
| 443 |
+
pip/_vendor/packaging/__pycache__/specifiers.cpython-313.pyc,,
|
| 444 |
+
pip/_vendor/packaging/__pycache__/tags.cpython-313.pyc,,
|
| 445 |
+
pip/_vendor/packaging/__pycache__/utils.cpython-313.pyc,,
|
| 446 |
+
pip/_vendor/packaging/__pycache__/version.cpython-313.pyc,,
|
| 447 |
+
pip/_vendor/packaging/_elffile.py,sha256=UkrbDtW7aeq3qqoAfU16ojyHZ1xsTvGke_WqMTKAKd0,3286
|
| 448 |
+
pip/_vendor/packaging/_manylinux.py,sha256=t4y_-dTOcfr36gLY-ztiOpxxJFGO2ikC11HgfysGxiM,9596
|
| 449 |
+
pip/_vendor/packaging/_musllinux.py,sha256=p9ZqNYiOItGee8KcZFeHF_YcdhVwGHdK6r-8lgixvGQ,2694
|
| 450 |
+
pip/_vendor/packaging/_parser.py,sha256=gYfnj0pRHflVc4RHZit13KNTyN9iiVcU2RUCGi22BwM,10221
|
| 451 |
+
pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431
|
| 452 |
+
pip/_vendor/packaging/_tokenizer.py,sha256=OYzt7qKxylOAJ-q0XyK1qAycyPRYLfMPdGQKRXkZWyI,5310
|
| 453 |
+
pip/_vendor/packaging/licenses/__init__.py,sha256=3bx-gryo4sRv5LsrwApouy65VIs3u6irSORJzALkrzU,5727
|
| 454 |
+
pip/_vendor/packaging/licenses/__pycache__/__init__.cpython-313.pyc,,
|
| 455 |
+
pip/_vendor/packaging/licenses/__pycache__/_spdx.cpython-313.pyc,,
|
| 456 |
+
pip/_vendor/packaging/licenses/_spdx.py,sha256=oAm1ztPFwlsmCKe7lAAsv_OIOfS1cWDu9bNBkeu-2ns,48398
|
| 457 |
+
pip/_vendor/packaging/markers.py,sha256=P0we27jm1xUzgGMJxBjtUFCIWeBxTsMeJTOJ6chZmAY,12049
|
| 458 |
+
pip/_vendor/packaging/metadata.py,sha256=8IZErqQQnNm53dZZuYq4FGU4_dpyinMeH1QFBIWIkfE,34739
|
| 459 |
+
pip/_vendor/packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 460 |
+
pip/_vendor/packaging/requirements.py,sha256=gYyRSAdbrIyKDY66ugIDUQjRMvxkH2ALioTmX3tnL6o,2947
|
| 461 |
+
pip/_vendor/packaging/specifiers.py,sha256=yc9D_MycJEmwUpZvcs1OZL9HfiNFmyw0RZaeHRNHkPw,40079
|
| 462 |
+
pip/_vendor/packaging/tags.py,sha256=41s97W9Zatrq2Ed7Rc3qeBDaHe8pKKvYq2mGjwahfXk,22745
|
| 463 |
+
pip/_vendor/packaging/utils.py,sha256=0F3Hh9OFuRgrhTgGZUl5K22Fv1YP2tZl1z_2gO6kJiA,5050
|
| 464 |
+
pip/_vendor/packaging/version.py,sha256=oiHqzTUv_p12hpjgsLDVcaF5hT7pDaSOViUNMD4GTW0,16688
|
| 465 |
+
pip/_vendor/pkg_resources/__init__.py,sha256=jrhDRbOubP74QuPXxd7U7Po42PH2l-LZ2XfcO7llpZ4,124463
|
| 466 |
+
pip/_vendor/pkg_resources/__pycache__/__init__.cpython-313.pyc,,
|
| 467 |
+
pip/_vendor/platformdirs/__init__.py,sha256=UfeSHWl8AeTtbOBOoHAxK4dODOWkZtfy-m_i7cWdJ8c,22344
|
| 468 |
+
pip/_vendor/platformdirs/__main__.py,sha256=jBJ8zb7Mpx5ebcqF83xrpO94MaeCpNGHVf9cvDN2JLg,1505
|
| 469 |
+
pip/_vendor/platformdirs/__pycache__/__init__.cpython-313.pyc,,
|
| 470 |
+
pip/_vendor/platformdirs/__pycache__/__main__.cpython-313.pyc,,
|
| 471 |
+
pip/_vendor/platformdirs/__pycache__/android.cpython-313.pyc,,
|
| 472 |
+
pip/_vendor/platformdirs/__pycache__/api.cpython-313.pyc,,
|
| 473 |
+
pip/_vendor/platformdirs/__pycache__/macos.cpython-313.pyc,,
|
| 474 |
+
pip/_vendor/platformdirs/__pycache__/unix.cpython-313.pyc,,
|
| 475 |
+
pip/_vendor/platformdirs/__pycache__/version.cpython-313.pyc,,
|
| 476 |
+
pip/_vendor/platformdirs/__pycache__/windows.cpython-313.pyc,,
|
| 477 |
+
pip/_vendor/platformdirs/android.py,sha256=r0DshVBf-RO1jXJGX8C4Til7F1XWt-bkdWMgmvEiaYg,9013
|
| 478 |
+
pip/_vendor/platformdirs/api.py,sha256=U9EzI3EYxcXWUCtIGRllqrcN99i2LSY1mq2-GtsUwEQ,9277
|
| 479 |
+
pip/_vendor/platformdirs/macos.py,sha256=UlbyFZ8Rzu3xndCqQEHrfsYTeHwYdFap1Ioz-yxveT4,6154
|
| 480 |
+
pip/_vendor/platformdirs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 481 |
+
pip/_vendor/platformdirs/unix.py,sha256=WZmkUA--L3JNRGmz32s35YfoD3ica6xKIPdCV_HhLcs,10458
|
| 482 |
+
pip/_vendor/platformdirs/version.py,sha256=0fnw4ljascx7O5PfIeZ2yj6w3pAkqwp099vDcivxuvY,511
|
| 483 |
+
pip/_vendor/platformdirs/windows.py,sha256=IFpiohUBwxPtCzlyKwNtxyW4Jk8haa6W8o59mfrDXVo,10125
|
| 484 |
+
pip/_vendor/pygments/__init__.py,sha256=qMm7-KYqNpMrmjymZaqfH-_9iJtjnexAKodkb9G5D5g,2983
|
| 485 |
+
pip/_vendor/pygments/__main__.py,sha256=WrndpSe6i1ckX_SQ1KaxD9CTKGzD0EuCOFxcbwFpoLU,353
|
| 486 |
+
pip/_vendor/pygments/__pycache__/__init__.cpython-313.pyc,,
|
| 487 |
+
pip/_vendor/pygments/__pycache__/__main__.cpython-313.pyc,,
|
| 488 |
+
pip/_vendor/pygments/__pycache__/console.cpython-313.pyc,,
|
| 489 |
+
pip/_vendor/pygments/__pycache__/filter.cpython-313.pyc,,
|
| 490 |
+
pip/_vendor/pygments/__pycache__/formatter.cpython-313.pyc,,
|
| 491 |
+
pip/_vendor/pygments/__pycache__/lexer.cpython-313.pyc,,
|
| 492 |
+
pip/_vendor/pygments/__pycache__/modeline.cpython-313.pyc,,
|
| 493 |
+
pip/_vendor/pygments/__pycache__/plugin.cpython-313.pyc,,
|
| 494 |
+
pip/_vendor/pygments/__pycache__/regexopt.cpython-313.pyc,,
|
| 495 |
+
pip/_vendor/pygments/__pycache__/scanner.cpython-313.pyc,,
|
| 496 |
+
pip/_vendor/pygments/__pycache__/sphinxext.cpython-313.pyc,,
|
| 497 |
+
pip/_vendor/pygments/__pycache__/style.cpython-313.pyc,,
|
| 498 |
+
pip/_vendor/pygments/__pycache__/token.cpython-313.pyc,,
|
| 499 |
+
pip/_vendor/pygments/__pycache__/unistring.cpython-313.pyc,,
|
| 500 |
+
pip/_vendor/pygments/__pycache__/util.cpython-313.pyc,,
|
| 501 |
+
pip/_vendor/pygments/console.py,sha256=AagDWqwea2yBWf10KC9ptBgMpMjxKp8yABAmh-NQOVk,1718
|
| 502 |
+
pip/_vendor/pygments/filter.py,sha256=YLtpTnZiu07nY3oK9nfR6E9Y1FBHhP5PX8gvkJWcfag,1910
|
| 503 |
+
pip/_vendor/pygments/filters/__init__.py,sha256=4U4jtA0X3iP83uQnB9-TI-HDSw8E8y8zMYHa0UjbbaI,40392
|
| 504 |
+
pip/_vendor/pygments/filters/__pycache__/__init__.cpython-313.pyc,,
|
| 505 |
+
pip/_vendor/pygments/formatter.py,sha256=KZQMmyo_xkOIkQG8g66LYEkBh1bx7a0HyGCBcvhI9Ew,4390
|
| 506 |
+
pip/_vendor/pygments/formatters/__init__.py,sha256=KTwBmnXlaopJhQDOemVHYHskiDghuq-08YtP6xPNJPg,5385
|
| 507 |
+
pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-313.pyc,,
|
| 508 |
+
pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-313.pyc,,
|
| 509 |
+
pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176
|
| 510 |
+
pip/_vendor/pygments/lexer.py,sha256=_kBrOJ_NT5Tl0IVM0rA9c8eysP6_yrlGzEQI0eVYB-A,35349
|
| 511 |
+
pip/_vendor/pygments/lexers/__init__.py,sha256=wbIME35GH7bI1B9rNPJFqWT-ij_RApZDYPUlZycaLzA,12115
|
| 512 |
+
pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-313.pyc,,
|
| 513 |
+
pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-313.pyc,,
|
| 514 |
+
pip/_vendor/pygments/lexers/__pycache__/python.cpython-313.pyc,,
|
| 515 |
+
pip/_vendor/pygments/lexers/_mapping.py,sha256=l4tCXM8e9aPC2BD6sjIr0deT-J-z5tHgCwL-p1fS0PE,77602
|
| 516 |
+
pip/_vendor/pygments/lexers/python.py,sha256=vxjn1cOHclIKJKxoyiBsQTY65GHbkZtZRuKQ2AVCKaw,53853
|
| 517 |
+
pip/_vendor/pygments/modeline.py,sha256=K5eSkR8GS1r5OkXXTHOcV0aM_6xpk9eWNEIAW-OOJ2g,1005
|
| 518 |
+
pip/_vendor/pygments/plugin.py,sha256=tPx0rJCTIZ9ioRgLNYG4pifCbAwTRUZddvLw-NfAk2w,1891
|
| 519 |
+
pip/_vendor/pygments/regexopt.py,sha256=wXaP9Gjp_hKAdnICqoDkRxAOQJSc4v3X6mcxx3z-TNs,3072
|
| 520 |
+
pip/_vendor/pygments/scanner.py,sha256=nNcETRR1tRuiTaHmHSTTECVYFPcLf6mDZu1e4u91A9E,3092
|
| 521 |
+
pip/_vendor/pygments/sphinxext.py,sha256=5x7Zh9YlU6ISJ31dMwduiaanb5dWZnKg3MyEQsseNnQ,7981
|
| 522 |
+
pip/_vendor/pygments/style.py,sha256=PlOZqlsnTVd58RGy50vkA2cXQ_lP5bF5EGMEBTno6DA,6420
|
| 523 |
+
pip/_vendor/pygments/styles/__init__.py,sha256=x9ebctfyvCAFpMTlMJ5YxwcNYBzjgq6zJaKkNm78r4M,2042
|
| 524 |
+
pip/_vendor/pygments/styles/__pycache__/__init__.cpython-313.pyc,,
|
| 525 |
+
pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-313.pyc,,
|
| 526 |
+
pip/_vendor/pygments/styles/_mapping.py,sha256=6lovFUE29tz6EsV3XYY4hgozJ7q1JL7cfO3UOlgnS8w,3312
|
| 527 |
+
pip/_vendor/pygments/token.py,sha256=WbdWGhYm_Vosb0DDxW9lHNPgITXfWTsQmHt6cy9RbcM,6226
|
| 528 |
+
pip/_vendor/pygments/unistring.py,sha256=al-_rBemRuGvinsrM6atNsHTmJ6DUbw24q2O2Ru1cBc,63208
|
| 529 |
+
pip/_vendor/pygments/util.py,sha256=oRtSpiAo5jM9ulntkvVbgXUdiAW57jnuYGB7t9fYuhc,10031
|
| 530 |
+
pip/_vendor/pyproject_hooks/__init__.py,sha256=cPB_a9LXz5xvsRbX1o2qyAdjLatZJdQ_Lc5McNX-X7Y,691
|
| 531 |
+
pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-313.pyc,,
|
| 532 |
+
pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-313.pyc,,
|
| 533 |
+
pip/_vendor/pyproject_hooks/_impl.py,sha256=jY-raxnmyRyB57ruAitrJRUzEexuAhGTpgMygqx67Z4,14936
|
| 534 |
+
pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=MJNPpfIxcO-FghxpBbxkG1rFiQf6HOUbV4U5mq0HFns,557
|
| 535 |
+
pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-313.pyc,,
|
| 536 |
+
pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-313.pyc,,
|
| 537 |
+
pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=qcXMhmx__MIJq10gGHW3mA4Tl8dy8YzHMccwnNoKlw0,12216
|
| 538 |
+
pip/_vendor/pyproject_hooks/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 539 |
+
pip/_vendor/requests/__init__.py,sha256=HlB_HzhrzGtfD_aaYUwUh1zWXLZ75_YCLyit75d0Vz8,5057
|
| 540 |
+
pip/_vendor/requests/__pycache__/__init__.cpython-313.pyc,,
|
| 541 |
+
pip/_vendor/requests/__pycache__/__version__.cpython-313.pyc,,
|
| 542 |
+
pip/_vendor/requests/__pycache__/_internal_utils.cpython-313.pyc,,
|
| 543 |
+
pip/_vendor/requests/__pycache__/adapters.cpython-313.pyc,,
|
| 544 |
+
pip/_vendor/requests/__pycache__/api.cpython-313.pyc,,
|
| 545 |
+
pip/_vendor/requests/__pycache__/auth.cpython-313.pyc,,
|
| 546 |
+
pip/_vendor/requests/__pycache__/certs.cpython-313.pyc,,
|
| 547 |
+
pip/_vendor/requests/__pycache__/compat.cpython-313.pyc,,
|
| 548 |
+
pip/_vendor/requests/__pycache__/cookies.cpython-313.pyc,,
|
| 549 |
+
pip/_vendor/requests/__pycache__/exceptions.cpython-313.pyc,,
|
| 550 |
+
pip/_vendor/requests/__pycache__/help.cpython-313.pyc,,
|
| 551 |
+
pip/_vendor/requests/__pycache__/hooks.cpython-313.pyc,,
|
| 552 |
+
pip/_vendor/requests/__pycache__/models.cpython-313.pyc,,
|
| 553 |
+
pip/_vendor/requests/__pycache__/packages.cpython-313.pyc,,
|
| 554 |
+
pip/_vendor/requests/__pycache__/sessions.cpython-313.pyc,,
|
| 555 |
+
pip/_vendor/requests/__pycache__/status_codes.cpython-313.pyc,,
|
| 556 |
+
pip/_vendor/requests/__pycache__/structures.cpython-313.pyc,,
|
| 557 |
+
pip/_vendor/requests/__pycache__/utils.cpython-313.pyc,,
|
| 558 |
+
pip/_vendor/requests/__version__.py,sha256=FVfglgZmNQnmYPXpOohDU58F5EUb_-VnSTaAesS187g,435
|
| 559 |
+
pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495
|
| 560 |
+
pip/_vendor/requests/adapters.py,sha256=J7VeVxKBvawbtlX2DERVo05J9BXTcWYLMHNd1Baa-bk,27607
|
| 561 |
+
pip/_vendor/requests/api.py,sha256=_Zb9Oa7tzVIizTKwFrPjDEY9ejtm_OnSRERnADxGsQs,6449
|
| 562 |
+
pip/_vendor/requests/auth.py,sha256=kF75tqnLctZ9Mf_hm9TZIj4cQWnN5uxRz8oWsx5wmR0,10186
|
| 563 |
+
pip/_vendor/requests/certs.py,sha256=kHDlkK_beuHXeMPc5jta2wgl8gdKeUWt5f2nTDVrvt8,441
|
| 564 |
+
pip/_vendor/requests/compat.py,sha256=Mo9f9xZpefod8Zm-n9_StJcVTmwSukXR2p3IQyyVXvU,1485
|
| 565 |
+
pip/_vendor/requests/cookies.py,sha256=bNi-iqEj4NPZ00-ob-rHvzkvObzN3lEpgw3g6paS3Xw,18590
|
| 566 |
+
pip/_vendor/requests/exceptions.py,sha256=D1wqzYWne1mS2rU43tP9CeN1G7QAy7eqL9o1god6Ejw,4272
|
| 567 |
+
pip/_vendor/requests/help.py,sha256=hRKaf9u0G7fdwrqMHtF3oG16RKktRf6KiwtSq2Fo1_0,3813
|
| 568 |
+
pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733
|
| 569 |
+
pip/_vendor/requests/models.py,sha256=x4K4CmH-lC0l2Kb-iPfMN4dRXxHEcbOaEWBL_i09AwI,35483
|
| 570 |
+
pip/_vendor/requests/packages.py,sha256=_ZQDCJTJ8SP3kVWunSqBsRZNPzj2c1WFVqbdr08pz3U,1057
|
| 571 |
+
pip/_vendor/requests/sessions.py,sha256=ykTI8UWGSltOfH07HKollH7kTBGw4WhiBVaQGmckTw4,30495
|
| 572 |
+
pip/_vendor/requests/status_codes.py,sha256=iJUAeA25baTdw-6PfD0eF4qhpINDJRJI-yaMqxs4LEI,4322
|
| 573 |
+
pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912
|
| 574 |
+
pip/_vendor/requests/utils.py,sha256=L79vnFbzJ3SFLKtJwpoWe41Tozi3RlZv94pY1TFIyow,33631
|
| 575 |
+
pip/_vendor/resolvelib/__init__.py,sha256=4LcBWHMH317EKEkpV5XLVnqiU1lrmCiygjsADuCgz4s,541
|
| 576 |
+
pip/_vendor/resolvelib/__pycache__/__init__.cpython-313.pyc,,
|
| 577 |
+
pip/_vendor/resolvelib/__pycache__/providers.cpython-313.pyc,,
|
| 578 |
+
pip/_vendor/resolvelib/__pycache__/reporters.cpython-313.pyc,,
|
| 579 |
+
pip/_vendor/resolvelib/__pycache__/structs.cpython-313.pyc,,
|
| 580 |
+
pip/_vendor/resolvelib/providers.py,sha256=pIWJbIdJJ9GFtNbtwTH0Ia43Vj6hYCEJj2DOLue15FM,8914
|
| 581 |
+
pip/_vendor/resolvelib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 582 |
+
pip/_vendor/resolvelib/reporters.py,sha256=8BNa7G9cKW4Lie4BhDhd7Z57J_Vlb1CYPGSgVN2erMA,2038
|
| 583 |
+
pip/_vendor/resolvelib/resolvers/__init__.py,sha256=GMYuhrbSsYTIjOij0tuJKLvlk6UXmp3nXQetn2sOvpQ,640
|
| 584 |
+
pip/_vendor/resolvelib/resolvers/__pycache__/__init__.cpython-313.pyc,,
|
| 585 |
+
pip/_vendor/resolvelib/resolvers/__pycache__/abstract.cpython-313.pyc,,
|
| 586 |
+
pip/_vendor/resolvelib/resolvers/__pycache__/criterion.cpython-313.pyc,,
|
| 587 |
+
pip/_vendor/resolvelib/resolvers/__pycache__/exceptions.cpython-313.pyc,,
|
| 588 |
+
pip/_vendor/resolvelib/resolvers/__pycache__/resolution.cpython-313.pyc,,
|
| 589 |
+
pip/_vendor/resolvelib/resolvers/abstract.py,sha256=jZOBVigE4PUub9i3F-bTvBwaIXX8S9EU3CGASBvFqEU,1558
|
| 590 |
+
pip/_vendor/resolvelib/resolvers/criterion.py,sha256=lcmZGv5sKHOnFD_RzZwvlGSj19MeA-5rCMpdf2Sgw7Y,1768
|
| 591 |
+
pip/_vendor/resolvelib/resolvers/exceptions.py,sha256=ln_jaQtgLlRUSFY627yiHG2gD7AgaXzRKaElFVh7fDQ,1768
|
| 592 |
+
pip/_vendor/resolvelib/resolvers/resolution.py,sha256=yQegMuOmlzAElLLpgD-k6NbPDMCQf29rWhiFC26OdkM,20671
|
| 593 |
+
pip/_vendor/resolvelib/structs.py,sha256=pu-EJiR2IBITr2SQeNPRa0rXhjlStfmO_GEgAhr3004,6420
|
| 594 |
+
pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090
|
| 595 |
+
pip/_vendor/rich/__main__.py,sha256=eO7Cq8JnrgG8zVoeImiAs92q3hXNMIfp0w5lMsO7Q2Y,8477
|
| 596 |
+
pip/_vendor/rich/__pycache__/__init__.cpython-313.pyc,,
|
| 597 |
+
pip/_vendor/rich/__pycache__/__main__.cpython-313.pyc,,
|
| 598 |
+
pip/_vendor/rich/__pycache__/_cell_widths.cpython-313.pyc,,
|
| 599 |
+
pip/_vendor/rich/__pycache__/_emoji_codes.cpython-313.pyc,,
|
| 600 |
+
pip/_vendor/rich/__pycache__/_emoji_replace.cpython-313.pyc,,
|
| 601 |
+
pip/_vendor/rich/__pycache__/_export_format.cpython-313.pyc,,
|
| 602 |
+
pip/_vendor/rich/__pycache__/_extension.cpython-313.pyc,,
|
| 603 |
+
pip/_vendor/rich/__pycache__/_fileno.cpython-313.pyc,,
|
| 604 |
+
pip/_vendor/rich/__pycache__/_inspect.cpython-313.pyc,,
|
| 605 |
+
pip/_vendor/rich/__pycache__/_log_render.cpython-313.pyc,,
|
| 606 |
+
pip/_vendor/rich/__pycache__/_loop.cpython-313.pyc,,
|
| 607 |
+
pip/_vendor/rich/__pycache__/_null_file.cpython-313.pyc,,
|
| 608 |
+
pip/_vendor/rich/__pycache__/_palettes.cpython-313.pyc,,
|
| 609 |
+
pip/_vendor/rich/__pycache__/_pick.cpython-313.pyc,,
|
| 610 |
+
pip/_vendor/rich/__pycache__/_ratio.cpython-313.pyc,,
|
| 611 |
+
pip/_vendor/rich/__pycache__/_spinners.cpython-313.pyc,,
|
| 612 |
+
pip/_vendor/rich/__pycache__/_stack.cpython-313.pyc,,
|
| 613 |
+
pip/_vendor/rich/__pycache__/_timer.cpython-313.pyc,,
|
| 614 |
+
pip/_vendor/rich/__pycache__/_win32_console.cpython-313.pyc,,
|
| 615 |
+
pip/_vendor/rich/__pycache__/_windows.cpython-313.pyc,,
|
| 616 |
+
pip/_vendor/rich/__pycache__/_windows_renderer.cpython-313.pyc,,
|
| 617 |
+
pip/_vendor/rich/__pycache__/_wrap.cpython-313.pyc,,
|
| 618 |
+
pip/_vendor/rich/__pycache__/abc.cpython-313.pyc,,
|
| 619 |
+
pip/_vendor/rich/__pycache__/align.cpython-313.pyc,,
|
| 620 |
+
pip/_vendor/rich/__pycache__/ansi.cpython-313.pyc,,
|
| 621 |
+
pip/_vendor/rich/__pycache__/bar.cpython-313.pyc,,
|
| 622 |
+
pip/_vendor/rich/__pycache__/box.cpython-313.pyc,,
|
| 623 |
+
pip/_vendor/rich/__pycache__/cells.cpython-313.pyc,,
|
| 624 |
+
pip/_vendor/rich/__pycache__/color.cpython-313.pyc,,
|
| 625 |
+
pip/_vendor/rich/__pycache__/color_triplet.cpython-313.pyc,,
|
| 626 |
+
pip/_vendor/rich/__pycache__/columns.cpython-313.pyc,,
|
| 627 |
+
pip/_vendor/rich/__pycache__/console.cpython-313.pyc,,
|
| 628 |
+
pip/_vendor/rich/__pycache__/constrain.cpython-313.pyc,,
|
| 629 |
+
pip/_vendor/rich/__pycache__/containers.cpython-313.pyc,,
|
| 630 |
+
pip/_vendor/rich/__pycache__/control.cpython-313.pyc,,
|
| 631 |
+
pip/_vendor/rich/__pycache__/default_styles.cpython-313.pyc,,
|
| 632 |
+
pip/_vendor/rich/__pycache__/diagnose.cpython-313.pyc,,
|
| 633 |
+
pip/_vendor/rich/__pycache__/emoji.cpython-313.pyc,,
|
| 634 |
+
pip/_vendor/rich/__pycache__/errors.cpython-313.pyc,,
|
| 635 |
+
pip/_vendor/rich/__pycache__/file_proxy.cpython-313.pyc,,
|
| 636 |
+
pip/_vendor/rich/__pycache__/filesize.cpython-313.pyc,,
|
| 637 |
+
pip/_vendor/rich/__pycache__/highlighter.cpython-313.pyc,,
|
| 638 |
+
pip/_vendor/rich/__pycache__/json.cpython-313.pyc,,
|
| 639 |
+
pip/_vendor/rich/__pycache__/jupyter.cpython-313.pyc,,
|
| 640 |
+
pip/_vendor/rich/__pycache__/layout.cpython-313.pyc,,
|
| 641 |
+
pip/_vendor/rich/__pycache__/live.cpython-313.pyc,,
|
| 642 |
+
pip/_vendor/rich/__pycache__/live_render.cpython-313.pyc,,
|
| 643 |
+
pip/_vendor/rich/__pycache__/logging.cpython-313.pyc,,
|
| 644 |
+
pip/_vendor/rich/__pycache__/markup.cpython-313.pyc,,
|
| 645 |
+
pip/_vendor/rich/__pycache__/measure.cpython-313.pyc,,
|
| 646 |
+
pip/_vendor/rich/__pycache__/padding.cpython-313.pyc,,
|
| 647 |
+
pip/_vendor/rich/__pycache__/pager.cpython-313.pyc,,
|
| 648 |
+
pip/_vendor/rich/__pycache__/palette.cpython-313.pyc,,
|
| 649 |
+
pip/_vendor/rich/__pycache__/panel.cpython-313.pyc,,
|
| 650 |
+
pip/_vendor/rich/__pycache__/pretty.cpython-313.pyc,,
|
| 651 |
+
pip/_vendor/rich/__pycache__/progress.cpython-313.pyc,,
|
| 652 |
+
pip/_vendor/rich/__pycache__/progress_bar.cpython-313.pyc,,
|
| 653 |
+
pip/_vendor/rich/__pycache__/prompt.cpython-313.pyc,,
|
| 654 |
+
pip/_vendor/rich/__pycache__/protocol.cpython-313.pyc,,
|
| 655 |
+
pip/_vendor/rich/__pycache__/region.cpython-313.pyc,,
|
| 656 |
+
pip/_vendor/rich/__pycache__/repr.cpython-313.pyc,,
|
| 657 |
+
pip/_vendor/rich/__pycache__/rule.cpython-313.pyc,,
|
| 658 |
+
pip/_vendor/rich/__pycache__/scope.cpython-313.pyc,,
|
| 659 |
+
pip/_vendor/rich/__pycache__/screen.cpython-313.pyc,,
|
| 660 |
+
pip/_vendor/rich/__pycache__/segment.cpython-313.pyc,,
|
| 661 |
+
pip/_vendor/rich/__pycache__/spinner.cpython-313.pyc,,
|
| 662 |
+
pip/_vendor/rich/__pycache__/status.cpython-313.pyc,,
|
| 663 |
+
pip/_vendor/rich/__pycache__/style.cpython-313.pyc,,
|
| 664 |
+
pip/_vendor/rich/__pycache__/styled.cpython-313.pyc,,
|
| 665 |
+
pip/_vendor/rich/__pycache__/syntax.cpython-313.pyc,,
|
| 666 |
+
pip/_vendor/rich/__pycache__/table.cpython-313.pyc,,
|
| 667 |
+
pip/_vendor/rich/__pycache__/terminal_theme.cpython-313.pyc,,
|
| 668 |
+
pip/_vendor/rich/__pycache__/text.cpython-313.pyc,,
|
| 669 |
+
pip/_vendor/rich/__pycache__/theme.cpython-313.pyc,,
|
| 670 |
+
pip/_vendor/rich/__pycache__/themes.cpython-313.pyc,,
|
| 671 |
+
pip/_vendor/rich/__pycache__/traceback.cpython-313.pyc,,
|
| 672 |
+
pip/_vendor/rich/__pycache__/tree.cpython-313.pyc,,
|
| 673 |
+
pip/_vendor/rich/_cell_widths.py,sha256=fbmeyetEdHjzE_Vx2l1uK7tnPOhMs2X1lJfO3vsKDpA,10209
|
| 674 |
+
pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235
|
| 675 |
+
pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064
|
| 676 |
+
pip/_vendor/rich/_export_format.py,sha256=RI08pSrm5tBSzPMvnbTqbD9WIalaOoN5d4M1RTmLq1Y,2128
|
| 677 |
+
pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265
|
| 678 |
+
pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799
|
| 679 |
+
pip/_vendor/rich/_inspect.py,sha256=QM05lEFnFoTaFqpnbx-zBEI6k8oIKrD3cvjEOQNhKig,9655
|
| 680 |
+
pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225
|
| 681 |
+
pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236
|
| 682 |
+
pip/_vendor/rich/_null_file.py,sha256=ADGKp1yt-k70FMKV6tnqCqecB-rSJzp-WQsD7LPL-kg,1394
|
| 683 |
+
pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063
|
| 684 |
+
pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423
|
| 685 |
+
pip/_vendor/rich/_ratio.py,sha256=Zt58apszI6hAAcXPpgdWKpu3c31UBWebOeR4mbyptvU,5471
|
| 686 |
+
pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919
|
| 687 |
+
pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351
|
| 688 |
+
pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417
|
| 689 |
+
pip/_vendor/rich/_win32_console.py,sha256=BSaDRIMwBLITn_m0mTRLPqME5q-quGdSMuYMpYeYJwc,22755
|
| 690 |
+
pip/_vendor/rich/_windows.py,sha256=aBwaD_S56SbgopIvayVmpk0Y28uwY2C5Bab1wl3Bp-I,1925
|
| 691 |
+
pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783
|
| 692 |
+
pip/_vendor/rich/_wrap.py,sha256=FlSsom5EX0LVkA3KWy34yHnCfLtqX-ZIepXKh-70rpc,3404
|
| 693 |
+
pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890
|
| 694 |
+
pip/_vendor/rich/align.py,sha256=Rh-3adnDaN1Ao07EjR2PhgE62PGLPgO8SMwJBku1urQ,10469
|
| 695 |
+
pip/_vendor/rich/ansi.py,sha256=Avs1LHbSdcyOvDOdpELZUoULcBiYewY76eNBp6uFBhs,6921
|
| 696 |
+
pip/_vendor/rich/bar.py,sha256=ldbVHOzKJOnflVNuv1xS7g6dLX2E3wMnXkdPbpzJTcs,3263
|
| 697 |
+
pip/_vendor/rich/box.py,sha256=nr5fYIUghB_iUCEq6y0Z3LlCT8gFPDrzN9u2kn7tJl4,10831
|
| 698 |
+
pip/_vendor/rich/cells.py,sha256=KrQkj5-LghCCpJLSNQIyAZjndc4bnEqOEmi5YuZ9UCY,5130
|
| 699 |
+
pip/_vendor/rich/color.py,sha256=3HSULVDj7qQkXUdFWv78JOiSZzfy5y1nkcYhna296V0,18211
|
| 700 |
+
pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054
|
| 701 |
+
pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131
|
| 702 |
+
pip/_vendor/rich/console.py,sha256=_RJizBQIn9qxr4Ln7Q_SC5N9ekPWPAxH0KGVxsgg69Y,100565
|
| 703 |
+
pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288
|
| 704 |
+
pip/_vendor/rich/containers.py,sha256=c_56TxcedGYqDepHBMTuZdUIijitAQgnox-Qde0Z1qo,5502
|
| 705 |
+
pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630
|
| 706 |
+
pip/_vendor/rich/default_styles.py,sha256=khQFqqaoDs3bprMqWpHw8nO5UpG2DN6QtuTd6LzZwYc,8257
|
| 707 |
+
pip/_vendor/rich/diagnose.py,sha256=WNPjU2pEdrPICJ24KOaTD_hzP839qArpmF1JIM5x_EQ,998
|
| 708 |
+
pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501
|
| 709 |
+
pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642
|
| 710 |
+
pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683
|
| 711 |
+
pip/_vendor/rich/filesize.py,sha256=_iz9lIpRgvW7MNSeCZnLg-HwzbP4GETg543WqD8SFs0,2484
|
| 712 |
+
pip/_vendor/rich/highlighter.py,sha256=G_sn-8DKjM1sEjLG_oc4ovkWmiUpWvj8bXi0yed2LnY,9586
|
| 713 |
+
pip/_vendor/rich/json.py,sha256=vVEoKdawoJRjAFayPwXkMBPLy7RSTs-f44wSQDR2nJ0,5031
|
| 714 |
+
pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252
|
| 715 |
+
pip/_vendor/rich/layout.py,sha256=ajkSFAtEVv9EFTcFs-w4uZfft7nEXhNzL7ZVdgrT5rI,14004
|
| 716 |
+
pip/_vendor/rich/live.py,sha256=DhzAPEnjTxQuq9_0Y2xh2MUwQcP_aGPkenLfKETslwM,14270
|
| 717 |
+
pip/_vendor/rich/live_render.py,sha256=zJtB471jGziBtEwxc54x12wEQtH4BuQr1SA8v9kU82w,3666
|
| 718 |
+
pip/_vendor/rich/logging.py,sha256=ZgpKMMBY_BuMAI_BYzo-UtXak6t5oH9VK8m9Q2Lm0f4,12458
|
| 719 |
+
pip/_vendor/rich/markup.py,sha256=3euGKP5s41NCQwaSjTnJxus5iZMHjxpIM0W6fCxra38,8451
|
| 720 |
+
pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305
|
| 721 |
+
pip/_vendor/rich/padding.py,sha256=KVEI3tOwo9sgK1YNSuH__M1_jUWmLZwRVV_KmOtVzyM,4908
|
| 722 |
+
pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828
|
| 723 |
+
pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396
|
| 724 |
+
pip/_vendor/rich/panel.py,sha256=SUDaa3z4MU7vIjzvbi0SXuc6BslDzADwdY1AX4TbTdY,11225
|
| 725 |
+
pip/_vendor/rich/pretty.py,sha256=gy3S72u4FRg2ytoo7N1ZDWDIvB4unbzd5iUGdgm-8fc,36391
|
| 726 |
+
pip/_vendor/rich/progress.py,sha256=MtmCjTk5zYU_XtRHxRHTAEHG6hF9PeF7EMWbEPleIC0,60357
|
| 727 |
+
pip/_vendor/rich/progress_bar.py,sha256=mZTPpJUwcfcdgQCTTz3kyY-fc79ddLwtx6Ghhxfo064,8162
|
| 728 |
+
pip/_vendor/rich/prompt.py,sha256=l0RhQU-0UVTV9e08xW1BbIj0Jq2IXyChX4lC0lFNzt4,12447
|
| 729 |
+
pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391
|
| 730 |
+
pip/_vendor/rich/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 731 |
+
pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166
|
| 732 |
+
pip/_vendor/rich/repr.py,sha256=5MZJZmONgC6kud-QW-_m1okXwL2aR6u6y-pUcUCJz28,4431
|
| 733 |
+
pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602
|
| 734 |
+
pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843
|
| 735 |
+
pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591
|
| 736 |
+
pip/_vendor/rich/segment.py,sha256=otnKeKGEV-WRlQVosfJVeFDcDxAKHpvJ_hLzSu5lumM,24743
|
| 737 |
+
pip/_vendor/rich/spinner.py,sha256=PT5qgXPG3ZpqRj7n3EZQ6NW56mx3ldZqZCU7gEMyZk4,4364
|
| 738 |
+
pip/_vendor/rich/status.py,sha256=kkPph3YeAZBo-X-4wPp8gTqZyU466NLwZBA4PZTTewo,4424
|
| 739 |
+
pip/_vendor/rich/style.py,sha256=xpj4uMBZMtuNuNomfUiamigl3p1sDvTCZwrG1tcTVeg,27059
|
| 740 |
+
pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258
|
| 741 |
+
pip/_vendor/rich/syntax.py,sha256=qqAnEUZ4K57Po81_5RBxnsuU4KRzSdvDPAhKw8ma_3E,35763
|
| 742 |
+
pip/_vendor/rich/table.py,sha256=ZmT7V7MMCOYKw7TGY9SZLyYDf6JdM-WVf07FdVuVhTI,40049
|
| 743 |
+
pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370
|
| 744 |
+
pip/_vendor/rich/text.py,sha256=AO7JPCz6-gaN1thVLXMBntEmDPVYFgFNG1oM61_sanU,47552
|
| 745 |
+
pip/_vendor/rich/theme.py,sha256=oNyhXhGagtDlbDye3tVu3esWOWk0vNkuxFw-_unlaK0,3771
|
| 746 |
+
pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102
|
| 747 |
+
pip/_vendor/rich/traceback.py,sha256=ZA8Q67DyP5a_stpIh6GPf9IiXj_s3dAhDIr6Zbfkahk,35170
|
| 748 |
+
pip/_vendor/rich/tree.py,sha256=yWnQ6rAvRGJ3qZGqBrxS2SW2TKBTNrP0SdY8QxOFPuw,9451
|
| 749 |
+
pip/_vendor/tomli/__init__.py,sha256=PhNw_eyLgdn7McJ6nrAN8yIm3dXC75vr1sVGVVwDSpA,314
|
| 750 |
+
pip/_vendor/tomli/__pycache__/__init__.cpython-313.pyc,,
|
| 751 |
+
pip/_vendor/tomli/__pycache__/_parser.cpython-313.pyc,,
|
| 752 |
+
pip/_vendor/tomli/__pycache__/_re.cpython-313.pyc,,
|
| 753 |
+
pip/_vendor/tomli/__pycache__/_types.cpython-313.pyc,,
|
| 754 |
+
pip/_vendor/tomli/_parser.py,sha256=9w8LG0jB7fwmZZWB0vVXbeejDHcl4ANIJxB2scEnDlA,25591
|
| 755 |
+
pip/_vendor/tomli/_re.py,sha256=sh4sBDRgO94KJZwNIrgdcyV_qQast50YvzOAUGpRDKA,3171
|
| 756 |
+
pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
|
| 757 |
+
pip/_vendor/tomli/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
|
| 758 |
+
pip/_vendor/tomli_w/__init__.py,sha256=0F8yDtXx3Uunhm874KrAcP76srsM98y7WyHQwCulZbo,169
|
| 759 |
+
pip/_vendor/tomli_w/__pycache__/__init__.cpython-313.pyc,,
|
| 760 |
+
pip/_vendor/tomli_w/__pycache__/_writer.cpython-313.pyc,,
|
| 761 |
+
pip/_vendor/tomli_w/_writer.py,sha256=dsifFS2xYf1i76mmRyfz9y125xC7Z_HQ845ZKhJsYXs,6961
|
| 762 |
+
pip/_vendor/tomli_w/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
|
| 763 |
+
pip/_vendor/truststore/__init__.py,sha256=2wRSVijjRzPLVXUzWqvdZLNsEOhDfopKLd2EKAYLwKU,1320
|
| 764 |
+
pip/_vendor/truststore/__pycache__/__init__.cpython-313.pyc,,
|
| 765 |
+
pip/_vendor/truststore/__pycache__/_api.cpython-313.pyc,,
|
| 766 |
+
pip/_vendor/truststore/__pycache__/_macos.cpython-313.pyc,,
|
| 767 |
+
pip/_vendor/truststore/__pycache__/_openssl.cpython-313.pyc,,
|
| 768 |
+
pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-313.pyc,,
|
| 769 |
+
pip/_vendor/truststore/__pycache__/_windows.cpython-313.pyc,,
|
| 770 |
+
pip/_vendor/truststore/_api.py,sha256=40I0ojO2DnITiHvOnUYvJ1bfQMBKHOkci14noNxEnCs,11246
|
| 771 |
+
pip/_vendor/truststore/_macos.py,sha256=nZlLkOmszUE0g6ryRwBVGY5COzPyudcsiJtDWarM5LQ,20503
|
| 772 |
+
pip/_vendor/truststore/_openssl.py,sha256=LLUZ7ZGaio-i5dpKKjKCSeSufmn6T8pi9lDcFnvSyq0,2324
|
| 773 |
+
pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130
|
| 774 |
+
pip/_vendor/truststore/_windows.py,sha256=rAHyKYD8M7t-bXfG8VgOVa3TpfhVhbt4rZQlO45YuP8,17993
|
| 775 |
+
pip/_vendor/truststore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 776 |
+
pip/_vendor/typing_extensions.py,sha256=ipKHUPtZCqL6c-HfvGl-9t0opsXcSL72y4GYjyJXs_g,172702
|
| 777 |
+
pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333
|
| 778 |
+
pip/_vendor/urllib3/__pycache__/__init__.cpython-313.pyc,,
|
| 779 |
+
pip/_vendor/urllib3/__pycache__/_collections.cpython-313.pyc,,
|
| 780 |
+
pip/_vendor/urllib3/__pycache__/_version.cpython-313.pyc,,
|
| 781 |
+
pip/_vendor/urllib3/__pycache__/connection.cpython-313.pyc,,
|
| 782 |
+
pip/_vendor/urllib3/__pycache__/connectionpool.cpython-313.pyc,,
|
| 783 |
+
pip/_vendor/urllib3/__pycache__/exceptions.cpython-313.pyc,,
|
| 784 |
+
pip/_vendor/urllib3/__pycache__/fields.cpython-313.pyc,,
|
| 785 |
+
pip/_vendor/urllib3/__pycache__/filepost.cpython-313.pyc,,
|
| 786 |
+
pip/_vendor/urllib3/__pycache__/poolmanager.cpython-313.pyc,,
|
| 787 |
+
pip/_vendor/urllib3/__pycache__/request.cpython-313.pyc,,
|
| 788 |
+
pip/_vendor/urllib3/__pycache__/response.cpython-313.pyc,,
|
| 789 |
+
pip/_vendor/urllib3/_collections.py,sha256=pyASJJhW7wdOpqJj9QJA8FyGRfr8E8uUUhqUvhF0728,11372
|
| 790 |
+
pip/_vendor/urllib3/_version.py,sha256=t9wGB6ooOTXXgiY66K1m6BZS1CJyXHAU8EoWDTe6Shk,64
|
| 791 |
+
pip/_vendor/urllib3/connection.py,sha256=ttIA909BrbTUzwkqEe_TzZVh4JOOj7g61Ysei2mrwGg,20314
|
| 792 |
+
pip/_vendor/urllib3/connectionpool.py,sha256=e2eiAwNbFNCKxj4bwDKNK-w7HIdSz3OmMxU_TIt-evQ,40408
|
| 793 |
+
pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 794 |
+
pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-313.pyc,,
|
| 795 |
+
pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-313.pyc,,
|
| 796 |
+
pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-313.pyc,,
|
| 797 |
+
pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-313.pyc,,
|
| 798 |
+
pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-313.pyc,,
|
| 799 |
+
pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-313.pyc,,
|
| 800 |
+
pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-313.pyc,,
|
| 801 |
+
pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957
|
| 802 |
+
pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 803 |
+
pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-313.pyc,,
|
| 804 |
+
pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-313.pyc,,
|
| 805 |
+
pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-313.pyc,,
|
| 806 |
+
pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632
|
| 807 |
+
pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922
|
| 808 |
+
pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036
|
| 809 |
+
pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528
|
| 810 |
+
pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081
|
| 811 |
+
pip/_vendor/urllib3/contrib/securetransport.py,sha256=Fef1IIUUFHqpevzXiDPbIGkDKchY2FVKeVeLGR1Qq3g,34446
|
| 812 |
+
pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097
|
| 813 |
+
pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217
|
| 814 |
+
pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579
|
| 815 |
+
pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440
|
| 816 |
+
pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 817 |
+
pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-313.pyc,,
|
| 818 |
+
pip/_vendor/urllib3/packages/__pycache__/six.cpython-313.pyc,,
|
| 819 |
+
pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 820 |
+
pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-313.pyc,,
|
| 821 |
+
pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-313.pyc,,
|
| 822 |
+
pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-313.pyc,,
|
| 823 |
+
pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417
|
| 824 |
+
pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343
|
| 825 |
+
pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665
|
| 826 |
+
pip/_vendor/urllib3/poolmanager.py,sha256=aWyhXRtNO4JUnCSVVqKTKQd8EXTvUm1VN9pgs2bcONo,19990
|
| 827 |
+
pip/_vendor/urllib3/request.py,sha256=YTWFNr7QIwh7E1W9dde9LM77v2VWTJ5V78XuTTw7D1A,6691
|
| 828 |
+
pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641
|
| 829 |
+
pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
|
| 830 |
+
pip/_vendor/urllib3/util/__pycache__/__init__.cpython-313.pyc,,
|
| 831 |
+
pip/_vendor/urllib3/util/__pycache__/connection.cpython-313.pyc,,
|
| 832 |
+
pip/_vendor/urllib3/util/__pycache__/proxy.cpython-313.pyc,,
|
| 833 |
+
pip/_vendor/urllib3/util/__pycache__/queue.cpython-313.pyc,,
|
| 834 |
+
pip/_vendor/urllib3/util/__pycache__/request.cpython-313.pyc,,
|
| 835 |
+
pip/_vendor/urllib3/util/__pycache__/response.cpython-313.pyc,,
|
| 836 |
+
pip/_vendor/urllib3/util/__pycache__/retry.cpython-313.pyc,,
|
| 837 |
+
pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-313.pyc,,
|
| 838 |
+
pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-313.pyc,,
|
| 839 |
+
pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-313.pyc,,
|
| 840 |
+
pip/_vendor/urllib3/util/__pycache__/timeout.cpython-313.pyc,,
|
| 841 |
+
pip/_vendor/urllib3/util/__pycache__/url.cpython-313.pyc,,
|
| 842 |
+
pip/_vendor/urllib3/util/__pycache__/wait.cpython-313.pyc,,
|
| 843 |
+
pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901
|
| 844 |
+
pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605
|
| 845 |
+
pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498
|
| 846 |
+
pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997
|
| 847 |
+
pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510
|
| 848 |
+
pip/_vendor/urllib3/util/retry.py,sha256=6ENvOZ8PBDzh8kgixpql9lIrb2dxH-k7ZmBanJF2Ng4,22050
|
| 849 |
+
pip/_vendor/urllib3/util/ssl_.py,sha256=QDuuTxPSCj1rYtZ4xpD7Ux-r20TD50aHyqKyhQ7Bq4A,17460
|
| 850 |
+
pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758
|
| 851 |
+
pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895
|
| 852 |
+
pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168
|
| 853 |
+
pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296
|
| 854 |
+
pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403
|
| 855 |
+
pip/_vendor/vendor.txt,sha256=Fym1hhuw75IJOl33NPi5nIJJc66DioBSUWrVRIVtRUE,373
|
| 856 |
+
pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286
|
ccevolve/blog/publish/.venv/lib/python3.13/site-packages/pip-25.1.1.dist-info/REQUESTED
ADDED
|
File without changes
|
ccevolve/blog/publish/.venv/lib/python3.13/site-packages/pip-25.1.1.dist-info/WHEEL
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Wheel-Version: 1.0
|
| 2 |
+
Generator: setuptools (79.0.0)
|
| 3 |
+
Root-Is-Purelib: true
|
| 4 |
+
Tag: py3-none-any
|
| 5 |
+
|
ccevolve/blog/publish/.venv/lib/python3.13/site-packages/pip-25.1.1.dist-info/entry_points.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[console_scripts]
|
| 2 |
+
pip = pip._internal.cli.main:main
|
| 3 |
+
pip3 = pip._internal.cli.main:main
|