th commited on
Commit
5856bed
·
1 Parent(s): eac3168

fix(vedic): D2(Hora)改用 chart_method=2,修正财富盘长期算错

Browse files

divisional_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 CHANGED
@@ -1,7 +1,20 @@
1
  """
2
  divisional_pyjhora.py - PyJHora 分盘计算封装
3
  支持所有标准分盘 (D1-D60)
4
- 使用 charts.divisional_chart(chart_method=1) — JHora Traditional Parasara
 
 
 
 
 
 
 
 
 
 
 
 
 
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=1)
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"