Skip to content

Commit

Permalink
Substitute some functions with STL equivalents
Browse files Browse the repository at this point in the history
  • Loading branch information
NewProggie committed Apr 18, 2016
1 parent 01a6664 commit 5918f0a
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 69 deletions.
13 changes: 0 additions & 13 deletions common.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,7 @@
#ifndef COMMON_H
#define COMMON_H

#include <algorithm>
#include <cassert>
#include <cmath>
#include <deque>
#include <fstream>
#include <iostream>
#include <map>
#include <sstream>
#include <cstdlib>
#include <cstring>
#include <vector>

typedef unsigned int uint;

typedef double floattype;

#endif
3 changes: 2 additions & 1 deletion deque.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ inline uint count(intfloatqueue * q) {

inline void init(intfloatqueue * q, uint size) {
size = nextPowerOfTwo(size + 1);
q->nodes = reinterpret_cast<intfloatnode *>(malloc(sizeof(intfloatnode) * size));
q->nodes =
reinterpret_cast<intfloatnode *>(malloc(sizeof(intfloatnode) * size));
q->head = 0;
q->tail = 0;
q->mask = size - 1;
Expand Down
19 changes: 11 additions & 8 deletions runningmaxmin.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
#include "runningmaxmin.h"

#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iomanip>
#include <iostream>

#include "runningmaxmin.h"

bool compare(std::vector<floattype> & a, std::vector<floattype> & b) {
if (a.size() != b.size())
Expand All @@ -16,7 +15,8 @@ bool compare(std::vector<floattype> & a, std::vector<floattype> & b) {
}
bool compare(minmaxfilter & a, minmaxfilter & b) {
return static_cast<int>((compare(a.getmaxvalues(), b.getmaxvalues())) &
static_cast<int>(compare(a.getminvalues(), b.getminvalues()))) != 0;
static_cast<int>(compare(a.getminvalues(),
b.getminvalues()))) != 0;
}

void display(minmaxfilter & a) {
Expand Down Expand Up @@ -252,19 +252,22 @@ void timingsline(std::vector<floattype> data, uint width = 30,
for (uint i = 0; i < 30; ++i)
slowmaxmin A(data, width);
finish = clock();
std::cout << "slow = " << static_cast<double>(finish - start) / CLOCKS_PER_SEC
std::cout << "slow = "
<< static_cast<double>(finish - start) / CLOCKS_PER_SEC
<< std::endl;
start = clock();
for (uint i = 0; i < 30; ++i)
vanHerkGilWermanmaxmin B(data, width);
finish = clock();
std::cout << "vanHerk = " << static_cast<double>(finish - start) / CLOCKS_PER_SEC
std::cout << "vanHerk = "
<< static_cast<double>(finish - start) / CLOCKS_PER_SEC
<< std::endl;
start = clock();
for (uint i = 0; i < 30; ++i)
lemiremaxmin C(data, width);
finish = clock();
std::cout << "lemire = " << static_cast<double>(finish - start) / CLOCKS_PER_SEC
std::cout << "lemire = "
<< static_cast<double>(finish - start) / CLOCKS_PER_SEC
<< std::endl;
std::cout << "------------" << std::endl;
}
Expand Down
92 changes: 45 additions & 47 deletions runningmaxmin.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,28 +16,18 @@
#ifndef RUNNINGMAXMIN_H
#define RUNNINGMAXMIN_H

#include <algorithm>
#include <cassert>
#include <cstdlib>
#include <deque>
#include <iostream>
#include <vector>

#include "common.h"
#include "deque.h"

inline uint max(uint a, uint b) {
if (a > b)
return a;
return b;
}
inline uint min(uint a, uint b) {
if (a < b)
return a;
return b;
}

inline void display(std::deque<int> & a) {
for (int i : a)
std::cout << i << " ";
std::cout << std::endl;
}

inline void display(std::vector<floattype> & a) {
for (double i : a)
inline void display(const std::vector<floattype> & a) {
for (floattype i : a)
std::cout << i << " ";
std::cout << std::endl;
}
Expand All @@ -47,7 +37,8 @@ class minmaxfilter {
virtual std::vector<floattype> & getmaxvalues() = 0;
virtual std::vector<floattype> & getminvalues() = 0;

virtual ~minmaxfilter()= default;;
virtual ~minmaxfilter() = default;
;
};

/**
Expand Down Expand Up @@ -96,9 +87,10 @@ class GilKimmel : public minmaxfilter {
std::vector<floattype> S(array.size() + 1);
computePrefixSuffixMax(R, S, array,
width); // implements the cut in the middle trick
for (int j = 0; j < static_cast<int>(array.size()) - width + 1; j += width) {
for (int j = 0; j < static_cast<int>(array.size()) - width + 1;
j += width) {
const int endofblock =
min(j + width, static_cast<int>(array.size()) - width + 1);
std::min(j + width, static_cast<int>(array.size()) - width + 1);
int begin = j;
int end = endofblock;
int midpoint = (end - begin + 1) / 2 + begin;
Expand All @@ -120,9 +112,10 @@ class GilKimmel : public minmaxfilter {
}
computePrefixSuffixMin(R, S, array,
width); // implements the cut in the middle trick
for (int j = 0; j < static_cast<int>(array.size()) - width + 1; j += width) {
for (int j = 0; j < static_cast<int>(array.size()) - width + 1;
j += width) {
const int endofblock =
min(j + width, static_cast<int>(array.size()) - width + 1);
std::min(j + width, static_cast<int>(array.size()) - width + 1);
int begin = j;
int end = endofblock;
int midpoint = (end - begin + 1) / 2 + begin;
Expand All @@ -149,24 +142,24 @@ class GilKimmel : public minmaxfilter {
const int width) {
for (int j = 0; j < static_cast<int>(array.size()); j += width) {
const int begin = j;
const int end = min(static_cast<int>(array.size()), j + width);
const int end = std::min(static_cast<int>(array.size()), j + width);
const int midpoint = (end - begin + 1) / 2 + begin;
S[begin] = array[begin];
for (int jj = begin + 1; jj < midpoint; ++jj) {
S[jj] = max(array[jj], S[jj - 1]);
S[jj] = std::max(array[jj], S[jj - 1]);
}
R[end - 1] = array[end - 1];
for (int jj = end - 2; jj >= midpoint; --jj) {
R[jj] = max(R[jj + 1], array[jj]);
R[jj] = std::max(R[jj + 1], array[jj]);
}
if (max(R[midpoint], S[midpoint - 1]) == R[midpoint]) {
if (std::max(R[midpoint], S[midpoint - 1]) == R[midpoint]) {
for (int jj = midpoint; jj < end; ++jj)
S[jj] = max(array[jj], S[jj - 1]);
S[jj] = std::max(array[jj], S[jj - 1]);
for (int jj = midpoint - 1; jj >= begin; --jj)
R[jj] = R[midpoint];
} else {
for (int jj = midpoint - 1; jj >= begin; --jj)
R[jj] = max(R[jj + 1], array[jj]);
R[jj] = std::max(R[jj + 1], array[jj]);
for (int jj = midpoint; jj < end; ++jj)
S[jj] = S[midpoint - 1];
}
Expand All @@ -179,24 +172,24 @@ class GilKimmel : public minmaxfilter {
const int width) {
for (int j = 0; j < static_cast<int>(array.size()); j += width) {
const int begin = j;
const int end = min(static_cast<int>(array.size()), j + width);
const int end = std::min(static_cast<int>(array.size()), j + width);
const int midpoint = (end - begin + 1) / 2 + begin;
S[begin] = array[begin];
for (int jj = begin + 1; jj < midpoint; ++jj) {
S[jj] = min(array[jj], S[jj - 1]);
S[jj] = std::min(array[jj], S[jj - 1]);
}
R[end - 1] = array[end - 1];
for (int jj = end - 2; jj >= midpoint; --jj) {
R[jj] = min(R[jj + 1], array[jj]);
R[jj] = std::min(R[jj + 1], array[jj]);
}
if (min(R[midpoint], S[midpoint - 1]) == R[midpoint]) {
if (std::min(R[midpoint], S[midpoint - 1]) == R[midpoint]) {
for (int jj = midpoint; jj < end; ++jj)
S[jj] = min(array[jj], S[jj - 1]);
S[jj] = std::min(array[jj], S[jj - 1]);
for (int jj = midpoint - 1; jj >= begin; --jj)
R[jj] = R[midpoint];
} else {
for (int jj = midpoint - 1; jj >= begin; --jj)
R[jj] = min(R[jj + 1], array[jj]);
R[jj] = std::min(R[jj + 1], array[jj]);
for (int jj = midpoint; jj < end; ++jj)
S[jj] = S[midpoint - 1];
}
Expand All @@ -223,30 +216,34 @@ class vanHerkGilWermanmaxmin : public minmaxfilter {
std::vector<floattype> R(width);
std::vector<floattype> S(width);
for (uint j = 0; j < array.size() - width + 1; j += width) {
uint Rpos = min(j + width - 1, array.size() - 1);
uint Rpos = std::min(j + width - 1,
static_cast<unsigned>(array.size() - 1));
R[0] = array[Rpos];
for (uint i = Rpos - 1; i + 1 > j; i -= 1)
R[Rpos - i] = max(R[Rpos - i - 1], array[i]);
R[Rpos - i] = std::max(R[Rpos - i - 1], array[i]);
S[0] = array[Rpos];
uint m1 = min(j + 2 * width - 1, array.size());
uint m1 = std::min(j + 2 * width - 1,
static_cast<unsigned>(array.size()));
for (uint i = Rpos + 1; i < m1; ++i) {
S[i - Rpos] = max(S[i - Rpos - 1], array[i]);
S[i - Rpos] = std::max(S[i - Rpos - 1], array[i]);
}
for (uint i = 0; i < m1 - Rpos; i += 1)
maxvalues[j + i] = max(S[i], R[(Rpos - j + 1) - i - 1]);
maxvalues[j + i] = std::max(S[i], R[(Rpos - j + 1) - i - 1]);
}
for (uint j = 0; j < array.size() - width + 1; j += width) {
uint Rpos = min(j + width - 1, array.size() - 1);
uint Rpos = std::min(j + width - 1,
static_cast<unsigned>(array.size() - 1));
R[0] = array[Rpos];
for (uint i = Rpos - 1; i + 1 > j; i -= 1)
R[Rpos - i] = min(R[Rpos - i - 1], array[i]);
R[Rpos - i] = std::min(R[Rpos - i - 1], array[i]);
S[0] = array[Rpos];
uint m1 = min(j + 2 * width - 1, array.size());
uint m1 = std::min(j + 2 * width - 1,
static_cast<unsigned>(array.size()));
for (uint i = Rpos + 1; i < m1; ++i) {
S[i - Rpos] = min(S[i - Rpos - 1], array[i]);
S[i - Rpos] = std::min(S[i - Rpos - 1], array[i]);
}
for (uint i = 0; i < m1 - Rpos; i += 1)
minvalues[j + i] = min(S[i], R[(Rpos - j + 1) - i - 1]);
minvalues[j + i] = std::min(S[i], R[(Rpos - j + 1) - i - 1]);
}
assert(maxvalues.size() == array.size() - width + 1);
assert(minvalues.size() == array.size() - width + 1);
Expand Down Expand Up @@ -342,7 +339,8 @@ class lemiremaxmin : public minmaxfilter {
// actual streaming implementation
class lemiremaxmintruestreaming {
public:
explicit lemiremaxmintruestreaming(uint width) : up(), lo(), n(0), ww(width) {
explicit lemiremaxmintruestreaming(uint width)
: up(), lo(), n(0), ww(width) {
init(&up, ww);
init(&lo, ww);
}
Expand Down

0 comments on commit 5918f0a

Please sign in to comment.