You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/nmNum/nmData/nmDataSensitive.h

208 lines
7.4 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#ifndef NMDATASENSITIVE_H
#define NMDATASENSITIVE_H
#include <QObject>
#include <QList>
#include <QVector>
#include <QString>
#include <QSharedPointer>
#include <vector>
#include "nmData_global.h"
#include "nmDataBase.h"
#include "nmDataAttribute.h"
#include "nmDataAutomaticFitting.h"
#include <rapidjson/document.h>
class NM_DATA_EXPORT nmDataSensitive : public nmDataBase
{
Q_OBJECT
public:
// 顶部 Calculation type
enum CalculationType
{
CALC_DETERMINISTIC = 0,
CALC_DETERMINISTIC_MULTIVARIATE = 1,
CALC_MONTE_CARLO = 2
};
struct NM_DATA_EXPORT VariableSampling
{
// 变量所属分组
QString m_varGroup;
// 变量名称
QString m_varName;
// 是否勾选
bool m_enabled;
// Mode 枚举
enum Mode
{
MODE_AUTOMATIC = 0,
MODE_MANUAL = 1
};
// Mode 存储字段
Mode m_mode;
// Log? 勾选
bool m_log;
// Number
int m_number;
// 数据参数
nmDataAttribute m_modelValue; // Model value
nmDataAttribute m_minValue; // Minimum
nmDataAttribute m_maxValue; // Maximum
// 表格中的数值列表
QVector<double> m_values;
// Monte-Carlo 分布设置与确定性取值独立,随分析配置保存。
enum Distribution { NORMAL, LOGNORMAL, TRUNCATED_NORMAL, TRUNCATED_LOGNORMAL, UNIFORM, TRIANGULAR };
Distribution m_distribution;
bool m_distributionInitialized;
double m_mean, m_stdDev, m_peak, m_distributionMin, m_distributionMax;
bool distributionQuantile(double probability, double& value, bool limitToPhysicalRange = true) const;
VariableSampling();
// JSON 序列化 / 反序列化
rapidjson::Value ToJsonValue(rapidjson::Document::AllocatorType& allocator) const;
void FromJsonValue(const rapidjson::Value& jsonValue);
// varGroup
QString getVarGroup() const;
void setVarGroup(const QString& group);
// varName
QString getVarName() const;
void setVarName(const QString& name);
// enabled
bool getEnabled() const;
void setEnabled(bool e);
// mode
Mode getMode() const;
void setMode(Mode m);
// log
bool getLog() const;
void setLog(bool l);
// number
int getNumber() const;
void setNumber(int n);
// modelValue
nmDataAttribute& getModelValue();
void setModelValue(const nmDataAttribute& attr);
// minValue
nmDataAttribute& getMinValue();
void setMinValue(const nmDataAttribute& attr);
// maxValue
nmDataAttribute& getMaxValue();
void setMaxValue(const nmDataAttribute& attr);
// values
QVector<double>& getValues();
void setValues(const QVector<double>& vals);
// 自动采样始终保留原始精度;手动模式直接返回用户指定值。
QVector<double> samplingValues() const;
};
// 运行结果属于分析数据,求解器与界面共用同一结构,避免重复复制整批曲线。
struct RunResult
{
RunResult() : m_nRunIndex(0), m_dPressureRmse(-1.0), m_bSucceeded(false), m_bCancelled(false), m_bVisible(true) {}
quint64 m_nRunIndex;
QVector<double> m_vecParameters;
QVector<double> m_vecFittedParameters; // 本组 LM 最优值,与批次拟合参数顺序一致。
QVector<QVector<double> > m_vecPressure;
QVector<QVector<double> > m_vecLogLog;
QVector<QVector<double> > m_vecSemiLog;
double m_dPressureRmse; // Monte-Carlo 压力均方根误差(MPa),-1 表示尚无有效误差。
bool m_bSucceeded;
bool m_bCancelled;
bool m_bVisible;
QString m_sFailureReason;
};
struct NM_DATA_EXPORT BatchResult
{
BatchResult() : m_calcType(CALC_DETERMINISTIC), m_dFilterThreshold(-1.0), m_nHistogramVariable(-1), m_nHistogramBins(20), m_bCompleted(false), m_bStopped(false) {}
CalculationType m_calcType;
QList<VariableSampling> m_variables; // 求解时冻结的配置,独立于之后的参数编辑。
QList<nmDataAttribute> m_fitParameters; // 名称、基准单位和本批分析开始时的模型值。
QStringList m_fitParameterCodes; // 对应 XML 的参数编码,与拟合参数同序。
QString m_sWellCode;
QString m_sWellName;
QString m_sAxisXName;
QString m_sAxisXUnit;
QString m_sAxisYName;
QString m_sAxisYUnit;
QVector<QVector<double> > m_vecHistoryLogLog;
QVector<QVector<double> > m_vecBaseLogLog; // 批次启动时原模型已有的数值解。
std::vector<RunResult> m_runs;
// 散点筛选阈值随当前批次保存,负值表示尚未筛选。
double m_dFilterThreshold;
int m_nHistogramVariable; // -1 为误差,其余为拟合参数下标。
int m_nHistogramBins; // 直方图分箱数,与统计变量一起恢复。
bool statisticValue(const RunResult& run, int variable, double& value) const;
bool filteredParameterBounds(int index, double& minimum, double& maximum, bool fitted = false) const;
bool m_bCompleted;
bool m_bStopped;
QString m_sFailureReason;
rapidjson::Value ToJsonValue(rapidjson::Document::AllocatorType& allocator) const;
void FromJsonValue(const rapidjson::Value& value);
};
public:
nmDataSensitive();
~nmDataSensitive();
nmDataSensitive(const nmDataSensitive& other);
nmDataSensitive& operator=(const nmDataSensitive& other);
// === 实现 nmDataBase 的抽象方法 ===
virtual rapidjson::Value ToJsonValue(rapidjson::Document::AllocatorType& allocator) const override;
virtual void FromJsonValue(const rapidjson::Value& jsonValue) override;
// === Calculation type ===
CalculationType getCalculationType() const;
void setCalculationType(CalculationType type);
// 第四种仍复用 Monte-Carlo 采样,独立保存改善开关与确认的拟合设置。
bool isImproveEnabled() const;
void setImproveEnabled(bool enabled);
QSharedPointer<const nmSensitivityFitSettings> getImproveSettings() const;
void setImproveSettings(const QSharedPointer<const nmSensitivityFitSettings>& settings);
// === 总模型数 ===
quint64 getTotalModelCount() const;
void setTotalModelCount(quint64 count);
quint64 calculateModelCount(bool* overflow = nullptr) const;
// 返回与变量列表对应的基准单位值,未改变的参数保持模型值。
bool getRunValues(quint64 runIndex, QVector<double>& values) const;
// 每次预览重新分层抽样,生成和预览滚动复用本批结果。
bool resampleMonteCarlo(QString* error = nullptr);
// 采样设置改变后丢弃旧样本,下次预览或生成时重建。
void clearMonteCarloSamples();
int getMonteCarloCount() const;
void setMonteCarloCount(int count);
bool usesBaseUnits() const;
void setUsesBaseUnits(bool enabled);
// 后台运行时由任务独占,线程结束后交给分析数据管理并由界面修改可见性。
QSharedPointer<BatchResult> getResults() const;
void setResults(const QSharedPointer<BatchResult>& results);
// === 变量列表 ===
QList<VariableSampling>& getVariables();
const QList<VariableSampling>& getVariables() const;
void setVariables(const QList<VariableSampling>& vars);
int getVariableCount() const;
VariableSampling& getVariable(int index);
private:
CalculationType m_calcType;
bool m_improveEnabled;
QSharedPointer<const nmSensitivityFitSettings> m_improveSettings;
quint64 m_totalModelCount;
bool m_usesBaseUnits;
QList<VariableSampling> m_variables;
int m_monteCarloCount;
QVector<QVector<double> > m_monteCarloValues;
QSharedPointer<BatchResult> m_results;
};
#endif // NMDATASENSITIVE_H