|
|
|
/*
|
|
|
|
* AttractorKernel.cpp
|
|
|
|
* AwesomeAttractor
|
|
|
|
*
|
|
|
|
* Created by Joshua Moerman on 07-08-10.
|
|
|
|
* Copyright 2010 Rodo. All rights reserved.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "AttractorKernel.hpp"
|
|
|
|
#include "Logger.hpp"
|
|
|
|
#include <algorithm>
|
|
|
|
|
|
|
|
#pragma mark -
|
|
|
|
#pragma mark memory
|
|
|
|
|
|
|
|
AttractorKernel::AttractorKernel(const unsigned int dimension, const unsigned int numberOfParameters) :
|
|
|
|
numberOfParameters(numberOfParameters), dimension(dimension) {
|
|
|
|
|
|
|
|
try {
|
|
|
|
allocate();
|
|
|
|
} catch(std::exception& e) {
|
|
|
|
LogError("Couldn't construct Attractorkernel: %s\n", e.what());
|
|
|
|
dealloc();
|
|
|
|
}
|
|
|
|
|
|
|
|
std::fill_n(parameters, numberOfParameters, 0.0);
|
|
|
|
std::fill_n(vectorNew, dimension, 0.0);
|
|
|
|
std::fill_n(vectorOld, dimension, 0.0);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
AttractorKernel::~AttractorKernel() {
|
|
|
|
dealloc();
|
|
|
|
}
|
|
|
|
|
|
|
|
void AttractorKernel::allocate() {
|
|
|
|
parameters = new double[numberOfParameters];
|
|
|
|
vectorNew = new double[dimension];
|
|
|
|
vectorOld = new double[dimension];
|
|
|
|
}
|
|
|
|
|
|
|
|
void AttractorKernel::dealloc() {
|
|
|
|
delete[] vectorOld;
|
|
|
|
vectorOld = NULL;
|
|
|
|
delete[] vectorNew;
|
|
|
|
vectorNew = NULL;
|
|
|
|
delete[] parameters;
|
|
|
|
parameters = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
#pragma mark -
|
|
|
|
#pragma mark parameters
|
|
|
|
|
|
|
|
// NOTE: inlining these functions (with the keyword inline) improves performance by at most 1% (tested)
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
#pragma mark -
|
|
|
|
#pragma mark factory function
|
|
|
|
|
|
|
|
#include "kernels/Logistic.hpp"
|
|
|
|
#include "kernels/Lorenz3D.hpp"
|
|
|
|
#include "kernels/Polynomial.hpp"
|
|
|
|
#include "kernels/PolynomialA3D.hpp"
|
|
|
|
#include "kernels/Unravel3D.hpp"
|
|
|
|
|
|
|
|
AttractorKernel* AttractorKernel::createAttractorKernel(stfu::node& attractor) {
|
|
|
|
|
|
|
|
AttractorKernel* myAttractor = NULL;
|
|
|
|
|
|
|
|
// reading basic stuff
|
|
|
|
const std::string attractorType = attractor.getValue("type");
|
|
|
|
const std::string attractorDimension = attractor.getValue("dimensions");
|
|
|
|
|
|
|
|
// for ( unsigned int i = 0; attractorType[i] != '\0'; i++ ) {
|
|
|
|
// attractorType[i] = tolower(attractorType[i]);
|
|
|
|
// }
|
|
|
|
const unsigned int dimension = atoi(attractorDimension.c_str());
|
|
|
|
|
|
|
|
LogMoreInfo(" Formula: %s\n", attractorType.c_str());
|
|
|
|
LogMoreInfo(" Dimensions: %d\n", dimension);
|
|
|
|
|
|
|
|
|
|
|
|
// depending on type, make the formula object
|
|
|
|
if(attractorType == "lorenz") {
|
|
|
|
if(dimension == 3) {
|
|
|
|
myAttractor = new Lorenz3D();
|
|
|
|
} else {
|
|
|
|
LogError("something wrong\n");
|
|
|
|
exit(37);
|
|
|
|
}
|
|
|
|
} else if(attractorType == "polynomial") {
|
|
|
|
const std::string attractorOrde = attractor.getValue("orde");
|
|
|
|
const unsigned int orde = atoi(attractorOrde.c_str());
|
|
|
|
LogMoreInfo(" Orde: %d\n", orde);
|
|
|
|
myAttractor = new Polynomial(dimension, orde);
|
|
|
|
|
|
|
|
} else if(attractorType == "polynomial a") {
|
|
|
|
if(dimension == 3) {
|
|
|
|
myAttractor = new PolynomialA3D();
|
|
|
|
} else {
|
|
|
|
LogError("something wrong\n");
|
|
|
|
exit(37);
|
|
|
|
}
|
|
|
|
} else if(attractorType == "logistic") {
|
|
|
|
myAttractor = new Logistic(dimension);
|
|
|
|
} else if(attractorType == "unravel") {
|
|
|
|
if(dimension == 3) {
|
|
|
|
myAttractor = new Unravel3D();
|
|
|
|
} else {
|
|
|
|
LogError("something wrong\n");
|
|
|
|
exit(37);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
LogError("'%s' not recognized\n", attractorType.c_str());
|
|
|
|
exit(37);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// read parameters
|
|
|
|
const unsigned int numberOfParameters = myAttractor->getNumberOfParameters();
|
|
|
|
|
|
|
|
if(attractor.children.find("parameters") != attractor.children.end())
|
|
|
|
for(unsigned int i = 0; i < numberOfParameters; i++) {
|
|
|
|
stfu::node attractorParameters = attractor.getChild("parameters");
|
|
|
|
(*myAttractor)[i] = atof(attractorParameters.getValue(i).c_str());
|
|
|
|
LogMoreInfo(" Parameter %d set to %f, ", i, (*myAttractor)[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
LogMoreInfo("\n Reading file complete\n");
|
|
|
|
|
|
|
|
return myAttractor;
|
|
|
|
}
|
|
|
|
|