Files
aiscr-qgis-amcr-viewer/openspec/changes/archive/2026-10-02-fix-component-feature-weight/design.md
T
david-spacil 6e95973296 fix: váha prvku komponent počítaná z komponent prošlých filtrem (#55) (#83)
* fix: váha prvku komponent počítaná z komponent prošlých filtrem (#55)

Váha prvku_vaha = 1/n se dosud počítala ze všech komponent dokumentační
jednotky ještě před filtrem na období a areál, takže při aktivním filtru
váhy prvků jedné DJ nedávaly v součtu 1 (DJ se 4 komponentami, filtru
vyhoví 1 → váha 0,25 místo 1).

- nová funkce _component_entries: nejdřív vyfiltruje komponenty, pak
  přidělí váhu 1/n z těch, které prošly; DJ bez komponent má váhu 1
- smoke test vaha_komponent (4×0,25; 1 ze 4 → 1; 2 ze 3 → 2×0,5; bez
  komponent → 1)
- README: pole prvek_vaha v tabulce atributů komponent
- changelog v2.2.0 doplněn (bez povýšení verze)
- OpenSpec změna openspec/changes/fix-component-feature-weight

Ověřeno: živá data (Praha, novověk) – 0 z 1204 DJ se součtem vah ≠ 1,
původní kód 921; check_sources, bandit, detect-secrets, flake8, ruff,
pyqgis4-checker, smoke test v qgis/qgis:ltr i :stable.

Implementace připravena AI (Claude, subagent), ověřena a zkontrolována.

* openspec: archivovat fix-component-feature-weight (#55)

Ruční test v QGIS ověřen správcem: akce i lokality s Načíst komponenty,
bez filtru i s filtrem období – váhy prvků jedné DJ dávají součet 1 a
počítají se jen z vyfiltrovaných komponent. Úkol 3.2 odškrtnut, změna
archivována přes openspec archive --skip-specs.

Připraveno s pomocí AI (Claude).
2026-10-02 17:17:28 +02:00

2.2 KiB
Raw Blame History

Context

load_amcr_data in amcr_viewer/amcr_tools.py (section B) builds, for each DJ with a PIAN and Načíst komponenty on, one metadata dict per component and appends it to pian_lookup[pian_id]. The weight is set as 'vaha': 1/komps_count with komps_count = len(komps) computed before the loop that skips components failing komp_projde_filtrem. The empty-DJ branch leaves vaha out and the feature builder falls back to meta.get('vaha', 1).

Goals / Non-Goals

Goals: weights of one DJ sum to 1 under any filter; the rule is testable offline.

Non-Goals: weighting across DJs or across records that share one PIAN (a PIAN shared by several DJs still yields several features – the weight only de-duplicates components of one DJ, as #55 asked); changing the layer schema.

Decisions

  1. Filter first, then weigh. Build the list of passing components, then set vaha = 1/len(passing). Alternative – a second counting pass with sum(komp_projde_filtrem(...)) – duplicates the filter call and drifts if the filter changes (#70 replaces it).
  2. Extract a small pure helper (e.g. _component_entries(dj_meta, komps, passes) returning the list of per-component dicts with vaha, where passes is a predicate) so the smoke test can check weights without QGIS layers or network. The helper must not depend on how components are selected, so #70 can pass a different predicate.
  3. Explicit weight 1 for a DJ without components instead of relying on the meta.get('vaha', 1) default – the default stays as a safety net.

Risks / Trade-offs

  • Floating-point: 1/3 weights sum to 0.999…; acceptable for analyses, test with a tolerance.
  • The helper extraction touches a long function; keep the diff limited to the component branch.

Verification

  • Smoke test cases: 4 components no filter → 4×0.25; filter keeps 1 of 4 → weight 1; keeps 2 of 3 → 2×0.5; no components → 1 entry, weight 1.
  • Full AGENTS.md check set (ltr + stable smoke test, pyqgis4-checker).
  • Manual QGIS test by the user: download akce with Načíst komponenty and a period filter, check in the attribute table that prvek_vaha sums to 1 per dj_id.