""" 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))