/***************************************************************************
                          VectorManip.h  -  description
                             -------------------
    begin                : Don Mai 13 2004
    copyright            : (C) 2004 by klaus frieler
    email                : kgf@omniversum.de
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/
#include "Types.h"
#include<algorithm>

template <class T>
void dumpData(const char* text, const vector<T>& vec, ostream& out);

template <class T>
void dumpDataToBuf(char *buf, size_t cbSize, const char* text, const vector<T>& vec);

template <class T>
void dumpDataToBuf(char *buf, size_t cbSize, const char* text, const char* delim, const vector<T>& vec);


template <class T>
void dumpAccents(const char* text, const vector<T>& vec, ostream& out);

template <class T>
T vectorSum(const vector<T> &vec);

template <class T>
T vectorWeightedSum(const vector<T> &vec);

template <class T>
uint getLast(const vector<T>& vec);

template <class T>
vector<T> add(const vector<T> &vec1, const vector<T> &vec2);

template <class T>
vector<T> sub(const vector<T> &vec1, const vector<T> &vec2);

template <class T>
T scalarProduct(const vector<T> &vec1, const vector<T> &vec2);

template <class T>
double normEuclid(const vector<T> &vec1);

template <class T>
double cosangle(const vector<T> &vec1, const vector<T> &vec2);

template <class T>
uint getMaxLen(const vector<T> &vec1, const vector<T> &vec2);

template <class T>
uint getMinLen(const vector<T> &vec1, const vector<T> &vec2);

template <class T>
vector<T> mult(const vector<T> &vec, const T &s);

template <class T>
vector<T> scaleVector(const vector<T> &vec1, const T &s);

template <class T>
vector<T> invScaleVector(const vector<T> &vec1, const T &s);

template <class T>
T getMax(const vector<T> &vec, uint& idx);

template <class T>
int find(const vector<T> &vec, const T& val);

template<class T>
vector<T> getSubVector(const vector<T>& vec, uint start, uint end);

template<class T>
vector<T> getModus(const vector<T> &vec, uint &modFreq);

template<class T>
double getMedian(const vector<T> &vec);

template<class T>
double getSkewness(const vector<T> &vec);

template<class T>
double getKurtosis(const vector<T> &vec);

template<class T>
void  scale(vector<T>& vec, const T scale);

template<class T>
void invScale(vector<T>& vec, const T scale);

template<class T>
T  getMaximum(const vector<T>& vec);

template<class T>
T  getMaximum(const vector<T>& vec, uint& pos);

template<class T>
T  getMinimum(const vector<T>& vec);

template<class T>
T getMinimum(const vector<T>& vec, uint& pos);

template<class T>
double getMean(const vector<T>& vec);

template<class T>
double getVariance(const vector<T>& vec);

template<class T>
double getVariance2(const vector<T>& vec);

template<class T>
vector<T> getRow(const vector<vector<T> >& vecvec, uint row);

template<class T>
vector<T> getColumn(const vector<vector<T> >& vecvec, uint column);

template<class T>
vector<T> getClasses(const vector<T>& vec, const vector<T>& classBorders);

template<class T>
vector<T> getRandomSelection(const vector<T>& vec, const uint count);

template<class T>
vector<T>& remove(vector<T>& vec, const uint idx);

template<class T>
bool isEqual(const vector<T>& data1,const vector<T>& data2);

template<class T>
uint getElementCount(const vector<T>& data, const T& lowerBound, const T& upperBound, int dir);

template<class T>
uint getElementCount(const vector<T>& data, const T& threshold, int dir);

template<class T>
vector<T> sort(const vector<T>& data, int dir);

template<class T>
vector<T> fuzzyNot(const vector<T>& vec);

template<class T>
vector<T> fuzzyOr(const vector<T>& vec1, const vector<T>& vec2);

template<class T>
vector<T> fuzzyAnd(const vector<T>& vec1, const vector<T>& vec2);

template<class T>
double  match(const vector<T>& vec1, const vector<T>& vec2, bool bNorm );

template<class T>
double  mismatch(const vector<T>& vec1, const vector<T>& vec2, bool bNorm );

/*
template<class T>
double getEntropy(const vector<T> &vec, bool bNorm = true);
*/
