Files
Jyotisha/scripts/jaimini.py
T
732642856 0178dfb3e8 v3.7.0: 新增7大模块 - BPHS十六分盘/精确相位/Jaimini/高级Nakshatra/Argala门闩/Tajika年运/合盘分析
- varga.py: D2-D60 BPHS十六分盘完整计算
- aspects.py: 度数精确相位系统(tight/moderate/loose)
- jaimini.py: Chara Karaka 7/8 + Chara Dasha + Karakamsha
- nakshatra_advanced.py: Tara Bala + Sub-Lord KP系统
- argala.py: Argala门闩 + Virodha反干预
- tajika.py: Muntha/YearLord/Mudda Dasha/Tri-Pataka
- synastry.py: Ashta Koota 36分制 + Mangal Dosha + Papasamya

引擎升级至v3.7.0, 21个子命令全链路验证通过
2026-04-25 00:34:21 +08:00

268 lines
9.4 KiB
Python
Raw 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 -*-
"""
Jaimini占星体系模块 v1.0
Parashara传承中的Jaimini子系统
支持:
- Chara Karaka: 7/8个功能指示星(按度数排序)
- Chara Dasha: 基于星座的大运系统
- Karakamsha: DK在Navamsa中的上升(灵魂方向)
- Jaimini Sutras关键规则
"""
from typing import Dict, List, Tuple, Optional
import math
SIGNS = ['Aries','Taurus','Gemini','Cancer','Leo','Virgo',
'Libra','Scorpio','Sagittarius','Capricorn','Aquarius','Pisces']
SIGN_LORDS = {'Aries':'Mars','Taurus':'Venus','Gemini':'Mercury','Cancer':'Moon',
'Leo':'Sun','Virgo':'Mercury','Libra':'Venus','Scorpio':'Mars',
'Sagittarius':'Jupiter','Capricorn':'Saturn','Aquarius':'Saturn','Pisces':'Jupiter'}
# Chara Karaka 定义(7星制,排除Rahu
KARAKA_7 = {
1: 'Atmakaraka', # AK - 灵魂指示星(度数最高)
2: 'Amatyakaraka', # AmK - 事业/顾问
3: 'Bhratrikaraka', # BK - 兄弟/勇气
4: 'Matrikaraka', # MK - 母亲
5: 'Putrakaraka', # PK - 子女
6: 'Gnatikaraka', # GK - 敌人/障碍
7: 'Darakaraka', # DK - 配偶(度数最低)
}
# 8星制(含Rahu,用绝对度数)
KARAKA_8 = {
1: 'Atmakaraka', 2: 'Amatyakaraka', 3: 'Bhratrikaraka', 4: 'Matrikaraka',
5: 'Putrakaraka', 6: 'Gnatikaraka', 7: 'Darakaraka', 8: 'Pitrukaraka',
}
KARAKA_CN = {
'Atmakaraka': '灵魂星AK', 'Amatyakaraka': '事业星AmK',
'Bhratrikaraka': '兄弟星BK', 'Matrikaraka': '母亲星MK',
'Putrakaraka': '子女星PK', 'Gnatikaraka': '障碍星GK',
'Darakaraka': '配偶星DK', 'Pitrukaraka': '父亲星PiK',
}
KARAKA_DOMAINS = {
'Atmakaraka': '灵魂使命、核心自我、人生最高目标',
'Amatyakaraka': '事业方向、主要谋士、权力代理',
'Bhratrikaraka': '兄弟姐妹、勇气、冒险精神',
'Matrikaraka': '母亲、家庭根基、情感安全感',
'Putrakaraka': '子女、创造力、学生、智能成果',
'Gnatikaraka': '竞争对手、疾病、障碍、转化力量',
'Darakaraka': '配偶特质、伴侣关系、婚姻质量',
'Pitrukaraka': '父亲、祖先业力、传统传承',
}
def calc_chara_karaka_7(planet_degrees: Dict[str, float]) -> Dict:
"""
计算7星制Chara Karaka(度数最高→AK,最低→DK)
参数: planet_degrees = {'Sun': 12.5, 'Moon': 8.3, ...}
每个行星在星座内的度数(0-30)
返回: {karaka_name: {'planet': str, 'degree': float, 'domain': str}}
"""
# 排除Rahu和Ketu
exclude = {'Rahu', 'Ketu'}
planets = {k: v for k, v in planet_degrees.items() if k not in exclude}
# 按度数降序排列(度数最高的=AK
sorted_planets = sorted(planets.items(), key=lambda x: x[1], reverse=True)
results = {}
for rank, (pname, deg) in enumerate(sorted_planets, 1):
if rank > 7:
break
karaka = KARAKA_7[rank]
results[karaka] = {
'planet': pname,
'degree_in_sign': round(deg, 4),
'rank': rank,
'domain': KARAKA_DOMAINS.get(karaka, ''),
'cn_name': KARAKA_CN.get(karaka, karaka),
}
# 额外分析
ak = results.get('Atmakaraka', {})
dk = results.get('Darakaraka', {})
return {
'karaka_table': results,
'summary': {
'AK': f"{ak.get('planet','?')} ({ak.get('degree_in_sign',0):.1f}°)",
'DK': f"{dk.get('planet','?')} ({dk.get('degree_in_sign',0):.1f}°)",
'AK_domain': ak.get('domain', ''),
'DK_domain': dk.get('domain', ''),
}
}
def calc_chara_karaka_8(planet_degrees: Dict[str, float]) -> Dict:
"""
计算8星制Chara Karaka(含Rahu,使用30-度数来处理Rahu逆行)
"""
planets = {}
for pname, deg in planet_degrees.items():
if pname == 'Ketu':
continue
if pname == 'Rahu':
# Rahu用反向度数
planets[pname] = (30 - deg) % 30
else:
planets[pname] = deg
sorted_planets = sorted(planets.items(), key=lambda x: x[1], reverse=True)
results = {}
for rank, (pname, deg) in enumerate(sorted_planets, 1):
if rank > 8:
break
karaka = KARAKA_8[rank]
results[karaka] = {
'planet': pname,
'degree_in_sign': round(deg, 4),
'rank': rank,
'domain': KARAKA_DOMAINS.get(karaka, ''),
'cn_name': KARAKA_CN.get(karaka, karaka),
}
return {'karaka_table_8': results}
def calc_chara_dasha(asc_sign_idx: int,
planet_longitudes: Dict[str, float],
birth_year: int, birth_month: int) -> Dict:
"""
Chara Dasha计算(基于星座的大运系统)
规则:
- 从上升星座开始
- 奇数星座(Aries, Gemini...):正向顺序
- 偶数星座(Taurus, Cancer...):反向顺序
- 每个大运长度 = 12 - 该星座内的行星数量(用特定规则)
- 标准版:每个大运固定1-12年
"""
# 确定顺序方向
is_odd = asc_sign_idx % 2 == 0
direction = 1 if is_odd else -1
# 生成大运序列
dasha_sequence = []
current = asc_sign_idx
# 标准Chara Dasha: 每个星座1年,按正/反向排列
for i in range(12):
sign_idx = (current + direction * i) % 12
sign_name = SIGNS[sign_idx]
lord = SIGN_LORDS[sign_name]
# 大运长度计算(简化版:基于星座的默认年数)
# 标准法:大运长度 = 基于该星座中行星的Karakamsa计算
# 简化法:每个大运1年
duration = _chara_dasha_duration(sign_idx, planet_longitudes)
dasha_sequence.append({
'sign': sign_name,
'sign_idx': sign_idx,
'lord': lord,
'duration_years': duration,
'order': i + 1,
})
# 计算日期
total_years = sum(d['duration_years'] for d in dasha_sequence)
current_year = birth_year
current_month = birth_month
for d in dasha_sequence:
d['start_date'] = f"{current_year}-{current_month:02d}"
end_month = current_month + int(d['duration_years'] * 12)
end_year = current_year + end_month // 12
end_month = end_month % 12
if end_month == 0:
end_month = 12
end_year -= 1
d['end_date'] = f"{end_year}-{end_month:02d}"
current_year = end_year
current_month = end_month + 1
if current_month > 12:
current_month = 1
current_year += 1
return {
'ascendant': SIGNS[asc_sign_idx],
'direction': 'forward' if is_odd else 'backward',
'dasha_sequence': dasha_sequence,
'total_years': total_years,
}
def _chara_dasha_duration(sign_idx, planet_lons):
"""计算Chara Dasha单个大运的年数"""
# 标准方法:12 - 落入该星座的行星数量(最少1年,最多12年)
count = 0
for pname, lon in planet_lons.items():
if pname in ('Rahu', 'Ketu'):
continue
p_sign = int(lon / 30) % 12
if p_sign == sign_idx:
count += 1
return max(1, 12 - count)
def calc_karakamsha(dk_sign_in_d9: str, dk_degree_in_d9: float) -> Dict:
"""
Karakamsha分析:DK在D9中的位置作为"灵魂上升"
这是Jaimini体系中判断人生终极方向的关键技法
参数:
dk_sign_in_d9: DK在D9中的星座
dk_degree_in_d9: DK在D9中的度数
"""
sign_idx = SIGNS.index(dk_sign_in_d9) if dk_sign_in_d9 in SIGNS else 0
lord = SIGN_LORDS.get(dk_sign_in_d9, '')
# Karakamsha Lagna = DK在D9中的位置
# 从这个位置看12宫的布局,分析灵魂方向
interpretations = _karakamsha_interpretations(dk_sign_in_d9, lord)
return {
'karakamsha_sign': dk_sign_in_d9,
'karakamsha_degree': dk_degree_in_d9,
'karakamsha_lord': lord,
'soul_direction': interpretations,
}
def _karakamsha_interpretations(sign, lord):
"""Karakamsha的灵魂方向解读"""
directions = {
'Aries': '灵魂追求独立、开拓、成为先驱',
'Taurus': '灵魂追求稳定、物质安全感、感官和谐',
'Gemini': '灵魂追求知识、沟通、多元体验',
'Cancer': '灵魂追求情感连接、家庭、滋养他人',
'Leo': '灵魂追求创造力、领导力、自我表达',
'Virgo': '灵魂追求服务、完善、分析能力',
'Libra': '灵魂追求平衡、关系和谐、美学',
'Scorpio': '灵魂追求转化、深层真相、神秘学',
'Sagittarius': '灵魂追求真理、哲学、智慧传播',
'Capricorn': '灵魂追求成就、结构、社会贡献',
'Aquarius': '灵魂追求革新、人道主义、群体觉醒',
'Pisces': '灵魂追求灵性、超越、无条件的爱',
}
lord_meanings = {
'Sun': '通过权威、创造力和自我实现达成',
'Moon': '通过情感智慧、直觉和公众影响力达成',
'Mars': '通过行动力、勇气和技术能力达成',
'Mercury': '通过智慧、沟通和学习能力达成',
'Jupiter': '通过智慧、教导和灵性成长达成',
'Venus': '通过美学、关系和创造力达成',
'Saturn': '通过耐力、自律和长期承诺达成',
}
return {
'sign_direction': directions.get(sign, ''),
'lord_method': lord_meanings.get(lord, ''),
}