1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
/*
Read in a solution in SDPA sparse format.
*/
#include <stdio.h>
#include <stdlib.h>
#include <csdp/declarations.h>
void skip_to_end_of_line(FILE *);
int read_sol(
const char *fname,
int n,
int k,
struct blockmatrix C,
struct blockmatrix *pX,
double **py,
struct blockmatrix *pZ)
{
FILE *fid;
int i;
int indexi;
int indexj;
int blkno;
int matno;
double ent;
int ret;
/*
* Allocate storage.
*/
alloc_mat(C,pX);
alloc_mat(C,pZ);
*py=(double *)malloc(sizeof(double)*(k+1));
if (*py == NULL)
{
printf("Storage allocation failed!\n");
exit(205);
};
/*
* Open the file for reading.
*/
fid=fopen(fname,"r");
if (fid == (FILE *) NULL)
{
printf("Couldn't open solution file for reading. \n");
exit(202);
};
/*
* Read in y.
*/
for (i=1; i<=k; i++)
{
ret=fscanf(fid,"%le",&((*py)[i]));
if (ret != 1)
{
printf("Reading solution failed, while reading y. ret=%d\n",ret);
return(1);
};
};
skip_to_end_of_line(fid);
/*
* Initialize X and Z to 0.
*/
zero_mat(*pX);
zero_mat(*pZ);
/*
* Read in the rest of the data.
*/
do {
ret=fscanf(fid,"%d %d %d %d %le",&matno,&blkno,&indexi,&indexj,&ent);
if ((ret != 5) && (ret != EOF))
{
printf("Bad line in solution file: %d %d %d %d %e\n",
matno,blkno,indexi,indexj,ent);
fclose(fid);
return(1);
};
if (matno == 1)
{
switch (pZ->blocks[blkno].blockcategory)
{
case DIAG:
pZ->blocks[blkno].data.vec[indexi]=ent;
break;
case MATRIX:
pZ->blocks[blkno].data.mat[ijtok(indexi,indexj,pZ->blocks[blkno].blocksize)]=ent;
pZ->blocks[blkno].data.mat[ijtok(indexj,indexi,pZ->blocks[blkno].blocksize)]=ent;
break;
default:
printf("Illegal block type! \n");
exit(206);
};
}
else
{
switch (pX->blocks[blkno].blockcategory)
{
case DIAG:
pX->blocks[blkno].data.vec[indexi]=ent;
break;
case MATRIX:
pX->blocks[blkno].data.mat[ijtok(indexi,indexj,pX->blocks[blkno].blocksize)]=ent;
pX->blocks[blkno].data.mat[ijtok(indexj,indexi,pX->blocks[blkno].blocksize)]=ent;
break;
default:
printf("Illegal block type! \n");
exit(206);
};
};
} while (ret != EOF);
fclose(fid);
return(0);
}
|