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.
120 lines
3.2 KiB
120 lines
3.2 KiB
/*!
|
|
\file gklib.c
|
|
\brief Various helper routines generated using GKlib's templates
|
|
|
|
\date Started 4/12/2007
|
|
\author George
|
|
\author Copyright 1997-2009, Regents of the University of Minnesota
|
|
\version\verbatim $Id: gklib.c 10395 2011-06-23 23:28:06Z karypis $ \endverbatim
|
|
*/
|
|
|
|
|
|
#include "metislib.h"
|
|
|
|
|
|
/*************************************************************************/
|
|
/*! BLAS routines */
|
|
/*************************************************************************/
|
|
GK_MKBLAS(i, idx_t, idx_t)
|
|
GK_MKBLAS(r, real_t, real_t)
|
|
|
|
/*************************************************************************/
|
|
/*! Memory allocation routines */
|
|
/*************************************************************************/
|
|
GK_MKALLOC(i, idx_t)
|
|
GK_MKALLOC(r, real_t)
|
|
GK_MKALLOC(ikv, ikv_t)
|
|
GK_MKALLOC(rkv, rkv_t)
|
|
|
|
/*************************************************************************/
|
|
/*! Priority queues routines */
|
|
/*************************************************************************/
|
|
#define key_gt(a, b) ((a) > (b))
|
|
GK_MKPQUEUE(ipq, ipq_t, ikv_t, idx_t, idx_t, ikvmalloc, IDX_MAX, key_gt)
|
|
GK_MKPQUEUE(rpq, rpq_t, rkv_t, real_t, idx_t, rkvmalloc, REAL_MAX, key_gt)
|
|
#undef key_gt
|
|
|
|
/*************************************************************************/
|
|
/*! Random number generation routines */
|
|
/*************************************************************************/
|
|
GK_MKRANDOM(i, idx_t, idx_t)
|
|
|
|
/*************************************************************************/
|
|
/*! Utility routines */
|
|
/*************************************************************************/
|
|
GK_MKARRAY2CSR(i, idx_t)
|
|
|
|
/*************************************************************************/
|
|
/*! Sorting routines */
|
|
/*************************************************************************/
|
|
void isorti(size_t n, idx_t *base)
|
|
{
|
|
#define i_lt(a, b) ((*a) < (*b))
|
|
GK_MKQSORT(idx_t, base, n, i_lt);
|
|
#undef i_lt
|
|
}
|
|
|
|
void isortd(size_t n, idx_t *base)
|
|
{
|
|
#define i_gt(a, b) ((*a) > (*b))
|
|
GK_MKQSORT(idx_t, base, n, i_gt);
|
|
#undef i_gt
|
|
}
|
|
|
|
void rsorti(size_t n, real_t *base)
|
|
{
|
|
#define r_lt(a, b) ((*a) < (*b))
|
|
GK_MKQSORT(real_t, base, n, r_lt);
|
|
#undef r_lt
|
|
}
|
|
|
|
void rsortd(size_t n, real_t *base)
|
|
{
|
|
#define r_gt(a, b) ((*a) > (*b))
|
|
GK_MKQSORT(real_t, base, n, r_gt);
|
|
#undef r_gt
|
|
}
|
|
|
|
void ikvsorti(size_t n, ikv_t *base)
|
|
{
|
|
#define ikey_lt(a, b) ((a)->key < (b)->key)
|
|
GK_MKQSORT(ikv_t, base, n, ikey_lt);
|
|
#undef ikey_lt
|
|
}
|
|
|
|
/* Sorts based both on key and val */
|
|
void ikvsortii(size_t n, ikv_t *base)
|
|
{
|
|
#define ikeyval_lt(a, b) ((a)->key < (b)->key || ((a)->key == (b)->key && (a)->val < (b)->val))
|
|
GK_MKQSORT(ikv_t, base, n, ikeyval_lt);
|
|
#undef ikeyval_lt
|
|
}
|
|
|
|
void ikvsortd(size_t n, ikv_t *base)
|
|
{
|
|
#define ikey_gt(a, b) ((a)->key > (b)->key)
|
|
GK_MKQSORT(ikv_t, base, n, ikey_gt);
|
|
#undef ikey_gt
|
|
}
|
|
|
|
void rkvsorti(size_t n, rkv_t *base)
|
|
{
|
|
#define rkey_lt(a, b) ((a)->key < (b)->key)
|
|
GK_MKQSORT(rkv_t, base, n, rkey_lt);
|
|
#undef rkey_lt
|
|
}
|
|
|
|
void rkvsortd(size_t n, rkv_t *base)
|
|
{
|
|
#define rkey_gt(a, b) ((a)->key > (b)->key)
|
|
GK_MKQSORT(rkv_t, base, n, rkey_gt);
|
|
#undef rkey_gt
|
|
}
|
|
|
|
void uvwsorti(size_t n, uvw_t *base)
|
|
{
|
|
#define uvwkey_lt(a, b) ((a)->u < (b)->u || ((a)->u == (b)->u && (a)->v < (b)->v))
|
|
GK_MKQSORT(uvw_t, base, n, uvwkey_lt);
|
|
#undef uvwkey_lt
|
|
}
|
|
|
|
|