better code
This commit is contained in:
parent
5ba18cd1d8
commit
21a873e909
2 changed files with 30 additions and 31 deletions
32
aatester.cpp
32
aatester.cpp
|
@ -20,24 +20,21 @@
|
|||
int verbose = 0;
|
||||
Logger logger(std::cout, LOG_VERBOSE);
|
||||
|
||||
inline double test(const int dimension, const double doubling, const double percentage){
|
||||
inline double test(const unsigned int dimension){
|
||||
LOG("making vector",
|
||||
srand(time(0));
|
||||
std::vector<double *> buffer(1000000);
|
||||
std::vector<double *> buffer(10000000);
|
||||
);
|
||||
|
||||
LOG("making random data",
|
||||
for(auto & p : buffer){
|
||||
p = new double[dimension];
|
||||
for(unsigned int i = 2;i < dimension; ++i){
|
||||
for(unsigned int i = 0;i < dimension; ++i){
|
||||
p[i] = rand() / (double) RAND_MAX - 0.5;
|
||||
}
|
||||
p[0] = p[1]*p[1];
|
||||
p[1] = std::sin(5.0*p[2]);
|
||||
});
|
||||
|
||||
LOG("calculate fractal dimension",
|
||||
double f = fractal_dimension(buffer.begin(), buffer.end(), dimension, doubling, percentage);
|
||||
double f = fractal_dimension(buffer.begin(), buffer.end(), dimension);
|
||||
);
|
||||
|
||||
LOG("freeing data",
|
||||
|
@ -50,22 +47,11 @@ inline double test(const int dimension, const double doubling, const double perc
|
|||
}
|
||||
|
||||
int main(){
|
||||
double percentages[] = {0.00015, 0.00010, 0.00006, 0.00004, 0.000015};
|
||||
std::cout << "... |";
|
||||
for(auto p : percentages) std::cout << "\t" << p;
|
||||
std::cout << std::endl << "----------------------------------------------" << std::endl;
|
||||
|
||||
for (double doubling = 2.0; doubling <= 3.0; doubling += 0.1){
|
||||
std::cout << doubling << " |";
|
||||
for (auto p : percentages){
|
||||
double sse = 0;
|
||||
for (int i = 3; i <= 6; ++i) {
|
||||
for(int j = 0; j < 20; ++j) {
|
||||
double e = (i-2) - test(i, doubling, p);
|
||||
sse += e*e;
|
||||
}
|
||||
}
|
||||
std::cout << "\t" << sse;
|
||||
srand(time(0));
|
||||
for (unsigned int i = 1; i <= 6; ++i) {
|
||||
std::cout << i << " =>";
|
||||
for(unsigned int j = 0; j < 10; ++j) {
|
||||
std::cout << "\t" << test(i);
|
||||
}
|
||||
std::cout << std::endl;
|
||||
}
|
||||
|
|
29
analyse.hpp
29
analyse.hpp
|
@ -19,29 +19,42 @@ inline double distance_squared(double * p1, double * p2, size_t dimension){
|
|||
return s;
|
||||
}
|
||||
|
||||
struct fractal_dimension_settings{
|
||||
double doubling;
|
||||
double size;
|
||||
size_t chunk_size;
|
||||
|
||||
fractal_dimension_settings()
|
||||
: doubling(2.4)
|
||||
, size(0.035)
|
||||
, chunk_size(200)
|
||||
{}
|
||||
};
|
||||
|
||||
template <typename Iterator>
|
||||
double fractal_dimension(Iterator begin, Iterator end, size_t const dimension, const double doubling = 2.4, const double percentage = 0.00004) {
|
||||
const double size = std::pow(percentage, 1.0 / 3.0);
|
||||
//const double size = std::pow(percentage, 1.0 / dimension);
|
||||
double fractal_dimension(Iterator begin, Iterator end, size_t const dimension, const fractal_dimension_settings settings = fractal_dimension_settings() ) {
|
||||
const double size = settings.size;
|
||||
const double totalSize = std::sqrt(dimension);
|
||||
|
||||
const double r1 = size * totalSize * size * totalSize;
|
||||
const double r2 = r1 * settings.doubling * settings.doubling;
|
||||
|
||||
unsigned int counts[2] = {};
|
||||
double r = size * totalSize;
|
||||
|
||||
while(begin != end){
|
||||
auto x0 = *begin++;
|
||||
|
||||
for(unsigned int i = 0; i < 200 && begin != end; ++i){
|
||||
for(unsigned int i = 0; i < settings.chunk_size && begin != end; ++i){
|
||||
auto x = *begin++;
|
||||
auto d = distance_squared(x, x0, dimension);
|
||||
if( d <= r*r )
|
||||
if( d <= r1 )
|
||||
++counts[0];
|
||||
if( d <= doubling*doubling*r*r )
|
||||
if( d <= r2 )
|
||||
++counts[1];
|
||||
}
|
||||
}
|
||||
|
||||
return std::log((double) counts[1] / (double) counts[0]) / std::log(doubling);
|
||||
return std::log((double) counts[1] / (double) counts[0]) / std::log(settings.doubling);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
Reference in a new issue