Program Listing for File GWRScalable.h
↰ Return to documentation for file (include/gwmodelpp/GWRScalable.h)
#ifndef GWRSCALABLE_H
#define GWRSCALABLE_H
#include <utility>
#include <string>
#include <initializer_list>
#include "GWRBase.h"
#include "RegressionDiagnostic.h"
#include "IBandwidthSelectable.h"
#include "IVarialbeSelectable.h"
#include "IParallelizable.h"
#include <gsl/gsl_vector.h>
#include <gsl/gsl_multimin.h>
namespace gwm
{
class GWRScalable : public GWRBase
{
public:
    enum BandwidthSelectionCriterionType
    {
        AIC,
        CV
    };
    struct LoocvParams
    {
        const arma::mat* x;
        const arma::mat* y;
        const arma::uword polynomial;
        const arma::mat* Mx0;
        const arma::mat* My0;
    };
    static double Loocv(const arma::vec& target, const arma::mat& x, const arma::vec& y, arma::uword poly, const arma::mat& Mx0, const arma::mat& My0);
    static double AICvalue(const arma::vec& target, const arma::mat& x, const arma::vec& y, arma::uword poly, const arma::mat& Mx0, const arma::mat& My0);
private:
    static RegressionDiagnostic CalcDiagnostic(const arma::mat& x, const arma::vec& y, const arma::mat& betas, const arma::vec& shat);
public:
    GWRScalable(){};
    ~GWRScalable(){};
    arma::uword polynomial() const { return mPolynomial; }
    void setPolynomial(arma::uword polynomial) { mPolynomial = polynomial; }
    double cv() const { return mCV; }
    double scale() const { return mScale; }
    double penalty() const { return mPenalty; }
    bool hasHatMatrix() const { return mHasHatMatrix; }
    void setHasHatMatrix(const bool has) { mHasHatMatrix = has; }
    BandwidthSelectionCriterionType parameterOptimizeCriterion() const
    {
        return mParameterOptimizeCriterion;
    }
    void setParameterOptimizeCriterion(const BandwidthSelectionCriterionType ¶meterOptimizeCriterion)
    {
        mParameterOptimizeCriterion = parameterOptimizeCriterion;
    }
public:     // SpatialAlgorithm interface
    bool isValid() override;
public:     // IRegressionAnalysis interface
    arma::mat fit() override;
    arma::mat predict(const arma::mat& locations) override;
private:
    void findDataPointNeighbours();
    arma::mat findNeighbours(const arma::mat& points, arma::umat &nnIndex);
    double optimize(const arma::mat& Mx0, const arma::mat& My0, double& b_tilde, double& alpha);
    void prepare();
    arma::mat fitSerial(const arma::mat &x, const arma::vec &y);
    arma::mat predictSerial(const arma::mat& locations, const arma::mat& x, const arma::vec& y);
private:
    arma::uword mPolynomial = 4;
    size_t mMaxIter = 500;
    double mCV = 0.0;
    double mScale = 1.0;
    double mPenalty = 0.01;
    bool mHasHatMatrix = true;
    SpatialWeight mDpSpatialWeight;
    BandwidthSelectionCriterionType mParameterOptimizeCriterion = BandwidthSelectionCriterionType::CV;
    arma::mat mG0;
    arma::umat mDpNNIndex;
    arma::mat mDpNNDists;
    arma::mat mMx0;
    arma::mat mMxx0;
    arma::mat mMy0;
    arma::vec mShat;
    arma::mat mBetasSE;
};
}
#endif  // GWRSCALABLE_H