fix: reverse Rahu degree in eight-karaka ranking
(cherry picked from commit 197672e3f1c5d06fe44f0da196d36f6cf4a856cf)
This commit is contained in:
+13
-5
@@ -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),
|
||||
|
||||
@@ -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 ──────────────────────────────────────────────
|
||||
|
||||
|
||||
Reference in New Issue
Block a user