v6.0.17: bhrigu_pada_dasha 接入 + muntha/prashna placeholder 修正

- scripts/bhrigu_pada_dasha.py (新): Bhrigu Pada Dasha 通用近似版
- scripts/jyotish_engine.py Step 4.11: 新增 bhrigu_pada_dasha 调用,修正 muntha/prashna placeholder 文字
- references/technique_registry.json: 新增 bhrigu_pada_dasha (partial)
- CHANGELOG.md: 新增 v6.0.17 条目
- SKILL.md: 版本号 6.0.16 → 6.0.17
This commit is contained in:
732642856
2026-06-04 06:13:15 +08:00
parent a40310a7be
commit 8d0616c1b7
5 changed files with 305 additions and 12 deletions
+215
View File
@@ -0,0 +1,215 @@
"""
Bhrigu Pada DashaBhrigu 足步 Dasha)计算引擎 v1.0
Jyotish Vedic Astrology Skill - Bhrigu Pada Dasha Module
来源:公众号文章「4印度占星」,Bhrigu 体系下的行星推进法
重要:Pada Dasha 精确公式因 Bhrigu 子流派而异,本实现为通用近似版。
实战中应与 Vimshottari/Chara Dasha 交叉验证。
核心概念:
- Bhrigu Pada Dasha 是基于行星推进(Progression)的 Dasha 系统
- 与西方占星的 Secondary Progression 类似:每年推进一定度数
- 主要用于婚姻时机预测,也可用于其他人生重大事件
- 与 BCPBhrigu Chakra Paddhati 自然周期法)互补
计算要点(因流派而异,以下为通用近似):
1. 起始点:基于命盘中特定行星的 Pada(足迹/投射点)
2. 推进速率:每年推进一定度数(通用近似:1°/年,类似 Secondary Progression
3. 星座序列:按特定顺序(近似:从起始星座开始,按正常星座顺序)
4. D9 验证:Pada Dasha 的结果需在 D9 中验证
本实现提供:
- 通用近似推进计算(用于婚姻时机粗略定位)
- 与婚姻计数法(Marriage Counting Method)的整合接口
- D9 验证框架(需 D9 数据)
限制:
- 精确推进速率因 Bhrigu 子流派而异,本实现使用 1°/年近似
- 起始点确定规则因流派而异,本实现使用 Moon 作为默认起始点
- 实战中必须用 Vimshottari/Chara Dasha 交叉验证
"""
import math
# ── 基础常量 ──
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 计算
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, interpretation}
"""
# 计算经过年数
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)
return {
'progressed_longitude': round(progressed_lon, 4),
'progressed_sign': SIGN_NAMES[progressed_sign],
'progressed_sign_cn': SIGN_CN[progressed_sign],
'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 完整报告(通用近似版)
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 (通用近似版)',
'source': '公众号文章「4印度占星」',
'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)]
}
}
# 示例:计算几个关键年龄的推进月亮位置
sample_ages = [20, 24, 25, 26, 28, 30, 32]
progressions = {}
for age in sample_ages:
target_jd = birth_date_jd + age * 365.25
prog = calc_pada_dasha_basic(birth_moon_lon, birth_date_jd, target_jd)
progressions[f'age_{age}'] = prog
report['sample_progressions'] = progressions
# D9 验证框架
if d9_7lord_sign is not None:
report['d9_verification'] = {
'd9_7lord_sign': SIGN_NAMES[d9_7lord_sign],
'note': 'D9 验证:Pada Dasha 推进结果需在 D9 中确认'
}
# 检查样本年龄中哪些的推进月亮在 D9 7 宫主星座
marriage_windows = []
for age_str, prog_data in progressions.items():
if sign_of(prog_data['progressed_longitude']) == d9_7lord_sign:
age = int(age_str.split('_')[1])
marriage_windows.append(age)
report['d9_verification']['marriage_windows'] = marriage_windows
return report
# ── 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))
+30 -7
View File
@@ -3567,10 +3567,27 @@ def cmd_full_reading(args):
report['errors'].append(f"marriage-counting: {e}")
try:
# Muntha (Tajika Varshaphala) - needs Varshaphala chart data
# For now, only calculate if Varshaphala data is available
# Placeholder: will be filled when Varshaphala casting is implemented
report['modules']['muntha'] = {'note': 'Muntha calculation requires Varshaphala chart data (solar return). Placeholder for v6.0.17.'}
# Bhrigu Pada Dasha(通用近似版,精确公式因流派而异)
from bhrigu_pada_dasha import bhrigu_pada_dasha_full_report
moon_lon = planet_lons.get('Moon', 0)
birth_jd = report.get('metadata', {}).get('birth_jd', 0) or 0
if moon_lon and birth_jd:
bpd_result = bhrigu_pada_dasha_full_report(
moon_lon, birth_jd,
d9_7lord_sign=None # 将在 D9 数据可用时补充
)
report['modules']['bhrigu_pada_dasha'] = bpd_result
except Exception as e:
report['errors'].append(f"bhrigu-pada-dasha: {e}")
try:
# Muntha (Tajika Varshaphala) — 需要 Varshaphala 盘数据
# Varshaphala 盘需另外排盘(太阳返照时刻),full-reading 中暂不可用
# 如需 Varshaphala 分析,请使用 cmd_prashna(独立命令支持 Varshaphala 排盘)
report['modules']['muntha'] = {
'note': 'Muntha 需要 Varshaphala(太阳返照)盘数据。请使用 cmd_prashna 独立命令获取 Varshaphala 分析。',
'varshaphala_available': False
}
except Exception as e:
report['errors'].append(f"muntha: {e}")
@@ -3583,9 +3600,15 @@ def cmd_full_reading(args):
report['errors'].append(f"trimshamsa-d30: {e}")
try:
# Prashna integration (limited - only if prashna data is available)
# Prashna is mainly a standalone command; full integration in v6.0.17
report['modules']['prashna'] = {'note': 'Prashna is available via cmd_prashna standalone command. Full integration pending v6.0.17.'}
# Prashna(问事占星)—— full-reading 中暂不接入
# 原因:Prashna 需要问卜时刻(用户提问时间)排盘,full-reading 只有出生数据
# 如需 Prashna 分析:使用 cmd_prashna 独立命令
# 该命令接受问卜时间 + 地点,排 Prashna 盘并做分析
report['modules']['prashna'] = {
'note': 'Prashna 需要问卜时间排盘,请使用 cmd_prashna 独立命令。',
'cmd': 'cmd_prashna',
'available': True
}
except Exception as e:
report['errors'].append(f"prashna: {e}")