fix: support D11 in native varga map

This commit is contained in:
732642856
2026-07-19 18:57:45 +08:00
parent 1f238b6e00
commit 6ca04ccd9a
2 changed files with 21 additions and 3 deletions
+4 -3
View File
@@ -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,{})
+17
View File
@@ -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 = {