Esempio n. 1
0
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;
}
Esempio n. 2
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
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);
}
Esempio n. 5
0
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);
}
Esempio n. 6
0
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++;
             }
         }
     }
}
Esempio n. 7
0
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(&deg,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(&deg,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;
}