import { analyzeChart } from './analysis'; import { analyzeChartV2 } from './analysis-v2'; import { chartFromCivilTime, normalizeCivilTime } from './calendar'; import { createChart } from './chart'; import { detectRelations } from './chart-relations'; import { detectRoots } from './roots'; import { calculateSeasonContext } from './season-context'; import type { AppliedRules, BaziInput, BaziResult, CalculateBaziOptions, ChartRelations, FourPillarsInput, RootsContext, StrengthAnalysis, StrengthV2Analysis, } from './types'; export { analyzeChart, analyzePillars } from './analysis'; export { analyzeChartV2, analyzePillarsV2 } from './analysis-v2'; export { calculateAnnualCycles } from './annual-cycle'; export { createChart } from './chart'; export { detectPillarRelations, detectRelations } from './chart-relations'; export { detectPillarRoots, detectRoots } from './roots'; export { analyzeLuckCycles } from './luck-analysis'; export { calculateLuckCycles, convertThreeDaysToOneYear } from './luck-cycle'; export { getElementRelation, getTenGod, isSupportingRelation } from './relations'; export { calculateSeasonContext, getSeasonalStates, getTwelveGrowthStage, } from './season-context'; export * from './types'; export const BAZI_CORE_VERSION = '0.8.0'; export function calculateBazi( input: BaziInput, options: CalculateBaziOptions = {}, ): BaziResult { const civilTime = normalizeCivilTime(input.civilTime); const dayBoundary = options.dayBoundary ?? 'midnight'; const calendar = chartFromCivilTime(civilTime, dayBoundary); const seasonContext = calculateSeasonContext(civilTime, calendar.chart); const relations = detectRelations(calendar.chart); const roots = detectRoots(calendar.chart); const analysis = analyzeChart(calendar.chart); const analysisV2 = analyzeChartV2(calendar.chart, { seasonContext, relations, roots, }); const appliedRules: AppliedRules = { calendar: 'solar', timeStandard: 'china-standard-time', yearBoundary: 'beginning-of-spring', monthBoundary: 'major-solar-terms', dayBoundary, seasonContextModel: 'season-context-v1', relationsModel: 'relations-v1', rootsModel: 'roots-v1', strengthModel: 'ziping-strength-v1', strengthV2Model: 'ziping-strength-v2', specialPatterns: 'flag-only', }; const warnings = [ '旺衰结论属于规则模型的可复核结果,不等同于传统命理师的完整判断。', 'v1 不计算真太阳时,也不自动判断从格、专旺、化气、调候和用神。', ]; if (analysis.specialPattern.status === 'review-required') { warnings.push(analysis.specialPattern.reason); } return { input: { civilTime }, pillars: calendar.chart.pillars, dayMaster: calendar.chart.dayMaster, seasonContext, relations, roots, analysis, analysisV2, appliedRules, trace: [ ...calendar.trace, { ruleId: 'season-context.season-context-v1', description: '计算节气距离、日主十二长生和按月支四季划分的旺相休囚死;只输出季节环境事实。', input: { civilTime, dayMaster: calendar.chart.dayMaster, branches: Object.fromEntries( Object.entries(calendar.chart.pillars).map(([key, pillar]) => [ key, pillar.branch.name, ]), ), }, output: { seasonContext }, }, { ruleId: 'relations.relations-v1', description: '检测明透天干的五合与相克,以及地支六合、三合、六冲、六害和刑;只输出关系事实。', input: { pillars: calendar.pillars }, output: { relations }, }, { ruleId: 'roots.roots-v1', description: '检测四柱地支藏干中与日主同五行的根;只输出位置及本气、中气、余气层级。', input: { dayMaster: calendar.chart.dayMaster, branches: Object.fromEntries( Object.entries(calendar.chart.pillars).map(([key, pillar]) => [ key, pillar.branch, ]), ), }, output: { roots }, }, { ruleId: 'strength.ziping-v1', description: '按月令、根、明透生扶与泄耗克证据进行公开的五档旺衰分档。', input: { pillars: calendar.pillars, dayMaster: calendar.chart.dayMaster, }, output: { strength: analysis.strength, balance: analysis.decisionBalance, specialPattern: analysis.specialPattern, }, }, { ruleId: 'strength.ziping-v2', description: '显式组合季节、根气、干支关系与基础干藏证据,重新计算五档旺衰;未满足作用条件的关系事实只记录、不计分。', input: { seasonContextModel: seasonContext.model, relationsModel: relations.model, rootsModel: roots.model, pillars: calendar.pillars, dayMaster: calendar.chart.dayMaster, }, output: { strength: analysisV2.strength, balance: analysisV2.decisionBalance, specialPattern: analysisV2.specialPattern, }, }, ], warnings, }; } export function calculateFromPillars(pillars: FourPillarsInput): { chart: ReturnType; relations: ChartRelations; roots: RootsContext; analysis: StrengthAnalysis; analysisV2: StrengthV2Analysis; } { const chart = createChart(pillars); const relations = detectRelations(chart); const roots = detectRoots(chart); return { chart, relations, roots, analysis: analyzeChart(chart), analysisV2: analyzeChartV2(chart, { relations, roots }), }; }