diff --git a/Attractor.cpp b/Attractor.cpp index 7d2c7b1..5132381 100644 --- a/Attractor.cpp +++ b/Attractor.cpp @@ -79,7 +79,7 @@ Attractor::Attractor(const char* const fileName) { // read parameters - const unsigned int numberOfParameters = myAttractor->numberOfParameters(); + const unsigned int numberOfParameters = myAttractor->getNumberOfParameters(); for ( unsigned int i = 0; i < numberOfParameters; i++ ) { stfu::node attractorParameters = attractor.getChild("parameters"); @@ -103,7 +103,7 @@ void Attractor::init_range() { } // initialize projectors with dimension and first point - const unsigned int dimension = myAttractor->dimension(); + const unsigned int dimension = myAttractor->getDimension(); const double * point = myAttractor->vector(); for ( std::vector::iterator it = projectors.begin(); it != projectors.end(); it++ ) { (*it)->extern_dim = dimension; @@ -167,7 +167,7 @@ void Attractor::plot() { IO & control */ void Attractor::output() { - const unsigned int dimension = myAttractor->dimension(); + const unsigned int dimension = myAttractor->getDimension(); const double * point = myAttractor->vector(); for ( unsigned int i = 0; i < dimension; i++ ) { diff --git a/AttractorKernel.cpp b/AttractorKernel.cpp new file mode 100644 index 0000000..fb3ad1a --- /dev/null +++ b/AttractorKernel.cpp @@ -0,0 +1,89 @@ +/* + * AttractorKernel.cpp + * AwesomeAttractor + * + * Created by Joshua Moerman on 07-08-10. + * Copyright 2010 Rodo. All rights reserved. + * + */ + +#include "AttractorKernel.hpp" +#include +#include + +#pragma mark - +#pragma mark memory + +AttractorKernel::AttractorKernel(const unsigned int dimension, const unsigned int numberOfParameters): +numberOfParameters(numberOfParameters), dimension(dimension) { + + try { + parameters = new double[numberOfParameters]; + + vectorNew = new double[dimension]; + vectorOld = new double[dimension]; + } catch (std::bad_alloc& e) { + std::cerr << "Exception: " << e.what() << std::endl; + std::cerr << "Quiting because nothing to do... " << std::endl; + exit(1); + } + + std::fill_n(parameters, numberOfParameters, 0.0); + std::fill_n(vectorNew, dimension, 0.0); + std::fill_n(vectorOld, dimension, 0.0); + +} + +AttractorKernel::~AttractorKernel(){ + delete[] vectorOld; + delete[] vectorNew; + delete[] parameters; +} + +void AttractorKernel::reallocParameters(const unsigned int newNumberOfParameters){ + delete[] parameters; + + numberOfParameters = newNumberOfParameters; + + try { + parameters = new double[numberOfParameters]; + } + catch (std::bad_alloc& e) { + std::cerr << "Exception: " << e.what() << std::endl; + std::cerr << "Quiting because nothing to do... " << std::endl; + exit(1); + } + + std::fill_n(parameters, numberOfParameters, 0.0); +} + +#pragma mark - +#pragma mark parameters + +double & AttractorKernel::operator[](const unsigned int index){ + return parameters[index]; +} + +double const & AttractorKernel::operator[](const unsigned int index) const{ + return parameters[index]; +} + +unsigned int AttractorKernel::getNumberOfParameters() const{ + return numberOfParameters; +} + +#pragma mark - +#pragma mark vector + +double const * AttractorKernel::vector() const{ + return vectorNew; +} + +double const * AttractorKernel::previousVector() const{ + return vectorOld; +} + +unsigned int AttractorKernel::getDimension() const{ + return dimension; +} + diff --git a/AttractorKernel.hpp b/AttractorKernel.hpp index dc71523..2b5f18f 100644 --- a/AttractorKernel.hpp +++ b/AttractorKernel.hpp @@ -3,30 +3,43 @@ /* - Protocol/interface, what you want + ABC */ class AttractorKernel { +private: + + +protected: + + // stuff used by subclasses + AttractorKernel(const unsigned int dimension, const unsigned int numberOfParameters); + void reallocParameters(const unsigned int numberOfParameters); + + unsigned int numberOfParameters; + double * parameters; + + unsigned int dimension; + double * vectorNew; + double * vectorOld; + + public: // parameters are stored in a array of doubles - // if you want to use other types, use the properties - virtual double & operator[](const unsigned int index) = 0; - virtual double const & operator[](const unsigned int index) const = 0; + double & operator[](const unsigned int index); + double const & operator[](const unsigned int index) const; + unsigned int getNumberOfParameters() const; - virtual unsigned int numberOfParameters() const = 0; - - // iterate his formula - // vector pointers will be swapped! so new remains new and old remains old + // iterate his formula, implemented by subclasses virtual void operator()() = 0; - // getter functions for teh resulta (can be used as setters, and it may be used as such) - virtual double * & vector() = 0; - virtual double * & previousVector() = 0; - - virtual unsigned int dimension() const = 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, default is generally good - virtual ~AttractorKernel() {}; + // dtor, should be virtual for subclasses to be deleted + virtual ~AttractorKernel(); }; diff --git a/defines.hpp b/defines.hpp index aff37f6..866614b 100644 --- a/defines.hpp +++ b/defines.hpp @@ -1,7 +1,7 @@ //TODO: do this with files -#define ATTRACTOR_FILE "attractors/testPolynomial.stf" +#define ATTRACTOR_FILE "attractors/testLorenz.stf" #ifdef UNI_BUILD #warning Building for the RU, are you sure? diff --git a/kernels/KernelBasicParameter.cpp b/kernels/KernelBasicParameter.cpp deleted file mode 100644 index cce6c6f..0000000 --- a/kernels/KernelBasicParameter.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* - * KernelBasicParameter.cpp - * AwesomeAttractor - * - * Created by Joshua Moerman on 18-07-10. - * Copyright 2010 Rodo. All rights reserved. - * - */ - -#include "KernelBasicParameter.hpp" -#include - - -#pragma mark - -#pragma mark Memory managment - -KernelBasicParameter::KernelBasicParameter(const unsigned int numberOfParameters): -myNumberOfParameters(numberOfParameters){ - init(); -} - -void KernelBasicParameter::resetNumberOfParameters(const unsigned int numberOfParameters){ - dealloc(); - myNumberOfParameters = numberOfParameters; - init(); -} - -KernelBasicParameter::~KernelBasicParameter(){ - dealloc(); -} - -void KernelBasicParameter::init(){ - parameters = new double[myNumberOfParameters]; - - for ( unsigned int i = 0; i < myNumberOfParameters; i++ ) { - parameters[i] = 0.0; - } -} - -void KernelBasicParameter::dealloc(){ - delete[] parameters; -} - - -#pragma mark - -#pragma mark Implementation - -double & KernelBasicParameter::operator[](const unsigned int index){ - return parameters[index]; -} - -double const & KernelBasicParameter::operator[](const unsigned int index) const{ - return parameters[index]; -} - -unsigned int KernelBasicParameter::numberOfParameters() const{ - return myNumberOfParameters; -} \ No newline at end of file diff --git a/kernels/KernelBasicParameter.hpp b/kernels/KernelBasicParameter.hpp deleted file mode 100644 index 320cf87..0000000 --- a/kernels/KernelBasicParameter.hpp +++ /dev/null @@ -1,46 +0,0 @@ -/* - * KernelBasicParameter.hpp - * AwesomeAttractor - * - * Created by Joshua Moerman on 18-07-10. - * Copyright 2010 Rodo. All rights reserved. - * - */ - -#ifndef KERNELBASICPARAMETER_HPP -#define KERNELBASICPARAMETER_HPP - -#include "../AttractorKernel.hpp" - -/* - This is a partial default implementation of the abstract AttractorKernel class - you can easily use the constructor to initialise the parameters and stuff... - */ -class KernelBasicParameter : virtual public AttractorKernel { -private: - - void init(); - void dealloc(); - -protected: - - unsigned int myNumberOfParameters; - double * parameters; - - KernelBasicParameter(const unsigned int numberOfParameters); - virtual ~KernelBasicParameter(); - - void resetNumberOfParameters(const unsigned int numberOfParameters); - -public: - - // parameters are stored in a array of doubles - // if you want to use other types, use the properties - virtual double & operator[](const unsigned int index); - virtual double const & operator[](const unsigned int index) const; - - virtual unsigned int numberOfParameters() const; - -}; - -#endif \ No newline at end of file diff --git a/kernels/KernelBasicVector.cpp b/kernels/KernelBasicVector.cpp deleted file mode 100644 index b8398ec..0000000 --- a/kernels/KernelBasicVector.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - * KernelBasicVector.cpp - * AwesomeAttractor - * - * Created by Joshua Moerman on 18-07-10. - * Copyright 2010 Rodo. All rights reserved. - * - */ - -#include "KernelBasicVector.hpp" -#include - - -#pragma mark - -#pragma mark Memory Managment - -KernelBasicVector::KernelBasicVector(const unsigned int dimension): -myDimension(dimension){ - init(); -} - -KernelBasicVector::~KernelBasicVector(){ - dealloc(); -} - -void KernelBasicVector::init(){ - vectorNew = new double[myDimension]; - vectorOld = new double[myDimension]; - - for ( unsigned int i = 0; i < myDimension; i++ ) { - vectorNew[i] = vectorOld[i] = 0.0; - } -} - -void KernelBasicVector::dealloc(){ - delete[] vectorOld; - delete[] vectorNew; -} - - -#pragma mark - -#pragma mark Implementation - -double * & KernelBasicVector::vector(){ - return vectorNew; -} - -double * & KernelBasicVector::previousVector(){ - return vectorOld; -} - -unsigned int KernelBasicVector::dimension() const{ - return myDimension; -} - diff --git a/kernels/KernelBasicVector.hpp b/kernels/KernelBasicVector.hpp deleted file mode 100644 index a37ce14..0000000 --- a/kernels/KernelBasicVector.hpp +++ /dev/null @@ -1,45 +0,0 @@ -/* - * KernelBasicVector.hpp - * AwesomeAttractor - * - * Created by Joshua Moerman on 18-07-10. - * Copyright 2010 Rodo. All rights reserved. - * - */ - -#ifndef KERNELBASICVECTOR_HPP -#define KERNELBASICVECTOR_HPP - -#include "../AttractorKernel.hpp" - -/* - This is a partial default implementation of the abstract AttractorKernel class - you can easily use the constructor to initialise the vectors and stuff... - */ -class KernelBasicVector : virtual public AttractorKernel { -private: - - void init(); - void dealloc(); - -protected: - - unsigned int myDimension; - - double * vectorNew; - double * vectorOld; - - KernelBasicVector(const unsigned int dimension); - virtual ~KernelBasicVector(); - -public: - - // getter functions for teh resulta (can be used as setters, and it may be used as such) - virtual double * & vector(); - virtual double * & previousVector(); - - virtual unsigned int dimension() const; - -}; - -#endif \ No newline at end of file diff --git a/kernels/Logistic.cpp b/kernels/Logistic.cpp index 0943ab7..696a238 100644 --- a/kernels/Logistic.cpp +++ b/kernels/Logistic.cpp @@ -10,16 +10,14 @@ #include Logistic::Logistic(): - KernelBasicParameter(3), - KernelBasicVector(3) { + AttractorKernel(3, 3) { init(); } Logistic::Logistic(const unsigned int dimension): - KernelBasicParameter(dimension), - KernelBasicVector(dimension) { + AttractorKernel(dimension, dimension) { init(); @@ -28,7 +26,7 @@ Logistic::Logistic(const unsigned int dimension): void Logistic::init() { // setting some starting values - for ( unsigned int i = 0; i < myDimension; i++ ) { + for ( unsigned int i = 0; i < dimension; i++ ) { vectorNew[i] = vectorOld[i] = 0.5; } @@ -38,7 +36,7 @@ void Logistic::operator()() { std::swap(vectorNew, vectorOld); - for ( unsigned int i = 0; i < myDimension; i++ ) { + for ( unsigned int i = 0; i < dimension; i++ ) { vectorNew[i] = parameters[i]*vectorOld[i]*(1.0 - vectorOld[i]); } diff --git a/kernels/Logistic.hpp b/kernels/Logistic.hpp index 3cbe0e4..dca5792 100644 --- a/kernels/Logistic.hpp +++ b/kernels/Logistic.hpp @@ -1,10 +1,9 @@ #ifndef LOGISTIC_HPP #define LOGISTIC_HPP -#include "KernelBasicParameter.hpp" -#include "KernelBasicVector.hpp" +#include "../AttractorKernel.hpp" -class Logistic : public KernelBasicParameter, public KernelBasicVector { +class Logistic : public AttractorKernel { private: void init(); diff --git a/kernels/Lorenz3D.cpp b/kernels/Lorenz3D.cpp index 43bd02f..6a35fc1 100644 --- a/kernels/Lorenz3D.cpp +++ b/kernels/Lorenz3D.cpp @@ -2,8 +2,7 @@ #include Lorenz3D::Lorenz3D(): - KernelBasicParameter(4), - KernelBasicVector(3){ + AttractorKernel(3, 4){ init(); @@ -12,7 +11,7 @@ Lorenz3D::Lorenz3D(): void Lorenz3D::init() { // setting some starting values - for ( unsigned int i = 0; i < myDimension; i++ ) { + for ( unsigned int i = 0; i < dimension; i++ ) { vectorNew[i] = vectorOld[i] = 1.0; } diff --git a/kernels/Lorenz3D.hpp b/kernels/Lorenz3D.hpp index 69f90b5..819929c 100644 --- a/kernels/Lorenz3D.hpp +++ b/kernels/Lorenz3D.hpp @@ -1,10 +1,9 @@ #ifndef LORENZ_HPP #define LORENZ_HPP -#include "KernelBasicParameter.hpp" -#include "KernelBasicVector.hpp" +#include "../AttractorKernel.hpp" -class Lorenz3D : public KernelBasicParameter, public KernelBasicVector { +class Lorenz3D : public AttractorKernel { private: void init(); diff --git a/kernels/Polynomial.cpp b/kernels/Polynomial.cpp index abf523b..445627a 100644 --- a/kernels/Polynomial.cpp +++ b/kernels/Polynomial.cpp @@ -11,29 +11,27 @@ //#include Polynomial::Polynomial(): - KernelBasicParameter(0), - KernelBasicVector(3), + AttractorKernel(3, 0), orde(2){ init(); } Polynomial::Polynomial(const unsigned int dimension, const unsigned int orde): - KernelBasicParameter(0), - KernelBasicVector(dimension), + AttractorKernel(dimension, 0), orde(orde) { init(); } void Polynomial::init() { const unsigned int number = calculateNumberOfParameters(); - KernelBasicParameter::resetNumberOfParameters(number); + reallocParameters(number); } // i want to has constexpr, so the ctor can be clean :] unsigned int Polynomial::calculateNumberOfParameters() { double n_coef = orde + 1; - for (unsigned int i = 2; i <= myDimension; i++) { + for (unsigned int i = 2; i <= dimension; i++) { n_coef = n_coef*(orde + i)/(i - 1); } @@ -45,7 +43,7 @@ void Polynomial::operator()() { std::swap(vectorNew, vectorOld); unsigned int m = 0; - for ( unsigned int i = 0; i < myDimension; i++ ) { + for ( unsigned int i = 0; i < dimension; i++ ) { vectorNew[i] = parameters[m]; m++; @@ -56,7 +54,7 @@ void Polynomial::operator()() { void Polynomial::recur(unsigned int curr_dimension, unsigned int prev_i, unsigned int n, unsigned int& m, double prev_product) { double product; - for (unsigned int i = prev_i; i < myDimension; i++) { + for (unsigned int i = prev_i; i < dimension; i++) { product = prev_product * vectorOld[i]; vectorNew[curr_dimension] += parameters[m] * product; @@ -67,3 +65,8 @@ void Polynomial::recur(unsigned int curr_dimension, unsigned int prev_i, unsigne } } + + + + + diff --git a/kernels/Polynomial.hpp b/kernels/Polynomial.hpp index 4f73fbd..3572258 100644 --- a/kernels/Polynomial.hpp +++ b/kernels/Polynomial.hpp @@ -1,10 +1,9 @@ #ifndef POLYNOMIAL_HPP #define POLYNOMIAL_HPP -#include "KernelBasicParameter.hpp" -#include "KernelBasicVector.hpp" +#include "../AttractorKernel.hpp" -class Polynomial : public KernelBasicParameter, public KernelBasicVector { +class Polynomial : public AttractorKernel { private: unsigned int orde; diff --git a/kernels/PolynomialA3D.cpp b/kernels/PolynomialA3D.cpp index 8dfeccb..ac664d5 100644 --- a/kernels/PolynomialA3D.cpp +++ b/kernels/PolynomialA3D.cpp @@ -10,8 +10,7 @@ #include PolynomialA3D::PolynomialA3D(): - KernelBasicParameter(3), - KernelBasicVector(3){ + AttractorKernel(3, 3){ init(); } diff --git a/kernels/PolynomialA3D.hpp b/kernels/PolynomialA3D.hpp index 0ff2a00..74de519 100644 --- a/kernels/PolynomialA3D.hpp +++ b/kernels/PolynomialA3D.hpp @@ -1,10 +1,9 @@ #ifndef POLYNOMIALA3D_HPP #define POLYNOMIALA3D_HPP -#include "KernelBasicParameter.hpp" -#include "KernelBasicVector.hpp" +#include "../AttractorKernel.hpp" -class PolynomialA3D : public KernelBasicParameter, public KernelBasicVector { +class PolynomialA3D : public AttractorKernel { private: void init(); diff --git a/kernels/Unravel3D.cpp b/kernels/Unravel3D.cpp index 7842475..aebe7f5 100644 --- a/kernels/Unravel3D.cpp +++ b/kernels/Unravel3D.cpp @@ -3,8 +3,7 @@ #include Unravel3D::Unravel3D(): - KernelBasicParameter(7), - KernelBasicVector(3){ + AttractorKernel(3, 7){ } diff --git a/kernels/Unravel3D.hpp b/kernels/Unravel3D.hpp index 32e060c..5b68d9d 100644 --- a/kernels/Unravel3D.hpp +++ b/kernels/Unravel3D.hpp @@ -1,10 +1,9 @@ #ifndef UNRAVEL_HPP #define UNRAVEL_HPP -#include "KernelBasicParameter.hpp" -#include "KernelBasicVector.hpp" +#include "../AttractorKernel.hpp" -class Unravel3D : public KernelBasicParameter, public KernelBasicVector { +class Unravel3D : public AttractorKernel { public: Unravel3D();