#include "SparseMatrix.h"

int main(int argc, char **argv) {

    char filenameI[MAX_WORD_LENGTH], filenameA[MAX_WORD_LENGTH];
    struct sparsematrix A, I, M;
    long nz, s, t, p, P, *usedI, *usedA, matchI, matchA, found;
    FILE *fp;

    printf("Test MMReadSparseMatrixFromIndexAndValueMatrixFiles: ");
    
    /* Check sorting in general */
    
    strcpy(filenameA,"test_MMReadSparseMatrixFromIndexAndValueMatrixFilesA.inp");
    fp = fopen(filenameA, "r");
    MMReadSparseMatrix(fp, &A);
    fclose(fp);
    
    strcpy(filenameI,"test_MMReadSparseMatrixFromIndexAndValueMatrixFilesI.inp");
    fp = fopen(filenameI, "r");
    MMReadSparseMatrix(fp, &I);
    fclose(fp);

    nz = 12;
    P = 2;
    
    
    /* Use values as processor numbers */
    if (!MMReadSparseMatrixFromIndexAndValueMatrixFiles(filenameA, filenameI, &M)) {
        printf("Error!\n");
        exit(1);
    }
    
    
    usedI = (long *) malloc(nz * sizeof(long));
    usedA = (long *) malloc(nz * sizeof(long));
    for(s=0; s<nz; s++) {
        usedI[s] = 0;
        usedA[s] = 0;
    }
    
    matchI = matchA = 0;
    for(p=1; p<=P; p++) {
        for(t=M.Pstart[p-1]; t<M.Pstart[p]; t++) {
            
            found = 0;
        
            for(s=0; s<nz; s++) {
                if(usedI[s] == 0 && M.i[t] == I.i[s] && M.j[t] == I.j[s] && (long)I.ReValue[s]+1 == p) {
                    matchI++;
                    usedI[s] = 1;
                    found++;
                    break;
                }
            }
            
            for(s=0; s<nz; s++) {
                if(usedA[s] == 0 && M.i[t] == A.i[s] && M.j[t] == A.j[s] && M.ReValue[t] == A.ReValue[s]) {
                    matchA++;
                    usedA[s] = 1;
                    found++;
                    break;
                }
            }
            
            if(found != 2) {
                printf("Error\n");
                exit(1);
            }
            
        }
    }
    
    if(matchI != nz || matchA != nz) {
        printf("Error\n");
        exit(1);
    }
    
    MMDeleteSparseMatrix(&A);
    MMDeleteSparseMatrix(&I);
    MMDeleteSparseMatrix(&M);
    free(usedI);
    free(usedA);
    

    printf("OK\n");
    exit(0);
    
} /* end main */