diff --git a/fastlib/u/nvasil/sparse/bfile.txt b/fastlib/u/nvasil/sparse/bfile.txt new file mode 100644 index 0000000000..cf1043061f --- /dev/null +++ b/fastlib/u/nvasil/sparse/bfile.txt @@ -0,0 +1,101 @@ +100 +7.346300e-001 +7.374979e-001 +6.936535e-001 +6.702775e-001 +3.585772e-001 +3.788121e-002 +6.882729e-001 +5.103941e-001 +9.355582e-002 +6.561860e-001 +2.742218e-001 +8.160376e-001 +4.988111e-001 +4.135763e-001 +7.811456e-002 +1.533728e-001 +7.781087e-001 +7.116524e-002 +6.191919e-001 +7.837094e-001 +3.357823e-001 +4.321649e-001 +9.888512e-001 +6.287611e-001 +5.200221e-001 +8.553515e-001 +2.970969e-001 +6.629188e-001 +2.882765e-001 +4.245862e-001 +2.932094e-001 +8.619233e-002 +3.591635e-001 +5.709677e-001 +1.852744e-001 +7.045443e-001 +1.094038e-001 +3.699633e-001 +9.528905e-001 +4.761181e-001 +7.107067e-001 +4.244987e-001 +9.773447e-002 +1.779219e-001 +1.568666e-001 +9.488745e-001 +5.287958e-001 +1.639944e-001 +6.588165e-001 +7.308261e-001 +1.184186e-001 +9.766621e-001 +8.974463e-001 +5.587714e-002 +2.780151e-001 +8.585589e-001 +5.404314e-001 +3.657045e-001 +7.672973e-001 +9.261288e-001 +9.578967e-001 +3.975565e-001 +7.885566e-001 +2.553015e-001 +3.865935e-001 +3.717164e-001 +8.374367e-002 +4.662825e-002 +2.722296e-001 +4.231244e-001 +2.592126e-001 +9.676257e-001 +2.489725e-001 +6.949686e-001 +4.222361e-001 +8.012153e-001 +9.405026e-001 +1.749261e-001 +8.117695e-001 +1.439838e-001 +2.903612e-001 +6.262911e-001 +3.743479e-001 +9.042863e-001 +5.591988e-001 +4.358584e-001 +8.493601e-001 +9.298170e-001 +8.974617e-001 +7.291850e-001 +5.741265e-002 +8.949562e-001 +5.714349e-002 +7.734559e-001 +4.302593e-001 +3.125377e-001 +4.284127e-001 +7.553944e-001 +9.414088e-001 +8.817028e-001 diff --git a/fastlib/u/nvasil/sparse/build.py b/fastlib/u/nvasil/sparse/build.py new file mode 100644 index 0000000000..d108d541ad --- /dev/null +++ b/fastlib/u/nvasil/sparse/build.py @@ -0,0 +1,14 @@ +librule( + name="sparse", + headers=["sparse_matrix.h", "conjugate_gradient.cc" ], + deplibs=["fastlib:fastlib"] + ); + +binrule( + name="sparse_test", + sources=["sparse_matrix_unit.cc"], + headers=["sparse_matrix.h"], + deplibs=["fastlib:fastlib"] + ); + + diff --git a/fastlib/u/nvasil/sparse/conjugate_gradient.cc b/fastlib/u/nvasil/sparse/conjugate_gradient.cc new file mode 100644 index 0000000000..c292d1c234 --- /dev/null +++ b/fastlib/u/nvasil/sparse/conjugate_gradient.cc @@ -0,0 +1,51 @@ +/* + * ===================================================================================== + * + * Filename: conjugate_gradient.cc + * + * Description: + * + * Version: 1.0 + * Created: 06/21/2007 01:13:30 PM EDT + * Revision: none + * Compiler: gcc + * + * Author: Nikolaos Vasiloglou (NV), nvasil@ieee.org + * Company: Georgia Tech Fastlab-ESP Lab + * + * ===================================================================================== + */ + + +namespace sparse { +// solves the problem A*x=b +// where A is sparse semipositive definite +template +void ConjugateGradient(Matrix &A, T *b, T* x, T tolerance) { + index_t dimension=A.get_dimension(); + T* r = NewVector(dimension); + T* p = NewVector(dimension); + A.Multiply(x,r); // r=A*x + VectorMinus(b, r) // r=b-r; + memcpy(p, r, dimension*sizeof(T)); + T *temp1=NewVector(dimension); + while() { + A.Multiply(p, temp1); // temp1=A*p; + T rr=VectorDotProduct(r, r, dimension); + T alpha=rr/VectorDotProduct(temp1, p, dimension); // a=(r,r)/(A*p,p) + VectorPlusTimes(x, alpha, p, dimension, x); // x=x+a*p + T error=alpha*VectorDotProduct(p, p)/VectorDotProduct(x, x); + if (error +#include +#include +#include +#include "fastlib/fastlib.h" + +using namespace std; + +namespace sparse { +template +class Matrix { + public: + typedef pair NonZeroElement_t; + template friend class Matrix; + Matrix(){ + allocation_flag_=false; + } + ~Matrix(){}; + void Init(index_t dimension, + int32 max_non_zero) { + dimension_=dimension; + max_non_zero_=max_non_zero; + index_t alloc_size = dimension_ * + max_non_zero_ * sizeof(NonZeroElement_t); + ptr_rows_ = (NonZeroElement_t *)mmap(NULL, alloc_size, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (ptr_rows_==MAP_FAILED) { + FATAL("Couldn't allocate memory for the ptr_rows_, error: %s\n", + strerror(errno)); + } + allocation_flag_=true; + row_elements_=(int32 *)mmap(NULL, dimension_*sizeof(int32) , + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + + Fill(); + } + void Init(NonZeroElement_t *ptr_rows, + index_t dimension, + int32 max_non_zero) { + ptr_rows_=ptr_rows; + dimension_=dimension; + max_non_zero_=max_non_zero; + row_elements_=(int32 *)mmap(NULL, dimension_*sizeof(int32) , + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + + Fill(); + } + void Init(string file) { + FILE *fp=fopen(file.c_str(), "r"); + if (fp==NULL) { + FATAL("Error %s while trying to open %s\n", + strerror(errno), file.c_str()); + } + fscanf(fp, "%i %i\n", dimension_, max_non_zero_); + index_t alloc_size = dimension_ * + max_non_zero_ * sizeof(NonZeroElement_t); + ptr_rows_ = (NonZeroElement_t *)mmap(NULL, alloc_size, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (ptr_rows_==MAP_FAILED) { + FATAL("Couldn't allocate memory for the ptr_rows_, error: %s\n", + strerror(errno)); + } + allocation_flag_=true; + row_elements_=(int32 *)mmap(NULL, dimension_*sizeof(int32) , + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + + Fill(); + long long i,j; + double val; + while (feof(fp)==false) { + fscanf(fp,"%lli %lli %lg\n", &i, &j, &val); + this->set(i, j, val); + } + fclose(fp); + } + void Destruct() { + if (allocation_flag_==true) { + index_t alloc_size = dimension_ * + max_non_zero_ * sizeof(NonZeroElement_t); + munmap(ptr_rows_, alloc_size); + } + munmap(row_elements_, dimension_*sizeof(int32)); + } + + inline T get(index_t i, index_t j) { + index_t row = i*max_non_zero_; + DEBUG_ASSERT_MSG(i=0, + "Tried to access row %lli > %lli\n", + (signed long long)i, + (signed long long)dimension_); + for(int32 k=0; k=0, + "Tried to access row %lli > %lli\n", + (signed long long)i, + (signed long long)dimension_); + DEBUG_ASSERT_MSG(row_elements_[i] value) { + high=mid-1; + } else { + if (ptr_rows_[mid].first < value) { + low=mid+1; + } else { + return mid; + } + } + } + return -1; + } +}; + +// solves the problem A*x=b +// where A is sparse semipositive definite +template +void ConjugateGradient(Matrix &A, T *b, T* x); +template +inline T VectorDotProduct(T* a, T* b, index_t size) { + T result=0; + for(index_t i=0; i +inline void VectorPlus(T* a, T* b, index_t size, T* c) { + for(index_t i=0; i +inline void VectorPlusTimes(T* a, T scalar, T* b, index_t size, T* c) { + for(index_t i=0; i +inline void VectorMinusTimes(T* a, T scalar, T* b, index_t size, T* c) { + for(index_t i=0; i +inline void VectorMinus(T* a, T* b, index_t size, T* c) { + for(index_t i=0; i +inline void VectorMultiplyScalar(T* vector_in, T scalar, index_t size, + T* vector_out) { + for(index_t i=0; i +inline T *NewVector(index_t size) { + T* out = (T*)mmap(NULL, size*sizeof(T), + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (madvise(out, size*sizeof(T), + MADV_SEQUENTIAL)==-1) { + NONFATAL("Advising failed error %s\n", strerror(errno)); + } + return out; +} + +template +inline void DeleteVector(T* vector, index_t size) { + if (munmap(vector, size*sizeof(T))<0) { + NONFATAL("Failed to unmap memory, error:%s\n", strerror(errno)); + } +} + +template +T *ReadVectorFromFile(string filename) { + FILE *fp; + fp=fopen(filename.c_str(), "r"); + if (fp==NULL) { + FATAL("Error %s while trying to open %s\n", strerror(errno)); + } + long long size; + fscanf(fp, "%lli\n", &size); + T *ptr = NewVector(size); + index_t i=0; + while (!feof(fp)) { + double value; + fscanf(fp, "%lg", &value); + ptr[i]=(T)value; + i++; + } + fclose(fp); + return ptr; +} + + +}; +#endif // SPARSE_MATRIX_H_ diff --git a/fastlib/u/nvasil/sparse/sparse_matrix.txt b/fastlib/u/nvasil/sparse/sparse_matrix.txt new file mode 100644 index 0000000000..ded01f9b16 --- /dev/null +++ b/fastlib/u/nvasil/sparse/sparse_matrix.txt @@ -0,0 +1,1817 @@ +100 24 +1 3 0.664438 +1 13 0.590944 +1 17 0.655779 +1 20 0.872673 +1 25 0.829382 +1 29 0.953315 +1 30 0.589027 +1 40 0.052128 +1 42 0.523904 +1 45 0.474484 +1 46 0.361999 +1 47 0.553318 +1 59 0.624345 +1 61 0.346019 +1 62 0.305001 +1 66 0.717042 +1 71 0.440940 +1 72 0.554369 +1 73 0.114245 +1 74 0.635088 +1 75 0.350227 +1 84 0.036090 +1 94 0.611102 +1 96 0.211177 +2 12 0.174376 +2 17 0.867039 +2 22 0.702509 +2 23 0.390910 +2 26 0.729493 +2 29 0.941871 +2 34 0.659477 +2 57 0.349864 +2 60 0.246087 +2 65 0.815712 +2 69 0.286254 +2 72 0.823947 +2 75 0.467771 +2 76 0.794068 +2 83 0.533563 +2 87 0.919668 +2 93 0.339884 +2 94 0.341080 +2 95 0.114607 +3 1 0.664438 +3 10 0.343782 +3 18 0.934498 +3 27 0.222679 +3 32 0.284368 +3 35 0.026782 +3 37 0.003311 +3 44 0.170563 +3 50 0.357325 +3 51 0.233821 +3 53 0.747417 +3 59 0.112209 +3 62 0.983658 +3 69 0.558810 +3 71 0.018939 +3 73 0.711835 +3 89 0.311452 +3 98 0.293800 +4 14 0.245817 +4 17 0.114127 +4 18 0.633350 +4 20 0.160348 +4 24 0.148674 +4 32 0.086972 +4 40 0.597722 +4 41 0.850378 +4 48 0.695491 +4 57 0.678524 +4 58 0.238030 +4 66 0.459597 +4 72 0.669795 +4 76 0.620609 +4 81 0.926429 +4 85 0.747551 +4 86 0.379019 +4 97 0.084731 +5 5 0.225498 +5 6 0.668385 +5 11 0.930229 +5 36 0.708254 +5 40 0.074963 +5 48 0.106449 +5 56 0.756580 +5 58 0.892897 +5 74 0.565059 +5 78 0.070731 +5 82 0.282778 +5 83 0.278053 +5 88 0.848864 +5 92 0.603004 +5 96 0.119078 +5 97 0.307809 +6 5 0.668385 +6 6 0.082626 +6 14 0.936925 +6 20 0.178930 +6 21 0.481884 +6 23 0.109755 +6 32 0.889932 +6 33 0.052533 +6 49 0.700377 +6 65 0.396801 +6 67 0.920000 +6 80 0.441708 +6 81 0.477341 +6 83 0.075458 +6 86 0.330944 +7 9 0.299776 +7 12 0.606934 +7 15 0.329297 +7 18 0.802907 +7 20 0.495369 +7 22 0.512166 +7 38 0.283605 +7 48 0.494668 +7 52 0.228327 +7 55 0.510215 +7 63 0.477973 +7 68 0.062698 +7 71 0.928300 +7 78 0.676117 +7 79 0.260692 +7 83 0.032723 +7 97 0.445619 +8 9 0.319905 +8 16 0.604801 +8 34 0.956409 +8 35 0.629297 +8 37 0.207158 +8 41 0.005092 +8 42 0.349534 +8 57 0.070415 +8 73 0.734359 +8 75 0.400418 +8 85 0.083860 +8 89 0.696952 +8 90 0.125924 +8 94 0.340554 +8 99 0.138795 +9 7 0.299776 +9 8 0.319905 +9 11 0.216838 +9 13 0.223613 +9 17 0.394250 +9 19 0.697086 +9 20 0.755444 +9 21 0.540685 +9 29 0.990003 +9 33 0.974801 +9 38 0.738081 +9 42 0.744995 +9 43 0.019287 +9 60 0.205044 +9 62 0.804038 +9 68 0.249907 +9 79 0.195531 +9 85 0.490606 +9 86 0.925450 +9 92 0.618881 +10 3 0.343782 +10 12 0.614176 +10 13 0.240891 +10 14 0.430391 +10 15 0.379452 +10 24 0.535836 +10 38 0.036266 +10 66 0.560747 +10 68 0.399837 +10 75 0.199877 +10 79 0.371381 +10 82 0.560092 +10 83 0.360962 +10 86 0.285196 +11 5 0.930229 +11 9 0.216838 +11 15 0.367959 +11 29 0.345722 +11 34 0.338846 +11 43 0.042373 +11 52 0.137471 +11 58 0.568397 +11 62 0.800476 +11 66 0.176776 +11 69 0.925779 +11 77 0.000644 +11 79 0.224424 +11 81 0.456407 +11 93 0.179126 +11 94 0.830741 +11 99 0.948651 +12 2 0.174376 +12 7 0.606934 +12 10 0.614176 +12 12 0.649003 +12 15 0.522343 +12 18 0.280743 +12 26 0.071125 +12 28 0.014620 +12 29 0.038556 +12 32 0.559339 +12 37 0.247690 +12 42 0.725135 +12 46 0.198627 +12 50 0.527214 +12 54 0.543709 +12 56 0.051038 +12 64 0.688828 +12 92 0.719004 +12 94 0.986764 +12 98 0.927750 +12 100 0.622678 +13 1 0.590944 +13 9 0.223613 +13 10 0.240891 +13 23 0.129044 +13 28 0.892984 +13 34 0.820116 +13 37 0.270911 +13 39 0.542790 +13 43 0.992338 +13 47 0.600904 +13 62 0.084987 +13 70 0.169538 +13 71 0.724537 +13 73 0.828427 +13 76 0.660932 +13 81 0.868783 +13 92 0.825368 +13 100 0.278728 +14 4 0.245817 +14 6 0.936925 +14 10 0.430391 +14 17 0.630801 +14 36 0.586384 +14 44 0.285228 +14 45 0.370269 +14 47 0.482178 +14 53 0.125883 +14 54 0.077971 +14 58 0.980443 +14 73 0.750868 +14 76 0.670652 +14 78 0.251207 +14 82 0.508118 +14 84 0.145728 +15 7 0.329297 +15 10 0.379452 +15 11 0.367959 +15 12 0.522343 +15 17 0.212749 +15 21 0.534080 +15 26 0.811702 +15 28 0.719714 +15 31 0.203403 +15 33 0.218188 +15 35 0.825955 +15 41 0.492320 +15 44 0.035574 +15 51 0.420441 +15 55 0.260064 +15 57 0.572947 +15 61 0.973631 +15 65 0.111879 +15 71 0.136369 +15 73 0.447334 +15 85 0.364039 +15 98 0.889661 +16 8 0.604801 +16 18 0.276615 +16 20 0.301267 +16 23 0.995176 +16 25 0.890575 +16 28 0.664633 +16 44 0.936235 +16 47 0.072927 +16 56 0.793983 +16 64 0.157925 +16 69 0.051881 +16 72 0.491640 +16 75 0.329637 +16 91 0.141615 +16 99 0.030513 +17 1 0.655779 +17 2 0.867039 +17 4 0.114127 +17 9 0.394250 +17 14 0.630801 +17 15 0.212749 +17 19 0.289222 +17 33 0.857122 +17 42 0.335271 +17 45 0.411197 +17 56 0.686575 +17 57 0.293440 +17 64 0.697633 +17 67 0.673300 +17 74 0.740938 +17 76 0.439325 +17 85 0.972615 +17 87 0.244650 +17 88 0.468292 +17 93 0.218016 +17 96 0.914443 +18 3 0.934498 +18 4 0.633350 +18 7 0.802907 +18 12 0.280743 +18 16 0.276615 +18 27 0.086834 +18 60 0.453722 +18 63 0.449810 +18 72 0.193426 +18 74 0.028878 +18 76 0.290700 +18 77 0.021200 +18 85 0.770575 +18 89 0.857227 +18 90 0.105964 +18 94 0.590374 +18 97 0.365690 +18 100 0.170688 +19 9 0.697086 +19 17 0.289222 +19 27 0.810350 +19 31 0.671461 +19 38 0.439020 +19 42 0.683096 +19 43 0.587806 +19 44 0.636153 +19 51 0.019673 +19 62 0.245992 +19 66 0.976174 +19 83 0.242779 +19 87 0.472157 +19 95 0.755058 +19 98 0.968025 +20 1 0.872673 +20 4 0.160348 +20 6 0.178930 +20 7 0.495369 +20 9 0.755444 +20 16 0.301267 +20 21 0.765301 +20 30 0.557420 +20 35 0.770363 +20 40 0.759163 +20 44 0.201319 +20 45 0.724061 +20 61 0.770137 +20 65 0.957619 +20 74 0.538247 +20 80 0.575331 +20 94 0.430250 +20 97 0.684785 +20 99 0.607865 +20 100 0.247700 +21 6 0.481884 +21 9 0.540685 +21 15 0.534080 +21 20 0.765301 +21 33 0.937254 +21 35 0.318293 +21 42 0.004324 +21 46 0.237406 +21 49 0.316519 +21 53 0.112928 +21 61 0.745642 +21 62 0.093803 +21 64 0.269848 +21 74 0.422798 +21 75 0.890434 +21 78 0.483858 +21 89 0.576156 +21 90 0.960478 +22 2 0.702509 +22 7 0.512166 +22 23 0.554187 +22 25 0.531424 +22 26 0.859402 +22 36 0.448580 +22 45 0.620709 +22 50 0.000949 +22 55 0.085044 +22 59 0.299047 +22 63 0.521751 +22 66 0.320501 +22 76 0.098691 +22 77 0.956914 +22 79 0.566016 +22 80 0.243567 +22 82 0.061235 +22 87 0.691646 +22 88 0.612468 +22 91 0.692237 +22 93 0.864572 +22 97 0.988494 +23 2 0.390910 +23 6 0.109755 +23 13 0.129044 +23 16 0.995176 +23 22 0.554187 +23 26 0.816984 +23 36 0.173180 +23 39 0.511330 +23 44 0.406096 +23 50 0.211547 +23 51 0.716796 +23 66 0.674824 +23 72 0.527565 +23 74 0.848775 +23 78 0.932540 +23 79 0.420100 +23 83 0.043010 +23 84 0.127706 +23 85 0.354679 +23 96 0.021266 +23 97 0.654256 +24 4 0.148674 +24 10 0.535836 +24 24 0.432541 +24 31 0.067692 +24 34 0.560635 +24 35 0.044833 +24 36 0.669308 +24 43 0.721960 +24 47 0.005393 +24 48 0.128665 +24 52 0.211718 +24 63 0.777322 +24 77 0.010630 +24 79 0.904767 +24 84 0.760377 +24 98 0.110040 +24 99 0.926088 +25 1 0.829382 +25 16 0.890575 +25 22 0.531424 +25 25 0.716011 +25 38 0.222374 +25 39 0.206135 +25 44 0.479321 +25 45 0.222257 +25 46 0.268551 +25 47 0.909713 +25 53 0.126062 +25 58 0.552359 +25 61 0.977490 +25 65 0.619622 +25 72 0.527581 +25 73 0.498168 +25 74 0.220450 +25 87 0.793727 +25 89 0.323267 +25 91 0.730310 +25 92 0.717669 +25 96 0.996770 +26 2 0.729493 +26 12 0.071125 +26 15 0.811702 +26 22 0.859402 +26 23 0.816984 +26 26 0.283545 +26 36 0.138264 +26 39 0.255281 +26 58 0.094110 +26 60 0.156360 +26 82 0.500824 +26 83 0.617564 +26 90 0.134645 +26 96 0.797388 +26 97 0.426195 +27 3 0.222679 +27 18 0.086834 +27 19 0.810350 +27 33 0.174602 +27 36 0.490722 +27 38 0.619211 +27 40 0.953853 +27 45 0.608577 +27 62 0.121921 +27 67 0.776455 +27 69 0.555578 +27 72 0.121243 +27 74 0.202506 +27 82 0.261521 +27 84 0.037912 +27 87 0.962653 +27 100 0.705583 +28 12 0.014620 +28 13 0.892984 +28 15 0.719714 +28 16 0.664633 +28 30 0.786056 +28 33 0.157861 +28 41 0.668104 +28 44 0.949491 +28 46 0.737345 +28 58 0.532905 +28 59 0.489624 +28 62 0.718625 +28 64 0.005842 +28 67 0.414223 +28 71 0.352367 +28 76 0.150530 +28 77 0.681471 +28 82 0.614895 +28 85 0.059568 +28 87 0.395248 +29 1 0.953315 +29 2 0.941871 +29 9 0.990003 +29 11 0.345722 +29 12 0.038556 +29 30 0.780176 +29 32 0.776778 +29 34 0.346570 +29 36 0.441193 +29 38 0.884161 +29 53 0.708928 +29 56 0.129824 +29 67 0.794367 +29 68 0.855828 +29 71 0.012889 +29 73 0.021059 +29 74 0.603461 +29 77 0.915290 +29 79 0.022621 +29 82 0.963171 +29 84 0.274188 +29 88 0.994168 +30 1 0.589027 +30 20 0.557420 +30 28 0.786056 +30 29 0.780176 +30 45 0.347357 +30 47 0.347471 +30 55 0.401439 +30 56 0.769629 +30 62 0.667621 +30 69 0.928345 +30 77 0.103823 +30 80 0.330582 +30 82 0.356281 +30 84 0.500173 +30 89 0.297472 +31 15 0.203403 +31 19 0.671461 +31 24 0.067692 +31 36 0.831169 +31 40 0.587059 +31 42 0.335454 +31 54 0.531407 +31 64 0.299672 +31 67 0.107094 +31 69 0.864315 +31 71 0.260996 +31 77 0.466961 +31 79 0.909364 +31 82 0.139618 +31 85 0.460483 +31 93 0.358537 +32 3 0.284368 +32 4 0.086972 +32 6 0.889932 +32 12 0.559339 +32 29 0.776778 +32 32 0.402046 +32 50 0.484283 +32 53 0.106586 +32 61 0.132461 +32 75 0.703840 +32 85 0.420779 +32 91 0.269619 +32 97 0.928862 +33 6 0.052533 +33 9 0.974801 +33 15 0.218188 +33 17 0.857122 +33 21 0.937254 +33 27 0.174602 +33 28 0.157861 +33 33 0.651799 +33 35 0.426622 +33 40 0.197914 +33 41 0.328046 +33 43 0.280108 +33 48 0.596233 +33 51 0.332350 +33 60 0.276536 +33 61 0.541824 +33 62 0.938475 +33 64 0.876560 +33 66 0.130873 +33 68 0.305078 +33 89 0.884182 +33 91 0.031283 +33 95 0.718905 +34 2 0.659477 +34 8 0.956409 +34 11 0.338846 +34 13 0.820116 +34 24 0.560635 +34 29 0.346570 +34 45 0.685556 +34 50 0.716065 +34 54 0.824830 +34 57 0.464443 +34 60 0.933278 +34 62 0.761157 +34 70 0.364262 +34 72 0.579162 +34 74 0.238795 +34 85 0.649527 +34 87 0.881172 +35 3 0.026782 +35 8 0.629297 +35 15 0.825955 +35 20 0.770363 +35 21 0.318293 +35 24 0.044833 +35 33 0.426622 +35 41 0.622391 +35 45 0.008821 +35 55 0.041312 +35 56 0.458734 +35 58 0.199507 +35 83 0.148508 +35 84 0.939878 +35 87 0.813014 +35 91 0.813507 +35 96 0.687966 +36 5 0.708254 +36 14 0.586384 +36 22 0.448580 +36 23 0.173180 +36 24 0.669308 +36 26 0.138264 +36 27 0.490722 +36 29 0.441193 +36 31 0.831169 +36 39 0.453022 +36 42 0.827346 +36 51 0.837777 +36 54 0.542553 +36 56 0.440695 +36 59 0.432984 +36 72 0.083063 +36 74 0.559224 +36 75 0.466673 +36 79 0.684344 +36 86 0.901141 +36 88 0.097082 +36 90 0.644301 +36 95 0.168674 +36 96 0.850249 +37 3 0.003311 +37 8 0.207158 +37 12 0.247690 +37 13 0.270911 +37 43 0.478694 +37 46 0.780412 +37 49 0.649567 +37 50 0.767947 +37 54 0.873015 +37 55 0.470189 +37 61 0.854515 +37 63 0.974513 +37 65 0.564544 +37 67 0.674596 +37 71 0.420279 +37 78 0.913108 +37 81 0.597387 +37 86 0.961475 +37 89 0.181223 +37 91 0.480789 +37 95 0.242429 +38 7 0.283605 +38 9 0.738081 +38 10 0.036266 +38 19 0.439020 +38 25 0.222374 +38 27 0.619211 +38 29 0.884161 +38 39 0.073983 +38 48 0.227446 +38 55 0.594186 +38 67 0.809357 +38 75 0.343709 +38 78 0.175494 +38 83 0.765294 +38 88 0.869149 +39 13 0.542790 +39 23 0.511330 +39 25 0.206135 +39 26 0.255281 +39 36 0.453022 +39 38 0.073983 +39 41 0.213369 +39 45 0.926990 +39 59 0.840384 +39 68 0.772718 +39 75 0.303183 +39 77 0.120610 +39 83 0.691129 +39 91 0.200289 +39 95 0.679574 +39 98 0.958648 +40 1 0.052128 +40 4 0.597722 +40 5 0.074963 +40 20 0.759163 +40 27 0.953853 +40 31 0.587059 +40 33 0.197914 +40 40 0.235933 +40 47 0.444172 +40 48 0.027457 +40 51 0.143100 +40 53 0.753115 +40 54 0.624625 +40 58 0.972576 +40 59 0.822082 +40 62 0.475584 +40 63 0.331695 +40 76 0.983385 +40 78 0.296552 +40 90 0.301243 +40 93 0.336856 +41 4 0.850378 +41 8 0.005092 +41 15 0.492320 +41 28 0.668104 +41 33 0.328046 +41 35 0.622391 +41 39 0.213369 +41 46 0.467770 +41 52 0.269085 +41 54 0.965816 +41 63 0.280770 +41 72 0.218553 +41 75 0.291176 +41 76 0.632939 +41 80 0.675957 +41 81 0.483297 +41 88 0.600048 +41 89 0.979895 +41 94 0.099148 +42 1 0.523904 +42 8 0.349534 +42 9 0.744995 +42 12 0.725135 +42 17 0.335271 +42 19 0.683096 +42 21 0.004324 +42 31 0.335454 +42 36 0.827346 +42 47 0.805175 +42 49 0.619757 +42 68 0.337842 +42 83 0.102097 +42 88 0.910688 +43 9 0.019287 +43 11 0.042373 +43 13 0.992338 +43 19 0.587806 +43 24 0.721960 +43 33 0.280108 +43 37 0.478694 +43 45 0.156692 +43 48 0.307270 +43 51 0.263720 +43 53 0.445846 +43 54 0.423978 +43 56 0.675847 +43 65 0.596062 +43 77 0.807870 +43 85 0.293946 +43 87 0.294910 +43 88 0.382230 +43 92 0.386859 +44 3 0.170563 +44 14 0.285228 +44 15 0.035574 +44 16 0.936235 +44 19 0.636153 +44 20 0.201319 +44 23 0.406096 +44 25 0.479321 +44 28 0.949491 +44 47 0.886316 +44 54 0.062116 +44 59 0.821878 +44 62 0.044563 +44 75 0.972487 +44 80 0.255826 +44 90 0.279579 +44 92 0.490651 +44 95 0.425354 +44 96 0.447783 +45 1 0.474484 +45 14 0.370269 +45 17 0.411197 +45 20 0.724061 +45 22 0.620709 +45 25 0.222257 +45 27 0.608577 +45 30 0.347357 +45 34 0.685556 +45 35 0.008821 +45 39 0.926990 +45 43 0.156692 +45 48 0.715999 +45 49 0.669076 +45 58 0.221851 +45 64 0.465251 +45 69 0.538702 +45 70 0.833499 +45 73 0.403288 +45 79 0.034570 +45 92 0.590664 +45 95 0.610002 +46 1 0.361999 +46 12 0.198627 +46 21 0.237406 +46 25 0.268551 +46 28 0.737345 +46 37 0.780412 +46 41 0.467770 +46 48 0.888622 +46 52 0.059702 +46 62 0.113769 +46 65 0.882124 +46 67 0.096840 +46 82 0.075501 +47 1 0.553318 +47 13 0.600904 +47 14 0.482178 +47 16 0.072927 +47 24 0.005393 +47 25 0.909713 +47 30 0.347471 +47 40 0.444172 +47 42 0.805175 +47 44 0.886316 +47 54 0.703587 +47 57 0.863574 +47 68 0.373601 +47 69 0.404892 +47 70 0.873869 +47 72 0.906020 +47 80 0.809600 +47 89 0.754108 +47 96 0.892832 +48 4 0.695491 +48 5 0.106449 +48 7 0.494668 +48 24 0.128665 +48 33 0.596233 +48 38 0.227446 +48 40 0.027457 +48 43 0.307270 +48 45 0.715999 +48 46 0.888622 +48 48 0.636658 +48 51 0.841478 +48 55 0.306830 +48 66 0.186719 +48 69 0.041444 +48 71 0.804627 +48 90 0.844725 +49 6 0.700377 +49 21 0.316519 +49 37 0.649567 +49 42 0.619757 +49 45 0.669076 +49 49 0.355320 +49 51 0.581760 +49 56 0.075640 +49 60 0.944225 +49 64 0.155256 +49 70 0.224773 +49 76 0.348866 +49 80 0.488341 +49 83 0.738413 +49 97 0.443440 +50 3 0.357325 +50 12 0.527214 +50 22 0.000949 +50 23 0.211547 +50 32 0.484283 +50 34 0.716065 +50 37 0.767947 +50 51 0.601858 +50 59 0.820219 +50 62 0.577246 +50 65 0.642511 +50 67 0.791001 +50 68 0.120465 +50 76 0.974384 +50 80 0.977593 +50 89 0.507490 +50 91 0.902184 +50 100 0.653265 +51 3 0.233821 +51 15 0.420441 +51 19 0.019673 +51 23 0.716796 +51 33 0.332350 +51 36 0.837777 +51 40 0.143100 +51 43 0.263720 +51 48 0.841478 +51 49 0.581760 +51 50 0.601858 +51 65 0.132407 +51 68 0.856492 +51 70 0.941419 +51 74 0.046680 +51 78 0.404195 +51 87 0.379431 +51 96 0.202110 +52 7 0.228327 +52 11 0.137471 +52 24 0.211718 +52 41 0.269085 +52 46 0.059702 +52 66 0.033588 +52 69 0.365902 +52 72 0.928797 +52 74 0.312765 +52 77 0.447350 +52 78 0.178742 +52 83 0.182486 +52 85 0.572995 +52 86 0.117492 +52 89 0.431520 +52 98 0.531898 +53 3 0.747417 +53 14 0.125883 +53 21 0.112928 +53 25 0.126062 +53 29 0.708928 +53 32 0.106586 +53 40 0.753115 +53 43 0.445846 +53 53 0.965112 +53 54 0.946409 +53 55 0.940538 +53 77 0.864878 +53 85 0.667421 +53 91 0.857757 +53 93 0.388002 +53 95 0.505393 +53 100 0.457349 +54 12 0.543709 +54 14 0.077971 +54 31 0.531407 +54 34 0.824830 +54 36 0.542553 +54 37 0.873015 +54 40 0.624625 +54 41 0.965816 +54 43 0.423978 +54 44 0.062116 +54 47 0.703587 +54 53 0.946409 +54 57 0.180773 +54 69 0.595581 +54 74 0.560857 +54 82 0.074085 +54 85 0.062118 +54 87 0.240123 +54 91 0.809369 +54 93 0.003933 +55 7 0.510215 +55 15 0.260064 +55 22 0.085044 +55 30 0.401439 +55 35 0.041312 +55 37 0.470189 +55 38 0.594186 +55 48 0.306830 +55 53 0.940538 +55 69 0.472790 +55 82 0.359314 +55 83 0.530443 +55 95 0.603980 +55 100 0.391936 +56 5 0.756580 +56 12 0.051038 +56 16 0.793983 +56 17 0.686575 +56 29 0.129824 +56 30 0.769629 +56 35 0.458734 +56 36 0.440695 +56 43 0.675847 +56 49 0.075640 +56 57 0.720116 +56 58 0.296123 +56 77 0.271178 +56 79 0.295177 +56 81 0.074342 +56 84 0.417508 +56 85 0.025531 +56 88 0.406989 +56 89 0.733306 +56 91 0.780910 +57 2 0.349864 +57 4 0.678524 +57 8 0.070415 +57 15 0.572947 +57 17 0.293440 +57 34 0.464443 +57 47 0.863574 +57 54 0.180773 +57 56 0.720116 +57 66 0.383306 +57 72 0.535112 +57 78 0.223466 +57 88 0.848978 +57 90 0.971259 +57 93 0.712075 +57 98 0.662108 +58 4 0.238030 +58 5 0.892897 +58 11 0.568397 +58 14 0.980443 +58 25 0.552359 +58 26 0.094110 +58 28 0.532905 +58 35 0.199507 +58 40 0.972576 +58 45 0.221851 +58 56 0.296123 +58 61 0.028099 +58 64 0.749331 +58 77 0.587033 +58 80 0.071850 +58 88 0.267234 +58 91 0.558863 +58 94 0.567583 +58 99 0.878683 +59 1 0.624345 +59 3 0.112209 +59 22 0.299047 +59 28 0.489624 +59 36 0.432984 +59 39 0.840384 +59 40 0.822082 +59 44 0.821878 +59 50 0.820219 +59 61 0.376488 +59 63 0.012446 +59 70 0.196079 +59 75 0.738564 +59 78 0.635988 +59 85 0.980763 +59 87 0.200676 +59 92 0.135139 +59 95 0.146363 +60 2 0.246087 +60 9 0.205044 +60 18 0.453722 +60 26 0.156360 +60 33 0.276536 +60 34 0.933278 +60 49 0.944225 +60 65 0.206418 +60 68 0.827918 +60 73 0.412798 +60 84 0.031829 +60 86 0.173065 +60 90 0.726563 +60 93 0.204852 +61 1 0.346019 +61 15 0.973631 +61 20 0.770137 +61 21 0.745642 +61 25 0.977490 +61 32 0.132461 +61 33 0.541824 +61 37 0.854515 +61 58 0.028099 +61 59 0.376488 +61 61 0.951837 +61 66 0.369839 +61 72 0.252687 +61 74 0.890801 +61 80 0.648705 +61 83 0.917633 +61 93 0.282008 +61 99 0.139073 +61 100 0.102948 +62 1 0.305001 +62 3 0.983658 +62 9 0.804038 +62 11 0.800476 +62 13 0.084987 +62 19 0.245992 +62 21 0.093803 +62 27 0.121921 +62 28 0.718625 +62 30 0.667621 +62 33 0.938475 +62 34 0.761157 +62 40 0.475584 +62 44 0.044563 +62 46 0.113769 +62 50 0.577246 +62 67 0.932109 +62 79 0.442290 +62 81 0.183744 +62 87 0.568466 +62 94 0.721682 +63 7 0.477973 +63 18 0.449810 +63 22 0.521751 +63 24 0.777322 +63 37 0.974513 +63 40 0.331695 +63 41 0.280770 +63 59 0.012446 +63 75 0.635457 +63 78 0.017287 +63 89 0.288342 +63 94 0.734306 +63 95 0.791053 +63 97 0.798962 +64 12 0.688828 +64 16 0.157925 +64 17 0.697633 +64 21 0.269848 +64 28 0.005842 +64 31 0.299672 +64 33 0.876560 +64 45 0.465251 +64 49 0.155256 +64 58 0.749331 +64 64 0.675933 +64 70 0.129393 +64 77 0.308366 +64 95 0.866700 +64 100 0.253223 +65 2 0.815712 +65 6 0.396801 +65 15 0.111879 +65 20 0.957619 +65 25 0.619622 +65 37 0.564544 +65 43 0.596062 +65 46 0.882124 +65 50 0.642511 +65 51 0.132407 +65 60 0.206418 +65 65 0.589987 +65 69 0.912473 +65 71 0.114565 +65 72 0.674731 +65 76 0.263688 +65 79 0.571352 +66 1 0.717042 +66 4 0.459597 +66 10 0.560747 +66 11 0.176776 +66 19 0.976174 +66 22 0.320501 +66 23 0.674824 +66 33 0.130873 +66 48 0.186719 +66 52 0.033588 +66 57 0.383306 +66 61 0.369839 +66 69 0.734643 +66 70 0.222850 +66 72 0.448382 +66 77 0.197057 +66 85 0.858465 +66 92 0.663629 +66 96 0.208363 +66 100 0.567906 +67 6 0.920000 +67 17 0.673300 +67 27 0.776455 +67 28 0.414223 +67 29 0.794367 +67 31 0.107094 +67 37 0.674596 +67 38 0.809357 +67 46 0.096840 +67 50 0.791001 +67 62 0.932109 +67 72 0.708459 +67 86 0.673957 +67 91 0.125958 +67 95 0.070021 +68 7 0.062698 +68 9 0.249907 +68 10 0.399837 +68 29 0.855828 +68 33 0.305078 +68 39 0.772718 +68 42 0.337842 +68 47 0.373601 +68 50 0.120465 +68 51 0.856492 +68 60 0.827918 +68 70 0.024074 +68 72 0.411694 +68 76 0.785311 +68 77 0.708447 +68 78 0.630124 +68 87 0.142150 +68 88 0.397247 +68 89 0.716233 +68 94 0.049331 +68 98 0.621099 +68 99 0.915412 +69 2 0.286254 +69 3 0.558810 +69 11 0.925779 +69 16 0.051881 +69 27 0.555578 +69 30 0.928345 +69 31 0.864315 +69 45 0.538702 +69 47 0.404892 +69 48 0.041444 +69 52 0.365902 +69 54 0.595581 +69 55 0.472790 +69 65 0.912473 +69 66 0.734643 +69 86 0.049945 +69 90 0.398701 +69 99 0.945046 +69 100 0.970520 +70 13 0.169538 +70 34 0.364262 +70 45 0.833499 +70 47 0.873869 +70 49 0.224773 +70 51 0.941419 +70 59 0.196079 +70 64 0.129393 +70 66 0.222850 +70 68 0.024074 +70 72 0.420354 +70 76 0.995051 +70 82 0.321145 +70 83 0.839937 +70 85 0.054069 +71 1 0.440940 +71 3 0.018939 +71 7 0.928300 +71 13 0.724537 +71 15 0.136369 +71 28 0.352367 +71 29 0.012889 +71 31 0.260996 +71 37 0.420279 +71 48 0.804627 +71 65 0.114565 +71 72 0.295243 +71 76 0.012906 +71 86 0.321576 +71 91 0.076331 +71 94 0.083382 +71 97 0.431052 +71 98 0.555299 +72 1 0.554369 +72 2 0.823947 +72 4 0.669795 +72 16 0.491640 +72 18 0.193426 +72 23 0.527565 +72 25 0.527581 +72 27 0.121243 +72 34 0.579162 +72 36 0.083063 +72 41 0.218553 +72 47 0.906020 +72 52 0.928797 +72 57 0.535112 +72 61 0.252687 +72 65 0.674731 +72 66 0.448382 +72 67 0.708459 +72 68 0.411694 +72 70 0.420354 +72 71 0.295243 +72 75 0.281488 +72 88 0.519327 +72 91 0.625307 +73 1 0.114245 +73 3 0.711835 +73 8 0.734359 +73 13 0.828427 +73 14 0.750868 +73 15 0.447334 +73 25 0.498168 +73 29 0.021059 +73 45 0.403288 +73 60 0.412798 +73 77 0.920043 +73 84 0.521579 +73 89 0.875042 +73 94 0.985195 +74 1 0.635088 +74 5 0.565059 +74 17 0.740938 +74 18 0.028878 +74 20 0.538247 +74 21 0.422798 +74 23 0.848775 +74 25 0.220450 +74 27 0.202506 +74 29 0.603461 +74 34 0.238795 +74 36 0.559224 +74 51 0.046680 +74 52 0.312765 +74 54 0.560857 +74 61 0.890801 +74 80 0.478347 +74 81 0.029423 +74 82 0.039276 +74 83 0.790182 +74 89 0.143598 +74 92 0.930358 +75 1 0.350227 +75 2 0.467771 +75 8 0.400418 +75 10 0.199877 +75 16 0.329637 +75 21 0.890434 +75 32 0.703840 +75 36 0.466673 +75 38 0.343709 +75 39 0.303183 +75 41 0.291176 +75 44 0.972487 +75 59 0.738564 +75 63 0.635457 +75 72 0.281488 +75 76 0.898385 +75 84 0.382248 +75 95 0.416932 +76 2 0.794068 +76 4 0.620609 +76 13 0.660932 +76 14 0.670652 +76 17 0.439325 +76 18 0.290700 +76 22 0.098691 +76 28 0.150530 +76 40 0.983385 +76 41 0.632939 +76 49 0.348866 +76 50 0.974384 +76 65 0.263688 +76 68 0.785311 +76 70 0.995051 +76 71 0.012906 +76 75 0.898385 +76 79 0.555351 +76 83 0.284710 +76 94 0.440042 +76 99 0.423414 +76 100 0.145862 +77 11 0.000644 +77 18 0.021200 +77 22 0.956914 +77 24 0.010630 +77 28 0.681471 +77 29 0.915290 +77 30 0.103823 +77 31 0.466961 +77 39 0.120610 +77 43 0.807870 +77 52 0.447350 +77 53 0.864878 +77 56 0.271178 +77 58 0.587033 +77 64 0.308366 +77 66 0.197057 +77 68 0.708447 +77 73 0.920043 +77 84 0.163438 +77 86 0.745529 +77 100 0.169052 +78 5 0.070731 +78 7 0.676117 +78 14 0.251207 +78 21 0.483858 +78 23 0.932540 +78 37 0.913108 +78 38 0.175494 +78 40 0.296552 +78 51 0.404195 +78 52 0.178742 +78 57 0.223466 +78 59 0.635988 +78 63 0.017287 +78 68 0.630124 +78 80 0.753500 +78 84 0.924487 +78 86 0.447060 +78 88 0.697973 +78 91 0.035973 +78 94 0.022608 +79 7 0.260692 +79 9 0.195531 +79 10 0.371381 +79 11 0.224424 +79 22 0.566016 +79 23 0.420100 +79 24 0.904767 +79 29 0.022621 +79 31 0.909364 +79 36 0.684344 +79 45 0.034570 +79 56 0.295177 +79 62 0.442290 +79 65 0.571352 +79 76 0.555351 +79 86 0.815813 +79 92 0.451833 +79 95 0.725448 +79 96 0.130845 +80 6 0.441708 +80 20 0.575331 +80 22 0.243567 +80 30 0.330582 +80 41 0.675957 +80 44 0.255826 +80 47 0.809600 +80 49 0.488341 +80 50 0.977593 +80 58 0.071850 +80 61 0.648705 +80 74 0.478347 +80 78 0.753500 +80 84 0.100959 +80 86 0.147135 +80 99 0.612742 +81 4 0.926429 +81 6 0.477341 +81 11 0.456407 +81 13 0.868783 +81 37 0.597387 +81 41 0.483297 +81 56 0.074342 +81 62 0.183744 +81 74 0.029423 +81 81 0.932275 +81 90 0.139383 +81 92 0.469943 +81 95 0.639350 +81 98 0.865197 +81 99 0.645904 +82 5 0.282778 +82 10 0.560092 +82 14 0.508118 +82 22 0.061235 +82 26 0.500824 +82 27 0.261521 +82 28 0.614895 +82 29 0.963171 +82 30 0.356281 +82 31 0.139618 +82 46 0.075501 +82 54 0.074085 +82 55 0.359314 +82 70 0.321145 +82 74 0.039276 +82 82 0.292473 +82 93 0.748218 +82 96 0.213653 +82 97 0.010352 +83 2 0.533563 +83 5 0.278053 +83 6 0.075458 +83 7 0.032723 +83 10 0.360962 +83 19 0.242779 +83 23 0.043010 +83 26 0.617564 +83 35 0.148508 +83 38 0.765294 +83 39 0.691129 +83 42 0.102097 +83 49 0.738413 +83 52 0.182486 +83 55 0.530443 +83 61 0.917633 +83 70 0.839937 +83 74 0.790182 +83 76 0.284710 +83 85 0.899729 +83 89 0.965426 +83 93 0.732538 +84 1 0.036090 +84 14 0.145728 +84 23 0.127706 +84 24 0.760377 +84 27 0.037912 +84 29 0.274188 +84 30 0.500173 +84 35 0.939878 +84 56 0.417508 +84 60 0.031829 +84 73 0.521579 +84 75 0.382248 +84 77 0.163438 +84 78 0.924487 +84 80 0.100959 +84 93 0.898283 +84 94 0.017803 +84 96 0.392741 +84 97 0.747139 +85 4 0.747551 +85 8 0.083860 +85 9 0.490606 +85 15 0.364039 +85 17 0.972615 +85 18 0.770575 +85 23 0.354679 +85 28 0.059568 +85 31 0.460483 +85 32 0.420779 +85 34 0.649527 +85 43 0.293946 +85 52 0.572995 +85 53 0.667421 +85 54 0.062118 +85 56 0.025531 +85 59 0.980763 +85 66 0.858465 +85 70 0.054069 +85 83 0.899729 +85 88 0.779722 +85 92 0.019575 +86 4 0.379019 +86 6 0.330944 +86 9 0.925450 +86 10 0.285196 +86 36 0.901141 +86 37 0.961475 +86 52 0.117492 +86 60 0.173065 +86 67 0.673957 +86 69 0.049945 +86 71 0.321576 +86 77 0.745529 +86 78 0.447060 +86 79 0.815813 +86 80 0.147135 +86 96 0.899058 +86 99 0.073824 +87 2 0.919668 +87 17 0.244650 +87 19 0.472157 +87 22 0.691646 +87 25 0.793727 +87 27 0.962653 +87 28 0.395248 +87 34 0.881172 +87 35 0.813014 +87 43 0.294910 +87 51 0.379431 +87 54 0.240123 +87 59 0.200676 +87 62 0.568466 +87 68 0.142150 +87 96 0.784802 +87 98 0.427005 +87 99 0.716243 +88 5 0.848864 +88 17 0.468292 +88 22 0.612468 +88 29 0.994168 +88 36 0.097082 +88 38 0.869149 +88 41 0.600048 +88 42 0.910688 +88 43 0.382230 +88 56 0.406989 +88 57 0.848978 +88 58 0.267234 +88 68 0.397247 +88 72 0.519327 +88 78 0.697973 +88 85 0.779722 +88 95 0.278614 +88 97 0.270762 +88 100 0.544907 +89 3 0.311452 +89 8 0.696952 +89 18 0.857227 +89 21 0.576156 +89 25 0.323267 +89 30 0.297472 +89 33 0.884182 +89 37 0.181223 +89 41 0.979895 +89 47 0.754108 +89 50 0.507490 +89 52 0.431520 +89 56 0.733306 +89 63 0.288342 +89 68 0.716233 +89 73 0.875042 +89 74 0.143598 +89 83 0.965426 +89 93 0.137931 +89 97 0.790344 +90 8 0.125924 +90 18 0.105964 +90 21 0.960478 +90 26 0.134645 +90 36 0.644301 +90 40 0.301243 +90 44 0.279579 +90 48 0.844725 +90 57 0.971259 +90 60 0.726563 +90 69 0.398701 +90 81 0.139383 +90 92 0.161389 +90 94 0.096583 +90 97 0.415174 +91 16 0.141615 +91 22 0.692237 +91 25 0.730310 +91 32 0.269619 +91 33 0.031283 +91 35 0.813507 +91 37 0.480789 +91 39 0.200289 +91 50 0.902184 +91 53 0.857757 +91 54 0.809369 +91 56 0.780910 +91 58 0.558863 +91 67 0.125958 +91 71 0.076331 +91 72 0.625307 +91 78 0.035973 +91 92 0.565600 +91 97 0.036649 +91 98 0.505470 +92 5 0.603004 +92 9 0.618881 +92 12 0.719004 +92 13 0.825368 +92 25 0.717669 +92 43 0.386859 +92 44 0.490651 +92 45 0.590664 +92 59 0.135139 +92 66 0.663629 +92 74 0.930358 +92 79 0.451833 +92 81 0.469943 +92 85 0.019575 +92 90 0.161389 +92 91 0.565600 +92 97 0.532221 +93 2 0.339884 +93 11 0.179126 +93 17 0.218016 +93 22 0.864572 +93 31 0.358537 +93 40 0.336856 +93 53 0.388002 +93 54 0.003933 +93 57 0.712075 +93 60 0.204852 +93 61 0.282008 +93 82 0.748218 +93 83 0.732538 +93 84 0.898283 +93 89 0.137931 +93 93 0.585072 +93 95 0.663425 +94 1 0.611102 +94 2 0.341080 +94 8 0.340554 +94 11 0.830741 +94 12 0.986764 +94 18 0.590374 +94 20 0.430250 +94 41 0.099148 +94 58 0.567583 +94 62 0.721682 +94 63 0.734306 +94 68 0.049331 +94 71 0.083382 +94 73 0.985195 +94 76 0.440042 +94 78 0.022608 +94 84 0.017803 +94 90 0.096583 +94 98 0.177132 +94 99 0.017873 +95 2 0.114607 +95 19 0.755058 +95 33 0.718905 +95 36 0.168674 +95 37 0.242429 +95 39 0.679574 +95 44 0.425354 +95 45 0.610002 +95 53 0.505393 +95 55 0.603980 +95 59 0.146363 +95 63 0.791053 +95 64 0.866700 +95 67 0.070021 +95 75 0.416932 +95 79 0.725448 +95 81 0.639350 +95 88 0.278614 +95 93 0.663425 +95 99 0.064451 +96 1 0.211177 +96 5 0.119078 +96 17 0.914443 +96 23 0.021266 +96 25 0.996770 +96 26 0.797388 +96 35 0.687966 +96 36 0.850249 +96 44 0.447783 +96 47 0.892832 +96 51 0.202110 +96 66 0.208363 +96 79 0.130845 +96 82 0.213653 +96 84 0.392741 +96 86 0.899058 +96 87 0.784802 +97 4 0.084731 +97 5 0.307809 +97 7 0.445619 +97 18 0.365690 +97 20 0.684785 +97 22 0.988494 +97 23 0.654256 +97 26 0.426195 +97 32 0.928862 +97 49 0.443440 +97 63 0.798962 +97 71 0.431052 +97 82 0.010352 +97 84 0.747139 +97 88 0.270762 +97 89 0.790344 +97 90 0.415174 +97 91 0.036649 +97 92 0.532221 +97 98 0.332114 +97 99 0.991242 +98 3 0.293800 +98 12 0.927750 +98 15 0.889661 +98 19 0.968025 +98 24 0.110040 +98 39 0.958648 +98 52 0.531898 +98 57 0.662108 +98 68 0.621099 +98 71 0.555299 +98 81 0.865197 +98 87 0.427005 +98 91 0.505470 +98 94 0.177132 +98 97 0.332114 +99 8 0.138795 +99 11 0.948651 +99 16 0.030513 +99 20 0.607865 +99 24 0.926088 +99 58 0.878683 +99 61 0.139073 +99 68 0.915412 +99 69 0.945046 +99 76 0.423414 +99 80 0.612742 +99 81 0.645904 +99 86 0.073824 +99 87 0.716243 +99 94 0.017873 +99 95 0.064451 +99 97 0.991242 +99 100 0.580251 +100 12 0.622678 +100 13 0.278728 +100 18 0.170688 +100 20 0.247700 +100 27 0.705583 +100 50 0.653265 +100 53 0.457349 +100 55 0.391936 +100 61 0.102948 +100 64 0.253223 +100 66 0.567906 +100 69 0.970520 +100 76 0.145862 +100 77 0.169052 +100 88 0.544907 +100 99 0.580251 diff --git a/fastlib/u/nvasil/sparse/sparse_matrix_unit.cc b/fastlib/u/nvasil/sparse/sparse_matrix_unit.cc new file mode 100644 index 0000000000..265702af97 --- /dev/null +++ b/fastlib/u/nvasil/sparse/sparse_matrix_unit.cc @@ -0,0 +1,82 @@ +/* + * ===================================================================================== + * + * Filename: sparse_matrix_unit.cc + * + * Description: + * + * Version: 1.0 + * Created: 06/22/2007 09:35:38 AM EDT + * Revision: none + * Compiler: gcc + * + * Author: Nikolaos Vasiloglou (NV), nvasil@ieee.org + * Company: Georgia Tech Fastlab-ESP Lab + * + * ===================================================================================== + */ +#include "fastlib/fastlib.h" +#include "base/test.h" +#include "u/nvasil/sparse/sparse_matrix.h" + +namespace sparse { +template +class MatrixTest { + public: + void Init(){ + size_=100; + non_zero_=10; + matrix_.Init(100, 10); + for(index_t i=0; i(bfile_); + T *x=ReadVectorFromFile(xfile_); + T *xconjg=NewVector(size_); + ConjugateGradient(matrix_, b, xconjg); + for(index_t i=0; i matrix_; + index_t size_; + index_t non_zero_; + string matrixfile_; + string xfile_; + string bfile_; +}; +}; + +int main(int argc, char *argv[]) { + sparse::MatrixTest matrix_test; + matrix_test.TestAll(); +} diff --git a/fastlib/u/nvasil/sparse/xfile.txt b/fastlib/u/nvasil/sparse/xfile.txt new file mode 100644 index 0000000000..79c2a06382 --- /dev/null +++ b/fastlib/u/nvasil/sparse/xfile.txt @@ -0,0 +1,101 @@ +100 +1.996082e-001 +1.889655e-001 +9.194082e-002 +1.192612e-001 +1.178196e-001 +6.371303e-002 +8.445448e-002 +7.254164e-002 +1.501248e-001 +7.637947e-002 +1.017771e-001 +1.586293e-001 +1.454267e-001 +9.962082e-002 +1.618512e-001 +1.169950e-001 +1.602426e-001 +1.503602e-001 +9.723121e-002 +1.544979e-001 +1.282722e-001 +1.969347e-001 +1.400065e-001 +1.401031e-001 +1.943900e-001 +1.063137e-001 +1.159788e-001 +1.402335e-001 +1.962225e-001 +1.223936e-001 +9.956518e-002 +7.307372e-002 +1.328334e-001 +1.739886e-001 +1.178861e-001 +1.750638e-001 +1.567168e-001 +7.882769e-002 +1.143720e-001 +1.498869e-001 +1.465052e-001 +1.251158e-001 +1.358222e-001 +1.373314e-001 +1.610891e-001 +6.361812e-002 +1.505142e-001 +9.882921e-002 +7.997550e-002 +1.352742e-001 +1.058145e-001 +1.007919e-001 +1.257767e-001 +1.393872e-001 +8.415361e-002 +1.252699e-001 +1.477836e-001 +1.410945e-001 +1.449693e-001 +7.195210e-002 +1.410983e-001 +1.530136e-001 +9.629503e-002 +9.223418e-002 +1.493975e-001 +1.702489e-001 +1.085944e-001 +2.034601e-001 +1.499395e-001 +9.145450e-002 +8.656999e-002 +1.806174e-001 +1.534616e-001 +1.759834e-001 +1.462790e-001 +1.833845e-001 +1.217257e-001 +1.349850e-001 +1.359490e-001 +1.315232e-001 +1.183845e-001 +7.881309e-002 +1.944763e-001 +7.765502e-002 +1.662613e-001 +1.018637e-001 +1.385411e-001 +1.492866e-001 +1.521674e-001 +8.788967e-002 +1.452975e-001 +1.085360e-001 +1.243462e-001 +1.241706e-001 +1.349890e-001 +1.493517e-001 +2.081636e-001 +1.325996e-001 +1.267389e-001 +1.164725e-001