All Downloads are FREE. Search and download functionalities are using the official Maven repository.

-x86.0.4-rc3.8.source-code.Loop.h Maven / Gradle / Ivy

The newest version!
#include 
#include 
#include 
#include 
using namespace std;
/**
 * CPU math operations for:
 * linear transforms
 * reductions
 *
 * @author Adam Gibson
 */
class Loop {


public:


    void execDoubleTransform(
            double *data,
            double *pairData
            , int length
            , int offset,
            int yOffset,
            int resultOffset
            , int stride,
            int yStride
            ,int resultStride
            , const std::string  operation,
            double *otherParams
            , double *result) {
        if(operation.compare("add") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = data[offset + (i * stride)] + pairData[yOffset + (i * yStride)];
            }
        }
        else if(operation.compare("sub") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = data[offset + (i * stride)] - pairData[yOffset + (i * yStride)];

        }
        else if(operation.compare("rsub") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = pairData[yOffset + (i * yStride)] - data[offset + (i * stride)];

        }
        else if(operation.compare("mul") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = data[offset + (i * stride)] * pairData[yOffset + (i * yStride)];

        }
        else if(operation.compare("div") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = data[offset + (i * stride)] / pairData[yOffset + (i * yStride)];

        }
        else if(operation.compare("rdiv") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] =  pairData[yOffset + (i * yStride)] / data[offset + (i * stride)];

        }
        else if(operation.compare("copy") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = data[offset + (i * stride)];

        }
    }


    void execFloatTransform(
            float *data,
            float *pairData
            , int length
            , int offset,
            int yOffset,
            int resultOffset
            , int stride,
            int yStride
            ,int resultStride
            , const std::string  operation,
            float *otherParams
            , float *result) {
        if(operation.compare("add") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = data[offset + (i * stride)] + pairData[yOffset + (i * yStride)];
            }
        }
        else if(operation.compare("sub") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = data[offset + (i * stride)] - pairData[yOffset + (i * yStride)];

        }
        else if(operation.compare("rsub") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = pairData[yOffset + (i * yStride)] - data[offset + (i * stride)];

        }
        else if(operation.compare("mul") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = data[offset + (i * stride)] * pairData[yOffset + (i * yStride)];

        }
        else if(operation.compare("div") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = data[offset + (i * stride)] / pairData[yOffset + (i * yStride)];

        }
        else if(operation.compare("rdiv") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] =  pairData[yOffset + (i * yStride)] / data[offset + (i * stride)];

        }
        else if(operation.compare("copy") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = data[offset + (i * stride)];

        }
    }

    void execFloatTransform(float *data, int length, int offset, int resultOffset,int stride,int resultStride, const std::string operation,
                            float *otherParams,float *result) {
        if(operation.compare("tanh") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = tanhf(data[offset + (i  * stride)]);
            }
        }
        else if(operation.compare("exp") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = expf(data[offset + (i  * stride)]);
            }
        }
        else if(operation.compare("cos") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = cosf(data[offset + (i  * stride)]);
            }
        }
        else if(operation.compare("abs") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = fabs(data[offset + (i  * stride)]);
            }
        }
        else if(operation.compare("acos") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = acosf(data[offset + (i  * stride)]);
            }
        }
        else if(operation.compare("asin") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = asin(data[offset + (i  * stride)]);
            }
        }

        else if(operation.compare("atan") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = atan(data[offset + (i  * stride)]);
            }
        }
          else if(operation.compare("softplus") == 0) {
                    for(int i = 0; i < length; i++) {
                        result[resultOffset + (i * resultStride)] = log( 1 + exp(data[offset + (i  * stride)]));
                    }
         }
        else if(operation.compare("setrange") == 0) {
            float min = otherParams[0];
            float max = otherParams[1];
            for(int i = 0; i < length; i++) {
                float origin = data[offset + (i * stride)];
                if (origin >= min && origin <= max)
                    result[resultOffset + (i * resultStride)] = origin;
                else if (min == 0 && max == 1) {
                    float val = 1 / (1 + expf(-origin));
                    result[resultOffset + (i * resultStride)] =  floorf(val * (max - min)) + min;
                }
                else {
                    result[resultOffset + (i * resultStride)] = floorf(origin * (max - min)) + min;

                }
            }
        }

        else if(operation.compare("ceil") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = ceilf(data[offset + (i  * stride)]);
            }
        }
        else if(operation.compare("floor") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = floorf(data[offset + (i  * stride)]);
            }
        }
        else if(operation.compare("hardtanh") == 0) {
            for(int i = 0; i < length; i++) {
                float tanh2 = tanhf(data[offset + (i  * stride)]);
                if(tanh2 < -1)
                    tanh2 = -1;
                if(tanh2 > 1)
                    tanh2 = 1;
                result[resultOffset + (i * resultStride)] = tanh2;
            }
        }
        else if(operation.compare("log") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = logf(data[offset + (i  * stride)]);
            }
        }
        else if(operation.compare("neg") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = -data[offset + (i  * stride)];
            }
        }
        else if(operation.compare("oneminus") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] =  1 - data[offset + (i  * stride)];
            }
        }
        else if(operation.compare("ones") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] =  1;
            }
        }
        else if(operation.compare("pow") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] =  powf(data[offset + (i  * stride)],(float) otherParams[0]);
            }
        }
        else if(operation.compare("sigmoid") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] =  1.0 / (1.0 + expf(-data[offset + (i  * stride)]));
            }
        }
        else if(operation.compare("sign") == 0) {
            for(int i = 0; i < length; i++) {
                float d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = (d1 > 0) - (d1 < 0);
            }
        }
        else if(operation.compare("round") == 0) {
            for(int i = 0; i < length; i++) {
                float d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = roundf(d1);
            }
        }
        else if(operation.compare("softmax") == 0) {
            for(int i = 0; i < length; i++) {
                float d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = roundf(d1);
            }
        }

        else if(operation.compare("sqrt") == 0) {
            for(int i = 0; i < length; i++) {
                float d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = sqrtf(d1);
            }
        }

    }



    void execScalarDouble(
            double *data
            ,double *result
            ,int length
            ,int offset,
            int resultOffset
            ,int stride
            ,int resultStride
            ,const std::string operation
            ,double *otherParams) {
        double scalar = otherParams[0];
        if(operation.compare("equals_scalar") == 0) {
            for(int i = 0; i < length; i++) {
                double d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = d1 == scalar ? 1 : 0.0;
            }
        }
        else if(operation.compare("greaterthan_scalar") == 0) {
            for(int i = 0; i < length; i++) {
                double d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = d1 >= scalar ? 1 : 0.0;
            }
        }
        else if(operation.compare("greaterthanorequal_scalar") == 0) {
            for(int i = 0; i < length; i++) {
                double d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = d1 == scalar ? 1 : 0.0;
            }
        }
        else if(operation.compare("lessthan_scalar") == 0) {
            for(int i = 0; i < length; i++) {
                double d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = d1 < scalar ? 1 : 0.0;
            }
        }
        else if(operation.compare("lessthanorequal_scalar") == 0) {
            for(int i = 0; i < length; i++) {
                double d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = d1 <= scalar ? 1 : 0.0;
            }
        }
        else if(operation.compare("greaterthan_scalar") == 0) {
            for(int i = 0; i < length; i++) {
                double d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = d1 > scalar ? 1 : 0.0;
            }
        }
        else if(operation.compare("add_scalar") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = data[offset + (i  * stride)] + scalar;

        }
        else if(operation.compare("div_scalar") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = data[offset + (i  * stride)] / scalar;

        }
        else if(operation.compare("max_scalar") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = max(data[offset + (i  * stride)],scalar);

        }
        else if(operation.compare("mul_scalar") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = data[offset + (i  * stride)] * scalar;

        }
        else if(operation.compare("rdiv_scalar") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = scalar / data[offset + (i  * stride)];

        }
        else if(operation.compare("rsub_scalar") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = scalar - data[offset + (i  * stride)];

        }

        else if(operation.compare("sub_scalar") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = data[offset + (i  * stride)] - scalar;

        }

    }

    void execScalarFloat(
            float *data
            ,float *result
            ,int length
            ,int offset,
            int resultOffset
            ,int stride
            ,int resultStride
            ,const std::string operation
            ,float *otherParams) {
        float scalar = otherParams[0];
        if(operation.compare("equals_scalar") == 0) {
            for(int i = 0; i < length; i++) {
                float d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = d1 == scalar ? 1 : 0.0;
            }
        }
        else if(operation.compare("greaterthan_scalar") == 0) {
            for(int i = 0; i < length; i++) {
                float d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = d1 >= scalar ? 1 : 0.0;
            }
        }
        else if(operation.compare("greaterthanorequal_scalar") == 0) {
            for(int i = 0; i < length; i++) {
                float d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = d1 == scalar ? 1 : 0.0;
            }
        }
        else if(operation.compare("lessthan_scalar") == 0) {
            for(int i = 0; i < length; i++) {
                float d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = d1 < scalar ? 1 : 0.0;
            }
        }
        else if(operation.compare("lessthanorequal_scalar") == 0) {
            for(int i = 0; i < length; i++) {
                float d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = d1 <= scalar ? 1 : 0.0;
            }
        }
        else if(operation.compare("greaterthan_scalar") == 0) {
            for(int i = 0; i < length; i++) {
                float d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = d1 > scalar ? 1 : 0.0;
            }
        }
        else if(operation.compare("add_scalar") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = data[offset + (i  * stride)] + scalar;

        }
        else if(operation.compare("div_scalar") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = data[offset + (i  * stride)] / scalar;

        }
        else if(operation.compare("max_scalar") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = max(data[offset + (i  * stride)],scalar);

        }
        else if(operation.compare("mul_scalar") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = data[offset + (i  * stride)] * scalar;

        }
        else if(operation.compare("rdiv_scalar") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = scalar / data[offset + (i  * stride)];

        }
        else if(operation.compare("rsub_scalar") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = scalar - data[offset + (i  * stride)];

        }

        else if(operation.compare("sub_scalar") == 0) {
            for(int i = 0; i < length; i++)
                result[resultOffset + (i * resultStride)] = data[offset + (i  * stride)] - scalar;

        }
    }

    void execDoubleTransform(double *data, int length, int offset,int resultOffset, int stride,int resultStride, const std::string operation,
                             double *otherParams,double *result) {
        if(operation.compare("tanh") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = tanh(data[offset + (i  * stride)]);
            }
        }
        else if(operation.compare("exp") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = exp(data[offset + (i  * stride)]);
            }
        }
        else if(operation.compare("cos") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = cos(data[offset + (i  * stride)]);
            }
        }
        else if(operation.compare("abs") == 0) {
            for(int i = 0; i < length; i++) {
                double d = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = abs(d);
            }
        }
        else if(operation.compare("acos") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = acos(data[offset + (i  * stride)]);
            }
        }
        else if(operation.compare("setrange") == 0) {
            double min = otherParams[0];
            double max = otherParams[1];
            for(int i = 0; i < length; i++) {
                double origin = data[offset + (i * stride)];
                if (origin >= min && origin <= max)
                    result[resultOffset + (i * resultStride)] = origin;
                else if (min == 0 && max == 1) {
                    double val = 1 / (1 + exp(-origin));
                    result[resultOffset + (i * resultStride)] =  floor(val * (max - min)) + min;
                }
                else {
                    result[resultOffset + (i * resultStride)] = floor(origin * (max - min)) + min;

                }
            }
        }
        else if(operation.compare("asin") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = asinf(data[offset + (i  * stride)]);
            }
        }
        else if(operation.compare("asin") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = atan(data[offset + (i  * stride)]);
            }
        }
        else if(operation.compare("ceil") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = floorf(data[offset + (i  * stride)]);
            }
        }
        else if(operation.compare("hardtanh") == 0) {
            for(int i = 0; i < length; i++) {
                double tanh2 = tanh(data[offset + (i  * stride)]);
                if(tanh2 < -1)
                    tanh2 = -1;
                if(tanh2 > 1)
                    tanh2 = 1;
                result[resultOffset + (i * resultStride)] = tanh2;
            }
        }
        else if(operation.compare("log") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = log(data[offset + (i  * stride)]);
            }
        }
        else if(operation.compare("neg") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] = -data[offset + (i  * stride)];
            }
        }
        else if(operation.compare("oneminus") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] =  1 - data[offset + (i  * stride)];
            }
        }
        else if(operation.compare("ones") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] =  1;
            }
        }

        else if(operation.compare("pow") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] =  pow(data[offset + (i  * stride)],(double) otherParams[0]);
            }
        }
        else if(operation.compare("sigmoid") == 0) {
            for(int i = 0; i < length; i++) {
                result[resultOffset + (i * resultStride)] =  1.0 / (1.0 + exp(-data[offset + (i  * stride)]));
            }
        }
        else if(operation.compare("sign") == 0) {
            for(int i = 0; i < length; i++) {
                double d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = (d1 > 0) - (d1 < 0);
            }
        }
        else if(operation.compare("round") == 0) {
            for(int i = 0; i < length; i++) {
                double d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = round(d1);
            }
        }

        else if(operation.compare("softmax") == 0) {
            for(int i = 0; i < length; i++) {
                float d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = roundf(d1);
            }
        }
        else if(operation.compare("sqrt") == 0) {
            for(int i = 0; i < length; i++) {
                float d1 = data[offset + (i  * stride)];
                result[resultOffset + (i * resultStride)] = sqrt(d1);
            }
        }

           else if(operation.compare("softplus") == 0) {
                for(int i = 0; i < length; i++) {
                     result[resultOffset + (i * resultStride)] = logf( 1 + expf(data[offset + (i  * stride)]));
                }
          }
    }

    double reduce3(double *data, double *data2,int length, int xOffset, int yOffset,int xStride,int yStride, const std::string operation,
                   double *otherParams) {
        double startingValue = otherParams[0];

        if(operation.compare("cosinesimilarity") == 0) {
            double constantNormalizedByNorm2X = otherParams[1];
            double constantNormalizedByNorm2Y = otherParams[2];
            for(int i = 0; i < length; i++) {
                double val1 = data[(i + xOffset) * xStride];
                double val2 = data2[(i + yOffset) * yStride];
                startingValue += (val1 * val2);
            }
            startingValue =  startingValue / constantNormalizedByNorm2X / constantNormalizedByNorm2Y;
            return startingValue;
        }
        else if(operation.compare("euclidean") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue += pow(data[(i + xOffset) * xStride] - data2[(i + yOffset) * yStride],2);
            }
            startingValue /= sqrt(startingValue);

        }
        else if(operation.compare("manhattan") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue += (data[(i + xOffset) * xStride] - data2[(i + yOffset) * yStride]);
            }
        }

        return startingValue;
    }

    double reduce(double *data, int length, int offset, int stride, const std::string operation,
                  double *otherParams) {
        double startingValue = otherParams[0];
        if(operation.compare("sum") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue += data[offset + (i  * stride)];
            }

        }
        else if(operation.compare("prod") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue *= data[offset + (i  * stride)];
            }

        }
        else if(operation.compare("mean") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue += data[offset + (i  * stride)];
            }

            startingValue /= (double) length;
        }
        else if(operation.compare("max") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue = max(data[offset + (i  * stride)],startingValue);
            }
        }
        else if(operation.compare("bias") == 0) {
            double mean = otherParams[1];
            for(int i = 0; i < length; i++) {
                double val = data[offset + (i  * stride)];
                double subMean = val - mean;
                startingValue += subMean;
            }
        }
        else if(operation.compare("var") == 0) {
            double bias = otherParams[1];
            double mean = otherParams[2];
            for(int i = 0; i < length; i++) {
                startingValue += powf(data[offset + (i  * stride)] - mean,2.0);
            }
            startingValue = (startingValue - (pow(bias,2.0) / length)) / (double) (length - 1.0);
        }
        else if(operation.compare("std") == 0) {
            double bias = otherParams[1];
            double mean = otherParams[2];
            for(int i = 0; i < length; i++) {
                startingValue += powf(data[offset + (i  * stride)] - mean,2.0);
            }
            startingValue = sqrt((startingValue - (pow(bias,2.0) / length)) / (double) (length - 1.0));
        }
        else if(operation.compare("min") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue = min(data[offset + (i  * stride)],startingValue);
            }
        }
        else if(operation.compare("norm1") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue += abs(data[offset + (i  * stride)]);
            }
        }
        else if(operation.compare("norm2") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue += pow(data[offset + (i  * stride)],2);
            }

            startingValue = sqrt(startingValue);
        }
        else if(operation.compare("normmax") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue = max(abs(startingValue),abs(data[offset + (i  * stride)]));
            }
        }


        return  startingValue;
    }

    float reduce3Float(float *data, float *data2,int length, int xOffset, int yOffset,int xStride,int yStride, const std::string operation,
                       float *otherParams) {
        float startingValue = otherParams[0];


        if(operation.compare("cosinesimilarity") == 0) {
            float constantNormalizedByNorm2X = otherParams[1];
            float constantNormalizedByNorm2Y = otherParams[2];
            for(int i = 0; i < length; i++) {
                float val1 = data[(i + xOffset) * xStride];
                float val2 = data2[(i + yOffset) * yStride];
                startingValue += (val1 * val2);
            }
            startingValue =  startingValue / constantNormalizedByNorm2X / constantNormalizedByNorm2Y;
        }
        else if(operation.compare("euclidean") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue += powf(data[(i + xOffset) * xStride] - data2[(i + yOffset) * yStride],2);
            }
            startingValue /= sqrtf(startingValue);

        }
        else if(operation.compare("manhattan") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue += (data[(i + xOffset) * xStride] - data2[(i + yOffset) * yStride]);
            }
        }

        return startingValue;
    }

    float reduceFloat(float *data, int length, int offset, int stride, const std::string operation,
                      float *otherParams) {
        float startingValue = otherParams[0];
        if(operation.compare("sum") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue += data[offset + (i  * stride)];
            }

        }
        else if(operation.compare("prod") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue *= data[offset + (i  * stride)];
            }

        }
        else if(operation.compare("mean") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue += data[offset + (i  * stride)];
            }

            startingValue /= (float) length;
        }
        else if(operation.compare("max") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue = fmaxf(data[offset + (i  * stride)],startingValue);
            }
        }
        else if(operation.compare("bias") == 0) {
            float mean = otherParams[1];
            for(int i = 0; i < length; i++) {
                float val = data[offset + (i  * stride)];
                float subMean = val - mean;
                startingValue += subMean;
            }
        }
        else if(operation.compare("var") == 0) {
            float bias = otherParams[1];
            float mean = otherParams[2];
            for(int i = 0; i < length; i++) {
                startingValue += powf(data[offset + (i  * stride)] - mean,2.0);
            }
            startingValue = (startingValue - (powf(bias,2.0) / length)) / (float) (length - 1.0);
        }
        else if(operation.compare("std") == 0) {
            float bias = otherParams[1];
            float mean = otherParams[2];
            for(int i = 0; i < length; i++) {
                startingValue += powf(data[offset + (i  * stride)] - mean,2.0);
            }
            startingValue = sqrtf((startingValue - (powf(bias,2.0) / length)) / (float) (length - 1.0));
        }
        else if(operation.compare("min") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue = fminf(data[offset + (i  * stride)],startingValue);
            }
        }
        else if(operation.compare("norm1") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue += fabsf(data[offset + (i  * stride)]);
            }
        }
        else if(operation.compare("norm2") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue += powf(data[offset + (i  * stride)],2);
            }

            startingValue = sqrtf(startingValue);

        }
        else if(operation.compare("normmax") == 0) {
            for(int i = 0; i < length; i++) {
                startingValue = fmaxf(abs(startingValue),abs(data[offset + (i  * stride)]));
            }
        }


        return  startingValue;
    }






};




© 2015 - 2025 Weber Informatics LLC | Privacy Policy