Changeset 1205 for library

Show
Ignore:
Timestamp:
09/29/10 18:19:04 (14 years ago)
Author:
vahalam
Message:

uprava testu

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • library/tests/testsuite/LQG_test.cpp

    r1194 r1205  
    9292} 
    9393 
    94 TEST (quadratic_test){ 
     94//TEST (quadratic_test){ 
    9595  /*quadraticfn qf; 
    9696  qf.Q = chmat(2); 
     
    112112  lq.redesign(); 
    113113  CHECK_CLOSE_EX(lq.ctrlaction(vec("1,0")), vec("1.24, -5.6"), 0.0000001);*/ 
    114 } 
     114//} 
    115115 
    116116TEST (LQGU_static_vs_Riccati_test){ 
     
    180180  //loss x'Qx part 
    181181  loss(0).Q.setCh(mQ); 
    182   loss(0).rv = RV("x", 2, 0); 
     182  loss(0).rv = RV("x", 2, 1); 
    183183  //loss u'Ru part 
    184184  loss(1).Q.setCh(mR); 
     
    348348  //loss x'Qx part 
    349349  loss(0).Q.setCh(mQ); 
    350   loss(0).rv = RV("x", matxsize, 0); 
     350  loss(0).rv = RV("x", matxsize, 1); 
    351351  //loss u'Ru part 
    352352  loss(1).Q.setCh(mR); 
     
    479479  Array<quadraticfn> qloss(2);   
    480480  qloss(0).Q.setCh(Q); 
    481   qloss(0).rv = RV("x", 1, 0);   
     481  qloss(0).rv = RV("x", 1, 1);   
    482482  qloss(1).Q.setCh(R); 
    483483  qloss(1).rv = RV("u", 1, 0);   
     
    609609  Array<quadraticfn> qloss(2);   
    610610  qloss(0).Q.setCh(X); 
    611   qloss(0).rv = RV("x", 3, 0);   
     611  qloss(0).rv = RV("x", 3, 1);   
    612612  qloss(1).Q.setCh(Y); 
    613613  qloss(1).rv = RV("u", 1, 0);   
     
    700700} 
    701701 
    702 TEST (LQGU_PMSM_test){ 
    703         bdm_assert(0, "Test not implemented."); 
     702/*TEST (LQGU_PMSM_test){ 
     703         
     704        int K = 10; 
     705        int Kt = 100; 
     706        int N = 50; 
     707 
     708        double a = 0.9898; 
     709        double b = 0.0072; 
     710        double c = 0.0361; 
     711        double d = 1; 
     712        double e = 0.0149;  
     713 
     714        double OMEGAt = 2.15; 
     715        double DELTAt = 0.000125; 
     716 
     717        double v = 0.0001; 
     718        double w = 1; 
     719 
     720        mat A(5,5); 
     721        A.zeros(); 
     722        A(0,0) = a; 
     723        A(1,1) = a; 
     724        A(2,2) = d; 
     725        A(3,3) = 1.0; 
     726        A(4,4) = 1.0; 
     727        A(2,4) = d-1.0; 
     728        A(3,2) = DELTAt; 
     729        A(3,4) = DELTAt; 
     730 
     731        mat B(5,2); 
     732        B.zeros(); 
     733        B(0,0) = c; 
     734        B(1,1) = c; 
     735 
     736        mat C(2,5); 
     737        C.zeros(); 
     738        C(0,0) = c; 
     739        C(1,1) = c; 
     740          
     741        mat X(5,5); 
     742        X.zeros(); 
     743        X(2,2) = w; 
     744 
     745        mat Y(2,2); 
     746        Y.zeros(); 
     747        Y(0,0) = v; 
     748        Y(1,1) = v; 
     749 
     750        mat Q(5,5); 
     751        Q.zeros(); 
     752        Q(0,0) = 0.0013; 
     753        Q(1,1) = 0.0013; 
     754        Q(2,2) = 5e-6; 
     755        Q(3,3) = 1e-10; 
     756 
     757        mat R(2,2); 
     758        R.zeros(); 
     759        R(0,0) = 0.0006; 
     760        R(0,0) = 0.0006; 
     761 
     762        vec x0(5); 
     763        x0.zeros(); 
     764        x0(2) = 1.0-OMEGAt; 
     765        x0(3) = itpp::pi / 2; 
     766        x0(4) = OMEGAt; 
     767 
     768        mat P(5,5); 
     769        P.zeros(); 
     770        P(0,0) = 0.01; 
     771        P(1,1) = 0.01; 
     772        P(2,2) = 0.01; 
     773        P(3,3) = 0.01; 
     774 
     775 
     776        //vec u0(Kt+K); 
     777        //vec u1(Kt+K); 
     778        //mat u(2,Kt+K) 
     779        vec u(2); 
     780 
     781        //vec x0(Kt+K); 
     782        //vec x1(Kt+K); 
     783        //vec x2(Kt+K); 
     784        //vec x3(Kt+K); 
     785        //vec x4(Kt+K); 
     786        mat x(5,Kt+K); 
     787 
     788        //vec y0(Kt+K); 
     789        //vec y1(Kt+K); 
     790        mat y(2, Kt+K); 
     791 
     792        mat Pk(5, 5); 
     793         
     794        mat KK(5, 2); 
     795 
     796        mat L(2, 5); 
     797        mat L0(5, Kt); 
     798        mat L1(5, Kt);  
     799 
     800        int i,n,k,kt; 
     801        vec x00(5); 
     802        vec randvec(2); 
     803 
     804        LQG_universal lq; 
     805        lq.rv = RV("u", 2, 0);   
     806        lq.set_rvc(RV("x", 5, 0)); 
     807        lq.horizon = K; 
     808 
     809        Array<linfnEx> model(2);   
     810        model(0).A = A; 
     811        model(0).B = vec("0 0 0 0 0"); 
     812        model(0).rv = RV("x", 5, 0); 
     813        model(0).rv_ret = RV("x", 5, 1);   
     814        model(1).A = B; 
     815        model(1).B = vec("0 0"); 
     816        model(1).rv = RV("u", 2, 0); 
     817        model(1).rv_ret = RV("x", 5, 1);   
     818        lq.Models = model; 
     819 
     820        Array<quadraticfn> qloss(2);   
     821        qloss(0).Q.setCh(X); 
     822        qloss(0).rv = RV("x", 5, 1);   
     823        qloss(1).Q.setCh(Y); 
     824        qloss(1).rv = RV("u", 2, 0);   
     825        lq.Losses = qloss; 
     826   
     827        lq.finalLoss.Q.setCh(X); 
     828        lq.finalLoss.rv = RV("x", 5, 1); 
     829 
     830        lq.validate();  
     831 
     832        vec losses(N); 
     833                losses.zeros(); 
     834 
     835        double loss; 
     836         
     837        for(n = 0; n < N; n++) { 
     838                L0.zeros(); 
     839                L1.zeros(); 
     840                Pk.zeros(); 
     841                                     
     842                for(i=0;i<4;i++) x00(i) = x0(i) + sqrt(P(i,i))*randn();    
     843                        
     844                for(kt = 0; kt < Kt; kt++){             
     845                        x.set_col(0, x00); 
     846                        y.set_col(0, x.get_col(0).get(0,1));             
     847                        for(k = 0; k < kt+K-1; k++){ 
     848                                L.set_size(2,5); 
     849                                L.set_row(0, L0.get_col(kt)); 
     850                                L.set_row(1, L1.get_col(kt)); 
     851                                u = L*x.get_col(k); 
     852 
     853                                /*if(k > 2){ 
     854                                                cout << "Pk " << Pk << endl; 
     855                                                cout << "C " << C << endl; 
     856                                                cout << "R " << R << endl; 
     857                                                cout << "Pk * C.transpose() " << Pk * C.transpose() << endl; 
     858                                                cout << "inv(C * Pk * C.transpose() + R) " << inv(C * Pk * C.transpose() + R) << endl; 
     859                                                cout << "Pk * C.transpose() * inv(C * Pk * C.transpose() + R) " << Pk * C.transpose() * inv(C * Pk * C.transpose() + R) << endl; 
     860                                }*/ 
     861                                /*KK = Pk * C.transpose() * inv(C * Pk * C.transpose() + R);                
     862              
     863                                x(0, k+1) = a*x(0, k) + b*(x(2, k) + x(4, k))*sin(x(3, k)) + c*u(0) + sqrt(Q(0, 0))*randn();   
     864                                x(1, k+1) = a*x(1, k) - b*(x(2, k) + x(4, k))*cos(x(3, k)) + c*u(1) + sqrt(Q(1, 1))*randn(); 
     865                                x(2, k+1) = d*x(2, k) + (d-1)*x(4, k) + e*(x(1, k)*cos(x(3, k)) - x(0, k)*sin(x(3, k))) + sqrt(Q(2, 2))*randn(); 
     866                                x(3, k+1) = x(3, k) + (x(2, k) + x(4, k))*DELTAt + sqrt(Q(3, 3))*randn();  
     867                                x(4, k+1) = x(4, k);                
     868 
     869                                x.set_col(k+1, x.get_col(k+1) - KK * (y.get_col(k) - x.get_col(k).get(0,1)));  
     870                                randvec(0) = randn(); 
     871                                randvec(1) = randn(); 
     872                                y.set_col(k+1, x.get_col(k+1).get(0,1) + R * randvec);   
     873 
     874                                A(2, 0) = -e*sin(x(3, k)); 
     875                                A(2, 1) = e*cos(x(3, k)); 
     876                                A(0, 2) = b*sin(x(3, k)); 
     877                                A(1, 2) = -b*cos(x(3, k)); 
     878                                A(0, 3) = b*(x(2, k) + x(4, k))*cos(x(3, k)); 
     879                                A(1, 3) = b*(x(2, k) + x(4, k))*sin(x(3, k));     
     880                                A(2, 3) = -e*(x(1, k)*sin(x(3, k) + x(0, k)*cos(x(3, k)))); 
     881                                A(0, 4) = b*sin(x(3, k)); 
     882                                A(1, 4) = -b*cos(x(3, k));      
     883//cout << "A(" << k << "): " << endl << A << endl; 
     884                                Pk = A * (Pk - Pk * C.transpose() * inv(C * Pk * C.transpose() + R) * C * Pk) * A.transpose() + Q;               
     885cout << "Pk(" << k << "): " << endl << Pk << endl; 
     886                        } 
     887                         
     888            lq.resetTime(); 
     889                        lq.redesign(); 
     890            for(k = K-1; k > 0; k--){                
     891                A(2, 0) = -e*sin(x(3, k+kt-1)); 
     892                A(2, 1) = e*cos(x(3, k+kt-1)); 
     893                A(0, 2) = b*sin(x(3, k+kt-1)); 
     894                A(1, 2) = -b*cos(x(3, k+kt-1)); 
     895                A(0, 3) = b*(x(2, k+kt-1) + x(4, k+kt-1))*cos(x(3, k+kt-1)); 
     896                A(1, 3) = b*(x(2, k+kt-1) + x(4, k+kt-1))*sin(x(3, k+kt-1));     
     897                A(2, 3) = -e*(x(1, k+kt-1)*sin(x(3, k+kt-1) + x(0,k+kt-1)*cos(x(3, k+kt-1)))); 
     898                A(0, 4) = b*sin(x(3, k+kt-1)); 
     899                A(1, 4) = -b*cos(x(3, k+kt-1));                                          
     900                                lq.Models(0).A = A;                                                       
     901                                lq.redesign(); 
     902                        } 
     903                        L = lq.getL(); 
     904                        L0.set_col(kt, L.get_row(0).get(0,4)); 
     905                        L1.set_col(kt, L.get_row(1).get(0,4)); 
     906                }         
     907                 
     908        x.set_col(0, x00); 
     909                y.set_col(0, x.get_col(0).get(0,1)); 
     910 
     911                loss = 0; 
     912 
     913        for(k = 0; k < Kt; k++){                
     914                        L.set_row(0, L0.get_col(k)); 
     915                        L.set_row(1, L1.get_col(k)); 
     916                        u = L*x.get_col(k);      
     917 
     918                        KK = Pk * C.transpose() * inv(C * Pk * C.transpose() + R); 
     919 
     920            x(0, k+1) = a*x(0, k) + b*(x(2, k) + x(4, k))*sin(x(3, k)) + c*u(0) + sqrt(Q(0, 0))*randn();   
     921                        x(1, k+1) = a*x(1, k) - b*(x(2, k) + x(4, k))*cos(x(3, k)) + c*u(1) + sqrt(Q(1, 1))*randn(); 
     922                        x(2, k+1) = d*x(2, k) + (d-1)*x(4, k) + e*(x(1, k)*cos(x(3, k)) - x(0, k)*sin(x(3, k))) + sqrt(Q(2, 2))*randn(); 
     923                        x(3, k+1) = x(3, k) + (x(2, k) + x(4, k))*DELTAt + sqrt(Q(3, 3))*randn();  
     924                        x(4, k+1) = x(4, k);  
     925 
     926                        loss += (x.get_col(k+1).transpose() * X * x.get_col(k+1).transpose())(0,0); 
     927                        loss += (u.transpose() * Y * u)(0); 
     928                
     929            x.set_col(k+1, x.get_col(k+1) - KK * (y.get_col(k) - x.get_col(k).get(0,1)));  
     930                        randvec(0) = randn(); 
     931                        randvec(1) = randn(); 
     932                        y.set_col(k+1, x.get_col(k+1).get(0,1) + R * randvec);                    
     933 
     934            A(2, 0) = -e*sin(x(3, k)); 
     935                        A(2, 1) = e*cos(x(3, k)); 
     936                        A(0, 2) = b*sin(x(3, k)); 
     937                        A(1, 2) = -b*cos(x(3, k)); 
     938                        A(0, 3) = b*(x(2, k) + x(4, k))*cos(x(3, k)); 
     939                        A(1, 3) = b*(x(2, k) + x(4, k))*sin(x(3, k));     
     940                        A(2, 3) = -e*(x(1, k)*sin(x(3, k) + x(0, k)*cos(x(3, k)))); 
     941                        A(0, 4) = b*sin(x(3, k)); 
     942                        A(1, 4) = -b*cos(x(3, k));      
     943 
     944                        Pk = A * (Pk - Pk * C.transpose() * inv(C * Pk * C.transpose() + R) * C * Pk) * A.transpose() + Q;                  
     945                }  
     946 
     947                losses(n) = loss;         
     948        
     949        } 
     950 
     951        cout << "Ztrata: " << sum(losses)/n << endl; 
    704952} 
    705953 
    706 TEST (LQGU_large_test){ 
    707         bdm_assert(0, "Test not implemented."); 
    708 } 
    709  
    710 TEST (validation_test){ 
     954//TEST (LQGU_large_test){ 
     955        /* 
     956        loss = /Q1*x(+1) + /Q2*y + /Q3*z + /Q4*u + /Q5*[x(+1); y; 1] + /Q6*[z; u; 1] + /Q7*[x(+1); y; z; u; 1] 
     957        u = rv 
     958        x = rvc 
     959        y = A1*[x; 1] + B1 
     960        z = A2*[x; u; 1] + B2 
     961        x(+1) = A3*[x; 1] + B3 
     962        */ 
     963        //uniform random generator 
     964  /*Uniform_RNG urng;   
     965  int max_size = 10; 
     966  double maxmult = 10.0; 
     967   
     968  urng.setup(2.0, max_size);   
     969  int xsize = round(urng());     
     970  int usize = round(urng()); 
     971  int ysize = round(urng()); 
     972  int zsize = round(urng()); 
     973  cout << "CFG: " << xsize << " " << ysize << " " << zsize << " " << usize << " " << endl; 
     974  urng.setup(-maxmult, maxmult); 
     975  mat tmpmat; 
     976  mat A1,A2,A3,Q1,Q2,Q3,Q4,Q5,Q6,Q7; 
     977  vec B1,B2,B3; 
     978 
     979  A1 = urng(ysize,xsize+1); 
     980  B1 = urng(ysize); 
     981  A2 = urng(zsize,xsize+usize+1); 
     982  B2 = urng(zsize); 
     983  A3 = urng(xsize,xsize+1); 
     984  B3 = urng(xsize); 
     985 
     986  tmpmat = urng(xsize,xsize); 
     987  Q1 = tmpmat*tmpmat.transpose(); 
     988  tmpmat = urng(ysize,ysize); 
     989  Q2 = tmpmat*tmpmat.transpose(); 
     990  tmpmat = urng(zsize,zsize); 
     991  Q3 = tmpmat*tmpmat.transpose(); 
     992  tmpmat = urng(usize,usize); 
     993  Q4 = tmpmat*tmpmat.transpose(); 
     994  tmpmat = urng(xsize+ysize+1,xsize+ysize+1); 
     995  Q5 = tmpmat*tmpmat.transpose(); 
     996  tmpmat = urng(zsize+usize+1,zsize+usize+1); 
     997  Q6 = tmpmat*tmpmat.transpose(); 
     998  tmpmat = urng(xsize+ysize+zsize+usize+1,xsize+ysize+zsize+usize+1); 
     999  Q7 = tmpmat*tmpmat.transpose(); 
     1000 
     1001     
     1002  //starting configuration 
     1003  vec x0; 
     1004        x0 = urng(xsize);   
     1005 
     1006//test of universal LQG controller 
     1007  LQG_universal lq; 
     1008  lq.rv = RV("u", usize, 0);   
     1009  lq.set_rvc(RV("x", xsize, 0)); 
     1010  lq.horizon = 100; 
     1011 
     1012        RV tmprv; 
     1013 
     1014  //model 
     1015  Array<linfnEx> model(3);   
     1016  model(0).A = A1; 
     1017  model(0).B = B1; 
     1018  tmprv = RV("x", xsize, 0); 
     1019  tmprv.add(RV("1",1,0)); 
     1020  model(0).rv = tmprv; 
     1021  model(0).rv_ret = RV("y", ysize, 0);     
     1022  model(1).A = A2; 
     1023  model(1).B = B2; 
     1024  tmprv = RV("x", xsize, 0); 
     1025  tmprv.add(RV("u", usize, 0)); 
     1026  tmprv.add(RV("1",1,0)); 
     1027  model(1).rv = tmprv; 
     1028  model(1).rv_ret = RV("z", zsize, 0); 
     1029  model(2).A = A3; 
     1030  model(2).B = B3; 
     1031  tmprv = RV("x", xsize, 0); 
     1032  tmprv.add(RV("1",1,0)); 
     1033  model(2).rv = tmprv; 
     1034  model(2).rv_ret = RV("x", xsize, 1); 
     1035  //setup 
     1036  lq.Models = model; 
     1037 
     1038  //loss 
     1039  Array<quadraticfn> loss(7);   
     1040  loss(0).Q.setCh(Q1); 
     1041  loss(0).rv = RV("x", xsize, 1); 
     1042  loss(1).Q.setCh(Q2); 
     1043  loss(1).rv = RV("y", ysize, 0); 
     1044  loss(2).Q.setCh(Q3); 
     1045  loss(2).rv = RV("z", zsize, 0); 
     1046  loss(3).Q.setCh(Q4); 
     1047  loss(3).rv = RV("u", usize, 0); 
     1048  loss(4).Q.setCh(Q5); 
     1049  tmprv = RV("x", xsize, 1); 
     1050  tmprv.add(RV("y", ysize, 0)); 
     1051  tmprv.add(RV("1",1,0)); 
     1052  loss(4).rv = tmprv; 
     1053  loss(5).Q.setCh(Q6); 
     1054  tmprv = RV("z", zsize, 0); 
     1055  tmprv.add(RV("u", usize, 0)); 
     1056  tmprv.add(RV("1",1,0)); 
     1057  loss(5).rv = tmprv; 
     1058  loss(6).Q.setCh(Q7); 
     1059  tmprv = RV("x", xsize, 1); 
     1060  tmprv.add(RV("y", ysize, 0)); 
     1061  tmprv.add(RV("z", zsize, 0)); 
     1062  tmprv.add(RV("u", usize, 0)); 
     1063  tmprv.add(RV("1",1,0)); 
     1064  loss(6).rv = tmprv; 
     1065  //setup 
     1066  lq.Losses = loss; 
     1067 
     1068  //finalloss setup 
     1069  tmpmat = urng(xsize,xsize);    
     1070  lq.finalLoss.Q.setCh(tmpmat*tmpmat.transpose()); 
     1071  lq.finalLoss.rv = RV("x", xsize, 1); 
     1072 
     1073  lq.validate();   
     1074 
     1075  //produce last control matrix L 
     1076  lq.redesign(); 
     1077  cout << lq.getL() << endl;   
     1078   
     1079  int i;   
     1080  for(i = 0; i < lq.horizon - 1; i++) { 
     1081          lq.redesign();           
     1082  } 
     1083  cout << lq.getL() << endl; 
     1084 
     1085  mat K; 
     1086  K = A3.get_cols(0, xsize-1).transpose()*Q1.transpose()*Q1*A3.get_cols(0, xsize-1) 
     1087    + A1.get_cols(0, xsize-1).transpose()*Q2.transpose()*Q2*A1.get_cols(0, xsize-1) 
     1088        + A2.get_cols(0, xsize-1).transpose()*Q3.transpose()*Q3*A2.get_cols(0, xsize-1) 
     1089        + A3.get_cols(0, xsize-1).transpose()*Q5.get_cols(0, xsize-1).transpose()*Q5.get_cols(0, xsize-1)*A3.get_cols(0, xsize-1) 
     1090        + A1.get_cols(0, xsize-1).transpose()*Q5.get_cols(xsize, xsize+ysize-1).transpose()*Q5.get_cols(xsize, xsize+ysize-1)*A1.get_cols(0, xsize-1)  
     1091        + A2.get_cols(0, xsize-1).transpose()*Q6.get_cols(0, zsize-1).transpose()*Q6.get_cols(0, zsize-1)*A2.get_cols(0, xsize-1) 
     1092        + A3.get_cols(0, xsize-1).transpose()*Q7.get_cols(0, xsize-1).transpose()*Q7.get_cols(0, xsize-1)*A3.get_cols(0, xsize-1) 
     1093        + A1.get_cols(0, xsize-1).transpose()*Q7.get_cols(xsize, xsize+ysize-1).transpose()*Q7.get_cols(xsize, xsize+ysize-1)*A1.get_cols(0, xsize-1) 
     1094        + A2.get_cols(0, xsize-1).transpose()*Q7.get_cols(xsize+ysize, xsize+ysize+zsize-1).transpose()*Q7.get_cols(xsize+ysize, xsize+ysize+zsize-1)*A2.get_cols(0, xsize-1); 
     1095 
     1096  mat L; 
     1097  L = A2.get_cols(xsize, xsize+usize-1).transpose()*Q3.transpose()*Q3*A2.get_cols(xsize, xsize+usize-1) 
     1098    + Q4.transpose()*Q4 
     1099        + A2.get_cols(xsize, xsize+usize-1).transpose()*Q6.get_cols(0, zsize-1).transpose()*Q6.get_cols(0, zsize-1)*A2.get_cols(xsize, xsize+usize-1) 
     1100        + Q6.get_cols(zsize, zsize+usize-1).transpose()*Q6.get_cols(zsize, zsize+usize-1) 
     1101        + A2.get_cols(xsize, xsize+usize-1).transpose()*Q7.get_cols(xsize+ysize, xsize+ysize+zsize-1).transpose()*Q7.get_cols(xsize+ysize, xsize+ysize+zsize-1)*A2.get_cols(xsize, xsize+usize-1) 
     1102        + Q7.get_cols(xsize+ysize+zsize, xsize+ysize+zsize+usize-1).transpose()*Q7.get_cols(xsize+ysize+zsize, xsize+ysize+zsize+usize-1); 
     1103 
     1104  double M; 
     1105  M = (A3.get_cols(xsize,xsize).transpose()*Q1.transpose()*Q1*A3.get_cols(xsize,xsize))(0,0) 
     1106    + (B3.transpose()*Q1.transpose()*Q1*B3)(0) 
     1107        + (A1.get_cols(xsize,xsize).transpose()*Q2.transpose()*Q2*A1.get_cols(xsize,xsize))(0,0) 
     1108        + (B1.transpose()*Q2.transpose()*Q2*B1)(0) 
     1109        + (A2.get_cols(xsize+usize,xsize+usize).transpose()*Q3.transpose()*Q3*A2.get_cols(xsize+usize,xsize+usize))(0,0) 
     1110        + (B2.transpose()*Q3.transpose()*Q3*B2)(0) 
     1111        + (A3.get_cols(xsize,xsize).transpose()*Q5.get_cols(0, xsize-1).transpose()*Q5.get_cols(0, xsize-1)*A3.get_cols(xsize,xsize))(0,0) 
     1112        + (B3.transpose()*Q5.get_cols(0, xsize-1).transpose()*Q5.get_cols(0, xsize-1)*B3)(0) 
     1113        + (A1.get_cols(xsize,xsize).transpose()*Q5.get_cols(xsize, xsize+ysize-1).transpose()*Q5.get_cols(xsize, xsize+ysize-1)*A1.get_cols(xsize,xsize))(0,0) 
     1114        + (B1.transpose()*Q5.get_cols(xsize, xsize+ysize-1).transpose()*Q5.get_cols(xsize, xsize+ysize-1)*B1)(0) 
     1115        + (Q5.get_cols(xsize+ysize,xsize+ysize).transpose()*Q5.get_cols(xsize+ysize,xsize+ysize))(0,0) 
     1116        + (A2.get_cols(xsize+usize,xsize+usize).transpose()*Q6.get_cols(0, zsize-1).transpose()*Q6.get_cols(0, zsize-1)*A2.get_cols(xsize+usize,xsize+usize))(0,0) 
     1117        + (B2.transpose()*Q6.get_cols(0, zsize-1).transpose()*Q6.get_cols(0, zsize-1)*B2)(0) 
     1118        + (Q6.get_cols(zsize+usize,zsize+usize).transpose()*Q6.get_cols(zsize+usize,zsize+usize))(0,0) 
     1119        + (A3.get_cols(xsize,xsize).transpose()*Q7.get_cols(0, xsize-1).transpose()*Q7.get_cols(0, xsize-1)*A3.get_cols(xsize,xsize))(0,0) 
     1120        + (B3.transpose()*Q7.get_cols(0, xsize-1).transpose()*Q7.get_cols(0, xsize-1)*B3)(0) 
     1121        + (A1.get_cols(xsize,xsize).transpose()*Q7.get_cols(xsize, xsize+ysize-1).transpose()*Q7.get_cols(xsize, xsize+ysize-1)*A1.get_cols(xsize,xsize))(0,0) 
     1122        + (B1.transpose()*Q7.get_cols(xsize, xsize+ysize-1).transpose()*Q7.get_cols(xsize, xsize+ysize-1)*B1)(0) 
     1123        + (A2.get_cols(xsize+usize,xsize+usize).transpose()*Q7.get_cols(xsize+ysize, xsize+ysize+zsize-1).transpose()*Q7.get_cols(xsize+ysize, xsize+ysize+zsize-1)*A2.get_cols(xsize+usize,xsize+usize))(0,0) 
     1124        + (B2.transpose()*Q7.get_cols(xsize+ysize, xsize+ysize+zsize-1).transpose()*Q7.get_cols(xsize+ysize, xsize+ysize+zsize-1)*B2)(0) 
     1125        + (Q7.get_cols(xsize+ysize+zsize+usize,xsize+ysize+zsize+usize).transpose()*Q7.get_cols(xsize+ysize+zsize+usize,xsize+ysize+zsize+usize))(0,0); 
     1126 
     1127   
     1128  /*mat res; 
     1129  res = -inv(sqrtm(L))*sqrtm(K);*/ 
     1130 
     1131  /*cout << -inv(sqrtm(L))*sqrtm(K).get_cols(0,L.rows()).get_rows(0,L.cols()) << endl; 
     1132}*/ 
     1133 
     1134/*TEST (validation_test){ 
    7111135        RV rv1("x", 1); 
    7121136        RV rv2("y", 2); 
     
    7211145        all.add(rv5); 
    7221146        all.add(RV("1",1,0)); 
    723         cout << "all rv: " << all << endl; 
     1147        //cout << "all rv: " << all << endl; 
    7241148 
    7251149        ivec fy = rv2.findself(all); 
    726         cout << "finding y: " << fy << endl; 
     1150        //cout << "finding y: " << fy << endl; 
    7271151        ivec dy = rv2.dataind(all); 
    728         cout << "dataind y: " << dy << endl; 
     1152        //cout << "dataind y: " << dy << endl; 
    7291153 
    7301154        RV rvzyu; 
     
    7331157        rvzyu.add(rv4); 
    7341158        fy = rvzyu.findself(all); 
    735         cout << "finding zyu: " << fy << endl; 
     1159        //cout << "finding zyu: " << fy << endl; 
    7361160        dy = rvzyu.dataind(all); 
    737         cout << "dataind zyu: " << dy << endl; 
     1161        //cout << "dataind zyu: " << dy << endl; 
    7381162 
    7391163        rvzyu.add(RV("1",1,0)); 
    7401164        fy = rvzyu.findself(all); 
    741         cout << "finding zyu1: " << fy << endl; 
     1165        //cout << "finding zyu1: " << fy << endl; 
    7421166        dy = rvzyu.dataind(all); 
    743         cout << "dataind zyu1: " << dy << endl; 
     1167        //cout << "dataind zyu1: " << dy << endl; 
    7441168 
    7451169        rvzyu.add(RV("k",1,0)); 
    7461170        fy = rvzyu.findself(all); 
    747         cout << "finding zyu1 !k!: " << fy << endl; 
     1171        //cout << "finding zyu1 !k!: " << fy << endl; 
    7481172        dy = rvzyu.dataind(all); 
    749         cout << "dataind zyu1 !k!: " << dy << endl; 
     1173        //cout << "dataind zyu1 !k!: " << dy << endl; 
    7501174 
    7511175        RV emptyrv; 
    7521176        fy = emptyrv.findself(all); 
    753         cout << "finding empty: " << fy << " size " << fy.size() << endl; 
     1177        //cout << "finding empty: " << fy << " size " << fy.size() << endl; 
    7541178        dy = emptyrv.dataind(all); 
    755         cout << "dataind empty: " << dy << " size " << dy.size() << endl; 
     1179        //cout << "dataind empty: " << dy << " size " << dy.size() << endl; 
    7561180 
    7571181        LQG_universal lq; 
    7581182        lq.validate(); 
    759 } 
     1183}*/