private static void freev(int n, ref int nfree,
int[] index, int _index_offset, ref int nenter, ref int ileave,
int[] indx2, int _indx2_offset, int[] iwhere, int _iwhere_offset,
ref bool wrk, bool updatd, bool cnstnd, int iprint, int iter)
{
int iact = 0;
int i = 0;
int k = 0;
nenter = 0;
ileave = (n + 1);
if (((iter > 0) && cnstnd))
{
// c count the entering and leaving variables.
{
for (i = 1; i <= nfree; i++)
{
k = index[(i - (1)) + _index_offset];
//
// c write(6,*) ' k = index(i) ', k
// c write(6,*) ' index = ', i
//
if ((iwhere[(k - (1)) + _iwhere_offset] > 0))
{
ileave = (ileave - 1);
indx2[(ileave - (1)) + _indx2_offset] = k;
if ((iprint >= 100))
{
// DISPLAY: "Variable " + k + " leaves the set of free variables"
}
}
}
}
{
for (i = (1 + nfree); i <= n; i++)
{
k = index[(i - (1)) + _index_offset];
if ((iwhere[(k - (1)) + _iwhere_offset] <= 0))
{
nenter = (nenter + 1);
indx2[(nenter - (1)) + _indx2_offset] = k;
if ((iprint >= 100))
{
// DISPLAY: "Variable " + k + " enters the set of free variables"
}
}
}
}
if ((iprint >= 99))
{
// DISPLAY: ((n + 1) - ileave)) + " variables leave; "
// nenter + " variables enter"
}
}
wrk = ((((ileave < (n + 1))) || ((nenter > 0))) || updatd);
//
// c Find the index set of free and active variables at the GCP.
//
nfree = 0;
iact = (n + 1);
{
for (i = 1; i <= n; i++)
{
if ((iwhere[(i - (1)) + _iwhere_offset] <= 0))
{
nfree = (nfree + 1);
index[(nfree - (1)) + _index_offset] = i;
}
else
{
iact = (iact - 1);
index[(iact - (1)) + _index_offset] = i;
}
}
}
if ((iprint >= 99))
{
// DISPLAY: nfree + " variables are free at GCP " + (iter + 1))
}
}