Calibrate Jyotish benchmarks and downgrade partial modules

This commit is contained in:
732642856
2026-06-04 03:06:43 +08:00
parent 9fd26dbea5
commit 3d2faf3380
15 changed files with 287 additions and 128 deletions
+76 -1
View File
@@ -1,5 +1,80 @@
# 印度占星 Skill 更新日志 # 印度占星 Skill 更新日志
## v6.0.11-shadbala-capability-downgrade2026-06-04)— Shadbala 能力标注降级
> **触发原因**:第九轮 Shadbala benchmark 证明当前实现内部一致,但源码仍包含多处简化公式,尚未完成 JHora/公开书例级别的外部绝对值校准,不应继续标记为完整 `covered`。
### 验证结果
- 新增 benchmark 脚本 `jyotish_benchmark/scripts/run_shadbala_invariants.py`
- 使用 10 个公开/虚构 smoke case 验证 `shadbala` 子命令与 `full-reading.modules.shadbala`
- 第九轮结果:1200/1200 内部不变量通过,0 mismatch。
- 通过项包括:结构完整性、六重力量组件范围、总分聚合、Virupa/Rupa 换算、Ishta Bala 百分比、排名、full-reading 一致性。
### 能力标注调整
- `references/technique-capability-matrix.md` 中 Shadbala`covered``partial`
- `references/technique_registry.json``shadbala.status``covered``partial`,并新增 limitation。
- `SKILL.md``README.md``references/quick-reference-guide.md` 降低措辞:Shadbala 可作为内部一致的相对强弱参考,但外部绝对值校准前必须加置信度上限。
### 当前限制
- `scripts/shadbala.py` 仍包含简化项:Nathonnata Bala 二值化、部分 Saptavargaja 子分盘近似、Chesta Bala 速度分档近似、Drik Bala 简化相位权重。
- 后续若接入 JHora/公开书例完整 Shadbala 表并通过对标,才可恢复 `covered`
---
## v6.0.10-true-transit-full-reading2026-06-03)— full-reading 真实 Transit 链路修复
> **触发原因**:可信度审计发现 `full-reading.modules.transit_multi_reference` 过去复用本命行星位置来做多参考点 Transit 分析,容易把 natal positions 误当 transit positions,影响未来应期判断。
### 修复内容
- `scripts/jyotish_engine.py` 新增 `_calc_sidereal_planets_for_jd()` 与节点口径 helper,统一用 Swiss Ephemeris 计算指定 Julian Day 的真实过境行星位置。
- `full-reading` 新增 `--transit-date YYYY-MM-DD` 参数;若未提供,则跟随 `--today`,再否则使用当前日期。
- `full-reading.modules.transit_positions` 新增真实过境输出:`data_layer: true_transit_positions``target_date``node_mode``planets`
- `full-reading.modules.transit_multi_reference` 改为读取真实 `transit_positions.planets`,并输出 `data_layer: true_transit_positions`,不再静默复用本命行星位置。
- `transit` 子命令补充 `--node-mode mean|true`,与出生盘节点口径冻结保持一致。
### 验证
- 新增 benchmark 脚本 `jyotish_benchmark/scripts/run_transit_true_compare.py`,使用10个公开/虚构 smoke case 对比 full-reading Transit 输出与 Swiss Ephemeris direct。
- 第八轮结果:340/340 字段匹配,0 mismatch;报告 `jyotish_benchmark/outputs/jyotish_benchmark_round8_transit_true_compare.md`
---
## v6.0.9-chara-dasha-capability-downgrade2026-06-03)— Chara Dasha 能力标注降级
> **触发原因**:第七轮 Chara Dasha benchmark 对齐 PyJHora KN Rao method 后,发现当前 `calc_chara_dasha()` 与传统 KN Rao 路径差异巨大,不应继续标记为 `covered` 的强计算模块。
### 修正内容
- `references/technique-capability-matrix.md` 将 Chara Dasha / Jaimini 从 `covered` 降级为 `partial`
- `references/technique_registry.json``jaimini_chara_dasha.status` 改为 `partial`,并新增 benchmark limitation。
- `SKILL.md``references/quick-reference-guide.md` 降低 `jaimini` 子命令措辞:Karaka/Karakamsha 可用,Chara Dasha timing 当前为 partial。
- 第七轮 benchmark 结论冻结:sequence sign 50/12041.67%),duration 8/1206.67%),总体 58/24024.17%)。
### 使用约束
- Chara Karaka、AK/AmK、Karakamsha 仍可用于静态象征层和职业/灵魂方向判断。
- Chara Dasha 时间线不得单独作为高置信度应期依据;必须由 Vimshottari、Dasha Sandhi、Transit、D10/A10、Ashtakavarga 等独立层交叉确认。
- 若未来实装 KN Rao / PVN Rao / Iranganti method 并通过回归,才可恢复 `covered`
---
## v6.0.8-ashtakavarga-pvr-calibration2026-06-03)— Ashtakavarga 贡献表书例校准
> **触发原因**:第六轮 Ashtakavarga benchmark 发现当前 skill 与 PyJHora 的 BAV/SAV 输出存在系统性差异;进一步使用 PyJHora `pvr_tests.py` 中公开 PVR 书例 expected arrays 仲裁后,确认当前 Moon/Venus 的 7 个贡献表项需要校准。
### 修复内容
- `scripts/ashtakavarga.py` 升级到 v2.1,校准 Moon BAV 的 Moon/Mars/Jupiter/Lagna 贡献项,以及 Venus BAV 的 Mars/Mercury/Lagna 贡献项。
- 保持 Ashtakavarga 固定不变量:7行星 SAV=337,含 Lagna full SAV=386。
- `SKILL.md` 新增 Ashtakavarga 口径冻结规则:默认使用 BPHS/PVR 书例校准口径,benchmark 不一致时先比较贡献表项与总量不变量。
- 第六轮公开书例仲裁显示:校准前当前 skill 对 PVR 书例 BAV/SAV 匹配 181/216PyJHora 216/216;校准后应与 PyJHora/PVR 书例对齐。
---
## v6.0.7-node-mode-arbitration2026-06-03)— Rahu/Ketu 节点口径仲裁与参数冻结 ## v6.0.7-node-mode-arbitration2026-06-03)— Rahu/Ketu 节点口径仲裁与参数冻结
> **触发原因**:可信度 benchmark 第四轮确认第三轮 PyJHora 中 Rahu/Ketu 的剩余差异主要来自 Mean Node / True Node 口径差异,而非 D9/D10 计算 bug。 > **触发原因**:可信度 benchmark 第四轮确认第三轮 PyJHora 中 Rahu/Ketu 的剩余差异主要来自 Mean Node / True Node 口径差异,而非 D9/D10 计算 bug。
@@ -1150,7 +1225,7 @@ CHANGELOG中"v3.8.0新增案例库(13个)→编号58-70"的记录基于v3.8.
## v3.4.02026-04-24)— 高级计算引擎 + Hermes集成 + EventPredictionModel ## v3.4.02026-04-24)— 高级计算引擎 + Hermes集成 + EventPredictionModel
- **新增 `scripts/shadbala.py`**Shadbala六重力量计算模块 - **新增 `scripts/shadbala.py`**Shadbala六重力量计算模块
- 完整实现Parashara系统六种BalaSthana(位置)、Dig(方向)、Kala(时间)、Chesta(运动)、Naisargika(天然)、Drik(相位) - v6.0.11复核:当前为内部一致的六力近似实现,含 Sthana(位置)、Dig(方向)、Kala(时间)、Chesta(运动)、Naisargika(天然)、Drik(相位);外部绝对值校准前不再称为完整 Parashara 实现
- 输出每颗行星的六维得分、总Virupas/Rupas、Ishta Bala百分比、强度等级(极强/强/充足/略弱/弱/极弱) - 输出每颗行星的六维得分、总Virupas/Rupas、Ishta Bala百分比、强度等级(极强/强/充足/略弱/弱/极弱)
- 行星力量排名 - 行星力量排名
- 私有验证案例/用户反馈细节已移除(隐私保护)。 - 私有验证案例/用户反馈细节已移除(隐私保护)。
+6 -6
View File
@@ -1,6 +1,6 @@
# 🪐 Jyotish Vedic Astrology Engine # 🪐 Jyotish Vedic Astrology Engine
**印度占星(Jyotish)专业解盘与推运系统 v6.0.0** **印度占星(Jyotish)专业解盘与推运系统 v6.0.11**
基于 Swiss Ephemeris 天文计算库的完整吠陀占星引擎,覆盖从排盘计算到精确推运应期预测的全链路能力。可作为 [WorkBuddy](https://www.codebuddy.cn/) Skill 安装,也可以作为独立 Python CLI 工具使用。 基于 Swiss Ephemeris 天文计算库的完整吠陀占星引擎,覆盖从排盘计算到精确推运应期预测的全链路能力。可作为 [WorkBuddy](https://www.codebuddy.cn/) Skill 安装,也可以作为独立 Python CLI 工具使用。
@@ -10,12 +10,12 @@
- **🔮 全自动综合解盘**`full-reading` 一键串联 13 个计算模块 - **🔮 全自动综合解盘**`full-reading` 一键串联 13 个计算模块
- **📐 BPHS 十六分盘**D2-D60 全部 16 种分盘精确计算 - **📐 BPHS 十六分盘**D2-D60 全部 16 种分盘精确计算
- **👁️ 精确相位系统**:度数级 Drishti 相位分析(tight/moderate/loose - **👁️ 精确相位系统**:度数级 Drishti 相位分析(tight/moderate/loose
- **📿 Jaimini 完整系统**Chara Karaka 7/8 + Chara Dasha + Karakamsha(AK) - **📿 Jaimini 系统**Chara Karaka 7/8 + Karakamsha(AK)Chara Dasha timing 当前为 partial
- **🌟 高级 Nakshatra**Tara Bala + Sub-Lord KP 系统 + Nakshatra三计数体系 - **🌟 高级 Nakshatra**Tara Bala + Sub-Lord KP 系统 + Nakshatra三计数体系
- **🚪 Argala 门闩系统**:行星干预 + Virodha 反干预 - **🚪 Argala 门闩系统**:行星干预 + Virodha 反干预
- **🎂 Tajika 年运盘**Muntha + YearLord + Mudda Dasha + Tri-Pataka三旗 - **🎂 Tajika 年运盘**Muntha + YearLord + Mudda Dasha + Tri-Pataka三旗
- **💑 合盘分析**Ashta Koota 36 分制 + Mangal Dosha + Papasamya - **💑 合盘分析**Ashta Koota 36 分制 + Mangal Dosha + Papasamya
- **💪 Shadbala 六重力量**完整的 Parashara 系统(2026-05-03 Kendra/Ojayugma修正 - **💪 Shadbala 六重力量**内部一致的六力参考(外部绝对值校准前为 partial;2026-06-04 第九轮不变量 1200/1200 通过
- **🎯 Ashtakavarga 八分法**BPHS 完整表(SAV=337 - **🎯 Ashtakavarga 八分法**BPHS 完整表(SAV=337
- **✅ R1-R10 数学验证** + **P1-P12 行星审计管线** - **✅ R1-R10 数学验证** + **P1-P12 行星审计管线**
- **🔒 MEVG 强制外部验证**:v4.2.0 新增,所有解读结论必须外部验证(禁止仅凭AI训练记忆) - **🔒 MEVG 强制外部验证**:v4.2.0 新增,所有解读结论必须外部验证(禁止仅凭AI训练记忆)
@@ -107,7 +107,7 @@ python3 scripts/jyotish_engine.py aspects \
--year 1990 --month 1 --day 1 --hour 12 --minute 0 \ --year 1990 --month 1 --day 1 --hour 12 --minute 0 \
--lat 39.9 --lon 116.4 --tz 8 --lat 39.9 --lon 116.4 --tz 8
# Jaimini 系统(Chara Karaka + Chara Dasha + Karakamsha # Jaimini 系统(Chara Karaka + KarakamshaChara Dasha timing 当前 partial
python3 scripts/jyotish_engine.py jaimini \ python3 scripts/jyotish_engine.py jaimini \
--year 1990 --month 1 --day 1 --hour 12 --minute 0 \ --year 1990 --month 1 --day 1 --hour 12 --minute 0 \
--lat 39.9 --lon 116.4 --tz 8 --mode all --lat 39.9 --lon 116.4 --tz 8 --mode all
@@ -178,12 +178,12 @@ python3 scripts/jyotish_engine.py report ./report_folder \
| `varga` | 分盘计算(D9/D10 | `--year/month/day/hour/minute/lat/lon/tz` | | `varga` | 分盘计算(D9/D10 | `--year/month/day/hour/minute/lat/lon/tz` |
| `varga-full` | BPHS 十六分盘(D2-D60 | `--divisions D9,D60` | | `varga-full` | BPHS 十六分盘(D2-D60 | `--divisions D9,D60` |
| `aspects` | 度数精确相位(Drishti) | 出生信息 | | `aspects` | 度数精确相位(Drishti) | 出生信息 |
| `jaimini` | Jaimini 完整系统 | `--mode all` | | `jaimini` | Jaimini Karaka/KarakamshaChara Dasha timing partial | `--mode all` |
| `nakshatra-adv` | 高级 Nakshatra 分析 | `--mode all` | | `nakshatra-adv` | 高级 Nakshatra 分析 | `--mode all` |
| `argala` | Argala 门闩系统 | 出生信息 | | `argala` | Argala 门闩系统 | 出生信息 |
| `tajika` | Tajika 年运盘 | `--age 33` | | `tajika` | Tajika 年运盘 | `--age 33` |
| `synastry` | 合盘分析 | `--moon1/2 --mars1/2` | | `synastry` | 合盘分析 | `--moon1/2 --mars1/2` |
| `shadbala` | 六重力量计算 | 出生信息 | | `shadbala` | 六重力量计算(内部一致;外部绝对值校准前 partial) | 出生信息 |
| `ashtakavarga` | 八分法(SAV=337 | 出生信息 | | `ashtakavarga` | 八分法(SAV=337 | 出生信息 |
| `validate` | R1-R10 数学验证 | 出生信息 | | `validate` | R1-R10 数学验证 | 出生信息 |
| `audit` | P1-P12 行星审计 | 出生信息 | | `audit` | P1-P12 行星审计 | 出生信息 |
+44 -9
View File
@@ -1,6 +1,6 @@
--- ---
name: jyotish-vedic-astrology name: jyotish-vedic-astrology
version: 6.0.7 version: 6.0.11
description: 印度占星(Jyotish)专业解盘与推运系统。核心能力:PDF星盘输入→严谨解盘→精确推运应期输出。触发词:印度占星、吠陀占星、Jyotish、解盘、推运、星盘分析、Dasha、Transit、Nakshatra、Yoga、出生时间矫正、PDF星盘、读取PDF、分析PDF星盘、现代解读、误判纠错、Varga分盘、综合分析、过境分析、合盘、婚姻匹配、年运盘、Prashna、Argala、Jaimini、KP系统、Shadbala、Ashtakavarga、HTML报告、深度解盘。 description: 印度占星(Jyotish)专业解盘与推运系统。核心能力:PDF星盘输入→严谨解盘→精确推运应期输出。触发词:印度占星、吠陀占星、Jyotish、解盘、推运、星盘分析、Dasha、Transit、Nakshatra、Yoga、出生时间矫正、PDF星盘、读取PDF、分析PDF星盘、现代解读、误判纠错、Varga分盘、综合分析、过境分析、合盘、婚姻匹配、年运盘、Prashna、Argala、Jaimini、KP系统、Shadbala、Ashtakavarga、HTML报告、深度解盘。
--- ---
@@ -10,7 +10,7 @@ description: 印度占星(Jyotish)专业解盘与推运系统。核心能力
> **严格路由**`references/strict-workflow-router.md`(⭐涉及事业/婚恋/财务/应期/技法验证时必须优先读取) > **严格路由**`references/strict-workflow-router.md`(⭐涉及事业/婚恋/财务/应期/技法验证时必须优先读取)
> **覆盖矩阵**`references/technique-capability-matrix.md`(⭐判断技法 covered/partial/missing 时必须参考) > **覆盖矩阵**`references/technique-capability-matrix.md`(⭐判断技法 covered/partial/missing 时必须参考)
> **机器注册表**`references/technique_registry.json` + `scripts/audit_capabilities.py`(⭐用于自动审计与CI门禁) > **机器注册表**`references/technique_registry.json` + `scripts/audit_capabilities.py`(⭐用于自动审计与CI门禁)
> **版本**v6.0.7-node-mode-arbitration | **详细变更**`CHANGELOG.md` > **版本**v6.0.11-shadbala-capability-downgrade | **详细变更**`CHANGELOG.md`
--- ---
@@ -97,6 +97,41 @@ description: 印度占星(Jyotish)专业解盘与推运系统。核心能力
- PyJHora 4.8.6 的 `rasi_chart()` 默认使用 True Node;第三轮 benchmark 的 Rahu/Ketu 差异已由第四轮仲裁确认为 Mean/True Node 口径差异,不应再误判为 D9/D10 计算 bug。 - PyJHora 4.8.6 的 `rasi_chart()` 默认使用 True Node;第三轮 benchmark 的 Rahu/Ketu 差异已由第四轮仲裁确认为 Mean/True Node 口径差异,不应再误判为 D9/D10 计算 bug。
- 输出 `birth_info.node_mode``node_mode_note` 必须保留,作为参数冻结证据。 - 输出 `birth_info.node_mode``node_mode_note` 必须保留,作为参数冻结证据。
### Ashtakavarga 口径冻结(v6.0.8-av-calibration
**Ashtakavarga 默认使用 BPHS/PVR 书例校准口径,必须保留 SAV=337 与 full SAV=386 不变量。**
- `scripts/ashtakavarga.py` 当前为 v2.1:经第六轮 PyJHora/PVR 公开书例仲裁,校准 Moon/Venus 的 7 个贡献表项。
- 输出 `method` 应显示 `Ashtakavarga八分法(BPHS/PVR书例校准v2.1`
- benchmark 若与其他软件不一致,先比较贡献表项和 SAV 总量,不得直接把口径差异判为运行 bug。
### Chara Dasha 能力降级(v6.0.9-chara-dasha
**当前 Chara Dasha 不得作为高置信度应期模块单独使用。**
- 第七轮 benchmark 对齐 PyJHora KN Rao method 后,当前 `calc_chara_dasha()` 仅匹配 58/240 字段(24.17%)。
- 根因:当前实现为简化版(上升顺/逆 + `12 - sign planet count`),不是完整 KN Rao / PVN Rao / Iranganti 传统算法。
- `jaimini` 输出中的 Chara Karaka、AK/AmK、Karakamsha 可继续作为 Jaimini 静态/象征层使用;Chara Dasha 时间线必须标注为 `partial`
- 涉及事业/婚恋/事件应期时,若使用 Chara Dasha,只能作为低权重辅助,并必须由 Vimshottari、Dasha Sandhi、Transit、D10/A10、Ashtakavarga 等独立层交叉确认。
### Transit 真实过境冻结(v6.0.10-true-transit
**full-reading 中的 Transit 多参考点分析必须使用真实过境行星位置,不得复用本命行星位置。**
- `modules.transit_positions` 必须输出 `data_layer: true_transit_positions``target_date``node_mode` 和 Swiss Ephemeris 计算的过境行星位置。
- `modules.transit_multi_reference` 必须读取 `transit_positions.planets`,并输出同样的 `data_layer: true_transit_positions`
- `--transit-date YYYY-MM-DD` 可显式指定过境日期;若未提供,则跟随 `--today`,再否则使用当前日期。
- 第八轮 benchmark 已用 10 个公开/虚构 smoke case 对齐 Swiss Ephemeris340/340 字段匹配,0 mismatch。
### Shadbala 能力降级(v6.0.11-shadbala
**当前 Shadbala 可作为内部一致的相对强弱参考,不得声称已完成外部绝对值校准。**
- 第九轮 benchmark 使用 10 个公开/虚构 smoke case 验证 `shadbala` 子命令与 `full-reading.modules.shadbala`1200/1200 内部不变量通过。
- 通过项包括:结构完整性、六重力量组件范围、总分聚合、Virupa/Rupa 换算、Ishta Bala 百分比、排名、full-reading 一致性。
-`scripts/shadbala.py` 仍存在简化项:Nathonnata Bala 二值化、部分 Saptavargaja 子分盘近似、Chesta Bala 速度分档近似、Drik Bala 简化相位权重。
- 因此 `technique_registry.json` 中 Shadbala 状态为 `partial`:可用于相对强弱排序和内部校验;涉及精确力量断语时必须加置信度上限,直到接入 JHora/公开书例等完整外部绝对值对标。
--- ---
## 核心能力速查 ## 核心能力速查
@@ -143,13 +178,13 @@ $PYTHON $SCRIPT <子命令> [参数]
| `celebrity` | 名人案例查询 | | `celebrity` | 名人案例查询 |
| `db-stats` | 验证数据库统计 | | `db-stats` | 验证数据库统计 |
| `transit` | 行星过境查询 | | `transit` | 行星过境查询 |
| `shadbala` | 六重力量计算 | | `shadbala` | 六重力量计算(内部一致;外部绝对值校准前为 partial) |
| `ashtakavarga` | 八分法计算(SAV=337 | | `ashtakavarga` | 八分法计算(SAV=337 |
| `memory` | Hermes记忆系统 | | `memory` | Hermes记忆系统 |
| `validate` | R1-R10数学验证 | | `validate` | R1-R10数学验证 |
| `audit` | P1-P12行星审计管线 | | `audit` | P1-P12行星审计管线 |
| `aspects` | 度数精确相位系统 | | `aspects` | 度数精确相位系统 |
| `jaimini` | Jaimini完整系统+`--antardasha` | | `jaimini` | Jaimini Karaka/KarakamshaChara Dasha 当前为 partial,需 KN Rao/PVN Rao 回归 |
| `nakshatra-adv` | 高级NakshatraTara Bala+Sub-Lord | | `nakshatra-adv` | 高级NakshatraTara Bala+Sub-Lord |
| `argala` | Argala门闩系统 | | `argala` | Argala门闩系统 |
| `tajika` | Tajika年运盘(Muntha+YearLord+Mudda Dasha | | `tajika` | Tajika年运盘(Muntha+YearLord+Mudda Dasha |
@@ -195,7 +230,7 @@ $PYTHON $SCRIPT <子命令> [参数]
| Transit Actionable | v4.1.0 | 预测必须输出时间段+行动+置信度 | `transit-actionable-output-guide.md` | | Transit Actionable | v4.1.0 | 预测必须输出时间段+行动+置信度 | `transit-actionable-output-guide.md` |
| 过境多参考点 | v1.9.0 | Lagna+Chandra Lagna双参考点(强制) | `transit-multi-reference-guide.md` | | 过境多参考点 | v1.9.0 | Lagna+Chandra Lagna双参考点(强制) | `transit-multi-reference-guide.md` |
| Ketu双属性 | v2.0.0 | 必须同时评估"放手"和"突破" | `ketu-dual-nature-guide.md` | | Ketu双属性 | v2.0.0 | 必须同时评估"放手"和"突破" | `ketu-dual-nature-guide.md` |
| Shadbala完整 | v2.0.0 | 六种力量全部评估 | `shadbala-complete-methodology.md` | | Shadbala评估 | v6.0.11 | 六种力量内部一致评估;外部绝对值校准前为 partial | `shadbala-complete-methodology.md` |
| Yoga Phala Timing | v2.1.0 | 识别Yoga后必须预测何时发生 | `yoga-phala-timing-guide.md` | | Yoga Phala Timing | v2.1.0 | 识别Yoga后必须预测何时发生 | `yoga-phala-timing-guide.md` |
| 逆行/燃烧/战争 | v2.1.0 | 每颗行星检查三重叠加 | `retrograde-combustion-war-guide.md` | | 逆行/燃烧/战争 | v2.1.0 | 每颗行星检查三重叠加 | `retrograde-combustion-war-guide.md` |
| 精准方法论 | v3.12.1 | PACDARES+九层+L3矛盾检查 | `precision-reading-methodology.md` | | 精准方法论 | v3.12.1 | PACDARES+九层+L3矛盾检查 | `precision-reading-methodology.md` |
@@ -210,13 +245,13 @@ $PYTHON $SCRIPT <子命令> [参数]
- [ ] 静态星盘分析(行星配置、Yoga、Nakshatra、宫位) - [ ] 静态星盘分析(行星配置、Yoga、Nakshatra、宫位)
- [ ] Argala检查(2/4/5/8/11宫干预+Virodha - [ ] Argala检查(2/4/5/8/11宫干预+Virodha
- [ ] 逆行/燃烧/行星战争检查(三重叠加) - [ ] 逆行/燃烧/行星战争检查(三重叠加)
- [ ] Shadbala评估(六种力量完整评估 - [ ] Shadbala评估(六种力量内部一致评估;外部绝对值校准前 partial
- [ ] Ashtakavarga评估(BAV+SAV聚合校验337点) - [ ] Ashtakavarga评估(BAV+SAV聚合校验337点)
- [ ] Ketu双重属性检查 - [ ] Ketu双重属性检查
- [ ] **MEVG-动态门控**Transit/Dasha/天文现象必须验证 - [ ] **MEVG-动态门控**Transit/Dasha/天文现象必须验证
- [ ] Dasha推运(大运+小运+Pratyantar - [ ] Dasha推运(大运+小运+Pratyantar
- [ ] Dasa Convergence三系统交叉验证 - [ ] Dasa Convergence三系统交叉验证
- [ ] Jaimini分析(Karaka+Chara Dasha - [ ] Jaimini分析(Karaka/KarakamshaChara Dasha 当前 partial,须交叉确认
- [ ] KP系统分析(Significator+Sub-Lord - [ ] KP系统分析(Significator+Sub-Lord
- [ ] Transit分析(多参考点强制) - [ ] Transit分析(多参考点强制)
- [ ] **Transit Actionable Output**(时间段+行动+置信度+案例检索) - [ ] **Transit Actionable Output**(时间段+行动+置信度+案例检索)
@@ -264,9 +299,9 @@ $PYTHON $SCRIPT <子命令> [参数]
--- ---
**版本**v6.0.7-node-mode-arbitration **版本**v6.0.11-shadbala-capability-downgrade
**创建日期**2026-04-20 **创建日期**2026-04-20
**最后更新**2026-06-03v6.0.7 新增 Rahu/Ketu Mean/True Node 口径冻结与 `--node-mode` 参数 **最后更新**2026-06-04v6.0.11 将 Shadbala 降级为 partial:内部一致通过,外部绝对值校准待完成
--- ---
+7 -6
View File
@@ -217,10 +217,11 @@
| [相关Karaka] | [行星] | [星座][X宫] | [直接/间接/无关] | [庙/陷/受克] | | [相关Karaka] | [行星] | [星座][X宫] | [直接/间接/无关] | [庙/陷/受克] |
| AK(灵魂课题) | [行星] | [星座][X宫] | [影响评估] | [状态] | | AK(灵魂课题) | [行星] | [星座][X宫] | [影响评估] | [状态] |
**Chara Dasha**(如有): **Chara Dasha**(如有;当前计算层为 partial):
- 当前Chara Dasha[星座][日期范围] - 当前Chara Dasha[星座][日期范围]
- 该星座统治的宫位:[列出] - 该星座统治的宫位:[列出]
- 与预测事件相关度:[高/中/低] - 与预测事件相关度:[高/中/低]
- 置信度限制:仅作低权重辅助,必须由 Vimshottari / Transit / D10-A10 / Ashtakavarga 等独立层确认
#### 4.2 KP层 #### 4.2 KP层
@@ -237,15 +238,15 @@
| 系统 | 判断 | 方向 | 置信度 | | 系统 | 判断 | 方向 | 置信度 |
|------|------|------|--------| |------|------|------|--------|
| **Parashara**D1+Dasha+Transit | [描述] | [正面/负面] | [高/中] | | **Parashara**D1+Dasha+Transit | [描述] | [正面/负面] | [高/中] |
| **Jaimini**Karaka+Chara Dasha | [描述] | [正面/负面] | [高/中] | | **Jaimini**Karaka/KarakamshaChara Dasha partial | [描述] | [正面/负面] | [高/中;若依赖Chara Dasha则不得单独升高] |
| **KP**Sub-Lord+Significator | [描述] | [正面/负面] | [高/中] | | **KP**Sub-Lord+Significator | [描述] | [正面/负面] | [高/中] |
| **三系统一致?** | [是/两系统一致/矛盾] | | | | **三系统一致?** | [是/两系统一致/矛盾] | | |
**一致性规则** **一致性规则**
- 三系统一致 → 置信度 **90%+** - 三系统一致 → 原则上可给高置信度,但如果 Jaimini 一致性主要来自 Chara Dasha,必须降权并等待其他独立层确认
- 两系统一致 → 置信度 **70-89%** - 两系统一致 → 中高置信度,需说明缺失或 partial 层
- 一系统独判 → 置信度 **50-69%** - 一系统独判 → 低到中等置信度,不支持精确日期断言
- 三系统矛盾 → 置信度 **<50%**,需深入分析矛盾原因 - 三系统矛盾 → 置信度,需深入分析矛盾原因
--- ---
+1 -1
View File
@@ -3,7 +3,7 @@
**创建日期**2026-04-22 **创建日期**2026-04-22
**来源**Bavishyavani.in、Vedicmarga.com **来源**Bavishyavani.in、Vedicmarga.com
> **来源标签**: 【传统·现代大师】 — Jaimini完整系统(Chara Karaka+Chara Dasha+Karakamsha > **来源标签**: 【传统·现代大师】 — Jaimini知识层完整;当前计算层 Karaka/Karakamsha 可用,Chara Dasha timing 为 partial,需 KN Rao/PVN Rao/Iranganti 回归验证。
--- ---
## 一、Jaimini vs Parashari 核心区别 ## 一、Jaimini vs Parashari 核心区别
+3 -3
View File
@@ -359,7 +359,7 @@ SCRIPT=~/.workbuddy/skills/jyotish-vedic-astrology/scripts/jyotish_engine.py
| 子命令 | 功能 | 典型用法 | | 子命令 | 功能 | 典型用法 |
|--------|------|---------| |--------|------|---------|
| `aspects` | 度数精确相位系统(tight/moderate/loose + 入相位/出相位) | `aspects --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` | | `aspects` | 度数精确相位系统(tight/moderate/loose + 入相位/出相位) | `aspects --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` |
| `jaimini` | Jaimini完整系统(Chara Karaka 7/8 + Chara Dasha + Karakamsha+ `--antardasha` | `jaimini --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8 --mode all --antardasha` | | `jaimini` | Jaimini Karaka/KarakamshaChara Dasha timing 当前为 partial,需 KN Rao/PVN Rao 回归验证 | `jaimini --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8 --mode all --antardasha` |
| `nakshatra-adv` | 高级NakshatraTara Bala + Sub-Lord KP + 兼容性) | `nakshatra-adv --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8 --mode all` | | `nakshatra-adv` | 高级NakshatraTara Bala + Sub-Lord KP + 兼容性) | `nakshatra-adv --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8 --mode all` |
| `argala` | Argala门闩系统(主/副Argala + Virodha反干预 + 净评分) | `argala --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` | | `argala` | Argala门闩系统(主/副Argala + Virodha反干预 + 净评分) | `argala --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` |
| `tajika` | Tajika年运盘(Muntha + YearLord + Mudda Dasha + Tri-Pataka | `tajika --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8 --age 33` | | `tajika` | Tajika年运盘(Muntha + YearLord + Mudda Dasha + Tri-Pataka | `tajika --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8 --age 33` |
@@ -369,7 +369,7 @@ SCRIPT=~/.workbuddy/skills/jyotish-vedic-astrology/scripts/jyotish_engine.py
| 子命令 | 功能 | 典型用法 | | 子命令 | 功能 | 典型用法 |
|--------|------|---------| |--------|------|---------|
| `shadbala` | 六重力量计算(Sthana/Dig/Kala/Chesta/Naisargika/Drik Bala | `shadbala --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` | | `shadbala` | 六重力量计算(内部一致;外部绝对值校准前为 partial | `shadbala --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` |
| `ashtakavarga` | 八分法计算(BPHS完整8×8矩阵,SAV=337 | `ashtakavarga --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` | | `ashtakavarga` | 八分法计算(BPHS完整8×8矩阵,SAV=337 | `ashtakavarga --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` |
| `validate` | R1-R10数学验证(SAV/BAV/延伸角/Rahu-Ketu/逆行/Dasha/完整性/度数/宫位) | `validate --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` | | `validate` | R1-R10数学验证(SAV/BAV/延伸角/Rahu-Ketu/逆行/Dasha/完整性/度数/宫位) | `validate --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` |
| `audit` | P1-P12行星审计管线(Identity/Health/Resource/SAV/Dignity/Shadbala/Aspects/Nakshatra/Yogas | `audit --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` | | `audit` | P1-P12行星审计管线(Identity/Health/Resource/SAV/Dignity/Shadbala/Aspects/Nakshatra/Yogas | `audit --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` |
@@ -444,7 +444,7 @@ SCRIPT=~/.workbuddy/skills/jyotish-vedic-astrology/scripts/jyotish_engine.py
### 分盘与力量评估(7个) ### 分盘与力量评估(7个)
30. **ashtakavarga-complete-system.md**Ashtakavarga完整体系(SAV=337 30. **ashtakavarga-complete-system.md**Ashtakavarga完整体系(SAV=337
31. **shadbala-complete-methodology.md**Shadbala完整计算方法论 31. **shadbala-complete-methodology.md**Shadbala计算方法论(当前计算层 partial,内部一致但外部绝对值校准待完成)
32. **planetary-strength-quick-ref.md**:行星力量速查表 32. **planetary-strength-quick-ref.md**:行星力量速查表
33. **varga-system-quick-reference.md**:综合九层分盘体系对照手册 33. **varga-system-quick-reference.md**:综合九层分盘体系对照手册
34. **varga-divisional-charts-quick-reference.md**:分盘快速参考 34. **varga-divisional-charts-quick-reference.md**:分盘快速参考
+6 -4
View File
@@ -1,15 +1,17 @@
# Shadbala完整计算方法论 # Shadbala计算方法论
**创建日期**2026-04-23 **创建日期**2026-04-23
**版本**v2.0.0 **版本**v2.1.0-capability-partial
**优先级**:⭐⭐⭐⭐⭐ 行星力量量化基础 **优先级**:⭐⭐⭐⭐⭐ 行星力量量化基础
> **来源标签**: 【混合·古典+传统+现代】 — Shadbala六重力量完整体系(BPHS计算+现代解读) > **来源标签**: 【混合·古典+传统+现代】 — Shadbala六重力量知识体系;当前 `scripts/shadbala.py` 为内部一致的近似计算层,外部绝对值校准前状态为 `partial`。
--- ---
## 一、Shadbala概述 ## 一、Shadbala概述
**Shad** = 六,**Bala** = 力量。Shadbala是Parashara系统中量化行星力量的完整方法,由六种力量组成。 **Shad** = 六,**Bala** = 力量。Shadbala是Parashara系统中量化行星力量的方法,由六种力量组成。
> **v6.0.11 工程状态提醒**:第九轮内部不变量 benchmark 已通过 1200/1200,证明当前输出结构、总分聚合、Rupa/Virupa 换算、排名和 full-reading 一致性可靠;但源码仍有 Nathonnata、Saptavargaja、Chesta、Drik 等简化项。因此当前分数只能作为内部一致的相对强弱参考,不得声称已经完成 JHora/公开书例级别的传统绝对值校准。
### 综合评分体系 ### 综合评分体系
+3 -3
View File
@@ -120,7 +120,7 @@ Use when the user asks for concrete timing, yes/no, project approval, launch, mo
1. Define the event house and event significators. 1. Define the event house and event significators.
2. Check natal promise in D1 and relevant Varga. 2. Check natal promise in D1 and relevant Varga.
3. Check Vimshottari MD/AD/PD. 3. Check Vimshottari MD/AD/PD.
4. Cross-check Chara Dasha if event is major. 4. Cross-check Jaimini static indicators if event is major; Chara Dasha timing is partial and must be treated as low-weight corroboration only.
5. Check Saturn/Jupiter/Rahu-Ketu transit to event houses/lords. 5. Check Saturn/Jupiter/Rahu-Ketu transit to event houses/lords.
6. Check Double Transit where applicable. 6. Check Double Transit where applicable.
7. Use KP/Sub-lord if the question is binary or landing-specific. 7. Use KP/Sub-lord if the question is binary or landing-specific.
@@ -163,10 +163,10 @@ Every Level 2+ output must include this table near the end.
| D9 | Used / not used | ... | ... | | D9 | Used / not used | ... | ... |
| D10 / relevant Varga | Used / not used | ... | ... | | D10 / relevant Varga | Used / not used | ... | ... |
| Vimshottari | Used / not used | ... | ... | | Vimshottari | Used / not used | ... | ... |
| Jaimini / Chara Dasha | Used / not used | ... | ... | | Jaimini / Chara Dasha | Used / partial / not used | Karaka/Karakamsha reliable; Chara Dasha timing partial if used | Cap timing confidence unless independently corroborated |
| AmK / Karakamsha | Used / not used | ... | ... | | AmK / Karakamsha | Used / not used | ... | ... |
| AL / A10 | Used / partial / unavailable | ... | ... | | AL / A10 | Used / partial / unavailable | ... | ... |
| Shadbala | Used / not used | ... | ... | | Shadbala | Used / partial / not used | Internally consistent relative strength; external absolute calibration pending | Cap precise strength claims |
| Ashtakavarga | Used / not used | ... | ... | | Ashtakavarga | Used / not used | ... | ... |
| Argala | Used / not used | ... | ... | | Argala | Used / not used | ... | ... |
| KP / Sub-lord | Used / not required / unavailable | ... | ... | | KP / Sub-lord | Used / not required / unavailable | ... | ... |
+8 -6
View File
@@ -1,4 +1,4 @@
# Technique Capability Matrix — Jyotish Skill v6.0.2 # Technique Capability Matrix — Jyotish Skill v6.0.11
> Purpose: prevent vague statements like “covered” or “missing”. Each technique is classified by four layers: knowledge, computation, orchestration, and output. > Purpose: prevent vague statements like “covered” or “missing”. Each technique is classified by four layers: knowledge, computation, orchestration, and output.
@@ -21,10 +21,10 @@
| D9 / Navamsa | Yes | Yes | Yes | Yes | `covered` | `varga-full`, D9 expanded dignity. | | D9 / Navamsa | Yes | Yes | Yes | Yes | `covered` | `varga-full`, D9 expanded dignity. |
| D10 / Dasamsa | Yes | Yes | Yes | Yes | `covered` | `varga-full`, strict career route requires it. | | D10 / Dasamsa | Yes | Yes | Yes | Yes | `covered` | `varga-full`, strict career route requires it. |
| Vimshottari Dasha | Yes | Yes | Yes | Yes | `covered` | `dasha` and `full-reading`. | | Vimshottari Dasha | Yes | Yes | Yes | Yes | `covered` | `dasha` and `full-reading`. |
| Chara Dasha / Jaimini | Yes | Yes | Yes | Yes | `covered` | `jaimini` module with antardasha. | | Chara Dasha / Jaimini | Yes | Partial | Yes | Partial | `partial` | Chara Karaka/Karakamsha are usable, but Chara Dasha timing is a simplified implementation. Round 7 benchmark vs PyJHora KN Rao method matched only 58/240 fields (24.17%); do not use as high-confidence timing until KN Rao/PVN Rao/Iranganti method is implemented and revalidated. |
| Karakamsha / AK | Yes | Yes | Yes | Yes | `covered` | `full-reading` uses AK, not DK. | | Karakamsha / AK | Yes | Yes | Yes | Yes | `covered` | `full-reading` uses AK, not DK. |
| Argala | Yes | Yes | Yes | Yes | `covered` | `argala` module and strict routes. | | Argala | Yes | Yes | Yes | Yes | `covered` | `argala` module and strict routes. |
| Shadbala | Yes | Yes | Yes | Yes | `covered` | `shadbala` module and `full-reading`. | | Shadbala | Yes | Partial | Yes | Yes | `partial` | Internal invariants passed 1200/1200 in Round 9, and `shadbala` matches `full-reading`; however current implementation still contains simplified Nathonnata Bala, Saptavargaja approximations, Chesta speed buckets and simplified Drik weights. Use as internally consistent strength reference, not externally calibrated Parashara absolute Shadbala. |
| Ashtakavarga | Yes | Yes | Yes | Yes | `covered` | `ashtakavarga` module and validation. | | Ashtakavarga | Yes | Yes | Yes | Yes | `covered` | `ashtakavarga` module and validation. |
| Avastha | Yes | Yes | Yes | Yes | `covered` | `scripts/avastha_calculator.py` integrated in `full-reading`. | | Avastha | Yes | Yes | Yes | Yes | `covered` | `scripts/avastha_calculator.py` integrated in `full-reading`. |
| Vargottama | Yes | Yes | Yes | Yes | `covered` | App existed before; v6.0.2 adds `full-reading.modules.vargottama`. | | Vargottama | Yes | Yes | Yes | Yes | `covered` | App existed before; v6.0.2 adds `full-reading.modules.vargottama`. |
@@ -44,6 +44,8 @@
When producing a Technique Audit Table: When producing a Technique Audit Table:
1. Do not mark a technique as missing if any layer exists. 1. Do not mark a technique as missing if any layer exists.
2. Use `partial` for Bhava Chalit and Sudarshana until full traditional modules are added. 2. Use `partial` for Chara Dasha/Jaimini timing, Shadbala, Bhava Chalit, and Sudarshana until full traditional modules are added or externally benchmark-validated.
3. Use `covered` for A10, Vargottama, Pushkara, Avastha, and Dasha Sandhi from v6.0.2 onward, but still state whether the current run actually called `full-reading`. 3. For Jaimini output, separate reliable Karaka/Karakamsha indicators from partial Chara Dasha timing; cap timing confidence if Chara Dasha is used.
4. If a user provides only PDF text without exact degrees, Pushkara/Vargottama/A10 may degrade to `manual` or `unavailable` because the data layer is insufficient. 4. For Shadbala output, state that current scores are internally consistent but not yet externally calibrated to a full Parashara/JHora-style absolute Shadbala table.
5. Use `covered` for A10, Vargottama, Pushkara, Avastha, and Dasha Sandhi from v6.0.2 onward, but still state whether the current run actually called `full-reading`.
6. If a user provides only PDF text without exact degrees, Pushkara/Vargottama/A10 may degrade to `manual` or `unavailable` because the data layer is insufficient.
+7 -5
View File
@@ -1,5 +1,5 @@
{ {
"version": "v6.0.3-engineering-foundation", "version": "v6.0.11-shadbala-capability-downgrade",
"source_inspiration": [ "source_inspiration": [
{ {
"name": "jyotishyamitra", "name": "jyotishyamitra",
@@ -72,12 +72,13 @@
"jaimini_chara_dasha": { "jaimini_chara_dasha": {
"name": "Jaimini / Chara Dasha", "name": "Jaimini / Chara Dasha",
"domains": ["timing", "career", "relationship"], "domains": ["timing", "career", "relationship"],
"status": "covered", "status": "partial",
"knowledge_refs": ["references/jaimini-complete-system.md"], "knowledge_refs": ["references/jaimini-complete-system.md"],
"commands": ["jaimini", "full-reading"], "commands": ["jaimini", "full-reading"],
"output_paths": ["modules.jaimini"], "output_paths": ["modules.jaimini"],
"audit_label": "Jaimini/Chara", "audit_label": "Jaimini/Chara",
"missing_impact": "Rashi-based timing confirmation missing." "missing_impact": "Rashi-based timing confirmation is partial; timing confidence must be capped unless corroborated by Vimshottari, Dasha Sandhi, transit, D10/A10 and Ashtakavarga.",
"limitation": "Round 7 benchmark vs PyJHora KN Rao Chara Dasha matched 58/240 fields (24.17%). Current calc_chara_dasha() is a simplified implementation, not a full KN Rao/PVN Rao/Iranganti method. Karaka/Karakamsha remain usable; Chara Dasha timing is partial."
}, },
"karakamsha_ak_amk": { "karakamsha_ak_amk": {
"name": "Karakamsha / AK / AmK", "name": "Karakamsha / AK / AmK",
@@ -112,12 +113,13 @@
"shadbala": { "shadbala": {
"name": "Shadbala", "name": "Shadbala",
"domains": ["strength", "static"], "domains": ["strength", "static"],
"status": "covered", "status": "partial",
"knowledge_refs": ["references/shadbala-complete-methodology.md"], "knowledge_refs": ["references/shadbala-complete-methodology.md"],
"commands": ["shadbala", "full-reading"], "commands": ["shadbala", "full-reading"],
"output_paths": ["modules.shadbala"], "output_paths": ["modules.shadbala"],
"audit_label": "Shadbala", "audit_label": "Shadbala",
"missing_impact": "Planetary strength claims are not quantitatively anchored." "missing_impact": "Planetary strength claims are quantitatively anchored only as an internally consistent reference, not as externally calibrated absolute Parashara Shadbala.",
"limitation": "Round 9 internal invariant benchmark passed 1200/1200 checks and full-reading matches the shadbala command. However scripts/shadbala.py still uses simplified Nathonnata Bala, approximate Saptavargaja sub-vargas, Chesta speed buckets and simplified Drik aspect weights. Use for relative strength ranking with confidence cap until an external full Shadbala table benchmark is frozen."
}, },
"ashtakavarga": { "ashtakavarga": {
"name": "Ashtakavarga", "name": "Ashtakavarga",
+18 -18
View File
@@ -1,8 +1,8 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
Ashtakavarga 计算模块 v2.0(八分法) Ashtakavarga 计算模块 v2.1(八分法)
基于 Brihat Parashara Hora Shastra (BPHS) 完整标准表 基于 Brihat Parashara Hora Shastra (BPHS) 完整标准表,并经 PVR/PyJHora 书例校准
核心修正(v2.0 vs v1.0): 核心修正(v2.0 vs v1.0):
- v1.0: BAV_BASE 只有自贡献 + 少量跨源贡献 → SAV=94 ❌ - v1.0: BAV_BASE 只有自贡献 + 少量跨源贡献 → SAV=94 ❌
@@ -14,9 +14,9 @@ Ashtakavarga 计算模块 v2.0(八分法)
- SAV = 7 颗行星 BAV 之和(Lagna 自身 BAV 单独展示,不计入 SAV) - SAV = 7 颗行星 BAV 之和(Lagna 自身 BAV 单独展示,不计入 SAV)
- SAV 总和 = 337(宇宙常数) - SAV 总和 = 337(宇宙常数)
BPHS 校正 PVR/PyJHora 书例校准(v2.1
- 月亮 BAV → 木星贡献:1,4,7,8,10,116宫,不含12)→ 总49 - 第六轮 benchmark 使用 PyJHora `pvr_tests.py` 中公开书例仲裁,修正 Moon/Venus 7 个贡献表项。
- BAV → 水星贡献:3,5,6,9,11,126宫,含12)→ 总52 - 固定不变量保持:7行SAV=337,含 Lagna full SAV=386。
""" """
from typing import Dict, List, Tuple from typing import Dict, List, Tuple
@@ -44,17 +44,17 @@ _SUN_BAV = {
} }
# --- 月亮 BAV(总49 --- # --- 月亮 BAV(总49 ---
# 来源: Sun(6) + Moon(6) + Mars(7) + Mercury(8) + Jupiter(6) + Venus(7) + Saturn(4) + Lagna(5) = 49 # 来源: Sun(6) + Moon(7) + Mars(6) + Mercury(8) + Jupiter(7) + Venus(7) + Saturn(4) + Lagna(4) = 49
# BPHS校正:木星贡献为 1,4,7,8,10,116宫),非 1,4,7,8,10,11,127宫) # v2.1: PVR/PyJHora 书例校准 Moon/Mars/Jupiter/Lagna 贡献项。
_MOON_BAV = { _MOON_BAV = {
'Sun': [3, 6, 7, 8, 10, 11], 'Sun': [3, 6, 7, 8, 10, 11],
'Moon': [1, 3, 6, 7, 10, 11], 'Moon': [1, 3, 6, 7, 9, 10, 11],
'Mars': [2, 3, 5, 6, 9, 10, 11], 'Mars': [2, 3, 5, 6, 10, 11],
'Mercury': [1, 3, 4, 5, 7, 8, 10, 11], 'Mercury': [1, 3, 4, 5, 7, 8, 10, 11],
'Jupiter': [1, 4, 7, 8, 10, 11], # BPHS校正:不含12 'Jupiter': [1, 2, 4, 7, 8, 10, 11],
'Venus': [3, 4, 5, 7, 9, 10, 11], 'Venus': [3, 4, 5, 7, 9, 10, 11],
'Saturn': [3, 5, 6, 11], 'Saturn': [3, 5, 6, 11],
'Lagna': [3, 6, 10, 11, 12], 'Lagna': [3, 6, 10, 11],
} }
# --- 火星 BAV(总39 --- # --- 火星 BAV(总39 ---
@@ -97,17 +97,17 @@ _JUPITER_BAV = {
} }
# --- 金星 BAV(总52 --- # --- 金星 BAV(总52 ---
# 来源: Sun(3) + Moon(9) + Mars(6) + Mercury(6) + Jupiter(5) + Venus(9) + Saturn(7) + Lagna(7) = 52 # 来源: Sun(3) + Moon(9) + Mars(6) + Mercury(5) + Jupiter(5) + Venus(9) + Saturn(7) + Lagna(8) = 52
# BPHS校正:水星贡献为 3,5,6,9,11,126宫,含12),非 3,5,6,9,115宫) # v2.1: PVR/PyJHora 书例校准 Mars/Mercury/Lagna 贡献项。
_VENUS_BAV = { _VENUS_BAV = {
'Sun': [8, 11, 12], 'Sun': [8, 11, 12],
'Moon': [1, 2, 3, 4, 5, 8, 9, 11, 12], 'Moon': [1, 2, 3, 4, 5, 8, 9, 11, 12],
'Mars': [3, 5, 6, 9, 11, 12], 'Mars': [3, 4, 6, 9, 11, 12],
'Mercury': [3, 5, 6, 9, 11, 12], # BPHS校正:含12 'Mercury': [3, 5, 6, 9, 11],
'Jupiter': [5, 8, 9, 10, 11], 'Jupiter': [5, 8, 9, 10, 11],
'Venus': [1, 2, 3, 4, 5, 8, 9, 10, 11], 'Venus': [1, 2, 3, 4, 5, 8, 9, 10, 11],
'Saturn': [3, 4, 5, 8, 9, 10, 11], 'Saturn': [3, 4, 5, 8, 9, 10, 11],
'Lagna': [1, 2, 3, 4, 5, 8, 9], 'Lagna': [1, 2, 3, 4, 5, 8, 9, 11],
} }
# --- 土星 BAV(总39 --- # --- 土星 BAV(总39 ---
@@ -295,8 +295,8 @@ def calc_ashtakavarga(planets: Dict, asc_sign_idx: int) -> Dict:
}) })
return { return {
'method': 'Ashtakavarga八分法(BPHS准v2.0', 'method': 'Ashtakavarga八分法(BPHS/PVR书例校准v2.1',
'version': '2.0', 'version': '2.1',
'bav': bav_results, 'bav': bav_results,
'sav': { 'sav': {
'scores': {SIGNS[i]: sav[i] for i in range(12)}, 'scores': {SIGNS[i]: sav[i] for i in range(12)},
+6 -6
View File
@@ -1,13 +1,13 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
Jaimini占星体系模块 v1.0 Jaimini占星体系模块 v1.1
Parashara传承中的Jaimini子系统 Parashara传承中的Jaimini子系统
支持: 支持:
- Chara Karaka: 7/8个功能指示星(按度数排序) - Chara Karaka: 7/8个功能指示星(按度数排序)
- Chara Dasha: 基于星座的大运系统
- Karakamsha: AK在Navamsa中的上升(灵魂方向) - Karakamsha: AK在Navamsa中的上升(灵魂方向)
- Chara Dasha: 当前为简化 timing 实现,v6.0.9 后标注为 partial,不得单独作为高置信度应期依据
- Jaimini Sutras关键规则 - Jaimini Sutras关键规则
""" """
from typing import Dict, List, Tuple, Optional from typing import Dict, List, Tuple, Optional
@@ -135,14 +135,14 @@ def calc_chara_dasha(asc_sign_idx: int,
planet_longitudes: Dict[str, float], planet_longitudes: Dict[str, float],
birth_year: int, birth_month: int) -> Dict: birth_year: int, birth_month: int) -> Dict:
""" """
Chara Dasha计算(基于星座的大运系统 Chara Dasha计算(简化实现;v6.0.9 后能力状态为 partial
规则: 规则:
- 从上升星座开始 - 从上升星座开始
- 奇数星座(Aries, Gemini...):正向顺序 - 奇数星座(Aries, Gemini...):正向顺序
- 偶数星座(Taurus, Cancer...):反向顺序 - 偶数星座(Taurus, Cancer...):反向顺序
- 每个大运长度 = 12 - 该星座内的行星数量(用特定规则) - 每个大运长度 = 12 - 该星座内的行星数量(用特定规则)
- 标准版:每个大运固定1-12年 - 注意:该实现不是 KN Rao / PVN Rao / Iranganti 完整传统算法;只能作低权重辅助
""" """
# 确定顺序方向 # 确定顺序方向
is_odd = asc_sign_idx % 2 == 0 is_odd = asc_sign_idx % 2 == 0
@@ -152,7 +152,7 @@ def calc_chara_dasha(asc_sign_idx: int,
dasha_sequence = [] dasha_sequence = []
current = asc_sign_idx current = asc_sign_idx
# 标准Chara Dasha: 每个星座1年,按正/反向排列 # 简化 Chara Dasha: 按上升星座顺/逆排列;不等同于 KN Rao/PVN Rao/Iranganti 完整传统算法
for i in range(12): for i in range(12):
sign_idx = (current + direction * i) % 12 sign_idx = (current + direction * i) % 12
sign_name = SIGNS[sign_idx] sign_name = SIGNS[sign_idx]
@@ -203,7 +203,7 @@ def calc_chara_dasha_with_antardasha(asc_sign_idx: int,
planet_longitudes: Dict[str, float], planet_longitudes: Dict[str, float],
birth_year: int, birth_month: int) -> Dict: birth_year: int, birth_month: int) -> Dict:
""" """
Chara Dasha 计算含 Antardasha 子周期 Chara Dasha 计算含 Antardasha 子周期(简化 timing 实现,能力状态 partial
Antardasha 规则: Antardasha 规则:
- 在每个 Mahadasha 内,Antardasha 从 Mahadasha 星座开始 - 在每个 Mahadasha 内,Antardasha 从 Mahadasha 星座开始
+97 -55
View File
@@ -12,7 +12,7 @@
varga 分盘计算(D9/D10 varga 分盘计算(D9/D10
varga-full BPHS十六分盘完整计算(D2-D60)(v3.7新增) varga-full BPHS十六分盘完整计算(D2-D60)(v3.7新增)
aspects 度数精确相位系统(v3.7新增) aspects 度数精确相位系统(v3.7新增)
jaimini Jaimini系统(Chara Karaka/Chara Dasha/Karakamsha)(v3.7新增) jaimini Jaimini系统(Chara Karaka/KarakamshaChara Dasha timing partial)(v3.7新增)
nakshatra-adv 高级Nakshatra分析(Tara Bala/Sub-Lord/兼容性)(v3.7新增) nakshatra-adv 高级Nakshatra分析(Tara Bala/Sub-Lord/兼容性)(v3.7新增)
argala Argala门闩系统(v3.7新增) argala Argala门闩系统(v3.7新增)
tajika Tajika/Varshaphala年运盘(v3.7新增) tajika Tajika/Varshaphala年运盘(v3.7新增)
@@ -21,7 +21,7 @@
celebrity 名人案例查询(15,807条数据+SQLite验证库) celebrity 名人案例查询(15,807条数据+SQLite验证库)
db-stats 验证数据库统计 db-stats 验证数据库统计
transit 行星过境查询 transit 行星过境查询
shadbala 六重力量计算(v3.4新增) shadbala 六重力量计算(内部一致;外部绝对值校准前partial)(v3.4新增)
ashtakavarga 八分法计算(v3.5升级BPHS完整表,SAV=337 ashtakavarga 八分法计算(v3.5升级BPHS完整表,SAV=337
memory Hermes记忆系统(v3.4新增) memory Hermes记忆系统(v3.4新增)
validate R1-R10数学验证(v3.5新增,含R2b BAV列→SAV校验) validate R1-R10数学验证(v3.5新增,含R2b BAV列→SAV校验)
@@ -246,6 +246,60 @@ BASE_PLANETS_SWE = {'Sun': swe.SUN, 'Moon': swe.MOON, 'Mars': swe.MARS, 'Mercury
PLANETS_SWE = {**BASE_PLANETS_SWE, 'Rahu': swe.MEAN_NODE} if HAS_SWE else {} PLANETS_SWE = {**BASE_PLANETS_SWE, 'Rahu': swe.MEAN_NODE} if HAS_SWE else {}
def _node_pid(node_mode='mean'):
"""返回 Rahu/Ketu 节点计算口径对应的 Swiss Ephemeris id。"""
if not HAS_SWE:
return None
return swe.TRUE_NODE if (node_mode or 'mean').lower() == 'true' else swe.MEAN_NODE
def _planet_map_for_node_mode(node_mode='mean'):
"""返回七曜+Rahu 的行星映射,Rahu 口径由 node_mode 决定。"""
if not HAS_SWE:
return {}
return {**BASE_PLANETS_SWE, 'Rahu': _node_pid(node_mode)}
def _calc_sidereal_planets_for_jd(jd, node_mode='mean', include_ketu=True):
"""使用 Swiss Ephemeris 计算指定 Julian Day 的恒星黄道行星位置。"""
if not HAS_SWE:
return {}, None
ayanamsa = swe.get_ayanamsa(jd)
data = {}
for pname, pid in _planet_map_for_node_mode(node_mode).items():
pos, ret = swe.calc_ut(jd, pid)
if ret < 0:
continue
lon = (pos[0] - ayanamsa) % 360
sign_idx = int(lon / 30) % 12
speed = pos[3] if len(pos) > 3 else 0
data[pname] = {
'sign': SIGNS[sign_idx],
'sign_cn': SIGNS_CN[SIGNS[sign_idx]],
'degree': round(lon, 4),
'degree_raw': lon,
'degree_in_sign': round(lon % 30, 2),
'degree_in_sign_raw': lon % 30,
'speed': round(speed, 4),
'retrograde': speed < 0,
}
if include_ketu and 'Rahu' in data:
rahu_lon = data['Rahu']['degree_raw']
ketu_lon = (rahu_lon + 180) % 360
ketu_idx = int(ketu_lon / 30) % 12
data['Ketu'] = {
'sign': SIGNS[ketu_idx],
'sign_cn': SIGNS_CN[SIGNS[ketu_idx]],
'degree': round(ketu_lon, 4),
'degree_raw': ketu_lon,
'degree_in_sign': round(ketu_lon % 30, 2),
'degree_in_sign_raw': ketu_lon % 30,
'speed': data['Rahu'].get('speed', 0),
'retrograde': data['Rahu'].get('retrograde', True),
}
return data, ayanamsa
def output_json(data): def output_json(data):
"""统一JSON输出""" """统一JSON输出"""
print(json.dumps(data, ensure_ascii=False, indent=2, default=str)) print(json.dumps(data, ensure_ascii=False, indent=2, default=str))
@@ -279,7 +333,7 @@ def compute_chart_data(year, month, day, hour, minute, lat, lon, tz, node_mode='
node_mode = (node_mode or 'mean').lower() node_mode = (node_mode or 'mean').lower()
if node_mode not in ('mean', 'true'): if node_mode not in ('mean', 'true'):
node_mode = 'mean' node_mode = 'mean'
node_pid = swe.TRUE_NODE if node_mode == 'true' else swe.MEAN_NODE node_pid = _node_pid(node_mode)
result = {"birth_info": { result = {"birth_info": {
"date": f"{year}-{month:02d}-{day:02d}", "time": f"{hour:02d}:{minute:02d}", "date": f"{year}-{month:02d}-{day:02d}", "time": f"{hour:02d}:{minute:02d}",
"tz": f"UTC{'+' if tz >= 0 else ''}{tz}", "lat": lat, "lon": lon, "tz": f"UTC{'+' if tz >= 0 else ''}{tz}", "lat": lat, "lon": lon,
@@ -1173,49 +1227,11 @@ def cmd_transit(args):
ayanamsa = swe.get_ayanamsa(jd_mid) ayanamsa = swe.get_ayanamsa(jd_mid)
# --- 计算行星位置 --- # --- 计算行星位置 ---
planet_map = { node_mode = getattr(args, 'node_mode', 'mean')
'Sun': swe.SUN, 'Moon': swe.MOON, 'Mars': swe.MARS, transit_data, ayanamsa = _calc_sidereal_planets_for_jd(jd_mid, node_mode=node_mode, include_ketu=True)
'Mercury': swe.MERCURY, 'Jupiter': swe.JUPITER, if target_planets:
'Venus': swe.VENUS, 'Saturn': swe.SATURN, 'Rahu': swe.MEAN_NODE target_set = set(target_planets)
} transit_data = {p: d for p, d in transit_data.items() if p in target_set}
transit_data = {}
for pname, pid in planet_map.items():
if target_planets and pname not in target_planets:
continue
pos, ret = swe.calc_ut(jd_mid, pid)
if ret < 0:
continue
lon_sid = (pos[0] - ayanamsa) % 360
speed = pos[3]
retrograde = speed < 0
sign_idx = int(lon_sid / 30) % 12
deg_in_sign = lon_sid % 30
sign_name = SIGNS[sign_idx]
sign_cn = SIGNS_CN[sign_name]
transit_data[pname] = {
'sign': sign_name,
'sign_cn': sign_cn,
'degree': round(lon_sid, 4),
'degree_in_sign': round(deg_in_sign, 2),
'speed': round(speed, 4),
'retrograde': retrograde,
}
# Rahu 存在时补算 Ketu
if 'Rahu' in transit_data:
rahu_lon = transit_data['Rahu']['degree']
ketu_lon = (rahu_lon + 180) % 360
ketu_si = int(ketu_lon / 30) % 12
transit_data['Ketu'] = {
'sign': SIGNS[ketu_si],
'sign_cn': SIGNS_CN[SIGNS[ketu_si]],
'degree': round(ketu_lon, 4),
'degree_in_sign': round(ketu_lon % 30, 2),
'speed': 0,
'retrograde': True,
}
# --- 计算行星间相位(互相在对方星座的宫位关系)--- # --- 计算行星间相位(互相在对方星座的宫位关系)---
aspects_found = [] aspects_found = []
@@ -1267,6 +1283,8 @@ def cmd_transit(args):
'method': 'Swiss Ephemeris 实时计算(v3.7.2', 'method': 'Swiss Ephemeris 实时计算(v3.7.2',
'target_date': f'{t_year}-{t_month:02d}-{t_day:02d}', 'target_date': f'{t_year}-{t_month:02d}-{t_day:02d}',
'ayanamsa': round(ayanamsa, 4), 'ayanamsa': round(ayanamsa, 4),
'node_mode': node_mode,
'data_layer': 'true_transit_positions',
'planets': transit_data, 'planets': transit_data,
'aspects': aspects_found, 'aspects': aspects_found,
'note': f'使用Swiss Ephemeris实时计算{t_year}{t_month}月行星过境位置,不再依赖静态JSON' 'note': f'使用Swiss Ephemeris实时计算{t_year}{t_month}月行星过境位置,不再依赖静态JSON'
@@ -2612,7 +2630,7 @@ def cmd_synastry(args):
# 基于 transit-multi-reference-guide.md 强制规范 # 基于 transit-multi-reference-guide.md 强制规范
# 四参考点:Lagna / Chandra Lagna / Arudha Lagna / Navamsa Lagna # 四参考点:Lagna / Chandra Lagna / Arudha Lagna / Navamsa Lagna
# ============================================================================ # ============================================================================
def _calc_transit_multi_reference(planets, asc_idx, asc_deg, planet_lons): def _calc_transit_multi_reference(planets, asc_idx, asc_deg, planet_lons, transit_planets=None, transit_date=None, node_mode='mean'):
""" """
⭐ v4.5.0: Transit多参考点分析(强制规范) ⭐ v4.5.0: Transit多参考点分析(强制规范)
每次Transit分析必须同时从四个参考点评估: 每次Transit分析必须同时从四个参考点评估:
@@ -2621,6 +2639,8 @@ def _calc_transit_multi_reference(planets, asc_idx, asc_deg, planet_lons):
3. Arudha LagnaAL)— 公众形象 3. Arudha LagnaAL)— 公众形象
4. Navamsa LagnaD9上升)— 灵魂层面 4. Navamsa LagnaD9上升)— 灵魂层面
""" """
data_layer = 'true_transit_positions' if transit_planets else 'natal_positions_fallback'
analysis_planets = transit_planets if transit_planets else planets
# 四个参考点的星座索引 # 四个参考点的星座索引
moon_lon = planet_lons.get('Moon', 0) moon_lon = planet_lons.get('Moon', 0)
chandra_idx = int(moon_lon / 30) % 12 chandra_idx = int(moon_lon / 30) % 12
@@ -2681,7 +2701,7 @@ def _calc_transit_multi_reference(planets, asc_idx, asc_deg, planet_lons):
OUTER_PLANETS = ['Jupiter', 'Saturn', 'Rahu', 'Ketu'] OUTER_PLANETS = ['Jupiter', 'Saturn', 'Rahu', 'Ketu']
transit_analysis = {} transit_analysis = {}
for pn in OUTER_PLANETS: for pn in OUTER_PLANETS:
pd = planets.get(pn, {}) pd = analysis_planets.get(pn, {})
if not isinstance(pd, dict) or 'sign' not in pd: if not isinstance(pd, dict) or 'sign' not in pd:
continue continue
p_sign_idx = SIGNS.index(pd['sign']) if pd['sign'] in SIGNS else 0 p_sign_idx = SIGNS.index(pd['sign']) if pd['sign'] in SIGNS else 0
@@ -2714,7 +2734,7 @@ def _calc_transit_multi_reference(planets, asc_idx, asc_deg, planet_lons):
# Sade Sati / Ashtama Shani 检测(基于Chandra Lagna # Sade Sati / Ashtama Shani 检测(基于Chandra Lagna
special_checks = {} special_checks = {}
saturn_sign_idx = SIGNS.index(planets.get('Saturn', {}).get('sign', 'Aries')) if isinstance(planets.get('Saturn'), dict) and planets.get('Saturn', {}).get('sign') in SIGNS else 0 saturn_sign_idx = SIGNS.index(analysis_planets.get('Saturn', {}).get('sign', 'Aries')) if isinstance(analysis_planets.get('Saturn'), dict) and analysis_planets.get('Saturn', {}).get('sign') in SIGNS else 0
# Sade Sati: Saturn 在月亮星座或前后1宫 # Sade Sati: Saturn 在月亮星座或前后1宫
sade_sati_phase = None sade_sati_phase = None
if saturn_sign_idx == chandra_idx: if saturn_sign_idx == chandra_idx:
@@ -2739,11 +2759,14 @@ def _calc_transit_multi_reference(planets, asc_idx, asc_deg, planet_lons):
return { return {
'references': references, 'references': references,
'target_date': transit_date,
'node_mode': node_mode,
'data_layer': data_layer,
'transit_analysis': transit_analysis, 'transit_analysis': transit_analysis,
'divergences': divergences, 'divergences': divergences,
'divergence_count': len(divergences), 'divergence_count': len(divergences),
'special_checks': special_checks, 'special_checks': special_checks,
'protocol': 'v4.5.0 Transit多参考点强制规范:AI必须同时呈现Lagna和Chandra Lagna两个视角。任何矛盾信号必须记录并解释。', 'protocol': 'v6.0.10 Transit多参考点强制规范:AI必须用真实过境行星位置,并同时呈现Lagna和Chandra Lagna两个视角。任何矛盾信号必须记录并解释。',
} }
@@ -3299,9 +3322,14 @@ def cmd_full_reading(args):
except Exception as e: except Exception as e:
jaimini_result['chara_karaka_jh'] = {"error": str(e)} jaimini_result['chara_karaka_jh'] = {"error": str(e)}
# 使用带 Antardasha 子周期的 Chara Dashav4.3.0 # 使用带 Antardasha 子周期的 Chara Dashav4.3.0v6.0.9后标注为partial
jaimini_result['chara_dasha'] = calc_chara_dasha_with_antardasha(asc_idx, planet_lons, args.year, args.month) jaimini_result['chara_dasha'] = calc_chara_dasha_with_antardasha(asc_idx, planet_lons, args.year, args.month)
jaimini_result['has_antardasha'] = True jaimini_result['has_antardasha'] = True
jaimini_result['chara_dasha_capability'] = {
'status': 'partial',
'reason': 'Round 7 vs PyJHora KN Rao matched 58/240 fields; current implementation is simplified, not full KN Rao/PVN Rao/Iranganti.',
'usage_rule': 'Use Chara Karaka/Karakamsha normally; use Chara Dasha timing only as low-weight corroboration.'
}
# Karakamsha(用AK灵魂星,非DK配偶星) # Karakamsha(用AK灵魂星,非DK配偶星)
# ⚠️ 2026-05-03修正:此前错误使用DK,现已修正为AK # ⚠️ 2026-05-03修正:此前错误使用DK,现已修正为AK
@@ -3467,9 +3495,21 @@ def cmd_full_reading(args):
except Exception as e: except Exception as e:
report['errors'].append(f"vivah-saham: {e}") report['errors'].append(f"vivah-saham: {e}")
# ── Step 17: Transit 多参考点分析 (v4.5.0 P1) ── # ── Step 17: Transit 多参考点分析 (v6.0.10 true transit) ──
try: try:
transit_multi = _calc_transit_multi_reference(planets, asc_idx, asc_deg, planet_lons) transit_reference_date = getattr(args, 'transit_date', None) or getattr(args, 'today', None) or datetime.now().strftime('%Y-%m-%d')
ty, tm, td = map(int, transit_reference_date.split('-'))
transit_jd = swe.julday(ty, tm, td, 12.0 - args.tz)
transit_planets, transit_ayanamsa = _calc_sidereal_planets_for_jd(transit_jd, node_mode=getattr(args, 'node_mode', 'mean'), include_ketu=True)
report['modules']['transit_positions'] = {
'method': 'Swiss Ephemeris true transit positions',
'target_date': transit_reference_date,
'ayanamsa': round(transit_ayanamsa, 4) if transit_ayanamsa is not None else None,
'node_mode': getattr(args, 'node_mode', 'mean'),
'data_layer': 'true_transit_positions',
'planets': transit_planets,
}
transit_multi = _calc_transit_multi_reference(planets, asc_idx, asc_deg, planet_lons, transit_planets=transit_planets, transit_date=transit_reference_date, node_mode=getattr(args, 'node_mode', 'mean'))
report['modules']['transit_multi_reference'] = transit_multi report['modules']['transit_multi_reference'] = transit_multi
except Exception as e: except Exception as e:
report['errors'].append(f"transit-multi-ref: {e}") report['errors'].append(f"transit-multi-ref: {e}")
@@ -3652,9 +3692,10 @@ def main():
p.add_argument('--day', type=int, default=15, help='指定日期(默认15日取月中代表)') p.add_argument('--day', type=int, default=15, help='指定日期(默认15日取月中代表)')
p.add_argument('--planet', default=None, help='目标行星,逗号分隔(默认全部,如:Jupiter,Saturn') p.add_argument('--planet', default=None, help='目标行星,逗号分隔(默认全部,如:Jupiter,Saturn')
p.add_argument('--tz', type=float, default=8, help='时区(默认UTC+8') p.add_argument('--tz', type=float, default=8, help='时区(默认UTC+8')
p.add_argument('--node-mode', default='mean', choices=['mean', 'true'], help='Rahu/Ketu节点口径:mean=Mean Node(默认),true=True Node')
# 9. shadbala (v3.4新增) # 9. shadbala (v3.4新增)
p = sub.add_parser('shadbala', help='Shadbala六重力量计算') p = sub.add_parser('shadbala', help='Shadbala六重力量计算(内部一致;外部绝对值校准前partial)')
_add_chart_args(p) _add_chart_args(p)
# 10. ashtakavarga (v3.4新增) # 10. ashtakavarga (v3.4新增)
@@ -3701,7 +3742,7 @@ def main():
p = sub.add_parser('jaimini', help='Jaimini系统(Chara Karaka/Dasha/Karakamsha') p = sub.add_parser('jaimini', help='Jaimini系统(Chara Karaka/Dasha/Karakamsha')
_add_chart_args(p) _add_chart_args(p)
p.add_argument('--mode', default='all', choices=['all','karaka','dasha','karakamsha'], help='分析模式') p.add_argument('--mode', default='all', choices=['all','karaka','dasha','karakamsha'], help='分析模式')
p.add_argument('--antardasha', action='store_true', help='Chara Dasha含Antardasha子周期') p.add_argument('--antardasha', action='store_true', help='Chara Dasha含Antardasha子周期(当前timing实现为partial')
# 18. nakshatra-adv (v3.7新增) # 18. nakshatra-adv (v3.7新增)
p = sub.add_parser('nakshatra-adv', help='高级Nakshatra分析') p = sub.add_parser('nakshatra-adv', help='高级Nakshatra分析')
@@ -3734,6 +3775,7 @@ def main():
_add_chart_args(p) _add_chart_args(p)
p.add_argument('--age', type=int, default=None, help='当前年龄(不提供则自动计算)') p.add_argument('--age', type=int, default=None, help='当前年龄(不提供则自动计算)')
p.add_argument('--today', default=None, help='Dasha/Sandhi参考日期 YYYY-MM-DD(默认今天)') p.add_argument('--today', default=None, help='Dasha/Sandhi参考日期 YYYY-MM-DD(默认今天)')
p.add_argument('--transit-date', default=None, help='Transit真实过境参考日期 YYYY-MM-DD(默认跟随--today或今天)')
# 23. prashna (v3.9新增) # 23. prashna (v3.9新增)
p = sub.add_parser('prashna', help='Prashna问事占星(提问时刻星盘+Arudha+Sphuta+Sahams') p = sub.add_parser('prashna', help='Prashna问事占星(提问时刻星盘+Arudha+Sphuta+Sahams')
+1 -1
View File
@@ -317,7 +317,7 @@ def build_cover(name, lagna, gender, status, pkg, desc, lang="cn"):
<div><dt>{L[4]}</dt><dd>Parashari Jyotish | KN Rao School</dd></div> <div><dt>{L[4]}</dt><dd>Parashari Jyotish | KN Rao School</dd></div>
<div><dt>{L[5]}</dt><dd>Swiss Ephemeris | Lahiri Ayanamsha</dd></div> <div><dt>{L[5]}</dt><dd>Swiss Ephemeris | Lahiri Ayanamsha</dd></div>
<div><dt>{L[6]}</dt><dd>Vimsottari (Mahadasha + Antardasha)</dd></div> <div><dt>{L[6]}</dt><dd>Vimsottari (Mahadasha + Antardasha)</dd></div>
<div><dt>{L[7]}</dt><dd>Shadbala, Ashtakavarga (SAV/BAV), D9 Navamsha</dd></div> <div><dt>{L[7]}</dt><dd>Shadbala (relative/partial), Ashtakavarga v2.1 (SAV/BAV), D9 Navamsha</dd></div>
</div></div> </div></div>
</div>""" </div>"""
+4 -4
View File
@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
Shadbala 计算模块六重力量 Shadbala 计算模块六重力量
基于 Parashara 系统量化行星力量 内部一致的 Parashara-inspired 相对强弱参考外部绝对值校准前状态为 partial
六种力量 六种力量
1. Sthana Bala位置力量 1. Sthana Bala位置力量
@@ -90,7 +90,7 @@ VIRUPAS_PER_RUPA = 60.0
def calc_shadbala(planets: Dict, asc_sign: str, birth_hour: float, def calc_shadbala(planets: Dict, asc_sign: str, birth_hour: float,
sun_lon: float, moon_lon: float) -> Dict: sun_lon: float, moon_lon: float) -> Dict:
""" """
计算完整 Shadbala 计算 Shadbala 相对强弱参考内部一致外部绝对值校准前 partial
Args: Args:
planets: 行星数据 dict每颗行星需要 {sign, degree, house, retrograde, speed} planets: 行星数据 dict每颗行星需要 {sign, degree, house, retrograde, speed}
@@ -100,7 +100,7 @@ def calc_shadbala(planets: Dict, asc_sign: str, birth_hour: float,
moon_lon: 月亮恒星黄道经度 moon_lon: 月亮恒星黄道经度
Returns: Returns:
完整的 Shadbala 计算结果 Shadbala 计算结果内部一致的相对强弱参考
""" """
results = {} results = {}
is_night = birth_hour < 6.0 or birth_hour >= 18.0 is_night = birth_hour < 6.0 or birth_hour >= 18.0
@@ -174,7 +174,7 @@ def calc_shadbala(planets: Dict, asc_sign: str, birth_hour: float,
results[name]['rank'] = i + 1 results[name]['rank'] = i + 1
return { return {
'method': 'Shadbala六重力量(Parashara系统', 'method': 'Shadbala六重力量(内部一致相对强弱;外部绝对值校准前partial',
'is_night_birth': is_night, 'is_night_birth': is_night,
'sun_uttarayana': sun_northern, 'sun_uttarayana': sun_northern,
'planets': results, 'planets': results,