コード例 #1
0
ファイル: mpi2padcon.c プロジェクト: janverschelde/PHCpack
int dobldobl_run ( int myid, int nbrp, int nbc, char* outfile, int verbose )
{
   int fail,dim,nbsols,mysolnum,len,*nbpaths;
   double startwtime,endwtime,wtime,*time;

   startwtime = MPI_Wtime();
   if(myid == 0)
   {
      time = (double*)calloc(nbrp,sizeof(double));
      nbpaths = (int*)calloc(nbrp,sizeof(int));
      fail = read_dobldobl_target_system_without_solutions();
      fail = copy_dobldobl_target_system_to_container();
      fail = syscon_number_of_dobldobl_polynomials(&dim);
      fail = write_dobldobl_target_system();
   }
   dobldobl_dimensions_broadcast(myid,&dim,&dim);

   if(verbose > 0) printf("Process %d has dimension %d.\n",myid,dim);

   dobldobl_monomials_broadcast(myid,dim);

   if(myid != 0) fail = copy_dobldobl_container_to_target_system();

   if(verbose > 0)
      if(myid == 1) fail = write_dobldobl_target_system();

   if(myid == 0)
   {
      fail = read_dobldobl_start_system();
      fail = copy_dobldobl_start_system_to_container();
      fail = write_dobldobl_start_system(); // writes to file
      fail = write_dobldobl_start_solutions(); // writes solutions to file
      fail = copy_dobldobl_start_solutions_to_container();
      fail = solcon_number_of_dobldobl_solutions(&nbsols);
      if(verbose>0) printf("Read %d start solutions.\n",nbsols);
   }
   else
      fail = syscon_initialize_number_of_dobldobl_polynomials(dim);

   dobldobl_monomials_broadcast(myid,dim); // broadcast start system

   if(myid != 0) fail = copy_dobldobl_container_to_start_system();

   if(verbose > 0)
      if(myid == 1) fail = write_dobldobl_start_system();

   parameters_broadcast(myid,nbrp,verbose);

   MPI_Bcast(&nbsols,1,MPI_INT,0,MPI_COMM_WORLD);
   dobldobl_solutions_distribute(myid,nbsols,dim,nbrp,&mysolnum,verbose);

   fail = solcon_number_of_dobldobl_solutions(&len);
   if(verbose > 0) printf("Node %d has %d solutions.\n",myid,len);

   if(myid > 0)
   {
      fail = copy_dobldobl_container_to_start_solutions();
      fail = dobldobl_track_paths(myid,nbrp,nbc,outfile,verbose);
   }
   MPI_Barrier(MPI_COMM_WORLD);
   dobldobl_solutions_collect(myid,nbsols,dim,nbrp,mysolnum);

   if(myid == 0)
   {
      fail = copy_dobldobl_container_to_target_solutions();
      fail = write_dobldobl_target_solutions();
   }
   endwtime = MPI_Wtime();
   wtime = endwtime-startwtime;
   MPI_Gather(&wtime,1,MPI_DOUBLE,time,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
   MPI_Gather(&mysolnum,1,MPI_INT,nbpaths,1,MPI_INT,0,MPI_COMM_WORLD);

   if(myid == 0)
   {
      nbpaths[0] = nbsols;
      write_time_and_paths_to_defined_output_file(nbrp,time,nbpaths);
      free(time); free(nbpaths);
   }
   return 0;
}
コード例 #2
0
ファイル: lib_factor.c プロジェクト: callmetaste/PHCpack
int dobldobl_monodromy_breakup ( int nbloops, int n, int k, int d )
{
   int fail,i,j,done;
   double err,dis;

   fail = initialize_dobldobl_sampler(k);
   fail = initialize_dobldobl_monodromy(nbloops,d,k);
   if(verbose>0)
      printf("\nInitialized sampler and monodromy permutations ...\n");

   fail = store_dobldobl_solutions();  /* store in monodromy permutations */

   printf("... initializing the grid in double double precision...\n");
   for(i=1; i<=2; i++)        /* initialize grid for trace validation */
   {
      fail = set_dobldobl_trace_slice(i);   /* fix constant of slice */
      fail = store_dobldobl_gammas(n);  /* generate random gamma constants */
      fail = dobldobl_track_paths();
      fail = store_dobldobl_solutions();   /* store solutions in the grid */
      fail = restore_dobldobl_solutions(); /* use original sols at start */
      fail = swap_dobldobl_slices();       /* go back to original slices */
   }
   fail = dobldobl_trace_grid_diagnostics(&err,&dis);
   printf("Trace grid diagnostics : \n");
   printf("  largest error of the samples : %.3e\n", err);
   printf("  smallest distance between samples : %.3e\n", dis);
   done = 0;
   for(i=1; (i<=nbloops) && (done==0); i++)  /* perform monodromy loops */
   {
      printf("... starting loop #\%d in double double precision ...\n",i);
      fail = new_dobldobl_slices(k,n);
      fail = store_dobldobl_gammas(n);
      fail = dobldobl_track_paths();     /* swapping slices happens here */
      fail = solcon_clear_dobldobl_solutions();
      fail = store_dobldobl_gammas(n);
      fail = dobldobl_track_paths();
      fail = store_dobldobl_solutions();
      {
         int permutation[d];

         fail = permutation_after_dobldobl_loop(d,permutation);
         printf("the permutation at step %d:",i);
         for(j=0; j<d; j++) printf(" %d",permutation[j]);
         printf("\n");
      }
      fail = dobldobl_monodromy_permutation(d,&done);
      {
         int nf,deg,jp,w[d];
         double trace_difference;

         fail = number_of_dobldobl_factors(&nf);
         printf("number of irreducible factors : %d\n",nf);
         for(j=1; j<=nf; j++)
         {
            fail = witness_points_of_dobldobl_factor(j,&deg,w);
            printf(" %d :",j);
            for(jp=0; jp<deg; jp++) printf(" %d",w[jp]);
            fail = dobldobl_trace_sum_difference(deg,w,&trace_difference);
            printf(" : %.3e\n",trace_difference);
         }
      }
      fail = restore_dobldobl_solutions();
   }
   if(done==1)
      printf("Found factorization using %d loops.\n", i-1);
   else
      printf("Failed to factor using %d loops.\n", i-1);

   return fail;
}