void p_polint(float xa[], float ya[], int n, float x, float *y, float *dy) { int i,m,ns=1; float den,dif,dift,ho,hp,w; float *c,*d; dif=fabs(x-xa[1]); c=p_vector(1,n); d=p_vector(1,n); for (i=1;i<=n;i++) { if ( (dift=fabs(x-xa[i])) < dif) { ns=i; dif=dift; } c[i]=ya[i]; d[i]=ya[i]; } *y=ya[ns--]; for (m=1;m<n;m++) { for (i=1;i<=n-m;i++) { ho=xa[i]-x; hp=xa[i+m]-x; w=c[i+1]-d[i]; if ( (den=ho-hp) == 0.0) { printf("Error in routine polint"); exit(1); } den=w/den; d[i]=hp*den; c[i]=ho*den; } *y += (*dy=(2*ns < (n-m) ? c[ns+1] : d[ns--])); } p_free_vector(d,1,n); p_free_vector(c,1,n); }
void recursive_bisection_contoller::run(parallel::hypergraph &hgraph, MPI_Comm comm) { initialize_coarsest_hypergraph(hgraph, comm); convToBisectionConstraints(); progress("[R-B]: %i |", number_of_runs_); int i; int j; int ij; int numVertices = hypergraph_->number_of_vertices(); int *pVector = nullptr; int destProcessor; int myPartitionIdx = 0; int v; dynamic_array<int> recvLens(number_of_processors_); dynamic_array<int> recvDispls(number_of_processors_); bisection *b; all_partition_info_.resize(numVertices << 1); for (i = 0; i < number_of_runs_; ++i) { destProcessor = i % number_of_processors_; sum_of_cuts_ = 0; local_vertex_part_info_length_ = 0; if (rank_ == destProcessor) { pVector = &partition_vector_[partition_vector_offsets_[myPartitionIdx]]; } b = new bisection(hypergraph_, log_k_, 0); b->initMap(); recursively_bisect(*b, comm); // ### // now recover the partition and // partition cutsize // ### MPI_Reduce(&sum_of_cuts_, &ij, 1, MPI_INT, MPI_SUM, destProcessor, comm); MPI_Gather(&local_vertex_part_info_length_, 1, MPI_INT, recvLens.data(), 1, MPI_INT, destProcessor, comm); if (rank_ == destProcessor) { partition_vector_cuts_[myPartitionIdx] = ij; ij = 0; for (j = 0; j < number_of_processors_; ++j) { recvDispls[j] = ij; ij += recvLens[j]; } } MPI_Gatherv(local_vertex_partition_info_.data(), local_vertex_part_info_length_, MPI_INT, all_partition_info_.data(), recvLens.data(), recvDispls.data(), MPI_INT, destProcessor, comm); if (rank_ == destProcessor) { ij = numVertices << 1; for (j = 0; j < ij;) { v = all_partition_info_[j++]; pVector[v] = all_partition_info_[j++]; } ++myPartitionIdx; } } // ### // k-way refine local partitions // ### hypergraph_->set_number_of_partitions(number_of_partitions_); if (number_of_partitions_ > 0) { for (i = 0; i < number_of_partitions_; ++i) { int *start = &(partition_vector_.data()[partition_vector_offsets_[i]]); dynamic_array<int> p_vector(numVertices); p_vector.set_data(start, numVertices); hypergraph_->copy_in_partition(p_vector, numVertices, i, partition_vector_cuts_[i]); } refiner_->rebalance(*hypergraph_); } // ### // project partitions // ### initialize_serial_partitions(hgraph, comm); #ifdef DEBUG_CONTROLLER hgraph.checkPartitions(numParts, maxPartWt, comm); #endif }