void solve_reduced(int n, int m, double h_x[], double h_y[], double a[], double x_x[], double x_y[], double c_x[], double c_y[], double workspace[], int step) { int i,j,k; double *p_x; double *p_y; double *t_a; double *t_c; double *t_y; p_x = workspace; /* together n + m + n*m + n + m = n*(m+2)+2*m */ p_y = p_x + n; t_a = p_y + m; t_c = t_a + n*m; t_y = t_c + n; if (step == PREDICTOR) { choldc(h_x, n, p_x); /* do cholesky decomposition */ for (i=0; i<m; i++) /* forward pass for A' */ chol_forward(h_x, n, p_x, a+i*n, t_a+i*n); for (i=0; i<m; i++) /* compute (h_y + a h_x^-1A') */ for (j=i; j<m; j++) for (k=0; k<n; k++) h_y[m*i + j] += t_a[n*j + k] * t_a[n*i + k]; choldc(h_y, m, p_y); /* and cholesky decomposition */ } chol_forward(h_x, n, p_x, c_x, t_c); /* forward pass for c */ for (i=0; i<m; i++) { /* and solve for x_y */ t_y[i] = c_y[i]; for (j=0; j<n; j++) t_y[i] += t_a[i*n + j] * t_c[j]; } cholsb(h_y, m, p_y, t_y, x_y); for (i=0; i<n; i++) { /* finally solve for x_x */ t_c[i] = -t_c[i]; for (j=0; j<m; j++) t_c[i] += t_a[j*n + i] * x_y[j]; } chol_backward(h_x, n, p_x, t_c, x_x); }
void linsys_solve(double a[], int n, int k, double b[], double x[], int flag, double f[]) { unsigned int i,j ; double *p=calloc(n, sizeof(double)) ; choldc(a, n, p, f) ; if (*f>0) /* check result */ { free(p) ; /* matrix is not positiv definite */ return ; } ; for (i=0; i<k; i++) cholsb(a, n, p, &b[i*n], &x[i*n]) ; if (flag) for (i=0; i<n; i++) for (j=i+1; j<n; j++) a[j*n+i]=a[j+i*n] ; free(p) ; }