Skip to content
Snippets Groups Projects
test_ComputeInitialGains.c 3.21 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include "Graph.h"
    #include "HKLFM.h"
    #include "Match.h"
    
    struct opts Options;
    
    extern int ComputeInitialGains(struct biparthypergraph *pHG);
    
    int main(int argc, char **argv) {
    
        struct biparthypergraph HG;
    
    
        long n, t, i, P;
    
        printf("Test ComputeInitialGains: ");
        n= 60; /* must be a multiple of 6 */
    
        HG.NrNets = n;
        HG.NrVertices = 2;
        HG.NrPins = n;
    
        HG.V = (struct vertex *) malloc(HG.NrVertices * sizeof(struct vertex));
        HG.N = (struct net *) malloc(HG.NrNets * sizeof(struct net));
        HG.VtxAdjncy = (long *) malloc(HG.NrPins * sizeof(long));
        HG.NetAdjncy = (long *) malloc(HG.NrPins * sizeof(long));
        if (HG.V == NULL ||  HG.N == NULL ||
             HG.VtxAdjncy == NULL || HG.NetAdjncy == NULL) {
            fprintf(stderr, "test_ComputeInitialGains(): Not enough memory!\n");
            printf("Error\n");
            exit(1);
        }
    
        /* Initialise partition of vertices */
        HG.V[0].partition = 0;
        HG.V[1].partition = 1;
    
        /* Initialise start and end of vertices */
        HG.V[0].iStart = 0;
        HG.V[0].iEnd = n/2;
        HG.V[1].iStart = n/2;
        HG.V[1].iEnd = n;
    
        /* Initialise adjacency lists of vertices */
        /* column 0 */
        for (t=0; t<n/6; t++) {
            i = 3*t;
            HG.VtxAdjncy[i] = 6*t + 2;
            HG.VtxAdjncy[i+1] = 6*t + 4;
            HG.VtxAdjncy[i+2] = 6*t + 5;
        }
        /* column 1 */
        for (t=0; t<n/6; t++) {
            i = 3*t;
            HG.VtxAdjncy[n/2 + i] = 6*t + 1;
            HG.VtxAdjncy[n/2 + i+1] = 6*t + 2;
            HG.VtxAdjncy[n/2 + i+2] = 6*t + 5;
        }
    
        /* Initialise start and end of nets */
        for (t=0; t<n/3; t++) {
            /* no nonzeros in row i = 3t */
            i = 3*t;
            HG.N[i].iStartP0 = i;
            HG.N[i].iEnd = i;
            /* 1 nonzero in row i+1 */
            HG.N[i+1].iStartP0 = i;
            HG.N[i+1].iEnd = i+1;
            /* 2 nonzeros in row i+2 */
            HG.N[i+2].iStartP0 = i+1;
            HG.N[i+2].iEnd = i+3;
        }
    
        /* Initialise adjacency lists of nets */
        for (t=0; t<n; t++) 
            HG.NetAdjncy[t] = (t+1)%2;
    
        /* Initialise gainbucket data structure */
        for (P=0; P<2; P++) {
            HG.GBVtx[P].NrBuckets  = 0;
            HG.GBVtx[P].Root = NULL;
    
        
            if ( !InitGainBucket(&(HG.GBVtx[P]), n/3) ) {
                printf("Error\n");
                exit(1);
            }
    
        }
    
        ComputeInitialGains(&HG);
    
        /* Check hypergraph dimensions */
        if (HG.NrVertices != 2 || HG.NrNets != n || HG.NrPins != n) {
            printf("Error\n");
            exit(1);
        }
    
        /* Check gainbucket data structure */
        for (P=0; P<2; P++) {
    
    #ifdef GAINBUCKET_ARRAY
            pB = &(HG.GBVtx[P].Root[HG.GBVtx[P].MaxValue+HG.GBVtx[P].MaxPresentValue]) ;
    #else
            pB = HG.GBVtx[P].Root ;
    #endif
    
            if (HG.GBVtx[P].NrBuckets  != 1 ||
    
                printf("Error\n");
                exit(1);
            }
        }
    
        /* Check current communication */
        if (HG.CurComm != n/3) {
            printf("Error\n");
            exit(1);
        }
    
        
        /* Delete gainbucket data structure */
        for (P=0; P<2; P++) {
            if ( !DeleteGainBucket(&(HG.GBVtx[P])) ) {
                printf("Error\n");
                exit(1);
            }
        }
    
    
        printf("OK\n");
        exit(0);
    
    } /* end main */