v6.2.0: 全面技法宝库升级 — 16个新模块 + 12个文件优化

## 新增模块 (16个)
### P0 精度修复
- ashtakavarga: calc_prastara_av() + calc_sodhita_av()
- kakshya.py: Kakshya评分系统 (8区间×3.75°)
- shadbala.py: Sputa Drishti + Yuddha Bala

### P1 核心升级
- bhava_bala.py: 宫位三元力量 (jyotishganit MIT)
- pancha_mahapurusha.py: PMC完整检测含4层失效条件
- sade_sati.py: Sade Sati+Kantaka Shani
- sudarshana_chakra.py: 三参考点盘+收敛分析
- tajika.py: Sahams 7→36 + Tajika Yogas 10种
- birth_time_rectifier.py: 生时矫正

### P2 覆盖扩展
- kp_system.py: KP Sublord+ABCD Significator (diliprk/VedicAstro MIT)
- synastry.py: 16因子合盘36分制 (dashaflow MIT)
- muhurtha_election.py: 6活动选举 (dashaflow MIT)
- career_analysis.py: 结构化事业引擎
- relationship_analysis.py: 结构化感情引擎
- conditional_dashas.py: Dwisaptati+Shattrimsa+Dwadashottari
- divisional_charts_extended: D81/D108/D144
- remedies.py: 5类补救系统

## 修改文件
jaimini/dasha_calculator/shadbala/SKILL.md/COVERAGE_AUDIT等12个

## 开源复用: 4个MIT项目
This commit is contained in:
732642856
2026-06-11 19:02:56 +08:00
parent c4c0eff67a
commit a4f8620a71
210 changed files with 49022 additions and 828 deletions
+120 -4
View File
@@ -24,6 +24,19 @@ 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'}
# 行星友好/敌对关系(用于Jaimini共主比较)
FRIENDSHIP = {
'Sun': {'friend': ['Moon', 'Mars', 'Jupiter'], 'enemy': ['Saturn', 'Venus'], 'neutral': ['Mercury']},
'Moon': {'friend': ['Sun', 'Mercury'], 'enemy': [], 'neutral': ['Mars', 'Jupiter', 'Venus', 'Saturn']},
'Mars': {'friend': ['Sun', 'Moon', 'Jupiter'], 'enemy': ['Mercury'], 'neutral': ['Venus', 'Saturn']},
'Mercury': {'friend': ['Sun', 'Venus'], 'enemy': ['Moon'], 'neutral': ['Mars', 'Jupiter', 'Saturn']},
'Jupiter': {'friend': ['Sun', 'Moon', 'Mars'], 'enemy': ['Mercury', 'Venus'], 'neutral': ['Saturn']},
'Venus': {'friend': ['Mercury', 'Saturn'], 'enemy': ['Sun', 'Moon'], 'neutral': ['Mars', 'Jupiter']},
'Saturn': {'friend': ['Mercury', 'Venus'], 'enemy': ['Sun', 'Moon', 'Mars'], 'neutral': ['Jupiter']},
'Rahu': {'friend': ['Jupiter', 'Venus', 'Saturn'], 'enemy': ['Sun', 'Moon', 'Mars'], 'neutral': ['Mercury']},
'Ketu': {'friend': ['Mars', 'Venus', 'Saturn'], 'enemy': ['Sun', 'Moon'], 'neutral': ['Mercury', 'Jupiter']},
}
# Chara Karaka 定义(7星制,排除Rahu
KARAKA_7 = {
1: 'Atmakaraka', # AK - 灵魂指示星(度数最高)
@@ -260,14 +273,117 @@ _PLANET_DIGNITY_KNRAO = {
# Chara Dasha 宫主动态判定
# Aquarius (sign 10): 传统主Saturn vs 共主Rahu — PyJHora用stronger_planet动态判定
# Scorpio (sign 7): 传统主Mars vs 共主Ketu — PyJHora用stronger_planet动态判定
# 当前简化: 使用传统宫主 (Saturn/Mars)。已知限制: ~4.6%案例中PyJHora选Rahu/Ketu
# 完整对齐需要复制PyJHora的_stronger_planet_new尊严比较链,作为未来优化。
_CHARA_DASHA_CO_LORD_SIGNS = {10, 7} # Aquarius, Scorpio 有共主争议
def _jaimini_planet_dignity_level(planet: str, sign_idx: int) -> int:
"""
计算行星在指定星座的尊严层级(用于Jaimini共主比较)。
基于PyJHora _stronger_planet_new 尊严比较链。
层级值: 6=exalted, 5=own_sign, 4=friendly, 3=neutral, 2=enemy, 1=debilitated
"""
dignities = _PLANET_DIGNITY_KNRAO.get(planet, {})
if not dignities:
return 2 # default: enemy level for unknown planets
# Check exalted (highest dignity)
if sign_idx in dignities.get('exalted', set()):
return 6
# Check debilitated (lowest)
if sign_idx in dignities.get('debilitated', set()):
return 1
# Check own sign (lord association)
sign_name = SIGNS[sign_idx]
traditional_lord = SIGN_LORDS.get(sign_name, '')
if planet == traditional_lord:
# For Mercury: own sign is Gemini or Virgo (not exalted)
return 5
# Check friendship
friendship = FRIENDSHIP.get(planet, {})
if planet in friendship.get('friend', []):
friend_planets = friendship['friend']
if traditional_lord in friend_planets:
return 4
if planet in friendship.get('enemy', []):
enemy_planets = friendship['enemy']
if traditional_lord in enemy_planets:
return 2
# Neutral
return 3
def _jaimini_stronger_planet(longitudes: Dict[str, float], planet_a: str,
planet_b: str, sign_idx: int) -> str:
"""
动态比较两颗行星在指定星座的力量,返回较强者。
基于PyJHora _stronger_planet_new 算法翻译。
比较层次:
1. 尊严层级: exalted(6) > own(5) > friendly(4) > neutral(3) > enemy(2) > debilitated(1)
2. 同层级:比较行星经度位置(度数更靠近星座中心更强)
3. 仍相同:比较Naisargika Bala(天然力量)
"""
level_a = _jaimini_planet_dignity_level(planet_a, sign_idx)
level_b = _jaimini_planet_dignity_level(planet_b, sign_idx)
if level_a > level_b:
return planet_a
if level_b > level_a:
return planet_b
# 同层级:比较行星在星座中的位置(更靠近星座中心度数=15°更强)
deg_a = longitudes.get(planet_a, 0) % 30
deg_b = longitudes.get(planet_b, 0) % 30
center_diff_a = abs(deg_a - 15)
center_diff_b = abs(deg_b - 15)
if center_diff_a < center_diff_b:
return planet_a
if center_diff_b < center_diff_a:
return planet_b
# 完全平局:使用Naisargika Bala决断
naisargika_order = ['Sun', 'Moon', 'Venus', 'Jupiter', 'Mercury', 'Mars', 'Saturn']
idx_a = naisargika_order.index(planet_a) if planet_a in naisargika_order else 99
idx_b = naisargika_order.index(planet_b) if planet_b in naisargika_order else 99
return planet_a if idx_a <= idx_b else planet_b
def _resolve_chara_dasha_lord(longitudes, sign_idx):
"""解析Chara Dasha宫主。当前使用传统宫主,共主比较为未来优化。"""
return SIGN_LORDS[SIGNS[sign_idx]]
"""
解析Chara Dasha宫主。v6.1.13: 实现动态共主判定。
Aquarius (sign 10): 比较 Saturn vs Rahu
Scorpio (sign 7): 比较 Mars vs Ketu
其他星座: 使用传统宫主
"""
sign_name = SIGNS[sign_idx]
traditional_lord = SIGN_LORDS.get(sign_name, '')
# Aquarius: Saturn vs Rahu 共主判定
if sign_idx == 10: # Aquarius
saturn_present = 'Saturn' in longitudes and longitudes['Saturn'] >= 0
rahu_present = 'Rahu' in longitudes and longitudes['Rahu'] >= 0
if saturn_present and rahu_present:
return _jaimini_stronger_planet(longitudes, 'Saturn', 'Rahu', sign_idx)
return 'Saturn' if saturn_present else 'Rahu'
# Scorpio: Mars vs Ketu 共主判定
if sign_idx == 7: # Scorpio
mars_present = 'Mars' in longitudes and longitudes['Mars'] >= 0
ketu_present = 'Ketu' in longitudes and longitudes['Ketu'] >= 0
if mars_present and ketu_present:
return _jaimini_stronger_planet(longitudes, 'Mars', 'Ketu', sign_idx)
return 'Mars' if mars_present else 'Ketu'
return traditional_lord
def _sign_is_even_footed(sign_idx: int) -> bool: