-
Notifications
You must be signed in to change notification settings - Fork 0
fibengine-next: repo structure, Optuna cleanup (docs/artifacts), machine labeling #7
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
47dc6fa
0496f57
5a03603
71249ec
43d0cb4
4998b87
6641c47
b3d32ae
27f4df8
83bd074
1f973b8
782d8c4
028e8dc
475e722
46679cb
0571989
98c0091
58bc228
e8dcc7e
641b87e
4146ce2
a18c79f
97a93a9
73f42ec
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,18 +1,7 @@ | ||
| # config/variants | ||
|
|
||
| Alternativa settings-profiler för experiment (manuellt satta på principgrund). | ||
| Alternativa settings-profiler för **Research** — principmotiverade, dokumenterade i `INDEX.md`. | ||
|
|
||
| ## Princip | ||
|
|
||
| - `config/settings.yaml` är baseline. | ||
| - Nya kandidater sparas här som separata filer. | ||
| - Filnamn ska vara beskrivande och gärna datumsatta. | ||
| - Vikter sätts på principgrund — inte genom optimering mot labels. | ||
|
|
||
| ## Namnexempel | ||
|
|
||
| - `manual_2026-05-29_round2.yaml` | ||
|
|
||
| ## Index | ||
|
|
||
| - `INDEX.md` listar alla varianter, ursprung och syfte. | ||
| - Baseline (Promotion): `config/settings.yaml` | ||
| - Ändra vikter här med premortem-motivering; optimera **inte** mot `agreement` mot labels. | ||
| - Validate med stabilitet (`backtest.matrix`) och pivot recall — labels endast som referens-check. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,29 @@ | ||
| # 2026-05-28 Ta bort Optuna (slutstädning) | ||
|
|
||
| Uppföljning på `2026-05-28-optuna-rollback.md` (som drog tillbaka själva runnern). | ||
| Den här noten städar de sista spåren så repot inte längre låtsas att Optuna finns. | ||
|
|
||
| Hypotes: | ||
| - Optuna har ingen legitim roll om vikter sätts på principer och labels endast är | ||
| referens. Kvarvarande referenser i kod/docs skapar förvirring och frestelse. | ||
|
|
||
| Scope: | ||
| - Delsystem: dokumentation + repo-bokföring (ingen körning). | ||
| - Ytor: `README.md`, `docs/TRACKS.md`, `REPO_POLICY.md`, `docs/FIB_BACKTEST_PLAN.md`, | ||
| `archive/INDEX.md`, `config/variants/`. | ||
|
|
||
| Observationer: | ||
| - `src/fibengine/tuning/` och `optuna`-dependencyn var redan borttagna (rollback); | ||
| det som återstod var doc-referenser och arkiv-bokföring. | ||
| - Optuna-artefakterna behålls i `archive/` som historik (raderas inte) — `archive/` | ||
| finns till för ersatt/legacy-material (REPO_POLICY §1). | ||
| - `config/variants/` ramas om till principmotiverade profiler (ingen auto-tuning). | ||
|
|
||
| Beslut: | ||
| - Ta bort kvarvarande Optuna-referenser i README/TRACKS/REPO_POLICY/FIB_BACKTEST_PLAN. | ||
| - Behåll arkiverade artefakter; håll `archive/INDEX.md` ärlig om vad som finns kvar. | ||
| - Vikter sätts manuellt på principgrund; ingen optimering mot `agreement`/labels. | ||
|
|
||
| Nästa steg: | ||
| - Validate via stabilitetsmatris + pivot recall; manuella viktändringar motiveras i | ||
| premortem, aldrig auto-tunade mot ritningar. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,38 @@ | ||
| # 2026-05-29 Maskin-labeling (kandidater, inte facit) | ||
|
|
||
| Uppföljning: jag avböjde att generera facit (cirkulärt — maskinen skulle valideras | ||
| mot sin egen output). Kompromissen blev maskin-labeling med tydlig `source`-stämpel | ||
| och hårda integritetsregler, så kandidater kan sänka tröskeln utan att bli domare. | ||
|
|
||
| Hypotes: | ||
| - Provisoriska maskin-kandidater gör det billigare för en människa att fylla | ||
| facit-gapen — UTAN att korrumpera golden set — om de (a) är tydligt märkta, | ||
| (b) exkluderas från all label-baserad evaluering, och (c) aldrig skriver över | ||
| mänskligt facit. | ||
|
|
||
| Scope: | ||
| - Delsystem: `labeling/` (ny `autolabel.py`, `source` i `store.py`, worklist-split), | ||
| `evaluation/pivot_recall.py` + `experiment.py` (exkludering). | ||
| - Ingen nät/GUI i tester (syntetiska data + mockad `select_swing`/`load_candles`). | ||
|
|
||
| Observationer: | ||
| - `SwingLabel.source` ("human"/"machine"), default "human" → befintliga JSON-labels | ||
| förblir human. `list_labels(source=...)` filtrerar. | ||
| - `pivot_recall` och `experiment` evaluerar nu **bara** `source="human"`; antal | ||
| hoppade maskin-labels loggas. Test låser exkluderingen. | ||
| - `autolabel.py` bygger kandidat från motorns `select_swing`, märker `source="machine"` | ||
| + not, och **vägrar** skriva över en mänsklig label (`status="skipped_human"`). | ||
| - `worklist`: bara human räknas mot målet; maskin-kandidater listas separat som | ||
| "att granska". Nuläge oförändrat: 15/25 human, 6 helt olabelade. | ||
| - Befordran: öppnas kandidaten i `labeling.tool` och sparas → `source="human"` | ||
| (verktygets save bygger en label utan source = default human). | ||
| - Tester: 78 → 85 gröna; coverage ~76%; lint rent. | ||
|
|
||
| Beslut: | ||
| - Maskin-labels är scaffolding/Research, aldrig facit eller optimeringsmål. Den | ||
| uttalade filosofin ("labels = referens, inte domare") står kvar oförändrad. | ||
|
|
||
| Nästa steg (kräver nät/människa): | ||
| - Kör `autolabel` på de 6 saknade kombinationerna när nät finns; granska var och en | ||
| i `labeling.tool` och befordra de rimliga till human. | ||
| - Kör därefter `pivot_recall` + `matrix` och kalibrera `gate_*`. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -125,7 +125,12 @@ def run_experiment(settings: Settings | None = None) -> Path: | |
| (run_dir / "config.json").write_text(json.dumps(settings.model_dump(), indent=2)) | ||
| log.info("Startar experiment {} (cfg {})", run_id, config_hash) | ||
|
|
||
| labels = list_labels() | ||
| # Agreement mäts bara mot mänskligt facit; maskin-labels exkluderas (kandidater, | ||
| # inte domare) så vi inte råkar mäta motorn mot sin egen output. | ||
| labels = list_labels(source="human") | ||
| n_machine = len(list_labels(source="machine")) | ||
| if n_machine: | ||
|
Comment on lines
+130
to
+132
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. suggestion (performance): Samma dubbel-laddningsmönster som i För att undvika upprepad I/O och hålla detta konsekvent med Suggested implementation: # Agreement mäts bara mot mänskligt facit; maskin-labels exkluderas (kandidater,
# inte domare) så vi inte råkar mäta motorn mot sin egen output.
all_labels = list_labels()
labels = [lbl for lbl in all_labels if getattr(lbl, "source", None) == "human"]
n_machine = sum(1 for lbl in all_labels if getattr(lbl, "source", None) == "machine")
if n_machine:
log.info("Hoppar över {} maskin-labels i agreement (ej ground truth)", n_machine)
results: list[dict] = []
if not labels:
log.warning("Inga labels i data/labels/ — kör enbart prediktion på konfig-symbolen.")Om Original comment in Englishsuggestion (performance): Same double-load pattern as in To avoid repeated I/O and keep this consistent with Suggested implementation: # Agreement mäts bara mot mänskligt facit; maskin-labels exkluderas (kandidater,
# inte domare) så vi inte råkar mäta motorn mot sin egen output.
all_labels = list_labels()
labels = [lbl for lbl in all_labels if getattr(lbl, "source", None) == "human"]
n_machine = sum(1 for lbl in all_labels if getattr(lbl, "source", None) == "machine")
if n_machine:
log.info("Hoppar över {} maskin-labels i agreement (ej ground truth)", n_machine)
results: list[dict] = []
if not labels:
log.warning("Inga labels i data/labels/ — kör enbart prediktion på konfig-symbolen.")If |
||
| log.info("Hoppar över {} maskin-labels i agreement (ej ground truth)", n_machine) | ||
| results: list[dict] = [] | ||
| if not labels: | ||
| log.warning("Inga labels i data/labels/ — kör enbart prediktion på konfig-symbolen.") | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggestion (performance): Att ladda labels två gånger träffar label-storen två gånger; överväg att partitionera en enda laddning för bättre effektivitet.
Detta triggar nu två fullständiga katalogskanningar/JSON-laddningar (
source="human"ochsource="machine"). När mängden labels växer kan den extra I/O:n bli märkbar. Överväg att ladda en gång (t.ex.all_labels = list_labels()) och sedan partitionera till human vs. machine i minnet för att behålla samma loggning men undvika upprepad I/O.Original comment in English
suggestion (performance): Loading labels twice hits the label store twice; consider partitioning a single load for better efficiency.
This now triggers two full directory scans/JSON loads (
source="human"andsource="machine"). As the label set grows this extra I/O can add up. Consider loading once (e.g.all_labels = list_labels()) and then partitioning into human vs machine in memory to keep the same logging while avoiding repeated I/O.