97 lines
3.6 KiB
Python
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
|