# EvaluationRuleSet - pravidla vyhodnocení pro rozhodčí Tento dokument popisuje vyhodnocovací proces a jednotlivá nastavení rulesetu (`EvaluationRuleSet`). Slouží jako nápověda a vysvětlení dopadu na skóre a výsledky. ## Stručný popis vyhodnocovacího procesu 1. **Prepare** - příprava běhu, kontrola locku, vyčištění staging tabulek. 2. **ParseLogs** - parsování EDI souboru, naplnění `logs` a `log_qsos`. 3. **BuildWorkingSet** - normalizace volacích znaků, lokátorů, příprava `working_qsos`. 4. **Match** - párování QSO mezi logy, detekce neshod a typy chyb. 5. **UnpairedClassification** - NIL/NO_COUNTERPART/UNIQUE pro nenapárovaná QSO. 6. **DuplicateResolution** - výběr přeživších u duplicit podle strategie. 7. **Score** - bodování, aplikace policy, penalizací a multiplikátorů. 8. **Aggregate** - součty za log (score, counts), výpočet metrik. 9. **ApplyLogOverrides** - ruční zásahy do log_results. 10. **RecalculateRanks** - přepočet pořadí. 11. **Finalize** - uzavření běhu a uvolnění locku. ## Politiky (společné chování) Používané policy hodnoty: - **INVALID**: `is_valid=false`, body 0. - **ZERO_POINTS**: `is_valid=true`, body 0. - **FLAG_ONLY**: `is_valid=true`, body beze změny (jen flag). - **PENALTY**: `is_valid=true`, body 0 (u některých chyb body zůstávají) + penalizace. Poznámka: `valid_qso_count` se počítá podle `is_valid`. ## Nastavení rulesetu a dopad (kde se uplatňuje) ### Skóre a body - `scoring_mode` (DISTANCE / FIXED_POINTS): určuje typ bodování. Uplatnění: scoring. - `points_per_qso`: fixní body za QSO (FIXED_POINTS). Uplatnění: scoring. - `points_per_km`: body za km (DISTANCE). Uplatnění: scoring. - `distance_rounding` (FLOOR/ROUND/CEIL): zaokrouhlení vzdálenosti. Uplatnění: scoring. - `min_distance_km`: minimální vzdálenost pro bodované QSO. Uplatnění: scoring. ### Multiplikátory - `use_multipliers`: zapíná multiplikátory. Uplatnění: scoring + agregace. - `multiplier_type` (WWL/DXCC/SECTION/COUNTRY/NONE): typ multiplikátoru. Uplatnění: scoring + agregace. - `multiplier_scope` (PER_BAND/OVERALL): scope multiplikátoru. Uplatnění: agregace. - `multiplier_source` (VALID_ONLY/ALL_MATCHED): z čeho se počítají. Uplatnění: agregace. - `wwl_multiplier_level` (LOCATOR_2/4/6): délka WWL multiplikátoru. Uplatnění: scoring. ### Error policy a penalizace - `dup_qso_policy`, `nil_qso_policy`: policy pro DUP/NIL. Uplatnění: scoring. - `no_counterpart_log_policy`, `not_in_counterpart_log_policy`, `unique_qso_policy`, `time_mismatch_policy`: policy pro NIL/UNIQUE/TIME_MISMATCH. Uplatnění: scoring. - `busted_call_policy`, `busted_exchange_policy`, `busted_serial_policy`, `busted_locator_policy`, `busted_rst_policy`: policy pro BUSTED chyby. Uplatnění: scoring. - `penalty_*_points`: velikost penalizací pro jednotlivé chyby. Uplatnění: scoring. - `out_of_window_policy`, `penalty_out_of_window_points`: chování mimo časové okno. Uplatnění: scoring. ### Matching (párování QSO) - `time_tolerance_sec`: tolerance času pro match. Uplatnění: matching. - `allow_time_shift_one_hour`, `time_shift_seconds`: povolený časový posun. Uplatnění: matching. - `allow_time_mismatch_pairing`, `time_mismatch_max_sec`: párování mimo toleranci. Uplatnění: matching. - `callsign_normalization` (STRICT/IGNORE_SUFFIX), `ignore_slash_part`, `ignore_third_part`, `callsign_suffix_max_len`, `callsign_levenshtein_max`: normalizace volacích znaků a fuzzy match. Uplatnění: matching. - `match_tiebreak_order`: pořadí tiebreak kritérií (time_diff, exchange_match, ...). Uplatnění: matching (volba nejlepšího kandidáta). - `match_require_locator_match`, `match_require_exchange_match`: vyžadování shody lokátoru/exchange pro match. Uplatnění: matching. - `exchange_type`, `exchange_requires_*`, `exchange_pattern`: definice a kontrola exchange. Uplatnění: matching. - `letters_in_rst`, `rst_ignore_third_char`: normalizace RST. Uplatnění: matching. - `discard_qso_*`: určuje, zda se neshoda označí jako BUSTED a s jakou stranou (RX/TX). Uplatnění: matching. - `checklog_matching`: zahrnout CHECK logy do matchingu. Uplatnění: matching. ### Duplicity a unikátní QSO - `dupe_scope` (BAND/BAND_MODE): klíč pro duplicity. Uplatnění: working set + duplicity. - `dup_resolution_strategy`: pořadí pravidel pro výběr přeživších DUP. Uplatnění: duplicate resolution. - `require_unique_qso`: zapíná detekci UNIQUE. Uplatnění: unpaired klasifikace. ### DQ limity (log-level) - `out_of_window_dq_threshold`: DQ při nadlimitních QSO mimo okno. Uplatnění: agregace. - `time_diff_dq_threshold_percent`, `time_diff_dq_threshold_sec`: DQ při časovém rozptylu. Uplatnění: agregace. - `bad_qso_dq_threshold_percent`: DQ při nadlimitním % chybných QSO. Uplatnění: agregace. ### 6H operating window - `operating_window_mode` (NONE/BEST_CONTIGUOUS): zapíná 6H operating window. Uplatnění: agregace (vybere nejlepší 6H okno pro log). - `operating_window_hours`: délka 6H okna (aktuálně pevně 6 h). Uplatnění: agregace. - `sixhr_ranking_mode` (IARU/CRK): způsob pořadí pro 6H. Uplatnění: přepočet pořadí (IARU = jedna společná 6H tabulka bez SO/MO, CRK = odděleně SO/MO). Poznámka: Pro IARU se 6H okno vybírá jako max. 2 segmenty s pauzou >= 2 h, součet délek <= 6 h. ### Options (JSON) - `options`: fallback hodnoty, pokud není vyplněn sloupec. Uplatnění: napříč matching/scoring (viz metody `getOption`/`get*` v modelu). ## Výchozí ruleset (default_vhf_compat) Zdroj: `database/seeders/EvaluationRuleSetSeeder.php` Nastavení (zkrácené na podstatné hodnoty): - Profil: **Default VHF (compat)**, permisivní matching. - Scoring: `scoring_mode=DISTANCE`, `points_per_qso=1`, `points_per_km=1.0` - Multiplikátory: `use_multipliers=false`, `multiplier_type=WWL` - Policy: - `dup_qso_policy=ZERO_POINTS` - `nil_qso_policy=ZERO_POINTS` - `no_counterpart_log_policy=FLAG_ONLY` - `not_in_counterpart_log_policy=ZERO_POINTS` - `unique_qso_policy=FLAG_ONLY` - `busted_*_policy=ZERO_POINTS` - `time_mismatch_policy=ZERO_POINTS` - penalizace vše 0 - Matching: - `time_tolerance_sec=600` - `allow_time_shift_one_hour=true`, `time_shift_seconds=3600` - `allow_time_mismatch_pairing=false` - `callsign_normalization=IGNORE_SUFFIX` - `ignore_slash_part=true`, `ignore_third_part=true` - `letters_in_rst=false`, `rst_ignore_third_char=true` - `match_require_locator_match=false`, `match_require_exchange_match=false` - `match_tiebreak_order=[time_diff, exchange_match, locator_match, report_match, log_qso_id]` - `discard_qso_rec_diff_*=true`, `discard_qso_sent_diff_*=false` - Duplicity: - `dupe_scope=BAND` - `dup_resolution_strategy=[paired_first, ok_first, earlier_time, lower_id]` - Exchange: - `exchange_type=SERIAL_WWL` - `exchange_requires_wwl=true`, `exchange_requires_serial=true`, `exchange_requires_report=true` - DQ limity: - `out_of_window_dq_threshold=600` - `time_diff_dq_threshold_percent=30` - `time_diff_dq_threshold_sec=600` - `bad_qso_dq_threshold_percent=30` ## Poznámky k interpretaci výsledků - `valid_qso_count` = počet QSO s `is_valid=true`. - `discarded_qso_count` = počet QSO s `is_valid=false`. - Penalizace se uplatňuje v `penalty_score` a odčítá se od `base_score`.