## L409 Ondrej Velisek
'''
Haar wavelets algorithm: first steps
'''
from cdi import *
import math

def trend (f) :
    r2 = 1.4142135623730951
    N = len(f)
    J = range(N//2)
    return [(f[2*j] + f[2*j + 1]) / r2 for j in J]



f = [ (x/500-1)**2 * (math.sin(x/10)) for x in range(500)]
a = round(trend(f),2)

# print(f)
# print(a)

def fluct (f) :
    r2 = 1.4142135623730951
    N = len(f)
    J = range(N//2)
    return [(f[2*j] - f[2*j + 1]) / r2 for j in J]
    
d = round(fluct(f),2)

# print(d)


def haar (f, r=1) :
    if r == 0 :
        return f
    if r == 1 :
        return (trend (f) + fluct (f))
    N = len(f)
    m = N // 2**(r-1)
    a = haar(f, r-1)
    x = a[:m]
    return trend(x) + fluct(x) + a[m:]



def energy(f) :
    return sum(x**2 for x in f)

H1 = haar(f, 1)
H2 = haar(f, 2)
H3 = haar(f, 3)

E0 = round(energy(f), 2)
print(E0)
E1 = round(energy(H1), 2)
print(E1)
E2 = round(energy(H2), 2)
print(E2)
E3 = round(energy(H3), 2)
print(E3)

if (E0 == E1 == E2 == E3) :
    print ('energy success')
else :
    print('energy fail')





