Files
Jyotisha/scripts/annual_native/saham_traces.py
T
2026-10-22 23:11:48 +08:00

97 lines
3.6 KiB
Python

"""Formula traces for Sahams that were already calculated.
The trace copies the stored longitude. It does not replace it.
"""
from __future__ import annotations
from typing import Any
# (result key, day (p1, p2), night (p1, p2) or None when day and night match)
# _saham(p1, p2) = Asc + p2 - p1.
_LOCAL = (
("karya_saham", ("Moon", "Mars"), ("Mars", "Moon")),
("vivah_saham", ("Mars", "Venus"), None),
("rajya_saham", ("Jupiter", "Sun"), None),
("shatru_saham", ("Saturn", "Mars"), None),
("labha_saham", ("Moon", "Jupiter"), None),
("parakrama_saham", ("Sun", "Mars"), None),
("putra_saham", ("Moon", "Jupiter"), None),
("jnana_saham", ("Mercury", "Jupiter"), None),
("raja_saham", ("Moon", "Sun"), None),
("yasha_saham", ("Sun", "Jupiter"), None),
("karma_saham", ("Mars", "Saturn"), None),
("bandhu_saham", ("Mercury", "Mars"), None),
("matri_saham", ("Venus", "Moon"), None),
("pitri_saham", ("Saturn", "Sun"), None),
("janma_saham", ("Sun", "Asc"), None),
("mrityu_saham", ("Mars", "Saturn"), None),
("rogha_saham", ("Saturn", "Mercury"), None),
("aarogya_saham", ("Saturn", "Jupiter"), None),
("bhraatri_saham", ("Moon", "Mars"), None),
("ghataka_saham", ("Mars", "Rahu"), None),
("paradesa_saham", ("Moon", "Saturn"), None),
("parabharya_saham", ("Mars", "Venus"), None),
("dhan_saham", ("Venus", "Jupiter"), None),
("maya_saham", ("Ketu", "Rahu"), None),
("moksha_saham", ("Jupiter", "Ketu"), None),
("buddha_saham", ("Jupiter", "Mercury"), None),
("shastra_saham", ("Ketu", "Mars"), None),
("kala_saham", ("Sun", "Saturn"), None),
("shakti_saham", ("Moon", "Venus"), None),
("bhrigu_saham", ("Jupiter", "Venus"), None),
("sundara_saham", ("Mercury", "Venus"), None),
("jnati_saham", ("Saturn", "Mars"), None),
("artha_saham", ("Venus", "Sun"), None),
("dharma_saham", ("Saturn", "Jupiter"), None),
("sangrama_saham", ("Rahu", "Mars"), None),
)
def _rule_text(meta: dict) -> str:
operands = meta.get("formula_operands") or ()
text = " + ".join(str(part).replace("_", " ") for part in operands) if operands else str(meta.get("rule_name") or "rule")
if meta.get("zodiacal_order_exception_applied"):
text += " (+30 deg)"
return text
def attach_formula_traces(
results: dict[str, Any],
*,
is_day: bool,
formula_meta: dict[str, dict] | None = None,
) -> list[dict]:
"""Add ``formula_traces`` without changing any existing Saham longitude."""
formula_meta = formula_meta or {}
traces = []
punya = formula_meta.get("punya_saham")
if punya and isinstance(results.get("punya_saham"), dict):
traces.append({
"name": results["punya_saham"].get("name") or "Punya Saham",
"key": "punya_saham",
"rule": _rule_text(punya),
"phase": "day" if is_day else "night",
"longitude": results["punya_saham"].get("longitude"),
})
for key, day_pair, night_pair in _LOCAL:
item = results.get(key)
if not isinstance(item, dict) or not isinstance(item.get("longitude"), (int, float)):
continue
meta = formula_meta.get(key)
if meta:
rule = _rule_text(meta)
else:
pair = day_pair if is_day or night_pair is None else night_pair
rule = f"Asc + {pair[1]} - {pair[0]}"
traces.append({
"name": item.get("name") or key,
"key": key,
"rule": rule,
"phase": "day" if is_day else "night",
"longitude": item.get("longitude"),
})
results["formula_traces"] = traces
return traces