root / tests / test-redrowechelon.C

Revision 26, 4.3 kB (checked in by pernet, 1 year ago)

New row echelon form and reduced row echelon form

Line 
1/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2//--------------------------------------------------------------------------
3//          Test for the reduced row echelon factorisation
4//--------------------------------------------------------------------------
5// usage: test-redrowechelon p A n, for n reduced row echelon computations
6// of A over Z/pZ
7//-------------------------------------------------------------------------
8
9//-------------------------------------------------------------------------
10#define DEBUG 1
11// Debug option  0: no debug
12//               1: check A = LQUP
13//-------------------------------------------------------------------------
14using namespace std;
15
16
17//#define __LUDIVINE_CUTOFF 1
18#include <iostream>
19#include <iomanip>
20#include "Matio.h"
21#include "timer.h"
22//#include "fflas-ffpack/modular-balanced.h"
23#include "fflas-ffpack/modular-positive.h"
24#include "fflas-ffpack/ffpack.h"
25
26typedef Modular<double> Field;
27
28int main(int argc, char** argv){
29        //cerr<<setprecision(20);
30        int i,j,nbf,m,n;
31        int R=0;
32
33        if (argc!=4){
34                cerr<<"usage : test-redrowechelon <p> <A> <i>"<<endl
35                    <<"        to do i reduced row  echelon computations of A"
36                    <<endl;
37                exit(-1);
38        }
39        Field F((unsigned long)atoi(argv[1]));
40        Field::Element * A;
41       
42        A = read_field(F,argv[2],&m,&n);
43       
44        size_t *P = new size_t[n];
45        size_t *Q = new size_t[m];
46               
47        //      size_t cutoff = atoi(argv[3]);
48        nbf = atoi(argv[3]);
49       
50        Timer tim,timc;
51        timc.clear();
52
53
54        for ( i=0;i<nbf;i++){
55                if (i) {               
56                        delete[] A;
57                        A = read_field(F,argv[2],&m,&n);
58                }
59                for (j=0;j<n;j++)
60                        P[j]=0;
61                for (j=0;j<m;j++)
62                        Q[j]=0;
63                tim.clear();     
64                tim.start();   
65                R = FFPACK::ReducedRowEchelonForm (F, m, n, A, n, P, Q);
66                tim.stop();
67                timc+=tim;
68        }
69        //write_field (F,cerr<<"Result = "<<endl, A, m,n,n);
70
71//      cerr<<"P = [";
72//      for (size_t i=0; i<n; ++i)
73//              cerr<<P[i]<<" ";
74//      cerr<<"]"<<endl;
75//      cerr<<"Q = [";
76//      for (size_t i=0; i<m; ++i)
77//              cerr<<Q[i]<<" ";
78//      cerr<<"]"<<endl;
79#if DEBUG
80        Field::Element * L = new Field::Element[m*m];
81        Field::Element * U = new Field::Element[m*n];
82        Field::Element * X = new Field::Element[m*n];
83       
84        Field::Element zero,one;
85        F.init(zero,0.0);
86        F.init(one,1.0);
87       
88        for (int i=0; i<R; ++i){
89                for (int j=0; j<m; ++j)
90                        F.assign (*(L + i + j*m), *(A+ i+j*n));
91        }
92        for (int i=R;i<m; ++i){
93                for (int j=0; j<m; ++j)
94                        F.assign(*(L+i+j*m), zero);
95                F.init(*(L+i*(m+1)),one);
96        }
97        FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasNoTrans, m, 0, R, L, m, P);   
98
99        for ( int i=0; i<R; ++i ){
100                for (int j=0; j < m ; ++j)
101                        F.assign( *(U + i+j*n),zero);
102                F.assign(*(U+i*(n+1)), one);
103        }
104        for ( int i=R; i<n; ++i ){
105                for (int j=0; j<R; ++j )
106                        F.assign (*(U+i+j*n), *(A+i+j*n));
107                for (int j=R; j<m; ++j)
108                        F.assign (*(U+i+j*n), zero);
109        }
110        //write_field(F,cerr<<"U = "<<endl,U,m,n,n);
111        FFPACK::applyP( F, FFLAS::FflasRight, FFLAS::FflasNoTrans, m, 0, R, U, n, Q);
112        //write_field(F,cerr<<"U = "<<endl,U,m,n,n);
113//      cerr<<"P = ";
114//      for (size_t i=0; i<n;++i)
115//              cerr<<" "<<P[i];
116//      cerr<<endl;
117//      cerr<<"Q = ";
118//      for (size_t i=0; i<m;++i)
119//              cerr<<" "<<Q[i];
120//      cerr<<endl;
121       
122       
123        //      write_field(F,cerr<<"R = "<<endl,L,m,n,n);
124
125
126        Field::Element * B =  read_field(F,argv[2],&m,&n);
127        //write_field(F,cerr<<"A = "<<endl,B,m,n,n);
128       
129        FFLAS::fgemm (F, FFLAS::FflasNoTrans, FFLAS::FflasNoTrans, m,n,m, 1.0,
130                      L, m, B, n, 0.0, X,n);
131        //delete[] A;
132
133        bool fail = false;
134        for (int i=0; i<m; ++i)
135                for (int j=0; j<n; ++j)
136                        if (!F.areEqual (*(U+i*n+j), *(X+i*n+j)))
137                                fail=true;
138       
139//      write_field(F,cerr<<"X = "<<endl,X,m,n,n);
140//      write_field(F,cerr<<"R = "<<endl,U,m,n,n);
141       
142        delete[] B;
143        if (fail)
144                cerr<<"FAIL"<<endl;
145
146
147        else
148                cerr<<"PASS"<<endl;
149               
150//      cout<<m<<" "<<n<<" M"<<endl;
151//      for (size_t i=0; i<m; ++i)
152//              for (size_t j=0; j<n; ++j)
153//                      if (!F.isZero(*(A+i*n+j)))
154//                              cout<<i+1<<" "<<j+1<<" "<<(*(A+i*n+j))<<endl;
155//      cout<<"0 0 0"<<endl;
156
157        delete[] U;
158        delete[] L;
159        delete[] X;
160#endif
161        delete[] A;
162        delete[] P;
163        delete[] Q;
164
165        double t = timc.usertime();
166        double numops = 2*m*m/1000.0*n;
167       
168        cerr<<m<<"x"<< n 
169            << " : rank = " << R << "  ["
170            << ((double)nbf/1000.0*(double)numops / t) 
171            << " MFops "
172            << " in "
173            << t/nbf<<"s"
174            <<"]"<< endl;
175//      cout<<m
176//          <<" "<<((double)nbf/1000.0*(double)numops / t)
177//          <<" "<<t/nbf
178//          <<endl;
179
180        return 0;
181}
Note: See TracBrowser for help on using the browser.