fix: reverse Rahu degree in eight-karaka ranking

(cherry picked from commit 197672e3f1c5d06fe44f0da196d36f6cf4a856cf)
This commit is contained in:
732642856
2026-10-02 23:38:54 +08:00
committed by Jesse_Chen
parent 677d40f991
commit cb9d942b9e
2 changed files with 24 additions and 5 deletions
+13 -5
View File
@@ -132,21 +132,29 @@ def calc_chara_karaka_7(planet_degrees: Dict[str, float]) -> Dict:
def calc_chara_karaka_8(planet_degrees: Dict[str, float]) -> Dict:
"""计算8星制Chara Karaka(含Rahu,Ketu排除)。"""
"""计算8星制Chara Karaka(含Rahu,Ketu排除)。
8星制按传统规则以 ``30 - Rahu 的星座内度数`` 排序;其余行星
使用原始星座内度数。原始值和排序值都保留在结果中,便于审计。
"""
planets = {}
for pname, deg in planet_degrees.items():
if pname == 'Ketu':
continue
planets[pname] = deg
sorted_planets = sorted(planets.items(), key=lambda x: x[1], reverse=True)
raw_degree = float(deg) % 30.0
effective_degree = (30.0 - raw_degree) % 30.0 if pname == 'Rahu' else raw_degree
planets[pname] = (raw_degree, effective_degree)
sorted_planets = sorted(planets.items(), key=lambda x: x[1][1], reverse=True)
results = {}
for rank, (pname, deg) in enumerate(sorted_planets, 1):
for rank, (pname, (raw_degree, effective_degree)) in enumerate(sorted_planets, 1):
if rank > 8:
break
karaka = KARAKA_8[rank]
results[karaka] = {
'planet': pname,
'degree_in_sign': round(deg, 4),
'degree_in_sign': round(raw_degree, 4),
'effective_degree_in_sign': round(effective_degree, 4),
'rahu_reverse_applied': pname == 'Rahu',
'rank': rank,
'domain': KARAKA_DOMAINS.get(karaka, ''),
'cn_name': KARAKA_CN.get(karaka, karaka),
+11
View File
@@ -89,6 +89,17 @@ class TestCharaKaraka8:
planets = [v['planet'] for v in result['karaka_table_8'].values()]
assert 'Ketu' not in planets
def test_rahu_uses_reverse_degree_for_eight_karaka_ranking(self):
degrees = {
'Sun': 10.0, 'Moon': 11.0, 'Mars': 12.0, 'Mercury': 13.0,
'Jupiter': 14.0, 'Venus': 15.0, 'Saturn': 16.0, 'Rahu': 29.0,
}
result = calc_chara_karaka_8(degrees)
rahu = next(row for row in result['karaka_table_8'].values() if row['planet'] == 'Rahu')
assert rahu['degree_in_sign'] == 29.0
assert rahu['effective_degree_in_sign'] == 1.0
assert rahu['rahu_reverse_applied'] is True
# ── Arudha Pada Tests ──────────────────────────────────────────────