Files
Jyotisha/skills/jyotish-engine-modules/scripts/avastha_calculator.py
T
732642856 3314f244f2 feat: 新增两个 Hermes Skills
- jyotish-engine-modules: 5个核心排盘引擎模块完整代码
  - karaka_calculator.py (Karaka分配计算器,支持BPHS/JH兼容模式)
  - special_lagnas.py (特殊上升点计算)
  - vimsopaka_calculator.py (Vimsopaka Bala分盘力量)
  - avastha_calculator.py (Avasthas行星状态)
  - divisional_charts_extended.py (D2-D60完整分盘)

- jyotish-full-reading-integration: v4.4.0集成方案
  - 21步调用链完整流程
  - 5个新模块插入点详解
  - JH兼容模式使用指南
  - 集成检查清单
  - 自动化测试脚本
  - v4.4.0 CHANGELOG

版本:v4.4.0
调用链:16步 → 21步
新增:special_lagnas/vimsopaka/varga_extended/karaka_jh/avasthas
2026-05-03 20:50:05 +08:00

482 lines
20 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 -*-
"""
Avastha Calculator - 行星状态计算器
印度占星 Avastha(行星状态)系统
核心功能:
- Bala Avastha(年龄状态):5种生命阶段
- Jagrat Avastha(警觉状态):3种意识状态
- Deeptadi Avastha(情绪状态):15种情绪/能量状态
- Lajjitadi Avastha(羞耻状态):6种社会状态
- Shayanadi Avastha(姿态状态):12种行为模式
参考文献:
- Brihat Parashara Hora Shastra (BPHS) Chapter 47-48
- Phaladeepika by Mantreswara
- Jataka Parijata by Vaidyanatha Dikshita
"""
from typing import Dict, List, Tuple
from enum import Enum
class BalaAvastha(Enum):
"""年龄状态(5种生命阶段)"""
INFANT = "Infant" # 婴儿期(0-6度)
YOUNG = "Young" # 少年期(6-12度)
YOUTH = "Youth" # 青年期(12-18度)
OLD = "Old" # 老年期(18-24度)
DEAD = "Dead" # 死亡期(24-30度)
class JagratAvastha(Enum):
"""警觉状态(3种意识状态)"""
AWAKE = "Awake" # 清醒(Jagrat
DREAMING = "Dreaming" # 梦境(Swapna
DEEP_SLEEP = "Deep Sleep" # 深睡(Sushupti
class DeeptadiAvastha(Enum):
"""情绪状态(15种)- Deeptadi Avastha"""
DEEPTA = "Deepta" # 光辉(Exalted
SWASTHA = "Swastha" # 舒适(Own Sign
MUDITA = "Mudita" # 快乐(Friend's Sign
SHANTA = "Shanta" # 平静(Neutral Sign
DINA = "Dina" # 沮丧(Enemy Sign
VIKALA = "Vikala" # 残缺(Debilitated
KHALA = "Khala" # 恶意(Combust
KOPA = "Kopa" # 愤怒(Defeated in War
GARVITA = "Garvita" # 骄傲(Victorious in War
KSHUDITA = "Kshudita" # 饥饿(In Sandhi
TRUSHITA = "Trushita" # 口渴(In Gandanta
MUDITA_SPECIAL = "Mudita" # 特殊快乐(Aspected by Jupiter
KSHOBHITA = "Kshobhita" # 激动(Aspected by Mars
LAJJITA = "Lajjita" # 羞耻(Aspected by Saturn
GARVITA_SPECIAL = "Garvita" # 特殊骄傲(Aspected by Mercury
class LajjitadiAvastha(Enum):
"""羞耻状态(6种社会状态)"""
LAJJITA = "Lajjita" # 羞耻(与敌对行星同宫)
GARVITA = "Garvita" # 骄傲(入庙)
KSHUDITA = "Kshudita" # 饥饿(在6/8/12宫)
TRUSHITA = "Trushita" # 口渴(在火象星座)
MUDITA = "Mudita" # 快乐(与友好行星同宫)
KSHOBHITA = "Kshobhita" # 激动(与火星同宫)
class ShayanadiAvastha(Enum):
"""姿态状态(12种行为模式)"""
SHAYANA = "Shayana" # 躺卧(在水象星座)
UPAVESHANA = "Upaveshana" # 坐着(在土象星座)
NETRAPANI = "Netrapani" # 手持武器(在火象星座)
PRAKASHANA = "Prakashana" # 显现(在风象星座)
GAMANA = "Gamana" # 行走(在双体星座)
AGAMANA = "Agamana" # 到来(在固定星座)
SABHA = "Sabha" # 集会(在变动星座)
AGAMA = "Agama" # 学习(在水星星座)
BHOJANA = "Bhojana" # 进食(在金星星座)
NRITYALIPSA = "Nrityalipsa" # 舞蹈(在月亮星座)
KAUTUKA = "Kautuka" # 好奇(在木星星座)
NIDRA = "Nidra" # 睡眠(在土星星座)
class AvasthaCalculator:
"""行星状态计算器"""
# 星座分类
FIRE_SIGNS = ["Aries", "Leo", "Sagittarius"]
EARTH_SIGNS = ["Taurus", "Virgo", "Capricorn"]
AIR_SIGNS = ["Gemini", "Libra", "Aquarius"]
WATER_SIGNS = ["Cancer", "Scorpio", "Pisces"]
DUAL_SIGNS = ["Gemini", "Virgo", "Sagittarius", "Pisces"]
FIXED_SIGNS = ["Taurus", "Leo", "Scorpio", "Aquarius"]
MOVABLE_SIGNS = ["Aries", "Cancer", "Libra", "Capricorn"]
# 行星主宰星座
PLANET_SIGNS = {
"Mercury": ["Gemini", "Virgo"],
"Venus": ["Taurus", "Libra"],
"Moon": ["Cancer"],
"Jupiter": ["Sagittarius", "Pisces"],
"Saturn": ["Capricorn", "Aquarius"],
"Mars": ["Aries", "Scorpio"],
"Sun": ["Leo"]
}
# 行星入庙/落陷度数
EXALTATION = {
"Sun": ("Aries", 10),
"Moon": ("Taurus", 3),
"Mars": ("Capricorn", 28),
"Mercury": ("Virgo", 15),
"Jupiter": ("Cancer", 5),
"Venus": ("Pisces", 27),
"Saturn": ("Libra", 20)
}
DEBILITATION = {
"Sun": ("Libra", 10),
"Moon": ("Scorpio", 3),
"Mars": ("Cancer", 28),
"Mercury": ("Pisces", 15),
"Jupiter": ("Capricorn", 5),
"Venus": ("Virgo", 27),
"Saturn": ("Aries", 20)
}
def __init__(self):
pass
def calculate_all_avasthas(self, planet: str, sign: str, degree: float,
house: int, conjunctions: List[str] = None,
aspects: List[str] = None, is_combust: bool = False,
is_retrograde: bool = False) -> Dict[str, any]:
"""
计算行星的所有Avastha状态
Args:
planet: 行星名
sign: 所在星座
degree: 星座内度数(0-30
house: 所在宫位(1-12
conjunctions: 合相的行星列表
aspects: 相位的行星列表
is_combust: 是否燃烧
is_retrograde: 是否逆行
Returns:
所有Avastha状态的字典
"""
result = {
"planet": planet,
"sign": sign,
"degree": round(degree, 4),
"house": house,
"avasthas": {}
}
# 1. Bala Avastha(年龄状态)
result["avasthas"]["Bala"] = self._calculate_bala_avastha(degree)
# 2. Jagrat Avastha(警觉状态)
result["avasthas"]["Jagrat"] = self._calculate_jagrat_avastha(planet, sign, house)
# 3. Deeptadi Avastha(情绪状态)
result["avasthas"]["Deeptadi"] = self._calculate_deeptadi_avastha(
planet, sign, degree, is_combust, aspects
)
# 4. Lajjitadi Avastha(羞耻状态)
result["avasthas"]["Lajjitadi"] = self._calculate_lajjitadi_avastha(
planet, sign, house, conjunctions
)
# 5. Shayanadi Avastha(姿态状态)
result["avasthas"]["Shayanadi"] = self._calculate_shayanadi_avastha(planet, sign)
# 6. 综合解读
result["interpretation"] = self._generate_interpretation(result["avasthas"])
# 7. 补救建议
result["remedies"] = self._generate_remedies(planet, result["avasthas"])
return result
def _calculate_bala_avastha(self, degree: float) -> Dict:
"""计算Bala Avastha(年龄状态)"""
if degree < 6:
state = BalaAvastha.INFANT
strength = 0.2
meaning = "婴儿期:行星力量微弱,潜力未开发,需要时间成长"
elif degree < 12:
state = BalaAvastha.YOUNG
strength = 0.5
meaning = "少年期:行星力量增长中,开始显现特质,但尚未成熟"
elif degree < 18:
state = BalaAvastha.YOUTH
strength = 1.0
meaning = "青年期:行星力量最强,充满活力,能够充分发挥作用"
elif degree < 24:
state = BalaAvastha.OLD
strength = 0.7
meaning = "老年期:行星力量开始衰退,经验丰富但活力下降"
else:
state = BalaAvastha.DEAD
strength = 0.3
meaning = "死亡期:行星力量极弱,难以发挥作用,需要补救"
return {
"state": state.value,
"degree_range": f"{int(degree//6)*6}-{int(degree//6)*6+6}°",
"strength": strength,
"meaning": meaning
}
def _calculate_jagrat_avastha(self, planet: str, sign: str, house: int) -> Dict:
"""计算Jagrat Avastha(警觉状态)"""
# 简化规则:
# Awake: 在角宫(1,4,7,10
# Dreaming: 在续宫(2,5,8,11
# Deep Sleep: 在果宫(3,6,9,12
if house in [1, 4, 7, 10]:
state = JagratAvastha.AWAKE
meaning = "清醒状态:行星完全活跃,能够主动发挥作用,影响显著"
elif house in [2, 5, 8, 11]:
state = JagratAvastha.DREAMING
meaning = "梦境状态:行星半活跃,作用不稳定,时强时弱"
else:
state = JagratAvastha.DEEP_SLEEP
meaning = "深睡状态:行星不活跃,难以发挥作用,影响微弱"
return {
"state": state.value,
"house": house,
"meaning": meaning
}
def _calculate_deeptadi_avastha(self, planet: str, sign: str, degree: float,
is_combust: bool, aspects: List[str] = None) -> Dict:
"""计算Deeptadi Avastha(情绪状态)"""
aspects = aspects or []
# 检查入庙/落陷
if self._is_exalted(planet, sign, degree):
state = DeeptadiAvastha.DEEPTA
meaning = "光辉状态:行星处于最佳位置,能量充沛,带来积极结果"
elif self._is_debilitated(planet, sign, degree):
state = DeeptadiAvastha.VIKALA
meaning = "残缺状态:行星处于最弱位置,能量受损,带来挑战"
elif is_combust:
state = DeeptadiAvastha.KHALA
meaning = "恶意状态:行星被太阳燃烧,能量被压制,难以正常发挥"
elif self._is_own_sign(planet, sign):
state = DeeptadiAvastha.SWASTHA
meaning = "舒适状态:行星在自己的星座,感觉自在,能够稳定发挥"
elif self._is_friend_sign(planet, sign):
state = DeeptadiAvastha.MUDITA
meaning = "快乐状态:行星在友好星座,得到支持,能够良好发挥"
elif self._is_enemy_sign(planet, sign):
state = DeeptadiAvastha.DINA
meaning = "沮丧状态:行星在敌对星座,受到压制,发挥受限"
else:
state = DeeptadiAvastha.SHANTA
meaning = "平静状态:行星在中性星座,不强不弱,平稳发挥"
# 检查相位影响
aspect_effects = []
if "Jupiter" in aspects:
aspect_effects.append("木星相位:增加乐观和扩展性")
if "Mars" in aspects:
aspect_effects.append("火星相位:增加激情和冲动性")
if "Saturn" in aspects:
aspect_effects.append("土星相位:增加限制和责任感")
if "Mercury" in aspects:
aspect_effects.append("水星相位:增加智慧和沟通能力")
return {
"state": state.value,
"meaning": meaning,
"aspect_effects": aspect_effects
}
def _calculate_lajjitadi_avastha(self, planet: str, sign: str, house: int,
conjunctions: List[str] = None) -> Dict:
"""计算Lajjitadi Avastha(羞耻状态)"""
conjunctions = conjunctions or []
# 简化规则
if self._is_exalted(planet, sign, 15): # 简化判断
state = LajjitadiAvastha.GARVITA
meaning = "骄傲状态:行星入庙,充满自信,能够展现最佳特质"
elif house in [6, 8, 12]:
state = LajjitadiAvastha.KSHUDITA
meaning = "饥饿状态:行星在困难宫位,渴望满足,但难以获得"
elif sign in self.FIRE_SIGNS:
state = LajjitadiAvastha.TRUSHITA
meaning = "口渴状态:行星在火象星座,能量过热,需要冷却"
elif "Mars" in conjunctions:
state = LajjitadiAvastha.KSHOBHITA
meaning = "激动状态:与火星合相,能量激烈,容易冲动"
elif any(self._is_enemy_planet(planet, conj) for conj in conjunctions):
state = LajjitadiAvastha.LAJJITA
meaning = "羞耻状态:与敌对行星同宫,感到不适,发挥受限"
else:
state = LajjitadiAvastha.MUDITA
meaning = "快乐状态:与友好行星同宫,感到愉悦,能够良好发挥"
return {
"state": state.value,
"meaning": meaning,
"conjunctions": conjunctions
}
def _calculate_shayanadi_avastha(self, planet: str, sign: str) -> Dict:
"""计算Shayanadi Avastha(姿态状态)"""
# 根据星座元素和类型判断
if sign in self.WATER_SIGNS:
state = ShayanadiAvastha.SHAYANA
meaning = "躺卧姿态:行星在水象星座,处于休息状态,被动接受"
elif sign in self.EARTH_SIGNS:
state = ShayanadiAvastha.UPAVESHANA
meaning = "坐着姿态:行星在土象星座,稳定扎根,缓慢行动"
elif sign in self.FIRE_SIGNS:
state = ShayanadiAvastha.NETRAPANI
meaning = "持武器姿态:行星在火象星座,充满战斗力,主动出击"
elif sign in self.AIR_SIGNS:
state = ShayanadiAvastha.PRAKASHANA
meaning = "显现姿态:行星在风象星座,灵活多变,善于表达"
else:
state = ShayanadiAvastha.GAMANA
meaning = "行走姿态:行星处于移动状态,不断变化"
# 根据行星主宰星座判断特殊状态
for planet_name, signs in self.PLANET_SIGNS.items():
if sign in signs:
if planet_name == "Mercury":
state = ShayanadiAvastha.AGAMA
meaning = "学习姿态:在水星星座,专注于学习和沟通"
elif planet_name == "Venus":
state = ShayanadiAvastha.BHOJANA
meaning = "进食姿态:在金星星座,享受物质和感官愉悦"
elif planet_name == "Moon":
state = ShayanadiAvastha.NRITYALIPSA
meaning = "舞蹈姿态:在月亮星座,情感丰富,富有表现力"
elif planet_name == "Jupiter":
state = ShayanadiAvastha.KAUTUKA
meaning = "好奇姿态:在木星星座,渴望探索和扩展"
elif planet_name == "Saturn":
state = ShayanadiAvastha.NIDRA
meaning = "睡眠姿态:在土星星座,能量收缩,需要休息"
break
return {
"state": state.value,
"sign": sign,
"meaning": meaning
}
def _is_exalted(self, planet: str, sign: str, degree: float) -> bool:
"""检查是否入庙"""
if planet in self.EXALTATION:
exalt_sign, exalt_degree = self.EXALTATION[planet]
return sign == exalt_sign and abs(degree - exalt_degree) < 5
return False
def _is_debilitated(self, planet: str, sign: str, degree: float) -> bool:
"""检查是否落陷"""
if planet in self.DEBILITATION:
debil_sign, debil_degree = self.DEBILITATION[planet]
return sign == debil_sign and abs(degree - debil_degree) < 5
return False
def _is_own_sign(self, planet: str, sign: str) -> bool:
"""检查是否在自己的星座"""
return sign in self.PLANET_SIGNS.get(planet, [])
def _is_friend_sign(self, planet: str, sign: str) -> bool:
"""检查是否在友好星座(简化版)"""
# 这里需要完整的行星友好关系表,暂时简化
return False
def _is_enemy_sign(self, planet: str, sign: str) -> bool:
"""检查是否在敌对星座(简化版)"""
# 这里需要完整的行星敌对关系表,暂时简化
return False
def _is_enemy_planet(self, planet1: str, planet2: str) -> bool:
"""检查两个行星是否敌对(简化版)"""
# 这里需要完整的行星关系表,暂时简化
enemies = {
"Sun": ["Saturn", "Venus"],
"Moon": ["Rahu", "Ketu"],
"Mars": ["Mercury"],
"Mercury": ["Moon"],
"Jupiter": ["Mercury", "Venus"],
"Venus": ["Sun", "Moon"],
"Saturn": ["Sun", "Moon", "Mars"]
}
return planet2 in enemies.get(planet1, [])
def _generate_interpretation(self, avasthas: Dict) -> str:
"""生成综合解读"""
interpretation = "行星状态综合分析:\n\n"
# Bala Avastha
bala = avasthas["Bala"]
interpretation += f"1. 年龄状态:{bala['state']}{bala['degree_range']}\n"
interpretation += f" {bala['meaning']}\n\n"
# Jagrat Avastha
jagrat = avasthas["Jagrat"]
interpretation += f"2. 警觉状态:{jagrat['state']}(第{jagrat['house']}宫)\n"
interpretation += f" {jagrat['meaning']}\n\n"
# Deeptadi Avastha
deeptadi = avasthas["Deeptadi"]
interpretation += f"3. 情绪状态:{deeptadi['state']}\n"
interpretation += f" {deeptadi['meaning']}\n"
if deeptadi['aspect_effects']:
interpretation += " 相位影响:\n"
for effect in deeptadi['aspect_effects']:
interpretation += f" - {effect}\n"
interpretation += "\n"
# Lajjitadi Avastha
lajjitadi = avasthas["Lajjitadi"]
interpretation += f"4. 社会状态:{lajjitadi['state']}\n"
interpretation += f" {lajjitadi['meaning']}\n\n"
# Shayanadi Avastha
shayanadi = avasthas["Shayanadi"]
interpretation += f"5. 行为模式:{shayanadi['state']}{shayanadi['sign']}\n"
interpretation += f" {shayanadi['meaning']}\n"
return interpretation
def _generate_remedies(self, planet: str, avasthas: Dict) -> List[str]:
"""生成补救建议"""
remedies = []
# 根据Bala Avastha
bala_strength = avasthas["Bala"]["strength"]
if bala_strength < 0.5:
remedies.append(f"行星处于弱势年龄阶段,建议佩戴{planet}对应的宝石")
remedies.append(f"{planet}主管的日子进行布施和祈祷")
# 根据Jagrat Avastha
if avasthas["Jagrat"]["state"] == "Deep Sleep":
remedies.append("行星处于深睡状态,建议通过冥想和咒语激活其能量")
# 根据Deeptadi Avastha
deeptadi_state = avasthas["Deeptadi"]["state"]
if deeptadi_state in ["Vikala", "Khala", "Dina"]:
remedies.append(f"行星处于{deeptadi_state}状态,需要特别补救")
remedies.append(f"念诵{planet}的Beeja Mantra(种子咒)")
return remedies
# 示例用法
if __name__ == "__main__":
calculator = AvasthaCalculator()
# 示例:太阳在白羊座15度,第10宫
result = calculator.calculate_all_avasthas(
planet="Sun",
sign="Aries",
degree=15.0,
house=10,
conjunctions=["Mercury"],
aspects=["Jupiter", "Saturn"],
is_combust=False,
is_retrograde=False
)
print("="*60)
print(f"{result['planet']}{result['sign']} {result['degree']}° (第{result['house']}宫)")
print("="*60)
print(result['interpretation'])
if result['remedies']:
print("\n补救建议:")
for i, remedy in enumerate(result['remedies'], 1):
print(f"{i}. {remedy}")