Spaces:
Running
Running
th commited on
Commit ·
5856bed
1
Parent(s): eac3168
fix(vedic): D2(Hora)改用 chart_method=2,修正财富盘长期算错
Browse filesdivisional_pyjhora.py 对全部分盘统一用 chart_method=1,但该值是
PVR/Parasara parivritti,会把 D2 散布到12个星座。经典 Hora 必须用
method=2(Traditional Parasara),只落巨蟹/狮子。
改法:D2 单独 method=2,其余14盘保持 method=1(实测 method=2 对其余全错)。
独立证据(非 PyJHora 血统):
- Astro-Seek 全星表 D2 逐星 10/10 与 method=2 一致
- vedicastrochart 同上
- JHora 分盘图 Ve/Ra/Asc/Ke 在巨蟹,其余在狮子
验证:
- 改码前新测试红(1 failed/8 passed),改码后 9 passed
- 变异测试:全部分盘强改 method=2 → test_other_vargas_still_use_method_1 红
- Astro-Seek 150项复核:142一致/8交点口径/0真不一致(修复前 134/10/6)
旧 docstring「method=1 = Traditional Parasara」是错的,已导致错误流入
付费报告(v4报告 L320「D-2土星在8宫」即其指纹——D2只有两个星座,无8宫)。
Ref: agent-knowledge/TH/astrology/vedic/patch-proposal-D2-hora-2026-08-23.md
🦊 Generated with Sisi
- vedic/divisional_pyjhora.py +17 -2
- vedic/test_golden_charts.py +43 -0
vedic/divisional_pyjhora.py
CHANGED
|
@@ -1,7 +1,20 @@
|
|
| 1 |
"""
|
| 2 |
divisional_pyjhora.py - PyJHora 分盘计算封装
|
| 3 |
支持所有标准分盘 (D1-D60)
|
| 4 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
"""
|
| 6 |
|
| 7 |
|
|
@@ -90,8 +103,10 @@ def calculate_divisional_charts(year, month, day, hour, minute, lat, lon, tz_off
|
|
| 90 |
try:
|
| 91 |
const._use_true_nodes_for_rahu_ketu = profile['use_true_nodes']
|
| 92 |
|
|
|
|
|
|
|
| 93 |
pp = charts.divisional_chart(jd_local, place,
|
| 94 |
-
divisional_chart_factor=dcf, chart_method=
|
| 95 |
|
| 96 |
chart_data = {}
|
| 97 |
for entry in pp:
|
|
|
|
| 1 |
"""
|
| 2 |
divisional_pyjhora.py - PyJHora 分盘计算封装
|
| 3 |
支持所有标准分盘 (D1-D60)
|
| 4 |
+
|
| 5 |
+
chart_method 语义(2026-08-23 三源实测确认,勿再按名字猜):
|
| 6 |
+
method=1 = PVR / Parasara parivritti → D1、D3–D60 正确
|
| 7 |
+
method=2 = Traditional Parasara → 仅 D2(Hora) 正确(经典二分:巨蟹/狮子)
|
| 8 |
+
|
| 9 |
+
故 D2 单独用 method=2,其余用 method=1。
|
| 10 |
+
|
| 11 |
+
实测(对 Astro-Seek 全星表,剔除平均/真交点口径差):
|
| 12 |
+
method=1 → D2 仅 2/8,其余 14 盘全部 8/8
|
| 13 |
+
method=2 → D2 8/8,其余全崩
|
| 14 |
+
|
| 15 |
+
⚠️ 本文件旧 docstring 曾写「method=1 = Traditional Parasara」,是错的,
|
| 16 |
+
已导致 D2 长期算错并流入付费报告(v4 报告 L320「D-2 土星在8宫」即其指纹)。
|
| 17 |
+
证据:agent-knowledge/TH/astrology/vedic/patch-proposal-D2-hora-2026-08-23.md
|
| 18 |
"""
|
| 19 |
|
| 20 |
|
|
|
|
| 103 |
try:
|
| 104 |
const._use_true_nodes_for_rahu_ketu = profile['use_true_nodes']
|
| 105 |
|
| 106 |
+
# D2(Hora) 的 chart_method 与其余分盘相反,见模块 docstring
|
| 107 |
+
_chart_method = 2 if dcf == 2 else 1
|
| 108 |
pp = charts.divisional_chart(jd_local, place,
|
| 109 |
+
divisional_chart_factor=dcf, chart_method=_chart_method)
|
| 110 |
|
| 111 |
chart_data = {}
|
| 112 |
for entry in pp:
|
vedic/test_golden_charts.py
CHANGED
|
@@ -143,3 +143,46 @@ def test_four_layer_schema_via_app_endpoint():
|
|
| 143 |
assert "Atmakaraka" in evidence and "Moon" in evidence
|
| 144 |
assert "Shadbala" in evidence
|
| 145 |
assert "DOUBLE-TRANSIT" in evidence
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 143 |
assert "Atmakaraka" in evidence and "Moon" in evidence
|
| 144 |
assert "Shadbala" in evidence
|
| 145 |
assert "DOUBLE-TRANSIT" in evidence
|
| 146 |
+
|
| 147 |
+
def test_d2_hora_is_classical_two_sign(xiaoyu_jhora_chart):
|
| 148 |
+
"""D2(Hora)必须是经典二分盘:所有星体只落巨蟹(月亮hora)或狮子(太阳hora)。
|
| 149 |
+
|
| 150 |
+
2026-08-23 多源复核发现的真 bug:divisional_pyjhora.py 对全部分盘统一用
|
| 151 |
+
chart_method=1,但 method=1 是 PVR/Parasara parivritti,会把 D2 散布到 12 个星座。
|
| 152 |
+
经典 Hora 必须用 chart_method=2 (Traditional Parasara)。
|
| 153 |
+
|
| 154 |
+
独立证据(非 PyJHora 血统):
|
| 155 |
+
- Astro-Seek D2 全部落 Cancer/Leo,与 method=2 逐星 10/10 一致
|
| 156 |
+
- vedicastrochart 同上
|
| 157 |
+
- JHora 分盘图 Ve/Ra/Asc/Ke 在 Cancer,其余在 Leo
|
| 158 |
+
错误方法曾流入付费报告:v4 报告 L320「D-2 盘中土星在8宫」——
|
| 159 |
+
D2 只有两个星座,8宫不可能存在,正是 method=1 把土星算到水瓶的指纹。
|
| 160 |
+
"""
|
| 161 |
+
d2 = xiaoyu_jhora_chart["divisional_charts"]["D2"]
|
| 162 |
+
signs = {v["sign"] for v in d2.values() if isinstance(v, dict) and "sign" in v}
|
| 163 |
+
assert signs <= {"Cancer", "Leo"}, f"D2 应只含 Cancer/Leo,实得 {sorted(signs)}"
|
| 164 |
+
|
| 165 |
+
# 逐星锁定(与 Astro-Seek / vedicastrochart 独立一致)
|
| 166 |
+
assert d2["Lagna"]["sign"] == "Cancer"
|
| 167 |
+
assert d2["Venus"]["sign"] == "Cancer"
|
| 168 |
+
assert d2["Rahu"]["sign"] == "Cancer"
|
| 169 |
+
assert d2["Ketu"]["sign"] == "Cancer"
|
| 170 |
+
for p in ("Sun", "Moon", "Mars", "Mercury", "Jupiter", "Saturn"):
|
| 171 |
+
assert d2[p]["sign"] == "Leo", f"{p} 应在 Leo(太阳hora),实得 {d2[p]['sign']}"
|
| 172 |
+
|
| 173 |
+
|
| 174 |
+
def test_other_vargas_still_use_method_1(xiaoyu_jhora_chart):
|
| 175 |
+
"""D2 的修法不能污染其余分盘:method=2 只对 D2 正确,对其余全错。
|
| 176 |
+
|
| 177 |
+
2026-08-23 实测(对 Astro-Seek 全星表,剔除交点口径差):
|
| 178 |
+
method=1 → D2 仅 2/8,其余 14 盘全部 8/8
|
| 179 |
+
method=2 → D2 8/8,其余全崩
|
| 180 |
+
本测试锁住几个 method=1 才正确的样本,防止有人图省事把全部分盘改成 method=2。
|
| 181 |
+
"""
|
| 182 |
+
dc = xiaoyu_jhora_chart["divisional_charts"]
|
| 183 |
+
assert dc["D9"]["Lagna"]["sign"] == "Aries"
|
| 184 |
+
assert dc["D9"]["Mercury"]["sign"] == "Capricorn"
|
| 185 |
+
assert dc["D10"]["Lagna"]["sign"] == "Aries"
|
| 186 |
+
assert dc["D10"]["Mars"]["sign"] == "Scorpio"
|
| 187 |
+
assert dc["D3"]["Lagna"]["sign"] == "Virgo"
|
| 188 |
+
assert dc["D30"]["Moon"]["sign"] == "Scorpio"
|