From 6ca04ccd9a2709c736527d6d13d896217b83fdda Mon Sep 17 00:00:00 2001 From: 732642856 <732642856@qq.com> Date: Sun, 19 Jul 2026 18:57:45 +0800 Subject: [PATCH] fix: support D11 in native varga map --- scripts/varga.py | 7 ++++--- tests/test_varga_bphs.py | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/scripts/varga.py b/scripts/varga.py index 4bf6ccfc..c60ce960 100644 --- a/scripts/varga.py +++ b/scripts/varga.py @@ -3,7 +3,7 @@ """ 吠陀占星分盘计算模块 v1.0 BPHS Shodasavarga(十六分盘体系) -支持: D2/D3/D4/D7/D9/D10/D12/D16/D20/D24/D27/D30/D40/D45/D60 +支持: D2/D3/D4/D7/D9/D10/D11/D12/D16/D20/D24/D27/D30/D40/D45/D60 每个分盘输出精确度数,支持进一步分析。 """ from typing import Dict, List, Optional @@ -24,7 +24,7 @@ VARGA_META = { 2:{'name':'Hora','cn':'财富','area':'财富资源'},3:{'name':'Drekkana','cn':'兄弟','area':'兄弟姐妹'}, 4:{'name':'Turyamsa','cn':'财产','area':'财产住所'},7:{'name':'Saptamsa','cn':'子女','area':'子女后代'}, 9:{'name':'Navamsa','cn':'婚姻','area':'婚姻伴侣灵魂'},10:{'name':'Dasamsa','cn':'事业','area':'事业公众形象'}, - 12:{'name':'Dwadashamsa','cn':'父母','area':'父母祖先'},16:{'name':'Shodasamsa','cn':'享受','area':'车辆物质'}, + 11:{'name':'Rudramsa','cn':'收益转化','area':'收益朋友愿望'},12:{'name':'Dwadashamsa','cn':'父母','area':'父母祖先'},16:{'name':'Shodasamsa','cn':'享受','area':'车辆物质'}, 20:{'name':'Vimsamsa','cn':'修行','area':'精神修行'},24:{'name':'Siddhamsa','cn':'学识','area':'教育学识'}, 27:{'name':'Bhamsa','cn':'力量','area':'力量弱点'},30:{'name':'Trimsamsa','cn':'苦难','area':'灾难苦难'}, 40:{'name':'Khavedamsa','cn':'运势','area':'吉凶运势'},45:{'name':'Akshavedamsa','cn':'格局','area':'整体格局'}, @@ -71,6 +71,7 @@ def varga_map(si, pi, div): else: start=(si+4)%12 return (start+pi)%12 if div==10: return (si+pi)%12 if o else (si+8+pi)%12 # D10: even signs count from 9th inclusively => +8 offset + if div==11: return (si+pi)%12 if o else (si+8+pi)%12 # D11 Rudramsa: mirror extended calculator if div==12: return (si+pi)%12 if div==16: return ((0 if o else 4)+pi)%12 # D16: movable=+0, fixed=+4; dual needs separate (2026-05-03 fix: was +1) if div==20: return ((0 if o else 8)+pi)%12 @@ -244,7 +245,7 @@ def dignity(planet, sign_idx): def calc_all_vargas(planet_lons, asc_lon, divisions=None, mode='classical_local'): """批量计算所有指定分盘""" if divisions is None: - divisions=[2,3,4,7,9,10,12,16,20,24,27,30,40,45,60] + divisions=[2,3,4,7,9,10,11,12,16,20,24,27,30,40,45,60] results={} for div in divisions: m=VARGA_META.get(div,{}) diff --git a/tests/test_varga_bphs.py b/tests/test_varga_bphs.py index f0ce9ee7..c7492726 100644 --- a/tests/test_varga_bphs.py +++ b/tests/test_varga_bphs.py @@ -10,6 +10,7 @@ from varga import ( calc_22nd_drekkana, calc_64th_navamsa, calc_bhrigu_bindu, + calc_all_vargas, calc_sarpa_drekkana, calc_varga, varga_map, @@ -95,6 +96,22 @@ def test_varga_map_boundary_examples() -> None: assert varga_map(0, 2, 3) == 8 # Aries third Drekkana = Sagittarius +def test_rudramsa_d11_is_supported_by_native_varga_map() -> None: + assert varga_map(0, 0, 11) == 0 + assert varga_map(0, 10, 11) == 10 + assert varga_map(1, 0, 11) == 9 + assert varga_map(1, 10, 11) == 7 + result = calc_varga(35.0, 11) + assert result["sign"] == "Aquarius" + assert 0 <= result["degree_in_sign"] < 30 + + +def test_default_varga_batch_includes_d11() -> None: + charts = calc_all_vargas({"Moon": 35.0}, 10.0) + assert "D11_Rudramsa" in charts + assert charts["D11_Rudramsa"]["Moon"]["sign"] == "Aquarius" + + def test_navamsa_matches_user_jhora_pdf_reference_chart() -> None: """Regression from private_chart_reference.pdf: JHora-style D9 table for public sample birth datetime San Francisco.""" expected = {