#include <iostream>
#include <cmath>
#include <vector>
#include <string>
#include <algorithm>
#include "lwave.h"


using namespace std;

int main()
{

        string name="db3";
        int J=2;
        double lp1_a[] = {0.9501,0.2311,0.6068,0.4860,0.8913,0.7621,0.4565,0.0185,0.8214,
                0.4447,0.6154,0.7919,0.9218,0.7382,0.1763,0.4057};
        /*double lp1_a[] = {1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,
         * 1.000,1.000,1.000,1.000,1.000,1.000,1.000};*/
        vector<double> sig;
            sig.assign(lp1_a,lp1_a + sizeof(lp1_a)/sizeof(double));

            liftscheme blift(name);
            string c="d";
            vector<double> addl;
            addl.push_back(0.500);
            addl.push_back(-0.125);

            int mp=0;
            blift.addLift(c,addl,mp);
            blift.disp();

            lwt<double> dlift(sig,blift,J);
            vector<double> a,d;
            vector<int> lengths;
            dlift.getCoeff(a,d);
            dlift.getDetailVec(lengths);
            cout << " Approximation : " << endl;
            for (int i=0; i < a.size();i++) {
                    cout << a[i] << " ";
            }
            cout << endl;

            cout << " Detail : " << endl;
            for (int i=0; i < d.size();i++) {
                    cout << d[i] << " ";
            }
            cout << endl;

            cout << " Lengths Of Detail Vectors : " << endl;
            for (int i=0; i < lengths.size();i++) {
                    cout << lengths[i] << " ";
            }
            cout << endl;


            ilwt<double> idlift(dlift,blift);
            vector<double> oup;
            idlift.getSignal(oup);

            cout << " Reconstructed : " << endl;
            for (int i=0; i < oup.size();i++) {
                    cout << oup[i] << " ";
            }
            cout << endl;


            return 0;
}