68 double lki, *Lx, *x, *Cx;
69 int i, p, k, n, *Li, *Lp, *cp, *pinv, *s, *c, *parent, *Cp, *Ci;
72 if (!CS_CSC(A) || !S || !S->cp || !S->parent)
return (NULL);
74 N =
static_cast<csn*
>(cs_calloc(1,
sizeof(csn)));
80 C = pinv ? cs_symperm(A, pinv, 1) :
const_cast<cs*
>(A);
82 if (!N || !c || !x || !C)
return (cs_ndone(N, E, NULL, NULL, 0));
87 N->L = L = cs_spalloc(n, n, cp[n], 1, 0);
88 if (!L)
return (cs_ndone(N, E, NULL, NULL, 0));
92 for (k = 0; k < n; k++) Lp[k] = c[k] = cp[k];
93 for (k = 0; k < n; k++)
96 int top = cs_ereach(C, k, parent, s, c);
98 for (p = Cp[k]; p < Cp[k + 1]; p++)
100 if (Ci[p] <= k) x[Ci[p]] = Cx[p];
105 for (; top < n; top++)
108 lki = x[i] / Lx[Lp[i]];
110 for (p = Lp[i] + 1; p < c[i]; p++) {
111 x[Li[p]] -= Lx[p] * lki;
119 if (d <= 0)
return (cs_ndone(N, E, NULL, NULL, 0));
125 return (cs_ndone(N, E, NULL, NULL, 1));