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

212 lines
7.6 KiB
C

#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;
// 井参数使用稳定井编码区分;空编码表示共用储层参数或旧版主井参数。
QString m_wellCode;
QString displayName() const;
QString parameterKey() const;
// 是否勾选
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