From 4a5500d927f95638b3cf82bc6d37ffc1c3ef254b Mon Sep 17 00:00:00 2001 From: lvjunjie Date: Tue, 25 Aug 2026 15:24:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=97=A5=E5=BF=97=E7=BF=BB?= =?UTF-8?q?=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Bin/Config/Lang/cn/nmNum_cn.qm | Bin 105317 -> 117004 bytes Bin/Config/Lang/cn/nmNum_cn.ts | 399 ++++++++++++++++++ .../nmCalculation/nmCalculationAutoFitLM.cpp | 32 +- 3 files changed, 424 insertions(+), 7 deletions(-) diff --git a/Bin/Config/Lang/cn/nmNum_cn.qm b/Bin/Config/Lang/cn/nmNum_cn.qm index 2bab4b7e6bb260232b34706ce9677953559ac5e7..837aac1b49a26efb4ae8668ef02c31b6eca4f4dd 100644 GIT binary patch delta 16598 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

}p4>jnIW1fBQI&)l+i$xQ1|f9E&8f8020pOh zxai0PgYo-lV@i5la*_dV^0!fV7#y5SM*?%Vcy(1i0}*31wMp9#r@@h(?YaE zehc&%I<#~E2I~MqB2#0H>4w3^gakuUWTMd!mu4^~rlb!k?N(=P&tTQQ%%}U;UN8H+ z<|l5}r)p1l7<^{4D4--ufB#a0l2ph)9wqhFLwSaD#UpwJ2TO2^T`ywOFxSk zQjKXD3F*QJ;*thMCd9=Ul2Z+XlT*`-hV=fCg4UqO$b{072?F`#YmGL-Nso5cp;fnz zM)D`2%XmI1eZSPUg;DZAWWLm{I-gK@i5S1tp^y`L=R}n$9e$JlRA6*+VoHKB9qyNw z5glzzOA{3RRkE?xE~;kKjcVSd&w!{9UD(UqSNTW2?Xt8h*Z=G)Z9rT~is0w{(v7Kx zj5Pd9OHWQIooh)L`|jJeg=|^UcWFP4|J@H775a%9V(Fx`{Zjo4?F$;8l{0DoWZV2B zUo=7;C0q&A{)7Hom^Ze!t(}~Z!TmDLkdzE-{CAzlSY=jYKy;6~;b}vg2y!dQlO@rB z8VP@;GiuO2H8R?0k-bGIDb{rPw-C^%QKQlcRV~rK(Y@OkYlc!F4!MxS7o}O!vF2AN zXx*{N*OP}Gtzovr26f!xClz&e`ja)*=wQxoXRG-qFF)SNS``RJUEkk&VzQ2?m5?Vf zWg%zUc1=roY>AI9Uo=8=3aoETv79&gq7h8ma_ss=BPhUf+_Y3I9vxsRJkmHgdl>p9 zM`xsYI=DC*QX*3k32+mqO&krz)YRluPY2gBj>sm0hk80REfteZi4FgyZVn8t9K{3x4rUlnb;rXsJZVAQ(^Xt-ShOeT*s5Nq-6L)zE>pBrv24 zIyPX~kuj0!k$(#2txHtN$5_(jUm6qYygxPer#4E2UzfL$J2++MH>FFJSPHEpX!sw> z7ZZMx z3hSht%(wk*%UKQdn-a=gF5nv@N)2fB)kKd5tl%dlCTg3oFjg7-Jfm)4UP}jwO)9#m?krd--h{{MuI>YJzoBCy6bAL&yQk4$E*6i5DT87zLB~e$9LP$g~FeInw8ym@skp<)E1uUY|5xx zGN$~~M9A&N#?uW<>3m2r~0yr>TW(hzQMtN zQ<-B*hOu+_viRyfCQUgJ{z1su+(oFdC59UU>kGmPsw7x#shPM18JOkF)d*|B9xNPVL#zsNRFU}(cQWBi?AOT!y~H@UZRp=LDmYgR52x0wfUL1qGZWlreq-}L~V0Gf;F&| zL{>XP3v~++?tj{UJ9tOYa(mAZS z^w|piv6C<~IVm0MofzYwI7`keeXq3rsI!?jO5ahW8sm-8@PX3jN_Hz05mBkz{?xuc zt$$>S@gJJ5YaNoTZwnz~mo~0WPZq{vscuT!cP<%!pej)Pr}oQ1NPHRj_t6W{Xo{HG zZ@yQ*-!A)dLS@D)7i-*6m3CUi!P&h3nfo*s_MP_Y)#|uvDE2IT%~-X~{T@}fkz3m+ XY$InC#g!bK3q54aZS%NKH|PEz_Z2AR delta 10534 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 MwL0Y3f<0RQKjt6^sQ>@~ diff --git a/Bin/Config/Lang/cn/nmNum_cn.ts b/Bin/Config/Lang/cn/nmNum_cn.ts index 75552d4..1c8383d 100644 --- a/Bin/Config/Lang/cn/nmNum_cn.ts +++ b/Bin/Config/Lang/cn/nmNum_cn.ts @@ -638,6 +638,389 @@ Reason: %1 代理评分服务器标准错误输出(stderr):%1 + + nmCalculationAutoFitLM + + === User Stop Request Received === + === 用户停止请求已接收 === + + + Gracefully stopping LM automatic fitting... + 正在平稳停止 LM 自动拟合... + + + Waiting for current solver evaluation to stop... + 正在等待当前求解器评估停止... + + + LM automatic fitting stop request processed + LM 自动拟合停止请求已处理 + + + Stop request received but optimization is not running + 收到停止请求,但优化未运行 + + + LM fitting trace: %1 + LM 拟合跟踪:%1 + + + LM fitting trace metadata: %1 + LM 拟合跟踪元数据:%1 + + + === LM Run Summary === + === LM 运行摘要 === + + + Stop reason: %1 + 停止原因:%1 + + + Result: %1, final error=%2, iterations=%3, evaluations=%4 (successful=%5, failed=%6) + 结果:%1,最终误差=%2,迭代次数=%3,评估次数=%4(成功=%5,失败=%6) + + + SUCCESS + 成功 + + + FAILED + 失败 + + + Artifacts: trace=%1 + 产物:跟踪=%1 + + + Artifacts: trace_meta=%1 + 产物:跟踪元数据=%1 + + + ERROR: Failed to load configuration from data manager + 错误:从数据管理器加载配置失败 + + + Algorithm: LM + 算法:LM + + + Enabled parameters count: %1 + 启用参数数量:%1 + + + ERROR: No parameters enabled for optimization + 错误:没有启用优化参数 + + + ERROR: Target LogLog data is empty or insufficient + 错误:目标双对数数据为空或不足 + + + ERROR: Target LogLog data arrays have inconsistent sizes + 错误:目标双对数数据数组大小不一致 + + + ERROR: Target well name is empty + 错误:目标井名称为空 + + + Target data validation passed (%1 data points) + 目标数据验证通过(%1 个数据点) + + + === Evaluating Initial Solution (Elite Protection) === + === 评估初始解 === + + + Initial parameters: + 初始参数: + + + Starting initial solution evaluation... + 开始初始解评估... + + + Initial solution evaluation successful + 初始解评估成功 + + + Initial Error: %1 + 初始误差:%1 + + + Initial solution evaluation failed + 初始解评估失败 + + + Exception during initial solution evaluation + 初始解评估期间出现异常 + + + Critical exception in automatic fitting: %1 + 自动拟合发生严重异常:%1 + + + CRITICAL ERROR: %1 + 严重错误:%1 + + + Unknown critical exception in automatic fitting + 自动拟合发生未知严重异常 + + + CRITICAL ERROR: Unknown exception in automatic fitting + 严重错误:自动拟合发生未知异常 + + + Applying optimized parameters to model... + 正在将优化参数应用到模型... + + + Final full-field calculation skipped after user stop + 用户停止后已跳过最终全场计算 + + + Running final full-field calculation with optimized parameters... + 正在使用优化参数运行最终全场计算... + + + Final full-field calculation completed successfully + 最终全场计算成功完成 + + + Final full-field calculation stopped by user + 最终全场计算已被用户停止 + + + Optimized parameters were found, but the final full-field calculation failed + 已找到优化参数,但最终全场计算失败 + + + ERROR: Final full-field calculation failed + 错误:最终全场计算失败 + + + === Optimization Results === + === 优化结果 === + + + Final error: %1 + 最终误差:%1 + + + Total iterations: %1 + 总迭代次数:%1 + + + Total evaluations: %1 (successful: %2) + 总评估次数:%1(成功:%2) + + + Optimized parameters: + 优化参数: + + + Parameters and full-field results applied successfully to data manager + 参数和全场计算结果已成功应用到数据管理器 + + + Optimized parameters applied to data manager + 优化参数已应用到数据管理器 + + + ERROR: Failed to apply final parameters: %1 + 错误:应用最终参数失败:%1 + + + ERROR: Unknown error applying final parameters + 错误:应用最终参数时出现未知错误 + + + Target achieved. Best error: %1, Iterations: %2 + 达到目标。最佳误差:%1,迭代次数:%2 + + + === LM AUTOMATIC FITTING SUCCESSFUL === + === LM 自动拟合成功 === + + + Automatic fitting converged to a stable solution. Best error: %1, Iterations: %2 + 自动拟合已收敛到稳定解。最佳误差:%1,迭代次数:%2 + + + === LM AUTOMATIC FITTING CONVERGED === + === LM 自动拟合已收敛 === + + + Automatic fitting reached a local optimum. Best error: %1, Iterations: %2 + 自动拟合达到局部最优。最佳误差:%1,迭代次数:%2 + + + === LM AUTOMATIC FITTING - LOCAL OPTIMUM === + === LM 自动拟合 - 局部最优 === + + + Max iterations reached. Best error: %1, Iterations: %2 + 达到最大迭代次数。最佳误差:%1,迭代次数:%2 + + + === LM AUTOMATIC FITTING - MAX ITERATIONS === + === LM 自动拟合 - 达到最大迭代次数 === + + + Best error: %1, Iterations: %2 + 最佳误差:%1,迭代次数:%2 + + + === LM AUTOMATIC FITTING STOPPED BY USER === + === LM 自动拟合已被用户停止 === + + + Automatic fitting failed due to consecutive failures. Best error: %1, Iterations: %2 + 自动拟合因连续失败而终止。最佳误差:%1,迭代次数:%2 + + + === LM AUTOMATIC FITTING FAILED === + === LM 自动拟合失败 === + + + Automatic fitting ended unexpectedly. Best error: %1, Iterations: %2 + 自动拟合意外结束。最佳误差:%1,迭代次数:%2 + + + === LM AUTOMATIC FITTING - UNKNOWN END === + === LM 自动拟合 - 未知结束 === + + + No valid parameters are available for trust-region fitting + 没有可用于 LM 拟合的有效参数 + + + The initial solution and parameter-range midpoint are both invalid + 初始解和参数范围中点均无效 + + + === Starting LM Main Loop === + === 开始 LM 主循环 === + + + LM starting point error: %1; evaluation budget: %2 + LM 起点误差:%1;最大评估次数:%2 + + + No effective improvement for %1 consecutive steps; rebuilding sensitivity model for confirmation + 连续 %1 次无有效改善,正在重建灵敏度模型进行确认 + + + Effective improvement threshold: max(%1, %2% of baseline error); %3 consecutive ineffective steps trigger convergence confirmation + 有效改善阈值:取 %1 与基准误差的 %2% 中较大值;连续 %3 次无有效改善后进行收敛确认 + + + Sensitivity probe accepted: error reduced to %1 + 已接受灵敏度试算点,误差降至 %1 + + + Sensitivity model rebuilt: %1/%2 parameter columns valid + 灵敏度模型重建完成:%1/%2 个参数列有效 + + + Sensitivity rebuild produced no effective improvement; local convergence detected + 灵敏度重建后仍无有效改善,判定为局部收敛 + + + vertical deviation + 上下偏差 + + + horizontal deviation + 左右偏差 + + + shape deviation + 形状偏差 + + + total error + 总误差 + + + Iteration %1: focus=%2, parameters=%3, error=%4, result=%5 + 迭代 %1:关注=%2,参数个数=%3,误差=%4,结果=%5 + + + accepted + 接受 + + + rejected + 拒绝 + + + No initial solution for elite protection + 没有可用于精英保护的初始解 + + + === Final Result Validation (Elite Protection) === + === 最终结果验证 === + + + Comparing results: Initial=%1, Final=%2 + 比较结果:初始=%1,最终=%2 + + + Improvement: %1 (%2%) + 改善:%1(%2%) + + + Elite protection triggered: final result is invalid or worse than initial + 触发精英保护:最终结果无效或差于初始解 + + + Restoring initial solution as final result + 正在恢复初始解作为最终结果 + + + Initial solution restored successfully + 初始解恢复成功 + + + Final result validated - solution is not worse than initial + 最终结果验证通过,拟合结果不差于初始解 + + + Target error achieved + 达到目标误差 + + + Algorithm converged to stable solution + 算法已收敛到稳定解 + + + Local optimum detected + 检测到局部最优 + + + Maximum iterations reached + 达到最大迭代次数 + + + Stopped by user request + 根据用户请求停止 + + + Too many consecutive failures + 连续失败次数过多 + + + Optimization failed + 优化失败 + + + Unknown reason + 未知原因 + + nmCalculationSolver @@ -3446,6 +3829,12 @@ Supported types: Vertical, Vertical Fractured, and Horizontal Multi-Fractured We PSO求解完成: + + %1 Optimization completed: + + %1 拟合完成: + + Best Error: %1 @@ -3476,6 +3865,12 @@ Supported types: Vertical, Vertical Fractured, and Horizontal Multi-Fractured We PSO拟合被用户强行终止: + + %1 Optimization stopped by user: + + %1 拟合已被用户停止: + + Current parameters have been applied to the model. 当前参数已应用到模型。 @@ -3678,6 +4073,10 @@ Supported types: Vertical, Vertical Fractured, and Horizontal Multi-Fractured We GA auto fitting started 遗传法自动拟合开始 + + %1 auto fitting started + %1 自动拟合开始 + %1 fitting parameters set: MaxIterations=%2, TargetAccuracy=%3, TargetWell=%4 %1 拟合参数设置:最大迭代次数=%2,目标精度=%3,目标井=%4 diff --git a/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp b/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp index cccb04c..efff34d 100644 --- a/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp +++ b/Src/nmNum/nmCalculation/nmCalculationAutoFitLM.cpp @@ -803,7 +803,11 @@ void nmCalculationAutoFitLM::initializeTraceFile() writeTraceHeader(); writeTraceMetaFile(); - emit logMessageGenerated(tr("LM automatic fitting trace: %1").arg(m_traceFilePath)); + emit logMessageGenerated(tr("LM fitting trace: %1").arg(m_traceFilePath)); + if(!m_traceMetaFilePath.isEmpty()) { + emit logMessageGenerated( + tr("LM fitting trace metadata: %1").arg(m_traceMetaFilePath)); + } } void nmCalculationAutoFitLM::closeTraceFile() @@ -990,7 +994,7 @@ void nmCalculationAutoFitLM::emitRunSummary(bool success, StopReasonLM finalReas emit logMessageGenerated(tr("Stop reason: %1").arg(getStopReasonDescription(finalReason))); emit logMessageGenerated( tr("Result: %1, final error=%2, iterations=%3, evaluations=%4 (successful=%5, failed=%6)") - .arg(success ? "SUCCESS" : "FAILED") + .arg(success ? tr("SUCCESS") : tr("FAILED")) .arg(m_globalBestFitness, 0, 'e', 4) .arg(m_currentIteration + 1) .arg(m_totalEvaluations) @@ -1179,7 +1183,7 @@ bool nmCalculationAutoFitLM::startAutoFitting() return false; } - emit logMessageGenerated(tr("Algorithm: Finite Difference + LM")); + emit logMessageGenerated(tr("Algorithm: LM")); const int enabledParams = getEnabledParameterCount(); emit logMessageGenerated(tr("Enabled parameters count: %1").arg(enabledParams)); @@ -1209,8 +1213,8 @@ bool nmCalculationAutoFitLM::startAutoFitting() } emit logMessageGenerated( - tr("Candidate evaluation mode: solve all wells, retain target well '%1' only") - .arg(m_targetWellName)); + tr("Target data validation passed (%1 data points)") + .arg(m_targetLogLogData[0].size())); // resetOptimizer() 会清空运行状态,因此先保存从 DataManager 提取的初始值。 QVector savedInitialValues = m_initialValues; @@ -1235,6 +1239,8 @@ bool nmCalculationAutoFitLM::startAutoFitting() emit logMessageGenerated(paramStr); try { + emit logMessageGenerated( + tr("Starting initial solution evaluation...")); QTime initialEvalTimer; initialEvalTimer.start(); m_totalEvaluations++; @@ -1747,8 +1753,9 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() } restoreEvaluationState(current); + emit logMessageGenerated(tr("=== Starting LM Main Loop ===")); emit logMessageGenerated( - tr("Trust-region initial error: %1; evaluation budget: %2") + tr("LM starting point error: %1; evaluation budget: %2") .arg(current.fitness, 0, 'e', 4) .arg(maximumEvaluations)); @@ -2459,10 +2466,21 @@ StopReasonLM nmCalculationAutoFitLM::runTrustRegionFitting() : QString("rejected_%1").arg(componentName), &candidate.breakdown); + QString componentDisplayName = componentName; + if(componentName == "vertical") { + componentDisplayName = tr("vertical deviation"); + } else if(componentName == "horizontal") { + componentDisplayName = tr("horizontal deviation"); + } else if(componentName == "shape") { + componentDisplayName = tr("shape deviation"); + } else if(componentName == "total") { + componentDisplayName = tr("total error"); + } + emit logMessageGenerated( tr("Iteration %1: focus=%2, parameters=%3, error=%4, result=%5") .arg(iteration + 1) - .arg(componentName) + .arg(componentDisplayName) .arg(selectedColumns.size()) .arg(candidate.fitness, 0, 'e', 4) .arg(accepted ? tr("accepted") : tr("rejected")));