import json, random import numpy as np, pandas as pd from sklearn.metrics import roc_auc_score from app.database import SessionLocal from app.repository import list_objects from app.feature_engineering import FEATURE_COLUMNS, combine_features from app.graph_features import build_graph, pair_graph_features from app.ml import train_models def run_training(): db = SessionLocal() try: objs = list_objects(db, 5000) objects = [{"object_id": o.object_id, "object_type": o.object_type, "mean_motion": o.mean_motion, "inclination": o.inclination, "eccentricity": o.eccentricity, "raan": o.raan, "bstar": o.bstar, "launch_year": o.launch_year} for o in objs] finally: db.close() pairs = [tuple(random.sample(objects, 2)) for _ in range(4000)] g = build_graph([(a["object_id"], b["object_id"]) for a, b in pairs[:1000]]) rows = [] raw_scores = [] for a, b in pairs: trend = {"recurrence_count": float(random.choice([0,1,2,3,4])), "trend_delta_score": float(random.uniform(-0.1, 0.3)), "score_volatility_proxy": float(random.uniform(0, 0.2))} f = combine_features(a, b, trend, pair_graph_features(g, a["object_id"], b["object_id"])) score = 0.30*f["close_approach_proxy"] + 0.16*f["same_shell"] + 0.10*min(1.0,f["shell_density_proxy"]/12.0) + 0.10*min(1.0,f["graph_local_density"]*2.0) + 0.09*min(1.0,f["graph_jaccard"]) + 0.10*min(1.0,f["recurrence_count"]/5.0) + 0.08*max(0.0,f["trend_delta_score"]) + np.random.normal(0,0.05) y = 1 if score > 0.48 else 0 rows.append({**f, "label": y}) raw_scores.append(score) df = pd.DataFrame(rows) path = train_models(df[FEATURE_COLUMNS].values, df["label"].values) auc = float(roc_auc_score(df["label"].values, np.array(raw_scores))) return path, len(df), {"pseudo_auc": round(auc, 4), "rows": int(len(df))} if __name__ == "__main__": p, r, m = run_training() print(json.dumps({"model_path": p, "rows": r, "metrics": m}, indent=2))