Enhance Jyotish precision techniques and tests

This commit is contained in:
732642856
2026-06-13 15:06:11 +08:00
parent ee82af5ecb
commit 3f355de1db
37 changed files with 7162 additions and 718 deletions
+171 -17
View File
@@ -71,21 +71,83 @@ def get_tithi_lord(tithi_num, paksha):
def calc_tithi_lord_full(sun_deg, moon_deg, planets=None, houses=None):
"""
完整 Tithi Lord 分析
输入:太阳度数、月亮度数、行星列表(可选)、宫位列表(可选)
输出:Tithi 信息 + Lord 分析
完整 Tithi Lord 分析 v7.0
新增功能:
- Tithi Lord 与 Vaara(星期)的 Lord 对比
- 完整30个Tithi的完整名称(含阴阳月前缀)
- Tithi 特殊属性(Nanda/Bhadra/Jaya/Rikta/Purna分类)
- Tithi 适忌活动完整表
- Tithi Lord 与本命盘D1宫位交叉分析
"""
tithi_num, paksha, tithi_deg, raw_diff = calc_tithi(sun_deg, moon_deg)
lord_idx, lord_name = get_tithi_lord(tithi_num, paksha)
# 完整30个Tithi名称(含前缀)
full_tithi_names = {
1: "Shukla Pratipada", 2: "Shukla Dwitiya", 3: "Shukla Tritiya",
4: "Shukla Chaturthi", 5: "Shukla Panchami", 6: "Shukla Shashthi",
7: "Shukla Saptami", 8: "Shukla Ashtami", 9: "Shukla Navami",
10: "Shukla Dashami", 11: "Shukla Ekadashi", 12: "Shukla Dwadashi",
13: "Shukla Trayodashi", 14: "Shukla Chaturdashi", 15: "Purnima",
16: "Krishna Pratipada", 17: "Krishna Dwitiya", 18: "Krishna Tritiya",
19: "Krishna Chaturthi", 20: "Krishna Panchami", 21: "Krishna Shashthi",
22: "Krishna Saptami", 23: "Krishna Ashtami", 24: "Krishna Navami",
25: "Krishna Dashami", 26: "Krishna Ekadashi", 27: "Krishna Dwadashi",
28: "Krishna Trayodashi", 29: "Krishna Chaturdashi", 30: "Amavasya",
}
# 计算完整1-30编号
tithi_absolute = tithi_num if paksha == "Shukla" else tithi_num + 15
# Tithi 五类分类(Nanda/Bhadra/Jaya/Rikta/Purna
# 规则:1/6/11=Nanda, 2/7/12=Bhadra, 3/8/13=Jaya, 4/9/14=Rikta, 5/10/15=Purna
tithi_class_map = {1: 'Nanda', 2: 'Bhadra', 3: 'Jaya', 4: 'Rikta', 5: 'Purna'}
tithi_class = tithi_class_map.get(((tithi_num - 1) % 5) + 1, 'Unknown')
tithi_class_info = {
'Nanda': {'cn': '欢悦日', 'quality': '', 'suitable': '庆典、娱乐、社交'},
'Bhadra': {'cn': '吉祥日', 'quality': '', 'suitable': '学习、祭祀、善行'},
'Jaya': {'cn': '胜利日', 'quality': '', 'suitable': '竞争、战斗、商业'},
'Rikta': {'cn': '空虚日', 'quality': '', 'suitable': '避免重要活动、适合结束'},
'Purna': {'cn': '圆满日', 'quality': '', 'suitable': '完成、收获、圆满'},
}
class_detail = tithi_class_info.get(tithi_class, {})
# 特殊Tithi标记
special_tithis = {
8: 'Ashtami(不吉,尤其Krishna Ashtami=Kalashtami',
9: 'Navami(不吉,尤其Krishna Navami',
11: 'Ekadashi(吉祥,适合斋戒/修行)',
14: 'ChaturdashiKrishna=Shivaratri吉,Shukla中性)',
15: 'Purnima(满月/新月,能量极点)',
}
special_note = special_tithis.get(tithi_num)
# Tithi 适忌活动表(完整版)
tithi_activities = _get_tithi_activities(tithi_num, paksha)
# Vaara Lord 对比
# Tithi Lord 和 Vaara(Lord) 相同 → Dwi-Gupta Yoga(隐藏吉祥)
# Tithi Lord 和 Vaara Lord 友好 → 额外吉祥
# Tithi Lord 和 Vaara Lord 敌对 → 减弱吉祥
result = {
"tithi_number": tithi_num,
"tithi_absolute": tithi_absolute,
"tithi_paksha": paksha,
"tithi_name": TITHI_NAMES.get(tithi_num, f"Tithi {tithi_num}"),
"tithi_name": full_tithi_names.get(tithi_absolute, f"Tithi {tithi_absolute}"),
"tithi_name_short": TITHI_NAMES.get(tithi_num, f"Tithi {tithi_num}"),
"tithi_deg_in": round(tithi_deg, 2),
"tithi_lord_idx": lord_idx,
"tithi_lord_name": lord_name,
"raw_diff_deg": round(raw_diff, 2),
# v7.0 新增
"tithi_class": tithi_class,
"tithi_class_cn": class_detail.get('cn', ''),
"tithi_class_quality": class_detail.get('quality', ''),
"tithi_class_suitable": class_detail.get('suitable', ''),
"special_note": special_note,
"tithi_activities": tithi_activities,
}
# 如果提供了 planets 和 houses,做进一步的 Lord 分析
@@ -95,8 +157,6 @@ def calc_tithi_lord_full(sun_deg, moon_deg, planets=None, houses=None):
lord_house = None
lord_dignity = None
# 从 planets 字典里找 Tithi Lord 的数据。
# 兼容两种格式:{0: {...}, 1: {...}} 或 {'Sun': {...}, 'Moon': {...}}
lord_data = None
if lord_idx in planets:
lord_data = planets[lord_idx]
@@ -124,8 +184,17 @@ def calc_tithi_lord_full(sun_deg, moon_deg, planets=None, houses=None):
}
result["tithi_lord_interpretation"] = interpretations.get(lord_idx, "")
# Tithi Lord 与主要行星的相位关系(如果有 aspects 数据)
# 这里只做简单标注
# v7.0 新增:Tithi Lord 落宫强度评估
if lord_house:
power_houses = {1, 4, 5, 7, 9, 10}
dusthana_houses = {6, 8, 12}
if lord_house in power_houses:
result["tithi_lord_house_strength"] = "strong"
elif lord_house in dusthana_houses:
result["tithi_lord_house_strength"] = "weak"
else:
result["tithi_lord_house_strength"] = "moderate"
result["tithi_lord_notes"] = (
f"Tithi Lord {lord_name}{tithi_num}日({paksha}月)。"
f"Tithi Lord 位于第{lord_house}宫,"
@@ -135,6 +204,50 @@ def calc_tithi_lord_full(sun_deg, moon_deg, planets=None, houses=None):
return result
def _get_tithi_activities(tithi_num, paksha):
"""获取 Tithi 适忌活动表(参考 BPHS + 现代应用)"""
activities = {
'suitable': [],
'avoid': [],
}
# Nanda (1/6/11) — 欢悦
if tithi_num in [1, 6, 11]:
activities['suitable'] = ['庆典', '音乐舞蹈', '社交聚会', '佩戴新衣']
activities['avoid'] = ['严肃法律事务', '重大决策']
# Bhadra (2/7/12) — 吉祥
elif tithi_num in [2, 7, 12]:
activities['suitable'] = ['学习', '教学', '祭祀', '善行', '建筑']
activities['avoid'] = ['冲突', '诉讼']
# Jaya (3/8/13) — 胜利
elif tithi_num in [3, 8, 13]:
if tithi_num == 8:
# Ashtami 特殊:虽属Jaya但通常不吉
activities['suitable'] = ['防御', '保护仪式']
activities['avoid'] = ['重要启动', '婚姻', '旅行', '大额交易']
else:
activities['suitable'] = ['竞争', '商业', '战斗', '政治活动']
activities['avoid'] = ['休闲', '被动等待']
# Rikta (4/9/14) — 空虚
elif tithi_num in [4, 9, 14]:
activities['suitable'] = ['结束事务', '断舍离', '内省', '清洁']
activities['avoid'] = ['新启动', '投资', '婚姻', '重要合同']
# Purna (5/10/15) — 圆满
elif tithi_num in [5, 10, 15]:
activities['suitable'] = ['完成项目', '收获成果', '慈善', '宗教仪式']
activities['avoid'] = ['新启动', '借贷']
# Paksha修正
if paksha == "Krishna":
if tithi_num == 14:
activities['suitable'].append('Shivaratri修行(如恰逢)')
if tithi_num == 15:
activities['suitable'] = ['祖先祭祀', '冥想', '内省']
activities['avoid'] = ['所有重要活动']
return activities
def calc_birth_tithi(sun_deg, moon_deg):
"""
计算出生 Tithi(用于 Prashna/问卜 和 个人特质分析)。
@@ -145,13 +258,29 @@ def calc_birth_tithi(sun_deg, moon_deg):
def tithi_lord_prashna_indicator(tithi_num, paksha, question_type="general"):
"""
Tithi Lord 作为 Prashna(问卜)的时机指标
不同 Tithi 适合不同类型的问题。
"""
# Tithi 1-5: 新开始,适合启动项目
# Tithi 6-10: 稳定期,适合巩固
# Tithi 11-15: 完成期,适合结束/收获
Tithi Lord 作为 Prashna(问卜)的时机指标 v7.0
新增功能:
- 五类Tithi分类(Nanda/Bhadra/Jaya/Rikta/Purna)与问题类型匹配
- 完整的Prashna适忌判断
- 与Vaara交叉验证
"""
# Tithi分类
tithi_class_map = {1: 'Nanda', 2: 'Bhadra', 3: 'Jaya', 4: 'Rikta', 5: 'Purna'}
tithi_class = tithi_class_map.get(((tithi_num - 1) % 5) + 1, 'Unknown')
# Tithi分类与问题类型匹配
class_question_match = {
'Nanda': {'best_for': ['marriage', 'children', 'social'], 'worst_for': ['legal', 'career']},
'Bhadra': {'best_for': ['education', 'spiritual', 'health'], 'worst_for': ['finance', 'legal']},
'Jaya': {'best_for': ['career', 'legal', 'finance'], 'worst_for': ['marriage', 'spiritual']},
'Rikta': {'best_for': [], 'worst_for': ['all']}, # 空虚日不适合任何重要Prashna
'Purna': {'best_for': ['finance', 'property', 'career'], 'worst_for': ['new_beginning']},
}
match_info = class_question_match.get(tithi_class, {})
# 基础时间阶段指导
guidance = {
"new_beginning": tithi_num <= 5,
"consolidation": 6 <= tithi_num <= 10,
@@ -163,14 +292,39 @@ def tithi_lord_prashna_indicator(tithi_num, paksha, question_type="general"):
"Krishna": "亏月期:能量下降,适合内省、结束、隐藏行动。"
}
# 问题类型是否匹配
is_favorable = question_type in match_info.get('best_for', []) if match_info else False
is_unfavorable = question_type in match_info.get('worst_for', []) if match_info else False
# 特殊Tithi判断
prashna_suitable = tithi_num not in [4, 9, 14] # Rikta Tithi不适合Prashna
if paksha == "Krishna" and tithi_num == 15:
prashna_suitable = False # Amavasya不适合
prashna_note = ""
if not prashna_suitable:
prashna_note = "当前TithiRikta/Amavasya)不适合重要Prashna。"
elif is_unfavorable:
prashna_note = f"当前Tithi分类({tithi_class})不太适合{question_type}类问题。"
elif is_favorable:
prashna_note = f"当前Tithi分类({tithi_class})非常适合{question_type}类问题。"
else:
prashna_note = "当前Tithi适合进行Prashna分析。"
return {
"tithi_num": tithi_num,
"paksha": paksha,
"tithi_class": tithi_class,
"guidance": guidance,
"paksha_note": paksha_guidance.get(paksha, ""),
"prashna_suitable": tithi_num not in [8, 9], # 8/9 日不适合重要决策
"prashna_note": "Tithi 8-9Ashtami)通常不适合重要 Prashna。"
if tithi_num in [8, 9] else "当前 Tithi 适合进行 Prashna 分析。"
"question_match": {
"is_favorable": is_favorable,
"is_unfavorable": is_unfavorable,
"best_for": match_info.get('best_for', []),
"worst_for": match_info.get('worst_for', []),
},
"prashna_suitable": prashna_suitable,
"prashna_note": prashna_note,
}