From 5e731a3a3b9f20a452fda4725f659b1b5a3d4a29 Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Wed, 1 Jul 2026 22:07:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E4=BB=A3=E7=A0=81=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ML/nmWTAI-ML/scripts/compare_single_case.py | 8 ++++++-- ML/nmWTAI-ML/scripts/q_sweep_local_ranking.py | 6 ++++++ .../scripts/replay_pso_trace_screening.py | 3 ++- ML/nmWTAI-ML/scripts/score_pso_candidates.py | 5 +++-- .../scripts/validate_autofit_local_ranking.py | 15 ++++++++++++--- .../validate_autofit_local_ranking_batch.py | 4 +++- ML/nmWTAI-ML/src/data/dataset_generation.py | 2 +- ML/nmWTAI-ML/src/data/params.py | 4 ++-- ML/nmWTAI-ML/src/data/preprocess.py | 5 +---- 9 files changed, 36 insertions(+), 16 deletions(-) diff --git a/ML/nmWTAI-ML/scripts/compare_single_case.py b/ML/nmWTAI-ML/scripts/compare_single_case.py index ade13cd..ebd271a 100644 --- a/ML/nmWTAI-ML/scripts/compare_single_case.py +++ b/ML/nmWTAI-ML/scripts/compare_single_case.py @@ -63,6 +63,7 @@ DEFAULT_SINGLE_CASE = { "wellboreC": 0.01, "phi": 0.0245, "h": 9.144, + "Ct": 1.0e-3, "Cf": 0.0004315, }, } @@ -100,6 +101,7 @@ def parse_args() -> argparse.Namespace: parser.add_argument("--wellboreC", type=float, default=DEFAULT_SINGLE_CASE["params"]["wellboreC"]) parser.add_argument("--phi", type=float, default=DEFAULT_SINGLE_CASE["params"]["phi"]) parser.add_argument("--h", type=float, default=DEFAULT_SINGLE_CASE["params"]["h"]) + parser.add_argument("--Ct", type=float, default=DEFAULT_SINGLE_CASE["params"]["Ct"]) parser.add_argument("--Cf", type=float, default=DEFAULT_SINGLE_CASE["params"]["Cf"]) parser.add_argument( "--well-index", @@ -301,6 +303,7 @@ def build_params_from_args(args: argparse.Namespace, cfg: Config, schedule: Sche wellboreC=float(args.wellboreC), phi=float(args.phi), h=float(args.h), + Ct=float(args.Ct), Cf=resolve_cf(args, cfg), schedule=schedule, ) @@ -412,7 +415,7 @@ def predict_surrogate_curve( # 构建参数特征向量 # 顺序必须与训练阶段保持一致 params_vec = np.asarray( - [params.k, params.skin, params.wellboreC, params.phi, params.h, params.Cf], + [params.k, params.skin, params.wellboreC, params.phi, params.h, params.Ct, params.Cf], dtype=np.float32, ).reshape(1, -1) # 将流量制度 schedule 编码成模型输入向量 @@ -464,7 +467,7 @@ def plot_comparison( fig.suptitle( "Solver vs Surrogate\n" f"k={params.k:.6g}, skin={params.skin:.6g}, wellboreC={params.wellboreC:.6g}, " - f"phi={params.phi:.6g}, h={params.h:.6g}, Cf={params.Cf:.6g}\n" + f"phi={params.phi:.6g}, h={params.h:.6g}, Ct={params.Ct:.6g}, Cf={params.Cf:.6g}\n" f"sectionIndex={schedule.sectionIndex}, timeQ={schedule.timeQ}, q={schedule.q}\n" f"use_schedule={use_schedule}, model={model_path.name}, " f"Overall RMSE={overall['rmse']:.4f}, MAE={overall['mae']:.4f}, " @@ -578,6 +581,7 @@ def main() -> None: "wellboreC": params.wellboreC, "phi": params.phi, "h": params.h, + "Ct": params.Ct, "Cf": params.Cf, }, "schedule": { diff --git a/ML/nmWTAI-ML/scripts/q_sweep_local_ranking.py b/ML/nmWTAI-ML/scripts/q_sweep_local_ranking.py index c42aedd..4471155 100644 --- a/ML/nmWTAI-ML/scripts/q_sweep_local_ranking.py +++ b/ML/nmWTAI-ML/scripts/q_sweep_local_ranking.py @@ -50,6 +50,7 @@ THETA_STAR = { "wellboreC": 0.03024150790038185, "phi": 0.2736409306526184, "h": 21.499309979069142, + "Ct": 1.0e-3, "Cf": 4.315e-4, } @@ -91,6 +92,7 @@ def parse_args() -> argparse.Namespace: parser.add_argument("--wellboreC", type=float, default=THETA_STAR["wellboreC"]) parser.add_argument("--phi", type=float, default=THETA_STAR["phi"]) parser.add_argument("--h", type=float, default=THETA_STAR["h"]) + parser.add_argument("--Ct", type=float, default=THETA_STAR["Ct"]) parser.add_argument("--Cf", type=float, default=THETA_STAR["Cf"]) return parser.parse_args() @@ -120,6 +122,7 @@ def make_theta_params(args: argparse.Namespace, schedule: Schedule) -> Params: wellboreC=float(args.wellboreC), phi=float(args.phi), h=float(args.h), + Ct=float(args.Ct), Cf=float(args.Cf), schedule=schedule, ) @@ -469,6 +472,7 @@ def main() -> None: "wellboreC": cand.wellboreC, "phi": cand.phi, "h": cand.h, + "Ct": cand.Ct, "Cf": cand.Cf, "solver_objective": solver_obj["dual_log_objective"], "solver_p_obj": solver_obj["log_pressure_objective"], @@ -490,6 +494,7 @@ def main() -> None: "wellboreC": cand.wellboreC, "phi": cand.phi, "h": cand.h, + "Ct": cand.Ct, "Cf": cand.Cf, } ) @@ -542,6 +547,7 @@ def main() -> None: "wellboreC": float(args.wellboreC), "phi": float(args.phi), "h": float(args.h), + "Ct": float(args.Ct), "Cf": float(args.Cf), }, "n_q_cases_generated": int(len(q_cases)), diff --git a/ML/nmWTAI-ML/scripts/replay_pso_trace_screening.py b/ML/nmWTAI-ML/scripts/replay_pso_trace_screening.py index cb63bad..86ac0f2 100644 --- a/ML/nmWTAI-ML/scripts/replay_pso_trace_screening.py +++ b/ML/nmWTAI-ML/scripts/replay_pso_trace_screening.py @@ -39,7 +39,7 @@ from src.data.params import Params, Schedule from src.evaluation.autofit_objective import dual_log_objective -PARAM_COLUMNS = ["k", "skin", "wellboreC", "phi", "h", "Cf"] +PARAM_COLUMNS = ["k", "skin", "wellboreC", "phi", "h", "Ct", "Cf"] DEFAULT_KEEP_FRACS = [0.5, 0.6, 0.7] @@ -165,6 +165,7 @@ def params_from_row(row: dict) -> Params: wellboreC=values["wellboreC"], phi=values["phi"], h=values["h"], + Ct=values["Ct"], Cf=values["Cf"], ) diff --git a/ML/nmWTAI-ML/scripts/score_pso_candidates.py b/ML/nmWTAI-ML/scripts/score_pso_candidates.py index bbe48a6..2487adc 100644 --- a/ML/nmWTAI-ML/scripts/score_pso_candidates.py +++ b/ML/nmWTAI-ML/scripts/score_pso_candidates.py @@ -34,7 +34,7 @@ from src.data.params import Params, Schedule from src.evaluation.autofit_objective import dual_log_objective -PARAM_COLUMNS = ["k", "skin", "wellboreC", "phi", "h", "Cf"] +PARAM_COLUMNS = ["k", "skin", "wellboreC", "phi", "h", "Ct", "Cf"] def parse_args() -> argparse.Namespace: @@ -44,7 +44,7 @@ def parse_args() -> argparse.Namespace: "--candidates", required=True, type=str, - help="候选粒子 CSV,包含 particle_id,k,skin,wellboreC,phi,h,Cf", + help="候选粒子 CSV,包含 particle_id,k,skin,wellboreC,phi,h,Ct,Cf", ) parser.add_argument( "--trace-meta", @@ -127,6 +127,7 @@ def params_from_row(row: dict) -> Params: wellboreC=to_float(row.get("wellboreC")), phi=to_float(row.get("phi")), h=to_float(row.get("h")), + Ct=to_float(row.get("Ct")), Cf=to_float(row.get("Cf")), ) diff --git a/ML/nmWTAI-ML/scripts/validate_autofit_local_ranking.py b/ML/nmWTAI-ML/scripts/validate_autofit_local_ranking.py index 7bc0d9b..a836dd3 100644 --- a/ML/nmWTAI-ML/scripts/validate_autofit_local_ranking.py +++ b/ML/nmWTAI-ML/scripts/validate_autofit_local_ranking.py @@ -44,6 +44,7 @@ DEFAULT_CASE = { "wellboreC": 0.01, "phi": 0.0245, "h": 9.144, + "Ct": 1.0e-3, "Cf": 0.0004315, }, } @@ -82,6 +83,7 @@ def parse_args() -> argparse.Namespace: parser.add_argument("--wellboreC", type=float, default=DEFAULT_CASE["params"]["wellboreC"]) parser.add_argument("--phi", type=float, default=DEFAULT_CASE["params"]["phi"]) parser.add_argument("--h", type=float, default=DEFAULT_CASE["params"]["h"]) + parser.add_argument("--Ct", type=float, default=DEFAULT_CASE["params"]["Ct"]) parser.add_argument("--Cf", type=float, default=DEFAULT_CASE["params"]["Cf"]) return parser.parse_args() @@ -151,6 +153,7 @@ def build_params_from_args(args: argparse.Namespace, schedule: Schedule) -> Para wellboreC=float(args.wellboreC), phi=float(args.phi), h=float(args.h), + Ct=float(args.Ct), Cf=float(args.Cf), schedule=schedule, ) @@ -197,7 +200,7 @@ def predict_surrogate_curve( param_transform = param_feature_transform_from_meta(processed.get("meta", {})) params_vec = np.asarray( - [params.k, params.skin, params.wellboreC, params.phi, params.h, params.Cf], + [params.k, params.skin, params.wellboreC, params.phi, params.h, params.Ct, params.Cf], dtype=np.float32, ).reshape(1, -1) schedule_vec = build_schedule_vector(cfg, schedule).reshape(1, -1) @@ -314,6 +317,7 @@ def _sample_local_candidates(cfg: Config, base: Params, n: int, seed: int, span_ "wellboreC": float(base.wellboreC), "phi": float(base.phi), "h": float(base.h), + "Ct": float(base.Ct), "Cf": float(base.Cf), } @@ -352,6 +356,7 @@ def _sample_local_candidates(cfg: Config, base: Params, n: int, seed: int, span_ wellboreC=cand["wellboreC"], phi=cand["phi"], h=cand["h"], + Ct=cand["Ct"], Cf=cand["Cf"], schedule=base.schedule, ) @@ -367,6 +372,7 @@ def _params_to_dict(params: Params) -> dict: "wellboreC": float(params.wellboreC), "phi": float(params.phi), "h": float(params.h), + "Ct": float(params.Ct), "Cf": float(params.Cf), } @@ -487,6 +493,7 @@ def main() -> None: "wellboreC": cand.wellboreC, "phi": cand.phi, "h": cand.h, + "Ct": cand.Ct, "Cf": cand.Cf, "solver_objective": solver_obj["dual_log_objective"], "solver_p_obj": solver_obj["log_pressure_objective"], @@ -505,7 +512,7 @@ def main() -> None: "[warn] candidate attempt " f"{attempt_idx} skipped: {exc} | " f"k={cand.k:.6g}, skin={cand.skin:.6g}, C={cand.wellboreC:.6g}, " - f"phi={cand.phi:.6g}, h={cand.h:.6g}, Cf={cand.Cf:.6g}" + f"phi={cand.phi:.6g}, h={cand.h:.6g}, Ct={cand.Ct:.6g}, Cf={cand.Cf:.6g}" ) finally: if shared_runner is None: @@ -544,6 +551,7 @@ def main() -> None: "wellboreC": target_params.wellboreC, "phi": target_params.phi, "h": target_params.h, + "Ct": target_params.Ct, "Cf": target_params.Cf, }, "schedule": { @@ -580,6 +588,7 @@ def main() -> None: "wellboreC", "phi", "h", + "Ct", "Cf", "solver_objective", "solver_p_obj", @@ -600,7 +609,7 @@ def main() -> None: with open(failed_csv_path, "w", newline="", encoding="utf-8") as f: writer = csv.DictWriter( f, - fieldnames=["attempt_id", "reason", "k", "skin", "wellboreC", "phi", "h", "Cf"], + fieldnames=["attempt_id", "reason", "k", "skin", "wellboreC", "phi", "h", "Ct", "Cf"], ) writer.writeheader() writer.writerows(failed_rows) diff --git a/ML/nmWTAI-ML/scripts/validate_autofit_local_ranking_batch.py b/ML/nmWTAI-ML/scripts/validate_autofit_local_ranking_batch.py index 700187d..fc2df6b 100644 --- a/ML/nmWTAI-ML/scripts/validate_autofit_local_ranking_batch.py +++ b/ML/nmWTAI-ML/scripts/validate_autofit_local_ranking_batch.py @@ -255,7 +255,7 @@ def main() -> None: print( f"[target {target_id:03d}] " f"k={target_params.k:.6g}, skin={target_params.skin:.6g}, " - f"C={target_params.wellboreC:.6g}, phi={target_params.phi:.6g}, h={target_params.h:.6g}, " + f"C={target_params.wellboreC:.6g}, phi={target_params.phi:.6g}, h={target_params.h:.6g}, Ct={target_params.Ct:.6g}, " f"section={target_params.schedule.sectionIndex}, spans={span_fracs}" ) @@ -303,6 +303,7 @@ def main() -> None: "wellboreC": cand.wellboreC, "phi": cand.phi, "h": cand.h, + "Ct": cand.Ct, "Cf": cand.Cf, "solver_objective": solver_obj["dual_log_objective"], "solver_p_obj": solver_obj["log_pressure_objective"], @@ -329,6 +330,7 @@ def main() -> None: "target_wellboreC": target_params.wellboreC, "target_phi": target_params.phi, "target_h": target_params.h, + "target_Ct": target_params.Ct, "target_Cf": target_params.Cf, "target_sectionIndex": int(target_params.schedule.sectionIndex), "target_timeQ_json": json.dumps(target_params.schedule.timeQ), diff --git a/ML/nmWTAI-ML/src/data/dataset_generation.py b/ML/nmWTAI-ML/src/data/dataset_generation.py index aecd7c6..329def1 100644 --- a/ML/nmWTAI-ML/src/data/dataset_generation.py +++ b/ML/nmWTAI-ML/src/data/dataset_generation.py @@ -415,7 +415,7 @@ def _worker_simulate_parallel(args): wellboreC=float(params_dict["wellboreC"]), phi=float(params_dict["phi"]), h=float(params_dict["h"]), - Ct=float(params_dict.get("Ct", 1.0e-3)), + Ct=float(params_dict["Ct"]), Cf=float(params_dict["Cf"]), schedule=None, ) diff --git a/ML/nmWTAI-ML/src/data/params.py b/ML/nmWTAI-ML/src/data/params.py index ca24162..1402819 100644 --- a/ML/nmWTAI-ML/src/data/params.py +++ b/ML/nmWTAI-ML/src/data/params.py @@ -73,8 +73,8 @@ class Params: wellboreC: float phi: float h: float - Ct: float = 1.0e-3 - Cf: float = 4.315e-4 + Ct: float + Cf: float schedule: Optional[Schedule] = None def to_dict(self) -> Dict[str, float]: diff --git a/ML/nmWTAI-ML/src/data/preprocess.py b/ML/nmWTAI-ML/src/data/preprocess.py index 3a0a131..763b454 100644 --- a/ML/nmWTAI-ML/src/data/preprocess.py +++ b/ML/nmWTAI-ML/src/data/preprocess.py @@ -187,10 +187,7 @@ def preprocess_dataset( schedule_meta_names = _decode_attr_list(f.attrs.get("schedule_meta_names")) source_name_vocab = _decode_attr_list(f.attrs.get("source_name_vocab")) if param_names is None: - if x_params.shape[1] == 6: - param_names = ["k", "skin", "wellboreC", "phi", "h", "Cf"] - elif x_params.shape[1] == 7: - param_names = ["k", "skin", "wellboreC", "phi", "h", "Ct", "Cf"] + param_names = ["k", "skin", "wellboreC", "phi", "h", "Ct", "Cf"] schedule_meta = _ensure_2d("schedule_meta", f["schedule_meta"][:]) if "schedule_meta" in f else None family_name = _read_optional_string_dataset(f, "family_name")