#ifndef dtGPThreshold_HH
#define dtGPThreshold_HH

/****************************************************************************
 * GP threshold 
 * Jnaneshwar Das jnaneshd@usc.edu
 ****************************************************************************/

#include "DecisionTool.hh"
#include "SmartSamplerData.hh"
#include "GPTLogger.hh"
#include <vector>
#include <stdio.h>


#define NUM_TRAIN_DATA  71
#define NUM_TRAIN_DIM  6
#define AuvDirNameEnv "AUV"

class dtGPThreshold : public DecisionTool{
public:
    dtGPThreshold(char *nameIn);
    ~dtGPThreshold();
    
    void loadConfig(char *cfgname,SmartSamplerData *ssdIn);
    bool update();
    void reset();
    void readArrays();
    
    
private:
    typedef struct{
        SmartSamplerData::ssd_measurement_t type;
        double initthresh;
        double thresh;
    }STData_t;
    char *name;
    double ell,sf2,org_abun_thresh_high,org_abun_thresh_low,org_abun_thresh_high_override;
    int gulpCount;
    SmartSamplerData *ssd;
    long double trainVector[NUM_TRAIN_DATA][NUM_TRAIN_DIM];
    double alphaVector[NUM_TRAIN_DATA];
    
    double meanSensorVector[NUM_TRAIN_DIM];
    double stdevSensorVector[NUM_TRAIN_DIM];
    double aug_vector_y_scaling;
    double depth_thresh;
    long double gulpsTakenData[11][NUM_TRAIN_DIM+2];
    double spikeFilterSigma;
    char trainMatrixFilenameFullpath[512];
    char alphaVectorFilenameFullpath[512];
    
    char meanSensorFilenameFullpath[512];
    char stdSensorFilenameFullpath[512];
    
    double skipCorrFlag;
    long double optimumCorrThreshold;
    double correlationThreshold;
    long int tickCounter; // two ticks per second 
    long int tickLastFired;
    
    double tickFireThreshold;
    double minTickWaitTimeThreshold;
    
    GPTLogger log;
    typedef std::vector<STData_t>::iterator di_t;
    std::vector<STData_t> cfg;
    long double sq_dist(long double vec1[], long double vec[], int);
    bool sensorReadingsWithinRange(long double sensorReadingVector[]);
    long double minCorrelationWithExistingDataPoints(long double vec1[]);
    void loadDataFiles();
    std::string popToken(std::string&, const std::string&);
    
    
}; // dtGPThreshold

#endif // dtGPThreshold_HH
