Files
Jyotisha/docs/research/upstream_notice_2026_10_16.md
T

7.2 KiB
Raw Blame History

致 skill 作者:10-16 版的代码问题与口径问题(2026-10-16)

核对对象:yinduzhanxing 3c2dad95(main,2026-10-16)。

您好,谢谢 10-08 以来的这批修正(Pinda、Argala、Bhava Bala、Avastha、KP、Saham、Yoga、Dasha)。我们逐条对照了自己的代码,大部分会跟进。下面分两部分:

  • 第一部分:在 3c2dad95 上仍然存在的代码问题,都能用贵方自己的测试或一行命令复现。
  • 第二部分:几处口径选择,需要您告诉我们出处或怎么取舍。

两部分都有答复后,我们再同步。


第一部分 代码问题

1. 星宿大运拆解:第一大运的小运被按「剩余年数」重新切分(贵方自己的测试失败)

  • 位置:nakshatra_dasha.calc_nakshatra_dasha_breakdown。第一大运把 first_remaining(出生时剩余的年数)交给 _calc_vimshottari_antardasha_full,等于把剩余这段当成一个完整大运,重新切成 9 段小运。
  • 正确做法:小运从完整大运的真实起点开始排,排完再裁到出生之后。cmd_dasha 在 3c2dad95 里已经这么做了,这里漏了。
  • 复现:python3 -m pytest -q tests/test_nakshatra_native_dasha_clock.py::test_first_remaining_md_is_not_repartitioned_into_new_ads,在 3c2dad95 上失败。用例里月亮在 Ashwini 中点,当前小运应为 Rahu,引擎给的是 Ketu。
  • 影响:仍处在第一大运的人(儿童、青少年;第一大运很长时成年人也会),「当前小运」和随后的 Tara 分析会落在错的星上。

2. 星宿起点上的大运余额:3c2dad95 只修好了 22/27

  • 复现:python3 -m pytest -q tests/test_nakshatra_native_dasha_clock.py,test_native_vimshottari_exact_star_birth_balance 的 [7] [11] [14] [22] [25] 五项失败。
  • 现象:月亮恰好在这几个星宿的起点时,序号被判到前一个星宿,大运表里多出一行零长度的大运。
  • 原因:星宿序号和星宿内进度仍然分开算(一个用除法取整,一个用取余),浮点误差下两者不一致。
  • 建议:从同一个量一次算出序号和进度(例如 q = lon / span;idx = floor(q);progress = q - idx),再做边界夹紧:progress 极接近 1 时进位到下一星宿。27 个起点应全部通过。

3. dasha_analyzer.lon_to_nakshatra 仍是旧写法

  • 这个函数还是 idx = int(moon_lon / nak_span)、progress = (moon_lon % nak_span) / nak_span,与第 2 条修复前的写法相同,这次没有一起改。
  • 它在边界上会有和第 2 条一样的问题,建议一并改成同一种算法。

4. 新的 PVR Shayanadi 没有接进主链

  • avastha_calculator.calculate_pvr_shayanadi 只在调用方传了 activity_context(月亮经度、上升经度、离日出的小时数)时才会生效。
  • 但在 scripts/ 下,没有任何调用方传这个参数,所以报告和数据包里的 Shayanadi 实际输出仍是 simplified_heuristic(按星座元素分类)。
  • 请确认:是有意先不接,还是漏接了?

5. Gulika 的夜晚结束时刻是「日出 + 1 天」,不是真实的下一次日出

  • 位置:gulika.py 的两处 end_jd = ... daynight["sunrise_jd_ut"] + 1.0。
  • 这和 872eaecf 在 saham_daynight 里修掉的是同一类问题:用固定一天平移代替真实的相邻事件。高纬度、换季时差几分钟,Gulika 所在的段会跟着偏。

6. Saham 例外规则:两个文件检查的弧方向相反

  • tajika._calc_formula_saham:检查上升是否落在「第一操作数 → 第二操作数」的顺行弧上,不在就加一宫。
  • raman_sahams.build_raman_sahams:检查第三操作数是否落在「B → A」的顺行弧上,不在就算例外。注释里还特别写了「not A to B」。
  • 同一条传统规则,两处方向正好相反。saham_rules.json 的 7 条公式第三项都是上升,所以 tajika 那边的检查对象和 raman 是同一颗点,只有方向不同。
  • 请确认哪个方向对;另一处是否也要改?

7. Argala 新增的「待比较」状态没有裁决方

  • e7301feb 之后,同数时输出 strength_comparison_required,复核文档也写明强弱裁决「留待单独复核」。
  • 我们在三张虚构盘上试过:每张盘有 0~7 个宫变成待比较,obstructed_houses 全部清空。也就是说,在补上裁决之前,下游大量拿到的是「不确定」。
  • 第二部分问 3 是同一件事的口径问题。

第二部分 口径问题(请在空格里回答,附书页即可)

问 1 Deeptadi 的 Khala:用 Science of Light 还是 PVR?

7d545039 采用 Science of Light 的定义(落陷 = Khala),代码里注明「不是 PVR 的凶星座定义」。

☐ Science of Light(落陷) ☐ PVR(落在凶星的星座) ☐ 其他:____ 书页:____

附问: 一颗星同时满足多个标签时(例如既落陷又燃烧),单标签按什么优先级取?代码里写的是「legacy heuristic」。

优先顺序:________ 书页:____

问 2 日出日落:为什么用「日面中心、不计大气折射」(BIT_HINDU_RISING)?

我们实测,它和常规日出相比,同一天最多差约 7 分钟(伦敦冬季)。这会牵动昼夜判定、Hora / Ghati / Pranapada 的起点、Gulika 和 Tajika 的昼夜公式。

  1. 这个口径的出处是? ________ 书页:____
  2. 是否所有用到日出的地方(Panchanga、Gulika、Hora、Ghati、Saham 昼夜)都应统一用它?

☐ 全部统一 ☐ 只用于部分:________

问 3 Argala 同数时,强弱怎么比?

PVR 原文只说「compare the strengths」。

  1. 比较用哪种强弱?

    ☐ Shadbala ☐ Rasi 强弱(按 Jaimini / Narayana 那套规则) ☐ 其他:____ 书页:____

  2. 特殊三宫(第 3 宫)「两颗以上凶星」形成 Argala 的门槛,是否也要比强弱?

    ☐ 是 ☐ 否 书页:____

问 4 Bhava Bala 的视线力:吉星集合

a4d4a249 里吉星取月亮、木星、金星,水星算中性(复核文档说这是 jyotishganit 的方法选择)。

☐ 固定这样取 ☐ 按条件:月亮盈为吉、亏为凶,水星随同宫星 ☐ 其他:____ 书页:____

问 5 Yoga Pinda:确认以 PVR 为准

  • 我们用 PyJHora 4.8.7 随机对拍 300 盘,Pinda 全部对不上。原因在 PyJHora 的 Ekadhipatya:它只削本行星那一行、把 Lagna 算作占位、同值时把空宫抬到占位宫的值。
  • 处女座的星座权重:PVR 表 28 取 6,Prasna Marga 取 5。

☐ 以 PVR 为准(处女 6,按 PVR 例 43 = 152 校验) ☐ 其他:____


附:我们这边的情况(供参考)

  • 第一部分第 1~3 条,我们的代码和贵方一样存在,会等您定下写法后一起修,避免两边分叉。
  • 上游的 Pinda、Argala、Bhava Bala、KP 四项修正,我们试移植后贵方新测试 21/21 通过。
  • Avastha 我们落后更多:还停在 e628118d 之前,会在问 1 答复后一批跟进。
  • 瑜伽燃烧(c3346847)我们另有处理,不跟进;Raman Saham 和三个研究工具(ac23c2ee、8abbfd91、c74fd96c)不涉及我们的产品。