From ca8cc66a0a5bd2d1e6fdabd0182463101e1c87bc Mon Sep 17 00:00:00 2001 From: Joshua Date: Fri, 2 Apr 2010 12:07:56 +0200 Subject: [PATCH] almost all kernels made --- Attractor.cpp | 66 +----------- Attractor.hpp | 2 - AwesomeAttractor.cbp | 10 +- kernels/{Lorenz.cpp => Lorenz3D.cpp} | 2 +- kernels/{Lorenz.hpp => Lorenz3D.hpp} | 0 kernels/Polynomial.cpp | 134 +++++++++++++++++++++++++ kernels/Polynomial.hpp | 48 +++++++++ kernels/PolynomialA3D.cpp | 60 +++++++++++ kernels/PolynomialA3D.hpp | 42 ++++++++ kernels/{Unravel.cpp => Unravel3D.cpp} | 2 +- kernels/{Unravel.hpp => Unravel3D.hpp} | 0 main.cpp | 4 +- 12 files changed, 294 insertions(+), 76 deletions(-) rename kernels/{Lorenz.cpp => Lorenz3D.cpp} (98%) rename kernels/{Lorenz.hpp => Lorenz3D.hpp} (100%) create mode 100644 kernels/Polynomial.cpp create mode 100644 kernels/Polynomial.hpp create mode 100644 kernels/PolynomialA3D.cpp create mode 100644 kernels/PolynomialA3D.hpp rename kernels/{Unravel.cpp => Unravel3D.cpp} (98%) rename kernels/{Unravel.hpp => Unravel3D.hpp} (100%) diff --git a/Attractor.cpp b/Attractor.cpp index 5685ebd..d93b0b3 100644 --- a/Attractor.cpp +++ b/Attractor.cpp @@ -100,21 +100,7 @@ void Attractor::init(unsigned int dim_in, FormulaChoice formula_in, unsigned int orde = orde_in; switch (formula) { - case POLY_N: { - double n_coef = orde + 1; - for (unsigned int i = 2; i <= dim; i++) { - n_coef = n_coef*(orde + i)/(i - 1); - } - - par = (unsigned int) n_coef; - break; - } - case LORENZ: { - assert(dim == 3 || dim == 4); - par = dim + 1; - break; - } - case POLY_A: { + case POLY_A: {4 par = dim; break; } @@ -122,11 +108,6 @@ void Attractor::init(unsigned int dim_in, FormulaChoice formula_in, unsigned int par = dim; break; } - case UNRAVEL: { - assert(dim == 3); - par = 7; - break; - } default: { cout << "Formula not recognized" << endl; exit(1); @@ -231,18 +212,11 @@ void Attractor::iterate() { // calculations switch (formula) { - case POLY_N: - polynome(); - break; case POLY_A: poly_A(); break; - case POLY_2: - poly_2(); - break; - case LOGISTIC: logistic(); break; @@ -267,40 +241,6 @@ void Attractor::iterate() { #endif } -void Attractor::polynome() { - unsigned int m = 0; - for ( unsigned int i = 0; i < dim; i++ ) { - -#ifdef HARDDEBUG - cout << "Entering new dimension: " << i << " With m = " << m << endl; -#endif - - new_point[i] = param[m]; - m++; - recur(i, 0, 1, m); - } - -} - -void Attractor::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 < dim; i++) { - -#ifdef HARDDEBUG - for ( unsigned int j = 0; j < n; j++ ) - cout << " "; - cout << "Calculation in dimension: " << i << " With m = " << m << " And depth = " << n << endl; -#endif - - product = prev_product * point[i]; - new_point[curr_dimension] += param[m] * product; - m++; - if (n < orde) { - recur(curr_dimension, i, n+1, m, product); - } - } -} - void Attractor::poly_A() { switch (dim) { case 3: @@ -316,10 +256,6 @@ void Attractor::poly_A() { } } -void Attractor::poly_2() { - exit(2); -} - void Attractor::logistic() { for ( unsigned int i = 0; i < dim; i++ ) { new_point[i] = param[i]*point[i]*(1.0 - point[i]); diff --git a/Attractor.hpp b/Attractor.hpp index 3a6e116..d09d30c 100644 --- a/Attractor.hpp +++ b/Attractor.hpp @@ -47,8 +47,6 @@ public: // TODO : optimaliseren voor lage graads veeltermen void iterate(); - void polynome(); - void recur(unsigned int curr_dimension, unsigned int prev_i, unsigned int n, unsigned int& m, double prev_product = 1.0); void poly_A(); void poly_2(); void logistic(); diff --git a/AwesomeAttractor.cbp b/AwesomeAttractor.cbp index 0f63995..2963061 100644 --- a/AwesomeAttractor.cbp +++ b/AwesomeAttractor.cbp @@ -46,10 +46,12 @@ - - - - + + + + + + diff --git a/kernels/Lorenz.cpp b/kernels/Lorenz3D.cpp similarity index 98% rename from kernels/Lorenz.cpp rename to kernels/Lorenz3D.cpp index 1b869a2..23ee8ea 100644 --- a/kernels/Lorenz.cpp +++ b/kernels/Lorenz3D.cpp @@ -1,4 +1,4 @@ -#include "Lorenz.hpp" +#include "Lorenz3D.hpp" Lorenz::Lorenz() { init(); diff --git a/kernels/Lorenz.hpp b/kernels/Lorenz3D.hpp similarity index 100% rename from kernels/Lorenz.hpp rename to kernels/Lorenz3D.hpp diff --git a/kernels/Polynomial.cpp b/kernels/Polynomial.cpp new file mode 100644 index 0000000..f4dff5d --- /dev/null +++ b/kernels/Polynomial.cpp @@ -0,0 +1,134 @@ +// +// $filename +// $projectname +// +// Created by Joshua moerman on $TODAY. +// Copyright 2010 Joshua Moerman. All rights reserved. +// + + +Polynomial::Polynomial() { + dimension = 3; + orde = 2; + + init(); +} + +Polynomial::Polynomial(const unsigned int dimension, const unsigned int orde): + dimension(dimension), orde(orde) { + init(); +} + +void Polynomial::init(){ + calculateNumberOfParameters(); + if ( myParameters != NULL ) { + delete myParameters; + } + myParameters = new double[numberOfParameters]; + + if ( vectorNew != NULL ) { + delete vectorNew; + } + vectorNew = new double[dimension]; + + if ( vectorOld != NULL ) { + delete vectorOld; + } + vectorOld = new double[dimension]; + + assert(myParameters != NULL); + assert(vectorNew != NULL); + assert(vectorOld != NULL); + for ( unsigned int i = 0; i < numberOfParameters; i++ ) { + myParameters[i] = 0.0; + } + for ( unsigned int i = 0; i < dimension; i++ ) { + vectorNew[i] = vectorOld[i] = 0.0; + } +} + +void Polynomial::calculateNumberOfParameters(){ + double n_coef = orde + 1; + for (unsigned int i = 2; i <= dim; i++) { + n_coef = n_coef*(orde + i)/(i - 1); + } + + numberOfParameters = (unsigned int) n_coef; +} + +void Polynomial::iterate() { + unsigned int m = 0; + for ( unsigned int i = 0; i < dim; i++ ) { + +#ifdef HARDDEBUG + cout << "Entering new dimension: " << i << " With m = " << m << endl; +#endif + + new_point[i] = param[m]; + m++; + recur(i, 0, 1, m); + } + +} + +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 < dim; i++) { + +#ifdef HARDDEBUG + for ( unsigned int j = 0; j < n; j++ ) + cout << " "; + cout << "Calculation in dimension: " << i << " With m = " << m << " And depth = " << n << endl; +#endif + + product = prev_product * point[i]; + new_point[curr_dimension] += param[m] * product; + m++; + if (n < orde) { + recur(curr_dimension, i, n+1, m, product); + } + } +} + + +// setters, getters, all i/o to other classes/objects +void * Polynomial::getProperty(const string identifier) { + if ( identifier == "dimension" ) { + unsigned int * _return = new unsigned int; + *_return = dimension; + return _return; + } else if ( identifier == "orde" ) { + unsigned int * _return = new unsigned int; + *_return = orde; + return _return; + } + return NULL; +} + +void Polynomial::setProperty(const string identifier, const void * _value) { + if ( identifier == "dimension" ) { + unsigned int * value = (unsigned int*) _value; + dimension = *value; + init(); + } else if ( identifier == "orde" ) { + unsigned int * value = (unsigned int*) _value; + orde = *value; + init(); + } +} + +double * & Polynomial::parameters() { + return myParameters; +} + +double & Polynomial::parameter(const unsigned int index) { + return myParameters[index]; +} + +double * & Polynomial::vector() { + return vectorNew; +} + +double * & Polynomial::previousVector() { + return vectorOld; +} diff --git a/kernels/Polynomial.hpp b/kernels/Polynomial.hpp new file mode 100644 index 0000000..2708d8d --- /dev/null +++ b/kernels/Polynomial.hpp @@ -0,0 +1,48 @@ +#ifndef POLYNOMIAL_HPP +#define POLYNOMIAL_HPP + +#include "../AttractorKernel.hpp" + +class Polynomial : public AttractorKernel { + + double * myParameters; + + double * vectorNew; + double * vectorOld; + + unsigned int dimension; + unsigned int orde; + unsigned int numberOfParameters; + + void init(); + void calculateNumberOfParameters(); + void recur(unsigned int curr_dimension, unsigned int prev_i, unsigned int n, unsigned int& m, double prev_product); + + public: + + Polynomial(); + Polynomial(const unsigned int dimensions, const unsigned int orde); + + // parameters are stored in a array of doubles + // if you want to use other types, use the properties + virtual double& parameter(const unsigned int index); + virtual double*& parameters(); + + // get properties of the attractor + // such as the dimension + // you should delete the void pointer if you used it + virtual void * getProperty(const string identifier); + virtual void setProperty(const string identifier, const void * value); + + // iterate his formula + // vector pointers will be swapped! so new remains new and old remains old + virtual void iterate(); + + // getter functions for teh resulta + virtual double * & vector(); + virtual double * & previousVector(); + +}; + +#endif // POLYNOMIAL_HPP + diff --git a/kernels/PolynomialA3D.cpp b/kernels/PolynomialA3D.cpp new file mode 100644 index 0000000..63dc9fb --- /dev/null +++ b/kernels/PolynomialA3D.cpp @@ -0,0 +1,60 @@ +// +// $filename +// $projectname +// +// Created by Joshua moerman on $TODAY. +// Copyright 2010 Joshua Moerman. All rights reserved. +// + +const static unsigned int dimension = 3; +const static unsigned int numberOfParameters = 3; + +PolynomialA3D::PolynomialA3D(){ + init(); +} + +void PolynomialA3D::init(){ + myParameters = new double[numberOfParameters]; + vectorNew = new double[dimension]; + vectorOld = new double[dimension]; + + assert(myParameters != NULL); + assert(vectorNew != NULL); + assert(vectorOld != NULL); + for ( unsigned int i = 0; i < numberOfParameters; i++ ) { + myParameters[i] = 0.0; + } + for ( unsigned int i = 0; i < dimension; i++ ) { + vectorNew[i] = vectorOld[i] = 0.0; + } +} + +// setters, getters, all i/o to other classes/objects +void * PolynomialA3D::getProperty(const string identifier) { + if ( identifier == "dimension" ) { + unsigned int * _return = new unsigned int; + *_return = dimension; + return _return; + } + return NULL; +} + +void PolynomialA3D::setProperty(const string identifier, const void * _value) { + +} + +double * & PolynomialA3D::parameters() { + return myParameters; +} + +double & PolynomialA3D::parameter(const unsigned int index) { + return myParameters[index]; +} + +double * & PolynomialA3D::vector() { + return vectorNew; +} + +double * & PolynomialA3D::previousVector() { + return vectorOld; +} diff --git a/kernels/PolynomialA3D.hpp b/kernels/PolynomialA3D.hpp new file mode 100644 index 0000000..3f1a338 --- /dev/null +++ b/kernels/PolynomialA3D.hpp @@ -0,0 +1,42 @@ +#ifndef POLYNOMIALA3D_HPP +#define POLYNOMIALA3D_HPP + +#include "../AttractorKernel.hpp" + +class PolynomialA3D : public AttractorKernel { +// of course this can be seen as a subclasse of Polynomial + + double * myParameters; + + double * vectorNew; + double * vectorOld; + + void init(); + + public: + + PolynomialA3D(); + + // parameters are stored in a array of doubles + // if you want to use other types, use the properties + virtual double& parameter(const unsigned int index); + virtual double*& parameters(); + + // get properties of the attractor + // such as the dimension + // you should delete the void pointer if you used it + virtual void * getProperty(const string identifier); + virtual void setProperty(const string identifier, const void * value); + + // iterate his formula + // vector pointers will be swapped! so new remains new and old remains old + virtual void iterate(); + + // getter functions for teh resulta + virtual double * & vector(); + virtual double * & previousVector(); + +}; + +#endif // POLYNOMIALA3D_HPP + diff --git a/kernels/Unravel.cpp b/kernels/Unravel3D.cpp similarity index 98% rename from kernels/Unravel.cpp rename to kernels/Unravel3D.cpp index 939dc85..540c8d6 100644 --- a/kernels/Unravel.cpp +++ b/kernels/Unravel3D.cpp @@ -1,4 +1,4 @@ -#include "Unravel.hpp" +#include "Unravel3D.hpp" Unravel::Unravel(){ init(); diff --git a/kernels/Unravel.hpp b/kernels/Unravel3D.hpp similarity index 100% rename from kernels/Unravel.hpp rename to kernels/Unravel3D.hpp diff --git a/main.cpp b/main.cpp index e33584a..90919bf 100644 --- a/main.cpp +++ b/main.cpp @@ -6,14 +6,12 @@ using namespace std; #include "Projector.hpp" #include "AttractorKernel.hpp" -#include "kernels/Lorenz.hpp" +#include "kernels/Lorenz3D.hpp" // TODO : Allemaal files inlezen, voor makkelijker gebruik int main(int argc, char *argv[]) { - // even iets te committen hebben - AttractorKernel * mijnAttractortje; mijnAttractortje = new Lorenz(); AttractorKernel &attractor = *mijnAttractortje;