2020-10-29 17:33:18 +00:00
|
|
|
#ifndef _BUFFER_GUARD
|
|
|
|
#define _BUFFER_GUARD
|
|
|
|
|
|
|
|
#include "util.h"
|
2020-11-16 22:05:44 +00:00
|
|
|
#include "math.h"
|
|
|
|
|
2020-11-17 01:45:25 +00:00
|
|
|
typedef struct Buffer {
|
|
|
|
float* items;
|
|
|
|
int length;
|
|
|
|
Stats stats;
|
|
|
|
} Buffer;
|
|
|
|
|
|
|
|
Buffer
|
2020-11-16 22:05:44 +00:00
|
|
|
getBuffer(int size)
|
|
|
|
{
|
2020-11-17 01:45:25 +00:00
|
|
|
float* memSpace = (float*) malloc(size * sizeof(float));
|
|
|
|
Buffer buffer = {memSpace, size, };
|
|
|
|
return buffer;
|
2020-11-16 22:05:44 +00:00
|
|
|
}
|
2020-10-29 17:33:18 +00:00
|
|
|
|
|
|
|
void
|
2020-11-17 01:45:25 +00:00
|
|
|
aggregateBuffer(Buffer bufferIn, Buffer bufferOut, int groupSize)
|
2020-10-29 17:33:18 +00:00
|
|
|
{
|
2020-11-17 01:45:25 +00:00
|
|
|
int requiredGroups = ceil((float)bufferIn.length/groupSize); // number of groups
|
|
|
|
int finalGroupSize = (bufferIn.length % groupSize) * groupSize;
|
2020-10-29 17:33:18 +00:00
|
|
|
|
2020-11-17 01:45:25 +00:00
|
|
|
if(requiredGroups > bufferOut.length) // error
|
2020-10-29 17:33:18 +00:00
|
|
|
{
|
2020-11-17 01:45:25 +00:00
|
|
|
putFloat((float)bufferIn.length/groupSize);
|
|
|
|
printf(" length out buffer required, %i provided\n", bufferOut.length);
|
2020-10-29 17:33:18 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-11-16 22:05:44 +00:00
|
|
|
int g; // for group number
|
2020-11-17 01:45:25 +00:00
|
|
|
float *inputPtr = bufferIn.items; // cursor for full buffer
|
|
|
|
float *outputPtr = bufferOut.items; // cursor for output buffer
|
2020-10-29 17:33:18 +00:00
|
|
|
for(g = 0; g < requiredGroups; g++)
|
2020-11-16 16:20:44 +00:00
|
|
|
{
|
2020-11-16 22:05:44 +00:00
|
|
|
int length = groupSize; // length of this group's size
|
|
|
|
if(g == requiredGroups - 1 && finalGroupSize != 0) length = finalGroupSize; // shorten if necessary
|
2020-11-16 16:20:44 +00:00
|
|
|
|
2020-11-16 22:05:44 +00:00
|
|
|
*outputPtr = calculateMean(inputPtr, length); // SET
|
2020-11-16 16:20:44 +00:00
|
|
|
|
2020-11-16 22:05:44 +00:00
|
|
|
inputPtr += length; // increment both
|
2020-11-16 16:20:44 +00:00
|
|
|
outputPtr++;
|
2020-10-29 17:33:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2020-11-17 01:45:25 +00:00
|
|
|
clearBuffer(Buffer buffer)
|
2020-10-29 17:33:18 +00:00
|
|
|
{
|
2020-11-17 01:45:25 +00:00
|
|
|
int length = buffer.length;
|
2020-10-29 17:33:18 +00:00
|
|
|
if(length > 0)
|
|
|
|
{
|
|
|
|
int i;
|
2020-11-17 01:45:25 +00:00
|
|
|
float *bufferPtr = buffer.items;
|
2020-10-29 17:33:18 +00:00
|
|
|
for(i = 0; i < length; i++)
|
|
|
|
{
|
2020-11-16 16:20:44 +00:00
|
|
|
*bufferPtr = 0.0;
|
|
|
|
bufferPtr++;
|
2020-10-29 17:33:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2020-11-17 01:45:25 +00:00
|
|
|
printBuffer(Buffer buffer)
|
2020-10-29 17:33:18 +00:00
|
|
|
{
|
|
|
|
putchar('[');
|
|
|
|
|
2020-11-17 01:45:25 +00:00
|
|
|
int length = buffer.length;
|
2020-10-29 17:33:18 +00:00
|
|
|
if(length > 0)
|
|
|
|
{
|
|
|
|
int i;
|
2020-11-17 01:45:25 +00:00
|
|
|
float *ptr = buffer.items;
|
2020-10-29 17:33:18 +00:00
|
|
|
for(i = 0; i < length; i++)
|
|
|
|
{
|
|
|
|
if(i > 0) printf(", ");
|
|
|
|
|
2020-11-16 16:20:44 +00:00
|
|
|
putFloat(*ptr);
|
|
|
|
ptr++;
|
2020-10-29 17:33:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
putchar(']');
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|