Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 10 additions & 7 deletions include/gwmodelpp/BandwidthSelector.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <map>
#include <vector>
#include <utility>
#include "Status.h"
#include "IBandwidthSelectable.h"
#include "spatialweight/BandwidthWeight.h"

Expand All @@ -21,7 +22,7 @@ class BandwidthSelector
/**
* @brief \~english Construct a new Bandwidth Selector object. \~chinese 构造一个新的 BandwidthSelector 对象。
*/
BandwidthSelector() {}
BandwidthSelector(const BandwidthWeight& bandwidth): mBandwidth(bandwidth), mOptimisedBandwidth(bandwidth) {}

/**
* @brief \~english Construct a new Bandwidth Selector object. \~chinese 构造一个新的 BandwidthSelector 对象。
Expand All @@ -30,7 +31,7 @@ class BandwidthSelector
* @param lower \~english Lower bound \~chinese 下限
* @param upper \~english Upper bound \~chinese 上限
*/
BandwidthSelector(BandwidthWeight* bandwidth, double lower, double upper) : mBandwidth(bandwidth) , mLower(lower) , mUpper(upper) {}
BandwidthSelector(const BandwidthWeight& bandwidth, double lower, double upper) : mBandwidth(bandwidth), mOptimisedBandwidth(bandwidth), mLower(lower) , mUpper(upper) {}

/**
* @brief \~english Destroy the Bandwidth Selector object. \~chinese 销毁 BandwidthSelector 对象。
Expand All @@ -40,18 +41,19 @@ class BandwidthSelector
public:

/**
* @brief \~english Get the bandwidth. \~chinese 获取带宽
* @brief \~english Get the bandwidth. \~chinese 获取优化后的带宽
*
* @return BandwidthWeight* \~english Bandwidth \~chinese 带宽
*/
BandwidthWeight *bandwidth() const { return mBandwidth; }
// const BandwidthWeight *bandwidth() const { return mBandwidth; }
const BandwidthWeight& result() const { return mOptimisedBandwidth; }

/**
* @brief \~english Set the bandwidth. \~chinese 设置带宽。
*
* @param bandwidth \~english Bandwidth \~chinese 带宽
*/
void setBandwidth(BandwidthWeight *bandwidth) { mBandwidth = bandwidth; }
// void setBandwidth(BandwidthWeight *bandwidth) { mBandwidth = bandwidth; }

/**
* @brief \~english Get the lower bound. \~chinese 获取下限。
Expand Down Expand Up @@ -96,10 +98,11 @@ class BandwidthSelector
* @param instance \~english A pointer to a instance of type inherited from gwm::IBandwidthSelectable \~chinese 指向派生自 gwm::IBandwidthSelectable 类型对象的指针
* @return std::vector<std::size_t> \~english Optimized bandwdith \~chinese 优选后的带宽
*/
BandwidthWeight* optimize(IBandwidthSelectable* instance);
Status optimize(IBandwidthSelectable* instance);

private:
BandwidthWeight* mBandwidth; //!< \~english Bandwidth \~chinese 带宽
const BandwidthWeight& mBandwidth; //!< \~english Bandwidth \~chinese 带宽
BandwidthWeight mOptimisedBandwidth;
double mLower; //!< \~english Lower bound \~chinese 下限
double mUpper; //!< \~english Upper bound \~chinese 上限
std::unordered_map<double, double> mBandwidthCriterion; //!< \~english List of criterion values for each bandwidth \~chinese 带宽优选过程中每种带宽对应的指标值列表
Expand Down
30 changes: 15 additions & 15 deletions include/gwmodelpp/GTDR.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class GTDR : public SpatialAlgorithm, public IRegressionAnalysis, public IVarial
AIC //!< AIC
};

typedef double (GTDR::*BandwidthCriterionCalculator)(const std::vector<BandwidthWeight*>&); //!< \~english Calculator to get criterion for bandwidth optimization \~chinese 带宽优选指标值计算函数
typedef double (GTDR::*BandwidthCriterionCalculator)(const std::vector<std::reference_wrapper<BandwidthWeight>>&); //!< \~english Calculator to get criterion for bandwidth optimization \~chinese 带宽优选指标值计算函数

typedef double (GTDR::*IndepVarCriterionCalculator)(const std::vector<std::size_t>&); //!< \~english Calculator to get criterion for variable optimization \~chinese 变量优选指标值计算函数

Expand Down Expand Up @@ -367,7 +367,7 @@ class GTDR : public SpatialAlgorithm, public IRegressionAnalysis, public IVarial
* @param bandwidths \~english Given bandwidths \~chinese 给定带宽值
* @return double \~english Criterion value \~chinese 指标值
*/
double bandwidthCriterion(const std::vector<BandwidthWeight*>& bandwidths)
double bandwidthCriterion(const std::vector<std::reference_wrapper<BandwidthWeight>>& bandwidths)
{
return (this->*mBandwidthCriterionFunction)(bandwidths);
}
Expand Down Expand Up @@ -403,15 +403,15 @@ class GTDR : public SpatialAlgorithm, public IRegressionAnalysis, public IVarial
* @param bandwidths \~english Given bandwidths \~chinese 给定带宽值
* @return double \~english Criterion value \~chinese 指标值
*/
double bandwidthCriterionAICSerial(const std::vector<BandwidthWeight*>& bandwidths);
double bandwidthCriterionAICSerial(const std::vector<std::reference_wrapper<BandwidthWeight>>& bandwidths);

/**
* @brief \~english Non-parallel implementation of calculator to get CV criterion for given bandwidths. \~chinese 获取给定带宽值对应的CV值的非并行实现。
*
* @param bandwidths \~english Given bandwidths \~chinese 给定带宽值
* @return double \~english Criterion value \~chinese 指标值
*/
double bandwidthCriterionCVSerial(const std::vector<BandwidthWeight*>& bandwidths);
double bandwidthCriterionCVSerial(const std::vector<std::reference_wrapper<BandwidthWeight>>& bandwidths);

/**
* @brief \~english Non-parallel implementation of calculator to get AIC criterion for given variable combination. \~chinese 获取给定变量组合对应的AIC值的非并行实现。
Expand Down Expand Up @@ -451,15 +451,15 @@ class GTDR : public SpatialAlgorithm, public IRegressionAnalysis, public IVarial
* @param bandwidths \~english Given bandwidths \~chinese 给定带宽值
* @return double \~english Criterion value \~chinese 指标值
*/
double bandwidthCriterionAICOmp(const std::vector<BandwidthWeight*>& bandwidths);
double bandwidthCriterionAICOmp(const std::vector<std::reference_wrapper<BandwidthWeight>>& bandwidths);

/**
* @brief \~english Multithreading implementation of calculator to get CV criterion for given bandwidths. \~chinese 获取给定带宽值对应的CV值的多线程实现。
*
* @param bandwidths \~english Given bandwidths \~chinese 给定带宽值
* @return double \~english Criterion value \~chinese 指标值
*/
double bandwidthCriterionCVOmp(const std::vector<BandwidthWeight*>& bandwidths);
double bandwidthCriterionCVOmp(const std::vector<std::reference_wrapper<BandwidthWeight>>& bandwidths);

/**
* @brief \~english Multithreading implementation of calculator to get AIC criterion for given variable combination. \~chinese 获取给定变量组合对应的AIC值的多线程实现。
Expand Down Expand Up @@ -533,7 +533,7 @@ class GTDRBandwidthOptimizer
struct Parameter
{
GTDR* instance; //!< \~english A GTDR instance \~chinese 一个 GTDR 实例
std::vector<BandwidthWeight*>* bandwidths; //!< \~english Bandwidths \~chinese 带宽
std::vector<std::reference_wrapper<BandwidthWeight>> bandwidths; //!< \~english Bandwidths \~chinese 带宽
arma::uword featureCount; //!< \~english Total number of features \~chinese 要素总数
};

Expand All @@ -553,13 +553,13 @@ class GTDRBandwidthOptimizer
* @param weights \~english Bandwidth weight \~chinese 带宽设置
* @return std::string \~english Information string \~chinese 信息字符串
*/
static std::string infoBandwidthCriterion(const std::vector<BandwidthWeight*>& weights)
static std::string infoBandwidthCriterion(const std::vector<std::reference_wrapper<BandwidthWeight>>& weights)
{
std::size_t number = 1;
std::vector<std::string> labels(weights.size());
std::transform(weights.cbegin(), weights.cend(), labels.begin(), [&number](const BandwidthWeight* bw)
std::transform(weights.cbegin(), weights.cend(), labels.begin(), [&number](const BandwidthWeight& bw)
{
return std::to_string(number++) + ":" + (bw->adaptive() ? "adaptive" : "fixed");
return std::to_string(number++) + ":" + (bw.adaptive() ? "adaptive" : "fixed");
});
return std::string(GWM_LOG_TAG_BANDWIDTH_CIRTERION) + strjoin(",", labels) + ",criterion";
}
Expand All @@ -572,12 +572,12 @@ class GTDRBandwidthOptimizer
* @param criterion \~english Criterion value \~chinese 指标值
* @return std::string \~english Information string \~chinese 信息字符串
*/
static std::string infoBandwidthCriterion(const std::vector<BandwidthWeight*>& weights, const double criterion)
static std::string infoBandwidthCriterion(const std::vector<std::reference_wrapper<BandwidthWeight>>& weights, const double criterion)
{
std::vector<std::string> labels(weights.size());
std::transform(weights.cbegin(), weights.cend(), labels.begin(), [](const BandwidthWeight* bw)
std::transform(weights.cbegin(), weights.cend(), labels.begin(), [](const BandwidthWeight& bw)
{
return std::to_string(bw->bandwidth());
return std::to_string(bw.bandwidth());
});
return std::string(GWM_LOG_TAG_BANDWIDTH_CIRTERION) + strjoin(",", labels) + "," + std::to_string(criterion);
}
Expand All @@ -589,7 +589,7 @@ class GTDRBandwidthOptimizer
*
* @param weights \~english Initial values of bandwidths \~chinese 带宽初始值
*/
explicit GTDRBandwidthOptimizer(const std::vector<BandwidthWeight*>& weights) : mBandwidths(weights) {}
explicit GTDRBandwidthOptimizer(const std::vector<std::reference_wrapper<BandwidthWeight>>& weights) : mBandwidths(weights) {}

/**
* @brief \~english Optimize bandwidth for a GTDR model. \~chinese 为 GTDR 模型优选带宽。
Expand All @@ -604,7 +604,7 @@ class GTDRBandwidthOptimizer
const int optimize(GTDR* instance, arma::uword featureCount, std::size_t maxIter, double eps, double step);

private:
std::vector<BandwidthWeight*> mBandwidths; //!< \~english Bandwidths \~chinese 带宽
const std::vector<std::reference_wrapper<BandwidthWeight>>& mBandwidths; //!< \~english Bandwidths \~chinese 带宽
};

}
Expand Down
39 changes: 16 additions & 23 deletions include/gwmodelpp/GTWR.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class GTWR : public GWRBase, public IBandwidthSelectable, public IParallelizabl
typedef arma::mat (GTWR::*PredictCalculator)(const arma::mat&, const arma::mat&, const arma::vec&);//!< \~english Predict function declaration. \~chinese 预测函数声明。
typedef arma::mat (GTWR::*FitCalculator)(const arma::mat&, const arma::vec&, arma::mat&, arma::vec&, arma::vec&, arma::mat&);//!< \~english Fit function declaration. \~chinese 拟合函数声明。

typedef double (GTWR::*BandwidthSelectionCriterionCalculator)(BandwidthWeight*);//!< \~english Declaration of criterion calculator for bandwidth selection. \~chinese 带宽优选指标计算函数声明。
typedef double (GTWR::*BandwidthSelectionCriterionCalculator)(const std::unique_ptr<BandwidthWeight>&);//!< \~english Declaration of criterion calculator for bandwidth selection. \~chinese 带宽优选指标计算函数声明。
typedef double (GTWR::*IndepVarsSelectCriterionCalculator)(const std::vector<std::size_t>&);//!< \~english Declaration of criterion calculator for variable selection. \~chinese 变量优选指标计算函数声明。

/**
Expand Down Expand Up @@ -78,19 +78,11 @@ class GTWR : public GWRBase, public IBandwidthSelectable, public IParallelizabl
}

const double getLambda() {
if (mStdistance != nullptr) {
return mStdistance->lambda();
} else {
throw std::runtime_error("mStdistance is not initialized");
}
return stDistance().lambda();
}

const double getAngle(){
if (mStdistance != nullptr) {
return mStdistance->angle();
} else {
throw std::runtime_error("mStdistance is not initialized");
}
return stDistance().angle();
}

private:
Expand Down Expand Up @@ -447,7 +439,7 @@ class GTWR : public GWRBase, public IBandwidthSelectable, public IParallelizabl
#endif

public: // Implement IBandwidthSelectable
Status getCriterion(BandwidthWeight* weight, double& criterion) override
Status getCriterion(const std::unique_ptr<BandwidthWeight>& weight, double& criterion) override
{
criterion = (this->*mBandwidthSelectionCriterionFunction)(weight);
return mStatus;
Expand All @@ -468,7 +460,7 @@ class GTWR : public GWRBase, public IBandwidthSelectable, public IParallelizabl
* @param bandwidthWeight 指定的带宽。
* @return double 带宽优选的指标值。
*/
double bandwidthSizeCriterionCVSerial(BandwidthWeight* bandwidthWeight);
double bandwidthSizeCriterionCVSerial(const std::unique_ptr<BandwidthWeight>& bandwidthWeight);

/**
* \~english
Expand All @@ -483,7 +475,7 @@ class GTWR : public GWRBase, public IBandwidthSelectable, public IParallelizabl
* @param weigbandwidthWeightht 指定的带宽。
* @return double 带宽优选的指标值。
*/
double bandwidthSizeCriterionAICSerial(BandwidthWeight* bandwidthWeight);
double bandwidthSizeCriterionAICSerial(const std::unique_ptr<BandwidthWeight>& bandwidthWeight);

#ifdef ENABLE_OPENMP
/**
Expand All @@ -499,7 +491,7 @@ class GTWR : public GWRBase, public IBandwidthSelectable, public IParallelizabl
* @param bandwidthWeight 指定的带宽。
* @return double 带宽优选的指标值。
*/
double bandwidthSizeCriterionCVOmp(BandwidthWeight* bandwidthWeight);
double bandwidthSizeCriterionCVOmp(const std::unique_ptr<BandwidthWeight>& bandwidthWeight);

/**
* \~english
Expand All @@ -514,7 +506,7 @@ class GTWR : public GWRBase, public IBandwidthSelectable, public IParallelizabl
* @param bandwidthWeight 指定的带宽。
* @return double 带宽优选的指标值。
*/
double bandwidthSizeCriterionAICOmp(BandwidthWeight* bandwidthWeight);
double bandwidthSizeCriterionAICOmp(const std::unique_ptr<BandwidthWeight>& bandwidthWeight);
#endif


Expand Down Expand Up @@ -594,7 +586,7 @@ class GTWR : public GWRBase, public IBandwidthSelectable, public IParallelizabl
* @param bandwidthWeight 传入带宽值,来获取权重,后续更方便改成多元优化.
* @return double 返回优选以后的lambda值.
*/
double lambdaAutoSelection(BandwidthWeight* bandwidthWeight);
double lambdaAutoSelection(const BandwidthWeight& bandwidthWeight);

/**
* \~english
Expand All @@ -610,11 +602,11 @@ class GTWR : public GWRBase, public IBandwidthSelectable, public IParallelizabl
* @param rsquare 根据输入的lambda值和带宽获取的R方值.
* @return Status 算法运行状态。
*/
Status r_squareByLambda(BandwidthWeight* bandwidthWeight,double lambda, double& rsquare);
Status r_squareByLambda(const BandwidthWeight& bandwidthWeight,double lambda, double& rsquare);

struct Parameter {
GTWR* instance; // GTWR实例
BandwidthWeight* bandwidth; // 带宽
BandwidthWeight& bandwidth; // 带宽
double lambda; // lambda
};

Expand Down Expand Up @@ -646,7 +638,7 @@ class GTWR : public GWRBase, public IBandwidthSelectable, public IParallelizabl
* @param min_step 优化中的步长,设置为0.01(变化阈值为步长/1000)
* @return 优化结果,一个向量:(lambda, bw).
*/
arma::vec lambdaBwAutoSelection(BandwidthWeight* bandwidth, size_t max_iter, double min_step);
arma::vec lambdaBwAutoSelection(BandwidthWeight& bandwidth, size_t max_iter, double min_step);

/**
* \~english
Expand All @@ -662,7 +654,7 @@ class GTWR : public GWRBase, public IBandwidthSelectable, public IParallelizabl
* @param criterion BandwidthSelectionCriterionType类型,确定求的指标
* @return 对应类型的指标值
*/
double criterionByLambdaBw(BandwidthWeight* bandwidth, double lambda, BandwidthSelectionCriterionType criterion);
double criterionByLambdaBw(const BandwidthWeight& bandwidth, double lambda, BandwidthSelectionCriterionType criterion);

public:
/**
Expand All @@ -681,6 +673,9 @@ class GTWR : public GWRBase, public IBandwidthSelectable, public IParallelizabl

void setIsAutoselectLambdaBw(bool isAutoSelect) { mIsAutoselectLambdaBw = isAutoSelect; }

protected:
CRSSTDistance& stDistance() const { return mSpatialWeight.distance<CRSSTDistance>(); }

protected:

bool mHasHatMatrix = true; //!< \~english Whether has hat-matrix. \~chinese 是否具有帽子矩阵。
Expand Down Expand Up @@ -709,8 +704,6 @@ class GTWR : public GWRBase, public IBandwidthSelectable, public IParallelizabl

arma::vec vTimes; //!< \~english vectors for timestamp input. \~chinese 输入时间的向量。

CRSSTDistance* mStdistance;//use to change spatial temporal distance including lambda

};

}
Expand Down
16 changes: 8 additions & 8 deletions include/gwmodelpp/GWCorrelation.h
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ class GWCorrelation : public SpatialMultiscaleAlgorithm, public IMultivariateAna

public: //bandwidth selection

typedef double (GWCorrelation::*BandwidthSizeCriterionFunction)(BandwidthWeight*); //!< \~english Function to calculate the criterion for given bandwidth size. \~chinese 根据指定带宽大小计算对应指标值的函数。
typedef double (GWCorrelation::*BandwidthSizeCriterionFunction)(const std::unique_ptr<BandwidthWeight>&); //!< \~english Function to calculate the criterion for given bandwidth size. \~chinese 根据指定带宽大小计算对应指标值的函数。

bool isAutoselectBandwidth() { return mIsAutoselectBandwidth; }

Expand Down Expand Up @@ -294,7 +294,7 @@ class GWCorrelation : public SpatialMultiscaleAlgorithm, public IMultivariateAna
* \~chinese
* @brief 带宽优选指标计算函数声明。
*/
typedef double (GWCorrelation::*BandwidthSelectionCriterionCalculator)(BandwidthWeight*);
typedef double (GWCorrelation::*BandwidthSelectionCriterionCalculator)(const std::unique_ptr<BandwidthWeight>&);

// bool isAutoselectBandwidth() const { return mIsAutoselectBandwidth; }
// void setIsAutoselectBandwidth(bool isAutoSelect) { mIsAutoselectBandwidth = isAutoSelect; }
Expand Down Expand Up @@ -354,7 +354,7 @@ class GWCorrelation : public SpatialMultiscaleAlgorithm, public IMultivariateAna
* @param bandwidthWeight 指定的带宽。
* @return double 带宽优选的指标值。
*/
double bandwidthSizeCriterionCVSerial(BandwidthWeight* bandwidthWeight);
double bandwidthSizeCriterionCVSerial(const std::unique_ptr<BandwidthWeight>& bandwidthWeight);

/**
* \~english
Expand All @@ -369,16 +369,16 @@ class GWCorrelation : public SpatialMultiscaleAlgorithm, public IMultivariateAna
* @param weigbandwidthWeightht 指定的带宽。
* @return double 带宽优选的指标值。
*/
double bandwidthSizeCriterionAICSerial(BandwidthWeight* bandwidthWeight);
double bandwidthSizeCriterionAICSerial(const std::unique_ptr<BandwidthWeight>& bandwidthWeight);

#ifdef ENABLE_OPENMP
double bandwidthSizeCriterionCVOmp(BandwidthWeight* bandwidthWeight);
double bandwidthSizeCriterionCVOmp(const std::unique_ptr<BandwidthWeight>& bandwidthWeight);

double bandwidthSizeCriterionAICOmp(BandwidthWeight* bandwidthWeight);
double bandwidthSizeCriterionAICOmp(const std::unique_ptr<BandwidthWeight>& bandwidthWeight);
#endif

public: // Implement IBandwidthSelectable
Status getCriterion(BandwidthWeight* weight, double& criterion) override
Status getCriterion(const std::unique_ptr<BandwidthWeight>& weight, double& criterion) override
{
criterion = (this->*mBandwidthSizeCriterion)(weight);
return mStatus;
Expand Down Expand Up @@ -464,7 +464,7 @@ class GWCorrelation : public SpatialMultiscaleAlgorithm, public IMultivariateAna
protected:
// std::vector<SpatialWeight> mSpatialWeights; //!< Spatial weight configuration.

BandwidthWeight* bandwidth(size_t i)
BandwidthWeight& bandwidth(size_t i)
{
return mSpatialWeights[i].weight<BandwidthWeight>();
}
Expand Down
Loading
Loading