From cb9d942b9e31e772c7ebfe7ed24f4e51b1da1a61 Mon Sep 17 00:00:00 2001 From: 732642856 <732642856@qq.com> Date: Fri, 2 Oct 2026 13:47:26 +0800 Subject: [PATCH] fix: reverse Rahu degree in eight-karaka ranking (cherry picked from commit 197672e3f1c5d06fe44f0da196d36f6cf4a856cf) --- scripts/jaimini.py | 18 +++++++++++++----- tests/test_jaimini.py | 11 +++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/scripts/jaimini.py b/scripts/jaimini.py index 2d6e4b13..879b24ef 100644 --- a/scripts/jaimini.py +++ b/scripts/jaimini.py @@ -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), diff --git a/tests/test_jaimini.py b/tests/test_jaimini.py index 43ca05b2..66a7a7c6 100644 --- a/tests/test_jaimini.py +++ b/tests/test_jaimini.py @@ -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 ──────────────────────────────────────────────