private static void formk(int n, int nsub, int[] ind, int _ind_offset,
int nenter, int ileave, int[] indx2, int _indx2_offset,
int iupdat, bool updatd, double[] wn, int _wn_offset, double[] wn1, int _wn1_offset,
int m, double[] ws, int _ws_offset, double[] wy, int _wy_offset,
double[] sy, int _sy_offset, double theta, int col, int head,
ref int info)
{
int m2 = 0;
int ipntr = 0;
int jpntr = 0;
int iy = 0;
int is2 = 0;
int jy = 0;
int js = 0;
int is1 = 0;
int js1 = 0;
int k1 = 0;
int i = 0;
int k = 0;
int col2 = 0;
int pbegin = 0;
int pend = 0;
int dbegin = 0;
int dend = 0;
int upcl = 0;
double temp1 = 0.0d;
double temp2 = 0.0d;
double temp3 = 0.0d;
double temp4 = 0.0d;
if (updatd)
{
if ((iupdat > m))
{
// c shift old part of WN1.
{
for (jy = 1; jy <= (m - 1); jy++)
{
js = (m + jy);
dcopy((m - jy), wn1, ((jy + 1) - (1)) + ((jy + 1) - (1)) * ((2 * m))
+ _wn1_offset, 1, wn1, (jy - (1)) + (jy - (1)) * ((2 * m)) + _wn1_offset, 1);
dcopy((m - jy), wn1, ((js + 1) - (1)) + ((js + 1) - (1)) * ((2 * m))
+ _wn1_offset, 1, wn1, (js - (1)) + (js - (1)) * ((2 * m)) + _wn1_offset, 1);
dcopy((m - 1), wn1, ((m + 2) - (1)) + ((jy + 1) - (1)) * ((2 * m))
+ _wn1_offset, 1, wn1, ((m + 1) - (1)) + (jy - (1)) * ((2 * m)) + _wn1_offset, 1);
}
}
}
//
// c put new rows in blocks (1,1), (2,1) and (2,2).
pbegin = 1;
pend = nsub;
dbegin = (nsub + 1);
dend = n;
iy = col;
is2 = (m + col);
ipntr = ((head + col) - 1);
if ((ipntr > m))
{
ipntr = (ipntr - m);
}
jpntr = head;
{
for (jy = 1; jy <= col; jy++)
{
js = (m + jy);
temp1 = 0.0;
temp2 = 0.0;
temp3 = 0.0;
// c compute element jy of row 'col' of Y'ZZ'Y
{
for (k = pbegin; k <= pend; k++)
{
k1 = ind[(k - (1)) + _ind_offset];
temp1 = (temp1 + (wy[(k1 - (1)) + (ipntr - (1))
* (n) + _wy_offset] * wy[(k1 - (1)) + (jpntr - (1)) * (n) + _wy_offset]));
}
}
// c compute elements jy of row 'col' of L_a and S'AA'S
{
for (k = dbegin; k <= dend; k++)
{
k1 = ind[(k - (1)) + _ind_offset];
temp2 = (temp2 + (ws[(k1 - (1)) + (ipntr - (1))
* (n) + _ws_offset] * ws[(k1 - (1)) + (jpntr - (1)) * (n) + _ws_offset]));
temp3 = (temp3 + (ws[(k1 - (1)) + (ipntr - (1))
* (n) + _ws_offset] * wy[(k1 - (1)) + (jpntr - (1)) * (n) + _wy_offset]));
}
}
wn1[(iy - (1)) + (jy - (1)) * ((2 * m)) + _wn1_offset] = temp1;
wn1[(is2 - (1)) + (js - (1)) * ((2 * m)) + _wn1_offset] = temp2;
wn1[(is2 - (1)) + (jy - (1)) * ((2 * m)) + _wn1_offset] = temp3;
jpntr = ((jpntr) % (m) + 1);
}
}
//
// c put new column in block (2,1).
jy = col;
jpntr = ((head + col) - 1);
if ((jpntr > m))
{
jpntr = (jpntr - m);
}
ipntr = head;
{
for (i = 1; i <= col; i++)
{
is2 = (m + i);
temp3 = 0.0;
// c compute element i of column 'col' of R_z
{
for (k = pbegin; k <= pend; k++)
{
k1 = ind[(k - (1)) + _ind_offset];
temp3 = (temp3 + (ws[(k1 - (1)) + (ipntr - (1))
* (n) + _ws_offset] * wy[(k1 - (1)) + (jpntr - (1)) * (n) + _wy_offset]));
}
}
ipntr = ((ipntr) % (m) + 1);
wn1[(is2 - (1)) + (jy - (1)) * ((2 * m)) + _wn1_offset] = temp3;
}
}
upcl = (col - 1);
}
else
{
upcl = col;
}
//
// c modify the old parts in blocks (1,1) and (2,2) due to changes
// c in the set of free variables.
ipntr = head;
{
for (iy = 1; iy <= upcl; iy++)
{
is2 = (m + iy);
jpntr = head;
{
for (jy = 1; jy <= iy; jy++)
{
js = (m + jy);
temp1 = 0.0;
temp2 = 0.0;
temp3 = 0.0;
temp4 = 0.0;
{
for (k = 1; k <= nenter; k++)
{
k1 = indx2[(k - (1)) + _indx2_offset];
temp1 = (temp1 + (wy[(k1 - (1)) + (ipntr - (1))
* (n) + _wy_offset] * wy[(k1 - (1)) + (jpntr - (1)) * (n) + _wy_offset]));
temp2 = (temp2 + (ws[(k1 - (1)) + (ipntr - (1))
* (n) + _ws_offset] * ws[(k1 - (1)) + (jpntr - (1)) * (n) + _ws_offset]));
}
}
{
for (k = ileave; k <= n; k++)
{
k1 = indx2[(k - (1)) + _indx2_offset];
temp3 = (temp3 + (wy[(k1 - (1)) + (ipntr
- (1)) * (n) + _wy_offset] * wy[(k1 - (1)) + (jpntr - (1)) * (n) + _wy_offset]));
temp4 = (temp4 + (ws[(k1 - (1)) + (ipntr
- (1)) * (n) + _ws_offset] * ws[(k1 - (1)) + (jpntr - (1)) * (n) + _ws_offset]));
}
}
wn1[(iy - (1)) + (jy - (1)) * ((2 * m)) + _wn1_offset] =
((wn1[(iy - (1)) + (jy - (1)) * ((2 * m)) + _wn1_offset] + temp1) - temp3);
wn1[(is2 - (1)) + (js - (1)) * ((2 * m)) + _wn1_offset] =
((wn1[(is2 - (1)) + (js - (1)) * ((2 * m)) + _wn1_offset] - temp2) + temp4);
jpntr = ((jpntr) % (m) + 1);
}
}
ipntr = ((ipntr) % (m) + 1);
}
}
//
// c modify the old parts in block (2,1).
ipntr = head;
{
for (is2 = (m + 1); is2 <= (m + upcl); is2++)
{
jpntr = head;
{
for (jy = 1; jy <= upcl; jy++)
{
temp1 = 0.0;
temp3 = 0.0;
{
for (k = 1; k <= nenter; k++)
{
k1 = indx2[(k - (1)) + _indx2_offset];
temp1 = (temp1 + (ws[(k1 - (1)) + (ipntr
- (1)) * (n) + _ws_offset] * wy[(k1 - (1)) + (jpntr - (1)) * (n) + _wy_offset]));
}
}
{
for (k = ileave; k <= n; k++)
{
k1 = indx2[(k - (1)) + _indx2_offset];
temp3 = (temp3 + (ws[(k1 - (1)) + (ipntr - (1))
* (n) + _ws_offset] * wy[(k1 - (1)) + (jpntr - (1)) * (n) + _wy_offset]));
}
}
if ((is2 <= (jy + m)))
{
wn1[(is2 - (1)) + (jy - (1)) * ((2 * m)) + _wn1_offset] =
((wn1[(is2 - (1)) + (jy - (1)) * ((2 * m)) + _wn1_offset] + temp1) - temp3);
}
else
{
wn1[(is2 - (1)) + (jy - (1)) * ((2 * m)) + _wn1_offset] =
((wn1[(is2 - (1)) + (jy - (1)) * ((2 * m)) + _wn1_offset] - temp1) + temp3);
}
jpntr = ((jpntr) % (m) + 1);
}
}
ipntr = ((ipntr) % (m) + 1);
}
}
//
// c Form the upper triangle of WN = [D+Y' ZZ'Y/theta -L_a'+R_z' ]
// c [-L_a +R_z S'AA'S*theta]
//
m2 = (2 * m);
{
for (iy = 1; iy <= col; iy++)
{
is2 = (col + iy);
is1 = (m + iy);
{
for (jy = 1; jy <= iy; jy++)
{
js = (col + jy);
js1 = (m + jy);
wn[(jy - (1)) + (iy - (1)) * ((2 * m)) + _wn_offset] =
(wn1[(iy - (1)) + (jy - (1)) * ((2 * m)) + _wn1_offset] / theta);
wn[(js - (1)) + (is2 - (1)) * ((2 * m)) + _wn_offset] =
(wn1[(is1 - (1)) + (js1 - (1)) * ((2 * m)) + _wn1_offset] * theta);
}
}
{
for (jy = 1; jy <= (iy - 1); jy++)
{
wn[(jy - (1)) + (is2 - (1)) * ((2 * m)) + _wn_offset] =
(-(wn1[(is1 - (1)) + (jy - (1)) * ((2 * m)) + _wn1_offset]));
}
}
{
for (jy = iy; jy <= col; jy++)
{
wn[(jy - (1)) + (is2 - (1)) * ((2 * m)) + _wn_offset] =
wn1[(is1 - (1)) + (jy - (1)) * ((2 * m)) + _wn1_offset];
}
}
wn[(iy - (1)) + (iy - (1)) * ((2 * m)) + _wn_offset] = (wn[(iy - (1)) + (iy - (1)) * ((2 * m))
+ _wn_offset] + sy[(iy - (1)) + (iy - (1)) * (m) + _sy_offset]);
}
}
//
// c Form the upper triangle of WN= [ LL' L^-1(-L_a'+R_z')]
// c [(-L_a +R_z)L'^-1 S'AA'S*theta ]
//
// c first Cholesky factor (1,1) block of wn to get LL'
// c with L' stored in the upper triangle of wn.
dpofa(wn, _wn_offset, m2, col, ref info);
if ((info != 0))
{
info = -1;
return;
}
// c then form L^-1(-L_a'+R_z') in the (1,2) block.
col2 = (2 * col);
{
for (js = (col + 1); js <= col2; js++)
{
dtrsl(wn, _wn_offset, m2, col, wn, (1 - (1))
+ (js - (1)) * ((2 * m)) + _wn_offset, 11, ref info);
}
}
//
// c Form S'AA'S*theta + (L^-1(-L_a'+R_z'))'L^-1(-L_a'+R_z') in the
// c upper triangle of (2,2) block of wn.
//
//
{
for (is2 = (col + 1); is2 <= col2; is2++)
{
{
for (js = is2; js <= col2; js++)
{
wn[(is2 - (1)) + (js - (1)) * ((2 * m)) + _wn_offset] =
(wn[(is2 - (1)) + (js - (1)) * ((2 * m)) + _wn_offset]
+ ddot(col, wn, (1 - (1)) + (is2 - (1)) * ((2 * m))
+ _wn_offset, 1, wn, (1 - (1)) + (js - (1)) * ((2 * m)) + _wn_offset, 1));
}
}
}
}
//
// c Cholesky factorization of (2,2) block of wn.
//
dpofa(wn, ((col + 1) - (1)) + ((col + 1) - (1))
* ((2 * m)) + _wn_offset, m2, col, ref info);
if ((info != 0))
{
info = -2;
return;
}
}