mirror of
https://github.com/migatu/astrololo.git
synced 2026-07-14 13:34:38 +00:00
f6323cac10
Punktacja siły (LOG-21): - scoring.py: siła fasety z sygnałów obliczalnych (typ fasety, rodzaj aspektu, ciasnota orbu). Konfigurowalne wagi. Hook na przyszłość: kolumny countas*/level* z SIGNIFICATORS KEY (obecnie puste). - aspekty niosą orb+allowed; fasety dostają "score"; ranking faset malejąco. Grupowanie: - opcja group: zwija próbki po opisie (ten sam efekt = jedna grupa z listą sygnifikatorów i licznikiem). Checkbox "grupuj identyczne opisy" w /interpret. Geolokalizacja (bajer): - "Tu i teraz" (widok Horoskop i Interpretacje) uzupełnia lat/lon z przeglądarki (navigator.geolocation; wymaga zgody, https/localhost). Zweryfikowano na realnym main_base.xlsx: ranking sensowny (ciasna opozycja z Saturn 9.59 > szeroka koniunkcja z Moon 6.25 > znak/dom 5.0); grupowanie zwija powtórzone opisy. 41 testów przechodzi. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
33 lines
1.2 KiB
Python
33 lines
1.2 KiB
Python
"""Punktacja siły trafień — do rankingowania faset (zalążek LOG-21).
|
||
|
||
v1 liczy siłę z sygnałów OBLICZALNYCH:
|
||
- typ fasety (aspekt zwykle mocniejszy od znaku/domu),
|
||
- rodzaj aspektu (koniunkcja/opozycja mocniejsze od sekstyla),
|
||
- ciasnota orbu (im bliżej dokładności, tym mocniej).
|
||
|
||
Wszystko konfigurowalne. HOOK NA PRZYSZŁOŚĆ: gdy w SIGNIFICATORS KEY zostaną
|
||
wypełnione kolumny `countas*`/`level*`, można je tu domieszać per sygnifikator.
|
||
"""
|
||
from __future__ import annotations
|
||
|
||
# bazowe wagi faset (łatwe do strojenia)
|
||
FACET_BASE = {"sign": 5.0, "house": 5.0, "aspect": 6.0}
|
||
|
||
# względna siła aspektów głównych
|
||
ASPECT_WEIGHT = {
|
||
"conjunction": 1.0, "opposition": 0.95, "square": 0.85,
|
||
"trine": 0.85, "sextile": 0.65,
|
||
}
|
||
|
||
|
||
def score_facet(facet: dict) -> float:
|
||
"""Siła fasety w skali ~0–12. Deterministyczna, konfigurowalna."""
|
||
base = FACET_BASE.get(facet.get("type"), 1.0)
|
||
if facet.get("type") == "aspect":
|
||
weight = ASPECT_WEIGHT.get(facet.get("aspect"), 0.7)
|
||
orb = facet.get("orb")
|
||
allowed = facet.get("allowed") or 10.0
|
||
tight = max(0.0, 1.0 - orb / allowed) if orb is not None and allowed else 0.0
|
||
return round(base * weight * (1.0 + tight), 2)
|
||
return round(base, 2)
|