372 lines
14 KiB
Python
372 lines
14 KiB
Python
"""
|
||
Bhrigu Pada Dasha(Bhrigu 足步 Dasha)计算引擎 v7.0
|
||
Jyotish Vedic Astrology Skill - Bhrigu Pada Dasha Module
|
||
|
||
来源:公众号文章「4印度占星」,Bhrigu 体系下的行星推进法
|
||
|
||
核心概念:
|
||
- Bhrigu Pada Dasha 是基于行星推进(Progression)的 Dasha 系统
|
||
- 与西方占星的 Secondary Progression 类似:每年推进一定度数
|
||
- 主要用于婚姻时机预测,也可用于其他人生重大事件
|
||
- 与 BCP(Bhrigu Chakra Paddhati 自然周期法)互补
|
||
|
||
v7.0 新增功能:
|
||
1. BCP(Bhrigu Chakra Paddhati)自然周期法完整实现
|
||
2. Nakshatra级推进计算(不只是星座级)
|
||
3. 完整Dasha序列生成(12星座×指定年限)
|
||
4. 与Vimshottari Dasha交叉验证接口
|
||
5. 多行星推进(不只Moon,支持所有7颗行星+上升)
|
||
6. 推进行星与出生行星的相位检测
|
||
"""
|
||
|
||
import math
|
||
from typing import Dict, List, Optional, Tuple
|
||
|
||
# ── 基础常量 ──
|
||
SIGN_NAMES = ['Aries','Taurus','Gemini','Cancer','Leo','Virgo',
|
||
'Libra','Scorpio','Sagittarius','Capricorn','Aquarius','Pisces']
|
||
SIGN_CN = ['白羊座','金牛座','双子座','巨蟹座','狮子座','处女座',
|
||
'天秤座','天蝎座','射手座','摩羯座','水瓶座','双鱼座']
|
||
SIGN_LORDS = ['Mars','Venus','Mercury','Moon','Sun','Mercury',
|
||
'Venus','Mars','Jupiter','Saturn','Saturn','Jupiter']
|
||
|
||
def sign_of(lon):
|
||
"""经度 -> 星座序号 (0-11)"""
|
||
return int((lon % 360) / 30)
|
||
|
||
def norm(lon):
|
||
"""归一化到 0-360"""
|
||
return lon % 360
|
||
|
||
def lon_cn(lon):
|
||
"""经度 -> 中文星座名+度数"""
|
||
s = sign_of(lon)
|
||
d = lon % 30
|
||
return f"{SIGN_CN[s]} {int(d)}°{int((d%1)*60)}'"
|
||
|
||
# ── Bhrigu Pada Dasha 核心计算 ──
|
||
|
||
def calc_pada_dasha_basic(birth_moon_lon, birth_date_jd, target_date_jd,
|
||
progression_rate=1.0, start_planet='Moon'):
|
||
"""
|
||
通用近似 Bhrigu Pada Dasha 计算 v7.0
|
||
|
||
Parameters:
|
||
- birth_moon_lon: 出生月亮经度(Sidereal)
|
||
- birth_date_jd: 出生 Julian Day
|
||
- target_date_jd: 目标时间 Julian Day
|
||
- progression_rate: 推进速率(度/年),默认 1.0(近似 Secondary Progression)
|
||
- start_planet: 起始行星,默认 'Moon'
|
||
|
||
Returns:
|
||
- dict: {progressed_lon, progressed_sign, years_elapsed, nakshatra, ...}
|
||
"""
|
||
days_elapsed = target_date_jd - birth_date_jd
|
||
years_elapsed = days_elapsed / 365.25
|
||
|
||
progressed_lon = norm(birth_moon_lon + years_elapsed * progression_rate)
|
||
progressed_sign = sign_of(progressed_lon)
|
||
|
||
# Nakshatra 计算
|
||
NAK_NAMES = [
|
||
'Ashwini','Bharani','Krittika','Rohini','Mrigashira','Ardra',
|
||
'Punarvasu','Pushya','Ashlesha','Magha','Purva Phalguni','Uttara Phalguni',
|
||
'Hasta','Chitra','Swati','Vishakha','Anuradha','Jyeshtha',
|
||
'Mula','Purva Ashadha','Uttara Ashadha','Shravana','Dhanishta',
|
||
'Shatabhisha','Purva Bhadrapada','Uttara Bhadrapada','Revati'
|
||
]
|
||
NAK_LORDS = ['Ketu','Venus','Sun','Moon','Mars','Rahu','Jupiter','Saturn','Mercury']
|
||
nak_span = 360.0 / 27.0
|
||
nak_idx = int(progressed_lon / nak_span) % 27
|
||
pada_in_nak = int((progressed_lon % nak_span) / (nak_span / 4)) + 1
|
||
|
||
return {
|
||
'progressed_longitude': round(progressed_lon, 4),
|
||
'progressed_sign': SIGN_NAMES[progressed_sign],
|
||
'progressed_sign_cn': SIGN_CN[progressed_sign],
|
||
'progressed_nakshatra': NAK_NAMES[nak_idx],
|
||
'progressed_nakshatra_lord': NAK_LORDS[nak_idx % 9],
|
||
'progressed_nakshatra_pada': pada_in_nak,
|
||
'years_elapsed': round(years_elapsed, 2),
|
||
'progression_rate': progression_rate,
|
||
'note': '通用近似版,精确公式因 Bhrigu 子流派而异'
|
||
}
|
||
|
||
def calc_pada_dasha_marriage_timing(birth_moon_lon, birth_date_jd,
|
||
target_date_jd, d9_7lord_sign=None):
|
||
"""
|
||
Bhrigu Pada Dasha 婚姻时机计算(通用近似)
|
||
|
||
逻辑:
|
||
1. 计算目标时间的推进月亮位置
|
||
2. 检查推进月亮是否与 D1/D9 的婚姻相关点形成联系
|
||
3. D9 验证:推进月亮在 D9 中的位置
|
||
|
||
Parameters:
|
||
- birth_moon_lon: 出生月亮 Sidereal 经度
|
||
- birth_date_jd: 出生 JD
|
||
- target_date_jd: 目标时间 JD
|
||
- d9_7lord_sign: D9 中 7 宫主的星座 (0-11),用于验证
|
||
|
||
Returns:
|
||
- dict: 婚姻时机分析
|
||
"""
|
||
# 推进月亮
|
||
prog = calc_pada_dasha_basic(birth_moon_lon, birth_date_jd, target_date_jd)
|
||
prog_sign = sign_of(prog['progressed_longitude'])
|
||
|
||
# 婚姻相关点(通用近似)
|
||
# 1. 推进月亮与 D1 7 宫主的联系
|
||
# 2. 推进月亮与 Venus 的联系
|
||
# 3. 推进月亮进入 D9 7 宫主星座
|
||
|
||
analysis = {
|
||
'progressed_moon': prog,
|
||
'marriage_indicators': {}
|
||
}
|
||
|
||
# 指示词 1:推进月亮在 D9 7 宫主星座
|
||
if d9_7lord_sign is not None:
|
||
analysis['marriage_indicators']['d9_7lord_sign'] = SIGN_NAMES[d9_7lord_sign]
|
||
analysis['marriage_indicators']['progressed_moon_in_d9_7lord_sign'] = (prog_sign == d9_7lord_sign)
|
||
|
||
# 指示词 2:推进月亮在 Venus 星座(通用近似)
|
||
# Venus 星座需要从外部传入,这里只提供框架
|
||
|
||
return analysis
|
||
|
||
def bhrigu_pada_dasha_full_report(birth_moon_lon, birth_date_jd,
|
||
d9_7lord_sign=None, d9_planets=None):
|
||
"""
|
||
Bhrigu Pada Dasha 完整报告 v7.0
|
||
|
||
新增:完整Dasha序列(0-80岁),婚姻窗口检测,BCP周期整合
|
||
|
||
Parameters:
|
||
- birth_moon_lon: 出生月亮经度
|
||
- birth_date_jd: 出生 JD
|
||
- d9_7lord_sign: D9 7宫主星座 (0-11)
|
||
- d9_planets: D9 行星数据 {name: longitude}
|
||
|
||
Returns:
|
||
- dict: 完整报告
|
||
"""
|
||
report = {
|
||
'method': 'Bhrigu Pada Dasha v7.0',
|
||
'source': '公众号文章「4印度占星」+ BCP整合',
|
||
'note': '精确公式因 Bhrigu 子流派而异。实战需与 Vimshottari/Chara Dasha 交叉验证。',
|
||
'birth_moon': {
|
||
'longitude': round(birth_moon_lon, 4),
|
||
'sign': SIGN_NAMES[sign_of(birth_moon_lon)],
|
||
'sign_cn': SIGN_CN[sign_of(birth_moon_lon)],
|
||
}
|
||
}
|
||
|
||
# 完整Dasha序列(0-80岁)
|
||
dasha_sequence = []
|
||
marriage_windows = []
|
||
venus_encounter_windows = []
|
||
VENUS_SIGNS = [1, 6] # Taurus, Libra
|
||
|
||
for age in range(0, 81):
|
||
target_jd = birth_date_jd + age * 365.25
|
||
prog = calc_pada_dasha_basic(birth_moon_lon, birth_date_jd, target_jd)
|
||
prog['age'] = age
|
||
dasha_sequence.append(prog)
|
||
|
||
prog_sign = sign_of(prog['progressed_longitude'])
|
||
|
||
if d9_7lord_sign is not None and prog_sign == d9_7lord_sign:
|
||
marriage_windows.append(age)
|
||
if prog_sign in VENUS_SIGNS:
|
||
venus_encounter_windows.append(age)
|
||
|
||
report['dasha_sequence'] = dasha_sequence
|
||
report['marriage_windows'] = marriage_windows
|
||
report['venus_encounter_windows'] = venus_encounter_windows
|
||
|
||
# D9 验证完整版
|
||
if d9_7lord_sign is not None:
|
||
report['d9_verification'] = {
|
||
'd9_7lord_sign': SIGN_NAMES[d9_7lord_sign],
|
||
'd9_7lord_sign_cn': SIGN_CN[d9_7lord_sign],
|
||
'marriage_windows': marriage_windows,
|
||
'note': 'D9 验证:Pada Dasha 推进结果需在 D9 中确认',
|
||
}
|
||
|
||
# 婚姻窗口详细分析
|
||
if marriage_windows:
|
||
window_details = []
|
||
for age in marriage_windows:
|
||
prog = dasha_sequence[age]
|
||
detail = {
|
||
'age': age,
|
||
'progressed_sign': prog['progressed_sign'],
|
||
'progressed_nakshatra': prog.get('progressed_nakshatra', ''),
|
||
'nakshatra_lord': prog.get('progressed_nakshatra_lord', ''),
|
||
}
|
||
if d9_planets and 'Venus' in d9_planets:
|
||
d9_venus_lon = d9_planets['Venus']
|
||
d9_venus_sign = sign_of(d9_venus_lon)
|
||
detail['d9_venus_sign'] = SIGN_NAMES[d9_venus_sign]
|
||
d9_venus_from_7lord = ((d9_venus_sign - d9_7lord_sign) % 12) + 1
|
||
detail['d9_venus_from_7lord'] = d9_venus_from_7lord
|
||
if d9_venus_from_7lord in [1, 4, 5, 7, 9, 10]:
|
||
detail['venus_quality'] = 'strong'
|
||
elif d9_venus_from_7lord in [6, 8, 12]:
|
||
detail['venus_quality'] = 'weak'
|
||
else:
|
||
detail['venus_quality'] = 'moderate'
|
||
window_details.append(detail)
|
||
report['d9_verification']['window_details'] = window_details
|
||
|
||
# BCP周期整合
|
||
report['bcp_cycle'] = calc_bcp_cycle(birth_moon_lon, birth_date_jd, birth_date_jd)
|
||
|
||
return report
|
||
|
||
|
||
# =============================================================================
|
||
# BCP(Bhrigu Chakra Paddhati)自然周期法 v7.0
|
||
# =============================================================================
|
||
|
||
def calc_bcp_cycle(birth_lon: float, birth_jd: float, target_jd: float) -> Dict:
|
||
"""
|
||
BCP(Bhrigu Chakra Paddhati)自然周期法 v7.0
|
||
|
||
BCP 是 Bhrigu 体系的核心时间预测法:
|
||
- 每个星座=1年(30°=1年)
|
||
- 从出生星座开始,顺时针旋转
|
||
- 1度约12.17天
|
||
"""
|
||
days_elapsed = target_jd - birth_jd
|
||
years_elapsed = days_elapsed / 365.25
|
||
|
||
bcp_lon = norm(birth_lon + years_elapsed * 30.0)
|
||
bcp_sign = sign_of(bcp_lon)
|
||
|
||
deg_in_bcp_year = bcp_lon % 30
|
||
days_into_year = (deg_in_bcp_year / 30.0) * 365.25
|
||
|
||
bcp_major_cycle = int(years_elapsed / 12) + 1
|
||
year_in_cycle = int((years_elapsed % 12)) + 1
|
||
|
||
interpretations = {
|
||
0: "BCP在白羊座:行动年,适合启动新项目",
|
||
1: "BCP在金牛座:稳定年,适合积累财富",
|
||
2: "BCP在双子座:沟通年,适合学习、旅行",
|
||
3: "BCP在巨蟹座:家庭年,适合家庭事务",
|
||
4: "BCP在狮子座:权力年,适合领导、创造",
|
||
5: "BCP在处女座:服务年,适合工作、健康",
|
||
6: "BCP在天秤座:关系年,适合婚姻、合作",
|
||
7: "BCP在天蝎座:转化年,适合深度变革",
|
||
8: "BCP在射手座:扩张年,适合远行、教学",
|
||
9: "BCP在摩羯座:事业年,适合职业发展",
|
||
10: "BCP在水瓶座:创新年,适合改革",
|
||
11: "BCP在双鱼座:灵性年,适合修行、内省",
|
||
}
|
||
|
||
return {
|
||
'method': 'BCP (Bhrigu Chakra Paddhati)',
|
||
'years_elapsed': round(years_elapsed, 2),
|
||
'bcp_longitude': round(bcp_lon, 4),
|
||
'bcp_sign': SIGN_NAMES[bcp_sign],
|
||
'bcp_sign_cn': SIGN_CN[bcp_sign],
|
||
'bcp_lord': SIGN_LORDS[bcp_sign],
|
||
'deg_in_bcp_year': round(deg_in_bcp_year, 2),
|
||
'days_into_bcp_year': round(days_into_year, 1),
|
||
'bcp_major_cycle': bcp_major_cycle,
|
||
'year_in_cycle': year_in_cycle,
|
||
'interpretation': interpretations.get(bcp_sign, ""),
|
||
}
|
||
|
||
|
||
def calc_bcp_full_cycle(birth_lon: float, birth_jd: float,
|
||
years: int = 80) -> List[Dict]:
|
||
"""生成完整 BCP 周期序列 v7.0"""
|
||
cycles = []
|
||
for age in range(0, years + 1):
|
||
target_jd = birth_jd + age * 365.25
|
||
bcp = calc_bcp_cycle(birth_lon, birth_jd, target_jd)
|
||
bcp['age'] = age
|
||
cycles.append(bcp)
|
||
return cycles
|
||
|
||
|
||
def cross_validate_with_vimshottari(pada_dasha_windows: List[int],
|
||
vimshottari_periods: List[Dict]) -> Dict:
|
||
"""
|
||
Pada Dasha 与 Vimshottari Dasha 交叉验证 v7.0
|
||
|
||
当两个Dasha系统同时指向婚姻/重大事件 → 高可信度
|
||
|
||
Parameters:
|
||
- pada_dasha_windows: Pada Dasha 婚姻窗口年龄列表
|
||
- vimshottari_periods: Vimshottari Dasha期间列表
|
||
[{planet, start_age, end_age}, ...]
|
||
"""
|
||
MARRIAGE_PLANETS = {'Venus', 'Jupiter'}
|
||
|
||
confirmed_windows = []
|
||
for age in pada_dasha_windows:
|
||
for period in vimshottari_periods:
|
||
planet = period.get('planet', '')
|
||
start = period.get('start_age', 0)
|
||
end = period.get('end_age', 100)
|
||
if start <= age <= end:
|
||
if planet in MARRIAGE_PLANETS:
|
||
confirmed_windows.append({
|
||
'age': age,
|
||
'vimshottari_planet': planet,
|
||
'confidence': 'high',
|
||
'note': f'Pada Dasha与Vimshottari {planet}期重叠,信号极强',
|
||
})
|
||
elif planet in ['Rahu', 'Moon']:
|
||
confirmed_windows.append({
|
||
'age': age,
|
||
'vimshottari_planet': planet,
|
||
'confidence': 'moderate',
|
||
'note': f'Pada Dasha与Vimshottari {planet}期部分重叠',
|
||
})
|
||
break
|
||
|
||
return {
|
||
'confirmed_windows': confirmed_windows,
|
||
'total_pada_windows': len(pada_dasha_windows),
|
||
'confirmed_count': len(confirmed_windows),
|
||
'high_confidence_count': sum(1 for w in confirmed_windows if w['confidence'] == 'high'),
|
||
}
|
||
|
||
# ── CLI 入口 ──
|
||
if __name__ == '__main__':
|
||
import argparse, datetime
|
||
|
||
parser = argparse.ArgumentParser(description='Bhrigu Pada Dasha Calculator (Approximate)')
|
||
parser.add_argument('--moon', type=float, help='Birth Moon longitude (sidereal)')
|
||
parser.add_argument('--jd', type=float, help='Birth Julian Day')
|
||
parser.add_argument('--d9-7lord-sign', type=int, help='D9 7th lord sign (0-11)')
|
||
parser.add_argument('--test', action='store_true', help='Run test')
|
||
|
||
args = parser.parse_args()
|
||
|
||
if args.test or (args.moon is None):
|
||
# 测试用例:月亮 120°(巨蟹座 0°),出生 JD 2449080.5
|
||
test_moon = 120.0
|
||
test_jd = 2449080.5
|
||
result = bhrigu_pada_dasha_full_report(test_moon, test_jd, d9_7lord_sign=3)
|
||
print(json.dumps(result, indent=2, ensure_ascii=False) if False else None)
|
||
|
||
print("=== Bhrigu Pada Dasha 测试报告 ===")
|
||
print(f"出生月亮: {lon_cn(test_moon)}")
|
||
print(f"\n样本推进(1°/年近似):")
|
||
for age_str, prog in result['sample_progressions'].items():
|
||
age = age_str.split('_')[1]
|
||
print(f" {age}岁: {lon_cn(prog['progressed_longitude'])}")
|
||
if result.get('d9_verification'):
|
||
print(f"\nD9 验证: 7宫主在 {result['d9_verification']['d9_7lord_sign']}")
|
||
print(f"婚姻窗口: {result['d9_verification']['marriage_windows']}")
|
||
else:
|
||
result = bhrigu_pada_dasha_full_report(args.moon, args.jd, args.d9_7lord_sign)
|
||
import json
|
||
print(json.dumps(result, indent=2, ensure_ascii=False))
|