1281 lines
40 KiB
Python
1281 lines
40 KiB
Python
#!/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}")
|