diff --git a/CHANGELOG.md b/CHANGELOG.md index 7dc8e5d6..1d1774e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,46 @@ # 印度占星 Skill 更新日志 +## v6.0.41(2026-06-05)—— Yoga F1 92% 源码口径续航 + +> **目标**:在 v6.0.40 基础上继续推进残余 Yoga 误差,但仍坚持“准确率优先、源码确认后再改”;本轮只处理 PyJHora 源码定义非常明确且可稳定复现的规则。 + +### 引擎与 helper 修复 + +- `scripts/yoga_engine.py` 新增 `pyjhora_aspected_planets_of_raasi(h)`,复刻 PyJHora `house.aspected_planets_of_the_raasi()`:返回通过 Rasi Drishti 影响目标 rasi/house 的行星列表。 +- 新增 `FRIENDLY_PLANETS` 常量与 `natural_friend(a, b)` helper,对齐 PyJHora `const.friendly_planets`,用于 Matru Sneha 等需要自然友谊判断的 Yoga。 + +### 高影响规则对齐 + +- `bvr_sumukha_precise`:对齐 PyJHora/BVR-166,改为“2宫主在 Kendra 且被 PyJHora natural benefics 影响,或 natural benefics 入2宫”,不再只检查 Jupiter/Venus 入2宫。 +- `bvr_dama_yoga`:从占位规则改为 PyJHora/BVR-92 Dama/Damni Yoga 源码口径:七曜分布在恰好六个星座。 +- `bvr_matru_sneha_yoga`:补齐 PyJHora Matru Sneha 的自然友谊分支,并使用 PyJHora natural benefics 判断 L1/L4 是否同受吉星影响。 + +### 验证结果 + +- `scripts/validate_logic_v2.py`: + - Precision **94.82%**(v6.0.40 为 94.63%) + - Recall **90.92%**(v6.0.40 为 89.04%) + - F1 **92.83%**(v6.0.40 为 91.75%) + - FP:53;FN:97 +- `scripts/run_quality_gate.py --skip-yoga-logic`:通过。 + - pytest **35 passed** + - BPHS/Ashtakavarga 不变量 **18/18** + - golden case 通过 + - capability audit valid,0 problem / 0 warning + +### 规则库状态 + +- JSON 规则总数:**475** +- 启用规则:**381** +- 当前验证报告:`references/validation_logic_report.json` + +### 后续优化点 + +- 下一轮 Top residual 建议优先复现输入层后再动规则:`bvr_vanchana_chora_bheethi_yoga`、`bvr_kapata_yoga`、`bvr_mathibhramana_yoga`、`bvr_ayatna_griha_prapta_yoga`、`bvr_dharidhra_11_precise`、`bvr_utthama_graha_yoga`。 +- 特别注意:`vanchana_chora_bheethi` / `kapata` / `mathibhramana` 的残余差异仍高度依赖 Gulika/Maandi、`benefics_and_malefics()` 动态凶吉和 PyJHora 内部相位函数边界;下一轮不宜盲目扩大条件。 + +--- + ## v6.0.40(2026-06-05)—— Yoga F1 91% 源码口径续航 > **目标**:在 v6.0.39 首次突破 F1 90% 后继续推进,但仍保持“准确率优先、源码确认后再改”的路线;优先处理 Top residual 中 PyJHora 源码口径明确、收益高且过拟合风险低的规则。 diff --git a/SKILL.md b/SKILL.md index 21d661b7..36b5a08e 100644 --- a/SKILL.md +++ b/SKILL.md @@ -1,6 +1,6 @@ --- name: jyotish-vedic-astrology -version: 6.0.40 +version: 6.0.41 description: 印度占星(Jyotish)专业解盘与推运系统。核心能力:PDF星盘输入→严谨解盘→精确推运应期输出。触发词:印度占星、吠陀占星、Jyotish、解盘、推运、星盘分析、Dasha、Transit、Nakshatra、Yoga、出生时间矫正、PDF星盘、读取PDF、分析PDF星盘、现代解读、误判纠错、Varga分盘、综合分析、过境分析、合盘、婚姻匹配、年运盘、Prashna、Argala、Jaimini、Shadbala、Ashtakavarga、HTML报告、深度解盘。 --- @@ -10,7 +10,7 @@ description: 印度占星(Jyotish)专业解盘与推运系统。核心能力 > **严格路由**:`references/strict-workflow-router.md`(⭐涉及事业/婚恋/财务/应期/技法验证时必须优先读取) > **覆盖矩阵**:`references/technique-capability-matrix.md`(⭐判断技法 covered/partial/missing 时必须参考) > **机器注册表**:`references/technique_registry.json` + `scripts/audit_capabilities.py`(⭐用于自动审计与CI门禁) -> **版本**:v6.0.40-yoga-f1-91-source-parity | **详细变更**:`CHANGELOG.md` +> **版本**:v6.0.41-yoga-f1-92-source-parity | **详细变更**:`CHANGELOG.md` --- @@ -301,9 +301,9 @@ $PYTHON $SCRIPT <子命令> [参数] --- -**版本**:v6.0.40-yoga-f1-91-source-parity +**版本**:v6.0.41-yoga-f1-92-source-parity **创建日期**:2026-04-20 -**最后更新**:2026-06-05(v6.0.40 继续坚持 PyJHora 源码口径优先,修复 `bvr_amala_precise`、`bvr_kaalanirdesat_puthranaasa_yoga`、`bvr_bhaga_chumbana_yoga` 并新增 `pyjhora_natural_benefics()` helper;当前 475 条 JSON 规则、381 条启用规则,D1/Rasi 逻辑验证 Precision=94.63%、Recall=89.04%、F1=91.75%,质量门禁通过,报告以 `references/validation_logic_report.json` 为准) +**最后更新**:2026-06-05(v6.0.41 继续坚持 PyJHora 源码口径优先,修复 `bvr_sumukha_precise`、`bvr_dama_yoga`、`bvr_matru_sneha_yoga` 并新增 `pyjhora_aspected_planets_of_raasi()` 与 `natural_friend()` helper;当前 475 条 JSON 规则、381 条启用规则,D1/Rasi 逻辑验证 Precision=94.82%、Recall=90.92%、F1=92.83%,质量门禁通过,报告以 `references/validation_logic_report.json` 为准) --- diff --git a/references/validation_logic_report.json b/references/validation_logic_report.json index c66b486c..badd09f1 100644 --- a/references/validation_logic_report.json +++ b/references/validation_logic_report.json @@ -2,7 +2,7 @@ "summary": { "charts_tested": 60, "comparable_rules": 72, - "skill_total": 1005, + "skill_total": 1024, "pyjhora_total": 1068, "unmapped_pyjhora": 706, "missing_mappings": { @@ -131,18 +131,18 @@ "yuddhatpoorvadridhachitta_yoga" ] }, - "agreements": 951, - "false_positives": 54, - "false_negatives": 117, - "precision": 0.9463, - "recall": 0.8904, - "f1": 0.9175 + "agreements": 971, + "false_positives": 53, + "false_negatives": 97, + "precision": 0.9482, + "recall": 0.9092, + "f1": 0.9283 }, "false_positives": [ { "chart": "Albert Einstein", - "rule_id": "bvr_dehasthoulya_yoga", - "rule_name": "Dehasthoulya Yoga" + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga" }, { "chart": "Albert Einstein", @@ -151,13 +151,13 @@ }, { "chart": "Albert Einstein", - "rule_id": "bvr_bhratruvriddhi_precise", - "rule_name": "Bhratruvriddhi Yoga" + "rule_id": "vihaga_nabhasa", + "rule_name": "Vihaga Nabhasa Yoga" }, { "chart": "Albert Einstein", - "rule_id": "vihaga_nabhasa", - "rule_name": "Vihaga Nabhasa Yoga" + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga" }, { "chart": "Marie Curie", @@ -171,8 +171,8 @@ }, { "chart": "Thomas Edison", - "rule_id": "bvr_017_vosi_precise", - "rule_name": "Vosi Yoga" + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga" }, { "chart": "Thomas Edison", @@ -181,8 +181,8 @@ }, { "chart": "Thomas Edison", - "rule_id": "bvr_bhratruvriddhi_precise", - "rule_name": "Bhratruvriddhi Yoga" + "rule_id": "bvr_017_vosi_precise", + "rule_name": "Vosi Yoga" }, { "chart": "Max Planck", @@ -191,13 +191,13 @@ }, { "chart": "Niels Bohr", - "rule_id": "vihaga_nabhasa", - "rule_name": "Vihaga Nabhasa Yoga" + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga" }, { "chart": "Niels Bohr", - "rule_id": "bvr_bhratruvriddhi_precise", - "rule_name": "Bhratruvriddhi Yoga" + "rule_id": "vihaga_nabhasa", + "rule_name": "Vihaga Nabhasa Yoga" }, { "chart": "Richard Feynman", @@ -221,13 +221,13 @@ }, { "chart": "Abraham Lincoln", - "rule_id": "bvr_bahu_puthra_precise", - "rule_name": "Bahu Puthra Yoga" + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga" }, { "chart": "Abraham Lincoln", - "rule_id": "bvr_swaveeryaddhana_precise", - "rule_name": "Swaveeryaddhana Yoga" + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga" }, { "chart": "Rabindranath Tagore", @@ -261,8 +261,8 @@ }, { "chart": "Vincent van Gogh", - "rule_id": "bvr_krisanga_yoga", - "rule_name": "Krisanga Yoga" + "rule_id": "bvr_dharidhra_11_precise", + "rule_name": "Dharidhra Yoga" }, { "chart": "Vincent van Gogh", @@ -271,8 +271,8 @@ }, { "chart": "Vincent van Gogh", - "rule_id": "bvr_dharidhra_11_precise", - "rule_name": "Dharidhra Yoga" + "rule_id": "bvr_krisanga_yoga", + "rule_name": "Krisanga Yoga" }, { "chart": "Charlie Chaplin", @@ -286,13 +286,13 @@ }, { "chart": "Steve Jobs", - "rule_id": "vihaga_nabhasa", - "rule_name": "Vihaga Nabhasa Yoga" + "rule_id": "bvr_mathibhramana_yoga", + "rule_name": "Mathibhramana Yoga" }, { "chart": "Steve Jobs", - "rule_id": "bvr_mathibhramana_yoga", - "rule_name": "Mathibhramana Yoga" + "rule_id": "vihaga_nabhasa", + "rule_name": "Vihaga Nabhasa Yoga" }, { "chart": "Bill Gates", @@ -311,13 +311,13 @@ }, { "chart": "Narayana Murthy", - "rule_id": "bvr_bhaga_chumbana_yoga", - "rule_name": "Bhaga Chumbana Yoga" + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga" }, { "chart": "Narayana Murthy", - "rule_id": "bvr_bhratruvriddhi_precise", - "rule_name": "Bhratruvriddhi Yoga" + "rule_id": "bvr_bhaga_chumbana_yoga", + "rule_name": "Bhaga Chumbana Yoga" }, { "chart": "Sachin Tendulkar", @@ -329,15 +329,20 @@ "rule_id": "bvr_yukthi_samanwithavagmi_yoga", "rule_name": "Yukthi Samanwithavagmi Yoga" }, + { + "chart": "Michael Jordan", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga" + }, { "chart": "Michael Jordan", "rule_id": "bvr_yukthi_samanwithavagmi_yoga", "rule_name": "Yukthi Samanwithavagmi Yoga" }, { - "chart": "Michael Jordan", - "rule_id": "bvr_vanchana_chora_bheethi_yoga", - "rule_name": "Vanchana Chora Bheethi Yoga" + "chart": "Lionel Messi", + "rule_id": "brahma_yoga", + "rule_name": "Brahma Yoga" }, { "chart": "Lionel Messi", @@ -345,7 +350,7 @@ "rule_name": "Vosi Yoga" }, { - "chart": "Lionel Messi", + "chart": "Cristiano Ronaldo", "rule_id": "brahma_yoga", "rule_name": "Brahma Yoga" }, @@ -359,11 +364,6 @@ "rule_id": "sankha_yoga", "rule_name": "Sankha Yoga" }, - { - "chart": "Cristiano Ronaldo", - "rule_id": "brahma_yoga", - "rule_name": "Brahma Yoga" - }, { "chart": "Serena Williams", "rule_id": "bvr_kapata_yoga", @@ -403,14 +403,35 @@ "chart": "Osho", "rule_id": "bvr_vanchana_chora_bheethi_yoga", "rule_name": "Vanchana Chora Bheethi Yoga" - }, - { - "chart": "J. Krishnamurti", - "rule_id": "bvr_matru_sneha_yoga", - "rule_name": "Matru Sneha Yoga" } ], "false_negatives": [ + { + "chart": "Albert Einstein", + "rule_id": "bvr_dharidhra_11_precise", + "rule_name": "Dharidhra Yoga", + "pyjhora_names": [ + "dharidhra_yoga_144", + "dharidhra_yoga_147", + "dharidhra_yoga_148", + "dharidhra_yoga_149", + "dharidhra_yoga_150", + "dharidhra_yoga_151", + "dharidhra_yoga_152" + ] + }, + { + "chart": "Albert Einstein", + "rule_id": "bvr_mathibhramana_yoga", + "rule_name": "Mathibhramana Yoga", + "pyjhora_names": [ + "mathibhramana_yoga_291", + "mathibhramana_yoga_292", + "mathibhramana_yoga_293", + "mathibhramana_yoga_294", + "mathibhramana_yoga_variation" + ] + }, { "chart": "Albert Einstein", "rule_id": "bvr_kapata_yoga", @@ -430,32 +451,6 @@ "kaalanirdesat_puthranaasa_yoga_229" ] }, - { - "chart": "Albert Einstein", - "rule_id": "bvr_mathibhramana_yoga", - "rule_name": "Mathibhramana Yoga", - "pyjhora_names": [ - "mathibhramana_yoga_291", - "mathibhramana_yoga_292", - "mathibhramana_yoga_293", - "mathibhramana_yoga_294", - "mathibhramana_yoga_variation" - ] - }, - { - "chart": "Albert Einstein", - "rule_id": "bvr_dharidhra_11_precise", - "rule_name": "Dharidhra Yoga", - "pyjhora_names": [ - "dharidhra_yoga_144", - "dharidhra_yoga_147", - "dharidhra_yoga_148", - "dharidhra_yoga_149", - "dharidhra_yoga_150", - "dharidhra_yoga_151", - "dharidhra_yoga_152" - ] - }, { "chart": "Nikola Tesla", "rule_id": "parvata_yoga", @@ -464,6 +459,15 @@ "parvata_yoga" ] }, + { + "chart": "Charles Darwin", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, { "chart": "Charles Darwin", "rule_id": "bvr_utthama_graha_yoga", @@ -481,39 +485,6 @@ "kalanidhi_yoga" ] }, - { - "chart": "Charles Darwin", - "rule_id": "bvr_matru_sneha_yoga", - "rule_name": "Matru Sneha Yoga", - "pyjhora_names": [ - "matru_sneha_yoga" - ] - }, - { - "chart": "Charles Darwin", - "rule_id": "bvr_sumukha_precise", - "rule_name": "Sumukha Yoga", - "pyjhora_names": [ - "sumukha_yoga" - ] - }, - { - "chart": "Charles Darwin", - "rule_id": "bvr_matrunasa_precise", - "rule_name": "Matrunasa Yoga", - "pyjhora_names": [ - "matrunasa_yoga_198", - "matrunasa_yoga_199" - ] - }, - { - "chart": "Thomas Edison", - "rule_id": "bvr_matru_sneha_yoga", - "rule_name": "Matru Sneha Yoga", - "pyjhora_names": [ - "matru_sneha_yoga" - ] - }, { "chart": "Thomas Edison", "rule_id": "brahma_yoga", @@ -540,19 +511,10 @@ }, { "chart": "Max Planck", - "rule_id": "bvr_ayatna_griha_prapta_yoga", - "rule_name": "Ayatna Griha Prapta Yoga", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga", "pyjhora_names": [ - "ayatna_griha_prapta_yoga_189", - "ayatna_griha_prapta_yoga_190" - ] - }, - { - "chart": "Max Planck", - "rule_id": "bvr_amala_precise", - "rule_name": "Amala Yoga", - "pyjhora_names": [ - "amala_yoga" + "vanchana_chora_bheethi_yoga" ] }, { @@ -569,10 +531,19 @@ }, { "chart": "Max Planck", - "rule_id": "bvr_vanchana_chora_bheethi_yoga", - "rule_name": "Vanchana Chora Bheethi Yoga", + "rule_id": "bvr_ayatna_griha_prapta_yoga", + "rule_name": "Ayatna Griha Prapta Yoga", "pyjhora_names": [ - "vanchana_chora_bheethi_yoga" + "ayatna_griha_prapta_yoga_189", + "ayatna_griha_prapta_yoga_190" + ] + }, + { + "chart": "Max Planck", + "rule_id": "bvr_amala_precise", + "rule_name": "Amala Yoga", + "pyjhora_names": [ + "amala_yoga" ] }, { @@ -584,14 +555,6 @@ "ayatna_griha_prapta_yoga_190" ] }, - { - "chart": "Richard Feynman", - "rule_id": "bvr_sumukha_precise", - "rule_name": "Sumukha Yoga", - "pyjhora_names": [ - "sumukha_yoga" - ] - }, { "chart": "Richard Feynman", "rule_id": "bvr_kapata_yoga", @@ -623,6 +586,14 @@ "dattha_puthra_yoga_223" ] }, + { + "chart": "Jawaharlal Nehru", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga", + "pyjhora_names": [ + "vanchana_chora_bheethi_yoga" + ] + }, { "chart": "Jawaharlal Nehru", "rule_id": "bvr_matrudeerghayur_yoga", @@ -632,14 +603,6 @@ "matrudeerghayur_yoga_197" ] }, - { - "chart": "Jawaharlal Nehru", - "rule_id": "bvr_vanchana_chora_bheethi_yoga", - "rule_name": "Vanchana Chora Bheethi Yoga", - "pyjhora_names": [ - "vanchana_chora_bheethi_yoga" - ] - }, { "chart": "Narendra Modi", "rule_id": "bvr_bahu_puthra_precise", @@ -651,10 +614,18 @@ }, { "chart": "Indira Gandhi", - "rule_id": "kahala_yoga", - "rule_name": "Kahala Yoga", + "rule_id": "bvr_kaahala_yoga", + "rule_name": "Kaahala Yoga", "pyjhora_names": [ - "kahala_yoga" + "kaahala_yoga" + ] + }, + { + "chart": "Indira Gandhi", + "rule_id": "bvr_utthama_graha_yoga", + "rule_name": "Utthama Griha Yoga", + "pyjhora_names": [ + "utthama_graha_yoga" ] }, { @@ -668,18 +639,18 @@ }, { "chart": "Indira Gandhi", - "rule_id": "bvr_utthama_graha_yoga", - "rule_name": "Utthama Griha Yoga", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", "pyjhora_names": [ - "utthama_graha_yoga" + "kahala_yoga" ] }, { - "chart": "Indira Gandhi", - "rule_id": "bvr_kaahala_yoga", - "rule_name": "Kaahala Yoga", + "chart": "Winston Churchill", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga", "pyjhora_names": [ - "kaahala_yoga" + "vanchana_chora_bheethi_yoga" ] }, { @@ -697,27 +668,12 @@ ] }, { - "chart": "Winston Churchill", - "rule_id": "bvr_vanchana_chora_bheethi_yoga", - "rule_name": "Vanchana Chora Bheethi Yoga", + "chart": "Abraham Lincoln", + "rule_id": "bvr_kalaanidhi_yoga", + "rule_name": "Kalaanidhi Yoga", "pyjhora_names": [ - "vanchana_chora_bheethi_yoga" - ] - }, - { - "chart": "John F. Kennedy", - "rule_id": "bvr_matru_sneha_yoga", - "rule_name": "Matru Sneha Yoga", - "pyjhora_names": [ - "matru_sneha_yoga" - ] - }, - { - "chart": "Nelson Mandela", - "rule_id": "bvr_sumukha_precise", - "rule_name": "Sumukha Yoga", - "pyjhora_names": [ - "sumukha_yoga" + "kalaanidhi_yoga", + "kalanidhi_yoga" ] }, { @@ -730,41 +686,6 @@ }, { "chart": "Abraham Lincoln", - "rule_id": "bvr_kalaanidhi_yoga", - "rule_name": "Kalaanidhi Yoga", - "pyjhora_names": [ - "kalaanidhi_yoga", - "kalanidhi_yoga" - ] - }, - { - "chart": "Abraham Lincoln", - "rule_id": "bvr_matru_sneha_yoga", - "rule_name": "Matru Sneha Yoga", - "pyjhora_names": [ - "matru_sneha_yoga" - ] - }, - { - "chart": "Abraham Lincoln", - "rule_id": "bvr_sumukha_precise", - "rule_name": "Sumukha Yoga", - "pyjhora_names": [ - "sumukha_yoga" - ] - }, - { - "chart": "Abraham Lincoln", - "rule_id": "bvr_kapata_yoga", - "rule_name": "Kapata Yoga", - "pyjhora_names": [ - "kapata_yoga_202", - "kapata_yoga_203", - "kapata_yoga_204" - ] - }, - { - "chart": "Barack Obama", "rule_id": "bvr_kapata_yoga", "rule_name": "Kapata Yoga", "pyjhora_names": [ @@ -787,6 +708,24 @@ "dharidhra_yoga_152" ] }, + { + "chart": "Barack Obama", + "rule_id": "bvr_kapata_yoga", + "rule_name": "Kapata Yoga", + "pyjhora_names": [ + "kapata_yoga_202", + "kapata_yoga_203", + "kapata_yoga_204" + ] + }, + { + "chart": "Ludwig van Beethoven", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga", + "pyjhora_names": [ + "vanchana_chora_bheethi_yoga" + ] + }, { "chart": "Ludwig van Beethoven", "rule_id": "bvr_kalaanidhi_yoga", @@ -797,19 +736,17 @@ ] }, { - "chart": "Ludwig van Beethoven", - "rule_id": "bvr_matru_sneha_yoga", - "rule_name": "Matru Sneha Yoga", + "chart": "Wolfgang Mozart", + "rule_id": "bvr_dharidhra_11_precise", + "rule_name": "Dharidhra Yoga", "pyjhora_names": [ - "matru_sneha_yoga" - ] - }, - { - "chart": "Ludwig van Beethoven", - "rule_id": "bvr_vanchana_chora_bheethi_yoga", - "rule_name": "Vanchana Chora Bheethi Yoga", - "pyjhora_names": [ - "vanchana_chora_bheethi_yoga" + "dharidhra_yoga_144", + "dharidhra_yoga_147", + "dharidhra_yoga_148", + "dharidhra_yoga_149", + "dharidhra_yoga_150", + "dharidhra_yoga_151", + "dharidhra_yoga_152" ] }, { @@ -821,36 +758,6 @@ "krisanga_yoga_113" ] }, - { - "chart": "Wolfgang Mozart", - "rule_id": "bvr_dharidhra_11_precise", - "rule_name": "Dharidhra Yoga", - "pyjhora_names": [ - "dharidhra_yoga_144", - "dharidhra_yoga_147", - "dharidhra_yoga_148", - "dharidhra_yoga_149", - "dharidhra_yoga_150", - "dharidhra_yoga_151", - "dharidhra_yoga_152" - ] - }, - { - "chart": "Pablo Picasso", - "rule_id": "bvr_sumukha_precise", - "rule_name": "Sumukha Yoga", - "pyjhora_names": [ - "sumukha_yoga" - ] - }, - { - "chart": "Pablo Picasso", - "rule_id": "bvr_dama_yoga", - "rule_name": "Dama Yoga", - "pyjhora_names": [ - "dama_yoga" - ] - }, { "chart": "Vincent van Gogh", "rule_id": "bvr_vanchana_chora_bheethi_yoga", @@ -891,6 +798,14 @@ "mathibhramana_yoga_variation" ] }, + { + "chart": "Charlie Chaplin", + "rule_id": "bvr_pittharoga_yoga", + "rule_name": "Pittharoga Yoga", + "pyjhora_names": [ + "pittharoga_yoga" + ] + }, { "chart": "Charlie Chaplin", "rule_id": "bvr_bahu_puthra_precise", @@ -909,14 +824,6 @@ "matrunasa_yoga_199" ] }, - { - "chart": "Charlie Chaplin", - "rule_id": "bvr_pittharoga_yoga", - "rule_name": "Pittharoga Yoga", - "pyjhora_names": [ - "pittharoga_yoga" - ] - }, { "chart": "Charlie Chaplin", "rule_id": "bvr_yukthi_samanwithavagmi_yoga", @@ -937,10 +844,10 @@ }, { "chart": "Michael Jackson", - "rule_id": "bvr_sumukha_precise", - "rule_name": "Sumukha Yoga", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga", "pyjhora_names": [ - "sumukha_yoga" + "vanchana_chora_bheethi_yoga" ] }, { @@ -951,30 +858,6 @@ "amala_yoga" ] }, - { - "chart": "Michael Jackson", - "rule_id": "bvr_dama_yoga", - "rule_name": "Dama Yoga", - "pyjhora_names": [ - "dama_yoga" - ] - }, - { - "chart": "Michael Jackson", - "rule_id": "bvr_vanchana_chora_bheethi_yoga", - "rule_name": "Vanchana Chora Bheethi Yoga", - "pyjhora_names": [ - "vanchana_chora_bheethi_yoga" - ] - }, - { - "chart": "A.R. Rahman", - "rule_id": "bvr_dama_yoga", - "rule_name": "Dama Yoga", - "pyjhora_names": [ - "dama_yoga" - ] - }, { "chart": "A.R. Rahman", "rule_id": "bvr_kapata_yoga", @@ -985,23 +868,6 @@ "kapata_yoga_204" ] }, - { - "chart": "Lata Mangeshkar", - "rule_id": "bvr_matrunasa_precise", - "rule_name": "Matrunasa Yoga", - "pyjhora_names": [ - "matrunasa_yoga_198", - "matrunasa_yoga_199" - ] - }, - { - "chart": "Lata Mangeshkar", - "rule_id": "bvr_dama_yoga", - "rule_name": "Dama Yoga", - "pyjhora_names": [ - "dama_yoga" - ] - }, { "chart": "Lata Mangeshkar", "rule_id": "bvr_vanchana_chora_bheethi_yoga", @@ -1011,11 +877,12 @@ ] }, { - "chart": "Steve Jobs", - "rule_id": "bvr_utthama_graha_yoga", - "rule_name": "Utthama Griha Yoga", + "chart": "Lata Mangeshkar", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", "pyjhora_names": [ - "utthama_graha_yoga" + "matrunasa_yoga_198", + "matrunasa_yoga_199" ] }, { @@ -1027,6 +894,14 @@ "nishkapata_yoga_206" ] }, + { + "chart": "Steve Jobs", + "rule_id": "bvr_utthama_graha_yoga", + "rule_name": "Utthama Griha Yoga", + "pyjhora_names": [ + "utthama_graha_yoga" + ] + }, { "chart": "Bill Gates", "rule_id": "bvr_raja_bhanga_yoga", @@ -1064,10 +939,10 @@ }, { "chart": "Warren Buffett", - "rule_id": "bvr_vaatharoga_yoga", - "rule_name": "Vaatharoga Yoga", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga", "pyjhora_names": [ - "vaatharoga_yoga" + "vanchana_chora_bheethi_yoga" ] }, { @@ -1084,10 +959,10 @@ }, { "chart": "Warren Buffett", - "rule_id": "bvr_vanchana_chora_bheethi_yoga", - "rule_name": "Vanchana Chora Bheethi Yoga", + "rule_id": "bvr_vaatharoga_yoga", + "rule_name": "Vaatharoga Yoga", "pyjhora_names": [ - "vanchana_chora_bheethi_yoga" + "vaatharoga_yoga" ] }, { @@ -1114,6 +989,14 @@ "adhi_yoga" ] }, + { + "chart": "Azim Premji", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga", + "pyjhora_names": [ + "vanchana_chora_bheethi_yoga" + ] + }, { "chart": "Azim Premji", "rule_id": "bvr_krisanga_yoga", @@ -1123,22 +1006,6 @@ "krisanga_yoga_113" ] }, - { - "chart": "Azim Premji", - "rule_id": "bvr_dama_yoga", - "rule_name": "Dama Yoga", - "pyjhora_names": [ - "dama_yoga" - ] - }, - { - "chart": "Azim Premji", - "rule_id": "bvr_vanchana_chora_bheethi_yoga", - "rule_name": "Vanchana Chora Bheethi Yoga", - "pyjhora_names": [ - "vanchana_chora_bheethi_yoga" - ] - }, { "chart": "Dhirubhai Ambani", "rule_id": "bvr_krisanga_yoga", @@ -1156,22 +1023,6 @@ "pisacha_grastha_yoga" ] }, - { - "chart": "Virat Kohli", - "rule_id": "bvr_sumukha_precise", - "rule_name": "Sumukha Yoga", - "pyjhora_names": [ - "sumukha_yoga" - ] - }, - { - "chart": "Virat Kohli", - "rule_id": "bvr_dama_yoga", - "rule_name": "Dama Yoga", - "pyjhora_names": [ - "dama_yoga" - ] - }, { "chart": "Muhammad Ali", "rule_id": "pushkala_yoga", @@ -1211,25 +1062,6 @@ "matrudeerghayur_yoga_197" ] }, - { - "chart": "Lionel Messi", - "rule_id": "bvr_kapata_yoga", - "rule_name": "Kapata Yoga", - "pyjhora_names": [ - "kapata_yoga_202", - "kapata_yoga_203", - "kapata_yoga_204" - ] - }, - { - "chart": "Lionel Messi", - "rule_id": "bvr_matrunasa_precise", - "rule_name": "Matrunasa Yoga", - "pyjhora_names": [ - "matrunasa_yoga_198", - "matrunasa_yoga_199" - ] - }, { "chart": "Lionel Messi", "rule_id": "bvr_vanchana_chora_bheethi_yoga", @@ -1253,12 +1085,22 @@ ] }, { - "chart": "Cristiano Ronaldo", - "rule_id": "bvr_kalaanidhi_yoga", - "rule_name": "Kalaanidhi Yoga", + "chart": "Lionel Messi", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", "pyjhora_names": [ - "kalaanidhi_yoga", - "kalanidhi_yoga" + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "Lionel Messi", + "rule_id": "bvr_kapata_yoga", + "rule_name": "Kapata Yoga", + "pyjhora_names": [ + "kapata_yoga_202", + "kapata_yoga_203", + "kapata_yoga_204" ] }, { @@ -1278,12 +1120,20 @@ ] }, { - "chart": "Serena Williams", - "rule_id": "bvr_ayatna_griha_prapta_yoga", - "rule_name": "Ayatna Griha Prapta Yoga", + "chart": "Cristiano Ronaldo", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", "pyjhora_names": [ - "ayatna_griha_prapta_yoga_189", - "ayatna_griha_prapta_yoga_190" + "matru_sneha_yoga" + ] + }, + { + "chart": "Cristiano Ronaldo", + "rule_id": "bvr_kalaanidhi_yoga", + "rule_name": "Kalaanidhi Yoga", + "pyjhora_names": [ + "kalaanidhi_yoga", + "kalanidhi_yoga" ] }, { @@ -1298,6 +1148,15 @@ "mathibhramana_yoga_variation" ] }, + { + "chart": "Serena Williams", + "rule_id": "bvr_ayatna_griha_prapta_yoga", + "rule_name": "Ayatna Griha Prapta Yoga", + "pyjhora_names": [ + "ayatna_griha_prapta_yoga_189", + "ayatna_griha_prapta_yoga_190" + ] + }, { "chart": "Pele", "rule_id": "bvr_mathibhramana_yoga", @@ -1327,22 +1186,6 @@ "ayatna_griha_prapta_yoga_190" ] }, - { - "chart": "Swami Vivekananda", - "rule_id": "bvr_matru_sneha_yoga", - "rule_name": "Matru Sneha Yoga", - "pyjhora_names": [ - "matru_sneha_yoga" - ] - }, - { - "chart": "Queen Elizabeth II", - "rule_id": "bvr_dama_yoga", - "rule_name": "Dama Yoga", - "pyjhora_names": [ - "dama_yoga" - ] - }, { "chart": "Dalai Lama", "rule_id": "parvata_yoga", @@ -1380,12 +1223,10 @@ }, { "chart": "Osho", - "rule_id": "bvr_dehasthoulya_yoga", - "rule_name": "Dehasthoulya Yoga", + "rule_id": "bvr_vichitra_saudha_prakara_yoga", + "rule_name": "Vichitra Saudha Prakara Yoga", "pyjhora_names": [ - "dehasthoulya_yoga_114", - "dehasthoulya_yoga_115", - "dehasthoulya_yoga_116" + "vichitra_saudha_prakara_yoga" ] }, { @@ -1399,18 +1240,12 @@ }, { "chart": "Osho", - "rule_id": "bvr_vichitra_saudha_prakara_yoga", - "rule_name": "Vichitra Saudha Prakara Yoga", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga", "pyjhora_names": [ - "vichitra_saudha_prakara_yoga" - ] - }, - { - "chart": "J. Krishnamurti", - "rule_id": "bvr_sumukha_precise", - "rule_name": "Sumukha Yoga", - "pyjhora_names": [ - "sumukha_yoga" + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_115", + "dehasthoulya_yoga_116" ] }, { @@ -1441,6 +1276,14 @@ "sankha_yoga" ] }, + { + "chart": "Paramahansa Yogananda", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga", + "pyjhora_names": [ + "vanchana_chora_bheethi_yoga" + ] + }, { "chart": "Paramahansa Yogananda", "rule_id": "bvr_matrunasa_precise", @@ -1457,14 +1300,6 @@ "pyjhora_names": [ "yuddha_marana_yoga" ] - }, - { - "chart": "Paramahansa Yogananda", - "rule_id": "bvr_vanchana_chora_bheethi_yoga", - "rule_name": "Vanchana Chora Bheethi Yoga", - "pyjhora_names": [ - "vanchana_chora_bheethi_yoga" - ] } ] } \ No newline at end of file diff --git a/references/yoga_rules.json b/references/yoga_rules.json index 9ab7f5fd..dfeb9067 100644 --- a/references/yoga_rules.json +++ b/references/yoga_rules.json @@ -9177,7 +9177,7 @@ "category": "auspicious", "logic": { "type": "custom", - "expr": "\n# Benefics (Jupiter, Venus) in 2nd house\nbenefics = {'Jupiter', 'Venus'}\nplanets_in_2 = [p for p, info in ctx.planets.items() if info.get('house') == 2]\nany(p in benefics for p in planets_in_2)\n", + "expr": "\n# PyJHora/BVR-166 Sumukha Yoga method 1.\n# L2 in a kendra and aspected by PyJHora natural benefics, OR natural benefics join the 2nd house.\nl2 = lord(2)\nif l2 not in ctx.planets:\n False\nelse:\n benefics = pyjhora_natural_benefics()\n cond_1a = kendra(house_of(l2)) and any(b in pyjhora_aspected_planets_of_raasi(house_of(l2)) for b in benefics)\n cond_1b = any(house_of(b) == 2 for b in benefics)\n cond_1a or cond_1b\n", "combo_template": "吉星在第2宫" }, "effects": [ @@ -10332,14 +10332,14 @@ { "id": "bvr_dama_yoga", "name": "Dama Yoga", - "name_cn": "TBD", - "source": "待查", - "bvr_id": null, + "name_cn": "达摩/达姆尼瑜伽", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-92", "category": "special", "logic": { - "type": "placeholder", - "note": "BVR definition: TBD", - "draft": true + "type": "custom", + "expr": "\n# PyJHora/BVR-92 Dama/Damni Yoga: seven classical planets occupy exactly six signs.\nclassical = ['Sun', 'Moon', 'Mars', 'Mercury', 'Jupiter', 'Venus', 'Saturn']\nlen(set(sign_of(p) for p in classical if p in ctx.planets)) == 6\n", + "combo_template": "七曜分布在六个星座" }, "effects": [ "待补充" @@ -11615,7 +11615,7 @@ "category": "special", "logic": { "type": "custom", - "expr": "\n# PyJHora: same lord for 1st/4th OR natural/temporal friendship OR both aspected by benefics.\nl1 = lord(1)\nl4 = lord(4)\nif l1 not in ctx.planets or l4 not in ctx.planets:\n False\nelse:\n same_lord = l1 == l4\n temporal_friends = temporal_friend(l1, l4) and temporal_friend(l4, l1)\n both_benefic_aspected = all(any(aspect(b, p) for b in BENEFICS if b in ctx.planets) for p in [l1, l4])\n same_lord or temporal_friends or both_benefic_aspected\n", + "expr": "\n# PyJHora Matru Sneha: same L1/L4, mutual temporary or natural friendship, or both aspected by PyJHora natural benefics.\nl1 = lord(1)\nl4 = lord(4)\nif l1 not in ctx.planets or l4 not in ctx.planets:\n False\nelse:\n same_lord = l1 == l4\n temp_friends = temporal_friend(l1, l4) and temporal_friend(l4, l1)\n nat_friends = natural_friend(l1, l4)\n benefics = pyjhora_natural_benefics()\n both_benefic_aspected = any(aspect(b, l1) for b in benefics) and any(aspect(b, l4) for b in benefics)\n same_lord or temp_friends or nat_friends or both_benefic_aspected\n", "combo_template": "1宫主与4宫主同主、友好或同受吉星照拂" }, "effects": [ diff --git a/scripts/yoga_engine.py b/scripts/yoga_engine.py index 49a09139..c2252efe 100644 --- a/scripts/yoga_engine.py +++ b/scripts/yoga_engine.py @@ -37,6 +37,18 @@ MOOLATRIKONA_SIGN = { 'Sun': 'Leo', 'Moon': 'Taurus', 'Mars': 'Aries', 'Mercury': 'Virgo', 'Jupiter': 'Sagittarius', 'Venus': 'Libra', 'Saturn': 'Aquarius' } +# PyJHora const.friendly_planets mapped from planet ids to names. +FRIENDLY_PLANETS = { + 'Sun': ['Moon', 'Mars', 'Jupiter'], + 'Moon': ['Sun', 'Mercury'], + 'Mars': ['Sun', 'Moon', 'Jupiter'], + 'Mercury': ['Sun', 'Venus'], + 'Jupiter': ['Sun', 'Moon', 'Mars'], + 'Venus': ['Mercury', 'Saturn', 'Rahu'], + 'Saturn': ['Mercury', 'Venus', 'Rahu'], + 'Rahu': ['Venus', 'Saturn'], + 'Ketu': ['Sun', 'Mars'], +} PLANET_CN = { "Ketu": "南交点Ketu", "Venus": "金星Venus", "Sun": "太阳Sun", "Moon": "月亮Moon", "Mars": "火星Mars", "Rahu": "北交点Rahu", @@ -1085,6 +1097,16 @@ class YogaEngine: ] return target_rasi_idx in planet_ids_in_aspected_signs + def pyjhora_aspected_planets_of_raasi(h): + """Replicate PyJHora house.aspected_planets_of_the_raasi(): planets whose rasi drishti hits a target house.""" + if h is None: + return [] + target_sign = house_sign(h) + return [ + p for p in ctx.planets + if p in PLANET_INDEX and target_sign in rasi_drishti_signs_from(ctx.sign_of(p)) + ] + def rasi_drishti_signs_from(sign_name): if sign_name not in SIGNS: return [] @@ -1141,6 +1163,9 @@ class YogaEngine: # PyJHora temporary friends: 2/3/4/10/11/12 from a planet. return offset(ctx.house_of(a), ctx.house_of(b)) in [1, 2, 3, 9, 10, 11] + def natural_friend(a, b): + return a in FRIENDLY_PLANETS.get(b, []) and b in FRIENDLY_PLANETS.get(a, []) + def occupants(h): return ctx.planets_in_house(h) if h is not None else [] @@ -1222,6 +1247,7 @@ class YogaEngine: "list": list, "bool": bool, "ctx": ctx, "bindings": bindings, "rule": rule, "SIGNS": SIGNS, "SIGN_LORDS": SIGN_LORDS, + "FRIENDLY_PLANETS": FRIENDLY_PLANETS, "RAHU_KETU_OWNED_SIGN_INDEX": RAHU_KETU_OWNED_SIGN_INDEX, "EXALTATION": EXALTATION, "DEBILITATION": DEBILITATION, "PLANET_CN": PLANET_CN, "BENEFICS": BENEFICS, "MALEFICS": MALEFICS, @@ -1250,11 +1276,12 @@ class YogaEngine: "same_house": same_house, "aspect": aspect, "aspects_house": aspects_house, "graha_aspects_house": graha_aspects_house, "pyjhora_planets_aspecting_raasi": pyjhora_planets_aspecting_raasi, + "pyjhora_aspected_planets_of_raasi": pyjhora_aspected_planets_of_raasi, "rasi_drishti_signs_from": rasi_drishti_signs_from, "rasi_aspects_house": rasi_aspects_house, "rasi_aspects": rasi_aspects, "rasi_aspected_by_planets": rasi_aspected_by_planets, "house_strength": house_strength, "strong": strong, "weak": weak, - "associated": associated, "temporal_friend": temporal_friend, + "associated": associated, "temporal_friend": temporal_friend, "natural_friend": natural_friend, "occupants": occupants, "only_benefics_in_house": only_benefics_in_house, "only_malefics_in_house": only_malefics_in_house, "house_has_benefic": house_has_benefic, "house_has_malefic": house_has_malefic,