diff options
Diffstat (limited to 'benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/fpqueue.c')
| -rw-r--r-- | benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/fpqueue.c | 440 |
1 files changed, 0 insertions, 440 deletions
diff --git a/benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/fpqueue.c b/benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/fpqueue.c deleted file mode 100644 index 11c617f..0000000 --- a/benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/fpqueue.c +++ /dev/null @@ -1,440 +0,0 @@ -/* - * Copyright 1997, Regents of the University of Minnesota - * - * fpqueue.c - * - * This file contains functions for manipulating the bucket list - * representation of the gains associated with each vertex in a graph. - * These functions are used by the refinement algorithms - * - * Started 9/2/94 - * George - * - * $Id: fpqueue.c,v 1.2 2003/07/21 17:18:48 karypis Exp $ - * - */ - -#include <parmetislib.h> - - -/************************************************************************* -* This function initializes the data structures of the priority queue -**************************************************************************/ -void FPQueueInit(FPQueueType *queue, int maxnodes) -{ - queue->nnodes = 0; - queue->maxnodes = maxnodes; - queue->heap = NULL; - queue->locator = NULL; - - queue->heap = (FKeyValueType *) malloc(sizeof(FKeyValueType)*maxnodes); - queue->locator = (idxtype *) malloc(sizeof(idxtype)*maxnodes); - - idxset(maxnodes, -1, queue->locator); - -} - - -/************************************************************************* -* This function resets the buckets -**************************************************************************/ -void FPQueueReset(FPQueueType *queue) -{ - queue->nnodes = 0; - - idxset(queue->maxnodes, -1, queue->locator); - -} - - -/************************************************************************* -* This function frees the buckets -**************************************************************************/ -void FPQueueFree(FPQueueType *queue) -{ - - free(queue->heap); - free(queue->locator); - - queue->maxnodes = 0; -} - - -/************************************************************************* -* This function returns the number of nodes in the queue -**************************************************************************/ -int FPQueueGetSize(FPQueueType *queue) -{ - return queue->nnodes; -} - - -/************************************************************************* -* This function adds a node of certain gain into a partition -**************************************************************************/ -int FPQueueInsert(FPQueueType *queue, int node, float gain) -{ - int i, j; - idxtype *locator; - FKeyValueType *heap; - - ASSERTS(CheckHeapFloat(queue)); - - heap = queue->heap; - locator = queue->locator; - - ASSERTS(locator[node] == -1); - - i = queue->nnodes++; - while (i > 0) { - j = (i-1)/2; - if (heap[j].key < gain) { - heap[i] = heap[j]; - locator[heap[i].val] = i; - i = j; - } - else - break; - } - ASSERTS(i >= 0); - heap[i].key = gain; - heap[i].val = node; - locator[node] = i; - - ASSERTS(CheckHeapFloat(queue)); - - return 0; -} - - -/************************************************************************* -* This function deletes a node from a partition and reinserts it with -* an updated gain -**************************************************************************/ -int FPQueueDelete(FPQueueType *queue, int node) -{ - int i, j; - float newgain, oldgain; - idxtype *locator; - FKeyValueType *heap; - - heap = queue->heap; - locator = queue->locator; - - ASSERTS(locator[node] != -1); - ASSERTS(heap[locator[node]].val == node); - - ASSERTS(CheckHeapFloat(queue)); - - i = locator[node]; - locator[node] = -1; - - if (--queue->nnodes > 0 && heap[queue->nnodes].val != node) { - node = heap[queue->nnodes].val; - newgain = heap[queue->nnodes].key; - oldgain = heap[i].key; - - if (oldgain < newgain) { - /* Filter-up */ - while (i > 0) { - j = (i-1)>>1; - if (heap[j].key < newgain) { - heap[i] = heap[j]; - locator[heap[i].val] = i; - i = j; - } - else - break; - } - } - else { - /* Filter down */ - while ((j=2*i+1) < queue->nnodes) { - if (heap[j].key > newgain) { - if (j+1 < queue->nnodes && heap[j+1].key > heap[j].key) - j = j+1; - heap[i] = heap[j]; - locator[heap[i].val] = i; - i = j; - } - else if (j+1 < queue->nnodes && heap[j+1].key > newgain) { - j = j+1; - heap[i] = heap[j]; - locator[heap[i].val] = i; - i = j; - } - else - break; - } - } - - heap[i].key = newgain; - heap[i].val = node; - locator[node] = i; - } - - ASSERTS(CheckHeapFloat(queue)); - - return 0; -} - - - -/************************************************************************* -* This function deletes a node from a partition and reinserts it with -* an updated gain -**************************************************************************/ -int FPQueueUpdate(FPQueueType *queue, int node, float oldgain, float newgain) -{ - int i, j; - idxtype *locator; - FKeyValueType *heap; - - if (oldgain == newgain) - return 0; - - heap = queue->heap; - locator = queue->locator; - - ASSERTS(locator[node] != -1); - ASSERTS(heap[locator[node]].val == node); - ASSERTS(fabs(heap[locator[node]].key - oldgain) < SMALLFLOAT); - ASSERTS(CheckHeapFloat(queue)); - - i = locator[node]; - - if (oldgain < newgain) { - /* Filter-up */ - while (i > 0) { - j = (i-1)>>1; - if (heap[j].key < newgain) { - heap[i] = heap[j]; - locator[heap[i].val] = i; - i = j; - } - else - break; - } - } - else { - /* Filter down */ - while ((j=2*i+1) < queue->nnodes) { - if (heap[j].key > newgain) { - if (j+1 < queue->nnodes && heap[j+1].key > heap[j].key) - j = j+1; - heap[i] = heap[j]; - locator[heap[i].val] = i; - i = j; - } - else if (j+1 < queue->nnodes && heap[j+1].key > newgain) { - j = j+1; - heap[i] = heap[j]; - locator[heap[i].val] = i; - i = j; - } - else - break; - } - } - - heap[i].key = newgain; - heap[i].val = node; - locator[node] = i; - - ASSERTS(CheckHeapFloat(queue)); - - return 0; -} - - - -/************************************************************************* -* This function deletes a node from a partition and reinserts it with -* an updated gain -**************************************************************************/ -void FPQueueUpdateUp(FPQueueType *queue, int node, float oldgain, float newgain) -{ - int i, j; - idxtype *locator; - FKeyValueType *heap; - - if (oldgain == newgain) - return; - - heap = queue->heap; - locator = queue->locator; - - ASSERTS(locator[node] != -1); - ASSERTS(heap[locator[node]].val == node); - ASSERTS(heap[locator[node]].key == oldgain); - ASSERTS(CheckHeapFloat(queue)); - - - /* Here we are just filtering up since the newgain is greater than the oldgain */ - i = locator[node]; - while (i > 0) { - j = (i-1)>>1; - if (heap[j].key < newgain) { - heap[i] = heap[j]; - locator[heap[i].val] = i; - i = j; - } - else - break; - } - - heap[i].key = newgain; - heap[i].val = node; - locator[node] = i; - - ASSERTS(CheckHeapFloat(queue)); - -} - - -/************************************************************************* -* This function returns the vertex with the largest gain from a partition -* and removes the node from the bucket list -**************************************************************************/ -int FPQueueGetMax(FPQueueType *queue) -{ - int vtx, i, j, node; - float gain; - idxtype *locator; - FKeyValueType *heap; - - if (queue->nnodes == 0) - return -1; - - queue->nnodes--; - - heap = queue->heap; - locator = queue->locator; - - vtx = heap[0].val; - locator[vtx] = -1; - - if ((i = queue->nnodes) > 0) { - gain = heap[i].key; - node = heap[i].val; - i = 0; - while ((j=2*i+1) < queue->nnodes) { - if (heap[j].key > gain) { - if (j+1 < queue->nnodes && heap[j+1].key > heap[j].key) - j = j+1; - heap[i] = heap[j]; - locator[heap[i].val] = i; - i = j; - } - else if (j+1 < queue->nnodes && heap[j+1].key > gain) { - j = j+1; - heap[i] = heap[j]; - locator[heap[i].val] = i; - i = j; - } - else - break; - } - - heap[i].key = gain; - heap[i].val = node; - locator[node] = i; - } - - ASSERTS(CheckHeapFloat(queue)); - return vtx; -} - - -/************************************************************************* -* This function returns the vertex with the largest gain from a partition -**************************************************************************/ -int FPQueueSeeMaxVtx(FPQueueType *queue) -{ - int vtx; - - if (queue->nnodes == 0) - return -1; - - vtx = queue->heap[0].val; - - return vtx; -} - - -/************************************************************************* -* This function returns the vertex with the largest gain from a partition -**************************************************************************/ -float FPQueueSeeMaxGain(FPQueueType *queue) -{ - float gain; - - if (queue->nnodes == 0) - return 0.0; - - gain = queue->heap[0].key; - - return gain; -} - - -/************************************************************************* -* This function returns the vertex with the largest gain from a partition -**************************************************************************/ -float FPQueueGetKey(FPQueueType *queue) -{ - int key; - - if (queue->nnodes == 0) - return -1; - - key = queue->heap[0].key; - - return key; -} - -/************************************************************************* -* This function returns the number of nodes in the queue -**************************************************************************/ -int FPQueueGetQSize(FPQueueType *queue) -{ - return queue->nnodes; -} - - - - - - -/************************************************************************* -* This functions checks the consistency of the heap -**************************************************************************/ -int CheckHeapFloat(FPQueueType *queue) -{ - int i, j, nnodes; - idxtype *locator; - FKeyValueType *heap; - - heap = queue->heap; - locator = queue->locator; - nnodes = queue->nnodes; - - if (nnodes == 0) - return 1; - - ASSERTS(locator[heap[0].val] == 0); - for (i=1; i<nnodes; i++) { - ASSERTS(locator[heap[i].val] == i); - ASSERTS(heap[i].key <= heap[(i-1)/2].key); - } - for (i=1; i<nnodes; i++) - ASSERTS(heap[i].key <= heap[0].key); - - for (j=i=0; i<queue->maxnodes; i++) { - if (locator[i] != -1) - j++; - } - ASSERTS(j == nnodes); - - return 1; -} |
