|
|
|
|
@ -323,7 +323,9 @@ protected:
|
|
|
|
|
// 两端加密以平滑显示尾部,有界分布的横轴保留精确上下限。
|
|
|
|
|
const double probability = (1.0 - std::cos(3.141592653589793 * i / 200.0)) * 0.5;
|
|
|
|
|
cumulativeValues[i] = bounded ? probability : 0.0001 + 0.9998 * probability;
|
|
|
|
|
valid = m_variable.distributionQuantile(qBound(1e-10, cumulativeValues[i], 1.0 - 1e-10), x[i]);
|
|
|
|
|
// Skin 保留原分布绘图,其余参数显示与实际采样一致的受限分布。
|
|
|
|
|
valid = m_variable.distributionQuantile(qBound(1e-10, cumulativeValues[i], 1.0 - 1e-10), x[i],
|
|
|
|
|
m_variable.m_varName != "Skin");
|
|
|
|
|
if(bounded && i == 0) x[i] = m_variable.m_distributionMin;
|
|
|
|
|
if(bounded && i == 200) x[i] = m_variable.m_distributionMax;
|
|
|
|
|
valid = valid && convertSamplingValue(m_variable.m_varName, x[i], samplingBaseUnit(m_variable.m_varName),
|
|
|
|
|
@ -1086,9 +1088,7 @@ bool nmWxSensitive::saveDataFromUI()
|
|
|
|
|
detailStack->setCurrentIndex(idx + 1);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
// 均值、众数及有界分布的上下限沿用确定性方法的系统允许范围。
|
|
|
|
|
if(valid && variable.m_distribution < nmDataSensitive::VariableSampling::UNIFORM)
|
|
|
|
|
valid = validSamplingValue(name, variable.m_mean);
|
|
|
|
|
// 均值描述原分布,可以在截断区间之外;显式上下限及众数仍需符合系统范围。
|
|
|
|
|
if(valid && variable.m_distribution >= nmDataSensitive::VariableSampling::TRUNCATED_NORMAL)
|
|
|
|
|
valid = validSamplingValue(name, variable.m_distributionMin) &&
|
|
|
|
|
validSamplingValue(name, variable.m_distributionMax);
|
|
|
|
|
@ -2119,28 +2119,7 @@ void nmWxSensitive::onPreviewClicked()
|
|
|
|
|
QMessageBox::warning(this, tr("Sensitivity"), error);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 普通正态、对数正态仍可能抽到越界值;整批检查通过后才显示预览,不裁剪或重抽。
|
|
|
|
|
QVector<double> values;
|
|
|
|
|
for(int run = 0; run < m_sensitiveData.getMonteCarloCount(); ++run) {
|
|
|
|
|
if(!m_sensitiveData.getRunValues(run, values)) return;
|
|
|
|
|
for(int i = 0; i < m_sensitiveData.getVariableCount(); ++i) {
|
|
|
|
|
const nmDataSensitive::VariableSampling& variable = m_sensitiveData.getVariable(i);
|
|
|
|
|
if(!variable.getEnabled() || validSamplingValue(variable.m_varName, values[i])) continue;
|
|
|
|
|
const QString name = variable.m_varName;
|
|
|
|
|
const QString unit = variable.m_modelValue.getUnit();
|
|
|
|
|
double lower = 0.0, upper = 0.0, value = values[i];
|
|
|
|
|
samplingPhysicalRange(name, lower, upper);
|
|
|
|
|
convertSamplingValue(name, lower, samplingBaseUnit(name), unit, lower);
|
|
|
|
|
convertSamplingValue(name, upper, samplingBaseUnit(name), unit, upper);
|
|
|
|
|
convertSamplingValue(name, value, samplingBaseUnit(name), unit, value);
|
|
|
|
|
QMessageBox::warning(this, tr("Sensitivity"),
|
|
|
|
|
tr("%1: run %2 sampled %3 %4 outside the allowed range [%5, %6]. Adjust the distribution settings or use a bounded distribution.")
|
|
|
|
|
.arg(name).arg(run + 1).arg(formatSamplingValue(value, 6)).arg(unit)
|
|
|
|
|
.arg(formatSamplingValue(lower, 6)).arg(formatSamplingValue(upper, 6)));
|
|
|
|
|
detailStack->setCurrentIndex(findVariableIndex(name) + 1);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 样本已在允许范围内生成,直接显示预览。
|
|
|
|
|
}
|
|
|
|
|
// Saphir 风格的连续运行列表,组合数再大也不显示分页控件。
|
|
|
|
|
QDialog dialog(this);
|
|
|
|
|
|