int main(){ solutions s; tests(); printf("-- dancing links simple samples ; see code for details. -- \n\n"); printf("test case 1 - all solutions \n"); print_data((int*)data1, n_rows, n_cols); s = dancing_links(n_rows, n_cols, (int*)data1, 0); print_solutions(s); free_solutions(s); printf("\n"); printf("test case 2 - 1st solution \n"); print_data(data2, 4, 3); s = dancing_links(4, 3, data2, 1); print_solutions(s); free_solutions(s); printf("\n"); printf("test case 2 - up to 3 solutions \n"); s = dancing_links(4, 3, data2, 3); print_solutions(s); free_solutions(s); printf("\n"); printf("memory check:\n"); printf(" malloc() + calloc() - free() = %i \n\n", get_allocation_count()); return 0; }
// #define DEBUG_SOLVER bool Ellipse::find_EllipsePosition2() { // a horrible horrible function... :( assert( EllipsePosition1.isValid() ); double err1 = fabs(this->error(this->EllipsePosition1)); this->EllipsePosition2.s = this->EllipsePosition1.s; // plus this->EllipsePosition2.t = -this->EllipsePosition1.t; // minus if ( fabs(this->error(this->EllipsePosition2)) < err1+OE_ERROR_TOLERANCE) { if ( (fabs(this->EllipsePosition2.s - this->EllipsePosition1.s) > 1E-8) || (fabs(this->EllipsePosition2.t - this->EllipsePosition1.t) > 1E-8) ) { #ifdef DEBUG_SOLVER std::cout << "2nd: (s, t)= " << this->EllipsePosition2 << " oePoint()= " << this->oePoint(this->EllipsePosition2) << " e=" << this->error(this->EllipsePosition2) << "\n"; #endif return true; } } this->EllipsePosition2.s = -this->EllipsePosition1.s; this->EllipsePosition2.t = this->EllipsePosition1.t; if ( fabs(this->error(this->EllipsePosition2)) < err1+OE_ERROR_TOLERANCE) { if ( (fabs(this->EllipsePosition2.s - this->EllipsePosition1.s) > 1E-8) || (fabs(this->EllipsePosition2.t - this->EllipsePosition1.t) > 1E-8) ) { #ifdef DEBUG_SOLVER std::cout << "2nd: (s, t)= " << this->EllipsePosition2 << " oePoint()= " << this->oePoint(this->EllipsePosition2) << " e=" << this->error(this->EllipsePosition2) << "\n"; #endif return true; } } this->EllipsePosition2.s = -this->EllipsePosition1.s; this->EllipsePosition2.t = -this->EllipsePosition1.t; if ( fabs(this->error(this->EllipsePosition2)) < err1+OE_ERROR_TOLERANCE) { if ( (fabs(this->EllipsePosition2.s - this->EllipsePosition1.s) > 1E-8) || (fabs(this->EllipsePosition2.t - this->EllipsePosition1.t) > 1E-8) ) { #ifdef DEBUG_SOLVER std::cout << "2nd: (s, t)= " << this->EllipsePosition2 << " oePoint()= " << this->oePoint(this->EllipsePosition2) << " e=" << this->error(this->EllipsePosition2) << "\n"; #endif return true; } } // last desperate attempt is identical solutions this->EllipsePosition2.s = this->EllipsePosition1.s; this->EllipsePosition2.t = this->EllipsePosition1.t; if ( fabs(this->error(this->EllipsePosition2)) < err1+OE_ERROR_TOLERANCE) { // DON'T require solutions to differ // if ( (fabs(this->EllipsePosition2.s - this->EllipsePosition1.s) > 1E-8) || (fabs(this->EllipsePosition2.t - this->EllipsePosition1.t) > 1E-8) ) { #ifdef DEBUG_SOLVER std::cout << "2nd: (s, t)= " << this->EllipsePosition2 << " oePoint()= " << this->oePoint(this->EllipsePosition2) << " e=" << this->error(this->EllipsePosition2) << "\n"; #endif //std::cout << " find_EllipsePosition2() desperate-mode\n"; return true; //} } std::cout << "Ellipse::find_EllipsePosition2 cannot find EllipsePosition2! \n"; std::cout << "ellipse= "<< *this << "\n"; print_solutions(); assert(0); return false; }
int main(){ int n; // solution is n-queens. allow user to select dimensions via printf("Enter board size. ie NxN\n"); scanf("%d", &n); queens(1,n); print_solutions(n); return 0; }
void example(void) { #define M 4 static const size_t n = M; num equation[M * (M + 1)] = { 12, 8, 1, 1, 69, 10, 13, 10, 2, 14, 15, 9, 2, 7, 194, 5, 10, 13, 14, 193 }; gauss_elim(n, equation); print_solutions(n, equation); }
int main() { static int table[MAXTERMS][MAXTERMS];//the table int covered[MAX_VARS+1][MAXTERMS];//checks to see if it was covered in the next level int m; int j,k,p; TERM tempTerm; int found; /*Initialize number of terms at each level m*/ for(m=0;m<MAX_VARS+1;m++) numTerms[m]=0; /*read input minterms from user*/ int in; printf("Enter the number of minterms to be entered ::"); scanf("%d",&in); printf("Enter the normal terms::\n"); int ind=0,trm; numTerms[0]=in; for(ind=0;ind<in;ind++) { scanf("%d",&trm); init(&terms[0][ind],trm); covered[0][ind]=FALSE; dont_care[0][ind]=FALSE; } printf("Enter the number of dont care terms::"); int dc; scanf("%d",&dc); numTerms[0]+=dc; int counter; for(counter=0;counter<dc;counter++) { scanf("%d",&trm); init(&terms[0][ind+counter],trm); covered[0][ind+counter]=FALSE; dont_care[0][ind+counter]=TRUE; } for(m=0;m<MAX_VARS;m++) for(j=0;j<numTerms[m];j++) for(k=j+1;k<numTerms[m];k++) { int both_dontcare=FALSE; if(combinable(terms[m][j],terms[m][k])) { covered[m][j]=TRUE; covered[m][k]=TRUE; if((dont_care[m][j]==TRUE)&&(dont_care[m][k]==TRUE)) both_dontcare=TRUE; combine(terms[m][j],terms[m][k],&tempTerm); found=FALSE; for(p=0;p<numTerms[m+1];p++) if (EqualTerms(terms[m+1][p],tempTerm)) found=TRUE; if(!found) { numTerms[m+1]=numTerms[m+1]+1; terms[m+1][numTerms[m+1]-1]=tempTerm; covered[m+1][numTerms[m+1]-1]=FALSE; if(both_dontcare) dont_care[m+1][numTerms[m+1]-1]=TRUE; else dont_care[m+1][numTerms[m+1]-1]=FALSE; } } } //creating the minterm table /*******************get the number of nonrepeating final prime implicants*****************/ int final_index=0,ii=0; for(m=0;m<MAX_VARS;m++) for(j=0;j<numTerms[m];j++) { if((!covered[m][j])&&(!dont_care[m][j])) { int flag=1; for(ii=0;ii<final_index;ii++) { if(EqualTerms(terms[m][j],prime_implicants[ii])) flag=0; } if(flag) { prime_implicants[final_index]=terms[m][j]; final_index++; } } } //and finally the table /*setting the table values according to the prime implicants*/ for(ii=0;ii<final_index;ii++) { for(j=0;j<prime_implicants[ii].nn;j++) table[ii][prime_implicants[ii].compterms[j]]=1; } for(ii=0;ii<MAXTERMS;ii++) { if(inDontCares(ii)) for(j=0;j<final_index;j++) table[j][ii]=0; } TERM essential[MAXTERMS]; int ess=0; //get the essential prime implicants while(TRUE) { int flag=1; for(ii=0;ii<MAXTERMS;ii++) { int count=0; int pos=0; for(j=0;j<final_index;j++) if(table[j][ii]==1) {count++;pos=j;} if(count==1) { //this is an essential prime implicant essential[ess]=prime_implicants[pos]; ess++; table[j][ii]=0; int c;//remove all other ones for(c=0;c<MAXTERMS;c++) if(table[pos][c]==1) makezeros(c,final_index,table);//set the col to zero flag=0; } } if(flag)//no more count=1 i.e no more ess prime im break; } print_solutions(0,table,final_index,essential,ess); }
void print_solutions(int ii,int table1[][MAXTERMS],int final_index,TERM essential1[],int ess) { int i,j; if(ii==(MAXTERMS-1)) { //print the ans int i; for(i=0;i<ess;i++) { printTerm(essential1[i]); if(i<ess-1) printf("+"); } printf("\n"); } else { TERM essential[MAXTERMS]; int ess2=ess; int pos[MAXTERMS]; int row_ones[MAXTERMS]; int index=0; int count=0; int table[MAXTERMS][MAXTERMS]; for(i=0;i<MAXTERMS;i++) for(j=0;j<MAXTERMS;j++) table[i][j]=table1[i][j]; //copied a new table for(i=0;i<MAXTERMS;i++) essential[i]=essential1[i]; //copied essentials for(j=0;j<final_index;j++) if(table[j][ii]==1) { pos[count]=j; row_ones[count]=onesInRow(j,table); count++; } if(count==0)//col has no ones print_solutions(ii+1,table,final_index,essential,ess); else { int t_max=row_ones[0]; int unq=0; while(row_ones[unq]==t_max) { int row=pos[unq]; //reinitialixe the table for(i=0;i<MAXTERMS;i++) for(j=0;j<MAXTERMS;j++) table[i][j]=table1[i][j]; //reinitialize essentials for(i=0;i<MAXTERMS;i++) essential[i]=essential1[i]; ess2=ess; //make all ones in this row zero int c; for(c=0;c<MAXTERMS;c++) if(table[row][c]==1) makezeros(c,final_index,table); //add to prime implicants essential[ess2++]=prime_implicants[row]; //now send it with increased index print_solutions(ii+1,table,final_index,essential,ess2); unq++; } } } }
int monodromy_breakup ( int myid, int n, int dim, int deg, int nbloops, int numprocs, double *trackwtime ) { int mysolnum,i,done,fail; if(v>0) printf("Node %d knows n = %d, #loops = %d.\n",myid,n,nbloops); monomials_broadcast(myid,n); MPI_Bcast(°,1,MPI_INT,0,MPI_COMM_WORLD); if(v>0) printf("Node %d went through bcast of degree %d.\n",myid,deg); solutions_distribute(myid,deg,n,numprocs,&mysolnum); MPI_Bcast(&dim,1,MPI_INT,0,MPI_COMM_WORLD); fail = initialize_standard_sampler(dim); if(myid == 0) { fail = validate_solutions(); /* sanity check */ fail = initialize_standard_monodromy(nbloops,deg,dim); /* initialize traces */ if(v>1) print_solutions(myid); fail = store_standard_solutions(); } for(i=1; i<=2; i++) { if((v>0)&&(myid == 0)) printf("slice %d for linear trace...\n",i); trace_slice_broadcast(myid,i); gamma_broadcast(myid,n); f_track_paths(myid,deg,n,numprocs,mysolnum,trackwtime); if(myid == 0) { fail = store_standard_solutions(); fail = restore_standard_solutions(); } solutions_distribute(myid,deg,n,numprocs,&mysolnum); if(myid == 0) f_swap_slices(myid); } slices_broadcast(myid,dim,n); for(i=0; i<nbloops; i++) { if((v>0)&&(myid == 0)) printf("Starting loop #\%d...\n",i); gamma_broadcast(myid,n); f_track_paths(myid,deg,n,numprocs,mysolnum,trackwtime); if(myid != 0) f_swap_slices(myid); if(myid == 0) { if(v>1) print_solutions(myid); solcon_clear_standard_solutions(); } gamma_broadcast(myid,n); f_track_paths(myid,deg,n,numprocs,mysolnum,trackwtime); if(myid == 0) { if(v>1) print_solutions(myid); fail = store_standard_solutions(); fail = standard_monodromy_permutation(deg,&done); solcon_clear_standard_solutions(); } MPI_Bcast(&done,1,MPI_INT,0,MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); /* every node must know if done */ if(done == 1) { if (v>0) printf("Node %d leaves the loop at step %d.\n", myid,i+1); if(myid == 0) printf("Executed %d monodromy loops.\n", i+1); return 0; } else { if(myid != 0) f_swap_slices(myid); slices_broadcast(myid,dim,n); /* new slices */ if(myid == 0) fail = restore_standard_solutions(); MPI_Bcast(°,1,MPI_INT,0,MPI_COMM_WORLD); solutions_distribute(myid,deg,n,numprocs,&mysolnum); } } if(myid == 0) printf("Executed %d monodromy loops.\n", i+1); return 1; }