12 #include "/usr/include/gsl/gsl_linalg.h"
14 #include "../basecode/SparseMatrix.h"
21 vector< unsigned int >& col, vector< double >& entry );
27 Unroll(
double diag,
double off,
unsigned int i,
unsigned int j )
43 void makeTestMatrix(
const double* test,
unsigned int numCompts );
48 void buildForwardElim( vector< unsigned int >& diag,
50 void buildBackwardSub( vector< unsigned int >& diag,
55 bool hinesReorder(
const vector< unsigned int >& parentVoxel );
56 const double* allEntries()
const;
58 const vector< unsigned int >& lookupOldRowFromNew );
89 assert( parentVoxel.size() == nrows_ );
90 vector< unsigned int > numKids( nrows_, 0 );
91 vector< unsigned int > lookupOldRowFromNew;
92 vector< bool > rowPending( nrows_,
true );
93 unsigned int numDone = 0;
94 for (
unsigned int i = 0; i < nrows_; ++i ) {
95 if ( parentVoxel[i] != -1 )
96 numKids[ parentVoxel[i] ]++;
98 while ( numDone < nrows_ ) {
99 for (
unsigned int i = 0; i < nrows_; ++i ) {
100 if ( rowPending[i] && numKids[i] == 0 ) {
101 lookupOldRowFromNew.push_back( i );
102 rowPending[i] =
false;
104 unsigned int pa = parentVoxel[i];
106 while ( pa != -1 && numKids[pa] == 1 ) {
107 assert( rowPending[pa] );
108 rowPending[pa] =
false;
110 lookupOldRowFromNew.push_back( pa );
111 pa = parentVoxel[pa];
114 assert( numKids[pa] > 0 );
121 cout << setprecision(4);
122 cout <<
"oldRowFromNew= {" ;
123 for (
int i = 0; i < nrows_; ++i )
124 cout << lookupOldRowFromNew[i] <<
", ";
128 shuffleRows( lookupOldRowFromNew );
133 const vector< unsigned int >& lookupOldRowFromNew )
135 vector< unsigned int > lookupNewRowFromOld( nrows_ );
136 for (
unsigned int i = 0; i < nrows_; ++i )
137 lookupNewRowFromOld[ lookupOldRowFromNew[i] ] = i;
142 for (
unsigned int i = 0; i < lookupOldRowFromNew.size(); ++i ) {
143 vector< unsigned int > c;
145 unsigned int num = temp.
getRow( lookupOldRowFromNew[i], e, c );
146 vector< unsigned int > newc( num );
147 vector< double > newe( num );
148 for (
unsigned int j = 0; j < num; ++j ) {
149 newc[j] = lookupNewRowFromOld[ c[j] ];
158 addRow( i, e, newc );
162 void sortByColumn( vector< unsigned int >& col, vector< double >& entry )
164 unsigned int num = col.size();
165 assert( num == entry.size() );
168 for (
unsigned int i = 0; i < num; ++i ) {
169 for (
unsigned int j = 1; j < num; ++j ) {
170 if ( col[j] < col[j-1] ) {
171 unsigned int temp = col[j];
175 entry[j] = entry[j-1];
257 setSize( numCompts, numCompts );
258 vector< double > row( numCompts, ~0 );
260 for (
unsigned int i = 0; i < numCompts; ++i ) {
261 for (
unsigned int j = 0; j < numCompts; ++j ) {
262 unsigned int k = i * numCompts + j;
263 if ( test[k] < 0.1 ) {
265 N_.push_back( test[k] );
266 colIndex_.push_back( j );
269 rowStart_[i + 1] = N_.size();
289 vector< vector< unsigned int > > rowsToElim( nrows_ );
291 for (
unsigned int i = 0; i < nrows_; ++i ) {
292 unsigned int rs = rowStart_[i];
293 unsigned int re = rowStart_[i+1];
294 for (
unsigned int j = rs; j < re; ++j ) {
295 unsigned int k = colIndex_[j];
298 }
else if ( k > i ) {
299 rowsToElim[ i ].push_back( k );
303 for (
unsigned int i = 0; i < nrows_; ++i ) {
304 double d = N_[diag[i]];
305 unsigned int diagend = rowStart_[ i + 1 ];
306 assert( diag[i] < diagend );
307 vector< unsigned int >& elim = rowsToElim[i];
308 for (
unsigned int j = 0; j < elim.size(); ++j ) {
309 unsigned int erow = elim[j];
310 if ( erow == i )
continue;
311 unsigned int rs = rowStart_[ erow ];
312 unsigned int re = rowStart_[ erow+1 ];
314 double ratio =
get( erow, i ) / d;
316 for (
unsigned int k = diag[i]+1; k < diagend; ++k ) {
317 unsigned int col = colIndex_[k];
319 for (
unsigned int q = rs; q < re; ++q ) {
320 if ( colIndex_[q] == col ) {
321 N_[q] -= N_[k] * ratio;
328 for (
unsigned int i = 0; i < rowsToElim.size(); ++i ) {
330 for (
unsigned int j = 0; j < rowsToElim[i].size(); ++j ) {
331 cout << rowsToElim[i][j] <<
" ";
335 for (
unsigned int i = 0; i < fops.size(); ++i ) {
336 cout <<
"fops[" << i <<
"]= " << fops[i].b_ <<
" " << fops[i].c_ <<
337 " " << fops[i].a_ << endl;
358 vector< vector< unsigned int > > rowsToSub( nrows_ );
360 for (
unsigned int i = 0; i < nrows_; ++i ) {
361 unsigned int d = diag[i] + 1;
362 unsigned int re = rowStart_[i+1];
363 for (
unsigned int j = d; j < re; ++j ) {
364 unsigned int k = colIndex_[j];
367 rowsToSub[ k ].push_back( i );
370 for (
unsigned int i = 0; i < rowsToSub.size(); ++i ) {
372 for (
unsigned int j = 0; j < rowsToSub[i].size(); ++j ) {
373 cout << rowsToSub[i][j] <<
" ";
380 for (
unsigned int i = 0; i != nrows_ ; ++i ) {
381 diagVal.push_back( 1.0 / N_[diag[i]] );
385 for (
unsigned int i = nrows_-1; i != 0 ; --i ) {
386 for (
unsigned int j = rowsToSub[i].size() - 1; j != -1; --j ) {
387 unsigned int k = rowsToSub[i][j];
388 double val =
get( k, i );
393 for (
unsigned int i = 0; i < bops.size(); ++i ) {
394 cout << i <<
": " << bops[i].a_ <<
" " <<
397 1.0 / diagVal[bops[i].b_] <<
404 const vector< double >& diagVal )
407 i = ops.begin(); i != ops.end(); ++i )
408 y[i->c_] -= y[i->b_] * i->a_;
410 assert( y.size() == diagVal.size() );
411 vector< double >::iterator iy = y.begin();
412 for ( vector< double >::const_iterator
413 i = diagVal.begin(); i != diagVal.end(); ++i )
418 const double* m,
unsigned int numCompts,
419 const double* ans,
const double* rhs )
421 vector< double > check( numCompts, 0.0 );
422 for (
unsigned int i = 0; i < numCompts; ++i ) {
423 for (
unsigned int j = 0; j < numCompts; ++j )
424 check[i] += m[i*numCompts + j] * ans[j];
427 for (
unsigned int i = 0; i < numCompts; ++i )
428 ret += (check[i] - rhs[i]) * (check[i] - rhs[i] );
519 static double test[] = {
520 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
521 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
522 0, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0,
523 0, 0, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0,
524 0, 0, 0, 12, 13, 14, 0, 0, 0, 0, 0, 0,
525 0, 0, 0, 0, 15, 16, 17, 0, 0, 0, 0, 0,
526 0, 0, 0, 0, 0, 18, 19, 20, 0, 0, 0, 0,
527 0, 0, 0, 0, 0, 0, 21, 22, 23, 0, 0, 0,
528 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 0, 0,
529 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 0,
530 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32,
531 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 34,
533 const unsigned int numCompts = 12;
534 static unsigned int parents[] = { 1,2,3,4,5,6,7,8,9,10,11,-1};
570 vector< Triplet< double > > fops;
571 vector< Unroll > bops;
574 cout << endl << endl;
575 vector< unsigned int > parentVoxel;
576 parentVoxel.insert( parentVoxel.begin(), &parents[0], &parents[numCompts] );
589 cout << endl << endl;
592 vector< unsigned int > diag;
593 vector< double > diagVal;
597 vector< double > y( numCompts, 1.0 );
598 vector< double > ones( numCompts, 1.0 );
600 for (
int i = 0; i < numCompts; ++i )
601 cout <<
"y" << i <<
"]= " << y[i] << endl;
605 vector< double > alle;
606 for(
unsigned int i = 0; i < numCompts; ++i ) {
607 for(
unsigned int j = 0; j < numCompts; ++j ) {
608 alle.push_back( foo.
get( i, j ) );
611 cout <<
"myCode: " <<
612 checkAns( &alle[0], numCompts, &y[0], &ones[0] ) << endl;
618 vector< double > temp( &test[0], &test[numCompts*numCompts] );
619 gsl_matrix_view m = gsl_matrix_view_array( &temp[0], numCompts, numCompts );
621 vector< double > z( numCompts, 1.0 );
622 gsl_vector_view b = gsl_vector_view_array( &z[0], numCompts );
623 gsl_vector* x = gsl_vector_alloc( numCompts );
625 gsl_permutation* p = gsl_permutation_alloc( numCompts );
626 gsl_linalg_LU_decomp( &m.matrix, p, &s );
627 gsl_linalg_LU_solve( &m.matrix, p, &b.vector, x);
628 vector< double > gslAns( numCompts );
629 for (
int i = 0; i < numCompts; ++i ) {
630 gslAns[i] = gsl_vector_get( x, i );
631 cout <<
"x[" << i <<
"]= " << gslAns[i] << endl;
635 cout <<
"GSL: " <<
checkAns( test, numCompts, &gslAns[0], &ones[0] ) << endl;
636 gsl_vector_free( x );
643 static unsigned int k[] = {20,40,60,80,100,10,30,50,70,90};
644 static double d[] = {1,2,3,4,5,6,7,8,9,10};
645 vector< unsigned int > col;
646 col.insert( col.begin(), k, k+10);
647 vector< double > entry;
648 entry.insert( entry.begin(), d, d+10);
650 cout <<
"testing sorting\n";
651 for (
int i = 0; i < col.size(); ++i ) {
652 cout <<
"d[" << i <<
"]= " << k[i] <<
653 ", col[" << i <<
"]= " << col[i] <<
", e=" << entry[i] << endl;
const double * allEntries() const
T get(unsigned int row, unsigned int column) const
bool hinesReorder(const vector< unsigned int > &parentVoxel)
unsigned int getRow(unsigned int row, const T **entry, const unsigned int **colIndex) const
void buildBackwardSub(vector< unsigned int > &diag, vector< Triplet< double > > &bops, vector< double > &diagVal)
void shuffleRows(const vector< unsigned int > &lookupOldRowFromNew)
void advance(vector< double > &y, const vector< Triplet< double > > &ops, const vector< double > &diagVal)
Unroll(double diag, double off, unsigned int i, unsigned int j)
const unsigned int SM_MAX_COLUMNS
void makeTestMatrix(const double *test, unsigned int numCompts)
void sortByColumn(vector< unsigned int > &col, vector< double > &entry)
double checkAns(const double *m, unsigned int numCompts, const double *ans, const double *rhs)
void buildForwardElim(vector< unsigned int > &diag, vector< Triplet< double > > &fops)
const unsigned int SM_RESERVE
const unsigned int SM_MAX_ROWS