From cd8bd9bafedb4ee0fe909af6c6fc52a6b7f040cf Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Thu, 17 Sep 2026 17:06:08 +0800 Subject: [PATCH] =?UTF-8?q?perf(nmNum):=20=E4=BC=98=E5=8C=96=20LM=20?= =?UTF-8?q?=E7=81=B5=E6=95=8F=E5=BA=A6=E9=87=8D=E5=BB=BA=E6=97=B6=E6=9C=BA?= =?UTF-8?q?=E4=B8=8E=E9=87=87=E6=A0=B7=E5=8A=A0=E5=AF=86=E8=A1=94=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 取消累计步长触发重建,连续两步实际改善不足预测的 25% 时刷新模型 - 将兜底刷新间隔调整为接受 10 步,避免微小预测量和单纯约束拒绝触发重建 - 合并临近的采样加密与灵敏度重建,提前考虑剩余求解预算 - 阶段切换时清除旧目标的预测失准计数,保留必要的失败恢复与停滞确认 - 补充重建原因日志、跟踪记录及中文翻译 --- Bin/Config/Lang/cn/nmNum_cn.qm | Bin 142167 -> 143515 bytes Bin/Config/Lang/cn/nmNum_cn.ts | 48 +++++++++++ .../nmCalculation/nmCalculationAutoFitLM.cpp | 77 +++++++++++++----- 3 files changed, 105 insertions(+), 20 deletions(-) diff --git a/Bin/Config/Lang/cn/nmNum_cn.qm b/Bin/Config/Lang/cn/nmNum_cn.qm index e279b9ee2932fcddafd619e093e3993f4f18a347..5408661a05b73dd27fc1d2ae8321f279271634af 100644 GIT binary patch delta 14371 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 F`9G9kONamf delta 13403 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 xb6gFF@ permeability reached its bound 渗透率已到达范围边界 + + Rebuilding sensitivity model: %1 + 正在重建灵敏度模型:%1 + + + initial sensitivity model + 首次建立灵敏度模型 + + + sampling layer changed + 采样层级已改变 + + + no valid sensitivity model + 没有有效的灵敏度模型 + + + solver failure before stage switch + 阶段切换前发生求解失败 + + + 10 accepted steps since last rebuild + 距上次重建已接受 10 步调整,进行兜底刷新 + + + confirm stagnation after ineffective steps + 连续无有效改善,重新确认停滞 + + + sampling refinement merged with pending rebuild + 提前加密采样,与本次重建合并处理 + + + no feasible descent step + 未找到可行的下降方向 + + + 2 consecutive solver failures + 连续 2 次候选求解失败 + + + 2 consecutive steps with actual improvement below 25% of prediction + 连续 2 步实际改善不足预测的 25% + + + inaccurate model at minimum trust radius + 最小信赖半径下仍连续预测失准 + nmCalculationSolver diff --git a/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp b/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp index 68f683d9..b932eaa7 100644 --- a/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp +++ b/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp @@ -1041,7 +1041,7 @@ void nmCalculationAutoFitLM::writeTraceMetaFile() QTextStream out(&metaFile); out << "{\n"; - out << " \"schema_version\": 9,\n"; + out << " \"schema_version\": 10,\n"; out << " \"strategy\": \"permeability_height_then_shape_then_original_lm\",\n"; out << " \"shape_metric\": \"pressure_and_derivative_log_slopes_81_points_lag_8\",\n"; out << " \"shape_stage_total_tolerance\": \"max(0.02, 25% of stage entry total)\",\n"; @@ -1819,15 +1819,17 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() const int maximumIneffectiveSteps = 3; // damping 是 LM 阻尼;拒绝或预测失准时增大,真实下降与预测一致时减小。 - // 两组累计量控制 Jacobian 重建,避免长期使用已偏离当前工作点的局部模型。 + // 按连续预测失准刷新 Jacobian;接受步数只作兜底,不因累计移动距离强制重建。 double trustRadius = 0.12; double damping = 1.0e-2; int consecutiveRejectedSteps = 0; int consecutiveSolverFailures = 0; int acceptedSinceRebuild = 0; int consecutiveIneffectiveSteps = 0; - double movementSinceRebuild = 0.0; + int consecutivePoorPredictions = 0; bool rebuildRequested = true; + // 跟踪文件保留稳定英文原因,界面输出时再翻译,避免受本地编码影响。 + const char* rebuildReason = QT_TR_NOOP("initial sensitivity model"); bool modelRebuiltAtMinimumRadius = false; bool stagnationConfirmationRequested = false; QVector attemptedWindows(kAutoFitTimeWindowCount, false); @@ -2061,12 +2063,13 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() jacobian.clear(); jacobianColumnValid.fill(false); rebuildRequested = true; + rebuildReason = QT_TR_NOOP("sampling layer changed"); trustRadius = 0.12; damping = 1.0e-2; consecutiveRejectedSteps = 0; consecutiveIneffectiveSteps = 0; acceptedSinceRebuild = 0; - movementSinceRebuild = 0.0; + consecutivePoorPredictions = 0; modelRebuiltAtMinimumRadius = false; stagnationConfirmationRequested = false; attemptedWindows.fill(false); @@ -2088,7 +2091,12 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() auto enterTotalStage = [&](const QString& reason) { // 保留当前曲线和完整 J,只重置阶段停滞状态、阻尼及信赖半径。 - rebuildRequested = jacobian.isEmpty() || consecutiveSolverFailures > 0; + rebuildRequested = jacobian.isEmpty() || consecutiveSolverFailures > 0 || acceptedSinceRebuild >= 10; + if(jacobian.isEmpty()) rebuildReason = QT_TR_NOOP("no valid sensitivity model"); + else if(consecutiveSolverFailures > 0) rebuildReason = QT_TR_NOOP("solver failure before stage switch"); + else if(acceptedSinceRebuild >= 10) rebuildReason = QT_TR_NOOP("10 accepted steps since last rebuild"); + // 阶段目标已改变,不把形状目标下的预测失准累计到整体阶段。 + consecutivePoorPredictions = 0; modelRebuiltAtMinimumRadius = false; shapeStage = false; effectiveImprovementBaseline = current.fitness; @@ -2148,6 +2156,7 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() stagnationConfirmationRequested = true; rebuildRequested = true; + rebuildReason = QT_TR_NOOP("confirm stagnation after ineffective steps"); emit logMessageGenerated( tr("No effective improvement for %1 consecutive steps; " "rebuilding sensitivity model for confirmation") @@ -2324,7 +2333,7 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() } acceptedSinceRebuild = 0; - movementSinceRebuild = 0.0; + consecutivePoorPredictions = 0; consecutiveRejectedSteps = 0; rebuildRequested = false; // 若重建过程中接受了试算点,当前模型已通过割线平移而不是在新点完整 @@ -2356,18 +2365,34 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() enterTotalStage(tr("reserve remaining iterations and evaluations for total fitting")); } if(!shapeStage && m_layeredSampling && m_samplingStride > 1) { - const bool reserveFinalBudget = maximumEvaluations - m_totalEvaluations <= 2 * (dimensions + 1); + const int remainingEvaluations = maximumEvaluations - m_totalEvaluations; + // 已准备重建时,提前计入本轮差分及候选的开销,避免紧接着因预算再加密。 + const bool reserveFinalBudget = remainingEvaluations <= 2 * (dimensions + 1) || + (rebuildRequested && remainingEvaluations <= 3 * (dimensions + 1)); const int layerDeadline = qMax(1, m_maxIterations * (m_samplingStride == 4 ? 1 : 2) / 3); - if(reserveFinalBudget || iteration >= layerDeadline) { - promoteSampling(reserveFinalBudget); + const bool mergeRefinement = rebuildRequested && iteration < layerDeadline && + (iteration + 1 >= layerDeadline || reserveFinalBudget); + if(reserveFinalBudget || iteration >= layerDeadline || mergeRefinement) { + const bool promoted = promoteSampling(reserveFinalBudget); if(samplingRefreshFailed) break; + if(promoted && mergeRefinement) { + rebuildReason = QT_TR_NOOP("sampling refinement merged with pending rebuild"); + } } } if(rebuildRequested) { + emit logMessageGenerated(tr("Rebuilding sensitivity model: %1").arg(tr(rebuildReason))); + writeTraceRow(m_currentIteration, -1, "sensitivity_rebuild", current.parameters, + current.fitness, true, 0, rebuildReason, ¤t.breakdown); const bool confirmingStagnation = stagnationConfirmationRequested; if(!rebuildSensitivity()) { - if(shapeStage && !m_shouldStop) { enterTotalStage(tr("no valid shape sensitivity model")); rebuildRequested = true; continue; } + if(shapeStage && !m_shouldStop) { + enterTotalStage(tr("no valid shape sensitivity model")); + rebuildRequested = true; + rebuildReason = QT_TR_NOOP("no valid sensitivity model"); + continue; + } if(promoteSampling(false)) continue; stopReason = m_shouldStop ? LM_USER_STOPPED @@ -2507,6 +2532,7 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() trustRadius = qMax(minimumTrustRadius, trustRadius * 0.5); damping = qMin(1.0e8, damping * 4.0); rebuildRequested = true; + rebuildReason = QT_TR_NOOP("no feasible descent step"); if(recordIneffectiveStep()) { if(promoteSampling(false)) continue; stopReason = LM_LOCAL_OPTIMUM; @@ -2544,6 +2570,7 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() // 对应误差快照,再缩小信赖域;连续失败达到上限才终止整个拟合。 ++consecutiveSolverFailures; ++consecutiveRejectedSteps; + consecutivePoorPredictions = 0; trustRadius = qMax(minimumTrustRadius, trustRadius * 0.5); damping = qMin(1.0e8, damping * 4.0); writeTraceRow(m_currentIteration, @@ -2556,8 +2583,9 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() "solver_invalid_" + selectionName, nullptr); restoreEvaluationState(current); - if(consecutiveRejectedSteps >= 2) { + if(consecutiveSolverFailures >= 2) { rebuildRequested = true; + rebuildReason = QT_TR_NOOP("2 consecutive solver failures"); } if(consecutiveSolverFailures >= m_maxConsecutiveFailures) { stopReason = LM_CONSECUTIVE_FAILURES; @@ -2582,9 +2610,20 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() coordinateStep); // reductionRatio 衡量局部线性模型的可信度:接近 1 表示预测准确; // 值较小表示虽然可能下降,但模型低估了非线性,需要收紧下一步。 - double actualReduction = 0.5 * (trustRegionSquaredNorm(objectiveResidual) - + const double objectiveEnergy = 0.5 * trustRegionSquaredNorm(objectiveResidual); + double actualReduction = objectiveEnergy - 0.5 * ( trustRegionSquaredNorm(shapeStage ? candidate.breakdown.shapeResiduals : candidate.breakdown.residualVector)); double reductionRatio = actualReduction / predictedReduction; + // 使用同一采样层、同一阶段目标比较预测和实际改善。接近收敛时的微小 + // 预测量交给停滞逻辑处理,避免比例数值波动反复触发昂贵的全参数重建。 + const double predictionFloor = qMax(1.0e-14, objectiveEnergy * 1.0e-8); + const bool poorPrediction = predictedReduction > predictionFloor && + (!isFiniteNumber(reductionRatio) || reductionRatio < 0.25); + consecutivePoorPredictions = poorPrediction ? consecutivePoorPredictions + 1 : 0; + if(consecutivePoorPredictions >= 2) { + rebuildRequested = true; + rebuildReason = QT_TR_NOOP("2 consecutive steps with actual improvement below 25% of prediction"); + } bool accepted = acceptable(candidate, current); // 粗层认为下降而完整数据不认可时累计,连续两次就提前加密。 if(!shapeStage && m_layeredSampling && m_samplingStride > 1 && !accepted && actualReduction > 0.0) { @@ -2599,7 +2638,6 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() // 模型预测可靠时减小阻尼并可扩大半径,预测较差时保守收缩。 acceptPoint(candidate); ++acceptedSinceRebuild; - movementSinceRebuild += stepNorm; consecutiveRejectedSteps = 0; if(reductionRatio > 0.75) { @@ -2616,21 +2654,19 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() minimumTrustRadius, trustRadius * 0.75); } - if(acceptedSinceRebuild >= 6 || - movementSinceRebuild >= 0.30) { + if(acceptedSinceRebuild >= 10 && !rebuildRequested) { rebuildRequested = true; + rebuildReason = QT_TR_NOOP("10 accepted steps since last rebuild"); } modelRebuiltAtMinimumRadius = false; } else { // 拒绝时 candidate 只保留在 trace 中,DataManager 和内存状态都恢复 - // 到 current。连续拒绝说明割线模型可能失真,因此请求重新试算灵敏度。 + // 到 current。形状上限或全目标点验收也可能拒绝候选,不能仅凭拒绝 + // 次数认定模型失准;重建由上面的预测质量判断,约束冲突先缩步。 ++consecutiveRejectedSteps; damping = qMin(1.0e8, damping * 4.0); trustRadius = qMax(minimumTrustRadius, trustRadius * 0.5); restoreEvaluationState(current); - if(consecutiveRejectedSteps >= 2) { - rebuildRequested = true; - } } // 候选只要更优就继续作为 current 保存;是否足以解除停滞,则统一 @@ -2687,13 +2723,14 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() break; } if(selectedWindow < 0 && trustRadius <= minimumTrustRadius * 1.01 && - consecutiveRejectedSteps >= 2) { + consecutiveRejectedSteps >= 2 && consecutivePoorPredictions >= 2) { if(modelRebuiltAtMinimumRadius) { if(promoteSampling(false)) continue; stopReason = LM_LOCAL_OPTIMUM; break; } rebuildRequested = true; + rebuildReason = QT_TR_NOOP("inaccurate model at minimum trust radius"); } }