From 7e5255203ef97fd5b8cdb4a685a5c24b9ce9a4fe Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Fri, 18 Sep 2026 17:33:08 +0800 Subject: [PATCH] =?UTF-8?q?refactor(nmNum):=20=E7=BB=9F=E4=B8=80=20LM=20?= =?UTF-8?q?=E5=BD=A2=E7=8A=B6=E9=98=B6=E6=AE=B5=E8=81=94=E5=90=88=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E4=B8=8E=E6=89=A9=E6=AD=A5=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除每轮半长专项试探及配套渗透率补偿 - 保留局部窗口 Fisher 筛选,每轮全局步联合求解全部有效且有响应的非井储、表皮参数 - 将可靠方向扩步推广至所有形状调整参数,扩步失败或效果更差时保留原候选 - 保留井储表皮冻结、条件回检及完整轮次停滞确认 - 更新拟合轨迹策略元数据并清理失效中文翻译 --- Bin/Config/Lang/cn/nmNum_cn.qm | Bin 147547 -> 147235 bytes Bin/Config/Lang/cn/nmNum_cn.ts | 8 - .../nmCalculation/nmCalculationAutoFitLM.cpp | 158 +++--------------- 3 files changed, 27 insertions(+), 139 deletions(-) diff --git a/Bin/Config/Lang/cn/nmNum_cn.qm b/Bin/Config/Lang/cn/nmNum_cn.qm index b6dbcf60ea14d35f257b5c0003b959306c276013..13ec7e77ea8dafe2036f7f45513f36cceb58bd70 100644 GIT binary patch delta 13644 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 delta 13894 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 diff --git a/Bin/Config/Lang/cn/nmNum_cn.ts b/Bin/Config/Lang/cn/nmNum_cn.ts index 302d0278..28acd643 100644 --- a/Bin/Config/Lang/cn/nmNum_cn.ts +++ b/Bin/Config/Lang/cn/nmNum_cn.ts @@ -1276,14 +1276,6 @@ Reason: %1 total target reached during shape fitting 形状调整期间已达到总误差目标 - - Half-length exploration accepted: L=%1, shape error=%2, total error=%3. - 裂缝半长探索结果已接受:半长=%1,形状误差=%2,整体误差=%3。 - - - fresh sensitivity after half-length exploration - 裂缝半长探索后重建灵敏度 - fresh sensitivity at joint shape entry 进入联合形状调整时重建灵敏度 diff --git a/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp b/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp index 7ff0db33..2af9406a 100644 --- a/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp +++ b/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp @@ -496,25 +496,6 @@ static bool solveTrustRegionLinearSystem( return true; } -// 半长候选只由当前值和用户边界生成;投影后去重,不把某个半长写成目标值。 -static QVector trustRegionShapeLengthTrials(double value, double lower, double upper) -{ - QVector trials; - if(!isFiniteNumber(value) || !isFiniteNumber(lower) || !isFiniteNumber(upper) || upper <= lower) - return trials; - const double raw[] = {value * 2.0, value * 0.5, value * 2.0 < upper ? upper : lower}; - for(int i = 0; i < 3; ++i) { - const double trial = qBound(lower, raw[i], upper); - const double tolerance = 1.0e-12 * qMax(1.0, qAbs(trial)); - if(qAbs(trial - value) <= tolerance) continue; - bool duplicate = false; - for(int j = 0; j < trials.size(); ++j) - if(qAbs(trial - trials[j]) <= tolerance) duplicate = true; - if(!duplicate) trials.append(trial); - } - return trials; -} - // Fisher 仅作为当前归一化坐标下的局部信息矩阵,不用于统计置信区间。 struct TrustRegionFisher { @@ -1169,7 +1150,7 @@ void nmCalculationAutoFitLM::writeTraceMetaFile() QTextStream out(&metaFile); out << "{\n"; - out << " \"schema_version\": 20,\n"; + out << " \"schema_version\": 21,\n"; out << " \"strategy\": \"permeability_height_then_shape_then_joint_lm\",\n"; out << " \"shape_priority\": \"storage_then_skin_then_shape_without_wellbore_then_optional_wellbore_recheck\",\n"; out << " \"shape_metric\": \"pressure_and_derivative_log_slopes_81_points_lag_8\",\n"; @@ -1178,11 +1159,10 @@ void nmCalculationAutoFitLM::writeTraceMetaFile() out << " \"early_wellbore_total_constraint\": false,\n"; out << " \"shape_stage_total_tolerance\": \"max(0.02, 25% of stage entry total)\",\n"; out << " \"shape_wellbore_parameters_frozen\": true,\n"; - out << " \"shape_sensitivity_refresh\": \"full Jacobian at joint shape entry and after accepted length exploration\",\n"; - out << " \"shape_length_exploration\": \"each complete shape round: after 3 ordinary candidates or before round completion; bounded 2x, 0.5x and far-bound trials with optional permeability correction\",\n"; - out << " \"shape_round_extra_evaluation_limit\": 8,\n"; - out << " \"shape_expansion_policy\": \"Dfc joint step up to 2x when actual rho exceeds 0.75; retain ordinary step on failure\",\n"; - out << " \"stage2_budget\": \"adaptive, no fixed iteration or evaluation quota; full window/global/length rounds, 2 ineffective rounds then fresh-J confirmation\",\n"; + out << " \"shape_sensitivity_refresh\": \"full Jacobian at joint shape entry and stagnation confirmation\",\n"; + out << " \"shape_expansion_policy\": \"one expansion per reliable shape direction, up to 2x when actual rho exceeds 0.75; retain ordinary step on failure\",\n"; + out << " \"shape_global_parameter_selection\": \"all_valid_non_wellbore_columns_with_positive_response\",\n"; + out << " \"stage2_budget\": \"adaptive, no fixed iteration or evaluation quota; full window/global rounds, 2 ineffective rounds then fresh-J confirmation\",\n"; out << " \"shape_round_improvement_threshold\": \"max(0.0001, 1% of round entry shape loss)\",\n"; out << " \"iteration_count_scope\": \"max_iterations applies to total-stage LM; trace iteration remains cumulative\",\n"; out << " \"wellbore_recheck_trigger\": \"early loss exceeds initial early-stage exit by max(0.0001, 10%)\",\n"; @@ -2170,13 +2150,6 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() int shapeRoundNumber = 0; int ineffectiveShapeRounds = 0; bool shapeConfirmationRequested = false; - int shapeCandidateCount = 0; - const int fractureLengthColumn = m_enabledParamIndices.indexOf(6); - const int conductivityColumn = m_enabledParamIndices.indexOf(5); - // 每轮探索有限个候选,但不会因全流程累计次数截断半长与渗透率组合。 - const int maximumShapeExplorationEvaluations = 8; - int shapeExplorationEvaluations = 0; - bool shapeExplorationDone = fractureLengthColumn < 0; const int storageColumn = m_enabledParamIndices.indexOf(2); const int skinColumn = m_enabledParamIndices.indexOf(1); bool hasRemainingShapeParameters = false; @@ -2301,79 +2274,6 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() trustRadius = 0.12; damping = 0.01; }; - auto exploreShapeLengths = [&]() -> bool { - if(shapeExplorationDone || !jointShapeStarted || earlyShapeStage || wellboreRecheck) - return false; - const TrustRegionEvaluation base = current; - TrustRegionEvaluation best; - const QVector trials = trustRegionShapeLengthTrials(base.parameters[fractureLengthColumn], - m_parameterLower[6], m_parameterUpper[6]); - const int explorationLimit = qMin(maximumShapeExplorationEvaluations, shapeExplorationEvaluations + 6); - auto canEvaluate = [&]() -> bool { - return shapeExplorationEvaluations < explorationLimit && processPauseAndStop(); - }; - auto keepBetter = [&](const TrustRegionEvaluation& point) { - if(acceptable(point, base) && (!best.valid || point.breakdown.shapeLoss < best.breakdown.shapeLoss || - (point.breakdown.shapeLoss == best.breakdown.shapeLoss && point.fitness < best.fitness))) best = point; - }; - for(int i = 0; i < trials.size() && canEvaluate(); ++i) { - TrustRegionEvaluation probe; - probe.parameters = base.parameters; - probe.parameters[fractureLengthColumn] = trials[i]; - probe.coordinates = coordinatesFromParameters(probe.parameters); - ++shapeExplorationEvaluations; - probe.valid = evaluateTrustRegionPoint(probe.parameters, &probe.fitness, - &probe.breakdown, &probe.curve, &probe.elapsedMs); - writeTraceRow(m_currentIteration, fractureLengthColumn, "shape_length_probe", probe.parameters, - probe.fitness, probe.valid, probe.elapsedMs, probe.valid ? "probe_valid" : "solver_invalid", - probe.valid ? &probe.breakdown : nullptr); - if(probe.valid) { - keepBetter(probe); - // 半长点即使暂时超出总误差上限,仍允许一次渗透率补偿后验收组合。 - // 沿用高度预调的有符号偏差与初始斜率 -1,远点修正必须真实求解验证。 - if(permeabilityColumn >= 0 && probe.breakdown.verticalReliable && - qAbs(probe.breakdown.verticalCommonBias) > 0.01 && m_parameterLower[0] > 0.0 && - m_parameterUpper[0] > m_parameterLower[0] && canEvaluate()) { - TrustRegionEvaluation corrected; - corrected.parameters = probe.parameters; - const double logRange = qLn(m_parameterUpper[0]) - qLn(m_parameterLower[0]); - const double change = qBound(-0.30 * logRange, probe.breakdown.verticalCommonBias, 0.30 * logRange); - const double k = probe.parameters[permeabilityColumn]; - corrected.parameters[permeabilityColumn] = qBound(m_parameterLower[0], k * qExp(change), m_parameterUpper[0]); - corrected.coordinates = coordinatesFromParameters(corrected.parameters); - if(qAbs(qLn(corrected.parameters[permeabilityColumn] / k)) > 1.0e-5) { - ++shapeExplorationEvaluations; - corrected.valid = evaluateTrustRegionPoint(corrected.parameters, &corrected.fitness, - &corrected.breakdown, &corrected.curve, &corrected.elapsedMs); - writeTraceRow(m_currentIteration, permeabilityColumn, "shape_length_height_probe", corrected.parameters, - corrected.fitness, corrected.valid, corrected.elapsedMs, corrected.valid ? "probe_valid" : "solver_invalid", - corrected.valid ? &corrected.breakdown : nullptr); - if(corrected.valid) keepBetter(corrected); - } - } - } - restoreEvaluationState(base); - } - restoreEvaluationState(base); - // 停止时不把未完成的探索记为完成;正常情况下至多六次调用即可覆盖本轮候选。 - if(m_shouldStop) return false; - shapeExplorationDone = true; - if(!best.valid) return false; - acceptPoint(best); - // 不用跨越不同半长基点的割线修补旧模型;在最终选中的新点重新测完整 J。 - jacobian.clear(); - reuseSensitivityForNextStage(); - rebuildRequested = true; - rebuildReason = QT_TR_NOOP("fresh sensitivity after half-length exploration"); - effectiveImprovementBaseline = current.breakdown.shapeLoss; - writeTraceRow(m_currentIteration, fractureLengthColumn, "shape_exploration_accept", current.parameters, - current.fitness, true, 0, "length_permeability_combination_accepted", ¤t.breakdown); - emit logMessageGenerated(tr("Half-length exploration accepted: L=%1, shape error=%2, total error=%3.") - .arg(current.parameters[fractureLengthColumn], 0, 'g', 6) - .arg(current.breakdown.shapeLoss, 0, 'g', 6).arg(current.fitness, 0, 'g', 6)); - return true; - }; - auto enterTotalStage = [&](const QString& reason) { const bool finishedRecheck = wellboreRecheck; totalIterations = 0; @@ -2461,9 +2361,7 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() auto completeShapeSearchRound = [&]() { if(!shapeStage || earlyShapeStage || !globalFallbackAttempted) return; - // 即使所有局部方向都不可行,也先完成半长组合搜索。大步接受后需在新点重走窗口。 - if(!shapeExplorationDone && exploreShapeLengths()) return; - if(m_shouldStop || !shapeExplorationDone) return; + if(m_shouldStop) return; const double required = qMax(1.0e-4, 0.01 * shapeRoundBaseline); const double improvement = shapeRoundBaseline - current.breakdown.shapeLoss; const bool improved = improvement >= required; @@ -2481,13 +2379,10 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() finishShapeStage(tr("no significant improvement in a complete round after fresh sensitivity confirmation")); return; } - // 下一轮重新覆盖窗口、全局和半长;单步的小改善不会把当前一轮无限延长。 + // 下一轮重新覆盖窗口和全部有效参数的全局步;单步小改善不重置本轮进度。 shapeRoundBaseline = current.breakdown.shapeLoss; attemptedWindows.fill(false); globalFallbackAttempted = false; - shapeCandidateCount = 0; - shapeExplorationEvaluations = 0; - shapeExplorationDone = fractureLengthColumn < 0; if(!improved && ineffectiveShapeRounds >= 2) { jacobian.clear(); reuseSensitivityForNextStage(); @@ -2779,8 +2674,6 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() rebuildRequested = true; rebuildReason = QT_TR_NOOP("fresh sensitivity at joint shape entry"); } - if(shapeStage && !earlyShapeStage && shapeCandidateCount >= 3) - exploreShapeLengths(); if(m_shouldStop) break; if(!shapeStage && (totalIterations >= m_maxIterations || m_totalEvaluations >= maximumEvaluations)) break; if(!shapeStage && m_layeredSampling && m_samplingStride > 1) { @@ -2811,8 +2704,7 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() rebuildReason = QT_TR_NOOP("no valid sensitivity model"); continue; } - // 真实差分全失败不能冒充停滞收敛;独立探索若找到有效新点则重试。 - if(exploreShapeLengths()) continue; + // 真实差分全失败不能冒充停滞收敛。 m_lastError = tr("Unable to build a valid shape sensitivity model."); stopReason = LM_OPTIMIZATION_FAILED; break; @@ -2898,7 +2790,7 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() selectedColumns.clear(); } } - // 预调整阶段保留原窗口筛选及子集比较,整体阶段直接采用上面的联合步。 + // 形状阶段先覆盖局部窗口,再用全部有效自由列求一次全局联合步。 while(shapeStage && selectedColumns.isEmpty()) { selectedWindow = earlyShapeStage ? 0 : nextTrustRegionWindow( objectiveWindows, attemptedWindows); @@ -2911,22 +2803,30 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() ? information[selectedWindow] : global; QVector proposed; if(earlyShapeStage) { - // 当前只开放井储或表皮;其余阶段仍使用原 Fisher 组合筛选。 + // 前期只开放当前的井储或表皮参数。 for(int column = 0; column < dimensions; ++column) { if(stageColumnValid[column]) proposed.append(column); } + } else if(selectedWindow < 0) { + // 全局步保留弱敏感及相关列,避免参数长期被窗口前三名或共线筛选排除。 + for(int column = 0; column < dimensions; ++column) { + if(stageColumnValid[column] && global.matrix[column][column] > 0.0) + proposed.append(column); + } } else { proposed = selectTrustRegionFisherColumns( local, global, stageColumnValid, current.coordinates, minimumCoordinateStep); } - // 最多三个推荐参数,比较其全部非空子集(最多七组),避免首参数必选。 - // 这里只做小矩阵运算,真正的候选评价每轮仍至多一次。 - for(int mask = 1; mask < (1 << proposed.size()); ++mask) { + // 局部窗口至多三列,比较非空子集;全局只求完整组合,不枚举全部参数子集。 + const bool fullJointStep = !earlyShapeStage && selectedWindow < 0; + const int combinationCount = proposed.isEmpty() ? 0 : (fullJointStep ? 1 : (1 << proposed.size()) - 1); + for(int combination = 1; combination <= combinationCount; ++combination) { QVector columns; - for(int i = 0; i < proposed.size(); ++i) { - if(mask & (1 << i)) { - columns.append(proposed[i]); + if(fullJointStep) columns = proposed; + else { + for(int i = 0; i < proposed.size(); ++i) { + if(combination & (1 << i)) columns.append(proposed[i]); } } QVector step; @@ -3041,7 +2941,6 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() &candidate.breakdown, &candidate.curve, &candidate.elapsedMs); - if(shapeStage && !earlyShapeStage) ++shapeCandidateCount; if(!candidate.valid) { // 求解失败的候选不能改变 current。先完整恢复上一个已接受参数和 @@ -3077,11 +2976,9 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() continue; } - // 普通联合步真实表现可靠时,给含导流能力的方向一次较大步试算。 - // 先保存原步;扩展失败或不如原步时仍保留原候选,本轮额外调用共用八次上限。 - if(shapeStage && !earlyShapeStage && shapeExplorationDone && conductivityColumn >= 0 && - selectedColumns.contains(conductivityColumn) && acceptable(candidate, current) && - shapeExplorationEvaluations < maximumShapeExplorationEvaluations && processPauseAndStop()) { + // 普通形状步真实表现可靠时,沿同一联合方向最多扩步试算一次,不区分参数类型。 + // 扩步仍须通过固定总误差上限且优于原步,否则保留原候选。 + if(shapeStage && !earlyShapeStage && acceptable(candidate, current) && processPauseAndStop()) { const double ordinaryEnergy = 0.5 * trustRegionSquaredNorm(objectiveResidual); const double ordinaryReduction = ordinaryEnergy - 0.5 * trustRegionSquaredNorm(candidate.breakdown.shapeResiduals); const double predictionFloor = qMax(1.0e-14, ordinaryEnergy * 1.0e-8); @@ -3096,7 +2993,6 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() expanded.coordinates = current.coordinates; for(int i = 0; i < dimensions; ++i) expanded.coordinates[i] += expandedStep[i]; expanded.parameters = parametersFromCoordinates(expanded.coordinates); - ++shapeExplorationEvaluations; expanded.valid = evaluateTrustRegionPoint(expanded.parameters, &expanded.fitness, &expanded.breakdown, &expanded.curve, &expanded.elapsedMs); const bool useExpanded = acceptable(expanded, current) && expanded.breakdown.shapeLoss < candidate.breakdown.shapeLoss;