模型代码增加参数

feature/Model-20260625
lvjunjie 4 weeks ago
parent 11833dc5a1
commit 5e731a3a3b

@ -63,6 +63,7 @@ DEFAULT_SINGLE_CASE = {
"wellboreC": 0.01, "wellboreC": 0.01,
"phi": 0.0245, "phi": 0.0245,
"h": 9.144, "h": 9.144,
"Ct": 1.0e-3,
"Cf": 0.0004315, "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("--wellboreC", type=float, default=DEFAULT_SINGLE_CASE["params"]["wellboreC"])
parser.add_argument("--phi", type=float, default=DEFAULT_SINGLE_CASE["params"]["phi"]) 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("--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("--Cf", type=float, default=DEFAULT_SINGLE_CASE["params"]["Cf"])
parser.add_argument( parser.add_argument(
"--well-index", "--well-index",
@ -301,6 +303,7 @@ def build_params_from_args(args: argparse.Namespace, cfg: Config, schedule: Sche
wellboreC=float(args.wellboreC), wellboreC=float(args.wellboreC),
phi=float(args.phi), phi=float(args.phi),
h=float(args.h), h=float(args.h),
Ct=float(args.Ct),
Cf=resolve_cf(args, cfg), Cf=resolve_cf(args, cfg),
schedule=schedule, schedule=schedule,
) )
@ -412,7 +415,7 @@ def predict_surrogate_curve(
# 构建参数特征向量 # 构建参数特征向量
# 顺序必须与训练阶段保持一致 # 顺序必须与训练阶段保持一致
params_vec = np.asarray( 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, dtype=np.float32,
).reshape(1, -1) ).reshape(1, -1)
# 将流量制度 schedule 编码成模型输入向量 # 将流量制度 schedule 编码成模型输入向量
@ -464,7 +467,7 @@ def plot_comparison(
fig.suptitle( fig.suptitle(
"Solver vs Surrogate\n" "Solver vs Surrogate\n"
f"k={params.k:.6g}, skin={params.skin:.6g}, wellboreC={params.wellboreC:.6g}, " 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"sectionIndex={schedule.sectionIndex}, timeQ={schedule.timeQ}, q={schedule.q}\n"
f"use_schedule={use_schedule}, model={model_path.name}, " f"use_schedule={use_schedule}, model={model_path.name}, "
f"Overall RMSE={overall['rmse']:.4f}, MAE={overall['mae']:.4f}, " f"Overall RMSE={overall['rmse']:.4f}, MAE={overall['mae']:.4f}, "
@ -578,6 +581,7 @@ def main() -> None:
"wellboreC": params.wellboreC, "wellboreC": params.wellboreC,
"phi": params.phi, "phi": params.phi,
"h": params.h, "h": params.h,
"Ct": params.Ct,
"Cf": params.Cf, "Cf": params.Cf,
}, },
"schedule": { "schedule": {

@ -50,6 +50,7 @@ THETA_STAR = {
"wellboreC": 0.03024150790038185, "wellboreC": 0.03024150790038185,
"phi": 0.2736409306526184, "phi": 0.2736409306526184,
"h": 21.499309979069142, "h": 21.499309979069142,
"Ct": 1.0e-3,
"Cf": 4.315e-4, "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("--wellboreC", type=float, default=THETA_STAR["wellboreC"])
parser.add_argument("--phi", type=float, default=THETA_STAR["phi"]) parser.add_argument("--phi", type=float, default=THETA_STAR["phi"])
parser.add_argument("--h", type=float, default=THETA_STAR["h"]) 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"]) parser.add_argument("--Cf", type=float, default=THETA_STAR["Cf"])
return parser.parse_args() return parser.parse_args()
@ -120,6 +122,7 @@ def make_theta_params(args: argparse.Namespace, schedule: Schedule) -> Params:
wellboreC=float(args.wellboreC), wellboreC=float(args.wellboreC),
phi=float(args.phi), phi=float(args.phi),
h=float(args.h), h=float(args.h),
Ct=float(args.Ct),
Cf=float(args.Cf), Cf=float(args.Cf),
schedule=schedule, schedule=schedule,
) )
@ -469,6 +472,7 @@ def main() -> None:
"wellboreC": cand.wellboreC, "wellboreC": cand.wellboreC,
"phi": cand.phi, "phi": cand.phi,
"h": cand.h, "h": cand.h,
"Ct": cand.Ct,
"Cf": cand.Cf, "Cf": cand.Cf,
"solver_objective": solver_obj["dual_log_objective"], "solver_objective": solver_obj["dual_log_objective"],
"solver_p_obj": solver_obj["log_pressure_objective"], "solver_p_obj": solver_obj["log_pressure_objective"],
@ -490,6 +494,7 @@ def main() -> None:
"wellboreC": cand.wellboreC, "wellboreC": cand.wellboreC,
"phi": cand.phi, "phi": cand.phi,
"h": cand.h, "h": cand.h,
"Ct": cand.Ct,
"Cf": cand.Cf, "Cf": cand.Cf,
} }
) )
@ -542,6 +547,7 @@ def main() -> None:
"wellboreC": float(args.wellboreC), "wellboreC": float(args.wellboreC),
"phi": float(args.phi), "phi": float(args.phi),
"h": float(args.h), "h": float(args.h),
"Ct": float(args.Ct),
"Cf": float(args.Cf), "Cf": float(args.Cf),
}, },
"n_q_cases_generated": int(len(q_cases)), "n_q_cases_generated": int(len(q_cases)),

@ -39,7 +39,7 @@ from src.data.params import Params, Schedule
from src.evaluation.autofit_objective import dual_log_objective 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] DEFAULT_KEEP_FRACS = [0.5, 0.6, 0.7]
@ -165,6 +165,7 @@ def params_from_row(row: dict) -> Params:
wellboreC=values["wellboreC"], wellboreC=values["wellboreC"],
phi=values["phi"], phi=values["phi"],
h=values["h"], h=values["h"],
Ct=values["Ct"],
Cf=values["Cf"], Cf=values["Cf"],
) )

@ -34,7 +34,7 @@ from src.data.params import Params, Schedule
from src.evaluation.autofit_objective import dual_log_objective 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: def parse_args() -> argparse.Namespace:
@ -44,7 +44,7 @@ def parse_args() -> argparse.Namespace:
"--candidates", "--candidates",
required=True, required=True,
type=str, 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( parser.add_argument(
"--trace-meta", "--trace-meta",
@ -127,6 +127,7 @@ def params_from_row(row: dict) -> Params:
wellboreC=to_float(row.get("wellboreC")), wellboreC=to_float(row.get("wellboreC")),
phi=to_float(row.get("phi")), phi=to_float(row.get("phi")),
h=to_float(row.get("h")), h=to_float(row.get("h")),
Ct=to_float(row.get("Ct")),
Cf=to_float(row.get("Cf")), Cf=to_float(row.get("Cf")),
) )

@ -44,6 +44,7 @@ DEFAULT_CASE = {
"wellboreC": 0.01, "wellboreC": 0.01,
"phi": 0.0245, "phi": 0.0245,
"h": 9.144, "h": 9.144,
"Ct": 1.0e-3,
"Cf": 0.0004315, "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("--wellboreC", type=float, default=DEFAULT_CASE["params"]["wellboreC"])
parser.add_argument("--phi", type=float, default=DEFAULT_CASE["params"]["phi"]) 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("--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"]) parser.add_argument("--Cf", type=float, default=DEFAULT_CASE["params"]["Cf"])
return parser.parse_args() return parser.parse_args()
@ -151,6 +153,7 @@ def build_params_from_args(args: argparse.Namespace, schedule: Schedule) -> Para
wellboreC=float(args.wellboreC), wellboreC=float(args.wellboreC),
phi=float(args.phi), phi=float(args.phi),
h=float(args.h), h=float(args.h),
Ct=float(args.Ct),
Cf=float(args.Cf), Cf=float(args.Cf),
schedule=schedule, schedule=schedule,
) )
@ -197,7 +200,7 @@ def predict_surrogate_curve(
param_transform = param_feature_transform_from_meta(processed.get("meta", {})) param_transform = param_feature_transform_from_meta(processed.get("meta", {}))
params_vec = np.asarray( 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, dtype=np.float32,
).reshape(1, -1) ).reshape(1, -1)
schedule_vec = build_schedule_vector(cfg, schedule).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), "wellboreC": float(base.wellboreC),
"phi": float(base.phi), "phi": float(base.phi),
"h": float(base.h), "h": float(base.h),
"Ct": float(base.Ct),
"Cf": float(base.Cf), "Cf": float(base.Cf),
} }
@ -352,6 +356,7 @@ def _sample_local_candidates(cfg: Config, base: Params, n: int, seed: int, span_
wellboreC=cand["wellboreC"], wellboreC=cand["wellboreC"],
phi=cand["phi"], phi=cand["phi"],
h=cand["h"], h=cand["h"],
Ct=cand["Ct"],
Cf=cand["Cf"], Cf=cand["Cf"],
schedule=base.schedule, schedule=base.schedule,
) )
@ -367,6 +372,7 @@ def _params_to_dict(params: Params) -> dict:
"wellboreC": float(params.wellboreC), "wellboreC": float(params.wellboreC),
"phi": float(params.phi), "phi": float(params.phi),
"h": float(params.h), "h": float(params.h),
"Ct": float(params.Ct),
"Cf": float(params.Cf), "Cf": float(params.Cf),
} }
@ -487,6 +493,7 @@ def main() -> None:
"wellboreC": cand.wellboreC, "wellboreC": cand.wellboreC,
"phi": cand.phi, "phi": cand.phi,
"h": cand.h, "h": cand.h,
"Ct": cand.Ct,
"Cf": cand.Cf, "Cf": cand.Cf,
"solver_objective": solver_obj["dual_log_objective"], "solver_objective": solver_obj["dual_log_objective"],
"solver_p_obj": solver_obj["log_pressure_objective"], "solver_p_obj": solver_obj["log_pressure_objective"],
@ -505,7 +512,7 @@ def main() -> None:
"[warn] candidate attempt " "[warn] candidate attempt "
f"{attempt_idx} skipped: {exc} | " f"{attempt_idx} skipped: {exc} | "
f"k={cand.k:.6g}, skin={cand.skin:.6g}, C={cand.wellboreC:.6g}, " 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: finally:
if shared_runner is None: if shared_runner is None:
@ -544,6 +551,7 @@ def main() -> None:
"wellboreC": target_params.wellboreC, "wellboreC": target_params.wellboreC,
"phi": target_params.phi, "phi": target_params.phi,
"h": target_params.h, "h": target_params.h,
"Ct": target_params.Ct,
"Cf": target_params.Cf, "Cf": target_params.Cf,
}, },
"schedule": { "schedule": {
@ -580,6 +588,7 @@ def main() -> None:
"wellboreC", "wellboreC",
"phi", "phi",
"h", "h",
"Ct",
"Cf", "Cf",
"solver_objective", "solver_objective",
"solver_p_obj", "solver_p_obj",
@ -600,7 +609,7 @@ def main() -> None:
with open(failed_csv_path, "w", newline="", encoding="utf-8") as f: with open(failed_csv_path, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter( writer = csv.DictWriter(
f, 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.writeheader()
writer.writerows(failed_rows) writer.writerows(failed_rows)

@ -255,7 +255,7 @@ def main() -> None:
print( print(
f"[target {target_id:03d}] " f"[target {target_id:03d}] "
f"k={target_params.k:.6g}, skin={target_params.skin:.6g}, " 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}" f"section={target_params.schedule.sectionIndex}, spans={span_fracs}"
) )
@ -303,6 +303,7 @@ def main() -> None:
"wellboreC": cand.wellboreC, "wellboreC": cand.wellboreC,
"phi": cand.phi, "phi": cand.phi,
"h": cand.h, "h": cand.h,
"Ct": cand.Ct,
"Cf": cand.Cf, "Cf": cand.Cf,
"solver_objective": solver_obj["dual_log_objective"], "solver_objective": solver_obj["dual_log_objective"],
"solver_p_obj": solver_obj["log_pressure_objective"], "solver_p_obj": solver_obj["log_pressure_objective"],
@ -329,6 +330,7 @@ def main() -> None:
"target_wellboreC": target_params.wellboreC, "target_wellboreC": target_params.wellboreC,
"target_phi": target_params.phi, "target_phi": target_params.phi,
"target_h": target_params.h, "target_h": target_params.h,
"target_Ct": target_params.Ct,
"target_Cf": target_params.Cf, "target_Cf": target_params.Cf,
"target_sectionIndex": int(target_params.schedule.sectionIndex), "target_sectionIndex": int(target_params.schedule.sectionIndex),
"target_timeQ_json": json.dumps(target_params.schedule.timeQ), "target_timeQ_json": json.dumps(target_params.schedule.timeQ),

@ -415,7 +415,7 @@ def _worker_simulate_parallel(args):
wellboreC=float(params_dict["wellboreC"]), wellboreC=float(params_dict["wellboreC"]),
phi=float(params_dict["phi"]), phi=float(params_dict["phi"]),
h=float(params_dict["h"]), h=float(params_dict["h"]),
Ct=float(params_dict.get("Ct", 1.0e-3)), Ct=float(params_dict["Ct"]),
Cf=float(params_dict["Cf"]), Cf=float(params_dict["Cf"]),
schedule=None, schedule=None,
) )

@ -73,8 +73,8 @@ class Params:
wellboreC: float wellboreC: float
phi: float phi: float
h: float h: float
Ct: float = 1.0e-3 Ct: float
Cf: float = 4.315e-4 Cf: float
schedule: Optional[Schedule] = None schedule: Optional[Schedule] = None
def to_dict(self) -> Dict[str, float]: def to_dict(self) -> Dict[str, float]:

@ -187,10 +187,7 @@ def preprocess_dataset(
schedule_meta_names = _decode_attr_list(f.attrs.get("schedule_meta_names")) schedule_meta_names = _decode_attr_list(f.attrs.get("schedule_meta_names"))
source_name_vocab = _decode_attr_list(f.attrs.get("source_name_vocab")) source_name_vocab = _decode_attr_list(f.attrs.get("source_name_vocab"))
if param_names is None: if param_names is None:
if x_params.shape[1] == 6: param_names = ["k", "skin", "wellboreC", "phi", "h", "Ct", "Cf"]
param_names = ["k", "skin", "wellboreC", "phi", "h", "Cf"]
elif x_params.shape[1] == 7:
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 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") family_name = _read_optional_string_dataset(f, "family_name")

Loading…
Cancel
Save