project: # 项目基础信息 name: pta_surrogate # 项目名称或流量制度族名称 paths: project_root: ".." data_dir: "data" temp_dir: "data/temp" samples_dir: "data/samples" processed_dir: "data/processed" models_dir: "models" cpp: training_exe: "../Training/Release/training.exe" runner_exe: "../Training/Release/runner.exe" hx_dll: "../Training/Release/HX_NWTM.dll" license_dat: "../../Bin/Res/license/HXNWTM_license.dat" dataset_runtime: auto_build_dataset_bin: true # 缺少 dataset.bin 时是否自动调用 training.exe 生成 use_runner_server: true # 是否使用常驻 runner 进程加速批量正演 runner_timeout_sec: 240 # 单次 C++ 正演求解超时时间,单位秒 streaming_hdf5: # HDF5 样本文件流式写入设置 write_batch_size: 2000 # HDF5 每累计多少条样本批量写入一次 chunk_rows: 2048 # HDF5 数据分块行数,影响读写效率 compression: null # HDF5 压缩方式,null 表示不压缩 parallel: # 并行样本生成设置 n_workers: 36 # 并行生成样本的工作进程数量 max_in_flight: 48 # 同时提交但尚未完成的最大任务数 checkpoint_every_n: 5000 # 每生成多少条样本输出一次检查点 checkpoint_every_sec: 180.0 # 每隔多少秒输出一次检查点 generation: # 数据集生成规模与随机性设置 n_samples: 10000 # 目标有效样本数量 random_seed: 42 # 随机种子,用于复现实验 max_rounds: 999999 # 最大采样轮数,防止生成过程无限循环 max_total_requested: 6000000 # 最多请求求解器计算的候选样本数 max_fail_examples_per_reason: 50 # 每类失败原因最多保存的示例数量 params: # 储层与井筒物理参数采样设置 all_physical_param_names: ["k", "skin", "wellboreC", "phi", "h", "Cf"] # 写入数据集的完整物理参数列表 active_param_names: ["k", "skin", "wellboreC", "phi", "h"] # 参与采样变化的物理参数列表 log_params: ["k", "wellboreC", "h"] # 采样时采用对数尺度的物理参数 ranges: # 各物理参数采样范围 k: [1.0e-4, 100.0] # 渗透率采样范围 skin: [-10.0, 10.0] # 表皮系数采样范围 wellboreC: [1.0e-4, 2.0] # 井筒储集系数采样范围 phi: [1.0e-2, 0.50] # 孔隙度采样范围 h: [2.0, 100.0] # 储层厚度采样范围 Cf: [1.0e-6, 5.0e-3] # 岩石压缩系数采样范围 fixed_params: # 固定不参与采样的物理参数 Cf: enabled: true # 是否启用该功能或固定该参数 value: 4.315e-4 # 固定参数取值 sampling_method: "sobol" # 参数空间采样方法,如 Sobol、LHS 或 uniform targeted_sampling: # 困难区域定向采样设置 enabled: true # 是否启用该功能或固定该参数 strategies: # 按参数分别定义定向采样策略 k: components: # 分段采样组件列表 - {prob: 0.55, range: [1.0e-4, 1.0e-1], scale: "log"} # 定向采样组件:prob 为概率,range 为范围,scale 为采样尺度 - {prob: 0.30, range: [1.0e-1, 1.0], scale: "log"} # 定向采样组件:prob 为概率,range 为范围,scale 为采样尺度 - {prob: 0.15, range: [1.0, 100.0], scale: "log"} # 定向采样组件:prob 为概率,range 为范围,scale 为采样尺度 skin: components: # 分段采样组件列表 - {prob: 0.35, range: [-10.0, -3.0], scale: "linear"} # 定向采样组件:prob 为概率,range 为范围,scale 为采样尺度 - {prob: 0.30, range: [-3.0, 3.0], scale: "linear"} # 定向采样组件:prob 为概率,range 为范围,scale 为采样尺度 - {prob: 0.35, range: [3.0, 10.0], scale: "linear"} # 定向采样组件:prob 为概率,range 为范围,scale 为采样尺度 wellboreC: components: # 分段采样组件列表 - {prob: 0.60, range: [1.0e-4, 5.0e-2], scale: "log"} # 定向采样组件:prob 为概率,range 为范围,scale 为采样尺度 - {prob: 0.25, range: [5.0e-2, 5.0e-1], scale: "log"} # 定向采样组件:prob 为概率,range 为范围,scale 为采样尺度 - {prob: 0.15, range: [5.0e-1, 2.0], scale: "log"} # 定向采样组件:prob 为概率,range 为范围,scale 为采样尺度 curve_processing: # 双对数曲线清洗与重采样设置 n_time_points: 160 # 每条双对数曲线统一重采样的时间点数 min_valid_points: 40 # 有效曲线至少需要的原始点数 feature_epsilon: 1.0e-12 # 取对数和除法时使用的最小保护值 use_slope_feature: true # 是否额外拼接压力曲线斜率特征 max_time_cap: 3000.0 # 曲线重采样允许的最大时间上限 min_time_floor: 1.0e-6 # 曲线重采样允许的最小时间下限 fixed_time_range: null # 固定重采样时间范围,null 表示按样本自身范围 max_nonpos_deriv_frac: 0.80 # 允许非正压力导数点占比的最大阈值 p_log10_max: 6.0 # 压力曲线最大值的 log10 上限,用于过滤异常样本 d_log10_max: 6.0 # 导数曲线最大值的 log10 上限,用于过滤异常样本 outlier_factor: 3.0 # 异常值过滤系数,当前主要作为保留配置 schedule: # 流量制度生成与写入设置 write_schedule_to_params_bin: true # 写入 params.bin 时是否附带流量制度 max_points: 512 # 单个流量制度最多保留的流量段数量 generation_mode: "family_random" # 流量制度生成模式 case_schedule: # 固定基准流量制度 timeQ: [12.0, 12.0, 12.0, 48.0, 72.0] # 各流量段持续时间序列 q: [158.987, 190.785, 222.582, 238.481, 0.0] # 各流量段产量序列,末段为 0 通常表示关井 default_section_index: 5 # 默认用于计算双对数曲线的流动段索引 section_policy: # 流动段索引选择策略 mode: "fixed_last" # 流动段索引选择策略名称 fixed_value: 5 # 固定流动段索引取值 case_neighborhood: # 基准流量制度邻域扰动设置 dt_jitter_rel: 0.30 # 流量段持续时间相对扰动幅度 q_jitter_rel: 0.25 # 产量相对扰动幅度 shutin_dt_jitter_rel: 0.20 # 关井段持续时间相对扰动幅度 keep_monotonic_prod: false # 扰动后是否保持生产段产量单调 keep_last_q_zero: true # 是否强制最后一个流量段产量为 0 min_dt: 0.05 # 流量段最小持续时间 q_min: 10.0 # 扰动后产量下限 q_max: 5000.0 # 扰动后产量上限 family_random: # 随机流量制度族生成设置 families: # 流量制度类型及抽样概率 - {name: "flat_tail_shutin", prob: 0.10} # 平稳生产后关井的流量制度族 - {name: "inc_tail_shutin", prob: 0.40} # 递增生产后关井的流量制度族 - {name: "dec_tail_shutin", prob: 0.15} # 递减生产后关井的流量制度族 - {name: "mild_step_tail_shutin", prob: 0.35} # 轻微阶跃变化后关井的流量制度族 n_prod_sections_range: [3, 5] # 生产流量段数量范围 prod_total_time_range: [24.0, 220.0] # 生产阶段总持续时间范围 shutin_dt_range: [12.0, 140.0] # 关井段持续时间范围 q_range: [50.0, 500.0] # 随机生成产量范围 duration_lognormal_mu: 1.6 # 生产段持续时间对数正态分布均值参数 duration_lognormal_sigma: 0.7 # 生产段持续时间对数正态分布标准差参数 max_rel_step: 2.0 # 相邻生产段产量最大相对跳变倍数 mult_noise_sigma: 0.05 # 产量乘性随机扰动强度 step_jump_rel_range: [1.20, 1.60] # 阶跃型流量制度的跳变幅度范围 canonicalize_for_model: # 输入模型前的流量制度规范化设置 remove_shutin: false # 模型编码前是否移除关井段 q_thr: 1.0e-6 # 判断关井或零产量的阈值 merge_same_q: true # 是否合并相邻近似相同产量的流量段 merge_rel_tol: 1.0e-4 # 判断相邻产量相同的相对容差 timegrid_encoding: # 流量制度时间网格编码设置 n_u_points: 256 # 流量制度编码的统一时间网格点数 grid: "log" # 流量制度编码使用的时间网格类型 include_cum: true # 是否在流量编码中加入累计产量通道 include_dq: true # 是否在流量编码中加入产量变化量通道 include_shutin: false # 是否在流量编码中加入关井标志通道 q_eps: 1.0e-12 # 流量归一化时的最小保护值 normalize_mode: "global" # 流量制度编码归一化方式 q_global_max: 5000.0 # 全局产量归一化上限 cum_global_max: 25000000.0 # 累计产量归一化上限 shutin_thr: 1.0e-6 # 关井通道判定阈值 dataset_split: # 训练/验证/测试集划分设置 test_ratio: 0.15 # 测试集比例 val_ratio: 0.15 # 验证集比例 random_seed: 42 # 随机种子,用于复现实验 forward_model: # 正演代理模型结构配置 activation: "gelu" # 网络激活函数类型 norm: "layernorm" # 网络归一化层类型 dropout: 0.10 # Dropout 比例 hidden_dims: [512, 512, 256] # 正演代理模型 MLP 隐藏层维度 training: # 模型训练超参数设置 seed: 42 # 训练随机种子 learning_rate: 1.0e-3 # 初始学习率 weight_decay: 5.0e-4 # 权重衰减系数 batch_size: 256 # 训练批大小 epochs: 220 # 最大训练轮数 patience: 30 # 早停或调度器等待轮数 min_delta: 1.0e-6 # 认为验证集有改进所需的最小变化量 grad_clip_norm: 1.0 # 梯度裁剪范数上限 loss_beta: 0.5 # Huber/SmoothL1 损失的 beta 参数 scheduler: # 学习率调度器设置 type: "plateau" # 学习率调度器类型 factor: 0.5 # 学习率衰减倍数 patience: 8 # 早停或调度器等待轮数 threshold: 1.0e-6 # 调度器判定改进的阈值 cooldown: 0 # 学习率衰减后的冷却轮数 min_lr: 1.0e-6 # 学习率下限 T_max: 50 # 余弦退火调度周期参数 eta_min: 1.0e-6 # 余弦退火最小学习率