feat(rectification): pass ayanamsa per request
This commit is contained in:
@@ -16,6 +16,9 @@ if str(SCRIPTS_DIR) not in sys.path:
|
||||
sys.path.insert(0, str(SCRIPTS_DIR))
|
||||
|
||||
from active_rectification_selector import select_next_questions
|
||||
from ayanamsa_utils import DEFAULT_AYANAMSA_NAME
|
||||
|
||||
DEFAULT_NODE_MODE = "mean"
|
||||
|
||||
OPTIONS = [
|
||||
{"key": "A", "label": "明确有,且时间大致吻合", "score": 2},
|
||||
@@ -60,7 +63,8 @@ def _candidate_scan(
|
||||
lat: float | None = None,
|
||||
lon: float | None = None,
|
||||
tz: float | None = None,
|
||||
ayanamsa: str = "raman",
|
||||
ayanamsa: str = DEFAULT_AYANAMSA_NAME,
|
||||
node_mode: str = DEFAULT_NODE_MODE,
|
||||
) -> dict[str, Any]:
|
||||
start = center - timedelta(minutes=uncertainty_minutes)
|
||||
end = center + timedelta(minutes=uncertainty_minutes)
|
||||
@@ -84,7 +88,14 @@ def _candidate_scan(
|
||||
"cluster": cluster,
|
||||
"sensitivity_flags": _sensitivity_flags(abs(offset)),
|
||||
}
|
||||
recast = _candidate_recast(candidate, lat=lat, lon=lon, tz=tz, ayanamsa=ayanamsa)
|
||||
recast = _candidate_recast(
|
||||
candidate,
|
||||
lat=lat,
|
||||
lon=lon,
|
||||
tz=tz,
|
||||
ayanamsa=ayanamsa,
|
||||
node_mode=node_mode,
|
||||
)
|
||||
if recast:
|
||||
sample.update(recast)
|
||||
samples.append(sample)
|
||||
@@ -106,6 +117,8 @@ def _candidate_scan(
|
||||
"lat": lat,
|
||||
"lon": lon,
|
||||
"tz": tz,
|
||||
"ayanamsa": ayanamsa,
|
||||
"node_mode": node_mode,
|
||||
},
|
||||
uncertainty_minutes=uncertainty_minutes,
|
||||
step_minutes=step_minutes,
|
||||
@@ -126,6 +139,10 @@ def _candidate_scan(
|
||||
"cluster_labels": ["early_candidate_cluster", "middle_candidate_cluster", "late_candidate_cluster"],
|
||||
"samples": samples,
|
||||
"minute_scan": minute_scan,
|
||||
"calculation": {
|
||||
"ayanamsa": ayanamsa,
|
||||
"node_mode": node_mode,
|
||||
},
|
||||
"sensitivity_summary": {
|
||||
"method": "minute_feature_scan_v2",
|
||||
"high_value_layers": ["D2", "D4", "D9", "D10", "D24", "D30", "D60", "UL", "A7", "A10", "KP_cusp"],
|
||||
@@ -152,6 +169,7 @@ def _candidate_recast(
|
||||
lon: float | None,
|
||||
tz: float | None,
|
||||
ayanamsa: str,
|
||||
node_mode: str = DEFAULT_NODE_MODE,
|
||||
) -> dict[str, Any] | None:
|
||||
if lat is None or lon is None or tz is None:
|
||||
return None
|
||||
@@ -171,6 +189,7 @@ def _candidate_recast(
|
||||
"lon": lon,
|
||||
"tz": tz,
|
||||
"ayanamsa": ayanamsa,
|
||||
"node_mode": node_mode,
|
||||
})
|
||||
planet_lons = {
|
||||
name: data["lon"]
|
||||
@@ -231,7 +250,8 @@ def build_questionnaire(
|
||||
lat: float | None = None,
|
||||
lon: float | None = None,
|
||||
tz: float | None = None,
|
||||
ayanamsa: str = "raman",
|
||||
ayanamsa: str = DEFAULT_AYANAMSA_NAME,
|
||||
node_mode: str = DEFAULT_NODE_MODE,
|
||||
) -> dict[str, Any]:
|
||||
questions = []
|
||||
for qid, round_id, domain, sensitivity, window, prompt, yes_bias, no_bias in QUESTION_TEMPLATES:
|
||||
@@ -270,6 +290,7 @@ def build_questionnaire(
|
||||
lon=lon,
|
||||
tz=tz,
|
||||
ayanamsa=ayanamsa,
|
||||
node_mode=node_mode,
|
||||
)
|
||||
selection = select_next_questions(
|
||||
{"questions": questions, "candidate_scan": candidate_scan}, {}, limit=1
|
||||
@@ -279,6 +300,10 @@ def build_questionnaire(
|
||||
"schema_version": 1,
|
||||
"candidate_scan": candidate_scan,
|
||||
"selection": selection,
|
||||
"calculation": {
|
||||
"ayanamsa": ayanamsa,
|
||||
"node_mode": node_mode,
|
||||
},
|
||||
"workflow": [
|
||||
"candidate_time_scan",
|
||||
"varga_arudha_kp_sensitivity_diff",
|
||||
@@ -433,6 +458,10 @@ def score_answers(
|
||||
"truth_status": "not_birth_time_truth",
|
||||
"formula_unit_parity_status": "partial",
|
||||
"timing_claim_status": "exploratory_unvalidated",
|
||||
"calculation": questionnaire.get("calculation", {
|
||||
"ayanamsa": DEFAULT_AYANAMSA_NAME,
|
||||
"node_mode": DEFAULT_NODE_MODE,
|
||||
}),
|
||||
"answered_count": len(applied),
|
||||
"candidate_cluster_rankings": rankings,
|
||||
"technique_audit_table": [
|
||||
@@ -494,10 +523,18 @@ def main() -> int:
|
||||
parser.add_argument("--birth-time", required=True, help="Approximate local birth time, YYYY-MM-DD HH:MM")
|
||||
parser.add_argument("--uncertainty-minutes", type=int, default=30)
|
||||
parser.add_argument("--step-minutes", type=int, default=1)
|
||||
parser.add_argument("--ayanamsa", default=DEFAULT_AYANAMSA_NAME)
|
||||
parser.add_argument("--node-mode", choices=("mean", "true"), default=DEFAULT_NODE_MODE)
|
||||
parser.add_argument("--answers-json", default="", help="Optional JSON object mapping question id to A/B/C/D")
|
||||
parser.add_argument("--pretty", action="store_true")
|
||||
args = parser.parse_args()
|
||||
questionnaire = build_questionnaire(args.birth_time, args.uncertainty_minutes, args.step_minutes)
|
||||
questionnaire = build_questionnaire(
|
||||
args.birth_time,
|
||||
args.uncertainty_minutes,
|
||||
args.step_minutes,
|
||||
ayanamsa=args.ayanamsa,
|
||||
node_mode=args.node_mode,
|
||||
)
|
||||
report = score_answers(questionnaire, json.loads(args.answers_json)) if args.answers_json else questionnaire
|
||||
print(json.dumps(report, ensure_ascii=False, indent=2 if args.pretty else None))
|
||||
return 0
|
||||
|
||||
Reference in New Issue
Block a user