#include "ipm/basiclu/lu_def.h"
#include "ipm/basiclu/lu_list.h"
#include "ipm/basiclu/lu_file.h"
void lu_file_empty(
lu_int nlines, lu_int *begin, lu_int *end, lu_int *next, lu_int *prev,
lu_int fmem)
{
lu_int i;
begin[nlines] = 0;
end[nlines] = fmem;
for (i = 0; i < nlines; i++)
begin[i] = end[i] = 0;
for (i = 0; i < nlines; i++)
{
next[i] = i+1;
prev[i+1] = i;
}
next[nlines] = 0;
prev[0] = nlines;
}
void lu_file_reappend(
lu_int line, lu_int nlines, lu_int *begin, lu_int *end, lu_int *next,
lu_int *prev, lu_int *index, double *value, lu_int extra_space)
{
lu_int fmem, used, room, ibeg, iend, pos;
fmem = end[nlines];
used = begin[nlines];
room = fmem-used;
ibeg = begin[line];
iend = end[line];
begin[line] = used;
assert(iend-ibeg <= room);
for (pos = ibeg; pos < iend; pos++)
{
index[used] = index[pos];
value[used++] = value[pos];
}
end[line] = used;
room = fmem-used;
assert(room >= extra_space);
used += extra_space;
begin[nlines] = used;
lu_list_move(line, 0, next, prev, nlines, NULL);
}
lu_int lu_file_compress(
lu_int nlines, lu_int *begin, lu_int *end, const lu_int *next,
lu_int *index, double *value, double stretch, lu_int pad)
{
lu_int i, pos, ibeg, iend, used, extra_space, nz = 0;
used = 0; extra_space = 0;
for (i = next[nlines]; i < nlines; i = next[i])
{
ibeg = begin[i];
iend = end[i];
assert(ibeg >= used);
used += extra_space;
if (used > ibeg)
used = ibeg;
begin[i] = used;
for (pos = ibeg; pos < iend; pos++)
{
index[used] = index[pos];
value[used++] = value[pos];
}
end[i] = used;
extra_space = stretch*(iend-ibeg) + pad;
nz += iend-ibeg;
}
assert(used <= begin[nlines]);
used += extra_space;
if (used > begin[nlines])
used = begin[nlines];
begin[nlines] = used;
return nz;
}
lu_int lu_file_diff(
lu_int nrow, const lu_int *begin_row, const lu_int *end_row,
const lu_int *begin_col, const lu_int *end_col, const lu_int *index,
const double *value)
{
lu_int i, j, pos, where, ndiff = 0;
for (i = 0; i < nrow; i++)
{
for (pos = begin_row[i]; pos < end_row[i]; pos++)
{
j = index[pos];
for (where = begin_col[j]; where < end_col[j] &&
index[where] != i; where++)
;
if (where == end_col[j] || (value && value[pos] != value[where]))
ndiff++;
}
}
return ndiff;
}