Рефлексия

План выполнения: BornBreak

2026-02-07 — План выполнения: BornBreak

Связано с дневником: 2026-02-07
Связано с рефлексией: Пилот‑волна и ML: траектории без мистики

Коротко: LLM‑исполняемый, полностью автоматизируемый план: скелет GitHub‑проекта, поиск сырых датасетов попаданий двухщелевого эксперимента и старт IBM Quantum статистики.


Содержание


0. Контекст и принципы исполнения

  • Всё должно быть автоматизируемо (только команды/скрипты).
  • Каждый шаг описан так, чтобы LLM/агент мог выполнить его без ручных действий.
  • Любые внешние зависимости (токены, ключи) задаются через переменные окружения.

1. Переменные и соглашения

Задать один раз перед запуском:

export PROJECT="bornbreak"
export ORG="sapsan14"
export ROOT="/workspace/${PROJECT}"
export PYTHON="python3"
export VENV=".venv"

Проверка:

echo "$PROJECT $ORG $ROOT"

2. Фаза A — скелет GitHub‑проекта (структура + README + Python)

A1. Создать удалённый репозиторий и локальную копию

  • Команда:
    gh repo create "$ORG/$PROJECT" --public --confirm --clone
    cd "$PROJECT"
  • Проверка:
    git status -sb
  • Артефакт: локальный репозиторий в $ROOT.

A2. Поднять Python‑окружение

  • Команды:
    $PYTHON -m venv "$VENV"
    source "$VENV/bin/activate"
    python -m pip install -U pip
  • Проверка:
    python -V
    pip -V

A3. Создать структуру проекта

  • Команда:
    mkdir -p src/bornbreak data/raw data/interim data/processed data/sources \
             notebooks scripts reports/figures docs tests
    touch src/bornbreak/__init__.py
  • Проверка:
    $PYTHON - <<'PY'

from pathlib import Path for root in [“src”, “data”, “scripts”]: print(root) base = Path(root) for p in sorted(base.rglob(”*”)): if p.is_dir() and len(p.relative_to(base).parts) <= 2: print(” ”, p) PY


### A4. Базовые файлы конфигурации и документации

**1) pyproject.toml (зависимости — без фиксации версий):**

```bash
cat > pyproject.toml <<'PYPROJECT'
[project]
name = "bornbreak"
version = "0.1.0"
description = "Searching for quantum non-equilibrium via data + ML"
readme = "README.md"
requires-python = ">=3.10"
dependencies = [
"numpy",
"pandas",
"scipy",
"matplotlib",
"seaborn",
"scikit-learn",
"qiskit",
"qiskit-ibm-runtime",
"jupyterlab",
"requests",
]

[project.optional-dependencies]
dev = ["pytest", "ruff", "black"]
PYPROJECT

2) README.md (каркас):

cat > README.md <<'README'
# BornBreak — Searching for Quantum Non-Equilibrium

**Goal:** test for ultra-small deviations from the Born rule using raw
interference data, Bell correlations, and IBM Quantum measurements.

## Pipeline (high level)
1. Collect raw hits / measurement outcomes.
2. Define null model: P0(x) = |psi(x)|^2.
3. Fit deviation model: P(x) = |psi(x)|^2 (1 + eps f_theta(x)).
4. Run interpretable ML to detect residual structure.
5. Report bounds on eps and diagnostic plots.

## Data sources (tracked)
- data/sources/source_registry.md

## Quick start
```bash
python -m venv .venv && source .venv/bin/activate
pip install -U pip
pip install -e .[dev]

README


**3) .gitignore:**

```bash
cat > .gitignore <<'GITIGNORE'
.venv/
__pycache__/
.pytest_cache/
.DS_Store
data/raw/
data/processed/
data/interim/
GITIGNORE

A5. Каркас Python‑модулей

1) src/bornbreak/io.py

cat > src/bornbreak/io.py <<'PY'
from pathlib import Path
import json
import pandas as pd

DATA_ROOT = Path("data")

def read_hits_csv(path: str) -> pd.DataFrame:
    """Load raw hit data (event_id, x, y, t)."""
    return pd.read_csv(path)

def write_json(path: str, obj: dict) -> None:
    Path(path).parent.mkdir(parents=True, exist_ok=True)
    with open(path, "w", encoding="utf-8") as f:
        json.dump(obj, f, ensure_ascii=False, indent=2)
PY

2) src/bornbreak/born_rule.py

cat > src/bornbreak/born_rule.py <<'PY'
import numpy as np

def born_probability(psi: np.ndarray) -> np.ndarray:
    """Return |psi|^2 normalized to 1."""
    p = np.abs(psi) ** 2
    return p / p.sum()
PY

3) src/bornbreak/ibm_quantum.py

cat > src/bornbreak/ibm_quantum.py <<'PY'
import os
from datetime import datetime
from pathlib import Path
from qiskit_ibm_runtime import QiskitRuntimeService, Sampler

def save_account_from_env() -> None:
    token = os.environ.get("QISKIT_IBM_TOKEN")
    if not token:
        raise RuntimeError("QISKIT_IBM_TOKEN is not set")
    QiskitRuntimeService.save_account(
        channel="ibm_quantum",
        token=token,
        set_as_default=True,
        overwrite=True,
    )

def save_counts(path: str, counts: dict, meta: dict) -> None:
    Path(path).parent.mkdir(parents=True, exist_ok=True)
    meta = dict(meta)
    meta["timestamp"] = datetime.utcnow().isoformat() + "Z"
    out = {"counts": counts, "meta": meta}
    import json
    Path(path).write_text(json.dumps(out, ensure_ascii=False, indent=2), encoding="utf-8")
PY

A6. Первый коммит скелета

  • Команды:
    git add .
    git commit -m "Initialize BornBreak skeleton"
    git push -u origin main
  • Проверка:
    git status -sb

3. Фаза B — Поиск сырых датасетов попаданий двухщелевого эксперимента

B1. Реестр источников

  • Команда:
    cat > data/sources/source_registry.md <<'MD'

Source Registry — raw double-slit hits

SourceTypeLinkStatusNotes
MD
- **Артефакт:** `data/sources/source_registry.md`

### B2. GitHub‑поиск (автоматически)

- **Команда (поиск репозиториев):**
```bash
gh search repos "double slit dataset" --limit 100 --json nameWithOwner,description,url,updatedAt,stargazerCount > data/sources/github_repos.json
gh search repos "double slit experiment raw data" --limit 100 --json nameWithOwner,description,url,updatedAt,stargazerCount >> data/sources/github_repos.json
  • Обработка (фильтр по ключам):
    $PYTHON - <<'PY'

import json, re, sys from pathlib import Path

raw = Path(“data/sources/github_repos.json”).read_text() items = [json.loads(line) if line.startswith(”{”) else None for line in raw.splitlines()] items = [i for i in items if isinstance(i, dict)] keys = re.compile(r”raw|hit|single|slit|interfer”, re.I) hits = [i for i in items if keys.search(i.get(“description”) or "")] Path(“data/sources/github_repos_filtered.json”).write_text(json.dumps(hits, indent=2)) print(“filtered:”, len(hits)) PY


### B3. Dryad API (поиск датасетов)

- **Команда:**
```bash
$PYTHON - <<'PY'
import requests, json
from urllib.parse import quote

queries = [
  "double slit", "single photon interference", "molecular double slit",
  "electron interference", "quantum interference raw data"
]
out = []
for q in queries:
  url = f"https://datadryad.org/api/v2/search?query={quote(q)}"
  r = requests.get(url, timeout=30)
  if r.ok:
      out.append({"query": q, "items": r.json()})
open("data/sources/dryad_search.json", "w").write(json.dumps(out, indent=2))
print("done:", len(out))
PY

B4. Проверка кандидатов и локальный сбор

  • Команда (клон выбранных репо):
    mkdir -p data/sources/repos
    # Example:
    # gh repo clone OWNER/REPO data/sources/repos/OWNER__REPO
  • Задача скрипта (скан на файлы):
    $PYTHON - <<'PY'

from pathlib import Path import re

root = Path(“data/sources/repos”) exts = {“.csv”, “.tsv”, “.txt”, “.dat”, “.h5”, “.hdf5”, “.npy”, “.mat”} hits = [] for p in root.rglob(”*”): if p.suffix.lower() in exts: hits.append(str(p)) Path(“data/sources/raw_files_index.txt”).write_text(“\n”.join(hits)) print(“files:”, len(hits)) PY


### B5. Ручная проверка заменяется “авто‑аннотацией”

- **Команда (создать авто‑аннотацию на базе README):**
```bash
$PYTHON - <<'PY'
from pathlib import Path

out = []
for readme in Path("data/sources/repos").rglob("README*"):
  text = readme.read_text(errors="ignore")[:2000]
  out.append({"readme": str(readme), "preview": text})
Path("data/sources/readme_previews.json").write_text(str(out))
print("readme previews:", len(out))
PY

4. Фаза C — IBM Quantum статистика (старт “завтра”)

C1. Настройка доступа (через токен)

  • Команды:
    export QISKIT_IBM_TOKEN="PASTE_TOKEN_HERE"
    $PYTHON - <<'PY'

from bornbreak.ibm_quantum import save_account_from_env save_account_from_env() print(“IBM Quantum token saved”) PY


### C2. Простой эксперимент для базовой статистики

- **Скрипт запуска (создать один раз):**
```bash
cat > scripts/ibm_bornrule_smoke.py <<'PY'
from qiskit import QuantumCircuit
from qiskit_ibm_runtime import QiskitRuntimeService, Sampler
from bornbreak.ibm_quantum import save_counts

service = QiskitRuntimeService()
backend = service.least_busy(simulator=False)

qc = QuantumCircuit(1)
qc.h(0)
qc.measure_all()

sampler = Sampler(backend=backend)
job = sampler.run([qc], shots=4000)
result = job.result()
counts = result.quasi_dists[0].binary_probabilities()

meta = {
  "backend": backend.name,
  "shots": 4000,
  "circuit": "H on |0> then measure",
}
save_counts("data/raw/ibm/ibm_hadamard_counts.json", counts, meta)
print("saved")
PY

C3. Запуск и проверка

  • Команда:
    $PYTHON scripts/ibm_bornrule_smoke.py
  • Проверка артефакта:
    $PYTHON - <<'PY'

from pathlib import Path for p in Path(“data/raw/ibm”).glob(”*”): if p.is_file(): print(p, p.stat().st_size) PY


### C4. Первичная проверка Born rule

- **Скрипт‑проверка:**
```bash
cat > scripts/check_bornrule.py <<'PY'
from pathlib import Path
import json

path = Path("data/raw/ibm/ibm_hadamard_counts.json")
data = json.loads(path.read_text())
counts = data["counts"]

p0 = counts.get("0", 0.0)
p1 = counts.get("1", 0.0)
print("P(0) ~", p0, "P(1) ~", p1, "sum:", p0 + p1)
PY

5. Критерии готовности (готовность к активной фазе)

  • Репозиторий BornBreak создан и пушнут
  • Скелет проекта, базовые модули и README готовы
  • Автоматизированный поиск GitHub + Dryad выполнен
  • Реестр источников заполнен (даже если без “идеального” сырого датасета)
  • IBM Quantum smoke‑тест прошёл и сохранил сырую статистику

6. Связи


Теги: #plan #reflect #bornbreak #quantum #born-rule #ml #ibm-quantum #datasets