fix(nmNum): 每次打开拟合窗口时重建参数范围

- 每次打开自动拟合窗口时,按当前模型参数重新生成上下限
- 移除沿用和校正历史范围的分支,复用现有范围计算规则
- 通过编译语法检查和差异检查
feature/AutoFit-Optimize-20260914
lvjunjie 3 days ago
parent 529655f205
commit e3d49941bc

@ -62,7 +62,6 @@ private:
void updateRangeForParameter(int parameterIndex, double centerValue);
void setParameterRange(int parameterIndex, double minValue, double maxValue);
bool getPhysicalParameterRange(int parameterIndex, double& minValue, double& maxValue);
void normalizeSavedParameterRanges();
bool validateParameterTable(QString& errorMessage, int parameterIndex = -1);
void startAutoFitting(const QVector<QVector<double>>& targetData, const QStringList& selectedParams, const QString& targetWellName);

@ -239,7 +239,7 @@ void nmWxAutomaticFitting::setParameterRange(int parameterIndex,
}
// 根据当前初值生成建议搜索范围,并始终截断在拟合边界内。skin 下界为 0,
// 上界按初值加固定宽度,其余正值参数使用倍率范围;首次加载和拟合完成后复用。
// 上界按初值加固定宽度,其余正值参数使用倍率范围;每次打开窗口和拟合完成后复用。
void nmWxAutomaticFitting::updateRangeForParameter(int parameterIndex,
double centerValue)
{
@ -306,7 +306,7 @@ void nmWxAutomaticFitting::updateRangeForParameter(int parameterIndex,
}
}
// 按当前表格中的初值为所有参数建立建议范围,首次加载和拟合完成后共用。
// 按当前表格中的初值为所有参数建立建议范围,每次打开窗口和拟合完成后共用。
void nmWxAutomaticFitting::initializeSuggestedParameterRanges()
{
if(!m_parameterTable) {
@ -333,57 +333,6 @@ void nmWxAutomaticFitting::initializeSuggestedParameterRanges()
}
}
// 校正已保存的范围:保留物理边界内的用户区间,无交集时按当前初值生成兜底区间。
void nmWxAutomaticFitting::normalizeSavedParameterRanges()
{
if(!m_parameterTable) {
return;
}
for(int parameterIndex = 0; parameterIndex < 7; ++parameterIndex) {
QTableWidgetItem* minItem = m_parameterTable->item(parameterIndex, 2);
QTableWidgetItem* maxItem = m_parameterTable->item(parameterIndex, 4);
QTableWidgetItem* initialItem = m_parameterTable->item(parameterIndex, 3);
if(!minItem || !maxItem || !initialItem) {
continue;
}
double physicalMin = 0.0;
double physicalMax = 0.0;
if(!getPhysicalParameterRange(parameterIndex, physicalMin, physicalMax)) {
continue;
}
bool savedMinOk = false;
bool savedMaxOk = false;
const double savedMin = minItem->text().toDouble(&savedMinOk);
const double savedMax = maxItem->text().toDouble(&savedMaxOk);
// 旧项目没有 Dfc 字段时,nmDataAttribute 会表现为 0~0。Dfc=0 在求解器中
// 表示无限导流,不能作为连续拟合区间,因此按当前压裂井初值重新建范围。
const bool savedRangeValid = savedMinOk && savedMaxOk
&& nmAutoFitUiIsFinite(savedMin) && nmAutoFitUiIsFinite(savedMax)
&& savedMax >= savedMin
&& !(parameterIndex == 5 && savedMax <= 1.0e-10);
if(savedRangeValid && physicalMax >= physicalMin) {
const double clippedMin = qMax(savedMin, physicalMin);
const double clippedMax = qMin(savedMax, physicalMax);
if(clippedMax >= clippedMin) {
setParameterRange(parameterIndex, clippedMin, clippedMax);
continue;
}
}
// 已保存范围无效或与物理边界无交集时,按数据对象初值重新生成。
bool initialOk = false;
const double initialValue = initialItem->text().toDouble(&initialOk);
if(initialOk && nmAutoFitUiIsFinite(initialValue)) {
updateRangeForParameter(parameterIndex, initialValue);
} else if(physicalMax >= physicalMin) {
setParameterRange(parameterIndex, physicalMin, physicalMax);
}
}
}
// 校验当前表格中的参数范围;parameterIndex 为 -1 时检查所有可见参数行。
bool nmWxAutomaticFitting::validateParameterTable(QString& errorMessage, int parameterIndex)
{
@ -493,7 +442,6 @@ nmWxAutomaticFitting::nmWxAutomaticFitting(QWidget *parent)
nmDataAnalyzeManager* pManager = nmDataAnalyzeManager::getCurrentInstance();
reservoirData = pManager->getReservoirDataCopy();
automaticFittingData = pManager->getAutomaticFittingDataCopy();
const bool hasSavedFittingData = pManager && pManager->getAutomaticFittingData() != nullptr;
// 自动范围始终开启;用户在表格中修改上下限后,itemChanged 会临时切换为手工范围。
m_autoParameterRanges = true;
@ -505,11 +453,8 @@ nmWxAutomaticFitting::nmWxAutomaticFitting(QWidget *parent)
if(m_targetWellCombo->count() > 0) {
onWellSelected(0); // 默认选中第一口井
}
if(!hasSavedFittingData) {
// 每次打开都按当前模型参数生成范围,不沿用上次的上下限。
initializeSuggestedParameterRanges();
} else {
normalizeSavedParameterRanges();
}
m_updatingParameterRanges = false;
DEBUG_UI("AutoFitting Constructor completed");

Loading…
Cancel
Save