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


using namespace std;

int main()
{
        
        string name="bior3.3";
        int J=2;
        vector<double> sig;
        
        for (int i=0; i < 88;i ++) {
                sig.push_back((double) (i+1));
        }
        
        int rows=11;
        int cols=8;
        
        cout << "INPUT : " << endl;
        for (int i=0; i < (int) rows; i++) {
                for (int j=0; j < (int) cols;j++) {
                        cout << sig[i*cols+j] << " ";
                        
                }
                cout << endl;
                
        }
        
        liftscheme blift(name);
        lwt2<double> lift2(sig,rows,cols,blift,J);
        
        vector<double> A,B,C,D;
        lift2.getCoef(A,B,C,D);
        vector<int> lengths;
        lift2.getDim(lengths);
        cout << "Respective Size of All 4 Output vectors (LL,LH,HL,HH) : " ;
        cout << A.size() << " " << B.size() << " " << C.size() << " " << D.size() << endl;
        cout << "Length of Dimension Vector (8 at Level 1 + 6 at Level 2) :" <<  lengths.size() << endl;
        cout << "Low Pass Component At Level 2 : " << endl;
        for (int i=0; i < (int) lengths[0]; i++) {
                for (int j=0; j < (int) lengths[1];j++) {
                        cout << A[i*lengths[1]+j] << " ";
                        
                }
                cout << endl;
                
        }
        cout << " Levels : " << lift2.getLevels() << endl;
        cout << " All 7 row/col pairs : " << endl;
        for (int i=0; i < (int) lengths.size()/2; i++) {
                cout << lengths[2*i] << " " << lengths[2*i+1 ] << endl;
        }
        
        
        int slevel = 1;
        vector<double> H;
        vector<int> detlenH;
        
        lift2.getDetails("LH",slevel,H,detlenH);
        
        cout << " Lengths of Horizontal Component at level 1 : " << detlenH[0] << " " << detlenH[1] << endl;
        cout << " Horizontal Component at level 1 : " << endl;
        
        for (int i=0; i < (int) detlenH[0]; i++) {
                for (int j=0; j < (int) detlenH[1];j++) {
                        cout << H[i*detlenH[1]+j] << " ";
                        
                }
                cout << endl;
                
        }
        cout << endl;
        
        ilwt2<double> ilift2(lift2,blift);
        vector<double> oup;
        ilift2.getSignal(oup);
        vector<int> oup_dim;
        ilift2.getDim(oup_dim);
        cout << "Output Dimensions : " << oup_dim[0] << " :: " << oup_dim[1] << endl;
        cout << "OUTPUT : " << endl;
        for (int i=0; i < (int) oup_dim[0]; i++) {
                for (int j=0; j < (int) oup_dim[1];j++) {
                        cout << oup[i*oup_dim[1]+j] << " ";
                        
                }
                cout << endl;
                
        }
        
        
         

        return 0;
}