From 8da45c56b391e3b3339985af87ddc09bdff240c5 Mon Sep 17 00:00:00 2001 From: 732642856 <732642856@qq.com> Date: Fri, 5 Jun 2026 14:30:20 +0800 Subject: [PATCH] feat: add yoga logic validation and varga fixes --- CHANGELOG.md | 285 + SKILL.md | 8 +- references/planet_positions_60.json | 3065 ++++ references/standard_test_charts.json | 4700 ++++++ references/validation_logic_report.json | 5873 ++++++++ references/yoga_rules.json | 13839 ++++++++++++++++++ scripts/_compute_one_chart.py | 76 + scripts/add_high_confidence_yogas_batch1.py | 234 + scripts/benchmark_yoga_coverage.py | 245 + scripts/build_standard_test_charts.py | 104 + scripts/divisional_charts_extended.py | 11 +- scripts/generate_yoga_rules.py | 1280 ++ scripts/jyotish_engine.py | 778 +- scripts/validate_bphs_invariants.py | 432 + scripts/validate_logic_v2.py | 405 + scripts/validate_yoga_accuracy.py | 705 + scripts/validation_report.json | 2215 +++ scripts/varga.py | 20 +- scripts/yoga_engine.py | 1297 ++ 19 files changed, 34872 insertions(+), 700 deletions(-) create mode 100644 references/planet_positions_60.json create mode 100644 references/standard_test_charts.json create mode 100644 references/validation_logic_report.json create mode 100644 references/yoga_rules.json create mode 100644 scripts/_compute_one_chart.py create mode 100644 scripts/add_high_confidence_yogas_batch1.py create mode 100644 scripts/benchmark_yoga_coverage.py create mode 100644 scripts/build_standard_test_charts.py create mode 100644 scripts/generate_yoga_rules.py create mode 100644 scripts/validate_bphs_invariants.py create mode 100644 scripts/validate_logic_v2.py create mode 100644 scripts/validate_yoga_accuracy.py create mode 100644 scripts/validation_report.json create mode 100644 scripts/yoga_engine.py diff --git a/CHANGELOG.md b/CHANGELOG.md index cd489c48..ca812155 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,290 @@ # 印度占星 Skill 更新日志 +## v6.0.32(2026-06-05)—— 逻辑正确性验证框架、Dasha/Varga/Ashtakavarga 修复 + +> **目标**:从“名称覆盖率”推进到“逻辑正确性验证”,并完成 Dasha、分盘与 Ashtakavarga 的核心准确率门禁。 + +### Dasha / 分盘 / Ashtakavarga + +- `cmd_dasha()` 支持仅输入出生年月日时地点时自动计算 Moon Nakshatra,不再强制要求 `--nakshatra` 或 `--moon-lon`。 +- 修正 D9 Navamsa BPHS 算法:Movable 从本星座、Fixed 从第5星座、Dual 从第9星座开始。 +- 修正 D10 Dasamsa 算法:奇数星座从本星座、偶数星座从第9星座开始。 +- 修正 D3 Drekkana:统一 same → +4 → +8,无奇偶分支。 +- 修正 `divisional_charts_extended.py` 中 Fixed/Dual Navamsa 起点反置问题。 +- 新增 `scripts/validate_bphs_invariants.py`:18 项 BPHS/Ashtakavarga 不变量全部通过,包括 SAV=337 与各 BAV 固定总分。 + +### Yoga 逻辑正确性验证 + +- 新增 60 张名人星盘标准集与 PyJhora D1/Rasi Yoga 对比框架: + - `scripts/build_standard_test_charts.py` + - `scripts/_compute_one_chart.py` + - `scripts/validate_logic_v2.py` + - `references/planet_positions_60.json` + - `references/standard_test_charts.json` + - `references/validation_logic_report.json` +- 重要修正:标准测试集改为 PyJhora `get_yoga_details(..., divisional_chart_factor=1)`,避免把 D2/D9/D10 等分盘 Yoga 混入 D1 Yoga 逻辑验证,消除大量假阴性。 +- `validate_logic_v2.py` 新增历史 rule_id 别名归一化,避免 `bvr_*`/编号型 ID 不一致造成假性漏检。 + +### Yoga 引擎增强 + +- `yoga_engine.py` 支持 `compound_conditions` / `compound` 规则结构。 +- `custom` 规则支持多行 `if/else/for` 语句,并用 AST 捕获实际执行分支的末尾表达式。 +- 修复 custom 沙箱中 list/dict comprehension 不能访问安全全局变量的问题。 +- 新增 custom 辅助函数:`same_house`、`aspect`、`exal`、`lord_of_house`、`sign`、`check_amala_from`,并开放 `list`/`bool`/`Benefics`/`Malefics`。 +- 新增一批 PyJhora/BVR 语义型 condition type 的保守解释器,用于逐步消化批量规则中的自然语言条件。 + +### 当前验证结果 + +- Yoga 名称覆盖 benchmark:473 条规则,379 条启用;PyJhora 246 个唯一 Yoga 名称中匹配 181 个,名称覆盖率 **73.58%**。 +- D1/Rasi 逻辑验证:70 条可比规则、60 张星盘;Precision **68.25%**,Recall **50.54%**,F1 **58.08%**。 +- BPHS 分盘与 Ashtakavarga 不变量:18/18 通过。 +- Dasha / D9 Varga / Ashtakavarga CLI smoke test:通过。 + +> 说明:Yoga 逻辑验证仍有剩余 FP/FN,已从“不可验证/假阴性污染”推进到可追踪的逐规则错误清单,下一步应优先修正 FP 最高的 Adhi/Matsya/Kemadruma/Yukthi 等规则与 FN 最高的 Bhratruvriddhi/Swaveeryaddhana/Dharidhra 等规则。 + +--- + +## v6.0.31(2026-06-04)—— Yoga 引擎条件类型扩展与兼容性修复 + +> **目标**:修复 v6.0.29/v6.0.30 中遗留的引擎兼容性问题,使 322 条规则(含 59 条禁用)能被引擎正确解释,确保用户得到准确结果。 + +### Yoga 引擎(`scripts/yoga_engine.py`)增强 + +- **新增 5 种条件类型**: + - `all_in_houses`:所有指定行星都在给定宫位集合中 + - `all_in_house_sets`:所有指定行星都在多个候选宫位集合之一中 + - `occupied_houses_exact`:指定行星实际占据的宫位集合与目标集合完全一致 + - `has_planet_in_house_from`:指定行星集合中至少一颗在某参考行星的相对宫位 + - `houses_with_planets_count`:在指定宫位集合中,有多少个宫位至少包含一颗指定集合行星 + - `occupied_houses_exact_sets`:指定行星实际占据的宫位集合等于候选集合之一 + +- **兼容性修复**: + - 支持历史规则中的 `"op"` 字段(原只认 `"type"`) + - 支持历史规则中的 `"status"` 字段(`"op":"dignity"` + `"status":"exalted"` 等) + - `_resolve_binding` 兼容 `"planets"` 键(原只认 `"items"`) + - `_eval_conjunction` 兼容 `{"planets": [...]}` 写法(原只认 `{"a":..., "b":...}`) + - `_eval_parivartana` 兼容 `{"planets": [...]}` 写法 + - `_eval_dignity` 新增 `status` 字段支持(`exalted`/`own`/`debilitated`/`moolatrikona`/`strong`) + - `_resolve_role` 新增 `"visible"`/`"sun_to_saturn"` 角色 + - `_eval_in_houses` 兼容 `"planet"` 缺失时从 bindings 读取 `$planet` + +- **沙箱增强**: + - 新增内置函数:`all`/`any`/`len`/`set`/`tuple`/`sorted`/`abs`/`min`/`max`/`sum`/`range` + - 修复 `_all_lords()` 辅助函数调用错误(`ctx._lord_of` → `ctx.lord_of_house`) + +### 规则库状态 + +- **`references/yoga_rules.json`**: + - 总规则数:**322 条** + - 启用规则:**263 条** + - 禁用规则:**59 条**(v6.0.29 批量脚本生成的低置信近似规则) + - 重复 id:**0** ✅ + - JSON 有效 ✅ + +- **禁用规则说明**: + - 59 条 `yoga_001`–`yoga_059` 使用 `op` schema 且为近似定义 + - 已全部设 `"enabled": false`,并添加 `accuracy_note` + - 后续用高精度 `bvr_*` 规则逐条替换 + +### 回归验证 + +- Einstein 星盘 `detect_yogas()`:**29 个 Yoga**(基线 26 个),0 crash ✅ +- `yoga_engine.py` 语法检查:通过 ✅ +- `yoga_rules.json` JSON 检查:通过 ✅ + +### Benchmark 结果(v6.0.31) + +- 启用规则:**263 条** +- PyJHora 唯一 Yoga 名称:**246** +- 名称近似匹配:**73 / 246** +- 疑似缺失:**173** +- 名称覆盖率:**29.67%** + +> 说明:这是“名称覆盖率”,不是数学规则等价覆盖率。 + +--- + +## v6.0.30(2026-06-04)—— Yoga 覆盖率 benchmark 与版本元信息修正 + +> **目标**:在 291 条规则基础上建立可重复运行的覆盖率 benchmark,避免继续凭粗略估算判断 PyJHora 覆盖情况。 + +### 新增 benchmark + +- **新增 `scripts/benchmark_yoga_coverage.py`**: + - 读取 `references/yoga_rules.json`,统计规则总数、分类分布、strength 分布、重复 id + - 自动查找本机 PyJHora `jhora/horoscope/chart/yoga.py` + - 提取 PyJHora Yoga 函数并归一化为唯一 Yoga 名称 + - 使用名称归一化 + alias 表进行近似覆盖匹配 + - 支持 `--json` 机器可读输出与 `--show-missing N` 控制缺失列表长度 + +### 当前 benchmark 结果 + +- 当前 JSON 规则:**291 条**,declared_total_rules=291 +- 重复 id:0 ✅ +- strength 分布:强 173 / 中 85 / 弱 33 +- PyJHora yoga.py:当前环境提取 **246 个唯一 Yoga 名称** +- 名称近似匹配:78 / 246 +- 疑似缺失:168 +- 名称覆盖率:**31.71%** + +> 说明:这是“名称覆盖率”,不是数学规则等价覆盖率。此前 v6.0.29 中“约 85% 高频覆盖”的说法属于人工粗估;v6.0.30 起以 benchmark 输出为准。 + +### 元信息修正 + +- 修正 `SKILL.md` 中仍停留在 v6.0.27 / v6.0.26 的版本描述 +- 当前版本更新为 `v6.0.30-yoga-benchmark` + +--- + +## v6.0.29(2026-06-04)—— Yoga 规则库扩展 232→291 条,对齐 PyJhora + +> **目标**:基于 PyJhora yoga.py 的 239 个唯一 Yoga 名称,补齐高频标准 Yoga,达到 284+ 条。 + +### 规则扩展 + +- **`references/yoga_rules.json`**:从 232 条扩展到 **291 条**(+59 条) +- **新增高频 Yoga(精选自 B.V. Raman / PyJhora)**: + - **Nabhasa 类**:Asraya / Dala / Mala / Sarpa Nabhasa(4 条) + - **财富类**:Lakshmi / Gaja Kesari / Chandra Adhi / Vasumati / Dhan Yoga(5 条) + - **婚姻类**:Satkalatra / Kalatra Malika(2 条) + - **子女类**:Santana / Putra Malika / Suputra(3 条) + - **健康类**:Dehapushti / Sareera Soukhya(2 条) + - **智识类**:Saraswati / Budha Aditya / Vidya(3 条) + - **地位类**:Gaja Kesari(Classic) / Jaya / Indra / Hari / Hara / Brahma(6 条) + - **特殊格局**:Chamara / Chatra / Kuta / Nauka / Yava / Go / Vihaga / Sakata / Vajra / Yoopa(10 条) + - **凶 Yoga**:Andha / Arishta(Classic) / Kemadruma(Classic) / Durmukha / Kapata(5 条) + - **精神类**:Siva / Vishnu / Harihara Brahma(3 条) + - **兄弟姐妹**:Bhratru Vriddhi / Eka Putra(2 条) + - **事业类**:Parakrama / Vikrama Malika / Karma Malika(3 条) + - **旅行类**:Sada Sanchara / Vahana(2 条) + - **健康凶**:Rogagrastha / Kshaya Roga(2 条) + - **日月伴星**:Ubhayachari / Vesi / Vosi / Nipuna / Duradhara / Sunaphaa / Anaphaa(7 条) + +### PyJhora 对比 + +- PyJhora yoga.py:490 个函数 → 239 个唯一 Yoga 名称 +- Skill 当前:291 条规则,覆盖约 **85%** 高频标准 Yoga +- 剩余约 50 条为低频/边缘 Yoga(如 `jananatpurvam_pitru_marana` 出生前父亡等) + +### 回归验证 + +- Einstein 星盘 `detect_yogas()`:检测到 **26 个 Yoga**,0 crash ✅ +- 规则总数:291 条,无重复 id,JSON 有效 ✅ + +--- + +## v6.0.28(2026-06-04)—— Yoga 规则库系统扩展 159→232 条 + +> **目标**:在 v6.0.26/6.0.27 架构重构基础上,系统性补齐高频 Yoga 规则,向 PyJHora 规则库靠近。 + +### 规则扩展 + +- **`references/yoga_rules.json`**:从 159 条扩展到 **232 条**(+73 条) +- **新增分类**: + - `vipareeta`:3 条(Vipareeta Raja Yoga 变体) + - `chapa`:3 条(Dhanus/Chatra/Chapa Yoga) + - `shiva`:3 条(Shiva/Shambhu/Maheshvara Yoga) + - `vedha`:2 条(Vedha Yoga 变体) + - `nativity`:14 条(出生时刻特征类 Yoga) + - `dina`:3 条(Janardana/Dina/Adi Yoga) + - `sdness`:5 条(健康/精神类 Yoga) + - `composite`:5 条(复合条件 Yoga) +- **大规模扩展现有分类**: + - `raja`:+19 条(含 Chandra-Mars/Lagna-Venus 组合、Ruchaka+Bhaskara 等) + - `dhana`:+10 条(含 2 宫主/11 宫主/9 宫主互相关联变体) + - `kalatra`:+9 条(含 Venus+7 宫主/金星受克/金星宗教联结等) + - `putra`:+9 条(含 5 宫主+木星/凯龙+5 宫/木星衰落变体) + - `ayur`:+7 条(含 8 宫主+土星/火星+8 宫/月亮+土星等) + - `nabhasa`:+9 条(新增 Additional Nabhasa 组) + - `durbhaga`:+3 条(Ganda/Raja/Daridra 变体) + - `auspicious`:+5 条(Shubha/Ganesha/Vishnu 变体) + - `conjunction`:+5 条(日月水/金火/木土/火木/日月木组合) + - `mahapurusha`:+2 条(Sasha/Vasumati 变体) + - `special`:+3 孝顺/智慧/信心 Yoga + +### 引擎增强 + +- `yoga_engine.py` `_eval_custom` 沙箱:新增 `is_exalted`/`is_own_sign`/`is_debilitated`/`is_moolatrikona`/`is_kendra`/`is_trikona`/`is_dusthana`/`is_upachaya` 等别名函数 +- 新增辅助函数 `lords_of()`/`planets_list()`/`all_lords()`/`kendra_lords_list()`/`trikona_lords_list()` + +### 数据质量 + +- **strength 归一化**:将所有值统一为 `强/中/弱` 三种(原混杂的 `极强/中强/吉/凶/中凶/大凶` 全部映射) +- **JSON 有效性**:232 条,无重复 id,schema v1.0 ✅ + +### 回归验证 + +- Einstein 星盘 `detect_yogas()`:检测到 **26 个 Yoga**(基线 9+),0 crash +- `cmd_yoga()` CLI 接口:两种输入模式均正常 + +--- + +## v6.0.26(2026-06-04)—— Yoga 数据驱动规则引擎重构 + +> **目标**:先完成架构重构,再系统补规则。将 `cmd_yoga()` 从硬编码检测迁移到 JSON 规则库 + 通用条件解释器。 + +### 架构变更 + +- **新增 `scripts/yoga_engine.py`**:数据驱动 Yoga 规则引擎 + - `YogaContext` 封装星盘数据查询接口 + - `YogaEngine` 加载 JSON 规则并解释执行条件树 + - 支持 `and/or/not/same_house/in_houses/dignity/houses_occupied/adjacent_houses/degree_gap/parivartana/any_pair/all_planets/custom` 等条件类型 +- **新增 `references/yoga_rules.json`**:90 条启用规则,schema v1.0 +- **新增 `scripts/generate_yoga_rules.py`**:规则生成辅助脚本 + +### `cmd_yoga()` 改造 + +- 替换为调用 `yoga_engine.detect_yogas()`,保持旧接口兼容 +- 新增出生信息直算支持:`yoga --year --month --day --hour --minute --lat --lon --tz` +- `--planets` 支持第4段星座内度数 +- full-reading / audit 同步传入度数 + +### 回归验证 + +- 语法检查通过,Yoga CLI smoke test 通过 +- Einstein 星盘 `full-reading` 回归:45 模块,0 errors,Yoga 模块检测到 9 个 Yoga + +### 后续 + +- 在新架构上继续系统补规则到 150+ / 200+ +- 补齐 PyJHora/BVR 中高频 Yoga 变体 + +## v6.0.27(2026-06-04)—— Yoga 规则库扩展 90→159 + +> **目标**:在数据驱动架构上系统补充 Yoga 规则到 150+ 条。 + +### 新增规则(69 条,总计 159 条) + +| 分类 | 新增 | 累计 | +|------|------|------| +| raja | +12 | 24 | +| dhana | +6 | 10 | +| nabhasa | +12 | 20 | +| durbhaga | +6 | 12 | +| conjunction | +7 | 16 | +| putra(新分类) | +5 | 5 | +| kalatra(新分类) | +5 | 5 | +| ayur(新分类) | +4 | 4 | +| surya | +2 | 5 | +| auspicious | +4 | 20 | +| special | +3 | 14 | + +### 引擎改进 + +- `yoga_engine.py` `_eval_custom` 沙箱扩展: + - 新增函数别名:`is_exalted`/`is_own_sign`/`is_debilitated`/`is_moolatrikona`/`is_kendra`/`is_trikona`/`is_dusthana`/`is_upachaya` + - 新增辅助函数:`lords_of()`/`planets_list()`/`all_lords()`/`kendra_lords_list()`/`trikona_lords_list()` + - 修复 `lord()` 别名正确指向 `ctx.lord_of_house()` + +### 回归验证 + +- 159 条规则全部加载成功 +- Einstein `full-reading` 回归:45 模块,0 errors +- Yoga 检测结果与 v6.0.26 一致(9 个 Yoga) + + +--- + ## v6.0.25(2026-06-04)—— Einstein 验证 Bug 修复 > **目标**:基于爱因斯坦星盘的 side-by-side 验证发现 4 个关键 Bug,全部修复。 diff --git a/SKILL.md b/SKILL.md index 8bc5c9af..6d879b42 100644 --- a/SKILL.md +++ b/SKILL.md @@ -1,6 +1,6 @@ --- name: jyotish-vedic-astrology -version: 6.0.25 +version: 6.0.32 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.25-bugfix | **详细变更**:`CHANGELOG.md` +> **版本**:v6.0.32-logic-validation-varga-fix | **详细变更**:`CHANGELOG.md` --- @@ -301,9 +301,9 @@ $PYTHON $SCRIPT <子命令> [参数] --- -**版本**:v6.0.23-full-reading-regression +**版本**:v6.0.30-yoga-benchmark **创建日期**:2026-04-20 -**最后更新**:2026-06-04(v6.0.23 修复 full-reading 残余模块接入错误,实盘抽查 errors=0) +**最后更新**:2026-06-04(v6.0.30 新增 Yoga 覆盖率 benchmark;当前291条JSON规则,PyJHora名称覆盖率以 benchmark 输出为准) --- diff --git a/references/planet_positions_60.json b/references/planet_positions_60.json new file mode 100644 index 00000000..d2b46fdb --- /dev/null +++ b/references/planet_positions_60.json @@ -0,0 +1,3065 @@ +{ + "schema_version": "1.0", + "charts": [ + { + "name": "Albert Einstein", + "planets": { + "Sun": { + "sign": "Aquarius", + "house": 4, + "degree": 29.964926916305274 + }, + "Moon": { + "sign": "Scorpio", + "house": 1, + "degree": 14.559415673755609 + }, + "Mars": { + "sign": "Capricorn", + "house": 3, + "degree": 3.5049841527608123 + }, + "Mercury": { + "sign": "Pisces", + "house": 5, + "degree": 9.136851119603818 + }, + "Jupiter": { + "sign": "Aquarius", + "house": 4, + "degree": 4.322189889272238 + }, + "Venus": { + "sign": "Pisces", + "house": 5, + "degree": 23.330963619813303 + }, + "Saturn": { + "sign": "Pisces", + "house": 5, + "degree": 11.078942437881949 + }, + "Rahu": { + "sign": "Capricorn", + "house": 3, + "degree": 9.683168419528215 + }, + "Ketu": { + "sign": "Cancer", + "house": 9, + "degree": 9.683168419528215 + } + }, + "ascendant": "Scorpio" + }, + { + "name": "Marie Curie", + "planets": { + "Sun": { + "sign": "Libra", + "house": 3, + "degree": 21.20337634919366 + }, + "Moon": { + "sign": "Aquarius", + "house": 7, + "degree": 17.5076800949999 + }, + "Mars": { + "sign": "Scorpio", + "house": 4, + "degree": 6.3861213451124 + }, + "Mercury": { + "sign": "Scorpio", + "house": 4, + "degree": 13.47892556640636 + }, + "Jupiter": { + "sign": "Aquarius", + "house": 7, + "degree": 5.0907949627600715 + }, + "Venus": { + "sign": "Scorpio", + "house": 4, + "degree": 2.0885767209974233 + }, + "Saturn": { + "sign": "Scorpio", + "house": 4, + "degree": 2.3325895109023236 + }, + "Rahu": { + "sign": "Leo", + "house": 1, + "degree": 19.47076080344965 + }, + "Ketu": { + "sign": "Aquarius", + "house": 7, + "degree": 19.47076080344965 + } + }, + "ascendant": "Leo" + }, + { + "name": "Nikola Tesla", + "planets": { + "Sun": { + "sign": "Gemini", + "house": 3, + "degree": 25.085374401725787 + }, + "Moon": { + "sign": "Virgo", + "house": 6, + "degree": 21.287304748072557 + }, + "Mars": { + "sign": "Virgo", + "house": 6, + "degree": 26.215731176773318 + }, + "Mercury": { + "sign": "Gemini", + "house": 3, + "degree": 5.38619124258949 + }, + "Jupiter": { + "sign": "Pisces", + "house": 12, + "degree": 15.857569229802948 + }, + "Venus": { + "sign": "Gemini", + "house": 3, + "degree": 22.11408137540718 + }, + "Saturn": { + "sign": "Gemini", + "house": 3, + "degree": 12.833168357448784 + }, + "Rahu": { + "sign": "Pisces", + "house": 12, + "degree": 27.3728398163351 + }, + "Ketu": { + "sign": "Virgo", + "house": 6, + "degree": 27.372839816335045 + } + }, + "ascendant": "Aries" + }, + { + "name": "Stephen Hawking", + "planets": { + "Sun": { + "sign": "Sagittarius", + "house": 4, + "degree": 23.155022481331343 + }, + "Moon": { + "sign": "Leo", + "house": 12, + "degree": 25.140179739722214 + }, + "Mars": { + "sign": "Aries", + "house": 8, + "degree": 4.165446045322873 + }, + "Mercury": { + "sign": "Capricorn", + "house": 5, + "degree": 3.3742330410175896 + }, + "Jupiter": { + "sign": "Taurus", + "house": 9, + "degree": 18.794677842626584 + }, + "Venus": { + "sign": "Capricorn", + "house": 5, + "degree": 26.75726129235818 + }, + "Saturn": { + "sign": "Aries", + "house": 8, + "degree": 27.921670532068443 + }, + "Rahu": { + "sign": "Leo", + "house": 12, + "degree": 21.03862186674621 + }, + "Ketu": { + "sign": "Aquarius", + "house": 6, + "degree": 21.03862186674621 + } + }, + "ascendant": "Virgo" + }, + { + "name": "Charles Darwin", + "planets": { + "Sun": { + "sign": "Aquarius", + "house": 5, + "degree": 0.8537961347334431 + }, + "Moon": { + "sign": "Sagittarius", + "house": 3, + "degree": 27.522900187034793 + }, + "Mars": { + "sign": "Libra", + "house": 1, + "degree": 3.3189598389197954 + }, + "Mercury": { + "sign": "Aquarius", + "house": 5, + "degree": 17.4499802065871 + }, + "Jupiter": { + "sign": "Aquarius", + "house": 5, + "degree": 29.895090805881637 + }, + "Venus": { + "sign": "Pisces", + "house": 6, + "degree": 14.79076063443489 + }, + "Saturn": { + "sign": "Scorpio", + "house": 2, + "degree": 11.042079821436488 + }, + "Rahu": { + "sign": "Libra", + "house": 1, + "degree": 14.175573937425895 + }, + "Ketu": { + "sign": "Aries", + "house": 7, + "degree": 14.175573937425895 + } + }, + "ascendant": "Libra" + }, + { + "name": "Thomas Edison", + "planets": { + "Sun": { + "sign": "Capricorn", + "house": 4, + "degree": 29.297479804726606 + }, + "Moon": { + "sign": "Sagittarius", + "house": 3, + "degree": 1.1471376251083143 + }, + "Mars": { + "sign": "Sagittarius", + "house": 3, + "degree": 7.876496665562598 + }, + "Mercury": { + "sign": "Capricorn", + "house": 4, + "degree": 25.146561364062165 + }, + "Jupiter": { + "sign": "Taurus", + "house": 8, + "degree": 14.187779750406875 + }, + "Venus": { + "sign": "Aquarius", + "house": 5, + "degree": 12.939755804632114 + }, + "Saturn": { + "sign": "Aquarius", + "house": 5, + "degree": 9.368174668115898 + }, + "Rahu": { + "sign": "Virgo", + "house": 12, + "degree": 28.10506931218586 + }, + "Ketu": { + "sign": "Pisces", + "house": 6, + "degree": 28.105069312185833 + } + }, + "ascendant": "Libra" + }, + { + "name": "Alexander Fleming", + "planets": { + "Sun": { + "sign": "Cancer", + "house": 3, + "degree": 20.53440649914178 + }, + "Moon": { + "sign": "Scorpio", + "house": 7, + "degree": 26.242263865706036 + }, + "Mars": { + "sign": "Taurus", + "house": 1, + "degree": 8.25022636844065 + }, + "Mercury": { + "sign": "Cancer", + "house": 3, + "degree": 1.4925838373702902 + }, + "Jupiter": { + "sign": "Taurus", + "house": 1, + "degree": 0.652462170330729 + }, + "Venus": { + "sign": "Gemini", + "house": 2, + "degree": 6.526206813278478 + }, + "Saturn": { + "sign": "Aries", + "house": 12, + "degree": 19.039781184966003 + }, + "Rahu": { + "sign": "Scorpio", + "house": 7, + "degree": 23.535358490957947 + }, + "Ketu": { + "sign": "Taurus", + "house": 1, + "degree": 23.535358490957947 + } + }, + "ascendant": "Taurus" + }, + { + "name": "Max Planck", + "planets": { + "Sun": { + "sign": "Aries", + "house": 6, + "degree": 9.734241308345833 + }, + "Moon": { + "sign": "Leo", + "house": 10, + "degree": 9.324170152752117 + }, + "Mars": { + "sign": "Scorpio", + "house": 1, + "degree": 8.488356874625737 + }, + "Mercury": { + "sign": "Aries", + "house": 6, + "degree": 29.45470510123613 + }, + "Jupiter": { + "sign": "Aries", + "house": 6, + "degree": 29.592291433529347 + }, + "Venus": { + "sign": "Aries", + "house": 6, + "degree": 23.227028318875032 + }, + "Saturn": { + "sign": "Gemini", + "house": 8, + "degree": 29.488240846852065 + }, + "Rahu": { + "sign": "Aquarius", + "house": 4, + "degree": 24.220272136466576 + }, + "Ketu": { + "sign": "Leo", + "house": 10, + "degree": 24.220272136466576 + } + }, + "ascendant": "Scorpio" + }, + { + "name": "Niels Bohr", + "planets": { + "Sun": { + "sign": "Virgo", + "house": 3, + "degree": 20.704240406335856 + }, + "Moon": { + "sign": "Virgo", + "house": 3, + "degree": 3.2510762339489077 + }, + "Mars": { + "sign": "Cancer", + "house": 1, + "degree": 18.874184496370418 + }, + "Mercury": { + "sign": "Virgo", + "house": 3, + "degree": 13.645738753397524 + }, + "Jupiter": { + "sign": "Leo", + "house": 2, + "degree": 29.22706644274689 + }, + "Venus": { + "sign": "Scorpio", + "house": 5, + "degree": 0.14314760788224135 + }, + "Saturn": { + "sign": "Gemini", + "house": 12, + "degree": 15.084254423068941 + }, + "Rahu": { + "sign": "Virgo", + "house": 3, + "degree": 2.4069456470164994 + }, + "Ketu": { + "sign": "Pisces", + "house": 9, + "degree": 2.406945647016528 + } + }, + "ascendant": "Cancer" + }, + { + "name": "Richard Feynman", + "planets": { + "Sun": { + "sign": "Aries", + "house": 4, + "degree": 26.090860616100247 + }, + "Moon": { + "sign": "Taurus", + "house": 5, + "degree": 5.135576540294224 + }, + "Mars": { + "sign": "Leo", + "house": 8, + "degree": 21.64110832302279 + }, + "Mercury": { + "sign": "Aries", + "house": 4, + "degree": 6.810124291585792 + }, + "Jupiter": { + "sign": "Taurus", + "house": 5, + "degree": 22.09015042022841 + }, + "Venus": { + "sign": "Pisces", + "house": 3, + "degree": 11.013134028085858 + }, + "Saturn": { + "sign": "Cancer", + "house": 7, + "degree": 14.901197692208072 + }, + "Rahu": { + "sign": "Scorpio", + "house": 11, + "degree": 28.896703957180364 + }, + "Ketu": { + "sign": "Taurus", + "house": 5, + "degree": 28.896703957180364 + } + }, + "ascendant": "Capricorn" + }, + { + "name": "Mahatma Gandhi", + "planets": { + "Sun": { + "sign": "Virgo", + "house": 4, + "degree": 15.685214056526235 + }, + "Moon": { + "sign": "Cancer", + "house": 2, + "degree": 22.235599493271266 + }, + "Mars": { + "sign": "Libra", + "house": 5, + "degree": 25.256944034643254 + }, + "Mercury": { + "sign": "Libra", + "house": 5, + "degree": 10.64383458745408 + }, + "Jupiter": { + "sign": "Aries", + "house": 11, + "degree": 27.278092725172126 + }, + "Venus": { + "sign": "Libra", + "house": 5, + "degree": 23.123683615296585 + }, + "Saturn": { + "sign": "Scorpio", + "house": 6, + "degree": 19.424835123361788 + }, + "Rahu": { + "sign": "Cancer", + "house": 2, + "degree": 12.784270532052616 + }, + "Ketu": { + "sign": "Capricorn", + "house": 8, + "degree": 12.78427053205263 + } + }, + "ascendant": "Gemini" + }, + { + "name": "Jawaharlal Nehru", + "planets": { + "Sun": { + "sign": "Libra", + "house": 4, + "degree": 28.41683610388972 + }, + "Moon": { + "sign": "Cancer", + "house": 1, + "degree": 5.59187142626017 + }, + "Mars": { + "sign": "Virgo", + "house": 3, + "degree": 8.52287487233093 + }, + "Mercury": { + "sign": "Libra", + "house": 4, + "degree": 14.75940470454023 + }, + "Jupiter": { + "sign": "Sagittarius", + "house": 6, + "degree": 14.109659316042467 + }, + "Venus": { + "sign": "Libra", + "house": 4, + "degree": 5.28207268771294 + }, + "Saturn": { + "sign": "Leo", + "house": 2, + "degree": 9.862054935385942 + }, + "Rahu": { + "sign": "Gemini", + "house": 12, + "degree": 10.532994561335073 + }, + "Ketu": { + "sign": "Sagittarius", + "house": 6, + "degree": 10.532994561335073 + } + }, + "ascendant": "Cancer" + }, + { + "name": "Narendra Modi", + "planets": { + "Sun": { + "sign": "Leo", + "house": 3, + "degree": 29.267003614161297 + }, + "Moon": { + "sign": "Scorpio", + "house": 6, + "degree": 1.3243557205028935 + }, + "Mars": { + "sign": "Libra", + "house": 5, + "degree": 29.741867418100753 + }, + "Mercury": { + "sign": "Virgo", + "house": 4, + "degree": 0.3782968445438257 + }, + "Jupiter": { + "sign": "Aquarius", + "house": 9, + "degree": 5.75918325553539 + }, + "Venus": { + "sign": "Leo", + "house": 3, + "degree": 14.24820061858128 + }, + "Saturn": { + "sign": "Leo", + "house": 3, + "degree": 28.718486018705505 + }, + "Rahu": { + "sign": "Pisces", + "house": 10, + "degree": 4.322131835629932 + }, + "Ketu": { + "sign": "Virgo", + "house": 4, + "degree": 4.322131835629989 + } + }, + "ascendant": "Gemini" + }, + { + "name": "Indira Gandhi", + "planets": { + "Sun": { + "sign": "Scorpio", + "house": 4, + "degree": 2.272415620360988 + }, + "Moon": { + "sign": "Sagittarius", + "house": 5, + "degree": 21.431237720824527 + }, + "Mars": { + "sign": "Leo", + "house": 1, + "degree": 15.008125924258849 + }, + "Mercury": { + "sign": "Scorpio", + "house": 4, + "degree": 10.869564632325734 + }, + "Jupiter": { + "sign": "Taurus", + "house": 10, + "degree": 14.242721349195321 + }, + "Venus": { + "sign": "Sagittarius", + "house": 5, + "degree": 19.089494968050133 + }, + "Saturn": { + "sign": "Cancer", + "house": 12, + "degree": 20.892383591593685 + }, + "Rahu": { + "sign": "Sagittarius", + "house": 5, + "degree": 8.297449293382556 + }, + "Ketu": { + "sign": "Gemini", + "house": 11, + "degree": 8.297449293382556 + } + }, + "ascendant": "Leo" + }, + { + "name": "Winston Churchill", + "planets": { + "Sun": { + "sign": "Scorpio", + "house": 4, + "degree": 14.670267756162048 + }, + "Moon": { + "sign": "Leo", + "house": 1, + "degree": 5.837078264324589 + }, + "Mars": { + "sign": "Virgo", + "house": 2, + "degree": 23.52727171548588 + }, + "Mercury": { + "sign": "Libra", + "house": 3, + "degree": 24.554450077647488 + }, + "Jupiter": { + "sign": "Libra", + "house": 3, + "degree": 0.571156123638076 + }, + "Venus": { + "sign": "Scorpio", + "house": 4, + "degree": 29.064125653149432 + }, + "Saturn": { + "sign": "Capricorn", + "house": 6, + "degree": 16.602028717632322 + }, + "Rahu": { + "sign": "Aries", + "house": 9, + "degree": 2.8585598110692536 + }, + "Ketu": { + "sign": "Libra", + "house": 3, + "degree": 2.858559811069256 + } + }, + "ascendant": "Leo" + }, + { + "name": "John F. Kennedy", + "planets": { + "Sun": { + "sign": "Taurus", + "house": 4, + "degree": 13.658704778357745 + }, + "Moon": { + "sign": "Leo", + "house": 7, + "degree": 16.14027588678377 + }, + "Mars": { + "sign": "Aries", + "house": 3, + "degree": 24.394301786574456 + }, + "Mercury": { + "sign": "Aries", + "house": 3, + "degree": 27.001580579072836 + }, + "Jupiter": { + "sign": "Aries", + "house": 3, + "degree": 29.318447777145686 + }, + "Venus": { + "sign": "Taurus", + "house": 4, + "degree": 22.398243542178626 + }, + "Saturn": { + "sign": "Cancer", + "house": 6, + "degree": 3.513936210908909 + }, + "Rahu": { + "sign": "Sagittarius", + "house": 11, + "degree": 17.66245159313104 + }, + "Ketu": { + "sign": "Gemini", + "house": 5, + "degree": 17.66245159313104 + } + }, + "ascendant": "Aquarius" + }, + { + "name": "Nelson Mandela", + "planets": { + "Sun": { + "sign": "Cancer", + "house": 5, + "degree": 0.8765054475888405 + }, + "Moon": { + "sign": "Libra", + "house": 8, + "degree": 19.082206142907523 + }, + "Mars": { + "sign": "Virgo", + "house": 7, + "degree": 18.634515955659197 + }, + "Mercury": { + "sign": "Cancer", + "house": 5, + "degree": 21.530187341962417 + }, + "Jupiter": { + "sign": "Gemini", + "house": 4, + "degree": 7.431584438379602 + }, + "Venus": { + "sign": "Taurus", + "house": 3, + "degree": 28.24499739056077 + }, + "Saturn": { + "sign": "Cancer", + "house": 5, + "degree": 21.35571078568792 + }, + "Rahu": { + "sign": "Scorpio", + "house": 9, + "degree": 28.20998031426629 + }, + "Ketu": { + "sign": "Taurus", + "house": 3, + "degree": 28.209980314266318 + } + }, + "ascendant": "Pisces" + }, + { + "name": "Abraham Lincoln", + "planets": { + "Sun": { + "sign": "Aquarius", + "house": 5, + "degree": 1.0643426073273758 + }, + "Moon": { + "sign": "Capricorn", + "house": 4, + "degree": 0.45675292463806727 + }, + "Mars": { + "sign": "Libra", + "house": 1, + "degree": 3.3591929749643725 + }, + "Mercury": { + "sign": "Aquarius", + "house": 5, + "degree": 17.763464527794156 + }, + "Jupiter": { + "sign": "Aquarius", + "house": 5, + "degree": 29.942469424622743 + }, + "Venus": { + "sign": "Pisces", + "house": 6, + "degree": 15.02790828801318 + }, + "Saturn": { + "sign": "Scorpio", + "house": 2, + "degree": 11.052174610399334 + }, + "Rahu": { + "sign": "Libra", + "house": 1, + "degree": 14.141007359138428 + }, + "Ketu": { + "sign": "Aries", + "house": 7, + "degree": 14.141007359138428 + } + }, + "ascendant": "Libra" + }, + { + "name": "Margaret Thatcher", + "planets": { + "Sun": { + "sign": "Virgo", + "house": 3, + "degree": 25.43687872904661 + }, + "Moon": { + "sign": "Leo", + "house": 2, + "degree": 0.4295167566769891 + }, + "Mars": { + "sign": "Virgo", + "house": 3, + "degree": 15.528654965603295 + }, + "Mercury": { + "sign": "Virgo", + "house": 3, + "degree": 29.471905550325715 + }, + "Jupiter": { + "sign": "Sagittarius", + "house": 6, + "degree": 20.75333507049885 + }, + "Venus": { + "sign": "Scorpio", + "house": 5, + "degree": 7.943736309832445 + }, + "Saturn": { + "sign": "Libra", + "house": 4, + "degree": 20.03840798132859 + }, + "Rahu": { + "sign": "Cancer", + "house": 1, + "degree": 7.8468158384849005 + }, + "Ketu": { + "sign": "Capricorn", + "house": 7, + "degree": 7.846815838484872 + } + }, + "ascendant": "Cancer" + }, + { + "name": "Barack Obama", + "planets": { + "Sun": { + "sign": "Cancer", + "house": 4, + "degree": 17.577801786466495 + }, + "Moon": { + "sign": "Aries", + "house": 1, + "degree": 28.80636319788402 + }, + "Mars": { + "sign": "Leo", + "house": 5, + "degree": 27.87955850418689 + }, + "Mercury": { + "sign": "Cancer", + "house": 4, + "degree": 6.532673681300608 + }, + "Jupiter": { + "sign": "Capricorn", + "house": 10, + "degree": 6.754946699286791 + }, + "Venus": { + "sign": "Gemini", + "house": 3, + "degree": 6.678899767484268 + }, + "Saturn": { + "sign": "Capricorn", + "house": 10, + "degree": 1.1814376764972963 + }, + "Rahu": { + "sign": "Leo", + "house": 5, + "degree": 3.1153732104050675 + }, + "Ketu": { + "sign": "Aquarius", + "house": 11, + "degree": 3.115373210405096 + } + }, + "ascendant": "Aries" + }, + { + "name": "Rabindranath Tagore", + "planets": { + "Sun": { + "sign": "Aries", + "house": 4, + "degree": 23.359963077967322 + }, + "Moon": { + "sign": "Pisces", + "house": 3, + "degree": 18.438793345438683 + }, + "Mars": { + "sign": "Taurus", + "house": 5, + "degree": 29.205583621190414 + }, + "Mercury": { + "sign": "Aries", + "house": 4, + "degree": 6.781281379171495 + }, + "Jupiter": { + "sign": "Cancer", + "house": 7, + "degree": 25.05789794033086 + }, + "Venus": { + "sign": "Aries", + "house": 4, + "degree": 22.06031112305663 + }, + "Saturn": { + "sign": "Leo", + "house": 8, + "degree": 9.85966003047622 + }, + "Rahu": { + "sign": "Sagittarius", + "house": 12, + "degree": 22.69342386868601 + }, + "Ketu": { + "sign": "Gemini", + "house": 6, + "degree": 22.69342386868601 + } + }, + "ascendant": "Capricorn" + }, + { + "name": "Ludwig van Beethoven", + "planets": { + "Sun": { + "sign": "Sagittarius", + "house": 5, + "degree": 3.6052062589072023 + }, + "Moon": { + "sign": "Sagittarius", + "house": 5, + "degree": 1.5564025268995465 + }, + "Mars": { + "sign": "Gemini", + "house": 11, + "degree": 0.7981614886396358 + }, + "Mercury": { + "sign": "Sagittarius", + "house": 5, + "degree": 1.7341808992363497 + }, + "Jupiter": { + "sign": "Sagittarius", + "house": 5, + "degree": 11.797298661443278 + }, + "Venus": { + "sign": "Capricorn", + "house": 6, + "degree": 5.277022704214062 + }, + "Saturn": { + "sign": "Cancer", + "house": 12, + "degree": 24.235506566684606 + }, + "Rahu": { + "sign": "Scorpio", + "house": 4, + "degree": 4.9311102666680995 + }, + "Ketu": { + "sign": "Taurus", + "house": 10, + "degree": 4.9311102666680995 + } + }, + "ascendant": "Leo" + }, + { + "name": "Wolfgang Mozart", + "planets": { + "Sun": { + "sign": "Capricorn", + "house": 4, + "degree": 15.20396840127404 + }, + "Moon": { + "sign": "Scorpio", + "house": 2, + "degree": 14.329652782002114 + }, + "Mars": { + "sign": "Gemini", + "house": 9, + "degree": 9.104888207250141 + }, + "Mercury": { + "sign": "Capricorn", + "house": 4, + "degree": 15.370519709101188 + }, + "Jupiter": { + "sign": "Virgo", + "house": 12, + "degree": 27.166452604526683 + }, + "Venus": { + "sign": "Aquarius", + "house": 5, + "degree": 6.953180522764853 + }, + "Saturn": { + "sign": "Capricorn", + "house": 4, + "degree": 10.562753691526382 + }, + "Rahu": { + "sign": "Leo", + "house": 11, + "degree": 20.18167497570886 + }, + "Ketu": { + "sign": "Aquarius", + "house": 5, + "degree": 20.18167497570886 + } + }, + "ascendant": "Libra" + }, + { + "name": "Pablo Picasso", + "planets": { + "Sun": { + "sign": "Libra", + "house": 4, + "degree": 8.64558958369912 + }, + "Moon": { + "sign": "Scorpio", + "house": 5, + "degree": 1.8478759327644525 + }, + "Mars": { + "sign": "Gemini", + "house": 12, + "degree": 18.994508089402572 + }, + "Mercury": { + "sign": "Scorpio", + "house": 5, + "degree": 0.8438853800761308 + }, + "Jupiter": { + "sign": "Taurus", + "house": 11, + "degree": 0.5783594353650372 + }, + "Venus": { + "sign": "Virgo", + "house": 3, + "degree": 10.233702096100444 + }, + "Saturn": { + "sign": "Aries", + "house": 10, + "degree": 16.43763473746694 + }, + "Rahu": { + "sign": "Scorpio", + "house": 5, + "degree": 16.316523147963665 + }, + "Ketu": { + "sign": "Taurus", + "house": 11, + "degree": 16.316523147963665 + } + }, + "ascendant": "Cancer" + }, + { + "name": "Vincent van Gogh", + "planets": { + "Sun": { + "sign": "Pisces", + "house": 5, + "degree": 16.520202825536785 + }, + "Moon": { + "sign": "Scorpio", + "house": 1, + "degree": 21.50298623305568 + }, + "Mars": { + "sign": "Pisces", + "house": 5, + "degree": 3.0929202592399747 + }, + "Mercury": { + "sign": "Aries", + "house": 6, + "degree": 2.8228551935458013 + }, + "Jupiter": { + "sign": "Sagittarius", + "house": 2, + "degree": 1.566593849261551 + }, + "Venus": { + "sign": "Pisces", + "house": 5, + "degree": 4.813221704378009 + }, + "Saturn": { + "sign": "Aries", + "house": 6, + "degree": 23.226934485161145 + }, + "Rahu": { + "sign": "Taurus", + "house": 7, + "degree": 29.787613948367287 + }, + "Ketu": { + "sign": "Scorpio", + "house": 1, + "degree": 29.787613948367294 + } + }, + "ascendant": "Scorpio" + }, + { + "name": "Charlie Chaplin", + "planets": { + "Sun": { + "sign": "Aries", + "house": 6, + "degree": 3.002748895083001 + }, + "Moon": { + "sign": "Libra", + "house": 12, + "degree": 3.9571252724819885 + }, + "Mars": { + "sign": "Aries", + "house": 6, + "degree": 19.790194288568255 + }, + "Mercury": { + "sign": "Pisces", + "house": 5, + "degree": 23.002277610948795 + }, + "Jupiter": { + "sign": "Sagittarius", + "house": 2, + "degree": 14.958478319908039 + }, + "Venus": { + "sign": "Aries", + "house": 6, + "degree": 25.150266323176268 + }, + "Saturn": { + "sign": "Cancer", + "house": 9, + "degree": 20.23719688294294 + }, + "Rahu": { + "sign": "Gemini", + "house": 8, + "degree": 22.397584602210316 + }, + "Ketu": { + "sign": "Sagittarius", + "house": 2, + "degree": 22.397584602210316 + } + }, + "ascendant": "Scorpio" + }, + { + "name": "Elvis Presley", + "planets": { + "Sun": { + "sign": "Sagittarius", + "house": 4, + "degree": 23.206333003159045 + }, + "Moon": { + "sign": "Aquarius", + "house": 6, + "degree": 5.369067028847553 + }, + "Mars": { + "sign": "Virgo", + "house": 1, + "degree": 18.919467847019348 + }, + "Mercury": { + "sign": "Sagittarius", + "house": 4, + "degree": 28.167466085582817 + }, + "Jupiter": { + "sign": "Libra", + "house": 2, + "degree": 24.207445512184535 + }, + "Venus": { + "sign": "Capricorn", + "house": 5, + "degree": 5.300266376139803 + }, + "Saturn": { + "sign": "Aquarius", + "house": 6, + "degree": 1.8922893025807639 + }, + "Rahu": { + "sign": "Capricorn", + "house": 5, + "degree": 7.296344235431093 + }, + "Ketu": { + "sign": "Cancer", + "house": 11, + "degree": 7.296344235431093 + } + }, + "ascendant": "Virgo" + }, + { + "name": "Michael Jackson", + "planets": { + "Sun": { + "sign": "Leo", + "house": 4, + "degree": 11.196992751870965 + }, + "Moon": { + "sign": "Aquarius", + "house": 10, + "degree": 10.77051350858818 + }, + "Mars": { + "sign": "Aries", + "house": 12, + "degree": 27.504980435296716 + }, + "Mercury": { + "sign": "Leo", + "house": 4, + "degree": 1.6383520997838872 + }, + "Jupiter": { + "sign": "Libra", + "house": 6, + "degree": 4.241365081132983 + }, + "Venus": { + "sign": "Cancer", + "house": 3, + "degree": 21.91709346429255 + }, + "Saturn": { + "sign": "Scorpio", + "house": 7, + "degree": 24.95285139587085 + }, + "Rahu": { + "sign": "Virgo", + "house": 5, + "degree": 29.01997817411808 + }, + "Ketu": { + "sign": "Pisces", + "house": 11, + "degree": 29.01997817411808 + } + }, + "ascendant": "Taurus" + }, + { + "name": "A.R. Rahman", + "planets": { + "Sun": { + "sign": "Sagittarius", + "house": 4, + "degree": 20.46150092432572 + }, + "Moon": { + "sign": "Libra", + "house": 2, + "degree": 18.577256040034655 + }, + "Mars": { + "sign": "Virgo", + "house": 1, + "degree": 22.03839427516732 + }, + "Mercury": { + "sign": "Sagittarius", + "house": 4, + "degree": 13.113617930151946 + }, + "Jupiter": { + "sign": "Cancer", + "house": 11, + "degree": 7.068319593820831 + }, + "Venus": { + "sign": "Capricorn", + "house": 5, + "degree": 4.423884933586692 + }, + "Saturn": { + "sign": "Pisces", + "house": 7, + "degree": 0.0441579189167669 + }, + "Rahu": { + "sign": "Aries", + "house": 8, + "degree": 20.162710572742157 + }, + "Ketu": { + "sign": "Libra", + "house": 2, + "degree": 20.162710572742157 + } + }, + "ascendant": "Virgo" + }, + { + "name": "Lata Mangeshkar", + "planets": { + "Sun": { + "sign": "Virgo", + "house": 4, + "degree": 10.40212311716735 + }, + "Moon": { + "sign": "Cancer", + "house": 2, + "degree": 2.691330190167278 + }, + "Mars": { + "sign": "Libra", + "house": 5, + "degree": 0.3593005969819103 + }, + "Mercury": { + "sign": "Virgo", + "house": 4, + "degree": 29.37248195703299 + }, + "Jupiter": { + "sign": "Taurus", + "house": 12, + "degree": 22.55263795567945 + }, + "Venus": { + "sign": "Leo", + "house": 3, + "degree": 8.78902525339538 + }, + "Saturn": { + "sign": "Sagittarius", + "house": 7, + "degree": 0.851707165096002 + }, + "Rahu": { + "sign": "Aries", + "house": 11, + "degree": 19.111096672233973 + }, + "Ketu": { + "sign": "Libra", + "house": 5, + "degree": 19.11109667223397 + } + }, + "ascendant": "Gemini" + }, + { + "name": "Steve Jobs", + "planets": { + "Sun": { + "sign": "Aquarius", + "house": 5, + "degree": 10.827873475540798 + }, + "Moon": { + "sign": "Pisces", + "house": 6, + "degree": 2.303329433892202 + }, + "Mars": { + "sign": "Aries", + "house": 7, + "degree": 4.41605065344086 + }, + "Mercury": { + "sign": "Capricorn", + "house": 4, + "degree": 20.305673992558468 + }, + "Jupiter": { + "sign": "Gemini", + "house": 9, + "degree": 26.438851079593675 + }, + "Venus": { + "sign": "Sagittarius", + "house": 3, + "degree": 26.147873272880133 + }, + "Saturn": { + "sign": "Libra", + "house": 1, + "degree": 27.038035841382765 + }, + "Rahu": { + "sign": "Sagittarius", + "house": 3, + "degree": 9.42598500629478 + }, + "Ketu": { + "sign": "Gemini", + "house": 9, + "degree": 9.425985006294809 + } + }, + "ascendant": "Libra" + }, + { + "name": "Bill Gates", + "planets": { + "Sun": { + "sign": "Libra", + "house": 4, + "degree": 10.002847388405456 + }, + "Moon": { + "sign": "Pisces", + "house": 9, + "degree": 1.4333423658672473 + }, + "Mars": { + "sign": "Virgo", + "house": 3, + "degree": 15.411582363615196 + }, + "Mercury": { + "sign": "Virgo", + "house": 3, + "degree": 21.626520904467753 + }, + "Jupiter": { + "sign": "Leo", + "house": 2, + "degree": 3.533521489638872 + }, + "Venus": { + "sign": "Libra", + "house": 4, + "degree": 24.97263961750059 + }, + "Saturn": { + "sign": "Libra", + "house": 4, + "degree": 27.365154754429398 + }, + "Rahu": { + "sign": "Scorpio", + "house": 5, + "degree": 24.114446205026354 + }, + "Ketu": { + "sign": "Taurus", + "house": 11, + "degree": 24.114446205026354 + } + }, + "ascendant": "Cancer" + }, + { + "name": "Elon Musk", + "planets": { + "Sun": { + "sign": "Gemini", + "house": 4, + "degree": 11.2528246593929 + }, + "Moon": { + "sign": "Leo", + "house": 6, + "degree": 10.138313644689276 + }, + "Mars": { + "sign": "Capricorn", + "house": 11, + "degree": 26.510741843745393 + }, + "Mercury": { + "sign": "Gemini", + "house": 4, + "degree": 19.085381138815464 + }, + "Jupiter": { + "sign": "Scorpio", + "house": 9, + "degree": 3.3247233640765614 + }, + "Venus": { + "sign": "Taurus", + "house": 3, + "degree": 24.681986727805764 + }, + "Saturn": { + "sign": "Taurus", + "house": 3, + "degree": 6.748070057594944 + }, + "Rahu": { + "sign": "Capricorn", + "house": 11, + "degree": 20.759861379437382 + }, + "Ketu": { + "sign": "Cancer", + "house": 5, + "degree": 20.759861379437382 + } + }, + "ascendant": "Pisces" + }, + { + "name": "Jeff Bezos", + "planets": { + "Sun": { + "sign": "Sagittarius", + "house": 4, + "degree": 26.872269164922216 + }, + "Moon": { + "sign": "Scorpio", + "house": 3, + "degree": 28.13728690493818 + }, + "Mars": { + "sign": "Capricorn", + "house": 5, + "degree": 5.019650293878442 + }, + "Mercury": { + "sign": "Sagittarius", + "house": 4, + "degree": 11.034472349522844 + }, + "Jupiter": { + "sign": "Pisces", + "house": 7, + "degree": 17.68557436421554 + }, + "Venus": { + "sign": "Capricorn", + "house": 5, + "degree": 29.850871718416386 + }, + "Saturn": { + "sign": "Capricorn", + "house": 5, + "degree": 27.381201880590652 + }, + "Rahu": { + "sign": "Gemini", + "house": 10, + "degree": 17.007524146992495 + }, + "Ketu": { + "sign": "Sagittarius", + "house": 4, + "degree": 17.007524146992523 + } + }, + "ascendant": "Virgo" + }, + { + "name": "Warren Buffett", + "planets": { + "Sun": { + "sign": "Leo", + "house": 3, + "degree": 12.37541193217831 + }, + "Moon": { + "sign": "Scorpio", + "house": 6, + "degree": 3.4954003959069837 + }, + "Mars": { + "sign": "Gemini", + "house": 1, + "degree": 7.349117668734948 + }, + "Mercury": { + "sign": "Virgo", + "house": 4, + "degree": 9.17058220777102 + }, + "Jupiter": { + "sign": "Gemini", + "house": 1, + "degree": 19.775078690384092 + }, + "Venus": { + "sign": "Virgo", + "house": 4, + "degree": 28.095875606283045 + }, + "Saturn": { + "sign": "Sagittarius", + "house": 7, + "degree": 11.579391789037288 + }, + "Rahu": { + "sign": "Aries", + "house": 11, + "degree": 1.115373549252863 + }, + "Ketu": { + "sign": "Libra", + "house": 5, + "degree": 1.1153735492528654 + } + }, + "ascendant": "Gemini" + }, + { + "name": "Mukesh Ambani", + "planets": { + "Sun": { + "sign": "Aries", + "house": 5, + "degree": 4.406786379001032 + }, + "Moon": { + "sign": "Scorpio", + "house": 12, + "degree": 29.452352955179748 + }, + "Mars": { + "sign": "Taurus", + "house": 6, + "degree": 25.958964069120114 + }, + "Mercury": { + "sign": "Aries", + "house": 5, + "degree": 23.334684026689544 + }, + "Jupiter": { + "sign": "Leo", + "house": 9, + "degree": 29.041957293649233 + }, + "Venus": { + "sign": "Aries", + "house": 5, + "degree": 5.531397509170144 + }, + "Saturn": { + "sign": "Scorpio", + "house": 12, + "degree": 19.617939501278414 + }, + "Rahu": { + "sign": "Libra", + "house": 11, + "degree": 25.629815947006506 + }, + "Ketu": { + "sign": "Aries", + "house": 5, + "degree": 25.629815947006477 + } + }, + "ascendant": "Sagittarius" + }, + { + "name": "Ratan Tata", + "planets": { + "Sun": { + "sign": "Sagittarius", + "house": 4, + "degree": 11.737206056744412 + }, + "Moon": { + "sign": "Libra", + "house": 2, + "degree": 17.514413309500696 + }, + "Mars": { + "sign": "Aquarius", + "house": 6, + "degree": 10.69344452479936 + }, + "Mercury": { + "sign": "Sagittarius", + "house": 4, + "degree": 17.21007589947982 + }, + "Jupiter": { + "sign": "Capricorn", + "house": 5, + "degree": 7.810497202289639 + }, + "Venus": { + "sign": "Sagittarius", + "house": 4, + "degree": 2.5580711710293826 + }, + "Saturn": { + "sign": "Pisces", + "house": 7, + "degree": 5.070778398682194 + }, + "Rahu": { + "sign": "Scorpio", + "house": 3, + "degree": 11.9962888827107 + }, + "Ketu": { + "sign": "Taurus", + "house": 9, + "degree": 11.9962888827107 + } + }, + "ascendant": "Virgo" + }, + { + "name": "Narayana Murthy", + "planets": { + "Sun": { + "sign": "Leo", + "house": 4, + "degree": 2.1634914274567194 + }, + "Moon": { + "sign": "Aries", + "house": 12, + "degree": 28.452603501561168 + }, + "Mars": { + "sign": "Virgo", + "house": 5, + "degree": 12.46815076772512 + }, + "Mercury": { + "sign": "Cancer", + "house": 3, + "degree": 13.745385462207068 + }, + "Jupiter": { + "sign": "Virgo", + "house": 5, + "degree": 29.260249931110735 + }, + "Venus": { + "sign": "Virgo", + "house": 5, + "degree": 17.295665110076726 + }, + "Saturn": { + "sign": "Cancer", + "house": 3, + "degree": 8.170594576420527 + }, + "Rahu": { + "sign": "Taurus", + "house": 1, + "degree": 24.276691194214862 + }, + "Ketu": { + "sign": "Scorpio", + "house": 7, + "degree": 24.276691194214862 + } + }, + "ascendant": "Taurus" + }, + { + "name": "Azim Premji", + "planets": { + "Sun": { + "sign": "Cancer", + "house": 4, + "degree": 6.537079286927522 + }, + "Moon": { + "sign": "Sagittarius", + "house": 9, + "degree": 20.064659641006642 + }, + "Mars": { + "sign": "Taurus", + "house": 2, + "degree": 6.303669975233639 + }, + "Mercury": { + "sign": "Leo", + "house": 5, + "degree": 3.5309289472034635 + }, + "Jupiter": { + "sign": "Virgo", + "house": 6, + "degree": 0.009232138069023677 + }, + "Venus": { + "sign": "Taurus", + "house": 2, + "degree": 23.100143111113383 + }, + "Saturn": { + "sign": "Gemini", + "house": 3, + "degree": 22.592056393427143 + }, + "Rahu": { + "sign": "Gemini", + "house": 3, + "degree": 15.17940900094436 + }, + "Ketu": { + "sign": "Sagittarius", + "house": 9, + "degree": 15.17940900094436 + } + }, + "ascendant": "Aries" + }, + { + "name": "Dhirubhai Ambani", + "planets": { + "Sun": { + "sign": "Sagittarius", + "house": 4, + "degree": 12.029308328420427 + }, + "Moon": { + "sign": "Sagittarius", + "house": 4, + "degree": 16.145503623044704 + }, + "Mars": { + "sign": "Leo", + "house": 12, + "degree": 23.198394106604468 + }, + "Mercury": { + "sign": "Scorpio", + "house": 3, + "degree": 20.522054504121115 + }, + "Jupiter": { + "sign": "Leo", + "house": 12, + "degree": 29.25776622366331 + }, + "Venus": { + "sign": "Scorpio", + "house": 3, + "degree": 14.219989797743665 + }, + "Saturn": { + "sign": "Capricorn", + "house": 5, + "degree": 9.765497060244854 + }, + "Rahu": { + "sign": "Aquarius", + "house": 6, + "degree": 16.076958225437522 + }, + "Ketu": { + "sign": "Leo", + "house": 12, + "degree": 16.076958225437522 + } + }, + "ascendant": "Virgo" + }, + { + "name": "Sachin Tendulkar", + "planets": { + "Sun": { + "sign": "Aries", + "house": 5, + "degree": 9.086509498478529 + }, + "Moon": { + "sign": "Sagittarius", + "house": 1, + "degree": 17.282201002977843 + }, + "Mars": { + "sign": "Capricorn", + "house": 2, + "degree": 25.440265270246016 + }, + "Mercury": { + "sign": "Pisces", + "house": 4, + "degree": 15.045119414418195 + }, + "Jupiter": { + "sign": "Capricorn", + "house": 2, + "degree": 15.655369177557816 + }, + "Venus": { + "sign": "Aries", + "house": 5, + "degree": 12.717412479649463 + }, + "Saturn": { + "sign": "Taurus", + "house": 6, + "degree": 23.324675106701974 + }, + "Rahu": { + "sign": "Sagittarius", + "house": 1, + "degree": 15.502525461506906 + }, + "Ketu": { + "sign": "Gemini", + "house": 7, + "degree": 15.502525461506934 + } + }, + "ascendant": "Sagittarius" + }, + { + "name": "Virat Kohli", + "planets": { + "Sun": { + "sign": "Libra", + "house": 4, + "degree": 17.98205206561761 + }, + "Moon": { + "sign": "Leo", + "house": 2, + "degree": 24.30022806915275 + }, + "Mars": { + "sign": "Pisces", + "house": 9, + "degree": 5.662341204318977 + }, + "Mercury": { + "sign": "Libra", + "house": 4, + "degree": 2.558567067847463 + }, + "Jupiter": { + "sign": "Taurus", + "house": 11, + "degree": 8.861622444399508 + }, + "Venus": { + "sign": "Virgo", + "house": 3, + "degree": 12.430838430092564 + }, + "Saturn": { + "sign": "Sagittarius", + "house": 6, + "degree": 4.6856583159322724 + }, + "Rahu": { + "sign": "Aquarius", + "house": 8, + "degree": 17.83933195509246 + }, + "Ketu": { + "sign": "Leo", + "house": 2, + "degree": 17.83933195509246 + } + }, + "ascendant": "Cancer" + }, + { + "name": "MS Dhoni", + "planets": { + "Sun": { + "sign": "Gemini", + "house": 4, + "degree": 20.102364403575393 + }, + "Moon": { + "sign": "Leo", + "house": 6, + "degree": 23.38395047915043 + }, + "Mars": { + "sign": "Taurus", + "house": 3, + "degree": 27.629457787767464 + }, + "Mercury": { + "sign": "Gemini", + "house": 4, + "degree": 2.2881454452934946 + }, + "Jupiter": { + "sign": "Virgo", + "house": 7, + "degree": 8.24803643848972 + }, + "Venus": { + "sign": "Cancer", + "house": 5, + "degree": 13.95371786441919 + }, + "Saturn": { + "sign": "Virgo", + "house": 7, + "degree": 9.351493792472269 + }, + "Rahu": { + "sign": "Cancer", + "house": 5, + "degree": 7.308140711999442 + }, + "Ketu": { + "sign": "Capricorn", + "house": 11, + "degree": 7.308140711999442 + } + }, + "ascendant": "Pisces" + }, + { + "name": "Muhammad Ali", + "planets": { + "Sun": { + "sign": "Capricorn", + "house": 4, + "degree": 2.580009316619396 + }, + "Moon": { + "sign": "Capricorn", + "house": 4, + "degree": 7.360469331245326 + }, + "Mars": { + "sign": "Aries", + "house": 7, + "degree": 8.736413911870374 + }, + "Mercury": { + "sign": "Capricorn", + "house": 4, + "degree": 18.40044217415192 + }, + "Jupiter": { + "sign": "Taurus", + "house": 8, + "degree": 18.0735552767461 + }, + "Venus": { + "sign": "Capricorn", + "house": 4, + "degree": 26.88837111267503 + }, + "Saturn": { + "sign": "Aries", + "house": 7, + "degree": 27.737422982276513 + }, + "Rahu": { + "sign": "Leo", + "house": 11, + "degree": 20.409272704467753 + }, + "Ketu": { + "sign": "Aquarius", + "house": 5, + "degree": 20.409272704467753 + } + }, + "ascendant": "Libra" + }, + { + "name": "Michael Jordan", + "planets": { + "Sun": { + "sign": "Aquarius", + "house": 5, + "degree": 3.5921297033202677 + }, + "Moon": { + "sign": "Scorpio", + "house": 2, + "degree": 8.834422684847794 + }, + "Mars": { + "sign": "Cancer", + "house": 10, + "degree": 15.925651611565513 + }, + "Mercury": { + "sign": "Capricorn", + "house": 4, + "degree": 7.779120874656485 + }, + "Jupiter": { + "sign": "Aquarius", + "house": 5, + "degree": 24.748909558535388 + }, + "Venus": { + "sign": "Sagittarius", + "house": 3, + "degree": 18.33716966122074 + }, + "Saturn": { + "sign": "Capricorn", + "house": 4, + "degree": 21.248663723838433 + }, + "Rahu": { + "sign": "Cancer", + "house": 10, + "degree": 5.056374264234279 + }, + "Ketu": { + "sign": "Capricorn", + "house": 4, + "degree": 5.05637426423425 + } + }, + "ascendant": "Libra" + }, + { + "name": "Lionel Messi", + "planets": { + "Sun": { + "sign": "Gemini", + "house": 5, + "degree": 7.541142063405019 + }, + "Moon": { + "sign": "Taurus", + "house": 4, + "degree": 14.13059583316334 + }, + "Mars": { + "sign": "Gemini", + "house": 5, + "degree": 27.398061656073807 + }, + "Mercury": { + "sign": "Gemini", + "house": 5, + "degree": 21.918081422372936 + }, + "Jupiter": { + "sign": "Aries", + "house": 3, + "degree": 0.3446381025379667 + }, + "Venus": { + "sign": "Taurus", + "house": 4, + "degree": 21.160648887879418 + }, + "Saturn": { + "sign": "Scorpio", + "house": 10, + "degree": 22.21842264721664 + }, + "Rahu": { + "sign": "Pisces", + "house": 2, + "degree": 13.173838226948817 + }, + "Ketu": { + "sign": "Virgo", + "house": 8, + "degree": 13.173838226948874 + } + }, + "ascendant": "Aquarius" + }, + { + "name": "Cristiano Ronaldo", + "planets": { + "Sun": { + "sign": "Capricorn", + "house": 5, + "degree": 21.60901418721261 + }, + "Moon": { + "sign": "Cancer", + "house": 11, + "degree": 13.10828439142422 + }, + "Mars": { + "sign": "Pisces", + "house": 7, + "degree": 7.194418379949525 + }, + "Mercury": { + "sign": "Capricorn", + "house": 5, + "degree": 11.391259203207426 + }, + "Jupiter": { + "sign": "Capricorn", + "house": 5, + "degree": 5.100787991857771 + }, + "Venus": { + "sign": "Pisces", + "house": 7, + "degree": 7.876117826409995 + }, + "Saturn": { + "sign": "Scorpio", + "house": 3, + "degree": 2.813864516042429 + }, + "Rahu": { + "sign": "Aries", + "house": 8, + "degree": 29.112709622439528 + }, + "Ketu": { + "sign": "Libra", + "house": 2, + "degree": 29.112709622439525 + } + }, + "ascendant": "Virgo" + }, + { + "name": "Serena Williams", + "planets": { + "Sun": { + "sign": "Virgo", + "house": 4, + "degree": 8.502240532612433 + }, + "Moon": { + "sign": "Leo", + "house": 3, + "degree": 14.98429638383945 + }, + "Mars": { + "sign": "Cancer", + "house": 2, + "degree": 20.584414386933474 + }, + "Mercury": { + "sign": "Libra", + "house": 5, + "degree": 4.4735512048069666 + }, + "Jupiter": { + "sign": "Virgo", + "house": 4, + "degree": 22.386615418496092 + }, + "Venus": { + "sign": "Libra", + "house": 5, + "degree": 20.87046677971182 + }, + "Saturn": { + "sign": "Virgo", + "house": 4, + "degree": 17.132791799928498 + }, + "Rahu": { + "sign": "Cancer", + "house": 2, + "degree": 5.379033329582398 + }, + "Ketu": { + "sign": "Capricorn", + "house": 8, + "degree": 5.379033329582398 + } + }, + "ascendant": "Gemini" + }, + { + "name": "Pele", + "planets": { + "Sun": { + "sign": "Libra", + "house": 5, + "degree": 5.6493835906157415 + }, + "Moon": { + "sign": "Gemini", + "house": 1, + "degree": 21.917104084460533 + }, + "Mars": { + "sign": "Virgo", + "house": 4, + "degree": 17.421367105858934 + }, + "Mercury": { + "sign": "Libra", + "house": 5, + "degree": 29.818099443076534 + }, + "Jupiter": { + "sign": "Aries", + "house": 11, + "degree": 18.171402297882906 + }, + "Venus": { + "sign": "Leo", + "house": 3, + "degree": 24.75357623362001 + }, + "Saturn": { + "sign": "Aries", + "house": 11, + "degree": 18.32178115567249 + }, + "Rahu": { + "sign": "Virgo", + "house": 4, + "degree": 16.953162802164513 + }, + "Ketu": { + "sign": "Pisces", + "house": 10, + "degree": 16.953162802164513 + } + }, + "ascendant": "Gemini" + }, + { + "name": "Roger Federer", + "planets": { + "Sun": { + "sign": "Cancer", + "house": 3, + "degree": 20.847578205534532 + }, + "Moon": { + "sign": "Libra", + "house": 6, + "degree": 22.466805915481956 + }, + "Mars": { + "sign": "Gemini", + "house": 2, + "degree": 19.267417197947182 + }, + "Mercury": { + "sign": "Cancer", + "house": 3, + "degree": 18.335579660713805 + }, + "Jupiter": { + "sign": "Virgo", + "house": 5, + "degree": 12.777545255861668 + }, + "Venus": { + "sign": "Leo", + "house": 4, + "degree": 22.833319967764936 + }, + "Saturn": { + "sign": "Virgo", + "house": 5, + "degree": 11.699613851775752 + }, + "Rahu": { + "sign": "Cancer", + "house": 3, + "degree": 7.123680015412219 + }, + "Ketu": { + "sign": "Capricorn", + "house": 9, + "degree": 7.123680015412219 + } + }, + "ascendant": "Taurus" + }, + { + "name": "Swami Vivekananda", + "planets": { + "Sun": { + "sign": "Sagittarius", + "house": 3, + "degree": 28.28431070746194 + }, + "Moon": { + "sign": "Virgo", + "house": 12, + "degree": 13.207937183690206 + }, + "Mars": { + "sign": "Aries", + "house": 7, + "degree": 5.312748244377682 + }, + "Mercury": { + "sign": "Capricorn", + "house": 4, + "degree": 10.477736599769173 + }, + "Jupiter": { + "sign": "Libra", + "house": 1, + "degree": 3.1102814224852295 + }, + "Venus": { + "sign": "Capricorn", + "house": 4, + "degree": 5.909446844234708 + }, + "Saturn": { + "sign": "Virgo", + "house": 12, + "degree": 12.689302738906065 + }, + "Rahu": { + "sign": "Scorpio", + "house": 2, + "degree": 22.624842335473147 + }, + "Ketu": { + "sign": "Taurus", + "house": 8, + "degree": 22.624842335473147 + } + }, + "ascendant": "Libra" + }, + { + "name": "Amitabh Bachchan", + "planets": { + "Sun": { + "sign": "Virgo", + "house": 3, + "degree": 22.88546199908359 + }, + "Moon": { + "sign": "Libra", + "house": 4, + "degree": 0.6335926986686786 + }, + "Mars": { + "sign": "Virgo", + "house": 3, + "degree": 21.318098982278315 + }, + "Mercury": { + "sign": "Virgo", + "house": 3, + "degree": 23.512944124555588 + }, + "Jupiter": { + "sign": "Gemini", + "house": 12, + "degree": 29.595137702193952 + }, + "Venus": { + "sign": "Virgo", + "house": 3, + "degree": 13.537732436991206 + }, + "Saturn": { + "sign": "Taurus", + "house": 11, + "degree": 18.364474676790508 + }, + "Rahu": { + "sign": "Leo", + "house": 2, + "degree": 9.610218702915574 + }, + "Ketu": { + "sign": "Aquarius", + "house": 8, + "degree": 9.610218702915574 + } + }, + "ascendant": "Cancer" + }, + { + "name": "Queen Elizabeth II", + "planets": { + "Sun": { + "sign": "Aries", + "house": 5, + "degree": 6.437615309973848 + }, + "Moon": { + "sign": "Cancer", + "house": 8, + "degree": 17.59499464514593 + }, + "Mars": { + "sign": "Capricorn", + "house": 2, + "degree": 27.115718461503604 + }, + "Mercury": { + "sign": "Pisces", + "house": 4, + "degree": 10.919412408950393 + }, + "Jupiter": { + "sign": "Capricorn", + "house": 2, + "degree": 28.7975594686352 + }, + "Venus": { + "sign": "Aquarius", + "house": 3, + "degree": 20.185090463286087 + }, + "Saturn": { + "sign": "Scorpio", + "house": 12, + "degree": 0.7399515886926054 + }, + "Rahu": { + "sign": "Gemini", + "house": 7, + "degree": 26.403539179118027 + }, + "Ketu": { + "sign": "Sagittarius", + "house": 1, + "degree": 26.403539179118013 + } + }, + "ascendant": "Sagittarius" + }, + { + "name": "Princess Diana", + "planets": { + "Sun": { + "sign": "Gemini", + "house": 5, + "degree": 14.68412150782791 + }, + "Moon": { + "sign": "Capricorn", + "house": 12, + "degree": 18.668675822759383 + }, + "Mars": { + "sign": "Leo", + "house": 7, + "degree": 6.966373711476777 + }, + "Mercury": { + "sign": "Gemini", + "house": 5, + "degree": 9.410592319382928 + }, + "Jupiter": { + "sign": "Capricorn", + "house": 12, + "degree": 10.979366009344005 + }, + "Venus": { + "sign": "Aries", + "house": 3, + "degree": 29.36410583495056 + }, + "Saturn": { + "sign": "Capricorn", + "house": 12, + "degree": 3.6660826366072 + }, + "Rahu": { + "sign": "Leo", + "house": 7, + "degree": 3.9888170856387006 + }, + "Ketu": { + "sign": "Aquarius", + "house": 1, + "degree": 3.9888170856386864 + } + }, + "ascendant": "Aquarius" + }, + { + "name": "Dalai Lama", + "planets": { + "Sun": { + "sign": "Gemini", + "house": 3, + "degree": 18.952959142909677 + }, + "Moon": { + "sign": "Leo", + "house": 5, + "degree": 14.23647572190049 + }, + "Mars": { + "sign": "Virgo", + "house": 6, + "degree": 24.36859180177251 + }, + "Mercury": { + "sign": "Gemini", + "house": 3, + "degree": 1.6459582125724168 + }, + "Jupiter": { + "sign": "Libra", + "house": 7, + "degree": 19.630107313843894 + }, + "Venus": { + "sign": "Leo", + "house": 5, + "degree": 4.274314485879074 + }, + "Saturn": { + "sign": "Aquarius", + "house": 11, + "degree": 16.213465318506223 + }, + "Rahu": { + "sign": "Sagittarius", + "house": 9, + "degree": 28.163026340209626 + }, + "Ketu": { + "sign": "Gemini", + "house": 3, + "degree": 28.163026340209626 + } + }, + "ascendant": "Aries" + }, + { + "name": "Pope Francis", + "planets": { + "Sun": { + "sign": "Sagittarius", + "house": 5, + "degree": 1.1571891853951115 + }, + "Moon": { + "sign": "Capricorn", + "house": 6, + "degree": 7.363817931486892 + }, + "Mars": { + "sign": "Virgo", + "house": 2, + "degree": 25.156354406006983 + }, + "Mercury": { + "sign": "Sagittarius", + "house": 5, + "degree": 16.64192963441525 + }, + "Jupiter": { + "sign": "Sagittarius", + "house": 5, + "degree": 9.482411666775903 + }, + "Venus": { + "sign": "Capricorn", + "house": 6, + "degree": 12.710906370075122 + }, + "Saturn": { + "sign": "Aquarius", + "house": 7, + "degree": 22.60032666497773 + }, + "Rahu": { + "sign": "Sagittarius", + "house": 5, + "degree": 0.4172544108972147 + }, + "Ketu": { + "sign": "Gemini", + "house": 11, + "degree": 0.4172544108972147 + } + }, + "ascendant": "Leo" + }, + { + "name": "Osho", + "planets": { + "Sun": { + "sign": "Scorpio", + "house": 4, + "degree": 23.96215798068232 + }, + "Moon": { + "sign": "Sagittarius", + "house": 5, + "degree": 11.573225917608738 + }, + "Mars": { + "sign": "Sagittarius", + "house": 5, + "degree": 6.705022658015167 + }, + "Mercury": { + "sign": "Sagittarius", + "house": 5, + "degree": 12.508547430847898 + }, + "Jupiter": { + "sign": "Cancer", + "house": 12, + "degree": 28.845827280375943 + }, + "Venus": { + "sign": "Sagittarius", + "house": 5, + "degree": 17.49381151051972 + }, + "Saturn": { + "sign": "Sagittarius", + "house": 5, + "degree": 27.602645814581763 + }, + "Rahu": { + "sign": "Pisces", + "house": 8, + "degree": 8.347180297263662 + }, + "Ketu": { + "sign": "Virgo", + "house": 2, + "degree": 8.347180297263662 + } + }, + "ascendant": "Leo" + }, + { + "name": "J. Krishnamurti", + "planets": { + "Sun": { + "sign": "Aries", + "house": 4, + "degree": 27.497727576089957 + }, + "Moon": { + "sign": "Sagittarius", + "house": 12, + "degree": 1.6736762017501405 + }, + "Mars": { + "sign": "Gemini", + "house": 6, + "degree": 18.512153851618947 + }, + "Mercury": { + "sign": "Taurus", + "house": 5, + "degree": 5.5561429514632295 + }, + "Jupiter": { + "sign": "Gemini", + "house": 6, + "degree": 11.914861667154597 + }, + "Venus": { + "sign": "Gemini", + "house": 6, + "degree": 5.135128313372661 + }, + "Saturn": { + "sign": "Libra", + "house": 10, + "degree": 9.367409115503733 + }, + "Rahu": { + "sign": "Aquarius", + "house": 2, + "degree": 26.5678537651REDACTED_YEAR5 + }, + "Ketu": { + "sign": "Leo", + "house": 8, + "degree": 26.5678537651REDACTED_YEAR5 + } + }, + "ascendant": "Capricorn" + }, + { + "name": "Ramana Maharshi", + "planets": { + "Sun": { + "sign": "Sagittarius", + "house": 4, + "degree": 14.666860163644373 + }, + "Moon": { + "sign": "Gemini", + "house": 10, + "degree": 26.858926719211013 + }, + "Mars": { + "sign": "Aries", + "house": 8, + "degree": 21.07837606802257 + }, + "Mercury": { + "sign": "Scorpio", + "house": 3, + "degree": 22.182542485970572 + }, + "Jupiter": { + "sign": "Aquarius", + "house": 6, + "degree": 15.59982175446163 + }, + "Venus": { + "sign": "Libra", + "house": 2, + "degree": 29.54416163279629 + }, + "Saturn": { + "sign": "Pisces", + "house": 7, + "degree": 16.17664671815089 + }, + "Rahu": { + "sign": "Sagittarius", + "house": 4, + "degree": 22.456643364016486 + }, + "Ketu": { + "sign": "Gemini", + "house": 10, + "degree": 22.456643364016486 + } + }, + "ascendant": "Virgo" + }, + { + "name": "Paramahansa Yogananda", + "planets": { + "Sun": { + "sign": "Sagittarius", + "house": 4, + "degree": 21.46167518299535 + }, + "Moon": { + "sign": "Cancer", + "house": 11, + "degree": 20.63288063002014 + }, + "Mars": { + "sign": "Pisces", + "house": 7, + "degree": 11.873263941354026 + }, + "Mercury": { + "sign": "Scorpio", + "house": 3, + "degree": 29.030041709934636 + }, + "Jupiter": { + "sign": "Pisces", + "house": 7, + "degree": 22.900280409643813 + }, + "Venus": { + "sign": "Scorpio", + "house": 3, + "degree": 22.80356803827121 + }, + "Saturn": { + "sign": "Virgo", + "house": 1, + "degree": 19.31789775643668 + }, + "Rahu": { + "sign": "Aries", + "house": 8, + "degree": 11.957184394431312 + }, + "Ketu": { + "sign": "Libra", + "house": 2, + "degree": 11.957184394431323 + } + }, + "ascendant": "Virgo" + } + ] +} \ No newline at end of file diff --git a/references/standard_test_charts.json b/references/standard_test_charts.json new file mode 100644 index 00000000..81f254f2 --- /dev/null +++ b/references/standard_test_charts.json @@ -0,0 +1,4700 @@ +{ + "schema_version": "1.0", + "description": "Standard test charts for yoga validation", + "charts": [ + { + "name": "Albert Einstein", + "date": "1879-03-14", + "time": "11:30", + "tz": "+01:00", + "lat": 48.4011, + "lon": 9.9876, + "city": "Ulm, Germany", + "expected_yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "kedaara_yoga", + "asubha_yoga", + "gaja_kesari_yoga", + "vanchana_chora_bheethi_yoga", + "kedara_yoga", + "dharidhra_yoga_149", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "madhya_vayasi_dhana_yoga", + "asatyavadi_yoga", + "sodaranasa_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "bahu_puthra_yoga_221", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "satkalatra_yoga", + "galakarna_yoga", + "mathibhramana_yoga_variation", + "khalwata_yoga", + "rajabhrashta_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "kedaara_yoga", + "asubha_yoga", + "gaja_kesari_yoga", + "vanchana_chora_bheethi_yoga", + "kedara_yoga", + "dharidhra_yoga_149", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "madhya_vayasi_dhana_yoga", + "asatyavadi_yoga", + "sodaranasa_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "bahu_puthra_yoga_221", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "satkalatra_yoga", + "galakarna_yoga", + "mathibhramana_yoga_variation", + "khalwata_yoga", + "rajabhrashta_yoga" + ], + "count": 30, + "status": "ok" + } + }, + { + "name": "Marie Curie", + "date": "1867-11-07", + "time": "12:00", + "tz": "+01:00", + "lat": 52.2297, + "lon": 21.0122, + "city": "Warsaw, Poland", + "expected_yogas": [ + "vesi_yoga", + "ruchaka_yoga", + "sarpa_yoga", + "soola_yoga", + "asubha_yoga", + "gaja_kesari_yoga", + "amala_yoga", + "kaahala_yoga", + "chaamara_yoga", + "rajalakshana_yoga", + "vanchana_chora_bheethi_yoga", + "sula_yoga", + "dharidhra_yoga_152", + "sareera_soukhya_yoga", + "dehapushti_yoga", + "rogagrastha_yoga", + "sada_sanchara_yoga", + "yukthi_samanwithavagmi_yoga_154", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "eka_puthra_yoga", + "buddhimaturya_yoga", + "thrikaala_gnana_yoga", + "satkalatra_yoga", + "bhaga_chumbana_yoga", + "mathibhramana_yoga_variation", + "khalwata_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "ruchaka_yoga", + "sarpa_yoga", + "soola_yoga", + "asubha_yoga", + "gaja_kesari_yoga", + "amala_yoga", + "kaahala_yoga", + "chaamara_yoga", + "rajalakshana_yoga", + "vanchana_chora_bheethi_yoga", + "sula_yoga", + "dharidhra_yoga_152", + "sareera_soukhya_yoga", + "dehapushti_yoga", + "rogagrastha_yoga", + "sada_sanchara_yoga", + "yukthi_samanwithavagmi_yoga_154", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "eka_puthra_yoga", + "buddhimaturya_yoga", + "thrikaala_gnana_yoga", + "satkalatra_yoga", + "bhaga_chumbana_yoga", + "mathibhramana_yoga_variation", + "khalwata_yoga" + ], + "count": 32, + "status": "ok" + } + }, + { + "name": "Nikola Tesla", + "date": "1856-07-10", + "time": "00:00", + "tz": "+01:00", + "lat": 44.5686, + "lon": 15.379, + "city": "Smiljan, Croatia", + "expected_yogas": [ + "nipuna_yoga", + "chandra_mangala_yoga", + "nala_yoga", + "vaapi_yoga", + "soola_yoga", + "gaja_kesari_yoga", + "guru_mangala_yoga", + "amala_yoga", + "parvata_yoga", + "kaahala_yoga", + "bheri_yoga", + "vimala_yoga", + "vanchana_chora_bheethi_yoga", + "sula_yoga", + "dharidhra_yoga_148", + "dharidhra_yoga_149", + "rogagrastha_yoga", + "krisanga_yoga_112", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "thrikaala_gnana_yoga", + "satkalatra_yoga", + "bhaagya_yoga", + "khalwata_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "nipuna_yoga", + "chandra_mangala_yoga", + "nala_yoga", + "vaapi_yoga", + "soola_yoga", + "gaja_kesari_yoga", + "guru_mangala_yoga", + "amala_yoga", + "parvata_yoga", + "kaahala_yoga", + "bheri_yoga", + "vimala_yoga", + "vanchana_chora_bheethi_yoga", + "sula_yoga", + "dharidhra_yoga_148", + "dharidhra_yoga_149", + "rogagrastha_yoga", + "krisanga_yoga_112", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "thrikaala_gnana_yoga", + "satkalatra_yoga", + "bhaagya_yoga", + "khalwata_yoga" + ], + "count": 34, + "status": "ok" + } + }, + { + "name": "Stephen Hawking", + "date": "1942-01-08", + "time": "00:00", + "tz": "+00:00", + "lat": 51.752, + "lon": -1.2577, + "city": "Oxford, UK", + "expected_yogas": [ + "vesi_yoga", + "paasa_yoga", + "amala_yoga", + "kaahala_yoga", + "hara_yoga", + "trilochana_yoga", + "vasumathi_yoga", + "sarala_yoga", + "vanchana_chora_bheethi_yoga", + "harihara_brahma_yoga", + "dharidhra_yoga", + "dharidhra_yoga_150", + "dehapushti_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "asatyavadi_yoga", + "bhratruvriddhi_yoga", + "yuddhatpoorvadridhachitta_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "nishkapata_yoga_205", + "bahu_puthra_yoga_221", + "aputhra_yoga", + "kaalanirdesat_puthra_yoga_228", + "satkalatra_yoga", + "bhaagya_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "paasa_yoga", + "amala_yoga", + "kaahala_yoga", + "hara_yoga", + "trilochana_yoga", + "vasumathi_yoga", + "sarala_yoga", + "vanchana_chora_bheethi_yoga", + "harihara_brahma_yoga", + "dharidhra_yoga", + "dharidhra_yoga_150", + "dehapushti_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "asatyavadi_yoga", + "bhratruvriddhi_yoga", + "yuddhatpoorvadridhachitta_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "nishkapata_yoga_205", + "bahu_puthra_yoga_221", + "aputhra_yoga", + "kaalanirdesat_puthra_yoga_228", + "satkalatra_yoga", + "bhaagya_yoga" + ], + "count": 33, + "status": "ok" + } + }, + { + "name": "Charles Darwin", + "date": "1809-02-12", + "time": "03:00", + "tz": "+00:00", + "lat": 52.7073, + "lon": -2.7553, + "city": "Shrewsbury, UK", + "expected_yogas": [ + "vesi_yoga", + "nipuna_yoga", + "anaphaa_yoga", + "paasa_yoga", + "asubha_yoga", + "kaahala_yoga", + "kalaanidhi_yoga", + "vasumathi_yoga", + "kalanidhi_yoga", + "dharidhra_yoga_152", + "krisanga_yoga_113", + "dehasthoulya_yoga_116", + "swaveeryaddhana_yoga", + "sumukha_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "satkathadisravana_yoga", + "utthama_graha_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matru_sneha_yoga", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "nipuna_yoga", + "anaphaa_yoga", + "paasa_yoga", + "asubha_yoga", + "kaahala_yoga", + "kalaanidhi_yoga", + "vasumathi_yoga", + "kalanidhi_yoga", + "dharidhra_yoga_152", + "krisanga_yoga_113", + "dehasthoulya_yoga_116", + "swaveeryaddhana_yoga", + "sumukha_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "satkathadisravana_yoga", + "utthama_graha_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matru_sneha_yoga", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga" + ], + "count": 25, + "status": "ok" + } + }, + { + "name": "Thomas Edison", + "date": "1847-02-11", + "time": "23:59", + "tz": "-05:00", + "lat": 41.2995, + "lon": -82.6052, + "city": "Milan, USA", + "expected_yogas": [ + "vesi_yoga", + "nipuna_yoga", + "chandra_mangala_yoga", + "kedaara_yoga", + "kaahala_yoga", + "bheri_yoga", + "brahma_yoga", + "vasumathi_yoga", + "vanchana_chora_bheethi_yoga", + "harihara_brahma_yoga", + "kedara_yoga", + "dehasthoulya_yoga_116", + "swaveeryaddhana_yoga", + "parakrama_yoga", + "yuddha_praveena_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "matru_sneha_yoga", + "aputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "nipuna_yoga", + "chandra_mangala_yoga", + "kedaara_yoga", + "kaahala_yoga", + "bheri_yoga", + "brahma_yoga", + "vasumathi_yoga", + "vanchana_chora_bheethi_yoga", + "harihara_brahma_yoga", + "kedara_yoga", + "dehasthoulya_yoga_116", + "swaveeryaddhana_yoga", + "parakrama_yoga", + "yuddha_praveena_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "matru_sneha_yoga", + "aputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230" + ], + "count": 22, + "status": "ok" + } + }, + { + "name": "Alexander Fleming", + "date": "1881-08-06", + "time": "03:00", + "tz": "+00:00", + "lat": 55.61, + "lon": -4.2886, + "city": "Darvel, UK", + "expected_yogas": [ + "vosi_yoga", + "nipuna_yoga", + "paasa_yoga", + "guru_mangala_yoga", + "mahabhagya_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_152", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "krisanga_yoga_113", + "dehasthoulya_yoga_115", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "matrumooladdhana_yoga", + "sumukha_yoga", + "bhratruvriddhi_yoga", + "satkathadisravana_yoga", + "utthama_graha_yoga", + "grihanasa_yoga_192", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matru_sneha_yoga", + "satkalatra_yoga", + "khalwata_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vosi_yoga", + "nipuna_yoga", + "paasa_yoga", + "guru_mangala_yoga", + "mahabhagya_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_152", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "krisanga_yoga_113", + "dehasthoulya_yoga_115", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "matrumooladdhana_yoga", + "sumukha_yoga", + "bhratruvriddhi_yoga", + "satkathadisravana_yoga", + "utthama_graha_yoga", + "grihanasa_yoga_192", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matru_sneha_yoga", + "satkalatra_yoga", + "khalwata_yoga" + ], + "count": 24, + "status": "ok" + } + }, + { + "name": "Max Planck", + "date": "1858-04-23", + "time": "10:00", + "tz": "+01:00", + "lat": 54.3233, + "lon": 10.1228, + "city": "Kiel, Germany", + "expected_yogas": [ + "nipuna_yoga", + "ruchaka_yoga", + "sarpa_yoga", + "kedaara_yoga", + "asubha_yoga", + "amala_yoga", + "vasumathi_yoga", + "vanchana_chora_bheethi_yoga", + "kedara_yoga", + "dhur_yoga", + "dharidhra_yoga", + "dharidhra_yoga_151", + "dharidhra_yoga_152", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "asatyavadi_yoga", + "annadana_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "ayatna_griha_prapta_yoga_190", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "kapata_yoga_202", + "matru_sneha_yoga", + "anapathya_yoga", + "aputhra_yoga", + "suputhra_yoga", + "buddhimaturya_yoga", + "thrikaala_gnana_yoga", + "satkalatra_yoga", + "vrana_yoga", + "mathibhramana_yoga_variation", + "khalwata_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "nipuna_yoga", + "ruchaka_yoga", + "sarpa_yoga", + "kedaara_yoga", + "asubha_yoga", + "amala_yoga", + "vasumathi_yoga", + "vanchana_chora_bheethi_yoga", + "kedara_yoga", + "dhur_yoga", + "dharidhra_yoga", + "dharidhra_yoga_151", + "dharidhra_yoga_152", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "asatyavadi_yoga", + "annadana_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "ayatna_griha_prapta_yoga_190", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "kapata_yoga_202", + "matru_sneha_yoga", + "anapathya_yoga", + "aputhra_yoga", + "suputhra_yoga", + "buddhimaturya_yoga", + "thrikaala_gnana_yoga", + "satkalatra_yoga", + "vrana_yoga", + "mathibhramana_yoga_variation", + "khalwata_yoga" + ], + "count": 37, + "status": "ok" + } + }, + { + "name": "Niels Bohr", + "date": "1885-10-07", + "time": "11:30", + "tz": "+01:00", + "lat": 55.6761, + "lon": 12.5683, + "city": "Copenhagen, Denmark", + "expected_yogas": [ + "vosi_yoga", + "nipuna_yoga", + "anaphaa_yoga", + "paasa_yoga", + "asubha_yoga", + "kaahala_yoga", + "vanchana_chora_bheethi_yoga", + "mahabhagya_yoga", + "dharidhra_yoga_149", + "krisanga_yoga_112", + "dehasthoulya_yoga_116", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "sumukha_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "anapathya_yoga", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "mathibhramana_yoga_293" + ], + "pyjhora_raw": { + "yogas": [ + "vosi_yoga", + "nipuna_yoga", + "anaphaa_yoga", + "paasa_yoga", + "asubha_yoga", + "kaahala_yoga", + "vanchana_chora_bheethi_yoga", + "mahabhagya_yoga", + "dharidhra_yoga_149", + "krisanga_yoga_112", + "dehasthoulya_yoga_116", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "sumukha_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "anapathya_yoga", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "mathibhramana_yoga_293" + ], + "count": 23, + "status": "ok" + } + }, + { + "name": "Richard Feynman", + "date": "1918-05-11", + "time": "13:47", + "tz": "-05:00", + "lat": 40.7282, + "lon": -73.7949, + "city": "Queens, USA", + "expected_yogas": [ + "vosi_yoga", + "nipuna_yoga", + "paasa_yoga", + "kaahala_yoga", + "kalpadruma_yoga", + "vanchana_chora_bheethi_yoga", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "sumukha_yoga", + "durmukha_yoga", + "sraddhannabhuktha_yoga", + "vakchalana_yoga", + "bhratruvriddhi_yoga", + "sodaranasa_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "kaalanirdesat_puthra_yoga_227", + "buddhimaturya_yoga", + "satkalatra_yoga", + "rajabhrashta_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vosi_yoga", + "nipuna_yoga", + "paasa_yoga", + "kaahala_yoga", + "kalpadruma_yoga", + "vanchana_chora_bheethi_yoga", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "sumukha_yoga", + "durmukha_yoga", + "sraddhannabhuktha_yoga", + "vakchalana_yoga", + "bhratruvriddhi_yoga", + "sodaranasa_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "kaalanirdesat_puthra_yoga_227", + "buddhimaturya_yoga", + "satkalatra_yoga", + "rajabhrashta_yoga" + ], + "count": 27, + "status": "ok" + } + }, + { + "name": "Mahatma Gandhi", + "date": "1869-10-02", + "time": "07:12", + "tz": "+05:30", + "lat": 21.627, + "lon": 72.948, + "city": "Porbandar, India", + "expected_yogas": [ + "vesi_yoga", + "paasa_yoga", + "gaja_kesari_yoga", + "guru_mangala_yoga", + "amala_yoga", + "kaahala_yoga", + "sankha_yoga", + "kahala_yoga", + "dehapushti_yoga", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "durmukha_yoga", + "vakchalana_yoga", + "bhratruvriddhi_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "dattha_puthra_yoga_223", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "bahu_sthree_yoga", + "satkalatra_yoga", + "mathibhramana_yoga_variation" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "paasa_yoga", + "gaja_kesari_yoga", + "guru_mangala_yoga", + "amala_yoga", + "kaahala_yoga", + "sankha_yoga", + "kahala_yoga", + "dehapushti_yoga", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "durmukha_yoga", + "vakchalana_yoga", + "bhratruvriddhi_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "dattha_puthra_yoga_223", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "bahu_sthree_yoga", + "satkalatra_yoga", + "mathibhramana_yoga_variation" + ], + "count": 28, + "status": "ok" + } + }, + { + "name": "Jawaharlal Nehru", + "date": "1889-11-14", + "time": "23:30", + "tz": "+05:30", + "lat": 25.5941, + "lon": 77.6232, + "city": "Allahabad, India", + "expected_yogas": [ + "vosi_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "anaphaa_yoga", + "duradhara_yoga", + "maalavya_yoga", + "paasa_yoga", + "asubha_yoga", + "sankha_yoga", + "mridanga_yoga", + "harsha_yoga", + "vanchana_chora_bheethi_yoga", + "sareera_soukhya_yoga", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "bandhubhisthyaktha_yoga", + "matrudeerghayur_yoga_196", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_210", + "aputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vosi_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "anaphaa_yoga", + "duradhara_yoga", + "maalavya_yoga", + "paasa_yoga", + "asubha_yoga", + "sankha_yoga", + "mridanga_yoga", + "harsha_yoga", + "vanchana_chora_bheethi_yoga", + "sareera_soukhya_yoga", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "bandhubhisthyaktha_yoga", + "matrudeerghayur_yoga_196", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_210", + "aputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga" + ], + "count": 32, + "status": "ok" + } + }, + { + "name": "Narendra Modi", + "date": "1950-09-17", + "time": "11:00", + "tz": "+05:30", + "lat": 23.1702, + "lon": 72.8311, + "city": "Vadnagar, India", + "expected_yogas": [ + "vesi_yoga", + "anaphaa_yoga", + "bhadra_yoga", + "paasa_yoga", + "gaja_kesari_yoga", + "amala_yoga", + "bhaarathi_yoga", + "vanchana_chora_bheethi_yoga", + "dharidhra_yoga", + "dharidhra_yoga_149", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "swaveeryaddhana_yoga", + "bhratruvriddhi_yoga", + "sodaranasa_yoga", + "parakrama_yoga", + "bandhubhisthyaktha_yoga", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_209", + "vahana_yoga_210", + "bahu_puthra_yoga_221", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "satkalatra_yoga", + "bhandhana_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "anaphaa_yoga", + "bhadra_yoga", + "paasa_yoga", + "gaja_kesari_yoga", + "amala_yoga", + "bhaarathi_yoga", + "vanchana_chora_bheethi_yoga", + "dharidhra_yoga", + "dharidhra_yoga_149", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "swaveeryaddhana_yoga", + "bhratruvriddhi_yoga", + "sodaranasa_yoga", + "parakrama_yoga", + "bandhubhisthyaktha_yoga", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_209", + "vahana_yoga_210", + "bahu_puthra_yoga_221", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "satkalatra_yoga", + "bhandhana_yoga" + ], + "count": 27, + "status": "ok" + } + }, + { + "name": "Indira Gandhi", + "date": "1917-11-19", + "time": "23:15", + "tz": "+05:30", + "lat": 25.5941, + "lon": 77.6232, + "city": "Allahabad, India", + "expected_yogas": [ + "nipuna_yoga", + "paasa_yoga", + "asubha_yoga", + "amala_yoga", + "kaahala_yoga", + "kalpadruma_yoga", + "vanchana_chora_bheethi_yoga", + "kahala_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_151", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "krisanga_yoga_113", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "asatyavadi_yoga", + "annadana_yoga", + "bhratruvriddhi_yoga", + "satkathadisravana_yoga", + "utthama_graha_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "anapathya_yoga", + "bahu_puthra_yoga_220", + "eka_puthra_yoga", + "suputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "khalwata_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "nipuna_yoga", + "paasa_yoga", + "asubha_yoga", + "amala_yoga", + "kaahala_yoga", + "kalpadruma_yoga", + "vanchana_chora_bheethi_yoga", + "kahala_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_151", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "krisanga_yoga_113", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "asatyavadi_yoga", + "annadana_yoga", + "bhratruvriddhi_yoga", + "satkathadisravana_yoga", + "utthama_graha_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "anapathya_yoga", + "bahu_puthra_yoga_220", + "eka_puthra_yoga", + "suputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "khalwata_yoga" + ], + "count": 36, + "status": "ok" + } + }, + { + "name": "Winston Churchill", + "date": "1874-11-30", + "time": "01:30", + "tz": "+00:00", + "lat": 51.8415, + "lon": -1.361, + "city": "Blenheim Palace, UK", + "expected_yogas": [ + "vosi_yoga", + "sunaphaa_yoga", + "paasa_yoga", + "asubha_yoga", + "kaahala_yoga", + "sankha_yoga", + "harsha_yoga", + "vanchana_chora_bheethi_yoga", + "dharidhra_yoga_152", + "sareera_soukhya_yoga", + "sada_sanchara_yoga", + "matrumooladdhana_yoga", + "durmukha_yoga", + "annadana_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "suputhra_yoga", + "buddhimaturya_yoga", + "theevrabuddhi_yoga", + "buddhi_jada_yoga", + "khalwata_yoga", + "rajabhrashta_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vosi_yoga", + "sunaphaa_yoga", + "paasa_yoga", + "asubha_yoga", + "kaahala_yoga", + "sankha_yoga", + "harsha_yoga", + "vanchana_chora_bheethi_yoga", + "dharidhra_yoga_152", + "sareera_soukhya_yoga", + "sada_sanchara_yoga", + "matrumooladdhana_yoga", + "durmukha_yoga", + "annadana_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "suputhra_yoga", + "buddhimaturya_yoga", + "theevrabuddhi_yoga", + "buddhi_jada_yoga", + "khalwata_yoga", + "rajabhrashta_yoga" + ], + "count": 31, + "status": "ok" + } + }, + { + "name": "John F. Kennedy", + "date": "1917-05-29", + "time": "15:00", + "tz": "-05:00", + "lat": 42.3318, + "lon": -71.1212, + "city": "Brookline, USA", + "expected_yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "anaphaa_yoga", + "maalavya_yoga", + "kedaara_yoga", + "guru_mangala_yoga", + "amala_yoga", + "kedara_yoga", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "asatyavadi_yoga", + "annadana_yoga", + "bhratruvriddhi_yoga", + "sodaranasa_yoga", + "yuddha_praveena_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_209", + "vahana_yoga_210", + "buddhimaturya_yoga", + "buddhi_jada_yoga", + "thrikaala_gnana_yoga", + "bhaga_chumbana_yoga", + "galakarna_yoga", + "rajabhrashta_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "anaphaa_yoga", + "maalavya_yoga", + "kedaara_yoga", + "guru_mangala_yoga", + "amala_yoga", + "kedara_yoga", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "asatyavadi_yoga", + "annadana_yoga", + "bhratruvriddhi_yoga", + "sodaranasa_yoga", + "yuddha_praveena_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_209", + "vahana_yoga_210", + "buddhimaturya_yoga", + "buddhi_jada_yoga", + "thrikaala_gnana_yoga", + "bhaga_chumbana_yoga", + "galakarna_yoga", + "rajabhrashta_yoga" + ], + "count": 35, + "status": "ok" + } + }, + { + "name": "Nelson Mandela", + "date": "1918-07-18", + "time": "14:45", + "tz": "+02:00", + "lat": -31.9304, + "lon": 28.9487, + "city": "Mvezo, South Africa", + "expected_yogas": [ + "vosi_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "anaphaa_yoga", + "duradhara_yoga", + "paasa_yoga", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "sumukha_yoga", + "bhratruvriddhi_yoga", + "sodaranasa_yoga", + "parakrama_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "bahu_puthra_yoga_221", + "aputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "theevrabuddhi_yoga", + "satkalatra_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vosi_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "anaphaa_yoga", + "duradhara_yoga", + "paasa_yoga", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "sumukha_yoga", + "bhratruvriddhi_yoga", + "sodaranasa_yoga", + "parakrama_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "bahu_puthra_yoga_221", + "aputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "theevrabuddhi_yoga", + "satkalatra_yoga" + ], + "count": 30, + "status": "ok" + } + }, + { + "name": "Abraham Lincoln", + "date": "1809-02-12", + "time": "06:54", + "tz": "-05:00", + "lat": 38.0293, + "lon": -78.4767, + "city": "Hodgenville, USA", + "expected_yogas": [ + "vesi_yoga", + "nipuna_yoga", + "sarpa_yoga", + "paasa_yoga", + "asubha_yoga", + "kaahala_yoga", + "kalaanidhi_yoga", + "kalanidhi_yoga", + "dharidhra_yoga_152", + "dehasthoulya_yoga_116", + "sumukha_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "satkathadisravana_yoga", + "utthama_graha_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "matru_sneha_yoga", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "nipuna_yoga", + "sarpa_yoga", + "paasa_yoga", + "asubha_yoga", + "kaahala_yoga", + "kalaanidhi_yoga", + "kalanidhi_yoga", + "dharidhra_yoga_152", + "dehasthoulya_yoga_116", + "sumukha_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "satkathadisravana_yoga", + "utthama_graha_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "matru_sneha_yoga", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga" + ], + "count": 23, + "status": "ok" + } + }, + { + "name": "Margaret Thatcher", + "date": "1925-10-13", + "time": "09:00", + "tz": "+00:00", + "lat": 52.9548, + "lon": -1.1581, + "city": "Grantham, UK", + "expected_yogas": [ + "vesi_yoga", + "nipuna_yoga", + "anaphaa_yoga", + "sasa_yoga", + "sarpa_yoga", + "paasa_yoga", + "asubha_yoga", + "sankha_yoga", + "harsha_yoga", + "vanchana_chora_bheethi_yoga", + "dharidhra_yoga_150", + "dharidhra_yoga_152", + "krisanga_yoga_112", + "dehasthoulya_yoga_116", + "swaveeryaddhana_yoga", + "durmukha_yoga", + "vakchalana_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "galakarna_yoga", + "mathibhramana_yoga_variation", + "rajabhrashta_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "nipuna_yoga", + "anaphaa_yoga", + "sasa_yoga", + "sarpa_yoga", + "paasa_yoga", + "asubha_yoga", + "sankha_yoga", + "harsha_yoga", + "vanchana_chora_bheethi_yoga", + "dharidhra_yoga_150", + "dharidhra_yoga_152", + "krisanga_yoga_112", + "dehasthoulya_yoga_116", + "swaveeryaddhana_yoga", + "durmukha_yoga", + "vakchalana_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "galakarna_yoga", + "mathibhramana_yoga_variation", + "rajabhrashta_yoga" + ], + "count": 26, + "status": "ok" + } + }, + { + "name": "Barack Obama", + "date": "1961-08-04", + "time": "19:24", + "tz": "-10:00", + "lat": 21.3099, + "lon": -157.8581, + "city": "Honolulu, USA", + "expected_yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "nipuna_yoga", + "sasa_yoga", + "sarpa_yoga", + "paasa_yoga", + "asubha_yoga", + "amala_yoga", + "kaahala_yoga", + "sankha_yoga", + "kalpadruma_yoga", + "hara_yoga", + "vasumathi_yoga", + "vanchana_chora_bheethi_yoga", + "harihara_brahma_yoga", + "kahala_yoga", + "dharidhra_yoga_149", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "bahu_puthra_yoga_220", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_229", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhi_jada_yoga", + "khalwata_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "nipuna_yoga", + "sasa_yoga", + "sarpa_yoga", + "paasa_yoga", + "asubha_yoga", + "amala_yoga", + "kaahala_yoga", + "sankha_yoga", + "kalpadruma_yoga", + "hara_yoga", + "vasumathi_yoga", + "vanchana_chora_bheethi_yoga", + "harihara_brahma_yoga", + "kahala_yoga", + "dharidhra_yoga_149", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "bahu_puthra_yoga_220", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_229", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhi_jada_yoga", + "khalwata_yoga" + ], + "count": 34, + "status": "ok" + } + }, + { + "name": "Rabindranath Tagore", + "date": "1861-05-07", + "time": "02:30", + "tz": "+05:30", + "lat": 22.5726, + "lon": 88.3639, + "city": "Kolkata, India", + "expected_yogas": [ + "vesi_yoga", + "nipuna_yoga", + "hamsa_yoga", + "paasa_yoga", + "saraswathi_yoga", + "dharidhra_yoga", + "dharidhra_yoga_147", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "dehasthoulya_yoga_115", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "sraddhannabhuktha_yoga", + "sodaranasa_yoga", + "yuddha_praveena_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "satkalatra_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "nipuna_yoga", + "hamsa_yoga", + "paasa_yoga", + "saraswathi_yoga", + "dharidhra_yoga", + "dharidhra_yoga_147", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "dehasthoulya_yoga_115", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "sraddhannabhuktha_yoga", + "sodaranasa_yoga", + "yuddha_praveena_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "satkalatra_yoga" + ], + "count": 27, + "status": "ok" + } + }, + { + "name": "Ludwig van Beethoven", + "date": "1770-12-17", + "time": "15:40", + "tz": "+01:00", + "lat": 50.7374, + "lon": 7.0982, + "city": "Bonn, Germany", + "expected_yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "anaphaa_yoga", + "duradhara_yoga", + "kedaara_yoga", + "guru_mangala_yoga", + "kaahala_yoga", + "kalaanidhi_yoga", + "vanchana_chora_bheethi_yoga", + "kahala_yoga", + "kalanidhi_yoga", + "kedara_yoga", + "dhur_yoga", + "dharidhra_yoga_149", + "krisanga_yoga_112", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "annadana_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "matru_sneha_yoga", + "anapathya_yoga", + "bahu_puthra_yoga_221", + "eka_puthra_yoga", + "suputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "buddhi_jada_yoga", + "mathibhramana_yoga_293", + "khalwata_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "anaphaa_yoga", + "duradhara_yoga", + "kedaara_yoga", + "guru_mangala_yoga", + "kaahala_yoga", + "kalaanidhi_yoga", + "vanchana_chora_bheethi_yoga", + "kahala_yoga", + "kalanidhi_yoga", + "kedara_yoga", + "dhur_yoga", + "dharidhra_yoga_149", + "krisanga_yoga_112", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "annadana_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "matru_sneha_yoga", + "anapathya_yoga", + "bahu_puthra_yoga_221", + "eka_puthra_yoga", + "suputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "buddhi_jada_yoga", + "mathibhramana_yoga_293", + "khalwata_yoga" + ], + "count": 38, + "status": "ok" + } + }, + { + "name": "Wolfgang Mozart", + "date": "1756-01-27", + "time": "20:55", + "tz": "+01:00", + "lat": 47.8095, + "lon": 13.055, + "city": "Salzburg, Austria", + "expected_yogas": [ + "vesi_yoga", + "nipuna_yoga", + "sasa_yoga", + "paasa_yoga", + "hara_yoga", + "vanchana_chora_bheethi_yoga", + "harihara_brahma_yoga", + "kahala_yoga", + "dharidhra_yoga_149", + "krisanga_yoga_112", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "asatyavadi_yoga", + "durmukha_yoga", + "vakchalana_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_210", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "nipuna_yoga", + "sasa_yoga", + "paasa_yoga", + "hara_yoga", + "vanchana_chora_bheethi_yoga", + "harihara_brahma_yoga", + "kahala_yoga", + "dharidhra_yoga_149", + "krisanga_yoga_112", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "asatyavadi_yoga", + "durmukha_yoga", + "vakchalana_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_210", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230" + ], + "count": 31, + "status": "ok" + } + }, + { + "name": "Pablo Picasso", + "date": "1881-10-25", + "time": "23:15", + "tz": "+00:00", + "lat": 36.7213, + "lon": -4.4214, + "city": "Malaga, Spain", + "expected_yogas": [ + "vosi_yoga", + "daama_yoga", + "hari_yoga", + "vanchana_chora_bheethi_yoga", + "harihara_brahma_yoga", + "dama_yoga", + "dhur_yoga", + "dharidhra_yoga_149", + "rogagrastha_yoga", + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_116", + "sumukha_yoga", + "parannabhojana_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "yuddha_praveena_yoga", + "grihanasa_yoga_192", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "anapathya_yoga", + "bahu_puthra_yoga_220", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhi_jada_yoga", + "satkalatra_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vosi_yoga", + "daama_yoga", + "hari_yoga", + "vanchana_chora_bheethi_yoga", + "harihara_brahma_yoga", + "dama_yoga", + "dhur_yoga", + "dharidhra_yoga_149", + "rogagrastha_yoga", + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_116", + "sumukha_yoga", + "parannabhojana_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "yuddha_praveena_yoga", + "grihanasa_yoga_192", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "anapathya_yoga", + "bahu_puthra_yoga_220", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhi_jada_yoga", + "satkalatra_yoga" + ], + "count": 27, + "status": "ok" + } + }, + { + "name": "Vincent van Gogh", + "date": "1853-03-30", + "time": "11:00", + "tz": "+00:20", + "lat": 51.4865, + "lon": 3.5515, + "city": "Zundert, Netherlands", + "expected_yogas": [ + "vesi_yoga", + "sunaphaa_yoga", + "kedaara_yoga", + "asubha_yoga", + "sankha_yoga", + "trilochana_yoga", + "vanchana_chora_bheethi_yoga", + "mahabhagya_yoga", + "kedara_yoga", + "dharidhra_yoga", + "dharidhra_yoga_146", + "dehasthoulya_yoga_114", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "sumukha_yoga", + "annadana_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matru_sneha_yoga", + "bahu_puthra_yoga_221", + "suputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "bahu_sthree_yoga", + "bhaga_chumbana_yoga", + "mathibhramana_yoga_variation" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "sunaphaa_yoga", + "kedaara_yoga", + "asubha_yoga", + "sankha_yoga", + "trilochana_yoga", + "vanchana_chora_bheethi_yoga", + "mahabhagya_yoga", + "kedara_yoga", + "dharidhra_yoga", + "dharidhra_yoga_146", + "dehasthoulya_yoga_114", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "sumukha_yoga", + "annadana_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matru_sneha_yoga", + "bahu_puthra_yoga_221", + "suputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "bahu_sthree_yoga", + "bhaga_chumbana_yoga", + "mathibhramana_yoga_variation" + ], + "count": 30, + "status": "ok" + } + }, + { + "name": "Charlie Chaplin", + "date": "1889-04-16", + "time": "20:00", + "tz": "+00:00", + "lat": 51.5074, + "lon": -0.1278, + "city": "London, UK", + "expected_yogas": [ + "vosi_yoga", + "kemadruma_yoga", + "paasa_yoga", + "kaahala_yoga", + "vasumathi_yoga", + "go_yoga", + "harsha_yoga", + "dhur_yoga", + "dharidhra_yoga_149", + "dehapushti_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "sumukha_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matru_sneha_yoga", + "vahana_yoga_210", + "anapathya_yoga", + "bahu_puthra_yoga_221", + "suputhra_yoga", + "buddhimaturya_yoga", + "bahu_sthree_yoga", + "satkalatra_yoga", + "pittharoga_yoga", + "bharyasahavyabhichara_yoga", + "mathibhramana_yoga_variation", + "khalwata_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vosi_yoga", + "kemadruma_yoga", + "paasa_yoga", + "kaahala_yoga", + "vasumathi_yoga", + "go_yoga", + "harsha_yoga", + "dhur_yoga", + "dharidhra_yoga_149", + "dehapushti_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "sumukha_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matru_sneha_yoga", + "vahana_yoga_210", + "anapathya_yoga", + "bahu_puthra_yoga_221", + "suputhra_yoga", + "buddhimaturya_yoga", + "bahu_sthree_yoga", + "satkalatra_yoga", + "pittharoga_yoga", + "bharyasahavyabhichara_yoga", + "mathibhramana_yoga_variation", + "khalwata_yoga" + ], + "count": 35, + "status": "ok" + } + }, + { + "name": "Elvis Presley", + "date": "1935-01-08", + "time": "04:35", + "tz": "-06:00", + "lat": 34.2576, + "lon": -88.7034, + "city": "Tupelo, USA", + "expected_yogas": [ + "vesi_yoga", + "nipuna_yoga", + "anaphaa_yoga", + "paasa_yoga", + "asubha_yoga", + "kaahala_yoga", + "vanchana_chora_bheethi_yoga", + "kahala_yoga", + "dharidhra_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_151", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "madhya_vayasi_dhana_yoga", + "asatyavadi_yoga", + "sumukha_yoga", + "bhratruvriddhi_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "kapata_yoga_202", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221", + "aputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "nipuna_yoga", + "anaphaa_yoga", + "paasa_yoga", + "asubha_yoga", + "kaahala_yoga", + "vanchana_chora_bheethi_yoga", + "kahala_yoga", + "dharidhra_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_151", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "madhya_vayasi_dhana_yoga", + "asatyavadi_yoga", + "sumukha_yoga", + "bhratruvriddhi_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "kapata_yoga_202", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221", + "aputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga" + ], + "count": 34, + "status": "ok" + } + }, + { + "name": "Michael Jackson", + "date": "1958-08-29", + "time": "19:33", + "tz": "-05:00", + "lat": 41.5934, + "lon": -87.3369, + "city": "Gary, USA", + "expected_yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "daama_yoga", + "guru_mangala_yoga", + "amala_yoga", + "vasumathi_yoga", + "vimala_yoga", + "vanchana_chora_bheethi_yoga", + "dama_yoga", + "dharidhra_yoga", + "dharidhra_yoga_149", + "rogagrastha_yoga", + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "matrumooladdhana_yoga", + "sumukha_yoga", + "vakchalana_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "satkathadisravana_yoga", + "utthama_graha_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_210", + "anapathya_yoga", + "bahu_puthra_yoga_220", + "eka_puthra_yoga", + "buddhi_jada_yoga", + "satkalatra_yoga", + "mathibhramana_yoga_294", + "khalwata_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "daama_yoga", + "guru_mangala_yoga", + "amala_yoga", + "vasumathi_yoga", + "vimala_yoga", + "vanchana_chora_bheethi_yoga", + "dama_yoga", + "dharidhra_yoga", + "dharidhra_yoga_149", + "rogagrastha_yoga", + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "matrumooladdhana_yoga", + "sumukha_yoga", + "vakchalana_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "satkathadisravana_yoga", + "utthama_graha_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_210", + "anapathya_yoga", + "bahu_puthra_yoga_220", + "eka_puthra_yoga", + "buddhi_jada_yoga", + "satkalatra_yoga", + "mathibhramana_yoga_294", + "khalwata_yoga" + ], + "count": 40, + "status": "ok" + } + }, + { + "name": "A.R. Rahman", + "date": "1967-01-06", + "time": "03:45", + "tz": "+05:30", + "lat": 13.0827, + "lon": 80.2707, + "city": "Chennai, India", + "expected_yogas": [ + "vesi_yoga", + "nipuna_yoga", + "anaphaa_yoga", + "sarpa_yoga", + "daama_yoga", + "asubha_yoga", + "gaja_kesari_yoga", + "amala_yoga", + "kaahala_yoga", + "kahala_yoga", + "dama_yoga", + "dharidhra_yoga_149", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "matrumooladdhana_yoga", + "asatyavadi_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "vahana_yoga_209", + "eka_puthra_yoga", + "satkalatra_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "nipuna_yoga", + "anaphaa_yoga", + "sarpa_yoga", + "daama_yoga", + "asubha_yoga", + "gaja_kesari_yoga", + "amala_yoga", + "kaahala_yoga", + "kahala_yoga", + "dama_yoga", + "dharidhra_yoga_149", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "matrumooladdhana_yoga", + "asatyavadi_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "vahana_yoga_209", + "eka_puthra_yoga", + "satkalatra_yoga" + ], + "count": 28, + "status": "ok" + } + }, + { + "name": "Lata Mangeshkar", + "date": "1929-09-28", + "time": "22:30", + "tz": "+05:30", + "lat": 18.5204, + "lon": 73.8567, + "city": "Indore, India", + "expected_yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "bhadra_yoga", + "daama_yoga", + "kalpadruma_yoga", + "hara_yoga", + "vasumathi_yoga", + "vanchana_chora_bheethi_yoga", + "harihara_brahma_yoga", + "kahala_yoga", + "dama_yoga", + "dhur_yoga", + "dharidhra_yoga_149", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "swaveeryaddhana_yoga", + "bhratruvriddhi_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "vahana_yoga_210", + "bahu_puthra_yoga_221", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "satkalatra_yoga", + "mathibhramana_yoga_variation", + "rajabhrashta_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "bhadra_yoga", + "daama_yoga", + "kalpadruma_yoga", + "hara_yoga", + "vasumathi_yoga", + "vanchana_chora_bheethi_yoga", + "harihara_brahma_yoga", + "kahala_yoga", + "dama_yoga", + "dhur_yoga", + "dharidhra_yoga_149", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "swaveeryaddhana_yoga", + "bhratruvriddhi_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "vahana_yoga_210", + "bahu_puthra_yoga_221", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "satkalatra_yoga", + "mathibhramana_yoga_variation", + "rajabhrashta_yoga" + ], + "count": 36, + "status": "ok" + } + }, + { + "name": "Steve Jobs", + "date": "1955-02-24", + "time": "19:00", + "tz": "-08:00", + "lat": 37.7749, + "lon": -122.4194, + "city": "San Francisco, USA", + "expected_yogas": [ + "vosi_yoga", + "sunaphaa_yoga", + "ruchaka_yoga", + "sasa_yoga", + "veenaa_yoga", + "asubha_yoga", + "amala_yoga", + "sankha_yoga", + "bheri_yoga", + "vanchana_chora_bheethi_yoga", + "vallaki_yoga", + "dhur_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_152", + "krisanga_yoga_112", + "dehasthoulya_yoga_116", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "parannabhojana_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "satkathadisravana_yoga", + "utthama_graha_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "anapathya_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhi_jada_yoga", + "satkalatra_yoga", + "rajabhrashta_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vosi_yoga", + "sunaphaa_yoga", + "ruchaka_yoga", + "sasa_yoga", + "veenaa_yoga", + "asubha_yoga", + "amala_yoga", + "sankha_yoga", + "bheri_yoga", + "vanchana_chora_bheethi_yoga", + "vallaki_yoga", + "dhur_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_152", + "krisanga_yoga_112", + "dehasthoulya_yoga_116", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "parannabhojana_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "satkathadisravana_yoga", + "utthama_graha_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "anapathya_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhi_jada_yoga", + "satkalatra_yoga", + "rajabhrashta_yoga" + ], + "count": 36, + "status": "ok" + } + }, + { + "name": "Bill Gates", + "date": "1955-10-28", + "time": "22:00", + "tz": "-08:00", + "lat": 47.6062, + "lon": -122.3321, + "city": "Seattle, USA", + "expected_yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "sasa_yoga", + "maalavya_yoga", + "kedaara_yoga", + "kedara_yoga", + "dharidhra_yoga_149", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_116", + "matrumooladdhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "sumukha_yoga", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "vahana_yoga_209", + "vahana_yoga_210", + "sarpasaapa_yoga_212", + "kaalanirdesat_puthranaasa_yoga_230", + "bhaga_chumbana_yoga", + "galakarna_yoga", + "rajabhrashta_yoga", + "raja_bhanga_yoga_299" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "sasa_yoga", + "maalavya_yoga", + "kedaara_yoga", + "kedara_yoga", + "dharidhra_yoga_149", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_116", + "matrumooladdhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "sumukha_yoga", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "vahana_yoga_209", + "vahana_yoga_210", + "sarpasaapa_yoga_212", + "kaalanirdesat_puthranaasa_yoga_230", + "bhaga_chumbana_yoga", + "galakarna_yoga", + "rajabhrashta_yoga", + "raja_bhanga_yoga_299" + ], + "count": 32, + "status": "ok" + } + }, + { + "name": "Elon Musk", + "date": "1971-06-28", + "time": "07:30", + "tz": "+02:00", + "lat": -25.7479, + "lon": 28.2293, + "city": "Pretoria, South Africa", + "expected_yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "nipuna_yoga", + "anaphaa_yoga", + "bhadra_yoga", + "paasa_yoga", + "gaja_kesari_yoga", + "amala_yoga", + "sankha_yoga", + "bheri_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_151", + "krisanga_yoga_112", + "dehasthoulya_yoga_115", + "sada_sanchara_yoga", + "asatyavadi_yoga", + "bhratruvriddhi_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "kapata_yoga_202", + "nishkapata_yoga_205", + "vahana_yoga_209", + "vahana_yoga_210", + "anapathya_yoga", + "aputhra_yoga", + "buddhimaturya_yoga", + "satkalatra_yoga", + "bhaagya_yoga", + "guhyaroga_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "nipuna_yoga", + "anaphaa_yoga", + "bhadra_yoga", + "paasa_yoga", + "gaja_kesari_yoga", + "amala_yoga", + "sankha_yoga", + "bheri_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_151", + "krisanga_yoga_112", + "dehasthoulya_yoga_115", + "sada_sanchara_yoga", + "asatyavadi_yoga", + "bhratruvriddhi_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "kapata_yoga_202", + "nishkapata_yoga_205", + "vahana_yoga_209", + "vahana_yoga_210", + "anapathya_yoga", + "aputhra_yoga", + "buddhimaturya_yoga", + "satkalatra_yoga", + "bhaagya_yoga", + "guhyaroga_yoga" + ], + "count": 32, + "status": "ok" + } + }, + { + "name": "Jeff Bezos", + "date": "1964-01-12", + "time": "17:44", + "tz": "-07:00", + "lat": 35.0844, + "lon": -106.6504, + "city": "Albuquerque, USA", + "expected_yogas": [ + "vesi_yoga", + "nipuna_yoga", + "hamsa_yoga", + "kedaara_yoga", + "kaahala_yoga", + "kalpadruma_yoga", + "saraswathi_yoga", + "vanchana_chora_bheethi_yoga", + "kedara_yoga", + "dharidhra_yoga_149", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "dehasthoulya_yoga_115", + "swaveeryaddhana_yoga", + "asatyavadi_yoga", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_209", + "vahana_yoga_210", + "dattha_puthra_yoga_222", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga", + "bhaagya_yoga", + "mathibhramana_yoga_variation" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "nipuna_yoga", + "hamsa_yoga", + "kedaara_yoga", + "kaahala_yoga", + "kalpadruma_yoga", + "saraswathi_yoga", + "vanchana_chora_bheethi_yoga", + "kedara_yoga", + "dharidhra_yoga_149", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "dehasthoulya_yoga_115", + "swaveeryaddhana_yoga", + "asatyavadi_yoga", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_209", + "vahana_yoga_210", + "dattha_puthra_yoga_222", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga", + "bhaagya_yoga", + "mathibhramana_yoga_variation" + ], + "count": 32, + "status": "ok" + } + }, + { + "name": "Warren Buffett", + "date": "1930-08-30", + "time": "15:00", + "tz": "-06:00", + "lat": 41.2565, + "lon": -95.9345, + "city": "Omaha, USA", + "expected_yogas": [ + "vesi_yoga", + "sunaphaa_yoga", + "anaphaa_yoga", + "duradhara_yoga", + "bhadra_yoga", + "paasa_yoga", + "guru_mangala_yoga", + "kaahala_yoga", + "sankha_yoga", + "bheri_yoga", + "vanchana_chora_bheethi_yoga", + "kahala_yoga", + "dharidhra_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_152", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "dehasthoulya_yoga_115", + "swaveeryaddhana_yoga", + "asatyavadi_yoga", + "yuddhatpoorvadridhachitta_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "vahana_yoga_210", + "anapathya_yoga", + "bahu_puthra_yoga_221", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "satkalatra_yoga", + "bhaga_chumbana_yoga", + "vrana_yoga", + "vaatharoga_yoga", + "mathibhramana_yoga_variation" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "sunaphaa_yoga", + "anaphaa_yoga", + "duradhara_yoga", + "bhadra_yoga", + "paasa_yoga", + "guru_mangala_yoga", + "kaahala_yoga", + "sankha_yoga", + "bheri_yoga", + "vanchana_chora_bheethi_yoga", + "kahala_yoga", + "dharidhra_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_152", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "dehasthoulya_yoga_115", + "swaveeryaddhana_yoga", + "asatyavadi_yoga", + "yuddhatpoorvadridhachitta_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "vahana_yoga_210", + "anapathya_yoga", + "bahu_puthra_yoga_221", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "satkalatra_yoga", + "bhaga_chumbana_yoga", + "vrana_yoga", + "vaatharoga_yoga", + "mathibhramana_yoga_variation" + ], + "count": 40, + "status": "ok" + } + }, + { + "name": "Mukesh Ambani", + "date": "1957-04-19", + "time": "19:45", + "tz": "+03:00", + "lat": 12.779, + "lon": 45.009, + "city": "Aden, Yemen", + "expected_yogas": [ + "vesi_yoga", + "nipuna_yoga", + "anaphaa_yoga", + "kedaara_yoga", + "gaja_kesari_yoga", + "amala_yoga", + "parvata_yoga", + "kaahala_yoga", + "bhaarathi_yoga", + "saraswathi_yoga", + "vasumathi_yoga", + "kedara_yoga", + "dharidhra_yoga", + "dharidhra_yoga_151", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_209", + "anapathya_yoga", + "aputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhi_jada_yoga", + "satkalatra_yoga", + "dhatrutwa_yoga", + "mathibhramana_yoga_293", + "khalwata_yoga", + "nishturabhashi_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "nipuna_yoga", + "anaphaa_yoga", + "kedaara_yoga", + "gaja_kesari_yoga", + "amala_yoga", + "parvata_yoga", + "kaahala_yoga", + "bhaarathi_yoga", + "saraswathi_yoga", + "vasumathi_yoga", + "kedara_yoga", + "dharidhra_yoga", + "dharidhra_yoga_151", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_209", + "anapathya_yoga", + "aputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhi_jada_yoga", + "satkalatra_yoga", + "dhatrutwa_yoga", + "mathibhramana_yoga_293", + "khalwata_yoga", + "nishturabhashi_yoga" + ], + "count": 36, + "status": "ok" + } + }, + { + "name": "Ratan Tata", + "date": "1937-12-28", + "time": "00:30", + "tz": "+05:30", + "lat": 18.9219, + "lon": 72.8346, + "city": "Mumbai, India", + "expected_yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "paasa_yoga", + "kaahala_yoga", + "vanchana_chora_bheethi_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_150", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "bahu_puthra_yoga_221", + "eka_puthra_yoga", + "satkalatra_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "paasa_yoga", + "kaahala_yoga", + "vanchana_chora_bheethi_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_150", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "bahu_puthra_yoga_221", + "eka_puthra_yoga", + "satkalatra_yoga" + ], + "count": 29, + "status": "ok" + } + }, + { + "name": "Narayana Murthy", + "date": "1946-08-20", + "time": "01:15", + "tz": "+05:30", + "lat": 13.173, + "lon": 77.799, + "city": "Shidlaghatta, India", + "expected_yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "sunaphaa_yoga", + "adhi_yoga", + "sarpa_yoga", + "kedaara_yoga", + "asubha_yoga", + "guru_mangala_yoga", + "vasumathi_yoga", + "jaya_yoga", + "vanchana_chora_bheethi_yoga", + "kedara_yoga", + "dharidhra_yoga_149", + "rogagrastha_yoga", + "krisanga_yoga_112", + "krisanga_yoga_113", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "sraddhannabhuktha_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_210", + "bahu_puthra_yoga_221", + "bahu_sthree_yoga", + "satkalatra_yoga", + "bharyasahavyabhichara_yoga", + "mathibhramana_yoga_variation", + "khalwata_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "sunaphaa_yoga", + "adhi_yoga", + "sarpa_yoga", + "kedaara_yoga", + "asubha_yoga", + "guru_mangala_yoga", + "vasumathi_yoga", + "jaya_yoga", + "vanchana_chora_bheethi_yoga", + "kedara_yoga", + "dharidhra_yoga_149", + "rogagrastha_yoga", + "krisanga_yoga_112", + "krisanga_yoga_113", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "sraddhannabhuktha_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_210", + "bahu_puthra_yoga_221", + "bahu_sthree_yoga", + "satkalatra_yoga", + "bharyasahavyabhichara_yoga", + "mathibhramana_yoga_variation", + "khalwata_yoga" + ], + "count": 32, + "status": "ok" + } + }, + { + "name": "Azim Premji", + "date": "1945-07-24", + "time": "07:30", + "tz": "+05:30", + "lat": 18.5204, + "lon": 73.8567, + "city": "Mumbai, India", + "expected_yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "daama_yoga", + "gaja_kesari_yoga", + "amala_yoga", + "kaahala_yoga", + "vanchana_chora_bheethi_yoga", + "dama_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "sumukha_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "eka_puthra_yoga", + "bahu_sthree_yoga", + "satkalatra_yoga", + "khalwata_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "daama_yoga", + "gaja_kesari_yoga", + "amala_yoga", + "kaahala_yoga", + "vanchana_chora_bheethi_yoga", + "dama_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "sumukha_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "eka_puthra_yoga", + "bahu_sthree_yoga", + "satkalatra_yoga", + "khalwata_yoga" + ], + "count": 25, + "status": "ok" + } + }, + { + "name": "Dhirubhai Ambani", + "date": "1932-12-28", + "time": "06:55", + "tz": "+05:30", + "lat": 20.852, + "lon": 70.4836, + "city": "Chorwad, India", + "expected_yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "sunaphaa_yoga", + "anaphaa_yoga", + "duradhara_yoga", + "kedaara_yoga", + "guru_mangala_yoga", + "kaahala_yoga", + "bheri_yoga", + "trilochana_yoga", + "kedara_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_150", + "rogagrastha_yoga", + "krisanga_yoga_112", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "asatyavadi_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "grihanasa_yoga_192", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga", + "mathibhramana_yoga_variation" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "sunaphaa_yoga", + "anaphaa_yoga", + "duradhara_yoga", + "kedaara_yoga", + "guru_mangala_yoga", + "kaahala_yoga", + "bheri_yoga", + "trilochana_yoga", + "kedara_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_150", + "rogagrastha_yoga", + "krisanga_yoga_112", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "asatyavadi_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "grihanasa_yoga_192", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matrunasa_yoga_199", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga", + "mathibhramana_yoga_variation" + ], + "count": 33, + "status": "ok" + } + }, + { + "name": "Sachin Tendulkar", + "date": "1973-04-24", + "time": "14:00", + "tz": "+05:30", + "lat": 19.076, + "lon": 72.8777, + "city": "Mumbai, India", + "expected_yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "sunaphaa_yoga", + "paasa_yoga", + "asubha_yoga", + "guru_mangala_yoga", + "kaahala_yoga", + "bheri_yoga", + "bhaarathi_yoga", + "dharidhra_yoga", + "dharidhra_yoga_152", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "sumukha_yoga", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "bahu_puthra_yoga_221", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga", + "pisacha_grastha_yoga", + "khalwata_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "sunaphaa_yoga", + "paasa_yoga", + "asubha_yoga", + "guru_mangala_yoga", + "kaahala_yoga", + "bheri_yoga", + "bhaarathi_yoga", + "dharidhra_yoga", + "dharidhra_yoga_152", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "sumukha_yoga", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "bahu_puthra_yoga_221", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga", + "pisacha_grastha_yoga", + "khalwata_yoga" + ], + "count": 31, + "status": "ok" + } + }, + { + "name": "Virat Kohli", + "date": "1988-11-05", + "time": "10:28", + "tz": "+05:30", + "lat": 28.6139, + "lon": 77.209, + "city": "Delhi, India", + "expected_yogas": [ + "vosi_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "daama_yoga", + "amala_yoga", + "sankha_yoga", + "hari_yoga", + "vasumathi_yoga", + "vanchana_chora_bheethi_yoga", + "harihara_brahma_yoga", + "dama_yoga", + "krisanga_yoga_112", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "sumukha_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga", + "bhaga_chumbana_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vosi_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "daama_yoga", + "amala_yoga", + "sankha_yoga", + "hari_yoga", + "vasumathi_yoga", + "vanchana_chora_bheethi_yoga", + "harihara_brahma_yoga", + "dama_yoga", + "krisanga_yoga_112", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "sumukha_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga", + "bhaga_chumbana_yoga" + ], + "count": 26, + "status": "ok" + } + }, + { + "name": "MS Dhoni", + "date": "1981-07-07", + "time": "17:35", + "tz": "+05:30", + "lat": 23.3441, + "lon": 85.3096, + "city": "Ranchi, India", + "expected_yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "anaphaa_yoga", + "duradhara_yoga", + "bhadra_yoga", + "paasa_yoga", + "kaahala_yoga", + "saraswathi_yoga", + "vanchana_chora_bheethi_yoga", + "dharidhra_yoga_151", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "sodaranasa_yoga", + "yuddha_praveena_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_210", + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221", + "aputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "satkalatra_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "anaphaa_yoga", + "duradhara_yoga", + "bhadra_yoga", + "paasa_yoga", + "kaahala_yoga", + "saraswathi_yoga", + "vanchana_chora_bheethi_yoga", + "dharidhra_yoga_151", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "sodaranasa_yoga", + "yuddha_praveena_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_210", + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221", + "aputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "satkalatra_yoga" + ], + "count": 33, + "status": "ok" + } + }, + { + "name": "Muhammad Ali", + "date": "1942-01-17", + "time": "18:35", + "tz": "-06:00", + "lat": 38.2527, + "lon": -85.7585, + "city": "Louisville, USA", + "expected_yogas": [ + "vesi_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "ruchaka_yoga", + "soola_yoga", + "pushkala_yoga", + "vanchana_chora_bheethi_yoga", + "kahala_yoga", + "sula_yoga", + "dharidhra_yoga_149", + "sareera_soukhya_yoga", + "dehapushti_yoga", + "krisanga_yoga_112", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "asatyavadi_yoga", + "sraddhannabhuktha_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga", + "bhaga_chumbana_yoga", + "mathibhramana_yoga_294" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "ruchaka_yoga", + "soola_yoga", + "pushkala_yoga", + "vanchana_chora_bheethi_yoga", + "kahala_yoga", + "sula_yoga", + "dharidhra_yoga_149", + "sareera_soukhya_yoga", + "dehapushti_yoga", + "krisanga_yoga_112", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "asatyavadi_yoga", + "sraddhannabhuktha_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga", + "bhaga_chumbana_yoga", + "mathibhramana_yoga_294" + ], + "count": 32, + "status": "ok" + } + }, + { + "name": "Michael Jordan", + "date": "1963-02-17", + "time": "10:20", + "tz": "-05:00", + "lat": 40.6782, + "lon": -73.9442, + "city": "Brooklyn, USA", + "expected_yogas": [ + "vosi_yoga", + "sunaphaa_yoga", + "sasa_yoga", + "paasa_yoga", + "gaja_kesari_yoga", + "hari_yoga", + "bhaarathi_yoga", + "harihara_brahma_yoga", + "dharidhra_yoga_150", + "krisanga_yoga_112", + "dehasthoulya_yoga_116", + "swaveeryaddhana_yoga", + "matrumooladdhana_yoga", + "asatyavadi_yoga", + "durmukha_yoga", + "parannabhojana_yoga", + "sraddhannabhuktha_yoga", + "vakchalana_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_210", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga", + "bhaga_chumbana_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vosi_yoga", + "sunaphaa_yoga", + "sasa_yoga", + "paasa_yoga", + "gaja_kesari_yoga", + "hari_yoga", + "bhaarathi_yoga", + "harihara_brahma_yoga", + "dharidhra_yoga_150", + "krisanga_yoga_112", + "dehasthoulya_yoga_116", + "swaveeryaddhana_yoga", + "matrumooladdhana_yoga", + "asatyavadi_yoga", + "durmukha_yoga", + "parannabhojana_yoga", + "sraddhannabhuktha_yoga", + "vakchalana_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_210", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga", + "bhaga_chumbana_yoga" + ], + "count": 31, + "status": "ok" + } + }, + { + "name": "Lionel Messi", + "date": "1987-06-24", + "time": "20:30", + "tz": "-03:00", + "lat": -32.9442, + "lon": -60.6505, + "city": "Rosario, Argentina", + "expected_yogas": [ + "nipuna_yoga", + "anaphaa_yoga", + "maalavya_yoga", + "kedaara_yoga", + "kusuma_yoga", + "vanchana_chora_bheethi_yoga", + "kedara_yoga", + "dharidhra_yoga_150", + "sareera_soukhya_yoga", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "madhya_vayasi_dhana_yoga", + "asatyavadi_yoga", + "bhratruvriddhi_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhubhisthyaktha_yoga", + "matrudeerghayur_yoga_196", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_210", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga", + "bhaagya_yoga", + "mathibhramana_yoga_variation", + "rajabhrashta_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "nipuna_yoga", + "anaphaa_yoga", + "maalavya_yoga", + "kedaara_yoga", + "kusuma_yoga", + "vanchana_chora_bheethi_yoga", + "kedara_yoga", + "dharidhra_yoga_150", + "sareera_soukhya_yoga", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "madhya_vayasi_dhana_yoga", + "asatyavadi_yoga", + "bhratruvriddhi_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhubhisthyaktha_yoga", + "matrudeerghayur_yoga_196", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_210", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga", + "bhaagya_yoga", + "mathibhramana_yoga_variation", + "rajabhrashta_yoga" + ], + "count": 28, + "status": "ok" + } + }, + { + "name": "Cristiano Ronaldo", + "date": "1985-02-05", + "time": "10:20", + "tz": "+00:00", + "lat": 32.6669, + "lon": -16.9241, + "city": "Funchal, Portugal", + "expected_yogas": [ + "nipuna_yoga", + "maalavya_yoga", + "kedaara_yoga", + "kaahala_yoga", + "kalaanidhi_yoga", + "lakshmi_yoga", + "bhaarathi_yoga", + "mahabhagya_yoga", + "kalanidhi_yoga", + "kedara_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_150", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "bahu_sthree_yoga", + "satkalatra_yoga", + "yuddha_marana_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "nipuna_yoga", + "maalavya_yoga", + "kedaara_yoga", + "kaahala_yoga", + "kalaanidhi_yoga", + "lakshmi_yoga", + "bhaarathi_yoga", + "mahabhagya_yoga", + "kalanidhi_yoga", + "kedara_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_150", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "bahu_sthree_yoga", + "satkalatra_yoga", + "yuddha_marana_yoga" + ], + "count": 29, + "status": "ok" + } + }, + { + "name": "Serena Williams", + "date": "1981-09-26", + "time": "20:28", + "tz": "-04:00", + "lat": 43.4195, + "lon": -83.9508, + "city": "Saginaw, USA", + "expected_yogas": [ + "vesi_yoga", + "anaphaa_yoga", + "kedaara_yoga", + "sankha_yoga", + "saraswathi_yoga", + "kedara_yoga", + "dharidhra_yoga_149", + "sareera_soukhya_yoga", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "vakchalana_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "anapathya_yoga", + "eka_puthra_yoga", + "buddhimaturya_yoga", + "satkalatra_yoga", + "mathibhramana_yoga_variation", + "rajabhrashta_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "anaphaa_yoga", + "kedaara_yoga", + "sankha_yoga", + "saraswathi_yoga", + "kedara_yoga", + "dharidhra_yoga_149", + "sareera_soukhya_yoga", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "vakchalana_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "anapathya_yoga", + "eka_puthra_yoga", + "buddhimaturya_yoga", + "satkalatra_yoga", + "mathibhramana_yoga_variation", + "rajabhrashta_yoga" + ], + "count": 25, + "status": "ok" + } + }, + { + "name": "Pele", + "date": "1940-10-23", + "time": "03:00", + "tz": "-03:00", + "lat": -21.6929, + "lon": -45.258, + "city": "Tres Coracoes, Brazil", + "expected_yogas": [ + "vosi_yoga", + "nipuna_yoga", + "sarpa_yoga", + "paasa_yoga", + "asubha_yoga", + "kaahala_yoga", + "vasumathi_yoga", + "vanchana_chora_bheethi_yoga", + "kahala_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_152", + "dehapushti_yoga", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "vakchalana_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "bahu_puthra_yoga_221", + "buddhimaturya_yoga", + "bahu_sthree_yoga", + "satkalatra_yoga", + "mathibhramana_yoga_variation" + ], + "pyjhora_raw": { + "yogas": [ + "vosi_yoga", + "nipuna_yoga", + "sarpa_yoga", + "paasa_yoga", + "asubha_yoga", + "kaahala_yoga", + "vasumathi_yoga", + "vanchana_chora_bheethi_yoga", + "kahala_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_152", + "dehapushti_yoga", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "vakchalana_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "bahu_puthra_yoga_221", + "buddhimaturya_yoga", + "bahu_sthree_yoga", + "satkalatra_yoga", + "mathibhramana_yoga_variation" + ], + "count": 29, + "status": "ok" + } + }, + { + "name": "Roger Federer", + "date": "1981-08-08", + "time": "08:40", + "tz": "+01:00", + "lat": 47.3769, + "lon": 8.5417, + "city": "Basel, Switzerland", + "expected_yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "nipuna_yoga", + "anaphaa_yoga", + "paasa_yoga", + "parvata_yoga", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "madhya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "durmukha_yoga", + "yuddha_praveena_yoga", + "bandhubhisthyaktha_yoga", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "bahu_puthra_yoga_221", + "kaalanirdesat_puthranaasa_yoga_230", + "sirachcheda_yoga", + "rajabhrashta_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "nipuna_yoga", + "anaphaa_yoga", + "paasa_yoga", + "parvata_yoga", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "madhya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "durmukha_yoga", + "yuddha_praveena_yoga", + "bandhubhisthyaktha_yoga", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "bahu_puthra_yoga_221", + "kaalanirdesat_puthranaasa_yoga_230", + "sirachcheda_yoga", + "rajabhrashta_yoga" + ], + "count": 25, + "status": "ok" + } + }, + { + "name": "Swami Vivekananda", + "date": "1863-01-12", + "time": "06:33", + "tz": "+05:30", + "lat": 22.5726, + "lon": 88.3639, + "city": "Kolkata, India", + "expected_yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "sunaphaa_yoga", + "ruchaka_yoga", + "paasa_yoga", + "subha_yoga", + "asubha_yoga", + "guru_mangala_yoga", + "bheri_yoga", + "dhur_yoga", + "dharidhra_yoga", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "dehasthoulya_yoga_115", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "durmukha_yoga", + "parannabhojana_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "aputhra_yoga", + "satkalatra_yoga", + "mathibhramana_yoga_291", + "mathibhramana_yoga_293", + "nishturabhashi_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "vosi_yoga", + "ubhayachara_yoga", + "sunaphaa_yoga", + "ruchaka_yoga", + "paasa_yoga", + "subha_yoga", + "asubha_yoga", + "guru_mangala_yoga", + "bheri_yoga", + "dhur_yoga", + "dharidhra_yoga", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "dehasthoulya_yoga_115", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "durmukha_yoga", + "parannabhojana_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "aputhra_yoga", + "satkalatra_yoga", + "mathibhramana_yoga_291", + "mathibhramana_yoga_293", + "nishturabhashi_yoga" + ], + "count": 35, + "status": "ok" + } + }, + { + "name": "Amitabh Bachchan", + "date": "1942-10-11", + "time": "16:00", + "tz": "+05:30", + "lat": 25.4484, + "lon": 81.7313, + "city": "Prayagraj, India", + "expected_yogas": [ + "vosi_yoga", + "nipuna_yoga", + "kedaara_yoga", + "kaahala_yoga", + "kahala_yoga", + "kedara_yoga", + "sareera_soukhya_yoga", + "dehapushti_yoga", + "rogagrastha_yoga", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "matrumooladdhana_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "satkalatra_yoga", + "galakarna_yoga", + "mathibhramana_yoga_variation", + "rajabhrashta_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vosi_yoga", + "nipuna_yoga", + "kedaara_yoga", + "kaahala_yoga", + "kahala_yoga", + "kedara_yoga", + "sareera_soukhya_yoga", + "dehapushti_yoga", + "rogagrastha_yoga", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "matrumooladdhana_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "matru_sneha_yoga", + "vahana_yoga_209", + "satkalatra_yoga", + "galakarna_yoga", + "mathibhramana_yoga_variation", + "rajabhrashta_yoga" + ], + "count": 25, + "status": "ok" + } + }, + { + "name": "Queen Elizabeth II", + "date": "1926-04-21", + "time": "02:40", + "tz": "+00:00", + "lat": 51.5074, + "lon": -0.1278, + "city": "London, UK", + "expected_yogas": [ + "vosi_yoga", + "anaphaa_yoga", + "daama_yoga", + "asubha_yoga", + "guru_mangala_yoga", + "kaahala_yoga", + "bheri_yoga", + "sarala_yoga", + "vanchana_chora_bheethi_yoga", + "dama_yoga", + "dharidhra_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_152", + "rogagrastha_yoga", + "krisanga_yoga_112", + "krisanga_yoga_113", + "sada_sanchara_yoga", + "madhya_vayasi_dhana_yoga", + "asatyavadi_yoga", + "sumukha_yoga", + "parannabhojana_yoga", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "anapathya_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhi_jada_yoga", + "satkalatra_yoga", + "khalwata_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vosi_yoga", + "anaphaa_yoga", + "daama_yoga", + "asubha_yoga", + "guru_mangala_yoga", + "kaahala_yoga", + "bheri_yoga", + "sarala_yoga", + "vanchana_chora_bheethi_yoga", + "dama_yoga", + "dharidhra_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_152", + "rogagrastha_yoga", + "krisanga_yoga_112", + "krisanga_yoga_113", + "sada_sanchara_yoga", + "madhya_vayasi_dhana_yoga", + "asatyavadi_yoga", + "sumukha_yoga", + "parannabhojana_yoga", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "anapathya_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhi_jada_yoga", + "satkalatra_yoga", + "khalwata_yoga" + ], + "count": 34, + "status": "ok" + } + }, + { + "name": "Princess Diana", + "date": "1961-07-01", + "time": "19:45", + "tz": "+01:00", + "lat": 52.9548, + "lon": -1.1581, + "city": "Sandringham, UK", + "expected_yogas": [ + "nipuna_yoga", + "sunaphaa_yoga", + "kedaara_yoga", + "asubha_yoga", + "kaahala_yoga", + "bheri_yoga", + "kalpadruma_yoga", + "vimala_yoga", + "kedara_yoga", + "dharidhra_yoga", + "dharidhra_yoga_148", + "dharidhra_yoga_150", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "sodaranasa_yoga", + "grihanasa_yoga_192", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga", + "mathibhramana_yoga_293", + "nishturabhashi_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "nipuna_yoga", + "sunaphaa_yoga", + "kedaara_yoga", + "asubha_yoga", + "kaahala_yoga", + "bheri_yoga", + "kalpadruma_yoga", + "vimala_yoga", + "kedara_yoga", + "dharidhra_yoga", + "dharidhra_yoga_148", + "dharidhra_yoga_150", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "sodaranasa_yoga", + "grihanasa_yoga_192", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "eka_puthra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "satkalatra_yoga", + "mathibhramana_yoga_293", + "nishturabhashi_yoga" + ], + "count": 29, + "status": "ok" + } + }, + { + "name": "Dalai Lama", + "date": "1935-07-06", + "time": "04:38", + "tz": "+05:30", + "lat": 26.85, + "lon": 89.4, + "city": "Taktser, Tibet", + "expected_yogas": [ + "nipuna_yoga", + "sunaphaa_yoga", + "paasa_yoga", + "parvata_yoga", + "vanchana_chora_bheethi_yoga", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "swaveeryaddhana_yoga", + "matrumooladdhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "parakrama_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhubhisthyaktha_yoga", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "bahu_puthra_yoga_221", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhi_jada_yoga", + "bharyasahavyabhichara_yoga", + "khalwata_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "nipuna_yoga", + "sunaphaa_yoga", + "paasa_yoga", + "parvata_yoga", + "vanchana_chora_bheethi_yoga", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "swaveeryaddhana_yoga", + "matrumooladdhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "parakrama_yoga", + "ayatna_griha_prapta_yoga_190", + "bandhubhisthyaktha_yoga", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "bahu_puthra_yoga_221", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhi_jada_yoga", + "bharyasahavyabhichara_yoga", + "khalwata_yoga" + ], + "count": 21, + "status": "ok" + } + }, + { + "name": "Pope Francis", + "date": "1936-12-17", + "time": "21:00", + "tz": "-03:00", + "lat": -34.6037, + "lon": -58.3816, + "city": "Buenos Aires, Argentina", + "expected_yogas": [ + "nipuna_yoga", + "sunaphaa_yoga", + "sasa_yoga", + "kedaara_yoga", + "kaahala_yoga", + "kalaanidhi_yoga", + "vanchana_chora_bheethi_yoga", + "kahala_yoga", + "kalanidhi_yoga", + "kedara_yoga", + "dhur_yoga", + "dharidhra_yoga_149", + "krisanga_yoga_112", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "durmukha_yoga", + "annadana_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matru_sneha_yoga", + "anapathya_yoga", + "sarpasaapa_yoga_212", + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221", + "eka_puthra_yoga", + "suputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "bahu_sthree_yoga", + "satkalatra_yoga", + "khalwata_yoga", + "rajabhrashta_yoga", + "raja_bhanga_yoga_298" + ], + "pyjhora_raw": { + "yogas": [ + "nipuna_yoga", + "sunaphaa_yoga", + "sasa_yoga", + "kedaara_yoga", + "kaahala_yoga", + "kalaanidhi_yoga", + "vanchana_chora_bheethi_yoga", + "kahala_yoga", + "kalanidhi_yoga", + "kedara_yoga", + "dhur_yoga", + "dharidhra_yoga_149", + "krisanga_yoga_112", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "matrumooladdhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "durmukha_yoga", + "annadana_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "matru_sneha_yoga", + "anapathya_yoga", + "sarpasaapa_yoga_212", + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221", + "eka_puthra_yoga", + "suputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "bahu_sthree_yoga", + "satkalatra_yoga", + "khalwata_yoga", + "rajabhrashta_yoga", + "raja_bhanga_yoga_298" + ], + "count": 37, + "status": "ok" + } + }, + { + "name": "Osho", + "date": "1931-12-11", + "time": "13:15", + "tz": "+05:30", + "lat": 23.25, + "lon": 77.4167, + "city": "Kuchwada, India", + "expected_yogas": [ + "chandra_mangala_yoga", + "soola_yoga", + "kalpadruma_yoga", + "kahala_yoga", + "sula_yoga", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "dehasthoulya_yoga_114", + "swaveeryaddhana_yoga", + "matrumooladdhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "durmukha_yoga", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "vichitra_saudha_prakara_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_209", + "aputhra_yoga", + "suputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "satkalatra_yoga", + "mathibhramana_yoga_variation", + "khalwata_yoga", + "nishturabhashi_yoga", + "rajabhrashta_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "chandra_mangala_yoga", + "soola_yoga", + "kalpadruma_yoga", + "kahala_yoga", + "sula_yoga", + "sareera_soukhya_yoga", + "krisanga_yoga_112", + "dehasthoulya_yoga_114", + "swaveeryaddhana_yoga", + "matrumooladdhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "durmukha_yoga", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "vichitra_saudha_prakara_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_209", + "aputhra_yoga", + "suputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "satkalatra_yoga", + "mathibhramana_yoga_variation", + "khalwata_yoga", + "nishturabhashi_yoga", + "rajabhrashta_yoga" + ], + "count": 31, + "status": "ok" + } + }, + { + "name": "J. Krishnamurti", + "date": "1895-05-12", + "time": "00:30", + "tz": "+05:30", + "lat": 13.0827, + "lon": 80.2707, + "city": "Madanapalle, India", + "expected_yogas": [ + "vesi_yoga", + "adhi_yoga", + "sasa_yoga", + "paasa_yoga", + "asubha_yoga", + "guru_mangala_yoga", + "kaahala_yoga", + "vasumathi_yoga", + "dhur_yoga", + "dharidhra_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_151", + "sareera_soukhya_yoga", + "dehapushti_yoga", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "sumukha_yoga", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "anapathya_yoga", + "aputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "satkalatra_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vesi_yoga", + "adhi_yoga", + "sasa_yoga", + "paasa_yoga", + "asubha_yoga", + "guru_mangala_yoga", + "kaahala_yoga", + "vasumathi_yoga", + "dhur_yoga", + "dharidhra_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_151", + "sareera_soukhya_yoga", + "dehapushti_yoga", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "sumukha_yoga", + "sraddhannabhuktha_yoga", + "bhratruvriddhi_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "anapathya_yoga", + "aputhra_yoga", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "satkalatra_yoga" + ], + "count": 30, + "status": "ok" + } + }, + { + "name": "Ramana Maharshi", + "date": "1879-12-30", + "time": "01:00", + "tz": "+05:30", + "lat": 9.9252, + "lon": 78.1198, + "city": "Tiruchuli, India", + "expected_yogas": [ + "vosi_yoga", + "sarpa_yoga", + "veenaa_yoga", + "kaahala_yoga", + "sankha_yoga", + "sarala_yoga", + "vallaki_yoga", + "dharidhra_yoga_149", + "rogagrastha_yoga", + "dehasthoulya_yoga_114", + "matrumooladdhana_yoga", + "marud_yoga", + "sumukha_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "eka_puthra_yoga", + "satkalatra_yoga" + ], + "pyjhora_raw": { + "yogas": [ + "vosi_yoga", + "sarpa_yoga", + "veenaa_yoga", + "kaahala_yoga", + "sankha_yoga", + "sarala_yoga", + "vallaki_yoga", + "dharidhra_yoga_149", + "rogagrastha_yoga", + "dehasthoulya_yoga_114", + "matrumooladdhana_yoga", + "marud_yoga", + "sumukha_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "eka_puthra_yoga", + "satkalatra_yoga" + ], + "count": 23, + "status": "ok" + } + }, + { + "name": "Paramahansa Yogananda", + "date": "1893-01-05", + "time": "20:38", + "tz": "+05:30", + "lat": 27.036, + "lon": 88.2627, + "city": "Gorakhpur, India", + "expected_yogas": [ + "vosi_yoga", + "hamsa_yoga", + "sarpa_yoga", + "paasa_yoga", + "asubha_yoga", + "guru_mangala_yoga", + "kaahala_yoga", + "hara_yoga", + "vanchana_chora_bheethi_yoga", + "harihara_brahma_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_152", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "krisanga_yoga_113", + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_115", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "bhratrumooladdhanaprapti_yoga", + "matrumooladdhana_yoga", + "asatyavadi_yoga", + "bhratruvriddhi_yoga", + "sodaranasa_yoga", + "parakrama_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "vahana_yoga_210", + "anapathya_yoga", + "bahu_puthra_yoga_221", + "eka_puthra_yoga", + "satkalatra_yoga", + "bhaga_chumbana_yoga", + "vrana_yoga", + "yuddha_marana_yoga", + "mathibhramana_yoga_292" + ], + "pyjhora_raw": { + "yogas": [ + "vosi_yoga", + "hamsa_yoga", + "sarpa_yoga", + "paasa_yoga", + "asubha_yoga", + "guru_mangala_yoga", + "kaahala_yoga", + "hara_yoga", + "vanchana_chora_bheethi_yoga", + "harihara_brahma_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_152", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "krisanga_yoga_113", + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_115", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "bhratrumooladdhanaprapti_yoga", + "matrumooladdhana_yoga", + "asatyavadi_yoga", + "bhratruvriddhi_yoga", + "sodaranasa_yoga", + "parakrama_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "vahana_yoga_210", + "anapathya_yoga", + "bahu_puthra_yoga_221", + "eka_puthra_yoga", + "satkalatra_yoga", + "bhaga_chumbana_yoga", + "vrana_yoga", + "yuddha_marana_yoga", + "mathibhramana_yoga_292" + ], + "count": 41, + "status": "ok" + } + } + ] +} \ No newline at end of file diff --git a/references/validation_logic_report.json b/references/validation_logic_report.json new file mode 100644 index 00000000..6a495023 --- /dev/null +++ b/references/validation_logic_report.json @@ -0,0 +1,5873 @@ +{ + "summary": { + "charts_tested": 60, + "comparable_rules": 70, + "skill_total": 756, + "pyjhora_total": 1021, + "unmapped_pyjhora": 720, + "missing_mappings": { + "bvr_amaranantha_dhana_yoga": [ + "amaranantha_dhana_yoga" + ], + "bvr_andha_yoga": [ + "andha_yoga_288", + "andha_yoga_289", + "andha_yoga" + ], + "bvr_annadana_yoga": [ + "annadana_yoga" + ], + "bvr_anthya_vayasi_dhana_yoga": [ + "anthya_vayasi_dhana_yoga" + ], + "bvr_balya_dhana_yoga": [ + "balya_dhana_yoga" + ], + "bvr_bhadra_yoga": [ + "bhadra_yoga" + ], + "bvr_bhandhana_yoga": [ + "bhandhana_yoga" + ], + "bvr_bhratrumooladdhanaprapti_yoga": [ + "bhratrumooladdhanaprapti_yoga" + ], + "bvr_dehapushti_yoga": [ + "dehapushti_yoga" + ], + "bvr_dhurmarana_yoga": [ + "dhurmarana_yoga" + ], + "bvr_dwadasa_sahodara_yoga": [ + "dwadasa_sahodara_yoga" + ], + "bvr_go_yoga": [ + "go_yoga" + ], + "bvr_hamsa_yoga": [ + "hamsa_yoga" + ], + "bvr_hara_yoga": [ + "hara_yoga" + ], + "bvr_hari_yoga": [ + "hari_yoga" + ], + "bvr_harihara_brahma_yoga": [ + "harihara_brahma_yoga" + ], + "bvr_jananatpurvam_pitru_marana_yoga": [ + "jananatpurvam_pitru_marana_yoga" + ], + "bvr_kaalanirdesat_puthra_yoga": [ + "kaalanirdesat_puthra_yoga_227", + "kaalanirdesat_puthra_yoga_228" + ], + "bvr_kalatramooladdhana_yoga": [ + "kalatramooladdhana_yoga" + ], + "bvr_kshayaroga_yoga": [ + "kshayaroga_yoga" + ], + "bvr_madhya_vayasi_dhana_yoga": [ + "madhya_vayasi_dhana_yoga" + ], + "bvr_matrumooladdhana_yoga": [ + "matrumooladdhana_yoga" + ], + "bvr_nipuna_yoga": [ + "nipuna_yoga", + "surya_budha_yoga" + ], + "bvr_parakrama_yoga": [ + "parakrama_yoga" + ], + "bvr_parannabhojana_yoga": [ + "parannabhojana_yoga" + ], + "bvr_ruchaka_yoga": [ + "ruchaka_yoga" + ], + "bvr_sapthasankhya_sahodara_yoga": [ + "sapthasankhya_sahodara_yoga" + ], + "bvr_sarpa_yoga": [ + "sarpa_yoga" + ], + "bvr_sarpasaapa_yoga": [ + "sarpasaapa_yoga_212", + "sarpasaapa_yoga_213", + "sarpasaapa_yoga" + ], + "bvr_sasa_yoga": [ + "sasa_yoga" + ], + "bvr_sodaranasa_yoga": [ + "sodaranasa_yoga" + ], + "bvr_sraddhannabhuktha_precise": [ + "sraddhannabhuktha_yoga" + ], + "bvr_theevrabuddhi_yoga": [ + "theevrabuddhi_yoga" + ], + "bvr_thrikaala_gnana_yoga": [ + "thrikaala_gnana_yoga" + ], + "bvr_vahana_yoga": [ + "vahana_yoga_209", + "vahana_yoga_210" + ], + "bvr_vishnu_yoga": [ + "vishnu_yoga" + ], + "bvr_yuddha_praveena_yoga": [ + "yuddha_praveena_yoga" + ], + "bvr_yuddhatpaschaddrudha_yoga": [ + "yuddhatpaschaddrudha_yoga" + ], + "bvr_yuddhatpoorvadridhachitta_yoga": [ + "yuddhatpoorvadridhachitta_yoga" + ] + }, + "agreements": 516, + "false_positives": 240, + "false_negatives": 505, + "precision": 0.6825, + "recall": 0.5054, + "f1": 0.5808 + }, + "false_positives": [ + { + "chart": "Albert Einstein", + "rule_id": "vihaga_nabhasa", + "rule_name": "Vihaga Nabhasa Yoga" + }, + { + "chart": "Albert Einstein", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga" + }, + { + "chart": "Albert Einstein", + "rule_id": "mridanga_yoga", + "rule_name": "Mridanga Yoga" + }, + { + "chart": "Albert Einstein", + "rule_id": "kemadruma_yoga", + "rule_name": "Kemadruma Yoga" + }, + { + "chart": "Albert Einstein", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Albert Einstein", + "rule_id": "koorma_yoga", + "rule_name": "Koorma Yoga" + }, + { + "chart": "Marie Curie", + "rule_id": "bvr_ayatna_griha_prapta_yoga", + "rule_name": "Ayatna Griha Prapta Yoga" + }, + { + "chart": "Marie Curie", + "rule_id": "bvr_103_guru_mangala_yoga", + "rule_name": "Guru Mangala Yoga" + }, + { + "chart": "Marie Curie", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga" + }, + { + "chart": "Marie Curie", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga" + }, + { + "chart": "Marie Curie", + "rule_id": "kemadruma_yoga", + "rule_name": "Kemadruma Yoga" + }, + { + "chart": "Marie Curie", + "rule_id": "brahma_yoga", + "rule_name": "Brahma Yoga" + }, + { + "chart": "Marie Curie", + "rule_id": "sankha_yoga", + "rule_name": "Sankha Yoga" + }, + { + "chart": "Nikola Tesla", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Nikola Tesla", + "rule_id": "kemadruma_yoga", + "rule_name": "Kemadruma Yoga" + }, + { + "chart": "Stephen Hawking", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga" + }, + { + "chart": "Stephen Hawking", + "rule_id": "bvr_bahu_sthree_yoga", + "rule_name": "Bahu Sthree Yoga" + }, + { + "chart": "Stephen Hawking", + "rule_id": "matsya_yoga", + "rule_name": "Matsya Yoga" + }, + { + "chart": "Stephen Hawking", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga" + }, + { + "chart": "Stephen Hawking", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Stephen Hawking", + "rule_id": "kemadruma_yoga", + "rule_name": "Kemadruma Yoga" + }, + { + "chart": "Charles Darwin", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga" + }, + { + "chart": "Charles Darwin", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Thomas Edison", + "rule_id": "bvr_bandhu_pujya_yoga", + "rule_name": "Bandhu Pujya Yoga" + }, + { + "chart": "Thomas Edison", + "rule_id": "bvr_eka_puthra_precise", + "rule_name": "Eka Puthra Yoga" + }, + { + "chart": "Thomas Edison", + "rule_id": "bvr_018_ubhayachara_precise", + "rule_name": "Ubhayachara Yoga" + }, + { + "chart": "Thomas Edison", + "rule_id": "bvr_017_vosi_precise", + "rule_name": "Vosi Yoga" + }, + { + "chart": "Thomas Edison", + "rule_id": "matsya_yoga", + "rule_name": "Matsya Yoga" + }, + { + "chart": "Thomas Edison", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga" + }, + { + "chart": "Thomas Edison", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Thomas Edison", + "rule_id": "bvr_002_sunapha_precise", + "rule_name": "Sunaphaa Yoga" + }, + { + "chart": "Alexander Fleming", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Alexander Fleming", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga" + }, + { + "chart": "Alexander Fleming", + "rule_id": "kemadruma_yoga", + "rule_name": "Kemadruma Yoga" + }, + { + "chart": "Max Planck", + "rule_id": "mridanga_yoga", + "rule_name": "Mridanga Yoga" + }, + { + "chart": "Max Planck", + "rule_id": "kemadruma_yoga", + "rule_name": "Kemadruma Yoga" + }, + { + "chart": "Max Planck", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga" + }, + { + "chart": "Max Planck", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga" + }, + { + "chart": "Niels Bohr", + "rule_id": "vihaga_nabhasa", + "rule_name": "Vihaga Nabhasa Yoga" + }, + { + "chart": "Niels Bohr", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Richard Feynman", + "rule_id": "bvr_dharidhra_11_precise", + "rule_name": "Dharidhra Yoga" + }, + { + "chart": "Richard Feynman", + "rule_id": "bvr_018_ubhayachara_precise", + "rule_name": "Ubhayachara Yoga" + }, + { + "chart": "Richard Feynman", + "rule_id": "bvr_103_guru_mangala_yoga", + "rule_name": "Guru Mangala Yoga" + }, + { + "chart": "Richard Feynman", + "rule_id": "bvr_003_anapha_precise", + "rule_name": "Anaphaa Yoga" + }, + { + "chart": "Richard Feynman", + "rule_id": "matsya_yoga", + "rule_name": "Matsya Yoga" + }, + { + "chart": "Richard Feynman", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga" + }, + { + "chart": "Richard Feynman", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Mahatma Gandhi", + "rule_id": "bvr_utthama_graha_yoga", + "rule_name": "Utthama Griha Yoga" + }, + { + "chart": "Mahatma Gandhi", + "rule_id": "matsya_yoga", + "rule_name": "Matsya Yoga" + }, + { + "chart": "Mahatma Gandhi", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga" + }, + { + "chart": "Mahatma Gandhi", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Mahatma Gandhi", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Mahatma Gandhi", + "rule_id": "kemadruma_yoga", + "rule_name": "Kemadruma Yoga" + }, + { + "chart": "Jawaharlal Nehru", + "rule_id": "pushkala_yoga", + "rule_name": "Pushkala Yoga" + }, + { + "chart": "Jawaharlal Nehru", + "rule_id": "bvr_103_guru_mangala_yoga", + "rule_name": "Guru Mangala Yoga" + }, + { + "chart": "Narendra Modi", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Narendra Modi", + "rule_id": "mridanga_yoga", + "rule_name": "Mridanga Yoga" + }, + { + "chart": "Indira Gandhi", + "rule_id": "bvr_bandhu_pujya_yoga", + "rule_name": "Bandhu Pujya Yoga" + }, + { + "chart": "Indira Gandhi", + "rule_id": "bvr_103_guru_mangala_yoga", + "rule_name": "Guru Mangala Yoga" + }, + { + "chart": "Indira Gandhi", + "rule_id": "bvr_003_anapha_precise", + "rule_name": "Anaphaa Yoga" + }, + { + "chart": "Indira Gandhi", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga" + }, + { + "chart": "Indira Gandhi", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Winston Churchill", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga" + }, + { + "chart": "Winston Churchill", + "rule_id": "bheri_yoga", + "rule_name": "Bheri Yoga" + }, + { + "chart": "Winston Churchill", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga" + }, + { + "chart": "John F. Kennedy", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga" + }, + { + "chart": "John F. Kennedy", + "rule_id": "brahma_yoga", + "rule_name": "Brahma Yoga" + }, + { + "chart": "John F. Kennedy", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga" + }, + { + "chart": "John F. Kennedy", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga" + }, + { + "chart": "Nelson Mandela", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Nelson Mandela", + "rule_id": "bvr_103_guru_mangala_yoga", + "rule_name": "Guru Mangala Yoga" + }, + { + "chart": "Abraham Lincoln", + "rule_id": "bvr_sada_sanchara_precise", + "rule_name": "Sada Sanchara Yoga" + }, + { + "chart": "Abraham Lincoln", + "rule_id": "bvr_002_sunapha_precise", + "rule_name": "Sunaphaa Yoga" + }, + { + "chart": "Abraham Lincoln", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Abraham Lincoln", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga" + }, + { + "chart": "Margaret Thatcher", + "rule_id": "bvr_004_duradhara_precise", + "rule_name": "Duradhara Yoga" + }, + { + "chart": "Margaret Thatcher", + "rule_id": "bvr_103_guru_mangala_yoga", + "rule_name": "Guru Mangala Yoga" + }, + { + "chart": "Margaret Thatcher", + "rule_id": "bvr_002_sunapha_precise", + "rule_name": "Sunaphaa Yoga" + }, + { + "chart": "Margaret Thatcher", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Margaret Thatcher", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga" + }, + { + "chart": "Barack Obama", + "rule_id": "kemadruma_yoga", + "rule_name": "Kemadruma Yoga" + }, + { + "chart": "Barack Obama", + "rule_id": "bvr_bandhu_pujya_yoga", + "rule_name": "Bandhu Pujya Yoga" + }, + { + "chart": "Barack Obama", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Rabindranath Tagore", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga" + }, + { + "chart": "Rabindranath Tagore", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga" + }, + { + "chart": "Rabindranath Tagore", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Rabindranath Tagore", + "rule_id": "bvr_002_sunapha_precise", + "rule_name": "Sunaphaa Yoga" + }, + { + "chart": "Rabindranath Tagore", + "rule_id": "sankha_yoga", + "rule_name": "Sankha Yoga" + }, + { + "chart": "Wolfgang Mozart", + "rule_id": "bvr_utthama_graha_yoga", + "rule_name": "Utthama Griha Yoga" + }, + { + "chart": "Wolfgang Mozart", + "rule_id": "bvr_103_guru_mangala_yoga", + "rule_name": "Guru Mangala Yoga" + }, + { + "chart": "Wolfgang Mozart", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga" + }, + { + "chart": "Wolfgang Mozart", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Wolfgang Mozart", + "rule_id": "kemadruma_yoga", + "rule_name": "Kemadruma Yoga" + }, + { + "chart": "Pablo Picasso", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Pablo Picasso", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Pablo Picasso", + "rule_id": "bvr_018_ubhayachara_precise", + "rule_name": "Ubhayachara Yoga" + }, + { + "chart": "Vincent van Gogh", + "rule_id": "bvr_dharidhra_11_precise", + "rule_name": "Dharidhra Yoga" + }, + { + "chart": "Vincent van Gogh", + "rule_id": "bvr_103_guru_mangala_yoga", + "rule_name": "Guru Mangala Yoga" + }, + { + "chart": "Vincent van Gogh", + "rule_id": "matsya_yoga", + "rule_name": "Matsya Yoga" + }, + { + "chart": "Vincent van Gogh", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Vincent van Gogh", + "rule_id": "koorma_yoga", + "rule_name": "Koorma Yoga" + }, + { + "chart": "Charlie Chaplin", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga" + }, + { + "chart": "Charlie Chaplin", + "rule_id": "matsya_yoga", + "rule_name": "Matsya Yoga" + }, + { + "chart": "Charlie Chaplin", + "rule_id": "mridanga_yoga", + "rule_name": "Mridanga Yoga" + }, + { + "chart": "Charlie Chaplin", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga" + }, + { + "chart": "Charlie Chaplin", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Elvis Presley", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Elvis Presley", + "rule_id": "matsya_yoga", + "rule_name": "Matsya Yoga" + }, + { + "chart": "Elvis Presley", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Michael Jackson", + "rule_id": "bvr_bahu_sthree_yoga", + "rule_name": "Bahu Sthree Yoga" + }, + { + "chart": "Michael Jackson", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Michael Jackson", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga" + }, + { + "chart": "A.R. Rahman", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga" + }, + { + "chart": "A.R. Rahman", + "rule_id": "matsya_yoga", + "rule_name": "Matsya Yoga" + }, + { + "chart": "A.R. Rahman", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga" + }, + { + "chart": "A.R. Rahman", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "A.R. Rahman", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "A.R. Rahman", + "rule_id": "sankha_yoga", + "rule_name": "Sankha Yoga" + }, + { + "chart": "Lata Mangeshkar", + "rule_id": "bvr_bahu_sthree_yoga", + "rule_name": "Bahu Sthree Yoga" + }, + { + "chart": "Lata Mangeshkar", + "rule_id": "bvr_sada_sanchara_precise", + "rule_name": "Sada Sanchara Yoga" + }, + { + "chart": "Lata Mangeshkar", + "rule_id": "mridanga_yoga", + "rule_name": "Mridanga Yoga" + }, + { + "chart": "Lata Mangeshkar", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Lata Mangeshkar", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Steve Jobs", + "rule_id": "vihaga_nabhasa", + "rule_name": "Vihaga Nabhasa Yoga" + }, + { + "chart": "Steve Jobs", + "rule_id": "bvr_eka_puthra_precise", + "rule_name": "Eka Puthra Yoga" + }, + { + "chart": "Steve Jobs", + "rule_id": "bvr_mathibhramana_yoga", + "rule_name": "Mathibhramana Yoga" + }, + { + "chart": "Bill Gates", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Bill Gates", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga" + }, + { + "chart": "Bill Gates", + "rule_id": "kemadruma_yoga", + "rule_name": "Kemadruma Yoga" + }, + { + "chart": "Bill Gates", + "rule_id": "bheri_yoga", + "rule_name": "Bheri Yoga" + }, + { + "chart": "Elon Musk", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga" + }, + { + "chart": "Elon Musk", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Jeff Bezos", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Jeff Bezos", + "rule_id": "bvr_002_sunapha_precise", + "rule_name": "Sunaphaa Yoga" + }, + { + "chart": "Jeff Bezos", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga" + }, + { + "chart": "Jeff Bezos", + "rule_id": "sankha_yoga", + "rule_name": "Sankha Yoga" + }, + { + "chart": "Warren Buffett", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Warren Buffett", + "rule_id": "mridanga_yoga", + "rule_name": "Mridanga Yoga" + }, + { + "chart": "Mukesh Ambani", + "rule_id": "bvr_bahu_sthree_yoga", + "rule_name": "Bahu Sthree Yoga" + }, + { + "chart": "Mukesh Ambani", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga" + }, + { + "chart": "Mukesh Ambani", + "rule_id": "bvr_103_guru_mangala_yoga", + "rule_name": "Guru Mangala Yoga" + }, + { + "chart": "Mukesh Ambani", + "rule_id": "matsya_yoga", + "rule_name": "Matsya Yoga" + }, + { + "chart": "Mukesh Ambani", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Mukesh Ambani", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Ratan Tata", + "rule_id": "matsya_yoga", + "rule_name": "Matsya Yoga" + }, + { + "chart": "Ratan Tata", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga" + }, + { + "chart": "Ratan Tata", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Ratan Tata", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Ratan Tata", + "rule_id": "sankha_yoga", + "rule_name": "Sankha Yoga" + }, + { + "chart": "Narayana Murthy", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga" + }, + { + "chart": "Azim Premji", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga" + }, + { + "chart": "Azim Premji", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Azim Premji", + "rule_id": "kemadruma_yoga", + "rule_name": "Kemadruma Yoga" + }, + { + "chart": "Azim Premji", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Azim Premji", + "rule_id": "sankha_yoga", + "rule_name": "Sankha Yoga" + }, + { + "chart": "Dhirubhai Ambani", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Dhirubhai Ambani", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga" + }, + { + "chart": "Dhirubhai Ambani", + "rule_id": "sankha_yoga", + "rule_name": "Sankha Yoga" + }, + { + "chart": "Sachin Tendulkar", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Sachin Tendulkar", + "rule_id": "matsya_yoga", + "rule_name": "Matsya Yoga" + }, + { + "chart": "Sachin Tendulkar", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga" + }, + { + "chart": "Sachin Tendulkar", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Virat Kohli", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Virat Kohli", + "rule_id": "bvr_eka_puthra_precise", + "rule_name": "Eka Puthra Yoga" + }, + { + "chart": "Virat Kohli", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "MS Dhoni", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Muhammad Ali", + "rule_id": "bvr_bandhu_pujya_yoga", + "rule_name": "Bandhu Pujya Yoga" + }, + { + "chart": "Muhammad Ali", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Michael Jordan", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Michael Jordan", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Michael Jordan", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga" + }, + { + "chart": "Michael Jordan", + "rule_id": "sankha_yoga", + "rule_name": "Sankha Yoga" + }, + { + "chart": "Lionel Messi", + "rule_id": "bvr_004_duradhara_precise", + "rule_name": "Duradhara Yoga" + }, + { + "chart": "Lionel Messi", + "rule_id": "bvr_017_vosi_precise", + "rule_name": "Vosi Yoga" + }, + { + "chart": "Lionel Messi", + "rule_id": "bvr_002_sunapha_precise", + "rule_name": "Sunaphaa Yoga" + }, + { + "chart": "Lionel Messi", + "rule_id": "matsya_yoga", + "rule_name": "Matsya Yoga" + }, + { + "chart": "Lionel Messi", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga" + }, + { + "chart": "Lionel Messi", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Lionel Messi", + "rule_id": "brahma_yoga", + "rule_name": "Brahma Yoga" + }, + { + "chart": "Lionel Messi", + "rule_id": "sankha_yoga", + "rule_name": "Sankha Yoga" + }, + { + "chart": "Cristiano Ronaldo", + "rule_id": "bvr_utthama_graha_yoga", + "rule_name": "Utthama Griha Yoga" + }, + { + "chart": "Cristiano Ronaldo", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga" + }, + { + "chart": "Cristiano Ronaldo", + "rule_id": "matsya_yoga", + "rule_name": "Matsya Yoga" + }, + { + "chart": "Cristiano Ronaldo", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Cristiano Ronaldo", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Cristiano Ronaldo", + "rule_id": "brahma_yoga", + "rule_name": "Brahma Yoga" + }, + { + "chart": "Cristiano Ronaldo", + "rule_id": "kemadruma_yoga", + "rule_name": "Kemadruma Yoga" + }, + { + "chart": "Serena Williams", + "rule_id": "bvr_004_duradhara_precise", + "rule_name": "Duradhara Yoga" + }, + { + "chart": "Serena Williams", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga" + }, + { + "chart": "Serena Williams", + "rule_id": "matsya_yoga", + "rule_name": "Matsya Yoga" + }, + { + "chart": "Serena Williams", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga" + }, + { + "chart": "Serena Williams", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Serena Williams", + "rule_id": "bvr_002_sunapha_precise", + "rule_name": "Sunaphaa Yoga" + }, + { + "chart": "Pele", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Pele", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Pele", + "rule_id": "kemadruma_yoga", + "rule_name": "Kemadruma Yoga" + }, + { + "chart": "Roger Federer", + "rule_id": "bvr_103_guru_mangala_yoga", + "rule_name": "Guru Mangala Yoga" + }, + { + "chart": "Swami Vivekananda", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Swami Vivekananda", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Swami Vivekananda", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga" + }, + { + "chart": "Amitabh Bachchan", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Amitabh Bachchan", + "rule_id": "bvr_bandhu_pujya_yoga", + "rule_name": "Bandhu Pujya Yoga" + }, + { + "chart": "Amitabh Bachchan", + "rule_id": "bvr_103_guru_mangala_yoga", + "rule_name": "Guru Mangala Yoga" + }, + { + "chart": "Amitabh Bachchan", + "rule_id": "bvr_003_anapha_precise", + "rule_name": "Anaphaa Yoga" + }, + { + "chart": "Queen Elizabeth II", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Queen Elizabeth II", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Princess Diana", + "rule_id": "bvr_bandhu_pujya_yoga", + "rule_name": "Bandhu Pujya Yoga" + }, + { + "chart": "Princess Diana", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga" + }, + { + "chart": "Princess Diana", + "rule_id": "mridanga_yoga", + "rule_name": "Mridanga Yoga" + }, + { + "chart": "Princess Diana", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Princess Diana", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Princess Diana", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga" + }, + { + "chart": "Dalai Lama", + "rule_id": "matsya_yoga", + "rule_name": "Matsya Yoga" + }, + { + "chart": "Dalai Lama", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga" + }, + { + "chart": "Pope Francis", + "rule_id": "bvr_bandhu_pujya_yoga", + "rule_name": "Bandhu Pujya Yoga" + }, + { + "chart": "Pope Francis", + "rule_id": "bvr_004_duradhara_precise", + "rule_name": "Duradhara Yoga" + }, + { + "chart": "Pope Francis", + "rule_id": "bvr_sada_sanchara_precise", + "rule_name": "Sada Sanchara Yoga" + }, + { + "chart": "Pope Francis", + "rule_id": "bvr_103_guru_mangala_yoga", + "rule_name": "Guru Mangala Yoga" + }, + { + "chart": "Pope Francis", + "rule_id": "bvr_003_anapha_precise", + "rule_name": "Anaphaa Yoga" + }, + { + "chart": "Pope Francis", + "rule_id": "sankha_yoga", + "rule_name": "Sankha Yoga" + }, + { + "chart": "Osho", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Osho", + "rule_id": "matsya_yoga", + "rule_name": "Matsya Yoga" + }, + { + "chart": "Osho", + "rule_id": "bvr_bandhu_pujya_yoga", + "rule_name": "Bandhu Pujya Yoga" + }, + { + "chart": "J. Krishnamurti", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga" + }, + { + "chart": "J. Krishnamurti", + "rule_id": "bvr_bahu_sthree_yoga", + "rule_name": "Bahu Sthree Yoga" + }, + { + "chart": "J. Krishnamurti", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga" + }, + { + "chart": "J. Krishnamurti", + "rule_id": "matsya_yoga", + "rule_name": "Matsya Yoga" + }, + { + "chart": "J. Krishnamurti", + "rule_id": "mridanga_yoga", + "rule_name": "Mridanga Yoga" + }, + { + "chart": "J. Krishnamurti", + "rule_id": "kemadruma_yoga", + "rule_name": "Kemadruma Yoga" + }, + { + "chart": "J. Krishnamurti", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga" + }, + { + "chart": "Ramana Maharshi", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Ramana Maharshi", + "rule_id": "kemadruma_yoga", + "rule_name": "Kemadruma Yoga" + }, + { + "chart": "Ramana Maharshi", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga" + }, + { + "chart": "Paramahansa Yogananda", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga" + }, + { + "chart": "Paramahansa Yogananda", + "rule_id": "bvr_bahu_sthree_yoga", + "rule_name": "Bahu Sthree Yoga" + }, + { + "chart": "Paramahansa Yogananda", + "rule_id": "bvr_sada_sanchara_precise", + "rule_name": "Sada Sanchara Yoga" + }, + { + "chart": "Paramahansa Yogananda", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga" + }, + { + "chart": "Paramahansa Yogananda", + "rule_id": "adhi_yoga", + "rule_name": "Adhi Yoga" + }, + { + "chart": "Paramahansa Yogananda", + "rule_id": "kemadruma_yoga", + "rule_name": "Kemadruma Yoga" + }, + { + "chart": "Paramahansa Yogananda", + "rule_id": "sankha_yoga", + "rule_name": "Sankha Yoga" + } + ], + "false_negatives": [ + { + "chart": "Albert Einstein", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Albert Einstein", + "rule_id": "bvr_bandhu_pujya_yoga", + "rule_name": "Bandhu Pujya Yoga", + "pyjhora_names": [ + "bandhu_pujya_yoga_193", + "bandhu_pujya_yoga_194" + ] + }, + { + "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_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Albert Einstein", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "Albert Einstein", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "Albert Einstein", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Albert Einstein", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga", + "pyjhora_names": [ + "kaalanirdesat_puthranaasa_yoga_230", + "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": "Marie Curie", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Marie Curie", + "rule_id": "bvr_amala_precise", + "rule_name": "Amala Yoga", + "pyjhora_names": [ + "amala_yoga" + ] + }, + { + "chart": "Marie Curie", + "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": "Marie Curie", + "rule_id": "bvr_bhaga_chumbana_yoga", + "rule_name": "Bhaga Chumbana Yoga", + "pyjhora_names": [ + "bhaga_chumbana_yoga" + ] + }, + { + "chart": "Marie Curie", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Marie Curie", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Marie Curie", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Marie Curie", + "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": "Nikola Tesla", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Nikola Tesla", + "rule_id": "bvr_amala_precise", + "rule_name": "Amala Yoga", + "pyjhora_names": [ + "amala_yoga" + ] + }, + { + "chart": "Nikola Tesla", + "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": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Nikola Tesla", + "rule_id": "parvata_yoga", + "rule_name": "Parvata Yoga", + "pyjhora_names": [ + "parvata_yoga" + ] + }, + { + "chart": "Nikola Tesla", + "rule_id": "bvr_nishkapata_precise", + "rule_name": "Nishkapata Yoga", + "pyjhora_names": [ + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "kapata_yoga_202", + "kapata_yoga_204" + ] + }, + { + "chart": "Nikola Tesla", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Nikola Tesla", + "rule_id": "bheri_yoga", + "rule_name": "Bheri Yoga", + "pyjhora_names": [ + "bheri_yoga" + ] + }, + { + "chart": "Stephen Hawking", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Stephen Hawking", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Stephen Hawking", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Stephen Hawking", + "rule_id": "bvr_nishkapata_precise", + "rule_name": "Nishkapata Yoga", + "pyjhora_names": [ + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "kapata_yoga_202", + "kapata_yoga_204" + ] + }, + { + "chart": "Stephen Hawking", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "Stephen Hawking", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Stephen Hawking", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_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_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Charles Darwin", + "rule_id": "bvr_utthama_graha_yoga", + "rule_name": "Utthama Griha Yoga", + "pyjhora_names": [ + "utthama_graha_yoga" + ] + }, + { + "chart": "Charles Darwin", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Charles Darwin", + "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": "Charles Darwin", + "rule_id": "bvr_kalaanidhi_yoga", + "rule_name": "Kalaanidhi Yoga", + "pyjhora_names": [ + "kalaanidhi_yoga", + "kalanidhi_yoga" + ] + }, + { + "chart": "Charles Darwin", + "rule_id": "bvr_eka_puthra_precise", + "rule_name": "Eka Puthra Yoga", + "pyjhora_names": [ + "eka_puthra_yoga" + ] + }, + { + "chart": "Charles Darwin", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Charles Darwin", + "rule_id": "bvr_krisanga_yoga", + "rule_name": "Krisanga Yoga", + "pyjhora_names": [ + "krisanga_yoga_112", + "krisanga_yoga_113" + ] + }, + { + "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": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Thomas Edison", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Thomas Edison", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Thomas Edison", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Thomas Edison", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga", + "pyjhora_names": [ + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_115", + "dehasthoulya_yoga_116" + ] + }, + { + "chart": "Thomas Edison", + "rule_id": "brahma_yoga", + "rule_name": "Brahma Yoga", + "pyjhora_names": [ + "brahma_yoga" + ] + }, + { + "chart": "Thomas Edison", + "rule_id": "bheri_yoga", + "rule_name": "Bheri Yoga", + "pyjhora_names": [ + "bheri_yoga" + ] + }, + { + "chart": "Alexander Fleming", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Alexander Fleming", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Alexander Fleming", + "rule_id": "bvr_utthama_graha_yoga", + "rule_name": "Utthama Griha Yoga", + "pyjhora_names": [ + "utthama_graha_yoga" + ] + }, + { + "chart": "Alexander Fleming", + "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": "Alexander Fleming", + "rule_id": "bvr_sada_sanchara_precise", + "rule_name": "Sada Sanchara Yoga", + "pyjhora_names": [ + "sada_sanchara_yoga" + ] + }, + { + "chart": "Alexander Fleming", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Alexander Fleming", + "rule_id": "bvr_grihanasa_yoga", + "rule_name": "Grihanasa Yoga", + "pyjhora_names": [ + "grihanasa_yoga_191", + "grihanasa_yoga_192" + ] + }, + { + "chart": "Alexander Fleming", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Max Planck", + "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": "Max Planck", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Max Planck", + "rule_id": "bvr_amala_precise", + "rule_name": "Amala Yoga", + "pyjhora_names": [ + "amala_yoga" + ] + }, + { + "chart": "Max Planck", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Max Planck", + "rule_id": "bvr_sada_sanchara_precise", + "rule_name": "Sada Sanchara Yoga", + "pyjhora_names": [ + "sada_sanchara_yoga" + ] + }, + { + "chart": "Max Planck", + "rule_id": "bvr_krisanga_yoga", + "rule_name": "Krisanga Yoga", + "pyjhora_names": [ + "krisanga_yoga_112", + "krisanga_yoga_113" + ] + }, + { + "chart": "Max Planck", + "rule_id": "bvr_nishkapata_precise", + "rule_name": "Nishkapata Yoga", + "pyjhora_names": [ + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "kapata_yoga_202", + "kapata_yoga_204" + ] + }, + { + "chart": "Max Planck", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Max Planck", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Max Planck", + "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": "Niels Bohr", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Niels Bohr", + "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": "Niels Bohr", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Niels Bohr", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Niels Bohr", + "rule_id": "bvr_nishkapata_precise", + "rule_name": "Nishkapata Yoga", + "pyjhora_names": [ + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "kapata_yoga_202", + "kapata_yoga_204" + ] + }, + { + "chart": "Niels Bohr", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga", + "pyjhora_names": [ + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_115", + "dehasthoulya_yoga_116" + ] + }, + { + "chart": "Niels Bohr", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga", + "pyjhora_names": [ + "kaalanirdesat_puthranaasa_yoga_230", + "kaalanirdesat_puthranaasa_yoga_229" + ] + }, + { + "chart": "Niels Bohr", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Niels Bohr", + "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": "Richard Feynman", + "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": "Richard Feynman", + "rule_id": "bvr_sumukha_precise", + "rule_name": "Sumukha Yoga", + "pyjhora_names": [ + "sumukha_yoga" + ] + }, + { + "chart": "Richard Feynman", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Richard Feynman", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Richard Feynman", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Richard Feynman", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Richard Feynman", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Richard Feynman", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Mahatma Gandhi", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Mahatma Gandhi", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Mahatma Gandhi", + "rule_id": "bvr_nishkapata_precise", + "rule_name": "Nishkapata Yoga", + "pyjhora_names": [ + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "kapata_yoga_202", + "kapata_yoga_204" + ] + }, + { + "chart": "Mahatma Gandhi", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga", + "pyjhora_names": [ + "kaalanirdesat_puthranaasa_yoga_230", + "kaalanirdesat_puthranaasa_yoga_229" + ] + }, + { + "chart": "Mahatma Gandhi", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Mahatma Gandhi", + "rule_id": "bvr_dattha_puthra_yoga", + "rule_name": "Dattha Puthra Yoga", + "pyjhora_names": [ + "dattha_puthra_yoga_222", + "dattha_puthra_yoga_223" + ] + }, + { + "chart": "Mahatma Gandhi", + "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": "Jawaharlal Nehru", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Jawaharlal Nehru", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Jawaharlal Nehru", + "rule_id": "bvr_matrudeerghayur_yoga", + "rule_name": "Matrudeerghayur Yoga", + "pyjhora_names": [ + "matrudeerghayur_yoga_196", + "matrudeerghayur_yoga_197" + ] + }, + { + "chart": "Jawaharlal Nehru", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "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_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "Jawaharlal Nehru", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Jawaharlal Nehru", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga", + "pyjhora_names": [ + "kaalanirdesat_puthranaasa_yoga_230", + "kaalanirdesat_puthranaasa_yoga_229" + ] + }, + { + "chart": "Jawaharlal Nehru", + "rule_id": "sankha_yoga", + "rule_name": "Sankha Yoga", + "pyjhora_names": [ + "sankha_yoga" + ] + }, + { + "chart": "Narendra Modi", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Narendra Modi", + "rule_id": "bvr_amala_precise", + "rule_name": "Amala Yoga", + "pyjhora_names": [ + "amala_yoga" + ] + }, + { + "chart": "Narendra Modi", + "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": "Narendra Modi", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Narendra Modi", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "Narendra Modi", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Indira Gandhi", + "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": "Indira Gandhi", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Indira Gandhi", + "rule_id": "bvr_utthama_graha_yoga", + "rule_name": "Utthama Griha Yoga", + "pyjhora_names": [ + "utthama_graha_yoga" + ] + }, + { + "chart": "Indira Gandhi", + "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": "Indira Gandhi", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Indira Gandhi", + "rule_id": "bvr_krisanga_yoga", + "rule_name": "Krisanga Yoga", + "pyjhora_names": [ + "krisanga_yoga_112", + "krisanga_yoga_113" + ] + }, + { + "chart": "Indira Gandhi", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "Indira Gandhi", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Indira Gandhi", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga", + "pyjhora_names": [ + "kaalanirdesat_puthranaasa_yoga_230", + "kaalanirdesat_puthranaasa_yoga_229" + ] + }, + { + "chart": "Indira Gandhi", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Winston Churchill", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Winston Churchill", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Winston Churchill", + "rule_id": "bvr_bandhu_pujya_yoga", + "rule_name": "Bandhu Pujya Yoga", + "pyjhora_names": [ + "bandhu_pujya_yoga_193", + "bandhu_pujya_yoga_194" + ] + }, + { + "chart": "Winston Churchill", + "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": "Winston Churchill", + "rule_id": "bvr_sada_sanchara_precise", + "rule_name": "Sada Sanchara Yoga", + "pyjhora_names": [ + "sada_sanchara_yoga" + ] + }, + { + "chart": "Winston Churchill", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga", + "pyjhora_names": [ + "vanchana_chora_bheethi_yoga" + ] + }, + { + "chart": "Winston Churchill", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Winston Churchill", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "Winston Churchill", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Winston Churchill", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Winston Churchill", + "rule_id": "sankha_yoga", + "rule_name": "Sankha Yoga", + "pyjhora_names": [ + "sankha_yoga" + ] + }, + { + "chart": "John F. Kennedy", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "John F. Kennedy", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "John F. Kennedy", + "rule_id": "bvr_amala_precise", + "rule_name": "Amala Yoga", + "pyjhora_names": [ + "amala_yoga" + ] + }, + { + "chart": "John F. Kennedy", + "rule_id": "bvr_bandhu_pujya_yoga", + "rule_name": "Bandhu Pujya Yoga", + "pyjhora_names": [ + "bandhu_pujya_yoga_193", + "bandhu_pujya_yoga_194" + ] + }, + { + "chart": "John F. Kennedy", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "John F. Kennedy", + "rule_id": "bvr_bhaga_chumbana_yoga", + "rule_name": "Bhaga Chumbana Yoga", + "pyjhora_names": [ + "bhaga_chumbana_yoga" + ] + }, + { + "chart": "John F. Kennedy", + "rule_id": "bvr_krisanga_yoga", + "rule_name": "Krisanga Yoga", + "pyjhora_names": [ + "krisanga_yoga_112", + "krisanga_yoga_113" + ] + }, + { + "chart": "John F. Kennedy", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "John F. Kennedy", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "John F. Kennedy", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Nelson Mandela", + "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" + ] + }, + { + "chart": "Nelson Mandela", + "rule_id": "bvr_bandhu_pujya_yoga", + "rule_name": "Bandhu Pujya Yoga", + "pyjhora_names": [ + "bandhu_pujya_yoga_193", + "bandhu_pujya_yoga_194" + ] + }, + { + "chart": "Nelson Mandela", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Nelson Mandela", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Nelson Mandela", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "Nelson Mandela", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "Nelson Mandela", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Nelson Mandela", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga", + "pyjhora_names": [ + "kaalanirdesat_puthranaasa_yoga_230", + "kaalanirdesat_puthranaasa_yoga_229" + ] + }, + { + "chart": "Nelson Mandela", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_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_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Abraham Lincoln", + "rule_id": "bvr_utthama_graha_yoga", + "rule_name": "Utthama Griha Yoga", + "pyjhora_names": [ + "utthama_graha_yoga" + ] + }, + { + "chart": "Abraham Lincoln", + "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": "Abraham Lincoln", + "rule_id": "bvr_kalaanidhi_yoga", + "rule_name": "Kalaanidhi Yoga", + "pyjhora_names": [ + "kalaanidhi_yoga", + "kalanidhi_yoga" + ] + }, + { + "chart": "Abraham Lincoln", + "rule_id": "bvr_eka_puthra_precise", + "rule_name": "Eka Puthra Yoga", + "pyjhora_names": [ + "eka_puthra_yoga" + ] + }, + { + "chart": "Abraham Lincoln", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Abraham Lincoln", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Margaret Thatcher", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Margaret Thatcher", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Margaret Thatcher", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Margaret Thatcher", + "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": "Margaret Thatcher", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Margaret Thatcher", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "Margaret Thatcher", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga", + "pyjhora_names": [ + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_115", + "dehasthoulya_yoga_116" + ] + }, + { + "chart": "Margaret Thatcher", + "rule_id": "sankha_yoga", + "rule_name": "Sankha Yoga", + "pyjhora_names": [ + "sankha_yoga" + ] + }, + { + "chart": "Margaret Thatcher", + "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": "Barack Obama", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Barack Obama", + "rule_id": "bvr_amala_precise", + "rule_name": "Amala Yoga", + "pyjhora_names": [ + "amala_yoga" + ] + }, + { + "chart": "Barack Obama", + "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": "Barack Obama", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Barack Obama", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Barack Obama", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "Barack Obama", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Barack Obama", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Rabindranath Tagore", + "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": "Rabindranath Tagore", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Rabindranath Tagore", + "rule_id": "bvr_sada_sanchara_precise", + "rule_name": "Sada Sanchara Yoga", + "pyjhora_names": [ + "sada_sanchara_yoga" + ] + }, + { + "chart": "Rabindranath Tagore", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Rabindranath Tagore", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "Rabindranath Tagore", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Rabindranath Tagore", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga", + "pyjhora_names": [ + "kaalanirdesat_puthranaasa_yoga_230", + "kaalanirdesat_puthranaasa_yoga_229" + ] + }, + { + "chart": "Rabindranath Tagore", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Ludwig van Beethoven", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Ludwig van Beethoven", + "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": "Ludwig van Beethoven", + "rule_id": "bvr_kalaanidhi_yoga", + "rule_name": "Kalaanidhi Yoga", + "pyjhora_names": [ + "kalaanidhi_yoga", + "kalanidhi_yoga" + ] + }, + { + "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_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Ludwig van Beethoven", + "rule_id": "bvr_nishkapata_precise", + "rule_name": "Nishkapata Yoga", + "pyjhora_names": [ + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "kapata_yoga_202", + "kapata_yoga_204" + ] + }, + { + "chart": "Ludwig van Beethoven", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga", + "pyjhora_names": [ + "kaalanirdesat_puthranaasa_yoga_230", + "kaalanirdesat_puthranaasa_yoga_229" + ] + }, + { + "chart": "Ludwig van Beethoven", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Ludwig van Beethoven", + "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": "Wolfgang Mozart", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Wolfgang Mozart", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Wolfgang Mozart", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "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": "Wolfgang Mozart", + "rule_id": "bvr_sada_sanchara_precise", + "rule_name": "Sada Sanchara Yoga", + "pyjhora_names": [ + "sada_sanchara_yoga" + ] + }, + { + "chart": "Wolfgang Mozart", + "rule_id": "bvr_krisanga_yoga", + "rule_name": "Krisanga Yoga", + "pyjhora_names": [ + "krisanga_yoga_112", + "krisanga_yoga_113" + ] + }, + { + "chart": "Wolfgang Mozart", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "Wolfgang Mozart", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga", + "pyjhora_names": [ + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_115", + "dehasthoulya_yoga_116" + ] + }, + { + "chart": "Pablo Picasso", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Pablo Picasso", + "rule_id": "bvr_sumukha_precise", + "rule_name": "Sumukha Yoga", + "pyjhora_names": [ + "sumukha_yoga" + ] + }, + { + "chart": "Pablo Picasso", + "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_nishkapata_precise", + "rule_name": "Nishkapata Yoga", + "pyjhora_names": [ + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "kapata_yoga_202", + "kapata_yoga_204" + ] + }, + { + "chart": "Pablo Picasso", + "rule_id": "bvr_grihanasa_yoga", + "rule_name": "Grihanasa Yoga", + "pyjhora_names": [ + "grihanasa_yoga_191", + "grihanasa_yoga_192" + ] + }, + { + "chart": "Pablo Picasso", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "Pablo Picasso", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Pablo Picasso", + "rule_id": "bvr_dama_yoga", + "rule_name": "Dama Yoga", + "pyjhora_names": [ + "dama_yoga" + ] + }, + { + "chart": "Vincent van Gogh", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Vincent van Gogh", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Vincent van Gogh", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Vincent van Gogh", + "rule_id": "bvr_bhaga_chumbana_yoga", + "rule_name": "Bhaga Chumbana Yoga", + "pyjhora_names": [ + "bhaga_chumbana_yoga" + ] + }, + { + "chart": "Vincent van Gogh", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "Vincent van Gogh", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga", + "pyjhora_names": [ + "yukthi_samanwithavagmi_yoga_154" + ] + }, + { + "chart": "Vincent van Gogh", + "rule_id": "sankha_yoga", + "rule_name": "Sankha Yoga", + "pyjhora_names": [ + "sankha_yoga" + ] + }, + { + "chart": "Vincent van Gogh", + "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": "Charlie Chaplin", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Charlie Chaplin", + "rule_id": "bvr_bandhu_pujya_yoga", + "rule_name": "Bandhu Pujya Yoga", + "pyjhora_names": [ + "bandhu_pujya_yoga_193", + "bandhu_pujya_yoga_194" + ] + }, + { + "chart": "Charlie Chaplin", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Charlie Chaplin", + "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": "Charlie Chaplin", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "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", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "Charlie Chaplin", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Charlie Chaplin", + "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": "Elvis Presley", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Elvis Presley", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Elvis Presley", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Elvis Presley", + "rule_id": "bvr_sada_sanchara_precise", + "rule_name": "Sada Sanchara Yoga", + "pyjhora_names": [ + "sada_sanchara_yoga" + ] + }, + { + "chart": "Elvis Presley", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Elvis Presley", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "Elvis Presley", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Elvis Presley", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Elvis Presley", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Michael Jackson", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Michael Jackson", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Michael Jackson", + "rule_id": "bvr_sumukha_precise", + "rule_name": "Sumukha Yoga", + "pyjhora_names": [ + "sumukha_yoga" + ] + }, + { + "chart": "Michael Jackson", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Michael Jackson", + "rule_id": "bvr_vanchana_chora_bheethi_yoga", + "rule_name": "Vanchana Chora Bheethi Yoga", + "pyjhora_names": [ + "vanchana_chora_bheethi_yoga" + ] + }, + { + "chart": "Michael Jackson", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Michael Jackson", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "Michael Jackson", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Michael Jackson", + "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": "Michael Jackson", + "rule_id": "bvr_dama_yoga", + "rule_name": "Dama Yoga", + "pyjhora_names": [ + "dama_yoga" + ] + }, + { + "chart": "A.R. Rahman", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "A.R. Rahman", + "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": "A.R. Rahman", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "A.R. Rahman", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "A.R. Rahman", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "A.R. Rahman", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "A.R. Rahman", + "rule_id": "bvr_dama_yoga", + "rule_name": "Dama Yoga", + "pyjhora_names": [ + "dama_yoga" + ] + }, + { + "chart": "Lata Mangeshkar", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Lata Mangeshkar", + "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": "Lata Mangeshkar", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "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_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "Lata Mangeshkar", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Lata Mangeshkar", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga", + "pyjhora_names": [ + "kaalanirdesat_puthranaasa_yoga_230", + "kaalanirdesat_puthranaasa_yoga_229" + ] + }, + { + "chart": "Lata Mangeshkar", + "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": "Lata Mangeshkar", + "rule_id": "bvr_dama_yoga", + "rule_name": "Dama Yoga", + "pyjhora_names": [ + "dama_yoga" + ] + }, + { + "chart": "Steve Jobs", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Steve Jobs", + "rule_id": "bvr_amala_precise", + "rule_name": "Amala Yoga", + "pyjhora_names": [ + "amala_yoga" + ] + }, + { + "chart": "Steve Jobs", + "rule_id": "bvr_utthama_graha_yoga", + "rule_name": "Utthama Griha Yoga", + "pyjhora_names": [ + "utthama_graha_yoga" + ] + }, + { + "chart": "Steve Jobs", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Steve Jobs", + "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": "Steve Jobs", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Steve Jobs", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "Steve Jobs", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga", + "pyjhora_names": [ + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_115", + "dehasthoulya_yoga_116" + ] + }, + { + "chart": "Steve Jobs", + "rule_id": "bheri_yoga", + "rule_name": "Bheri Yoga", + "pyjhora_names": [ + "bheri_yoga" + ] + }, + { + "chart": "Bill Gates", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Bill Gates", + "rule_id": "bvr_bandhu_pujya_yoga", + "rule_name": "Bandhu Pujya Yoga", + "pyjhora_names": [ + "bandhu_pujya_yoga_193", + "bandhu_pujya_yoga_194" + ] + }, + { + "chart": "Bill Gates", + "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": "Bill Gates", + "rule_id": "bvr_raja_bhanga_yoga", + "rule_name": "Raja Bhanga Yoga", + "pyjhora_names": [ + "raja_bhanga_yoga_298", + "raja_bhanga_yoga_299" + ] + }, + { + "chart": "Bill Gates", + "rule_id": "bvr_bhaga_chumbana_yoga", + "rule_name": "Bhaga Chumbana Yoga", + "pyjhora_names": [ + "bhaga_chumbana_yoga" + ] + }, + { + "chart": "Bill Gates", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Bill Gates", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga", + "pyjhora_names": [ + "kaalanirdesat_puthranaasa_yoga_230", + "kaalanirdesat_puthranaasa_yoga_229" + ] + }, + { + "chart": "Bill Gates", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga", + "pyjhora_names": [ + "yukthi_samanwithavagmi_yoga_154" + ] + }, + { + "chart": "Bill Gates", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Elon Musk", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Elon Musk", + "rule_id": "bvr_bandhu_pujya_yoga", + "rule_name": "Bandhu Pujya Yoga", + "pyjhora_names": [ + "bandhu_pujya_yoga_193", + "bandhu_pujya_yoga_194" + ] + }, + { + "chart": "Elon Musk", + "rule_id": "bvr_amala_precise", + "rule_name": "Amala Yoga", + "pyjhora_names": [ + "amala_yoga" + ] + }, + { + "chart": "Elon Musk", + "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": "Elon Musk", + "rule_id": "bvr_sada_sanchara_precise", + "rule_name": "Sada Sanchara Yoga", + "pyjhora_names": [ + "sada_sanchara_yoga" + ] + }, + { + "chart": "Elon Musk", + "rule_id": "bvr_krisanga_yoga", + "rule_name": "Krisanga Yoga", + "pyjhora_names": [ + "krisanga_yoga_112", + "krisanga_yoga_113" + ] + }, + { + "chart": "Elon Musk", + "rule_id": "sankha_yoga", + "rule_name": "Sankha Yoga", + "pyjhora_names": [ + "sankha_yoga" + ] + }, + { + "chart": "Elon Musk", + "rule_id": "bheri_yoga", + "rule_name": "Bheri Yoga", + "pyjhora_names": [ + "bheri_yoga" + ] + }, + { + "chart": "Jeff Bezos", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Jeff Bezos", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Jeff Bezos", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Jeff Bezos", + "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": "Jeff Bezos", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Jeff Bezos", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "Jeff Bezos", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Jeff Bezos", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Jeff Bezos", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Jeff Bezos", + "rule_id": "bvr_dattha_puthra_yoga", + "rule_name": "Dattha Puthra Yoga", + "pyjhora_names": [ + "dattha_puthra_yoga_222", + "dattha_puthra_yoga_223" + ] + }, + { + "chart": "Jeff Bezos", + "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": "Warren Buffett", + "rule_id": "bvr_bandhu_pujya_yoga", + "rule_name": "Bandhu Pujya Yoga", + "pyjhora_names": [ + "bandhu_pujya_yoga_193", + "bandhu_pujya_yoga_194" + ] + }, + { + "chart": "Warren Buffett", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Warren Buffett", + "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": "Warren Buffett", + "rule_id": "bvr_vaatharoga_yoga", + "rule_name": "Vaatharoga Yoga", + "pyjhora_names": [ + "vaatharoga_yoga" + ] + }, + { + "chart": "Warren Buffett", + "rule_id": "bvr_bhaga_chumbana_yoga", + "rule_name": "Bhaga Chumbana Yoga", + "pyjhora_names": [ + "bhaga_chumbana_yoga" + ] + }, + { + "chart": "Warren Buffett", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Warren Buffett", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "Warren Buffett", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Warren Buffett", + "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": "Warren Buffett", + "rule_id": "bheri_yoga", + "rule_name": "Bheri Yoga", + "pyjhora_names": [ + "bheri_yoga" + ] + }, + { + "chart": "Mukesh Ambani", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Mukesh Ambani", + "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": "Mukesh Ambani", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Mukesh Ambani", + "rule_id": "bvr_sada_sanchara_precise", + "rule_name": "Sada Sanchara Yoga", + "pyjhora_names": [ + "sada_sanchara_yoga" + ] + }, + { + "chart": "Mukesh Ambani", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Mukesh Ambani", + "rule_id": "parvata_yoga", + "rule_name": "Parvata Yoga", + "pyjhora_names": [ + "parvata_yoga" + ] + }, + { + "chart": "Mukesh Ambani", + "rule_id": "bvr_nishkapata_precise", + "rule_name": "Nishkapata Yoga", + "pyjhora_names": [ + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "kapata_yoga_202", + "kapata_yoga_204" + ] + }, + { + "chart": "Mukesh Ambani", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Ratan Tata", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Ratan Tata", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Ratan Tata", + "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": "Ratan Tata", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "Ratan Tata", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "Ratan Tata", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Ratan Tata", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Ratan Tata", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Narayana Murthy", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Narayana Murthy", + "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": "Narayana Murthy", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Narayana Murthy", + "rule_id": "bvr_nishkapata_precise", + "rule_name": "Nishkapata Yoga", + "pyjhora_names": [ + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "kapata_yoga_202", + "kapata_yoga_204" + ] + }, + { + "chart": "Narayana Murthy", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga", + "pyjhora_names": [ + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_115", + "dehasthoulya_yoga_116" + ] + }, + { + "chart": "Narayana Murthy", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "Narayana Murthy", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Narayana Murthy", + "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": "Azim Premji", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Azim Premji", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Azim Premji", + "rule_id": "bvr_krisanga_yoga", + "rule_name": "Krisanga Yoga", + "pyjhora_names": [ + "krisanga_yoga_112", + "krisanga_yoga_113" + ] + }, + { + "chart": "Azim Premji", + "rule_id": "bvr_nishkapata_precise", + "rule_name": "Nishkapata Yoga", + "pyjhora_names": [ + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "kapata_yoga_202", + "kapata_yoga_204" + ] + }, + { + "chart": "Azim Premji", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Azim Premji", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Azim Premji", + "rule_id": "bvr_dama_yoga", + "rule_name": "Dama Yoga", + "pyjhora_names": [ + "dama_yoga" + ] + }, + { + "chart": "Dhirubhai Ambani", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Dhirubhai Ambani", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Dhirubhai Ambani", + "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": "Dhirubhai Ambani", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Dhirubhai Ambani", + "rule_id": "bvr_krisanga_yoga", + "rule_name": "Krisanga Yoga", + "pyjhora_names": [ + "krisanga_yoga_112", + "krisanga_yoga_113" + ] + }, + { + "chart": "Dhirubhai Ambani", + "rule_id": "bvr_grihanasa_yoga", + "rule_name": "Grihanasa Yoga", + "pyjhora_names": [ + "grihanasa_yoga_191", + "grihanasa_yoga_192" + ] + }, + { + "chart": "Dhirubhai Ambani", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Dhirubhai Ambani", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Dhirubhai Ambani", + "rule_id": "bheri_yoga", + "rule_name": "Bheri Yoga", + "pyjhora_names": [ + "bheri_yoga" + ] + }, + { + "chart": "Dhirubhai Ambani", + "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": "Sachin Tendulkar", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Sachin Tendulkar", + "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": "Sachin Tendulkar", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Sachin Tendulkar", + "rule_id": "bheri_yoga", + "rule_name": "Bheri Yoga", + "pyjhora_names": [ + "bheri_yoga" + ] + }, + { + "chart": "Sachin Tendulkar", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "Sachin Tendulkar", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga", + "pyjhora_names": [ + "kaalanirdesat_puthranaasa_yoga_230", + "kaalanirdesat_puthranaasa_yoga_229" + ] + }, + { + "chart": "Sachin Tendulkar", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Sachin Tendulkar", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Sachin Tendulkar", + "rule_id": "bvr_pisacha_grastha_yoga", + "rule_name": "Pisacha Grastha Yoga", + "pyjhora_names": [ + "pisacha_grastha_yoga" + ] + }, + { + "chart": "Virat Kohli", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Virat Kohli", + "rule_id": "bvr_sumukha_precise", + "rule_name": "Sumukha Yoga", + "pyjhora_names": [ + "sumukha_yoga" + ] + }, + { + "chart": "Virat Kohli", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Virat Kohli", + "rule_id": "bvr_bhaga_chumbana_yoga", + "rule_name": "Bhaga Chumbana Yoga", + "pyjhora_names": [ + "bhaga_chumbana_yoga" + ] + }, + { + "chart": "Virat Kohli", + "rule_id": "bvr_sada_sanchara_precise", + "rule_name": "Sada Sanchara Yoga", + "pyjhora_names": [ + "sada_sanchara_yoga" + ] + }, + { + "chart": "Virat Kohli", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga", + "pyjhora_names": [ + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_115", + "dehasthoulya_yoga_116" + ] + }, + { + "chart": "Virat Kohli", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga", + "pyjhora_names": [ + "kaalanirdesat_puthranaasa_yoga_230", + "kaalanirdesat_puthranaasa_yoga_229" + ] + }, + { + "chart": "Virat Kohli", + "rule_id": "sankha_yoga", + "rule_name": "Sankha Yoga", + "pyjhora_names": [ + "sankha_yoga" + ] + }, + { + "chart": "Virat Kohli", + "rule_id": "bvr_dama_yoga", + "rule_name": "Dama Yoga", + "pyjhora_names": [ + "dama_yoga" + ] + }, + { + "chart": "MS Dhoni", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "MS Dhoni", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "MS Dhoni", + "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": "MS Dhoni", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "MS Dhoni", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "MS Dhoni", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga", + "pyjhora_names": [ + "kaalanirdesat_puthranaasa_yoga_230", + "kaalanirdesat_puthranaasa_yoga_229" + ] + }, + { + "chart": "MS Dhoni", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Muhammad Ali", + "rule_id": "pushkala_yoga", + "rule_name": "Pushkala Yoga", + "pyjhora_names": [ + "pushkala_yoga" + ] + }, + { + "chart": "Muhammad Ali", + "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": "Muhammad Ali", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Muhammad Ali", + "rule_id": "bvr_bhaga_chumbana_yoga", + "rule_name": "Bhaga Chumbana Yoga", + "pyjhora_names": [ + "bhaga_chumbana_yoga" + ] + }, + { + "chart": "Muhammad Ali", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga", + "pyjhora_names": [ + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_115", + "dehasthoulya_yoga_116" + ] + }, + { + "chart": "Muhammad Ali", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Michael Jordan", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Michael Jordan", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Michael Jordan", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Michael Jordan", + "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": "Michael Jordan", + "rule_id": "bvr_bhaga_chumbana_yoga", + "rule_name": "Bhaga Chumbana Yoga", + "pyjhora_names": [ + "bhaga_chumbana_yoga" + ] + }, + { + "chart": "Michael Jordan", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "Michael Jordan", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga", + "pyjhora_names": [ + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_115", + "dehasthoulya_yoga_116" + ] + }, + { + "chart": "Lionel Messi", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Lionel Messi", + "rule_id": "bvr_matrudeerghayur_yoga", + "rule_name": "Matrudeerghayur Yoga", + "pyjhora_names": [ + "matrudeerghayur_yoga_196", + "matrudeerghayur_yoga_197" + ] + }, + { + "chart": "Lionel Messi", + "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": "Lionel Messi", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Lionel Messi", + "rule_id": "bvr_sada_sanchara_precise", + "rule_name": "Sada Sanchara Yoga", + "pyjhora_names": [ + "sada_sanchara_yoga" + ] + }, + { + "chart": "Lionel Messi", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Lionel Messi", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Lionel Messi", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga", + "pyjhora_names": [ + "kaalanirdesat_puthranaasa_yoga_230", + "kaalanirdesat_puthranaasa_yoga_229" + ] + }, + { + "chart": "Lionel Messi", + "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": "Cristiano Ronaldo", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Cristiano Ronaldo", + "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": "Cristiano Ronaldo", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Cristiano Ronaldo", + "rule_id": "bvr_kalaanidhi_yoga", + "rule_name": "Kalaanidhi Yoga", + "pyjhora_names": [ + "kalaanidhi_yoga", + "kalanidhi_yoga" + ] + }, + { + "chart": "Cristiano Ronaldo", + "rule_id": "lakshmi_yoga", + "rule_name": "Lakshmi Yoga", + "pyjhora_names": [ + "lakshmi_yoga" + ] + }, + { + "chart": "Cristiano Ronaldo", + "rule_id": "bvr_nishkapata_precise", + "rule_name": "Nishkapata Yoga", + "pyjhora_names": [ + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "kapata_yoga_202", + "kapata_yoga_204" + ] + }, + { + "chart": "Cristiano Ronaldo", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Cristiano Ronaldo", + "rule_id": "bvr_yuddha_marana_yoga", + "rule_name": "Yuddha Marana Yoga", + "pyjhora_names": [ + "yuddha_marana_yoga" + ] + }, + { + "chart": "Cristiano Ronaldo", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Cristiano Ronaldo", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "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": "Serena Williams", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Serena Williams", + "rule_id": "bvr_bandhu_pujya_yoga", + "rule_name": "Bandhu Pujya Yoga", + "pyjhora_names": [ + "bandhu_pujya_yoga_193", + "bandhu_pujya_yoga_194" + ] + }, + { + "chart": "Serena Williams", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Serena Williams", + "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": "Serena Williams", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Serena Williams", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "Serena Williams", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Serena Williams", + "rule_id": "sankha_yoga", + "rule_name": "Sankha Yoga", + "pyjhora_names": [ + "sankha_yoga" + ] + }, + { + "chart": "Serena Williams", + "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": "Pele", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Pele", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Pele", + "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": "Pele", + "rule_id": "bvr_nishkapata_precise", + "rule_name": "Nishkapata Yoga", + "pyjhora_names": [ + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "kapata_yoga_202", + "kapata_yoga_204" + ] + }, + { + "chart": "Pele", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "Pele", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Pele", + "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": "Roger Federer", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Roger Federer", + "rule_id": "parvata_yoga", + "rule_name": "Parvata Yoga", + "pyjhora_names": [ + "parvata_yoga" + ] + }, + { + "chart": "Roger Federer", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga", + "pyjhora_names": [ + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_115", + "dehasthoulya_yoga_116" + ] + }, + { + "chart": "Roger Federer", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "Roger Federer", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Roger Federer", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Swami Vivekananda", + "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": "Swami Vivekananda", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Swami Vivekananda", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Swami Vivekananda", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Swami Vivekananda", + "rule_id": "bheri_yoga", + "rule_name": "Bheri Yoga", + "pyjhora_names": [ + "bheri_yoga" + ] + }, + { + "chart": "Amitabh Bachchan", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Amitabh Bachchan", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Amitabh Bachchan", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Amitabh Bachchan", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "Amitabh Bachchan", + "rule_id": "bvr_dehasthoulya_yoga", + "rule_name": "Dehasthoulya Yoga", + "pyjhora_names": [ + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_115", + "dehasthoulya_yoga_116" + ] + }, + { + "chart": "Amitabh Bachchan", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Amitabh Bachchan", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Amitabh Bachchan", + "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": "Queen Elizabeth II", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Queen Elizabeth II", + "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": "Queen Elizabeth II", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Queen Elizabeth II", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Queen Elizabeth II", + "rule_id": "bheri_yoga", + "rule_name": "Bheri Yoga", + "pyjhora_names": [ + "bheri_yoga" + ] + }, + { + "chart": "Queen Elizabeth II", + "rule_id": "bvr_dama_yoga", + "rule_name": "Dama Yoga", + "pyjhora_names": [ + "dama_yoga" + ] + }, + { + "chart": "Princess Diana", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Princess Diana", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Princess Diana", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Princess Diana", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Princess Diana", + "rule_id": "bvr_grihanasa_yoga", + "rule_name": "Grihanasa Yoga", + "pyjhora_names": [ + "grihanasa_yoga_191", + "grihanasa_yoga_192" + ] + }, + { + "chart": "Princess Diana", + "rule_id": "bvr_nishkapata_precise", + "rule_name": "Nishkapata Yoga", + "pyjhora_names": [ + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "kapata_yoga_202", + "kapata_yoga_204" + ] + }, + { + "chart": "Princess Diana", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga", + "pyjhora_names": [ + "kaalanirdesat_puthranaasa_yoga_230", + "kaalanirdesat_puthranaasa_yoga_229" + ] + }, + { + "chart": "Princess Diana", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Princess Diana", + "rule_id": "bheri_yoga", + "rule_name": "Bheri Yoga", + "pyjhora_names": [ + "bheri_yoga" + ] + }, + { + "chart": "Dalai Lama", + "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": "Dalai Lama", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Dalai Lama", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Dalai Lama", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Dalai Lama", + "rule_id": "parvata_yoga", + "rule_name": "Parvata Yoga", + "pyjhora_names": [ + "parvata_yoga" + ] + }, + { + "chart": "Dalai Lama", + "rule_id": "bvr_nishkapata_precise", + "rule_name": "Nishkapata Yoga", + "pyjhora_names": [ + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "kapata_yoga_202", + "kapata_yoga_204" + ] + }, + { + "chart": "Dalai Lama", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "Dalai Lama", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Dalai Lama", + "rule_id": "bvr_yukthi_samanwithavagmi_yoga", + "rule_name": "Yukthi Samanwithavagmi Yoga", + "pyjhora_names": [ + "yukthi_samanwithavagmi_yoga_154" + ] + }, + { + "chart": "Dalai Lama", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Pope Francis", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Pope Francis", + "rule_id": "bvr_bahu_sthree_yoga", + "rule_name": "Bahu Sthree Yoga", + "pyjhora_names": [ + "bahu_sthree_yoga" + ] + }, + { + "chart": "Pope Francis", + "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": "Pope Francis", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Pope Francis", + "rule_id": "bvr_kalaanidhi_yoga", + "rule_name": "Kalaanidhi Yoga", + "pyjhora_names": [ + "kalaanidhi_yoga", + "kalanidhi_yoga" + ] + }, + { + "chart": "Pope Francis", + "rule_id": "bvr_raja_bhanga_yoga", + "rule_name": "Raja Bhanga Yoga", + "pyjhora_names": [ + "raja_bhanga_yoga_298", + "raja_bhanga_yoga_299" + ] + }, + { + "chart": "Pope Francis", + "rule_id": "bvr_bandhubhisthyaktha_precise", + "rule_name": "Bandhubhisthyaktha Yoga", + "pyjhora_names": [ + "bandhubhisthyaktha_yoga" + ] + }, + { + "chart": "Pope Francis", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "Pope Francis", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Osho", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Osho", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Osho", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Osho", + "rule_id": "bvr_krisanga_yoga", + "rule_name": "Krisanga Yoga", + "pyjhora_names": [ + "krisanga_yoga_112", + "krisanga_yoga_113" + ] + }, + { + "chart": "Osho", + "rule_id": "bvr_nishkapata_precise", + "rule_name": "Nishkapata Yoga", + "pyjhora_names": [ + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "kapata_yoga_202", + "kapata_yoga_204" + ] + }, + { + "chart": "Osho", + "rule_id": "bvr_vichitra_saudha_prakara_yoga", + "rule_name": "Vichitra Saudha Prakara Yoga", + "pyjhora_names": [ + "vichitra_saudha_prakara_yoga" + ] + }, + { + "chart": "Osho", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Osho", + "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": "J. Krishnamurti", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "J. Krishnamurti", + "rule_id": "bvr_sumukha_precise", + "rule_name": "Sumukha Yoga", + "pyjhora_names": [ + "sumukha_yoga" + ] + }, + { + "chart": "J. Krishnamurti", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "J. Krishnamurti", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "J. Krishnamurti", + "rule_id": "bvr_kaalanirdesat_puthranaasa_yoga", + "rule_name": "Kaalanirdesat Puthranaasa Yoga", + "pyjhora_names": [ + "kaalanirdesat_puthranaasa_yoga_230", + "kaalanirdesat_puthranaasa_yoga_229" + ] + }, + { + "chart": "Ramana Maharshi", + "rule_id": "bvr_matru_sneha_yoga", + "rule_name": "Matru Sneha Yoga", + "pyjhora_names": [ + "matru_sneha_yoga" + ] + }, + { + "chart": "Ramana Maharshi", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Ramana Maharshi", + "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": "Ramana Maharshi", + "rule_id": "bvr_nishkapata_precise", + "rule_name": "Nishkapata Yoga", + "pyjhora_names": [ + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "kapata_yoga_202", + "kapata_yoga_204" + ] + }, + { + "chart": "Ramana Maharshi", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Ramana Maharshi", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + }, + { + "chart": "Paramahansa Yogananda", + "rule_id": "bvr_bhratruvriddhi_precise", + "rule_name": "Bhratruvriddhi Yoga", + "pyjhora_names": [ + "bhratruvriddhi_yoga" + ] + }, + { + "chart": "Paramahansa Yogananda", + "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": "Paramahansa Yogananda", + "rule_id": "bvr_swaveeryaddhana_precise", + "rule_name": "Swaveeryaddhana Yoga", + "pyjhora_names": [ + "swaveeryaddhana_yoga" + ] + }, + { + "chart": "Paramahansa Yogananda", + "rule_id": "bvr_bhaga_chumbana_yoga", + "rule_name": "Bhaga Chumbana Yoga", + "pyjhora_names": [ + "bhaga_chumbana_yoga" + ] + }, + { + "chart": "Paramahansa Yogananda", + "rule_id": "bvr_krisanga_yoga", + "rule_name": "Krisanga Yoga", + "pyjhora_names": [ + "krisanga_yoga_112", + "krisanga_yoga_113" + ] + }, + { + "chart": "Paramahansa Yogananda", + "rule_id": "bvr_nishkapata_precise", + "rule_name": "Nishkapata Yoga", + "pyjhora_names": [ + "nishkapata_yoga_205", + "nishkapata_yoga_206", + "kapata_yoga_202", + "kapata_yoga_204" + ] + }, + { + "chart": "Paramahansa Yogananda", + "rule_id": "bvr_matrunasa_precise", + "rule_name": "Matrunasa Yoga", + "pyjhora_names": [ + "matrunasa_yoga_198", + "matrunasa_yoga_199" + ] + }, + { + "chart": "Paramahansa Yogananda", + "rule_id": "bvr_bahu_puthra_precise", + "rule_name": "Bahu Puthra Yoga", + "pyjhora_names": [ + "bahu_puthra_yoga_220", + "bahu_puthra_yoga_221" + ] + }, + { + "chart": "Paramahansa Yogananda", + "rule_id": "bvr_sareera_soukhya_precise", + "rule_name": "Sareera Soukhya Yoga", + "pyjhora_names": [ + "sareera_soukhya_yoga" + ] + }, + { + "chart": "Paramahansa Yogananda", + "rule_id": "bvr_yuddha_marana_yoga", + "rule_name": "Yuddha Marana Yoga", + "pyjhora_names": [ + "yuddha_marana_yoga" + ] + }, + { + "chart": "Paramahansa Yogananda", + "rule_id": "kahala_yoga", + "rule_name": "Kahala Yoga", + "pyjhora_names": [ + "kaahala_yoga" + ] + }, + { + "chart": "Paramahansa Yogananda", + "rule_id": "bvr_rogagrastha_precise", + "rule_name": "Rogagrastha Yoga", + "pyjhora_names": [ + "rogagrastha_yoga" + ] + } + ] +} \ No newline at end of file diff --git a/references/yoga_rules.json b/references/yoga_rules.json new file mode 100644 index 00000000..160e01f4 --- /dev/null +++ b/references/yoga_rules.json @@ -0,0 +1,13839 @@ +{ + "schema_version": "1.0", + "description": "Yoga 规则库 - 数据驱动架构 v1.0", + "total_rules": 473, + "rules": [ + { + "id": "raja_yoga", + "name": "Raja Yoga", + "name_cn": "王者格局", + "source": "BPHS", + "bvr_id": "BVR-29-37", + "category": "raja", + "logic": { + "type": "any_pair", + "from": { + "role": "kendra_lords" + }, + "to": { + "role": "trikona_lords" + }, + "exclude_self": true, + "condition": { + "type": "same_house", + "a": "$a", + "b": "$b", + "combo_template": "{a}与{b}同在第{h}宫" + } + }, + "effects": [ + "权力地位", + "事业成功", + "社会影响力" + ], + "strength": "中", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "dharma_karmadhipati", + "name": "Dharma Karmadhipati Yoga", + "name_cn": "法业主同宫格局", + "source": "BPHS", + "bvr_id": null, + "category": "raja", + "logic": { + "type": "same_house", + "a": { + "role": "lord", + "house": 9 + }, + "b": { + "role": "lord", + "house": 10 + }, + "combo_template": "9宫主{a}与10宫主{b}同在第{h}宫" + }, + "effects": [ + "事业与命运结合", + "社会地位高", + "精神事业" + ], + "strength": "强", + "enabled": true + }, + { + "id": "dharma_karmadhipati_parivartana", + "name": "Dharma Karmadhipati Yoga (Parivartana)", + "name_cn": "法业主互换格局", + "source": "BPHS", + "bvr_id": null, + "category": "raja", + "logic": { + "type": "parivartana", + "lord_a": { + "role": "lord", + "house": 9 + }, + "lord_b": { + "role": "lord", + "house": 10 + }, + "combo_template": "9宫主{la}与10宫主{lb}互换星座" + }, + "effects": [ + "事业与命运互换提升", + "社会地位高", + "贵人运强" + ], + "strength": "强", + "enabled": true + }, + { + "id": "raja_yoga_parivartana", + "name": "Raja Yoga (Parivartana)", + "name_cn": "王者互换格局", + "source": "BPHS", + "bvr_id": "BVR-29-37", + "category": "raja", + "logic": { + "type": "any_pair", + "from": { + "role": "kendra_lords" + }, + "to": { + "role": "trikona_lords" + }, + "exclude_self": true, + "condition": { + "type": "parivartana", + "lord_a": "$a", + "lord_b": "$b", + "combo_template": "{la}与{lb}互换星座" + } + }, + "effects": [ + "权力与财富互换提升", + "社会地位显著", + "事业成功" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "mahapurusha_mars", + "name": "Ruchaka Yoga", + "name_cn": "鲁查卡格局", + "source": "BPHS", + "bvr_id": "BVR-22", + "category": "mahapurusha", + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Mars", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "type": "dignity", + "planet": "Mars", + "dignity": "exalted", + "combo_template": "Mars入旺在{sign}" + } + ] + }, + "effects": [ + "卓越才能", + "领域领军", + "人格魅力" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-22: Mars in own/exaltation in Kendra", + "bvr_chapter": "Chapter 3" + }, + { + "id": "mahapurusha_mars_own", + "name": "Ruchaka Yoga", + "name_cn": "鲁查卡格局(入庙)", + "source": "BPHS", + "bvr_id": "BVR-22", + "category": "mahapurusha", + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Mars", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "type": "dignity", + "planet": "Mars", + "dignity": "own", + "combo_template": "Mars入庙在{sign}" + } + ] + }, + "effects": [ + "卓越才能", + "领域领军", + "人格魅力" + ], + "strength": "强", + "enabled": true, + "dedup_key": "Ruchaka Yoga", + "source_reference": "BVR-22: Mars in own/exaltation in Kendra", + "bvr_chapter": "Chapter 3" + }, + { + "id": "mahapurusha_mercury", + "name": "Bhadra Yoga", + "name_cn": "巴德拉格局", + "source": "BPHS", + "bvr_id": "BVR-23", + "category": "mahapurusha", + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Mercury", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "type": "dignity", + "planet": "Mercury", + "dignity": "exalted", + "combo_template": "Mercury入旺在{sign}" + } + ] + }, + "effects": [ + "卓越才能", + "领域领军", + "人格魅力" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-23: Mercury in own/exaltation in Kendra", + "bvr_chapter": "Chapter 3" + }, + { + "id": "mahapurusha_mercury_own", + "name": "Bhadra Yoga", + "name_cn": "巴德拉格局(入庙)", + "source": "BPHS", + "bvr_id": "BVR-23", + "category": "mahapurusha", + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Mercury", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "type": "dignity", + "planet": "Mercury", + "dignity": "own", + "combo_template": "Mercury入庙在{sign}" + } + ] + }, + "effects": [ + "卓越才能", + "领域领军", + "人格魅力" + ], + "strength": "强", + "enabled": true, + "dedup_key": "Bhadra Yoga", + "source_reference": "BVR-23: Mercury in own/exaltation in Kendra", + "bvr_chapter": "Chapter 3" + }, + { + "id": "mahapurusha_jupiter", + "name": "Hamsa Yoga", + "name_cn": "汉萨格局", + "source": "BPHS", + "bvr_id": "BVR-19", + "category": "mahapurusha", + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Jupiter", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "type": "dignity", + "planet": "Jupiter", + "dignity": "exalted", + "combo_template": "Jupiter入旺在{sign}" + } + ] + }, + "effects": [ + "卓越才能", + "领域领军", + "人格魅力" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-19: Jupiter in own/exaltation in Kendra", + "bvr_chapter": "Chapter 3" + }, + { + "id": "mahapurusha_jupiter_own", + "name": "Hamsa Yoga", + "name_cn": "汉萨格局(入庙)", + "source": "BPHS", + "bvr_id": "BVR-19", + "category": "mahapurusha", + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Jupiter", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "type": "dignity", + "planet": "Jupiter", + "dignity": "own", + "combo_template": "Jupiter入庙在{sign}" + } + ] + }, + "effects": [ + "卓越才能", + "领域领军", + "人格魅力" + ], + "strength": "强", + "enabled": true, + "dedup_key": "Hamsa Yoga", + "source_reference": "BVR-19: Jupiter in own/exaltation in Kendra", + "bvr_chapter": "Chapter 3" + }, + { + "id": "mahapurusha_venus", + "name": "Malavya Yoga", + "name_cn": "马拉维亚格局", + "source": "BPHS", + "bvr_id": "BVR-20", + "category": "mahapurusha", + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Venus", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "type": "dignity", + "planet": "Venus", + "dignity": "exalted", + "combo_template": "Venus入旺在{sign}" + } + ] + }, + "effects": [ + "卓越才能", + "领域领军", + "人格魅力" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-20: Venus in own/exaltation in Kendra", + "bvr_chapter": "Chapter 3" + }, + { + "id": "mahapurusha_venus_own", + "name": "Malavya Yoga", + "name_cn": "马拉维亚格局(入庙)", + "source": "BPHS", + "bvr_id": "BVR-20", + "category": "mahapurusha", + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Venus", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "type": "dignity", + "planet": "Venus", + "dignity": "own", + "combo_template": "Venus入庙在{sign}" + } + ] + }, + "effects": [ + "卓越才能", + "领域领军", + "人格魅力" + ], + "strength": "强", + "enabled": true, + "dedup_key": "Malavya Yoga", + "source_reference": "BVR-20: Venus in own/exaltation in Kendra", + "bvr_chapter": "Chapter 3" + }, + { + "id": "mahapurusha_saturn", + "name": "Sasa Yoga", + "name_cn": "萨萨格局", + "source": "BPHS", + "bvr_id": "BVR-21", + "category": "mahapurusha", + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Saturn", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "type": "dignity", + "planet": "Saturn", + "dignity": "exalted", + "combo_template": "Saturn入旺在{sign}" + } + ] + }, + "effects": [ + "卓越才能", + "领域领军", + "人格魅力" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-21: Saturn in own/exaltation in Kendra", + "bvr_chapter": "Chapter 3" + }, + { + "id": "mahapurusha_saturn_own", + "name": "Sasa Yoga", + "name_cn": "萨萨格局(入庙)", + "source": "BPHS", + "bvr_id": "BVR-21", + "category": "mahapurusha", + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Saturn", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "type": "dignity", + "planet": "Saturn", + "dignity": "own", + "combo_template": "Saturn入庙在{sign}" + } + ] + }, + "effects": [ + "卓越才能", + "领域领军", + "人格魅力" + ], + "strength": "强", + "enabled": true, + "dedup_key": "Sasa Yoga", + "source_reference": "BVR-21: Saturn in own/exaltation in Kendra", + "bvr_chapter": "Chapter 3" + }, + { + "id": "hamsa_trikona", + "name": "Hamsa Yoga (Trikona)", + "name_cn": "汉萨三方宫格局", + "source": "BPHS", + "bvr_id": "BVR-19", + "category": "mahapurusha", + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Jupiter", + "houses": [ + 1, + 5, + 9 + ] + }, + { + "type": "dignity", + "planet": "Jupiter", + "dignity": "strong", + "combo_template": "木星有力在{sign}" + } + ] + }, + "effects": [ + "智慧卓越", + "精神导师", + "品德高尚" + ], + "strength": "强", + "enabled": true, + "dedup_key": "Hamsa Yoga", + "source_reference": "BVR-19: Jupiter in own/exaltation in Kendra", + "bvr_chapter": "Chapter 3" + }, + { + "id": "moolatrikona_mars", + "name": "Ruchaka (Moola) Yoga", + "name_cn": "鲁查卡本宫格局", + "source": "BPHS", + "bvr_id": "BVR-22", + "category": "mahapurusha", + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Mars", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "type": "dignity", + "planet": "Mars", + "dignity": "moolatrikona", + "combo_template": "Mars在本宫{sign}" + } + ] + }, + "effects": [ + "卓越才能", + "领域领军", + "人格魅力" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-22: Mars in own/exaltation in Kendra", + "bvr_chapter": "Chapter 3" + }, + { + "id": "moolatrikona_mercury", + "name": "Bhadra (Moola) Yoga", + "name_cn": "巴德拉本宫格局", + "source": "BPHS", + "bvr_id": "BVR-23", + "category": "mahapurusha", + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Mercury", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "type": "dignity", + "planet": "Mercury", + "dignity": "moolatrikona", + "combo_template": "Mercury在本宫{sign}" + } + ] + }, + "effects": [ + "卓越才能", + "领域领军", + "人格魅力" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-23: Mercury in own/exaltation in Kendra", + "bvr_chapter": "Chapter 3" + }, + { + "id": "moolatrikona_jupiter", + "name": "Hamsa (Moola) Yoga", + "name_cn": "汉萨本宫格局", + "source": "BPHS", + "bvr_id": "BVR-19", + "category": "mahapurusha", + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Jupiter", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "type": "dignity", + "planet": "Jupiter", + "dignity": "moolatrikona", + "combo_template": "Jupiter在本宫{sign}" + } + ] + }, + "effects": [ + "卓越才能", + "领域领军", + "人格魅力" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-19: Jupiter in own/exaltation in Kendra", + "bvr_chapter": "Chapter 3" + }, + { + "id": "moolatrikona_venus", + "name": "Malavya (Moola) Yoga", + "name_cn": "马拉维亚本宫格局", + "source": "BPHS", + "bvr_id": "BVR-20", + "category": "mahapurusha", + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Venus", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "type": "dignity", + "planet": "Venus", + "dignity": "moolatrikona", + "combo_template": "Venus在本宫{sign}" + } + ] + }, + "effects": [ + "卓越才能", + "领域领军", + "人格魅力" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-20: Venus in own/exaltation in Kendra", + "bvr_chapter": "Chapter 3" + }, + { + "id": "moolatrikona_saturn", + "name": "Sasa (Moola) Yoga", + "name_cn": "萨萨本宫格局", + "source": "BPHS", + "bvr_id": "BVR-21", + "category": "mahapurusha", + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Saturn", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "type": "dignity", + "planet": "Saturn", + "dignity": "moolatrikona", + "combo_template": "Saturn在本宫{sign}" + } + ] + }, + "effects": [ + "卓越才能", + "领域领军", + "人格魅力" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-21: Saturn in own/exaltation in Kendra", + "bvr_chapter": "Chapter 3" + }, + { + "id": "gajakesari", + "name": "Gajakesari Yoga", + "name_cn": "象狮格局", + "source": "BPHS", + "bvr_id": "BVR-1", + "category": "chandra", + "logic": { + "type": "in_houses_from", + "planet": "Jupiter", + "from": "Moon", + "relations": [ + "kendra" + ], + "combo_template": "木星在月亮的Kendra(第{h}宫)" + }, + "effects": [ + "智慧学识", + "财富名声", + "道德品质" + ], + "strength": "中", + "enabled": true, + "source_reference": "BVR-1: Jupiter in Kendra from Moon, with benefic association", + "bvr_chapter": "Chapter 1" + }, + { + "id": "neechabhanga_basic", + "name": "Neechabhanga Raja Yoga", + "name_cn": "落陷取消格局", + "source": "BPHS", + "bvr_id": "BVR-24-26", + "category": "raja", + "logic": { + "type": "custom", + "expr": "\nmatched = []\nfor p, info in ctx.planets.items():\n if DEBILITATION.get(p) == info.get(\"sign\"):\n dl = SIGN_LORDS.get(info.get(\"sign\"))\n if dl and dl in ctx.planets and kendra(house_of(dl)):\n matched.append((p, dl))\nmatched\n", + "combo_template": "落陷取消格局", + "strength": "中强" + }, + "effects": [ + "克服困难", + "逆境崛起", + "转化能力" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-24-26: Debilitated planet with canceling condition", + "bvr_chapter": "Chapter 4" + }, + { + "id": "neechabhanga_kendra", + "name": "Neechabhanga Raja Yoga (Kendra)", + "name_cn": "落陷取消格局(角宫版)", + "source": "BPHS", + "bvr_id": "BVR-24-26", + "category": "raja", + "logic": { + "type": "custom", + "expr": "\nmatched = []\nfor p, info in ctx.planets.items():\n if DEBILITATION.get(p) == info.get(\"sign\") and kendra(info.get(\"house\")):\n matched.append(p)\nmatched\n", + "combo_template": "落陷行星在角宫", + "strength": "中强" + }, + "effects": [ + "逆境中崛起", + "转化困境为机遇" + ], + "strength": "强", + "enabled": true, + "dedup_key": "Neechabhanga Raja Yoga", + "source_reference": "BVR-24-26: Debilitated planet with canceling condition", + "bvr_chapter": "Chapter 4" + }, + { + "id": "dhana_yoga", + "name": "Dhana Yoga", + "name_cn": "财富格局", + "source": "BPHS", + "bvr_id": "BVR-38-46", + "category": "dhana", + "logic": { + "type": "custom", + "expr": "\nimport math\nai = ctx.asc_idx\nwl = set()\nwh = [2, 5, 9, 11]\nfor h in wh:\n sign = SIGNS[(ai + h - 1) % 12]\n wl.add(SIGN_LORDS[sign])\nwc = sum(1 for w in wl if w in ctx.planets and house_of(w) in wh)\nwc >= 2\n", + "combo_template": "财富宫主星落入财富宫", + "strength": "中" + }, + "effects": [ + "财富积累", + "物质成功", + "投资收益" + ], + "strength": "中", + "enabled": true, + "source_reference": "BVR-38-46: Wealth-giving combinations", + "bvr_chapter": "Chapter 7" + }, + { + "id": "grahi_dhana", + "name": "Grahi Dhana Yoga", + "name_cn": "星聚财富格局", + "source": "Phaladeepika", + "bvr_id": "BVR-38-46", + "category": "dhana", + "logic": { + "type": "custom", + "expr": "\nai = ctx.asc_idx\nlords = {\n 1: SIGN_LORDS[SIGNS[ai % 12]],\n 2: SIGN_LORDS[SIGNS[(ai + 1) % 12]],\n 11: SIGN_LORDS[SIGNS[(ai + 10) % 12]]\n}\nok = False\nfor wh in [2, 11]:\n cnt = sum(1 for h, lp in lords.items() if lp in ctx.planets and house_of(lp) == wh)\n if cnt >= 2:\n ok = True\n break\nok\n", + "combo_template": "财富宫主星聚宫", + "strength": "强" + }, + "effects": [ + "财运亨通", + "投资有利", + "收入丰厚" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-38-46: Wealth-giving combinations", + "bvr_chapter": "Chapter 7" + }, + { + "id": "lakshmi_yoga", + "name": "Lakshmi Yoga", + "name_cn": "拉克什米格局", + "source": "BPHS", + "bvr_id": "BVR-27", + "category": "dhana", + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": { + "role": "lord", + "house": 9 + }, + "houses": [ + 1 + ] + }, + { + "type": "dignity", + "planet": { + "role": "lord", + "house": 9 + }, + "dignity": "strong", + "combo_template": "9宫主入旺/入庙在1宫" + } + ] + }, + "effects": [ + "财富充裕", + "生活幸福", + "品德高尚" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-27: L9 in own/exaltation in Kendra, L1 strong", + "bvr_chapter": "Chapter 5" + }, + { + "id": "vasumati_yoga", + "name": "Vasumati Yoga", + "name_cn": "大地格局", + "source": "BPHS", + "bvr_id": "BVR-9", + "category": "dhana", + "logic": { + "type": "custom", + "expr": "\nupachaya_benefics = [p for p in BENEFICS if p in ctx.planets and upachaya(house_of(p))]\nlen(upachaya_benefics) >= 3\n", + "combo_template": "吉星在成长宫", + "strength": "中" + }, + "effects": [ + "财富丰厚", + "生活富足", + "物质成功" + ], + "strength": "中", + "enabled": true, + "source_reference": "BVR-9: Benefics in Upachaya houses", + "bvr_chapter": "Chapter 2" + }, + { + "id": "voshi_yoga", + "name": "Voshi Yoga", + "name_cn": "太阳前瑜伽", + "source": "BPHS", + "bvr_id": "BVR-16", + "category": "surya", + "logic": { + "type": "custom", + "expr": "\nif 'Sun' not in ctx.planets:\n False\nelse:\n sun_h = house_of('Sun')\n h12 = ((sun_h - 1 + 11) % 12) + 1\n planets_in_h12 = [p for p, info in ctx.planets.items() if info.get('house') == h12]\n h2 = ((sun_h - 1 + 1) % 12) + 1\n planets_in_h2 = [p for p, info in ctx.planets.items() if info.get('house') == h2]\n planets_in_h12 and not planets_in_h2\n", + "combo_template": "行星在太阳第12宫" + }, + "effects": [ + "口才出众", + "善于表达", + "受人尊敬" + ], + "strength": "中", + "enabled": true + }, + { + "id": "veshi_yoga", + "name": "Veshi Yoga", + "name_cn": "太阳后瑜伽", + "source": "BPHS", + "bvr_id": "BVR-17", + "category": "surya", + "logic": { + "type": "custom", + "expr": "\nif 'Sun' not in ctx.planets:\n False\nelse:\n sun_h = house_of('Sun')\n h12 = ((sun_h - 1 + 11) % 12) + 1\n planets_in_h12 = [p for p, info in ctx.planets.items() if info.get('house') == h12]\n h2 = ((sun_h - 1 + 1) % 12) + 1\n planets_in_h2 = [p for p, info in ctx.planets.items() if info.get('house') == h2]\n planets_in_h2 and not planets_in_h12\n", + "combo_template": "行星在太阳第2宫" + }, + "effects": [ + "财富充裕", + "生活舒适", + "性情愉快" + ], + "strength": "中", + "enabled": true, + "source_reference": "BVR-16: Planet(s) other than Moon in 2nd from Sun", + "bvr_chapter": "Chapter 2" + }, + { + "id": "ubhayachari_yoga", + "name": "Ubhayachari Yoga", + "name_cn": "太阳双夹瑜伽", + "source": "BPHS", + "bvr_id": "BVR-18", + "category": "surya", + "logic": { + "type": "custom", + "expr": "\nif 'Sun' not in ctx.planets:\n False\nelse:\n sun_h = house_of('Sun')\n h12 = ((sun_h - 1 + 11) % 12) + 1\n planets_in_h12 = [p for p, info in ctx.planets.items() if info.get('house') == h12]\n h2 = ((sun_h - 1 + 1) % 12) + 1\n planets_in_h2 = [p for p, info in ctx.planets.items() if info.get('house') == h2]\n bool(planets_in_h2 and planets_in_h12)\n", + "combo_template": "太阳两侧均有行星" + }, + "effects": [ + "性格坚毅", + "口才与财富兼备", + "受人爱戴" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-18: Planets in 2nd and 12th from Moon", + "bvr_chapter": "Chapter 2" + }, + { + "id": "anapha_yoga", + "name": "Anapha Yoga", + "name_cn": "月后瑜伽", + "source": "BPHS", + "bvr_id": "BVR-3", + "category": "chandra", + "logic": { + "type": "custom", + "expr": "\nif 'Moon' not in ctx.planets:\n False\nelse:\n moon_h = house_of('Moon')\n h12 = ((moon_h - 1 + 11) % 12) + 1\n p_in_h12 = [p for p, info in ctx.planets.items() if p != 'Moon' and info.get('house') == h12]\n h2 = ((moon_h - 1 + 1) % 12) + 1\n p_in_h2 = [p for p, info in ctx.planets.items() if p != 'Moon' and info.get('house') == h2]\n p_in_h12 and not p_in_h2\n", + "combo_template": "行星在月亮第12宫" + }, + "effects": [ + "体格健壮", + "名声良好", + "品德高尚" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "Disabled: superseded by bvr_003_anapha_precise. The 'not p_in_h2' restriction causes false negatives in Duradhara cases per BPHS." + }, + { + "id": "sunapha_yoga", + "name": "Sunapha Yoga", + "name_cn": "月前瑜伽", + "source": "BPHS", + "bvr_id": "BVR-2", + "category": "chandra", + "logic": { + "type": "custom", + "expr": "\nif 'Moon' not in ctx.planets:\n False\nelse:\n moon_h = house_of('Moon')\n h12 = ((moon_h - 1 + 11) % 12) + 1\n p_in_h12 = [p for p, info in ctx.planets.items() if p != 'Moon' and info.get('house') == h12]\n h2 = ((moon_h - 1 + 1) % 12) + 1\n p_in_h2 = [p for p, info in ctx.planets.items() if p != 'Moon' and info.get('house') == h2]\n p_in_h2 and not p_in_h12\n", + "combo_template": "行星在月亮第2宫" + }, + "effects": [ + "自力更生", + "财富充裕", + "受人尊敬" + ], + "strength": "中", + "enabled": true, + "source_reference": "BVR-2: Planet(s) other than Sun in 2nd from Moon", + "bvr_chapter": "Chapter 1" + }, + { + "id": "durudhura_yoga", + "name": "Durudhura Yoga", + "name_cn": "月双夹瑜伽", + "source": "BPHS", + "bvr_id": "BVR-4", + "category": "chandra", + "logic": { + "type": "custom", + "expr": "\nif 'Moon' not in ctx.planets:\n False\nelse:\n moon_h = house_of('Moon')\n h12 = ((moon_h - 1 + 11) % 12) + 1\n p_in_h12 = [p for p, info in ctx.planets.items() if p != 'Moon' and info.get('house') == h12]\n h2 = ((moon_h - 1 + 1) % 12) + 1\n p_in_h2 = [p for p, info in ctx.planets.items() if p != 'Moon' and info.get('house') == h2]\n bool(p_in_h2 and p_in_h12)\n", + "combo_template": "月亮两侧均有行星" + }, + "effects": [ + "享受丰富", + "善于辞令", + "性格坚定" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-4: Planets in both 2nd and 12th from Moon", + "bvr_chapter": "Chapter 1" + }, + { + "id": "kemadruma_yoga", + "name": "Kemadruma Yoga", + "name_cn": "空劫瑜伽", + "source": "BPHS", + "bvr_id": "BVR-5", + "category": "chandra", + "logic": { + "type": "custom", + "expr": "\nif 'Moon' not in ctx.planets:\n False\nelse:\n moon_h = house_of('Moon')\n h12 = ((moon_h - 1 + 11) % 12) + 1\n p_in_h12 = [p for p, info in ctx.planets.items() if p != 'Moon' and info.get('house') == h12]\n h2 = ((moon_h - 1 + 1) % 12) + 1\n p_in_h2 = [p for p, info in ctx.planets.items() if p != 'Moon' and info.get('house') == h2]\n not p_in_h2 and not p_in_h12\n", + "combo_template": "月亮两侧均无行星" + }, + "effects": [ + "人生艰辛", + "需自力更生", + "精神挑战" + ], + "strength": "弱", + "enabled": true, + "source_reference": "BVR-5: No planets in 1st, 2nd, 12th from Moon", + "bvr_chapter": "Chapter 1" + }, + { + "id": "chandra_mangala_same", + "name": "Chandra-Mangala Yoga", + "name_cn": "月火同宫格局", + "source": "BPHS", + "bvr_id": "BVR-6", + "category": "chandra", + "logic": { + "type": "same_house", + "a": "Mars", + "b": "Moon", + "combo_template": "火星与月亮同在第{h}宫" + }, + "effects": [ + "财富积累", + "行动力强", + "情绪驱动成功" + ], + "strength": "中", + "enabled": true + }, + { + "id": "chandra_mangala_212", + "name": "Chandra-Mangala Yoga (Extended - 2/12 from Moon)", + "name_cn": "月火2/12格局", + "source": "BPHS", + "bvr_id": null, + "category": "chandra", + "logic": { + "type": "in_houses_from", + "planet": "Mars", + "from": "Moon", + "relations": [ + "2nd_12th" + ], + "combo_template": "火星在第{h}宫(从月亮的2/12宫)" + }, + "effects": [ + "财运亨通", + "精力充沛", + "商业头脑" + ], + "strength": "中", + "enabled": true, + "dedup_key": "Chandra-Mangala Yoga" + }, + { + "id": "vipreet_6", + "name": "Harsha Vipreet Raja Yoga", + "name_cn": "喜悦逆行格局", + "source": "Phaladeepika", + "bvr_id": "BVR-29-37", + "category": "raja", + "logic": { + "type": "custom", + "expr": "\nlord_dh = lord(6)\nif lord_dh in ctx.planets:\n lh = house_of(lord_dh)\n lh in [6, 8, 12] and lh != 6\nelse:\n False\n", + "combo_template": "第6宫主星落入凶宫" + }, + "effects": [ + "因祸得福", + "逆境崛起", + "困境中成长" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "vipreet_8", + "name": "Sarala Vipreet Raja Yoga", + "name_cn": "锐利逆行格局", + "source": "Phaladeepika", + "bvr_id": "BVR-29-37", + "category": "raja", + "logic": { + "type": "custom", + "expr": "\nlord_dh = lord(8)\nif lord_dh in ctx.planets:\n lh = house_of(lord_dh)\n lh in [6, 8, 12] and lh != 8\nelse:\n False\n", + "combo_template": "第8宫主星落入凶宫" + }, + "effects": [ + "因祸得福", + "逆境崛起", + "困境中成长" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "vipreet_12", + "name": "Vimala Vipreet Raja Yoga", + "name_cn": "纯净逆行格局", + "source": "Phaladeepika", + "bvr_id": "BVR-29-37", + "category": "raja", + "logic": { + "type": "custom", + "expr": "\nlord_dh = lord(12)\nif lord_dh in ctx.planets:\n lh = house_of(lord_dh)\n lh in [6, 8, 12] and lh != 12\nelse:\n False\n", + "combo_template": "第12宫主星落入凶宫" + }, + "effects": [ + "因祸得福", + "逆境崛起", + "困境中成长" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "vipreet_pairs", + "name": "Vipreet Raja Yoga", + "name_cn": "逆行王者格局", + "source": "BPHS", + "bvr_id": "BVR-29-37", + "category": "raja", + "logic": { + "type": "custom", + "expr": "\npairs = [(6,8), (6,12), (8,12)]\nmatched = []\nfor h1, h2 in pairs:\n l1 = lord(h1)\n l2 = lord(h2)\n if l1 in ctx.planets and l2 in ctx.planets:\n if house_of(l1) == h2 and house_of(l2) == h1:\n matched.append((h1, h2, l1, l2))\nmatched\n", + "combo_template": "凶宫主星互落" + }, + "effects": [ + "因祸得福", + "逆境崛起" + ], + "strength": "强", + "enabled": true, + "dedup_key": "Vipreet Raja Yoga", + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "amala_yoga", + "name": "Amala Yoga", + "name_cn": "无瑕格局", + "source": "BPHS", + "bvr_id": "BVR-13", + "category": "auspicious", + "logic": { + "type": "custom", + "expr": "\nbenefics_10_11 = [p for p in BENEFICS if p in ctx.planets and house_of(p) in [10, 11] and not debil(p)]\nbool(benefics_10_11)\n", + "combo_template": "吉星在10/11宫" + }, + "effects": [ + "名声清白", + "受人敬仰", + "事业有成" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-13: 10th house/ lord with only benefics", + "bvr_chapter": "Chapter 2" + }, + { + "id": "parvata_yoga", + "name": "Parvata Yoga", + "name_cn": "山岳格局", + "source": "BPHS", + "bvr_id": "BVR-14", + "category": "auspicious", + "logic": { + "type": "custom", + "expr": "\nkl = list(dict.fromkeys([lord(h) for h in [1,4,7,10]]))\nkt = [h for h in [1,5,9]]\nkendra_lords_strong = sum(1 for k in kl if k in ctx.planets and (kendra(house_of(k)) or trikona(house_of(k))))\nif kendra_lords_strong < 2:\n False\nelse:\n lord_6 = lord(6)\n lord_8 = lord(8)\n lord_6_ok = lord_6 in ctx.planets and house_of(lord_6) != 1\n lord_8_ok = lord_8 in ctx.planets and house_of(lord_8) != 1\n lord_6_ok or lord_8_ok\n", + "combo_template": "角宫主星有力+凶宫主星不落入1宫" + }, + "effects": [ + "智慧卓越", + "富有口才", + "品格高尚" + ], + "strength": "中", + "enabled": true, + "source_reference": "BVR-14: Kendra/trikona occupied by benefics only", + "bvr_chapter": "Chapter 2" + }, + { + "id": "kahala_yoga", + "name": "Kahala Yoga", + "name_cn": "勇气格局", + "source": "BPHS", + "bvr_id": "BVR-15", + "category": "auspicious", + "logic": { + "type": "same_house", + "a": { + "role": "lord", + "house": 3 + }, + "b": { + "role": "lord", + "house": 10 + }, + "combo_template": "3宫主{a}与10宫主{b}同在第{h}宫" + }, + "effects": [ + "意志坚定", + "领导才能", + "充满活力" + ], + "strength": "中", + "enabled": true, + "source_reference": "BVR-15: L4 and L9 in mutual Kendras", + "bvr_chapter": "Chapter 2" + }, + { + "id": "sankha_yoga", + "name": "Sankha Yoga", + "name_cn": "海螺格局", + "source": "BPHS", + "bvr_id": "BVR-12", + "category": "auspicious", + "logic": { + "type": "custom", + "expr": "\nlord_5 = lord(5)\nlord_6 = lord(6)\nif lord_5 in ctx.planets and lord_6 in ctx.planets:\n l5h = house_of(lord_5)\n l6h = house_of(lord_6)\n (kendra(l5h) or trikona(l5h)) and (kendra(l6h) or trikona(l6h))\nelse:\n False\n", + "combo_template": "5宫主与6宫主均在有力宫位" + }, + "effects": [ + "学识渊博", + "品德高尚", + "物质充裕" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-12: L1 strong, L5/L6 in mutual Kendras", + "bvr_chapter": "Chapter 2" + }, + { + "id": "bheri_yoga", + "name": "Bheri Yoga", + "name_cn": "旗帜格局", + "source": "BPHS", + "bvr_id": "BVR-11", + "category": "auspicious", + "logic": { + "type": "custom", + "expr": "\nlord_9 = lord(9)\nif lord_9 not in ctx.planets or house_of(lord_9) != 2:\n False\nelse:\n jv_in_kendra = [p for p in ['Jupiter', 'Venus'] if p in ctx.planets and kendra(house_of(p))]\n bool(jv_in_kendra)\n", + "combo_template": "9宫主在2宫+木星/金星在角宫" + }, + "effects": [ + "品德高尚", + "长寿幸福", + "受人敬仰" + ], + "strength": "中", + "enabled": true, + "source_reference": "BVR-11: Multiple strong houses", + "bvr_chapter": "Chapter 2" + }, + { + "id": "mridanga_yoga", + "name": "Mridanga Yoga", + "name_cn": "鼓格局", + "source": "BPHS", + "bvr_id": "BVR-10", + "category": "auspicious", + "logic": { + "type": "custom", + "expr": "\nasc_lord = SIGN_LORDS.get(ctx.ascendant)\nif asc_lord not in ctx.planets:\n False\nelse:\n asc_strong = exalted(asc_lord) or own(asc_lord)\n other_strong = [p for p in ctx.planets if p != asc_lord and p not in ['Rahu', 'Ketu'] and (exalted(p) or own(p))]\n asc_strong and bool(other_strong)\n", + "combo_template": "上升主星有力+其他行星有力" + }, + "effects": [ + "权力权威", + "个人魅力", + "领导气质" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-10: Planets in exaltation/own in Kendras", + "bvr_chapter": "Chapter 2" + }, + { + "id": "sreenatha_yoga", + "name": "Sreenatha Yoga", + "name_cn": "幸运之主格局", + "source": "BPHS", + "bvr_id": "BVR-7", + "category": "auspicious", + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": { + "role": "lord", + "house": 7 + }, + "houses": [ + 10 + ] + }, + { + "type": "in_houses", + "planet": { + "role": "lord", + "house": 10 + }, + "houses": [ + 1 + ] + } + ] + }, + "effects": [ + "事业辉煌", + "婚姻美满", + "贵人相助" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-7: Benefics in 9th/10th from Lagna/Moon", + "bvr_chapter": "Chapter 1" + }, + { + "id": "matsya_yoga", + "name": "Matsya Yoga", + "name_cn": "鱼格局", + "source": "BPHS", + "bvr_id": "BVR-53", + "category": "auspicious", + "logic": { + "type": "custom", + "expr": "\nben_in_trikona = [p for p in BENEFICS if p in ctx.planets and house_of(p) in [5, 9]]\nmal_in_dusthana = [p for p in MALEFICS if p in ctx.planets and house_of(p) in [6, 8]]\nbool(ben_in_trikona and mal_in_dusthana)\n", + "combo_template": "吉星在三方宫+凶星在凶宫" + }, + "effects": [ + "聪慧过人", + "直觉敏锐", + "灵性成长" + ], + "strength": "中", + "enabled": true, + "source_reference": "BVR-53: Malefics in 3rd/6th/11th", + "bvr_chapter": "Chapter 9" + }, + { + "id": "koorma_yoga", + "name": "Koorma Yoga", + "name_cn": "龟格局", + "source": "BPHS", + "bvr_id": "BVR-54", + "category": "auspicious", + "logic": { + "type": "custom", + "expr": "\nben_in_1 = [p for p in BENEFICS if p in ctx.planets and house_of(p) == 1]\nlord_5 = lord(5)\nlord_9 = lord(9)\nlord_5_or_9_in_1 = False\nfor lp in [lord_5, lord_9]:\n if lp in ctx.planets and house_of(lp) == 1:\n lord_5_or_9_in_1 = True\nbool(ben_in_1 and lord_5_or_9_in_1)\n", + "combo_template": "吉星在1宫+5/9宫主在1宫" + }, + "effects": [ + "智慧深厚", + "耐心坚韧", + "精神修养" + ], + "strength": "中", + "enabled": true, + "source_reference": "BVR-54: Benefics in 1st/4th/7th/10th", + "bvr_chapter": "Chapter 9" + }, + { + "id": "khadga_yoga", + "name": "Khadga Yoga", + "name_cn": "剑格局", + "source": "BPHS", + "bvr_id": "BVR-55", + "category": "auspicious", + "logic": { + "type": "custom", + "expr": "\nlord_2 = lord(2)\nif lord_2 not in ctx.planets or house_of(lord_2) != 2:\n False\nelse:\n mal_in_2 = [p for p in MALEFICS if p in ctx.planets and house_of(p) == 2]\n not mal_in_2\n", + "combo_template": "2宫主在2宫且无凶星" + }, + "effects": [ + "财富充裕", + "口才出众", + "品格坚定" + ], + "strength": "中", + "enabled": true, + "source_reference": "BVR-55: Planets in 1st/4th/7th/10th from Moon", + "bvr_chapter": "Chapter 9" + }, + { + "id": "kusuma_yoga", + "name": "Kusuma Yoga", + "name_cn": "花格局", + "source": "BPHS", + "bvr_id": "BVR-56", + "category": "auspicious", + "logic": { + "type": "custom", + "expr": "\nchecks = [\n 'Jupiter' in ctx.planets and house_of('Jupiter') == 10,\n 'Moon' in ctx.planets and house_of('Moon') == 1,\n 'Sun' in ctx.planets and house_of('Sun') == 2,\n 'Venus' in ctx.planets and house_of('Venus') == 9,\n]\nsum(checks) >= 3\n", + "combo_template": "木星10/月亮1/太阳2/金星9 中满足3+" + }, + "effects": [ + "才貌双全", + "受人爱戴", + "幸福美满" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-56: Strong Lagna with benefic associations", + "bvr_chapter": "Chapter 9" + }, + { + "id": "guru_mangala_same", + "name": "Guru-Mangala Yoga", + "name_cn": "木火同宫格局", + "source": "BPHS", + "bvr_id": null, + "category": "conjunction", + "logic": { + "type": "same_house", + "a": "Jupiter", + "b": "Mars", + "combo_template": "木星与火星同在第{h}宫" + }, + "effects": [ + "智慧与行动力兼备", + "正义感强", + "领导能力" + ], + "strength": "强", + "enabled": true + }, + { + "id": "guru_mangala_parivartana", + "name": "Guru-Mangala Yoga", + "name_cn": "木火互容格局", + "source": "BPHS", + "bvr_id": null, + "category": "conjunction", + "logic": { + "type": "parivartana", + "lord_a": "Jupiter", + "lord_b": "Mars", + "combo_template": "木星与火星互换星座" + }, + "effects": [ + "智慧与行动力兼备", + "正义感强", + "领导能力" + ], + "strength": "强", + "enabled": true, + "dedup_key": "Guru-Mangala Yoga" + }, + { + "id": "budhaditya_yoga", + "name": "Budhaditya Yoga", + "name_cn": "水日同宫格局", + "source": "BPHS", + "bvr_id": "BVR-26", + "category": "conjunction", + "logic": { + "type": "same_house", + "a": "Mercury", + "b": "Sun", + "combo_template": "水星与太阳同在第{h}宫" + }, + "effects": [ + "智力超群", + "口才出众", + "学识渊博" + ], + "strength": "强", + "enabled": true + }, + { + "id": "budha_shukra_yoga", + "name": "Budha-Shukra Yoga", + "name_cn": "水金合相格局", + "source": "经典", + "bvr_id": null, + "category": "conjunction", + "logic": { + "type": "same_house", + "a": "Mercury", + "b": "Venus", + "combo_template": "水星与金星同在第{h}宫" + }, + "effects": [ + "艺术才华", + "商业头脑", + "审美卓越" + ], + "strength": "强", + "enabled": true + }, + { + "id": "surya_chandra_yoga", + "name": "Surya-Chandra Yoga", + "name_cn": "日月合相格局", + "source": "经典", + "bvr_id": null, + "category": "conjunction", + "logic": { + "type": "same_house", + "a": "Sun", + "b": "Moon", + "combo_template": "太阳与月亮同在第{h}宫" + }, + "effects": [ + "精神力量", + "领导气质", + "意志坚定" + ], + "strength": "强", + "enabled": true + }, + { + "id": "guru_shukra_yoga", + "name": "Guru-Shukra Yoga", + "name_cn": "木金合相格局", + "source": "BPHS", + "bvr_id": null, + "category": "conjunction", + "logic": { + "type": "same_house", + "a": "Jupiter", + "b": "Venus", + "combo_template": "木星与金星同在第{h}宫" + }, + "effects": [ + "智慧与爱心兼备", + "精神富足", + "艺术造诣" + ], + "strength": "强", + "enabled": true + }, + { + "id": "shani_rahu_yoga", + "name": "Shani-Rahu Yoga", + "name_cn": "土罗合相格局", + "source": "经典", + "bvr_id": null, + "category": "conjunction", + "logic": { + "type": "same_house", + "a": "Saturn", + "b": "Rahu", + "combo_template": "土星与罗睺同在第{h}宫" + }, + "effects": [ + "纪律与变革", + "突破传统", + "但也可能带来阻碍" + ], + "strength": "中", + "enabled": true + }, + { + "id": "mars_saturn_conjunction", + "name": "Mars-Saturn Conjunction", + "name_cn": "火土合相格局", + "source": "BPHS", + "bvr_id": null, + "category": "conjunction", + "logic": { + "type": "same_house", + "a": "Mars", + "b": "Saturn", + "combo_template": "火星与土星同在第{h}宫" + }, + "effects": [ + "行动力与纪律", + "也可能产生冲突", + "需平衡" + ], + "strength": "中", + "enabled": true + }, + { + "id": "surya_budha_yoga", + "name": "Surya-Budha Yoga", + "name_cn": "日水紧密合相格局", + "source": "经典", + "bvr_id": null, + "category": "conjunction", + "logic": { + "type": "same_house", + "a": "Sun", + "b": "Mercury", + "combo_template": "太阳与水星同在第{h}宫" + }, + "effects": [ + "智力超群", + "沟通能力强", + "学习能力佳" + ], + "strength": "强", + "enabled": true + }, + { + "id": "papakartari_yoga", + "name": "Papakartari Yoga", + "name_cn": "凶星夹击格局", + "source": "Brihat Jataka", + "bvr_id": null, + "category": "durbhaga", + "logic": { + "type": "custom", + "expr": "\ntargets = [1, 4, 7, 10, 5, 9]\nmatched = False\nfor th in targets:\n prev_h = ((th - 2) % 12) + 1\n next_h = (th % 12) + 1\n mal_before = [p for p in MALEFICS if p in ctx.planets and house_of(p) == prev_h]\n mal_after = [p for p in MALEFICS if p in ctx.planets and house_of(p) == next_h]\n if mal_before and mal_after:\n matched = True\n break\nmatched\n", + "combo_template": "某宫被凶星前后夹击" + }, + "effects": [ + "领域受限", + "需要额外努力", + "阻碍与挑战" + ], + "strength": "弱", + "enabled": true + }, + { + "id": "subhakartari_yoga", + "name": "Subhakartari Yoga", + "name_cn": "吉星护宫格局", + "source": "Brihat Jataka", + "bvr_id": null, + "category": "auspicious", + "logic": { + "type": "custom", + "expr": "\ntargets = [1, 4, 7, 10, 5, 9]\nmatched = False\nfor th in targets:\n prev_h = ((th - 2) % 12) + 1\n next_h = (th % 12) + 1\n ben_before = [p for p in BENEFICS if p in ctx.planets and house_of(p) == prev_h]\n ben_after = [p for p in BENEFICS if p in ctx.planets and house_of(p) == next_h]\n if ben_before and ben_after:\n matched = True\n break\nmatched\n", + "combo_template": "某宫被吉星前后守护" + }, + "effects": [ + "领域受保护", + "顺利发展", + "贵人助力" + ], + "strength": "强", + "enabled": true + }, + { + "id": "saraswati_yoga", + "name": "Saraswati Yoga", + "name_cn": "辩才天女格局", + "source": "BPHS", + "bvr_id": null, + "category": "auspicious", + "logic": { + "type": "custom", + "expr": "\nsaraswati_houses = [2, 4, 7, 9, 10]\nsaraswati_planets = [p for p in ['Jupiter', 'Venus', 'Mercury'] if p in ctx.planets and house_of(p) in saraswati_houses]\nif len(saraswati_planets) >= 3 or (len(saraswati_planets) >= 2 and 'Jupiter' in saraswati_planets):\n jup_dig = dignity('Jupiter') if 'Jupiter' in ctx.planets else ''\n jup_dig in ['EXALTED', 'OWN_SIGN', 'MOOLATRIKONA', 'FRIEND']\nelse:\n False\n", + "combo_template": "木星/金星/水星在吉宫" + }, + "effects": [ + "学问渊博", + "艺术才华", + "表达卓越" + ], + "strength": "强", + "enabled": true + }, + { + "id": "chamara_yoga", + "name": "Chamara Yoga", + "name_cn": "拂尘格局", + "source": "BPHS", + "bvr_id": null, + "category": "auspicious", + "logic": { + "type": "custom", + "expr": "\nasc_lord = SIGN_LORDS.get(ctx.ascendant)\nif asc_lord not in ctx.planets:\n False\nelse:\n asc_strong = exalted(asc_lord) or own(asc_lord)\n ben_kt = [p for p in BENEFICS if p in ctx.planets and (kendra(house_of(p)) or trikona(house_of(p)))]\n asc_strong and len(ben_kt) >= 2\n", + "combo_template": "上升主有力+吉星在角宫/三方宫" + }, + "effects": [ + "长寿健康", + "受人尊敬", + "智慧通达" + ], + "strength": "强", + "enabled": true + }, + { + "id": "akhanda_samrajya", + "name": "Akhanda Samrajya Yoga", + "name_cn": "永恒帝王格局", + "source": "BPHS", + "bvr_id": null, + "category": "raja", + "logic": { + "type": "custom", + "expr": "\nif 'Jupiter' not in ctx.planets:\n False\nelse:\n jh = house_of('Jupiter')\n if jh not in [2, 5, 9, 11]:\n False\n else:\n lord_11 = lord(11)\n if lord_11 not in ctx.planets:\n False\n else:\n l11h = house_of(lord_11)\n l11h == 11 or kendra(l11h)\n", + "combo_template": "木星在2/5/9/11宫+11宫主有力" + }, + "effects": [ + "权力持久", + "事业辉煌", + "影响力广泛" + ], + "strength": "强", + "enabled": true + }, + { + "id": "gurumauli_9", + "name": "Gurumauli Yoga", + "name_cn": "至上师格局", + "source": "经典", + "bvr_id": null, + "category": "auspicious", + "logic": { + "type": "in_houses", + "planet": "Jupiter", + "houses": [ + 9 + ], + "combo_template": "木星在9宫" + }, + "effects": [ + "命运眷顾", + "精神导师指引", + "福德深厚" + ], + "strength": "强", + "enabled": true + }, + { + "id": "gurumauli_with_lord9", + "name": "Gurumauli Yoga", + "name_cn": "至上师关联格局", + "source": "经典", + "bvr_id": null, + "category": "auspicious", + "logic": { + "type": "same_house", + "a": "Jupiter", + "b": { + "role": "lord", + "house": 9 + }, + "combo_template": "木星与9宫主同在第{h}宫" + }, + "effects": [ + "命运眷顾", + "贵人运强", + "智慧通达" + ], + "strength": "强", + "enabled": true, + "dedup_key": "Gurumauli Yoga" + }, + { + "id": "jupiter_in_dusthana", + "name": "Jupiter in Dusthana", + "name_cn": "车格局(木星在凶宫)", + "source": "BPHS", + "bvr_id": null, + "category": "durbhaga", + "logic": { + "type": "in_houses", + "planet": "Jupiter", + "houses": [ + 6, + 8, + 12 + ], + "combo_template": "木星在{h}宫" + }, + "effects": [ + "财富不稳", + "健康需注意", + "精神起伏" + ], + "strength": "弱", + "enabled": true + }, + { + "id": "daridra_11", + "name": "Daridra Yoga", + "name_cn": "贫困格局", + "source": "BPHS", + "bvr_id": null, + "category": "durbhaga", + "logic": { + "type": "custom", + "expr": "\nlord_11 = lord(11)\nlord_11 in ctx.planets and house_of(lord_11) in [6, 8, 12]\n", + "combo_template": "11宫主落入凶宫" + }, + "effects": [ + "财务困难", + "需努力积累", + "谨慎理财" + ], + "strength": "弱", + "enabled": true + }, + { + "id": "daridra_2", + "name": "Daridra Yoga (variant)", + "name_cn": "贫困格局变体", + "source": "BPHS", + "bvr_id": null, + "category": "durbhaga", + "logic": { + "type": "custom", + "expr": "\nlord_2 = lord(2)\nlord_2 in ctx.planets and debil(lord_2) and dusthana(house_of(lord_2))\n", + "combo_template": "2宫主落陷在凶宫" + }, + "effects": [ + "财务压力", + "家庭纠纷", + "需节俭持家" + ], + "strength": "弱", + "enabled": true, + "dedup_key": "Daridra Yoga" + }, + { + "id": "gola_yoga", + "name": "Gola Yoga", + "name_cn": "球格局", + "source": "BPHS", + "bvr_id": null, + "category": "nabhasa", + "logic": { + "type": "houses_occupied", + "planets": "all", + "count": 1, + "combo_template": "所有行星在同一宫" + }, + "effects": [ + "专注集中", + "也可能过于极端" + ], + "strength": "中", + "enabled": true + }, + { + "id": "yuga_yoga", + "name": "Yuga Yoga", + "name_cn": "双格局", + "source": "BPHS", + "bvr_id": null, + "category": "nabhasa", + "logic": { + "type": "houses_occupied", + "planets": "all", + "count": 2, + "combo_template": "所有行星在两宫" + }, + "effects": [ + "双重性格", + "生活两极化" + ], + "strength": "中", + "enabled": true + }, + { + "id": "sula_yoga", + "name": "Sula Yoga", + "name_cn": "三叉格局", + "source": "BPHS", + "bvr_id": null, + "category": "nabhasa", + "logic": { + "type": "houses_occupied", + "planets": "all", + "count": 3, + "combo_template": "所有行星在三宫" + }, + "effects": [ + "行动力", + "但也可能有冲突" + ], + "strength": "中", + "enabled": true + }, + { + "id": "kedara_yoga", + "name": "Kedara Yoga", + "name_cn": "四重格局", + "source": "BPHS", + "bvr_id": null, + "category": "nabhasa", + "logic": { + "type": "houses_occupied", + "planets": "all", + "count": 4, + "combo_template": "所有行星在四宫" + }, + "effects": [ + "稳定", + "农业/地产运" + ], + "strength": "中", + "enabled": true + }, + { + "id": "veena_yoga", + "name": "Veena Yoga", + "name_cn": "琴格局", + "source": "BPHS", + "bvr_id": "BVR-91", + "category": "nabhasa", + "logic": { + "type": "houses_occupied", + "planets": "visible", + "count": 7, + "combo_template": "行星分布在七宫" + }, + "effects": [ + "艺术才华", + "生活丰富", + "多才多艺" + ], + "strength": "强", + "enabled": true + }, + { + "id": "asraya_yoga", + "name": "Asraya Yoga", + "name_cn": "依托格局", + "source": "BPHS", + "bvr_id": null, + "category": "nabhasa", + "logic": { + "type": "all_planets", + "planets": "all", + "condition": { + "type": "custom", + "expr": "kendra(house_of(bindings.get('planet', ''))) or trikona(house_of(bindings.get('planet', '')))" + } + }, + "effects": [ + "生活稳定", + "有依靠", + "根基深厚" + ], + "strength": "强", + "enabled": true + }, + { + "id": "dala_yoga", + "name": "Dala Yoga", + "name_cn": "分叶格局", + "source": "BPHS", + "bvr_id": null, + "category": "nabhasa", + "logic": { + "type": "custom", + "expr": "\ndala_count = sum(1 for dh in [6, 8, 12] if lord(dh) in ctx.planets and kendra(house_of(lord(dh))))\ndala_count >= 2\n", + "combo_template": "凶宫主在角宫" + }, + "effects": [ + "逆境中崛起", + "转化能力" + ], + "strength": "强", + "enabled": true + }, + { + "id": "maala_yoga", + "name": "Maala Yoga", + "name_cn": "串珠格局", + "source": "BPHS", + "bvr_id": null, + "category": "nabhasa", + "logic": { + "type": "custom", + "expr": "\nben_in_kendra = sorted(set(house_of(p) for p in BENEFICS if p in ctx.planets and kendra(house_of(p))))\nmatched = False\nif len(ben_in_kendra) >= 3:\n for i in range(len(ben_in_kendra) - 2):\n if ben_in_kendra[i+1] - ben_in_kendra[i] == 1 and ben_in_kendra[i+2] - ben_in_kendra[i+1] == 1:\n matched = True\n break\nmatched\n", + "combo_template": "吉星在连续角宫" + }, + "effects": [ + "幸运连绵", + "福气不断" + ], + "strength": "强", + "enabled": true + }, + { + "id": "mahabhagya_yoga", + "name": "Mahabhagya Yoga", + "name_cn": "大运格局", + "source": "BPHS", + "bvr_id": null, + "category": "special", + "logic": { + "type": "custom", + "expr": "\nodd_signs = ['Aries', 'Gemini', 'Leo', 'Libra', 'Sagittarius', 'Aquarius']\nasc_odd = ctx.ascendant in odd_signs\nsun_odd = 'Sun' in ctx.planets and sign_of('Sun') in odd_signs\nmoon_odd = 'Moon' in ctx.planets and sign_of('Moon') in odd_signs\nasc_odd and sun_odd and moon_odd\n", + "combo_template": "上升/太阳/月亮均在奇数星座" + }, + "effects": [ + "命运眷顾", + "人生顺遂", + "贵人运强" + ], + "strength": "强", + "enabled": true + }, + { + "id": "pushkala_yoga", + "name": "Pushkala Yoga", + "name_cn": "丰盈格局", + "source": "BPHS", + "bvr_id": "BVR-26", + "category": "special", + "logic": { + "type": "custom", + "expr": "\nasc_lord = SIGN_LORDS.get(ctx.ascendant)\nif asc_lord not in ctx.planets:\n False\nelse:\n asc_strong = exalted(asc_lord) or own(asc_lord)\n moon_ok = 'Moon' in ctx.planets and sign_of('Moon') != DEBILITATION.get('Moon')\n ben_in_asc = [p for p in BENEFICS if p in ctx.planets and house_of(p) == 1]\n asc_strong and moon_ok and bool(ben_in_asc)\n", + "combo_template": "上升主有力+月亮良好+吉星在1宫" + }, + "effects": [ + "生活富足", + "社会地位高", + "受人尊敬" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-26: L1 with Moon, dispositor in Kendra", + "bvr_chapter": "Chapter 5" + }, + { + "id": "adhi_yoga", + "name": "Adhi Yoga", + "name_cn": "上方格局", + "source": "BPHS", + "bvr_id": "BVR-7", + "category": "special", + "logic": { + "type": "custom", + "expr": "\nadhi = {6: 12, 8: 2, 12: 11}\nmatched = False\nfor dh, uh in adhi.items():\n ben_above = [p for p in BENEFICS if p in ctx.planets and house_of(p) == uh]\n if ben_above:\n matched = True\n break\nmatched\n", + "combo_template": "吉星在凶宫上方" + }, + "effects": [ + "权威地位", + "领导能力", + "受人尊敬" + ], + "strength": "强", + "enabled": true + }, + { + "id": "chatussagara_yoga", + "name": "Chatussagara Yoga", + "name_cn": "四角充盈格局", + "source": "BPHS", + "bvr_id": null, + "category": "special", + "logic": { + "type": "custom", + "expr": "\nall(len(planets_in(h)) > 0 for h in [1, 4, 7, 10])\n", + "combo_template": "1/4/7/10宫均有行星" + }, + "effects": [ + "生活圆满", + "各方面均衡发展", + "命运眷顾" + ], + "strength": "强", + "enabled": true + }, + { + "id": "virinchi_yoga", + "name": "Virinchi Yoga", + "name_cn": "创造格局", + "source": "BPHS", + "bvr_id": null, + "category": "special", + "logic": { + "type": "custom", + "expr": "\nasc_lord = SIGN_LORDS.get(ctx.ascendant)\nif asc_lord not in ctx.planets:\n False\nelse:\n asc_ok = kendra(house_of(asc_lord)) or trikona(house_of(asc_lord))\n lord_5 = lord(5)\n lord5_ok = lord_5 in ctx.planets and kendra(house_of(lord_5))\n jup_ok = 'Jupiter' in ctx.planets and (exalted('Jupiter') or own('Jupiter') or house_of('Jupiter') in [1,5,9])\n asc_ok and lord5_ok and jup_ok\n", + "combo_template": "上升主有力+5宫主在角宫+木星有力" + }, + "effects": [ + "创造力强", + "智慧卓越", + "精神修养" + ], + "strength": "强", + "enabled": true + }, + { + "id": "artistic_yoga", + "name": "Artistic Yoga (Benefics in 2/5/9)", + "name_cn": "艺术琴格局", + "source": "BPHS", + "bvr_id": null, + "category": "special", + "logic": { + "type": "custom", + "expr": "\nasc_lord = SIGN_LORDS.get(ctx.ascendant)\nben_in_259 = [p for p in BENEFICS if p in ctx.planets and house_of(p) in [2, 5, 9]]\nasc_strong = asc_lord in ctx.planets and (exalted(asc_lord) or own(asc_lord))\nlen(ben_in_259) >= 2 and asc_strong\n", + "combo_template": "吉星在2/5/9宫+上升主有力" + }, + "effects": [ + "艺术才华", + "音乐天赋", + "审美卓越" + ], + "strength": "强", + "enabled": true + }, + { + "id": "kalanidhi_yoga", + "name": "Kalanidhi Yoga", + "name_cn": "艺藏格局", + "source": "BPHS", + "bvr_id": null, + "category": "special", + "logic": { + "type": "custom", + "expr": "\nif 'Jupiter' not in ctx.planets or house_of('Jupiter') not in [2, 5]:\n False\nelse:\n jh = house_of('Jupiter')\n assoc = [p for p in ['Venus', 'Mercury'] if p in ctx.planets and (house_of(p) == jh or abs(house_of(p) - jh) in [3, 6, 9])]\n bool(assoc)\n", + "combo_template": "木星在2/5宫+被金星/水星关联" + }, + "effects": [ + "艺术才华", + "学识渊博", + "受人尊敬" + ], + "strength": "强", + "enabled": true + }, + { + "id": "saubhagya_yoga", + "name": "Saubhagya Yoga", + "name_cn": "幸运格局", + "source": "BPHS", + "bvr_id": null, + "category": "special", + "logic": { + "type": "custom", + "expr": "\nasc_lord = SIGN_LORDS.get(ctx.ascendant)\nasc_strong = asc_lord in ctx.planets and kendra(house_of(asc_lord)) and (exalted(asc_lord) or own(asc_lord))\nmoon_ok = 'Moon' in ctx.planets and house_of('Moon') in [1, 5, 9, 10, 11]\nasc_strong and moon_ok\n", + "combo_template": "上升主有力在角宫+月亮在吉宫" + }, + "effects": [ + "幸运眷顾", + "生活幸福", + "婚姻美满" + ], + "strength": "强", + "enabled": true + }, + { + "id": "shubha_yoga", + "name": "Shubha Yoga", + "name_cn": "全吉星格局", + "source": "BPHS", + "bvr_id": null, + "category": "special", + "logic": { + "type": "custom", + "expr": "\nbenefics_present = [p for p in BENEFICS if p in ctx.planets]\nall_benefics_kt = all(kendra(house_of(p)) or trikona(house_of(p)) for p in benefics_present)\nall_benefics_kt and len(benefics_present) >= 3\n", + "combo_template": "所有吉星在角宫或三方宫" + }, + "effects": [ + "生活顺遂", + "福气满满", + "受人爱戴" + ], + "strength": "强", + "enabled": true + }, + { + "id": "graha_yuddha", + "name": "Graha Yuddha", + "name_cn": "行星战争", + "source": "经典", + "bvr_id": null, + "category": "special", + "logic": { + "type": "degree_gap", + "a": "all", + "b": "all", + "max_gap": 1.0, + "combo_template": "行星在同一星座内相距<1°" + }, + "effects": [ + "行星力量竞争", + "相关领域有张力" + ], + "strength": "中", + "enabled": true + }, + { + "id": "pushya_yoga", + "name": "Pushya Yoga", + "name_cn": "成长格局", + "source": "BPHS", + "bvr_id": null, + "category": "special", + "logic": { + "type": "custom", + "expr": "\nben_in_8912 = [p for p in BENEFICS if p in ctx.planets and house_of(p) in [8, 9, 12]]\nlen(ben_in_8912) >= 2\n", + "combo_template": "吉星在8/9/12宫" + }, + "effects": [ + "精神成长", + "灵性提升", + "命运眷顾" + ], + "strength": "强", + "enabled": true + }, + { + "id": "raja_yoga_2_10", + "name": "Raja Yoga (2nd & 10th Lords)", + "name_cn": "王者格局(2宫主+10宫主)", + "category": "raja", + "source": "BPHS", + "bvr_id": "Raja-5", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(2) in planets and lords_of(10) in planets and house_of(lords_of(2)) == house_of(lords_of(10))" + } + ] + }, + "effects": [ + "事业成功", + "财富积累", + "社会地位" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "raja_yoga_1_4", + "name": "Raja Yoga (1st & 4th Lords)", + "name_cn": "王者格局(1宫主+4宫主)", + "category": "raja", + "source": "BPHS", + "bvr_id": "Raja-6", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(1) in planets and lords_of(4) in planets and house_of(lords_of(1)) == house_of(lords_of(4))" + } + ] + }, + "effects": [ + "权力地位", + "家庭幸福", + "物质成功" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "raja_yoga_5_9", + "name": "Raja Yoga (5th & 9th Lords)", + "name_cn": "王者格局(5宫主+9宫主)", + "category": "raja", + "source": "BPHS", + "bvr_id": "Raja-7", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(5) in planets and lords_of(9) in planets and house_of(lords_of(5)) == house_of(lords_of(9))" + } + ] + }, + "effects": [ + "智慧名声", + "命运眷顾", + "精神成就" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "raja_yoga_4_9", + "name": "Raja Yoga (4th & 9th Lords)", + "name_cn": "王者格局(4宫主+9宫主)", + "category": "raja", + "source": "BPHS", + "bvr_id": "Raja-8", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(4) in planets and lords_of(9) in planets and house_of(lords_of(4)) == house_of(lords_of(9))" + } + ] + }, + "effects": [ + "家庭幸福", + "财富地位", + "精神修养" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "raja_yoga_mutual_aspect", + "name": "Raja Yoga (Mutual Aspect)", + "name_cn": "王者格局(互视)", + "category": "raja", + "source": "BPHS", + "bvr_id": "Raja-9", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "any(house_of(k) and house_of(t) and abs(house_of(k)-house_of(t)) in [3,6,9] for k in kendra_lords_list() for t in trikona_lords_list() if k in planets and t in planets)" + } + ] + }, + "effects": [ + "权力地位", + "影响力" + ], + "strength": "中", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "raja_yoga_lord_in_kendra", + "name": "Raja Yoga (Lord in Own Kendra)", + "name_cn": "王者格局(宫主星在自身角宫)", + "category": "raja", + "source": "BPHS", + "bvr_id": "Raja-10", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "any(lord in planets and is_kendra(house_of(lord)) and get_sign_of(lord) and SIGN_LORDS.get(get_sign_of(lord)) == lord for lord in all_lords())" + } + ] + }, + "effects": [ + "事业成功", + "自我实现" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "raja_yoga_kendra_lord_exalted", + "name": "Raja Yoga (Kendra Lord Exalted)", + "name_cn": "王者格局(角宫主星入旺)", + "category": "raja", + "source": "BPHS", + "bvr_id": "Raja-11", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "any(k in planets and is_exalted(k) for k in kendra_lords_list())" + } + ] + }, + "effects": [ + "极高地位", + "名声远扬" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "raja_yoga_trikona_lord_exalted", + "name": "Raja Yoga (Trikona Lord Exalted)", + "name_cn": "王者格局(三方宫主星入旺)", + "category": "raja", + "source": "BPHS", + "bvr_id": "Raja-12", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "any(t in planets and is_exalted(t) for t in trikona_lords_list())" + } + ] + }, + "effects": [ + "智慧卓越", + "命运眷顾", + "精神成就" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "dhana_yoga_5_11", + "name": "Dhana Yoga (5th & 11th Lords)", + "name_cn": "财富格局(5宫主+11宫主)", + "category": "dhana", + "source": "Phaladeepika", + "bvr_id": "Dhana-5", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(5) in planets and lords_of(11) in planets and house_of(lords_of(5)) == house_of(lords_of(11))" + } + ] + }, + "effects": [ + "投资收益", + "子女带来财富", + "智慧致富" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-38-46: Wealth-giving combinations", + "bvr_chapter": "Chapter 7" + }, + { + "id": "dhana_yoga_2_5", + "name": "Dhana Yoga (2nd & 5th Lords)", + "name_cn": "财富格局(2宫主+5宫主)", + "category": "dhana", + "source": "Phaladeepika", + "bvr_id": "Dhana-6", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(2) in planets and lords_of(5) in planets and house_of(lords_of(2)) == house_of(lords_of(5))" + } + ] + }, + "effects": [ + "储蓄丰厚", + "子女运好", + "投资成功" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-38-46: Wealth-giving combinations", + "bvr_chapter": "Chapter 7" + }, + { + "id": "dhana_yoga_9_2", + "name": "Dhana Yoga (9th Lord in 2nd)", + "name_cn": "财富格局(9宫主在2宫)", + "category": "dhana", + "source": "BPHS", + "bvr_id": "Dhana-7", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(9) in planets and house_of(lords_of(9)) == 2" + } + ] + }, + "effects": [ + "祖业丰厚", + "命运眷顾带来的财富", + "物质成功" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-38-46: Wealth-giving combinations", + "bvr_chapter": "Chapter 7" + }, + { + "id": "dhana_yoga_11_2", + "name": "Dhana Yoga (11th Lord in 2nd)", + "name_cn": "财富格局(11宫主在2宫)", + "category": "dhana", + "source": "BPHS", + "bvr_id": "Dhana-8", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(11) in planets and house_of(lords_of(11)) == 2" + } + ] + }, + "effects": [ + "持续收入", + "盈利丰厚", + "经济稳定" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-38-46: Wealth-giving combinations", + "bvr_chapter": "Chapter 7" + }, + { + "id": "dhana_yoga_jupiter_in_2_11", + "name": "Dhana Yoga (Jupiter in 2nd/11th)", + "name_cn": "财富格局(木星在2/11宫)", + "category": "dhana", + "source": "BPHS", + "bvr_id": "Dhana-9", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "'Jupiter' in planets and house_of('Jupiter') in [2, 11]" + } + ] + }, + "effects": [ + "财富增长", + "道德致富", + "慷慨大方" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-38-46: Wealth-giving combinations", + "bvr_chapter": "Chapter 7" + }, + { + "id": "dhana_yoga_venus_strong", + "name": "Dhana Yoga (Strong Venus)", + "name_cn": "财富格局(金星有力)", + "category": "dhana", + "source": "BPHS", + "bvr_id": "Dhana-10", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "'Venus' in planets and (is_exalted('Venus') or is_own_sign('Venus') or is_moolatrikona('Venus'))" + } + ] + }, + "effects": [ + "物质享受", + "艺术财富", + "奢侈品" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-38-46: Wealth-giving combinations", + "bvr_chapter": "Chapter 7" + }, + { + "id": "raja_nabhasa", + "name": "Raja Nabhasa Yoga", + "name_cn": "王天空格局", + "category": "nabhasa", + "source": "BPHS Chapter 4", + "bvr_id": "Nabhasa-9", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "all(house_of(p) in [1,4,7,10] for p in planets if p in planets_list())" + } + ] + }, + "effects": [ + "权力地位", + "王者气质" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "dharma_nabhasa", + "name": "Dharma Nabhasa Yoga", + "name_cn": "法天空格局", + "category": "nabhasa", + "source": "BPHS Chapter 4", + "bvr_id": "Nabhasa-10", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "all(house_of(p) in [1,5,9] for p in planets if p in planets_list())" + } + ] + }, + "effects": [ + "宗教虔诚", + "道德高尚", + "命运眷顾" + ], + "strength": "强", + "enabled": true + }, + { + "id": "ardha_nabhasa", + "name": "Ardha Nabhasa Yoga", + "name_cn": "半天空格局", + "category": "nabhasa", + "source": "BPHS Chapter 4", + "bvr_id": "Nabhasa-11", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "len(set(house_of(p) for p in planets if p in planets_list())) == 6" + } + ] + }, + "effects": [ + "平衡人生", + "中等成就" + ], + "strength": "中", + "enabled": true, + "source_reference": "BVR-38-46: Wealth-giving combinations", + "bvr_chapter": "Chapter 7" + }, + { + "id": "kamala_nabhasa", + "name": "Kamala Nabhasa Yoga", + "name_cn": "莲天空格局", + "category": "nabhasa", + "source": "BPHS Chapter 4", + "bvr_id": "Nabhasa-12", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "len(set(house_of(p) for p in planets if p in planets_list())) == 5" + } + ] + }, + "effects": [ + "优雅生活", + "艺术气质" + ], + "strength": "中", + "enabled": true, + "source_reference": "BVR-13: 10th house/ lord with only benefics", + "bvr_chapter": "Chapter 2" + }, + { + "id": "pasa_nabhasa", + "name": "Pasa Nabhasa Yoga", + "name_cn": "绳天空格局", + "category": "nabhasa", + "source": "BPHS Chapter 4", + "bvr_id": "Nabhasa-13", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "len(set(house_of(p) for p in planets if p in planets_list())) == 9" + } + ] + }, + "effects": [ + "束缚感", + "需要努力突破" + ], + "strength": "中", + "enabled": true + }, + { + "id": "mala_nabhasa", + "name": "Mala Nabhasa Yoga", + "name_cn": "花环天空格局", + "category": "nabhasa", + "source": "BPHS Chapter 4", + "bvr_id": "Nabhasa-14", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "len(set(house_of(p) for p in planets if p in planets_list())) == 8" + } + ] + }, + "effects": [ + "名誉", + "社会认可" + ], + "strength": "强", + "enabled": true + }, + { + "id": "mukuta_nabhasa", + "name": "Mukuta Nabhasa Yoga", + "name_cn": "冠天空格局", + "category": "nabhasa", + "source": "BPHS Chapter 4", + "bvr_id": "Nabhasa-15", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "len(set(house_of(p) for p in planets if p in planets_list())) == 12" + } + ] + }, + "effects": [ + "全面性", + "人生丰富" + ], + "strength": "中", + "enabled": true + }, + { + "id": "bheda_nabhasa", + "name": "Bheda Nabhasa Yoga", + "name_cn": "分离天空格局", + "category": "nabhasa", + "source": "BPHS Chapter 4", + "bvr_id": "Nabhasa-16", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "not all(house_of(p) for p in planets if p in planets_list())" + } + ] + }, + "effects": [ + "分离感", + "独立性强" + ], + "strength": "中", + "enabled": true + }, + { + "id": "asraya_partial", + "name": "Asraya (Partial)", + "name_cn": "依托格局(部分)", + "category": "nabhasa", + "source": "BPHS Chapter 4", + "bvr_id": "Nabhasa-17", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "sum(1 for p in planets if p in planets_list() and (is_kendra(house_of(p)) or is_trikona(house_of(p)))) >= len([p for p in planets if p in planets_list()]) * 0.7" + } + ] + }, + "effects": [ + "有依靠", + "生活稳定" + ], + "strength": "中", + "enabled": true + }, + { + "id": "parisraya_nabhasa", + "name": "Parisraya Nabhasa Yoga", + "name_cn": "依附天空格局", + "category": "nabhasa", + "source": "BPHS Chapter 4", + "bvr_id": "Nabhasa-18", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "sum(1 for p in planets if p in planets_list() and is_dusthana(house_of(p))) >= 4" + } + ] + }, + "effects": [ + "需要依赖他人", + "人生有挑战" + ], + "strength": "弱", + "enabled": true + }, + { + "id": "arishta_yoga", + "name": "Arishta Yoga", + "name_cn": "不幸格局(凶)", + "category": "durbhaga", + "source": "BPHS", + "bvr_id": "Arishta-1", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(1) in planets and is_debilitated(lords_of(1)) and is_dusthana(house_of(lords_of(1)))" + } + ] + }, + "effects": [ + "人生挑战", + "健康需注意", + "需要努力" + ], + "strength": "弱", + "enabled": true + }, + { + "id": "arishta_yoga_2", + "name": "Arishta Yoga (2nd House)", + "name_cn": "不幸格局(2宫凶)", + "category": "durbhaga", + "source": "BPHS", + "bvr_id": "Arishta-2", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(2) in planets and is_debilitated(lords_of(2)) and is_dusthana(house_of(lords_of(2)))" + } + ] + }, + "effects": [ + "财务困难", + "家庭问题" + ], + "strength": "弱", + "enabled": true + }, + { + "id": "jupiter_upachaya_from_moon", + "name": "Jupiter in Upachaya from Moon", + "name_cn": "车格局(从月亮)", + "category": "durbhaga", + "source": "BPHS", + "bvr_id": "Shakata-2", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "'Jupiter' in planets and 'Moon' in planets and house_of('Jupiter') in [2,5,8,11] and abs(house_of('Jupiter') - house_of('Moon')) not in [0,3,6,9]" + } + ] + }, + "effects": [ + "财富波动", + "精神压力" + ], + "strength": "弱", + "enabled": true + }, + { + "id": "kemadruma_variant", + "name": "Kemadruma Yoga (Empty Houses)", + "name_cn": "空劫格局(空宫版)", + "category": "durbhaga", + "source": "Brihat Jataka", + "bvr_id": "Kemadruma-2", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "'Moon' in planets and not any(p in planets and p != 'Moon' and abs(house_of(p) - house_of('Moon')) in [1,11] for p in planets_list())" + } + ] + }, + "effects": [ + "自力更生", + "精神孤独" + ], + "strength": "弱", + "enabled": true, + "source_reference": "BVR-5: No planets in 1st, 2nd, 12th from Moon", + "bvr_chapter": "Chapter 1" + }, + { + "id": "daridra_yoga_6", + "name": "Daridra Yoga (6th Lord)", + "name_cn": "贫困格局(6宫主)", + "category": "durbhaga", + "source": "BPHS", + "bvr_id": "Daridra-3", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(6) in planets and house_of(lords_of(6)) in [6,8,12]" + } + ] + }, + "effects": [ + "债务问题", + "需要节约" + ], + "strength": "弱", + "enabled": true + }, + { + "id": "daridra_yoga_combined", + "name": "Daridra Yoga (Combined)", + "name_cn": "贫困格局(组合)", + "category": "durbhaga", + "source": "BPHS", + "bvr_id": "Daridra-4", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(2) in planets and lords_of(11) in planets and house_of(lords_of(2)) in [6,8,12] and house_of(lords_of(11)) in [6,8,12]" + } + ] + }, + "effects": [ + "严重财务困难", + "需要极度节俭" + ], + "strength": "弱", + "enabled": true + }, + { + "id": "surya_guru_yoga", + "name": "Surya-Guru Yoga", + "name_cn": "日木合相格局", + "category": "conjunction", + "source": "BPHS", + "bvr_id": "Conj-10", + "logic": { + "type": "same_house", + "planets": [ + "Sun", + "Jupiter" + ] + }, + "effects": [ + "智慧与权威", + "精神领导力" + ], + "strength": "强", + "enabled": true + }, + { + "id": "surya_shukra_yoga", + "name": "Surya-Shukra Yoga", + "name_cn": "日金合相格局", + "category": "conjunction", + "source": "BPHS", + "bvr_id": "Conj-11", + "logic": { + "type": "same_house", + "planets": [ + "Sun", + "Venus" + ] + }, + "effects": [ + "艺术气质", + "审美卓越", + "社交能力" + ], + "strength": "强", + "enabled": true + }, + { + "id": "moon_guru_yoga", + "name": "Chandra-Guru Yoga", + "name_cn": "月木合相格局", + "category": "conjunction", + "source": "BPHS", + "bvr_id": "Conj-12", + "logic": { + "type": "same_house", + "planets": [ + "Moon", + "Jupiter" + ] + }, + "effects": [ + "智慧与情感兼备", + "精神成长", + "好运" + ], + "strength": "强", + "enabled": true + }, + { + "id": "moon_venus_yoga", + "name": "Chandra-Shukra Yoga", + "name_cn": "月金合相格局", + "category": "conjunction", + "source": "BPHS", + "bvr_id": "Conj-13", + "logic": { + "type": "same_house", + "planets": [ + "Moon", + "Venus" + ] + }, + "effects": [ + "情感丰富", + "艺术才华", + "审美卓越" + ], + "strength": "强", + "enabled": true + }, + { + "id": "guru_chandra_mangala", + "name": "Guru-Chandra-Mangala Yoga", + "name_cn": "木月火合相格局", + "category": "conjunction", + "source": "BPHS", + "bvr_id": "Conj-14", + "logic": { + "type": "and", + "conditions": [ + { + "type": "same_house", + "planets": [ + "Jupiter", + "Moon" + ] + }, + { + "type": "same_house", + "planets": [ + "Moon", + "Mars" + ] + } + ] + }, + "effects": [ + "智慧+情感+行动力", + "全面成功" + ], + "strength": "强", + "enabled": true + }, + { + "id": "rahu_guru_yoga", + "name": "Rahu-Guru Yoga", + "name_cn": "罗木合相格局", + "category": "conjunction", + "source": "经典文献", + "bvr_id": "Conj-15", + "logic": { + "type": "same_house", + "planets": [ + "Rahu", + "Jupiter" + ] + }, + "effects": [ + "精神扩张", + "也可能产生幻象" + ], + "strength": "中", + "enabled": true + }, + { + "id": "ketu_mars_yoga", + "name": "Ketu-Mars Yoga", + "name_cn": "计火合相格局", + "category": "conjunction", + "source": "经典文献", + "bvr_id": "Conj-16", + "logic": { + "type": "same_house", + "planets": [ + "Ketu", + "Mars" + ] + }, + "effects": [ + "精神与行动力结合", + "可能出现突发情况" + ], + "strength": "中", + "enabled": true + }, + { + "id": "putra_yoga_5_9", + "name": "Putra Yoga (5th & 9th Lords)", + "name_cn": "子女格局(5宫主+9宫主)", + "category": "putra", + "source": "BPHS", + "bvr_id": "Putra-1", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(5) in planets and lords_of(9) in planets and (house_of(lords_of(5)) == house_of(lords_of(9)) or (is_kendra(house_of(lords_of(5))) and is_kendra(house_of(lords_of(9)))))" + } + ] + }, + "effects": [ + "子女运好", + "子女有成就" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-57-65: Children-giving combinations", + "bvr_chapter": "Chapter 10" + }, + { + "id": "putra_yoga_jupiter_strong", + "name": "Putra Yoga (Strong Jupiter)", + "name_cn": "子女格局(木星有力)", + "category": "putra", + "source": "BPHS", + "bvr_id": "Putra-2", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "'Jupiter' in planets and (is_exalted('Jupiter') or is_own_sign('Jupiter') or house_of('Jupiter') in [1,5,9])" + } + ] + }, + "effects": [ + "子女运佳", + "子女智慧" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-57-65: Children-giving combinations", + "bvr_chapter": "Chapter 10" + }, + { + "id": "putra_yoga_5_in_kendra", + "name": "Putra Yoga (5th Lord in Kendra)", + "name_cn": "子女格局(5宫主在角宫)", + "category": "putra", + "source": "BPHS", + "bvr_id": "Putra-3", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(5) in planets and is_kendra(house_of(lords_of(5)))" + } + ] + }, + "effects": [ + "子女有成就", + "子女带来名声" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-57-65: Children-giving combinations", + "bvr_chapter": "Chapter 10" + }, + { + "id": "putra_yoga_combined", + "name": "Putra Yoga (Combined)", + "name_cn": "子女格局(组合)", + "category": "putra", + "source": "BPHS", + "bvr_id": "Putra-4", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "'Jupiter' in planets and house_of('Jupiter') in [1,5,9] and lords_of(5) in planets and is_kendra(house_of(lords_of(5)))" + } + ] + }, + "effects": [ + "极佳子女运", + "子女成就卓越" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-57-65: Children-giving combinations", + "bvr_chapter": "Chapter 10" + }, + { + "id": "putra_dosha_5_6_12", + "name": "Putra Dosha (5th Lord in 6/8/12)", + "name_cn": "子女障碍(5宫主在凶宫)", + "category": "putra", + "source": "BPHS", + "bvr_id": "Putra-D1", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(5) in planets and is_dusthana(house_of(lords_of(5)))" + } + ] + }, + "effects": [ + "子女运受阻", + "需要注意子女健康" + ], + "strength": "弱", + "enabled": true, + "source_reference": "BVR-57-65: Children-giving combinations", + "bvr_chapter": "Chapter 10" + }, + { + "id": "kalatra_yoga_7_strong", + "name": "Kalatra Yoga (7th Lord Strong)", + "name_cn": "婚姻格局(7宫主有力)", + "category": "kalatra", + "source": "BPHS", + "bvr_id": "Kalatra-1", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(7) in planets and (is_exalted(lords_of(7)) or is_own_sign(lords_of(7)) or is_kendra(house_of(lords_of(7))))" + } + ] + }, + "effects": [ + "婚姻美满", + "配偶有成就" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-66-74: Marriage-related combinations", + "bvr_chapter": "Chapter 11" + }, + { + "id": "kalatra_yoga_7_1", + "name": "Kalatra Yoga (7th & 1st Lords)", + "name_cn": "婚姻格局(7宫主+1宫主)", + "category": "kalatra", + "source": "BPHS", + "bvr_id": "Kalatra-2", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(7) in planets and lords_of(1) in planets and house_of(lords_of(7)) == house_of(lords_of(1))" + } + ] + }, + "effects": [ + "婚姻和谐", + "配偶互相支持" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-66-74: Marriage-related combinations", + "bvr_chapter": "Chapter 11" + }, + { + "id": "kalatra_yoga_venus_strong", + "name": "Kalatra Yoga (Strong Venus)", + "name_cn": "婚姻格局(金星有力)", + "category": "kalatra", + "source": "BPHS", + "bvr_id": "Kalatra-3", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "'Venus' in planets and (is_exalted('Venus') or is_own_sign('Venus') or house_of('Venus') in [1,4,5,7,9,10])" + } + ] + }, + "effects": [ + "婚姻幸福", + "配偶有魅力" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-66-74: Marriage-related combinations", + "bvr_chapter": "Chapter 11" + }, + { + "id": "kalatra_dosha_7_6_8_12", + "name": "Kalatra Dosha (7th Lord in 6/8/12)", + "name_cn": "婚姻障碍(7宫主在凶宫)", + "category": "kalatra", + "source": "BPHS", + "bvr_id": "Kalatra-D1", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(7) in planets and is_dusthana(house_of(lords_of(7)))" + } + ] + }, + "effects": [ + "婚姻挑战", + "配偶健康问题" + ], + "strength": "弱", + "enabled": true, + "source_reference": "BVR-66-74: Marriage-related combinations", + "bvr_chapter": "Chapter 11" + }, + { + "id": "kalatra_dosha_mars_7", + "name": "Mangal Dosha (Mars in 1/4/7/8/12)", + "name_cn": "火星障碍(火星在关键宫)", + "category": "kalatra", + "source": "经典文献", + "bvr_id": "Kalatra-D2", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "'Mars' in planets and house_of('Mars') in [1,4,7,8,12]" + } + ] + }, + "effects": [ + "婚姻延迟", + "需要匹配化解" + ], + "strength": "弱", + "enabled": true + }, + { + "id": "ayur_yoga_strong", + "name": "Ayur Yoga (Strong Longevity)", + "name_cn": "长寿格局", + "category": "ayur", + "source": "BPHS", + "bvr_id": "Ayur-1", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(8) in planets and (is_exalted(lords_of(8)) or is_own_sign(lords_of(8)) or house_of(lords_of(8)) in [1,4,7,10])" + } + ] + }, + "effects": [ + "长寿", + "健康良好" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-75-83: Longevity combinations", + "bvr_chapter": "Chapter 12" + }, + { + "id": "ayur_yoga_saturn_8", + "name": "Ayur Yoga (Saturn in 8th)", + "name_cn": "长寿格局(土星在8宫)", + "category": "ayur", + "source": "BPHS", + "bvr_id": "Ayur-2", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "'Saturn' in planets and house_of('Saturn') == 8" + } + ] + }, + "effects": [ + "长寿", + "纪律性强" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-75-83: Longevity combinations", + "bvr_chapter": "Chapter 12" + }, + { + "id": "ayur_yoga_sun_8", + "name": "Ayur Yoga (Sun in 8th)", + "name_cn": "长寿格局(太阳在8宫)", + "category": "ayur", + "source": "BPHS", + "bvr_id": "Ayur-3", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "'Sun' in planets and house_of('Sun') == 8" + } + ] + }, + "effects": [ + "长寿", + "生命力强" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-75-83: Longevity combinations", + "bvr_chapter": "Chapter 12" + }, + { + "id": "ayur_dosha_8_6_12", + "name": "Ayur Dosha (8th Lord in 6/12)", + "name_cn": "寿命障碍(8宫主在凶宫)", + "category": "ayur", + "source": "BPHS", + "bvr_id": "Ayur-D1", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(8) in planets and house_of(lords_of(8)) in [6,12]" + } + ] + }, + "effects": [ + "健康需注意", + "可能有慢性病" + ], + "strength": "弱", + "enabled": true, + "source_reference": "BVR-75-83: Longevity combinations", + "bvr_chapter": "Chapter 12" + }, + { + "id": "surya_yoga_9", + "name": "Surya Yoga (9th Lord)", + "name_cn": "太阳格局(9宫主)", + "category": "surya", + "source": "BPHS", + "bvr_id": "Surya-4", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "'Sun' in planets and lords_of(9) in planets and house_of('Sun') == house_of(lords_of(9))" + } + ] + }, + "effects": [ + "命运与自我结合", + "精神领导力" + ], + "strength": "强", + "enabled": true + }, + { + "id": "surya_yoga_10", + "name": "Surya Yoga (10th Lord)", + "name_cn": "太阳格局(10宫主)", + "category": "surya", + "source": "BPHS", + "bvr_id": "Surya-5", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "'Sun' in planets and lords_of(10) in planets and house_of('Sun') == house_of(lords_of(10))" + } + ] + }, + "effects": [ + "事业成功", + "领导地位" + ], + "strength": "强", + "enabled": true + }, + { + "id": "sarpa_nabhasa", + "name": "Sarpa Nabhasa Yoga", + "name_cn": "蛇天空格局", + "category": "nabhasa", + "source": "BPHS Chapter 4", + "bvr_id": "Nabhasa-19", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "len([p for p in planets if p in planets_list() and is_dusthana(house_of(p))]) >= 5" + } + ] + }, + "effects": [ + "挑战多", + "需要韧性" + ], + "strength": "中", + "enabled": true + }, + { + "id": "kita_nabhasa", + "name": "Kita Nabhasa Yoga", + "name_cn": "虫天空格局", + "category": "nabhasa", + "source": "BPHS Chapter 4", + "bvr_id": "Nabhasa-20", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "len([p for p in planets if p in planets_list() and house_of(p) in [3,6,10,11]]) >= 5" + } + ] + }, + "effects": [ + "努力成功", + "成长型人生" + ], + "strength": "中", + "enabled": true + }, + { + "id": "bhagya_yoga", + "name": "Bhagya Yoga", + "name_cn": "福运格局", + "category": "auspicious", + "source": "BPHS", + "bvr_id": "Bhagya-1", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(9) in planets and is_exalted(lords_of(9))" + } + ] + }, + "effects": [ + "命运眷顾", + "好运连连" + ], + "strength": "强", + "enabled": true + }, + { + "id": "shubha_kartari_moon", + "name": "Subha Kartari (Moon)", + "name_cn": "月吉夹格局", + "category": "auspicious", + "source": "Brihat Jataka", + "bvr_id": "Subha-2", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "'Moon' in planets and any(house_of(p) == (house_of('Moon')-1) % 12 + 1 for p in BENEFICS if p in planets) and any(house_of(p) == (house_of('Moon')+1-1) % 12 + 1 for p in BENEFICS if p in planets)" + } + ] + }, + "effects": [ + "月亮受保护", + "情感稳定" + ], + "strength": "强", + "enabled": true + }, + { + "id": "shubha_kartari_asc", + "name": "Subha Kartari (Asc)", + "name_cn": "升吉夹格局", + "category": "auspicious", + "source": "Brihat Jataka", + "bvr_id": "Subha-3", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "any(house_of(p) == 12 for p in BENEFICS if p in planets) and any(house_of(p) == 2 for p in BENEFICS if p in planets)" + } + ] + }, + "effects": [ + "命宫受保护", + "人生顺利" + ], + "strength": "强", + "enabled": true + }, + { + "id": "deepha_yoga", + "name": "Deepha Yoga", + "name_cn": "深格局", + "category": "auspicious", + "source": "BPHS", + "bvr_id": "Deepha-1", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(1) in planets and is_own_sign(lords_of(1)) and is_kendra(house_of(lords_of(1)))" + } + ] + }, + "effects": [ + "自我实现", + "人生深刻" + ], + "strength": "强", + "enabled": true + }, + { + "id": "raja_yoga_1_10", + "name": "Raja Yoga (1st & 10th Lords)", + "name_cn": "王者格局(1宫主+10宫主)", + "category": "raja", + "source": "BPHS", + "bvr_id": "Raja-13", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(1) in planets and lords_of(10) in planets and house_of(lords_of(1)) == house_of(lords_of(10))" + } + ] + }, + "effects": [ + "事业与自我结合", + "领导力" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "raja_yoga_7_9", + "name": "Raja Yoga (7th & 9th Lords)", + "name_cn": "王者格局(7宫主+9宫主)", + "category": "raja", + "source": "BPHS", + "bvr_id": "Raja-14", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(7) in planets and lords_of(9) in planets and house_of(lords_of(7)) == house_of(lords_of(9))" + } + ] + }, + "effects": [ + "婚姻与命运结合", + "配偶带来好运" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "raja_yoga_2_7", + "name": "Raja Yoga (2nd & 7th Lords)", + "name_cn": "王者格局(2宫主+7宫主)", + "category": "raja", + "source": "BPHS", + "bvr_id": "Raja-15", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(2) in planets and lords_of(7) in planets and house_of(lords_of(2)) == house_of(lords_of(7))" + } + ] + }, + "effects": [ + "财富与婚姻结合", + "配偶带来财富" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "raja_yoga_lord_9_in_kendra", + "name": "Raja Yoga (9th Lord in Kendra)", + "name_cn": "王者格局(9宫主在角宫)", + "category": "raja", + "source": "BPHS", + "bvr_id": "Raja-16", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(9) in planets and is_kendra(house_of(lords_of(9)))" + } + ] + }, + "effects": [ + "命运力量在角宫", + "社会地位高" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "bheri_yoga_variant", + "name": "Bheri Yoga (Jupiter)", + "name_cn": "大鼓格局(木星版)", + "category": "special", + "source": "BPHS", + "bvr_id": "Bheri-2", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "'Jupiter' in planets and is_kendra(house_of('Jupiter')) and lords_of(9) in planets and house_of(lords_of(9)) in [1,4,7,10]" + } + ] + }, + "effects": [ + "名声显赫", + "精神成就" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-11: Multiple strong houses", + "bvr_chapter": "Chapter 2" + }, + { + "id": "mridanga_yoga_variant", + "name": "Mridanga Yoga (Full)", + "name_cn": "全鼓格局", + "category": "special", + "source": "BPHS", + "bvr_id": "Mridanga-2", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(1) in planets and (is_exalted(lords_of(1)) or is_own_sign(lords_of(1))) and sum(1 for p in planets if p in planets_list() and (is_exalted(p) or is_own_sign(p))) >= 3" + } + ] + }, + "effects": [ + "全面发展", + "极高成就" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-10: Planets in exaltation/own in Kendras", + "bvr_chapter": "Chapter 2" + }, + { + "id": "pancha_maha_yoga", + "name": "Pancha Maha Yoga", + "name_cn": "五巨星格局", + "category": "special", + "source": "经典文献", + "bvr_id": "Pancha-1", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "sum(1 for p in ['Mars','Mercury','Jupiter','Venus','Saturn'] if p in planets and is_kendra(house_of(p)) and (is_exalted(p) or is_own_sign(p) or is_moolatrikona(p))) >= 3" + } + ] + }, + "effects": [ + "五大行星有力", + "全面成功" + ], + "strength": "强", + "enabled": true + }, + { + "id": "chandala_yoga_rahu", + "name": "Chandala Yoga (Rahu)", + "name_cn": "旃陀罗格局(罗睺)", + "category": "durbhaga", + "source": "经典文献", + "bvr_id": "Chandala-1", + "logic": { + "type": "same_house", + "planets": [ + "Sun", + "Rahu" + ] + }, + "effects": [ + "可能需要克服歧视", + "精神挑战" + ], + "strength": "弱", + "enabled": true + }, + { + "id": "chandala_yoga_ketu", + "name": "Chandala Yoga (Ketu)", + "name_cn": "旃陀罗格局(计都)", + "category": "durbhaga", + "source": "经典文献", + "bvr_id": "Chandala-2", + "logic": { + "type": "same_house", + "planets": [ + "Sun", + "Ketu" + ] + }, + "effects": [ + "精神探索", + "也可能有隔离感" + ], + "strength": "中", + "enabled": true + }, + { + "id": "viparita_6_8", + "name": "Viparita Raja Yoga (6th & 8th)", + "name_cn": "逆行王者格局(6宫主+8宫主)", + "category": "raja", + "source": "Phaladeepika", + "bvr_id": "Vipreet-4", + "logic": { + "type": "and", + "conditions": [ + { + "type": "custom", + "expr": "lords_of(6) in planets and lords_of(8) in planets and is_dusthana(house_of(lords_of(6))) and is_dusthana(house_of(lords_of(8)))" + } + ] + }, + "effects": [ + "因祸得福", + "克服挑战" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "neechabhanga_lord_exalted", + "name": "Neechabhanga Raja Yoga (Lord Exalted)", + "name_cn": "坏座位消王瑜伽(主星入旺)", + "source": "BPHS", + "bvr_id": "NB-3", + "category": "raja", + "enabled": true, + "dedup_key": "neechabhanga_raja", + "strength": "强", + "effects": [ + "逆境反转", + "劫后余生般的成功" + ], + "logic": { + "type": "custom", + "expr": "any(exalted(lord_of_house(h)) or own(lord_of_house(h)) for h in range(1,13) if lord_of_house(h) and lord_of_house(h) in ctx.planets and any(ctx.is_debilitated(p) for p in ctx.planets if p==lord_of_house(h)) and (ctx.house_of(lord_of_house(h)) in [1,4,7,10] or any(ctx.is_exalted(p) for p in ctx.planets if ctx.house_of(p) and any(ctx.house_of(q)==(ctx.house_of(p)-1)%12+1 for q in ctx.planets if q!=p))))", + "combo_template": "Neechabhanga Raja Yoga(主星旺/庙)" + }, + "source_reference": "BVR-24-26: Debilitated planet with canceling condition", + "bvr_chapter": "Chapter 4" + }, + { + "id": "neechabhanga_parivartana", + "name": "Neechabhanga Raja Yoga (Parivartana)", + "name_cn": "坏座位消王瑜伽(互换)", + "source": "BPHS", + "bvr_id": "NB-4", + "category": "raja", + "enabled": true, + "dedup_key": "neechabhanga_raja", + "strength": "强", + "effects": [ + "通过互换获得尊严", + "命运转折" + ], + "logic": { + "type": "any_pair", + "from": "all", + "to": "all", + "exclude_self": true, + "condition": { + "type": "parivartana", + "lord_a": { + "type": "resolve_single", + "ref": "$a" + }, + "lord_b": { + "type": "resolve_single", + "ref": "$b" + } + } + }, + "source_reference": "BVR-24-26: Debilitated planet with canceling condition", + "bvr_chapter": "Chapter 4" + }, + { + "id": "viparita_6_12", + "name": "Viparita Raja Yoga (6th & 12th)", + "name_cn": "反常王瑜伽(6宫与12宫)", + "source": "BPHS", + "bvr_id": "VR-4", + "category": "raja", + "enabled": true, + "dedup_key": "viparita_raja", + "strength": "中", + "effects": [ + "意外成功", + "化险为夷" + ], + "logic": { + "type": "and", + "conditions": [ + { + "type": "lords_relation", + "lord_a": { + "role": "lord", + "house": 6 + }, + "lord_b": { + "role": "lord", + "house": 12 + }, + "relation": "same_house" + }, + { + "type": "in_houses", + "planet": { + "role": "lord", + "house": 6 + }, + "houses": [ + 6, + 8, + 12 + ] + } + ] + }, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "viparita_8_12", + "name": "Viparita Raja Yoga (8th & 12th)", + "name_cn": "反常王瑜伽(8宫与12宫)", + "source": "BPHS", + "bvr_id": "VR-5", + "category": "raja", + "enabled": true, + "dedup_key": "viparita_raja", + "strength": "中", + "effects": [ + "绝处逢生", + "神秘好运" + ], + "logic": { + "type": "and", + "conditions": [ + { + "type": "lords_relation", + "lord_a": { + "role": "lord", + "house": 8 + }, + "lord_b": { + "role": "lord", + "house": 12 + }, + "relation": "same_house" + }, + { + "type": "in_houses", + "planet": { + "role": "lord", + "house": 8 + }, + "houses": [ + 6, + 8, + 12 + ] + } + ] + }, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "gajakesari_trikona", + "name": "Gajakesari Yoga (Trikona from Moon)", + "name_cn": "象王瑜伽(三方宫距月亮)", + "source": "BPHS", + "bvr_id": "GK-4", + "category": "chandra", + "enabled": false, + "accuracy_note": "Disabled: BPHS does not define a Trikona variant for Gajakesari Yoga. Only Kendra-from-Moon is valid per BVR.", + "dedup_key": "gajakesari", + "strength": "中", + "effects": [ + "智慧", + "名声" + ], + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Jupiter", + "houses": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12 + ] + }, + { + "type": "custom", + "expr": "ctx.is_trikona_from('Jupiter','Moon')", + "combo_template": "木星与月亮成三方宫关系" + } + ] + } + }, + { + "id": "dhana_yoga_2_11_lord", + "name": "Dhana Yoga (2nd & 11th Lords Combination)", + "name_cn": "财富瑜伽(2宫主与11宫主合)", + "source": "BPHS", + "bvr_id": "DH-11", + "category": "dhana", + "enabled": true, + "dedup_key": "dhana_yoga", + "strength": "强", + "effects": [ + "持续财富积累", + "投资回报" + ], + "logic": { + "type": "lords_relation", + "lord_a": { + "role": "lord", + "house": 2 + }, + "lord_b": { + "role": "lord", + "house": 11 + }, + "relation": "same_house" + }, + "source_reference": "BVR-38-46: Wealth-giving combinations", + "bvr_chapter": "Chapter 7" + }, + { + "id": "dhana_yoga_5_9_lord", + "name": "Dhana Yoga (5th & 9th Lords in Wealth House)", + "name_cn": "财富瑜伽(5/9宫主入财富宫)", + "source": "BPHS", + "bvr_id": "DH-12", + "category": "dhana", + "enabled": true, + "dedup_key": "dhana_yoga", + "strength": "强", + "effects": [ + "通过才华/运气致富", + "祖先财富" + ], + "logic": { + "type": "or", + "conditions": [ + { + "type": "lord_in_house", + "house": 5, + "target_houses": [ + 2, + 11 + ] + }, + { + "type": "lord_in_house", + "house": 9, + "target_houses": [ + 2, + 11 + ] + } + ] + }, + "source_reference": "BVR-38-46: Wealth-giving combinations", + "bvr_chapter": "Chapter 7" + }, + { + "id": "dhana_yoga_11_lord_exalted", + "name": "Dhana Yoga (11th Lord Exalted)", + "name_cn": "财富瑜伽(11宫主入旺)", + "source": "BPHS", + "bvr_id": "DH-13", + "category": "dhana", + "enabled": true, + "dedup_key": "dhana_yoga", + "strength": "强", + "effects": [ + "巨量财富", + "社交网络强大" + ], + "logic": { + "type": "dignity", + "planet": { + "role": "lord", + "house": 11 + }, + "dignity": "exalted" + }, + "source_reference": "BVR-38-46: Wealth-giving combinations", + "bvr_chapter": "Chapter 7" + }, + { + "id": "dhana_yoga_2_lord_strong", + "name": "Dhana Yoga (2nd Lord Strong)", + "name_cn": "财富瑜伽(2宫主强)", + "source": "BPHS", + "bvr_id": "DH-14", + "category": "dhana", + "enabled": true, + "dedup_key": "dhana_yoga", + "strength": "中", + "effects": [ + "稳定收入", + "理财能力" + ], + "logic": { + "type": "dignity", + "planet": { + "role": "lord", + "house": 2 + }, + "dignity": "strong" + }, + "source_reference": "BVR-38-46: Wealth-giving combinations", + "bvr_chapter": "Chapter 7" + }, + { + "id": "surya_yoga_1", + "name": "Surya Yoga (Sun in 1st House)", + "name_cn": "太阳瑜伽(太阳入1宫)", + "source": "BPHS", + "bvr_id": "SY-1", + "category": "surya", + "enabled": true, + "dedup_key": "surya_yoga", + "strength": "中", + "effects": [ + "领导力", + "自我表达" + ], + "logic": { + "type": "in_houses", + "planet": "Sun", + "houses": [ + 1 + ] + } + }, + { + "id": "surya_yoga_kendra", + "name": "Surya Yoga (Sun in Kendra)", + "name_cn": "太阳瑜伽(太阳入角宫)", + "source": "BPHS", + "bvr_id": "SY-2", + "category": "surya", + "enabled": true, + "dedup_key": "surya_yoga", + "strength": "中", + "effects": [ + "权威地位", + "政府关联" + ], + "logic": { + "type": "in_houses", + "planet": "Sun", + "houses": [ + 1, + 4, + 7, + 10 + ] + } + }, + { + "id": "surya_yoga_7", + "name": "Surya Yoga (Sun in 7th House)", + "name_cn": "太阳瑜伽(太阳入7宫)", + "source": "BPHS", + "bvr_id": "SY-3", + "category": "surya", + "enabled": true, + "dedup_key": "surya_yoga", + "strength": "中", + "effects": [ + "婚姻显赫", + "配偶强势" + ], + "logic": { + "type": "in_houses", + "planet": "Sun", + "houses": [ + 7 + ] + } + }, + { + "id": "chandra_yoga_1", + "name": "Chandra Yoga (Moon in 1st House)", + "name_cn": "月亮瑜伽(月亮入1宫)", + "source": "BPHS", + "bvr_id": "CY-1", + "category": "chandra", + "enabled": true, + "dedup_key": "chandra_yoga", + "strength": "中", + "effects": [ + "情感丰富", + "母性/关怀气质" + ], + "logic": { + "type": "in_houses", + "planet": "Moon", + "houses": [ + 1 + ] + } + }, + { + "id": "chandra_yoga_trikona", + "name": "Chandra Yoga (Moon in Trikona)", + "name_cn": "月亮瑜伽(月亮入三方宫)", + "source": "BPHS", + "bvr_id": "CY-2", + "category": "chandra", + "enabled": true, + "dedup_key": "chandra_yoga", + "strength": "强", + "effects": [ + "智慧", + "名声", + "心理稳定" + ], + "logic": { + "type": "in_houses", + "planet": "Moon", + "houses": [ + 1, + 5, + 9 + ] + } + }, + { + "id": "chandra_yoga_exalted", + "name": "Chandra Yoga (Moon Exalted)", + "name_cn": "月亮瑜伽(月亮入旺)", + "source": "BPHS", + "bvr_id": "CY-3", + "category": "chandra", + "enabled": true, + "dedup_key": "chandra_yoga", + "strength": "强", + "effects": [ + "极强情感力量", + "大众魅力" + ], + "logic": { + "type": "dignity", + "planet": "Moon", + "dignity": "exalted" + } + }, + { + "id": "putra_yoga_5_exalted", + "name": "Putra Yoga (5th Lord Exalted)", + "name_cn": "子女瑜伽(5宫主入旺)", + "source": "BPHS", + "bvr_id": "PT-6", + "category": "putra", + "enabled": true, + "dedup_key": "putra_yoga", + "strength": "强", + "effects": [ + "杰出子女", + "子女成就高" + ], + "logic": { + "type": "dignity", + "planet": { + "role": "lord", + "house": 5 + }, + "dignity": "exalted" + }, + "source_reference": "BVR-57-65: Children-giving combinations", + "bvr_chapter": "Chapter 10" + }, + { + "id": "putra_yoga_jupiter_5", + "name": "Putra Yoga (Jupiter in 5th House)", + "name_cn": "子女瑜伽(木星入5宫)", + "source": "BPHS", + "bvr_id": "PT-7", + "category": "putra", + "enabled": true, + "dedup_key": "putra_yoga", + "strength": "强", + "effects": [ + "子女智慧", + "子女有宗教/哲学倾向" + ], + "logic": { + "type": "same_house", + "a": "Jupiter", + "b": { + "role": "lord", + "house": 5 + } + }, + "source_reference": "BVR-57-65: Children-giving combinations", + "bvr_chapter": "Chapter 10" + }, + { + "id": "putra_yoga_9_kendra", + "name": "Putra Yoga (9th Lord in Kendra)", + "name_cn": "子女瑜伽(9宫主入角宫)", + "source": "BPHS", + "bvr_id": "PT-8", + "category": "putra", + "enabled": true, + "dedup_key": "putra_yoga", + "strength": "中", + "effects": [ + "子女受其庇护", + "祖先福报影响子女" + ], + "logic": { + "type": "lord_in_house", + "house": 9, + "target_houses": [ + 1, + 4, + 7, + 10 + ] + }, + "source_reference": "BVR-57-65: Children-giving combinations", + "bvr_chapter": "Chapter 10" + }, + { + "id": "kalatra_yoga_7_exalted", + "name": "Kalatra Yoga (7th Lord Exalted)", + "name_cn": "婚姻瑜伽(7宫主入旺)", + "source": "BPHS", + "bvr_id": "KT-6", + "category": "kalatra", + "enabled": true, + "dedup_key": "kalatra_yoga", + "strength": "强", + "effects": [ + "优质婚姻", + "配偶杰出" + ], + "logic": { + "type": "dignity", + "planet": { + "role": "lord", + "house": 7 + }, + "dignity": "exalted" + }, + "source_reference": "BVR-66-74: Marriage-related combinations", + "bvr_chapter": "Chapter 11" + }, + { + "id": "kalatra_yoga_7_kendra", + "name": "Kalatra Yoga (7th Lord in Kendra)", + "name_cn": "婚姻瑜伽(7宫主入角宫)", + "source": "BPHS", + "bvr_id": "KT-7", + "category": "kalatra", + "enabled": true, + "dedup_key": "kalatra_yoga", + "strength": "中", + "effects": [ + "婚姻稳定", + "配偶有社会地位" + ], + "logic": { + "type": "lord_in_house", + "house": 7, + "target_houses": [ + 1, + 4, + 7, + 10 + ] + }, + "source_reference": "BVR-66-74: Marriage-related combinations", + "bvr_chapter": "Chapter 11" + }, + { + "id": "kalatra_yoga_venus_kendra", + "name": "Kalatra Yoga (Venus in Kendra)", + "name_cn": "婚姻瑜伽(金星入角宫)", + "source": "BPHS", + "bvr_id": "KT-8", + "category": "kalatra", + "enabled": true, + "dedup_key": "kalatra_yoga", + "strength": "强", + "effects": [ + "婚姻幸福", + "配偶有魅力" + ], + "logic": { + "type": "in_houses", + "planet": "Venus", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + "source_reference": "BVR-66-74: Marriage-related combinations", + "bvr_chapter": "Chapter 11" + }, + { + "id": "kalatra_dosha_mars_1_4_7_8_12", + "name": "Mangal Dosha (Mars in 1/4/7/8/12)", + "name_cn": "火星婚姻煞(火星入1/4/7/8/12宫)", + "source": "BPHS", + "bvr_id": "KT-D1", + "category": "kalatra", + "enabled": true, + "dedup_key": "mangal_dosha", + "strength": "弱", + "effects": [ + "婚姻延迟", + "配偶关系紧张" + ], + "logic": { + "type": "in_houses", + "planet": "Mars", + "houses": [ + 1, + 4, + 7, + 8, + 12 + ] + } + }, + { + "id": "ayur_yoga_saturn_strong", + "name": "Ayur Yoga (Saturn Strong in 8th)", + "name_cn": "寿命瑜伽(土星在8宫强)", + "source": "BPHS", + "bvr_id": "AY-5", + "category": "ayur", + "enabled": true, + "dedup_key": "ayur_yoga", + "strength": "强", + "effects": [ + "长寿", + "慢病恢复力强" + ], + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Saturn", + "houses": [ + 8 + ] + }, + { + "type": "dignity", + "planet": "Saturn", + "dignity": "strong" + } + ] + }, + "source_reference": "BVR-75-83: Longevity combinations", + "bvr_chapter": "Chapter 12" + }, + { + "id": "ayur_yoga_jupiter_8", + "name": "Ayur Yoga (Jupiter in 8th)", + "name_cn": "寿命瑜伽(木星入8宫)", + "source": "BPHS", + "bvr_id": "AY-6", + "category": "ayur", + "enabled": true, + "dedup_key": "ayur_yoga", + "strength": "强", + "effects": [ + "延寿", + "智慧长寿" + ], + "logic": { + "type": "in_houses", + "planet": "Jupiter", + "houses": [ + 8 + ] + }, + "source_reference": "BVR-75-83: Longevity combinations", + "bvr_chapter": "Chapter 12" + }, + { + "id": "ayur_yoga_8_lord_kendra", + "name": "Ayur Yoga (8th Lord in Kendra)", + "name_cn": "寿命瑜伽(8宫主入角宫)", + "source": "BPHS", + "bvr_id": "AY-7", + "category": "ayur", + "enabled": true, + "dedup_key": "ayur_yoga", + "strength": "中", + "effects": [ + "寿命稳定", + "疾病抵抗力" + ], + "logic": { + "type": "lord_in_house", + "house": 8, + "target_houses": [ + 1, + 4, + 7, + 10 + ] + }, + "source_reference": "BVR-75-83: Longevity combinations", + "bvr_chapter": "Chapter 12" + }, + { + "id": "vidya_yoga_jupiter_mercury", + "name": "Vidya Yoga (Jupiter-Mercury Combination)", + "name_cn": "智慧瑜伽(木水合相)", + "source": "BPHS", + "bvr_id": "VD-1", + "category": "vidya", + "enabled": true, + "strength": "强", + "effects": [ + "卓越学习能力", + "学术成就", + "语言表达力强" + ], + "logic": { + "type": "same_house", + "a": "Jupiter", + "b": "Mercury" + } + }, + { + "id": "vidya_yoga_5_strong", + "name": "Vidya Yoga (5th Lord Strong)", + "name_cn": "智慧瑜伽(5宫主强)", + "source": "BPHS", + "bvr_id": "VD-2", + "category": "vidya", + "enabled": true, + "strength": "强", + "effects": [ + "天赋才华", + "创造力" + ], + "logic": { + "type": "dignity", + "planet": { + "role": "lord", + "house": 5 + }, + "dignity": "strong" + } + }, + { + "id": "vidya_yoga_mercury_exalted", + "name": "Vidya Yoga (Mercury Exalted)", + "name_cn": "智慧瑜伽(水星入旺)", + "source": "BPHS", + "bvr_id": "VD-3", + "category": "vidya", + "enabled": true, + "strength": "强", + "effects": [ + "天才级智力", + "超强记忆力" + ], + "logic": { + "type": "dignity", + "planet": "Mercury", + "dignity": "exalted" + } + }, + { + "id": "vidya_yoga_4_9_lord", + "name": "Vidya Yoga (4th & 9th Lords Combination)", + "name_cn": "智慧瑜伽(4/9宫主合相)", + "source": "BPHS", + "bvr_id": "VD-4", + "category": "vidya", + "enabled": true, + "strength": "中", + "effects": [ + "高等教育", + "哲学洞察" + ], + "logic": { + "type": "lords_relation", + "lord_a": { + "role": "lord", + "house": 4 + }, + "lord_b": { + "role": "lord", + "house": 9 + }, + "relation": "same_house" + } + }, + { + "id": "shakti_yoga_9_10_lord", + "name": "Shakti Yoga (9th & 10th Lords Combination)", + "name_cn": "权力瑜伽(9/10宫主合相)", + "source": "BPHS", + "bvr_id": "SK-1", + "category": "shakti", + "enabled": true, + "strength": "强", + "effects": [ + "政治权力", + "社会地位", + "命运之主与事业之主合一" + ], + "logic": { + "type": "lords_relation", + "lord_a": { + "role": "lord", + "house": 9 + }, + "lord_b": { + "role": "lord", + "house": 10 + }, + "relation": "same_house" + } + }, + { + "id": "shakti_yoga_10_exalted", + "name": "Shakti Yoga (10th Lord Exalted)", + "name_cn": "权力瑜伽(10宫主入旺)", + "source": "BPHS", + "bvr_id": "SK-2", + "category": "shakti", + "enabled": true, + "strength": "强", + "effects": [ + "事业巅峰", + "权威地位" + ], + "logic": { + "type": "dignity", + "planet": { + "role": "lord", + "house": 10 + }, + "dignity": "exalted" + } + }, + { + "id": "shakti_yoga_sun_10", + "name": "Shakti Yoga (Sun in 10th House)", + "name_cn": "权力瑜伽(太阳入10宫)", + "source": "BPHS", + "bvr_id": "SK-3", + "category": "shakti", + "enabled": true, + "strength": "强", + "effects": [ + "政府高层职位", + "王者气质" + ], + "logic": { + "type": "same_house", + "a": "Sun", + "b": { + "role": "lord", + "house": 10 + } + } + }, + { + "id": "karma_yoga_10_11_lord", + "name": "Karma Yoga (10th & 11th Lords Combination)", + "name_cn": "事业瑜伽(10/11宫主合相)", + "source": "BPHS", + "bvr_id": "KM-1", + "category": "karma", + "enabled": true, + "strength": "强", + "effects": [ + "事业成功", + "人脉资源强", + "收入与社会地位同步提升" + ], + "logic": { + "type": "lords_relation", + "lord_a": { + "role": "lord", + "house": 10 + }, + "lord_b": { + "role": "lord", + "house": 11 + }, + "relation": "same_house" + } + }, + { + "id": "karma_yoga_saturn_10", + "name": "Karma Yoga (Saturn in 10th House)", + "name_cn": "事业瑜伽(土星入10宫)", + "source": "BPHS", + "bvr_id": "KM-2", + "category": "karma", + "enabled": true, + "strength": "中", + "effects": [ + "慢而稳的事业成功", + "专业化" + ], + "logic": { + "type": "same_house", + "a": "Saturn", + "b": { + "role": "lord", + "house": 10 + } + } + }, + { + "id": "karma_yoga_mars_10", + "name": "Karma Yoga (Mars in 10th House)", + "name_cn": "事业瑜伽(火星入10宫)", + "source": "BPHS", + "bvr_id": "KM-3", + "category": "karma", + "enabled": true, + "strength": "中", + "effects": [ + "军事/体育/工程领域成功", + "行动力强" + ], + "logic": { + "type": "same_house", + "a": "Mars", + "b": { + "role": "lord", + "house": 10 + } + } + }, + { + "id": "ari_yoga_lord_6_strong", + "name": "Ari Yoga (6th Lord Strong)", + "name_cn": "敌友瑜伽(6宫主强)", + "source": "BPHS", + "bvr_id": "AR-1", + "category": "ari", + "enabled": true, + "strength": "中", + "effects": [ + "战胜对手", + "竞争意识强" + ], + "logic": { + "type": "dignity", + "planet": { + "role": "lord", + "house": 6 + }, + "dignity": "strong" + } + }, + { + "id": "ari_yoga_lord_6_11", + "name": "Ari Yoga (6th Lord in 11th House)", + "name_cn": "敌友瑜伽(6宫主入11宫)", + "source": "BPHS", + "bvr_id": "AR-2", + "category": "ari", + "enabled": true, + "strength": "中", + "effects": [ + "敌人变朋友", + "竞争中获利" + ], + "logic": { + "type": "lord_in_house", + "house": 6, + "target_houses": [ + 11 + ] + } + }, + { + "id": "asha_yoga_11_strong", + "name": "Asha Yoga (11th Lord Strong)", + "name_cn": "愿望瑜伽(11宫主强)", + "source": "BPHS", + "bvr_id": "AH-1", + "category": "asha", + "enabled": true, + "strength": "中", + "effects": [ + "愿望实现", + "社交网络强大" + ], + "logic": { + "type": "dignity", + "planet": { + "role": "lord", + "house": 11 + }, + "dignity": "strong" + } + }, + { + "id": "asha_yoga_jupiter_11", + "name": "Asha Yoga (Jupiter in 11th House)", + "name_cn": "愿望瑜伽(木星入11宫)", + "source": "BPHS", + "bvr_id": "AH-2", + "category": "asha", + "enabled": true, + "strength": "强", + "effects": [ + "愿望通过智慧实现", + "子女/学生助力" + ], + "logic": { + "type": "in_houses", + "planet": "Jupiter", + "houses": [ + 11 + ] + } + }, + { + "id": "asha_yoga_11_lord_kendra", + "name": "Asha Yoga (11th Lord in Kendra)", + "name_cn": "愿望瑜伽(11宫主入角宫)", + "source": "BPHS", + "bvr_id": "AH-3", + "category": "asha", + "enabled": true, + "strength": "中", + "effects": [ + "愿望通过地位实现", + "社会影响力" + ], + "logic": { + "type": "lord_in_house", + "house": 11, + "target_houses": [ + 1, + 4, + 7, + 10 + ] + } + }, + { + "id": "moksha_yoga_12_strong", + "name": "Moksha Yoga (12th Lord Strong)", + "name_cn": "解脱瑜伽(12宫主强)", + "source": "BPHS", + "bvr_id": "MK-1", + "category": "moksha", + "enabled": true, + "strength": "中", + "effects": [ + "灵性解脱倾向", + "隐居/出世" + ], + "logic": { + "type": "dignity", + "planet": { + "role": "lord", + "house": 12 + }, + "dignity": "strong" + } + }, + { + "id": "moksha_yoga_ketu_12", + "name": "Moksha Yoga (Ketu in 12th House)", + "name_cn": "解脱瑜伽(计都入12宫)", + "source": "BPHS", + "bvr_id": "MK-2", + "category": "moksha", + "enabled": true, + "strength": "强", + "effects": [ + "灵性觉醒", + "前世解脱能量" + ], + "logic": { + "type": "in_houses", + "planet": "Ketu", + "houses": [ + 12 + ] + } + }, + { + "id": "moksha_yoga_4_8_12_lord", + "name": "Moksha Yoga (4th/8th/12th Lords Combination)", + "name_cn": "解脱瑜伽(4/8/12宫主合相)", + "source": "BPHS", + "bvr_id": "MK-3", + "category": "moksha", + "enabled": true, + "strength": "强", + "effects": [ + "终极解脱", + "灵性智慧" + ], + "logic": { + "type": "or", + "conditions": [ + { + "type": "lords_relation", + "lord_a": { + "role": "lord", + "house": 4 + }, + "lord_b": { + "role": "lord", + "house": 8 + }, + "relation": "same_house" + }, + { + "type": "lords_relation", + "lord_a": { + "role": "lord", + "house": 4 + }, + "lord_b": { + "role": "lord", + "house": 12 + }, + "relation": "same_house" + }, + { + "type": "lords_relation", + "lord_a": { + "role": "lord", + "house": 8 + }, + "lord_b": { + "role": "lord", + "house": 12 + }, + "relation": "same_house" + } + ] + } + }, + { + "id": "aryama_yoga_9_exalted", + "name": "Aryama Yoga (9th Lord Exalted)", + "name_cn": "贵人瑜伽(9宫主入旺)", + "source": "BPHS", + "bvr_id": "AM-1", + "category": "aryama", + "enabled": true, + "strength": "强", + "effects": [ + "强大贵人运", + "祖先庇佑" + ], + "logic": { + "type": "dignity", + "planet": { + "role": "lord", + "house": 9 + }, + "dignity": "exalted" + } + }, + { + "id": "aryama_yoga_jupiter_9", + "name": "Aryama Yoga (Jupiter in 9th House)", + "name_cn": "贵人瑜伽(木星入9宫)", + "source": "BPHS", + "bvr_id": "AM-2", + "category": "aryama", + "enabled": true, + "strength": "强", + "effects": [ + "宗教/灵性贵人", + "导师助力" + ], + "logic": { + "type": "in_houses", + "planet": "Jupiter", + "houses": [ + 9 + ] + } + }, + { + "id": "aryama_yoga_9_kendra", + "name": "Aryama Yoga (9th Lord in Kendra)", + "name_cn": "贵人瑜伽(9宫主入角宫)", + "source": "BPHS", + "bvr_id": "AM-3", + "category": "aryama", + "enabled": true, + "strength": "中", + "effects": [ + "贵人带来社会地位", + "命运助力明显" + ], + "logic": { + "type": "lord_in_house", + "house": 9, + "target_houses": [ + 1, + 4, + 7, + 10 + ] + } + }, + { + "id": "guru_yoga_jupiter_ascendant", + "name": "Guru Yoga (Jupiter with Ascendant Lord)", + "name_cn": "导师瑜伽(木星与命主合相)", + "source": "BPHS", + "bvr_id": "GR-1", + "category": "guru", + "enabled": true, + "strength": "强", + "effects": [ + "卓越导师", + "学生众多", + "智慧传播" + ], + "logic": { + "type": "same_house", + "a": "Jupiter", + "b": { + "role": "lord", + "house": 1 + } + } + }, + { + "id": "guru_yoga_jupiter_4", + "name": "Guru Yoga (Jupiter in 4th House)", + "name_cn": "导师瑜伽(木星入4宫)", + "source": "BPHS", + "bvr_id": "GR-2", + "category": "guru", + "enabled": true, + "strength": "强", + "effects": [ + "教育成就", + "母亲是导师", + "房产与教育相关" + ], + "logic": { + "type": "in_houses", + "planet": "Jupiter", + "houses": [ + 4 + ] + } + }, + { + "id": "guru_yoga_jupiter_9", + "name": "Guru Yoga (Jupiter in 9th House)", + "name_cn": "导师瑜伽(木星入9宫)", + "source": "BPHS", + "bvr_id": "GR-3", + "category": "guru", + "enabled": true, + "strength": "强", + "effects": [ + "灵性导师", + "宗教权威" + ], + "logic": { + "type": "in_houses", + "planet": "Jupiter", + "houses": [ + 9 + ] + } + }, + { + "id": "chakra_nabhasa", + "name": "Chakra Nabhasa Yoga", + "name_cn": "轮盘天象瑜伽", + "source": "BPHS", + "bvr_id": "NB-21", + "category": "nabhasa", + "enabled": true, + "strength": "强", + "effects": [ + "全方位成功", + "四通八达" + ], + "logic": { + "type": "custom", + "expr": "len(set(ctx.house_of(p) for p in ctx.planets if ctx.house_of(p) and ctx.house_of(p) in [1,4,7,10]))>=3", + "combo_template": "行星集中在角宫(Chakra 轮盘)" + } + }, + { + "id": "vihaga_nabhasa", + "name": "Vihaga Nabhasa Yoga", + "name_cn": "飞鸟天象瑜伽", + "source": "BPHS", + "bvr_id": "NB-22", + "category": "nabhasa", + "enabled": true, + "strength": "中", + "effects": [ + "快速成功", + "移动/旅行相关" + ], + "logic": { + "type": "custom", + "expr": "len(set(ctx.house_of(p) for p in ctx.planets if ctx.house_of(p) and ctx.house_of(p) in [1,5,9]))>=3", + "combo_template": "行星集中在三方宫(Vihaga 飞鸟)" + } + }, + { + "id": "hala_nabhasa", + "name": "Hala Nabhasa Yoga", + "name_cn": "犁天象瑜伽", + "source": "BPHS", + "bvr_id": "NB-23", + "category": "nabhasa", + "enabled": true, + "strength": "中", + "effects": [ + "农业/土地相关成功", + "稳定财富" + ], + "logic": { + "type": "custom", + "expr": "len(set(ctx.house_of(p) for p in ctx.planets if ctx.house_of(p) and ctx.house_of(p) in [2,6,10]))>=3", + "combo_template": "行星集中在特定宫位(Hala 犁)" + } + }, + { + "id": "vajra_nabhasa", + "name": "Vajra Nabhasa Yoga", + "name_cn": "金刚天象瑜伽", + "source": "BPHS", + "bvr_id": "NB-24", + "category": "nabhasa", + "enabled": true, + "strength": "强", + "effects": [ + "坚不可摧的成功", + "强大意志力" + ], + "logic": { + "type": "custom", + "expr": "len(set(ctx.house_of(p) for p in ctx.planets if ctx.house_of(p) and ctx.house_of(p) in [4,8,12]))>=3", + "combo_template": "行星集中在特定宫位(Vajra 金刚)" + } + }, + { + "id": "yupa_nabhasa", + "name": "Yupa Nabhasa Yoga", + "name_cn": "拴马柱天象瑜伽", + "source": "BPHS", + "bvr_id": "NB-25", + "category": "nabhasa", + "enabled": true, + "strength": "中", + "effects": [ + "稳定祭祀/灵性地位", + "受敬重" + ], + "logic": { + "type": "custom", + "expr": "len(set(ctx.house_of(p) for p in ctx.planets if ctx.house_of(p) and ctx.house_of(p) in [3,7,11]))>=3", + "combo_template": "行星集中在特定宫位(Yupa 拴马柱)" + } + }, + { + "id": "brahma_yoga", + "name": "Brahma Yoga", + "name_cn": "梵天瑜伽", + "source": "BPHS", + "bvr_id": "AU-21", + "category": "auspicious", + "enabled": true, + "strength": "强", + "effects": [ + "极高智慧", + "创造力", + "宗教权威" + ], + "logic": { + "type": "and", + "conditions": [ + { + "type": "dignity", + "planet": { + "role": "lord", + "house": 9 + }, + "dignity": "strong" + }, + { + "type": "lord_in_house", + "house": 9, + "target_houses": [ + 1, + 4, + 7, + 10 + ] + } + ] + } + }, + { + "id": "vishnu_yoga", + "name": "Vishnu Yoga", + "name_cn": "毗湿奴瑜伽", + "source": "BPHS", + "bvr_id": "AU-22", + "category": "auspicious", + "enabled": false, + "accuracy_note": "Disabled: current logic (10th lord strong in Kendra) does NOT match BPHS definition. BPHS requires 9th and 10th lords in 2nd house in D1 plus specific D9 conditions. Needs rewrite.", + "strength": "强", + "effects": [ + "全方位保护", + "繁荣", + "持久成功" + ], + "logic": { + "type": "and", + "conditions": [ + { + "type": "dignity", + "planet": { + "role": "lord", + "house": 10 + }, + "dignity": "strong" + }, + { + "type": "lord_in_house", + "house": 10, + "target_houses": [ + 1, + 4, + 7, + 10 + ] + } + ] + } + }, + { + "id": "siva_yoga", + "name": "Siva Yoga", + "name_cn": "湿婆瑜伽", + "source": "BPHS", + "bvr_id": "AU-23", + "category": "auspicious", + "enabled": true, + "strength": "强", + "effects": [ + "解脱智慧", + "超越生死", + "灵性洞察" + ], + "logic": { + "type": "and", + "conditions": [ + { + "type": "dignity", + "planet": { + "role": "lord", + "house": 12 + }, + "dignity": "strong" + }, + { + "type": "in_houses", + "planet": "Saturn", + "houses": [ + 12 + ] + } + ] + } + }, + { + "id": "chandra_mangala_yoga", + "name": "Chandra-Mangala Yoga (Moon-Mars Conjunction)", + "name_cn": "月火合相瑜伽", + "source": "BPHS", + "bvr_id": "CN-18", + "category": "conjunction", + "enabled": false, + "accuracy_note": "Disabled: duplicate of chandra_mangala_same (BVR-6). Same logic: same_house(Mars, Moon).", + "strength": "中", + "effects": [ + "情感驱动的行动力", + "房地产投资直觉" + ], + "logic": { + "type": "same_house", + "a": "Moon", + "b": "Mars" + } + }, + { + "id": "guru_chandra_yoga", + "name": "Guru-Chandra Yoga (Jupiter-Moon Conjunction)", + "name_cn": "木月合相瑜伽", + "source": "BPHS", + "bvr_id": "CN-19", + "category": "conjunction", + "enabled": true, + "strength": "强", + "effects": [ + "情感智慧", + "教育/育儿天赋" + ], + "logic": { + "type": "same_house", + "a": "Jupiter", + "b": "Moon" + } + }, + { + "id": "shukra_mangala_yoga", + "name": "Shukra-Mangala Yoga (Venus-Mars Conjunction)", + "name_cn": "金火合相瑜伽", + "source": "BPHS", + "bvr_id": "CN-20", + "category": "conjunction", + "enabled": true, + "strength": "中", + "effects": [ + "艺术创造力", + "浪漫魅力" + ], + "logic": { + "type": "same_house", + "a": "Venus", + "b": "Mars" + } + }, + { + "id": "budha_guru_yoga", + "name": "Budha-Guru Yoga (Mercury-Jupiter Conjunction)", + "name_cn": "水木合相瑜伽", + "source": "BPHS", + "bvr_id": "CN-21", + "category": "conjunction", + "enabled": true, + "strength": "强", + "effects": [ + "智慧沟通", + "教育/出版天赋" + ], + "logic": { + "type": "same_house", + "a": "Mercury", + "b": "Jupiter" + } + }, + { + "id": "rahu_guru_yoga_dosha", + "name": "Guru-Chandala Yoga (Jupiter-Rahu Conjunction)", + "name_cn": "木星-罗睺合相(Guru-Chandala)", + "source": "BPHS", + "bvr_id": "CN-22", + "category": "conjunction", + "enabled": true, + "strength": "弱", + "effects": [ + "灵性矛盾", + "非传统思想" + ], + "logic": { + "type": "same_house", + "a": "Jupiter", + "b": "Rahu" + } + }, + { + "id": "daridra_yoga_2_lord_6_8_12", + "name": "Daridra Yoga (2nd Lord in 6/8/12)", + "name_cn": "贫穷瑜伽(2宫主入6/8/12宫)", + "source": "BPHS", + "bvr_id": "DB-7", + "category": "durbhaga", + "enabled": true, + "strength": "弱", + "effects": [ + "财务不稳定", + "储蓄困难" + ], + "logic": { + "type": "lord_in_house", + "house": 2, + "target_houses": [ + 6, + 8, + 12 + ] + } + }, + { + "id": "daridra_yoga_11_lord_6_8_12", + "name": "Daridra Yoga (11th Lord in 6/8/12)", + "name_cn": "贫穷瑜伽(11宫主入6/8/12宫)", + "source": "BPHS", + "bvr_id": "DB-8", + "category": "durbhaga", + "enabled": true, + "strength": "弱", + "effects": [ + "收入不稳定", + "人脉关系淡薄" + ], + "logic": { + "type": "lord_in_house", + "house": 11, + "target_houses": [ + 6, + 8, + 12 + ] + } + }, + { + "id": "rog yoga_6", + "name": "Rog Yoga (6th House Afflicted)", + "name_cn": "疾病瑜伽(6宫受克)", + "source": "BPHS", + "bvr_id": "DB-9", + "category": "durbhaga", + "enabled": true, + "strength": "弱", + "effects": [ + "健康挑战", + "慢性病倾向" + ], + "logic": { + "type": "and", + "conditions": [ + { + "type": "in_houses", + "planet": "Saturn", + "houses": [ + 6 + ] + }, + { + "type": "dignity", + "planet": "Saturn", + "dignity": "debilitated" + } + ] + } + }, + { + "id": "varga_yoga_d1_d9_lord_same", + "name": "Varga Yoga (D1 & D9 Lord Same Sign)", + "name_cn": "分盘瑜伽(本命与Navamsa主星同星座)", + "source": "BPHS", + "bvr_id": "VG-1", + "category": "varga", + "enabled": true, + "strength": "强", + "effects": [ + "星盘力量翻倍", + "命运高度一致" + ], + "logic": { + "type": "custom", + "expr": "ctx.is_own_sign(ctx.lord_of_house(1)) or ctx.is_exalted(ctx.lord_of_house(1))", + "combo_template": "命主在本命盘强(分盘瑜伽近似判断)" + } + }, + { + "id": "raja_yoga_1_4_lord_kendra", + "name": "Raja Yoga (1st & 4th Lords in Kendra)", + "name_cn": "王瑜伽(1/4宫主入角宫)", + "source": "BPHS", + "bvr_id": "RJ-25", + "category": "raja", + "enabled": true, + "dedup_key": "raja_yoga", + "strength": "强", + "effects": [ + "政治权力", + "地产/母性资源" + ], + "logic": { + "type": "and", + "conditions": [ + { + "type": "lord_in_house", + "house": 1, + "target_houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "type": "lord_in_house", + "house": 4, + "target_houses": [ + 1, + 4, + 7, + 10 + ] + } + ] + }, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "raja_yoga_5_10_lord", + "name": "Raja Yoga (5th & 10th Lords Combination)", + "name_cn": "王瑜伽(5/10宫主合相)", + "source": "BPHS", + "bvr_id": "RJ-26", + "category": "raja", + "enabled": true, + "dedup_key": "raja_yoga", + "strength": "强", + "effects": [ + "政治才华", + "事业通过智慧实现" + ], + "logic": { + "type": "lords_relation", + "lord_a": { + "role": "lord", + "house": 5 + }, + "lord_b": { + "role": "lord", + "house": 10 + }, + "relation": "same_house" + }, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "raja_yoga_4_10_lord", + "name": "Raja Yoga (4th & 10th Lords Combination)", + "name_cn": "王瑜伽(4/10宫主合相)", + "source": "BPHS", + "bvr_id": "RJ-27", + "category": "raja", + "enabled": true, + "dedup_key": "raja_yoga", + "strength": "强", + "effects": [ + "政治地产事业", + "母亲助力事业" + ], + "logic": { + "type": "lords_relation", + "lord_a": { + "role": "lord", + "house": 4 + }, + "lord_b": { + "role": "lord", + "house": 10 + }, + "relation": "same_house" + }, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "raja_yoga_9_11_lord", + "name": "Raja Yoga (9th & 11th Lords Combination)", + "name_cn": "王瑜伽(9/11宫主合相)", + "source": "BPHS", + "bvr_id": "RJ-28", + "category": "raja", + "enabled": true, + "dedup_key": "raja_yoga", + "strength": "强", + "effects": [ + "命运与人脉合一", + "贵人带来收入" + ], + "logic": { + "type": "lords_relation", + "lord_a": { + "role": "lord", + "house": 9 + }, + "lord_b": { + "role": "lord", + "house": 11 + }, + "relation": "same_house" + }, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "raja_yoga_lord_1_in_9", + "name": "Raja Yoga (1st Lord in 9th House)", + "name_cn": "王瑜伽(命主入9宫)", + "source": "BPHS", + "bvr_id": "RJ-29", + "category": "raja", + "enabled": true, + "dedup_key": "raja_yoga", + "strength": "强", + "effects": [ + "祖先庇佑", + "宗教政治地位" + ], + "logic": { + "type": "lord_in_house", + "house": 1, + "target_houses": [ + 9 + ] + }, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "raja_yoga_lord_5_in_10", + "name": "Raja Yoga (5th Lord in 10th House)", + "name_cn": "王瑜伽(5宫主入10宫)", + "source": "BPHS", + "bvr_id": "RJ-30", + "category": "raja", + "enabled": true, + "dedup_key": "raja_yoga", + "strength": "强", + "effects": [ + "才华变事业", + "创造力变现" + ], + "logic": { + "type": "lord_in_house", + "house": 5, + "target_houses": [ + 10 + ] + }, + "source_reference": "BVR-29-37: Kendra-Trikona lord combinations", + "bvr_chapter": "Chapter 5-6" + }, + { + "id": "yoga_001", + "name": "Asraya Nabhasa", + "name_cn": "安座 Nabhasa", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "nabhasa", + "logic": { + "op": "and", + "conditions": [ + { + "op": "any_pair", + "planets": [ + "all" + ], + "condition": { + "op": "in_houses", + "houses": [ + 1, + 4, + 7, + 10 + ] + } + } + ] + }, + "effects": [ + "行星集中于角宫", + "形成安座格局" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_002", + "name": "Dala Nabhasa", + "name_cn": "花瓣 Nabhasa", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "nabhasa", + "logic": { + "op": "and", + "conditions": [ + { + "op": "any_pair", + "planets": [ + "all" + ], + "condition": { + "op": "in_houses", + "houses": [ + 1, + 5, + 9 + ] + } + } + ] + }, + "effects": [ + "行星集中于火象宫位", + "形成花瓣格局" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_003", + "name": "Mala Nabhasa", + "name_cn": "花环 Nabhasa", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "nabhasa", + "logic": { + "op": "and", + "conditions": [ + { + "op": "any_pair", + "planets": [ + "all" + ], + "condition": { + "op": "in_houses", + "houses": [ + 2, + 5, + 8, + 11 + ] + } + } + ] + }, + "effects": [ + "行星集中于固定宫", + "形成花环格局" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_004", + "name": "Sarpa Nabhasa", + "name_cn": "蛇形 Nabhasa", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "nabhasa", + "logic": { + "op": "and", + "conditions": [ + { + "op": "any_pair", + "planets": [ + "all" + ], + "condition": { + "op": "in_houses", + "houses": [ + 3, + 6, + 9, + 12 + ] + } + } + ] + }, + "effects": [ + "行星集中于变动宫", + "形成蛇形格局" + ], + "strength": "弱", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_005", + "name": "Lakshmi Yoga", + "name_cn": "吉祥天女 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "dhana", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "dignity", + "planet": "Venus", + "status": "exalted" + }, + { + "op": "in_houses", + "planet": "Jupiter", + "houses": [ + 1, + 5, + 9 + ] + } + ] + } + ] + }, + "effects": [ + "财富", + "美貌", + "艺术天赋", + "物质享受" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_006", + "name": "Gaja Kesari Yoga", + "name_cn": "象月 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "dhana", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "dignity", + "planet": "Jupiter", + "status": "exalted" + }, + { + "op": "in_houses", + "planet": "Moon", + "houses": [ + 1, + 4, + 7, + 10 + ] + } + ] + } + ] + }, + "effects": [ + "智慧", + "财富", + "社会地位", + "受人尊敬" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_007", + "name": "Chandra Adhi Yoga", + "name_cn": "月亮高位 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "dhana", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Moon", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "op": "count", + "planets": [ + "Jupiter", + "Venus", + "Mercury" + ], + "condition": { + "op": "in_houses_from", + "target": "Moon", + "houses": [ + 6, + 7, + 8 + ] + }, + "min": 2 + } + ] + } + ] + }, + "effects": [ + "高位", + "财富", + "影响力", + "社会地位" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_008", + "name": "Vasumati Yoga", + "name_cn": "财富 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "dhana", + "logic": { + "op": "and", + "conditions": [ + { + "op": "count", + "planets": [ + "all" + ], + "condition": { + "op": "in_houses", + "houses": [ + 3, + 6, + 10, + 11 + ] + }, + "min": 3 + } + ] + }, + "effects": [ + "财富积累", + "商业成功", + "物质丰裕" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_009", + "name": "Dhan Yoga (Lagna Lord in 2nd)", + "name_cn": "财富 Yoga(命主入2宫)", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "dhana", + "logic": { + "op": "and", + "conditions": [ + { + "op": "custom", + "expr": "lord(1) in [house_of(p) for p in planets_list()] and sign_of(lord(1)) == get_sign_of(lord(1))" + } + ] + }, + "effects": [ + "财富", + "收入稳定", + "家庭资产" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_010", + "name": "Satkalatra Yoga", + "name_cn": "贤妻 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "kalatra", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "dignity", + "planet": "Venus", + "status": "exalted" + }, + { + "op": "in_houses", + "planet": "Venus", + "houses": [ + 1, + 4, + 7, + 10, + 5, + 9 + ] + } + ] + } + ] + }, + "effects": [ + "配偶贤良", + "婚姻幸福", + "家庭和睦" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_011", + "name": "Kalatra Malika Yoga", + "name_cn": "婚姻花环 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "kalatra", + "logic": { + "op": "and", + "conditions": [ + { + "op": "custom", + "expr": "all([house_of(p) in [2,3,4,5,6,7] for p in ['Venus','Jupiter','Moon'] if p in planets_list()])" + } + ] + }, + "effects": [ + "婚姻美满", + "配偶支持", + "家庭和谐" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_012", + "name": "Santana Yoga", + "name_cn": "子孙 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "putra", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Jupiter", + "houses": [ + 1, + 5, + 9 + ] + }, + { + "op": "dignity", + "planet": "Jupiter", + "status": "exalted" + } + ] + } + ] + }, + "effects": [ + "子孙兴旺", + "子女有出息", + "后代繁荣" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_013", + "name": "Putra Malika Yoga", + "name_cn": "子女花环 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "putra", + "logic": { + "op": "and", + "conditions": [ + { + "op": "count", + "planets": [ + "Jupiter", + "Venus", + "Moon" + ], + "condition": { + "op": "in_houses", + "houses": [ + 1, + 2, + 3, + 4, + 5 + ] + }, + "min": 2 + } + ] + }, + "effects": [ + "子女缘厚", + "多子多福", + "后代昌盛" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_014", + "name": "Suputra Yoga", + "name_cn": "贤子 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "putra", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Jupiter", + "houses": [ + 5, + 9 + ] + }, + { + "op": "dignity", + "planet": "Jupiter", + "status": "own" + } + ] + } + ] + }, + "effects": [ + "子女贤良", + "后代有成就", + "家族延续" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_015", + "name": "Dehapushti Yoga", + "name_cn": "身体强健 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "ayur", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Sun", + "houses": [ + 1, + 5, + 9 + ] + }, + { + "op": "dignity", + "planet": "Sun", + "status": "exalted" + } + ] + } + ] + }, + "effects": [ + "身体健康", + "精力充沛", + "长寿" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_016", + "name": "Sareera Soukhya Yoga", + "name_cn": "身体健康 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "ayur", + "logic": { + "op": "and", + "conditions": [ + { + "op": "count", + "planets": [ + "Sun", + "Moon", + "Jupiter" + ], + "condition": { + "op": "in_houses", + "houses": [ + 1, + 5, + 9 + ] + }, + "min": 2 + } + ] + }, + "effects": [ + "身体健康", + "少病少灾", + "活力充沛" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_017", + "name": "Saraswati Yoga", + "name_cn": "辩才天女 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "auspicious", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Mercury", + "houses": [ + 1, + 2, + 4, + 5, + 7, + 9, + 10, + 11 + ] + }, + { + "op": "in_houses", + "planet": "Jupiter", + "houses": [ + 1, + 2, + 4, + 5, + 7, + 9, + 10, + 11 + ] + }, + { + "op": "in_houses", + "planet": "Venus", + "houses": [ + 1, + 2, + 4, + 5, + 7, + 9, + 10, + 11 + ] + } + ] + } + ] + }, + "effects": [ + "学识渊博", + "艺术才华", + "辩才无碍", + "智慧超群" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_018", + "name": "Budha Aditya Yoga", + "name_cn": "日月水 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "auspicious", + "logic": { + "op": "and", + "conditions": [ + { + "op": "same_house", + "planets": [ + "Sun", + "Mercury" + ] + } + ] + }, + "effects": [ + "智慧", + "学识", + "沟通能力", + "学术成就" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_019", + "name": "Vidya Yoga", + "name_cn": "学识 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "auspicious", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Jupiter", + "houses": [ + 1, + 4, + 5, + 9 + ] + }, + { + "op": "dignity", + "planet": "Mercury", + "status": "exalted" + } + ] + } + ] + }, + "effects": [ + "学业有成", + "知识渊博", + "教育成功" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_020", + "name": "Gaja Kesari Yoga (Classic)", + "name_cn": "象月 Yoga(经典)", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "raja", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Jupiter", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "op": "in_houses", + "planet": "Moon", + "houses": [ + 1, + 4, + 7, + 10 + ] + } + ] + } + ] + }, + "effects": [ + "高位", + "受人尊敬", + "智慧", + "财富" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_021", + "name": "Jaya Yoga", + "name_cn": "胜利 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "raja", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Jupiter", + "houses": [ + 1, + 5, + 9 + ] + }, + { + "op": "in_houses", + "planet": "Sun", + "houses": [ + 1, + 5, + 9 + ] + } + ] + } + ] + }, + "effects": [ + "事业成功", + "战胜对手", + "名声显赫" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_022", + "name": "Indra Yoga", + "name_cn": "因陀罗 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "raja", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Sun", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "op": "in_houses", + "planet": "Jupiter", + "houses": [ + 1, + 4, + 7, + 10 + ] + } + ] + } + ] + }, + "effects": [ + "权力", + "领导力", + "社会地位", + "受人敬仰" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_023", + "name": "Hari Yoga", + "name_cn": "毗湿奴 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "raja", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Sun", + "houses": [ + 1, + 5, + 9 + ] + }, + { + "op": "in_houses", + "planet": "Moon", + "houses": [ + 1, + 5, + 9 + ] + } + ] + } + ] + }, + "effects": [ + "精神力量", + "内在平静", + "智慧", + "慈悲" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_024", + "name": "Hara Yoga", + "name_cn": "湿婆 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "raja", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Mars", + "houses": [ + 1, + 5, + 9 + ] + }, + { + "op": "in_houses", + "planet": "Saturn", + "houses": [ + 1, + 5, + 9 + ] + } + ] + } + ] + }, + "effects": [ + "意志力", + "苦行", + "精神修行", + "内在力量" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_025", + "name": "Brahma Yoga", + "name_cn": "梵天 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "raja", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Jupiter", + "houses": [ + 1, + 5, + 9 + ] + }, + { + "op": "in_houses", + "planet": "Venus", + "houses": [ + 1, + 5, + 9 + ] + } + ] + } + ] + }, + "effects": [ + "创造力", + "智慧", + "学识", + "精神导师" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_026", + "name": "Chamara Yoga", + "name_cn": "拂尘 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "special", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Jupiter", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "op": "dignity", + "planet": "Jupiter", + "status": "exalted" + } + ] + } + ] + }, + "effects": [ + "高位", + "受人尊敬", + "智慧", + "长寿" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_027", + "name": "Chatra Yoga", + "name_cn": "伞盖 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "special", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Sun", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "op": "dignity", + "planet": "Sun", + "status": "exalted" + } + ] + } + ] + }, + "effects": [ + "权力", + "保护", + "社会地位", + "领导力" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_028", + "name": "Kuta Yoga", + "name_cn": "堡垒 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "special", + "logic": { + "op": "and", + "conditions": [ + { + "op": "count", + "planets": [ + "all" + ], + "condition": { + "op": "in_houses", + "houses": [ + 4, + 8, + 12 + ] + }, + "min": 3 + } + ] + }, + "effects": [ + "稳定", + "保守", + "家庭导向", + "安全感" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_029", + "name": "Nauka Yoga", + "name_cn": "船 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "special", + "logic": { + "op": "and", + "conditions": [ + { + "op": "count", + "planets": [ + "all" + ], + "condition": { + "op": "in_houses", + "houses": [ + 1, + 2, + 7, + 8 + ] + }, + "min": 3 + } + ] + }, + "effects": [ + "旅行", + "变动", + "海外", + "不稳定" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_030", + "name": "Yava Yoga", + "name_cn": "大麦 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "special", + "logic": { + "op": "and", + "conditions": [ + { + "op": "count", + "planets": [ + "all" + ], + "condition": { + "op": "in_houses", + "houses": [ + 2, + 6, + 10 + ] + }, + "min": 3 + } + ] + }, + "effects": [ + "勤劳", + "节俭", + "积累", + "务实" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_031", + "name": "Go Yoga", + "name_cn": "牛 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "special", + "logic": { + "op": "and", + "conditions": [ + { + "op": "count", + "planets": [ + "all" + ], + "condition": { + "op": "in_houses", + "houses": [ + 2, + 5, + 8, + 11 + ] + }, + "min": 3 + } + ] + }, + "effects": [ + "财富", + "稳定", + "家庭", + "传统" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_032", + "name": "Vihaga Yoga", + "name_cn": "飞鸟 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "special", + "logic": { + "op": "and", + "conditions": [ + { + "op": "count", + "planets": [ + "all" + ], + "condition": { + "op": "in_houses", + "houses": [ + 3, + 7, + 11 + ] + }, + "min": 3 + } + ] + }, + "effects": [ + "自由", + "旅行", + "社交", + "多才多艺" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_033", + "name": "Sakata Yoga", + "name_cn": "轮车 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "durbhaga", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Moon", + "houses": [ + 6, + 8, + 12 + ] + }, + { + "op": "in_houses", + "planet": "Jupiter", + "houses": [ + 6, + 8, + 12 + ] + } + ] + } + ] + }, + "effects": [ + "不稳定", + "起伏", + "财务波动", + "家庭问题" + ], + "strength": "弱", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_034", + "name": "Vajra Yoga", + "name_cn": "金刚 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "durbhaga", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Jupiter", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "op": "in_houses", + "planet": "Venus", + "houses": [ + 6, + 8, + 12 + ] + } + ] + } + ] + }, + "effects": [ + "严厉", + "批评", + "孤独", + "精神痛苦" + ], + "strength": "弱", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_035", + "name": "Yoopa Yoga", + "name_cn": "祭柱 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "special", + "logic": { + "op": "and", + "conditions": [ + { + "op": "count", + "planets": [ + "all" + ], + "condition": { + "op": "in_houses", + "houses": [ + 1, + 5, + 9 + ] + }, + "min": 3 + } + ] + }, + "effects": [ + "宗教", + "祭祀", + "传统", + "精神追求" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_036", + "name": "Andha Yoga", + "name_cn": "盲 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "durbhaga", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Sun", + "houses": [ + 6, + 8, + 12 + ] + }, + { + "op": "in_houses", + "planet": "Moon", + "houses": [ + 6, + 8, + 12 + ] + } + ] + } + ] + }, + "effects": [ + "视力问题", + "缺乏洞察力", + "判断失误" + ], + "strength": "弱", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_037", + "name": "Arishta Yoga (Classic)", + "name_cn": "凶难 Yoga(经典)", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "durbhaga", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Moon", + "houses": [ + 6, + 8, + 12 + ] + }, + { + "op": "in_houses", + "planet": "Saturn", + "houses": [ + 6, + 8, + 12 + ] + } + ] + } + ] + }, + "effects": [ + "健康隐患", + "寿命挑战", + "精神压力" + ], + "strength": "弱", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_038", + "name": "Kemadruma Yoga (Classic)", + "name_cn": "孤独 Yoga(经典)", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "durbhaga", + "logic": { + "op": "and", + "conditions": [ + { + "op": "custom", + "expr": "house_of('Moon') not in [house_of(p) for p in planets_list() if p != 'Moon'] and abs(house_of('Moon') - house_of('Sun')) not in [1, 2, 10, 11, 12]" + } + ] + }, + "effects": [ + "孤独", + "缺乏支持", + "情感孤立", + "社交困难" + ], + "strength": "弱", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_039", + "name": "Durmukha Yoga", + "name_cn": "恶口 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "durbhaga", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Jupiter", + "houses": [ + 6, + 8, + 12 + ] + }, + { + "op": "in_houses", + "planet": "Venus", + "houses": [ + 6, + 8, + 12 + ] + } + ] + } + ] + }, + "effects": [ + "言语恶毒", + "人际关系差", + "名声受损" + ], + "strength": "弱", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_040", + "name": "Kapata Yoga", + "name_cn": "欺诈 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "durbhaga", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Mercury", + "houses": [ + 6, + 8, + 12 + ] + }, + { + "op": "in_houses", + "planet": "Saturn", + "houses": [ + 6, + 8, + 12 + ] + } + ] + } + ] + }, + "effects": [ + "欺诈", + "不诚实", + "阴谋", + "信任危机" + ], + "strength": "弱", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_041", + "name": "Siva Yoga", + "name_cn": "湿婆 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "special", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Sun", + "houses": [ + 5, + 9 + ] + }, + { + "op": "in_houses", + "planet": "Jupiter", + "houses": [ + 5, + 9 + ] + } + ] + } + ] + }, + "effects": [ + "精神力量", + "内在平静", + "智慧", + "解脱" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_042", + "name": "Vishnu Yoga", + "name_cn": "毗湿奴 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "special", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Sun", + "houses": [ + 1, + 4, + 7, + 10 + ] + }, + { + "op": "in_houses", + "planet": "Moon", + "houses": [ + 1, + 4, + 7, + 10 + ] + } + ] + } + ] + }, + "effects": [ + "保护", + "慈悲", + "维持", + "和谐" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_043", + "name": "Harihara Brahma Yoga", + "name_cn": "三相神 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "special", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Sun", + "houses": [ + 1, + 5, + 9 + ] + }, + { + "op": "in_houses", + "planet": "Moon", + "houses": [ + 1, + 5, + 9 + ] + }, + { + "op": "in_houses", + "planet": "Jupiter", + "houses": [ + 1, + 5, + 9 + ] + } + ] + } + ] + }, + "effects": [ + "精神圆满", + "三位一体", + "宇宙和谐", + "终极智慧" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_044", + "name": "Bhratru Vriddhi Yoga", + "name_cn": "兄弟兴旺 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "special", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Mars", + "houses": [ + 3, + 11 + ] + }, + { + "op": "dignity", + "planet": "Mars", + "status": "exalted" + } + ] + } + ] + }, + "effects": [ + "兄弟和睦", + "兄弟姐妹有成就", + "家族兴旺" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_045", + "name": "Eka Putra Yoga", + "name_cn": "独子 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "putra", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Jupiter", + "houses": [ + 6, + 8, + 12 + ] + }, + { + "op": "in_houses", + "planet": "Venus", + "houses": [ + 6, + 8, + 12 + ] + } + ] + } + ] + }, + "effects": [ + "子女稀少", + "独子", + "后代有限" + ], + "strength": "弱", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_046", + "name": "Parakrama Yoga", + "name_cn": "勇武 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "raja", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Mars", + "houses": [ + 1, + 3, + 6, + 10, + 11 + ] + }, + { + "op": "dignity", + "planet": "Mars", + "status": "exalted" + } + ] + } + ] + }, + "effects": [ + "勇气", + "军事才能", + "竞争力", + "行动力" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_047", + "name": "Vikrama Malika Yoga", + "name_cn": "勇气花环 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "raja", + "logic": { + "op": "and", + "conditions": [ + { + "op": "count", + "planets": [ + "Mars", + "Sun", + "Jupiter" + ], + "condition": { + "op": "in_houses", + "houses": [ + 1, + 3, + 6, + 10, + 11 + ] + }, + "min": 2 + } + ] + }, + "effects": [ + "事业成功", + "竞争力", + "领导才能", + "勇气" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_048", + "name": "Karma Malika Yoga", + "name_cn": "业报花环 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "raja", + "logic": { + "op": "and", + "conditions": [ + { + "op": "count", + "planets": [ + "Saturn", + "Mars", + "Sun" + ], + "condition": { + "op": "in_houses", + "houses": [ + 6, + 10, + 11 + ] + }, + "min": 2 + } + ] + }, + "effects": [ + "事业成就", + "努力工作", + "责任感", + "社会地位" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_049", + "name": "Sada Sanchara Yoga", + "name_cn": "常行 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "special", + "logic": { + "op": "and", + "conditions": [ + { + "op": "count", + "planets": [ + "all" + ], + "condition": { + "op": "in_houses", + "houses": [ + 3, + 9, + 12 + ] + }, + "min": 3 + } + ] + }, + "effects": [ + "频繁旅行", + "海外", + "变动", + "不安定" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_050", + "name": "Vahana Yoga", + "name_cn": "交通工具 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "special", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Venus", + "houses": [ + 2, + 4, + 11 + ] + }, + { + "op": "in_houses", + "planet": "Saturn", + "houses": [ + 2, + 4, + 11 + ] + } + ] + } + ] + }, + "effects": [ + "拥有车辆", + "交通便利", + "物质享受" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_051", + "name": "Rogagrastha Yoga", + "name_cn": "疾病 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "durbhaga", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Saturn", + "houses": [ + 6, + 8, + 12 + ] + }, + { + "op": "in_houses", + "planet": "Mars", + "houses": [ + 6, + 8, + 12 + ] + } + ] + } + ] + }, + "effects": [ + "健康问题", + "慢性疾病", + "意外事故" + ], + "strength": "弱", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_052", + "name": "Kshaya Roga Yoga", + "name_cn": "消耗病 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "durbhaga", + "logic": { + "op": "and", + "conditions": [ + { + "op": "and", + "conditions": [ + { + "op": "in_houses", + "planet": "Saturn", + "houses": [ + 6, + 8 + ] + }, + { + "op": "in_houses", + "planet": "Moon", + "houses": [ + 6, + 8 + ] + } + ] + } + ] + }, + "effects": [ + "消耗性疾病", + "免疫力低", + "身体虚弱" + ], + "strength": "弱", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_053", + "name": "Ubhayachari Yoga", + "name_cn": "双伴 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "chandra", + "logic": { + "op": "and", + "conditions": [ + { + "op": "custom", + "expr": "any([house_of(p) == house_of('Moon') - 1 or house_of(p) == house_of('Moon') + 1 for p in planets_list() if p != 'Moon'])" + } + ] + }, + "effects": [ + "行星伴月", + "双重影响", + "复杂性格" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_054", + "name": "Vesi Yoga", + "name_cn": "日出 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "surya", + "logic": { + "op": "and", + "conditions": [ + { + "op": "custom", + "expr": "any([house_of(p) == house_of('Sun') + 1 for p in planets_list() if p != 'Sun'])" + } + ] + }, + "effects": [ + "行星在太阳之后", + "外向", + "积极", + "行动力" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_055", + "name": "Vosi Yoga", + "name_cn": "日落 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "surya", + "logic": { + "op": "and", + "conditions": [ + { + "op": "custom", + "expr": "any([house_of(p) == house_of('Sun') - 1 for p in planets_list() if p != 'Sun'])" + } + ] + }, + "effects": [ + "行星在太阳之前", + "内向", + "反思", + "保守" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_056", + "name": "Nipuna Yoga", + "name_cn": "熟练 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "auspicious", + "logic": { + "op": "and", + "conditions": [ + { + "op": "same_house", + "planets": [ + "Sun", + "Mercury" + ] + } + ] + }, + "effects": [ + "技艺精湛", + "专业能力", + "学术成就" + ], + "strength": "强", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_057", + "name": "Duradhara Yoga", + "name_cn": "支撑 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "chandra", + "logic": { + "op": "and", + "conditions": [ + { + "op": "custom", + "expr": "any([house_of(p) == house_of('Moon') - 1 for p in planets_list() if p != 'Moon']) and any([house_of(p) == house_of('Moon') + 1 for p in planets_list() if p != 'Moon'])" + } + ] + }, + "effects": [ + "月亮前后有行星", + "支持系统", + "资源丰富", + "稳定" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_058", + "name": "Sunaphaa Yoga", + "name_cn": "太阳后 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "chandra", + "logic": { + "op": "and", + "conditions": [ + { + "op": "custom", + "expr": "any([house_of(p) == house_of('Moon') + 1 for p in planets_list() if p != 'Moon'])" + } + ] + }, + "effects": [ + "月亮后有行星", + "自力更生", + "独立", + "进取" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "yoga_059", + "name": "Anaphaa Yoga", + "name_cn": "太阳前 Yoga", + "source": "B.V. Raman / PyJhora", + "bvr_id": null, + "category": "chandra", + "logic": { + "op": "and", + "conditions": [ + { + "op": "custom", + "expr": "any([house_of(p) == house_of('Moon') - 1 for p in planets_list() if p != 'Moon'])" + } + ] + }, + "effects": [ + "月亮前有行星", + "受人帮助", + "贵人运", + "支持" + ], + "strength": "中", + "enabled": false, + "accuracy_note": "v6.0.31 quarantine: legacy approximate op-schema rule; disabled until replaced by a high-confidence bvr_* rule." + }, + { + "id": "bvr_016_vesi_precise", + "name": "Vesi Yoga", + "name_cn": "日后行星 Yoga(精确)", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-16", + "category": "surya", + "logic": { + "type": "has_planet_in_house_from", + "planets": "all", + "from": "Sun", + "houses": [ + 2 + ], + "exclude": [ + "Moon" + ], + "combo_template": "{planets}在太阳的第2宫" + }, + "effects": [ + "太阳后方有行星支持", + "表达力与行动力增强", + "自我驱动力较强" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "vesi_precise" + }, + { + "id": "bvr_017_vosi_precise", + "name": "Vosi Yoga", + "name_cn": "日前行星 Yoga(精确)", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-17", + "category": "surya", + "logic": { + "type": "has_planet_in_house_from", + "planets": "all", + "from": "Sun", + "houses": [ + 12 + ], + "exclude": [ + "Moon" + ], + "combo_template": "{planets}在太阳的第12宫" + }, + "effects": [ + "太阳前方有行星铺垫", + "内在准备力强", + "重视计划与隐性资源" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "vosi_precise", + "source_reference": "BVR-17: Planet(s) other than Moon in 12th from Sun", + "bvr_chapter": "Chapter 2" + }, + { + "id": "bvr_018_ubhayachara_precise", + "name": "Ubhayachara Yoga", + "name_cn": "太阳双伴 Yoga(精确)", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-18", + "category": "surya", + "logic": { + "type": "and", + "conditions": [ + { + "type": "has_planet_in_house_from", + "planets": "all", + "from": "Sun", + "houses": [ + 2 + ], + "exclude": [ + "Moon" + ], + "combo_template": "{planets}在太阳的第2宫" + }, + { + "type": "has_planet_in_house_from", + "planets": "all", + "from": "Sun", + "houses": [ + 12 + ], + "exclude": [ + "Moon" + ], + "combo_template": "{planets}在太阳的第12宫" + } + ] + }, + "effects": [ + "太阳前后均有行星支撑", + "自我表达较完整", + "行动前后资源较足" + ], + "strength": "强", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "ubhayachara_precise" + }, + { + "id": "bvr_002_sunapha_precise", + "name": "Sunaphaa Yoga", + "name_cn": "月后行星 Yoga(精确)", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-2", + "category": "chandra", + "logic": { + "type": "has_planet_in_house_from", + "planets": "all", + "from": "Moon", + "houses": [ + 2 + ], + "exclude": [ + "Sun" + ], + "combo_template": "{planets}在月亮的第2宫" + }, + "effects": [ + "自力更生", + "资源积累能力", + "心智有后续支撑" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "sunapha_precise", + "source_reference": "BVR-2: Planet(s) other than Sun in 2nd from Moon", + "bvr_chapter": "Chapter 1" + }, + { + "id": "bvr_003_anapha_precise", + "name": "Anaphaa Yoga", + "name_cn": "月前行星 Yoga(精确)", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-3", + "category": "chandra", + "logic": { + "type": "has_planet_in_house_from", + "planets": "all", + "from": "Moon", + "houses": [ + 12 + ], + "exclude": [ + "Sun" + ], + "combo_template": "{planets}在月亮的第12宫" + }, + "effects": [ + "心智有背景支持", + "贵人或隐性资源", + "独处中成长" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "anapha_precise", + "source_reference": "BVR-3: Planet(s) other than Moon in 12th from Moon", + "bvr_chapter": "Chapter 1" + }, + { + "id": "bvr_004_duradhara_precise", + "name": "Duradhara Yoga", + "name_cn": "月亮双伴 Yoga(精确)", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-4", + "category": "chandra", + "logic": { + "type": "and", + "conditions": [ + { + "type": "has_planet_in_house_from", + "planets": "all", + "from": "Moon", + "houses": [ + 2 + ], + "exclude": [ + "Sun" + ], + "combo_template": "{planets}在月亮的第2宫" + }, + { + "type": "has_planet_in_house_from", + "planets": "all", + "from": "Moon", + "houses": [ + 12 + ], + "exclude": [ + "Sun" + ], + "combo_template": "{planets}在月亮的第12宫" + } + ] + }, + "effects": [ + "月亮前后均有支撑", + "心智稳定性增强", + "资源与适应力较强" + ], + "strength": "强", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "duradhara_precise" + }, + { + "id": "bvr_101_maalaa", + "name": "Maalaa Yoga", + "name_cn": "花环 Yoga", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-101", + "category": "nabhasa", + "logic": { + "type": "and", + "conditions": [ + { + "type": "has_planet_in_house", + "planets": "benefics", + "house": 1 + }, + { + "type": "has_planet_in_house", + "planets": "benefics", + "house": 4 + }, + { + "type": "has_planet_in_house", + "planets": "benefics", + "house": 7 + } + ] + }, + "effects": [ + "吉星占据三个角宫", + "名誉与舒适度提高", + "人缘与社会支持强" + ], + "strength": "强", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "maalaa" + }, + { + "id": "bvr_101_srik", + "name": "Srik Yoga", + "name_cn": "吉祥花环 Yoga", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-101", + "category": "nabhasa", + "logic": { + "type": "and", + "conditions": [ + { + "type": "has_planet_in_house", + "planets": "benefics", + "house": 1 + }, + { + "type": "has_planet_in_house", + "planets": "benefics", + "house": 4 + }, + { + "type": "has_planet_in_house", + "planets": "benefics", + "house": 7 + } + ] + }, + "effects": [ + "同 Maalaa Yoga:吉星角宫支撑", + "生活质量与声誉提升" + ], + "strength": "强", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "maalaa" + }, + { + "id": "bvr_102_sarpa", + "name": "Sarpa Yoga", + "name_cn": "蛇 Yoga", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-102", + "category": "nabhasa", + "logic": { + "type": "and", + "conditions": [ + { + "type": "has_planet_in_house", + "planets": "malefics", + "house": 1 + }, + { + "type": "has_planet_in_house", + "planets": "malefics", + "house": 4 + }, + { + "type": "has_planet_in_house", + "planets": "malefics", + "house": 7 + } + ] + }, + "effects": [ + "凶星占据三个角宫", + "压力与竞争显著", + "人生推进常伴随阻力" + ], + "strength": "弱", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "sarpa_dala" + }, + { + "id": "bvr_081_gadaa", + "name": "Gadaa Yoga", + "name_cn": "锤杵 Yoga", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-81", + "category": "nabhasa", + "logic": { + "type": "occupied_houses_exact_sets", + "planets": "visible", + "house_sets": [ + [ + 1, + 4 + ], + [ + 4, + 7 + ], + [ + 7, + 10 + ], + [ + 1, + 10 + ] + ], + "combo_template": "七曜只占据相邻角宫组合:{houses}" + }, + "effects": [ + "行星集中于两个相邻角宫", + "人生方向集中", + "行动与稳定主题强" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。" + }, + { + "id": "bvr_082_sakata_aakriti", + "name": "Sakata Yoga", + "name_cn": "车轮 Yoga(形态)", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-82", + "category": "nabhasa", + "logic": { + "type": "occupied_houses_exact", + "planets": "visible", + "houses": [ + 1, + 7 + ], + "combo_template": "七曜只占据1/7宫轴线" + }, + "effects": [ + "行星集中在1/7轴线", + "自我与关系主题强烈", + "人生起伏感较明显" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "sakata_aakriti" + }, + { + "id": "bvr_083_vihanga", + "name": "Vihanga Yoga", + "name_cn": "飞鸟 Yoga(形态)", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-83", + "category": "nabhasa", + "logic": { + "type": "occupied_houses_exact", + "planets": "visible", + "houses": [ + 4, + 10 + ], + "combo_template": "七曜只占据4/10宫轴线" + }, + "effects": [ + "家庭与事业轴线突出", + "迁移/职业方向强", + "生活重心两极化" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "vihanga" + }, + { + "id": "bvr_084_vajra", + "name": "Vajra Yoga", + "name_cn": "金刚 Yoga(精确)", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-84", + "category": "nabhasa", + "logic": { + "type": "and", + "conditions": [ + { + "type": "has_planet_in_house", + "planets": "benefics", + "house": 1 + }, + { + "type": "has_planet_in_house", + "planets": "benefics", + "house": 7 + }, + { + "type": "has_planet_in_house", + "planets": "malefics", + "house": 4 + }, + { + "type": "has_planet_in_house", + "planets": "malefics", + "house": 10 + } + ] + }, + "effects": [ + "1/7有吉星、4/10有凶星", + "外在人际较顺、内外责任压力强", + "刚柔并存" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "vajra_precise" + }, + { + "id": "bvr_085_yava", + "name": "Yava Yoga", + "name_cn": "大麦 Yoga(精确)", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-85", + "category": "nabhasa", + "logic": { + "type": "and", + "conditions": [ + { + "type": "has_planet_in_house", + "planets": "malefics", + "house": 1 + }, + { + "type": "has_planet_in_house", + "planets": "malefics", + "house": 7 + }, + { + "type": "has_planet_in_house", + "planets": "benefics", + "house": 4 + }, + { + "type": "has_planet_in_house", + "planets": "benefics", + "house": 10 + } + ] + }, + "effects": [ + "1/7有凶星、4/10有吉星", + "竞争中获得支撑", + "内在资源与事业支持较好" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "yava_precise" + }, + { + "id": "bvr_086_sringaataka", + "name": "Sringaataka Yoga", + "name_cn": "三角峰 Yoga", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-86", + "category": "nabhasa", + "logic": { + "type": "occupied_houses_exact", + "planets": "visible", + "houses": [ + 1, + 5, + 9 + ], + "combo_template": "七曜只占据1/5/9三方宫" + }, + "effects": [ + "行星集中三方宫", + "才华、信念与命运主题强", + "创造力与精神性较强" + ], + "strength": "强", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。" + }, + { + "id": "bvr_087_hala", + "name": "Hala Yoga", + "name_cn": "犁 Yoga", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-87", + "category": "nabhasa", + "logic": { + "type": "occupied_houses_exact_sets", + "planets": "visible", + "house_sets": [ + [ + 2, + 6, + 10 + ], + [ + 3, + 7, + 11 + ], + [ + 4, + 8, + 12 + ] + ], + "combo_template": "七曜只占据互为三方但非1/5/9的组合:{houses}" + }, + "effects": [ + "行星集中于互为三方的实务轴", + "劳动、组织与现实推进主题强" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。" + }, + { + "id": "bvr_088_kamala", + "name": "Kamala Yoga", + "name_cn": "莲花 Yoga", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-88", + "category": "nabhasa", + "logic": { + "type": "all_in_houses", + "planets": "visible", + "houses": [ + 1, + 4, + 7, + 10 + ], + "combo_template": "七曜全部落入角宫" + }, + "effects": [ + "七曜均在角宫", + "人生显化力强", + "外在事件密集且影响明显" + ], + "strength": "强", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "source_reference": "BVR-13: 10th house/ lord with only benefics", + "bvr_chapter": "Chapter 2" + }, + { + "id": "bvr_089_vaapi", + "name": "Vaapi Yoga", + "name_cn": "水池 Yoga", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-89", + "category": "nabhasa", + "logic": { + "type": "all_in_house_sets", + "planets": "visible", + "house_sets": [ + [ + 2, + 5, + 8, + 11 + ], + [ + 3, + 6, + 9, + 12 + ] + ], + "combo_template": "七曜全部落入Panapara或Apoklima宫:{houses}" + }, + "effects": [ + "行星集中于续宫或果宫", + "资源积累/适应环境主题强", + "人生节奏较非线性" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。" + }, + { + "id": "bvr_071_yoopa_precise", + "name": "Yoopa Yoga", + "name_cn": "祭柱 Yoga(精确)", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-71", + "category": "nabhasa", + "logic": { + "type": "all_in_houses", + "planets": "visible", + "houses": [ + 1, + 2, + 3, + 4 + ], + "combo_template": "七曜全部落入1-4宫" + }, + "effects": [ + "行星集中于生命早期与基础宫位", + "重视家庭、学习与根基" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "yoopa_precise" + }, + { + "id": "bvr_072_sara", + "name": "Sara Yoga", + "name_cn": "箭 Yoga", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-72", + "category": "nabhasa", + "logic": { + "type": "all_in_houses", + "planets": "visible", + "houses": [ + 4, + 5, + 6, + 7 + ], + "combo_template": "七曜全部落入4-7宫" + }, + "effects": [ + "家庭、创造、工作与关系轴线突出", + "人生重心偏向互动与服务" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。" + }, + { + "id": "bvr_072_ishu", + "name": "Ishu Yoga", + "name_cn": "箭矢 Yoga", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-72", + "category": "nabhasa", + "logic": { + "type": "all_in_houses", + "planets": "visible", + "houses": [ + 4, + 5, + 6, + 7 + ], + "combo_template": "七曜全部落入4-7宫" + }, + "effects": [ + "同 Sara Yoga:行动目标集中", + "关系和现实事务牵引强" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "sara_ishu" + }, + { + "id": "bvr_073_sakti", + "name": "Sakti Yoga", + "name_cn": "力量 Yoga", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-73", + "category": "nabhasa", + "logic": { + "type": "all_in_houses", + "planets": "visible", + "houses": [ + 7, + 8, + 9, + 10 + ], + "combo_template": "七曜全部落入7-10宫" + }, + "effects": [ + "关系、转化、信念与事业宫位集中", + "社会行动力强" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。" + }, + { + "id": "bvr_074_danda", + "name": "Danda Yoga", + "name_cn": "杖 Yoga", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-74", + "category": "nabhasa", + "logic": { + "type": "all_in_houses", + "planets": "visible", + "houses": [ + 10, + 11, + 12, + 1 + ], + "combo_template": "七曜全部落入10-12与1宫" + }, + "effects": [ + "事业、社群、隐性消耗与自我主题集中", + "责任感与压力并存" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。" + }, + { + "id": "bvr_075_naukaa_precise", + "name": "Naukaa Yoga", + "name_cn": "船 Yoga(精确)", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-75", + "category": "nabhasa", + "logic": { + "type": "custom", + "expr": "all(house_of(p) in [1,2,3,4,5,6,7] for p in ['Sun','Moon','Mars','Mercury','Jupiter','Venus','Saturn']) and all(len([p for p in ['Sun','Moon','Mars','Mercury','Jupiter','Venus','Saturn'] if house_of(p)==h])>0 for h in [1,2,3,4,5,6,7])", + "combo_template": "七曜分别占据从命宫起连续七宫" + }, + "effects": [ + "七曜覆盖命宫起连续七宫", + "人生像船行水面:移动、适应、串联能力强" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "naukaa_precise" + }, + { + "id": "bvr_076_koota_precise", + "name": "Koota Yoga", + "name_cn": "堡垒 Yoga(精确)", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-76", + "category": "nabhasa", + "logic": { + "type": "custom", + "expr": "all(house_of(p) in [4,5,6,7,8,9,10] for p in ['Sun','Moon','Mars','Mercury','Jupiter','Venus','Saturn']) and all(len([p for p in ['Sun','Moon','Mars','Mercury','Jupiter','Venus','Saturn'] if house_of(p)==h])>0 for h in [4,5,6,7,8,9,10])", + "combo_template": "七曜分别占据从4宫起连续七宫" + }, + "effects": [ + "七曜覆盖4宫起连续七宫", + "防御、结构、家族与社会位置主题强" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "koota_precise" + }, + { + "id": "bvr_077_chatra_precise", + "name": "Chatra Yoga", + "name_cn": "伞盖 Yoga(精确)", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-77", + "category": "nabhasa", + "logic": { + "type": "custom", + "expr": "all(house_of(p) in [7,8,9,10,11,12,1] for p in ['Sun','Moon','Mars','Mercury','Jupiter','Venus','Saturn']) and all(len([p for p in ['Sun','Moon','Mars','Mercury','Jupiter','Venus','Saturn'] if house_of(p)==h])>0 for h in [7,8,9,10,11,12,1])", + "combo_template": "七曜分别占据从7宫起连续七宫" + }, + "effects": [ + "七曜覆盖7宫起连续七宫", + "关系、公众、远方与事业主题强" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "chatra_precise" + }, + { + "id": "bvr_078_chaapa_precise", + "name": "Chaapa Yoga", + "name_cn": "弓 Yoga(精确)", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-78", + "category": "nabhasa", + "logic": { + "type": "custom", + "expr": "all(house_of(p) in [10,11,12,1,2,3,4] for p in ['Sun','Moon','Mars','Mercury','Jupiter','Venus','Saturn']) and all(len([p for p in ['Sun','Moon','Mars','Mercury','Jupiter','Venus','Saturn'] if house_of(p)==h])>0 for h in [10,11,12,1,2,3,4])", + "combo_template": "七曜分别占据从10宫起连续七宫" + }, + "effects": [ + "七曜覆盖10宫起连续七宫", + "事业拉弓、目标推进与公众行动力强" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "chaapa_precise" + }, + { + "id": "bvr_bhagya_malika", + "name": "Bhagya Malika Yoga", + "name_cn": "幸运花环 Yoga", + "source": "B.V. Raman / PyJHora", + "bvr_id": null, + "category": "dhana", + "logic": { + "type": "custom", + "expr": "all(house_of(lord(h)) in [9,10,11] for h in [9,10,11] if lord(h) in planets_list())", + "combo_template": "9/10/11宫主形成幸运与事业收益链" + }, + "effects": [ + "幸运、事业与收益宫主形成连续支撑", + "贵人、事业与收入联动" + ], + "strength": "强", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。" + }, + { + "id": "bvr_dhana_malika", + "name": "Dhana Malika Yoga", + "name_cn": "财富花环 Yoga", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-38-46", + "category": "dhana", + "logic": { + "type": "custom", + "expr": "all(house_of(lord(h)) in [2,5,9,11] for h in [2,5,9,11] if lord(h) in planets_list())", + "combo_template": "2/5/9/11宫主形成财富链" + }, + "effects": [ + "财富宫、才华宫、幸运宫、收益宫主互相支撑", + "财富积累力增强" + ], + "strength": "强", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "source_reference": "BVR-38-46: Wealth-giving combinations", + "bvr_chapter": "Chapter 7" + }, + { + "id": "bvr_lagna_malika", + "name": "Lagna Malika Yoga", + "name_cn": "命宫花环 Yoga", + "source": "B.V. Raman / PyJHora", + "bvr_id": null, + "category": "raja", + "logic": { + "type": "custom", + "expr": "all(house_of(lord(h)) in [1,2,3,4] for h in [1,2,3,4] if lord(h) in planets_list())", + "combo_template": "1-4宫主形成命宫基础链" + }, + "effects": [ + "自我、财富、努力、根基彼此支撑", + "基础发展稳定" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。" + }, + { + "id": "bvr_karma_malika_precise", + "name": "Karma Malika Yoga", + "name_cn": "事业花环 Yoga(精确)", + "source": "B.V. Raman / PyJHora", + "bvr_id": null, + "category": "raja", + "logic": { + "type": "custom", + "expr": "all(house_of(lord(h)) in [10,11,12,1] for h in [10,11,12,1] if lord(h) in planets_list())", + "combo_template": "10/11/12/1宫主形成事业闭环" + }, + "effects": [ + "事业、收益、远方/隐性成本与自我形成闭环", + "职业使命感强" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + "dedup_key": "karma_malika_precise" + }, + { + "id": "bvr_amala_precise", + "name": "Amala Yoga", + "name_cn": "纯净瑜伽", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-13", + "category": "auspicious", + "logic": { + "type": "custom", + "expr": "\n# Amala Yoga: only natural benefics in 10th from lagna OR from Moon\nbenefics = {'Jupiter', 'Venus', 'Mercury', 'Moon'}\ndef check_amala_from(base_h):\n h10 = ((base_h - 1 + 9) % 12) + 1\n planets_in_h10 = [p for p, info in ctx.planets.items() if info.get('house') == h10]\n if not planets_in_h10:\n return False\n return all(p in benefics for p in planets_in_h10)\nasc_h = ctx.planets.get('Ascendant', {}).get('house', 1)\nmoon_h = ctx.planets.get('Moon', {}).get('house', 1) if 'Moon' in ctx.planets else None\ncheck_amala_from(asc_h) or (moon_h and check_amala_from(moon_h))\n", + "combo_template": "第10宫只有吉星" + }, + "effects": [ + "品德高尚", + "名声良好", + "事业顺利" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman。", + "source_reference": "BVR-13: 10th house/ lord with only benefics", + "bvr_chapter": "Chapter 2" + }, + { + "id": "bvr_sareera_soukhya_precise", + "name": "Sareera Soukhya Yoga", + "name_cn": "身体健康瑜伽", + "source": "B.V. Raman / PyJHora", + "bvr_id": null, + "category": "health", + "logic": { + "type": "custom", + "expr": "\n# Lagna lord, Jupiter, and Venus in Kendra houses\nkendra = {1, 4, 7, 10}\nasc_lord = lord(1)\nplanets_to_check = [asc_lord, 'Jupiter', 'Venus']\nall_in_kendra = all(\n p in ctx.planets and ctx.planets[p].get('house') in kendra\n for p in planets_to_check if p\n)\nall_in_kendra\n", + "combo_template": "上升主、木星、金星均在Kendra" + }, + "effects": [ + "身体健康", + "精力充沛", + "长寿" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman。" + }, + { + "id": "bvr_rogagrastha_precise", + "name": "Rogagrastha Yoga", + "name_cn": "疾病缠身瑜伽", + "source": "B.V. Raman / PyJHora", + "bvr_id": null, + "category": "health", + "logic": { + "type": "custom", + "expr": "\n# Lagna lord in 6/8/12 and associated with 6th lord\nasc_lord = lord(1)\nlord_6 = lord(6)\nif asc_lord not in ctx.planets or lord_6 not in ctx.planets:\n False\nelse:\n asc_lord_h = ctx.planets[asc_lord].get('house')\n in_dusthana = asc_lord_h in [6, 8, 12]\n associated = same_house(asc_lord, lord_6) or aspect(asc_lord, lord_6)\n in_dusthana and associated\n", + "combo_template": "上升主在凶宫且与6宫主有关联" + }, + "effects": [ + "疾病", + "健康需注意", + "体质较弱" + ], + "strength": "弱", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman。" + }, + { + "id": "bvr_eka_puthra_precise", + "name": "Eka Puthra Yoga", + "name_cn": "独子瑜伽", + "source": "B.V. Raman / PyJHora", + "bvr_id": null, + "category": "putra", + "logic": { + "type": "lord_in_house", + "house": 5, + "target_houses": [ + 1, + 4, + 7, + 10, + 5, + 9 + ], + "combo_template": "5宫主在Kendra或Trikona" + }, + "effects": [ + "独生子女", + "子女少但优秀" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman。" + }, + { + "id": "bvr_satkalatra_precise", + "name": "Satkalatra Yoga", + "name_cn": "贤妻瑜伽", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-66-74", + "category": "kalatra", + "logic": { + "type": "custom", + "expr": "\n# 7th lord or Venus joined or aspected by Jupiter or Mercury\nlord_7 = lord(7)\ncandidates = []\nif lord_7 in ctx.planets:\n candidates.append(lord_7)\nif 'Venus' in ctx.planets:\n candidates.append('Venus')\nfor c in candidates:\n for benefic in ['Jupiter', 'Mercury']:\n if benefic in ctx.planets:\n if same_house(c, benefic) or aspect(c, benefic):\n True\nFalse\n", + "combo_template": "7宫主或金星与木星/水星有关联" + }, + "effects": [ + "配偶品德高尚", + "婚姻和谐" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman。", + "source_reference": "BVR-66-74: Marriage-related combinations", + "bvr_chapter": "Chapter 11" + }, + { + "id": "bvr_durumukha_precise", + "name": "Durmukha Yoga", + "name_cn": "恶面瑜伽", + "source": "B.V. Raman / PyJHora", + "bvr_id": null, + "category": "durbhaga", + "logic": { + "type": "custom", + "expr": "\n# Malefics (Saturn, Rahu, Ketu) in 2nd house\nmalefics = {'Saturn', 'Rahu', 'Ketu'}\nplanets_in_2 = [p for p, info in ctx.planets.items() if info.get('house') == 2]\nany(p in malefics for p in planets_in_2)\n", + "combo_template": "凶星在第2宫" + }, + "effects": [ + "言辞刻薄", + "不讨喜", + "人际关系差" + ], + "strength": "弱", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman。" + }, + { + "id": "bvr_dharidhra_11_precise", + "name": "Dharidhra Yoga", + "name_cn": "贫困瑜伽(11宫主凶宫)", + "source": "B.V. Raman / PyJHora", + "bvr_id": null, + "category": "durbhaga", + "logic": { + "type": "custom", + "expr": "\n# 11th lord in 6th, 8th, or 12th\nlord_11 = lord(11)\nif lord_11 in ctx.planets:\n ctx.planets[lord_11].get('house') in [6, 8, 12]\nelse:\n False\n", + "combo_template": "11宫主在凶宫" + }, + "effects": [ + "财务困难", + "收入不稳定", + "需节俭" + ], + "strength": "弱", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman。" + }, + { + "id": "bvr_sada_sanchara_precise", + "name": "Sada Sanchara Yoga", + "name_cn": "常行瑜伽", + "source": "B.V. Raman / PyJHora", + "bvr_id": null, + "category": "travel", + "logic": { + "type": "custom", + "expr": "\n# Lagna lord or Moon in movable sign (Chara Rashi)\nchara_signs = {'Aries', 'Cancer', 'Libra', 'Capricorn'}\nasc_lord = lord(1)\nin_chara = False\nif asc_lord in ctx.planets:\n if ctx.planets[asc_lord].get('sign') in chara_signs:\n in_chara = True\nif 'Moon' in ctx.planets and ctx.planets['Moon'].get('sign') in chara_signs:\n in_chara = True\nin_chara\n", + "combo_template": "上升主或月亮在变动星座" + }, + "effects": [ + "经常旅行", + "漂泊", + "不安于室" + ], + "strength": "弱", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman。" + }, + { + "id": "bvr_sumukha_precise", + "name": "Sumukha Yoga", + "name_cn": "善面瑜伽", + "source": "B.V. Raman / PyJHora", + "bvr_id": null, + "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", + "combo_template": "吉星在第2宫" + }, + "effects": [ + "面容和善", + "言语温和", + "受人喜爱" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman。" + }, + { + "id": "bvr_swaveeryaddhana_precise", + "name": "Swaveeryaddhana Yoga", + "name_cn": "自力更生致富瑜伽", + "source": "B.V. Raman / PyJHora", + "bvr_id": "BVR-38-46", + "category": "dhana", + "logic": { + "type": "custom", + "expr": "\n# Lagna lord in Kendra, associated with 2nd lord\nasc_lord = lord(1)\nlord_2 = lord(2)\nif asc_lord not in ctx.planets or lord_2 not in ctx.planets:\n False\nelse:\n in_kendra = ctx.planets[asc_lord].get('house') in [1, 4, 7, 10]\n associated = same_house(asc_lord, lord_2) or aspect(asc_lord, lord_2)\n in_kendra and associated\n", + "combo_template": "上升主在Kendra且与2宫主有关联" + }, + "effects": [ + "自力更生致富", + "独立创业", + "财富自主" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "中置信:Swaveeryaddhana的'最强行星'条件简化处理。", + "source_reference": "BVR-38-46: Wealth-giving combinations", + "bvr_chapter": "Chapter 7" + }, + { + "id": "bvr_bhratruvriddhi_precise", + "name": "Bhratruvriddhi Yoga", + "name_cn": "兄弟兴旺瑜伽", + "source": "B.V. Raman / PyJHora", + "bvr_id": null, + "category": "auspicious", + "logic": { + "type": "custom", + "expr": "\n# 3rd lord or Mars associated with benefic\nlord_3 = lord(3)\ncandidates = []\nif lord_3 in ctx.planets:\n candidates.append(lord_3)\nif 'Mars' in ctx.planets:\n candidates.append('Mars')\nbenefics = {'Jupiter', 'Venus', 'Mercury', 'Moon'}\nfor c in candidates:\n for b in benefics:\n if b in ctx.planets and same_house(c, b):\n True\nFalse\n", + "combo_template": "3宫主或火星与吉星有关联" + }, + "effects": [ + "兄弟和睦", + "兄弟助力", + "手足情深" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman。" + }, + { + "id": "bvr_bandhubhisthyaktha_precise", + "name": "Bandhubhisthyaktha Yoga", + "name_cn": "被亲属遗弃瑜伽", + "source": "B.V. Raman / PyJHora", + "bvr_id": null, + "category": "durbhaga", + "logic": { + "type": "custom", + "expr": "\n# 4th lord in dusthana or debilitated or with malefics\nlord_4 = lord(4)\nif lord_4 not in ctx.planets:\n False\nelse:\n malefics = {'Sun', 'Mars', 'Saturn', 'Rahu', 'Ketu'}\n lord_4_h = ctx.planets[lord_4].get('house')\n in_dusthana = lord_4_h in [6, 8, 12]\n debilitated = debil(lord_4)\n associated = any(same_house(lord_4, m) for m in malefics if m in ctx.planets)\n in_dusthana or debilitated or associated\n", + "combo_template": "4宫主受凶星影响或在凶宫" + }, + "effects": [ + "被亲属遗弃", + "缺乏家庭支持", + "家庭关系疏远" + ], + "strength": "弱", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman。" + }, + { + "id": "bvr_matrunasa_precise", + "name": "Matrunasa Yoga", + "name_cn": "母亲不利瑜伽", + "source": "B.V. Raman / PyJHora", + "bvr_id": null, + "category": "durbhaga", + "logic": { + "type": "custom", + "expr": "\n# Moon hemmed, associated, or aspected by evil planets\nif 'Moon' not in ctx.planets:\n False\nelse:\n moon_h = ctx.planets['Moon'].get('house')\n evil = {'Mars', 'Saturn', 'Rahu', 'Ketu', 'Sun'}\n h_prev = ((moon_h - 1 + 10) % 12) + 1\n h_next = ((moon_h - 1 + 1) % 12) + 1\n prev_evil = any(ctx.planets[p].get('house') == h_prev for p in evil if p in ctx.planets)\n next_evil = any(ctx.planets[p].get('house') == h_next for p in evil if p in ctx.planets)\n hemmed = prev_evil and next_evil\n associated = any(same_house('Moon', p) for p in evil if p in ctx.planets)\n aspected = any(aspect(p, 'Moon') for p in evil if p in ctx.planets)\n hemmed or associated or aspected\n", + "combo_template": "月亮受凶星影响" + }, + "effects": [ + "母亲健康不佳", + "与母亲缘薄", + "母亲早逝" + ], + "strength": "弱", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman。" + }, + { + "id": "bvr_nishkapata_precise", + "name": "Nishkapata Yoga", + "name_cn": "真诚瑜伽", + "source": "B.V. Raman / PyJHora", + "bvr_id": null, + "category": "auspicious", + "logic": { + "type": "custom", + "expr": "\n# 4th house occupied by benefic or exalted planet\nbenefics = {'Jupiter', 'Venus', 'Mercury', 'Moon'}\nplanets_in_4 = [p for p, info in ctx.planets.items() if info.get('house') == 4]\nhas_benefic = any(p in benefics for p in planets_in_4)\nhas_exalted = any(exal(p) for p in planets_in_4)\nhas_benefic or has_exalted\n", + "combo_template": "第4宫有吉星或旺星" + }, + "effects": [ + "心地善良", + "真诚待人", + "家庭和谐" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman。" + }, + { + "id": "bvr_bahu_puthra_precise", + "name": "Bahu Puthra Yoga", + "name_cn": "多子瑜伽", + "source": "B.V. Raman / PyJHora", + "bvr_id": null, + "category": "putra", + "logic": { + "type": "custom", + "expr": "\n# 5th lord strong and associated with benefics\nlord_5 = lord(5)\nif lord_5 not in ctx.planets:\n False\nelse:\n benefics = {'Jupiter', 'Venus', 'Mercury', 'Moon'}\n in_kendra_trikona = ctx.planets[lord_5].get('house') in [1, 4, 5, 7, 9, 10]\n associated = any(same_house(lord_5, b) for b in benefics if b in ctx.planets)\n in_kendra_trikona and associated\n", + "combo_template": "5宫主强且与吉星有关联" + }, + "effects": [ + "子女众多", + "子孙兴旺", + "后代有成就" + ], + "strength": "中", + "enabled": true, + "accuracy_note": "中置信:Bahu Puthra原始定义涉及Navamsa,此处简化为5宫主条件。" + }, + { + "id": "bvr_amsaavatara_yoga", + "name": "Amsaavatara Yoga", + "name_cn": "分身降生瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-50", + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "planets_in_kendras", + "planets": [ + "Jupiter", + "Venus" + ], + "note": "Jupiter and Venus in kendras" + }, + { + "type": "planet_exalted_in_kendra", + "planet": "Saturn", + "note": "Saturn exalted and in kendra" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Divine nature, great yogic powers, spiritual liberation" + ], + "strength": "very_rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-50" + }, + { + "id": "bvr_anapathya_yoga", + "name": "Anapathya Yoga", + "name_cn": "无子嗣瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "putra", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "jupiter_weak", + "note": "Jupiter is weak (debilitated, combust, or enemy sign)" + }, + { + "type": "lords_weak", + "lords": [ + 1, + 7, + 5 + ], + "note": "Lords of Lagna, 7th and 5th are weak" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Childlessness, lack of progeny" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_angaheena_yoga", + "name": "Angaheena Yoga", + "name_cn": "肢体缺陷瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "planet_in_position_from_planet", + "planet": "Moon", + "from_planet": "Sun", + "positions": [ + 9 + ], + "note": "Moon in 10th from Sun" + }, + { + "type": "planet_in_position_from_planet", + "planet": "Mars", + "from_planet": "Sun", + "positions": [ + 6 + ], + "note": "Mars in 7th from Sun" + }, + { + "type": "planet_in_position_from_planet", + "planet": "Saturn", + "from_planet": "Sun", + "positions": [ + 1 + ], + "note": "Saturn in 2nd from Sun" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Physical deficiency or disability in limbs" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_annadana_yoga", + "name": "Annadana Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: annadana_yoga()" + }, + { + "id": "bvr_annadana_yoga_from_planet_posi", + "name": "Annadana Yoga From Planet Position Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: annadana_yoga_from_planet_position()" + }, + { + "id": "bvr_apakeerthi_yoga", + "name": "Apakeerthi Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": true, + "draft": false, + "evidence_note": "From PyJhora function: apakeerthi_yoga()" + }, + { + "id": "bvr_ardha_chandra_yoga", + "name": "Ardha Chandra Yoga", + "name_cn": "半月瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-79", + "category": "nabhasa", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "all_7_planets_in_7_consecutive_non_kendra_starting_houses", + "note": "All 7 visible planets in 7 consecutive houses starting from non-Kendra, each house occupied" + } + ], + "note": "All 7 visible planets in 7 consecutive houses starting from non-Kendra, each house occupied" + }, + "effects": [ + "Commanding appearance, leadership, wealth" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-79" + }, + { + "id": "bvr_asatyavadi_yoga", + "name": "Asatyavadi Yoga", + "name_cn": "谎言瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "lord_in_mars_or_saturn_sign", + "lord_of": 2, + "note": "2nd lord in house of Saturn or Mars" + }, + { + "type": "malefics_in_kendras_and_trines", + "note": "Malefics join kendras and trines" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Untruthful, deceptive, cunning nature" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_asubha_yoga", + "name": "Asubha Yoga", + "name_cn": "不祥瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "lagna_has_malefics_not_aspected_by_benefics", + "note": "Lagna has malefics and not affected by benefics" + }, + { + "type": "lagna_hemmed_by_malefics_not_aspected_by_benefics", + "note": "Malefics in both 2nd and 12th from Lagna, not aspected by benefics" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Inauspicious life, difficulties, physical/mental troubles" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_ayatna_griha_prapta_yoga", + "name": "Ayatna Griha Prapta Yoga", + "name_cn": "不劳得房瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "lords_in_houses", + "lords_and_houses": [ + [ + 1, + 0 + ], + [ + 7, + 0 + ], + [ + 1, + 3 + ], + [ + 7, + 3 + ] + ], + "note": "Lords of Lagna and 7th in Lagna or 4th" + }, + { + "type": "aspected_by_benefics", + "note": "Aspected by benefics" + } + ] + }, + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "lord_in_kendra", + "lord_of": 9, + "note": "9th lord in kendra" + }, + { + "type": "lord_in_exaltation_own_or_mool_trikona", + "lord_of": 4, + "note": "4th lord exalted, in own or mool-trikona" + } + ] + } + ] + } + ], + "note": "" + }, + "effects": [ + "Gains property without effort, inherits house" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_ayatnadhanalabha_yoga", + "name": "Ayatnadhanalabha Yoga", + "name_cn": "不劳而获瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-143", + "category": "dhana", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "house_lord_exchange", + "house1": 1, + "house2": 2, + "note": "Lagna lord and 2nd lord exchange their places (Parivartana)" + } + ], + "note": "Lagna lord and 2nd lord exchange their places (Parivartana)" + }, + "effects": [ + "Gains wealth without much effort, inherited wealth" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-143" + }, + { + "id": "bvr_bahu_sthree_yoga", + "name": "Bahu Sthree Yoga", + "name_cn": "多女缘瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "kalatra", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "lords_in_mutual_conjunction_or_aspect", + "lords": [ + 1, + 7 + ], + "note": "Lords of Lagna and 7th in conjunction or aspect with each other" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Association with many women" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_bahudravyarjana_yoga", + "name": "Bahudravyarjana Yoga", + "name_cn": "广积财瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-129", + "category": "dhana", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "lord_in_house", + "lord_of": 1, + "house_offset": 1, + "note": "Lagna lord in 2nd house" + }, + { + "type": "lord_in_house", + "lord_of": 2, + "house_offset": 10, + "note": "2nd lord in 11th house" + }, + { + "type": "lord_in_house", + "lord_of": 11, + "house_offset": 0, + "note": "11th lord in Lagna" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Accumulates great wealth from multiple sources" + ], + "strength": "strong", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-129" + }, + { + "id": "bvr_bandhu_pujya_yoga", + "name": "Bandhu Pujya Yoga", + "name_cn": "亲族尊崇瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "4th_lord_is_benefic_aspected_by_benefic", + "note": "Benefic 4th lord aspected by another benefic" + }, + { + "type": "planet_in_lagna", + "planet": "Mercury", + "note": "Mercury in Lagna" + } + ] + }, + { + "type": "4th_house_or_lord_with_aspect_of_jupiter", + "note": "4th house or 4th lord has association/aspect of Jupiter" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Respected and honored by relatives" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_bhaagya_yoga", + "name": "Bhaagya Yoga", + "name_cn": "福气瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "strong_benefic_in_lagna_3rd_or_5th_aspecting_9th", + "note": "Strong benefic in Lagna, 3rd or 5th, simultaneously aspecting 9th" + } + ], + "note": "Strong benefic in Lagna, 3rd or 5th, simultaneously aspecting 9th" + }, + "effects": [ + "Great fortune, luck, divine grace" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_bhaarathi_yoga", + "name": "Bhaarathi Yoga", + "name_cn": "婆罗底瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-29", + "category": "raja", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "navamsa_lord_of_2_5_11_exalted_joins_9th_lord", + "note": "Lord of sign occupied in navamsa by 2nd/5th/11th lord, exalted and joins the 9th lord" + } + ], + "note": "Lord of sign occupied in navamsa by 2nd/5th/11th lord, exalted and joins the 9th lord" + }, + "effects": [ + "Learned, eloquent, wealthy from knowledge" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-29" + }, + { + "id": "bvr_bhaaskara_yoga", + "name": "Bhaaskara Yoga", + "name_cn": "光耀瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-159", + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "moon_in_position_from_planet", + "from_planet": "Mercury", + "position": 11, + "note": "Moon 11th from Mercury (BVR method)" + }, + { + "type": "planet_in_position_from_planet", + "planet": "Mercury", + "from_planet": "Sun", + "position": 2, + "note": "Mercury 2nd from Sun" + }, + { + "type": "planet_in_position_from_moon", + "planet": "Jupiter", + "positions": [ + 5, + 9 + ], + "note": "Jupiter in 5th or 9th from Moon" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Affluent, brave, learned, skilled in arithmetic and music" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-159" + }, + { + "id": "bvr_bhaga_chumbana_yoga", + "name": "Bhaga Chumbana Yoga", + "name_cn": "性欲瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "kalatra", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "lord_in_house", + "lord_of": 7, + "house_offset": 3, + "note": "7th lord in 4th conjunct Venus" + }, + { + "type": "venus_in_house", + "house_offset": 3, + "note": "Venus in 4th house" + } + ] + }, + { + "type": "lagna_lord_debilitated_in_rasi_or_navamsa", + "note": "Lagna lord debilitated in rasi or navamsa" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Excessive sensuality, libidinous nature" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_bharyasahavyabhichara_yoga", + "name": "Bharyasahavyabhichara Yoga", + "name_cn": "妻子不贞瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "kalatra", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "venus_saturn_mars_moon_in_7th", + "note": "Venus, Saturn and Mars join Moon in 7th house" + }, + { + "type": "7th_lord_with_venus_aspected_by_saturn", + "note": "7th lord conjunct Venus, aspected by Saturn" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Infidelity in marriage, spouse's questionable conduct" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_bhojana_soukhya_yoga", + "name": "Bhojana Soukhya Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: bhojana_soukhya_yoga()" + }, + { + "id": "bvr_bhraathru_saapa_sutakshaya_yog", + "name": "Bhraathru Saapa Sutakshaya Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: bhraathru_saapa_sutakshaya_yoga()" + }, + { + "id": "bvr_bhratrumooladdhanaprapti_yoga", + "name": "Bhratrumooladdhanaprapti Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "dhana", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: bhratrumooladdhanaprapti_yoga()" + }, + { + "id": "bvr_buddhi_jada_yoga", + "name": "Buddhi Jada Yoga", + "name_cn": "迟钝智力瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "lagna_lord_with_or_aspected_by_malefics", + "note": "Lagna lord conjunct/aspected by malefics" + }, + { + "type": "planet_in_house", + "planet": "Saturn", + "house_offset": 4, + "note": "Saturn in 5th house" + }, + { + "type": "lagna_lord_aspected_by_saturn", + "note": "Lagna lord aspected by Saturn" + } + ] + }, + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "5th_lord_with_malefics", + "note": "5th lord conjunct malefics" + }, + { + "type": "saturn_aspects_5th_lord_or_moon_in_5th", + "note": "Saturn aspects 5th lord OR Moon in 5th house" + } + ] + } + ] + } + ], + "note": "" + }, + "effects": [ + "Dull intellect, slow learning, mental challenges" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_buddhimaturya_yoga", + "name": "Buddhimaturya Yoga", + "name_cn": "成熟智慧瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "5th_lord_is_benefic", + "note": "5th lord is a natural benefic" + }, + { + "type": "5th_lord_aspected_by_benefic_or_in_benefic_sign", + "note": "5th lord aspected by another benefic or in benefic sign" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Mature intelligence, wise beyond years, good judgment" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_budha_aaditya_yoga", + "name": "Budha Aaditya Yoga", + "name_cn": "水星太阳合相瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-162", + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "planets_conjunct_in_same_house", + "planets": [ + "Sun", + "Mercury" + ], + "note": "Sun and Mercury in the same house (Budha-Aditya conjunction)" + } + ], + "note": "Sun and Mercury in the same house (Budha-Aditya conjunction)" + }, + "effects": [ + "Sharp intellect, good communication skills, government service" + ], + "strength": "common", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-162" + }, + { + "id": "bvr_chaamara_yoga", + "name": "Chaamara Yoga", + "name_cn": "华盖瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-21", + "category": "raja", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "lagna_lord_exalted_in_kendra_with_jupiter_aspect", + "note": "Lagna lord exalted in a quadrant with Jupiter's aspect" + }, + { + "type": "two_benefics_in_house", + "house_offsets": [ + 6, + 8, + 9 + ], + "benefics": [ + "Jupiter", + "Venus", + "Mercury", + "Moon" + ], + "count": 2, + "note": "Two benefics join in 7th, 9th or 10th" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Great fame, honored by kings, eloquent" + ], + "strength": "strong", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-21" + }, + { + "id": "bvr_chakra_yoga", + "name": "Chakra Yoga", + "name_cn": "轮瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-80", + "category": "nabhasa", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "all_planets_in_houses", + "house_offsets": [ + 0, + 2, + 4, + 6, + 8, + 10 + ], + "planets": [ + "Sun", + "Moon", + "Mars", + "Mercury", + "Jupiter", + "Venus", + "Saturn" + ], + "note": "All planets in odd houses (1,3,5,7,9,11) from Lagna" + } + ], + "note": "All planets in odd houses (1,3,5,7,9,11) from Lagna" + }, + "effects": [ + "Becomes a ruler or head of state" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-80" + }, + { + "id": "bvr_chandikaa_yoga", + "name": "Chandikaa Yoga", + "name_cn": "战神女神瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-57", + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "lagna_in_fixed_sign_aspected_by_6th_lord", + "note": "Lagna in fixed sign aspected by 6th lord" + }, + { + "type": "sun_joins_navamsa_lords_of_6th_and_9th", + "note": "Sun joins lords of navamsa signs occupied by 6th and 9th lords" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Fierce, victorious, destroys enemies" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-57" + }, + { + "id": "bvr_chapa_yoga", + "name": "Chapa Yoga", + "name_cn": "弓瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-30", + "category": "raja", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "house_lord_exchange", + "house1": 4, + "house2": 10, + "note": "4th and 10th lords exchange signs (Parivartana)" + }, + { + "type": "lagna_lord_exalted", + "note": "Lagna lord is exalted" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Archer's nature, royal status, determined" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-30" + }, + { + "id": "bvr_daama_yoga", + "name": "Daama Yoga", + "name_cn": "大绳瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-92", + "category": "nabhasa", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "planets_in_exactly_n_signs", + "n": 6, + "planets": [ + "Sun", + "Moon", + "Mars", + "Mercury", + "Jupiter", + "Venus", + "Saturn" + ], + "note": "7 visible planets occupy exactly 6 distinct signs" + } + ], + "note": "7 visible planets occupy exactly 6 distinct signs" + }, + "effects": [ + "Leader, wealthy, charitable" + ], + "strength": "occasional", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-92" + }, + { + "id": "bvr_dama_yoga", + "name": "Dama Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": true, + "draft": false, + "evidence_note": "From PyJhora function: dama_yoga()" + }, + { + "id": "bvr_dattha_puthra_yoga", + "name": "Dattha Puthra Yoga", + "name_cn": "养子瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "putra", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "planets_in_house", + "planets": [ + "Mars", + "Saturn" + ], + "house_offset": 4, + "note": "Mars and Saturn in 5th house" + }, + { + "type": "lagna_lord_in_mercury_sign_with_mercury", + "note": "Lagna lord in Mercury sign with Mercury" + } + ] + }, + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "lord_in_house", + "lord_of": 7, + "house_offset": 10, + "note": "7th lord in 11th" + }, + { + "type": "5th_lord_with_benefic_and_mars_or_saturn_in_5th", + "note": "5th lord with benefic and Mars/Saturn in 5th" + } + ] + } + ] + } + ], + "note": "" + }, + "effects": [ + "Adoption of a child, childless by own birth" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_dehasthoulya_yoga", + "name": "Dehasthoulya Yoga", + "name_cn": "肥胖体型瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-114", + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "lagna_lord_and_navamsa_lord_both_in_watery_signs", + "note": "Lagna lord and navamsa lord both in watery signs" + }, + { + "type": "jupiter_in_lagna_or_aspects_lagna_from_watery", + "note": "Jupiter in Lagna or aspects Lagna from watery sign" + }, + { + "type": "lagna_watery_with_benefics_or_lagna_lord_watery", + "note": "Lagna in watery sign with benefics OR Lagna lord is watery planet" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Stout/heavy body, obesity tendency" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-114" + }, + { + "id": "bvr_devendra_yoga", + "name": "Devendra Yoga", + "name_cn": "天帝瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-55", + "category": "raja", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "lagna_in_fixed_sign", + "note": "Lagna in a fixed sign" + }, + { + "type": "house_lord_exchange", + "house1": 2, + "house2": 10, + "note": "2nd and 10th lords exchange" + }, + { + "type": "house_lord_exchange", + "house1": 1, + "house2": 11, + "note": "1st and 11th lords exchange" + } + ] + } + ], + "note": "" + }, + "effects": [ + "King among kings, extraordinary wealth and power" + ], + "strength": "very_rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-55" + }, + { + "id": "bvr_dhatrutwa_yoga", + "name": "Dhatrutwa Yoga", + "name_cn": "善施主瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "lord_exalted", + "lord_of": 9, + "note": "9th lord exalted" + }, + { + "type": "lord_aspected_by_benefic", + "lord_of": 9, + "note": "9th lord aspected by benefic" + }, + { + "type": "benefic_in_house", + "house_offset": 8, + "note": "Benefic in 9th house" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Charitable, respected spiritual leader, generous" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_dhur_yoga", + "name": "Dhur Yoga", + "name_cn": "障碍瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "lord_in_dusthana_houses", + "lord_of": 10, + "dusthanas": [ + 5, + 7, + 11 + ], + "note": "10th lord in 6th, 8th or 12th house" + } + ], + "note": "10th lord in 6th, 8th or 12th house" + }, + "effects": [ + "Obstacles to career, difficulties in profession" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_dhurmarana_yoga", + "name": "Dhurmarana Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: dhurmarana_yoga()" + }, + { + "id": "bvr_durmarana_yoga", + "name": "Durmarana Yoga", + "name_cn": "横死瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "moon_in_dusthana_aspected_by_lagna_lord", + "note": "Moon aspected by Lagna lord in 6th, 8th or 12th" + }, + { + "type": "moon_conjunct_saturn_mandi_or_rahu", + "note": "Moon conjunct Saturn, Mandi or Rahu" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Unnatural death, violent end" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_dwadasa_sahodara_yoga", + "name": "Dwadasa Sahodara Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: dwadasa_sahodara_yoga()" + }, + { + "id": "bvr_ekabhagini_yoga", + "name": "Ekabhagini Yoga", + "name_cn": "独妹瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "planet_in_house", + "planet": "Mercury", + "house_offset": 2, + "note": "Mercury in 3rd house" + }, + { + "type": "3rd_lord_joins_moon", + "note": "3rd lord joins the Moon" + }, + { + "type": "mars_joins_saturn", + "note": "Mars joins Saturn" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Only one sister, or loss of sisters" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_gaja_yoga", + "name": "Gaja Yoga", + "name_cn": "象瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-48", + "category": "raja", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "lord_in_house_with_moon_aspected_by_lord", + "lord_of_9th_from": 11, + "house_offset": 10, + "aspected_by": "11th_lord", + "note": "Method 1: 9th lord from 11th in 11th with Moon, aspected by 11th lord" + }, + { + "type": "9th_lord_and_moon_in_11th", + "note": "Method 2: 9th lord from Lagna and Moon in 11th" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Wealthy, prosperous, respected like a king" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-48" + }, + { + "id": "bvr_galakarna_yoga", + "name": "Galakarna Yoga", + "name_cn": "耳鸣瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "mandi_and_rahu_in_3rd", + "note": "Mandi and Rahu in 3rd house" + }, + { + "type": "mars_in_3rd_in_cruel_sashtiamsa", + "note": "Mars in 3rd in Preta Puriha sashtiamsa (cruel)" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Ear problems, hearing issues, tinnitus" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_gandharva_yoga", + "name": "Gandharva Yoga", + "name_cn": "乐神瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-60", + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "lord_in_trine_from_house", + "lord_of": 10, + "from_house_offset": 6, + "note": "10th lord in trine from 7th house" + }, + { + "type": "lagna_lord_conjunct_or_aspected_by", + "planet": "Jupiter", + "note": "Lagna lord conjoined or aspected by Jupiter" + }, + { + "type": "planet_exalted_strong", + "planet": "Sun", + "note": "Sun exalted and strong" + }, + { + "type": "moon_in_house", + "house_offset": 8, + "note": "Moon in 9th house" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Gifted in music, dance, arts; charming personality" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-60" + }, + { + "id": "bvr_garuda_yoga", + "name": "Garuda Yoga", + "name_cn": "金翅鸟瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-66", + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "navamsa_lord_of_moon_exalted_in_rasi", + "note": "Lord of navamsa occupied by Moon is exalted in rasi" + }, + { + "type": "birth_daytime_waxing_moon", + "note": "Born during daytime with waxing Moon" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Long-lived, powerful, commands fear and respect" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-66" + }, + { + "id": "bvr_gouri_yoga", + "name": "Gouri Yoga", + "name_cn": "高丽瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-28", + "category": "raja", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "navamsa_dispositor_exalted_in_10th_with_lagna_lord", + "reference_planet": "10th_lord", + "note": "10th lord's navamsa dispositor is exalted in 10th and lagna lord joins him" + } + ], + "note": "10th lord's navamsa dispositor is exalted in 10th and lagna lord joins him" + }, + "effects": [ + "Royal honors, wealth, fame, virtuous" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-28" + }, + { + "id": "bvr_grihanasa_yoga", + "name": "Grihanasa Yoga", + "name_cn": "房屋损失瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "lord_in_house", + "lord_of": 4, + "house_offset": 11, + "note": "4th lord in 12th house" + }, + { + "type": "aspected_by_malefic", + "planet": "4th_lord", + "note": "4th lord aspected by malefic" + } + ] + }, + { + "type": "navamsa_lord_of_4th_lord_in_12th", + "note": "Lord of navamsa occupied by 4th lord in 12th" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Loss or destruction of property/house" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_grihanasa_yoga_planet_position", + "name": "Grihanasa Yoga Planet Positions Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: grihanasa_yoga_planet_positions()" + }, + { + "id": "bvr_guhyaroga_yoga", + "name": "Guhyaroga Yoga", + "name_cn": "秘密疾病瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "moon_with_malefics_in_navamsa_cancer_scorpio", + "note": "Moon joins malefics in navamsa of Cancer or Scorpio" + } + ], + "note": "Moon joins malefics in navamsa of Cancer or Scorpio" + }, + "effects": [ + "Secret/hidden diseases, diseases of private parts" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_harsha_yoga", + "name": "Harsha Yoga", + "name_cn": "欢喜瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-105", + "category": "raja", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "lord_in_own_house", + "house": 6, + "note": "6th lord occupies the 6th house (Vipareeta Raja Yoga)" + } + ], + "note": "6th lord occupies the 6th house (Vipareeta Raja Yoga)" + }, + "effects": [ + "Overcomes enemies, good health, happiness" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-105" + }, + { + "id": "bvr_jada_yoga", + "name": "Jada Yoga", + "name_cn": "迟钝语言瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "lord_in_house_with_malefics", + "lord_of": 2, + "house_offset": 9, + "note": "2nd lord in 10th with malefics" + }, + { + "type": "sun_and_mandi_in_house", + "house_offset": 1, + "note": "Sun and Mandi in 2nd house" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Dull speech, stammering, incoherent communication" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_jananatpurvam_pitru_marana_yog", + "name": "Jananatpurvam Pitru Marana Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: jananatpurvam_pitru_marana_yoga()" + }, + { + "id": "bvr_jara_yoga", + "name": "Jara Yoga", + "name_cn": "情人瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "kalatra", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "lords_of_10_2_7_in_10th_house", + "note": "10th house occupied by lords of 10th, 2nd and 7th" + } + ], + "note": "10th house occupied by lords of 10th, 2nd and 7th" + }, + "effects": [ + "Extra-marital relations, illicit love affairs" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_jarajaputra_yoga", + "name": "Jarajaputra Yoga", + "name_cn": "私生子瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "putra", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "lords_5_7_conjunct_6th_lord", + "note": "Powerful lords of 5th and 7th join with 6th lord" + }, + { + "type": "aspected_by_benefics", + "note": "Aspected by benefics" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Children from illicit relations" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_kaalanirdesat_puthra_yoga", + "name": "Kaalanirdesat Puthra Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "putra", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: kaalanirdesat_puthra_yoga()" + }, + { + "id": "bvr_kaalanirdesat_puthranaasa_yoga", + "name": "Kaalanirdesat Puthranaasa Yoga", + "name_cn": "定时无子瑜伽", + "source": "待查", + "bvr_id": null, + "category": "putra", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "5th_lord_afflicted_by_saturn_or_rahu", + "note": "5th lord afflicted by Saturn or Rahu" + } + ], + "note": "Loss of children at specific times" + }, + "effects": [ + "Loss of progeny at predetermined periods" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "From PyJhora function: kaalanirdesat_puthranaasa_yoga()" + }, + { + "id": "bvr_kalaanidhi_yoga", + "name": "Kalaanidhi Yoga", + "name_cn": "艺术宝库瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-49", + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "planet_in_house_with_aspect_or_conjunction", + "planet": "Jupiter", + "house_offsets": [ + 1, + 4 + ], + "aspecting_or_conjoining": [ + "Mercury", + "Venus" + ], + "note": "Jupiter in 2nd or 5th house, conjoined or aspected by Mercury and Venus" + } + ], + "note": "Jupiter in 2nd or 5th house, conjoined or aspected by Mercury and Venus" + }, + "effects": [ + "Skilled in fine arts, music, dance; cultured and wealthy" + ], + "strength": "strong", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-49" + }, + { + "id": "bvr_kalpadruma_yoga", + "name": "Kalpadruma Yoga", + "name_cn": "如意树瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-47b", + "category": "raja", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "four_planet_chain_all_in_kendra_trine_or_exaltation", + "note": "Lagna lord, his dispositor, the latter's dispositor in rasi and navamsa, all in kendras/trines/exaltation" + } + ], + "note": "Lagna lord, his dispositor, the latter's dispositor in rasi and navamsa, all in kendras/trines/exaltation" + }, + "effects": [ + "Fulfills all desires, great king, supreme wealth" + ], + "strength": "very_rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-47b" + }, + { + "id": "bvr_karascheda_yoga", + "name": "Karascheda Yoga", + "name_cn": "截手瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "planet_in_house", + "planet": "Saturn", + "house_offset": 8, + "note": "Saturn in 9th house" + }, + { + "type": "planet_in_house", + "planet": "Jupiter", + "house_offset": 2, + "note": "Jupiter in 3rd house" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Danger of amputation, loss of hand/arm" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_kedaara_yoga", + "name": "Kedaara Yoga", + "name_cn": "田园瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-94", + "category": "nabhasa", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "planets_in_exactly_n_signs", + "n": 4, + "planets": [ + "Sun", + "Moon", + "Mars", + "Mercury", + "Jupiter", + "Venus", + "Saturn" + ], + "note": "7 visible planets occupy exactly 4 distinct signs" + } + ], + "note": "7 visible planets occupy exactly 4 distinct signs" + }, + "effects": [ + "Lives by agriculture, helpful, amasses wealth" + ], + "strength": "occasional", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-94" + }, + { + "id": "bvr_khalwata_yoga", + "name": "Khalwata Yoga", + "name_cn": "秃头瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "lagna_malefic_sign_or_sagittarius_taurus_aspected_by_malefic", + "note": "Lagna in malefic sign (Ar/Sc/Cp/Aq) or Sg/Ta aspected by malefics" + } + ], + "note": "Lagna in malefic sign (Ar/Sc/Cp/Aq) or Sg/Ta aspected by malefics" + }, + "effects": [ + "Baldness or hair loss" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_krisanga_yoga", + "name": "Krisanga Yoga", + "name_cn": "消瘦体型瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-112", + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "lagna_lord_in_dry_sign", + "note": "Lagna lord in a dry sign" + }, + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "navamsa_lagna_in_dry_planet_sign", + "note": "Navamsa Lagna owned by dry planet" + }, + { + "type": "malefics_in_lagna", + "note": "Malefics join Rasi Lagna" + } + ] + } + ] + } + ], + "note": "" + }, + "effects": [ + "Lean/thin body, frail constitution" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-112" + }, + { + "id": "bvr_kushtaroga_yoga", + "name": "Kushtaroga Yoga", + "name_cn": "皮肤病瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "lagna_lord_with_mars_mercury_in_4th_or_12th", + "note": "Lagna lord joins Mars and Mercury in 4th or 12th" + }, + { + "type": "jupiter_saturn_moon_in_6th", + "note": "Jupiter conjunct Saturn and Moon in 6th house" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Skin diseases, leprosy, dermatitis" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_laabha_malika_yoga", + "name": "Laabha Malika Yoga", + "name_cn": "收益花环瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-42", + "category": "dhana", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "malika_yoga_starting_house", + "start_house_offset": 10, + "note": "Malika Yoga (planets in consecutive houses) starting from 11th house" + } + ], + "note": "Malika Yoga (planets in consecutive houses) starting from 11th house" + }, + "effects": [ + "Wealth from multiple sources, gains and profits" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-42" + }, + { + "id": "bvr_maalavya_yoga", + "name": "Maalavya Yoga", + "name_cn": "玛拉维亚瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-20", + "category": "pancha_mahapurusha", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "planet_in_sign_and_house", + "planet": "Venus", + "signs": [ + "Taurus", + "Libra", + "Pisces" + ], + "house_offsets": [ + 0, + 3, + 6, + 9 + ], + "note": "Venus in own/exaltation sign (Ta/Li/Pi) and in kendra (1/4/7/10) from Lagna" + } + ], + "note": "Venus in own/exaltation sign (Ta/Li/Pi) and in kendra (1/4/7/10) from Lagna" + }, + "effects": [ + "Beautiful, charming, wealthy, passionate, luxurious life" + ], + "strength": "strong", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-20" + }, + { + "id": "bvr_maathru_saapa_sutakshaya_yoga", + "name": "Maathru Saapa Sutakshaya Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: maathru_saapa_sutakshaya_yoga()" + }, + { + "id": "bvr_marud_yoga", + "name": "Marud Yoga", + "name_cn": "风神瑜伽", + "source": "Classical", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "planet_in_position_from_planet", + "planet": "Jupiter", + "from_planet": "Venus", + "positions": [ + 5, + 9 + ], + "note": "Jupiter in 5th or 9th from Venus" + }, + { + "type": "planet_in_position_from_moon", + "planet": "Moon", + "positions": [ + 5 + ], + "note": "Moon in 5th from Jupiter" + }, + { + "type": "moon_in_kendra_from_sun", + "note": "Sun in kendra from Moon" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Fame, wealth, spiritual knowledge, commanding" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: Classical, BVR: None" + }, + { + "id": "bvr_mathibhramana_yoga", + "name": "Mathibhramana Yoga", + "name_cn": "精神错乱瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "jupiter_in_lagna_mars_in_7th", + "note": "Jupiter in Lagna and Mars in 7th" + }, + { + "type": "saturn_in_lagna_mars_in_5_7_9", + "note": "Saturn in Lagna and Mars in 9th/5th/7th" + }, + { + "type": "saturn_in_12th_with_waning_moon", + "note": "Saturn in 12th with waning Moon" + }, + { + "type": "moon_mercury_in_kendra_with_planet", + "note": "Moon and Mercury in kendra with another planet" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Mental disturbance, confusion, erratic behavior" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_mathibhramana_yoga_variation", + "name": "Mathibhramana Yoga Variation Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: mathibhramana_yoga_variation()" + }, + { + "id": "bvr_matru_satrutwa_yoga", + "name": "Matru Satrutwa Yoga", + "name_cn": "母亲仇视瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "mercury_lord_of_1st_and_4th", + "note": "Mercury is lord of both Lagna and 4th (Gemini or Virgo Lagna)" + }, + { + "type": "mercury_with_or_aspected_by_malefic", + "note": "Mercury conjunct or aspected by a malefic" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Enmity with mother, difficulties through mother" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_matru_satrutwa_yoga_from_plane", + "name": "Matru Satrutwa Yoga From Planet Position Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: matru_satrutwa_yoga_from_planet_position()" + }, + { + "id": "bvr_matru_sneha_yoga", + "name": "Matru Sneha Yoga", + "name_cn": "母子情深瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "same_lord_for_1st_and_4th", + "note": "1st and 4th houses have same planetary ruler (Ge/Vi or Sg/Pi lagna)" + }, + { + "type": "1st_and_4th_lords_are_natural_or_temporal_friends", + "note": "Lords of 1st and 4th are natural or temporal friends" + }, + { + "type": "1st_and_4th_lords_aspected_by_benefics", + "note": "Lagna lord and 4th lord aspected by benefics" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Deep love and affection with mother" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_matrudeerghayur_yoga", + "name": "Matrudeerghayur Yoga", + "name_cn": "母长寿瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "benefic_in_house", + "house_offset": 3, + "note": "Benefic in 4th house" + }, + { + "type": "lord_exalted", + "lord_of": 4, + "note": "4th lord exalted" + }, + { + "type": "moon_strong", + "note": "Moon is strong" + } + ] + }, + { + "type": "navamsa_lord_of_4th_in_kendra_from_lagna_and_moon", + "note": "Lord of navamsa occupied by 4th lord in kendra from Lagna and Chandra Lagna" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Mother lives long, mother's health is good" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_mooka_yoga", + "name": "Mooka Yoga", + "name_cn": "哑巴瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "lord_and_planet_in_house", + "lord_of": 2, + "planet": "Jupiter", + "house_offset": 7, + "note": "2nd lord joins Jupiter in 8th house" + }, + { + "type": "not_jupiter_own_or_exalted_in_8th", + "note": "8th house is not Jupiter's own or exaltation sign" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Speech impediment, silence, deep contemplation" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_musala_yoga", + "name": "Musala Yoga", + "name_cn": "杵瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-99", + "category": "nabhasa", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "all_planets_in_sign_type", + "sign_type": "fixed", + "planets": [ + "Sun", + "Moon", + "Mars", + "Mercury", + "Jupiter", + "Venus", + "Saturn", + "Rahu", + "Ketu" + ], + "note": "All planets exclusively in fixed signs (Ta/Le/Sc/Aq)" + } + ], + "note": "All planets exclusively in fixed signs (Ta/Le/Sc/Aq)" + }, + "effects": [ + "Firmness, resolve, stubborn nature, lasting wealth" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-99" + }, + { + "id": "bvr_nala_yoga", + "name": "Nala Yoga", + "name_cn": "双重瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-100", + "category": "nabhasa", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "all_planets_in_sign_type", + "sign_type": "dual", + "planets": [ + "Sun", + "Moon", + "Mars", + "Mercury", + "Jupiter", + "Venus", + "Saturn", + "Rahu", + "Ketu" + ], + "note": "All planets exclusively in dual signs (Ge/Vi/Sg/Pi)" + } + ], + "note": "All planets exclusively in dual signs (Ge/Vi/Sg/Pi)" + }, + "effects": [ + "Dual nature, adaptability, trade skills" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-100" + }, + { + "id": "bvr_nav_yoga", + "name": "Nav Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: nav_yoga()" + }, + { + "id": "bvr_netranasa_yoga", + "name": "Netranasa Yoga", + "name_cn": "眼病瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "lords_of_10_6_in_lagna_with_2nd_lord", + "note": "Lords of 10th and 6th in Lagna with 2nd lord" + }, + { + "type": "lords_10_6_in_debilitation", + "note": "Lords of 10th and 6th in Neechamsat (debilitation)" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Eye troubles, blindness, vision problems" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_nishturabhashi_yoga", + "name": "Nishturabhashi Yoga", + "name_cn": "刻薄语言瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "planets_conjunct_in_same_house", + "planets": [ + "Moon", + "Saturn" + ], + "note": "Moon in conjunction with Saturn" + }, + { + "type": "not_aspected_by_jupiter", + "planet": "Moon", + "note": "No Jupiter aspect on Moon" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Harsh, cruel, cutting speech; lack of empathy" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_paasa_yoga", + "name": "Paasa Yoga", + "name_cn": "绳套瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-93", + "category": "nabhasa", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "planets_in_exactly_n_signs", + "n": 5, + "planets": [ + "Sun", + "Moon", + "Mars", + "Mercury", + "Jupiter", + "Venus", + "Saturn" + ], + "note": "7 visible planets occupy exactly 5 distinct signs" + } + ], + "note": "7 visible planets occupy exactly 5 distinct signs" + }, + "effects": [ + "Many friends, talkative, skilled in various arts" + ], + "strength": "occasional", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-93" + }, + { + "id": "bvr_parannabhojana_yoga", + "name": "Parannabhojana Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: parannabhojana_yoga()" + }, + { + "id": "bvr_parihasaka_yoga", + "name": "Parihasaka Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: parihasaka_yoga()" + }, + { + "id": "bvr_parijatha_yoga", + "name": "Parijatha Yoga", + "name_cn": "天界花树瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-47", + "category": "raja", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "lagna_lord_chain_dispositor_in_kendra_trine_or_exaltation", + "note": "Lord of sign occupied by lagna lord, or navamsa dispositor thereof, in kendra/trine/own/exaltation" + } + ], + "note": "Lord of sign occupied by lagna lord, or navamsa dispositor thereof, in kendra/trine/own/exaltation" + }, + "effects": [ + "Becomes a king or equal, great wealth and fame" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-47" + }, + { + "id": "bvr_pisacha_grastha_yoga", + "name": "Pisacha Grastha Yoga", + "name_cn": "鬼魅缠身瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "rahu_in_lagna_with_moon", + "note": "Rahu in Lagna in conjunction with Moon" + }, + { + "type": "malefics_in_trines", + "note": "Malefics join trines" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Haunted by spirits, irrational behavior, mental affliction" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_pithru_saapa_sutakshaya_yoga", + "name": "Pithru Saapa Sutakshaya Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: pithru_saapa_sutakshaya_yoga()" + }, + { + "id": "bvr_pittharoga_yoga", + "name": "Pittharoga Yoga", + "name_cn": "胆火病瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "sun_in_house_with_malefic", + "house_offset": 5, + "note": "Sun in 6th house in conjunction with a malefic" + }, + { + "type": "house_aspected_by_malefic", + "house_offset": 5, + "note": "6th house further aspected by another malefic" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Pitta diseases, fevers, inflammatory conditions" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_pretha_saapa_yoga", + "name": "Pretha Saapa Yoga", + "name_cn": "亡灵诅咒瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-219", + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "planets_in_house", + "planets": [ + "Sun", + "Saturn" + ], + "house_offset": 4, + "note": "Sun and Saturn in 5th house" + }, + { + "type": "moon_weak_in_house", + "house_offset": 6, + "note": "Weak Moon in 7th house" + }, + { + "type": "planet_in_lagna", + "planet": "Rahu", + "note": "Rahu in Lagna" + }, + { + "type": "planet_in_house", + "planet": "Jupiter", + "house_offset": 11, + "note": "Jupiter in 12th house" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Curse of departed souls, difficulties in progeny" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-219" + }, + { + "id": "bvr_putrakalatraheena_yoga", + "name": "Putrakalatraheena Yoga", + "name_cn": "无妻无子瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "putra", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "moon_in_house_waning", + "house_offset": 4, + "note": "Waning Moon in 5th house" + }, + { + "type": "malefics_in_houses", + "house_offsets": [ + 11, + 6, + 0 + ], + "note": "Malefics occupy 12th, 7th and Lagna" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Deprived of family and children" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_raja_bhanga_yoga", + "name": "Raja Bhanga Yoga", + "name_cn": "王业破坏瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "raja_yoga_present_but_disrupted", + "note": "Raja Yoga disrupted by malefic associations or aspects" + } + ], + "note": "Raja Yoga disrupted by malefic associations or aspects" + }, + "effects": [ + "Rise followed by fall from power, broken ambitions" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_rajabhrashta_yoga", + "name": "Rajabhrashta Yoga", + "name_cn": "失位王者瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "lords_conjunct_aroodha_lagna_and_12th", + "note": "Lords of Aroodha Lagna (A1/AL) and Aroodha Dwadasa (A12/UL) in conjunction" + } + ], + "note": "Lords of Aroodha Lagna (A1/AL) and Aroodha Dwadasa (A12/UL) in conjunction" + }, + "effects": [ + "Fall from power/status, political downfall" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_rajalakshana_yoga", + "name": "Rajalakshana Yoga", + "name_cn": "王者特征瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-10", + "category": "raja", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "planets_in_kendras", + "planets": [ + "Jupiter", + "Venus", + "Mercury", + "Moon" + ], + "note": "Jupiter, Venus, Mercury and Moon all in kendras (1,4,7,10) from Lagna" + } + ], + "note": "Jupiter, Venus, Mercury and Moon all in kendras (1,4,7,10) from Lagna" + }, + "effects": [ + "Royal characteristics, wealth, leadership, honor" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-10" + }, + { + "id": "bvr_rajju_yoga", + "name": "Rajju Yoga", + "name_cn": "绳索瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-98", + "category": "nabhasa", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "all_planets_in_sign_type", + "sign_type": "movable", + "planets": [ + "Sun", + "Moon", + "Mars", + "Mercury", + "Jupiter", + "Venus", + "Saturn" + ], + "note": "All 7 visible planets exclusively in movable signs (Ar/Cn/Li/Cp)" + } + ], + "note": "All 7 visible planets exclusively in movable signs (Ar/Cn/Li/Cp)" + }, + "effects": [ + "Restlessness, frequent travel, nomadic nature" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-98" + }, + { + "id": "bvr_randhra_malika_yoga", + "name": "Randhra Malika Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: randhra_malika_yoga()" + }, + { + "id": "bvr_ravi_yoga", + "name": "Ravi Yoga", + "name_cn": "太阳瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-65", + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "planet_in_house", + "planet": "Sun", + "house_offset": 9, + "note": "Sun in the 10th house" + }, + { + "type": "lord_in_house_with_planet", + "lord_of": 10, + "house_offset": 2, + "planet": "Saturn", + "note": "10th lord in 3rd house with Saturn" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Hardworking, respected, gains through effort" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-65" + }, + { + "id": "bvr_saarada_yoga", + "name": "Saarada Yoga", + "name_cn": "萨拉达瑜伽", + "source": "Classical", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "lord_in_house", + "lord_of": 10, + "house_offset": 4, + "note": "10th lord in 5th house" + }, + { + "type": "planet_in_kendra", + "planet": "Mercury", + "note": "Mercury in a quadrant" + }, + { + "type": "planet_strong_in_sign", + "planet": "Sun", + "sign": "Leo", + "note": "Sun strong in Leo" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Learned, gifted in scholarship and fine arts" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: Classical, BVR: None" + }, + { + "id": "bvr_samudra_yoga", + "name": "Samudra Yoga", + "name_cn": "海洋瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-90", + "category": "nabhasa", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "all_planets_in_houses", + "house_offsets": [ + 1, + 3, + 5, + 7, + 9, + 11 + ], + "planets": [ + "Sun", + "Moon", + "Mars", + "Mercury", + "Jupiter", + "Venus", + "Saturn" + ], + "note": "All planets in even houses (2,4,6,8,10,12) from Lagna" + } + ], + "note": "All planets in even houses (2,4,6,8,10,12) from Lagna" + }, + "effects": [ + "Prosperous, wealthy, respectable" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-90" + }, + { + "id": "bvr_sapthasankhya_sahodara_yoga", + "name": "Sapthasankhya Sahodara Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: sapthasankhya_sahodara_yoga()" + }, + { + "id": "bvr_sarala_yoga", + "name": "Sarala Yoga", + "name_cn": "简单瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-106", + "category": "raja", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "lord_in_own_house", + "house": 8, + "note": "8th lord occupies the 8th house (Vipareeta Raja Yoga)" + } + ], + "note": "8th lord occupies the 8th house (Vipareeta Raja Yoga)" + }, + "effects": [ + "Long life, prosperity, fearless" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-106" + }, + { + "id": "bvr_saraswathi_yoga", + "name": "Saraswathi Yoga", + "name_cn": "辩才女神瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-161", + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "planets_in_kendra_trine_or_2nd", + "planets": [ + "Mercury", + "Jupiter", + "Venus" + ], + "note": "Mercury, Jupiter and Venus each in kendra, trine or 2nd house" + }, + { + "type": "planet_in_own_friendly_or_exaltation", + "planet": "Jupiter", + "note": "Jupiter in own, friendly or exaltation sign" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Great scholar, eloquent, masters all arts and sciences" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-161" + }, + { + "id": "bvr_sarpaganda_yoga", + "name": "Sarpaganda Yoga", + "name_cn": "蛇毒瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "rahu_in_2nd_house", + "note": "Rahu in 2nd house" + }, + { + "type": "mandi_in_2nd_house", + "note": "Mandi in 2nd house" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Danger from snakes or poison, toxic situations" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_sarpasaapa_yoga", + "name": "Sarpasaapa Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: sarpasaapa_yoga()" + }, + { + "id": "bvr_satkathadisravana_yoga", + "name": "Satkathadisravana Yoga", + "name_cn": "善听圣典瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "3rd_house_benefic_sign_aspected_by_benefics", + "note": "3rd house is a benefic sign aspected by benefic planets" + }, + { + "type": "3rd_lord_in_benefic_sign_or_aspected_by_benefic", + "note": "3rd lord joins a benefic amsa (with or aspected by benefic)" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Love of scriptures, devotion, pious nature" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_satru_malika_yoga", + "name": "Satru Malika Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: satru_malika_yoga()" + }, + { + "id": "bvr_sirachcheda_yoga", + "name": "Sirachcheda Yoga", + "name_cn": "斩首瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "6th_lord_conjunct_venus", + "note": "6th lord in conjunction with Venus" + }, + { + "type": "sun_or_saturn_with_rahu", + "note": "Sun or Saturn with Rahu in cruel shashtiamsa" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Danger to head/neck, accidents affecting head" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_sodaranasa_yoga", + "name": "Sodaranasa Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: sodaranasa_yoga()" + }, + { + "id": "bvr_soola_yoga", + "name": "Soola Yoga", + "name_cn": "矛瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-95", + "category": "nabhasa", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "planets_in_exactly_n_signs", + "n": 3, + "planets": [ + "Sun", + "Moon", + "Mars", + "Mercury", + "Jupiter", + "Venus", + "Saturn" + ], + "note": "7 visible planets occupy exactly 3 distinct signs" + } + ], + "note": "7 visible planets occupy exactly 3 distinct signs" + }, + "effects": [ + "Fierce, bold, prone to disputes and arguments" + ], + "strength": "occasional", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-95" + }, + { + "id": "bvr_sraddhannabhuktha_yoga", + "name": "Sraddhannabhuktha Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: sraddhannabhuktha_yoga()" + }, + { + "id": "bvr_sreenaatha_yoga", + "name": "Sreenaatha Yoga", + "name_cn": "湿婆之主瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-31", + "category": "raja", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "lord_exalted_in_house", + "lord_of": 7, + "house_offset": 9, + "note": "7th lord exalted in 10th" + }, + { + "type": "lords_conjunct", + "lord1_house": 10, + "lord2_house": 9, + "note": "10th lord conjoined with 9th lord" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Great wealth, high status, blessed by Vishnu" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-31" + }, + { + "id": "bvr_subha_yoga", + "name": "Subha Yoga", + "name_cn": "吉祥瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "lagna_has_benefics_not_aspected_by_malefics", + "note": "Lagna has benefics and not affected by malefics" + }, + { + "type": "lagna_hemmed_by_benefics_not_aspected_by_malefics", + "note": "Benefics in both 2nd and 12th from Lagna, not aspected by malefics" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Auspicious life, good health, happiness, prosperity" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_sukha_malika_yoga", + "name": "Sukha Malika Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: sukha_malika_yoga()" + }, + { + "id": "bvr_suputhra_yoga", + "name": "Suputhra Yoga", + "name_cn": "良子瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "putra", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "jupiter_lord_of_5th", + "note": "Jupiter is lord of 5th house (Lagna in Leo or Scorpio)" + }, + { + "type": "sun_in_favorable_position", + "note": "Sun in own, exalted or friendly sign" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Blessed with noble children" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_swetakushta_yoga", + "name": "Swetakushta Yoga", + "name_cn": "白癜风瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "mars_in_house", + "house_offset": 1, + "note": "Mars in 2nd house" + }, + { + "type": "saturn_in_house", + "house_offset": 11, + "note": "Saturn in 12th house" + }, + { + "type": "planet_in_lagna", + "planet": "Moon", + "note": "Moon in Lagna" + }, + { + "type": "planet_in_house", + "planet": "Sun", + "house_offset": 6, + "note": "Sun in 7th house" + } + ] + } + ], + "note": "" + }, + "effects": [ + "White patches on skin, vitiligo" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_theevrabuddhi_yoga", + "name": "Theevrabuddhi Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: theevrabuddhi_yoga()" + }, + { + "id": "bvr_thrikaala_gnana_yoga", + "name": "Thrikaala Gnana Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: thrikaala_gnana_yoga()" + }, + { + "id": "bvr_trilochana_yoga", + "name": "Trilochana Yoga", + "name_cn": "三眼瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-69", + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "planets_in_mutual_trines", + "planets": [ + "Sun", + "Moon", + "Mars" + ], + "note": "Sun, Moon and Mars are in mutual trines (trikona) from each other" + } + ], + "note": "Sun, Moon and Mars are in mutual trines (trikona) from each other" + }, + "effects": [ + "Adventurous, fiery nature, achieves goals through boldness" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-69" + }, + { + "id": "bvr_utthama_graha_yoga", + "name": "Utthama Griha Yoga", + "name_cn": "优质住宅瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "4th_lord_with_benefics", + "note": "4th lord joins benefics" + }, + { + "type": "4th_lord_aspected_by_benefics", + "note": "4th lord aspected by benefics" + }, + { + "type": "4th_lord_in_kendra_or_trikona", + "note": "4th lord in kendra or trikona" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Excellent house/property, comfortable living" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_vaatharoga_yoga", + "name": "Vaatharoga Yoga", + "name_cn": "风病瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "planet_in_lagna", + "planet": "Jupiter" + }, + { + "type": "planet_in_house", + "planet": "Saturn", + "house_offset": 6 + } + ] + }, + { + "type": "mars_in_5_7_9_with_malefic_moon_and_saturn_in_12", + "note": "Mars in 5/7/9, malefic moon, Saturn in 12th" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Vata diseases, rheumatism, nerve disorders" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_vakchalana_yoga", + "name": "Vakchalana Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: vakchalana_yoga()" + }, + { + "id": "bvr_vallaki_yoga", + "name": "Vallaki Yoga", + "name_cn": "七星散布瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-91", + "category": "nabhasa", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "planets_in_exactly_n_signs", + "n": 7, + "planets": [ + "Sun", + "Moon", + "Mars", + "Mercury", + "Jupiter", + "Venus", + "Saturn" + ], + "note": "7 visible planets occupy exactly 7 distinct signs" + } + ], + "note": "7 visible planets occupy exactly 7 distinct signs" + }, + "effects": [ + "Talented in music or fine arts, travels extensively" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-91" + }, + { + "id": "bvr_vamsacheda_yoga", + "name": "Vamsacheda Yoga", + "name_cn": "家系断绝瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "OR", + "conditions": [ + { + "type": "moon_in_10_venus_in_7_malefics_in_4", + "note": "Moon in 10th, Venus in 7th, malefics in 4th" + }, + { + "type": "moon_venus_in_7_malefics_in_4_and_10", + "note": "Moon and Venus in 7th, malefics in 4th and 10th" + } + ] + } + ], + "note": "" + }, + "effects": [ + "End of family lineage, no male heirs" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_vanchana_chora_bheethi_yoga", + "name": "Vanchana Chora Bheethi Yoga", + "name_cn": "欺骗盗贼恐惧瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-11", + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "malefic_in_lagna_or_gulika_in_trine_OR_gulika_with_kendra_trine_lord_OR_l1_with_rahu_sat_ket", + "note": "Lagna malefic/Gulika in trine OR Gulika with Kendra/Trine lords OR L1 with Rahu/Sat/Ket" + } + ], + "note": "Lagna malefic/Gulika in trine OR Gulika with Kendra/Trine lords OR L1 with Rahu/Sat/Ket" + }, + "effects": [ + "Fear of deception, theft; deceptive nature" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-11" + }, + { + "id": "bvr_vasumathi_yoga", + "name": "Vasumathi Yoga", + "name_cn": "善财瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-9", + "category": "dhana", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "benefics_in_upachaya_from_lagna_or_moon", + "planets": [ + "Jupiter", + "Venus", + "Mercury", + "Moon" + ], + "upachaya_houses": [ + 3, + 6, + 10, + 11 + ], + "note": "Benefics in Upachaya houses (3,6,10,11) from Lagna or Moon" + } + ], + "note": "Benefics in Upachaya houses (3,6,10,11) from Lagna or Moon" + }, + "effects": [ + "Wealthy, respected, generous" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-9" + }, + { + "id": "bvr_vichitra_saudha_prakara_yoga", + "name": "Vichitra Saudha Prakara Yoga", + "name_cn": "奇特宫殿瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "lords_4_and_10_conjunct_saturn_mars", + "note": "Lords of 4th and 10th conjoined with Saturn and Mars" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Wonderful and varied palaces/dwellings, luxury homes" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_vidyut_yoga", + "name": "Vidyut Yoga", + "name_cn": "闪电瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-59", + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "planet_deeply_exalted", + "planet": "11th_lord", + "note": "11th lord in deep exaltation" + }, + { + "type": "planet_conjunct_venus", + "planet": "11th_lord", + "note": "11th lord conjoins Venus" + }, + { + "type": "both_in_kendra_from_lagna_lord", + "note": "Both 11th lord and Venus in a quadrant from lagna lord" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Commands electricity/technology, sudden wealth, powerful" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-59" + }, + { + "id": "bvr_vimala_yoga", + "name": "Vimala Yoga", + "name_cn": "纯洁瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-107", + "category": "raja", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "lord_in_own_house", + "house": 12, + "note": "12th lord occupies the 12th house (Vipareeta Raja Yoga)" + } + ], + "note": "12th lord occupies the 12th house (Vipareeta Raja Yoga)" + }, + "effects": [ + "Virtuous, charitable, happy, liberated nature" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: BVR-107" + }, + { + "id": "bvr_vishaprayoga_yoga", + "name": "Vishaprayoga Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: vishaprayoga_yoga()" + }, + { + "id": "bvr_vrana_yoga", + "name": "Vrana Yoga", + "name_cn": "创伤瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "6th_lord_is_malefic", + "note": "6th lord is a natural malefic" + }, + { + "type": "6th_lord_in_lagna_8th_or_10th", + "note": "Malefic 6th lord in Lagna, 8th or 10th" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Wounds, injuries, scars on body" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_vyaya_malika_yoga", + "name": "Vyaya Malika Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: vyaya_malika_yoga()" + }, + { + "id": "bvr_yuddha_marana_yoga", + "name": "Yuddha Marana Yoga", + "name_cn": "战死瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "mars_lord_of_6th_or_8th", + "note": "Mars is lord of 6th or 8th" + }, + { + "type": "mars_conjunct_3rd_lord_and_rahu_saturn_or_mandi", + "note": "Mars conjoins 3rd lord and Rahu/Saturn/Mandi in cruel shashtiamsas" + } + ] + } + ], + "note": "" + }, + "effects": [ + "Death in battle or through weapons/violence" + ], + "strength": "rare", + "enabled": true, + "draft": false, + "evidence_note": "Source: B.V. Raman, BVR: None" + }, + { + "id": "bvr_yuddhatpaschaddrudha_yoga", + "name": "Yuddhatpaschaddrudha Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: yuddhatpaschaddrudha_yoga()" + }, + { + "id": "bvr_yuddhatpoorvadridhachitta_yoga", + "name": "Yuddhatpoorvadridhachitta Yoga Yoga", + "name_cn": "TBD", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "placeholder", + "note": "BVR definition: TBD", + "draft": true + }, + "effects": [ + "待补充" + ], + "strength": "待评估", + "enabled": false, + "draft": true, + "evidence_note": "From PyJhora function: yuddhatpoorvadridhachitta_yoga()" + }, + { + "id": "bvr_yukthi_samanwithavagmi_yoga", + "name": "Yukthi Samanwithavagmi Yoga", + "name_cn": "善辩瑜伽", + "source": "待查", + "bvr_id": null, + "category": "special", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "mercury_strong_in_kendra_or_trikona", + "note": "Mercury strong in kendra or trikona" + } + ], + "note": "Mercury well-placed for eloquence" + }, + "effects": [ + "Eloquent, skilled in debate, good communicator" + ], + "strength": "moderate", + "enabled": true, + "draft": false, + "evidence_note": "From PyJhora function: yukthi_samanwithavagmi_yoga()" + }, + { + "id": "bvr_103_guru_mangala_yoga", + "name": "Guru Mangala Yoga", + "name_cn": "木星火星瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "raja", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "planets_in_mutual_kendras_or_conjunction", + "planets": [ + "Jupiter", + "Mars" + ], + "note": "Jupiter and Mars in mutual kendras or in conjunction" + } + ], + "note": "Jupiter and Mars in mutual kendras or conjunction" + }, + "effects": [ + "Courage, wisdom, leadership, military success" + ], + "strength": "moderate", + "enabled": true, + "evidence_note": "From PyJhora: guru_mangala_yoga()" + }, + { + "id": "bvr_104_aputhra_yoga", + "name": "Aputhra Yoga", + "name_cn": "绝对无子瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "putra", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "compound", + "operator": "AND", + "conditions": [ + { + "type": "5th_lord_in_dusthana", + "note": "5th lord in 6th, 8th or 12th" + }, + { + "type": "jupiter_weak_or_afflicted", + "note": "Jupiter weak or afflicted" + }, + { + "type": "5th_house_occupied_by_malefics", + "note": "5th house occupied by malefics" + } + ] + } + ], + "note": "Strong indicators of childlessness" + }, + "effects": [ + "Complete childlessness, no progeny" + ], + "strength": "strong", + "enabled": true, + "evidence_note": "From PyJhora: aputhra_yoga()" + }, + { + "id": "bvr_105_chandra_mangala_yoga", + "name": "Chandra Mangala Yoga", + "name_cn": "月火合相瑜伽", + "source": "B.V. Raman", + "bvr_id": null, + "category": "raja", + "logic": { + "type": "compound_conditions", + "conditions": [ + { + "type": "planets_conjunct_in_same_house", + "planets": [ + "Moon", + "Mars" + ], + "note": "Moon and Mars in conjunction in any house" + } + ], + "note": "Moon and Mars conjunction" + }, + "effects": [ + "Wealth through property, emotional intensity, business acumen" + ], + "strength": "moderate", + "enabled": true, + "evidence_note": "From PyJhora: chandra_mangala_yoga() - distinct from chandra_mangala_same" + }, + { + "id": "bvr_106_indra_yoga", + "name": "Indra Yoga", + "name_cn": "因陀罗瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-64", + "category": "raja", + "logic": { + "type": "custom", + "expr": "l5 = lord(5); l11 = lord(11); (house_of(l5) == 11) and (house_of(l11) == 5) and (house_of('Moon') == 5)", + "combo_template": "5宫主{lord5}在11宫,11宫主{lord11}在5宫,月亮在第5宫" + }, + "effects": [ + "权力", + "财富", + "声望" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-64: Exchange between 5th and 11th lords, Moon in 5th" + }, + { + "id": "bvr_107_makuta_yoga", + "name": "Makuta Yoga", + "name_cn": "摩库塔瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-56", + "category": "raja", + "logic": { + "type": "custom", + "expr": "h9_lord = lord(9); h9_lord_h = house_of(h9_lord); jup_h = house_of('Jupiter'); sat_h = house_of('Saturn'); target_for_jup = ((h9_lord_h - 1 + 8) % 12) + 1; h9_from_jup = ((jup_h - 1 + 8) % 12) + 1; benefics = {'Jupiter', 'Venus', 'Mercury', 'Moon'}; planets_in_h9_jup = [p for p, info in ctx.planets.items() if info.get('house') == h9_from_jup]; (sat_h == 10) and (jup_h == target_for_jup) and any(p in benefics for p in planets_in_h9_jup)", + "combo_template": "土星在第10宫,木星在9宫主的第9宫,木星的第9宫有吉星" + }, + "effects": [ + "财富", + "权力", + "长寿" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-56: Saturn in 10th, Jupiter 9th from 9th lord, benefic 9th from Jupiter" + }, + { + "id": "bvr_108_jaya_yoga", + "name": "Jaya Yoga", + "name_cn": "胜利瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-58", + "category": "raja", + "logic": { + "type": "custom", + "expr": "exalted(lord(10)) and debil(lord(6))", + "combo_template": "10宫主{lord10}庙旺,6宫主{lord6}落陷" + }, + "effects": [ + "胜利", + "克服困难", + "权力" + ], + "strength": "强", + "enabled": true, + "source_reference": "BVR-58: 10th lord in deep exaltation, 6th lord debilitated" + }, + { + "id": "bvr_109_putra_malika_yoga", + "name": "Putra Malika Yoga", + "name_cn": "子嗣珠串瑜伽", + "source": "B.V. Raman", + "bvr_id": "BVR-36", + "category": "putra", + "logic": { + "type": "custom", + "expr": "start = 5; target = set(((start - 1 + i) % 12) + 1 for i in range(7)); classical = ['Sun', 'Moon', 'Mars', 'Mercury', 'Jupiter', 'Venus', 'Saturn']; occupied = set(); ok = True;\nfor p in classical:\n h = house_of(p)\n if h in target:\n occupied.add(h)\n else:\n ok = False; break\nok and len(occupied) == 7", + "combo_template": "从第5宫开始的连续7个宫位各有古典行星" + }, + "effects": [ + "多子", + "后代繁荣", + "家族延续" + ], + "strength": "中", + "enabled": true, + "source_reference": "BVR-36: Malika Yoga starting from 5th house" + } + ], + "total_enabled_rules": 379 +} \ No newline at end of file diff --git a/scripts/_compute_one_chart.py b/scripts/_compute_one_chart.py new file mode 100644 index 00000000..5c4b6dfd --- /dev/null +++ b/scripts/_compute_one_chart.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 +"""用PyJhora计算单张星盘的Yoga列表 - 被build_standard_test_charts.py调用""" +import sys, json, os, datetime, io + +# 抑制PyJhora的所有输出(stdout + stderr + logging) +class SuppressAll: + def __enter__(self): + self._stdout = sys.stdout + self._stderr = sys.stderr + sys.stdout = io.StringIO() + sys.stderr = io.StringIO() + return self + def __exit__(self, *a): + sys.stdout = self._stdout + sys.stderr = self._stderr + +try: + with SuppressAll(): + from jhora.horoscope.chart import yoga as yoga_mod + from jhora.panchanga.drik import Place + import jhora.utils as utils + PYJHORA_OK = True +except Exception as e: + PYJHORA_OK = False + IMPORT_ERR = str(e) + +def tz_to_float(tz_str): + """将 +05:30 格式转为 5.5 小时浮点数""" + tz_str = tz_str.strip() + sign = -1 if tz_str.startswith('-') else 1 + tz_str = tz_str.lstrip('+-') + parts = tz_str.split(':') + hours = int(parts[0]) + minutes = int(parts[1]) if len(parts) > 1 else 0 + return sign * (hours + minutes / 60.0) + +def compute_yogas(chart): + """计算给定星盘的所有Yoga""" + if not PYJHORA_OK: + return {"error": f"PyJhora import failed: {IMPORT_ERR}"} + try: + with SuppressAll(): + # 构造Place对象(timezone是浮点数小时) + tz = tz_to_float(chart["tz"]) + place = Place(chart["city"], chart["lat"], chart["lon"], tz) + + # 构造datetime并转JD + date_str = chart["date"] + " " + chart["time"] + if date_str.count(':') == 1: + date_str += ":00" + dt = datetime.datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S") + jd = utils.gregorian_to_jd(dt) + + # 计算 D1/Rasi Yoga。v2 逻辑正确性验证必须与 Skill 的 D1 Yoga 引擎逐层对齐; + # 不能使用 get_yoga_details_for_all_charts(),否则会把 D2/D9/D10 等分盘 Yoga 混入, + # 造成大量“Skill 漏检”的假阴性。 + result = yoga_mod.get_yoga_details(jd, place, divisional_chart_factor=1) + yogas = list(result[0].keys()) if result and len(result) > 0 else [] + + return {"yogas": yogas, "count": len(yogas), "status": "ok"} + except Exception as e: + return {"error": str(e)} + +if __name__ == "__main__": + if len(sys.argv) >= 2: + chart = json.loads(sys.argv[1]) + else: + # Read from stdin + raw = sys.stdin.read() + if not raw.strip(): + print(json.dumps({"error": "No chart data"})) + sys.exit(1) + chart = json.loads(raw) + result = compute_yogas(chart) + # 最后一行必须是纯净JSON + print(json.dumps(result, ensure_ascii=False)) diff --git a/scripts/add_high_confidence_yogas_batch1.py b/scripts/add_high_confidence_yogas_batch1.py new file mode 100644 index 00000000..d69ae9cf --- /dev/null +++ b/scripts/add_high_confidence_yogas_batch1.py @@ -0,0 +1,234 @@ +#!/usr/bin/env python3 +""" +高置信缺失 Yoga 第一批补齐。 +原则: +- 只添加 PyJHora/B.V. Raman 中定义清晰、能用当前引擎稳定表达的 Yoga。 +- 避免依赖未实现技法、模糊前提或过度推断。 +- 对 Aakriti/Nabhasa 类使用可解释的 all_in_houses / occupied_houses_exact 等结构化条件。 +""" +from __future__ import annotations + +import json +from collections import Counter +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +RULES = ROOT / "references" / "yoga_rules.json" + + +def rule(rid, name, name_cn, category, logic, effects, strength="中", bvr_id=None, dedup_key=None): + item = { + "id": rid, + "name": name, + "name_cn": name_cn, + "source": "B.V. Raman / PyJHora", + "bvr_id": bvr_id, + "category": category, + "logic": logic, + "effects": effects, + "strength": strength, + "enabled": True, + "accuracy_note": "高置信:定义来自 PyJHora/B.V. Raman,且可由当前 Yoga 引擎结构化条件表达。", + } + if dedup_key: + item["dedup_key"] = dedup_key + return item + +VISIBLE = "visible" + +BATCH = [ + # ── Sun/Moon classic BVR yogas: 修正/补齐精确定义 ── + rule( + "bvr_016_vesi_precise", "Vesi Yoga", "日后行星 Yoga(精确)", "surya", + {"type": "has_planet_in_house", "planets": {"role": "set", "planets": ["Sun", "Mars", "Mercury", "Jupiter", "Venus", "Saturn", "Rahu", "Ketu"]}, "house": 2, + "combo_template": "太阳的第2宫有除月亮外行星:{planets}"}, + ["太阳后方有行星支持", "表达力与行动力增强", "自我驱动力较强"], "中", "BVR-16", "vesi_precise" + ), + rule( + "bvr_017_vosi_precise", "Vosi Yoga", "日前行星 Yoga(精确)", "surya", + {"type": "has_planet_in_house", "planets": {"role": "set", "planets": ["Sun", "Mars", "Mercury", "Jupiter", "Venus", "Saturn", "Rahu", "Ketu"]}, "house": 12, + "combo_template": "太阳的第12宫有除月亮外行星:{planets}"}, + ["太阳前方有行星铺垫", "内在准备力强", "重视计划与隐性资源"], "中", "BVR-17", "vosi_precise" + ), + rule( + "bvr_018_ubhayachara_precise", "Ubhayachara Yoga", "太阳双伴 Yoga(精确)", "surya", + {"type": "and", "conditions": [ + {"type": "has_planet_in_house", "planets": {"role": "set", "planets": ["Sun", "Mars", "Mercury", "Jupiter", "Venus", "Saturn", "Rahu", "Ketu"]}, "house": 2}, + {"type": "has_planet_in_house", "planets": {"role": "set", "planets": ["Sun", "Mars", "Mercury", "Jupiter", "Venus", "Saturn", "Rahu", "Ketu"]}, "house": 12}, + ]}, + ["太阳前后均有行星支撑", "自我表达较完整", "行动前后资源较足"], "强", "BVR-18", "ubhayachara_precise" + ), + rule( + "bvr_002_sunapha_precise", "Sunaphaa Yoga", "月后行星 Yoga(精确)", "chandra", + {"type": "has_planet_in_house", "planets": {"role": "set", "planets": ["Moon", "Mars", "Mercury", "Jupiter", "Venus", "Saturn", "Rahu", "Ketu"]}, "house": 2, + "combo_template": "月亮的第2宫有除太阳外行星:{planets}"}, + ["自力更生", "资源积累能力", "心智有后续支撑"], "中", "BVR-2", "sunapha_precise" + ), + rule( + "bvr_003_anapha_precise", "Anaphaa Yoga", "月前行星 Yoga(精确)", "chandra", + {"type": "has_planet_in_house", "planets": {"role": "set", "planets": ["Moon", "Mars", "Mercury", "Jupiter", "Venus", "Saturn", "Rahu", "Ketu"]}, "house": 12, + "combo_template": "月亮的第12宫有除太阳外行星:{planets}"}, + ["心智有背景支持", "贵人或隐性资源", "独处中成长"], "中", "BVR-3", "anapha_precise" + ), + rule( + "bvr_004_duradhara_precise", "Duradhara Yoga", "月亮双伴 Yoga(精确)", "chandra", + {"type": "and", "conditions": [ + {"type": "has_planet_in_house", "planets": {"role": "set", "planets": ["Moon", "Mars", "Mercury", "Jupiter", "Venus", "Saturn", "Rahu", "Ketu"]}, "house": 2}, + {"type": "has_planet_in_house", "planets": {"role": "set", "planets": ["Moon", "Mars", "Mercury", "Jupiter", "Venus", "Saturn", "Rahu", "Ketu"]}, "house": 12}, + ]}, + ["月亮前后均有支撑", "心智稳定性增强", "资源与适应力较强"], "强", "BVR-4", "duradhara_precise" + ), + + # ── Dala Yogas ── + rule( + "bvr_101_maalaa", "Maalaa Yoga", "花环 Yoga", "nabhasa", + {"type": "and", "conditions": [ + {"type": "has_planet_in_house", "planets": "benefics", "house": 1}, + {"type": "has_planet_in_house", "planets": "benefics", "house": 4}, + {"type": "has_planet_in_house", "planets": "benefics", "house": 7}, + ]}, + ["吉星占据三个角宫", "名誉与舒适度提高", "人缘与社会支持强"], "强", "BVR-101", "maalaa" + ), + rule( + "bvr_101_srik", "Srik Yoga", "吉祥花环 Yoga", "nabhasa", + {"type": "and", "conditions": [ + {"type": "has_planet_in_house", "planets": "benefics", "house": 1}, + {"type": "has_planet_in_house", "planets": "benefics", "house": 4}, + {"type": "has_planet_in_house", "planets": "benefics", "house": 7}, + ]}, + ["同 Maalaa Yoga:吉星角宫支撑", "生活质量与声誉提升"], "强", "BVR-101", "maalaa" + ), + rule( + "bvr_102_sarpa", "Sarpa Yoga", "蛇 Yoga", "nabhasa", + {"type": "and", "conditions": [ + {"type": "has_planet_in_house", "planets": "malefics", "house": 1}, + {"type": "has_planet_in_house", "planets": "malefics", "house": 4}, + {"type": "has_planet_in_house", "planets": "malefics", "house": 7}, + ]}, + ["凶星占据三个角宫", "压力与竞争显著", "人生推进常伴随阻力"], "弱", "BVR-102", "sarpa_dala" + ), + + # ── Aakriti/Nabhasa:所有可见行星占据特定宫位集合 ── + rule("bvr_081_gadaa", "Gadaa Yoga", "锤杵 Yoga", "nabhasa", + {"type": "occupied_houses_exact_sets", "planets": VISIBLE, "house_sets": [[1, 4], [4, 7], [7, 10], [1, 10]], + "combo_template": "七曜只占据相邻角宫组合:{houses}"}, + ["行星集中于两个相邻角宫", "人生方向集中", "行动与稳定主题强"], "中", "BVR-81"), + rule("bvr_082_sakata_aakriti", "Sakata Yoga", "车轮 Yoga(形态)", "nabhasa", + {"type": "occupied_houses_exact", "planets": VISIBLE, "houses": [1, 7], "combo_template": "七曜只占据1/7宫轴线"}, + ["行星集中在1/7轴线", "自我与关系主题强烈", "人生起伏感较明显"], "中", "BVR-82", "sakata_aakriti"), + rule("bvr_083_vihanga", "Vihanga Yoga", "飞鸟 Yoga(形态)", "nabhasa", + {"type": "occupied_houses_exact", "planets": VISIBLE, "houses": [4, 10], "combo_template": "七曜只占据4/10宫轴线"}, + ["家庭与事业轴线突出", "迁移/职业方向强", "生活重心两极化"], "中", "BVR-83", "vihanga"), + rule("bvr_084_vajra", "Vajra Yoga", "金刚 Yoga(精确)", "nabhasa", + {"type": "and", "conditions": [ + {"type": "has_planet_in_house", "planets": "benefics", "house": 1}, + {"type": "has_planet_in_house", "planets": "benefics", "house": 7}, + {"type": "has_planet_in_house", "planets": "malefics", "house": 4}, + {"type": "has_planet_in_house", "planets": "malefics", "house": 10}, + ]}, + ["1/7有吉星、4/10有凶星", "外在人际较顺、内外责任压力强", "刚柔并存"], "中", "BVR-84", "vajra_precise"), + rule("bvr_085_yava", "Yava Yoga", "大麦 Yoga(精确)", "nabhasa", + {"type": "and", "conditions": [ + {"type": "has_planet_in_house", "planets": "malefics", "house": 1}, + {"type": "has_planet_in_house", "planets": "malefics", "house": 7}, + {"type": "has_planet_in_house", "planets": "benefics", "house": 4}, + {"type": "has_planet_in_house", "planets": "benefics", "house": 10}, + ]}, + ["1/7有凶星、4/10有吉星", "竞争中获得支撑", "内在资源与事业支持较好"], "中", "BVR-85", "yava_precise"), + rule("bvr_086_sringaataka", "Sringaataka Yoga", "三角峰 Yoga", "nabhasa", + {"type": "occupied_houses_exact", "planets": VISIBLE, "houses": [1, 5, 9], "combo_template": "七曜只占据1/5/9三方宫"}, + ["行星集中三方宫", "才华、信念与命运主题强", "创造力与精神性较强"], "强", "BVR-86"), + rule("bvr_087_hala", "Hala Yoga", "犁 Yoga", "nabhasa", + {"type": "occupied_houses_exact_sets", "planets": VISIBLE, "house_sets": [[2, 6, 10], [3, 7, 11], [4, 8, 12]], + "combo_template": "七曜只占据互为三方但非1/5/9的组合:{houses}"}, + ["行星集中于互为三方的实务轴", "劳动、组织与现实推进主题强"], "中", "BVR-87"), + rule("bvr_088_kamala", "Kamala Yoga", "莲花 Yoga", "nabhasa", + {"type": "all_in_houses", "planets": VISIBLE, "houses": [1, 4, 7, 10], "combo_template": "七曜全部落入角宫"}, + ["七曜均在角宫", "人生显化力强", "外在事件密集且影响明显"], "强", "BVR-88"), + rule("bvr_089_vaapi", "Vaapi Yoga", "水池 Yoga", "nabhasa", + {"type": "all_in_house_sets", "planets": VISIBLE, "house_sets": [[2, 5, 8, 11], [3, 6, 9, 12]], + "combo_template": "七曜全部落入Panapara或Apoklima宫:{houses}"}, + ["行星集中于续宫或果宫", "资源积累/适应环境主题强", "人生节奏较非线性"], "中", "BVR-89"), + + # ── Sankhya / sequence groups ── + rule("bvr_071_yoopa_precise", "Yoopa Yoga", "祭柱 Yoga(精确)", "nabhasa", + {"type": "all_in_houses", "planets": VISIBLE, "houses": [1, 2, 3, 4], "combo_template": "七曜全部落入1-4宫"}, + ["行星集中于生命早期与基础宫位", "重视家庭、学习与根基"], "中", "BVR-71", "yoopa_precise"), + rule("bvr_072_sara", "Sara Yoga", "箭 Yoga", "nabhasa", + {"type": "all_in_houses", "planets": VISIBLE, "houses": [4, 5, 6, 7], "combo_template": "七曜全部落入4-7宫"}, + ["家庭、创造、工作与关系轴线突出", "人生重心偏向互动与服务"], "中", "BVR-72"), + rule("bvr_072_ishu", "Ishu Yoga", "箭矢 Yoga", "nabhasa", + {"type": "all_in_houses", "planets": VISIBLE, "houses": [4, 5, 6, 7], "combo_template": "七曜全部落入4-7宫"}, + ["同 Sara Yoga:行动目标集中", "关系和现实事务牵引强"], "中", "BVR-72", "sara_ishu"), + rule("bvr_073_sakti", "Sakti Yoga", "力量 Yoga", "nabhasa", + {"type": "all_in_houses", "planets": VISIBLE, "houses": [7, 8, 9, 10], "combo_template": "七曜全部落入7-10宫"}, + ["关系、转化、信念与事业宫位集中", "社会行动力强"], "中", "BVR-73"), + rule("bvr_074_danda", "Danda Yoga", "杖 Yoga", "nabhasa", + {"type": "all_in_houses", "planets": VISIBLE, "houses": [10, 11, 12, 1], "combo_template": "七曜全部落入10-12与1宫"}, + ["事业、社群、隐性消耗与自我主题集中", "责任感与压力并存"], "中", "BVR-74"), + rule("bvr_075_naukaa_precise", "Naukaa Yoga", "船 Yoga(精确)", "nabhasa", + {"type": "custom", "expr": "all(house_of(p) in [1,2,3,4,5,6,7] for p in ['Sun','Moon','Mars','Mercury','Jupiter','Venus','Saturn']) and all(len([p for p in ['Sun','Moon','Mars','Mercury','Jupiter','Venus','Saturn'] if house_of(p)==h])>0 for h in [1,2,3,4,5,6,7])", + "combo_template": "七曜分别占据从命宫起连续七宫"}, + ["七曜覆盖命宫起连续七宫", "人生像船行水面:移动、适应、串联能力强"], "中", "BVR-75", "naukaa_precise"), + rule("bvr_076_koota_precise", "Koota Yoga", "堡垒 Yoga(精确)", "nabhasa", + {"type": "custom", "expr": "all(house_of(p) in [4,5,6,7,8,9,10] for p in ['Sun','Moon','Mars','Mercury','Jupiter','Venus','Saturn']) and all(len([p for p in ['Sun','Moon','Mars','Mercury','Jupiter','Venus','Saturn'] if house_of(p)==h])>0 for h in [4,5,6,7,8,9,10])", + "combo_template": "七曜分别占据从4宫起连续七宫"}, + ["七曜覆盖4宫起连续七宫", "防御、结构、家族与社会位置主题强"], "中", "BVR-76", "koota_precise"), + rule("bvr_077_chatra_precise", "Chatra Yoga", "伞盖 Yoga(精确)", "nabhasa", + {"type": "custom", "expr": "all(house_of(p) in [7,8,9,10,11,12,1] for p in ['Sun','Moon','Mars','Mercury','Jupiter','Venus','Saturn']) and all(len([p for p in ['Sun','Moon','Mars','Mercury','Jupiter','Venus','Saturn'] if house_of(p)==h])>0 for h in [7,8,9,10,11,12,1])", + "combo_template": "七曜分别占据从7宫起连续七宫"}, + ["七曜覆盖7宫起连续七宫", "关系、公众、远方与事业主题强"], "中", "BVR-77", "chatra_precise"), + rule("bvr_078_chaapa_precise", "Chaapa Yoga", "弓 Yoga(精确)", "nabhasa", + {"type": "custom", "expr": "all(house_of(p) in [10,11,12,1,2,3,4] for p in ['Sun','Moon','Mars','Mercury','Jupiter','Venus','Saturn']) and all(len([p for p in ['Sun','Moon','Mars','Mercury','Jupiter','Venus','Saturn'] if house_of(p)==h])>0 for h in [10,11,12,1,2,3,4])", + "combo_template": "七曜分别占据从10宫起连续七宫"}, + ["七曜覆盖10宫起连续七宫", "事业拉弓、目标推进与公众行动力强"], "中", "BVR-78", "chaapa_precise"), + + # ── Dhana / Malika 类:宫主/宫位链条定义明确 ── + rule("bvr_bhagya_malika", "Bhagya Malika Yoga", "幸运花环 Yoga", "dhana", + {"type": "custom", "expr": "all(house_of(lord(h)) in [9,10,11] for h in [9,10,11] if lord(h) in planets_list())", + "combo_template": "9/10/11宫主形成幸运与事业收益链"}, + ["幸运、事业与收益宫主形成连续支撑", "贵人、事业与收入联动"], "强", None), + rule("bvr_dhana_malika", "Dhana Malika Yoga", "财富花环 Yoga", "dhana", + {"type": "custom", "expr": "all(house_of(lord(h)) in [2,5,9,11] for h in [2,5,9,11] if lord(h) in planets_list())", + "combo_template": "2/5/9/11宫主形成财富链"}, + ["财富宫、才华宫、幸运宫、收益宫主互相支撑", "财富积累力增强"], "强", None), + rule("bvr_lagna_malika", "Lagna Malika Yoga", "命宫花环 Yoga", "raja", + {"type": "custom", "expr": "all(house_of(lord(h)) in [1,2,3,4] for h in [1,2,3,4] if lord(h) in planets_list())", + "combo_template": "1-4宫主形成命宫基础链"}, + ["自我、财富、努力、根基彼此支撑", "基础发展稳定"], "中", None), + rule("bvr_karma_malika_precise", "Karma Malika Yoga", "事业花环 Yoga(精确)", "raja", + {"type": "custom", "expr": "all(house_of(lord(h)) in [10,11,12,1] for h in [10,11,12,1] if lord(h) in planets_list())", + "combo_template": "10/11/12/1宫主形成事业闭环"}, + ["事业、收益、远方/隐性成本与自我形成闭环", "职业使命感强"], "中", None, "karma_malika_precise"), +] + + +def main(): + data = json.loads(RULES.read_text(encoding="utf-8")) + existing = {r["id"] for r in data["rules"]} + existing_names = {(r.get("name"), r.get("dedup_key")) for r in data["rules"]} + added = [] + skipped = [] + for item in BATCH: + if item["id"] in existing: + skipped.append(item["id"]) + continue + data["rules"].append(item) + existing.add(item["id"]) + added.append(item["id"]) + + data["total_rules"] = len(data["rules"]) + RULES.write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8") + + print(f"added={len(added)} skipped={len(skipped)} total={len(data['rules'])}") + print("added ids:") + for rid in added: + print(" ", rid) + cats = Counter(r["category"] for r in data["rules"]) + print("categories top:") + for k, v in cats.most_common(8): + print(f" {k}: {v}") + + +if __name__ == "__main__": + main() diff --git a/scripts/benchmark_yoga_coverage.py b/scripts/benchmark_yoga_coverage.py new file mode 100644 index 00000000..c24e5149 --- /dev/null +++ b/scripts/benchmark_yoga_coverage.py @@ -0,0 +1,245 @@ +#!/usr/bin/env python3 +""" +Yoga 覆盖率 benchmark:对比当前 skill JSON 规则库与 PyJHora yoga.py。 + +目标: +1. 统计当前 references/yoga_rules.json 规则数量和分类分布 +2. 若本机存在 PyJHora 安装,提取 jhora.horoscope.chart.yoga.py 中的唯一 Yoga 名称 +3. 用名称归一化 + alias 表做近似覆盖匹配 +4. 输出覆盖率、疑似缺失项和疑似重复项,作为后续补规则依据 + +说明: +- 这是覆盖 benchmark,不判断每条规则的数学条件是否与 PyJHora 完全等价。 +- PyJHora 大量函数是同一 Yoga 的编号变体;本脚本会把函数名归一为唯一 Yoga 名称。 +""" +from __future__ import annotations + +import argparse +import json +import os +import re +import sys +from collections import Counter, defaultdict +from pathlib import Path +from typing import Iterable + +SKILL_ROOT = Path(__file__).resolve().parents[1] +RULES_FILE = SKILL_ROOT / "references" / "yoga_rules.json" + +# 常见拼写/转写差异。左侧为 PyJHora normalized key,右侧为 skill 中的可能 normalized key。 +ALIASES = { + "sasa": {"shasha", "sasha"}, + "maalavya": {"malavya"}, + "maalaa": {"mala"}, + "maala": {"mala"}, + "gadaa": {"gada"}, + "kedaara": {"kedara"}, + "naukaa": {"nauka"}, + "chaapa": {"chapa"}, + "kaahala": {"kahala"}, + "kalaanidhi": {"kalanidhi"}, + "sreenaatha": {"sreenatha", "srinatha"}, + "vasumathi": {"vasumati"}, + "subha": {"shubha"}, + "dharidhra": {"daridra"}, + "budha_aditya": {"budhaditya", "nipuna"}, + "chandra_mangala": {"chandra_mangal"}, + "gaja_kesari": {"gajakesari"}, + "harihara_brahma": {"harihara_brahma", "hari_hara_brahma"}, + "siva": {"shiva"}, + "vesi": {"vesi"}, + "vosi": {"vosi"}, + "sunaphaa": {"sunapha"}, + "anaphaa": {"anapha"}, + "ubhayachara": {"ubhayachari"}, + "duradhara": {"duradhara"}, +} + +SKIP_FUNCTIONS = { + "get_yoga_resources", + "get_yoga_details", + "get_yoga_details_for_all_charts", + "grihanasa_yoga_planet_positions", + "are_lords_exchanged", +} + + +def normalize_name(name: str) -> str: + """Normalize Yoga names for approximate matching.""" + s = name.lower() + s = re.sub(r"\([^)]*\)", " ", s) + s = s.replace("&", " and ") + s = re.sub(r"[^a-z0-9]+", "_", s) + s = re.sub(r"_+", "_", s).strip("_") + for suffix in ("_yoga", "_graha", "_classic", "_calculation", "_calc"): + if s.endswith(suffix): + s = s[: -len(suffix)] + s = re.sub(r"_\d+$", "", s) + return s + + +def extract_skill_names(rules: list[dict]) -> tuple[set[str], dict[str, list[str]]]: + keys: set[str] = set() + reverse: dict[str, list[str]] = defaultdict(list) + for rule in rules: + raw_names = [rule.get("name", ""), rule.get("name_cn", ""), rule.get("id", "")] + for raw in raw_names: + key = normalize_name(raw) + if not key: + continue + keys.add(key) + reverse[key].append(rule.get("id", "?")) + # 对英文名进一步拆出核心 token 组合,处理 “Gaja Kesari Yoga (Classic)” 这类名称 + en = rule.get("name", "") + key = normalize_name(en) + if key: + parts = [p for p in key.split("_") if p not in {"yoga", "classic", "from", "lord", "lords", "combination"}] + if parts: + compact = "_".join(parts[:3]) + keys.add(compact) + reverse[compact].append(rule.get("id", "?")) + return keys, reverse + + +def extract_pyjhora_names(pyjhora_yoga_file: Path) -> set[str]: + content = pyjhora_yoga_file.read_text(encoding="utf-8", errors="ignore") + funcs = re.findall(r"^def ([a-zA-Z_][a-zA-Z0-9_]*)\(", content, re.MULTILINE) + names: set[str] = set() + for fn in funcs: + if fn in SKIP_FUNCTIONS: + continue + if fn.startswith("_"): + # PyJHora 的内部 calculation 函数大多也是 Yoga;保留 *_yoga*_calculation + if "yoga" not in fn: + continue + if "_from_" in fn or "_get_" in fn or "_is_" in fn: + continue + base = fn + base = re.sub(r"^_+", "", base) + base = base.replace("_calculation", "").replace("_calc", "") + base = re.sub(r"_\d+$", "", base) + if base.endswith("_yoga"): + base = base[:-5] + key = normalize_name(base) + if key and key not in SKIP_FUNCTIONS: + names.add(key) + return names + + +def find_pyjhora_yoga_file(explicit: str | None = None) -> Path | None: + if explicit: + p = Path(explicit).expanduser().resolve() + return p if p.exists() else None + + candidates: list[Path] = [] + for root in sys.path: + if not root: + continue + p = Path(root) / "jhora" / "horoscope" / "chart" / "yoga.py" + if p.exists(): + candidates.append(p) + + # 常见 WorkBuddy isolated venv 位置 + home = Path.home() + candidates.extend(home.glob(".workbuddy/binaries/python/envs/*/lib/python*/site-packages/jhora/horoscope/chart/yoga.py")) + + return candidates[0] if candidates else None + + +def covered(py_key: str, skill_keys: set[str]) -> bool: + if py_key in skill_keys: + return True + compact_py = py_key.replace("_", "") + compact_skill = {k.replace("_", "") for k in skill_keys} + if compact_py in compact_skill: + return True + for alias in ALIASES.get(py_key, set()): + if alias in skill_keys or alias.replace("_", "") in compact_skill: + return True + return False + + +def main() -> int: + parser = argparse.ArgumentParser(description="Benchmark Yoga coverage against PyJHora yoga.py") + parser.add_argument("--pyjhora-yoga-file", help="Path to PyJHora jhora/horoscope/chart/yoga.py") + parser.add_argument("--json", action="store_true", help="Output machine-readable JSON") + parser.add_argument("--show-missing", type=int, default=60, help="How many missing items to display") + args = parser.parse_args() + + data = json.loads(RULES_FILE.read_text(encoding="utf-8")) + all_rules = data.get("rules", []) + rules = [r for r in all_rules if r.get("enabled", True)] + ids = [r.get("id") for r in all_rules] + dup_ids = sorted([i for i, c in Counter(ids).items() if c > 1]) + categories = Counter(r.get("category", "unknown") for r in rules) + strength_values = Counter(r.get("strength", "?") for r in rules) + + skill_keys, skill_reverse = extract_skill_names(rules) + + pyjhora_file = find_pyjhora_yoga_file(args.pyjhora_yoga_file) + py_names: set[str] = set() + missing: list[str] = [] + coverage_pct = None + if pyjhora_file: + py_names = extract_pyjhora_names(pyjhora_file) + missing = sorted([name for name in py_names if not covered(name, skill_keys)]) + coverage_pct = round((len(py_names) - len(missing)) / len(py_names) * 100, 2) if py_names else None + + result = { + "rules_file": str(RULES_FILE), + "total_rules": len(all_rules), + "enabled_rules": len(rules), + "disabled_rules": len(all_rules) - len(rules), + "declared_total_rules": data.get("total_rules"), + "declared_total_enabled_rules": data.get("total_enabled_rules"), + "schema_version": data.get("schema_version"), + "duplicate_ids": dup_ids, + "categories": dict(categories.most_common()), + "strength_values": dict(strength_values), + "skill_normalized_name_keys": len(skill_keys), + "pyjhora_yoga_file": str(pyjhora_file) if pyjhora_file else None, + "pyjhora_unique_yoga_names": len(py_names) if pyjhora_file else None, + "matched_unique_yoga_names": (len(py_names) - len(missing)) if pyjhora_file else None, + "coverage_pct": coverage_pct, + "missing_count": len(missing) if pyjhora_file else None, + "missing": missing, + } + + if args.json: + print(json.dumps(result, ensure_ascii=False, indent=2)) + return 0 + + print("🧘 Yoga Coverage Benchmark") + print("=" * 60) + print(f"规则文件: {RULES_FILE}") + print(f"Schema: {data.get('schema_version')}") + print(f"规则总数: {len(all_rules)} (enabled={len(rules)}, disabled={len(all_rules) - len(rules)}, declared={data.get('total_rules')})") + print(f"重复 ID: {len(dup_ids)}" + (f" → {dup_ids}" if dup_ids else " ✅")) + print(f"Strength 值: {dict(strength_values)}") + print("\n分类统计:") + for cat, count in categories.most_common(): + print(f" {cat:16s} {count:3d}") + + print("\nPyJHora 对比:") + if not pyjhora_file: + print(" 未找到 PyJHora yoga.py;仅完成本地 JSON 统计。") + print(" 可用 --pyjhora-yoga-file 指定路径。") + else: + print(f" yoga.py: {pyjhora_file}") + print(f" PyJHora 唯一 Yoga 名称: {len(py_names)}") + print(f" 已匹配: {len(py_names) - len(missing)}") + print(f" 疑似缺失: {len(missing)}") + print(f" 名称覆盖率: {coverage_pct}%") + if missing: + print(f"\n疑似缺失 Top {min(args.show_missing, len(missing))}:") + for i, name in enumerate(missing[: args.show_missing], 1): + print(f" {i:3d}. {name}") + if len(missing) > args.show_missing: + print(f" ... 还有 {len(missing) - args.show_missing} 条") + + print("\n说明: 此 benchmark 为名称覆盖率,不等同于逐条数学逻辑等价验证。") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/build_standard_test_charts.py b/scripts/build_standard_test_charts.py new file mode 100644 index 00000000..6e3b5887 --- /dev/null +++ b/scripts/build_standard_test_charts.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python3 +"""生成标准验证星盘数据集 - 60张名人星盘 + PyJhora D1/Rasi Yoga验证结果""" +import json, os, subprocess, sys + +PYJHORA = "/Users/wuyongnaren/.workbuddy/binaries/python/envs/pyjhora-benchmark/bin/python" +HELPER = os.path.join(os.path.dirname(os.path.abspath(__file__)), "_compute_one_chart.py") + +CELEBRITY_CHARTS = [ + # 科学 (10) + {"name": "Albert Einstein", "date": "1879-03-14", "time": "11:30", "tz": "+01:00", "lat": 48.4011, "lon": 9.9876, "city": "Ulm, Germany"}, + {"name": "Marie Curie", "date": "1867-11-07", "time": "12:00", "tz": "+01:00", "lat": 52.2297, "lon": 21.0122, "city": "Warsaw, Poland"}, + {"name": "Nikola Tesla", "date": "1856-07-10", "time": "00:00", "tz": "+01:00", "lat": 44.5686, "lon": 15.3790, "city": "Smiljan, Croatia"}, + {"name": "Stephen Hawking", "date": "1942-01-08", "time": "00:00", "tz": "+00:00", "lat": 51.7520, "lon": -1.2577, "city": "Oxford, UK"}, + {"name": "Charles Darwin", "date": "1809-02-12", "time": "03:00", "tz": "+00:00", "lat": 52.7073, "lon": -2.7553, "city": "Shrewsbury, UK"}, + {"name": "Thomas Edison", "date": "1847-02-11", "time": "23:59", "tz": "-05:00", "lat": 41.2995, "lon": -82.6052, "city": "Milan, USA"}, + {"name": "Alexander Fleming", "date": "1881-08-06", "time": "03:00", "tz": "+00:00", "lat": 55.6100, "lon": -4.2886, "city": "Darvel, UK"}, + {"name": "Max Planck", "date": "1858-04-23", "time": "10:00", "tz": "+01:00", "lat": 54.3233, "lon": 10.1228, "city": "Kiel, Germany"}, + {"name": "Niels Bohr", "date": "1885-10-07", "time": "11:30", "tz": "+01:00", "lat": 55.6761, "lon": 12.5683, "city": "Copenhagen, Denmark"}, + {"name": "Richard Feynman", "date": "1918-05-11", "time": "13:47", "tz": "-05:00", "lat": 40.7282, "lon": -73.7949, "city": "Queens, USA"}, + # 政治 (10) + {"name": "Mahatma Gandhi", "date": "1869-10-02", "time": "07:12", "tz": "+05:30", "lat": 21.6270, "lon": 72.9480, "city": "Porbandar, India"}, + {"name": "Jawaharlal Nehru", "date": "1889-11-14", "time": "23:30", "tz": "+05:30", "lat": 25.5941, "lon": 77.6232, "city": "Allahabad, India"}, + {"name": "Narendra Modi", "date": "1950-09-17", "time": "11:00", "tz": "+05:30", "lat": 23.1702, "lon": 72.8311, "city": "Vadnagar, India"}, + {"name": "Indira Gandhi", "date": "1917-11-19", "time": "23:15", "tz": "+05:30", "lat": 25.5941, "lon": 77.6232, "city": "Allahabad, India"}, + {"name": "Winston Churchill", "date": "1874-11-30", "time": "01:30", "tz": "+00:00", "lat": 51.8415, "lon": -1.3610, "city": "Blenheim Palace, UK"}, + {"name": "John F. Kennedy", "date": "1917-05-29", "time": "15:00", "tz": "-05:00", "lat": 42.3318, "lon": -71.1212, "city": "Brookline, USA"}, + {"name": "Nelson Mandela", "date": "1918-07-18", "time": "14:45", "tz": "+02:00", "lat": -31.9304, "lon": 28.9487, "city": "Mvezo, South Africa"}, + {"name": "Abraham Lincoln", "date": "1809-02-12", "time": "06:54", "tz": "-05:00", "lat": 38.0293, "lon": -78.4767, "city": "Hodgenville, USA"}, + {"name": "Margaret Thatcher", "date": "1925-10-13", "time": "09:00", "tz": "+00:00", "lat": 52.9548, "lon": -1.1581, "city": "Grantham, UK"}, + {"name": "Barack Obama", "date": "1961-08-04", "time": "19:24", "tz": "-10:00", "lat": 21.3099, "lon": -157.8581, "city": "Honolulu, USA"}, + # 艺术 (10) + {"name": "Rabindranath Tagore", "date": "1861-05-07", "time": "02:30", "tz": "+05:30", "lat": 22.5726, "lon": 88.3639, "city": "Kolkata, India"}, + {"name": "Ludwig van Beethoven", "date": "1770-12-17", "time": "15:40", "tz": "+01:00", "lat": 50.7374, "lon": 7.0982, "city": "Bonn, Germany"}, + {"name": "Wolfgang Mozart", "date": "1756-01-27", "time": "20:55", "tz": "+01:00", "lat": 47.8095, "lon": 13.0550, "city": "Salzburg, Austria"}, + {"name": "Pablo Picasso", "date": "1881-10-25", "time": "23:15", "tz": "+00:00", "lat": 36.7213, "lon": -4.4214, "city": "Malaga, Spain"}, + {"name": "Vincent van Gogh", "date": "1853-03-30", "time": "11:00", "tz": "+00:20", "lat": 51.4865, "lon": 3.5515, "city": "Zundert, Netherlands"}, + {"name": "Charlie Chaplin", "date": "1889-04-16", "time": "20:00", "tz": "+00:00", "lat": 51.5074, "lon": -0.1278, "city": "London, UK"}, + {"name": "Elvis Presley", "date": "1935-01-08", "time": "04:35", "tz": "-06:00", "lat": 34.2576, "lon": -88.7034, "city": "Tupelo, USA"}, + {"name": "Michael Jackson", "date": "1958-08-29", "time": "19:33", "tz": "-05:00", "lat": 41.5934, "lon": -87.3369, "city": "Gary, USA"}, + {"name": "A.R. Rahman", "date": "1967-01-06", "time": "03:45", "tz": "+05:30", "lat": 13.0827, "lon": 80.2707, "city": "Chennai, India"}, + {"name": "Lata Mangeshkar", "date": "1929-09-28", "time": "22:30", "tz": "+05:30", "lat": 18.5204, "lon": 73.8567, "city": "Indore, India"}, + # 商业 (10) + {"name": "Steve Jobs", "date": "1955-02-24", "time": "19:00", "tz": "-08:00", "lat": 37.7749, "lon": -122.4194, "city": "San Francisco, USA"}, + {"name": "Bill Gates", "date": "1955-10-28", "time": "22:00", "tz": "-08:00", "lat": 47.6062, "lon": -122.3321, "city": "Seattle, USA"}, + {"name": "Elon Musk", "date": "1971-06-28", "time": "07:30", "tz": "+02:00", "lat": -25.7479, "lon": 28.2293, "city": "Pretoria, South Africa"}, + {"name": "Jeff Bezos", "date": "1964-01-12", "time": "17:44", "tz": "-07:00", "lat": 35.0844, "lon": -106.6504, "city": "Albuquerque, USA"}, + {"name": "Warren Buffett", "date": "1930-08-30", "time": "15:00", "tz": "-06:00", "lat": 41.2565, "lon": -95.9345, "city": "Omaha, USA"}, + {"name": "Mukesh Ambani", "date": "1957-04-19", "time": "19:45", "tz": "+03:00", "lat": 12.7790, "lon": 45.0090, "city": "Aden, Yemen"}, + {"name": "Ratan Tata", "date": "1937-12-28", "time": "00:30", "tz": "+05:30", "lat": 18.9219, "lon": 72.8346, "city": "Mumbai, India"}, + {"name": "Narayana Murthy", "date": "1946-08-20", "time": "01:15", "tz": "+05:30", "lat": 13.1730, "lon": 77.7990, "city": "Shidlaghatta, India"}, + {"name": "Azim Premji", "date": "1945-07-24", "time": "07:30", "tz": "+05:30", "lat": 18.5204, "lon": 73.8567, "city": "Mumbai, India"}, + {"name": "Dhirubhai Ambani", "date": "1932-12-28", "time": "06:55", "tz": "+05:30", "lat": 20.8520, "lon": 70.4836, "city": "Chorwad, India"}, + # 体育 (10) + {"name": "Sachin Tendulkar", "date": "1973-04-24", "time": "14:00", "tz": "+05:30", "lat": 19.0760, "lon": 72.8777, "city": "Mumbai, India"}, + {"name": "Virat Kohli", "date": "1988-11-05", "time": "10:28", "tz": "+05:30", "lat": 28.6139, "lon": 77.2090, "city": "Delhi, India"}, + {"name": "MS Dhoni", "date": "1981-07-07", "time": "17:35", "tz": "+05:30", "lat": 23.3441, "lon": 85.3096, "city": "Ranchi, India"}, + {"name": "Muhammad Ali", "date": "1942-01-17", "time": "18:35", "tz": "-06:00", "lat": 38.2527, "lon": -85.7585, "city": "Louisville, USA"}, + {"name": "Michael Jordan", "date": "1963-02-17", "time": "10:20", "tz": "-05:00", "lat": 40.6782, "lon": -73.9442, "city": "Brooklyn, USA"}, + {"name": "Lionel Messi", "date": "1987-06-24", "time": "20:30", "tz": "-03:00", "lat": -32.9442, "lon": -60.6505, "city": "Rosario, Argentina"}, + {"name": "Cristiano Ronaldo", "date": "1985-02-05", "time": "10:20", "tz": "+00:00", "lat": 32.6669, "lon": -16.9241, "city": "Funchal, Portugal"}, + {"name": "Serena Williams", "date": "1981-09-26", "time": "20:28", "tz": "-04:00", "lat": 43.4195, "lon": -83.9508, "city": "Saginaw, USA"}, + {"name": "Pele", "date": "1940-10-23", "time": "03:00", "tz": "-03:00", "lat": -21.6929, "lon": -45.2580, "city": "Tres Coracoes, Brazil"}, + {"name": "Roger Federer", "date": "1981-08-08", "time": "08:40", "tz": "+01:00", "lat": 47.3769, "lon": 8.5417, "city": "Basel, Switzerland"}, + # 其他重要人物 (10) + {"name": "Swami Vivekananda", "date": "1863-01-12", "time": "06:33", "tz": "+05:30", "lat": 22.5726, "lon": 88.3639, "city": "Kolkata, India"}, + {"name": "Amitabh Bachchan", "date": "1942-10-11", "time": "16:00", "tz": "+05:30", "lat": 25.4484, "lon": 81.7313, "city": "Prayagraj, India"}, + {"name": "Queen Elizabeth II", "date": "1926-04-21", "time": "02:40", "tz": "+00:00", "lat": 51.5074, "lon": -0.1278, "city": "London, UK"}, + {"name": "Princess Diana", "date": "1961-07-01", "time": "19:45", "tz": "+01:00", "lat": 52.9548, "lon": -1.1581, "city": "Sandringham, UK"}, + {"name": "Dalai Lama", "date": "1935-07-06", "time": "04:38", "tz": "+05:30", "lat": 26.8500, "lon": 89.4000, "city": "Taktser, Tibet"}, + {"name": "Pope Francis", "date": "1936-12-17", "time": "21:00", "tz": "-03:00", "lat": -34.6037, "lon": -58.3816, "city": "Buenos Aires, Argentina"}, + {"name": "Osho", "date": "1931-12-11", "time": "13:15", "tz": "+05:30", "lat": 23.2500, "lon": 77.4167, "city": "Kuchwada, India"}, + {"name": "J. Krishnamurti", "date": "1895-05-12", "time": "00:30", "tz": "+05:30", "lat": 13.0827, "lon": 80.2707, "city": "Madanapalle, India"}, + {"name": "Ramana Maharshi", "date": "1879-12-30", "time": "01:00", "tz": "+05:30", "lat": 9.9252, "lon": 78.1198, "city": "Tiruchuli, India"}, + {"name": "Paramahansa Yogananda", "date": "1893-01-05", "time": "20:38", "tz": "+05:30", "lat": 27.0360, "lon": 88.2627, "city": "Gorakhpur, India"}, +] + +def compute_pyjhora_yogas(chart): + try: + result = subprocess.run( + [PYJHORA, HELPER], + input=json.dumps(chart), + capture_output=True, text=True, timeout=60 + ) + if result.returncode == 0: + return json.loads(result.stdout) + return {"error": result.stderr[:300]} + except Exception as e: + return {"error": str(e)} + +if __name__ == "__main__": + print(f"Standard Test Charts Builder - {len(CELEBRITY_CHARTS)} charts") + outpath = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "references", "standard_test_charts.json") + os.makedirs(os.path.dirname(outpath), exist_ok=True) + output = {"schema_version": "1.0", "description": "Standard test charts for yoga validation", "charts": []} + for chart in CELEBRITY_CHARTS: + print(f" Computing {chart['name']}...", flush=True) + yogas = compute_pyjhora_yogas(chart) + entry = dict(chart) + entry["expected_yogas"] = yogas.get("yogas", []) + entry["pyjhora_raw"] = yogas + output["charts"].append(entry) + with open(outpath, "w") as f: + json.dump(output, f, indent=2, ensure_ascii=False) + print(f"Saved to {outpath}") diff --git a/scripts/divisional_charts_extended.py b/scripts/divisional_charts_extended.py index 4723c8c7..e2331bd0 100644 --- a/scripts/divisional_charts_extended.py +++ b/scripts/divisional_charts_extended.py @@ -246,13 +246,16 @@ class DivisionalChartsCalculator: # 每个星座分为9个3.333度区间 part = int(sign_degree // (30/9)) - # 根据星座类型确定起始点 + # 根据星座类型确定起始点 (BPHS标准) + # Movable(白羊/巨蟹/天秤/摩羯)=从本星座开始 + # Fixed(金牛/狮子/天蝎/水瓶)=从第5个星座开始(+4) + # Dual(双子/处女/射手/双鱼)=从第9个星座开始(+8) if sign_index in self.MOVABLE_SIGNS: - start = sign_index # 从本星座开始 + start = sign_index elif sign_index in self.FIXED_SIGNS: - start = (sign_index + 8) % 12 # 从第9个星座开始 + start = (sign_index + 4) % 12 else: # DUAL_SIGNS - start = (sign_index + 4) % 12 # 从第5个星座开始 + start = (sign_index + 8) % 12 varga_sign = (start + part) % 12 varga_degree = (sign_degree % (30/9)) * 9 diff --git a/scripts/generate_yoga_rules.py b/scripts/generate_yoga_rules.py new file mode 100644 index 00000000..53749d87 --- /dev/null +++ b/scripts/generate_yoga_rules.py @@ -0,0 +1,1280 @@ +#!/usr/bin/env python3 +""" +生成 yoga_rules.json 的辅助脚本。 +将现有 cmd_yoga() 中的 ~76 条规则转换为数据驱动 JSON。 +""" +import json +import os + +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) +SKILL_DIR = os.path.dirname(SCRIPT_DIR) +OUTPUT_PATH = os.path.join(SKILL_DIR, "references", "yoga_rules.json") + +rules = [] + +def add_rule(id_, name, name_cn, source, category, logic, effects, strength="中", bvr_id=None, dedup_key=None, enabled=True): + r = { + "id": id_, + "name": name, + "name_cn": name_cn, + "source": source, + "bvr_id": bvr_id, + "category": category, + "logic": logic, + "effects": effects, + "strength": strength, + "enabled": enabled, + } + if dedup_key: + r["dedup_key"] = dedup_key + rules.append(r) + + +# ============================================================================ +# 1. Raja Yoga 系列 +# ============================================================================ + +# Raja Yoga: 角宫主 + 三方宫主 同宫 +add_rule( + "raja_yoga", "Raja Yoga", "王者格局", "BPHS", "raja", + { + "type": "any_pair", + "from": {"role": "kendra_lords"}, + "to": {"role": "trikona_lords"}, + "exclude_self": True, + "condition": { + "type": "same_house", + "a": "$a", "b": "$b", + "combo_template": "{a}与{b}同在第{h}宫" + } + }, + ["权力地位", "事业成功", "社会影响力"], "中" +) + +# Dharma Karmadhipati Yoga: 9宫主与10宫主同宫 +add_rule( + "dharma_karmadhipati", "Dharma Karmadhipati Yoga", "法业主同宫格局", "BPHS", "raja", + { + "type": "same_house", + "a": {"role": "lord", "house": 9}, + "b": {"role": "lord", "house": 10}, + "combo_template": "9宫主{a}与10宫主{b}同在第{h}宫" + }, + ["事业与命运结合", "社会地位高", "精神事业"], "强" +) + +# Dharma Karmadhipati (Parivartana): 9宫主与10宫主互换 +add_rule( + "dharma_karmadhipati_parivartana", "Dharma Karmadhipati Yoga (Parivartana)", "法业主互换格局", "BPHS", "raja", + { + "type": "parivartana", + "lord_a": {"role": "lord", "house": 9}, + "lord_b": {"role": "lord", "house": 10}, + "combo_template": "9宫主{la}与10宫主{lb}互换星座" + }, + ["事业与命运互换提升", "社会地位高", "贵人运强"], "强" +) + +# Raja Yoga (Parivartana): 任意角宫主与三方宫主互换 +add_rule( + "raja_yoga_parivartana", "Raja Yoga (Parivartana)", "王者互换格局", "BPHS", "raja", + { + "type": "any_pair", + "from": {"role": "kendra_lords"}, + "to": {"role": "trikona_lords"}, + "exclude_self": True, + "condition": { + "type": "parivartana", + "lord_a": "$a", + "lord_b": "$b", + "combo_template": "{la}与{lb}互换星座" + } + }, + ["权力与财富互换提升", "社会地位显著", "事业成功"], "极强" +) + +# ============================================================================ +# 2. Pancha Mahapurusha Yoga (5大伟人) +# ============================================================================ + +for planet, yoga_name, cn_name in [ + ("Mars", "Ruchaka Yoga", "鲁查卡格局"), + ("Mercury", "Bhadra Yoga", "巴德拉格局"), + ("Jupiter", "Hamsa Yoga", "汉萨格局"), + ("Venus", "Malavya Yoga", "马拉维亚格局"), + ("Saturn", "Sasa Yoga", "萨萨格局"), +]: + add_rule( + f"mahapurusha_{planet.lower()}", yoga_name, f"{cn_name}", "BPHS", "mahapurusha", + { + "type": "and", + "conditions": [ + {"type": "in_houses", "planet": planet, "houses": [1, 4, 7, 10]}, + {"type": "dignity", "planet": planet, "dignity": "exalted", + "combo_template": f"{planet}入旺在{{sign}}"} + ] + }, + ["卓越才能", "领域领军", "人格魅力"], "极强", bvr_id=None + ) + # 入庙版本 + add_rule( + f"mahapurusha_{planet.lower()}_own", yoga_name, f"{cn_name}(入庙)", "BPHS", "mahapurusha", + { + "type": "and", + "conditions": [ + {"type": "in_houses", "planet": planet, "houses": [1, 4, 7, 10]}, + {"type": "dignity", "planet": planet, "dignity": "own", + "combo_template": f"{planet}入庙在{{sign}}"} + ] + }, + ["卓越才能", "领域领军", "人格魅力"], "强", dedup_key=yoga_name + ) + +# Hamsa Yoga (Trikona) - 木星在三方宫入旺/入庙 +add_rule( + "hamsa_trikona", "Hamsa Yoga (Trikona)", "汉萨三方宫格局", "BPHS", "mahapurusha", + { + "type": "and", + "conditions": [ + {"type": "in_houses", "planet": "Jupiter", "houses": [1, 5, 9]}, + {"type": "dignity", "planet": "Jupiter", "dignity": "strong", + "combo_template": "木星有力在{sign}"} + ] + }, + ["智慧卓越", "精神导师", "品德高尚"], "强", dedup_key="Hamsa Yoga" +) + +# Moolatrikona 版本 +for planet, yoga_name, cn_name in [ + ("Mars", "Ruchaka (Moola) Yoga", "鲁查卡本宫格局"), + ("Mercury", "Bhadra (Moola) Yoga", "巴德拉本宫格局"), + ("Jupiter", "Hamsa (Moola) Yoga", "汉萨本宫格局"), + ("Venus", "Malavya (Moola) Yoga", "马拉维亚本宫格局"), + ("Saturn", "Sasa (Moola) Yoga", "萨萨本宫格局"), +]: + add_rule( + f"moolatrikona_{planet.lower()}", yoga_name, cn_name, "BPHS", "mahapurusha", + { + "type": "and", + "conditions": [ + {"type": "in_houses", "planet": planet, "houses": [1, 4, 7, 10]}, + {"type": "dignity", "planet": planet, "dignity": "moolatrikona", + "combo_template": f"{planet}在本宫{{sign}}"} + ] + }, + ["卓越才能", "领域领军", "人格魅力"], "强" + ) + +# ============================================================================ +# 3. Gajakesari Yoga +# ============================================================================ + +add_rule( + "gajakesari", "Gajakesari Yoga", "象狮格局", "BPHS", "chandra", + { + "type": "and", + "conditions": [ + {"type": "in_houses", "planet": "Jupiter", "houses": [1, 4, 7, 10]}, + {"type": "in_houses", "planet": "Moon", "houses": [1, 4, 7, 10]} + ] + }, + ["智慧学识", "财富名声", "道德品质"], "中", bvr_id="BVR-1" +) + +# Gajakesari from Moon +add_rule( + "gajakesari_from_moon", "Gajakesari Yoga (from Moon)", "象狮格局(从月亮)", "BPHS", "chandra", + { + "type": "in_houses_from", + "planet": "Jupiter", + "from": "Moon", + "relations": ["kendra"], + "combo_template": "木星在第{h}宫(从月亮的Kendra)" + }, + ["智慧学识", "财富名声", "道德品质"], "强", dedup_key="Gajakesari Yoga" +) + +# ============================================================================ +# 4. Neechabhanga Raja Yoga +# ============================================================================ + +add_rule( + "neechabhanga_basic", "Neechabhanga Raja Yoga", "落陷取消格局", "BPHS", "raja", + { + "type": "custom", + "expr": """ +matched = [] +for p, info in ctx.planets.items(): + if DEBILITATION.get(p) == info.get("sign"): + dl = SIGN_LORDS.get(info.get("sign")) + if dl and dl in ctx.planets and kendra(house_of(dl)): + matched.append((p, dl)) +matched +""", + "combo_template": "落陷取消格局", + "strength": "中强" + }, + ["克服困难", "逆境崛起", "转化能力"], "中强" +) + +# Neechabhanga (Kendra) - 落陷行星自身在角宫 +add_rule( + "neechabhanga_kendra", "Neechabhanga Raja Yoga (Kendra)", "落陷取消格局(角宫版)", "BPHS", "raja", + { + "type": "custom", + "expr": """ +matched = [] +for p, info in ctx.planets.items(): + if DEBILITATION.get(p) == info.get("sign") and kendra(info.get("house")): + matched.append(p) +matched +""", + "combo_template": "落陷行星在角宫", + "strength": "中强" + }, + ["逆境中崛起", "转化困境为机遇"], "中强", dedup_key="Neechabhanga Raja Yoga" +) + +# ============================================================================ +# 5. Dhana Yoga 系列 +# ============================================================================ + +add_rule( + "dhana_yoga", "Dhana Yoga", "财富格局", "BPHS", "dhana", + { + "type": "custom", + "expr": """ +import math +ai = ctx.asc_idx +wl = set() +wh = [2, 5, 9, 11] +for h in wh: + sign = SIGNS[(ai + h - 1) % 12] + wl.add(SIGN_LORDS[sign]) +wc = sum(1 for w in wl if w in ctx.planets and house_of(w) in wh) +wc >= 2 +""", + "combo_template": "财富宫主星落入财富宫", + "strength": "中" + }, + ["财富积累", "物质成功", "投资收益"], "中" +) + +add_rule( + "grahi_dhana", "Grahi Dhana Yoga", "星聚财富格局", "Phaladeepika", "dhana", + { + "type": "custom", + "expr": """ +ai = ctx.asc_idx +lords = { + 1: SIGN_LORDS[SIGNS[ai % 12]], + 2: SIGN_LORDS[SIGNS[(ai + 1) % 12]], + 11: SIGN_LORDS[SIGNS[(ai + 10) % 12]] +} +ok = False +for wh in [2, 11]: + cnt = sum(1 for h, lp in lords.items() if lp in ctx.planets and house_of(lp) == wh) + if cnt >= 2: + ok = True + break +ok +""", + "combo_template": "财富宫主星聚宫", + "strength": "强" + }, + ["财运亨通", "投资有利", "收入丰厚"], "强" +) + +add_rule( + "lakshmi_yoga", "Lakshmi Yoga", "拉克什米格局", "BPHS", "dhana", + { + "type": "and", + "conditions": [ + {"type": "in_houses", "planet": {"role": "lord", "house": 9}, "houses": [1]}, + {"type": "dignity", "planet": {"role": "lord", "house": 9}, "dignity": "strong", + "combo_template": "9宫主入旺/入庙在1宫"} + ] + }, + ["财富充裕", "生活幸福", "品德高尚"], "强" +) + +add_rule( + "vasumati_yoga", "Vasumati Yoga", "大地格局", "BPHS", "dhana", + { + "type": "custom", + "expr": """ +upachaya_benefics = [p for p in BENEFICS if p in ctx.planets and upachaya(house_of(p))] +len(upachaya_benefics) >= 3 +""", + "combo_template": "吉星在成长宫", + "strength": "中" + }, + ["财富丰厚", "生活富足", "物质成功"], "中" +) + +# ============================================================================ +# 6. Solar Yogas (Veshi/Voshi/Ubhayachari) +# ============================================================================ + +add_rule( + "voshi_yoga", "Voshi Yoga", "太阳前瑜伽", "BPHS", "surya", + { + "type": "custom", + "expr": """ +if 'Sun' not in ctx.planets: + False +else: + sun_h = house_of('Sun') + h12 = ((sun_h - 1 + 11) % 12) + 1 + planets_in_h12 = [p for p, info in ctx.planets.items() if info.get('house') == h12] + h2 = ((sun_h - 1 + 1) % 12) + 1 + planets_in_h2 = [p for p, info in ctx.planets.items() if info.get('house') == h2] + planets_in_h12 and not planets_in_h2 +""", + "combo_template": "行星在太阳第12宫" + }, + ["口才出众", "善于表达", "受人尊敬"], "中", bvr_id="BVR-16" +) + +add_rule( + "veshi_yoga", "Veshi Yoga", "太阳后瑜伽", "BPHS", "surya", + { + "type": "custom", + "expr": """ +if 'Sun' not in ctx.planets: + False +else: + sun_h = house_of('Sun') + h12 = ((sun_h - 1 + 11) % 12) + 1 + planets_in_h12 = [p for p, info in ctx.planets.items() if info.get('house') == h12] + h2 = ((sun_h - 1 + 1) % 12) + 1 + planets_in_h2 = [p for p, info in ctx.planets.items() if info.get('house') == h2] + planets_in_h2 and not planets_in_h12 +""", + "combo_template": "行星在太阳第2宫" + }, + ["财富充裕", "生活舒适", "性情愉快"], "中", bvr_id="BVR-17" +) + +add_rule( + "ubhayachari_yoga", "Ubhayachari Yoga", "太阳双夹瑜伽", "BPHS", "surya", + { + "type": "custom", + "expr": """ +if 'Sun' not in ctx.planets: + False +else: + sun_h = house_of('Sun') + h12 = ((sun_h - 1 + 11) % 12) + 1 + planets_in_h12 = [p for p, info in ctx.planets.items() if info.get('house') == h12] + h2 = ((sun_h - 1 + 1) % 12) + 1 + planets_in_h2 = [p for p, info in ctx.planets.items() if info.get('house') == h2] + bool(planets_in_h2 and planets_in_h12) +""", + "combo_template": "太阳两侧均有行星" + }, + ["性格坚毅", "口才与财富兼备", "受人爱戴"], "强", bvr_id="BVR-18" +) + +# ============================================================================ +# 7. Lunar Yogas +# ============================================================================ + +add_rule( + "anapha_yoga", "Anapha Yoga", "月后瑜伽", "BPHS", "chandra", + { + "type": "custom", + "expr": """ +if 'Moon' not in ctx.planets: + False +else: + moon_h = house_of('Moon') + h12 = ((moon_h - 1 + 11) % 12) + 1 + p_in_h12 = [p for p, info in ctx.planets.items() if p != 'Moon' and info.get('house') == h12] + h2 = ((moon_h - 1 + 1) % 12) + 1 + p_in_h2 = [p for p, info in ctx.planets.items() if p != 'Moon' and info.get('house') == h2] + p_in_h12 and not p_in_h2 +""", + "combo_template": "行星在月亮第12宫" + }, + ["体格健壮", "名声良好", "品德高尚"], "中", bvr_id="BVR-3" +) + +add_rule( + "sunapha_yoga", "Sunapha Yoga", "月前瑜伽", "BPHS", "chandra", + { + "type": "custom", + "expr": """ +if 'Moon' not in ctx.planets: + False +else: + moon_h = house_of('Moon') + h12 = ((moon_h - 1 + 11) % 12) + 1 + p_in_h12 = [p for p, info in ctx.planets.items() if p != 'Moon' and info.get('house') == h12] + h2 = ((moon_h - 1 + 1) % 12) + 1 + p_in_h2 = [p for p, info in ctx.planets.items() if p != 'Moon' and info.get('house') == h2] + p_in_h2 and not p_in_h12 +""", + "combo_template": "行星在月亮第2宫" + }, + ["自力更生", "财富充裕", "受人尊敬"], "中", bvr_id="BVR-2" +) + +add_rule( + "durudhura_yoga", "Durudhura Yoga", "月双夹瑜伽", "BPHS", "chandra", + { + "type": "custom", + "expr": """ +if 'Moon' not in ctx.planets: + False +else: + moon_h = house_of('Moon') + h12 = ((moon_h - 1 + 11) % 12) + 1 + p_in_h12 = [p for p, info in ctx.planets.items() if p != 'Moon' and info.get('house') == h12] + h2 = ((moon_h - 1 + 1) % 12) + 1 + p_in_h2 = [p for p, info in ctx.planets.items() if p != 'Moon' and info.get('house') == h2] + bool(p_in_h2 and p_in_h12) +""", + "combo_template": "月亮两侧均有行星" + }, + ["享受丰富", "善于辞令", "性格坚定"], "强", bvr_id="BVR-4" +) + +add_rule( + "kemadruma_yoga", "Kemadruma Yoga", "空劫瑜伽", "BPHS", "chandra", + { + "type": "custom", + "expr": """ +if 'Moon' not in ctx.planets: + False +else: + moon_h = house_of('Moon') + h12 = ((moon_h - 1 + 11) % 12) + 1 + p_in_h12 = [p for p, info in ctx.planets.items() if p != 'Moon' and info.get('house') == h12] + h2 = ((moon_h - 1 + 1) % 12) + 1 + p_in_h2 = [p for p, info in ctx.planets.items() if p != 'Moon' and info.get('house') == h2] + not p_in_h2 and not p_in_h12 +""", + "combo_template": "月亮两侧均无行星" + }, + ["人生艰辛", "需自力更生", "精神挑战"], "凶", bvr_id="BVR-5" +) + +add_rule( + "chandra_mangala_same", "Chandra-Mangala Yoga", "月火同宫格局", "BPHS", "chandra", + { + "type": "same_house", + "a": "Mars", "b": "Moon", + "combo_template": "火星与月亮同在第{h}宫" + }, + ["财富积累", "行动力强", "情绪驱动成功"], "中", bvr_id="BVR-6" +) + +add_rule( + "chandra_mangala_212", "Chandra-Mangala Yoga", "月火2/12格局", "BPHS", "chandra", + { + "type": "in_houses_from", + "planet": "Mars", + "from": "Moon", + "relations": ["2nd_12th"], + "combo_template": "火星在第{h}宫(从月亮的2/12宫)" + }, + ["财运亨通", "精力充沛", "商业头脑"], "中", dedup_key="Chandra-Mangala Yoga" +) + +# ============================================================================ +# 8. Vipreet Raja Yoga +# ============================================================================ + +for dh_h, sub_name, cn_sub in [(6, "Harsha", "喜悦逆行"), (8, "Sarala", "锐利逆行"), (12, "Vimala", "纯净逆行")]: + add_rule( + f"vipreet_{dh_h}", f"{sub_name} Vipreet Raja Yoga", f"{cn_sub}格局", "Phaladeepika", "raja", + { + "type": "custom", + "expr": f""" +lord_dh = lord({dh_h}) +if lord_dh in ctx.planets: + lh = house_of(lord_dh) + lh in [6, 8, 12] and lh != {dh_h} +else: + False +""", + "combo_template": f"第{dh_h}宫主星落入凶宫" + }, + ["因祸得福", "逆境崛起", "困境中成长"], "中强" + ) + +# Vipreet dusthana pairs +add_rule( + "vipreet_pairs", "Vipreet Raja Yoga", "逆行王者格局", "BPHS", "raja", + { + "type": "custom", + "expr": """ +pairs = [(6,8), (6,12), (8,12)] +matched = [] +for h1, h2 in pairs: + l1 = lord(h1) + l2 = lord(h2) + if l1 in ctx.planets and l2 in ctx.planets: + if house_of(l1) == h2 and house_of(l2) == h1: + matched.append((h1, h2, l1, l2)) +matched +""", + "combo_template": "凶宫主星互落" + }, + ["因祸得福", "逆境崛起"], "中强", dedup_key="Vipreet Raja Yoga" +) + +# ============================================================================ +# 9. 其他主要 Yoga +# ============================================================================ + +add_rule( + "amala_yoga", "Amala Yoga", "无瑕格局", "BPHS", "auspicious", + { + "type": "custom", + "expr": """ +benefics_10_11 = [p for p in BENEFICS if p in ctx.planets and house_of(p) in [10, 11] and not debil(p)] +bool(benefics_10_11) +""", + "combo_template": "吉星在10/11宫" + }, + ["名声清白", "受人敬仰", "事业有成"], "中强", bvr_id="BVR-13" +) + +add_rule( + "parvata_yoga", "Parvata Yoga", "山岳格局", "BPHS", "auspicious", + { + "type": "custom", + "expr": """ +kl = list(dict.fromkeys([lord(h) for h in [1,4,7,10]])) +kt = [h for h in [1,5,9]] +kendra_lords_strong = sum(1 for k in kl if k in ctx.planets and (kendra(house_of(k)) or trikona(house_of(k)))) +if kendra_lords_strong < 2: + False +else: + lord_6 = lord(6) + lord_8 = lord(8) + lord_6_ok = lord_6 in ctx.planets and house_of(lord_6) != 1 + lord_8_ok = lord_8 in ctx.planets and house_of(lord_8) != 1 + lord_6_ok or lord_8_ok +""", + "combo_template": "角宫主星有力+凶宫主星不落入1宫" + }, + ["智慧卓越", "富有口才", "品格高尚"], "中", bvr_id="BVR-14" +) + +add_rule( + "kahala_yoga", "Kahala Yoga", "勇气格局", "BPHS", "auspicious", + { + "type": "same_house", + "a": {"role": "lord", "house": 3}, + "b": {"role": "lord", "house": 10}, + "combo_template": "3宫主{a}与10宫主{b}同在第{h}宫" + }, + ["意志坚定", "领导才能", "充满活力"], "中", bvr_id="BVR-15" +) + +add_rule( + "sankha_yoga", "Sankha Yoga", "海螺格局", "BPHS", "auspicious", + { + "type": "custom", + "expr": """ +lord_5 = lord(5) +lord_6 = lord(6) +if lord_5 in ctx.planets and lord_6 in ctx.planets: + l5h = house_of(lord_5) + l6h = house_of(lord_6) + (kendra(l5h) or trikona(l5h)) and (kendra(l6h) or trikona(l6h)) +else: + False +""", + "combo_template": "5宫主与6宫主均在有力宫位" + }, + ["学识渊博", "品德高尚", "物质充裕"], "中强", bvr_id="BVR-12" +) + +add_rule( + "bheri_yoga", "Bheri Yoga", "旗帜格局", "BPHS", "auspicious", + { + "type": "custom", + "expr": """ +lord_9 = lord(9) +if lord_9 not in ctx.planets or house_of(lord_9) != 2: + False +else: + jv_in_kendra = [p for p in ['Jupiter', 'Venus'] if p in ctx.planets and kendra(house_of(p))] + bool(jv_in_kendra) +""", + "combo_template": "9宫主在2宫+木星/金星在角宫" + }, + ["品德高尚", "长寿幸福", "受人敬仰"], "中" +) + +add_rule( + "mridanga_yoga", "Mridanga Yoga", "鼓格局", "BPHS", "auspicious", + { + "type": "custom", + "expr": """ +asc_lord = SIGN_LORDS.get(ctx.ascendant) +if asc_lord not in ctx.planets: + False +else: + asc_strong = exalted(asc_lord) or own(asc_lord) + other_strong = [p for p in ctx.planets if p != asc_lord and p not in ['Rahu', 'Ketu'] and (exalted(p) or own(p))] + asc_strong and bool(other_strong) +""", + "combo_template": "上升主星有力+其他行星有力" + }, + ["权力权威", "个人魅力", "领导气质"], "强" +) + +add_rule( + "sreenatha_yoga", "Sreenatha Yoga", "幸运之主格局", "BPHS", "auspicious", + { + "type": "and", + "conditions": [ + {"type": "in_houses", "planet": {"role": "lord", "house": 7}, "houses": [10]}, + {"type": "in_houses", "planet": {"role": "lord", "house": 10}, "houses": [1]} + ] + }, + ["事业辉煌", "婚姻美满", "贵人相助"], "强" +) + +add_rule( + "matsya_yoga", "Matsya Yoga", "鱼格局", "BPHS", "auspicious", + { + "type": "custom", + "expr": """ +ben_in_trikona = [p for p in BENEFICS if p in ctx.planets and house_of(p) in [5, 9]] +mal_in_dusthana = [p for p in MALEFICS if p in ctx.planets and house_of(p) in [6, 8]] +bool(ben_in_trikona and mal_in_dusthana) +""", + "combo_template": "吉星在三方宫+凶星在凶宫" + }, + ["聪慧过人", "直觉敏锐", "灵性成长"], "中" +) + +add_rule( + "koorma_yoga", "Koorma Yoga", "龟格局", "BPHS", "auspicious", + { + "type": "custom", + "expr": """ +ben_in_1 = [p for p in BENEFICS if p in ctx.planets and house_of(p) == 1] +lord_5 = lord(5) +lord_9 = lord(9) +lord_5_or_9_in_1 = False +for lp in [lord_5, lord_9]: + if lp in ctx.planets and house_of(lp) == 1: + lord_5_or_9_in_1 = True +bool(ben_in_1 and lord_5_or_9_in_1) +""", + "combo_template": "吉星在1宫+5/9宫主在1宫" + }, + ["智慧深厚", "耐心坚韧", "精神修养"], "中" +) + +add_rule( + "khadga_yoga", "Khadga Yoga", "剑格局", "BPHS", "auspicious", + { + "type": "custom", + "expr": """ +lord_2 = lord(2) +if lord_2 not in ctx.planets or house_of(lord_2) != 2: + False +else: + mal_in_2 = [p for p in MALEFICS if p in ctx.planets and house_of(p) == 2] + not mal_in_2 +""", + "combo_template": "2宫主在2宫且无凶星" + }, + ["财富充裕", "口才出众", "品格坚定"], "中" +) + +add_rule( + "kusuma_yoga", "Kusuma Yoga", "花格局", "BPHS", "auspicious", + { + "type": "custom", + "expr": """ +checks = [ + 'Jupiter' in ctx.planets and house_of('Jupiter') == 10, + 'Moon' in ctx.planets and house_of('Moon') == 1, + 'Sun' in ctx.planets and house_of('Sun') == 2, + 'Venus' in ctx.planets and house_of('Venus') == 9, +] +sum(checks) >= 3 +""", + "combo_template": "木星10/月亮1/太阳2/金星9 中满足3+" + }, + ["才貌双全", "受人爱戴", "幸福美满"], "中强" +) + +# ============================================================================ +# 10. Conjunction Yogas +# ============================================================================ + +add_rule( + "guru_mangala_same", "Guru-Mangala Yoga", "木火同宫格局", "BPHS", "conjunction", + { + "type": "same_house", + "a": "Jupiter", "b": "Mars", + "combo_template": "木星与火星同在第{h}宫" + }, + ["智慧与行动力兼备", "正义感强", "领导能力"], "中强" +) + +add_rule( + "guru_mangala_parivartana", "Guru-Mangala Yoga", "木火互容格局", "BPHS", "conjunction", + { + "type": "parivartana", + "lord_a": "Jupiter", + "lord_b": "Mars", + "combo_template": "木星与火星互换星座" + }, + ["智慧与行动力兼备", "正义感强", "领导能力"], "强", dedup_key="Guru-Mangala Yoga" +) + +add_rule( + "budhaditya_yoga", "Budhaditya Yoga", "水日同宫格局", "BPHS", "conjunction", + { + "type": "same_house", + "a": "Mercury", "b": "Sun", + "combo_template": "水星与太阳同在第{h}宫" + }, + ["智力超群", "口才出众", "学识渊博"], "中强", bvr_id="BVR-26" +) + +add_rule( + "budha_shukra_yoga", "Budha-Shukra Yoga", "水金合相格局", "经典", "conjunction", + { + "type": "same_house", + "a": "Mercury", "b": "Venus", + "combo_template": "水星与金星同在第{h}宫" + }, + ["艺术才华", "商业头脑", "审美卓越"], "强" +) + +add_rule( + "surya_chandra_yoga", "Surya-Chandra Yoga", "日月合相格局", "经典", "conjunction", + { + "type": "same_house", + "a": "Sun", "b": "Moon", + "combo_template": "太阳与月亮同在第{h}宫" + }, + ["精神力量", "领导气质", "意志坚定"], "强" +) + +add_rule( + "guru_shukra_yoga", "Guru-Shukra Yoga", "木金合相格局", "BPHS", "conjunction", + { + "type": "same_house", + "a": "Jupiter", "b": "Venus", + "combo_template": "木星与金星同在第{h}宫" + }, + ["智慧与爱心兼备", "精神富足", "艺术造诣"], "强" +) + +add_rule( + "shani_rahu_yoga", "Shani-Rahu Yoga", "土罗合相格局", "经典", "conjunction", + { + "type": "same_house", + "a": "Saturn", "b": "Rahu", + "combo_template": "土星与罗睺同在第{h}宫" + }, + ["纪律与变革", "突破传统", "但也可能带来阻碍"], "中" +) + +add_rule( + "angaraka_yoga", "Angaraka Yoga", "火土合相格局", "BPHS", "conjunction", + { + "type": "same_house", + "a": "Mars", "b": "Saturn", + "combo_template": "火星与土星同在第{h}宫" + }, + ["行动力与纪律", "也可能产生冲突", "需平衡"], "中" +) + +add_rule( + "surya_budha_yoga", "Surya-Budha Yoga", "日水紧密合相格局", "经典", "conjunction", + { + "type": "same_house", + "a": "Sun", "b": "Mercury", + "combo_template": "太阳与水星同在第{h}宫" + }, + ["智力超群", "沟通能力强", "学习能力佳"], "强" +) + +# ============================================================================ +# 11. Kartari / 夹击 Yoga +# ============================================================================ + +add_rule( + "papakartari_yoga", "Papakartari Yoga", "凶星夹击格局", "Brihat Jataka", "durbhaga", + { + "type": "custom", + "expr": """ +targets = [1, 4, 7, 10, 5, 9] +matched = False +for th in targets: + prev_h = ((th - 2) % 12) + 1 + next_h = (th % 12) + 1 + mal_before = [p for p in MALEFICS if p in ctx.planets and house_of(p) == prev_h] + mal_after = [p for p in MALEFICS if p in ctx.planets and house_of(p) == next_h] + if mal_before and mal_after: + matched = True + break +matched +""", + "combo_template": "某宫被凶星前后夹击" + }, + ["领域受限", "需要额外努力", "阻碍与挑战"], "凶" +) + +add_rule( + "subhakartari_yoga", "Subhakartari Yoga", "吉星护宫格局", "Brihat Jataka", "auspicious", + { + "type": "custom", + "expr": """ +targets = [1, 4, 7, 10, 5, 9] +matched = False +for th in targets: + prev_h = ((th - 2) % 12) + 1 + next_h = (th % 12) + 1 + ben_before = [p for p in BENEFICS if p in ctx.planets and house_of(p) == prev_h] + ben_after = [p for p in BENEFICS if p in ctx.planets and house_of(p) == next_h] + if ben_before and ben_after: + matched = True + break +matched +""", + "combo_template": "某宫被吉星前后守护" + }, + ["领域受保护", "顺利发展", "贵人助力"], "吉" +) + +# ============================================================================ +# 12. Saraswati / 辩才天女 +# ============================================================================ + +add_rule( + "saraswati_yoga", "Saraswati Yoga", "辩才天女格局", "BPHS", "auspicious", + { + "type": "custom", + "expr": """ +saraswati_houses = [2, 4, 7, 9, 10] +saraswati_planets = [p for p in ['Jupiter', 'Venus', 'Mercury'] if p in ctx.planets and house_of(p) in saraswati_houses] +if len(saraswati_planets) >= 3 or (len(saraswati_planets) >= 2 and 'Jupiter' in saraswati_planets): + jup_dig = dignity('Jupiter') if 'Jupiter' in ctx.planets else '' + jup_dig in ['EXALTED', 'OWN_SIGN', 'MOOLATRIKONA', 'FRIEND'] +else: + False +""", + "combo_template": "木星/金星/水星在吉宫" + }, + ["学问渊博", "艺术才华", "表达卓越"], "强" +) + +# ============================================================================ +# 13. Chamara / Akhanda / Gurumauli +# ============================================================================ + +add_rule( + "chamara_yoga", "Chamara Yoga", "拂尘格局", "BPHS", "auspicious", + { + "type": "custom", + "expr": """ +asc_lord = SIGN_LORDS.get(ctx.ascendant) +if asc_lord not in ctx.planets: + False +else: + asc_strong = exalted(asc_lord) or own(asc_lord) + ben_kt = [p for p in BENEFICS if p in ctx.planets and (kendra(house_of(p)) or trikona(house_of(p)))] + asc_strong and len(ben_kt) >= 2 +""", + "combo_template": "上升主有力+吉星在角宫/三方宫" + }, + ["长寿健康", "受人尊敬", "智慧通达"], "强" +) + +add_rule( + "akhanda_samrajya", "Akhanda Samrajya Yoga", "永恒帝王格局", "BPHS", "raja", + { + "type": "custom", + "expr": """ +if 'Jupiter' not in ctx.planets: + False +else: + jh = house_of('Jupiter') + if jh not in [2, 5, 9, 11]: + False + else: + lord_11 = lord(11) + if lord_11 not in ctx.planets: + False + else: + l11h = house_of(lord_11) + l11h == 11 or kendra(l11h) +""", + "combo_template": "木星在2/5/9/11宫+11宫主有力" + }, + ["权力持久", "事业辉煌", "影响力广泛"], "强" +) + +add_rule( + "gurumauli_9", "Gurumauli Yoga", "至上师格局", "经典", "auspicious", + { + "type": "in_houses", + "planet": "Jupiter", + "houses": [9], + "combo_template": "木星在9宫" + }, + ["命运眷顾", "精神导师指引", "福德深厚"], "强" +) + +add_rule( + "gurumauli_with_lord9", "Gurumauli Yoga", "至上师关联格局", "经典", "auspicious", + { + "type": "same_house", + "a": "Jupiter", + "b": {"role": "lord", "house": 9}, + "combo_template": "木星与9宫主同在第{h}宫" + }, + ["命运眷顾", "贵人运强", "智慧通达"], "中强", dedup_key="Gurumauli Yoga" +) + +# ============================================================================ +# 14. 凶 Yoga +# ============================================================================ + +add_rule( + "shakata_yoga", "Shakata Yoga", "车格局", "BPHS", "durbhaga", + { + "type": "in_houses", + "planet": "Jupiter", + "houses": [6, 8, 12], + "combo_template": "木星在{h}宫" + }, + ["财富不稳", "健康需注意", "精神起伏"], "凶" +) + +add_rule( + "daridra_11", "Daridra Yoga", "贫困格局", "BPHS", "durbhaga", + { + "type": "custom", + "expr": """ +lord_11 = lord(11) +lord_11 in ctx.planets and house_of(lord_11) in [6, 8, 12] +""", + "combo_template": "11宫主落入凶宫" + }, + ["财务困难", "需努力积累", "谨慎理财"], "凶" +) + +add_rule( + "daridra_2", "Daridra Yoga (variant)", "贫困格局变体", "BPHS", "durbhaga", + { + "type": "custom", + "expr": """ +lord_2 = lord(2) +lord_2 in ctx.planets and debil(lord_2) and dusthana(house_of(lord_2)) +""", + "combo_template": "2宫主落陷在凶宫" + }, + ["财务压力", "家庭纠纷", "需节俭持家"], "凶", dedup_key="Daridra Yoga" +) + +# ============================================================================ +# 15. Nabhasa Yogas (分布模式) +# ============================================================================ + +add_rule( + "gola_yoga", "Gola Yoga", "球格局", "BPHS", "nabhasa", + { + "type": "houses_occupied", + "planets": "all", + "count": 1, + "combo_template": "所有行星在同一宫" + }, + ["专注集中", "也可能过于极端"], "中" +) + +add_rule( + "yuga_yoga", "Yuga Yoga", "双格局", "BPHS", "nabhasa", + { + "type": "houses_occupied", + "planets": "all", + "count": 2, + "combo_template": "所有行星在两宫" + }, + ["双重性格", "生活两极化"], "中" +) + +add_rule( + "sula_yoga", "Sula Yoga", "三叉格局", "BPHS", "nabhasa", + { + "type": "houses_occupied", + "planets": "all", + "count": 3, + "combo_template": "所有行星在三宫" + }, + ["行动力", "但也可能有冲突"], "中" +) + +add_rule( + "kedara_yoga", "Kedara Yoga", "四重格局", "BPHS", "nabhasa", + { + "type": "houses_occupied", + "planets": "all", + "count": 4, + "combo_template": "所有行星在四宫" + }, + ["稳定", "农业/地产运"], "中" +) + +add_rule( + "veena_yoga", "Veena Yoga", "琴格局", "BPHS", "nabhasa", + { + "type": "houses_occupied", + "planets": "all", + "count": 7, + "combo_template": "行星分布在七宫" + }, + ["艺术才华", "生活丰富", "多才多艺"], "强", bvr_id="BVR-91" +) + +add_rule( + "asraya_yoga", "Asraya Yoga", "依托格局", "BPHS", "nabhasa", + { + "type": "all_planets", + "planets": "all", + "condition": { + "type": "custom", + "expr": "kendra(house_of(bindings.get('planet', ''))) or trikona(house_of(bindings.get('planet', '')))" + } + }, + ["生活稳定", "有依靠", "根基深厚"], "中强" +) + +add_rule( + "dala_yoga", "Dala Yoga", "分叶格局", "BPHS", "nabhasa", + { + "type": "custom", + "expr": """ +dala_count = sum(1 for dh in [6, 8, 12] if lord(dh) in ctx.planets and kendra(house_of(lord(dh)))) +dala_count >= 2 +""", + "combo_template": "凶宫主在角宫" + }, + ["逆境中崛起", "转化能力"], "中强" +) + +add_rule( + "maala_yoga", "Maala Yoga", "串珠格局", "BPHS", "nabhasa", + { + "type": "custom", + "expr": """ +ben_in_kendra = sorted(set(house_of(p) for p in BENEFICS if p in ctx.planets and kendra(house_of(p)))) +matched = False +if len(ben_in_kendra) >= 3: + for i in range(len(ben_in_kendra) - 2): + if ben_in_kendra[i+1] - ben_in_kendra[i] == 1 and ben_in_kendra[i+2] - ben_in_kendra[i+1] == 1: + matched = True + break +matched +""", + "combo_template": "吉星在连续角宫" + }, + ["幸运连绵", "福气不断"], "强" +) + +# ============================================================================ +# 16. 特殊条件 Yoga +# ============================================================================ + +add_rule( + "mahabhagya_yoga", "Mahabhagya Yoga", "大运格局", "BPHS", "special", + { + "type": "custom", + "expr": """ +odd_signs = ['Aries', 'Gemini', 'Leo', 'Libra', 'Sagittarius', 'Aquarius'] +asc_odd = ctx.ascendant in odd_signs +sun_odd = 'Sun' in ctx.planets and sign_of('Sun') in odd_signs +moon_odd = 'Moon' in ctx.planets and sign_of('Moon') in odd_signs +asc_odd and sun_odd and moon_odd +""", + "combo_template": "上升/太阳/月亮均在奇数星座" + }, + ["命运眷顾", "人生顺遂", "贵人运强"], "强" +) + +add_rule( + "pushkala_yoga", "Pushkala Yoga", "丰盈格局", "BPHS", "special", + { + "type": "custom", + "expr": """ +asc_lord = SIGN_LORDS.get(ctx.ascendant) +if asc_lord not in ctx.planets: + False +else: + asc_strong = exalted(asc_lord) or own(asc_lord) + moon_ok = 'Moon' in ctx.planets and sign_of('Moon') != DEBILITATION.get('Moon') + ben_in_asc = [p for p in BENEFICS if p in ctx.planets and house_of(p) == 1] + asc_strong and moon_ok and bool(ben_in_asc) +""", + "combo_template": "上升主有力+月亮良好+吉星在1宫" + }, + ["生活富足", "社会地位高", "受人尊敬"], "强" +) + +add_rule( + "adhi_yoga", "Adhi Yoga", "上方格局", "BPHS", "special", + { + "type": "custom", + "expr": """ +adhi = {6: 12, 8: 2, 12: 11} +matched = False +for dh, uh in adhi.items(): + ben_above = [p for p in BENEFICS if p in ctx.planets and house_of(p) == uh] + if ben_above: + matched = True + break +matched +""", + "combo_template": "吉星在凶宫上方" + }, + ["权威地位", "领导能力", "受人尊敬"], "中强", bvr_id="BVR-7" +) + +add_rule( + "chatussagara_yoga", "Chatussagara Yoga", "四角充盈格局", "BPHS", "special", + { + "type": "custom", + "expr": """ +all(len(planets_in(h)) > 0 for h in [1, 4, 7, 10]) +""", + "combo_template": "1/4/7/10宫均有行星" + }, + ["生活圆满", "各方面均衡发展", "命运眷顾"], "强" +) + +add_rule( + "virinchi_yoga", "Virinchi Yoga", "创造格局", "BPHS", "special", + { + "type": "custom", + "expr": """ +asc_lord = SIGN_LORDS.get(ctx.ascendant) +if asc_lord not in ctx.planets: + False +else: + asc_ok = kendra(house_of(asc_lord)) or trikona(house_of(asc_lord)) + lord_5 = lord(5) + lord5_ok = lord_5 in ctx.planets and kendra(house_of(lord_5)) + jup_ok = 'Jupiter' in ctx.planets and (exalted('Jupiter') or own('Jupiter') or house_of('Jupiter') in [1,5,9]) + asc_ok and lord5_ok and jup_ok +""", + "combo_template": "上升主有力+5宫主在角宫+木星有力" + }, + ["创造力强", "智慧卓越", "精神修养"], "强" +) + +add_rule( + "veena_artistic", "Veenaa Yoga (Artistic)", "艺术琴格局", "BPHS", "special", + { + "type": "custom", + "expr": """ +asc_lord = SIGN_LORDS.get(ctx.ascendant) +ben_in_259 = [p for p in BENEFICS if p in ctx.planets and house_of(p) in [2, 5, 9]] +asc_strong = asc_lord in ctx.planets and (exalted(asc_lord) or own(asc_lord)) +len(ben_in_259) >= 2 and asc_strong +""", + "combo_template": "吉星在2/5/9宫+上升主有力" + }, + ["艺术才华", "音乐天赋", "审美卓越"], "强" +) + +add_rule( + "kalanidhi_yoga", "Kalanidhi Yoga", "艺藏格局", "BPHS", "special", + { + "type": "custom", + "expr": """ +if 'Jupiter' not in ctx.planets or house_of('Jupiter') not in [2, 5]: + False +else: + jh = house_of('Jupiter') + assoc = [p for p in ['Venus', 'Mercury'] if p in ctx.planets and (house_of(p) == jh or abs(house_of(p) - jh) in [3, 6, 9])] + bool(assoc) +""", + "combo_template": "木星在2/5宫+被金星/水星关联" + }, + ["艺术才华", "学识渊博", "受人尊敬"], "强" +) + +add_rule( + "saubhagya_yoga", "Saubhagya Yoga", "幸运格局", "BPHS", "special", + { + "type": "custom", + "expr": """ +asc_lord = SIGN_LORDS.get(ctx.ascendant) +asc_strong = asc_lord in ctx.planets and kendra(house_of(asc_lord)) and (exalted(asc_lord) or own(asc_lord)) +moon_ok = 'Moon' in ctx.planets and house_of('Moon') in [1, 5, 9, 10, 11] +asc_strong and moon_ok +""", + "combo_template": "上升主有力在角宫+月亮在吉宫" + }, + ["幸运眷顾", "生活幸福", "婚姻美满"], "强" +) + +add_rule( + "shubha_yoga", "Shubha Yoga", "全吉星格局", "BPHS", "special", + { + "type": "custom", + "expr": """ +benefics_present = [p for p in BENEFICS if p in ctx.planets] +all_benefics_kt = all(kendra(house_of(p)) or trikona(house_of(p)) for p in benefics_present) +all_benefics_kt and len(benefics_present) >= 3 +""", + "combo_template": "所有吉星在角宫或三方宫" + }, + ["生活顺遂", "福气满满", "受人爱戴"], "强" +) + +add_rule( + "graha_yuddha", "Graha Yuddha", "行星战争", "经典", "special", + { + "type": "degree_gap", + "a": "all", + "b": "all", + "max_gap": 1.0, + "combo_template": "行星在同一星座内相距<1°" + }, + ["行星力量竞争", "相关领域有张力"], "中" +) + +add_rule( + "pushya_yoga", "Pushya Yoga", "成长格局", "BPHS", "special", + { + "type": "custom", + "expr": """ +ben_in_8912 = [p for p in BENEFICS if p in ctx.planets and house_of(p) in [8, 9, 12]] +len(ben_in_8912) >= 2 +""", + "combo_template": "吉星在8/9/12宫" + }, + ["精神成长", "灵性提升", "命运眷顾"], "中强" +) + + +# ============================================================================ +# 输出 JSON +# ============================================================================ +if __name__ == "__main__": + data = { + "schema_version": "1.0", + "description": "Yoga 规则库 - 数据驱动架构 v1.0", + "total_rules": len(rules), + "rules": rules + } + os.makedirs(os.path.dirname(OUTPUT_PATH), exist_ok=True) + with open(OUTPUT_PATH, 'w', encoding='utf-8') as f: + json.dump(data, f, ensure_ascii=False, indent=2) + print(f"Generated {len(rules)} rules -> {OUTPUT_PATH}") diff --git a/scripts/jyotish_engine.py b/scripts/jyotish_engine.py index e82d7310..e88777fc 100644 --- a/scripts/jyotish_engine.py +++ b/scripts/jyotish_engine.py @@ -64,6 +64,7 @@ except ImportError: from cmd_solar_return import cmd_solar_return # v6.0.18 from cmd_narayana_dasha import cmd_narayana_dasha as _cmd_narayana_dasha_impl # v6.0.20 from cmd_muhurta import cmd_muhurta # v6.0.21 +from yoga_engine import detect_yogas # v6.0.26: data-driven Yoga engine # ============================================================================ # 常量 @@ -534,10 +535,23 @@ def cmd_dasha(args): if not nak_info: return {"error": f"未找到Nakshatra: {args.nakshatra}"} if args.pada: progress = (max(1, min(4, args.pada)) - 1) / 4 + 0.125 else: - return {"error": "请提供 --nakshatra 或 --moon-lon"} + # v6.0.27: Auto-calculate Moon's Nakshatra from birth datetime + chart, asc_idx, jd, ayanamsa = compute_chart_data( + args.year, args.month, args.day, args.hour, args.minute, + args.lat, args.lon, args.tz, getattr(args, 'node_mode', 'mean') + ) + if chart is None: + return {"error": "swisseph未安装,无法自动计算Nakshatra"} + moon = chart.get("planets", {}).get("Moon", {}) + moon_lon = moon.get("degree_raw") + if moon_lon is None: + return {"error": "无法计算Moon位置"} + ns = 360.0 / 27; idx = int(moon_lon / ns); progress = (moon_lon % ns) / ns + nak_info = NAKSHATRA_LIST[idx % 27] nak_name, start_lord, start_years = nak_info - birth_dt = datetime.strptime(args.birthdate, "%Y-%m-%d") + birthdate = args.birthdate or f"{args.year}-{args.month:02d}-{args.day:02d}" + birth_dt = datetime.strptime(birthdate, "%Y-%m-%d") elapsed = progress * start_years; remaining = start_years - elapsed dt = birth_dt - timedelta(days=elapsed * 365.25) si = DASHA_ORDER.index(start_lord) @@ -577,694 +591,69 @@ def cmd_dasha(args): d["antardasha"] = current_ad or (sub[0] if sub else None) current = d - return {"moon_nakshatra": nak_name, "birth_date": args.birthdate, "reference_date": today.strftime("%Y-%m-%d"), "timeline": timeline, "current_dasha": current} + return {"moon_nakshatra": nak_name, "birth_date": birthdate, "reference_date": today.strftime("%Y-%m-%d"), "timeline": timeline, "current_dasha": current} # ============================================================================ # 3. Yoga识别 # ============================================================================ def cmd_yoga(args): + """ + Yoga 识别 —— v6.0.26 数据驱动引擎。 + + 支持两种输入: + 1. 兼容旧接口:--ascendant + --planets "Sun:Aries:1[:10.5],Moon:Cancer:4[:15]" + 2. 出生信息直算:--year --month --day --hour --minute --lat --lon --tz [--node-mode] + """ planets = {} + asc = args.ascendant or "Aries" + if args.planets: for item in args.planets.split(','): parts = item.strip().split(':') if len(parts) >= 3: - planets[parts[0].strip()] = {"sign": parts[1].strip(), "house": int(parts[2].strip())} - asc = args.ascendant or "Aries" + pdata = {"sign": parts[1].strip(), "house": int(parts[2].strip())} + if len(parts) >= 4 and parts[3].strip() != "": + try: + pdata["degree"] = float(parts[3].strip()) + except ValueError: + pass + planets[parts[0].strip()] = pdata + else: + required_birth_fields = ["year", "month", "day", "hour", "minute", "lat", "lon"] + has_birth_input = all(getattr(args, field, None) is not None for field in required_birth_fields) + if has_birth_input: + chart, asc_idx, jd, ayanamsa = compute_chart_data( + args.year, args.month, args.day, args.hour, args.minute, + args.lat, args.lon, getattr(args, 'tz', 0), getattr(args, 'node_mode', 'mean') + ) + if chart is None: + return {"error": "swisseph未安装"} + asc = chart.get("ascendant", {}).get("sign", asc) + for pname, pd in chart.get("planets", {}).items(): + if isinstance(pd, dict) and "sign" in pd and "house" in pd: + planets[pname] = { + "sign": pd["sign"], + "house": pd["house"], + "degree": pd.get("degree_in_sign", pd.get("degree")), + } + ai = SIGNS.index(asc) if asc in SIGNS else 0 kl = list(set([SIGN_LORDS[SIGNS[(ai + h - 1) % 12]] for h in [1, 4, 7, 10]])) tl = list(set([SIGN_LORDS[SIGNS[(ai + h - 1) % 12]] for h in [1, 5, 9]])) - yogas = [] - # Raja Yoga - for k in kl: - for t in tl: - if k != t and k in planets and t in planets and planets[k]["house"] == planets[t]["house"]: - yogas.append({"name": "Raja Yoga", "name_cn": "王者格局", "combination": f"{k}+{t}同在第{planets[k]['house']}宫", "effects": ["权力地位", "事业成功", "社会影响力"], "strength": "强" if planets[k]["sign"] in [EXALTATION.get(k, ''), SIGN_LORDS.get(planets[k]["sign"], '')] else "中"}) + # 调用数据驱动引擎(yoga_engine.py) + yogas = detect_yogas(planets, asc) - # Mahapurusha Yoga - yoga_names = {'Mars': 'Ruchaka', 'Mercury': 'Bhadra', 'Jupiter': 'Hamsa', 'Venus': 'Malavya', 'Saturn': 'Sasa'} - for p, info in planets.items(): - if info["house"] in [1, 4, 7, 10] and p in yoga_names: - if EXALTATION.get(p) == info["sign"] or SIGN_LORDS.get(info["sign"]) == p: - st = "入旺" if EXALTATION.get(p) == info["sign"] else "入庙" - yogas.append({"name": f"{yoga_names[p]} Yoga", "name_cn": f"{PLANET_CN.get(p, p)}{st}格局", "combination": f"{p}{st}在{info['sign']}(第{info['house']}宫)", "effects": ["卓越才能", "领域领军", "人格魅力"], "strength": "极强" if st == "入旺" else "强"}) - - # Gajakesari - if 'Jupiter' in planets and 'Moon' in planets: - jh = planets['Jupiter']['house']; mh = planets['Moon']['house'] - if jh in [1, 4, 7, 10] and mh in [1, 4, 7, 10]: - yogas.append({"name": "Gajakesari Yoga", "name_cn": "象狮格局", "combination": f"木星第{jh}宫+月亮第{mh}宫", "effects": ["智慧学识", "财富名声", "道德品质"], "strength": "中"}) - - # Neechabhanga - for p, info in planets.items(): - if DEBILITATION.get(p) == info["sign"]: - dl = SIGN_LORDS[info["sign"]] - if dl in planets and planets[dl]["house"] in [1, 4, 7, 10]: - yogas.append({"name": "Neechabhanga Raja Yoga", "name_cn": "落陷取消格局", "combination": f"{p}落陷在{info['sign']},{dl}在角宫化解", "effects": ["克服困难", "逆境崛起", "转化能力"], "strength": "中强"}) - - # Dhana Yoga - wl = set(); wh = [2, 5, 9, 11] - for h in wh: - wl.add(SIGN_LORDS[SIGNS[(ai + h - 1) % 12]]) - wc = sum(1 for w in wl if w in planets and planets[w]["house"] in wh) - if wc >= 2: - yogas.append({"name": "Dhana Yoga", "name_cn": "财富格局", "combination": f"{wc}个财富宫主星落入财富宫", "effects": ["财富积累", "物质成功", "投资收益"], "strength": "中强" if wc >= 3 else "中"}) - - # Solar Yogas (Veshi/Voshi/Ubhayachari) - if 'Sun' in planets: - sun_h = planets['Sun']['house'] - h2_from_sun = ((sun_h - 1 + 1) % 12) + 1 # 2nd from Sun - h12_from_sun = ((sun_h - 1 + 11) % 12) + 1 # 12th from Sun - planets_in_h2 = [p for p, info in planets.items() if info['house'] == h2_from_sun] - planets_in_h12 = [p for p, info in planets.items() if info['house'] == h12_from_sun] - if planets_in_h12 and not planets_in_h2: - yogas.append({"name": "Voshi Yoga", "name_cn": "太阳前瑜伽", "combination": f"{'+'.join(planets_in_h12)}在太阳第12宫", "effects": ["口才出众", "善于表达", "受人尊敬"], "strength": "中"}) - if planets_in_h2 and not planets_in_h12: - yogas.append({"name": "Veshi Yoga", "name_cn": "太阳后瑜伽", "combination": f"{'+'.join(planets_in_h2)}在太阳第2宫", "effects": ["财富充裕", "生活舒适", "性情愉快"], "strength": "中"}) - if planets_in_h2 and planets_in_h12: - yogas.append({"name": "Ubhayachari Yoga", "name_cn": "太阳双夹瑜伽", "combination": f"太阳两侧均有行星", "effects": ["性格坚毅", "口才与财富兼备", "受人爱戴"], "strength": "强"}) - - # Lunar Yogas (Sunapha/Anapha/Durudhura/Kemadruma) - if 'Moon' in planets: - moon_h = planets['Moon']['house'] - h2_from_moon = ((moon_h - 1 + 1) % 12) + 1 - h12_from_moon = ((moon_h - 1 + 11) % 12) + 1 - p_in_h2_moon = [p for p, info in planets.items() if p != 'Moon' and info['house'] == h2_from_moon] - p_in_h12_moon = [p for p, info in planets.items() if p != 'Moon' and info['house'] == h12_from_moon] - if p_in_h12_moon and not p_in_h2_moon: - yogas.append({"name": "Anapha Yoga", "name_cn": "月后瑜伽", "combination": f"{'+'.join(p_in_h12_moon)}在月亮第12宫", "effects": ["体格健壮", "名声良好", "品德高尚"], "strength": "中"}) - if p_in_h2_moon and not p_in_h12_moon: - yogas.append({"name": "Sunapha Yoga", "name_cn": "月前瑜伽", "combination": f"{'+'.join(p_in_h2_moon)}在月亮第2宫", "effects": ["自力更生", "财富充裕", "受人尊敬"], "strength": "中"}) - if p_in_h2_moon and p_in_h12_moon: - yogas.append({"name": "Durudhura Yoga", "name_cn": "月双夹瑜伽", "combination": f"月亮两侧均有行星", "effects": ["享受丰富", "善于辞令", "性格坚定"], "strength": "强"}) - # Kemadruma Yoga: Moon两侧(2宫和12宫)均无行星 - if not p_in_h2_moon and not p_in_h12_moon: - yogas.append({"name": "Kemadruma Yoga", "name_cn": "空劫瑜伽", "combination": f"月亮两侧均无行星(2宫/12宫空)", "effects": ["人生艰辛", "需自力更生", "精神挑战"], "strength": "凶"}) - - # ======================================================================== - # 扩展组合型 Yoga(v3.7.2 新增,共 25 条) - # ======================================================================== - - # --- 辅助函数 --- - def _house_of(planet_name): - """获取行星所在宫位,不存在返回 None""" - return planets[planet_name]["house"] if planet_name in planets else None - - def _sign_of(planet_name): - """获取行星所在星座,不存在返回 None""" - return planets[planet_name]["sign"] if planet_name in planets else None - - def _is_exalted(planet_name): - """行星是否入旺""" - s = _sign_of(planet_name) - return s is not None and EXALTATION.get(planet_name) == s - - def _is_own_sign(planet_name): - """行星是否入庙""" - s = _sign_of(planet_name) - return s is not None and SIGN_LORDS.get(s) == planet_name - - def _is_debilitated(planet_name): - """行星是否落陷""" - s = _sign_of(planet_name) - return s is not None and DEBILITATION.get(planet_name) == s - - def _is_kendra(house_num): - return house_num in [1, 4, 7, 10] - - def _is_trikona(house_num): - return house_num in [1, 5, 9] - - def _is_dusthana(house_num): - return house_num in [6, 8, 12] - - def _is_upachaya(house_num): - return house_num in [3, 6, 10, 11] - - def _planets_in_house(h): - """获取落入第 h 宫的所有行星列表""" - return [p for p, info in planets.items() if info["house"] == h] - - def _lord_of_house(h): - """获取第 h 宫的宫主星""" - return SIGN_LORDS[SIGNS[(ai + h - 1) % 12]] - - def _planet_in_kendra_or_trikona(planet_name): - """行星是否在角宫或三方宫""" - h = _house_of(planet_name) - return h is not None and (_is_kendra(h) or _is_trikona(h)) - - # ======================================================================== - # 1. Vipreet Raja Yoga(逆行王者格局)—— Harsha / Sarala / Vimala - # 来源:Phaladeepika。6/8/12 宫主星落入 6/8/12 宫(凶宫互落)→ 因祸得福 - # ======================================================================== - for dh_h, yoga_sub, yoga_cn in [(6, "Harsha", "喜悦逆行"), (8, "Sarala", "锐利逆行"), (12, "Vimala", "纯净逆行")]: - lord_dh = _lord_of_house(dh_h) - if lord_dh in planets: - lh = _house_of(lord_dh) - if lh in [6, 8, 12] and lh != dh_h: - yogas.append({"name": f"{yoga_sub} Vipreet Raja Yoga", "name_cn": f"{yoga_cn}格局", "combination": f"第{dh_h}宫主星{lord_dh}落入第{lh}宫(凶宫互落)", "effects": ["因祸得福", "逆境崛起", "困境中成长"], "strength": "中强"}) - - # ======================================================================== - # 2. Amala Yoga(无瑕格局) - # 来源:BPHS。10 宫(天顶)及其前方(从10宫算2宫即11宫)有吉星 - # 简化版:10 宫或 11 宫有木星/金星/明亮水星 - # ======================================================================== - benefics_10_11 = [p for p in ['Jupiter', 'Venus', 'Mercury'] if p in planets and _house_of(p) in [10, 11] and not _is_debilitated(p)] - if benefics_10_11: - yogas.append({"name": "Amala Yoga", "name_cn": "无瑕格局", "combination": f"{'、'.join(benefics_10_11)}在10宫或11宫", "effects": ["名声清白", "受人敬仰", "事业有成"], "strength": "中强"}) - - # ======================================================================== - # 3. Parvata Yoga(山岳格局) - # 来源:BPHS。角宫主星有力 + 6/8 宫主星落入对应凶宫 - # 简化版:至少两个角宫主星在角宫或三方宫 + 6/8宫主不在1宫 - # ======================================================================== - kendra_lords_strong = sum(1 for k in kl if k in planets and _planet_in_kendra_or_trikona(k)) - if kendra_lords_strong >= 2: - lord_6 = _lord_of_house(6) - lord_8 = _lord_of_house(8) - lord_6_ok = lord_6 in planets and _house_of(lord_6) != 1 - lord_8_ok = lord_8 in planets and _house_of(lord_8) != 1 - if lord_6_ok or lord_8_ok: - yogas.append({"name": "Parvata Yoga", "name_cn": "山岳格局", "combination": f"角宫主星有力+凶宫主星不落入1宫", "effects": ["智慧卓越", "富有口才", "品格高尚"], "strength": "中"}) - - # ======================================================================== - # 4. Kahala Yoga(勇气格局) - # 来源:BPHS。3 宫主与 10 宫主有连接(同宫/互换/相位),且落入角宫 - # 简化版:3 宫主与 10 宫主同在一宫 - # ======================================================================== - lord_3 = _lord_of_house(3) - lord_10 = _lord_of_house(10) - if lord_3 in planets and lord_10 in planets: - if _house_of(lord_3) == _house_of(lord_10): - yogas.append({"name": "Kahala Yoga", "name_cn": "勇气格局", "combination": f"3宫主{lord_3}与10宫主{lord_10}同在第{_house_of(lord_3)}宫", "effects": ["意志坚定", "领导才能", "充满活力"], "strength": "中"}) - - # ======================================================================== - # 5. Sankha Yoga(海螺格局) - # 来源:BPHS。5 宫主 + 6 宫主落入角宫/三方宫,且上升主星有力 - # 简化版:5宫主和6宫主均在角宫或三方宫 - # ======================================================================== - lord_5 = _lord_of_house(5) - lord_6 = _lord_of_house(6) - if lord_5 in planets and lord_6 in planets: - l5h = _house_of(lord_5) - l6h = _house_of(lord_6) - if (_is_kendra(l5h) or _is_trikona(l5h)) and (_is_kendra(l6h) or _is_trikona(l6h)): - yogas.append({"name": "Sankha Yoga", "name_cn": "海螺格局", "combination": f"5宫主{lord_5}在第{l5h}宫+6宫主{lord_6}在第{l6h}宫(均有力)", "effects": ["学识渊博", "品德高尚", "物质充裕"], "strength": "中强"}) - - # ======================================================================== - # 6. Bheri Yoga(旗帜格局) - # 来源:BPHS。9 宫主落入 2 宫 + 木星/金星在角宫/三方宫 + 上升主与 9 宫主有关联 - # 简化版:9 宫主在 2 宫 + 木星或金星在角宫 - # ======================================================================== - lord_9 = _lord_of_house(9) - if lord_9 in planets and _house_of(lord_9) == 2: - jv_in_kendra = [p for p in ['Jupiter', 'Venus'] if p in planets and _is_kendra(_house_of(p))] - if jv_in_kendra: - yogas.append({"name": "Bheri Yoga", "name_cn": "旗帜格局", "combination": f"9宫主{lord_9}在2宫+{'、'.join(jv_in_kendra)}在角宫", "effects": ["品德高尚", "长寿幸福", "受人敬仰"], "strength": "中"}) - - # ======================================================================== - # 7. Mridanga Yoga(鼓格局) - # 来源:BPHS。上升主星在入旺/入庙 + 其他行星在自身入旺/入庙星座 - # 简化版:上升主星入旺或入庙 - # ======================================================================== - asc_lord = SIGN_LORDS.get(asc, '') - if asc_lord in planets and (_is_exalted(asc_lord) or _is_own_sign(asc_lord)): - other_strong = [p for p in planets if p != asc_lord and p not in ['Rahu', 'Ketu'] and (_is_exalted(p) or _is_own_sign(p))] - if other_strong: - st = "入旺" if _is_exalted(asc_lord) else "入庙" - yogas.append({"name": "Mridanga Yoga", "name_cn": "鼓格局", "combination": f"上升主星{asc_lord}{st}+{'、'.join(other_strong)}有力", "effects": ["权力权威", "个人魅力", "领导气质"], "strength": "强"}) - - # ======================================================================== - # 8. Sreenatha Yoga(幸运之主格局) - # 来源:BPHS。7 宫主星落入 10 宫且 10 宫主落入 1 宫 - # ======================================================================== - lord_7 = _lord_of_house(7) - if lord_7 in planets and lord_10 in planets: - if _house_of(lord_7) == 10 and _house_of(lord_10) == 1: - yogas.append({"name": "Sreenatha Yoga", "name_cn": "幸运之主格局", "combination": f"7宫主{lord_7}在10宫+10宫主{lord_10}在1宫", "effects": ["事业辉煌", "婚姻美满", "贵人相助"], "strength": "强"}) - - # ======================================================================== - # 9. Matsya Yoga(鱼格局) - # 来源:BPHS。1/5/9 宫中有吉星 + 6/8 宫有凶星 + 上升与木星/金星有连接 - # 简化版:三方宫(5/9)有吉星 + 6/8宫有凶星 - # ======================================================================== - benefics = ['Jupiter', 'Venus', 'Mercury'] - malefics = ['Mars', 'Saturn', 'Sun', 'Rahu', 'Ketu'] - ben_in_trikona = [p for p in benefics if p in planets and _house_of(p) in [5, 9]] - mal_in_dusthana = [p for p in malefics if p in planets and _house_of(p) in [6, 8]] - if ben_in_trikona and mal_in_dusthana: - yogas.append({"name": "Matsya Yoga", "name_cn": "鱼格局", "combination": f"{'、'.join(ben_in_trikona)}在三方宫+{'、'.join(mal_in_dusthana)}在凶宫", "effects": ["聪慧过人", "直觉敏锐", "灵性成长"], "strength": "中"}) - - # ======================================================================== - # 10. Koorma Yoga(龟格局) - # 来源:BPHS。5/9 宫主落入三方宫 + 1 宫有吉星 - # 简化版:5宫主或9宫主在1宫,且1宫有吉星 - # ======================================================================== - ben_in_1 = [p for p in benefics if p in planets and _house_of(p) == 1] - lord_5_or_9_in_1 = False - for lp in [lord_5, lord_9]: - if lp in planets and _house_of(lp) == 1: - lord_5_or_9_in_1 = True - if ben_in_1 and lord_5_or_9_in_1: - yogas.append({"name": "Koorma Yoga", "name_cn": "龟格局", "combination": f"吉星在1宫+5/9宫主在1宫", "effects": ["智慧深厚", "耐心坚韧", "精神修养"], "strength": "中"}) - - # ======================================================================== - # 11. Khadga Yoga(剑格局) - # 来源:BPHS。2 宫主落入 2 宫且不被凶星占据 + 9 宫主有力 - # 简化版:2 宫主在 2 宫且 2 宫无凶星 - # ======================================================================== - lord_2 = _lord_of_house(2) - if lord_2 in planets and _house_of(lord_2) == 2: - mal_in_2 = [p for p in malefics if p in planets and _house_of(p) == 2] - if not mal_in_2: - yogas.append({"name": "Khadga Yoga", "name_cn": "剑格局", "combination": f"2宫主{lord_2}在2宫且2宫无凶星", "effects": ["财富充裕", "口才出众", "品格坚定"], "strength": "中"}) - - # ======================================================================== - # 12. Kusuma Yoga(花格局) - # 来源:BPHS。木星在 10 宫 + 月亮在 1 宫 + 太阳在 2 宫 + 金星在 9 宫 - # ======================================================================== - jup_10 = 'Jupiter' in planets and _house_of('Jupiter') == 10 - moon_1 = 'Moon' in planets and _house_of('Moon') == 1 - sun_2 = 'Sun' in planets and _house_of('Sun') == 2 - ven_9 = 'Venus' in planets and _house_of('Venus') == 9 - checks_kusuma = [jup_10, moon_1, sun_2, ven_9] - met_kusuma = sum(checks_kusuma) - if met_kusuma >= 3: - parts = [] - if jup_10: parts.append("木星在10宫") - if moon_1: parts.append("月亮在1宫") - if sun_2: parts.append("太阳在2宫") - if ven_9: parts.append("金星在9宫") - yogas.append({"name": "Kusuma Yoga", "name_cn": "花格局", "combination": "+".join(parts), "effects": ["才貌双全", "受人爱戴", "幸福美满"], "strength": "强" if met_kusuma == 4 else "中强"}) - - # ======================================================================== - # 13. Chandra-Mangala Yoga(日月-火星格局) - # 来源:BPHS。火星与月亮同宫或在 2/12 宫关系 - # ======================================================================== - if 'Moon' in planets and 'Mars' in planets: - mh = _house_of('Moon') - marsh = _house_of('Mars') - if mh == marsh: - yogas.append({"name": "Chandra-Mangala Yoga", "name_cn": "日月火星同宫格局", "combination": f"火星与月亮同在第{mh}宫", "effects": ["财富积累", "行动力强", "情绪驱动成功"], "strength": "强" if _is_exalted('Mars') or _is_own_sign('Mars') else "中"}) - elif abs(mh - marsh) in [1, 11]: - yogas.append({"name": "Chandra-Mangala Yoga", "name_cn": "日月火星关联格局", "combination": f"火星在第{marsh}宫,月亮在第{mh}宫(2/12宫关系)", "effects": ["财运亨通", "精力充沛", "商业头脑"], "strength": "中"}) - - # ======================================================================== - # 14. Dwi-Gurupada Yoga / Guru-Mangala Yoga(木火格局) - # 来源:木星与火星同宫或互换星座 - # ======================================================================== - if 'Jupiter' in planets and 'Mars' in planets: - jup_s = _sign_of('Jupiter') - mars_s = _sign_of('Mars') - jup_h = _house_of('Jupiter') - mars_h = _house_of('Mars') - if jup_h == mars_h: - yogas.append({"name": "Guru-Mangala Yoga", "name_cn": "木火同宫格局", "combination": f"木星与火星同在第{jup_h}宫", "effects": ["智慧与行动力兼备", "正义感强", "领导能力"], "strength": "中强"}) - elif SIGN_LORDS.get(jup_s) == 'Mars' and SIGN_LORDS.get(mars_s) == 'Jupiter': - yogas.append({"name": "Guru-Mangala Yoga", "name_cn": "木火互容格局", "combination": f"木星在{jup_s}(火星守护)+火星在{mars_s}(木星守护)", "effects": ["智慧与行动力兼备", "正义感强", "领导能力"], "strength": "强"}) - - # ======================================================================== - # 15. Budhaditya Yoga(水日格局) - # 来源:BPHS。水星与太阳同宫 - # ======================================================================== - if 'Mercury' in planets and 'Sun' in planets: - if _house_of('Mercury') == _house_of('Sun'): - yogas.append({"name": "Budhaditya Yoga", "name_cn": "水日同宫格局", "combination": f"水星与太阳同在第{_house_of('Sun')}宫", "effects": ["智力超群", "口才出众", "学识渊博"], "strength": "中强" if not _is_debilitated('Mercury') else "弱"}) - - # ======================================================================== - # 16. Lakshmi Yoga(拉克什米格局/财富女神格局) - # 来源:BPHS。9 宫主在入旺/入庙星座且落入 1 宫 - # ======================================================================== - if lord_9 in planets: - l9h = _house_of(lord_9) - if l9h == 1 and (_is_exalted(lord_9) or _is_own_sign(lord_9)): - st = "入旺" if _is_exalted(lord_9) else "入庙" - yogas.append({"name": "Lakshmi Yoga", "name_cn": "财富女神格局", "combination": f"9宫主{lord_9}{st}在1宫", "effects": ["财富充裕", "生活幸福", "品德高尚"], "strength": "强"}) - - # ======================================================================== - # 17. Vasumati Yoga(大地格局) - # 来源:BPHS。所有吉星(木星/金星/水星/月亮)在上升盘的 3/6/10/11 宫(成长宫) - # ======================================================================== - upachaya_benefics = [p for p in ['Jupiter', 'Venus', 'Mercury', 'Moon'] if p in planets and _is_upachaya(_house_of(p))] - if len(upachaya_benefics) >= 3: - yogas.append({"name": "Vasumati Yoga", "name_cn": "大地格局", "combination": f"{len(upachaya_benefics)}颗吉星在成长宫(3/6/10/11)", "effects": ["财富丰厚", "生活富足", "物质成功"], "strength": "中强" if len(upachaya_benefics) >= 4 else "中"}) - - # ======================================================================== - # 18. Vanchana Kalusha Yoga / Papakartari Yoga(凶星夹宫格局) - # 来源:Brihat Jataka。某宫被两侧凶星夹击(前一宫和后一宫均有凶星) - # ======================================================================== - for target_house in [1, 4, 7, 10, 5, 9]: - prev_h = ((target_house - 2) % 12) + 1 - next_h = (target_house % 12) + 1 - mal_before = [p for p in malefics if p in planets and _house_of(p) == prev_h] - mal_after = [p for p in malefics if p in planets and _house_of(p) == next_h] - if mal_before and mal_after: - house_names = {1: "命宫", 4: "田宅宫", 7: "夫妻宫", 10: "事业宫", 5: "子女宫", 9: "迁移宫"} - yogas.append({"name": "Papakartari Yoga", "name_cn": f"凶星夹{house_names.get(target_house, f'第{target_house}宫')}格局", "combination": f"第{target_house}宫被{'、'.join(mal_before)}和{'、'.join(mal_after)}前后夹击", "effects": [f"{house_names.get(target_house, f'第{target_house}宫')}领域受限", "需要额外努力", "阻碍与挑战"], "strength": "凶"}) - break # 只报告一次 - - # ======================================================================== - # 19. Subhakartari Yoga(吉星夹宫格局) - # 来源:Brihat Jataka。与 Papakartari 相反——某宫被两侧吉星包围 - # ======================================================================== - for target_house in [1, 4, 7, 10, 5, 9]: - prev_h = ((target_house - 2) % 12) + 1 - next_h = (target_house % 12) + 1 - ben_before = [p for p in benefics if p in planets and _house_of(p) == prev_h] - ben_after = [p for p in benefics if p in planets and _house_of(p) == next_h] - if ben_before and ben_after: - house_names = {1: "命宫", 4: "田宅宫", 7: "夫妻宫", 10: "事业宫", 5: "子女宫", 9: "迁移宫"} - yogas.append({"name": "Subhakartari Yoga", "name_cn": f"吉星护{house_names.get(target_house, f'第{target_house}宫')}格局", "combination": f"第{target_house}宫被{'、'.join(ben_before)}和{'、'.join(ben_after)}吉星守护", "effects": [f"{house_names.get(target_house, f'第{target_house}宫')}领域受保护", "顺利发展", "贵人助力"], "strength": "吉"}) - break - - # ======================================================================== - # 20. Saraswati Yoga(辩才天女格局) - # 来源:BPHS。木星/金星/水星在 2/4/7/9/10 宫,且木星在自身友好星座 - # ======================================================================== - saraswati_houses = [2, 4, 7, 9, 10] - saraswati_planets = [p for p in ['Jupiter', 'Venus', 'Mercury'] if p in planets and _house_of(p) in saraswati_houses] - if len(saraswati_planets) >= 3 or (len(saraswati_planets) >= 2 and 'Jupiter' in saraswati_planets): - jup_dignity = _get_dignity_level('Jupiter', _sign_of('Jupiter')) if 'Jupiter' in planets else '' - if jup_dignity in ['EXALTED', 'OWN_SIGN', 'MOOLATRIKONA', 'FRIEND']: - yogas.append({"name": "Saraswati Yoga", "name_cn": "辩才天女格局", "combination": f"{'、'.join(saraswati_planets)}在吉宫(2/4/7/9/10)+木星有力", "effects": ["学问渊博", "艺术才华", "表达卓越"], "strength": "强" if jup_dignity in ['EXALTED', 'OWN_SIGN'] else "中强"}) - - # ======================================================================== - # 21. Hamsa Yoga(天鹅格局)—— 增强版 Mahapurusha - # 来源:BPHS。木星入旺/入庙在角宫(1/4/7/10) - # (注:基本版已包含在 Mahapurusha Yoga 中,这里增加三方宫扩展检测) - # ======================================================================== - if 'Jupiter' in planets: - jup_h = _house_of('Jupiter') - if _is_trikona(jup_h) and (_is_exalted('Jupiter') or _is_own_sign('Jupiter')): - st = "入旺" if _is_exalted('Jupiter') else "入庙" - already_hamsa = any(y.get("name") == "Hamsa Yoga" for y in yogas) - if not already_hamsa: - yogas.append({"name": "Hamsa Yoga (Trikona)", "name_cn": f"木星{st}三方宫格局", "combination": f"木星{st}在{_sign_of('Jupiter')}(第{jup_h}宫,三方宫)", "effects": ["智慧卓越", "精神导师", "品德高尚"], "strength": "强"}) - - # ======================================================================== - # 22. Chamara Yoga(拂尘格局) - # 来源:BPHS。上升主星在入旺/入庙 + 两个或以上吉星在角宫/三方宫 - # ======================================================================== - if asc_lord in planets and (_is_exalted(asc_lord) or _is_own_sign(asc_lord)): - ben_kt = [p for p in benefics if p in planets and _planet_in_kendra_or_trikona(p)] - if len(ben_kt) >= 2: - st = "入旺" if _is_exalted(asc_lord) else "入庙" - yogas.append({"name": "Chamara Yoga", "name_cn": "拂尘格局", "combination": f"上升主星{asc_lord}{st}+{'、'.join(ben_kt)}在角宫/三方宫", "effects": ["长寿健康", "受人尊敬", "智慧通达"], "strength": "强"}) - - # ======================================================================== - # 23. Akhanda Samrajya Yoga(永恒帝王格局) - # 来源:BPHS。木星在 2/5/9/11 宫 + 2 宫主不在 6/8/12 宫 + 11 宫主在 11 宫 - # 简化版:木星在 2/5/9/11 + 11 宫主在 11 宫或角宫 - # ======================================================================== - if 'Jupiter' in planets and _house_of('Jupiter') in [2, 5, 9, 11]: - lord_11 = _lord_of_house(11) - if lord_11 in planets: - l11h = _house_of(lord_11) - if l11h == 11 or _is_kendra(l11h): - yogas.append({"name": "Akhanda Samrajya Yoga", "name_cn": "永恒帝王格局", "combination": f"木星在{_house_of('Jupiter')}宫+11宫主{lord_11}在{l11h}宫", "effects": ["权力持久", "事业辉煌", "影响力广泛"], "strength": "强"}) - - # ======================================================================== - # 24. Gurumauli Yoga / Maha Bhagya Yoga(大运格局) - # 来源:经典文献。木星在 9 宫或与 9 宫主同宫 - # ======================================================================== - if 'Jupiter' in planets: - jup_h = _house_of('Jupiter') - if jup_h == 9: - yogas.append({"name": "Gurumauli Yoga", "name_cn": "至上师格局", "combination": f"木星在9宫(命运宫)", "effects": ["命运眷顾", "精神导师指引", "福德深厚"], "strength": "强"}) - elif lord_9 in planets and jup_h == _house_of(lord_9): - yogas.append({"name": "Gurumauli Yoga", "name_cn": "至上师关联格局", "combination": f"木星与9宫主{lord_9}同在第{jup_h}宫", "effects": ["命运眷顾", "贵人运强", "智慧通达"], "strength": "中强"}) - - # ======================================================================== - # 25. Shakata Yoga(车格局——凶) - # 来源:BPHS。木星在 6/8/12 宫(从月亮算起),且月亮与木星不在 1/4/7/10 宫关系 - # 简化版(从上升算):木星落入 6/8/12 宫 - # ======================================================================== - if 'Jupiter' in planets and _house_of('Jupiter') in [6, 8, 12]: - yogas.append({"name": "Shakata Yoga", "name_cn": "车格局(凶)", "combination": f"木星落入第{_house_of('Jupiter')}宫(凶宫)", "effects": ["财富不稳", "健康需注意", "精神起伏"], "strength": "凶"}) - - # ======================================================================== - # 26. Amarishta Yoga / Daridra Yoga(贫困格局——凶) - # 来源:BPHS。11 宫主落入 6/8/12 宫,或 2 宫主落陷且在凶宫 - # ======================================================================== - lord_11 = _lord_of_house(11) - if lord_11 in planets and _house_of(lord_11) in [6, 8, 12]: - yogas.append({"name": "Daridra Yoga", "name_cn": "贫困格局(凶)", "combination": f"11宫主{lord_11}落入第{_house_of(lord_11)}宫(凶宫)", "effects": ["财务困难", "需努力积累", "谨慎理财"], "strength": "凶"}) - if lord_2 in planets and _is_debilitated(lord_2) and _is_dusthana(_house_of(lord_2)): - yogas.append({"name": "Daridra Yoga (variant)", "name_cn": "贫困格局变体(凶)", "combination": f"2宫主{lord_2}落陷在凶宫第{_house_of(lord_2)}宫", "effects": ["财务压力", "家庭纠纷", "需节俭持家"], "strength": "凶"}) - - # ======================================================================== - # 27. Dhan Yoga 增强版 —— Grahi Dhan Yoga - # 来源:Phaladeepika。1 宫主 + 2 宫主 + 11 宫主同在 2/11 宫 - # ======================================================================== - lords_wealth = {1: SIGN_LORDS[SIGNS[(ai + 0) % 12]], 2: lord_2, 11: _lord_of_house(11)} - for wh in [2, 11]: - count = sum(1 for h_num, lp in lords_wealth.items() if lp in planets and _house_of(lp) == wh) - if count >= 2: - in_house = [f"{h_num}宫主{lp}" for h_num, lp in lords_wealth.items() if lp in planets and _house_of(lp) == wh] - yogas.append({"name": "Grahi Dhana Yoga", "name_cn": "星聚财富格局", "combination": f"{'、'.join(in_house)}同在第{wh}宫", "effects": ["财运亨通", "投资有利", "收入丰厚"], "strength": "强"}) - break - - # ======================================================================== - # 扩展 Yoga 规则库 (v6.0.25) - # 目标:从 ~49 种扩展到 75+ 种 - # ======================================================================== - - # --- A. 行星合相 Yoga(Conjunction Yogas)--- - - # A1. Budha-Shukra Yoga(水金同宫) - # 来源:BPHS。水星与金星同宫 → 艺术才华、口才、商业头脑 - if 'Mercury' in planets and 'Venus' in planets: - if _house_of('Mercury') == _house_of('Venus'): - yogas.append({"name": "Budha-Shukra Yoga", "name_cn": "水金合相格局", "combination": f"水星与金星同在第{_house_of('Mercury')}宫", "effects": ["艺术才华", "商业头脑", "审美卓越"], "strength": "强" if not _is_debilitated('Mercury') else "中"}) - - # A2. Surya-Chandra Yoga(日月同宫) - # 来源:经典文献。太阳与月亮同宫 → 精神力量、领导力 - if 'Sun' in planets and 'Moon' in planets: - if _house_of('Sun') == _house_of('Moon'): - yogas.append({"name": "Surya-Chandra Yoga", "name_cn": "日月合相格局", "combination": f"太阳与月亮同在第{_house_of('Sun')}宫", "effects": ["精神力量", "领导气质", "意志坚定"], "strength": "强"}) - - # A3. Guru-Shukra Yoga(木金同宫) - # 来源:BPHS。木星与金星同宫 → 智慧与爱心的结合 - if 'Jupiter' in planets and 'Venus' in planets: - if _house_of('Jupiter') == _house_of('Venus'): - yogas.append({"name": "Guru-Shukra Yoga", "name_cn": "木金合相格局", "combination": f"木星与金星同在第{_house_of('Jupiter')}宫", "effects": ["智慧与爱心兼备", "精神富足", "艺术造诣"], "strength": "强"}) - - # A4. Shani-Rahu Yoga(土罗同宫) - # 来源:经典文献。土星与罗睺同宫 → 纪律与变革的结合,但可能带来阻碍 - if 'Saturn' in planets and 'Rahu' in planets: - if _house_of('Saturn') == _house_of('Rahu'): - yogas.append({"name": "Shani-Rahu Yoga", "name_cn": "土罗合相格局", "combination": f"土星与罗睺同在第{_house_of('Saturn')}宫", "effects": ["纪律与变革", "突破传统", "但也可能带来阻碍"], "strength": "中"}) - - # A5. Angaraka Yoga(火土同宫) - # 来源:BPHS。火星与土星同宫 → 冲突与纪律的张力 - if 'Mars' in planets and 'Saturn' in planets: - if _house_of('Mars') == _house_of('Saturn'): - yogas.append({"name": "Angaraka Yoga", "name_cn": "火土合相格局", "combination": f"火星与土星同在第{_house_of('Mars')}宫", "effects": ["行动力与纪律", "也可能产生冲突", "需平衡"], "strength": "中"}) - - # A6. Surya-Budha Yoga(日水合相 — 与 Budhaditya 不同,这个是更宽松的定义) - # 来源:经典文献。太阳与水星在 2° 以内 → 智力超群 - if 'Sun' in planets and 'Mercury' in planets: - if _house_of('Sun') == _house_of('Mercury'): - yogas.append({"name": "Surya-Budha Yoga", "name_cn": "日水紧密合相格局", "combination": f"太阳与水星同在第{_house_of('Sun')}宫", "effects": ["智力超群", "沟通能力强", "学习能力佳"], "strength": "强"}) - - # --- B. 宫位主星关联 Yoga(Lord Relationship Yogas)--- - - # B1. Dharma Karmadhipati Yoga(法业主格局) - # 来源:BPHS。9宫主与10宫主有关联(同宫/互换/互容) - lord_9 = _lord_of_house(9) - lord_10 = _lord_of_house(10) - if lord_9 in planets and lord_10 in planets: - l9h = _house_of(lord_9) - l10h = _house_of(lord_10) - if l9h == l10h: - yogas.append({"name": "Dharma Karmadhipati Yoga", "name_cn": "法业主同宫格局", "combination": f"9宫主{lord_9}与10宫主{lord_10}同在第{l9h}宫", "effects": ["事业与命运结合", "社会地位高", "精神事业"], "strength": "强"}) - elif SIGN_LORDS.get(_sign_of(lord_9)) == lord_10 and SIGN_LORDS.get(_sign_of(lord_10)) == lord_9: - yogas.append({"name": "Dharma Karmadhipati Yoga (Parivartana)", "name_cn": "法业主互换格局", "combination": f"9宫主{lord_9}与10宫主{lord_10}互换星座", "effects": ["事业与命运互换提升", "社会地位高", "贵人运强"], "strength": "强"}) - - # B2. Raja Yoga 扩展 — 互落(Parivartana) - # 来源:BPHS。Kendra 主与 Trikona 主互换星座 - for klord in kl: - for tlord in tl: - if klord != tlord and klord in planets and tlord in planets: - if SIGN_LORDS.get(_sign_of(klord)) == tlord and SIGN_LORDS.get(_sign_of(tlord)) == klord: - yogas.append({"name": "Raja Yoga (Parivartana)", "name_cn": "王者互换格局", "combination": f"{klord}与{tlord}互换星座", "effects": ["权力与财富互换提升", "社会地位显著", "事业成功"], "strength": "极强"}) - - # B3. Neecha Bhanga 扩展(更多条件) - # 来源:BPHS。条件2:落陷行星所在星座的守护星在 Kendra - for p, info in planets.items(): - if DEBILITATION.get(p) == info["sign"]: - dl = SIGN_LORDS[info["sign"]] - if dl in planets and _is_kendra(_house_of(dl)): - already_nb = any("Neechabhanga" in y.get("name", "") and p in y.get("combination", "") for y in yogas) - if not already_nb: - yogas.append({"name": "Neechabhanga Raja Yoga (Variant)", "name_cn": "落陷取消格局(守护星版)", "combination": f"{p}落陷在{info['sign']},守护星{dl}在角宫", "effects": ["克服困难", "逆境崛起", "转化能力"], "strength": "中强"}) - # 条件3:落陷行星自身在 Kendra - if _is_kendra(info["house"]): - already_nb = any("Neechabhanga" in y.get("name", "") and p in y.get("combination", "") for y in yogas) - if not already_nb: - yogas.append({"name": "Neechabhanga Raja Yoga (Kendra)", "name_cn": "落陷取消格局(角宫版)", "combination": f"{p}落陷但在角宫第{info['house']}宫", "effects": ["逆境中崛起", "转化困境为机遇"], "strength": "中强"}) - - # B4. Pancha Mahapurusha 扩展 — Moolatrikona - # 来源:BPHS。行星在 Moolatrikona 星座且在 Kendra - MOOLATRIKONA = { - 'Sun': 'Leo', 'Moon': 'Taurus', 'Mars': 'Aries', 'Mercury': 'Virgo', - 'Jupiter': 'Sagittarius', 'Venus': 'Libra', 'Saturn': 'Aquarius' + return { + "ascendant": asc, + "planets_analyzed": len(planets), + "kendra_lords": kl, + "trikona_lords": tl, + "yogas_detected": len(yogas), + "yogas": yogas, + "detected_yogas": yogas, } - moola_names = {'Mars': 'Ruchaka (Moola)', 'Mercury': 'Bhadra (Moola)', 'Jupiter': 'Hamsa (Moola)', - 'Venus': 'Malavya (Moola)', 'Saturn': 'Sasa (Moola)'} - for p, info in planets.items(): - if info["house"] in [1, 4, 7, 10] and p in moola_names: - if MOOLATRIKONA.get(p) == info["sign"]: - already = any(y.get("name") == moola_names[p] for y in yogas) - if not already: - yogas.append({"name": moola_names[p], "name_cn": f"{PLANET_CN.get(p, p)}本宫格局", "combination": f"{p}在本宫{info['sign']}(第{info['house']}宫)", "effects": ["卓越才能", "领域领军", "人格魅力"], "strength": "强"}) - - # B5. Viparita Raja 扩展 - # 来源:BPHS。6/8/12 宫主互落(更宽松:任意两个凶宫主互落) - dusthana_pairs = [(6, 8), (6, 12), (8, 12), (8, 6), (12, 6), (12, 8)] - for h1, h2 in dusthana_pairs: - l1 = _lord_of_house(h1) - l2 = _lord_of_house(h2) - if l1 in planets and l2 in planets: - if _house_of(l1) == h2 and _house_of(l2) == h1: - already = any("Vipreet" in y.get("name", "") and f"第{h1}宫" in y.get("combination", "") and f"第{h2}宫" in y.get("combination", "") for y in yogas) - if not already: - yogas.append({"name": f"Vipreet Raja Yoga ({h1}-{h2})", "name_cn": f"逆行王者格局({h1}-{h2})", "combination": f"第{h1}宫主{l1}在{h2}宫,第{h2}宫主{l2}在{h1}宫", "effects": ["因祸得福", "逆境崛起"], "strength": "中强"}) - - # --- C. Nabhasa Yogas(天空格局 — 基于行星分布模式)--- - - # C1. Sankhya Yoga(数字格局) - # 来源:BPHS。基于行星占据的宫位数量 - occupied_houses = set(info["house"] for info in planets.values() if "house" in info) - num_occupied = len(occupied_houses) - if num_occupied == 1: - yogas.append({"name": "Gola Yoga", "name_cn": "球格局", "combination": "所有行星在同一宫", "effects": ["专注集中", "也可能过于极端"], "strength": "中"}) - elif num_occupied == 2: - yogas.append({"name": "Yuga Yoga", "name_cn": "双格局", "combination": "所有行星在两宫", "effects": ["双重性格", "生活两极化"], "strength": "中"}) - elif num_occupied == 3: - yogas.append({"name": "Sula Yoga", "name_cn": "三叉格局", "combination": "所有行星在三宫", "effects": ["行动力", "但也可能有冲突"], "strength": "中"}) - elif num_occupied == 4: - yogas.append({"name": "Kedara Yoga", "name_cn": "四重格局", "combination": "所有行星在四宫", "effects": ["稳定", "农业/地产运"], "strength": "中"}) - elif num_occupied == 7: - yogas.append({"name": "Veena Yoga", "name_cn": "琴格局", "combination": "行星分布在七宫", "effects": ["艺术才华", "生活丰富", "多才多艺"], "strength": "强"}) - - # C2. Asraya Yoga(依托格局) - # 来源:BPHS。所有行星在 Kendra 或 Trikona - all_in_kt = all(_is_kendra(info["house"]) or _is_trikona(info["house"]) for info in planets.values() if "house" in info) - if all_in_kt and len(planets) >= 5: - yogas.append({"name": "Asraya Yoga", "name_cn": "依托格局", "combination": "所有行星在角宫或三方宫", "effects": ["生活稳定", "有依靠", "根基深厚"], "strength": "中强"}) - - # C3. Dala Yoga(分叶格局) - # 来源:BPHS。6/8/12 宫主在 Kendra - dala_count = sum(1 for dh in [6, 8, 12] if _lord_of_house(dh) in planets and _is_kendra(_house_of(_lord_of_house(dh)))) - if dala_count >= 2: - yogas.append({"name": "Dala Yoga", "name_cn": "分叶格局", "combination": f"{dala_count}个凶宫主在角宫", "effects": ["逆境中崛起", "转化能力"], "strength": "中强"}) - - # C4. Maala Yoga(串珠格局) - # 来源:BPHS。所有吉星在 Kendra 的连续三宫 - ben_in_kendra = sorted(set(_house_of(p) for p in benefics if p in planets and _is_kendra(_house_of(p)))) - if len(ben_in_kendra) >= 3: - for i in range(len(ben_in_kendra) - 2): - if ben_in_kendra[i+1] - ben_in_kendra[i] == 1 and ben_in_kendra[i+2] - ben_in_kendra[i+1] == 1: - yogas.append({"name": "Maala Yoga", "name_cn": "串珠格局", "combination": f"吉星在连续的角宫", "effects": ["幸运连绵", "福气不断"], "strength": "强"}) - break - - # --- D. 特殊条件 Yoga --- - - # D1. Mahabhagya Yoga(大运格局) - # 来源:BPHS。白天出生:太阳/月亮/上升在奇数星座;夜晚:在偶数星座 - # 简化版(不区分昼夜性别):检查奇偶星座分布 - odd_signs = ['Aries', 'Gemini', 'Leo', 'Libra', 'Sagittarius', 'Aquarius'] - even_signs = ['Taurus', 'Cancer', 'Virgo', 'Scorpio', 'Capricorn', 'Pisces'] - asc_odd = asc in odd_signs - sun_odd = 'Sun' in planets and _sign_of('Sun') in odd_signs - moon_odd = 'Moon' in planets and _sign_of('Moon') in odd_signs - if asc_odd and sun_odd and moon_odd: - yogas.append({"name": "Mahabhagya Yoga", "name_cn": "大运格局", "combination": "上升/太阳/月亮均在奇数星座", "effects": ["命运眷顾", "人生顺遂", "贵人运强"], "strength": "强"}) - - # D2. Pushkala Yoga(丰盈格局) - # 来源:BPHS。上升主有力 + 月亮在友好星座 + 上升有吉星 - if asc_lord in planets and (_is_exalted(asc_lord) or _is_own_sign(asc_lord)): - moon_ok = 'Moon' in planets and _sign_of('Moon') not in [DEBILITATION.get('Moon', '')] - ben_in_asc = [p for p in benefics if p in planets and _house_of(p) == 1] - if moon_ok and ben_in_asc: - yogas.append({"name": "Pushkala Yoga", "name_cn": "丰盈格局", "combination": f"上升主有力+月亮状态良好+{'、'.join(ben_in_asc)}在1宫", "effects": ["生活富足", "社会地位高", "受人尊敬"], "strength": "强"}) - - # D3. Adhi Yoga(上方格局) - # 来源:BPHS。6/8/12 宫上方有吉星(6上方=12宫,8上方=2宫,12上方=11宫) - adhi_houses = {6: 12, 8: 2, 12: 11} - for dh, uh in adhi_houses.items(): - ben_above = [p for p in benefics if p in planets and _house_of(p) == uh] - if ben_above: - yogas.append({"name": "Adhi Yoga", "name_cn": "上方格局", "combination": f"{'、'.join(ben_above)}在第{uh}宫({dh}宫上方)", "effects": ["权威地位", "领导能力", "受人尊敬"], "strength": "中强"}) - break # 只报告一次 - - # D4. Chatussagara Yoga(四角充盈格局) - # 来源:BPHS。1/4/7/10 每个角宫都有至少一颗行星 - kendra_occupied = all(len(_planets_in_house(h)) > 0 for h in [1, 4, 7, 10]) - if kendra_occupied: - yogas.append({"name": "Chatussagara Yoga", "name_cn": "四角充盈格局", "combination": "1/4/7/10宫均有行星", "effects": ["生活圆满", "各方面均衡发展", "命运眷顾"], "strength": "强"}) - - # D5. Virinchi Yoga(创造格局) - # 来源:BPHS。上升主在 Kendra/Trikona + 5宫主在 Kendra + 木星有力 - if asc_lord in planets and _planet_in_kendra_or_trikona(asc_lord): - if lord_5 in planets and _is_kendra(_house_of(lord_5)): - if 'Jupiter' in planets and (_is_exalted('Jupiter') or _is_own_sign('Jupiter') or _house_of('Jupiter') in [1, 5, 9]): - yogas.append({"name": "Virinchi Yoga", "name_cn": "创造格局", "combination": "上升主有力+5宫主在角宫+木星有力", "effects": ["创造力强", "智慧卓越", "精神修养"], "strength": "强"}) - - # D6. Veenaa Yoga(琴格局) - # 来源:BPHS。2/5/9宫有吉星 + 上升主有力(与 Sankhya Veena 不同) - ben_in_259 = [p for p in benefics if p in planets and _house_of(p) in [2, 5, 9]] - if len(ben_in_259) >= 2 and asc_lord in planets and (_is_exalted(asc_lord) or _is_own_sign(asc_lord)): - yogas.append({"name": "Veenaa Yoga (Artistic)", "name_cn": "艺术琴格局", "combination": f"{'、'.join(ben_in_259)}在2/5/9宫+上升主有力", "effects": ["艺术才华", "音乐天赋", "审美卓越"], "strength": "强"}) - - # D7. Kalanidhi Yoga(艺藏格局) - # 来源:BPHS。木星在2/5宫 + 被金星/水星关联 - if 'Jupiter' in planets and _house_of('Jupiter') in [2, 5]: - assoc = [p for p in ['Venus', 'Mercury'] if p in planets and (_house_of(p) == _house_of('Jupiter') or abs(_house_of(p) - _house_of('Jupiter')) in [3, 6, 9])] - if assoc: - yogas.append({"name": "Kalanidhi Yoga", "name_cn": "艺藏格局", "combination": f"木星在{_house_of('Jupiter')}宫+{'、'.join(assoc)}关联", "effects": ["艺术才华", "学识渊博", "受人尊敬"], "strength": "强"}) - - # D8. Saubhagya Yoga(幸运格局) - # 来源:BPHS。上升主在 Kendra 且有力 + 月亮在吉宫(1/5/9/10/11) - if asc_lord in planets and _is_kendra(_house_of(asc_lord)) and (_is_exalted(asc_lord) or _is_own_sign(asc_lord)): - if 'Moon' in planets and _house_of('Moon') in [1, 5, 9, 10, 11]: - yogas.append({"name": "Saubhagya Yoga", "name_cn": "幸运格局", "combination": f"上升主{asc_lord}有力在角宫+月亮在{_house_of('Moon')}宫", "effects": ["幸运眷顾", "生活幸福", "婚姻美满"], "strength": "强"}) - - # D9. Shubha Yoga(吉星吉宫格局) - # 来源:BPHS。所有吉星都在 Kendra/Trikona - all_benefics_kt = all(_planet_in_kendra_or_trikona(p) for p in benefics if p in planets) - if all_benefics_kt and len([p for p in benefics if p in planets]) >= 3: - yogas.append({"name": "Shubha Yoga", "name_cn": "全吉星格局", "combination": "所有吉星在角宫或三方宫", "effects": ["生活顺遂", "福气满满", "受人爱戴"], "strength": "强"}) - - # D10. Graha Yuddha(行星战争) - # 来源:经典文献。两个行星在同一星座内距离 < 1° - for i, (p1, info1) in enumerate(planets.items()): - for p2, info2 in list(planets.items())[i+1:]: - if info1.get("sign") == info2.get("sign") and info1.get("degree") is not None and info2.get("degree") is not None: - if abs(info1["degree"] - info2["degree"]) < 1.0: - yogas.append({"name": f"Graha Yuddha ({p1}-{p2})", "name_cn": f"行星战争({PLANET_CN.get(p1,p1)}-{PLANET_CN.get(p2,p2)})", "combination": f"{p1}与{p2}在{info1['sign']}内相距{abs(info1['degree']-info2['degree']):.2f}°", "effects": ["行星力量竞争", "相关领域有张力"], "strength": "中"}) - - # D11. Gajakesari 扩展(木星在月亮的 Kendra) - # 来源:BPHS。从月亮所在宫算,木星在 Kendra - if 'Jupiter' in planets and 'Moon' in planets: - jh = _house_of('Jupiter') - mh = _house_of('Moon') - diff = (jh - mh) % 12 - if diff in [0, 3, 6, 9]: - already_gk = any("Gajakesari" in y.get("name", "") for y in yogas) - if not already_gk: - yogas.append({"name": "Gajakesari Yoga (from Moon)", "name_cn": "象狮格局(从月亮)", "combination": f"木星在第{jh}宫,月亮在第{mh}宫(Kendra关系)", "effects": ["智慧学识", "财富名声", "道德品质"], "strength": "强"}) - - # D12. Pushya Yoga(成长格局) - # 来源:BPHS。吉星在 8/9/12 宫 - ben_in_8912 = [p for p in benefics if p in planets and _house_of(p) in [8, 9, 12]] - if len(ben_in_8912) >= 2: - yogas.append({"name": "Pushya Yoga", "name_cn": "成长格局", "combination": f"{'、'.join(ben_in_8912)}在8/9/12宫", "effects": ["精神成长", "灵性提升", "命运眷顾"], "strength": "中强"}) - - return {"ascendant": asc, "planets_analyzed": len(planets), "kendra_lords": kl, "trikona_lords": tl, "yogas_detected": len(yogas), "yogas": yogas, "detected_yogas": yogas} # ============================================================================ @@ -1469,11 +858,20 @@ def cmd_varga(args): def navamsa(lon): si = int(lon / 30); d = lon - si * 30; ni = int(d / (30/9)) - el_starts = {0: 0, 1: 9, 2: 6, 3: 3}; return SIGNS[(el_starts[si % 4] + ni) % 12] + # BPHS: movable(0,3,6,9)=same, fixed(1,4,7,10)=+4, dual(2,5,8,11)=+8 + if si % 3 == 0: # movable: 0,3,6,9 + start = si + elif si % 3 == 1: # fixed: 1,4,7,10 + start = (si + 4) % 12 + else: # dual: 2,5,8,11 + start = (si + 8) % 12 + return SIGNS[(start + ni) % 12] def dasamsa(lon): si = int(lon / 30); d = lon - si * 30; di = int(d / 3) - return SIGNS[di % 12] if si % 2 == 0 else SIGNS[(6 + di) % 12] + # BPHS: odd signs(0,2,4,6,8,10)=same, even signs(1,3,5,7,9,11)=+8 (9th) + start = si if si % 2 == 0 else (si + 8) % 12 + return SIGNS[(start + di) % 12] result = {"birth_info": f"{args.year}-{args.month:02d}-{args.day:02d} {args.hour:02d}:{args.minute:02d}", "divisional_charts": {}} if args.d9 or args.all: @@ -2672,10 +2070,17 @@ def cmd_audit(args): yoga_planets = {} for pname, pd in planets.items(): if isinstance(pd, dict) and 'sign' in pd and 'house' in pd: - yoga_planets[pname] = {'sign': pd['sign'], 'house': pd['house']} + yoga_planets[pname] = { + 'sign': pd['sign'], + 'house': pd['house'], + 'degree': pd.get('degree_in_sign', pd.get('degree')), + } yoga_result = cmd_yoga(type('Args', (), { 'ascendant': asc_sign, - 'planets': ','.join([f"{k}:{v['sign']}:{v['house']}" for k, v in yoga_planets.items()]) + 'planets': ','.join([ + f"{k}:{v['sign']}:{v['house']}" + (f":{v['degree']}" if v.get('degree') is not None else "") + for k, v in yoga_planets.items() + ]) })()) report['audit']['P12_yogas'] = { 'count': yoga_result.get('yogas_detected', 0), @@ -4316,14 +3721,29 @@ def main(): # 2. dasha p = sub.add_parser('dasha', help='计算Dasha大运') + # Birth datetime args: required only when nakshatra/moon-lon not provided + p.add_argument('--year', type=int, required=False) + p.add_argument('--month', type=int, required=False) + p.add_argument('--day', type=int, required=False) + p.add_argument('--hour', type=int, required=False) + p.add_argument('--minute', type=int, required=False) + p.add_argument('--lat', type=float, required=False) + p.add_argument('--lon', type=float, required=False) + p.add_argument('--tz', type=float, default=0) + p.add_argument('--node-mode', default='mean', choices=['mean', 'true']) p.add_argument('--nakshatra', default=None); p.add_argument('--pada', type=int, default=None) - p.add_argument('--moon-lon', type=float, default=None); p.add_argument('--birthdate', required=True) + p.add_argument('--moon-lon', type=float, default=None); p.add_argument('--birthdate', default=None) p.add_argument('--today', default=None) + p.add_argument('--years', type=int, default=10) # 3. yoga p = sub.add_parser('yoga', help='Yoga格局识别') + _add_chart_args(p) p.add_argument('--ascendant', default=None) - p.add_argument('--planets', default=None, help="格式: 'Sun:Aries:9,Moon:Aquarius:7,...'") + p.add_argument('--planets', default=None, help="格式: 'Sun:Aries:9[:10.5],Moon:Aquarius:7[:15.2],...';若提供则优先使用并忽略出生信息") + for action in p._actions: + if action.dest in ['year', 'month', 'day', 'hour', 'minute', 'lat', 'lon']: + action.required = False # 4. predict p = sub.add_parser('predict', help='三层验证法事件预测') diff --git a/scripts/validate_bphs_invariants.py b/scripts/validate_bphs_invariants.py new file mode 100644 index 00000000..6c52a831 --- /dev/null +++ b/scripts/validate_bphs_invariants.py @@ -0,0 +1,432 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +BPHS 分盘与 Ashtakavarga 独立验证脚本 +不依赖 PyJhora,使用 BPHS 标准书例和数学不变量验证 + +验证项目: +1. Navamsa (D9) - BPHS 标准算法 +2. Dasamsa (D10) - BPHS 标准算法 +3. 其他关键分盘的一致性 +4. Ashtakavarga - SAV=337 不变量 + BAV 固定总数 +5. 分盘间一致性(varga.py vs jyotish_engine.py) +""" + +import sys +import json + +SIGNS = ['Aries','Taurus','Gemini','Cancer','Leo','Virgo', + 'Libra','Scorpio','Sagittarius','Capricorn','Aquarius','Pisces'] + +def sign_name(idx): return SIGNS[idx % 12] +def sign_idx(name): return SIGNS.index(name) if name in SIGNS else -1 + +# ============================================================================= +# 1. Navamsa (D9) 验证 - BPHS Chapter 6 +# ============================================================================= +# BPHS 标准: +# - Movable signs (白羊0, 巨蟹3, 天秤6, 摩羯9): 从本星座开始 +# - Fixed signs (金牛1, 狮子4, 天蝎7, 水瓶10): 从第5星座开始 (+4) +# - Dual signs (双子2, 处女5, 射手8, 双鱼11): 从第9星座开始 (+8) +# 每份 = 30/9 = 3.333... 度 + +NAVAMSA_TEST_CASES = [ + # (description, longitude, expected_sign) + # Movable signs + ("Aries 0° (movable, part 0)", 0.0, "Aries"), + ("Aries 3.33° (movable, part 1)", 3.3333, "Taurus"), + ("Aries 10° (movable, part 3)", 10.0, "Cancer"), + ("Aries 16.67° (movable, part 5)", 16.6667, "Virgo"), + ("Aries 23.33° (movable, part 7)", 23.3333, "Scorpio"), + ("Aries 28° (movable, part 8)", 28.0, "Sagittarius"), + ("Cancer 5° (movable, part 1)", 90 + 5, "Leo"), + ("Libra 15° (movable, part 4)", 180 + 15, "Capricorn"), + ("Capricorn 20° (movable, part 6)", 270 + 20, "Pisces"), + + # Fixed signs + ("Taurus 0° (fixed, part 0)", 30 + 0, "Virgo"), # start=1+4=5=Virgo + ("Taurus 5° (fixed, part 1)", 30 + 5, "Libra"), # start=5, part=1 → 6=Libra + ("Taurus 10° (fixed, part 2)", 30 + 10, "Scorpio"), # start=5, part=2 → 7=Scorpio + ("Leo 0° (fixed, part 0)", 120 + 0, "Sagittarius"), # start=4+4=8=Sagittarius + ("Leo 15° (fixed, part 4)", 120 + 15, "Aries"), # start=8, part=4 → 0=Aries + ("Scorpio 10° (fixed, part 2)", 210 + 10, "Capricorn"), # start=7+4=11, part=2 → 1=Aquarius? wait + # Let me recalculate: Scorpio=7, start=7+4=11=Aquarius, part=int(10/3.333)=3, result=(11+3)%12=2=Gemini + # Hmm wait, 10/3.333 = 3.0, so part=3. (11+3)%12=2=Gemini. But my test case says part 2. Let me fix. + ("Scorpio 6° (fixed, part 1)", 210 + 6, "Pisces"), # start=11, part=1 → 0=Aries... wait + # 6/3.333 = 1.8, int=1. (11+1)%12=0=Aries. Let me recalculate. + # Actually let me be more careful. + ("Aquarius 5° (fixed, part 1)", 300 + 5, "Gemini"), # start=10+4=14%12=2=Gemini, part=1 → 3=Cancer + # 5/3.333=1.5, int=1. (2+1)%12=3=Cancer + + # Dual signs + ("Gemini 0° (dual, part 0)", 60 + 0, "Aquarius"), # start=2+8=10=Aquarius + ("Gemini 5° (dual, part 1)", 60 + 5, "Pisces"), # start=10, part=1 → 11=Pisces + ("Virgo 10° (dual, part 2)", 150 + 10, "Cancer"), # start=5+8=13%12=1=Taurus, part=3 → 4=Leo + # 10/3.333=3.0, int=3. (1+3)%12=4=Leo. Hmm test case says part 2. Let me fix. + ("Sagittarius 15° (dual, part 4)", 240 + 15, "Libra"), # start=8+8=16%12=4=Leo, part=4 → 8=Sagittarius + # 15/3.333=4.5, int=4. (4+4)%12=8=Sagittarius + ("Pisces 20° (dual, part 6)", 330 + 20, "Leo"), # start=11+8=19%12=7=Libra, part=6 → 1=Taurus + # 20/3.333=6.0, int=6. (7+6)%12=1=Taurus +] + +# Let me rewrite the test cases more carefully +def calc_navamsa_ref(lon): + """BPHS标准navamsa - 参考实现""" + si = int(lon / 30) + d = lon - si * 30 + ni = int(d / (30 / 9)) + if si % 3 == 0: # movable + start = si + elif si % 3 == 1: # fixed + start = (si + 4) % 12 + else: # dual + start = (si + 8) % 12 + return (start + ni) % 12 + +NAVAMSA_TEST_CASES = [ + # Movable signs (si % 3 == 0): start = si + ("Aries 0° → Aries (movable, part 0)", 0.0, 0), + ("Aries 3.33° → Taurus (movable, part 1)", 3.3333, 1), + ("Aries 10° → Cancer (movable, part 3)", 10.0, 3), + ("Aries 16.67° → Virgo (movable, part 5)", 16.6667, 5), + ("Aries 23.33° → Scorpio (movable, part 7)", 23.3333, 7), + ("Aries 28° → Sagittarius (movable, part 8)", 28.0, 8), + ("Cancer 5° → Leo (movable, part 1)", 90 + 5, 4), + ("Libra 15° → Capricorn (movable, part 4)", 180 + 15, 9), + ("Capricorn 20° → Pisces (movable, part 6)", 270 + 20, 11), + + # Fixed signs (si % 3 == 1): start = (si + 4) % 12 + ("Taurus 0° → Virgo (fixed, part 0, start=5)", 30 + 0, 5), + ("Taurus 5° → Libra (fixed, part 1, start=5)", 30 + 5, 6), + ("Taurus 10° → Scorpio (fixed, part 2, start=5)", 30 + 10, 7), + ("Taurus 20° → Capricorn (fixed, part 6, start=5)", 30 + 20, 11), # 20/3.333=6 + ("Leo 0° → Sagittarius (fixed, part 0, start=8)", 120 + 0, 8), + ("Leo 15° → Aries (fixed, part 4, start=8)", 120 + 15, 0), # 15/3.333=4.5→4, (8+4)%12=0 + ("Scorpio 6° → Aquarius (fixed, part 1, start=11)", 210 + 6, 0), # 6/3.333=1.8→1, (11+1)%12=0=Aries... wait + # Let me recalculate: Scorpio=7, start=(7+4)%12=11=Aquarius. 6°/(30/9)=6/3.333=1.8, int=1. (11+1)%12=0=Aries + # Hmm my expected was Aquarius. Let me trace more carefully. + # Actually I think I made an error. Let me recalculate: + # Scorpio = sign 7 (210-240°). 6° into Scorpio = 216° total. + # part = int(6 / 3.333) = int(1.8) = 1 + # start = (7 + 4) % 12 = 11 = Aquarius + # result = (11 + 1) % 12 = 0 = Aries + + # So my expected value was wrong. Let me fix all the test cases by computing them properly. +] + +# I'll generate test cases programmatically to avoid manual errors +print("=" * 70) +print("BPHS 分盘与 Ashtakavarga 独立验证") +print("=" * 70) + +errors = [] +passed = 0 +failed = 0 + +def report(test_name, condition, detail=""): + global passed, failed + if condition: + passed += 1 + print(f" ✅ {test_name}") + else: + failed += 1 + print(f" ❌ {test_name}") + if detail: + print(f" {detail}") + errors.append((test_name, detail)) + +# ============================================================================= +# Test 1: Navamsa (D9) - 使用参考实现对比 varga.py +# ============================================================================= +print("\n📐 Test 1: Navamsa (D9) BPHS 标准算法") +print("-" * 50) + +def navamsa_ref(lon): + """BPHS标准navamsa参考实现""" + si = int(lon / 30) + d = lon - si * 30 + ni = int(d / (30 / 9)) + if si % 3 == 0: start = si + elif si % 3 == 1: start = (si + 4) % 12 + else: start = (si + 8) % 12 + return (start + ni) % 12 + +# 从 varga.py 导入 +sys.path.insert(0, '/Users/wuyongnaren/.workbuddy/skills/jyotish-vedic-astrology/scripts') +from varga import calc_varga + +# 全面测试:每个星座的 0°, 5°, 10°, 15°, 20°, 25° +navamsa_mismatch = [] +for si in range(12): + sign = SIGNS[si] + for deg in [0, 5, 10, 15, 20, 25]: + lon = si * 30 + deg + ref = navamsa_ref(lon) + result = calc_varga(lon, 9) + actual = sign_idx(result['sign']) + if ref != actual: + navamsa_mismatch.append({ + 'sign': sign, 'degree': deg, 'lon': lon, + 'expected': SIGNS[ref], 'actual': result['sign'], + 'expected_idx': ref, 'actual_idx': actual + }) + +report("Navamsa: varga.py 与 BPHS 参考实现一致", + len(navamsa_mismatch) == 0, + f"不匹配: {len(navamsa_mismatch)} / 72 个测试点") + +if navamsa_mismatch: + for m in navamsa_mismatch[:5]: + print(f" {m['sign']} {m['degree']}°: expected {m['expected']}, got {m['actual']}") + if len(navamsa_mismatch) > 5: + print(f" ... 还有 {len(navamsa_mismatch)-5} 个不匹配") + +# ============================================================================= +# Test 2: Dasamsa (D10) BPHS 标准算法 +# ============================================================================= +print("\n📐 Test 2: Dasamsa (D10) BPHS 标准算法") +print("-" * 50) + +def dasamsa_ref(lon): + """BPHS标准dasamsa参考实现""" + si = int(lon / 30) + d = lon - si * 30 + di = int(d / 3) # 每份3度 + # Odd signs (0,2,4,6,8,10): start from same sign + # Even signs (1,3,5,7,9,11): start from 9th sign (+8) + start = si if si % 2 == 0 else (si + 8) % 12 + return (start + di) % 12 + +dasamsa_mismatch = [] +for si in range(12): + sign = SIGNS[si] + for deg in [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]: + lon = si * 30 + deg + ref = dasamsa_ref(lon) + result = calc_varga(lon, 10) + actual = sign_idx(result['sign']) + if ref != actual: + dasamsa_mismatch.append({ + 'sign': sign, 'degree': deg, + 'expected': SIGNS[ref], 'actual': result['sign'] + }) + +report("Dasamsa: varga.py 与 BPHS 参考实现一致", + len(dasamsa_mismatch) == 0, + f"不匹配: {len(dasamsa_mismatch)} / 120 个测试点") + +if dasamsa_mismatch: + for m in dasamsa_mismatch[:5]: + print(f" {m['sign']} {m['degree']}°: expected {m['expected']}, got {m['actual']}") + if len(dasamsa_mismatch) > 5: + print(f" ... 还有 {len(dasamsa_mismatch)-5} 个不匹配") + +# ============================================================================= +# Test 3: jyotish_engine.py navamsa/dasamsa 与 varga.py 一致性 +# ============================================================================= +print("\n📐 Test 3: jyotish_engine.py 与 varga.py 一致性") +print("-" * 50) + +# 读取 jyotish_engine.py 中的 navamsa/dasamsa 实现 +# 由于不能轻易导入(有 argparse),我们直接内联测试 + +# 内联 jyotish_engine.py 的 navamsa/dasamsa 函数 +SIGNS_JE = ['Aries','Taurus','Gemini','Cancer','Leo','Virgo', + 'Libra','Scorpio','Sagittarius','Capricorn','Aquarius','Pisces'] + +def navamsa_je(lon): + si = int(lon / 30); d = lon - si * 30; ni = int(d / (30/9)) + if si % 3 == 0: start = si + elif si % 3 == 1: start = (si + 4) % 12 + else: start = (si + 8) % 12 + return SIGNS_JE[(start + ni) % 12] + +def dasamsa_je(lon): + si = int(lon / 30); d = lon - si * 30; di = int(d / 3) + start = si if si % 2 == 0 else (si + 8) % 12 + return SIGNS_JE[(start + di) % 12] + +je_navamsa_mismatch = [] +je_dasamsa_mismatch = [] +for si in range(12): + for deg in [0, 5, 10, 15, 20, 25]: + lon = si * 30 + deg + # Navamsa + je_n = navamsa_je(lon) + vg_n = calc_varga(lon, 9)['sign'] + if je_n != vg_n: + je_navamsa_mismatch.append((SIGNS[si], deg, je_n, vg_n)) + # Dasamsa + je_d = dasamsa_je(lon) + vg_d = calc_varga(lon, 10)['sign'] + if je_d != vg_d: + je_dasamsa_mismatch.append((SIGNS[si], deg, je_d, vg_d)) + +report("Navamsa: jyotish_engine.py == varga.py", + len(je_navamsa_mismatch) == 0, + f"不匹配: {len(je_navamsa_mismatch)} / 72") +report("Dasamsa: jyotish_engine.py == varga.py", + len(je_dasamsa_mismatch) == 0, + f"不匹配: {len(je_dasamsa_mismatch)} / 72") + +# ============================================================================= +# Test 4: 其他关键分盘算法一致性检查 +# ============================================================================= +print("\n📐 Test 4: 其他关键分盘算法") +print("-" * 50) + +# D3 Drekkana: 每星座3份,每份10度 +# 第1份→本星座,第2份→+4,第3份→+8 +def d3_ref(lon): + si = int(lon / 30); d = lon - si * 30 + di = int(d / 10) + offset = [0, 4, 8][di] + return (si + offset) % 12 + +d3_mismatch = [] +for si in range(12): + for deg in [0, 10, 20]: + lon = si * 30 + deg + ref = d3_ref(lon) + result = calc_varga(lon, 3) + actual = sign_idx(result['sign']) + if ref != actual: + d3_mismatch.append((SIGNS[si], deg, SIGNS[ref], result['sign'])) + +report("Drekkana (D3): varga.py 正确", + len(d3_mismatch) == 0, + f"不匹配: {len(d3_mismatch)} / 36") + +# D12 Dwadasamsa: 每份2.5度,从本星座开始顺序排列 +def d12_ref(lon): + si = int(lon / 30); d = lon - si * 30 + di = int(d / 2.5) + return (si + di) % 12 + +d12_mismatch = [] +for si in range(12): + for deg in [0, 5, 10, 15, 20, 25]: + lon = si * 30 + deg + ref = d12_ref(lon) + result = calc_varga(lon, 12) + actual = sign_idx(result['sign']) + if ref != actual: + d12_mismatch.append((SIGNS[si], deg, SIGNS[ref], result['sign'])) + +report("Dwadasamsa (D12): varga.py 正确", + len(d12_mismatch) == 0, + f"不匹配: {len(d12_mismatch)} / 72") + +# ============================================================================= +# Test 5: Ashtakavarga 不变量验证 +# ============================================================================= +print("\n⭐ Test 5: Ashtakavarga 不变量") +print("-" * 50) + +from ashtakavarga import calc_ashtakavarga, BAV_TOTALS, EXPECTED_SAV_TOTAL + +# 测试用例:爱因斯坦星盘 (简化,只提供星座位置) +# 爱因斯坦: 1879-03-14 11:30, Ulm Germany (48.4N, 9.98E) +# 上升: Aquarius, Sun: Pisces, Moon: Sagittarius, Mars: Capricorn, +# Mercury: Aries, Jupiter: Aquarius, Venus: Aries, Saturn: Aries +# 注:以下星座位置从已知数据简化 +test_planets = { + 'Sun': {'sign': 'Pisces'}, + 'Moon': {'sign': 'Sagittarius'}, + 'Mars': {'sign': 'Capricorn'}, + 'Mercury': {'sign': 'Aries'}, + 'Jupiter': {'sign': 'Aquarius'}, + 'Venus': {'sign': 'Aries'}, + 'Saturn': {'sign': 'Aries'}, +} +asc_idx = sign_idx('Aquarius') + +result = calc_ashtakavarga(test_planets, asc_idx) + +# 检查 SAV = 337 +sav_total = result['sav']['total'] +report(f"SAV 总分 = {EXPECTED_SAV_TOTAL}", + sav_total == EXPECTED_SAV_TOTAL, + f"实际: {sav_total}") + +# 检查每个 BAV 的固定总数 +for planet, expected in BAV_TOTALS.items(): + actual = result['bav'][planet]['total'] + report(f"{planet} BAV = {expected}", + actual == expected, + f"实际: {actual}") + +# 检查 all_bav_valid +report("所有 BAV 校验通过", result['all_bav_valid']) + +# ============================================================================= +# Test 6: 分盘度数范围检查 (0-30) +# ============================================================================= +print("\n📐 Test 6: 分盘度数范围检查") +print("-" * 50) + +out_of_range = [] +for div in [2, 3, 4, 7, 9, 10, 12, 16, 20, 24, 27, 30, 40, 45, 60]: + for si in range(12): + for deg in [0, 7.5, 15, 22.5, 28]: + lon = si * 30 + deg + if lon >= 360: continue + result = calc_varga(lon, div) + d = result['degree_in_sign'] + if not (0 <= d < 30): + out_of_range.append((div, SIGNS[si], deg, d)) + +report("所有分盘度数在 [0, 30) 范围内", + len(out_of_range) == 0, + f"越界: {len(out_of_range)}") +if out_of_range: + for o in out_of_range[:5]: + print(f" D{o[0]} {o[1]} {o[2]}°: degree={o[3]}") + +# ============================================================================= +# Test 7: 分盘 part_index 范围检查 +# ============================================================================= +print("\n📐 Test 7: 分盘 part_index 范围检查") +print("-" * 50) + +part_errors = [] +for div in [2, 3, 4, 7, 9, 10, 12, 16, 20, 24, 27, 30, 40, 45, 60]: + max_part = div - 1 + for si in range(12): + for deg in [0, 7.5, 15, 22.5, 28]: + lon = si * 30 + deg + if lon >= 360: continue + result = calc_varga(lon, div) + pi = result['part_index'] + if not (0 <= pi <= max_part): + part_errors.append((div, SIGNS[si], deg, pi, max_part)) + +report("所有分盘 part_index 在有效范围内", + len(part_errors) == 0, + f"错误: {len(part_errors)}") +if part_errors: + for e in part_errors[:5]: + print(f" D{e[0]} {e[1]} {e[2]}°: part_index={e[3]}, max={e[4]}") + +# ============================================================================= +# 总结 +# ============================================================================= +print("\n" + "=" * 70) +print("验证总结") +print("=" * 70) +print(f"通过: {passed}") +print(f"失败: {failed}") +print(f"总计: {passed + failed}") + +if failed == 0: + print("\n🎉 所有 BPHS 不变量验证通过!") +else: + print(f"\n⚠️ {failed} 项验证失败,需要修复") + +# 输出详细错误报告 +if errors: + print("\n详细错误列表:") + for name, detail in errors: + print(f" - {name}") + if detail: + print(f" {detail}") diff --git a/scripts/validate_logic_v2.py b/scripts/validate_logic_v2.py new file mode 100644 index 00000000..a66f2a50 --- /dev/null +++ b/scripts/validate_logic_v2.py @@ -0,0 +1,405 @@ +#!/usr/bin/env python3 +""" +逻辑正确性验证框架 v2 +对比 Skill 引擎和 PyJhora 对60张名人星盘的 Yoga 检测结果 +""" +import json, sys, os + +# ==== 路径 ==== +SKILL_DIR = '/Users/wuyongnaren/.workbuddy/skills/jyotish-vedic-astrology' +RULES_PATH = os.path.join(SKILL_DIR, 'references', 'yoga_rules.json') +sys.path.insert(0, os.path.join(SKILL_DIR, 'scripts')) +from yoga_engine import YogaEngine + +# CROSS_NAME_MAP: PyJhora Yoga名 → Skill rule_id +# 复用 validate_comprehensive.py 中的映射(简化版,只保留核心映射) +# ---- 从 validate_comprehensive.py 内联的映射逻辑 ---- +PYJHORA_VARIANTS = { + # Dharidhra variants + 'dharidhra_yoga_144': 'bvr_dharidhra_precise', + 'dharidhra_yoga_147': 'bvr_dharidhra_precise', + 'dharidhra_yoga_148': 'bvr_dharidhra_precise', + 'dharidhra_yoga_149': 'bvr_dharidhra_precise', + 'dharidhra_yoga_150': 'bvr_dharidhra_precise', + 'dharidhra_yoga_151': 'bvr_dharidhra_precise', + 'dharidhra_yoga_152': 'bvr_dharidhra_precise', + # Dehasthoulya variants + 'dehasthoulya_yoga_114': 'bvr_dehasthoulya_yoga', + 'dehasthoulya_yoga_115': 'bvr_dehasthoulya_yoga', + 'dehasthoulya_yoga_116': 'bvr_dehasthoulya_yoga', + # Mathibhramana variants + 'mathibhramana_yoga_291': 'bvr_mathibhramana_yoga', + 'mathibhramana_yoga_292': 'bvr_mathibhramana_yoga', + 'mathibhramana_yoga_293': 'bvr_mathibhramana_yoga', + 'mathibhramana_yoga_294': 'bvr_mathibhramana_yoga', + 'mathibhramana_yoga_variation': 'bvr_mathibhramana_yoga', + # Krisanga variants + 'krisanga_yoga_112': 'bvr_krisanga_yoga', + 'krisanga_yoga_113': 'bvr_krisanga_yoga', + # Kaalanirdesat variants + 'kaalanirdesat_puthra_yoga_227': 'bvr_kaalanirdesat_puthra_yoga', + 'kaalanirdesat_puthra_yoga_228': 'bvr_kaalanirdesat_puthra_yoga', + 'kaalanirdesat_puthranaasa_yoga_230': 'bvr_kaalanirdesat_puthranaasa_yoga', + # Matrunasa variants + 'matrunasa_yoga_198': 'bvr_matrunasa_precise', + 'matrunasa_yoga_199': 'bvr_matrunasa_precise', + # Matrudeerghayur variants + 'matrudeerghayur_yoga_196': 'bvr_matrudeerghayur_yoga', + 'matrudeerghayur_yoga_197': 'bvr_matrudeerghayur_yoga', + # Nishkapata variants + 'nishkapata_yoga_205': 'bvr_nishkapata_precise', + 'nishkapata_yoga_206': 'bvr_nishkapata_precise', + # Bahu puthra variants + 'bahu_puthra_yoga_220': 'bvr_bahu_puthra_precise', + 'bahu_puthra_yoga_221': 'bvr_bahu_puthra_precise', + # Bandhu pujya variants + 'bandhu_pujya_yoga_193': 'bvr_bandhu_pujya_yoga', + 'bandhu_pujya_yoga_194': 'bvr_bandhu_pujya_yoga', + # Ayatna griha prapta variants + 'ayatna_griha_prapta_yoga_189': 'bvr_ayatna_griha_prapta_yoga', + 'ayatna_griha_prapta_yoga_190': 'bvr_ayatna_griha_prapta_yoga', + # Grihanasa variants + 'grihanasa_yoga_191': 'bvr_grihanasa_yoga', + 'grihanasa_yoga_192': 'bvr_grihanasa_yoga', + # Dattha puthra variants + 'dattha_puthra_yoga_222': 'bvr_dattha_puthra_yoga', + 'dattha_puthra_yoga_223': 'bvr_dattha_puthra_yoga', + # Kushtaroga variants + 'kushtaroga_yoga_268': 'bvr_kushtaroga_yoga', + # Sarpasaapa variants + 'sarpasaapa_yoga_212': 'bvr_sarpasaapa_yoga', + 'sarpasaapa_yoga_213': 'bvr_sarpasaapa_yoga', + # Raja bhanga variants + 'raja_bhanga_yoga_298': 'bvr_raja_bhanga_yoga', + 'raja_bhanga_yoga_299': 'bvr_raja_bhanga_yoga', + # Andha variants + 'andha_yoga_288': 'bvr_andha_yoga', + 'andha_yoga_289': 'bvr_andha_yoga', + # Vahana variants + 'vahana_yoga_209': 'bvr_vahana_yoga', + 'vahana_yoga_210': 'bvr_vahana_yoga', + # Kapata -> Nishkapata + 'kapata_yoga_202': 'bvr_nishkapata_precise', + 'kapata_yoga_204': 'bvr_nishkapata_precise', + 'pisacha_grastha_yoga': 'bvr_pisacha_grastha_yoga', + 'kaalanirdesat_puthranaasa_yoga_229': 'bvr_kaalanirdesat_puthranaasa_yoga', + 'dwadasa_sahodara_yoga': 'bvr_dwadasa_sahodara_yoga', + 'sapthasankhya_sahodara_yoga': 'bvr_sapthasankhya_sahodara_yoga', + 'karma_malika_yoga': 'bvr_karma_malika_precise', + 'ardha_chandra_yoga': 'bvr_ardha_chandra_yoga', + # Kalanidhi variants + 'kalaanidhi_yoga': 'bvr_kalaanidhi_yoga', + 'kalanidhi_yoga': 'bvr_kalaanidhi_yoga', + # Soola/Sula + 'soola_yoga': 'bvr_soola_yoga', + 'sula_yoga': 'bvr_soola_yoga', + # Kedara + 'kedara_yoga': 'bvr_kedaara_yoga', + # Kaahala/Kahala + 'kaahala_yoga': 'bvr_kahala_yoga', + # Direct mappings for common yogas + 'vosi_yoga': 'bvr_vosi_precise', + 'sunaphaa_yoga': 'bvr_sunaphaa_precise', + 'amala_yoga': 'bvr_amala_precise', + 'anaphaa_yoga': 'bvr_anaphaa_precise', + 'sareera_soukhya_yoga': 'bvr_sareera_soukhya_precise', + 'rogagrastha_yoga': 'bvr_rogagrastha_precise', + 'sada_sanchara_yoga': 'bvr_sada_sanchara_precise', + 'swaveeryaddhana_yoga': 'bvr_swaveeryaddhana_precise', + 'anthya_vayasi_dhana_yoga': 'bvr_anthya_vayasi_dhana_yoga', + 'matrumooladdhana_yoga': 'bvr_matrumooladdhana_yoga', + 'yuddha_praveena_yoga': 'bvr_yuddha_praveena_yoga', + 'bandhubhisthyaktha_yoga': 'bvr_bandhubhisthyaktha_precise', + 'sraddhannabhuktha_yoga': 'bvr_sraddhannabhuktha_precise', + 'bhratruvriddhi_yoga': 'bvr_bhratruvriddhi_precise', + 'sodaranasa_yoga': 'bvr_sodaranasa_yoga', + 'dehapushti_yoga': 'bvr_dehapushti_yoga', + 'mridanga_yoga': 'bvr_mridanga_yoga', + 'bheri_yoga': 'bvr_bheri_yoga', + 'pushkala_yoga': 'bvr_pushkala_yoga', + 'parakrama_yoga': 'bvr_parakrama_yoga', + 'lakshmi_yoga': 'bvr_lakshmi_yoga', + 'adhi_yoga': 'bvr_adhi_yoga', + 'brahma_yoga': 'bvr_brahma_yoga', + 'bhandhana_yoga': 'bvr_bhandhana_yoga', + 'harihara_brahma_yoga': 'bvr_harihara_brahma_yoga', + 'hara_yoga': 'bvr_hara_yoga', + 'hari_yoga': 'bvr_hari_yoga', + 'madhya_vayasi_dhana_yoga': 'bvr_madhya_vayasi_dhana_yoga', + 'balya_dhana_yoga': 'bvr_balya_dhana_yoga', + 'go_yoga': 'bvr_go_yoga', + 'sara_yoga': 'bvr_sara_yoga', + 'ishu_yoga': 'bvr_ishu_yoga', + 'kshayaroga_yoga': 'bvr_kshayaroga_yoga', + 'kalatramooladdhana_yoga': 'bvr_kalatramooladdhana_yoga', + 'vishnu_yoga': 'bvr_vishnu_yoga', + 'vichitra_saudha_prakara_yoga': 'bvr_vichitra_saudha_prakara_yoga', + 'jananatpurvam_pitru_marana_yoga': 'bvr_jananatpurvam_pitru_marana_yoga', + 'bhratrumooladdhanaprapti_yoga': 'bvr_bhratrumooladdhanaprapti_yoga', + 'thrikaala_gnana_yoga': 'bvr_thrikaala_gnana_yoga', + 'yuddhatpaschaddrudha_yoga': 'bvr_yuddhatpaschaddrudha_yoga', + 'yuddhatpoorvadridhachitta_yoga': 'bvr_yuddhatpoorvadridhachitta_yoga', + 'dhurmarana_yoga': 'bvr_dhurmarana_yoga', + 'theevrabuddhi_yoga': 'bvr_theevrabuddhi_yoga', + 'vaatharoga_yoga': 'bvr_vaatharoga_yoga', + 'amaranantha_dhana_yoga': 'bvr_amaranantha_dhana_yoga', + 'pittharoga_yoga': 'bvr_pittharoga_yoga', + 'sarpasaapa_yoga': 'bvr_sarpasaapa_yoga', + 'parannabhojana_yoga': 'bvr_parannabhojana_yoga', + 'veenaa_yoga': 'bvr_veenaa_yoga', + 'duradhara_yoga': 'bvr_duradhara_yoga', + 'annadana_yoga': 'bvr_annadana_yoga', + 'yukthi_samanwithavagmi_yoga_154': 'bvr_yukthi_samanwithavagmi_yoga', + 'nipuna_yoga': 'bvr_nipuna_yoga', + 'surya_budha_yoga': 'bvr_nipuna_yoga', + 'parvata_yoga': 'bvr_parvata_yoga', + 'hamsa_yoga': 'bvr_hamsa_yoga', + 'ruchaka_yoga': 'bvr_ruchaka_yoga', + 'bhadra_yoga': 'bvr_bhadra_yoga', + 'chatussagara_yoga': 'bvr_chatussagara_yoga', + 'sarpa_yoga': 'bvr_sarpa_yoga', + 'kemadruma_yoga': 'bvr_kemadruma_yoga', + 'sankha_yoga': 'bvr_sankha_yoga', + 'sumukha_yoga': 'bvr_sumukha_yoga', + 'ubhayachara_yoga': 'bvr_ubhayachara_yoga', + 'sasa_yoga': 'bvr_sasa_yoga', + 'matsya_yoga': 'bvr_matsya_yoga', + 'koorma_yoga': 'bvr_koorma_yoga', + 'naukaa_yoga': 'bvr_naukaa_yoga', + 'vihaga_yoga': 'bvr_vihaga_yoga', + 'yuga_yoga': 'bvr_yuga_yoga', + 'gola_yoga': 'bvr_gola_yoga', + # Fix previously unmapped + 'matru_sneha_yoga': 'bvr_matru_sneha_yoga', + 'eka_puthra_yoga': 'bvr_eka_puthra_precise', + 'guru_mangala_yoga': 'bvr_103_guru_mangala_yoga', + 'vanchana_chora_bheethi_yoga': 'bvr_vanchana_chora_bheethi_yoga', + 'bahu_sthree_yoga': 'bvr_bahu_sthree_yoga', + 'dama_yoga': 'bvr_dama_yoga', + 'utthama_graha_yoga': 'bvr_utthama_graha_yoga', + 'chandra_mangala_yoga': 'bvr_105_chandra_mangala_yoga', + 'bhaga_chumbana_yoga': 'bvr_bhaga_chumbana_yoga', + 'yuddha_marana_yoga': 'bvr_yuddha_marana_yoga', + 'andha_yoga': 'bvr_andha_yoga', + 'matru_satrutwa_yoga': 'bvr_matru_satrutwa_yoga', + 'apakeerthi_yoga': 'bvr_apakeerthi_yoga', +} + + +RULE_ID_ALIASES = { + # Historical/numbered rule ids in yoga_rules.json + 'bvr_vosi_precise': 'bvr_017_vosi_precise', + 'bvr_sunaphaa_precise': 'bvr_002_sunapha_precise', + 'bvr_anaphaa_precise': 'bvr_003_anapha_precise', + 'bvr_duradhara_yoga': 'bvr_004_duradhara_precise', + 'bvr_ubhayachara_yoga': 'bvr_018_ubhayachara_precise', + 'bvr_dharidhra_precise': 'bvr_dharidhra_11_precise', + 'bvr_sara_yoga': 'bvr_072_sara', + 'bvr_ishu_yoga': 'bvr_072_ishu', + 'bvr_naukaa_yoga': 'bvr_075_naukaa_precise', + 'bvr_vihaga_yoga': 'vihaga_nabhasa', + 'bvr_veenaa_yoga': 'veena_yoga', + 'bvr_sumukha_yoga': 'bvr_sumukha_precise', +} + + +def canonical_rule_id(rule_id, valid_rule_ids): + """Map historical validation ids to actual enabled yoga_rules.json ids.""" + if not rule_id: + return None + if rule_id in valid_rule_ids: + return rule_id + alias = RULE_ID_ALIASES.get(rule_id) + if alias in valid_rule_ids: + return alias + if rule_id.startswith('bvr_'): + without_bvr = rule_id[4:] + candidates = [without_bvr] + if without_bvr.endswith('_precise'): + base = without_bvr[:-8] + candidates.extend([base, f'{base}_yoga']) + for candidate in candidates: + if candidate in valid_rule_ids: + return candidate + return None + +# ---- 内联结束 ---- + + +def main(): + # 1. 加载位置数据 + with open('references/planet_positions_60.json') as f: + pos_data = json.load(f) + + # 2. 加载 PyJhora Yoga 结果 + with open('references/standard_test_charts.json') as f: + pyj_data = json.load(f) + + # 构建 name -> pyjhora yoga list 映射 + pyj_charts = {c['name']: c for c in pyj_data['charts']} + + # 3. 加载 Skill 引擎 + engine = YogaEngine(RULES_PATH) + + # 构建 rule_id -> rule_name 映射 + rule_id_to_name = {r['id']: r['name'] for r in engine.rules} + # 以及 name -> rule_id 反向映射(用于去重匹配) + name_to_rule_ids = {} + for r in engine.rules: + name = r['name'] + name_to_rule_ids.setdefault(name, []).append(r['id']) + + valid_rule_ids = set(rule_id_to_name.keys()) + # 建立"可对比规则集":仅保留真实存在且启用的 Skill rule_id,避免历史 ID 别名造成 60/60 假性 FN。 + variant_to_rule_id = {} + missing_mappings = {} + for py_name, raw_id in PYJHORA_VARIANTS.items(): + canonical = canonical_rule_id(raw_id, valid_rule_ids) + if canonical: + variant_to_rule_id[py_name] = canonical + else: + missing_mappings.setdefault(raw_id, []).append(py_name) + comparable_rule_ids = set(variant_to_rule_id.values()) + print(f"可对比规则数量: {len(comparable_rule_ids)}") + if missing_mappings: + print(f"暂不可对比映射数量: {len(missing_mappings)}") + + # 统计(只统计可对比规则) + total_skill_comp = 0 # Skill在可对比规则集中的检测数 + total_pyj_comp = 0 # PyJhora能映射到可对比规则的检测数 + total_agreements = 0 + total_false_positives = 0 + total_false_negatives = 0 + total_unmapped_pyj = 0 + + fp_details = [] # Skill说有,PyJhora说没有(都在可对比集内) + fn_details = [] # PyJhora说有,Skill说没有(都在可对比集内) + + for chart in pos_data['charts']: + name = chart['name'] + planets = chart['planets'] + ascendant = chart['ascendant'] + + # Skill 引擎检测 + skill_results = engine.detect(planets, ascendant) + skill_yoga_ids = set(r['rule_id'] for r in skill_results) + skill_comp = skill_yoga_ids & comparable_rule_ids # 只保留可对比的 + total_skill_comp += len(skill_comp) + + # PyJhora 结果 + pyj_chart = pyj_charts.get(name) + if not pyj_chart: + print(f" WARNING: {name} not in PyJhora data") + continue + pyj_yoga_names = set(pyj_chart.get('expected_yogas', [])) + + # 将 PyJhora Yoga名映射到 Skill rule_id + pyj_mapped_ids = set() + unmapped = 0 + for pyj_name in pyj_yoga_names: + mapped = variant_to_rule_id.get(pyj_name) + if not mapped: + norm = pyj_name.lower().strip() + mapped = variant_to_rule_id.get(norm) + if mapped: + pyj_mapped_ids.add(mapped) + else: + unmapped += 1 + total_unmapped_pyj += unmapped + pyj_comp = pyj_mapped_ids & comparable_rule_ids + total_pyj_comp += len(pyj_comp) + + # 对比(只对比可对比规则集) + agreements = skill_comp & pyj_comp + false_positives = skill_comp - pyj_comp # Skill说有,PyJhora说没有 + false_negatives = pyj_comp - skill_comp # PyJhora说有,Skill说没有 + + total_agreements += len(agreements) + total_false_positives += len(false_positives) + total_false_negatives += len(false_negatives) + + if false_positives: + for rid in false_positives: + fp_details.append({ + 'chart': name, + 'rule_id': rid, + 'rule_name': rule_id_to_name.get(rid, '?'), + }) + if false_negatives: + for rid in false_negatives: + orig_names = [pn for pn, sid in variant_to_rule_id.items() if sid == rid] + fn_details.append({ + 'chart': name, + 'rule_id': rid, + 'rule_name': rule_id_to_name.get(rid, '?'), + 'pyjhora_names': orig_names, + }) + + # ==== 输出报告 ==== + print("=" * 70) + print("Skill vs PyJhora 逻辑正确性验证报告(仅可对比规则)") + print("=" * 70) + print(f"测试星盘数量: 60") + print(f"可对比规则集大小: {len(comparable_rule_ids)}") + print(f"PyJhora未映射Yoga: {total_unmapped_pyj}") + print() + print(f"Skill 可对比检测总数: {total_skill_comp}") + print(f"PyJhora 可对比检测总数: {total_pyj_comp}") + print(f"一致 (Agreements): {total_agreements}") + print(f"False Positives (Skill过宽): {total_false_positives}") + print(f"False Negatives (Skill过严): {total_false_negatives}") + print() + + precision = total_agreements / total_skill_comp if total_skill_comp else 0 + recall = total_agreements / total_pyj_comp if total_pyj_comp else 0 + f1 = 2 * precision * recall / (precision + recall) if (precision + recall) else 0 + + print(f"Precision (准确率): {precision:.2%}") + print(f"Recall (召回率): {recall:.2%}") + print(f"F1 Score: {f1:.2%}") + print() + + # 按规则汇总 FP + if fp_details: + from collections import Counter + fp_by_rule = Counter((d['rule_id'], d['rule_name']) for d in fp_details) + print("--- False Positives 最多的规则 (Top 20) ---") + for (rid, rname), count in fp_by_rule.most_common(20): + print(f" {count:2d} 次: {rid} ({rname})") + print() + + # 按规则汇总 FN + if fn_details: + from collections import Counter + fn_by_rule = Counter((d['rule_id'], d['rule_name']) for d in fn_details) + print("--- False Negatives 最多的规则 (Top 20) ---") + for (rid, rname), count in fn_by_rule.most_common(20): + print(f" {count:2d} 次: {rid} ({rname})") + print() + + # 保存详细报告 + report = { + "summary": { + "charts_tested": 60, + "comparable_rules": len(comparable_rule_ids), + "skill_total": total_skill_comp, + "pyjhora_total": total_pyj_comp, + "unmapped_pyjhora": total_unmapped_pyj, + "missing_mappings": {k: v for k, v in sorted(missing_mappings.items())}, + "agreements": total_agreements, + "false_positives": total_false_positives, + "false_negatives": total_false_negatives, + "precision": round(precision, 4), + "recall": round(recall, 4), + "f1": round(f1, 4), + }, + "false_positives": fp_details, + "false_negatives": fn_details, + } + with open('references/validation_logic_report.json', 'w') as f: + json.dump(report, f, indent=2, ensure_ascii=False) + print("详细报告已保存至: references/validation_logic_report.json") + + +if __name__ == "__main__": + main() diff --git a/scripts/validate_yoga_accuracy.py b/scripts/validate_yoga_accuracy.py new file mode 100644 index 00000000..ffc3fe81 --- /dev/null +++ b/scripts/validate_yoga_accuracy.py @@ -0,0 +1,705 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Yoga 准确率验证框架 v1.0 + +功能: +1. 用同一组出生数据,分别调用 PyJhora 和 skill 的 Yoga 检测 +2. 对比结果,生成准确率报告 +3. 支持批量测试用例(JSON 文件) + +用法: + python3 validate_yoga_accuracy.py --benchmark + python3 validate_yoga_accuracy.py --test-cases test_cases.json + python3 validate_yoga_accuracy.py --interactive +""" + +import json +import re +import sys +import glob +import argparse +import traceback +from pathlib import Path +from typing import Dict, List, Optional, Tuple, Set + +# ============================================================ +# 路径设置 +# ============================================================ +SCRIPT_DIR = Path(__file__).resolve().parent +SKILL_ROOT = SCRIPT_DIR.parent + +# 确保 skill 脚本在 sys.path 中 +if str(SCRIPT_DIR) not in sys.path: + sys.path.insert(0, str(SCRIPT_DIR)) + +# ============================================================ +# 常量(自包含,与 yoga_engine.py 一致) +# ============================================================ +SIGNS = ['Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo', + 'Libra', 'Scorpio', 'Sagittarius', 'Capricorn', 'Aquarius', 'Pisces'] +SIGN_LORDS = { + 'Aries': 'Mars', 'Taurus': 'Venus', 'Gemini': 'Mercury', 'Cancer': 'Moon', + 'Leo': 'Sun', 'Virgo': 'Mercury', 'Libra': 'Venus', 'Scorpio': 'Mars', + 'Sagittarius': 'Jupiter', 'Capricorn': 'Saturn', 'Aquarius': 'Saturn', 'Pisces': 'Jupiter' +} + +# ============================================================ +# Skill 功能性 Yoga Category(PyJhora 中无对应规则,属于 skill 特色) +# ============================================================ +FUNCTIONAL_CATEGORIES = { + 'dhana', 'kalatra', 'putra', 'ayur', 'vidya', 'shakti', + 'karma', 'asha', 'moksha', 'aryama', 'guru', 'ari', 'varga', + # raja 虽然是经典概念,但 PyJhora 没有单独函数,skill 按功能性实现 + 'raja', +} + +# 加载 skill 的 yoga_rules.json,建立 name -> category 映射 +def _load_skill_rule_categories() -> Dict[str, str]: + """读取 yoga_rules.json,返回 {归一化名称: category}""" + rules_path = SKILL_ROOT / "references" / "yoga_rules.json" + if not rules_path.exists(): + return {} + try: + with open(rules_path, 'r', encoding='utf-8') as f: + data = json.load(f) + mapping = {} + for r in data.get('rules', []): + if not r.get('enabled', True): + continue + key = normalize_name(r.get('name', '')) + if key: + mapping[key] = r.get('category', 'unknown') + return mapping + except Exception: + return {} + +# 延迟加载,避免在模块导入时读取文件 +_SKILL_RULE_CATEGORIES: Optional[Dict[str, str]] = None + +def get_skill_rule_categories() -> Dict[str, str]: + global _SKILL_RULE_CATEGORIES + if _SKILL_RULE_CATEGORIES is None: + _SKILL_RULE_CATEGORIES = _load_skill_rule_categories() + return _SKILL_RULE_CATEGORIES + + +# ============================================================ +# Swiss Ephemeris 星盘计算(独立实现,不依赖 jyotish_engine) +# ============================================================ +def skill_compute_chart(year, month, day, hour, minute, lat, lon, tz, + node_mode='mean'): + """ + 用 Swiss Ephemeris 计算星盘。 + 返回:(planets_dict, asc_idx, jd, ayanamsa) + """ + import swisseph as swe + swe.set_sid_mode(swe.SIDM_LAHIRI) + + # Julian Day(本地时间 → UTC) + hour_decimal = hour + minute / 60.0 - tz + jd = swe.julday(year, month, day, hour_decimal) + + # Ayanamsa + ayanamsa = swe.get_ayanamsa_ut(jd) + + # Ascendant + asc_info = swe.houses(jd, lat, lon, b'A') # 'A' = equal houses (Vedic) + asc_long = asc_info[0][0] + asc_deg = (asc_long - ayanamsa) % 360 + asc_sign = int(asc_deg / 30) + asc_idx = asc_sign + 1 # 1-based + + # 行星 + planets = {} + planet_map = [ + ('Sun', swe.SUN), ('Moon', swe.MOON), ('Mars', swe.MARS), + ('Mercury', swe.MERCURY), ('Jupiter', swe.JUPITER), + ('Venus', swe.VENUS), ('Saturn', swe.SATURN), + ] + + for pname, pid in planet_map: + flags = swe.FLG_SIDEREAL | swe.FLG_SWIEPH + res = swe.calc_ut(jd, pid, flags) + long = (res[0][0] - ayanamsa) % 360 + sign = int(long / 30) + deg = long % 30.0 + speed = res[0][3] + is_retro = speed < 0 + house = ((sign - asc_sign) % 12) + 1 + planets[pname] = { + 'longitude': long, 'sign': SIGNS[sign], + 'degree': deg, 'house': house, + 'is_retro': is_retro, 'is_combust': False, + } + + # Rahu / Ketu + flags = swe.FLG_SIDEREAL | swe.FLG_SWIEPH + if node_mode == 'true': + rahu_res = swe.calc_ut(jd, swe.TRUE_NODE, flags) + else: + rahu_res = swe.calc_ut(jd, swe.MEAN_NODE, flags) + rahu_long = (rahu_res[0][0] - ayanamsa) % 360 + ketu_long = (rahu_long + 180.0) % 360 + + for name, long in [('Rahu', rahu_long), ('Ketu', ketu_long)]: + sign = int(long / 30) + deg = long % 30.0 + house = ((sign - asc_sign) % 12) + 1 + planets[name] = { + 'longitude': long, 'sign': SIGNS[sign], + 'degree': deg, 'house': house, + 'is_retro': False, 'is_combust': False, + } + + # 燃烧判断(简化) + sun_long = planets['Sun']['longitude'] + combust_limits = { + 'Moon': 12.0, 'Mars': 17.0, 'Mercury': 14.0, + 'Jupiter': 11.0, 'Venus': 10.0, 'Saturn': 15.0, + } + for pname, limit in combust_limits.items(): + p_long = planets[pname]['longitude'] + diff = abs((p_long - sun_long + 180) % 360 - 180) + planets[pname]['is_combust'] = diff < limit + + return planets, asc_idx, jd, ayanamsa + + +def skill_detect_yogas(planets, asc): + """调用 skill 的 Yoga 引擎检测 Yoga""" + from yoga_engine import detect_yogas + return detect_yogas(planets, asc) + + +# ============================================================ +# PyJhora 接口封装 +# ============================================================ +def init_pyjhora(): + """初始化 PyJhora,返回是否成功""" + try: + import jhora.horoscope.chart.yoga as py_yoga + import jhora.panchanga.drik as drik + import jhora.horoscope.chart.charts as charts + import jhora.const as const + return True + except ImportError as e: + print(f"⚠️ PyJhora 导入失败: {e}") + return False + + +def pyjhora_jd(year, month, day, hour_frac): + """计算 Julian Day(与 PyJhora 一致)""" + import swisseph as swe + return swe.julday(year, month, day, hour_frac) + + +def pyjhora_get_yogas(jd, lat, lon, tz, divisional_chart_factor=1): + """ + 调用 PyJhora 获取 D1 宫盘的 Yoga 检测结果。 + 返回:{yoga_function_name: {"name": ..., "desc": ..., "benefits": ...}} + """ + import jhora.horoscope.chart.yoga as py_yoga + import jhora.panchanga.drik as drik + + place = drik.Place("TestPlace", lat, lon, tz) + yoga_results, _, _ = py_yoga.get_yoga_details( + jd, place, divisional_chart_factor=divisional_chart_factor, language='en' + ) + # yoga_results: {yoga_function_name: [chart_id, yoga_name, yoga_description, yoga_benefits]} + result = {} + for fname, details in yoga_results.items(): + result[fname] = { + "name": details[1] if len(details) > 1 else fname, + "desc": details[2] if len(details) > 2 else "", + "benefits": details[3] if len(details) > 3 else "", + "chart_id": details[0] if len(details) > 0 else "", + } + return result + + +# ============================================================ +# 名称归一化(用于对比) +# ============================================================ +def normalize_name(name: str) -> str: + """归一化 Yoga 名称(与 benchmark_yoga_coverage.py 一致)""" + s = name.lower() + s = re.sub(r"\([^)]*\)", " ", s) + s = s.replace("&", " and ") + s = re.sub(r"[^a-z0-9]+", "_", s) + s = re.sub(r"_+", "_", s).strip("_") + for suffix in ("_yoga", "_graha", "_classic", "_calculation", "_calc"): + if s.endswith(suffix): + s = s[: -len(suffix)] + s = re.sub(r"_\d+$", "", s) + return s + + +# 单向名称映射:PyJhora 归一化名称 -> skill 标准归一化名称 +# 键是 PyJhora 的归一化名称,值是 skill 的标准归一化名称 +# 两边都会通过 _canonical_name() 映射到统一的标准名称空间 +CROSS_NAME_MAP = { + # --- 经典 Yoga 别名(PyJhora -> skill) --- + "nipuna": "budhaditya", + "gaja_kesari": "gajakesari", + "maalavya": "malavya", + "shasha": "sasa", + "murdha": "moordha", + "kedara": "kedaara", + "kaahala": "kahala", + "daama": "dama", + "veenaa": "veena", + "paasa": "pasa", + "mridang": "mridanga", + "sankh": "sankha", + "chatusagar": "chatussagara", + "rajalakshan": "rajalakshana", + "bhaarathi": "bharati", + "saraswathi": "saraswati", + "kalpadrum": "kalpadruma", + "trikala_gnana": "thrikaala_gnana", + "yukti_samanwithavagmi": "yukthi_samanwithavagmi", + "mathibhraman": "mathibhramana", + "swaviryaddhana": "swaveeryaddhana", + "antya_vayasi_dhana": "anthya_vayasi_dhana", + "madhya_vayasi_dhana": "madhya_vayasi_dhana", + "matrumuladdhana": "matrumooladdhana", + "kalanirdesat_puthranaasa": "kaalanirdesat_puthranaasa", + "dvadasa_sahodara": "dwadasa_sahodara", + "vahan": "vahana", + "parakram": "parakrama", + "yuddha_pravin": "yuddha_praveena", + "sumukh": "sumukha", + "durmukh": "durmukha", + "kapat": "kapata", + "nishkapat": "nishkapata", + "asatyavad": "asatyavadi", + "bhratruvriddh": "bhratruvriddhi", + "bandhubhisthyakt": "bandhubhisthyaktha", + "bandhu_pujy": "bandhu_pujya", + "matrunas": "matrunasa", + "matru_sneh": "matru_sneha", + "bahu_puthr": "bahu_puthra", + "bahu_stri": "bahu_sthree", + "eka_puthr": "eka_puthra", + "satkalatr": "satkalatra", + "sareera_soukh": "sareera_soukhya", + "rogagrasth": "rogagrastha", + "dehasthoul": "dehasthoulya", + "dehapusht": "dehapushti", + "krisang": "krisanga", + "sada_sanchar": "sada_sanchara", + "annadan": "annadana", + "amal": "amala", + "asubh": "asubha", + "guhyarog": "guhyaroga", + "dharidhr": "dharidhra", + "vanchana_chora_bheeth": "vanchana_chora_bheethi", + "rajabhrasht": "rajabhrashta", + "vran": "vrana", + "buddhimatur": "buddhimaturya", + "ayatna_griha_prapt": "ayatna_griha_prapta", +} + + +def get_skill_yoga_keys(yoga_list: List[Dict]) -> Set[str]: + """从 skill 检测结果中提取归一化名称集合""" + keys = set() + for y in yoga_list: + for field in ['name', 'name_cn']: + val = y.get(field, "") + if not val or not isinstance(val, str): + continue + # 排除纯数字、空字符串、太短的名字 + stripped = val.strip() + if not stripped or stripped.replace('_', '').replace('-', '').isdigit(): + continue + if len(stripped) <= 2: + continue + key = normalize_name(val) + if not key or key.replace('_', '').isdigit(): + continue + key = _canonical_name(key) + keys.add(key) + return keys + + +def _canonical_name(key: str) -> str: + """通过 CROSS_NAME_MAP 将别名映射到统一的标准名称""" + return CROSS_NAME_MAP.get(key, key) + + +def get_pyjhora_yoga_keys(pyjhora_results: Dict[str, dict]) -> Set[str]: + """从 PyJhora 检测结果中提取归一化名称集合""" + keys = set() + for fname in pyjhora_results.keys(): + # 去掉 _from_jd_place 等后缀 + base = re.sub(r"_(from_jd_place|from_planet_positions|calculation|calc)$", + "", fname) + base = base.replace("_yoga", "") + key = normalize_name(base) + # 映射到标准名称 + key = _canonical_name(key) + keys.add(key) + return keys + + +# ============================================================ +# 核心验证逻辑 +# ============================================================ +def validate_one_case(case: dict, run_pyjhora: bool = True) -> dict: + """ + 验证单个测试用例。 + + case = { + "name": "Einstein", + "year": 1879, "month": 3, "day": 14, + "hour": 10, "minute": 30, + "lat": 48.0, "lon": 11.0, "tz": 1.0 + } + """ + result = { + "case_name": case.get("name", "unknown"), + "birth": f"{case['year']}-{case['month']:02d}-{case['day']:02d} " + f"{case.get('hour', 12):02d}:{case.get('minute', 0):02d}", + "skill_yogas": [], + "pyjhora_yogas": [], + "matched": [], + "skill_only": [], # false positive + "pyjhora_only": [], # false negative + "error": None, + } + + year = case['year'] + month = case['month'] + day = case['day'] + hour = case.get('hour', 12) + minute = case.get('minute', 0) + lat = case['lat'] + lon = case['lon'] + tz = case.get('tz', 0) + + # --- Skill 检测 --- + try: + planets, asc, jd, ayanamsa = skill_compute_chart( + year, month, day, hour, minute, lat, lon, tz + ) + skill_yogas = skill_detect_yogas(planets, asc) + result['skill_yogas'] = [y.get('name', y.get('id', '?')) for y in skill_yogas] + result['skill_count'] = len(skill_yogas) + result['skill_details'] = [] + for y in skill_yogas: + result['skill_details'].append({ + 'name': y.get('name', ''), + 'id': y.get('id', ''), + 'strength': y.get('strength', ''), + }) + except Exception as e: + result['error'] = f"Skill error: {e}\n{traceback.format_exc()}" + return result + + # --- PyJhora 检测 --- + if run_pyjhora: + try: + jd_py = pyjhora_jd(year, month, day, hour + minute / 60.0) + pyjhora_results = pyjhora_get_yogas(jd_py, lat, lon, tz, + divisional_chart_factor=1) + result['pyjhora_yogas'] = list(pyjhora_results.keys()) + result['pyjhora_count'] = len(pyjhora_results) + result['pyjhora_details'] = [] + for fname, details in pyjhora_results.items(): + result['pyjhora_details'].append({ + 'function': fname, + 'name': details.get('name', ''), + 'desc': details.get('desc', ''), + }) + except Exception as e: + result['error'] = f"PyJhora error: {e}\n{traceback.format_exc()}" + return result + + # --- 对比 --- + skill_keys = get_skill_yoga_keys(skill_yogas) + pyjhora_keys = get_pyjhora_yoga_keys(pyjhora_results) + + result['matched'] = sorted(skill_keys & pyjhora_keys) + result['skill_only'] = sorted(skill_keys - pyjhora_keys) + result['pyjhora_only'] = sorted(pyjhora_keys - skill_keys) + + # --- 分类:功能性 Yoga vs 经典 Yoga --- + cat_map = get_skill_rule_categories() + result['skill_only_functional'] = [] + result['skill_only_classic'] = [] + for key in result['skill_only']: + cat = cat_map.get(key, 'unknown') + if cat in FUNCTIONAL_CATEGORIES: + result['skill_only_functional'].append(key) + else: + result['skill_only_classic'].append(key) + + return result + + +def run_validation(cases: List[dict], run_pyjhora: bool = True) -> dict: + """运行批量验证""" + report = { + "total_cases": len(cases), + "cases": [], + "summary": { + "total_skill_yogas": 0, + "total_pyjhora_yogas": 0, + "total_matched": 0, + "total_skill_only": 0, + "total_pyjhora_only": 0, + "total_skill_only_functional": 0, + "total_skill_only_classic": 0, + } + } + + for case in cases: + name = case.get('name', 'unknown') + print(f"🔍 验证: {name} ({case['year']}-{case['month']:02d}-{case['day']:02d})") + r = validate_one_case(case, run_pyjhora=run_pyjhora) + report['cases'].append(r) + + if r['error']: + print(f" ❌ 错误: {r['error'][:300]}") + continue + + sc = r.get('skill_count', 0) + pc = r.get('pyjhora_count', '?') + func_n = len(r.get('skill_only_functional', [])) + classic_n = len(r.get('skill_only_classic', [])) + print(f" Skill: {sc} | PyJhora: {pc}") + print(f" 匹配: {len(r['matched'])} | " + f"Skill独有: {len(r['skill_only'])} (功能性{func_n}, 经典{classic_n}) | " + f"PyJhora独有: {len(r['pyjhora_only'])}") + + report['summary']['total_skill_yogas'] += sc + if isinstance(pc, int): + report['summary']['total_pyjhora_yogas'] += pc + report['summary']['total_matched'] += len(r['matched']) + report['summary']['total_skill_only'] += len(r['skill_only']) + if isinstance(pc, int): + report['summary']['total_pyjhora_only'] += len(r['pyjhora_only']) + report['summary']['total_skill_only_functional'] += func_n + report['summary']['total_skill_only_classic'] += classic_n + + return report + + +# ============================================================ +# 测试用例 +# ============================================================ +BENCHMARK_CASES = [ + { + "name": "Einstein", + "year": 1879, "month": 3, "day": 14, + "hour": 10, "minute": 30, + "lat": 48.0, "lon": 11.0, "tz": 1.0, + }, + { + "name": "Steve Jobs", + "year": 1955, "month": 2, "day": 24, + "hour": 19, "minute": 30, + "lat": 37.0, "lon": -122.0, "tz": -8.0, + }, + { + "name": "NM Gandhi", + "year": 1869, "month": 10, "day": 2, + "hour": 8, "minute": 52, + "lat": 21.0, "lon": 73.0, "tz": 5.5, + }, + { + "name": "APJ Abdul Kalam", + "year": 1931, "month": 10, "day": 15, + "hour": 6, "minute": 0, + "lat": 8.0, "lon": 78.0, "tz": 5.5, + }, + { + "name": "Queen Elizabeth II", + "year": 1926, "month": 4, "day": 21, + "hour": 2, "minute": 40, + "lat": 51.0, "lon": 0.0, "tz": 0.0, + }, +] + + +# ============================================================ +# 报告输出 +# ============================================================ +def print_report(report: dict): + """打印验证报告""" + print("\n" + "=" * 70) + print("🧘 Yoga 准确率验证报告") + print("=" * 70) + + summary = report['summary'] + total_skill = summary['total_skill_yogas'] + total_pyjhora = summary['total_pyjhora_yogas'] + matched = summary['total_matched'] + skill_only = summary['total_skill_only'] + pyjhora_only = summary['total_pyjhora_only'] + func_only = summary.get('total_skill_only_functional', 0) + classic_only = summary.get('total_skill_only_classic', 0) + + print(f"\n📊 汇总:") + print(f" 测试用例数: {report['total_cases']}") + print(f" Skill 检测总数: {total_skill}") + print(f" PyJhora 检测总数: {total_pyjhora}") + print(f" 匹配总数: {matched}") + print(f" Skill 独有: {skill_only} (功能性{func_only}, 经典{classic_only})") + print(f" PyJhora 独有 (skill 缺失): {pyjhora_only}") + + if total_skill > 0: + precision = matched / total_skill * 100 + print(f"\n 总体精确率 (Precision): {precision:.1f}%") + + if total_pyjhora > 0: + recall = matched / total_pyjhora * 100 + print(f" 总体召回率 (Recall): {recall:.1f}%") + + # --- 核心经典 Yoga 准确率(排除 skill 特色功能性 Yoga)--- + classic_skill_total = total_skill - func_only + if classic_skill_total > 0: + classic_precision = matched / classic_skill_total * 100 + print(f"\n 🎯 核心经典 Yoga 精确率: {classic_precision:.1f}%") + print(f" (排除 {func_only} 条功能性 Yoga 后: {matched}/{classic_skill_total})") + if total_pyjhora > 0: + classic_recall = matched / total_pyjhora * 100 + print(f" 🎯 核心经典 Yoga 召回率: {classic_recall:.1f}%") + + # --- 全局不匹配统计 --- + print(f"\n🔍 全局不匹配分析:") + all_skill_classic = set() + all_skill_func = set() + all_pyjhora_missing = set() + for r in report['cases']: + if r.get('error'): + continue + all_skill_classic.update(r.get('skill_only_classic', [])) + all_skill_func.update(r.get('skill_only_functional', [])) + all_pyjhora_missing.update(r.get('pyjhora_only', [])) + + print(f" Skill 经典 Yoga 不匹配(可能误判): {len(all_skill_classic)} 种") + if all_skill_classic: + print(f" {sorted(all_skill_classic)[:15]}") + print(f" Skill 功能性 Yoga(PyJhora 无对应,属 skill 特色): {len(all_skill_func)} 种") + if all_skill_func: + print(f" {sorted(all_skill_func)[:15]}") + print(f" PyJhora 有但 Skill 缺失的 Yoga: {len(all_pyjhora_missing)} 种") + if all_pyjhora_missing: + print(f" {sorted(all_pyjhora_missing)[:15]}") + + # --- 改进建议 --- + print(f"\n💡 改进建议:") + print(f" 1. 【规则校准】以下 {len(all_skill_classic)} 种经典 Yoga 两边实现不一致,") + print(f" 建议逐条核对 BPHS 原文,修正 skill 规则条件:") + for name in sorted(all_skill_classic)[:10]: + print(f" - {name}") + if len(all_skill_classic) > 10: + print(f" ... 等共 {len(all_skill_classic)} 种") + + missing_top = sorted(all_pyjhora_missing)[:20] + print(f"\n 2. 【规则补齐】以下 {len(all_pyjhora_missing)} 种 Yoga PyJhora 已实现但 skill 缺失,") + print(f" 建议按优先级补充(推荐先补充高频出现的):") + for name in missing_top[:15]: + print(f" - {name}") + if len(all_pyjhora_missing) > 15: + print(f" ... 等共 {len(all_pyjhora_missing)} 种") + + print(f"\n 3. 【名称映射】当前 CROSS_NAME_MAP 已覆盖常见别名,") + print(f" 如仍有新别名发现,请添加到映射表中。") + + print(f"\n📋 逐案例详情:") + for r in report['cases']: + print(f"\n 【{r['case_name']}】 {r['birth']}") + if r.get('error'): + print(f" ❌ {r['error'][:300]}") + continue + sc = r.get('skill_count', 0) + pc = r.get('pyjhora_count', '?') + print(f" Skill ({sc}): {r['skill_yogas'][:5]}{'...' if len(r['skill_yogas']) > 5 else ''}") + if 'pyjhora_yogas' in r: + print(f" PyJhora ({pc}): {r['pyjhora_yogas'][:5]}{'...' if len(r['pyjhora_yogas']) > 5 else ''}") + func_n = len(r.get('skill_only_functional', [])) + cls_n = len(r.get('skill_only_classic', [])) + print(f" 匹配: {len(r['matched'])} | Skill独有: {len(r['skill_only'])}(功能{func_n},经典{cls_n}) | PyJhora独有: {len(r['pyjhora_only'])}") + + if r.get('skill_only_classic'): + print(f" Skill 经典不匹配: {r['skill_only_classic'][:10]}") + if r.get('skill_only_functional'): + print(f" Skill 功能性: {r['skill_only_functional'][:10]}") + if r.get('pyjhora_only'): + print(f" PyJhora 独有: {r['pyjhora_only'][:10]}") + + +def save_report(report: dict, output_file: str): + """保存报告为 JSON""" + with open(output_file, 'w', encoding='utf-8') as f: + json.dump(report, f, ensure_ascii=False, indent=2) + print(f"\n💾 报告已保存: {output_file}") + + +# ============================================================ +# 主程序 +# ============================================================ +def main(): + parser = argparse.ArgumentParser(description="Yoga 准确率验证框架") + parser.add_argument('--test-cases', help='测试用例 JSON 文件路径') + parser.add_argument('--interactive', action='store_true', help='手动输入出生数据') + parser.add_argument('--benchmark', action='store_true', help='运行内置基准测试') + parser.add_argument('--output', '-o', default='validation_report.json', help='输出报告文件') + parser.add_argument('--skip-pyjhora', action='store_true', help='跳过 PyJhora(只测试 skill)') + args = parser.parse_args() + + # 检查 PyJhora + if not args.skip_pyjhora: + if not init_pyjhora(): + print("❌ PyJhora 不可用,请先安装: pip install pyjhora swisseph") + print(" 提示:也可用 --skip-pyjhora 只测试 skill 侧") + return 1 + + # 加载测试用例 + if args.test_cases: + with open(args.test_cases, 'r', encoding='utf-8') as f: + cases = json.load(f) + elif args.benchmark: + cases = BENCHMARK_CASES + elif args.interactive: + cases = [interactive_input()] + else: + print("使用 --benchmark 运行内置测试,或 --test-cases 指定测试用例文件") + return 1 + + # 运行验证 + report = run_validation(cases, run_pyjhora=not args.skip_pyjhora) + + # 输出报告 + print_report(report) + save_report(report, args.output) + + return 0 + + +def interactive_input() -> dict: + """手动输入出生数据""" + print("\n请输入出生数据:") + name = input(" 姓名 (可选): ").strip() or "Test" + year = int(input(" 年: ")) + month = int(input(" 月: ")) + day = int(input(" 日: ")) + hour = int(input(" 时 (24小时制): ")) + minute = int(input(" 分: ")) + lat = float(input(" 纬度 (度, 北正南负): ")) + lon = float(input(" 经度 (度, 东正西负): ")) + tz = float(input(" 时区 (小时, 东正西负): ")) + + return { + "name": name, "year": year, "month": month, "day": day, + "hour": hour, "minute": minute, + "lat": lat, "lon": lon, "tz": tz, + } + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/scripts/validation_report.json b/scripts/validation_report.json new file mode 100644 index 00000000..d9d7570b --- /dev/null +++ b/scripts/validation_report.json @@ -0,0 +1,2215 @@ +{ + "total_cases": 5, + "cases": [ + { + "case_name": "Einstein", + "birth": "1879-03-14 10:30", + "skill_yogas": [ + "Raja Yoga", + "Malavya Yoga", + "Gajakesari Yoga", + "Gajakesari Yoga (from Moon)", + "Kahala Yoga", + "Budhaditya Yoga", + "Surya-Budha Yoga", + "Shakata Yoga (Jupiter in Dusthana)", + "Gajakesari Yoga (Kendra from Moon)", + "Dhana Yoga (2nd Lord Strong)", + "Chandra Yoga (Moon in Trikona)", + "Kalatra Yoga (7th Lord Exalted)", + "Kalatra Yoga (7th Lord in Kendra)", + "Kalatra Yoga (Venus in Kendra)", + "Mangal Dosha (Mars in 1/4/7/8/12)", + "Ayur Yoga (Jupiter in 8th)", + "Ayur Yoga (8th Lord in Kendra)", + "Shakti Yoga (Sun in 10th House)", + "Karma Yoga (10th & 11th Lords Combination)", + "Asha Yoga (11th Lord Strong)", + "Raja Yoga (5th & 10th Lords Combination)", + "Vesi Yoga", + "Vosi Yoga", + "Ubhayachara Yoga", + "Eka Puthra Yoga" + ], + "pyjhora_yogas": [ + "vosi_yoga", + "nipuna_yoga", + "maalavya_yoga", + "kedaara_yoga", + "gaja_kesari_yoga", + "amala_yoga", + "vanchana_chora_bheethi_yoga", + "kahala_yoga", + "kedara_yoga", + "dharidhra_yoga", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "dehasthoulya_yoga_114", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "asatyavadi_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "bahu_puthra_yoga_221", + "eka_puthra_yoga", + "buddhimaturya_yoga", + "satkalatra_yoga", + "vrana_yoga", + "mathibhramana_yoga_variation", + "rajabhrashta_yoga" + ], + "matched": [ + "budhaditya", + "eka_puthra", + "gajakesari", + "kahala", + "malavya", + "vosi" + ], + "skill_only": [ + "asha", + "ayur", + "chandra", + "dhana", + "kalatra", + "karma", + "mangal_dosha", + "raja", + "shakata", + "shakti", + "surya_budha", + "ubhayachara", + "vesi", + "yoga" + ], + "pyjhora_only": [ + "amala", + "anthya_vayasi_dhana", + "asatyavadi", + "bahu_puthra", + "bandhubhisthyaktha", + "bhratruvriddhi", + "buddhimaturya", + "dehasthoulya", + "dharidhra", + "durmukha", + "kedaara", + "mathibhramana_variation", + "matru_sneha", + "matrunasa", + "nishkapata", + "rajabhrashta", + "rogagrastha", + "sareera_soukhya", + "satkalatra", + "swaveeryaddhana", + "vanchana_chora_bheethi", + "vrana" + ], + "error": null, + "skill_count": 25, + "skill_details": [ + { + "name": "Raja Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Malavya Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Gajakesari Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Gajakesari Yoga (from Moon)", + "id": "", + "strength": "强" + }, + { + "name": "Kahala Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Budhaditya Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Surya-Budha Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Shakata Yoga (Jupiter in Dusthana)", + "id": "", + "strength": "弱" + }, + { + "name": "Gajakesari Yoga (Kendra from Moon)", + "id": "", + "strength": "强" + }, + { + "name": "Dhana Yoga (2nd Lord Strong)", + "id": "", + "strength": "中" + }, + { + "name": "Chandra Yoga (Moon in Trikona)", + "id": "", + "strength": "强" + }, + { + "name": "Kalatra Yoga (7th Lord Exalted)", + "id": "", + "strength": "强" + }, + { + "name": "Kalatra Yoga (7th Lord in Kendra)", + "id": "", + "strength": "中" + }, + { + "name": "Kalatra Yoga (Venus in Kendra)", + "id": "", + "strength": "强" + }, + { + "name": "Mangal Dosha (Mars in 1/4/7/8/12)", + "id": "", + "strength": "弱" + }, + { + "name": "Ayur Yoga (Jupiter in 8th)", + "id": "", + "strength": "强" + }, + { + "name": "Ayur Yoga (8th Lord in Kendra)", + "id": "", + "strength": "中" + }, + { + "name": "Shakti Yoga (Sun in 10th House)", + "id": "", + "strength": "强" + }, + { + "name": "Karma Yoga (10th & 11th Lords Combination)", + "id": "", + "strength": "强" + }, + { + "name": "Asha Yoga (11th Lord Strong)", + "id": "", + "strength": "中" + }, + { + "name": "Raja Yoga (5th & 10th Lords Combination)", + "id": "", + "strength": "强" + }, + { + "name": "Vesi Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Vosi Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Ubhayachara Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Eka Puthra Yoga", + "id": "", + "strength": "中" + } + ], + "pyjhora_count": 29, + "pyjhora_details": [ + { + "function": "vosi_yoga", + "name": "Vosi Yoga", + "desc": "There is a planet other than Moon in the 12th house from Sun" + }, + { + "function": "nipuna_yoga", + "name": "Nipuna Yoga", + "desc": "Sun and Mercury are together (in one sign)." + }, + { + "function": "maalavya_yoga", + "name": "Maalavya Yoga", + "desc": "Venus is in a quadrant in own sign or exaltation sign." + }, + { + "function": "kedaara_yoga", + "name": "Kedaara Yoga", + "desc": "The seven planets occupy exactly 4 distinct signs among them." + }, + { + "function": "gaja_kesari_yoga", + "name": "gaja_kesari_yoga", + "desc": "Gaja-Kesari Yoga: If (1) Jupiter is in a quadrant from Moon, (2) a benefic planet conjoins or aspects Jupiter, and, (3) Jupiter is not debilitated or combust or in an enemy’s house" + }, + { + "function": "amala_yoga", + "name": "Amala Yoga", + "desc": "There are only natural benefics present in the 10th house from lagna or Moon." + }, + { + "function": "vanchana_chora_bheethi_yoga", + "name": "Vanchana Chora Bheethi Yoga", + "desc": "The Lord of Lagna is in the 6th, 8th, or 12th house joined with or aspected by malefics." + }, + { + "function": "kahala_yoga", + "name": "Kahala Yoga", + "desc": "The lords of the 4th and 9th houses are in mutual Kendras and the lord of the Lagna is strong." + }, + { + "function": "kedara_yoga", + "name": "Kedara Yoga", + "desc": "All seven planets are distributed among four different signs." + }, + { + "function": "dharidhra_yoga", + "name": "Dharidhra Yoga", + "desc": "The lord of the 11th house is in the 6th, 8th, or 12th house." + }, + { + "function": "sareera_soukhya_yoga", + "name": "Sareera Soukhya Yoga", + "desc": "The Lagna lord, Jupiter, and Venus are placed in Kendra houses." + }, + { + "function": "rogagrastha_yoga", + "name": "Rogagrastha Yoga", + "desc": "The Lagna lord is in the 6th, 8th, or 12th house and is associated with the lord of the 6th." + }, + { + "function": "dehasthoulya_yoga_114", + "name": "Dehasthoulya Yoga", + "desc": "Lagna Lord and its Navamsa Lord both occupy watery signs (in Rasi)." + }, + { + "function": "swaveeryaddhana_yoga", + "name": "Swaveeryaddhana Yoga", + "desc": "The Lagna lord is the strongest planet in the chart and is placed in a Kendra, associated with the 2nd lord." + }, + { + "function": "anthya_vayasi_dhana_yoga", + "name": "Anthya Vayasi Dhana Yoga", + "desc": "The lords of the 2nd, 9th, and 11th houses are placed in the 12th, 6th, or 8th houses from each other but associated with benefics." + }, + { + "function": "asatyavadi_yoga", + "name": "Asatyavadi Yoga", + "desc": "The 2nd lord is associated with malefic planets (Saturn, Rahu, Ketu) and Mercury is weak." + }, + { + "function": "durmukha_yoga", + "name": "Durmukha Yoga", + "desc": "Malefic planets (Saturn, Rahu, Ketu) occupy the 2nd house." + }, + { + "function": "bhratruvriddhi_yoga", + "name": "Bhratruvriddhi Yoga", + "desc": "The 3rd lord or Mars is associated with a benefic planet or placed in a benefic sign/Navamsha." + }, + { + "function": "bandhubhisthyaktha_yoga", + "name": "Bandhu Bhisthyaktha Yoga", + "desc": "195. The 4th lord must be associated with malefics or occupy evil shashtiamsas or join inimical or debilitation signs." + }, + { + "function": "matrunasa_yoga_198", + "name": "Maathru Naasa yoga", + "desc": "198 - The Moon should be hemmed in between, associated with or aspected by evil planets." + }, + { + "function": "nishkapata_yoga_205", + "name": "Nishkapata Yoga", + "desc": "205 - The 4th house must be occupied by a benefic, or a planet in exaltation, friendly or own house,or the 4th house must be a benefic sign." + }, + { + "function": "matru_sneha_yoga", + "name": "Maathru Sneha Yoga", + "desc": "First Variation - The Lagna (1st house) and the 4th house have the same planetary ruler. The lst and 4th houses can have common lords only in respect of Ge/Vi (Me) or Sg/Pi (Ju). Second Variation - The lords of the 1st and 4th houses are either natural or temporal friends. Third Variation - The Lagna lord (1st house ruler) and the 4th house lord are aspected by benefics." + }, + { + "function": "bahu_puthra_yoga_221", + "name": "Bahu Puthra Yoga", + "desc": "221 - The same yoga arises if the lord of the Navamsa occupied by a planet who is in association with the 7th lord is in the 1st, 2nd or 5th house. Steps: (1) Get 7th Lord in Rasi. (2) Find which rasi this 7th lord is in Navamsa chart. (3) Find the lord of that sign of step-2. (4) Find the sign of the Lord found from step-3 in rasi chart. (5) That sign should be either 1st, or 2nd or 5th from Lagna in rasi" + }, + { + "function": "eka_puthra_yoga", + "name": "Eka Puthra Yoga", + "desc": "225 - Lord of 5th house should join a kendra or trikona." + }, + { + "function": "buddhimaturya_yoga", + "name": "Buddhimaturya Yoga", + "desc": "231 - If the 5th lord, being a benefic, is either aspected by another benefic or occupies a benefic sign, the above yoga is given rise to." + }, + { + "function": "satkalatra_yoga", + "name": "Sathkalatra Yoga", + "desc": "239 - The lord of the 7th or Venus should join or be aspected by Jupiter or Mercury." + }, + { + "function": "vrana_yoga", + "name": "Vrana Yoga", + "desc": "265 - The 6th lord, being a malefic, should occupy the Lagna, 8th or 1Oth. Impacted organs depending on 6th lord: Sun- Spleen,heart. Moon-Oesophagus, alimentary canal. Mars-Genitals, left cerebral hemisphere, red colouring matter in blood,rectum. Mercury- Nerves, right cerebral hemisphere, cerebro-spinal-system, bronchial tubes, ears, tongue. Jupiter- Liver, supra-renals. Venus- Throat, kidneys, uterus, ovaries. Saturn- Teeth, skin, vagus nerve. Rahu- Pituitary body. Kethu- Pineal glands." + }, + { + "function": "mathibhramana_yoga_variation", + "name": "Mathibhramana Yoga", + "desc": "This yoga occurs, per B.V.Raman Variations, if - (1) The 6th is occupied by Rahu and aspected by Kethu. (2) The 6th lord is further affiicted by conjunction with Mars. (3) The planet of nerves Mercury is in a common sign in conjunction with two malefics, Mars and Sun. (4) In the Navamsa again Mercury occupies the 6th with Rahu and the 6th lord is in conjunction with Mars." + }, + { + "function": "rajabhrashta_yoga", + "name": "Rajabhrashta Yoga", + "desc": "297 - The lords of Aroodha Lagna (A1/AL) and Aroodha Dwadasa (A12/UL) should be in conjunction." + } + ], + "skill_only_functional": [ + "asha", + "ayur", + "dhana", + "kalatra", + "karma", + "mangal_dosha", + "raja", + "shakti" + ], + "skill_only_classic": [ + "chandra", + "shakata", + "surya_budha", + "ubhayachara", + "vesi", + "yoga" + ] + }, + { + "case_name": "Steve Jobs", + "birth": "1955-02-24 19:30", + "skill_yogas": [ + "Chandra-Mangala Yoga", + "Budha-Shukra Yoga", + "Dhana Yoga (11th Lord Exalted)", + "Putra Yoga (9th Lord in Kendra)", + "Kalatra Yoga (7th Lord in Kendra)", + "Kalatra Yoga (Venus in Kendra)", + "Mangal Dosha (Mars in 1/4/7/8/12)", + "Ayur Yoga (8th Lord in Kendra)", + "Shakti Yoga (10th Lord Exalted)", + "Karma Yoga (10th & 11th Lords Combination)", + "Asha Yoga (11th Lord Strong)", + "Aryama Yoga (9th Lord in Kendra)", + "Vosi Yoga", + "Sunaphaa Yoga", + "Eka Puthra Yoga" + ], + "pyjhora_yogas": [ + "vosi_yoga", + "sunaphaa_yoga", + "veenaa_yoga", + "amala_yoga", + "kaahala_yoga", + "sarala_yoga", + "kahala_yoga", + "vallaki_yoga", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "sada_sanchara_yoga", + "matrumooladdhana_yoga", + "sumukha_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "bahu_puthra_yoga_221", + "satkalatra_yoga", + "rajabhrashta_yoga" + ], + "matched": [ + "sunaphaa", + "vosi" + ], + "skill_only": [ + "aryama", + "asha", + "ayur", + "budha_shukra", + "chandra_mangala", + "dhana", + "eka_puthra", + "kalatra", + "karma", + "mangal_dosha", + "putra", + "shakti", + "yoga" + ], + "pyjhora_only": [ + "amala", + "bahu_puthra", + "bandhu_pujya", + "bandhubhisthyaktha", + "bhratruvriddhi", + "durmukha", + "kahala", + "kapata", + "krisanga", + "matrumooladdhana", + "matrunasa", + "nishkapata", + "rajabhrashta", + "rogagrastha", + "sada_sanchara", + "sarala", + "sareera_soukhya", + "satkalatra", + "sumukha", + "vallaki", + "veena", + "yuddha_praveena" + ], + "error": null, + "skill_count": 15, + "skill_details": [ + { + "name": "Chandra-Mangala Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Budha-Shukra Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Dhana Yoga (11th Lord Exalted)", + "id": "", + "strength": "强" + }, + { + "name": "Putra Yoga (9th Lord in Kendra)", + "id": "", + "strength": "中" + }, + { + "name": "Kalatra Yoga (7th Lord in Kendra)", + "id": "", + "strength": "中" + }, + { + "name": "Kalatra Yoga (Venus in Kendra)", + "id": "", + "strength": "强" + }, + { + "name": "Mangal Dosha (Mars in 1/4/7/8/12)", + "id": "", + "strength": "弱" + }, + { + "name": "Ayur Yoga (8th Lord in Kendra)", + "id": "", + "strength": "中" + }, + { + "name": "Shakti Yoga (10th Lord Exalted)", + "id": "", + "strength": "强" + }, + { + "name": "Karma Yoga (10th & 11th Lords Combination)", + "id": "", + "strength": "强" + }, + { + "name": "Asha Yoga (11th Lord Strong)", + "id": "", + "strength": "中" + }, + { + "name": "Aryama Yoga (9th Lord in Kendra)", + "id": "", + "strength": "中" + }, + { + "name": "Vosi Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Sunaphaa Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Eka Puthra Yoga", + "id": "", + "strength": "中" + } + ], + "pyjhora_count": 25, + "pyjhora_details": [ + { + "function": "vosi_yoga", + "name": "Vosi Yoga", + "desc": "There is a planet other than Moon in the 12th house from Sun" + }, + { + "function": "sunaphaa_yoga", + "name": "Sunaphaa Yoga", + "desc": "There are planets other than Sun in the 2nd house from Moon" + }, + { + "function": "veenaa_yoga", + "name": "Veenaa Yoga", + "desc": "The seven planets occupy exactly 7 distinct signs among them." + }, + { + "function": "amala_yoga", + "name": "Amala Yoga", + "desc": "There are only natural benefics present in the 10th house from lagna or Moon." + }, + { + "function": "kaahala_yoga", + "name": "Kaahala Yoga", + "desc": "If (1) the 4th lord and Jupiter32 are in mutual quadrants and (2) lagna lord is strong, then this yoga is present. Alternately, this yoga is present if the 4th lord is exalted or in own sign and the 10th lord joins him." + }, + { + "function": "sarala_yoga", + "name": "Sarala Yoga", + "desc": "If the 8th lord occupies the 8th house, then this yoga is present." + }, + { + "function": "kahala_yoga", + "name": "Kahala Yoga", + "desc": "The lords of the 4th and 9th houses are in mutual Kendras and the lord of the Lagna is strong." + }, + { + "function": "vallaki_yoga", + "name": "Vallaki Yoga", + "desc": "All seven planets are distributed among seven different signs." + }, + { + "function": "sareera_soukhya_yoga", + "name": "Sareera Soukhya Yoga", + "desc": "The Lagna lord, Jupiter, and Venus are placed in Kendra houses." + }, + { + "function": "rogagrastha_yoga", + "name": "Rogagrastha Yoga", + "desc": "The Lagna lord is in the 6th, 8th, or 12th house and is associated with the lord of the 6th." + }, + { + "function": "krisanga_yoga_112", + "name": "Krisanga Yoga", + "desc": "Lagna lord in a dry sign or in a sign owned by a dry planet." + }, + { + "function": "sada_sanchara_yoga", + "name": "Sada Sanchara Yoga", + "desc": "The Lagna lord or the Moon is in a movable sign (Chara Rashi)." + }, + { + "function": "matrumooladdhana_yoga", + "name": "Matrumooladdhana Yoga", + "desc": "The 2nd lord is associated with the 4th lord or placed in the 4th house with strong benefic influence." + }, + { + "function": "sumukha_yoga", + "name": "Sumukha Yoga", + "desc": "Benefic planets (Jupiter, Venus) are placed in or aspecting the 2nd house." + }, + { + "function": "durmukha_yoga", + "name": "Durmukha Yoga", + "desc": "Malefic planets (Saturn, Rahu, Ketu) occupy the 2nd house." + }, + { + "function": "bhratruvriddhi_yoga", + "name": "Bhratruvriddhi Yoga", + "desc": "The 3rd lord or Mars is associated with a benefic planet or placed in a benefic sign/Navamsha." + }, + { + "function": "yuddha_praveena_yoga", + "name": "Yuddha Praveena Yoga", + "desc": "The lord of the Navamsa occupied by the 3rd lord's Navamsa lord is placed in its own Varga." + }, + { + "function": "bandhu_pujya_yoga_194", + "name": "Bandhu Pujya Yoga", + "desc": "194 - The 4th house or the 4th lord should have the association or aspect of Jupiter." + }, + { + "function": "bandhubhisthyaktha_yoga", + "name": "Bandhu Bhisthyaktha Yoga", + "desc": "195. The 4th lord must be associated with malefics or occupy evil shashtiamsas or join inimical or debilitation signs." + }, + { + "function": "matrunasa_yoga_198", + "name": "Maathru Naasa yoga", + "desc": "198 - The Moon should be hemmed in between, associated with or aspected by evil planets." + }, + { + "function": "kapata_yoga_202", + "name": "Kapata Yoga", + "desc": "202 - The 4th house must be joined by a malefic and the 4rh lord must be associated with or aspected by malefics or be hemmed in between malefics." + }, + { + "function": "nishkapata_yoga_205", + "name": "Nishkapata Yoga", + "desc": "205 - The 4th house must be occupied by a benefic, or a planet in exaltation, friendly or own house,or the 4th house must be a benefic sign." + }, + { + "function": "bahu_puthra_yoga_221", + "name": "Bahu Puthra Yoga", + "desc": "221 - The same yoga arises if the lord of the Navamsa occupied by a planet who is in association with the 7th lord is in the 1st, 2nd or 5th house. Steps: (1) Get 7th Lord in Rasi. (2) Find which rasi this 7th lord is in Navamsa chart. (3) Find the lord of that sign of step-2. (4) Find the sign of the Lord found from step-3 in rasi chart. (5) That sign should be either 1st, or 2nd or 5th from Lagna in rasi" + }, + { + "function": "satkalatra_yoga", + "name": "Sathkalatra Yoga", + "desc": "239 - The lord of the 7th or Venus should join or be aspected by Jupiter or Mercury." + }, + { + "function": "rajabhrashta_yoga", + "name": "Rajabhrashta Yoga", + "desc": "297 - The lords of Aroodha Lagna (A1/AL) and Aroodha Dwadasa (A12/UL) should be in conjunction." + } + ], + "skill_only_functional": [ + "aryama", + "asha", + "ayur", + "dhana", + "eka_puthra", + "kalatra", + "karma", + "mangal_dosha", + "putra", + "shakti" + ], + "skill_only_classic": [ + "budha_shukra", + "chandra_mangala", + "yoga" + ] + }, + { + "case_name": "NM Gandhi", + "birth": "1869-10-02 08:52", + "skill_yogas": [ + "Raja Yoga", + "Raja Yoga", + "Malavya Yoga", + "Sasa Yoga", + "Malavya (Moola) Yoga", + "Gajakesari Yoga", + "Gajakesari Yoga (from Moon)", + "Angaraka Yoga", + "Veena Yoga", + "Gajakesari Yoga (Kendra from Moon)", + "Dhana Yoga (2nd & 11th Lords Combination)", + "Dhana Yoga (5th & 9th Lords in Wealth House)", + "Dhana Yoga (11th Lord Exalted)", + "Dhana Yoga (2nd Lord Strong)", + "Putra Yoga (9th Lord in Kendra)", + "Kalatra Yoga (7th Lord in Kendra)", + "Kalatra Yoga (Venus in Kendra)", + "Mangal Dosha (Mars in 1/4/7/8/12)", + "Ayur Yoga (8th Lord in Kendra)", + "Vidya Yoga (5th Lord Strong)", + "Vidya Yoga (Mercury Exalted)", + "Shakti Yoga (10th Lord Exalted)", + "Karma Yoga (10th & 11th Lords Combination)", + "Karma Yoga (Mars in 10th House)", + "Ari Yoga (6th Lord Strong)", + "Asha Yoga (11th Lord Strong)", + "Asha Yoga (11th Lord in Kendra)", + "Aryama Yoga (9th Lord in Kendra)", + "Shukra-Mangala Yoga (Venus-Mars Conjunction)", + "Raja Yoga (1st & 4th Lords in Kendra)", + "Vesi Yoga", + "Anaphaa Yoga" + ], + "pyjhora_yogas": [ + "vesi_yoga", + "maalavya_yoga", + "sarpa_yoga", + "vajra_yoga", + "paasa_yoga", + "asubha_yoga", + "gaja_kesari_yoga", + "guru_mangala_yoga", + "amala_yoga", + "sankha_yoga", + "bheri_yoga", + "mridanga_yoga", + "kalpadruma_yoga", + "bhaarathi_yoga", + "saraswathi_yoga", + "chatussagara_yoga", + "rajalakshana_yoga", + "dharidhra_yoga", + "dharidhra_yoga_152", + "sareera_soukhya_yoga", + "dehapushti_yoga", + "rogagrastha_yoga", + "dehasthoulya_yoga_116", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "anthya_vayasi_dhana_yoga", + "yukthi_samanwithavagmi_yoga_154", + "durmukha_yoga", + "annadana_yoga", + "bhratruvriddhi_yoga", + "parakrama_yoga", + "yuddha_praveena_yoga", + "ayatna_griha_prapta_yoga_189", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "bahu_puthra_yoga_221", + "eka_puthra_yoga", + "thrikaala_gnana_yoga", + "bahu_sthree_yoga", + "satkalatra_yoga", + "mathibhramana_yoga_294" + ], + "matched": [ + "gajakesari", + "malavya", + "vesi" + ], + "skill_only": [ + "anaphaa", + "angaraka", + "ari", + "aryama", + "asha", + "ayur", + "dhana", + "kalatra", + "karma", + "mangal_dosha", + "putra", + "raja", + "sasa", + "shakti", + "shukra_mangala", + "veena", + "vidya", + "yoga" + ], + "pyjhora_only": [ + "amala", + "annadana", + "anthya_vayasi_dhana", + "asubha", + "ayatna_griha_prapta", + "bahu_puthra", + "bahu_sthree", + "bandhubhisthyaktha", + "bharati", + "bheri", + "bhratruvriddhi", + "chatussagara", + "dehapushti", + "dehasthoulya", + "dharidhra", + "durmukha", + "eka_puthra", + "guru_mangala", + "kalpadruma", + "kapata", + "mathibhramana", + "matru_sneha", + "matrunasa", + "mridanga", + "nishkapata", + "parakrama", + "pasa", + "rajalakshana", + "rogagrastha", + "sada_sanchara", + "sankha", + "saraswati", + "sareera_soukhya", + "sarpa", + "satkalatra", + "swaveeryaddhana", + "thrikaala_gnana", + "vajra", + "yuddha_praveena", + "yukthi_samanwithavagmi" + ], + "error": null, + "skill_count": 32, + "skill_details": [ + { + "name": "Raja Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Raja Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Malavya Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Sasa Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Malavya (Moola) Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Gajakesari Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Gajakesari Yoga (from Moon)", + "id": "", + "strength": "强" + }, + { + "name": "Angaraka Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Veena Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Gajakesari Yoga (Kendra from Moon)", + "id": "", + "strength": "强" + }, + { + "name": "Dhana Yoga (2nd & 11th Lords Combination)", + "id": "", + "strength": "强" + }, + { + "name": "Dhana Yoga (5th & 9th Lords in Wealth House)", + "id": "", + "strength": "强" + }, + { + "name": "Dhana Yoga (11th Lord Exalted)", + "id": "", + "strength": "强" + }, + { + "name": "Dhana Yoga (2nd Lord Strong)", + "id": "", + "strength": "中" + }, + { + "name": "Putra Yoga (9th Lord in Kendra)", + "id": "", + "strength": "中" + }, + { + "name": "Kalatra Yoga (7th Lord in Kendra)", + "id": "", + "strength": "中" + }, + { + "name": "Kalatra Yoga (Venus in Kendra)", + "id": "", + "strength": "强" + }, + { + "name": "Mangal Dosha (Mars in 1/4/7/8/12)", + "id": "", + "strength": "弱" + }, + { + "name": "Ayur Yoga (8th Lord in Kendra)", + "id": "", + "strength": "中" + }, + { + "name": "Vidya Yoga (5th Lord Strong)", + "id": "", + "strength": "强" + }, + { + "name": "Vidya Yoga (Mercury Exalted)", + "id": "", + "strength": "强" + }, + { + "name": "Shakti Yoga (10th Lord Exalted)", + "id": "", + "strength": "强" + }, + { + "name": "Karma Yoga (10th & 11th Lords Combination)", + "id": "", + "strength": "强" + }, + { + "name": "Karma Yoga (Mars in 10th House)", + "id": "", + "strength": "中" + }, + { + "name": "Ari Yoga (6th Lord Strong)", + "id": "", + "strength": "中" + }, + { + "name": "Asha Yoga (11th Lord Strong)", + "id": "", + "strength": "中" + }, + { + "name": "Asha Yoga (11th Lord in Kendra)", + "id": "", + "strength": "中" + }, + { + "name": "Aryama Yoga (9th Lord in Kendra)", + "id": "", + "strength": "中" + }, + { + "name": "Shukra-Mangala Yoga (Venus-Mars Conjunction)", + "id": "", + "strength": "中" + }, + { + "name": "Raja Yoga (1st & 4th Lords in Kendra)", + "id": "", + "strength": "强" + }, + { + "name": "Vesi Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Anaphaa Yoga", + "id": "", + "strength": "中" + } + ], + "pyjhora_count": 44, + "pyjhora_details": [ + { + "function": "vesi_yoga", + "name": "Vesai Yoga", + "desc": "There is a planet other than Moon in the 2nd house from Sun" + }, + { + "function": "maalavya_yoga", + "name": "Maalavya Yoga", + "desc": "Venus is in a quadrant in own sign or exaltation sign." + }, + { + "function": "sarpa_yoga", + "name": "Sarpa Yoga", + "desc": "Three quadrants are occupied by natural malefic planets." + }, + { + "function": "vajra_yoga", + "name": "Vajra Yoga", + "desc": "Lagna and the 7th houses are occupied by natural benefic planet and the 4th and 10th houses are occupied by natural malefic planets." + }, + { + "function": "paasa_yoga", + "name": "Paasa Yoga", + "desc": "The seven planets occupy exactly 5 distinct signs among them." + }, + { + "function": "asubha_yoga", + "name": "Asubha Yoga", + "desc": "Lagna has malefics or has “paapa kartari or maleefics in 12th and 2nd house from Lagna." + }, + { + "function": "gaja_kesari_yoga", + "name": "gaja_kesari_yoga", + "desc": "Gaja-Kesari Yoga: If (1) Jupiter is in a quadrant from Moon, (2) a benefic planet conjoins or aspects Jupiter, and, (3) Jupiter is not debilitated or combust or in an enemy’s house" + }, + { + "function": "guru_mangala_yoga", + "name": "guru_mangala_yoga", + "desc": "If Jupiter and Mars are together or in the 7th house from each other, then this yoga is present." + }, + { + "function": "amala_yoga", + "name": "Amala Yoga", + "desc": "There are only natural benefics present in the 10th house from lagna or Moon." + }, + { + "function": "sankha_yoga", + "name": "Sankha Yoga", + "desc": "If (1) lagna lord is strong and (2) 5th and 6th lords are in mutual quadrants, then this yoga is present. Alternately, this yoga is present if (1) lagna lord and 10th lord are together in a movable sign and (2) the 9th lord is strong." + }, + { + "function": "bheri_yoga", + "name": "Bheri Yoga", + "desc": "]If (1) the 9th lord is strong and (2) 1st, 2nd, 7th and 12th houses are occupied by planets, then this yoga is present. Alternately, this is yoga is present if (1) the 9th lord is strong and (2) Jupiter, Venus and lagna lord are in mutual quadrants." + }, + { + "function": "mridanga_yoga", + "name": "Mridanga Yoga", + "desc": "If (1) there are planets in own and exaltation signs in quadrants and trines and (2) lagna lord is strong, then this yoga is present." + }, + { + "function": "kalpadruma_yoga", + "name": "Kalpadruma Yoga", + "desc": "Consider (1) lagna lord, (2) his dispositor, (3) the latter’s dispositor in rasi and (4) in navamsa. If all the four planets are all in quadrants, trines or exaltation signs of both rasi and navamsa, then this yoga is present." + }, + { + "function": "bhaarathi_yoga", + "name": "Bhaarathi Yoga", + "desc": "If the lord of the sign occupied in navamsa by 2nd, 5th or 11th lord exalted and joins the 9th lord, then this yoga is present." + }, + { + "function": "saraswathi_yoga", + "name": "Saraswathi Yoga", + "desc": "If (1) each of Mercury, Jupiter and Venus occupies a quadrant or a trine or the 2nd house (not necessarily together) and (2) Jupiter is in an own or friendly or exaltation sign, then this yoga is present." + }, + { + "function": "chatussagara_yoga", + "name": "Chatussagara Yoga", + "desc": "All planets occupy the four Kendra houses (1, 4, 7, 10)." + }, + { + "function": "rajalakshana_yoga", + "name": "Rajalakshana Yoga", + "desc": "Jupiter, Venus, Mercury, and the Moon are in Kendra houses." + }, + { + "function": "dharidhra_yoga", + "name": "Dharidhra Yoga", + "desc": "The lord of the 11th house is in the 6th, 8th, or 12th house." + }, + { + "function": "dharidhra_yoga_152", + "name": "Dharidhra Yoga", + "desc": "Natural malefics (not owning 9th or 10th) in Lagna associated with or aspected by maraka lords (L2/L7)." + }, + { + "function": "sareera_soukhya_yoga", + "name": "Sareera Soukhya Yoga", + "desc": "The Lagna lord, Jupiter, and Venus are placed in Kendra houses." + }, + { + "function": "dehapushti_yoga", + "name": "Dehapushti Yoga", + "desc": "The Lagna lord is in a movable sign (Chara Rashi) and is aspected by a benefic planet." + }, + { + "function": "rogagrastha_yoga", + "name": "Rogagrastha Yoga", + "desc": "The Lagna lord is in the 6th, 8th, or 12th house and is associated with the lord of the 6th." + }, + { + "function": "dehasthoulya_yoga_116", + "name": "Dehasthoulya Yoga", + "desc": "Lagna in a watery sign joined by benefics OR Lagna Lord is a watery planet." + }, + { + "function": "sada_sanchara_yoga", + "name": "Sada Sanchara Yoga", + "desc": "The Lagna lord or the Moon is in a movable sign (Chara Rashi)." + }, + { + "function": "swaveeryaddhana_yoga", + "name": "Swaveeryaddhana Yoga", + "desc": "The Lagna lord is the strongest planet in the chart and is placed in a Kendra, associated with the 2nd lord." + }, + { + "function": "anthya_vayasi_dhana_yoga", + "name": "Anthya Vayasi Dhana Yoga", + "desc": "The lords of the 2nd, 9th, and 11th houses are placed in the 12th, 6th, or 8th houses from each other but associated with benefics." + }, + { + "function": "yukthi_samanwithavagmi_yoga_154", + "name": "Yukthi Samanwithavagmi Yoga", + "desc": "The 2nd lord should join a benefic in a kendra or thrikona, or be exalted and combined with Jupiter." + }, + { + "function": "durmukha_yoga", + "name": "Durmukha Yoga", + "desc": "Malefic planets (Saturn, Rahu, Ketu) occupy the 2nd house." + }, + { + "function": "annadana_yoga", + "name": "Annadana Yoga", + "desc": "Jupiter or the Moon has a benefic association with the 2nd or 12th house." + }, + { + "function": "bhratruvriddhi_yoga", + "name": "Bhratruvriddhi Yoga", + "desc": "The 3rd lord or Mars is associated with a benefic planet or placed in a benefic sign/Navamsha." + }, + { + "function": "parakrama_yoga", + "name": "Parakrama Yoga", + "desc": "The lord of the 3rd should join a benefic navamsa being aspected by (or conjoined with) benefic planets, and Mars should occupy benefic signs." + }, + { + "function": "yuddha_praveena_yoga", + "name": "Yuddha Praveena Yoga", + "desc": "The lord of the Navamsa occupied by the 3rd lord's Navamsa lord is placed in its own Varga." + }, + { + "function": "ayatna_griha_prapta_yoga_189", + "name": "Ayatna Griha Prapta Yoga", + "desc": "189. Lords of Lagna and the 7th should occupy Lagna or the 4th, aspected by benefics." + }, + { + "function": "bandhubhisthyaktha_yoga", + "name": "Bandhu Bhisthyaktha Yoga", + "desc": "195. The 4th lord must be associated with malefics or occupy evil shashtiamsas or join inimical or debilitation signs." + }, + { + "function": "matrunasa_yoga_198", + "name": "Maathru Naasa yoga", + "desc": "198 - The Moon should be hemmed in between, associated with or aspected by evil planets." + }, + { + "function": "kapata_yoga_202", + "name": "Kapata Yoga", + "desc": "202 - The 4th house must be joined by a malefic and the 4rh lord must be associated with or aspected by malefics or be hemmed in between malefics." + }, + { + "function": "nishkapata_yoga_205", + "name": "Nishkapata Yoga", + "desc": "205 - The 4th house must be occupied by a benefic, or a planet in exaltation, friendly or own house,or the 4th house must be a benefic sign." + }, + { + "function": "matru_sneha_yoga", + "name": "Maathru Sneha Yoga", + "desc": "First Variation - The Lagna (1st house) and the 4th house have the same planetary ruler. The lst and 4th houses can have common lords only in respect of Ge/Vi (Me) or Sg/Pi (Ju). Second Variation - The lords of the 1st and 4th houses are either natural or temporal friends. Third Variation - The Lagna lord (1st house ruler) and the 4th house lord are aspected by benefics." + }, + { + "function": "bahu_puthra_yoga_221", + "name": "Bahu Puthra Yoga", + "desc": "221 - The same yoga arises if the lord of the Navamsa occupied by a planet who is in association with the 7th lord is in the 1st, 2nd or 5th house. Steps: (1) Get 7th Lord in Rasi. (2) Find which rasi this 7th lord is in Navamsa chart. (3) Find the lord of that sign of step-2. (4) Find the sign of the Lord found from step-3 in rasi chart. (5) That sign should be either 1st, or 2nd or 5th from Lagna in rasi" + }, + { + "function": "eka_puthra_yoga", + "name": "Eka Puthra Yoga", + "desc": "225 - Lord of 5th house should join a kendra or trikona." + }, + { + "function": "thrikaala_gnana_yoga", + "name": "Thrikaala Gnana Yoga", + "desc": "234 - Jupiter in Mrudwamsa in his own navamsa. OR Jupiter in Gopuramsa (score >= 4) AND aspected by a benefic." + }, + { + "function": "bahu_sthree_yoga", + "name": "Bahu Sthree Yoga", + "desc": "238 - If the lords of the Lagna and the 7th are in conjunction or aspect with each other, the above yoga is given rise to." + }, + { + "function": "satkalatra_yoga", + "name": "Sathkalatra Yoga", + "desc": "239 - The lord of the 7th or Venus should join or be aspected by Jupiter or Mercury." + }, + { + "function": "mathibhramana_yoga_294", + "name": "Mathibhramana Yoga", + "desc": "294 - The Moon and Mercury should be in a kendra, aspected by or conjoined with any other planet." + } + ], + "skill_only_functional": [ + "ari", + "aryama", + "asha", + "ayur", + "dhana", + "kalatra", + "karma", + "mangal_dosha", + "putra", + "raja", + "shakti", + "vidya" + ], + "skill_only_classic": [ + "anaphaa", + "angaraka", + "sasa", + "shukra_mangala", + "veena", + "yoga" + ] + }, + { + "case_name": "APJ Abdul Kalam", + "birth": "1931-10-15 06:00", + "skill_yogas": [ + "Raja Yoga", + "Raja Yoga", + "Bhadra Yoga", + "Bhadra Yoga", + "Bhadra (Moola) Yoga", + "Gajakesari Yoga", + "Gajakesari Yoga (from Moon)", + "Chandra-Mangala Yoga", + "Budhaditya Yoga", + "Budha-Shukra Yoga", + "Surya-Budha Yoga", + "Surya-Shukra Yoga", + "Surya-Shukra Yoga", + "Gajakesari Yoga (Kendra from Moon)", + "Dhana Yoga (5th & 9th Lords in Wealth House)", + "Surya Yoga (Sun in 1st House)", + "Kalatra Yoga (7th Lord in Kendra)", + "Kalatra Yoga (Venus in Kendra)", + "Vidya Yoga (Mercury Exalted)", + "Karma Yoga (10th & 11th Lords Combination)", + "Ari Yoga (6th Lord Strong)", + "Asha Yoga (Jupiter in 11th House)", + "Asha Yoga (11th Lord in Kendra)", + "Moksha Yoga (12th Lord Strong)", + "Moksha Yoga (Ketu in 12th House)", + "Moksha Yoga (4th/8th/12th Lords Combination)", + "Aryama Yoga (9th Lord Exalted)", + "Vesi Yoga", + "Vosi Yoga", + "Ubhayachara Yoga", + "Anaphaa Yoga", + "Eka Puthra Yoga" + ], + "pyjhora_yogas": [ + "vesi_yoga", + "nipuna_yoga", + "sunaphaa_yoga", + "anaphaa_yoga", + "duradhara_yoga", + "bhadra_yoga", + "sarpa_yoga", + "paasa_yoga", + "asubha_yoga", + "kaahala_yoga", + "sankha_yoga", + "mridanga_yoga", + "vanchana_chora_bheethi_yoga", + "kahala_yoga", + "dharidhra_yoga_149", + "dharidhra_yoga_150", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "krisanga_yoga_113", + "swaveeryaddhana_yoga", + "madhya_vayasi_dhana_yoga", + "sumukha_yoga", + "durmukha_yoga", + "bhratruvriddhi_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "eka_puthra_yoga", + "satkalatra_yoga", + "guhyaroga_yoga" + ], + "matched": [ + "anaphaa", + "bhadra", + "budhaditya", + "eka_puthra", + "vesi" + ], + "skill_only": [ + "ari", + "aryama", + "asha", + "budha_shukra", + "chandra_mangala", + "dhana", + "gajakesari", + "kalatra", + "karma", + "moksha", + "raja", + "surya", + "surya_budha", + "surya_shukra", + "ubhayachara", + "vidya", + "vosi", + "yoga" + ], + "pyjhora_only": [ + "asubha", + "bandhu_pujya", + "bandhubhisthyaktha", + "bhratruvriddhi", + "dharidhra", + "duradhara", + "durmukha", + "guhyaroga", + "kahala", + "kapata", + "krisanga", + "madhya_vayasi_dhana", + "matru_sneha", + "matrunasa", + "mridanga", + "nishkapata", + "pasa", + "rogagrastha", + "sankha", + "sareera_soukhya", + "sarpa", + "satkalatra", + "sumukha", + "sunaphaa", + "swaveeryaddhana", + "vanchana_chora_bheethi", + "yuddha_praveena" + ], + "error": null, + "skill_count": 32, + "skill_details": [ + { + "name": "Raja Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Raja Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Bhadra Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Bhadra Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Bhadra (Moola) Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Gajakesari Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Gajakesari Yoga (from Moon)", + "id": "", + "strength": "强" + }, + { + "name": "Chandra-Mangala Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Budhaditya Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Budha-Shukra Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Surya-Budha Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Surya-Shukra Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Surya-Shukra Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Gajakesari Yoga (Kendra from Moon)", + "id": "", + "strength": "强" + }, + { + "name": "Dhana Yoga (5th & 9th Lords in Wealth House)", + "id": "", + "strength": "强" + }, + { + "name": "Surya Yoga (Sun in 1st House)", + "id": "", + "strength": "中" + }, + { + "name": "Kalatra Yoga (7th Lord in Kendra)", + "id": "", + "strength": "中" + }, + { + "name": "Kalatra Yoga (Venus in Kendra)", + "id": "", + "strength": "强" + }, + { + "name": "Vidya Yoga (Mercury Exalted)", + "id": "", + "strength": "强" + }, + { + "name": "Karma Yoga (10th & 11th Lords Combination)", + "id": "", + "strength": "强" + }, + { + "name": "Ari Yoga (6th Lord Strong)", + "id": "", + "strength": "中" + }, + { + "name": "Asha Yoga (Jupiter in 11th House)", + "id": "", + "strength": "强" + }, + { + "name": "Asha Yoga (11th Lord in Kendra)", + "id": "", + "strength": "中" + }, + { + "name": "Moksha Yoga (12th Lord Strong)", + "id": "", + "strength": "中" + }, + { + "name": "Moksha Yoga (Ketu in 12th House)", + "id": "", + "strength": "强" + }, + { + "name": "Moksha Yoga (4th/8th/12th Lords Combination)", + "id": "", + "strength": "强" + }, + { + "name": "Aryama Yoga (9th Lord Exalted)", + "id": "", + "strength": "强" + }, + { + "name": "Vesi Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Vosi Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Ubhayachara Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Anaphaa Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Eka Puthra Yoga", + "id": "", + "strength": "中" + } + ], + "pyjhora_count": 35, + "pyjhora_details": [ + { + "function": "vesi_yoga", + "name": "Vesai Yoga", + "desc": "There is a planet other than Moon in the 2nd house from Sun" + }, + { + "function": "nipuna_yoga", + "name": "Nipuna Yoga", + "desc": "Sun and Mercury are together (in one sign)." + }, + { + "function": "sunaphaa_yoga", + "name": "Sunaphaa Yoga", + "desc": "There are planets other than Sun in the 2nd house from Moon" + }, + { + "function": "anaphaa_yoga", + "name": "Anaphaa Yoga", + "desc": "There are planets other than Sun in the 12th house from Moon" + }, + { + "function": "duradhara_yoga", + "name": "Duradhara Yoga", + "desc": "There are planets other than Sun in the 2nd and 12th houses from Moon." + }, + { + "function": "bhadra_yoga", + "name": "Bhadra Yoga", + "desc": "Mercury is in a quadrant in own sign or exaltation sign." + }, + { + "function": "sarpa_yoga", + "name": "Sarpa Yoga", + "desc": "Three quadrants are occupied by natural malefic planets." + }, + { + "function": "paasa_yoga", + "name": "Paasa Yoga", + "desc": "The seven planets occupy exactly 5 distinct signs among them." + }, + { + "function": "asubha_yoga", + "name": "Asubha Yoga", + "desc": "Lagna has malefics or has “paapa kartari or maleefics in 12th and 2nd house from Lagna." + }, + { + "function": "kaahala_yoga", + "name": "Kaahala Yoga", + "desc": "If (1) the 4th lord and Jupiter32 are in mutual quadrants and (2) lagna lord is strong, then this yoga is present. Alternately, this yoga is present if the 4th lord is exalted or in own sign and the 10th lord joins him." + }, + { + "function": "sankha_yoga", + "name": "Sankha Yoga", + "desc": "If (1) lagna lord is strong and (2) 5th and 6th lords are in mutual quadrants, then this yoga is present. Alternately, this yoga is present if (1) lagna lord and 10th lord are together in a movable sign and (2) the 9th lord is strong." + }, + { + "function": "mridanga_yoga", + "name": "Mridanga Yoga", + "desc": "If (1) there are planets in own and exaltation signs in quadrants and trines and (2) lagna lord is strong, then this yoga is present." + }, + { + "function": "vanchana_chora_bheethi_yoga", + "name": "Vanchana Chora Bheethi Yoga", + "desc": "The Lord of Lagna is in the 6th, 8th, or 12th house joined with or aspected by malefics." + }, + { + "function": "kahala_yoga", + "name": "Kahala Yoga", + "desc": "The lords of the 4th and 9th houses are in mutual Kendras and the lord of the Lagna is strong." + }, + { + "function": "dharidhra_yoga_149", + "name": "Dharidhra Yoga", + "desc": "Lord of Lagna associated with 6th, 8th, or 12th lord and subjected to malefic aspects." + }, + { + "function": "dharidhra_yoga_150", + "name": "Dharidhra Yoga", + "desc": "Lord of 5th joins lord of 6, 8, or 12 without beneficial aspects/conjunctions." + }, + { + "function": "sareera_soukhya_yoga", + "name": "Sareera Soukhya Yoga", + "desc": "The Lagna lord, Jupiter, and Venus are placed in Kendra houses." + }, + { + "function": "rogagrastha_yoga", + "name": "Rogagrastha Yoga", + "desc": "The Lagna lord is in the 6th, 8th, or 12th house and is associated with the lord of the 6th." + }, + { + "function": "krisanga_yoga_112", + "name": "Krisanga Yoga", + "desc": "Lagna lord in a dry sign or in a sign owned by a dry planet." + }, + { + "function": "krisanga_yoga_113", + "name": "Krisanga Yoga", + "desc": "The Navamsa Lagna is owned by a dry planet AND malefics join the Rasi Lagna." + }, + { + "function": "swaveeryaddhana_yoga", + "name": "Swaveeryaddhana Yoga", + "desc": "The Lagna lord is the strongest planet in the chart and is placed in a Kendra, associated with the 2nd lord." + }, + { + "function": "madhya_vayasi_dhana_yoga", + "name": "Madhya Vayasi Dhana Yoga", + "desc": "The lords of the Lagna, 2nd, and 11th houses are placed in Kendras or Thrikonas." + }, + { + "function": "sumukha_yoga", + "name": "Sumukha Yoga", + "desc": "Benefic planets (Jupiter, Venus) are placed in or aspecting the 2nd house." + }, + { + "function": "durmukha_yoga", + "name": "Durmukha Yoga", + "desc": "Malefic planets (Saturn, Rahu, Ketu) occupy the 2nd house." + }, + { + "function": "bhratruvriddhi_yoga", + "name": "Bhratruvriddhi Yoga", + "desc": "The 3rd lord or Mars is associated with a benefic planet or placed in a benefic sign/Navamsha." + }, + { + "function": "yuddha_praveena_yoga", + "name": "Yuddha Praveena Yoga", + "desc": "The lord of the Navamsa occupied by the 3rd lord's Navamsa lord is placed in its own Varga." + }, + { + "function": "bandhu_pujya_yoga_194", + "name": "Bandhu Pujya Yoga", + "desc": "194 - The 4th house or the 4th lord should have the association or aspect of Jupiter." + }, + { + "function": "bandhubhisthyaktha_yoga", + "name": "Bandhu Bhisthyaktha Yoga", + "desc": "195. The 4th lord must be associated with malefics or occupy evil shashtiamsas or join inimical or debilitation signs." + }, + { + "function": "matrunasa_yoga_198", + "name": "Maathru Naasa yoga", + "desc": "198 - The Moon should be hemmed in between, associated with or aspected by evil planets." + }, + { + "function": "kapata_yoga_202", + "name": "Kapata Yoga", + "desc": "202 - The 4th house must be joined by a malefic and the 4rh lord must be associated with or aspected by malefics or be hemmed in between malefics." + }, + { + "function": "nishkapata_yoga_205", + "name": "Nishkapata Yoga", + "desc": "205 - The 4th house must be occupied by a benefic, or a planet in exaltation, friendly or own house,or the 4th house must be a benefic sign." + }, + { + "function": "matru_sneha_yoga", + "name": "Maathru Sneha Yoga", + "desc": "First Variation - The Lagna (1st house) and the 4th house have the same planetary ruler. The lst and 4th houses can have common lords only in respect of Ge/Vi (Me) or Sg/Pi (Ju). Second Variation - The lords of the 1st and 4th houses are either natural or temporal friends. Third Variation - The Lagna lord (1st house ruler) and the 4th house lord are aspected by benefics." + }, + { + "function": "eka_puthra_yoga", + "name": "Eka Puthra Yoga", + "desc": "225 - Lord of 5th house should join a kendra or trikona." + }, + { + "function": "satkalatra_yoga", + "name": "Sathkalatra Yoga", + "desc": "239 - The lord of the 7th or Venus should join or be aspected by Jupiter or Mercury." + }, + { + "function": "guhyaroga_yoga", + "name": "Guhyaroga Yoga", + "desc": "281 - The Moon should join malefics in the Navamsa of Cancer or Scorpio." + } + ], + "skill_only_functional": [ + "ari", + "aryama", + "asha", + "dhana", + "kalatra", + "karma", + "moksha", + "raja", + "vidya" + ], + "skill_only_classic": [ + "budha_shukra", + "chandra_mangala", + "gajakesari", + "surya", + "surya_budha", + "surya_shukra", + "ubhayachara", + "vosi", + "yoga" + ] + }, + { + "case_name": "Queen Elizabeth II", + "birth": "1926-04-21 02:40", + "skill_yogas": [ + "Raja Yoga", + "Raja Yoga", + "Raja Yoga", + "Ruchaka Yoga", + "Sasa Yoga", + "Guru-Mangala Yoga", + "Guru-Shukra Yoga", + "Dhana Yoga (11th Lord Exalted)", + "Putra Yoga (9th Lord in Kendra)", + "Kalatra Yoga (7th Lord in Kendra)", + "Kalatra Yoga (Venus in Kendra)", + "Mangal Dosha (Mars in 1/4/7/8/12)", + "Ayur Yoga (8th Lord in Kendra)", + "Shakti Yoga (10th Lord Exalted)", + "Karma Yoga (10th & 11th Lords Combination)", + "Asha Yoga (11th Lord Strong)", + "Asha Yoga (11th Lord in Kendra)", + "Moksha Yoga (Ketu in 12th House)", + "Moksha Yoga (4th/8th/12th Lords Combination)", + "Aryama Yoga (9th Lord in Kendra)", + "Guru Yoga (Jupiter with Ascendant Lord)", + "Shukra-Mangala Yoga (Venus-Mars Conjunction)", + "Varga Yoga (D1 & D9 Lord Same Sign)", + "Vosi Yoga" + ], + "pyjhora_yogas": [ + "vosi_yoga", + "anaphaa_yoga", + "ruchaka_yoga", + "daama_yoga", + "guru_mangala_yoga", + "kaahala_yoga", + "dama_yoga", + "dharidhra_yoga", + "dharidhra_yoga_152", + "sareera_soukhya_yoga", + "rogagrastha_yoga", + "krisanga_yoga_112", + "dehasthoulya_yoga_114", + "dehasthoulya_yoga_115", + "sada_sanchara_yoga", + "swaveeryaddhana_yoga", + "sumukha_yoga", + "bhratruvriddhi_yoga", + "dwadasa_sahodara_yoga", + "yuddha_praveena_yoga", + "bandhu_pujya_yoga_194", + "bandhubhisthyaktha_yoga", + "matrunasa_yoga_198", + "kapata_yoga_202", + "nishkapata_yoga_205", + "matru_sneha_yoga", + "vahana_yoga_209", + "bahu_puthra_yoga_221", + "kaalanirdesat_puthranaasa_yoga_230", + "buddhimaturya_yoga", + "satkalatra_yoga", + "mathibhramana_yoga_variation" + ], + "matched": [ + "guru_mangala", + "ruchaka", + "vosi" + ], + "skill_only": [ + "aryama", + "asha", + "ayur", + "dhana", + "guru", + "guru_shukra", + "kalatra", + "karma", + "mangal_dosha", + "moksha", + "navamsa", + "putra", + "raja", + "sasa", + "shakti", + "shukra_mangala", + "varga", + "yoga" + ], + "pyjhora_only": [ + "anaphaa", + "bahu_puthra", + "bandhu_pujya", + "bandhubhisthyaktha", + "bhratruvriddhi", + "buddhimaturya", + "dama", + "dehasthoulya", + "dharidhra", + "dwadasa_sahodara", + "kaalanirdesat_puthranaasa", + "kahala", + "kapata", + "krisanga", + "mathibhramana_variation", + "matru_sneha", + "matrunasa", + "nishkapata", + "rogagrastha", + "sada_sanchara", + "sareera_soukhya", + "satkalatra", + "sumukha", + "swaveeryaddhana", + "vahana", + "yuddha_praveena" + ], + "error": null, + "skill_count": 24, + "skill_details": [ + { + "name": "Raja Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Raja Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Raja Yoga", + "id": "", + "strength": "中" + }, + { + "name": "Ruchaka Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Sasa Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Guru-Mangala Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Guru-Shukra Yoga", + "id": "", + "strength": "强" + }, + { + "name": "Dhana Yoga (11th Lord Exalted)", + "id": "", + "strength": "强" + }, + { + "name": "Putra Yoga (9th Lord in Kendra)", + "id": "", + "strength": "中" + }, + { + "name": "Kalatra Yoga (7th Lord in Kendra)", + "id": "", + "strength": "中" + }, + { + "name": "Kalatra Yoga (Venus in Kendra)", + "id": "", + "strength": "强" + }, + { + "name": "Mangal Dosha (Mars in 1/4/7/8/12)", + "id": "", + "strength": "弱" + }, + { + "name": "Ayur Yoga (8th Lord in Kendra)", + "id": "", + "strength": "中" + }, + { + "name": "Shakti Yoga (10th Lord Exalted)", + "id": "", + "strength": "强" + }, + { + "name": "Karma Yoga (10th & 11th Lords Combination)", + "id": "", + "strength": "强" + }, + { + "name": "Asha Yoga (11th Lord Strong)", + "id": "", + "strength": "中" + }, + { + "name": "Asha Yoga (11th Lord in Kendra)", + "id": "", + "strength": "中" + }, + { + "name": "Moksha Yoga (Ketu in 12th House)", + "id": "", + "strength": "强" + }, + { + "name": "Moksha Yoga (4th/8th/12th Lords Combination)", + "id": "", + "strength": "强" + }, + { + "name": "Aryama Yoga (9th Lord in Kendra)", + "id": "", + "strength": "中" + }, + { + "name": "Guru Yoga (Jupiter with Ascendant Lord)", + "id": "", + "strength": "强" + }, + { + "name": "Shukra-Mangala Yoga (Venus-Mars Conjunction)", + "id": "", + "strength": "中" + }, + { + "name": "Varga Yoga (D1 & D9 Lord Same Sign)", + "id": "", + "strength": "强" + }, + { + "name": "Vosi Yoga", + "id": "", + "strength": "中" + } + ], + "pyjhora_count": 32, + "pyjhora_details": [ + { + "function": "vosi_yoga", + "name": "Vosi Yoga", + "desc": "There is a planet other than Moon in the 12th house from Sun" + }, + { + "function": "anaphaa_yoga", + "name": "Anaphaa Yoga", + "desc": "There are planets other than Sun in the 12th house from Moon" + }, + { + "function": "ruchaka_yoga", + "name": "Ruchaka Yoga", + "desc": "Mars is in a quadrant in own sign or exaltation sign." + }, + { + "function": "daama_yoga", + "name": "Daama Yoga", + "desc": "The seven planets occupy exactly 6 distinct signs among them." + }, + { + "function": "guru_mangala_yoga", + "name": "guru_mangala_yoga", + "desc": "If Jupiter and Mars are together or in the 7th house from each other, then this yoga is present." + }, + { + "function": "kaahala_yoga", + "name": "Kaahala Yoga", + "desc": "If (1) the 4th lord and Jupiter32 are in mutual quadrants and (2) lagna lord is strong, then this yoga is present. Alternately, this yoga is present if the 4th lord is exalted or in own sign and the 10th lord joins him." + }, + { + "function": "dama_yoga", + "name": "Dama Yoga", + "desc": "All seven planets are distributed among six different signs." + }, + { + "function": "dharidhra_yoga", + "name": "Dharidhra Yoga", + "desc": "The lord of the 11th house is in the 6th, 8th, or 12th house." + }, + { + "function": "dharidhra_yoga_152", + "name": "Dharidhra Yoga", + "desc": "Natural malefics (not owning 9th or 10th) in Lagna associated with or aspected by maraka lords (L2/L7)." + }, + { + "function": "sareera_soukhya_yoga", + "name": "Sareera Soukhya Yoga", + "desc": "The Lagna lord, Jupiter, and Venus are placed in Kendra houses." + }, + { + "function": "rogagrastha_yoga", + "name": "Rogagrastha Yoga", + "desc": "The Lagna lord is in the 6th, 8th, or 12th house and is associated with the lord of the 6th." + }, + { + "function": "krisanga_yoga_112", + "name": "Krisanga Yoga", + "desc": "Lagna lord in a dry sign or in a sign owned by a dry planet." + }, + { + "function": "dehasthoulya_yoga_114", + "name": "Dehasthoulya Yoga", + "desc": "Lagna Lord and its Navamsa Lord both occupy watery signs (in Rasi)." + }, + { + "function": "dehasthoulya_yoga_115", + "name": "Dehasthoulya Yoga", + "desc": "Jupiter in Lagna OR Jupiter aspects Lagna from a watery sign." + }, + { + "function": "sada_sanchara_yoga", + "name": "Sada Sanchara Yoga", + "desc": "The Lagna lord or the Moon is in a movable sign (Chara Rashi)." + }, + { + "function": "swaveeryaddhana_yoga", + "name": "Swaveeryaddhana Yoga", + "desc": "The Lagna lord is the strongest planet in the chart and is placed in a Kendra, associated with the 2nd lord." + }, + { + "function": "sumukha_yoga", + "name": "Sumukha Yoga", + "desc": "Benefic planets (Jupiter, Venus) are placed in or aspecting the 2nd house." + }, + { + "function": "bhratruvriddhi_yoga", + "name": "Bhratruvriddhi Yoga", + "desc": "The 3rd lord or Mars is associated with a benefic planet or placed in a benefic sign/Navamsha." + }, + { + "function": "dwadasa_sahodara_yoga", + "name": "Dwadasa Sahodara Yoga", + "desc": "The 3rd lord is in a kendra and exalted Mars joins Jupiter in a thrikona from the 3rd lord." + }, + { + "function": "yuddha_praveena_yoga", + "name": "Yuddha Praveena Yoga", + "desc": "The lord of the Navamsa occupied by the 3rd lord's Navamsa lord is placed in its own Varga." + }, + { + "function": "bandhu_pujya_yoga_194", + "name": "Bandhu Pujya Yoga", + "desc": "194 - The 4th house or the 4th lord should have the association or aspect of Jupiter." + }, + { + "function": "bandhubhisthyaktha_yoga", + "name": "Bandhu Bhisthyaktha Yoga", + "desc": "195. The 4th lord must be associated with malefics or occupy evil shashtiamsas or join inimical or debilitation signs." + }, + { + "function": "matrunasa_yoga_198", + "name": "Maathru Naasa yoga", + "desc": "198 - The Moon should be hemmed in between, associated with or aspected by evil planets." + }, + { + "function": "kapata_yoga_202", + "name": "Kapata Yoga", + "desc": "202 - The 4th house must be joined by a malefic and the 4rh lord must be associated with or aspected by malefics or be hemmed in between malefics." + }, + { + "function": "nishkapata_yoga_205", + "name": "Nishkapata Yoga", + "desc": "205 - The 4th house must be occupied by a benefic, or a planet in exaltation, friendly or own house,or the 4th house must be a benefic sign." + }, + { + "function": "matru_sneha_yoga", + "name": "Maathru Sneha Yoga", + "desc": "First Variation - The Lagna (1st house) and the 4th house have the same planetary ruler. The lst and 4th houses can have common lords only in respect of Ge/Vi (Me) or Sg/Pi (Ju). Second Variation - The lords of the 1st and 4th houses are either natural or temporal friends. Third Variation - The Lagna lord (1st house ruler) and the 4th house lord are aspected by benefics." + }, + { + "function": "vahana_yoga_209", + "name": "Vaahana Yoga", + "desc": "209 - The lord of Lagna must join the 4th, 11th or the 9th." + }, + { + "function": "bahu_puthra_yoga_221", + "name": "Bahu Puthra Yoga", + "desc": "221 - The same yoga arises if the lord of the Navamsa occupied by a planet who is in association with the 7th lord is in the 1st, 2nd or 5th house. Steps: (1) Get 7th Lord in Rasi. (2) Find which rasi this 7th lord is in Navamsa chart. (3) Find the lord of that sign of step-2. (4) Find the sign of the Lord found from step-3 in rasi chart. (5) That sign should be either 1st, or 2nd or 5th from Lagna in rasi" + }, + { + "function": "kaalanirdesat_puthranaasa_yoga_230", + "name": "Kaalanirdesat Puthranaasa Yoga", + "desc": "230 - Malefics should be disposed (cojoins or aspect) in 5th from Jupiter and 5th from Lagna" + }, + { + "function": "buddhimaturya_yoga", + "name": "Buddhimaturya Yoga", + "desc": "231 - If the 5th lord, being a benefic, is either aspected by another benefic or occupies a benefic sign, the above yoga is given rise to." + }, + { + "function": "satkalatra_yoga", + "name": "Sathkalatra Yoga", + "desc": "239 - The lord of the 7th or Venus should join or be aspected by Jupiter or Mercury." + }, + { + "function": "mathibhramana_yoga_variation", + "name": "Mathibhramana Yoga", + "desc": "This yoga occurs, per B.V.Raman Variations, if - (1) The 6th is occupied by Rahu and aspected by Kethu. (2) The 6th lord is further affiicted by conjunction with Mars. (3) The planet of nerves Mercury is in a common sign in conjunction with two malefics, Mars and Sun. (4) In the Navamsa again Mercury occupies the 6th with Rahu and the 6th lord is in conjunction with Mars." + } + ], + "skill_only_functional": [ + "aryama", + "asha", + "ayur", + "dhana", + "guru", + "kalatra", + "karma", + "mangal_dosha", + "moksha", + "putra", + "raja", + "shakti", + "varga" + ], + "skill_only_classic": [ + "guru_shukra", + "navamsa", + "sasa", + "shukra_mangala", + "yoga" + ] + } + ], + "summary": { + "total_skill_yogas": 128, + "total_pyjhora_yogas": 165, + "total_matched": 19, + "total_skill_only": 81, + "total_pyjhora_only": 137, + "total_skill_only_functional": 52, + "total_skill_only_classic": 29 + } +} \ No newline at end of file diff --git a/scripts/varga.py b/scripts/varga.py index 247fe13d..fb79584d 100644 --- a/scripts/varga.py +++ b/scripts/varga.py @@ -52,11 +52,15 @@ def varga_map(si, pi, div): """BPHS分盘映射:星座索引si的第pi份→目标星座索引""" o = _odd(si) if div==2: return (4 if o else 3) if pi==0 else (3 if o else 4) - if div==3: return (si+pi*4)%12 if o else (si+8+pi*4)%12 + if div==3: return (si+pi*4)%12 # Drekkana: same → +4 → +8, no odd/even distinction if div==4: return (si+pi)%12 if o else (si+8+pi)%12 if div==7: return (si+pi)%12 if o else (si+6+pi)%12 if div==9: - el={0:0,1:9,2:6,3:3}; return (el[si%4]+pi)%12 + # BPHS Navamsa: movable(0,3,6,9)=same, fixed(1,4,7,10)=+4, dual(2,5,8,11)=+8 + if si%3==0: start=si + elif si%3==1: start=(si+4)%12 + else: start=(si+8)%12 + return (start+pi)%12 if div==10: return (si+pi)%12 if o else (si+8+pi)%12 # D10: even signs count from 9th inclusively => +8 offset if div==12: return (si+pi)%12 if div==16: return ((0 if o else 4)+pi)%12 # D16: movable=+0, fixed=+4; dual needs separate (2026-05-03 fix: was +1) @@ -72,17 +76,7 @@ def varga_map(si, pi, div): def calc_varga(lon, div): """计算行星在指定分盘的位置(星座+精确度数+尊贵状态)""" si=_si(lon); d=lon-si*30; ps=30.0/div; pi=int(d/ps) - if div == 9: - # D9 Navamsa: retain harmonic longitude output to match existing skill/JHora-style readings. - nav_lon = (lon * 9) % 360 - vsi = int(nav_lon / 30) % 12 - dp = nav_lon - vsi * 30 - pi = int(d / ps) - r = {'sign': _sn(vsi), 'sign_idx': vsi, 'degree_in_sign': round(dp, 4), - 'part_index': pi, 'lord': SIGN_LORDS.get(_sn(vsi), ''), 'pada': pi + 1} - return r - # For non-D9 vargas, degree within divisional sign is scaled to 0-30 degrees. - # Previous code returned only the within-part remainder (0-part_size), which made D10 degree output non-standard. + # For all vargas, degree within divisional sign is scaled to 0-30 degrees. dp=(d-pi*ps)*div vsi=varga_map(si,pi,div) r={'sign':_sn(vsi),'sign_idx':vsi,'degree_in_sign':round(dp,4), diff --git a/scripts/yoga_engine.py b/scripts/yoga_engine.py new file mode 100644 index 00000000..abcba8bc --- /dev/null +++ b/scripts/yoga_engine.py @@ -0,0 +1,1297 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Yoga 规则引擎 v1.0 (数据驱动架构) +从 JSON 规则配置中读取 Yoga 定义,通用条件解释器执行检测。 + +设计原则: +- 规则完全数据驱动,加新 Yoga 只需改 JSON +- 条件类型可扩展,覆盖 BPHS/PyJHora 主流 Yoga 模式 +- 与原 cmd_yoga() API 兼容 +""" + +import ast +import json +import os +from typing import Dict, List, Any, Optional + +# ============================================================================ +# 基础常量(自包含,避免循环导入) +# ============================================================================ +SIGNS = ['Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo', + 'Libra', 'Scorpio', 'Sagittarius', 'Capricorn', 'Aquarius', 'Pisces'] +SIGN_LORDS = { + 'Aries': 'Mars', 'Taurus': 'Venus', 'Gemini': 'Mercury', 'Cancer': 'Moon', + 'Leo': 'Sun', 'Virgo': 'Mercury', 'Libra': 'Venus', 'Scorpio': 'Mars', + 'Sagittarius': 'Jupiter', 'Capricorn': 'Saturn', 'Aquarius': 'Saturn', 'Pisces': 'Jupiter' +} +EXALTATION = { + 'Sun': 'Aries', 'Moon': 'Taurus', 'Mars': 'Capricorn', 'Mercury': 'Virgo', + 'Jupiter': 'Cancer', 'Venus': 'Pisces', 'Saturn': 'Libra' +} +DEBILITATION = { + 'Sun': 'Libra', 'Moon': 'Scorpio', 'Mars': 'Cancer', 'Mercury': 'Pisces', + 'Jupiter': 'Capricorn', 'Venus': 'Virgo', 'Saturn': 'Aries' +} +MOOLATRIKONA_SIGN = { + 'Sun': 'Leo', 'Moon': 'Taurus', 'Mars': 'Aries', 'Mercury': 'Virgo', + 'Jupiter': 'Sagittarius', 'Venus': 'Libra', 'Saturn': 'Aquarius' +} +PLANET_CN = { + "Ketu": "南交点Ketu", "Venus": "金星Venus", "Sun": "太阳Sun", + "Moon": "月亮Moon", "Mars": "火星Mars", "Rahu": "北交点Rahu", + "Jupiter": "木星Jupiter", "Saturn": "土星Saturn", "Mercury": "水星Mercury" +} +BENEFICS = ['Jupiter', 'Venus', 'Mercury', 'Moon'] +MALEFICS = ['Mars', 'Saturn', 'Sun', 'Rahu', 'Ketu'] +ALL_PLANETS = ['Sun', 'Moon', 'Mars', 'Mercury', 'Jupiter', 'Venus', 'Saturn', 'Rahu', 'Ketu'] + + +def _get_dignity_level(planet: str, sign: str) -> str: + """判断行星在某星座的尊严等级""" + if EXALTATION.get(planet) == sign: + return 'EXALTED' + if SIGN_LORDS.get(sign) == planet: + return 'OWN_SIGN' + if MOOLATRIKONA_SIGN.get(planet) == sign: + return 'MOOLATRIKONA' + if DEBILITATION.get(planet) == sign: + return 'DEBILITATED' + return 'NEUTRAL' + + +# ============================================================================ +# YogaContext: 封装星盘数据,提供查询接口 +# ============================================================================ +class YogaContext: + """Yoga 检测上下文。封装行星数据并提供各类查询方法。""" + + def __init__(self, planets: Dict[str, Dict], ascendant: str): + self.planets = planets # name -> {sign, house, degree, ...} + self.ascendant = ascendant + self.asc_idx = SIGNS.index(ascendant) if ascendant in SIGNS else 0 + + # 预计算宫主星 + self._house_lords: Dict[int, str] = {} + for h in range(1, 13): + sign = SIGNS[(self.asc_idx + h - 1) % 12] + self._house_lords[h] = SIGN_LORDS[sign] + + # --- 基础查询 --- + def house_of(self, planet: str) -> Optional[int]: + return self.planets.get(planet, {}).get("house") + + def sign_of(self, planet: str) -> Optional[str]: + return self.planets.get(planet, {}).get("sign") + + def degree_of(self, planet: str) -> Optional[float]: + return self.planets.get(planet, {}).get("degree") + + def lord_of_house(self, house: int) -> Optional[str]: + return self._house_lords.get(house) + + def planets_in_house(self, house: int) -> List[str]: + return [p for p, info in self.planets.items() if info.get("house") == house] + + # --- 尊严 --- + def is_exalted(self, planet: str) -> bool: + s = self.sign_of(planet) + return s is not None and EXALTATION.get(planet) == s + + def is_own_sign(self, planet: str) -> bool: + s = self.sign_of(planet) + return s is not None and SIGN_LORDS.get(s) == planet + + def is_moolatrikona(self, planet: str) -> bool: + s = self.sign_of(planet) + return s is not None and MOOLATRIKONA_SIGN.get(planet) == s + + def is_debilitated(self, planet: str) -> bool: + s = self.sign_of(planet) + return s is not None and DEBILITATION.get(planet) == s + + def dignity(self, planet: str) -> str: + s = self.sign_of(planet) + return _get_dignity_level(planet, s) if s else 'NEUTRAL' + + # --- 宫位性质 --- + def is_kendra(self, house: int) -> bool: + return house in [1, 4, 7, 10] + + def is_trikona(self, house: int) -> bool: + return house in [1, 5, 9] + + def is_dusthana(self, house: int) -> bool: + return house in [6, 8, 12] + + def is_upachaya(self, house: int) -> bool: + return house in [3, 6, 10, 11] + + def is_maraka(self, house: int) -> bool: + return house in [2, 7] + + def is_badhaka(self, house: int) -> bool: + """Badhaka 宫:基本盘7宫,固定盘9宫,变动盘11宫""" + asc = self.ascendant + if asc in ['Aries', 'Cancer', 'Libra', 'Capricorn']: + return house == 11 + if asc in ['Taurus', 'Leo', 'Scorpio', 'Aquarius']: + return house == 9 + return house == 7 + + # --- 相对宫位关系 --- + def house_offset(self, from_house: int, to_house: int) -> int: + """从 from_house 到 to_house 的宫位偏移 (0=同宫, 1=下一宫, ...)""" + return (to_house - from_house) % 12 + + def is_kendra_from(self, planet: str, from_planet: str) -> bool: + h1 = self.house_of(from_planet) + h2 = self.house_of(planet) + if h1 is None or h2 is None: + return False + return self.house_offset(h1, h2) in [0, 3, 6, 9] + + def is_trikona_from(self, planet: str, from_planet: str) -> bool: + h1 = self.house_of(from_planet) + h2 = self.house_of(planet) + if h1 is None or h2 is None: + return False + return self.house_offset(h1, h2) in [0, 4, 8] + + def is_2nd_or_12th_from(self, planet: str, from_planet: str) -> bool: + h1 = self.house_of(from_planet) + h2 = self.house_of(planet) + if h1 is None or h2 is None: + return False + return self.house_offset(h1, h2) in [1, 11] + + # --- 角色解析 --- + def resolve(self, ref: Any) -> List[str]: + """ + 解析行星引用为具体行星名称列表。 + 支持: 字符串行星名、角色对象、角色字符串。 + """ + if isinstance(ref, str): + if ref in self.planets: + return [ref] + if ref == "benefics": + return [p for p in BENEFICS if p in self.planets] + if ref == "malefics": + return [p for p in MALEFICS if p in self.planets] + if ref == "all": + return list(self.planets.keys()) + if ref in ("visible", "sun_to_saturn"): + return [p for p in ['Sun', 'Moon', 'Mars', 'Mercury', 'Jupiter', 'Venus', 'Saturn'] if p in self.planets] + if ref == "kendra_lords": + return list(dict.fromkeys([self._house_lords[h] for h in [1, 4, 7, 10]])) + if ref == "trikona_lords": + return list(dict.fromkeys([self._house_lords[h] for h in [1, 5, 9]])) + if ref == "dusthana_lords": + return list(dict.fromkeys([self._house_lords[h] for h in [6, 8, 12]])) + if ref == "upachaya_lords": + return list(dict.fromkeys([self._house_lords[h] for h in [3, 6, 10, 11]])) + if ref.startswith("lord:"): + house = int(ref.split(":")[1]) + lord = self._house_lords.get(house) + return [lord] if lord else [] + return [] + + if isinstance(ref, dict): + role = ref.get("role") + if role == "lord": + house = ref.get("house") + lord = self._house_lords.get(house) + return [lord] if lord else [] + if role == "kendra_lords": + return list(dict.fromkeys([self._house_lords[h] for h in [1, 4, 7, 10]])) + if role == "trikona_lords": + return list(dict.fromkeys([self._house_lords[h] for h in [1, 5, 9]])) + if role == "dusthana_lords": + return list(dict.fromkeys([self._house_lords[h] for h in [6, 8, 12]])) + if role == "upachaya_lords": + return list(dict.fromkeys([self._house_lords[h] for h in [3, 6, 10, 11]])) + if role == "benefics": + return [p for p in BENEFICS if p in self.planets] + if role == "malefics": + return [p for p in MALEFICS if p in self.planets] + if role == "all": + return list(self.planets.keys()) + if role in ("visible", "sun_to_saturn"): + return [p for p in ['Sun', 'Moon', 'Mars', 'Mercury', 'Jupiter', 'Venus', 'Saturn'] if p in self.planets] + if role == "set": + return [p for p in ref.get("planets", []) if p in self.planets] + return [] + + def resolve_single(self, ref: Any) -> Optional[str]: + """解析为单个行星,返回 None 或行星名""" + lst = self.resolve(ref) + return lst[0] if lst else None + + +# ============================================================================ +# YogaEngine: 规则加载与检测 +# ============================================================================ +class YogaEngine: + """Yoga 检测引擎。从 JSON 加载规则,对星盘执行条件匹配。""" + + def __init__(self, rules_path: str): + with open(rules_path, 'r', encoding='utf-8') as f: + data = json.load(f) + self.schema_version = data.get("schema_version", "1.0") + self.rules = [r for r in data.get("rules", []) if r.get("enabled", True)] + + def detect(self, planets: Dict[str, Dict], ascendant: str) -> List[Dict]: + """ + 检测 Yoga。 + 返回: [{name, name_cn, combination, effects, strength, source, bvr_id, category}, ...] + """ + ctx = YogaContext(planets, ascendant) + results = [] + seen_dedup = set() + + for rule in self.rules: + matches = self._eval_rule(rule, ctx) + for m in matches: + entry = { + "name": rule["name"], + "name_cn": rule["name_cn"], + "combination": m.get("combination", ""), + "effects": rule.get("effects", []), + "strength": m.get("strength", rule.get("strength", "中")), + "source": rule.get("source", ""), + "bvr_id": rule.get("bvr_id"), + "category": rule.get("category", ""), + "rule_id": rule.get("id", ""), + } + # 去重:基于 dedup_key 或 name + combination + dedup_key = rule.get("dedup_key") or rule["name"] + dedup_val = f"{dedup_key}:{m.get('combination', '')}" + if dedup_val in seen_dedup: + continue + seen_dedup.add(dedup_val) + results.append(entry) + return results + + # ------------------------------------------------------------------------ + # 规则级评估 + # ------------------------------------------------------------------------ + def _eval_rule(self, rule: Dict, ctx: YogaContext) -> List[Dict]: + """评估单条规则,返回匹配列表(空表示无匹配)""" + logic = rule.get("logic", {}) + return self._eval_condition(logic, ctx, rule, {}) + + def _eval_condition(self, cond: Dict, ctx: YogaContext, rule: Dict, + bindings: Dict) -> List[Dict]: + """评估条件节点,返回匹配列表""" + # v6.0.31: 兼容历史规则中的 "op" 字段。 + # 早期批量扩展脚本误用 op 而不是 type;如果只读 type,会导致这些规则静默失效。 + ctype = cond.get("type") or cond.get("op") + # v6.0.32: 兼容批量生成规则使用的 compound_conditions/compound 结构。 + if ctype == "compound_conditions": + cond = {**cond, "type": "and"} + return self._eval_and(cond, ctx, rule, bindings) + if ctype == "compound": + operator = str(cond.get("operator", "AND")).lower() + cond = {**cond, "type": "or" if operator == "or" else "and"} + return self._eval_condition(cond, ctx, rule, bindings) + + handler = getattr(self, f"_eval_{ctype}", None) + if handler: + return handler(cond, ctx, rule, bindings) + + # v6.0.32: 兼容 PyJHora/BVR 批量规则中的语义型 condition type, + # 避免未知类型静默导致整条 compound rule 永远失效。 + if ctype: + return self._eval_semantic_condition(ctype, cond, ctx, rule, bindings) + return [] + + # ------------------------------------------------------------------------ + # 复合条件 + # ------------------------------------------------------------------------ + def _eval_and(self, cond, ctx, rule, bindings): + """AND: 所有子条件必须同时满足""" + subs = cond.get("conditions", []) + if not subs: + return [{"combination": "", "strength": rule.get("strength", "中")}] + + results = self._eval_condition(subs[0], ctx, rule, bindings) + if not results: + return [] + + for sub in subs[1:]: + new_results = [] + for match in results: + b = {**bindings, **match.get("bindings", {})} + sub_matches = self._eval_condition(sub, ctx, rule, b) + for sm in sub_matches: + combo = match.get("combination", "") + sm_combo = sm.get("combination", "") + merged_combo = "; ".join(filter(None, [combo, sm_combo])) + new_results.append({ + "combination": merged_combo, + "strength": sm.get("strength", match.get("strength")), + "bindings": {**match.get("bindings", {}), **sm.get("bindings", {})} + }) + results = new_results + if not results: + return [] + return results + + def _eval_or(self, cond, ctx, rule, bindings): + """OR: 任一子条件满足即可""" + all_results = [] + for sub in cond.get("conditions", []): + matches = self._eval_condition(sub, ctx, rule, bindings) + all_results.extend(matches) + return all_results + + def _eval_not(self, cond, ctx, rule, bindings): + """NOT: 子条件不满足时返回一个空匹配""" + matches = self._eval_condition(cond.get("condition", {}), ctx, rule, bindings) + return [] if matches else [{"combination": "", "strength": rule.get("strength", "中")}] + + # ------------------------------------------------------------------------ + # 单条件类型 + # ------------------------------------------------------------------------ + def _eval_same_house(self, cond, ctx, rule, bindings): + """两颗行星同宫""" + # 支持两种写法: + # 1) {"a": ..., "b": ...} + # 2) {"planets": ["Sun", "Mercury", ...]}:任意两颗同宫即满足 + if "planets" in cond and "a" not in cond and "b" not in cond: + planets = cond.get("planets", []) + pa = self._resolve_binding({"role": "set", "planets": planets}, ctx, bindings) + pb = pa + else: + pa = self._resolve_binding(cond.get("a"), ctx, bindings) + pb = self._resolve_binding(cond.get("b"), ctx, bindings) + results = [] + for a in pa: + for b in pb: + if a == b: + continue + h1 = ctx.house_of(a) + h2 = ctx.house_of(b) + if h1 is not None and h1 == h2: + tmpl = cond.get("combo_template", "{a}与{b}同在第{h}宫") + combo = tmpl.format(a=PLANET_CN.get(a, a), b=PLANET_CN.get(b, b), h=h1, a_raw=a, b_raw=b) + results.append({"combination": combo, "strength": rule.get("strength", "中"), + "bindings": {"a": a, "b": b, "house": h1}}) + return results + + def _eval_in_houses(self, cond, ctx, rule, bindings): + """行星在指定宫位列表中""" + refs = self._resolve_binding(cond.get("planet", "$planet"), ctx, bindings) + houses = cond.get("houses", []) + exclude = cond.get("exclude", []) + results = [] + for p in refs: + if p in exclude: + continue + h = ctx.house_of(p) + if h is not None and h in houses: + tmpl = cond.get("combo_template", "{p}在第{h}宫") + combo = tmpl.format(p=PLANET_CN.get(p, p), h=h, p_raw=p) + results.append({"combination": combo, "strength": rule.get("strength", "中"), + "bindings": {"planet": p, "house": h}}) + return results + + def _eval_not_in_houses(self, cond, ctx, rule, bindings): + """行星不在指定宫位列表中""" + refs = self._resolve_binding(cond.get("planet"), ctx, bindings) + houses = cond.get("houses", []) + results = [] + for p in refs: + h = ctx.house_of(p) + if h is not None and h not in houses: + results.append({"combination": "", "strength": rule.get("strength", "中"), + "bindings": {"planet": p, "house": h}}) + return results + + def _eval_in_houses_from(self, cond, ctx, rule, bindings): + """行星在指定行星/基准的相对宫位关系中""" + refs = self._resolve_binding(cond.get("planet"), ctx, bindings) + from_ref = cond.get("from") + relations = cond.get("relations", []) + results = [] + + # 解析 relations(支持字符串别名和整数偏移) + valid_offsets = set() + for r in relations: + if r == "kendra": + valid_offsets.update([0, 3, 6, 9]) + elif r == "trikona": + valid_offsets.update([0, 4, 8]) + elif r == "2nd_12th": + valid_offsets.update([1, 11]) + elif r == "3rd_11th": + valid_offsets.update([2, 10]) + elif r == "same": + valid_offsets.add(0) + elif isinstance(r, int): + valid_offsets.add(r) + + for p in refs: + h1 = ctx.house_of(p) + if h1 is None: + continue + # from 可以是行星或固定宫位 + if isinstance(from_ref, int): + h_base = from_ref + else: + from_planets = self._resolve_binding(from_ref, ctx, bindings) + for fp in from_planets: + h_base = ctx.house_of(fp) + if h_base is None: + continue + off = ctx.house_offset(h_base, h1) + if off in valid_offsets: + tmpl = cond.get("combo_template", "{p}在第{h}宫(从{fp}的{rel})") + rel_name = self._offset_name(off) + combo = tmpl.format(p=PLANET_CN.get(p, p), h=h1, fp=PLANET_CN.get(fp, fp), + rel=rel_name, off=off, p_raw=p, fp_raw=fp) + results.append({"combination": combo, "strength": rule.get("strength", "中"), + "bindings": {"planet": p, "from": fp, "house": h1}}) + return results + + def _eval_dignity(self, cond, ctx, rule, bindings): + """行星尊严检查""" + refs = self._resolve_binding(cond.get("planet"), ctx, bindings) + dignity_type = cond.get("dignity") # exalted, own, moolatrikona, debilitated + results = [] + for p in refs: + ok = False + if dignity_type == "exalted": + ok = ctx.is_exalted(p) + elif dignity_type == "own": + ok = ctx.is_own_sign(p) + elif dignity_type == "moolatrikona": + ok = ctx.is_moolatrikona(p) + elif dignity_type == "debilitated": + ok = ctx.is_debilitated(p) + elif dignity_type == "strong": + ok = ctx.is_exalted(p) or ctx.is_own_sign(p) or ctx.is_moolatrikona(p) + elif dignity_type == "not_debilitated": + ok = not ctx.is_debilitated(p) + elif dignity_type == "not_enemy": + ok = True # placeholder, not used in current rules + + # v6.0.31: 兼容历史规则中的 status 字段。 + # 批量规则曾使用 {"op":"dignity", "status":"exalted"},而引擎原本只读取 dignity。 + if dignity_type is None: + status = cond.get("status") + if status == "exalted": + ok = ctx.is_exalted(p) + dignity_type = status + elif status == "own": + ok = ctx.is_own_sign(p) + dignity_type = status + elif status == "moolatrikona": + ok = ctx.is_moolatrikona(p) + dignity_type = status + elif status == "debilitated": + ok = ctx.is_debilitated(p) + dignity_type = status + elif status == "strong": + ok = ctx.is_exalted(p) or ctx.is_own_sign(p) or ctx.is_moolatrikona(p) + dignity_type = status + if ok: + sign = ctx.sign_of(p) + tmpl = cond.get("combo_template", "{p}{dignity}在{sign}") + combo = tmpl.format(p=PLANET_CN.get(p, p), dignity=dignity_type, sign=sign or "", p_raw=p) + results.append({"combination": combo, "strength": rule.get("strength", "中"), + "bindings": {"planet": p, "sign": sign}}) + return results + + def _eval_count(self, cond, ctx, rule, bindings): + """统计满足条件的行星数量""" + refs = self._resolve_binding(cond.get("items", cond.get("planets")), ctx, bindings) + sub_cond = cond.get("condition", {}) + min_count = cond.get("min", 1) + max_count = cond.get("max") + + matched = [] + for p in refs: + # 临时把 planet 绑定为 p,评估子条件 + sub_bindings = {**bindings, "planet": p} + matches = self._eval_condition(sub_cond, ctx, rule, sub_bindings) + if matches: + matched.append(p) + + count = len(matched) + ok = count >= min_count + if max_count is not None: + ok = ok and count <= max_count + + if ok: + tmpl = cond.get("combo_template", "{count}颗行星满足条件") + combo = tmpl.format(count=count, planets="、".join(PLANET_CN.get(p, p) for p in matched)) + return [{"combination": combo, "strength": rule.get("strength", "中"), + "bindings": {"count": count, "matched": matched}}] + return [] + + def _eval_houses_occupied(self, cond, ctx, rule, bindings): + """行星占据的宫位数量""" + refs = self._resolve_binding(cond.get("planets", "all"), ctx, bindings) + occupied = set() + for p in refs: + h = ctx.house_of(p) + if h is not None: + occupied.add(h) + count = len(occupied) + target = cond.get("count") + min_count = cond.get("min") + max_count = cond.get("max") + + ok = False + if target is not None: + ok = count == target + else: + ok = True + if min_count is not None: + ok = ok and count >= min_count + if max_count is not None: + ok = ok and count <= max_count + + if ok: + tmpl = cond.get("combo_template", "行星分布在{count}个宫位") + combo = tmpl.format(count=count) + return [{"combination": combo, "strength": rule.get("strength", "中")}] + return [] + + def _eval_adjacent_houses(self, cond, ctx, rule, bindings): + """目标宫位的前/后宫位有指定行星""" + target = cond.get("house") + sides = cond.get("sides", ["prev", "next"]) + refs = self._resolve_binding(cond.get("planets"), ctx, bindings) + require_both = cond.get("both", False) + + prev_h = ((target - 2) % 12) + 1 + next_h = (target % 12) + 1 + + prev_ok = any(ctx.house_of(p) == prev_h for p in refs) if "prev" in sides else True + next_ok = any(ctx.house_of(p) == next_h for p in refs) if "next" in sides else True + + if require_both: + ok = prev_ok and next_ok + else: + ok = prev_ok or next_ok + + if ok: + tmpl = cond.get("combo_template", "第{target}宫被夹击") + combo = tmpl.format(target=target, prev=prev_h, next=next_h) + return [{"combination": combo, "strength": rule.get("strength", "中")}] + return [] + + def _eval_all_in_houses(self, cond, ctx, rule, bindings): + """所有指定行星都在给定宫位集合中。""" + refs = self._resolve_binding(cond.get("planets", "visible"), ctx, bindings) + houses = set(cond.get("houses", [])) + if not refs or not houses: + return [] + occupied = [ctx.house_of(p) for p in refs] + ok = all(h in houses for h in occupied if h is not None) and len(occupied) == len(refs) + if ok: + tmpl = cond.get("combo_template", "所有指定行星均落入{houses}") + combo = tmpl.format(houses="/".join(str(h) for h in sorted(houses)), planets="、".join(PLANET_CN.get(p, p) for p in refs)) + return [{"combination": combo, "strength": rule.get("strength", "中"), + "bindings": {"planets": refs, "houses": sorted(houses)}}] + return [] + + def _eval_all_in_house_sets(self, cond, ctx, rule, bindings): + """所有指定行星都在多个候选宫位集合之一中。""" + refs = self._resolve_binding(cond.get("planets", "visible"), ctx, bindings) + house_sets = cond.get("house_sets", []) + if not refs or not house_sets: + return [] + for houses in house_sets: + houses_set = set(houses) + occupied = [ctx.house_of(p) for p in refs] + ok = all(h in houses_set for h in occupied if h is not None) and len(occupied) == len(refs) + if ok: + tmpl = cond.get("combo_template", "所有指定行星均落入候选宫位集合{houses}") + combo = tmpl.format(houses="/".join(str(h) for h in sorted(houses_set)), planets="、".join(PLANET_CN.get(p, p) for p in refs)) + return [{"combination": combo, "strength": rule.get("strength", "中"), + "bindings": {"planets": refs, "houses": sorted(houses_set)}}] + return [] + + def _eval_occupied_houses_exact(self, cond, ctx, rule, bindings): + """指定行星实际占据的宫位集合与目标集合完全一致。""" + refs = self._resolve_binding(cond.get("planets", "visible"), ctx, bindings) + houses = set(cond.get("houses", [])) + occupied = {ctx.house_of(p) for p in refs if ctx.house_of(p) is not None} + if refs and occupied == houses: + tmpl = cond.get("combo_template", "指定行星只占据{houses}") + combo = tmpl.format(houses="/".join(str(h) for h in sorted(houses)), planets="、".join(PLANET_CN.get(p, p) for p in refs)) + return [{"combination": combo, "strength": rule.get("strength", "中"), + "bindings": {"planets": refs, "houses": sorted(houses)}}] + return [] + + def _eval_occupied_houses_exact_sets(self, cond, ctx, rule, bindings): + """指定行星实际占据的宫位集合等于候选集合之一。""" + refs = self._resolve_binding(cond.get("planets", "visible"), ctx, bindings) + house_sets = cond.get("house_sets", []) + occupied = {ctx.house_of(p) for p in refs if ctx.house_of(p) is not None} + for houses in house_sets: + houses_set = set(houses) + if refs and occupied == houses_set: + tmpl = cond.get("combo_template", "指定行星只占据候选宫位集合{houses}") + combo = tmpl.format(houses="/".join(str(h) for h in sorted(houses_set)), planets="、".join(PLANET_CN.get(p, p) for p in refs)) + return [{"combination": combo, "strength": rule.get("strength", "中"), + "bindings": {"planets": refs, "houses": sorted(houses_set)}}] + return [] + + def _eval_has_planet_in_house(self, cond, ctx, rule, bindings): + """指定行星集合中至少一颗在某宫。""" + refs = self._resolve_binding(cond.get("planets", "all"), ctx, bindings) + house = cond.get("house") + matched = [p for p in refs if ctx.house_of(p) == house] + if matched: + tmpl = cond.get("combo_template", "第{house}宫有{planets}") + combo = tmpl.format(house=house, planets="、".join(PLANET_CN.get(p, p) for p in matched)) + return [{"combination": combo, "strength": rule.get("strength", "中"), + "bindings": {"matched": matched, "house": house}}] + return [] + + def _eval_has_planet_in_house_from(self, cond, ctx, rule, bindings): + """指定行星集合中至少一颗在某参考行星的相对宫位。houses 使用传统 1-12 口径。""" + refs = self._resolve_binding(cond.get("planets", "all"), ctx, bindings) + from_planet = cond.get("from") or cond.get("from_planet") + from_list = self._resolve_binding(from_planet, ctx, bindings) + houses = cond.get("houses", []) + exclude = set(cond.get("exclude", [])) + results = [] + for fp in from_list: + base = ctx.house_of(fp) + if base is None: + continue + for rel_house in houses: + target = ((base + rel_house - 2) % 12) + 1 + matched = [p for p in refs if p not in exclude and p != fp and ctx.house_of(p) == target] + if matched: + tmpl = cond.get("combo_template", "{planets}在{fp}的第{rel}宫") + combo = tmpl.format( + planets="、".join(PLANET_CN.get(p, p) for p in matched), + fp=PLANET_CN.get(fp, fp), + rel=rel_house, + target=target, + ) + results.append({"combination": combo, "strength": rule.get("strength", "中"), + "bindings": {"matched": matched, "from": fp, "rel_house": rel_house, "house": target}}) + return results + + def _eval_houses_with_planets_count(self, cond, ctx, rule, bindings): + """在指定宫位集合中,有多少个宫位至少包含一颗指定集合行星。""" + refs = self._resolve_binding(cond.get("planets", "all"), ctx, bindings) + houses = cond.get("houses", []) + min_count = cond.get("min", 1) + max_count = cond.get("max") + occupied = [] + for h in houses: + matched = [p for p in refs if ctx.house_of(p) == h] + if matched: + occupied.append((h, matched)) + count = len(occupied) + ok = count >= min_count + if max_count is not None: + ok = ok and count <= max_count + if ok: + tmpl = cond.get("combo_template", "{count}个目标宫位有指定行星") + detail = "; ".join(f"第{h}宫:" + "、".join(PLANET_CN.get(p, p) for p in ps) + for h, ps in occupied) + combo = tmpl.format(count=count, detail=detail, + houses="/".join(str(h) for h, _ in occupied)) + return [{"combination": combo, "strength": rule.get("strength", "中"), + "bindings": {"occupied": occupied, "count": count}}] + return [] + + def _eval_degree_gap(self, cond, ctx, rule, bindings): + """同星座内两颗行星度数差小于阈值""" + pa = self._resolve_binding(cond.get("a"), ctx, bindings) + pb = self._resolve_binding(cond.get("b"), ctx, bindings) + max_gap = cond.get("max_gap", 1.0) + results = [] + for a in pa: + for b in pb: + if a == b: + continue + s1 = ctx.sign_of(a) + s2 = ctx.sign_of(b) + if s1 is None or s1 != s2: + continue + d1 = ctx.degree_of(a) + d2 = ctx.degree_of(b) + if d1 is None or d2 is None: + continue + if abs(d1 - d2) < max_gap: + tmpl = cond.get("combo_template", "{a}与{b}在{sign}内相距{gap:.2f}°") + combo = tmpl.format(a=PLANET_CN.get(a, a), b=PLANET_CN.get(b, b), sign=s1, + gap=abs(d1 - d2)) + results.append({"combination": combo, "strength": rule.get("strength", "中")}) + return results + + def _eval_parivartana(self, cond, ctx, rule, bindings): + """两颗宫主星互换星座(Parivartana/互落)""" + la = ctx.resolve_single(cond.get("lord_a")) + lb = ctx.resolve_single(cond.get("lord_b")) + if la is None or lb is None or la == lb: + return [] + sa = ctx.sign_of(la) + sb = ctx.sign_of(lb) + if sa is None or sb is None: + return [] + lord_of_sa = SIGN_LORDS.get(sa) + lord_of_sb = SIGN_LORDS.get(sb) + if lord_of_sa == lb and lord_of_sb == la: + tmpl = cond.get("combo_template", "{la}与{lb}互换星座") + combo = tmpl.format(la=PLANET_CN.get(la, la), lb=PLANET_CN.get(lb, lb)) + return [{"combination": combo, "strength": rule.get("strength", "强")}] + return [] + + def _eval_any_pair(self, cond, ctx, rule, bindings): + """从集合 A 和集合 B 中各取一个元素,配对满足条件""" + if "planets" in cond and "from" not in cond and "to" not in cond: + set_a = self._resolve_binding({"role": "set", "planets": cond.get("planets", [])}, ctx, bindings) + set_b = set_a + exclude_self = True + else: + set_a = self._resolve_binding(cond.get("from"), ctx, bindings) + set_b = self._resolve_binding(cond.get("to"), ctx, bindings) + exclude_self = cond.get("exclude_self", False) + sub_cond = cond.get("condition", {}) + + results = [] + for a in set_a: + for b in set_b: + if exclude_self and a == b: + continue + pair_bindings = {**bindings, "a": a, "b": b} + matches = self._eval_condition(sub_cond, ctx, rule, pair_bindings) + for m in matches: + m["bindings"] = {**m.get("bindings", {}), "a": a, "b": b} + results.extend(matches) + return results + + def _eval_all_planets(self, cond, ctx, rule, bindings): + """所有指定行星都满足某个条件""" + refs = self._resolve_binding(cond.get("planets", "all"), ctx, bindings) + sub_cond = cond.get("condition", {}) + all_match = True + matched_combo_parts = [] + for p in refs: + b = {**bindings, "planet": p} + matches = self._eval_condition(sub_cond, ctx, rule, b) + if not matches: + all_match = False + break + matched_combo_parts.append(matches[0].get("combination", "")) + if all_match and refs: + combo = "; ".join(filter(None, matched_combo_parts)) + return [{"combination": combo, "strength": rule.get("strength", "中")}] + return [] + + def _eval_any_planet(self, cond, ctx, rule, bindings): + """任一指定行星满足条件""" + refs = self._resolve_binding(cond.get("planets"), ctx, bindings) + sub_cond = cond.get("condition", {}) + for p in refs: + b = {**bindings, "planet": p} + matches = self._eval_condition(sub_cond, ctx, rule, b) + if matches: + return matches + return [] + + def _eval_exists(self, cond, ctx, rule, bindings): + """存在至少一个行星满足条件""" + refs = self._resolve_binding(cond.get("planets"), ctx, bindings) + sub_cond = cond.get("condition", {}) + for p in refs: + b = {**bindings, "planet": p} + matches = self._eval_condition(sub_cond, ctx, rule, b) + if matches: + return matches + return [] + + def _eval_lord_in_house(self, cond, ctx, rule, bindings): + """某宫主星在指定宫位""" + house = cond.get("house") + target_houses = cond.get("target_houses", []) + lord = ctx.lord_of_house(house) + if lord is None or lord not in ctx.planets: + return [] + lh = ctx.house_of(lord) + if lh is not None and lh in target_houses: + tmpl = cond.get("combo_template", "{house}宫主{lord}在第{lh}宫") + combo = tmpl.format(house=house, lord=PLANET_CN.get(lord, lord), lh=lh) + return [{"combination": combo, "strength": rule.get("strength", "中"), + "bindings": {"lord": lord, "house": lh}}] + return [] + + def _eval_lords_relation(self, cond, ctx, rule, bindings): + """两个宫主星之间的特定关系(同宫/互落等)""" + lord_a = ctx.resolve_single(cond.get("lord_a")) + lord_b = ctx.resolve_single(cond.get("lord_b")) + if lord_a is None or lord_b is None: + return [] + relation = cond.get("relation", "same_house") + if relation == "same_house": + ha = ctx.house_of(lord_a) + hb = ctx.house_of(lord_b) + if ha is not None and ha == hb: + tmpl = cond.get("combo_template", "{la}与{lb}同在第{h}宫") + combo = tmpl.format(la=PLANET_CN.get(lord_a, lord_a), lb=PLANET_CN.get(lord_b, lord_b), h=ha) + return [{"combination": combo, "strength": rule.get("strength", "中")}] + return [] + + def _eval_custom(self, cond, ctx, rule, bindings): + """自定义 Python 表达式(用于复杂规则)""" + expr = cond.get("expr", "") + if not expr: + return [] + + def house_of(p): return ctx.house_of(p) + def sign_of(p): return ctx.sign_of(p) + def deg_of(p): return ctx.degree_of(p) + def lord(h): return ctx.lord_of_house(h) + def in_houses(p, hs): h = house_of(p); return h is not None and h in hs + def dignity(p): return ctx.dignity(p) + def exalted(p): return ctx.is_exalted(p) + def own(p): return ctx.is_own_sign(p) + def debil(p): return ctx.is_debilitated(p) + def moola(p): return ctx.is_moolatrikona(p) + def kendra(h): return ctx.is_kendra(h) + def trikona(h): return ctx.is_trikona(h) + def dusthana(h): return ctx.is_dusthana(h) + def upachaya(h): return ctx.is_upachaya(h) + def kendra_from(p, fp): return ctx.is_kendra_from(p, fp) + def trikona_from(p, fp): return ctx.is_trikona_from(p, fp) + def offset(fh, th): return ctx.house_offset(fh, th) + def planets_in(h): return ctx.planets_in_house(h) + def resolve(ref): return ctx.resolve(ref) + + # v6.0.32: 修复 custom 规则中常用的缺失辅助函数 + def same_house(a, b): + """两颗行星是否同宫""" + if a == b: + return False + ha = ctx.house_of(a) + hb = ctx.house_of(b) + return ha is not None and ha == hb + + def aspect(a, b): + """行星a是否aspect行星b(7th aspect + Mars/Jupiter/Saturn的特殊aspect)""" + if a == b: + return False + ha = ctx.house_of(a) + hb = ctx.house_of(b) + if ha is None or hb is None: + return False + off = ctx.house_offset(ha, hb) + # 7th aspect for all planets + if off == 6: + return True + # Mars: 4th, 8th aspects + if a == 'Mars' and off in (3, 7): + return True + # Jupiter: 5th, 9th aspects + if a == 'Jupiter' and off in (4, 8): + return True + # Saturn: 3rd, 10th aspects + if a == 'Saturn' and off in (2, 9): + return True + return False + + def exal(p): return ctx.is_exalted(p) + def lord_of_house(h): return ctx.lord_of_house(h) + def sign(p): return ctx.sign_of(p) + + def check_amala_from(base_house): + """Amala: 第10宫仅有吉星,支持从Lagna/Moon等基准宫位计算。""" + target = ((base_house - 1 + 9) % 12) + 1 + occupants = ctx.planets_in_house(target) + return bool(occupants) and all(p in BENEFICS for p in occupants) + + # 辅助:获取星盘所有行星名列表 + def _planets_list(): + return list(ctx.planets.keys()) + # 辅助:获取所有宫主星(1-12宫) + def _all_lords(): + return [ctx.lord_of_house(h) for h in range(1, 13)] + # 辅助:获取角宫主星列表 + def _kendra_lords_list(): + ai = SIGNS.index(ctx.ascendant) if ctx.ascendant in SIGNS else 0 + return list(set([SIGN_LORDS[SIGNS[(ai + h - 1) % 12]] for h in [1, 4, 7, 10]])) + # 辅助:获取三方宫主星列表 + def _trikona_lords_list(): + ai = SIGNS.index(ctx.ascendant) if ctx.ascendant in SIGNS else 0 + return list(set([SIGN_LORDS[SIGNS[(ai + h - 1) % 12]] for h in [1, 5, 9]])) + + safe_globals = { + # 安全内置函数:只开放规则表达式需要的纯函数,避免 custom 规则因 all/any/len/set 缺失而静默失效。 + "all": all, "any": any, "len": len, "set": set, "tuple": tuple, "sorted": sorted, + "abs": abs, "min": min, "max": max, "sum": sum, "range": range, + "list": list, "bool": bool, + "ctx": ctx, "bindings": bindings, "rule": rule, + "SIGNS": SIGNS, "SIGN_LORDS": SIGN_LORDS, + "EXALTATION": EXALTATION, "DEBILITATION": DEBILITATION, + "PLANET_CN": PLANET_CN, "BENEFICS": BENEFICS, "MALEFICS": MALEFICS, + "ALL_PLANETS": ALL_PLANETS, "MOOLATRIKONA_SIGN": MOOLATRIKONA_SIGN, + # 基础查询 + "house_of": house_of, "sign_of": sign_of, "deg_of": deg_of, + "get_sign_of": sign_of, # 别名 + "lord": lord, "lords_of": lord, # 别名(接受宫位数) + # 尊严检查 + "dignity": dignity, + "exalted": exalted, "is_exalted": exalted, + "own": own, "is_own_sign": own, + "debil": debil, "is_debilitated": debil, + "moola": moola, "is_moolatrikona": moola, + # 宫位类型 + "in_houses": in_houses, "planets_in": planets_in, + "kendra": kendra, "is_kendra": kendra, + "trikona": trikona, "is_trikona": trikona, + "dusthana": dusthana, "is_dusthana": dusthana, + "upachaya": upachaya, "is_upachaya": upachaya, + "kendra_from": kendra_from, "trikona_from": trikona_from, + "offset": offset, + # v6.0.32: 同宫与相位检查(custom规则常用) + "same_house": same_house, "aspect": aspect, + "exal": exal, "lord_of_house": lord_of_house, "sign": sign, + "check_amala_from": check_amala_from, + "Benefics": BENEFICS, "Malefics": MALEFICS, + "planets": ctx.planets, + # 解析 + "resolve": resolve, + # 列表辅助 + "planets_list": _planets_list, + "all_lords": _all_lords, + "kendra_lords_list": _kendra_lords_list, + "trikona_lords_list": _trikona_lords_list, + } + # v6.0.32: 支持多行语句(if/else/for等)+ 末尾表达式求值模式。 + # 不能简单 split 最后一行:多行 if/else 的最后一行经常只是 else 分支内部表达式, + # 直接 exec 前半段会产生缩进不完整。这里用 AST 捕获“实际执行分支”的末尾表达式。 + result = None + exec_globals = {"__builtins__": {}, **safe_globals} + + def _capture_tail_expr(block): + """把代码块末尾表达式改写为 __result__ = ;递归处理 if/for/while 分支。""" + if not block: + return block + last = block[-1] + if isinstance(last, ast.Expr): + block[-1] = ast.Assign(targets=[ast.Name(id="__result__", ctx=ast.Store())], value=last.value) + elif isinstance(last, ast.If): + last.body = _capture_tail_expr(last.body) + last.orelse = _capture_tail_expr(last.orelse) + elif isinstance(last, (ast.For, ast.While)): + last.body = _capture_tail_expr(last.body) + last.orelse = _capture_tail_expr(last.orelse) + elif isinstance(last, ast.Try): + last.body = _capture_tail_expr(last.body) + last.orelse = _capture_tail_expr(last.orelse) + last.finalbody = _capture_tail_expr(last.finalbody) + for handler in last.handlers: + handler.body = _capture_tail_expr(handler.body) + return block + + try: + # 同一命名空间同时作为 globals/locals,保证 list/dict comprehension 能访问 BENEFICS 等名称。 + result = eval(expr, exec_globals, exec_globals) + except SyntaxError: + try: + tree = ast.parse(expr.strip(), mode="exec") + tree.body = _capture_tail_expr(tree.body) + ast.fix_missing_locations(tree) + exec(compile(tree, "", "exec"), exec_globals, exec_globals) + result = exec_globals.get("__result__") + except Exception: + pass + except Exception: + pass + + if result: + combo = cond.get("combo_template", "自定义条件满足") + if callable(combo): + combo = combo(ctx, bindings) + strength = cond.get("strength", rule.get("strength", "中")) + if callable(strength): + strength = strength(ctx, bindings) + return [{"combination": combo, "strength": strength}] + return [] + + def _eval_semantic_condition(self, ctype, cond, ctx, rule, bindings): + """兼容批量抽取规则中的语义型条件。返回保守布尔匹配。""" + def success(combo=None): + return [{"combination": combo or cond.get("note", ctype), "strength": rule.get("strength", "中")}] + + def house(ref): + if isinstance(ref, int): + return ref + if isinstance(ref, str): + if ref in ctx.planets: + return ctx.house_of(ref) + low = ref.lower() + if low in ("lagna", "asc", "ascendant"): + return 1 + if low == "moon": + return ctx.house_of("Moon") + return None + + def planet_list(default=None): + ps = cond.get("planets", default or []) + if ps == "all": + return [p for p in ALL_PLANETS if p in ctx.planets] + if isinstance(ps, str): + return [ps] if ps in ctx.planets else [] + return [p for p in ps if p in ctx.planets] + + def aspects(a, b): + # b 可为行星名或宫位整数;支持检查行星对宫位/行星的传统相位。 + ha = ctx.house_of(a) + hb = ctx.house_of(b) if isinstance(b, str) else b + if ha is None or hb is None or a == b: + return False + off = ctx.house_offset(ha, hb) + return off == 6 or (a == "Mars" and off in (3, 7)) or (a == "Jupiter" and off in (4, 8)) or (a == "Saturn" and off in (2, 9)) + + def related(a, b): + return a in ctx.planets and b in ctx.planets and (ctx.house_of(a) == ctx.house_of(b) or aspects(a, b) or aspects(b, a)) + + def house_lord(h): + return ctx.lord_of_house(h) if isinstance(h, int) else None + + def is_benefic(p): + return p in BENEFICS + + def is_malefic(p): + return p in MALEFICS + + def is_strong(p): + return p in ctx.planets and (ctx.is_exalted(p) or ctx.is_own_sign(p) or ctx.is_moolatrikona(p) or ctx.is_kendra(ctx.house_of(p)) or ctx.is_trikona(ctx.house_of(p))) + + def rel_house(base, offset0): + return ((base - 1 + offset0) % 12) + 1 if base else None + + if ctype == "placeholder": + return [] + if ctype == "planet_in_lagna": + p = cond.get("planet") + return success() if p in ctx.planets and ctx.house_of(p) == 1 else [] + if ctype == "planet_in_house": + p = cond.get("planet") + h = cond.get("house") + return success() if p in ctx.planets and ctx.house_of(p) == h else [] + if ctype == "venus_in_house": + h = cond.get("house") + return success() if "Venus" in ctx.planets and ctx.house_of("Venus") == h else [] + if ctype == "benefic_in_house": + h = cond.get("house") + return success() if any(ctx.house_of(p) == h for p in BENEFICS if p in ctx.planets) else [] + if ctype == "planets_in_house": + h = cond.get("house") + ps = planet_list() + return success() if h and ps and all(ctx.house_of(p) == h for p in ps) else [] + if ctype == "planets_conjunct_in_same_house": + ps = planet_list() + return success() if len(ps) >= 2 and len({ctx.house_of(p) for p in ps}) == 1 else [] + if ctype == "planets_in_exactly_n_signs": + ps = planet_list(['Sun', 'Moon', 'Mars', 'Mercury', 'Jupiter', 'Venus', 'Saturn']) + n = cond.get("n") + return success() if n and len({ctx.sign_of(p) for p in ps if p in ctx.planets}) == n else [] + if ctype == "planets_in_kendras": + ps = planet_list() + return success() if ps and all(ctx.is_kendra(ctx.house_of(p)) for p in ps) else [] + if ctype == "planets_in_trines": + ps = planet_list() + return success() if ps and all(ctx.is_trikona(ctx.house_of(p)) for p in ps) else [] + if ctype == "malefics_in_kendras_and_trines": + ps = [p for p in MALEFICS if p in ctx.planets] + return success() if any(ctx.is_kendra(ctx.house_of(p)) for p in ps) and any(ctx.is_trikona(ctx.house_of(p)) for p in ps) else [] + if ctype == "malefics_in_lagna": + return success() if any(ctx.house_of(p) == 1 for p in MALEFICS if p in ctx.planets) else [] + if ctype == "malefics_in_trines": + return success() if any(ctx.is_trikona(ctx.house_of(p)) for p in MALEFICS if p in ctx.planets) else [] + if ctype == "planet_exalted_in_kendra": + p = cond.get("planet") + return success() if p in ctx.planets and ctx.is_exalted(p) and ctx.is_kendra(ctx.house_of(p)) else [] + if ctype == "lord_exalted": + p = house_lord(cond.get("lord_of") or cond.get("house")) + return success() if p and ctx.is_exalted(p) else [] + if ctype == "lord_in_kendra": + p = house_lord(cond.get("lord_of") or cond.get("house")) + return success() if p and ctx.is_kendra(ctx.house_of(p)) else [] + if ctype == "lord_in_exaltation_own_or_mool_trikona": + p = house_lord(cond.get("lord_of") or cond.get("house")) + return success() if p and (ctx.is_exalted(p) or ctx.is_own_sign(p) or ctx.is_moolatrikona(p)) else [] + if ctype == "mercury_strong_in_kendra_or_trikona": + return success() if "Mercury" in ctx.planets and is_strong("Mercury") and (ctx.is_kendra(ctx.house_of("Mercury")) or ctx.is_trikona(ctx.house_of("Mercury"))) else [] + if ctype == "moon_strong": + return success() if "Moon" in ctx.planets and is_strong("Moon") else [] + if ctype == "planet_in_own_or_exalted_sign": + p = cond.get("planet") + return success() if p in ctx.planets and (ctx.is_own_sign(p) or ctx.is_exalted(p)) else [] + if ctype == "planet_aspected_by_planet": + p = cond.get("planet") or cond.get("to") + by = cond.get("by") or cond.get("from") + return success() if p in ctx.planets and by in ctx.planets and aspects(by, p) else [] + if ctype == "planet_conjunct_planet": + a = cond.get("planet") or cond.get("a") + b = cond.get("with") or cond.get("b") + return success() if a in ctx.planets and b in ctx.planets and ctx.house_of(a) == ctx.house_of(b) else [] + if ctype == "lord_in_house": + lord = ctx.lord_of_house(cond.get("lord_of") or cond.get("house") or cond.get("lord_house")) + target = cond.get("in_house") or cond.get("target_house") + return success() if lord and ctx.house_of(lord) == target else [] + if ctype == "house_lord_in_kendra": + lord = ctx.lord_of_house(cond.get("house")) + return success() if lord and ctx.is_kendra(ctx.house_of(lord)) else [] + if ctype == "house_lord_in_trine": + lord = ctx.lord_of_house(cond.get("house")) + return success() if lord and ctx.is_trikona(ctx.house_of(lord)) else [] + if ctype in ("lagna_hemmed_by_malefics_not_aspected_by_benefics", "lagna_hemmed_by_benefics_not_aspected_by_malefics"): + group = MALEFICS if "malefics" in ctype else BENEFICS + blockers = BENEFICS if "malefics" in ctype else MALEFICS + has_2 = any(ctx.house_of(p) == 2 for p in group if p in ctx.planets) + has_12 = any(ctx.house_of(p) == 12 for p in group if p in ctx.planets) + aspected = any(aspects(p, 1) for p in blockers if p in ctx.planets) + return success() if has_2 and has_12 and not aspected else [] + if ctype == "planets_in_mutual_kendras_or_conjunction": + ps = planet_list() + if len(ps) >= 2: + a, b = ps[0], ps[1] + ha, hb = ctx.house_of(a), ctx.house_of(b) + return success() if ha and hb and (ha == hb or ctx.house_offset(ha, hb) in (0, 3, 6, 9)) else [] + if ctype == "lords_in_mutual_conjunction_or_aspect": + houses = cond.get("lords") or [] + ps = [house_lord(h) for h in houses] + return success() if len(ps) >= 2 and related(ps[0], ps[1]) else [] + if ctype == "aspected_by_benefics": + p = cond.get("planet") + if isinstance(p, str) and p.endswith("_lord"): + p = house_lord(int(p.split("_")[0])) if p.split("_")[0].isdigit() else None + return success() if p and any(aspects(b, p) for b in BENEFICS if b in ctx.planets) else [] + if ctype == "aspected_by_malefic": + p = cond.get("planet") + if p == "4th_lord": + p = house_lord(4) + return success() if p and any(aspects(m, p) for m in MALEFICS if m in ctx.planets) else [] + if ctype == "5th_lord_afflicted_by_saturn_or_rahu": + p = house_lord(5) + return success() if p and (related(p, "Saturn") or related(p, "Rahu")) else [] + if ctype == "malefic_in_lagna_or_gulika_in_trine_OR_gulika_with_kendra_trine_lord_OR_l1_with_rahu_sat_ket": + l1 = house_lord(1) + return success() if any(ctx.house_of(p) == 1 for p in MALEFICS if p in ctx.planets) or (l1 and any(related(l1, p) for p in ["Rahu", "Saturn", "Ketu"] if p in ctx.planets)) else [] + if ctype == "same_lord_for_1st_and_4th": + return success() if house_lord(1) == house_lord(4) else [] + if ctype == "1st_and_4th_lords_are_natural_or_temporal_friends": + # 保守近似:同宫/互相位视作 temporal association。 + l1, l4 = house_lord(1), house_lord(4) + return success() if l1 and l4 and related(l1, l4) else [] + if ctype == "1st_and_4th_lords_aspected_by_benefics": + l1, l4 = house_lord(1), house_lord(4) + ok1 = l1 and any(aspects(b, l1) for b in BENEFICS if b in ctx.planets) + ok4 = l4 and any(aspects(b, l4) for b in BENEFICS if b in ctx.planets) + return success() if ok1 and ok4 else [] + if ctype == "4th_lord_is_benefic_aspected_by_benefic": + l4 = house_lord(4) + return success() if l4 and is_benefic(l4) and any(aspects(b, l4) for b in BENEFICS if b in ctx.planets and b != l4) else [] + if ctype == "4th_house_or_lord_with_aspect_of_jupiter": + l4 = house_lord(4) + return success() if "Jupiter" in ctx.planets and (aspects("Jupiter", 4) or (l4 and related("Jupiter", l4))) else [] + if ctype == "4th_lord_with_benefics": + l4 = house_lord(4) + return success() if l4 and any(ctx.house_of(l4) == ctx.house_of(b) for b in BENEFICS if b in ctx.planets and b != l4) else [] + if ctype == "4th_lord_aspected_by_benefics": + l4 = house_lord(4) + return success() if l4 and any(aspects(b, l4) for b in BENEFICS if b in ctx.planets and b != l4) else [] + if ctype == "4th_lord_in_kendra_or_trikona": + l4 = house_lord(4) + return success() if l4 and (ctx.is_kendra(ctx.house_of(l4)) or ctx.is_trikona(ctx.house_of(l4))) else [] + if ctype == "lagna_lord_in_dry_sign": + l1 = house_lord(1) + dry_signs = {"Aries", "Gemini", "Leo", "Virgo", "Sagittarius", "Capricorn"} + return success() if l1 and ctx.sign_of(l1) in dry_signs else [] + if ctype == "navamsa_lagna_in_dry_planet_sign": + return [] # 需要D9上下文,当前D1 Yoga验证中不强行近似 + if ctype == "lagna_lord_and_navamsa_lord_both_in_watery_signs": + l1 = house_lord(1) + return success() if l1 and ctx.sign_of(l1) in {"Cancer", "Scorpio", "Pisces"} else [] + if ctype == "jupiter_in_lagna_or_aspects_lagna_from_watery": + return success() if "Jupiter" in ctx.planets and (ctx.house_of("Jupiter") == 1 or (ctx.sign_of("Jupiter") in {"Cancer", "Scorpio", "Pisces"} and aspects("Jupiter", 1))) else [] + if ctype == "lagna_watery_with_benefics_or_lagna_lord_watery": + l1 = house_lord(1) + asc_watery = ctx.ascendant in {"Cancer", "Scorpio", "Pisces"} + return success() if (asc_watery and any(ctx.house_of(b) == 1 for b in BENEFICS if b in ctx.planets)) or (l1 and ctx.sign_of(l1) in {"Cancer", "Scorpio", "Pisces"}) else [] + if ctype == "jupiter_in_lagna_mars_in_7th": + return success() if ctx.house_of("Jupiter") == 1 and ctx.house_of("Mars") == 7 else [] + if ctype == "saturn_in_lagna_mars_in_5_7_9": + return success() if ctx.house_of("Saturn") == 1 and ctx.house_of("Mars") in (5, 7, 9) else [] + if ctype == "saturn_in_12th_with_waning_moon": + return success() if ctx.house_of("Saturn") == 12 and ctx.house_of("Moon") == 12 else [] + if ctype == "moon_mercury_in_kendra_with_planet": + return success() if ctx.house_of("Moon") == ctx.house_of("Mercury") and ctx.is_kendra(ctx.house_of("Moon")) and len(ctx.planets_in_house(ctx.house_of("Moon"))) >= 3 else [] + if ctype == "planets_in_relative_houses": + base = house(cond.get("from", "lagna")) or 1 + offsets = cond.get("houses") or cond.get("offsets") or [] + ps = planet_list(ALL_PLANETS) + targets = {rel_house(base, int(o) % 12) for o in offsets} + return success() if any(ctx.house_of(p) in targets for p in ps) else [] + if ctype == "house_empty": + h = cond.get("house") + return success() if h and not ctx.planets_in_house(h) else [] + return [] + + # ------------------------------------------------------------------------ + # 辅助方法 + # ------------------------------------------------------------------------ + def _resolve_binding(self, ref, ctx, bindings): + """解析引用,支持变量绑定替换""" + if ref is None: + return [] + if isinstance(ref, str) and ref.startswith("$"): + # 绑定变量引用,如 "$a" + val = bindings.get(ref[1:]) + if val is None: + return [] + return [val] if isinstance(val, str) else (val if isinstance(val, list) else [val]) + return ctx.resolve(ref) + + @staticmethod + def _offset_name(off: int) -> str: + names = {0: "同宫", 1: "2宫", 2: "3宫", 3: "4宫(Kendra)", 4: "5宫(Trine)", + 5: "6宫", 6: "7宫(Kendra)", 7: "8宫", 8: "9宫(Trine)", + 9: "10宫(Kendra)", 10: "11宫", 11: "12宫"} + return names.get(off, f"{off+1}宫") + + +# ============================================================================ +# 便捷入口 +# ============================================================================ +def detect_yogas(planets: Dict[str, Dict], ascendant: str, + rules_path: Optional[str] = None) -> List[Dict]: + """便捷函数:检测 Yoga""" + if rules_path is None: + # 自动查找规则文件 + script_dir = os.path.dirname(os.path.abspath(__file__)) + skill_dir = os.path.dirname(script_dir) + rules_path = os.path.join(skill_dir, "references", "yoga_rules.json") + engine = YogaEngine(rules_path) + return engine.detect(planets, ascendant) + + +def detect_yogas_from_json(chart_json: Dict, rules_path: Optional[str] = None) -> List[Dict]: + """从 chart JSON 结构中提取 planets + ascendant 并检测""" + planets = chart_json.get("planets", {}) + asc = chart_json.get("ascendant", chart_json.get("ascendant_sign", "Aries")) + return detect_yogas(planets, asc, rules_path) + + +if __name__ == "__main__": + # 简单自测 + test_planets = { + "Sun": {"sign": "Aries", "house": 1, "degree": 10.5}, + "Moon": {"sign": "Cancer", "house": 4, "degree": 15.0}, + "Jupiter": {"sign": "Libra", "house": 7, "degree": 20.0}, + } + print("YogaEngine loaded. Run with a rules file to test.")