mirror of
https://github.com/ARUP-CAS/aiscr-qgis-amcr-viewer.git
synced 2026-10-09 20:37:37 +02:00
* 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).
50 lines
2.2 KiB
Markdown
50 lines
2.2 KiB
Markdown
## 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`.
|