|
|
|
|
|
#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 <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_bSucceeded(false), m_bCancelled(false), m_bVisible(true) {}
|
|
|
|
|
|
quint64 m_nRunIndex;
|
|
|
|
|
|
QVector<double> m_vecParameters;
|
|
|
|
|
|
QVector<QVector<double> > m_vecPressure;
|
|
|
|
|
|
QVector<QVector<double> > m_vecLogLog;
|
|
|
|
|
|
QVector<QVector<double> > m_vecSemiLog;
|
|
|
|
|
|
bool m_bSucceeded;
|
|
|
|
|
|
bool m_bCancelled;
|
|
|
|
|
|
bool m_bVisible;
|
|
|
|
|
|
QString m_sFailureReason;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
struct NM_DATA_EXPORT BatchResult
|
|
|
|
|
|
{
|
|
|
|
|
|
BatchResult() : m_calcType(CALC_DETERMINISTIC), m_bCompleted(false), m_bStopped(false) {}
|
|
|
|
|
|
CalculationType m_calcType;
|
|
|
|
|
|
QList<VariableSampling> m_variables; // 求解时冻结的配置,独立于之后的参数编辑。
|
|
|
|
|
|
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;
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
|
|
// === 总模型数 ===
|
|
|
|
|
|
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);
|
|
|
|
|
|
// 记录采样范围对应的求解快照,成功重新求解后再初始化范围。
|
|
|
|
|
|
QString getModelSnapshotId() const;
|
|
|
|
|
|
void setModelSnapshotId(const QString& snapshotId);
|
|
|
|
|
|
// 后台运行时由任务独占,线程结束后交给分析数据管理并由界面修改可见性。
|
|
|
|
|
|
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;
|
|
|
|
|
|
quint64 m_totalModelCount;
|
|
|
|
|
|
bool m_usesBaseUnits;
|
|
|
|
|
|
QString m_modelSnapshotId;
|
|
|
|
|
|
QList<VariableSampling> m_variables;
|
|
|
|
|
|
int m_monteCarloCount;
|
|
|
|
|
|
QVector<QVector<double> > m_monteCarloValues;
|
|
|
|
|
|
QSharedPointer<BatchResult> m_results;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif // NMDATASENSITIVE_H
|