You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.6 KiB
86 lines
2.6 KiB
/*
|
|
* Copyright(C) 1999-2020, 2023 National Technology & Engineering Solutions
|
|
* of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
|
|
* NTESS, the U.S. Government retains certain rights in this software.
|
|
*
|
|
* See packages/seacas/LICENSE for details
|
|
*/
|
|
|
|
#include "defs.h"
|
|
#include "params.h"
|
|
#include "structs.h"
|
|
#include <math.h>
|
|
#include <stdio.h>
|
|
|
|
/* Confirm that the bipartite match algorithm did the right thing. */
|
|
void checkbp(struct vtx_data **graph, /* graph data structure for vertex weights */
|
|
double **xvecs, /* values to partition */
|
|
int *sets, /* set assignments returned */
|
|
double *dists, /* distances that separate sets */
|
|
int nvtxs, /* number of vertices */
|
|
int ndims /* number of dimensions for division */
|
|
)
|
|
{
|
|
int signs[MAXDIMS]; /* signs for coordinates of target points */
|
|
int sizes[MAXSETS]; /* size of each set */
|
|
int weights[MAXSETS]; /* size of each set */
|
|
double setval = 0.0; /* value from assigned set */
|
|
double val, bestval = 0.0; /* value to decide set assignment */
|
|
double tol = 1.0e-8; /* numerical tolerance */
|
|
int error = FALSE; /* are errors encountered? */
|
|
int nsets; /* number of sets */
|
|
int bestset = -1; /* set vtx should be assigned to */
|
|
int i, j, k; /* loop counter */
|
|
|
|
nsets = 1 << ndims;
|
|
|
|
for (i = 0; i < nsets; i++) {
|
|
sizes[i] = 0;
|
|
weights[i] = 0;
|
|
}
|
|
|
|
for (i = 1; i <= nvtxs; i++) {
|
|
/* Is vertex closest to the set it is assigned to? */
|
|
for (j = 0; j < MAXDIMS; j++) {
|
|
signs[j] = -1;
|
|
}
|
|
bestval = 0;
|
|
for (j = 0; j < nsets; j++) {
|
|
val = -dists[j];
|
|
for (k = 1; k <= ndims; k++) {
|
|
val += 2 * signs[k - 1] * xvecs[k][i];
|
|
}
|
|
if (j == sets[i]) {
|
|
setval = val;
|
|
}
|
|
if (j == 0 || val < bestval) {
|
|
bestval = val;
|
|
bestset = j;
|
|
}
|
|
if (signs[0] == 1 && signs[1] == 1) {
|
|
signs[2] *= -1;
|
|
}
|
|
if (signs[0] == 1) {
|
|
signs[1] *= -1;
|
|
}
|
|
signs[0] *= -1;
|
|
}
|
|
if (fabs(setval - bestval) >= tol * (fabs(setval) + fabs(bestval))) {
|
|
printf(" Vtx %d in set %d (%e), but should be in %d (%e)\n", i, sets[i], setval, bestset,
|
|
bestval);
|
|
error = TRUE;
|
|
}
|
|
++sizes[sets[i]];
|
|
weights[sets[i]] += graph[i]->vwgt;
|
|
}
|
|
|
|
printf(" Sizes:");
|
|
for (i = 0; i < nsets; i++) {
|
|
printf(" %d(%d)", sizes[i], weights[i]);
|
|
}
|
|
printf("\n");
|
|
|
|
if (error) {
|
|
checkpnt("ERROR in checkbp");
|
|
}
|
|
}
|
|
|