From 08de98335a9c57194b422d68653433e2bb00141e Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Sun, 20 Sep 2026 15:55:34 +0800 Subject: [PATCH] =?UTF-8?q?refactor(nmNum):=20=E5=88=86=E7=A6=BB=20LM=20?= =?UTF-8?q?=E4=B8=89=E9=98=B6=E6=AE=B5=E6=8B=9F=E5=90=88=E9=AA=8C=E6=94=B6?= =?UTF-8?q?=E7=9B=AE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 渗透率预调整仅按上下误差验收,不再因总误差达标跳过预调整 - 移除形状阶段总误差上限、预测缩步及总误差达标提前退出 - 井储表皮回检仅按前期形状改善与整体形状容差验收 - 保留第三阶段按整体误差联合微调,同步阶段误差日志、轨迹元数据及中文翻译 --- Bin/Config/Lang/cn/nmNum_cn.qm | Bin 147235 -> 147204 bytes Bin/Config/Lang/cn/nmNum_cn.ts | 8 +- .../nmCalculation/nmCalculationAutoFitLM.cpp | 79 ++++-------------- 3 files changed, 22 insertions(+), 65 deletions(-) diff --git a/Bin/Config/Lang/cn/nmNum_cn.qm b/Bin/Config/Lang/cn/nmNum_cn.qm index 13ec7e77ea8dafe2036f7f45513f36cceb58bd70..5fba495298f5119796643e552bffa0b41ea529e3 100644 GIT binary patch delta 13695 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 delta 13787 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 井储试调:相对斜率匹配误差=%1,井储=%2 → %3 - Wellbore recheck: early error=%1, total limit=%2, shape limit=%3. - 井储表皮回检:前期相对斜率匹配误差=%1,整体误差上限=%2,形状误差上限=%3。 + Wellbore recheck: early shape error=%1, shape limit=%2. + 井储表皮回检:前期形状误差=%1,整体形状误差上限=%2。 early relative-slope error restored within tolerance @@ -1273,8 +1273,8 @@ Reason: %1 井储表皮回检在灵敏度评价期间完成 - total target reached during shape fitting - 形状调整期间已达到总误差目标 + Sensitivity probe accepted: shape error=%1 + 接受灵敏度探针:形状误差=%1 fresh sensitivity at joint shape entry diff --git a/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp b/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp index 1aeccba9..378e7276 100644 --- a/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp +++ b/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp @@ -1212,9 +1212,9 @@ void nmCalculationAutoFitLM::writeTraceMetaFile() QTextStream out(&metaFile); out << "{\n"; - out << " \"schema_version\": 29,\n"; + out << " \"schema_version\": 30,\n"; out << " \"strategy\": \"permeability_height_then_shape_then_joint_lm\",\n"; - out << " \"height_acceptance\": \"reliable_vertical_loss_decrease; no_shape_loss_constraint\",\n"; + out << " \"height_acceptance\": \"reliable_vertical_loss_decrease; no_shape_or_total_loss_constraint\",\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"; out << " \"early_parallel_metric\": \"pressure_and_derivative_log_slopes_first_window_81_points_lag_8\",\n"; @@ -1225,7 +1225,7 @@ void nmCalculationAutoFitLM::writeTraceMetaFile() out << " \"early_initial_expansion_policy\": \"before_first_accepted_shape_improvement; if_shape_worsens_double_coordinate_step_from_unchanged_base_up_to_parameter_bound; retain_base_on_failure\",\n"; out << " \"early_wellbore_acceptance\": \"locked_gap_direction_and_early_shape_decrease\",\n"; out << " \"early_wellbore_total_constraint\": false,\n"; - out << " \"shape_stage_total_tolerance\": \"max(0.02, 25% of stage entry total)\",\n"; + out << " \"shape_stage_total_constraint\": false,\n"; out << " \"shape_wellbore_parameters_frozen\": true,\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"; @@ -1234,7 +1234,7 @@ void nmCalculationAutoFitLM::writeTraceMetaFile() 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"; - out << " \"wellbore_recheck_acceptance\": \"early decrease with fixed entry total and shape limits, each max(0.0001, 5%)\",\n"; + out << " \"wellbore_recheck_acceptance\": \"early decrease with fixed entry shape limit max(0.0001, 5%); no_total_loss_constraint\",\n"; out << " \"wellbore_recheck_budget\": \"once when early shape degrades; each wellbore parameter stops after 2 ineffective steps, independent of total-stage budget\",\n"; out << " \"total_stage_shape_constraint\": false,\n"; out << " \"total_parameter_selection\": \"all_valid_free_columns\",\n"; @@ -2154,7 +2154,7 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() int heightStagnation = 0; double heightScale = 1.0; double heightSlope = -1.0; - if(permeabilityColumn >= 0 && current.fitness >= m_targetError) { + if(permeabilityColumn >= 0) { emit logMessageGenerated(tr("LM stage 1: align curve height using permeability only (up to %1 evaluations).") .arg(heightBudget)); for(int trial = 0; trial < heightBudget && processPauseAndStop(); ++trial) { @@ -2211,9 +2211,8 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() if(m_shouldStop) return LM_USER_STOPPED; // 第二阶段不按迭代比例截断;普通形状按完整搜索轮次判断是否仍有显著改善。 - // 井储、表皮保持冻结,总误差上限仍固定于普通形状阶段入口。 - bool shapeStage = current.fitness >= m_targetError; - double shapeValueLimit = current.fitness + qMax(0.02, 0.25 * current.fitness); + // 普通形状调整冻结井储、表皮,只按形状验收;总误差达标只在第三阶段判断。 + bool shapeStage = true; bool jointShapeStarted = false; double shapeRoundBaseline = current.breakdown.shapeLoss; int shapeRoundNumber = 0; @@ -2230,7 +2229,6 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() bool wellboreRecheck = false; bool wellboreRecheckDone = false; double earlyWellboreBaseline = current.breakdown.earlyParallelLoss; - double recheckTotalLimit = 0.0; double recheckShapeLimit = 0.0; // 先井储、再表皮;回检沿用相同顺序和前期指标,不回到形状阶段反复循环。 bool earlyShapeStage = shapeStage && wellboreParameterCount > 0; @@ -2270,11 +2268,10 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() const int column = m_enabledParamIndices.indexOf(earlyShapeParameter); return earlyGapDirection * (point.coordinates[column] - base.coordinates[column]) > 0.0 && point.breakdown.earlyParallelLoss < base.breakdown.earlyParallelLoss && - (!wellboreRecheck || (point.fitness <= recheckTotalLimit && - point.breakdown.shapeLoss <= recheckShapeLimit)); + (!wellboreRecheck || point.breakdown.shapeLoss <= recheckShapeLimit); } return shapeStage - ? point.breakdown.shapeLoss < base.breakdown.shapeLoss && point.fitness <= shapeValueLimit + ? point.breakdown.shapeLoss < base.breakdown.shapeLoss // 预调整结束后恢复原 LM:有效候选只按整体误差下降接受。 : point.fitness < base.fitness; }; @@ -2408,7 +2405,7 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() initialEarlyGapBias = trustRegionEarlyGapBias(current.breakdown); earlyGapDirection = trustRegionEarlyGapDirection(initialEarlyGapBias); earlyShapeHasImproved = false; - recheckTotalLimit = current.fitness + qMax(1.0e-4, 0.05 * current.fitness); + // 回检只约束形状:允许总误差上升,但保护其他参数已调好的整体形状。 recheckShapeLimit = current.breakdown.shapeLoss + qMax(1.0e-4, 0.05 * current.breakdown.shapeLoss); effectiveImprovementBaseline = current.breakdown.earlyParallelLoss; // 其他参数已改变,回检入口重测形状灵敏度,方向由本轮初始间距重新确定。 @@ -2416,9 +2413,9 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() reuseSensitivityForNextStage(); rebuildRequested = true; rebuildReason = QT_TR_NOOP("new sensitivity for wellbore recheck"); - emit logMessageGenerated(tr("Wellbore recheck: early error=%1, total limit=%2, shape limit=%3.") + emit logMessageGenerated(tr("Wellbore recheck: early shape error=%1, shape limit=%2.") .arg(current.breakdown.earlyParallelLoss, 0, 'g', 6) - .arg(recheckTotalLimit, 0, 'g', 6).arg(recheckShapeLimit, 0, 'g', 6)); + .arg(recheckShapeLimit, 0, 'g', 6)); writeTraceRow(m_currentIteration, -1, "stage_switch", current.parameters, current.fitness, true, 0, "shape_to_wellbore_recheck", ¤t.breakdown); announceEarlyGapDirection(); @@ -2451,8 +2448,6 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() return; } effectiveImprovementBaseline = current.breakdown.shapeLoss; - // 井储、表皮可使总误差上升;联合形状阶段从当前工作点建立固定上限。 - shapeValueLimit = current.fitness + qMax(0.02, 0.25 * current.fitness); reuseSensitivityForNextStage(); emit logMessageGenerated(tr("Shape fitting continues with storage and skin fixed; a conditional wellbore recheck follows.")); writeTraceRow(m_currentIteration, -1, "stage_switch", current.parameters, current.fitness, @@ -2733,8 +2728,9 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() ¤t.breakdown); emit logMessageGenerated( (earlyShapeStage ? tr("Sensitivity probe accepted: early shape error=%1") - : tr("Sensitivity probe accepted: total error=%1")) - .arg(earlyShapeStage ? current.breakdown.earlyParallelLoss : current.fitness, 0, 'e', 4)); + : (shapeStage ? tr("Sensitivity probe accepted: shape error=%1") + : tr("Sensitivity probe accepted: total error=%1"))) + .arg(stageError(current), 0, 'e', 4)); } else { restoreEvaluationState(current); } @@ -2819,11 +2815,6 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() : LM_LOCAL_OPTIMUM; break; } - if(shapeStage && !earlyShapeStage && current.fitness < m_targetError) { - finishShapeStage(tr("total target reached during shape fitting")); - --iteration; - continue; - } if(!shapeStage && current.fitness < m_targetError) { promoteSampling(true); stopReason = LM_TARGET_ACHIEVED; @@ -2956,37 +2947,6 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() : buildTrustRegionFisherStep(stepInformation, columns, current.coordinates, damping, trustRadius, minimumCoordinateStep, &step, &reduction); if(!stepBuilt) continue; - // 仅联合形状阶段预测总误差上限;井储、表皮步长不受总误差裁剪。 - if(shapeStage && !earlyShapeStage) { - auto predictedGuard = [&](double scale) -> double { - double energy = 0.0; - for(int row = 0; row < current.breakdown.residualVector.size(); ++row) { - double value = current.breakdown.residualVector[row]; - for(int column = 0; column < dimensions; ++column) - value += scale * jacobian[row][column] * step[column]; - energy += value * value; - } - return qSqrt(energy); - }; - const double currentGuard = predictedGuard(0.0); - const double predictedLimit = currentGuard + 0.9 * qMax(0.0, shapeValueLimit - currentGuard); - if(predictedGuard(1.0) > predictedLimit) { - double low = 0.0, high = 1.0; - for(int search = 0; search < 32; ++search) { - const double middle = 0.5 * (low + high); - if(predictedGuard(middle) <= predictedLimit) low = middle; - else high = middle; - } - const double stepScale = low; - for(int column = 0; column < dimensions; ++column) step[column] *= stepScale; - if(qSqrt(trustRegionSquaredNorm(step)) < minimumCoordinateStep) continue; - reduction = -trustRegionDotProduct(stepInformation.gradient, step); - for(int a = 0; a < dimensions; ++a) - for(int b = 0; b < dimensions; ++b) - reduction -= 0.5 * step[a] * stepInformation.matrix[a][b] * step[b]; - if(!isFiniteNumber(reduction) || reduction <= 1.0e-14) continue; - } - } const double tolerance = 1.0e-12 * qMax(predictedReduction, reduction); if(selectedColumns.isEmpty() || reduction > predictedReduction + tolerance || (qAbs(reduction - predictedReduction) <= tolerance && @@ -3141,7 +3101,7 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() } // 普通形状步真实表现可靠时,沿同一联合方向最多扩步试算一次,不区分参数类型。 - // 扩步仍须通过固定总误差上限且优于原步,否则保留原候选。 + // 扩步只按整体形状验收,优于原步才替换,否则保留原候选。 if(shapeStage && !earlyShapeStage && acceptable(candidate, current) && processPauseAndStop()) { const double ordinaryEnergy = 0.5 * trustRegionSquaredNorm(objectiveResidual); const double ordinaryReduction = ordinaryEnergy - 0.5 * trustRegionSquaredNorm(candidate.breakdown.shapeResiduals); @@ -3286,7 +3246,7 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() .arg(iteration + 1) .arg(componentDisplayName) .arg(selectedColumns.size()) - .arg(earlyShapeStage ? candidate.breakdown.earlyParallelLoss : candidate.fitness, 0, 'e', 4) + .arg(stageError(candidate), 0, 'e', 4) .arg(accepted ? tr("accepted") : tr("rejected"))); emit progressUpdated(shapeStage ? -1 : totalIterations, m_globalBestFitness); @@ -3306,9 +3266,6 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() if(stopReason == LM_LOCAL_OPTIMUM || samplingRefreshFailed) break; } - if(shapeStage && !earlyShapeStage && current.fitness < m_targetError) { - finishShapeStage(tr("total target reached during shape fitting")); - } if(!shapeStage && current.fitness < m_targetError) { promoteSampling(true); stopReason = LM_TARGET_ACHIEVED; @@ -3337,7 +3294,7 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() return LM_USER_STOPPED; } if(samplingRefreshFailed) return LM_OPTIMIZATION_FAILED; - if(current.fitness < m_targetError) { + if(!shapeStage && current.fitness < m_targetError) { promoteSampling(true); return samplingRefreshFailed ? LM_OPTIMIZATION_FAILED : LM_TARGET_ACHIEVED; }