/*
* Copyright (C) 2015 Adrien Guille <adrien.guille@univ-lyon2.fr>
*
* 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 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package main.java.fr.ericlab.sondy.algo.eventdetection.edcow;
import math.transform.jwave.handlers.DiscreteWaveletTransform;
import math.transform.jwave.handlers.wavelets.Haar02;
import math.transform.jwave.handlers.wavelets.WaveletInterface;
////////////////////////////////////////////////////////////////////////////////
// This file is part of SONDY. //
// //
// SONDY 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 3 of the License, or //
// (at your option) any later version. //
// //
// SONDY is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with SONDY. If not, see <http://www.gnu.org/licenses/>. //
////////////////////////////////////////////////////////////////////////////////
/**
* @author yue HE, Falitokiniaina RABEARISON, Département Informatique et Statistiques, Université Lumière Lyon 2
* @author Adrien GUILLE, Laboratoire ERIC, Université Lumière Lyon 2
*/
public class EDCoWDwt {
int level;
double[] signal;
double[] arrHilb;
double[] probaVector;
double shannonEntropy;
double swemax, hMeasure;
WaveletInterface wI;
DiscreteWaveletTransform dwt;
EDCoWDwt(double[] signal1,int level1){
signal = signal1;
level = level1;
wI = new Haar02();
dwt = new DiscreteWaveletTransform(wI,level);
arrHilb = dwt.forward( signal );
}
public int nbCoeffAtLevel(int level1){
return (int)((arrHilb.length)/Math.pow(2, level1));
}
/** Get coefficients of a level*/
public double[] getCoefficients(int atLev) {
// TODO Auto-generated method stub
int rightPart = 0;
for (int i=1; i<=atLev; i++){
rightPart = rightPart + nbCoeffAtLevel(i);
}
int totalSize = arrHilb.length;
int beginIndice = totalSize - rightPart;
int nbCoeff = nbCoeffAtLevel(atLev);
double[] coeff = new double[nbCoeff];
for(int i=0; i<nbCoeff; i++){
coeff[i] = arrHilb[beginIndice+i];
}
return coeff;
}
/** compute proba vector*/
public void probaVector() {
// TODO Auto-generated method stub
double sSquare = 0;
probaVector = new double[level];
for(int i=0; i<level; i++){
double[] coeff = getCoefficients(i+1);
EDCoWVector vec = new EDCoWVector(coeff);
sSquare = sSquare + Math.pow(vec.getNorm(),2);
}
for(int i=0; i<level; i++){
double[] coeff = getCoefficients(i+1);
EDCoWVector vec = new EDCoWVector(coeff);
//System.out.println("lalala" + sSquare);
if (sSquare == 0) probaVector[i] = 0;
else probaVector[i] = Math.pow(vec.getNorm(),2) / sSquare;
}
// for(double x:probaVector){
// System.out.println("p = "+x);
// }
}
public void shannonEntropy() {
shannonEntropy=0;
for(double x:probaVector){
shannonEntropy = shannonEntropy - (x * (Math.log(x)/Math.log(2)));
//System.out.println("shannonEntropy "+shannonEntropy);
}
//System.out.println("shannon Entropy :"+shannonEntropy);
}
public void hMeasure(){
probaVector();
shannonEntropy();
swemax = Math.log(level)/Math.log(2);
hMeasure = shannonEntropy / swemax;
// System.out.println("swemax");System.out.println(shannonEntropy + "\t");
// System.out.println(swemax);
// System.out.println("h(s) is " + hMeasure);
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public double[] getSignal() {
return signal;
}
public void setSignal(double[] signal) {
this.signal = signal;
}
public double[] getArrHilb() {
return arrHilb;
}
public void setArrHilb(double[] arrHilb) {
this.arrHilb = arrHilb;
}
public double gethMeasure() {
return hMeasure;
}
}