54 #include <Tpetra_Map.hpp> 66 int main(
int argc,
char *argv[])
68 #ifdef HAVE_ZOLTAN2_MPI 69 MPI_Init(&argc, &argv);
71 MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
72 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
79 typedef Tpetra::Map<> Map_t;
80 typedef Map_t::local_ordinal_type localId_t;
81 typedef Map_t::global_ordinal_type globalId_t;
83 typedef double scalar_t;
94 size_t localCount = 40;
97 scalar_t *coords =
new scalar_t [dim * localCount];
100 scalar_t *y = x + localCount;
101 scalar_t *z = y + localCount;
106 scalar_t scalingFactor = 10.0 / RAND_MAX;
108 for (
size_t i=0; i < localCount*dim; i++){
109 coords[i] = scalar_t(rand()) * scalingFactor;
114 globalId_t *globalIds =
new globalId_t [localCount];
115 globalId_t offset = rank * localCount;
117 for (
size_t i=0; i < localCount; i++)
118 globalIds[i] = offset++;
123 double tolerance = 1.1;
126 std::cout <<
"Imbalance tolerance is " << tolerance << std::endl;
128 Teuchos::ParameterList params(
"test params");
129 params.set(
"debug_level",
"basic_status");
130 params.set(
"debug_procs",
"0");
131 params.set(
"error_check_level",
"debug_mode_assertions");
133 params.set(
"algorithm",
"rcb");
134 params.set(
"imbalance_tolerance", tolerance );
135 params.set(
"num_global_parts", nprocs);
145 inputAdapter_t *ia1 =
new inputAdapter_t(localCount,globalIds,x,y,z,1,1,1);
158 quality_t *metricObject1 =
new quality_t(ia1, ¶ms,
163 metricObject1->printMetrics(cout);
167 scalar_t imb = metricObject1->getObjectCountImbalance();
168 if (imb <= tolerance)
169 std::cout <<
"pass: " << imb << std::endl;
171 std::cout <<
"fail: " << imb << std::endl;
172 std::cout << std::endl;
174 delete metricObject1;
182 scalar_t *
weights =
new scalar_t [localCount];
183 for (
size_t i=0; i < localCount; i++){
184 weights[i] = 1.0 + scalar_t(rank) / scalar_t(nprocs);
189 vector<const scalar_t *>coordVec(2);
190 vector<int> coordStrides(2);
192 coordVec[0] = x; coordStrides[0] = 1;
193 coordVec[1] = y; coordStrides[1] = 1;
195 vector<const scalar_t *>weightVec(1);
196 vector<int> weightStrides(1);
198 weightVec[0] =
weights; weightStrides[0] = 1;
200 inputAdapter_t *ia2=
new inputAdapter_t(localCount, globalIds, coordVec,
201 coordStrides,weightVec,weightStrides);
214 #ifdef HAVE_ZOLTAN2_MPI 215 quality_t *metricObject2 =
new quality_t(ia2, ¶ms,
219 quality_t *metricObject2 =
new quality_t(ia2, ¶ms, problem2->
getComm(),
225 metricObject2->printMetrics(cout);
229 scalar_t imb = metricObject2->getWeightImbalance(0);
230 if (imb <= tolerance)
231 std::cout <<
"pass: " << imb << std::endl;
233 std::cout <<
"fail: " << imb << std::endl;
234 std::cout << std::endl;
236 delete metricObject2;
251 params.set(
"partitioning_objective",
"multicriteria_minimize_total_weight");
255 weights =
new scalar_t [localCount*3];
258 for (
size_t i=0; i < localCount*3; i+=3){
259 weights[i] = 1.0 + rank / nprocs;
260 weights[i+1] = rank<nprocs/2 ? 1 : 2;
261 weights[i+2] = rand()/RAND_MAX +.5;
267 weightStrides.resize(3);
269 weightVec[0] =
weights; weightStrides[0] = 3;
270 weightVec[1] = weights+1; weightStrides[1] = 3;
271 weightVec[2] = weights+2; weightStrides[2] = 3;
273 inputAdapter_t *ia3=
new inputAdapter_t(localCount, globalIds, coordVec,
274 coordStrides,weightVec,weightStrides);
287 quality_t *metricObject3 =
new quality_t(ia3, ¶ms, problem3->
getComm(),
292 metricObject3->printMetrics(cout);
296 scalar_t imb = metricObject3->getWeightImbalance(0);
297 if (imb <= tolerance)
298 std::cout <<
"pass: " << imb << std::endl;
300 std::cout <<
"fail: " << imb << std::endl;
301 std::cout << std::endl;
303 delete metricObject3;
308 bool dataHasChanged =
false;
310 params.set(
"partitioning_objective",
"multicriteria_minimize_maximum_weight");
312 problem3->
solve(dataHasChanged);
316 metricObject3 =
new quality_t(ia3, ¶ms, problem3->
getComm(),
319 metricObject3->printMetrics(cout);
320 scalar_t imb = metricObject3->getWeightImbalance(0);
321 if (imb <= tolerance)
322 std::cout <<
"pass: " << imb << std::endl;
324 std::cout <<
"fail: " << imb << std::endl;
325 std::cout << std::endl;
327 delete metricObject3;
329 params.set(
"partitioning_objective",
"multicriteria_balance_total_maximum");
331 problem3->
solve(dataHasChanged);
335 metricObject3 =
new quality_t(ia3, ¶ms, problem3->
getComm(),
338 metricObject3->printMetrics(cout);
339 scalar_t imb = metricObject3->getWeightImbalance(0);
340 if (imb <= tolerance)
341 std::cout <<
"pass: " << imb << std::endl;
343 std::cout <<
"fail: " << imb << std::endl;
344 std::cout << std::endl;
346 delete metricObject3;
362 params.set(
"num_global_parts", nprocs*2);
370 scalar_t partSizes[2];
372 partIds[0] = rank*2; partSizes[0] = 0;
373 partIds[1] = rank*2+1; partSizes[1] = 1;
381 dataHasChanged =
false;
383 problem1->
solve(dataHasChanged);
394 int numInEmptyParts = 0;
395 for (
size_t i=0; i < localCount; i++){
396 if (partAssignments[i] % 2 == 0)
401 std::cout <<
"Request that " << nprocs <<
" parts be empty." <<std::endl;
405 metricObject1 =
new quality_t(ia1, ¶ms,
410 metricObject1->printMetrics(cout);
414 scalar_t imb = metricObject1->getObjectCountImbalance();
415 if (imb <= tolerance)
416 std::cout <<
"pass: " << imb << std::endl;
418 std::cout <<
"fail: " << imb << std::endl;
419 std::cout << std::endl;
421 delete metricObject1;
436 #ifdef HAVE_ZOLTAN2_MPI 441 std::cout <<
"PASS" << std::endl;
void setPartSizes(int len, part_t *partIds, scalar_t *partSizes, bool makeCopy=true)
Set or reset relative sizes for the parts that Zoltan2 will create.
A simple class that can be the User template argument for an InputAdapter.
void resetParameters(ParameterList *params)
Reset the list of parameters.
Defines the PartitioningSolution class.
SparseMatrixAdapter_t::part_t part_t
A PartitioningSolution is a solution to a partitioning problem.
RCP< const Comm< int > > getComm()
Return the communicator used by the problem.
BasicVectorAdapter represents a vector (plus optional weights) supplied by the user as pointers to st...
const PartitioningSolution< Adapter > & getSolution()
Get the solution to the problem.
PartitioningProblem sets up partitioning problems for the user.
const part_t * getPartListView() const
Returns the part list corresponding to the global ID list.
Defines the PartitioningProblem class.
A class that computes and returns quality metrics.
Defines the BasicVectorAdapter class.
void solve(bool updateInputData=true)
Direct the problem to create a solution.
int main(int argc, char *argv[])