Files
2026-06-29 03:25:03 +08:00

290 lines
12 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Remedies(补救措施)系统 v1.0
基于BPHSBrihat Parashara Hora Shastra)经典补救体系
五大类补救:
1. Ratna (宝石) — 行星弱点修饰
2. Mantra (咒语) — 声音振动疗愈
3. Dana (捐赠) — 因果净化
4. Vrata (斋戒) — 身体净化
5. Yantra (护符) — 几何能量图案
输入:行星力量分析结果(Shadbala/Dignity/Dasha
输出:针对性的补救建议
"""
from typing import Dict, List, Optional
PLANET_GEMS = {
'Sun': {'gem': '红宝石 (Ruby/Manikya)', 'metal': '金 (Gold)', 'finger': '无名指', 'day': '周日'},
'Moon': {'gem': '珍珠 (Pearl/Moti)', 'metal': '银 (Silver)', 'finger': '小指', 'day': '周一'},
'Mars': {'gem': '红珊瑚 (Red Coral/Moonga)', 'metal': '铜 (Copper)', 'finger': '无名指', 'day': '周二'},
'Mercury': {'gem': '祖母绿 (Emerald/Panna)', 'metal': '金 (Gold)', 'finger': '小指', 'day': '周三'},
'Jupiter': {'gem': '黄宝石 (Yellow Sapphire/Pukhraj)', 'metal': '金 (Gold)', 'finger': '食指', 'day': '周四'},
'Venus': {'gem': '钻石 (Diamond/Heera)', 'metal': '银/白金 (Silver/Platinum)', 'finger': '中指', 'day': '周五'},
'Saturn': {'gem': '蓝宝石 (Blue Sapphire/Neelam)', 'metal': '铁 (Iron)', 'finger': '中指', 'day': '周六'},
'Rahu': {'gem': '天河石 (Hessonite/Gomed)', 'metal': '混合金属 (Mixed)', 'finger': '中指', 'day': '周六'},
'Ketu': {'gem': '猫眼石 (Cat\'s Eye/Lahsuniya)', 'metal': '混合金属 (Mixed)', 'finger': '无名指', 'day': '周二'},
}
PLANET_MANTRAS = {
'Sun': 'Om Suryaya Namaha',
'Moon': 'Om Chandraya Namaha',
'Mars': 'Om Mangalaya Namaha',
'Mercury': 'Om Budhaya Namaha',
'Jupiter': 'Om Brihaspataye Namaha',
'Venus': 'Om Shukraya Namaha',
'Saturn': 'Om Shanaishcharaya Namaha',
'Rahu': 'Om Rahave Namaha',
'Ketu': 'Om Ketave Namaha',
}
PLANET_DONATIONS = {
'Sun': ['小麦(Wheat)', '红糖(Jaggery)', '红布', '铜器'],
'Moon': ['大米(Rice)', '牛奶', '银器', '白糖'],
'Mars': ['红扁豆(Masoor Dal)', '红布', '铜器', '珊瑚碎片'],
'Mercury': ['绿豆(Moong Dal)', '青色布', '文具', '书本'],
'Jupiter': ['鹰嘴豆(Chana Dal)', '黄布', '姜黄', '香蕉'],
'Venus': ['白米', '白布', '酥油(Ghee)', '银器'],
'Saturn': ['黑芝麻(Black Sesame)', '黑布', '铁器', '油灯'],
'Rahu': ['黑芥末(Black Mustard)', '蓝布', '铁器', '蓝宝石替代品'],
'Ketu': ['芝麻(Sesame)', '多色布', '灯笼', '猫眼石替代品'],
}
PLANET_FAST_DAYS = {
'Sun': '周日 (Sunday)', 'Moon': '周一 (Monday)',
'Mars': '周二 (Tuesday)', 'Mercury': '周三 (Wednesday)',
'Jupiter': '周四 (Thursday)', 'Venus': '周五 (Friday)',
'Saturn': '周六 (Saturday)', 'Rahu': '周六 (Saturday)',
'Ketu': '周二 (Tuesday)',
}
PLANET_COLORS = {
'Sun': '红/金/橙', 'Moon': '白/银/乳白', 'Mars': '红/珊瑚色',
'Mercury': '绿/浅绿', 'Jupiter': '黄/金色',
'Venus': '白/粉/彩虹', 'Saturn': '黑/深蓝/紫',
'Rahu': '深蓝/烟灰', 'Ketu': '斑点/多色',
}
STRENGTH_THRESHOLDS = {
'weak': 0.5, # Rupa < 0.5 → 极度需要补救
'moderate': 0.75, # 0.5-0.75 → 轻补救
}
def recommend_remedies(shadbala_results: Dict, planet_dignities: Dict = None,
active_dasha_lord: str = None, doshas: List[str] = None) -> Dict:
"""
基于行星力量分析推荐补救措施。
Args:
shadbala_results: Shadbala结果 {planet: {'total_rupas': float, 'strength_level': str, ...}}
planet_dignities: 行星尊严 {planet: dignity_level}
active_dasha_lord: 当前大运主星
doshas: 检测到的Dosha列表 ['Mangal Dosha', 'Kaal Sarp Dosha', ...]
Returns:
分类的补救建议
"""
doshas = doshas or []
recommendations = {
'gems': [],
'mantras': [],
'donations': [],
'fasting': [],
'lifestyle': [],
'dosha_remedies': [],
}
# 分析需要补救的行星
weak_planets = []
moderate_planets = []
evidence_chain = []
for planet, data in shadbala_results.items():
if isinstance(data, (int, float)) and not isinstance(data, bool):
rupas = float(data)
elif isinstance(data, dict):
rupas = data.get('total_rupas', data.get('rupas', 1.0))
else:
rupas = 1.0
if rupas < STRENGTH_THRESHOLDS['weak']:
weak_planets.append(planet)
evidence_chain.append({
'source': 'shadbala',
'planet': planet,
'severity': 'high',
'value': round(rupas, 3) if isinstance(rupas, (int, float)) else rupas,
'threshold': STRENGTH_THRESHOLDS['weak'],
'reason': f'{planet} Shadbala低于极弱阈值',
})
elif rupas < STRENGTH_THRESHOLDS['moderate']:
moderate_planets.append(planet)
evidence_chain.append({
'source': 'shadbala',
'planet': planet,
'severity': 'medium',
'value': round(rupas, 3) if isinstance(rupas, (int, float)) else rupas,
'threshold': STRENGTH_THRESHOLDS['moderate'],
'reason': f'{planet} Shadbala低于偏弱阈值',
})
# 1. 宝石建议(仅对极弱行星)
for planet in weak_planets:
if planet in PLANET_GEMS:
g = PLANET_GEMS[planet]
recommendations['gems'].append({
'planet': planet,
'gem': g['gem'],
'metal': g['metal'],
'finger': g['finger'],
'day': g['day'],
'severity': 'high',
'note': f'{planet}极度虚弱,建议佩戴{g["gem"]}镶嵌于{g["metal"]},戴在{g["finger"]}上。首次佩戴应在{g["day"]}日出后。'
})
for planet in moderate_planets:
if planet in PLANET_GEMS:
g = PLANET_GEMS[planet]
recommendations['gems'].append({
'planet': planet,
'gem': g['gem'],
'metal': g['metal'],
'severity': 'medium',
'note': f'{planet}偏弱,可考虑佩戴{g["gem"]}作为辅助。'
})
# 2. 咒语建议
for planet in weak_planets + moderate_planets:
if planet in PLANET_MANTRAS:
recs = 108 if planet in weak_planets else 27
recommendations['mantras'].append({
'planet': planet,
'mantra': PLANET_MANTRAS[planet],
'repetitions': recs,
'note': f'每日念诵 {PLANET_MANTRAS[planet]} × {recs}',
})
# 3. 大运主星特别建议
if active_dasha_lord and active_dasha_lord in PLANET_MANTRAS:
recommendations['mantras'].append({
'planet': active_dasha_lord,
'mantra': PLANET_MANTRAS[active_dasha_lord],
'repetitions': 108,
'note': f'当前大运为{active_dasha_lord}期间,建议强化念诵 {PLANET_MANTRAS[active_dasha_lord]}',
'priority': 'dasha_lord',
})
evidence_chain.append({
'source': 'dasha',
'planet': active_dasha_lord,
'severity': 'context',
'reason': f'当前大运主星为{active_dasha_lord},补救优先级上调',
})
# 4. 捐赠建议
for planet in weak_planets[:3]: # Top 3 weakest
if planet in PLANET_DONATIONS:
items = ', '.join(PLANET_DONATIONS[planet][:2])
recommendations['donations'].append({
'planet': planet,
'items': PLANET_DONATIONS[planet],
'note': f'捐赠{planet}相关物品:{items}等。在{PLANET_FAST_DAYS.get(planet, "适当日子")}捐赠效果最佳。',
})
# 5. 斋戒建议
for planet in weak_planets[:2]:
recommendations['fasting'].append({
'planet': planet,
'day': PLANET_FAST_DAYS.get(planet, ''),
'note': f'{PLANET_FAST_DAYS.get(planet)}进行{planet}斋戒,从日出到日落。',
})
# 6. Dosha专项补救
dosha_remedies_map = {
'Mangal Dosha': {
'actions': ['Kumbha Vivah (与无花果/香蕉树先"结婚"后再与人结婚)', 'Mangal Chandika Path', '周二火星斋戒'],
'gem': '红珊瑚 (Red Coral)',
},
'Kaal Sarp Dosha': {
'actions': ['Rahu-Ketu Shanti Puja', '那伽潘查米节祭拜蛇神', '参观12个Jyotirlinga'],
'gem': '天河石+猫眼石组合',
},
'Nadi Dosha': {
'actions': ['Nadi Shanti Puja', 'Mahamrityunjaya Mantra', '捐赠谷物'],
'gem': None,
},
'Pitra Dosha': {
'actions': ['Amavasya祖先祭拜', '捐赠黑芝麻和铁器', '供养婆罗门'],
'gem': None,
},
}
for dosha_name in doshas:
if dosha_name in dosha_remedies_map:
dr = dosha_remedies_map[dosha_name]
recommendations['dosha_remedies'].append({
'dosha': dosha_name,
'actions': dr['actions'],
'gem': dr.get('gem'),
'note': f'{dosha_name}检测到。建议进行: {"; ".join(dr["actions"][:2])}',
})
evidence_chain.append({
'source': 'dosha',
'dosha': dosha_name,
'severity': 'context',
'reason': f'{dosha_name}命中,生成专项补救建议',
})
# 7. 生活建议
colors = []
for planet in weak_planets[:3]:
if planet in PLANET_COLORS:
colors.append(PLANET_COLORS[planet])
if colors:
recommendations['lifestyle'].append({
'type': '色彩疗愈',
'note': f'多使用{", ".join(colors)}色系的衣物和装饰物',
})
if 'Saturn' in weak_planets:
recommendations['lifestyle'].append({
'type': '土星平和',
'note': '周六拜访Shani寺庙,提供芥末油灯。避免穿黑色。',
})
# 建议摘要
total_recs = sum(len(v) for v in recommendations.values())
summary = f'{total_recs}条补救建议 — 重点关注: {", ".join(weak_planets[:3]) if weak_planets else "无极度虚弱行星"}'
next_action = (
'先执行咒语、捐赠、生活调整等低风险补救;宝石、斋戒和仪式类建议需结合体质、预算与专业意见二次确认。'
if total_recs else
'当前未发现必须补救的弱项,保持观察并等待Dasha/Transit触发再复核。'
)
return {
'method': 'BPHS补救系统 v1.0',
'weak_planets': weak_planets,
'moderate_planets': moderate_planets,
'recommendations': recommendations,
'evidence_chain': evidence_chain,
'next_action': next_action,
'summary': summary,
}
def quick_remedy(planet: str, severity: str = 'weak') -> Dict:
"""快速获取单行星补救建议"""
result = {}
if planet in PLANET_GEMS:
g = PLANET_GEMS[planet]
result['gem'] = f'{g["gem"]}{g["metal"]}{g["finger"]} ({g["day"]})'
if planet in PLANET_MANTRAS:
result['mantra'] = f'{PLANET_MANTRAS[planet]} × {"108" if severity == "weak" else "27"}'
if planet in PLANET_FAST_DAYS:
result['fast'] = f'{PLANET_FAST_DAYS[planet]} 斋戒'
if planet in PLANET_DONATIONS:
result['donate'] = ', '.join(PLANET_DONATIONS[planet][:2])
return result