|
|
|
#ifndef ATTRACTORKERNEL_HPP
|
|
|
|
#define ATTRACTORKERNEL_HPP
|
|
|
|
|
|
|
|
#include <cstdlib>
|
|
|
|
|
|
|
|
#include "stfu/stf.hpp"
|
|
|
|
|
|
|
|
class AttractorKernel {
|
|
|
|
private:
|
|
|
|
|
|
|
|
void allocate();
|
|
|
|
void dealloc();
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
|
|
// biggest type first, this will reduce sizeof(AttractorKernel)
|
|
|
|
// size is now 40 (when the unsigned int are in front, it was 48)
|
|
|
|
double* parameters;
|
|
|
|
double* vectorNew;
|
|
|
|
double* vectorOld;
|
|
|
|
|
|
|
|
unsigned int numberOfParameters;
|
|
|
|
unsigned int dimension;
|
|
|
|
|
|
|
|
// stuff used by subclasses
|
|
|
|
AttractorKernel(const unsigned int dimension, const unsigned int numberOfParameters);
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
// parameters are stored in a array of doubles
|
|
|
|
double& operator[](const unsigned int index);
|
|
|
|
double const& operator[](const unsigned int index) const;
|
|
|
|
unsigned int getNumberOfParameters() const;
|
|
|
|
|
|
|
|
virtual void generate_random_parameters() {
|
|
|
|
for(unsigned int i = 0; i < numberOfParameters; ++i)
|
|
|
|
parameters[i] = 2.0 * rand() / double(RAND_MAX) - 1.0;
|
|
|
|
for(unsigned int i = 0; i < dimension; ++i)
|
|
|
|
vectorNew[i] = vectorOld[i] = 6.0 * rand() / double(RAND_MAX) - 3.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// tests
|
|
|
|
bool convergent(){
|
|
|
|
double sum = 0.0;
|
|
|
|
for(unsigned int i = 0; i < dimension; ++i){
|
|
|
|
sum += (vectorNew[i] - vectorOld[i])*(vectorNew[i] - vectorOld[i]);
|
|
|
|
}
|
|
|
|
return sum < 1.0e-6;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool divergent(){
|
|
|
|
double sum = 0.0;
|
|
|
|
for(unsigned int i = 0; i < dimension; ++i){
|
|
|
|
sum += (vectorNew[i] - vectorOld[i])*(vectorNew[i] - vectorOld[i]);
|
|
|
|
}
|
|
|
|
return sum > 1.0e3;
|
|
|
|
}
|
|
|
|
|
|
|
|
// iterate his formula, implemented by subclasses
|
|
|
|
virtual void operator()() = 0;
|
|
|
|
|
|
|
|
// getter functions for teh resulta (can't be used as setters)
|
|
|
|
double const* vector() const;
|
|
|
|
double const* previousVector() const;
|
|
|
|
unsigned int getDimension() const;
|
|
|
|
|
|
|
|
// dtor, should be virtual for subclasses to be deleted
|
|
|
|
virtual ~AttractorKernel();
|
|
|
|
|
|
|
|
// factory function
|
|
|
|
static AttractorKernel* createAttractorKernel(stfu::node& attractorKernel);
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif // ATTRACTORKERNEL_HPP
|
|
|
|
|