block approximate gulika reuse

This commit is contained in:
732642856
2026-07-12 19:22:13 +08:00
parent defa9fff52
commit 67b217efd7
6 changed files with 27 additions and 10 deletions
+7 -2
View File
@@ -12,7 +12,6 @@ from __future__ import annotations
from typing import Dict, Any
from jaimini import calc_special_lagnas_precise
from prashna import calc_gulika_simple
from varga import calc_all_vargas
@@ -45,7 +44,13 @@ def analyze_adhana_candidates(payload: Dict[str, Any]) -> Dict[str, Any]:
asc_lon = float(payload["asc_lon"])
sun_lon = float(payload["sun_lon"])
moon_lon = float(payload["moon_lon"])
gulika_lon = float(payload.get("gulika_lon", calc_gulika_simple(asc_lon, sun_lon, int(payload.get("weekday", 0)))))
if "gulika_lon" not in payload:
return {
"status": "blocked",
"reason": "exact_gulika_longitude_required_for_adhana_scaffold",
"blocked_layers": ["Gulika", "Adhana candidate points"],
}
gulika_lon = float(payload["gulika_lon"])
year = int(payload["year"])
month = int(payload["month"])
+15 -4
View File
@@ -810,10 +810,15 @@ def _planet_lon(planet_lons: Dict, planet: str, default: float = 0.0) -> float:
return _norm(planet_lons.get(planet, default))
class GulikaUnavailableError(RuntimeError):
"""Raised when a caller asks for the retired approximate Gulika value."""
def calc_gulika_simple(asc_lon: float, sun_lon: float = 0.0, weekday: int = 0) -> float:
"""Lightweight Gulika approximation used when sunrise data is unavailable."""
weekday_offsets = [210, 180, 150, 120, 90, 60, 30]
return _norm((sun_lon or asc_lon) + weekday_offsets[weekday % 7])
"""Retired: exact Gulika needs sunrise, sunset, weekday and birth segment."""
raise GulikaUnavailableError(
"approximate_gulika_removed_exact_day_segment_calculation_required"
)
def calc_arudha(asc_lon: float, planet_lons: Dict) -> Dict:
@@ -862,7 +867,13 @@ def calc_sphutas(planet_lons: Dict, asc_lon: float = 0.0) -> Dict:
def calc_life_sphutas(asc_lon: float, moon_lon: float, sun_lon: float, gulika_lon: float = 0.0) -> Dict:
gulika = _norm(gulika_lon or calc_gulika_simple(asc_lon, sun_lon))
if not gulika_lon:
return {
"status": "blocked",
"reason": "exact_gulika_longitude_required_for_life_sphutas",
"blocked_layers": ["Gulika", "Prana", "Deha", "Mrityu"],
}
gulika = _norm(gulika_lon)
prana = _norm(asc_lon * 5 + gulika)
deha = _norm(moon_lon * 8 + gulika)
mrityu = _norm(gulika * 7 + sun_lon)
+2 -2
View File
@@ -367,8 +367,8 @@ def _register_existing_techniques():
TechniqueLevel.L2_STANDARD, TechniqueStatus.STABLE,
module_path="synastry.py", compute_func="calc_synastry"),
TechniqueSpec("prashna", "问事系统", TechniqueCategory.PRASHNA,
TechniqueLevel.L2_STANDARD, TechniqueStatus.BETA,
module_path="prashna.py", compute_func="cast_prashna"),
TechniqueLevel.L2_STANDARD, TechniqueStatus.WIP,
module_path="prashna_context.py", compute_func="build_prashna_context"),
# L3 高级技法(部分已有)
TechniqueSpec("vimsopaka", "20分力量", TechniqueCategory.NATAL,