Cloned library METIS with extra build files for internal package management.
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.
 
 
 

138 lines
2.9 KiB

/*
* Copyright 1997, Regents of the University of Minnesota
*
* util.c
*
* This function contains various utility routines
*
* Started 9/28/95
* George
*
* $Id: util.c 10495 2011-07-06 16:04:45Z karypis $
*/
#include "metislib.h"
/*************************************************************************/
/*! This function initializes the random number generator
*/
/*************************************************************************/
void InitRandom(idx_t seed)
{
isrand((seed == -1 ? 4321 : seed));
}
/*************************************************************************/
/*! Returns the highest weight index of x[i]*y[i]
*/
/*************************************************************************/
idx_t iargmax_nrm(size_t n, idx_t *x, real_t *y)
{
idx_t i, max=0;
for (i=1; i<n; i++)
max = (x[i]*y[i] > x[max]*y[max] ? i : max);
return max;
}
/*************************************************************************/
/*! These functions return the index of the maximum element in a vector
*/
/*************************************************************************/
idx_t iargmax_strd(size_t n, idx_t *x, idx_t incx)
{
size_t i, max=0;
n *= incx;
for (i=incx; i<n; i+=incx)
max = (x[i] > x[max] ? i : max);
return max/incx;
}
/*************************************************************************/
/*! These functions return the index of the almost maximum element in a
vector
*/
/*************************************************************************/
idx_t rargmax2(size_t n, real_t *x)
{
size_t i, max1, max2;
if (x[0] > x[1]) {
max1 = 0;
max2 = 1;
}
else {
max1 = 1;
max2 = 0;
}
for (i=2; i<n; i++) {
if (x[i] > x[max1]) {
max2 = max1;
max1 = i;
}
else if (x[i] > x[max2])
max2 = i;
}
return max2;
}
/*************************************************************************/
/*! These functions return the index of the second largest elements in the
vector formed by x.y where '.' is element-wise multiplication */
/*************************************************************************/
idx_t iargmax2_nrm(size_t n, idx_t *x, real_t *y)
{
size_t i, max1, max2;
if (x[0]*y[0] > x[1]*y[1]) {
max1 = 0;
max2 = 1;
}
else {
max1 = 1;
max2 = 0;
}
for (i=2; i<n; i++) {
if (x[i]*y[i] > x[max1]*y[max1]) {
max2 = max1;
max1 = i;
}
else if (x[i]*y[i] > x[max2]*y[max2])
max2 = i;
}
return max2;
}
/*************************************************************************/
/*! converts a signal code into a Metis return code
*/
/*************************************************************************/
int metis_rcode(int sigrval)
{
switch (sigrval) {
case 0:
return METIS_OK;
break;
case SIGMEM:
return METIS_ERROR_MEMORY;
break;
default:
return METIS_ERROR;
break;
}
}