My old project for strange attractors
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
 
 
 

77 lines
1.9 KiB

#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