Adding new encoding for nqueens (It has a bug) + code refactoring + Adding new Bench...
authorHamed Gorjiara <hgorjiar@uci.edu>
Thu, 26 Jul 2018 02:19:22 +0000 (19:19 -0700)
committerHamed Gorjiara <hgorjiar@uci.edu>
Thu, 26 Jul 2018 02:19:22 +0000 (19:19 -0700)
nqueens/nqueens.cc
sudoku-csolver/problems/36x36-1000.problem [new file with mode: 0644]

index d3317081f39302e8a37f6541dd3af72d16d5f720..be0d6b25e2d90d674390d25665513e68ff0e5622 100644 (file)
@@ -9,6 +9,7 @@
 #include "solver_interface.h"
 #include "csolver.h"
 #include "common.h"
+#include <algorithm>
 
 using namespace std;
 
@@ -42,6 +43,69 @@ void LessEqualOneToCNF(vector<int> literals, vector< vector<int> > & cnf){
        }
 }
 
+bool validateSolution(int N, int *table, int size){
+       for(int k=0; k<size; k++){
+               if(table[k]>0){
+                       int row = k/N;
+                       int col = k%N;
+                       for (int j= row*N; j<(row+1)*N; j++)
+                               if(j!=k && table[j] >0){
+                                       return false;
+                               }       
+                       for(int j=0; j<N; j++){
+                               int indx = j*N+col;
+                               if(indx !=k && table[indx]>0){
+                                       return false;
+                               }
+                       }
+                       
+                       int i=row;
+                       int j = col;
+                       while( i>0 && j>0){
+                               int indx = i--*N+j--;
+                               if(k!=indx && table[indx]>0){
+                                       return false;
+                               }
+                       }
+                       i=row;
+                       j=col;
+                       while(i>0 && j<N){
+                               int indx=i--*N+j++;
+                               if(k!=indx && table[indx]>0){
+                                       return false;
+                               }
+                       }
+                       i=row;
+                       j=col;
+                       while(i<N && j>0){
+                               int indx = i++*N+j--;
+                               if(k!=indx && table[indx]>0){
+                                       return false;
+                               }
+                       }
+                       i=row;
+                       j=col;
+                       while(i<N && j<N){
+                               int indx = i++*N+j++;
+                               if(k!=indx && table[indx]>0){
+                                       return false;
+                               }
+                       }
+                       
+               }
+       }
+       return true;
+}
+
+void printValidationStatus(int N, int *table, int size){
+       if(validateSolution(N, table, size)){
+               printf("***CORRECT****\n");
+       }else{
+               printf("***WRONG******\n");
+       }
+
+}
+
 void printSolution(int N, int *table, int size){
        for(int i=0; i<size; i++){
                if(table[i] > 0){
@@ -135,6 +199,7 @@ void originalNqueensEncoding(int N){
                        break;
                case IS_SAT:{
                        printSolution(N, &solver->solution[1], solver->solutionsize);
+                       printValidationStatus(N, &solver->solution[1], solver->solutionsize);
                        break;
                }
                default:
@@ -144,11 +209,8 @@ void originalNqueensEncoding(int N){
        deleteIncrementalSolver(solver);
 }
 
-void initializingElements(CSolver * solver, int N, vector<Element *> &Xs, vector<Element *> &Ys){
-       
-}
 
-void csolverNQueens(int N){
+void csolverNQueensSub(int N){
        CSolver *solver = new CSolver();
        uint64_t domain[N];
        for(int i=0; i<N; i++){
@@ -225,20 +287,140 @@ void csolverNQueens(int N){
                        table[N*x+y] = 1;
                }
                printSolution(N, table, N*N);
+               printValidationStatus(N, table, N*N);
        }
        delete solver;
 }
 
+void atmostOneConstraint(CSolver *solver, vector<BooleanEdge> &constraints){
+       int size = constraints.size();
+       if(size <1){
+               return;
+       } else if(size ==1){
+               solver->addConstraint(constraints[0]);
+       }else{
+//             solver->addConstraint(solver->applyLogicalOperation(SATC_OR, &constraints[0], size))
+               for(int i=0; i<size-1; i++){
+                       for(int j=i+1; j<size; j++){
+                               BooleanEdge const1 = solver->applyLogicalOperation(SATC_NOT, constraints[i]);
+                               BooleanEdge const2 = solver->applyLogicalOperation(SATC_NOT, constraints[j]);
+                               BooleanEdge array[] = {const1, const2};
+                               solver->applyLogicalOperation(SATC_OR, (BooleanEdge *)array, 2);
+                       }
+               }
+       
+       }
+}
+
+void differentInEachRow(CSolver* solver, int N, vector<Element*> &elems){
+       Predicate *eq = solver->createPredicateOperator(SATC_EQUALS);
+       for(int i=0; i<N-1; i++){
+               for(int j=i+1; j<N; j++ ){
+                       Element *e1x = elems[i];
+                       Element *e2x = elems[j];
+                       Element *inputs2 [] = {e1x, e2x};
+                       BooleanEdge equals = solver->applyPredicate(eq, inputs2, 2);
+                       solver->addConstraint(solver->applyLogicalOperation(SATC_NOT, equals));
+               }
+       }
+
+
+}
+
+void diagonallyDifferentConstraint(CSolver *solver, int N, vector<Element*> &elems){
+       Predicate *eq = solver->createPredicateOperator(SATC_EQUALS);
+       for(int i=N-1; i>0; i--){
+               cout << "i:" << i << "\t";
+               vector<BooleanEdge> diagonals;
+               for(int j=i; j>=0; j--){
+                       int index = i-j;
+                       Element* e1 = elems[index];
+                       cout << "e" << e1 <<"=" << j << ", ";
+                       Element* e2 = solver->getElementConst(2, (uint64_t) j);
+                       Element* in[] = {e1, e2};
+                       BooleanEdge equals = solver->applyPredicate(eq, in, 2);
+                       diagonals.push_back(equals);
+                       
+               }
+               cout << endl;
+               atmostOneConstraint(solver, diagonals);
+       }
+       for(int i=1; i< N-1; i++){
+               cout << "i:" << i << "\t";
+               vector<BooleanEdge> diagonals;
+               for(int j=i; j<N; j++){
+                       int index =N-1- (j-i);
+                       Element* e1 = elems[index];
+                       cout << "e" << e1 <<"=" << j << ", ";
+                       Element* e2 = solver->getElementConst(2, (uint64_t) j);
+                       Element* in[] = {e1, e2};
+                       BooleanEdge equals = solver->applyPredicate(eq, in, 2);
+                       diagonals.push_back(equals);
+                       
+               }
+               cout << endl;
+               atmostOneConstraint(solver, diagonals);
+
+       }
+       
+}
+
+void diagonallyDifferentConstraintBothDir(CSolver *solver, int N, vector<Element*> &elems){
+       diagonallyDifferentConstraint(solver, N, elems);
+       reverse(elems.begin(), elems.end());
+       cout << "Other Diagonal:" << endl;
+       diagonallyDifferentConstraint(solver, N, elems);
+} 
+
+
+void csolverNQueens(int N){
+       if(N <=1){
+               cout<<"Q" << endl;
+               return;
+       }
+       CSolver *solver = new CSolver();
+       uint64_t domain[N];
+       for(int i=0; i<N; i++){
+               domain[i] = i;
+       }
+       Set *domainSet = solver->createSet(1, domain, N);
+       vector<Element *> elems;
+       for(int i=0; i<N; i++){
+               elems.push_back(solver->getElementVar(domainSet));
+       }
+       
+       differentInEachRow(solver, N, elems);
+       diagonallyDifferentConstraintBothDir(solver, N, elems);
+//     solver->serialize();
+       if (solver->solve() != 1){
+               printf("Problem is Unsolvable ...\n");
+       }else {
+               int table[N*N];
+               memset( table, 0, N*N*sizeof(int) );
+               for(int i=0; i<N; i++){
+                       uint x = solver->getElementValue(elems[i]);
+                       printf("X=%d, Y=%d\n", x, i);
+                       ASSERT(N*x+i < N*N);
+                       table[N*x+i] = 1;
+               }
+               printSolution(N, table, N*N);
+               printValidationStatus(N, table, N*N);
+       }
+       delete solver;
+}
+
+
+
 int main(int argc, char * argv[]){
        if(argc < 2){
-               printf("Two arguments are needed\n./nqueen <size> [-csolver]\n");
+               printf("Two arguments are needed\n./nqueen <size> [--csolver]\n");
                exit(-1);
        }
        int N = atoi(argv[1]);
        if(argc <3){
                printf("Running the original encoding ...\n");
                originalNqueensEncoding(N);
-       }else if( strcmp( argv[2], "-csolver") == 0 ){
+       }else if( strcmp( argv[2], "--csolver") == 0 ){
                printf("Running the CSolver encoding ...\n");
                csolverNQueens(N);
        }
diff --git a/sudoku-csolver/problems/36x36-1000.problem b/sudoku-csolver/problems/36x36-1000.problem
new file mode 100644 (file)
index 0000000..144d4e3
--- /dev/null
@@ -0,0 +1,36 @@
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.300000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.100000000000000000e+01 2.800000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.000000000000000000e+00 8.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 5.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.200000000000000000e+01 0.000000000000000000e+00 2.300000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.000000000000000000e+01 2.400000000000000000e+01 1.900000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.500000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.000000000000000000e+00
+0.000000000000000000e+00 2.200000000000000000e+01 1.100000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 3.200000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 1.800000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 8.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.100000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.700000000000000000e+01 0.000000000000000000e+00 7.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.900000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 6.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.700000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 9.000000000000000000e+00 4.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.400000000000000000e+01 0.000000000000000000e+00 5.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.600000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 6.000000000000000000e+00 0.000000000000000000e+00 3.600000000000000000e+01 1.600000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 2.300000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 1.900000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.100000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.300000000000000000e+01 1.800000000000000000e+01 1.200000000000000000e+01 2.200000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.500000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.500000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 2.300000000000000000e+01 9.000000000000000000e+00
+0.000000000000000000e+00 3.300000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.100000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.600000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.200000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 9.000000000000000000e+00 1.700000000000000000e+01 0.000000000000000000e+00 1.400000000000000000e+01 1.800000000000000000e+01 0.000000000000000000e+00 6.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 1.500000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 7.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.900000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 3.400000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.600000000000000000e+01 5.000000000000000000e+00 0.000000000000000000e+00 3.500000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 2.400000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.600000000000000000e+01 1.000000000000000000e+01 1.300000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.500000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.100000000000000000e+01 2.900000000000000000e+01 0.000000000000000000e+00 6.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.100000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 4.000000000000000000e+00 0.000000000000000000e+00 7.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.400000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 2.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.200000000000000000e+01 0.000000000000000000e+00 8.000000000000000000e+00 2.900000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 9.000000000000000000e+00 3.400000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.100000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.000000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.000000000000000000e+00 1.600000000000000000e+01 2.600000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.300000000000000000e+01 0.000000000000000000e+00 3.400000000000000000e+01 0.000000000000000000e+00 3.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.800000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.900000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.000000000000000000e+00 9.000000000000000000e+00 3.500000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.100000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.600000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.400000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.100000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 3.000000000000000000e+01 3.200000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.300000000000000000e+01 1.900000000000000000e+01 0.000000000000000000e+00 1.800000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.100000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.000000000000000000e+00 6.000000000000000000e+00 5.000000000000000000e+00
+3.200000000000000000e+01 3.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.500000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.400000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.400000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 2.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 9.000000000000000000e+00 1.200000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.900000000000000000e+01 1.800000000000000000e+01 0.000000000000000000e+00 1.700000000000000000e+01 0.000000000000000000e+00 1.500000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.100000000000000000e+01 2.700000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.300000000000000000e+01 0.000000000000000000e+00 1.100000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 1.600000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.300000000000000000e+01 1.100000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.000000000000000000e+00 1.200000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 9.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 6.000000000000000000e+00 2.600000000000000000e+01 0.000000000000000000e+00 3.500000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.500000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.900000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 2.800000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.400000000000000000e+01 0.000000000000000000e+00 1.400000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.800000000000000000e+01 2.300000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 2.000000000000000000e+00 0.000000000000000000e+00 6.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.700000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.900000000000000000e+01 1.200000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 2.100000000000000000e+01 0.000000000000000000e+00 1.500000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.000000000000000000e+01
+0.000000000000000000e+00 3.400000000000000000e+01 0.000000000000000000e+00 3.600000000000000000e+01 3.200000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.900000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.600000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.400000000000000000e+01 0.000000000000000000e+00 1.200000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.000000000000000000e+00
+0.000000000000000000e+00 2.900000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.400000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 8.000000000000000000e+00 4.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.000000000000000000e+00 1.800000000000000000e+01 1.100000000000000000e+01 0.000000000000000000e+00 1.300000000000000000e+01 1.700000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.300000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.900000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 3.500000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 9.000000000000000000e+00 0.000000000000000000e+00 1.600000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.200000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 7.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.700000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.500000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.100000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.400000000000000000e+01 2.100000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.300000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.400000000000000000e+01 0.000000000000000000e+00 1.800000000000000000e+01 0.000000000000000000e+00 2.600000000000000000e+01 0.000000000000000000e+00 3.200000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.500000000000000000e+01
+0.000000000000000000e+00 2.000000000000000000e+00 3.400000000000000000e+01 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 8.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.600000000000000000e+01 1.600000000000000000e+01 1.800000000000000000e+01 0.000000000000000000e+00 2.500000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.200000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 7.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 6.000000000000000000e+00 0.000000000000000000e+00 4.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 3.100000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.700000000000000000e+01 2.600000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 2.900000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 2.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.400000000000000000e+01 0.000000000000000000e+00 1.300000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.000000000000000000e+00 1.000000000000000000e+00
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.300000000000000000e+01 2.400000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.800000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 3.500000000000000000e+01 3.400000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 3.300000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 1.200000000000000000e+01 0.000000000000000000e+00 9.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.500000000000000000e+01 1.600000000000000000e+01 1.300000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 1.800000000000000000e+01
+0.000000000000000000e+00 1.600000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.100000000000000000e+01 0.000000000000000000e+00 6.000000000000000000e+00 3.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.700000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.600000000000000000e+01 0.000000000000000000e+00 3.400000000000000000e+01
+0.000000000000000000e+00 2.600000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.200000000000000000e+01 0.000000000000000000e+00 2.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 1.100000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.200000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.100000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 6.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 7.000000000000000000e+00 8.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.800000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.400000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.700000000000000000e+01 2.500000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.200000000000000000e+01
+0.000000000000000000e+00 2.700000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.600000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.000000000000000000e+01 1.400000000000000000e+01 0.000000000000000000e+00 2.900000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.800000000000000000e+01 0.000000000000000000e+00 1.600000000000000000e+01 0.000000000000000000e+00 2.300000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 2.400000000000000000e+01 2.900000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.800000000000000000e+01 3.600000000000000000e+01 1.100000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 7.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.100000000000000000e+01 0.000000000000000000e+00 2.800000000000000000e+01
+0.000000000000000000e+00 1.500000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.400000000000000000e+01 7.000000000000000000e+00 2.400000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 3.200000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 1.800000000000000000e+01 0.000000000000000000e+00 2.200000000000000000e+01 3.600000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 1.900000000000000000e+01 2.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.700000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.400000000000000000e+01 2.900000000000000000e+01 1.800000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.100000000000000000e+01
+0.000000000000000000e+00 7.000000000000000000e+00 3.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.000000000000000000e+00 0.000000000000000000e+00 2.300000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 8.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.200000000000000000e+01 0.000000000000000000e+00 3.600000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.900000000000000000e+01
+0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.400000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 1.300000000000000000e+01 3.400000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.800000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.200000000000000000e+01 0.000000000000000000e+00 3.000000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.600000000000000000e+01