static void check_uppereval(bool unit, bool atrans, pcamatrix a, bool xtrans) { pamatrix a2, x, b, b2; amatrix a2tmp, xtmp, btmp; real error; a2 = init_amatrix(&a2tmp, a->rows, a->cols); if (atrans) copy_lower_amatrix(a, unit, a2); else copy_upper_amatrix(a, unit, a2); x = (atrans ? init_amatrix(&xtmp, a->rows, a->rows) : init_amatrix(&xtmp, a->cols, a->cols)); random_amatrix(x); b = (atrans ? (xtrans ? init_amatrix(&btmp, a->rows, UINT_MAX(a->cols, a->rows)) : init_amatrix(&btmp, UINT_MAX(a->rows, a->cols), a->rows)) : (xtrans ? init_amatrix(&btmp, a->cols, UINT_MAX(a->cols, a->rows)) : init_amatrix(&btmp, UINT_MAX(a->rows, a->cols), a->cols))); copy_sub_amatrix(false, x, b); triangulareval_amatrix(atrans, unit, atrans, a, xtrans, b); if (xtrans) addmul_amatrix(-1.0, false, x, !atrans, a2, b); else addmul_amatrix(-1.0, atrans, a2, false, x, b); uninit_amatrix(a2); b2 = (atrans ? (xtrans ? init_sub_amatrix(&a2tmp, b, b->rows, 0, a->cols, 0) : init_sub_amatrix(&a2tmp, b, a->cols, 0, b->cols, 0)) : (xtrans ? init_sub_amatrix(&a2tmp, b, b->rows, 0, a->rows, 0) : init_sub_amatrix(&a2tmp, b, a->rows, 0, b->cols, 0))); error = norm2_amatrix(b2) / norm2_amatrix(x); (void) printf("Checking uppereval(unit=%s, atrans=%s, xtrans=%s)\n" " Accuracy %g, %sokay\n", (unit ? "tr" : "fl"), (atrans ? "tr" : "fl"), (xtrans ? "tr" : "fl"), error, (error < tolerance ? "" : " NOT ")); if (error >= tolerance) problems++; uninit_amatrix(b2); uninit_amatrix(b); uninit_amatrix(x); }
uint getdepth_cluster(pccluster t) { uint l, lt; uint i; l = 0; if (t->son) { for (i = 0; i < t->sons; i++) { lt = getdepth_cluster(t->son[i]); l = UINT_MAX(lt, l); } l++; } return l; }